[{"content":"Introducción: El \u0026ldquo;cambio de paradigma computacional\u0026rdquo; que traen las computadoras cuánticas En los últimos años, no hay un solo día en que no veamos el término \u0026ldquo;computadora cuántica\u0026rdquo; en las noticias o artículos técnicos. Historias que parecen sacadas de películas de ciencia ficción, como \u0026ldquo;cálculos que tomarían miles de años en las supercomputadoras actuales se terminarán en minutos\u0026rdquo; o \u0026ldquo;todas las tecnologías de cifrado actuales podrían ser descifradas\u0026rdquo;, se cuentan de forma muy persuasiva. Desde gigantes corporativos de TI como Google, IBM y Microsoft, hasta universidades y startups de todo el mundo, compiten ferozmente por llevar a la práctica esta tecnología de ensueño.\nSin embargo, cuando se nos pregunta, \u0026ldquo;¿qué es exactamente una computadora cuántica al final del día?\u0026rdquo;, pocos pueden responder con precisión. Muchas personas tienen una imagen vaga de una \u0026ldquo;caja mágica que puede calcular todas las combinaciones simultáneamente\u0026rdquo;, pero, estrictamente hablando, eso no es correcto.\nEn este artículo, explicaremos a fondo desde los conceptos básicos y de forma comprensible, a pesar de ser técnica, en qué se diferencian fundamentalmente las computadoras cuánticas de las computadoras clásicas (las PC y los teléfonos inteligentes que usamos habitualmente), y cómo fenómenos extraños de la mecánica cuántica como la \u0026ldquo;Superposición\u0026rdquo;, el \u0026ldquo;Entrelazamiento cuántico (Entanglement)\u0026rdquo; y las \u0026ldquo;Puertas cuánticas (Quantum gates)\u0026rdquo; se utilizan para el cálculo. Para cuando termines de leer este artículo, deberías comprender claramente la verdadera grandeza y los desafíos actuales de las computadoras cuánticas.\nCapítulo 1: La diferencia crucial entre las computadoras clásicas y las computadoras cuánticas Para entender cómo funciona una computadora cuántica, primero debemos repasar cómo funcionan las \u0026ldquo;computadoras clásicas\u0026rdquo; que usamos actualmente.\nTabla comparativa: Computadoras Clásicas vs Computadoras Cuánticas Característica Computadora Clásica Computadora Cuántica Unidad básica Bit (0 o 1) Qubit (superposición de 0 y 1) Representación del estado Determinista Probabilística (no se determina hasta que se observa) Método de cálculo Procesamiento secuencial (requiere núcleos físicos para paralelizar) Paralelismo cuántico (manipulación simultánea de un número exponencial de estados) Cálculos en los que destaca Operaciones aritméticas básicas, procesamiento de datos diarios Factorización de números primos, química cuántica Tolerancia a errores Muy fuerte Muy débil (requiere entornos criogénicos o corrección de errores) El mundo de las computadoras clásicas: \u0026ldquo;Bits\u0026rdquo; de 0 o 1 Las computadoras clásicas representan toda la información en un estado de \u0026ldquo;0\u0026rdquo; o \u0026ldquo;1\u0026rdquo;. A esto se le llama Bit. Físicamente, esto se representa mediante la tensión de un transistor en un chip semiconductor: alta (1) o baja (0). Las fotos de alta calidad en tu teléfono inteligente, el texto que estás leyendo ahora y tus videos favoritos de YouTube se reducen en última instancia a una enorme cantidad de \u0026ldquo;secuencias de 0 y 1\u0026rdquo;. La computación es simplemente el proceso de aplicar operaciones a estas secuencias combinando circuitos lógicos fundamentales como AND (conjunción lógica), OR (disyunción lógica) y NOT (negación lógica). Este es un mundo muy seguro y determinista. Si las entradas son las mismas, siempre se obtiene el mismo resultado.\nEl mundo de las computadoras cuánticas: \u0026ldquo;Qubits\u0026rdquo; que son 0 y 1 al mismo tiempo Por otro lado, la unidad mínima de información de una computadora cuántica se llama Qubit (bit cuántico). La mayor característica de un qubit es que no se encuentra solo en un estado de \u0026ldquo;0\u0026rdquo; o \u0026ldquo;1\u0026rdquo; como los bits clásicos, sino que puede tomar un estado en el que \u0026ldquo;0 y 1 se mezclan con cierta probabilidad\u0026rdquo;. A esto se le llama \u0026ldquo;Superposición\u0026rdquo; (Superposition).\nPor ejemplo, si un bit clásico es una moneda sobre una mesa que muestra \u0026ldquo;cara\u0026rdquo; o \u0026ldquo;cruz\u0026rdquo;, a menudo se compara al qubit con \u0026ldquo;una moneda girando en el aire\u0026rdquo;. Una moneda girando no es ni cara ni cruz, sino una superposición de ambos estados. Y en el momento en que la moneda cae al suelo y se detiene (lo que en mecánica cuántica se llama \u0026ldquo;observación\u0026rdquo; o \u0026ldquo;medición\u0026rdquo;), solo entonces se determina si es \u0026ldquo;cara\u0026rdquo; o \u0026ldquo;cruz\u0026rdquo;.\nUna computadora cuántica incorpora directamente en su proceso de procesamiento de información esta propiedad única del mundo microscópico (mecánica cuántica) de que \u0026ldquo;el estado no se determina hasta que es observado\u0026rdquo;.\nCapítulo 2: Las 3 propiedades de la mecánica cuántica que revolucionarán el cálculo La fuente del asombroso poder computacional de una computadora cuántica no se debe a que la velocidad del reloj sea alta o a que los componentes sean pequeños. Radica en el uso de las propias leyes de la física como recursos computacionales. Los siguientes tres fenómenos de la mecánica cuántica son la clave.\n1. Superposición (Superposition) y la cantidad de información exponencial Como se mencionó anteriormente, los qubits pueden mantener ambos estados de 0 y 1 simultáneamente. Un qubit es una \u0026ldquo;superposición de 0 y 1\u0026rdquo;, pero ¿qué sucede cuando se aumenta la cantidad de qubits?\n1 qubit: superposición de 2 estados (0, 1) 2 qubits: superposición de 4 estados (00, 01, 10, 11) 3 qubits: superposición de 8 estados N qubits: superposición de $2^N$ patrones Con tan solo 50 qubits, se pueden mantener simultáneamente $2^{50}$ (aproximadamente 1.100 billones) estados. ¡Y con tan solo 300 qubits, puedes mantener a la vez $2^{300}$ patrones (¡más que el número de todos los átomos que existen en el universo!). Esta capacidad de retención de información exponencial es la base del potencial de la computadora cuántica. Físicamente es imposible que las computadoras clásicas almacenen un número de estados mayor al número de átomos en el universo en la memoria.\n2. Entrelazamiento cuántico (Entanglement): la escalofriante acción a distancia El entrelazamiento cuántico es un fenómeno tan contraintuitivo que Einstein lo llamó \u0026ldquo;espeluznante acción a distancia\u0026rdquo; y se negó a aceptarlo por el resto de su vida.\nCuando múltiples qubits se encuentran en un estado de \u0026ldquo;entrelazamiento cuántico\u0026rdquo;, se conectan fuertemente entre sí. Tienen una relación como si compartieran el mismo destino, en la que \u0026ldquo;cuando el estado de uno de ellos se determina, sin importar cuán lejos estén, el estado del otro se determina instantáneamente\u0026rdquo;.\nPor ejemplo, supongamos que hay dos qubits A y B en estado de entrelazamiento (cada uno en un estado de superposición de 0 y 1). Si se observa A y resulta ser \u0026ldquo;0\u0026rdquo;, superando la velocidad de la luz que es el límite de la transmisión de información, el estado de B también se determina instantáneamente (por ejemplo, siempre será \u0026ldquo;1\u0026rdquo;). En las computadoras cuánticas, usar este entrelazamiento cuántico permite expresar correlaciones complejas entre múltiples qubits y llevar a cabo un procesamiento de información superparalelo. Sin el entrelazamiento, la potencia computacional de una computadora cuántica no sería muy diferente a la de una computadora clásica.\n3. Interferencia Cuántica (Quantum Interference): La magia para revelar la respuesta correcta Es posible que pienses: \u0026ldquo;Si puede contener todos los patrones al mismo tiempo, ¿no se pueden calcular en paralelo de una vez y obtener la respuesta en un instante?\u0026rdquo;. Este es el malentendido más común sobre las computadoras cuánticas. Incluso si haces los cálculos en un estado de superposición, finalmente debes \u0026ldquo;observar\u0026rdquo; para conocer la respuesta. Pero en el instante en que observas, el estado colapsa aleatoriamente en uno de los $2^N$ patrones. Así que solo obtendrías una respuesta completamente aleatoria.\nAquí es donde entra la \u0026ldquo;Interferencia cuántica\u0026rdquo; (Interference). Al igual que cuando chocan dos ondas, utilizamos el fenómeno de que cuando las fases coinciden se amplifican y cuando están desalineadas se cancelan mutuamente (esencialmente el mismo principio que los auriculares con cancelación de ruido).\nUn excelente \u0026ldquo;algoritmo cuántico\u0026rdquo;, durante el proceso de cálculo, manipula hábilmente los estados cuánticos para que \u0026ldquo;las amplitudes de probabilidad de los estados (ondas) que conducen a la respuesta correcta se refuercen entre sí (amplificación)\u0026rdquo; y \u0026ldquo;las amplitudes de probabilidad de los estados que conducen a la respuesta incorrecta se cancelen (interferencia destructiva)\u0026rdquo;. Finalmente, cuando se observa, asegura que la \u0026ldquo;respuesta correcta\u0026rdquo; aparezca con una probabilidad cercana al 100%. El verdadero arte de la programación cuántica consiste en diseñar bien este proceso de interferencia.\nCapítulo 3: ¿Cómo calculan? \u0026ldquo;Puertas cuánticas\u0026rdquo; y \u0026ldquo;Circuitos cuánticos\u0026rdquo; De manera similar a cómo las computadoras clásicas realizan operaciones usando puertas lógicas (AND, OR, NOT, etc.), las computadoras cuánticas realizan operaciones aplicando \u0026ldquo;Puertas cuánticas\u0026rdquo; (Quantum Gates) a los qubits. Una combinación de múltiples puertas cuánticas se llama \u0026ldquo;Circuito cuántico\u0026rdquo; (Quantum Circuit).\nEl estado de un qubit se expresa matemáticamente como un punto en la superficie de una esfera tridimensional llamada \u0026ldquo;esfera de Bloch\u0026rdquo; (Bloch sphere). El polo norte es \u0026ldquo;0\u0026rdquo;, el polo sur es \u0026ldquo;1\u0026rdquo;, y el ecuador es \u0026ldquo;el estado de superposición donde 0 y 1 están mezclados por igual\u0026rdquo;. Las puertas cuánticas no son más que operaciones que giran el estado (vector) a lo largo de la superficie de esta esfera.\nPermítanme presentarles algunas puertas cuánticas típicas.\n1. Puerta Hadamard (Puerta H) Esta es la puerta más fundamental exclusiva de las computadoras cuánticas y que no existe en las computadoras clásicas. Pasar un qubit en un estado perfecto de \u0026ldquo;0\u0026rdquo; a través de una puerta H crea un \u0026ldquo;estado de superposición perfecto\u0026rdquo; (un punto en el ecuador de la esfera de Bloch) en el que \u0026ldquo;0\u0026rdquo; y \u0026ldquo;1\u0026rdquo; se observan con una probabilidad exacta de la mitad cada uno. Como paso de inicialización en los cálculos cuánticos, muchos algoritmos comienzan aplicando la puerta H a todos los qubits.\n2. Puertas de Pauli (Puertas X, Y, Z) Estas puertas incluyen operaciones equivalentes a la puerta NOT (invierte el 0 en 1 y el 1 en 0) en las computadoras clásicas. Equivalen a girar 180 grados alrededor de los ejes X, Y y Z en la esfera de Bloch. Específicamente, la puerta X invierte el polo norte (0) al polo sur (1), por lo que funciona exactamente de la misma forma que una puerta NOT clásica. La puerta Z tiene el papel de invertir la \u0026ldquo;fase (como el ritmo de una ola)\u0026rdquo; de la superposición, lo que es extremadamente importante para causar interferencia cuántica.\n3. Puerta CNOT (Puerta NOT controlada) Es una puerta sumamente importante para crear entrelazamiento cuántico. Usa dos qubits (un bit de control y un bit objetivo). \u0026ldquo;Si el bit de control es 1, invierte el estado del bit objetivo (puerta X). Si el bit de control es 0, no hace nada\u0026rdquo;. Parece una simple bifurcación de condición IF, pero ¿qué pasa si el bit de control está en un \u0026ldquo;estado de superposición de 0 y 1\u0026rdquo;? El bit objetivo queda en un \u0026ldquo;estado de superposición de uno invertido y uno no invertido\u0026rdquo;, y el destino de ambos bits se vincula por completo. Con brillantez, los dos qubits se \u0026ldquo;entrelazan\u0026rdquo;.\nColocando y aplicando estas puertas en orden de izquierda a derecha como si se tratara de la partitura de una música, se ejecutan algoritmos complejos.\nCapítulo 4: ¿En qué son buenas las computadoras cuánticas y en qué son malas? Debo decirte un hecho importante: las computadoras cuánticas no son dioses omnipotentes. Para tareas cotidianas como navegar por la web, renderizar videos, procesar macros de Excel o el funcionamiento general de las aplicaciones de los teléfonos inteligentes, es probable que las computadoras cuánticas nunca superen a las clásicas. Estos procesos secuenciales ya están altamente optimizados y las computadoras clásicas, debido a su velocidad abrumadora y su bajo costo, son más adecuadas.\nEl verdadero valor de las computadoras cuánticas se desata únicamente en \u0026ldquo;problemas específicos donde las combinaciones computacionales estallan exponencialmente en computadoras clásicas, llevando un tiempo del tamaño de la vida del universo\u0026rdquo;. A esto se lo llama \u0026ldquo;Supremacía Cuántica\u0026rdquo; (Quantum Supremacy) o \u0026ldquo;Ventaja Cuántica\u0026rdquo; (Quantum Advantage).\nEn lo que destacan las computadoras cuánticas (Aplicaciones asesinas) 1. Factorización y descifrado de códigos (Algoritmo de Shor) Actualmente, el \u0026ldquo;cifrado RSA\u0026rdquo;, que protege las comunicaciones seguras en Internet (pagos con tarjeta de crédito, transmisión de información personal, etc.), se basa en la premisa de que \u0026ldquo;la factorización de números gigantes es prácticamente imposible (toma una cantidad asombrosa de tiempo) para las computadoras clásicas\u0026rdquo;. Sin embargo, al utilizar el \u0026ldquo;algoritmo de Shor\u0026rdquo; descubierto por el matemático Peter Shor en 1994, las computadoras cuánticas pueden resolver esto a una velocidad dramática (tiempo polinómico) al explotar hábilmente la interferencia. Por este motivo, existe el riesgo de que el actual sistema criptográfico colapse en el futuro, y los bancos centrales y las agencias gubernamentales de todo el mundo se apresuran a migrar a la \u0026ldquo;Criptografía Post-Cuántica\u0026rdquo; (Post-Quantum Cryptography).\n2. Cálculos de química cuántica y desarrollo de nuevos materiales / fármacos El comportamiento de las moléculas y los átomos en la naturaleza obedece inherentemente a las leyes de la mecánica cuántica. Tratar de simular el comportamiento de moléculas complejas con computadoras clásicas resulta en una explosión de combinaciones de interacciones electrónicas, topando con los límites del cómputo incluso con moléculas relativamente pequeñas. Como dijo el físico ganador del premio Nobel Richard Feynman: \u0026ldquo;Si quieres simular la naturaleza, tienes que hacerlo mediante la mecánica cuántica\u0026rdquo;. Las computadoras cuánticas desatan un poder nativo abrumador en la simulación de materia. Se esperan grandes avances que resuelvan los desafíos de la humanidad, como el diseño de nuevos medicamentos revolucionarios, el descubrimiento de materiales superconductores a temperatura ambiente, el desarrollo de materiales de baterías y células solares altamente eficientes, o la síntesis de fertilizantes energéticamente eficientes.\n3. Problemas de optimización combinatoria y búsqueda (Algoritmo de Grover) Los algoritmos cuánticos también son potentes en problemas en los que hay que encontrar la mejor opción entre una inmensa cantidad de alternativas (optimización de rutas de logística, optimización de carteras financieras, etc.). El \u0026ldquo;algoritmo de Grover\u0026rdquo; permite encontrar los datos deseados de bases de datos desestructuradas en una cantidad de intentos igual a la raíz cuadrada de las que requeriría una computadora clásica. Por ejemplo, si hay 100 millones de datos, la búsqueda que requeriría un máximo de 100 millones de iteraciones a nivel clásico podría completarse en solo unas 10.000 iteraciones.\nCapítulo 5: El muro de hardware por superar, la \u0026ldquo;Decoherencia\u0026rdquo; y la \u0026ldquo;Corrección de errores cuánticos\u0026rdquo; Aunque en teoría son computadoras asombrosamente potentes, el camino hacia el uso práctico está bloqueado por un muro físico extremadamente alto y empinado. Su mayor enemigo es el \u0026ldquo;Ruido\u0026rdquo;.\nLa \u0026ldquo;superposición\u0026rdquo; y el \u0026ldquo;entrelazamiento cuántico\u0026rdquo; de los qubits son estados extremadamente frágiles. Al tocar siquiera una mínima cantidad de calor del entorno, una fluctuación electromagnética o rayos cósmicos, el estado mágico colapsa en un instante, convirtiéndose en un bit clásico ordinario. A este fenómeno se le conoce como \u0026ldquo;Decoherencia\u0026rdquo; (Decoherence).\nLa feroz competencia de los métodos de realización física En la actualidad, hay investigaciones en todo el mundo y una batalla por la hegemonía sobre cómo crear físicamente estos delicados qubits.\nMétodo de superconductores (Superconducting): Adoptado por Google, IBM, Amazon, etc. Utilizan circuitos superconductores en forma de bucle y se enfrían con refrigeradores gigantescos a temperaturas ultrabajas cercanas al cero absoluto (aprox. -273°C) para controlar los estados cuánticos. Hoy en día es el método más avanzado y en el que es más fácil incrementar los qubits, pero los dispositivos de refrigeración son gigantes y caros. Método de trampa de iones (Trapped Ion): Adoptado por IonQ, Quantinuum, etc. Confinan iones (átomos) en el vacío mediante campos electromagnéticos y los controlan disparando láseres precisos. Su ventaja es que todos los qubits son idénticos y pueden mantener el estado durante mucho tiempo (tiempo de coherencia prolongado), pero la velocidad de operación es más lenta que el método de superconductores. Método de fotónica cuántica (Photonic): Fomentado por PsiQuantum, etc. Usa partículas de luz (fotones). Muchas partes pueden operar a temperatura ambiente sin necesidad de criogenia, lo que ofrece la enorme ventaja de la compatibilidad con las tecnologías actuales de fabricación de chips de silicio y transmisión por fibra óptica. Método topológico (Topological): Investigado a largo plazo por Microsoft. Aprovecha las propiedades topológicas de partículas especiales llamadas \u0026ldquo;anyones\u0026rdquo;, con un enfoque ambicioso de crear qubits fundamentalmente resistentes al ruido ambiental (menos propensos a errores). Teóricamente es el mejor, pero se considera que su obstáculo de realización física es el más alto. El camino al objetivo final: \u0026ldquo;Computadora Cuántica Tolerante a Fallos (FTQC)\u0026rdquo; En el mundo actual de las computadoras clásicas también existen los errores de cálculo (inversión de bits por los rayos cósmicos, etc.), pero al ser corregidos a la perfección mediante \u0026ldquo;códigos de corrección de errores\u0026rdquo;, podemos usar nuestros teléfonos inteligentes sin jamás ser conscientes de los fallos. Para que una computadora cuántica realice cálculos a gran escala a nivel práctico, es indispensable una \u0026ldquo;Corrección de errores cuánticos (Quantum Error Correction: QEC)\u0026rdquo; similar.\nSin embargo, dado que los estados cuánticos se \u0026ldquo;rompen al ser observados\u0026rdquo;, existe un dilema letal, ya que el contenido no se puede observar directamente para comprobar el error. Para evitar esto, se ha establecido la teoría de combinar hábilmente muchos \u0026ldquo;qubits físicos\u0026rdquo; inestables para construir un \u0026ldquo;qubit lógico\u0026rdquo; estable que sea capaz de detectar y rectificar fallos (como el código de superficie). Aun así, se dice que construir un solo qubit lógico requiere entre 1.000 y 10.000 qubits físicos. Para ejecutar algoritmos como el de Shor utilizando miles de qubits lógicos, se necesitará un sistema enorme con entre millones y decenas de millones de qubits físicos.\nEn este momento estamos en lo que se llama la era de los dispositivos NISQ (Noisy Intermediate-Scale Quantum: Cuántica de Escala Intermedia Ruidosa). Es una fase de transición para máquinas que operan con docenas a cientos de qubits, sin corrección de errores. El objetivo final de una \u0026ldquo;Computadora Cuántica Tolerante a Fallos (Fault-Tolerant Quantum Computer: FTQC)\u0026rdquo; plenamente dotada con corrección de errores, requerirá aún otra década o más de investigación y desarrollo, según pronostican los expertos.\nCapítulo 6: La historia y perspectivas a futuro de la computadora cuántica Finalmente, demos un vistazo a cómo nacieron las computadoras cuánticas y adónde se dirigen.\nDesde el nacimiento de la teoría hasta la prueba de la \u0026ldquo;Supremacía Cuántica\u0026rdquo; Años 1980: Los físicos Paul Benioff y Richard Feynman propusieron el concepto de computadoras basadas en los principios de la mecánica cuántica. Todo empezó con la frase \u0026ldquo;si vas a simular la naturaleza, usa la mecánica cuántica\u0026rdquo;. 1994: Peter Shor publicó el algoritmo cuántico de factorización (el algoritmo de Shor). Impactó al mundo, provocando una avalancha de grandes fondos de investigación. 1996: Lov Grover publicó el algoritmo de Grover, que acelera la búsqueda de datos. **2019 **: Hito histórico. Google, usando un procesador superconductor de 53 qubits llamado \u0026ldquo;Sycamore\u0026rdquo;, anunció que la supercomputadora clásica tardaría 10.000 años en calcular una verificación de generación de números aleatorios, que ellos habían completado en unos 200 segundos. Como la primera demostración de \u0026ldquo;Supremacía Cuántica\u0026rdquo; (Quantum Supremacy) del mundo, fue un tema inmenso (luego IBM y otros mejoraron el algoritmo del lado clásico argumentando que era calculable en un par de días, produciendo debates candentes). A partir del 2023: IBM anunció el procesador \u0026ldquo;Condor\u0026rdquo;, que supera los 1000 qubits. Además, la Universidad de Harvard y otras han tenido éxito en la generación y operación de \u0026ldquo;qubits lógicos\u0026rdquo;, con los primeros informes que demuestran una sucesión de las primeras pruebas de tecnologías de corrección de errores. Hacia la tecnología de la próxima generación Una computadora cuántica no es solo una \u0026ldquo;CPU de nueva generación con una velocidad de reloj más rápida\u0026rdquo;. Se trata de un cambio de paradigma en la informática en el cual el concepto mismo de calcular se reescribe desde sus raíces bajo las normas de la mecánica cuántica que gobiernan el mundo microscópico.\nNo vamos a tener a lo largo de nuestra vida un \u0026ldquo;smartphone cuántico personal\u0026rdquo; en nuestros bolsillos (no es necesario). Sin embargo, seguro se acerca el futuro en el que los enormes centros de datos cuánticos, más allá de redes en la nube como AWS o Azure, un día repentinamente encuentren la cura milagrosa para una enfermedad incurable o identifiquen los soñados materiales para una energía limpia que solucionarán el calentamiento global (por ejemplo, catalizadores para sintetizar amoníaco desde el nitrógeno del aire a temperatura ambiente).\nAhora seguimos en el equivalente al inicio de los años 40, al igual que ENIAC, con sus tarjetas perforadas y un cuarto ardiendo de calor por enormes tubos de vacío. No obstante, ingenieros e investigadores de primer nivel de todo el mundo dedican toda su sabiduría al esfuerzo, e informes con innovaciones técnicas llegan a diario. Nosotros, que podemos presenciar la evolución de este nuevo \u0026ldquo;amanecer computacional\u0026rdquo; en tiempo real, podríamos decir que vivimos en una era excepcionalmente emocionante de la historia.\nLas puertas al mundo cuántico acaban de abrirse. No podemos quitarle los ojos a las futuras tendencias.\nEste artículo tiene la intención de explicar los conceptos básicos de la computación cuántica de manera comprensible a personas del mundo de los negocios y el público general interesado en tecnología. Tenga en cuenta que ha sido en parte simplificado, omitiendo las definiciones matemáticas y físicas estrictas (como los detalles de la notación bra-ket y de la amplitud de probabilidad compleja).\n","date":"2026-09-05T22:10:00+09:00","image":"http://kenji.blog/p/quantum-computer-basics/quantum_basics_eyecatch_1788613712487_huf997c6e55368509d0617b56f68899854_1084950_120x120_fill_q75_box_smart1.jpg","permalink":"http://kenji.blog/es/p/quantum-computer-basics/","title":"【Análisis Completo】¿Qué es una computadora cuántica? 〜El principio de cálculo definitivo desde cero〜"},{"content":"Introducción: La \u0026ldquo;amenaza\u0026rdquo; de las computadoras cuánticas a la criptografía En la actualidad, gran parte de nuestras comunicaciones diarias en Internet (como los pagos bancarios en línea, la navegación web (HTTPS), los mensajes en aplicaciones de mensajería, el blockchain y las transacciones de criptomonedas) están protegidas por una tecnología llamada \u0026ldquo;criptografía de clave pública\u0026rdquo;. Específicamente, algoritmos como RSA y la criptografía de curva elíptica (ECC) constituyen la base fundamental que sustenta la fiabilidad de nuestra sociedad digital moderna.\nEstos sistemas criptográficos basan su seguridad en problemas matemáticos difíciles, como la \u0026ldquo;factorización de enteros gigantes\u0026rdquo; y el \u0026ldquo;problema del logaritmo discreto\u0026rdquo;, cuya resolución tomaría un tiempo astronómico para las computadoras clásicas actuales (incluyendo las supercomputadoras). Sin embargo, cuando se materialice el rápido progreso reciente y las \u0026ldquo;computadoras cuánticas\u0026rdquo; se vuelvan prácticas, esta premisa se verá alterada desde sus cimientos.\nEn 1994, Peter Shor publicó el \u0026ldquo;Algoritmo de Shor\u0026rdquo;, demostrando matemáticamente que una computadora cuántica con suficiente capacidad puede resolver la factorización de enteros y los problemas de logaritmos discretos en muy poco tiempo. Esto significa el riesgo (conocido como Y2Q: Years to Quantum, o el problema Q-Day) de que toda la comunicación cifrada que protege la Internet actual sea descifrada en el futuro.\nAún más grave es la existencia de una técnica de ataque llamada \u0026ldquo;Cosechar ahora, descifrar después\u0026rdquo; (Harvest Now, Decrypt Later), en la cual los datos se roban y almacenan hoy para descifrarlos en el futuro cuando la tecnología lo permita. Los datos que requieren mantenerse confidenciales durante décadas, como la información clasificada del estado, la propiedad intelectual corporativa y la información biométrica personal, ya podrían ser objeto de robo con la premisa de ser descifrados en el futuro.\nPara hacer frente a esta crisis sin precedentes, criptógrafos e institutos de investigación de todo el mundo están aunando esfuerzos para desarrollar una tecnología criptográfica de próxima generación que pueda mantener la seguridad incluso contra ataques de computadoras cuánticas: la Criptografía Post-Cuántica (PQC: Post-Quantum Cryptography). En este artículo, explicaremos en detalle desde los fundamentos de la PQC hasta cómo funcionan sus principales algoritmos, así como las últimas tendencias de estandarización global impulsadas por el Instituto Nacional de Estándares y Tecnología de los Estados Unidos (NIST).\n¿Qué es la Criptografía Post-Cuántica (PQC)? La Criptografía Post-Cuántica (PQC) es un término general para los algoritmos criptográficos diseñados para funcionar en las computadoras clásicas existentes y, al mismo tiempo, ser resistentes a ataques de las computadoras cuánticas a gran escala que surgirán en el futuro (como el algoritmo de Shor).\nA menudo se confunde con tecnologías como la \u0026ldquo;Criptografía Cuántica\u0026rdquo; y la \u0026ldquo;Distribución Cuántica de Claves (QKD)\u0026rdquo;, pero estos son enfoques completamente diferentes. La Criptografía Cuántica (QKD) es una tecnología basada en hardware que utiliza las leyes de la física cuántica (como la propiedad de que la observación altera el estado) para hacer que las escuchas clandestinas en la ruta de comunicación sean físicamente imposibles. Requiere fibra óptica dedicada y equipo especial, lo que presenta desafíos en términos de costos de implementación y limitaciones de distancia.\nPor otro lado, la PQC es una tecnología criptográfica basada en software fundamentada puramente en \u0026ldquo;matemáticas\u0026rdquo;. Por lo tanto, puede incorporarse como actualizaciones de software en la infraestructura de Internet existente, servidores, teléfonos inteligentes, navegadores, etc., lo que la hace altamente aplicable en el mundo real. Las empresas de TI y las agencias gubernamentales de todo el mundo consideran urgente reemplazar (migrar) los actuales RSA y ECC por esta PQC.\nLos 4 enfoques matemáticos principales que sustentan la PQC Se han propuesto varios algoritmos de PQC basados en problemas matemáticos difíciles de resolver de manera eficiente incluso con computadoras cuánticas (como los problemas NP-difíciles). Aquí presentamos las 4 categorías principales que dominan actualmente.\nEnfoques principales de la Criptografía Post-Cuántica (PQC) 1 2 3 4 5 6 7 8 9 10 11 12 graph LR PQC[Criptografía Post-Cuántica PQC] --\u0026gt; L[Criptografía basada en retículos Lattice-based] PQC --\u0026gt; H[Criptografía basada en hash Hash-based] PQC --\u0026gt; M[Criptografía multivariante Multivariate] PQC --\u0026gt; C[Criptografía basada en códigos Code-based] L --\u0026gt; L1(FIPS 203: ML-KEM) L --\u0026gt; L2(FIPS 204: ML-DSA) H --\u0026gt; H1(FIPS 205: SLH-DSA) style PQC fill:#f9f,stroke:#333,stroke-width:2px 1. Criptografía basada en retículos (Lattice-based Cryptography) Actualmente, la criptografía basada en retículos es la más prometedora y predominante en el campo de la PQC. Su seguridad se fundamenta en problemas relacionados con puntos dispuestos regularmente (puntos de retículo) en espacios multidimensionales. Problemas famosos incluyen el \u0026ldquo;Problema del Vector Más Corto (SVP)\u0026rdquo; y el \u0026ldquo;Aprendizaje con Errores (LWE)\u0026rdquo;.\nResumen del funcionamiento: Imagine innumerables puntos dispuestos como una cuadrícula (retículo) en un espacio de altísima dimensión (cientos a miles de dimensiones). Encontrar un punto de retículo específico es fácil en 2 o 3 dimensiones, pero a cientos de dimensiones, no se ha descubierto un algoritmo eficiente para encontrarlo, ni para computadoras clásicas ni cuánticas. El problema LWE, en particular, aprovecha la propiedad de que \u0026ldquo;si se agrega intencionalmente un pequeño \u0026lsquo;ruido (error)\u0026rsquo; a un sistema de ecuaciones lineales, se vuelve drásticamente más difícil adivinar las variables originales\u0026rdquo;.\nVentajas:\nAplicable tanto a la encapsulación de claves (KEM) como a firmas digitales. Velocidad de procesamiento extremadamente rápida (a veces más rápida que RSA y ECC). Buen equilibrio entre el tamaño de la clave y el tamaño del texto cifrado. Muchos de los algoritmos actualmente estandarizados por el NIST (como ML-KEM y ML-DSA) utilizan esta criptografía basada en retículos.\n2. Criptografía basada en hash (Hash-based Cryptography) La criptografía basada en hash es un algoritmo PQC especializado en firmas digitales. La base de su seguridad depende únicamente de la resistencia a colisiones y la unidireccionalidad de \u0026ldquo;funciones hash criptográficas\u0026rdquo; seguras como SHA-2 y SHA-3.\nResumen del funcionamiento: Comienza con un esquema de firma de un solo uso llamado \u0026ldquo;Firma de Lamport\u0026rdquo;. Al agrupar estas firmas utilizando una estructura de datos en forma de árbol llamada \u0026ldquo;Árbol de Merkle\u0026rdquo;, se permiten múltiples firmas con un solo par de claves.\nVentajas:\nLa base de seguridad es extremadamente robusta; hay una fuerte prueba de que \u0026ldquo;es seguro mientras la función hash sea segura\u0026rdquo;. Al depender poco de una estructura matemática, el riesgo de que se descubra un método de descifrado imprevisto es bajo. Desventajas:\nSolo se puede usar para firmas digitales, no para el establecimiento de claves (KEM). El tamaño de la firma tiende a ser grande. Existen variantes \u0026ldquo;con estado\u0026rdquo; (stateful) y \u0026ldquo;sin estado\u0026rdquo; (stateless). Las variantes con estado (como XMSS) requieren una gestión estricta del número de usos de la clave, lo que dificulta su implementación. NIST ha estandarizado \u0026ldquo;SLH-DSA (anteriormente SPHINCS+)\u0026rdquo; como una firma basada en hash sin estado.\n3. Criptografía multivariante (Multivariate Cryptography) La criptografía de polinomios multivariantes basa su seguridad en la dificultad de resolver un sistema de ecuaciones polinómicas cuadráticas simultáneas con múltiples variables (el problema MQ). Se sabe que este problema es NP-difícil.\nResumen del funcionamiento: El remitente crea un texto cifrado (firma) sustituyendo el texto sin formato (o el valor hash) en una compleja ecuación con múltiples variables proporcionada como clave pública. El destinatario legítimo posee \u0026ldquo;información oculta (una puerta trasera) que transforma la estructura de la ecuación en una forma fácil de resolver\u0026rdquo; como su clave privada, y la utiliza para descifrar (o verificar la firma).\nVentajas:\nEl tamaño de la firma es muy pequeño. La velocidad de verificación de la firma es extremadamente rápida. Adecuado para dispositivos IoT con recursos limitados. Desventajas:\nEl tamaño de la clave pública es muy grande (puede ser de decenas a cientos de kilobytes). En el pasado, algoritmos prominentes (como Rainbow) han sido quebrados por ataques clásicos, lo que dificulta establecer la confianza en su seguridad en comparación con otros métodos. 4. Criptografía basada en códigos (Code-based Cryptography) La criptografía basada en códigos aplica a la criptografía la teoría de los \u0026ldquo;códigos de corrección de errores\u0026rdquo; utilizados para corregir errores en las rutas de comunicación. El \u0026ldquo;criptosistema McEliece\u0026rdquo;, propuesto en 1978, es el más famoso y uno de los más antiguos de la PQC.\nResumen del funcionamiento: El remitente codifica el texto sin formato utilizando la clave pública del destinatario (una matriz generadora de un código de corrección de errores con una estructura oculta), agrega un error intencional (ruido) y lo envía. El destinatario elimina el error usando la clave privada y extrae el texto sin formato. El atacante debe corregir el error de un código aparentemente aleatorio sin conocer su estructura, lo que se conoce como el \u0026ldquo;problema general de decodificación de síndrome\u0026rdquo;, probado como NP-difícil.\nVentajas:\nTras más de 40 años de estudio exhaustivo, no se han encontrado ataques efectivos, lo que le otorga una altísima confianza en su seguridad. Procesamiento de cifrado y descifrado rápido. Desventajas:\nEl tamaño de la clave pública es gigantesco (puede ser de varios megabytes). Por lo tanto, es difícil de utilizar en entornos con ancho de banda de comunicación o memoria limitados (como en el handshake de TLS). Últimas tendencias en la estandarización de PQC por parte del NIST El Instituto Nacional de Estándares y Tecnología de los Estados Unidos (NIST) comenzó en 2016 a solicitar algoritmos criptográficos post-cuánticos de próxima generación en todo el mundo, llevando a cabo evaluaciones rigurosas y múltiples rondas durante varios años.\nEn 2024, el NIST anunció finalmente los siguientes tres algoritmos como Estándares Federales de Procesamiento de Información (FIPS) oficiales. Esto proporciona una base sólida para que las organizaciones de todo el mundo comiencen a implementarlos en entornos de producción.\nEstándares FIPS Promulgados (2024) FIPS 203: ML-KEM (anteriormente CRYSTALS-Kyber)\nUso: Mecanismo de encapsulación de claves (KEM) / Cifrado e intercambio de claves Tecnología base: Criptografía de retículos (Module-LWE) Características: Excelente equilibrio entre tamaño de clave y velocidad. Actuará como el intercambio de claves PQC predeterminado en aplicaciones comunes de Internet, como la comunicación web (TLS) y las aplicaciones de mensajería segura. FIPS 204: ML-DSA (anteriormente CRYSTALS-Dilithium)\nUso: Firma digital Tecnología base: Criptografía de retículos (Module-LWE) Características: El estándar principal para firmas digitales. Permite un procesamiento eficiente y se convertirá en el nuevo estándar para todos los propósitos de firmas electrónicas, como la firma de software y la autenticación de documentos. FIPS 205: SLH-DSA (anteriormente SPHINCS+)\nUso: Firma digital Tecnología base: Criptografía basada en hash (sin estado) Características: Juega un papel crucial al actuar como respaldo en caso de que se descubran vulnerabilidades en la criptografía de retículos en el futuro. Aunque el tamaño de la firma es mayor, es adecuado para aplicaciones que requieren confiabilidad a largo plazo. En busca de una mayor diversidad Si bien el NIST ha completado su proceso de estandarización inicial, continúa explorando más algoritmos. Debido a que el estándar está fuertemente sesgado hacia la \u0026ldquo;criptografía de retículos\u0026rdquo;, se hace hincapié en asegurar la \u0026ldquo;Diversidad Criptográfica\u0026rdquo; (Crypto Diversity). Se están evaluando métodos como la criptografía basada en códigos como estándares de respaldo para el intercambio de claves, lo que fortalecerá aún más la base de la PQC en el futuro.\nEscenarios y desafíos en la transición a PQC: La importancia de la \u0026ldquo;Agilidad Criptográfica\u0026rdquo; Con el lanzamiento de las normas oficiales por parte del NIST, agencias gubernamentales, instituciones financieras y empresas tecnológicas de todo el mundo intensificarán su transición (migración) del RSA/ECC existente a PQC. Las pautas de la NSA (Agencia de Seguridad Nacional de EE. UU.) y otros también recomiendan completar esta transición de manera temprana.\nAdopción de un enfoque híbrido Como los algoritmos PQC son nuevos, no han superado la \u0026ldquo;prueba del tiempo\u0026rdquo; en comparación con la criptografía clásica. Considerando el riesgo de posibles errores de implementación o el descubrimiento de nuevos métodos de ataque, se recomienda un \u0026ldquo;enfoque híbrido\u0026rdquo; durante el período de transición. Esto implica combinar criptografía existente probada (por ejemplo, ECDHE) con la nueva PQC (por ejemplo, ML-KEM) para el intercambio de claves. Actualmente, los principales navegadores y servicios en la nube están avanzando rápidamente en implementaciones de prueba de este método.\nLograr la Agilidad Criptográfica (Crypto-Agility) Lo que las empresas y los desarrolladores de sistemas deben tener más presente en el futuro es asegurar la \u0026ldquo;Agilidad Criptográfica\u0026rdquo; (Crypto-Agility). Es indispensable diseñar una arquitectura flexible que permita reemplazar y actualizar rápidamente los algoritmos criptográficos sin detener el sistema, en caso de que se descubran fallos en los algoritmos en el futuro o surjan nuevos estándares.\nEl primer y crucial paso para la transición a PQC es la creación de un Inventario Criptográfico (CBOM: Cryptography Bill of Materials), que permita saber exactamente \u0026ldquo;dónde\u0026rdquo;, \u0026ldquo;qué criptografía\u0026rdquo; y \u0026ldquo;con qué propósito\u0026rdquo; se está utilizando dentro de los sistemas de la empresa.\nConclusión: Preparándose para el \u0026ldquo;Día Q\u0026rdquo; (Q-Day) Si bien la evolución de las computadoras cuánticas traerá enormes beneficios a la humanidad, también representa la mayor amenaza para la seguridad criptográfica, que es la columna vertebral de nuestra sociedad digital actual. La Criptografía Post-Cuántica (PQC) ya no es un \u0026ldquo;tema de investigación en un futuro lejano\u0026rdquo;. Con el hito de la publicación de los estándares FIPS por parte del NIST, la PQC ha entrado en una fase de \u0026ldquo;implementación y transición\u0026rdquo; a gran escala.\nTeniendo en cuenta la amenaza de \u0026ldquo;Cosechar ahora, descifrar después\u0026rdquo;, migrar a PQC es una prioridad absoluta que todas las organizaciones que manejan datos altamente confidenciales deben abordar \u0026ldquo;ahora mismo\u0026rdquo;. Comprendiendo profundamente las tecnologías criptográficas de próxima generación y aumentando la agilidad criptográfica de los sistemas, preparémonos para superar de forma segura la inminente era de las computadoras cuánticas.\n","date":"2026-09-05T22:09:22+09:00","image":"http://kenji.blog/p/post-quantum-cryptography/post_quantum_cryptography_1788613735417_hu9d405d830ed3e56e9e703ab601cf6c0a_1143219_120x120_fill_q75_box_smart1.jpg","permalink":"http://kenji.blog/es/p/post-quantum-cryptography/","title":"【PQC】La visión completa de la criptografía post-cuántica: La criptografía de próxima generación de la era de las computadoras cuánticas"},{"content":"Introducción: La intersección entre la criptografía y la computación cuántica En la sociedad de Internet moderna, la base para proteger el secreto de las comunicaciones es la \u0026ldquo;criptografía de clave pública\u0026rdquo;. Entre ellas, un representante típico es el \u0026ldquo;cifrado RSA\u0026rdquo;, desarrollado en 1977 por Ron Rivest, Adi Shamir y Leonard Adleman. Desde los pagos en compras en línea que utilizamos todos los días, la navegación de sitios web (HTTPS) hasta el envío y recepción de correos electrónicos, el cifrado RSA funciona como el corazón de la infraestructura de Internet.\nSin embargo, con la llegada de las \u0026ldquo;computadoras cuánticas\u0026rdquo;, se ha señalado la posibilidad de que esta seguridad se vea socavada desde sus cimientos. A veces, en los medios de comunicación aparecen titulares sensacionalistas como: \u0026ldquo;Si se perfecciona la computadora cuántica, las contraseñas y códigos de todo el mundo serán descifrados en segundos\u0026rdquo;. Pero, ¿es esto realmente cierto?\nEn este artículo, profundizaremos en los mecanismos del GNFS (Criba General del Cuerpo de Números), que es un método clásico de criptoanálisis, y el \u0026ldquo;Algoritmo de Shor\u0026rdquo; (Shor\u0026rsquo;s Algorithm), que es la versión definitiva del algoritmo de descifrado utilizando computadoras cuánticas. Explicaremos de manera sencilla conceptos avanzados como la transformada cuántica de Fourier y el hallazgo de períodos, y examinaremos en detalle el estado actual del hardware cuántico en la era actual NISQ (Noisy Intermediate-Scale Quantum) y los obstáculos necesarios para romper realmente RSA-2048.\nLa base del cifrado RSA: La dificultad de la factorización de enteros La seguridad del cifrado RSA depende de una asimetría extremadamente simple en matemáticas. Es el hecho de que \u0026ldquo;multiplicar dos números primos gigantescos es fácil, pero encontrar (factorizar) los dos números primos originales a partir del resultado multiplicado (número compuesto) es extremadamente difícil\u0026rdquo;.\nPor ejemplo, supongamos que hay dos números primos $ p = 61 $ y $ q = 53 $. Calcular esta multiplicación $ N = p \\times q = 3233 $ es instantáneo. Sin embargo, si solo se da el número \u0026ldquo;3233\u0026rdquo; y se nos pide resolver \u0026ldquo;¿de qué números primos es esta la multiplicación?\u0026rdquo;, a medida que el número crece, la cantidad de cálculo explota exponencialmente.\nEn el RSA-2048, que es la corriente principal en la actualidad, la longitud de la clave es de 2048 bits, es decir, se utiliza un gigantesco número compuesto $ N $ de unos 617 dígitos decimales. Si este $ N $ pudiera ser factorizado, el cifrado estaría prácticamente descifrado.\nEl desafío de las computadoras clásicas: GNFS (Criba General del Cuerpo de Números) Para resolver el problema de la factorización, matemáticos y criptógrafos han desarrollado varios algoritmos a lo largo de los años. Entre ellos, el que actualmente se considera el más rápido en computadoras clásicas es la Criba General del Cuerpo de Números (GNFS: General Number Field Sieve).\nGNFS es un método para factorizar un número gigantesco $ N $ extendiendo el cálculo en el anillo de enteros a un cuerpo de números algebraicos más abstracto (Number Field) para su análisis. El flujo general es el siguiente:\nSelección de polinomios : Encontrar un polinomio $ f(x) $ con el grado y los coeficientes adecuados que tenga a $ N $ como raíz. Recopilación de datos (cribado) : Buscar en el cuerpo de los números racionales y en el cuerpo algebraico una gran cantidad de pares de números que se puedan descomponer en números primos pequeños (números suaves, Smooth numbers). Este proceso se llama \u0026ldquo;cribado\u0026rdquo; y es la parte que requiere más tiempo. Generación y reducción de matrices : Generar una matriz dispersa gigante (una matriz donde la mayoría de los componentes son 0) basada en las relaciones recopiladas, y usar métodos de álgebra lineal (como el método de Block-Lanczos) para encontrar una solución. Cálculo de raíces cuadradas : Finalmente, calcular la raíz cuadrada sobre el cuerpo algebraico para derivar los factores (factores primos) de $ N $. La complejidad computacional de GNFS se evalúa asintóticamente como $ O(\\exp((\\sqrt[3]{\\frac{64}{9}} + o(1)) (\\log N)^{\\frac{1}{3}} (\\log \\log N)^{\\frac{2}{3}})) $. Esto se llama complejidad temporal \u0026ldquo;subexponencial\u0026rdquo; (Sub-exponential). Aunque es más rápido que el tiempo exponencial, es mucho más lento que el tiempo polinómico (Polynomial time).\nDe hecho, en 2020, un equipo de investigación internacional logró factorizar el RSA-250 (un número compuesto de 829 bits y 250 dígitos) utilizando GNFS. Este cálculo consumió un enorme tiempo de computación de aproximadamente 2700 CPU core-años, reuniendo recursos informáticos de todo el mundo. Sin embargo, cuando se trata de 2048 bits, se menciona que la cantidad de cálculo necesaria aumentaría a billones de veces la edad del universo, por lo que no importa cuántas supercomputadoras actuales funcionen en paralelo, es imposible descifrarlo en un tiempo realista utilizando métodos clásicos.\nLa carta de triunfo de la computadora cuántica: El algoritmo de Shor Aquí es donde entra en juego el \u0026ldquo;Algoritmo de Shor\u0026rdquo;, publicado por Peter Shor en 1994. Este algoritmo fue revolucionario al poder resolver el problema de la factorización de enteros en una computadora cuántica en tiempo polinómico ( $ O((\\log N)^3) $ ). La diferencia entre el tiempo subexponencial y el tiempo polinómico es decisiva, lo que significa que, en teoría, el uso de una computadora cuántica destruiría por completo el cifrado RSA.\nFlujo general del algoritmo de Shor 1 2 3 4 5 6 7 8 9 10 graph TD A[Ingresar el número N a factorizar] --\u0026gt; B[Seleccionar un número entero aleatorio a] B --\u0026gt; C{Máximo común divisor\u0026lt;br\u0026gt;de a y N} C --\u0026gt;|Mayor que 1| D[¡Afortunadamente encontramos un factor primo!] C --\u0026gt;|1 Coprimos| E[Turno de la computadora cuántica] E --\u0026gt; F[Encontrar el período r de la función\u0026lt;br\u0026gt;f_x = a^x mod N mediante\u0026lt;br\u0026gt;la transformada cuántica de Fourier] F --\u0026gt; G{¿Es el período r par y\u0026lt;br\u0026gt;a^r/2 ≢ -1 mod N?} G --\u0026gt;|Sí| H[Calcular el máximo común divisor gcd_a^r/2 ± 1, N] H --\u0026gt; I((¡Factorización exitosa!)) G --\u0026gt;|No| B El algoritmo de Shor no resuelve directamente el problema de la factorización, sino que utiliza teoremas de la teoría de números para convertirlo en otro problema llamado \u0026ldquo;Problema de hallazgo de períodos\u0026rdquo; (Period Finding Problem), y aborda resolverlo rápidamente aprovechando las características de las computadoras cuánticas.\nPaso 1: Reducción de la factorización al problema de hallazgo de períodos (Procesamiento clásico) El primer paso del algoritmo se realiza en una computadora clásica. Para el número $ N $ que queremos factorizar, elegimos un entero aleatorio $ a $ ( $ 1 \u003c a \u003c N $ ) que sea coprimo con $ N $ (su máximo común divisor es 1). Si, por casualidad, el máximo común divisor no es 1, entonces el divisor común encontrado en ese punto es un factor primo de $ N $ y el descifrado está completo, pero la probabilidad es extremadamente baja.\nLuego, consideramos la siguiente secuencia de ecuaciones modulares: $ f(x) = a^x \\pmod N $\nSi sustituimos $ x = 1, 2, 3, \\dots $ en esta función $ f(x) $, los valores parecen ser aleatorios, pero dado que estamos calculando dentro de un rango finito, inevitablemente volverá al valor original en algún punto y repetirá la misma secuencia de números. A este período de repetición lo llamamos $ r $. Es decir, $ a^r \\equiv 1 \\pmod N $ El problema de encontrar el entero positivo más pequeño $ r $ que cumpla con esto, es el \u0026ldquo;Problema de hallazgo de períodos\u0026rdquo;.\nSi se encuentra este período $ r $, y si $ r $ es par, entonces $ a^r - 1 \\equiv 0 \\pmod N $, y usando la fórmula de factorización se puede transformar en: $ (a^{r/2} - 1)(a^{r/2} + 1) \\equiv 0 \\pmod N $ A partir de aquí, al calcular el máximo común divisor de $ N $ y $ a^{r/2} \\pm 1 $ usando el algoritmo de Euclides, se puede obtener un factor primo de $ N $ con una probabilidad extremadamente alta.\nPara encontrar el período $ r $ en una computadora clásica, en última instancia, se requieren pasos exponenciales y no se puede acelerar. Sin embargo, una computadora cuántica puede encontrar este período $ r $ en un instante (en tiempo polinómico).\nPaso 2: Preparación del estado cuántico y superposición A partir de aquí es el turno de la computadora cuántica. Las computadoras cuánticas utilizan \u0026ldquo;cúbits\u0026rdquo; (Qubits) que pueden tener los estados \u0026ldquo;0\u0026rdquo; y \u0026ldquo;1\u0026rdquo; simultáneamente. En el algoritmo de Shor, se preparan dos registros: un registro para almacenar la entrada (el primer registro) y un registro para almacenar los resultados del cálculo (el segundo registro).\nPrimero, se aplica una operación de puerta cuántica llamada Puerta de Hadamard (Hadamard gate) a todos los cúbits del primer registro. Como resultado, el primer registro se convierte en un estado de superposición uniforme de todos los valores posibles de $ x $ (desde $ 0 $ hasta $ 2^n-1 $, donde $ n $ es un número de bits suficientemente grande).\nEn otras palabras, dentro de la computadora cuántica se crea un estado en el que existen de manera simultánea y paralela innumerables valores de entrada $ x=0, 1, 2, 3, \\dots $.\nPaso 3: Exponenciación modular cuántica (Quantum Modular Exponentiation) A continuación, tomando el estado de superposición del primer registro como entrada, calculamos $ f(x) = a^x \\pmod N $ y almacenamos el resultado en el segundo registro. Dado que este cálculo se ejecuta como una transformación unitaria en el circuito cuántico, el cálculo de $ f(x) $ para todos los $ x $ se realiza \u0026ldquo;simultáneamente y en paralelo (paralelismo cuántico)\u0026rdquo; manteniendo la superposición.\nEn este punto, el espacio general del sistema cuántico es: $ |x, a^x \\bmod N\\rangle $ que es una enorme superposición de estados.\nSin embargo, si simplemente medimos (observamos) el segundo registro aquí, un valor aleatorio de $ a^x \\bmod N $ se elegirá probabilísticamente, y en conjunto con esto, el $ x $ del primer registro también se fijará a uno solo. Hacer esto equivaldría a calcularlo una vez en una computadora clásica y no nos permitiría encontrar el período $ r $.\nBajo las reglas de la mecánica cuántica, no podemos mirar directamente el contenido de un estado de superposición. Entonces, ¿cómo extraemos la información global, que es el \u0026ldquo;período\u0026rdquo; de todo el sistema?\nPaso 4: Transformada Cuántica de Fourier (QFT: Quantum Fourier Transform) La verdadera genialidad del algoritmo de Shor para superar este obstáculo es la aplicación de la Transformada Cuántica de Fourier (QFT) al primer registro.\nAntes de realizar la medición, analizamos las propiedades de onda de la función $ f(x) $. Supongamos que observamos el segundo registro. Asumamos que se obtuvo un valor $ y $. Entonces, el estado del primer registro colapsa en \u0026ldquo;la superposición de todos los $ x $ tal que $ a^x \\pmod N = y $\u0026rdquo;. Los valores de este $ x $ estarán separados por un intervalo del período $ r $ de la forma $ x_0, x_0 + r, x_0 + 2r, x_0 + 3r, \\dots $, resultando en un estado discretamente alineado (una especie de distribución de amplitud de probabilidad en forma de peine).\nAplicamos la Transformada Cuántica de Fourier (QFT) a este estado. Así como la transformada discreta de Fourier clásica convierte una señal en el dominio del tiempo al dominio de la frecuencia, la QFT causa interferencia en las amplitudes de probabilidad del estado cuántico.\nAl aplicar la QFT, debido al efecto de interferencia cuántica, las probabilidades de respuestas incorrectas que no resuenan (están desfasadas) con el período $ r $ se anulan mutuamente y se acercan a cero (interferencia destructiva), y solo se amplifica la probabilidad de la respuesta correcta que tiene la información del período $ r $ (interferencia constructiva).\nPaso 5: Medición y expansión en fracciones continuas (Post-procesamiento clásico) Si se mide el primer registro después de aplicar la QFT, con una probabilidad muy alta se obtendrá un entero $ c $ muy cercano a la forma $ c \\approx \\frac{j \\cdot 2^n}{r} $ (donde $ j $ es un número entero desconocido y $ 2^n $ es el tamaño del registro).\nEste resultado de medición $ c $ se devuelve a la computadora clásica para crear una fracción $ \\frac{c}{2^n} \\approx \\frac{j}{r} $. Luego, calculando una aproximación utilizando un método matemático llamado \u0026ldquo;expansión en fracciones continuas\u0026rdquo; (Continued fraction expansion), podemos extraer de manera brillante el período $ r $ que está en el denominador.\nUna vez que conocemos $ r $, todo lo que queda es usar la fórmula del Paso 1 para calcular los factores primos de $ N $ y el cifrado RSA estará completamente descifrado.\nEl poder y los desafíos de las computadoras cuánticas actuales (NISQ) El algoritmo de Shor es teóricamente perfecto, pero si se pregunta \u0026ldquo;¿Se romperá el cifrado RSA mañana?\u0026rdquo;, la respuesta es claramente \u0026ldquo;no\u0026rdquo;. La razón radica en las limitaciones de la tecnología de hardware de las computadoras cuánticas actuales.\nLa era NISQ (Noisy Intermediate-Scale Quantum) En la actualidad nos encontramos en una era llamada \u0026ldquo;NISQ\u0026rdquo;. Los dispositivos NISQ tienen decenas a cientos de cúbits físicos, pero son extremadamente vulnerables al ruido.\nLos cúbits son susceptibles a influencias ambientales externas como el calor y las ondas electromagnéticas, lo que hace que ocurra con frecuencia la \u0026ldquo;decoherencia\u0026rdquo; (pérdida de entrelazamiento cuántico), que destruye el estado cuántico, o los \u0026ldquo;errores de puerta\u0026rdquo; al operar las puertas cuánticas. Si se intenta ejecutar un circuito cuántico muy profundo (con una cantidad masiva de pasos de cálculo) como el algoritmo de Shor, los errores se acumulan durante el cálculo y el resultado final será ruido completo sin significado.\nCúbits físicos y cúbits lógicos Para resolver este problema de errores, es indispensable la \u0026ldquo;Corrección de errores cuánticos\u0026rdquo; (Quantum Error Correction). Aunque también se utilizan códigos de corrección de errores en las computadoras clásicas, la corrección de errores cuánticos es muy compleja debido al \u0026ldquo;Teorema de no clonación cuántica\u0026rdquo; que prohíbe copiar estados cuánticos.\nEn la corrección de errores cuánticos, se utilizan tecnologías como el \u0026ldquo;Código de superficie\u0026rdquo; (Surface Code) para combinar muchos \u0026ldquo;cúbits físicos\u0026rdquo; ruidosos, y así crear un \u0026ldquo;cúbit lógico\u0026rdquo; ideal y sin errores.\nTeniendo en cuenta las tasas de error actuales, se estima que se necesitarán aproximadamente de 1,000 a 10,000 cúbits físicos para crear un solo cúbit lógico. Esto se denomina la \u0026ldquo;sobrecarga de la corrección de errores\u0026rdquo;.\n¿Cuáles son los recursos necesarios para destruir RSA-2048? Entonces, para descifrar realmente RSA-2048, ¿cuántos recursos se necesitan para ejecutar el algoritmo de Shor?\nEn una estimación de recursos revolucionaria realizada en un artículo de 2021 por Craig Gidney (Google) y Martin Ekerå, utilizando un algoritmo de Shor optimizado y realizando la corrección de errores con código de superficie, se requerirían los siguientes recursos:\nNúmero de cúbits lógicos : Aproximadamente 4,096 Número de cúbits físicos ** : ** Aproximadamente 20 millones (asumiendo una tasa de error de alrededor de $10^{-3}$) Tiempo de cálculo : Aproximadamente 8 horas (se requieren de millones a miles de millones de operaciones de puertas físicas) Por el contrario, ¿cuál es el nivel alcanzado por el hardware cuántico actual? A finales de 2023, el procesador cuántico superconductor \u0026ldquo;Condor\u0026rdquo;, anunciado por IBM, tiene 1,121 cúbits. Además, también han aparecido investigaciones innovadoras sobre la generación de cúbits lógicos (como la generación de 48 cúbits lógicos utilizando una computadora cuántica de átomos neutros por la Universidad de Harvard y la empresa QuEra), pero aún no estamos en la etapa en que se puedan ejecutar \u0026ldquo;cálculos perfectos sin ruido\u0026rdquo; de manera continua y prolongada.\nPara escalar desde unos miles de cúbits físicos hasta 20 millones de cúbits físicos prácticos (y un sistema interconectado, operando de manera estable a temperaturas criogénicas y capaz de procesar señales de control a ultra alta velocidad) existe un muro de ingeniería tremendo (problemas de cableado, límites de capacidad de enfriamiento y la expansión excesiva de la electrónica de control). Muchos expertos predicen que tomará al menos de 10 a 30 años, o incluso más, lograr una \u0026ldquo;Computadora cuántica tolerante a fallas (FTQC)\u0026rdquo; capaz de descifrar RSA-2048.\nLa inminente amenaza de \u0026ldquo;Store Now, Decrypt Later\u0026rdquo; y el amanecer de PQC Es prematuro pensar: \u0026ldquo;Si faltan más de 10 años, estamos a salvo\u0026rdquo;. Actualmente existen datos cuyo secreto debe garantizarse durante décadas en el futuro, como la información confidencial del estado, los datos médicos y el diseño de infraestructura a largo plazo.\nLo que preocupa aquí es el método de ataque \u0026ldquo;Store Now, Decrypt Later\u0026rdquo; (Almacenar ahora, descifrar después) . Estados u organizaciones malintencionadas interceptan todos los datos de comunicaciones cifrados actualmente con RSA o ECC (Criptografía de curva elíptica) y los guardan en sistemas de almacenamiento. Luego, dentro de 10 o 20 años, en el momento en que se complete una poderosa computadora cuántica, utilizarán el algoritmo de Shor para descifrar todos los datos pasados y exponer los secretos.\nPara contrarrestar la amenaza de este desfase temporal, el proceso de estandarización de la \u0026ldquo;Criptografía Post-Cuántica (PQC: Post-Quantum Cryptography)\u0026rdquo; ha avanzado a un ritmo acelerado, centrado principalmente en el NIST (Instituto Nacional de Estándares y Tecnología de EE. UU.).\nPQC es un nuevo algoritmo criptográfico basado en problemas matemáticos que son difíciles de resolver incluso utilizando computadoras cuánticas (es decir, a los que no se puede aplicar el algoritmo de Shor). Los enfoques principales incluyen los siguientes:\nCriptografía basada en retículos (Lattice-based cryptography) : Basado en el problema LWE (Learning with Errors), entre otros. Es la corriente principal en la estandarización del NIST (Kyber, Dilithium, etc.). Criptografía basada en códigos (Code-based cryptography) : Depende de la dificultad del problema de decodificar códigos de corrección de errores. Criptografía multivariante (Multivariate cryptography) : Depende de la dificultad de resolver sistemas de ecuaciones cuadráticas con múltiples variables. Firmas basadas en hash (Hash-based signatures) : Firmas digitales que dependen únicamente de la seguridad de la función hash. Ya se han iniciado las pruebas de implementación y las implementaciones híbridas de PQC en los principales software y plataformas, como Google Chrome y el iMessage de Apple.\nConclusión Las computadoras cuánticas están pasando de ser el sueño del mundo de la ciencia ficción a un desafío de ingeniería en la realidad. El algoritmo de Shor es un gran logro intelectual de la humanidad que fusiona las matemáticas y la mecánica cuántica, pero al mismo tiempo tiene un \u0026ldquo;poder destructivo\u0026rdquo; oculto que puede sacudir los cimientos de nuestra sociedad digital.\nEl cifrado RSA no quedará inutilizable inmediatamente mañana. Sin embargo, considerando la evolución de la tecnología cuántica y el riesgo de \u0026ldquo;Store Now, Decrypt Later\u0026rdquo;, la migración masiva en la historia de la criptografía, que es la transición a PQC, ya ha comenzado. Ahora mismo somos testigos de la primera línea de un cambio de paradigma en la seguridad de la información.\n","date":"2026-09-05T22:09:21+09:00","image":"http://kenji.blog/p/shors-algorithm-and-rsa-breaking/quantum_breaking_rsa_1788613722990_huf997c6e55368509d0617b56f68899854_1017504_120x120_fill_q75_box_smart1.jpg","permalink":"http://kenji.blog/es/p/shors-algorithm-and-rsa-breaking/","title":"¿Realmente las computadoras cuánticas destruirán el cifrado RSA? ~ El algoritmo de Shor y el estado actual ~"},{"content":"【Análisis Completo】Entendiendo el algoritmo de descifrado más fuerte \u0026ldquo;GNFS\u0026rdquo; implementándolo en C++ El cifrado \u0026ldquo;RSA\u0026rdquo; es la base que sostiene la Internet moderna. Su robustez depende de la creencia matemática de que \u0026ldquo;factorizar un número compuesto gigante en números primos es virtualmente imposible con las computadoras actuales\u0026rdquo;.\nSin embargo, la humanidad nunca se rinde. Actualmente, existe el **algoritmo más fuerte y avanzado de la humanidad ** para realizar factorizaciones gigantescas en computadoras clásicas (computadoras normales, no cuánticas). Este es el \u0026ldquo;General Number Field Sieve (GNFS) o Criba General del Cuerpo de Números\u0026rdquo;.\nEn este artículo, publicaremos todo el código de implementación que modela estrictamente la lógica computacional más avanzada de GNFS en C++ (usando enteros de precisión múltiple boost::multiprecision de la biblioteca Boost), y explicaremos a fondo los abismos de la \u0026ldquo;teoría algebraica de números\u0026rdquo; detrás de él.\nPor favor, disfruten del misterio de las matemáticas y del poder de la ciencia computacional que lo domina, junto con el código fuente.\n1. GNFS Framework Lógico de Vanguardia (Código fuente completo) Primero, aquí está la visión general de la implementación de GNFS en C++ que explicaremos. La criba de cuerpo de números real (como CADO-NFS) es un sistema distribuido masivo de cientos de miles de líneas de código, pero este código diseña y modela las \u0026ldquo;5 tuberías (fases) esenciales\u0026rdquo; que componen GNFS en clases, manteniéndolo en una configuración mínima sin perder su significado matemático.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 #include \u0026lt;iostream\u0026gt; #include \u0026lt;vector\u0026gt; #include \u0026lt;cmath\u0026gt; #include \u0026lt;map\u0026gt; #include \u0026lt;set\u0026gt; #include \u0026lt;chrono\u0026gt; #include \u0026lt;boost/multiprecision/cpp_int.hpp\u0026gt; // Usando enteros de precisión múltiple de Boost.Multiprecision using namespace boost::multiprecision; // ============================================================================ // [SOTA GNFS] General Number Field Sieve (Criba General del Cuerpo de Números) Framework Lógico de Vanguardia // // Este código modela estrictamente las 5 tuberías del GNFS más avanzado utilizado en CADO-NFS, etc., // como diseño de clases en C++ (Boost). // ============================================================================ struct Relation { int64_t a; int64_t b; std::vector\u0026lt;uint32_t\u0026gt; rational_primes; std::vector\u0026lt;uint32_t\u0026gt; algebraic_primes; }; // ============================================================================ // Fase 1: Selección Polinomial (Algoritmo de KleinJung) // ============================================================================ class PolynomialSelector { public: int degree; std::vector\u0026lt;cpp_int\u0026gt; f; // Polinomio lado algebraico f(x) std::vector\u0026lt;cpp_int\u0026gt; g; // Polinomio lado racional g(x) = x - m cpp_int m; PolynomialSelector(int d) : degree(d) {} // Generación del polinomio inicial basado en expansión en base m (En realidad se usa reducción de bases de retículos LLL más avanzada) void select(const cpp_int\u0026amp; N) { std::cout \u0026lt;\u0026lt; \u0026#34;[Fase 1] Polynomial Selection (Grado \u0026#34; \u0026lt;\u0026lt; degree \u0026lt;\u0026lt; \u0026#34;) iniciando...\u0026#34; \u0026lt;\u0026lt; std::endl; // Expansión simple en base m (grado d) // m = N^(1/d) cpp_int N_copy = N; m = 1; // Aproximación simple de m (sin usar funciones de Boost) cpp_int low = 1, high = N; while (low \u0026lt;= high) { cpp_int mid = low + (high - low) / 2; cpp_int p = 1; for(int i=0; i\u0026lt;degree; ++i) p *= mid; if (p \u0026lt;= N) { m = mid; low = mid + 1; } else { high = mid - 1; } } f.resize(degree + 1); cpp_int temp = N; for (int i = 0; i \u0026lt;= degree; ++i) { f[i] = temp % m; temp /= m; } g = {-m, 1}; // g(x) = x - m std::cout \u0026lt;\u0026lt; \u0026#34; -\u0026gt; m = \u0026#34; \u0026lt;\u0026lt; m \u0026lt;\u0026lt; std::endl; std::cout \u0026lt;\u0026lt; \u0026#34; -\u0026gt; f(x) = \u0026#34;; for(int i = degree; i \u0026gt;= 0; --i) { std::cout \u0026lt;\u0026lt; f[i] \u0026lt;\u0026lt; \u0026#34;x^\u0026#34; \u0026lt;\u0026lt; i \u0026lt;\u0026lt; (i \u0026gt; 0 ? \u0026#34; + \u0026#34; : \u0026#34;\u0026#34;); } std::cout \u0026lt;\u0026lt; \u0026#34;\\n[Fase 1] Completo.\u0026#34; \u0026lt;\u0026lt; std::endl; } }; // ============================================================================ // Fase 2: Lattice Sieving (Criba de Retículos) // ============================================================================ // En el GNFS moderno, el estándar de facto no es Line Sieve (Criba Lineal), sino // la Criba de Retículos q-Especial (Special-q Lattice Sieving) de Franke-Kleinjung y otros. class LatticeSieve { uint32_t rational_bound; uint32_t algebraic_bound; std::vector\u0026lt;uint32_t\u0026gt; rational_fb; std::vector\u0026lt;uint32_t\u0026gt; algebraic_fb; public: LatticeSieve(uint32_t rb, uint32_t ab) : rational_bound(rb), algebraic_bound(ab) {} void generate_factor_bases() { std::cout \u0026lt;\u0026lt; \u0026#34;[Fase 2] Generando Factor Bases (Límite Racional: \u0026#34; \u0026lt;\u0026lt; rational_bound \u0026lt;\u0026lt; \u0026#34;, Límite Algebraico: \u0026#34; \u0026lt;\u0026lt; algebraic_bound \u0026lt;\u0026lt; \u0026#34;)\u0026#34; \u0026lt;\u0026lt; std::endl; // (Omitido) En realidad realiza generación de primos y filtrado con el símbolo de Legendre, etc. } std::vector\u0026lt;Relation\u0026gt; sieve(const PolynomialSelector\u0026amp; poly) { std::cout \u0026lt;\u0026lt; \u0026#34;[Fase 2] Special-q Lattice Sieving activo...\u0026#34; \u0026lt;\u0026lt; std::endl; std::vector\u0026lt;Relation\u0026gt; relations; // Implementación Mock: La criba de retículos real escanea cientos de GB de espacio de memoria en bloques, // mapea pares (a, b) a retículos para cada primo especial q (a = i*q + j*...), // y ejecuta un sieving (criba) maximizando la eficiencia de la caché al extremo. // Añadiendo una relación dummy para la demo Relation r; r.a = 17; r.b = 3; r.rational_primes = {2, 5}; r.algebraic_primes = {3, 7}; relations.push_back(r); std::cout \u0026lt;\u0026lt; \u0026#34;[Fase 2] Encontradas \u0026#34; \u0026lt;\u0026lt; relations.size() \u0026lt;\u0026lt; \u0026#34; relaciones.\u0026#34; \u0026lt;\u0026lt; std::endl; return relations; } }; // ============================================================================ // Fase 3: Filtering (Purga de singletons y mezcla de cliques) // ============================================================================ class Filter { public: void reduce_matrix(std::vector\u0026lt;Relation\u0026gt;\u0026amp; relations) { std::cout \u0026lt;\u0026lt; \u0026#34;[Fase 3] Filtrando Relaciones...\u0026#34; \u0026lt;\u0026lt; std::endl; // 1. Eliminación de Singletons (eliminación de relaciones con primos que aparecen solo 1 vez) // 2. Fusión de Cliques (combinación de relaciones para hacer densa una matriz dispersa) // En realidad, comprime una matriz de cientos de millones de filas a unos pocos millones usando algoritmos como Union-Find. std::cout \u0026lt;\u0026lt; \u0026#34;[Fase 3] Tamaño de la matriz reducido óptimamente.\u0026#34; \u0026lt;\u0026lt; std::endl; } }; // ============================================================================ // Fase 4: Álgebra Lineal sobre GF(2) (Método Block Wiedemann) // ============================================================================ class LinearAlgebraGF2 { public: // En los entornos de supercomputadoras recientes, se utiliza como vanguardia el método Block Wiedemann // (implementación de Coppersmith) que es más adecuado para computación distribuida que el método Block Lanczos. std::vector\u0026lt;std::vector\u0026lt;int\u0026gt;\u0026gt; solve_nullspace(const std::vector\u0026lt;Relation\u0026gt;\u0026amp; relations) { std::cout \u0026lt;\u0026lt; \u0026#34;[Fase 4] Algoritmo Block Wiedemann sobre GF(2) iniciando...\u0026#34; \u0026lt;\u0026lt; std::endl; // Repite la operación de producto de matrices dispersas y vectores, // y encuentra múltiples vectores solución (kernels) donde M * x = 0 mod 2. std::vector\u0026lt;std::vector\u0026lt;int\u0026gt;\u0026gt; dependencies; // Lista de dependencias // Datos dummy dependencies.push_back({0}); std::cout \u0026lt;\u0026lt; \u0026#34;[Fase 4] Encontradas \u0026#34; \u0026lt;\u0026lt; dependencies.size() \u0026lt;\u0026lt; \u0026#34; dependencias lineales (cuadrados perfectos).\u0026#34; \u0026lt;\u0026lt; std::endl; return dependencies; } }; // ============================================================================ // Fase 5: Raíz Cuadrada Algebraica (Algebraic Square Root) // ============================================================================ class AlgebraicSquareRoot { public: void compute_and_factor(const std::vector\u0026lt;Relation\u0026gt;\u0026amp; relations, const std::vector\u0026lt;int\u0026gt;\u0026amp; dep, const cpp_int\u0026amp; N) { std::cout \u0026lt;\u0026lt; \u0026#34;[Fase 5] Computación de Raíz Cuadrada Algebraica...\u0026#34; \u0026lt;\u0026lt; std::endl; // 1. Cálculo de la raíz cuadrada racional V (operación de enteros simple) cpp_int V = 1; // V = sqrt( prod(a - bm) ) mod N // 2. Cálculo de la raíz cuadrada algebraica gamma (Método de Montgomery, etc.) // Encuentra el elemento gamma del cuerpo algebraico gigante O_K, y lo mapea al mundo real con el homomorfismo phi // Y = phi(gamma) mod N cpp_int Y = 1; // Asumiendo que se añadieron columnas de Caracteres Cuadráticos (Quadratic Characters) en la Fase 2 y 4 // para evitar la obstrucción del grupo de clases de ideales y el grupo de unidades. std::cout \u0026lt;\u0026lt; \u0026#34; -\u0026gt; Mapa de homomorfismo phi aplicado.\u0026#34; \u0026lt;\u0026lt; std::endl; std::cout \u0026lt;\u0026lt; \u0026#34;[Fase 5] Calculando GCD(V - Y, N)...\u0026#34; \u0026lt;\u0026lt; std::endl; cpp_int factor = gcd(V - Y, N); // GCD(X-Y, N) if (factor \u0026gt; 1 \u0026amp;\u0026amp; factor \u0026lt; N) { std::cout \u0026lt;\u0026lt; \u0026#34;\\n================================================================\u0026#34; \u0026lt;\u0026lt; std::endl; std::cout \u0026lt;\u0026lt; \u0026#34;[ÉXITO] Factor no trivial encontrado: \u0026#34; \u0026lt;\u0026lt; factor \u0026lt;\u0026lt; std::endl; std::cout \u0026lt;\u0026lt; \u0026#34; Otro factor: \u0026#34; \u0026lt;\u0026lt; N / factor \u0026lt;\u0026lt; std::endl; std::cout \u0026lt;\u0026lt; \u0026#34;================================================================\u0026#34; \u0026lt;\u0026lt; std::endl; } else { std::cout \u0026lt;\u0026lt; \u0026#34;[FALLO] Solución trivial. Probando la siguiente dependencia...\u0026#34; \u0026lt;\u0026lt; std::endl; } } }; // ============================================================================ // Pipeline de Ejecución Principal // ============================================================================ int main() { std::cout \u0026lt;\u0026lt; \u0026#34;================================================================\u0026#34; \u0026lt;\u0026lt; std::endl; std::cout \u0026lt;\u0026lt; \u0026#34; [SOTA GNFS] Motor General Number Field Sieve (Boost C++) \u0026#34; \u0026lt;\u0026lt; std::endl; std::cout \u0026lt;\u0026lt; \u0026#34;================================================================\u0026#34; \u0026lt;\u0026lt; std::endl; // Número compuesto gigante N que queremos factorizar, ej. RSA-270 cpp_int N(\u0026#34;233108530344407544527637656910680524145619812480305449042948611968495918245135782867888369318577116418213919268572658314913060672626911354027609793166341626693946596196427744273886601876896313468704059066746903123910748277606548649151920812699309766587514735456594993207\u0026#34;); // Grado del polinomio (para más de 130 dígitos usualmente se selecciona grado 5 a 6) int degree = 6; // Inicialización del pipeline PolynomialSelector poly_select(degree); LatticeSieve sieve(10000000, 20000000); // Los límites reales son decenas a cientos de millones Filter filter; LinearAlgebraGF2 linalg; AlgebraicSquareRoot sqrt_step; auto start_time = std::chrono::high_resolution_clock::now(); // 1. Selección Polinomial poly_select.select(N); // 2. Proceso de Criba (Sieving) sieve.generate_factor_bases(); std::vector\u0026lt;Relation\u0026gt; relations = sieve.sieve(poly_select); // 3. Filtrado (Compresión de matriz) filter.reduce_matrix(relations); // 4. Álgebra Lineal (Búsqueda del espacio nulo sobre GF(2)) std::vector\u0026lt;std::vector\u0026lt;int\u0026gt;\u0026gt; dependencies = linalg.solve_nullspace(relations); // 5. Cálculo de Raíz Cuadrada Algebraica y GCD for (const auto\u0026amp; dep : dependencies) { sqrt_step.compute_and_factor(relations, dep, N); } auto end_time = std::chrono::high_resolution_clock::now(); std::chrono::duration\u0026lt;double\u0026gt; elapsed = end_time - start_time; std::cout \u0026lt;\u0026lt; \u0026#34;\\n[Sistema] Pipeline SOTA GNFS completado en \u0026#34; \u0026lt;\u0026lt; elapsed.count() \u0026lt;\u0026lt; \u0026#34; segundos.\u0026#34; \u0026lt;\u0026lt; std::endl; return 0; } Entonces, ¿cómo es que este código destruye los muros de la criptografía? Explicaremos los minuciosos algoritmos y las matemáticas avanzadas para cada una de las 5 fases.\n2. El objetivo final de GNFS: $X^2 \\equiv Y^2 \\pmod N$ El objetivo de la mayoría de los algoritmos de factorización gigante moderna, no solo de GNFS, es encontrar un par no trivial $(X, Y)$ que satisfaga la siguiente congruencia:\n$$X^2 \\equiv Y^2 \\pmod N$$ Esta fórmula significa que \u0026ldquo;los restos al dividir $X^2$ y $Y^2$ por $N$ son iguales\u0026rdquo;. Reorganizando esto: $X^2 - Y^2 \\equiv 0 \\pmod N$ En otras palabras, $(X-Y)(X+Y)$ es un múltiplo de $N$.\nSi $X \\not\\equiv \\pm Y \\pmod N$ (solución no trivial), existirá un \u0026ldquo;divisor común mayor que 1 y menor que $N$\u0026rdquo; entre $(X-Y)$ y $N$. Aquí, si usamos el algoritmo de Euclides para calcular $\\gcd(X-Y, N)$, podemos encontrar los factores primos de $N$ con mucha facilidad.\nSin embargo, encontrar estos $X$ e $Y$ es como buscar una aguja en un desierto. Por lo tanto, GNFS adopta el ingenioso enfoque de crear dos mundos, el \u0026ldquo;mundo de los enteros reales\u0026rdquo; y el \u0026ldquo;mundo de los cuerpos algebraicos de los polinomios\u0026rdquo;, y distribuye los cálculos.\n3. Fase 1: Selección Polinomial (Polynomial Selection) 1 2 3 4 5 6 7 8 9 10 11 12 class PolynomialSelector { // ... void select(const cpp_int\u0026amp; N) { // Cálculo de m = N^(1/d) y expansión en base m // ... for (int i = 0; i \u0026lt;= degree; ++i) { f[i] = temp % m; temp /= m; } g = {-m, 1}; // g(x) = x - m } }; El primer paso de GNFS es crear un \u0026ldquo;polinomio mágico\u0026rdquo; que sirva de puente entre los dos mundos. Para un número gigante $N$, elegimos un entero $m$. Usualmente se elige de tal manera que $m \\approx N^{1/d}$ (el código asume un polinomio de grado $d=6$).\nLuego, expandimos $N$ en base $m$ y usamos esos coeficientes para construir el polinomio $f(x)$. $$N = c_d m^d + c_{d-1} m^{d-1} + \\dots + c_1 m + c_0$$ $$f(x) = c_d x^d + c_{d-1} x^{d-1} + \\dots + c_1 x + c_0$$ Este polinomio $f(x)$ tiene una propiedad extremadamente importante: \u0026ldquo;al sustituir la variable $x$ con $m$, resulta ser exactamente $N$ ($f(m) = N$)\u0026rdquo;. En otras palabras, $f(m) \\equiv 0 \\pmod N$. El polinomio en el lado racional se define como $g(x) = x - m$.\nCon esto, el \u0026ldquo;mundo del cuerpo algebraico $\\mathbb{Z}[\\alpha]$\u0026rdquo; dominado por la raíz $\\alpha$ de $f(x)=0$ y el \u0026ldquo;mundo normal de los racionales (enteros) $\\mathbb{Z}$\u0026rdquo; quedan firmemente conectados por un \u0026ldquo;homomorfismo de anillos\u0026rdquo; (Homomorphism) de $x \\to m$.\nEn herramientas de vanguardia como CADO-NFS, el polinomio \u0026ldquo;más conveniente $f(x)$\u0026rdquo; donde los coeficientes no se vuelven extremadamente grandes y es probable que aparezcan primos en pasos posteriores (más fácil que sea liso), se busca durante meses utilizando el algoritmo de KleinJung y el algoritmo de reducción de bases de retículos LLL.\n4. Fase 2: Criba de Retículos q-Especial (Special-q Lattice Sieving) 1 2 3 4 5 6 7 8 9 class LatticeSieve { // ... std::vector\u0026lt;Relation\u0026gt; sieve(const PolynomialSelector\u0026amp; poly) { // ... // mapea pares (a, b) a retículos para cada primo especial q, // y ejecuta un sieving (criba) maximizando la eficiencia de la caché al extremo. // ... } }; Una vez preparados ambos mundos, el siguiente paso es buscar \u0026ldquo;números lisos\u0026rdquo; (números formados solo por factores primos pequeños) en ambos mundos. Generamos infinitos pares de enteros $(a, b)$ y calculamos los siguientes dos valores:\nValor racional: $a - bm$ Norma algebraica: $b^d f(a/b)$ El propósito de GNFS es recolectar de decenas a cientos de millones de estos \u0026ldquo;pares donde tanto el valor racional como el algebraico pueden descomponerse completamente en factores primos pequeños (Relation: relaciones)\u0026rdquo;.\nEn los primeros GNFS, se utilizaba una \u0026ldquo;Criba Lineal (Line Sieve)\u0026rdquo; que alineaba $(a, b)$ en el plano $xy$ y dividía por primos desde un extremo. Sin embargo, esto causaba muchas fallas de caché al acceder a la memoria en todas partes, y tenía la debilidad de ser muy lento.\nPor lo tanto, el código de vanguardia actual utiliza un método llamado \u0026ldquo;Criba de Retículos q-Especial (Special-q Lattice Sieve)\u0026rdquo;. Se fija un número primo $q$ moderadamente grande y solo se consideran \u0026ldquo;los pares $(a, b)$ donde el valor algebraico siempre es divisible por $q$\u0026rdquo;. Dado que estos $(a, b)$ forman un \u0026ldquo;retículo (Lattice)\u0026rdquo; en el plano, el tamaño del salto de la dirección calculada es constante y se ajusta perfectamente a las memorias caché L1/L2 de la CPU. Gracias a la introducción de esta criba de retículos, la velocidad de cálculo de GNFS ha mejorado drásticamente.\n5. Fase 3: Filtrado (Filtering) 1 2 3 4 5 6 7 class Filter { public: void reduce_matrix(std::vector\u0026lt;Relation\u0026gt;\u0026amp; relations) { // 1. Eliminación de Singletons (eliminación de relaciones con primos que aparecen solo 1 vez) // 2. Fusión de Cliques (combinación de relaciones para hacer densa una matriz dispersa) } }; Cientos de millones de relaciones recolectadas durante meses por computadoras de todo el mundo en la Fase 2. Sin embargo, si metemos esto directamente en el siguiente \u0026ldquo;paso de resolución de ecuaciones simultáneas (cálculo matricial)\u0026rdquo;, la memoria de la supercomputadora estallará.\nPor eso, se realiza un proceso de supercompresión de la matriz llamado Filtering (Filtrado).\nEliminación de Singletons (Singleton removal / Purga de singularidades) Suponga que un primo gigante $p$ aparece \u0026ldquo;solo 1 vez\u0026rdquo; entre cientos de millones de relaciones. Dado que nuestro objetivo es \u0026ldquo;hacer que los exponentes de todos los primos sean pares (múltiplos de 2)\u0026rdquo;, un primo que aparece solo 1 vez nunca podrá hacerse par. Por lo tanto, las relaciones que contienen ese primo se eliminan instantáneamente (se purgan) por considerarse \u0026ldquo;basura inútil\u0026rdquo;. A medida que esto ocurre en cadena, los datos de cientos de millones de filas se reducen rápidamente.\nFusión de Cliques (Clique merging) Además, multiplicar (sumar) relaciones que comparten un número primo específico reduce el número de filas al tiempo que comprime una matriz dispersa en un estado más denso (se utiliza una técnica similar a la búsqueda de cliques en la teoría de grafos).\nCon esta optimización, la enorme matriz dispersa se comprime drásticamente a un tamaño computable.\n6. Fase 4: Álgebra Lineal sobre GF(2) (Método Block Wiedemann) 1 2 3 4 5 6 7 class LinearAlgebraGF2 { public: std::vector\u0026lt;std::vector\u0026lt;int\u0026gt;\u0026gt; solve_nullspace(const std::vector\u0026lt;Relation\u0026gt;\u0026amp; relations) { // Repite la operación de producto de matrices dispersas y vectores, // y encuentra múltiples vectores solución (kernels) donde M * x = 0 mod 2. } }; Por fin, el núcleo del rompecabezas. Multiplicamos las relaciones recolectadas para buscar \u0026ldquo;combinaciones donde los exponentes de los factores primos sean todos números pares\u0026rdquo;.\nMatemáticamente, esto no es más que encontrar un vector solución $x$ (espacio nulo/kernel) usando una matriz gigante $M$ cuyos elementos son \u0026ldquo;par/impar (es decir, 0 o 1)\u0026rdquo; de los exponentes de cada primo y un vector $x$ que indica qué relaciones utilizar: $M \\cdot x \\equiv 0 \\pmod 2$\nTenemos que resolver un sistema de ecuaciones de una matriz de tamaño absurdo de millones de filas × millones de columnas. Con el método normal de eliminación de Gauss, la complejidad sería $O(N^3)$, y el cálculo no terminaría hasta el final del universo.\nPor lo tanto, la implementación más avanzada utiliza el \u0026ldquo;Método Block Wiedemann (Bloque Wiedemann)\u0026rdquo;. Este es un tipo de método del subespacio de Krylov que aprovecha el hecho de que la matriz $M$ es \u0026ldquo;extremadamente dispersa (casi toda ceros)\u0026rdquo; y deriva la solución iterando la multiplicación de matriz y vector. A diferencia del antiguo método Block Lanczos, el método Block Wiedemann puede dividir completamente el proceso de cálculo en múltiples grupos, por lo que ejerce un poder abrumador en la computación en nube distribuida moderna y en la computación paralela en supercomputadoras.\n7. Fase 5: Raíz Cuadrada Algebraica (Algebraic Square Root) y el Colapso de la Criptografía 1 2 3 4 5 6 7 8 9 10 11 12 13 class AlgebraicSquareRoot { public: void compute_and_factor(...) { // 1. Cálculo de la raíz cuadrada racional V cpp_int V = 1; // 2. Cálculo de la raíz cuadrada algebraica gamma cpp_int Y = 1; // ... cpp_int factor = gcd(V - Y, N); // GCD(X-Y, N) } }; A través de los cálculos matriciales de la Fase 4, hemos obtenido un \u0026ldquo;conjunto de relaciones $S$ que al multiplicarse hacen que todos los factores primos tengan potencias pares\u0026rdquo;. Con esto, podemos construir el \u0026ldquo;cuadrado\u0026rdquo; en ambos mundos, el racional y el algebraico.\nPara el lado racional, es simplemente una multiplicación de enteros, por lo que calcular la raíz cuadrada $V$ es fácil. $$V^2 = \\prod_{S} (a - bm)$$ Sin embargo, el verdadero infierno reside en el \u0026ldquo;lado algebraico\u0026rdquo;. En el mundo del cuerpo algebraico $\\mathbb{Z}[\\alpha]$, dado que la factorización única de factores primos no es válida, hemos estado calculando usando ideales. Lo único que garantiza el cálculo matricial es que \u0026ldquo;es el cuadrado de un ideal\u0026rdquo;, y no se garantiza que sea \u0026ldquo;el cuadrado de un elemento ($\\gamma^2$)\u0026rdquo;.\nAquí se levantan poderosos muros en la teoría algebraica de números llamados \u0026ldquo;obstrucción del grupo de clases de ideales\u0026rdquo; y \u0026ldquo;obstrucción del grupo de unidades\u0026rdquo;. Para romper este muro, GNFS utiliza la magia llamada \u0026ldquo;Caracteres Cuadráticos (Quadratic Characters)\u0026rdquo;. A la matriz de la Fase 4, se añaden secretamente de antemano columnas de residuos cuadráticos (Símbolo de Legendre) para decenas de ideales primos especiales. Con esto, hay una probabilidad abrumadora de que el conjunto $S$ encontrado evite la obstrucción y forme con éxito el \u0026ldquo;cuadrado del elemento verdadero $\\gamma^2$\u0026rdquo;.\nEl proceso de encontrar $\\gamma$ (raíz cuadrada algebraica) se calcula utilizando algoritmos muy complejos como el método de Montgomery.\nY por fin, la raíz cuadrada algebraica $\\gamma$ es teletransportada al mundo real (sustituyendo $m$ por $x$) mediante el homomorfismo de anillos $\\phi$, y obtenemos $Y$. Si ponemos el $V$ del lado racional directamente como $X$, la ecuación absoluta que hemos estado buscando finalmente se completa.\n$$X^2 \\equiv Y^2 \\pmod N$$\nSolo queda calcular $\\gcd(X-Y, N)$. En el momento en que se ejecuta el proceso de 0.001 segundos y el factor no trivial se imprime en la pantalla, el cifrado RSA, que se jactaba de ser inexpugnable, colapsa por completo.\nConclusión GNFS no es simplemente una técnica de programación. Es el cristal del intelecto humano que ha dominado el \u0026ldquo;abismo de las matemáticas puras\u0026rdquo; como el álgebra abstracta, la teoría de anillos y los grupos de clases de ideales, con la \u0026ldquo;ingeniería extrema\u0026rdquo; como la arquitectura distribuida de supercomputadoras y la optimización de cachés.\nLa información de chat y de tarjetas de crédito que enviamos de manera informal está protegida sobre una defensa matemática tan astronómica.\nEsperamos que, a través de este framework de C++, hayan sentido el \u0026ldquo;romanticismo de las matemáticas y la informática\u0026rdquo; detrás del algoritmo de descifrado más avanzado.\n","date":"2026-09-05T13:04:59+09:00","image":"http://kenji.blog/p/gnfs-cpp-implementation/gnfs_cpp_blog_eyecatch_1788580949217_hu57b4110ce75cf76414fb819be22bae03_985705_120x120_fill_q75_box_smart1.jpg","permalink":"http://kenji.blog/es/p/gnfs-cpp-implementation/","title":"[Análisis completo] Implementando y entendiendo el algoritmo de descifrado más fuerte 'GNFS' en C++"},{"content":"La verdadera estructura matemática de la Criba General del Cuerpo de Números (GNFS) El objetivo final de GNFS es encontrar $X, Y$ tales que $X^2 \\equiv Y^2 \\pmod N$. Para lograr esto, los matemáticos construyeron un puente entre el \u0026ldquo;mundo real de los números enteros\u0026rdquo; y el \u0026ldquo;mundo de los cuerpos algebraicos\u0026rdquo;. Ese puente es el \u0026ldquo;homomorfismo\u0026rdquo;.\nEtapa 1: Conectando mundos con el \u0026ldquo;Homomorfismo\u0026rdquo; (Homomorphism) 1. Selección de polinomios y definición de raíces Para un número compuesto gigante $N$, elegimos un entero $m$ y un polinomio $f(x)$ de manera que $f(m) \\equiv 0 \\pmod N$. (Ejemplo: expandimos $N$ en base $m$, y formamos $f(x)$ a partir de sus coeficientes. Aquí asumimos que $f(x)$ es irreducible sobre el cuerpo de los números racionales $\\mathbb{Q}$ (no se puede factorizar más)).\nA continuación, definimos una de las \u0026ldquo;raíces complejas\u0026rdquo; de la ecuación $f(x) = 0$ como $\\alpha$. Naturalmente, $f(\\alpha) = 0$. $\\alpha$ no es un entero, sino un número complejo (número algebraico) que puede incluir raíces o números imaginarios.\n2. Construcción de Anillos (Rings) y Homomorfismos Aquí preparamos dos \u0026ldquo;anillos\u0026rdquo; matemáticos (mundos donde se definen la suma y la multiplicación):\nMundo A: $\\mathbb{Z}[\\alpha]$ (el anillo de enteros algebraicos que contiene a $\\alpha$) Un mundo de números expresados en la forma $a + b\\alpha + c\\alpha^2 + \\dots$. Mundo B: $\\mathbb{Z}/N\\mathbb{Z}$ (el anillo de restos módulo $N$) Un mundo de congruencias (módulos) compuesto solo por números enteros del $0$ al $N-1$. Aquí, definimos el siguiente mapeo (función) $\\phi$ del Mundo A al Mundo B: $$\\phi : \\mathbb{Z}[\\alpha] \\to \\mathbb{Z}/N\\mathbb{Z}$$ $$\\phi(\\alpha) = m \\pmod N$$\nEste mapeo $\\phi$ es una operación mágica que reemplaza exactamente la variable $\\alpha$ del Mundo A por el entero $m$ del Mundo B. Este $\\phi$ tiene una propiedad extremadamente poderosa llamada \u0026ldquo;Homomorfismo de Anillos\u0026rdquo; (Ring Homomorphism). Un homomorfismo es la propiedad de \u0026ldquo;transportarse a otro mundo sin destruir la estructura de sumas y multiplicaciones\u0026rdquo;. Es decir, se cumplen las siguientes ecuaciones:\n$\\phi(X \\times Y) = \\phi(X) \\times \\phi(Y)$ $\\phi(X^2) = \\phi(X)^2$ Qué significa esto. Si podemos crear un \u0026ldquo;cuadrado ($\\gamma^2$)\u0026rdquo; de algún elemento complejo $\\gamma$ en el \u0026ldquo;Mundo A (el mundo de $\\alpha$)\u0026rdquo;, al transportarlo al \u0026ldquo;Mundo B (el mundo de los restos)\u0026rdquo; con $\\phi$, ** la forma del cuadrado $\\phi(\\gamma)^2$ se conservará perfectamente**.\nEtapa 2: El colapso de la factorización prima y el nacimiento del \u0026ldquo;Ideal\u0026rdquo; (Ideal) Queremos recolectar muchos elementos apropiados $(a - b\\alpha)$ dentro del Mundo A ($\\mathbb{Z}[\\alpha]$) y multiplicarlos juntos para crear un \u0026ldquo;cuadrado perfecto\u0026rdquo;. Normalmente, factorizaríamos cada $(a - b\\alpha)$ en \u0026ldquo;factores primos\u0026rdquo; y los combinariamos para que los exponentes de los números primos sean todos pares (resolviéndolo con matrices) para formar un cuadrado.\nSin embargo, aquí nos encontramos con un muro algebraico desesperante. En un mundo de cuerpos algebraicos como $\\mathbb{Z}[\\alpha]$, se derrumba la \u0026ldquo;unicidad de la factorización prima\u0026rdquo; (la idea que nos enseñaron de que cualquier número puede expresarse como el producto de números primos de una sola manera).\n(Ejemplo: en cierto mundo de cuerpos algebraicos, $6 = 2 \\times 3$, y al mismo tiempo $6 = (1+\\sqrt{-5}) \\times (1-\\sqrt{-5})$, haciendo imposible saber cuáles son los verdaderos primos).\nSi la factorización prima no es única, el rompecabezas de \u0026ldquo;contar el número de primos para hacerlos pares\u0026rdquo; (la criba) es en principio imposible de ejecutar.\nLa salvación de Kummer y Dedekind: el \u0026ldquo;Ideal\u0026rdquo; Lo que salvó a las matemáticas de este colapso fue el concepto de \u0026ldquo;Ideal\u0026rdquo; (número ideal) creado por los matemáticos del siglo XIX. Al pensar en el \u0026ldquo;conjunto de múltiplos (ideal)\u0026rdquo; generado por un elemento en lugar del elemento en sí, volvieron a hacer posible la factorización prima.\nEn el anillo de enteros de un cuerpo algebraico $\\mathcal{O}_K$ (un anillo más completo que contiene a $\\mathbb{Z}[\\alpha]$), aunque los elementos no puedan ser factorizados de manera única, se ha demostrado que \u0026ldquo;los ideales siempre pueden ser factorizados de forma única como un producto de \u0026lsquo;ideales primos ($\\mathfrak{p}$)\u0026rsquo;\u0026rdquo;.\nPor lo tanto, en GNFS, no descomponemos el elemento $(a - b\\alpha)$ en sí, sino que hacemos la factorización en ideales primos del ideal principal $\\langle a - b\\alpha \\rangle$ que este genera.\nEtapa 3: Norma (Norm) y las dos Cribas (Sieves) Entonces, ¿cómo sabemos en qué ideales primos se descompone el ideal $\\langle a - b\\alpha \\rangle$? Aquí utilizamos una función llamada \u0026ldquo;Norma\u0026rdquo; (Norm). La norma es una función que convierte los elementos complejos de los cuerpos algebraicos en \u0026ldquo;números enteros reales ordinarios $\\mathbb{Z}$\u0026rdquo;.\nLa norma del elemento $(a - b\\alpha)$ se calcula mediante un simple cálculo polinomial $b^d f(a/b)$ (donde $d$ es el grado de $f(x)$).\nPor teoremas algebraicos, sabemos que \u0026ldquo;si la norma de un ideal se descompone completamente en primos pequeños (es un número liso o \u0026lsquo;smooth\u0026rsquo;), entonces su ideal original también se descompone completamente en ideales primos pequeños\u0026rdquo;.\nPor lo tanto, GNFS calcula simultáneamente lo siguiente para una gran cantidad de pares de enteros $(a, b)$, y recolecta solo los pares donde ambos son \u0026ldquo;números lisos\u0026rdquo;:\nCriba Racional (Rational Sieve): $a - bm$ (valor en el mundo real) Criba Algebraica (Algebraic Sieve): $b^d f(a/b)$ (norma en el mundo del cuerpo algebraico) Recolecta decenas de millones de pares $(a, b)$ donde ambos son lisos, resuelve los datos de factorización prima de los ideales (cuántos ideales primos están incluidos) como una matriz gigante (álgebra lineal sobre GF(2)), y encuentra un conjunto de pares $S$ de manera que \u0026ldquo;cuando se multiplican, los exponentes de todos los ideales primos se vuelven pares\u0026rdquo;.\nEtapa 4: Dos \u0026ldquo;Obstáculos\u0026rdquo; que se interponen y el Grupo de Clases de Ideales Mediante cálculos de matrices, encontramos que multiplicar todos los ideales de $(a - b\\alpha)$ que pertenecen al conjunto $S$ resulta en el cuadrado de cierto ideal $I$. $$\\prod_{S} \\langle a - b\\alpha \\rangle = I^2$$ Sin embargo, esto aún no ha terminado. Aquí es donde se encuentra el muro matemático más profundo y difícil de GNFS.\nLo que finalmente queremos no es el \u0026ldquo;cuadrado de un ideal\u0026rdquo;, sino el \u0026ldquo;cuadrado de un elemento ($\\gamma^2$)\u0026rdquo; para sustituirlo en el mapeo $\\phi$. El hecho de que se haya convertido en el cuadrado de un ideal no significa que el elemento en sí sea un cuadrado. Aquí existen dos obstáculos matemáticos (Obstructions) formidables.\nObstáculo 1: El muro del Grupo de Clases de Ideales (Ideal Class Group) El ideal $I$ no es necesariamente un \u0026ldquo;ideal generado por un solo elemento (ideal principal)\u0026rdquo;. Es imposible extraer un elemento concreto $\\gamma$ de un ideal que no sea principal.\nAquí entra el concepto de \u0026ldquo;Grupo de Clases de Ideales\u0026rdquo; (Class Group, $Cl_K$). El grupo de clases de ideales es un grupo que mide \u0026ldquo;cuántos ideales que no son principales existen en ese mundo del cuerpo algebraico (qué tan destruida está la unicidad de la factorización prima)\u0026rdquo;. Incluso si $\\prod \\langle a - b\\alpha \\rangle$ se convierte en $I^2$, si $I$ no es el elemento identidad (ideal principal) en el grupo de clases de ideales, no podemos retroceder al cuadrado de un elemento.\nObstáculo 2: El muro del Grupo de Unidades (Unit Group) Supongamos que por suerte $I$ era un ideal principal $\\langle \\gamma \\rangle$. Entonces tenemos que $\\prod \\langle a - b\\alpha \\rangle = \\langle \\gamma^2 \\rangle$. Podrías pensar \u0026ldquo;¡Genial, el elemento también es un cuadrado!\u0026rdquo;, pero estarías muy equivocado.\nQue los ideales (conjuntos de múltiplos) sean iguales no significa que los elementos sean completamente iguales. Siempre ocurre una desviación por una \u0026ldquo;Unidad\u0026rdquo; (Unit: un número cuyo inverso multiplicativo también es entero. Por ejemplo, 1 o -1). Es decir, la verdadera igualdad de los elementos es la siguiente: $$\\prod_{S} (a - b\\alpha) = u \\cdot \\gamma^2$$ ($u$ es un elemento del grupo de unidades $U_K$)\nA menos que esta unidad $u$ sea en sí misma un cuadrado (elemento cuadrático) de algo, el lado izquierdo nunca podrá ser un \u0026ldquo;cuadrado perfecto de un elemento\u0026rdquo;.\nEtapa 5: La magia de Adleman, \u0026ldquo;Caracteres Cuadráticos\u0026rdquo; (Quadratic Characters) Los obstáculos del grupo de clases de ideales y del grupo de unidades. ¿Cómo los superamos? Aquí es donde entra la genial técnica introducida por el criptógrafo Leonard Adleman (la \u0026ldquo;A\u0026rdquo; de RSA) y otros: los \u0026ldquo;Caracteres Cuadráticos\u0026rdquo; (Quadratic Characters).\nPara determinar \u0026ldquo;si un elemento es un cuadrado perfecto dentro de un cuerpo algebraico\u0026rdquo;, utilizamos una versión para cuerpos algebraicos del símbolo de Legendre (residuo cuadrático). En la matriz gigante anterior (el rompecabezas para hacer que el número de ideales primos sea par), añadimos en secreto unas cuantas decenas de condiciones (columnas) adicionales para que \u0026ldquo;los caracteres cuadráticos para algunos ideales primos especiales $\\mathfrak{q}$ también sean todos $1$ (pares)\u0026rdquo;.\nCuando encontramos un conjunto $S$ que incluso satisface estas condiciones adicionales mediante el cálculo de matrices, por los teoremas profundos de la teoría de números algebraicos, se garantiza que \u0026ldquo;los obstáculos tanto del grupo de clases de ideales como del grupo de unidades desaparecerán naturalmente con una probabilidad abrumadora\u0026rdquo;.\nCon esto, por fin obtenemos la verdadera ecuación. $$\\prod_{S} (a - b\\alpha) = \\gamma^2$$ Etapa Final: La fusión de los mundos y el colapso criptográfico Por fin, todas las piezas del rompecabezas están en su lugar.\n[Elementos del Mundo del Cuerpo Algebraico (Mundo A)] $\\gamma^2 = \\prod (a - b\\alpha)$ (De aquí usamos un algoritmo de raíz cuadrada para encontrar $\\gamma$)\n[Elementos del Mundo Real (Mundo de los Números Racionales)] $V^2 = \\prod (a - bm)$ (Como esta es una simple multiplicación de enteros, podemos encontrar la raíz cuadrada $V$ normalmente)\nAhora, es el turno del puente mágico que construimos al principio: el homomorfismo $\\phi$. Transportamos el elemento $\\gamma$ del Mundo A al Mundo B (el mundo de restos módulo $N$) usando $\\phi$ (el mapeo que sustituye $\\alpha$ por $m$). $$Y = \\phi(\\gamma) \\pmod N$$ Por otro lado, tomamos la $V$ que creamos en el mundo real directamente al mundo de los restos y la llamamos $X$. $$X = V \\pmod N$$ Debido a la propiedad de \u0026ldquo;conservar estructuras\u0026rdquo; del homomorfismo, la relación de los cuadrados que se sostenía en el Mundo A se preserva perfectamente en el Mundo B (el mundo módulo $N$). Además, dado que el par original $(a, b)$ fue creado correspondientemente en la forma $a - b\\alpha$ y $a - bm$, estas $X$ e $Y$ chocan en el mundo módulo $N$ y producen la siguiente igualdad absoluta:\n$$X^2 \\equiv Y^2 \\pmod N$$\nEl resto es rezar para que $X$ e $Y$ no sean una solución trivial ($X \\equiv \\pm Y$), y calcular: $\\gcd(X - Y, N)$\nSi es una solución no trivial, el algoritmo de Euclides correrá en 0.001 segundos e imprimirá en la pantalla de salida el corazón del cifrado RSA: los primos secretos $p$ y $q$.\nEsta es la forma completa de la \u0026ldquo;Criba General del Cuerpo de Números (GNFS)\u0026rdquo;, que reúne lo mejor de las matemáticas modernas.\n","date":"2026-09-05T02:26:13+09:00","image":"http://kenji.blog/p/%E4%B8%80%E8%88%AC%E6%95%B0%E4%BD%93%E7%AF%A9%E6%B3%95gnfs%E3%81%AE%E7%9C%9F%E3%81%AE%E6%95%B0%E5%AD%A6%E7%9A%84%E6%A7%8B%E9%80%A0/rsa_encryption_break_1788542156523_hu57b4110ce75cf76414fb819be22bae03_1010164_120x120_fill_q75_box_smart1.jpg","permalink":"http://kenji.blog/es/p/%E4%B8%80%E8%88%AC%E6%95%B0%E4%BD%93%E7%AF%A9%E6%B3%95gnfs%E3%81%AE%E7%9C%9F%E3%81%AE%E6%95%B0%E5%AD%A6%E7%9A%84%E6%A7%8B%E9%80%A0/","title":"La verdadera estructura matemática de la Criba General del Cuerpo de Números (GNFS)"},{"content":"¿Qué es la \u0026ldquo;Criba General del Cuerpo de Números (GNFS)\u0026rdquo;, las matemáticas más fuertes de la humanidad que rompen el cifrado de Internet? El Internet que usamos todos los días. Los mensajes de LINE, YouTube, las compras en Amazon, todas las comunicaciones están protegidas por \u0026ldquo;cifrado\u0026rdquo;. Actualmente, el representante del cifrado más utilizado en todo el mundo es el \u0026ldquo;Cifrado RSA\u0026rdquo;.\nLa clave de la defensa del cifrado RSA es muy simple. Utiliza la propiedad matemática de que \u0026ldquo;la factorización de números primos gigantescos no puede ser resuelta ni siquiera por computadoras\u0026rdquo;. Por ejemplo, si es \u0026ldquo;15\u0026rdquo;, se sabe inmediatamente que es \u0026ldquo;3 × 5\u0026rdquo;, pero en el momento en que esto se convierte en un \u0026ldquo;número de 270 dígitos\u0026rdquo;, incluso reuniendo las supercomputadoras de todo el mundo llevaría cientos de millones de años resolverlo.\nSin embargo, los matemáticos tampoco se han quedado callados. Para romper este cifrado inexpugnable, la humanidad ha creado un algoritmo (procedimiento de cálculo) parecido a la magia llamado \u0026ldquo;Criba General del Cuerpo de Números (GNFS: General Number Field Sieve)\u0026rdquo;.\nEn este artículo, sin usar términos técnicos en absoluto, explicaremos paso a paso y de manera completa el truco por el cual este \u0026ldquo;algoritmo más fuerte de la humanidad\u0026rdquo; rompe el cifrado, solo con conocimientos de matemáticas de secundaria (factorización de primos, álgebra, máximo común divisor)!\nCapítulo 1: El objetivo de descifrar el código es \u0026ldquo;la fórmula de tercer año de secundaria\u0026rdquo; El mayor ataque especial para enfrentar la factorización de números primos gigantes. Es esta fórmula que se aprende en tercer año de secundaria.\n$X^2 - Y^2 = (X + Y)(X - Y)$\nPuede que pienses: \u0026ldquo;¿Eh, se puede romper un cifrado con una fórmula tan básica?\u0026rdquo;. Sin embargo, esta es precisamente la llave maestra que lo revela todo.\nEl objetivo principal para romper el cifrado es, para un número gigante $N$, encontrar \u0026ldquo;números ($X$ e $Y$) cuyo residuo al dividir $X^2$ e $Y^2$ por $N$ sea el mismo\u0026rdquo;.\n¿Por qué se puede descifrar el código si \u0026ldquo;el residuo es el mismo\u0026rdquo;? Supongamos que el \u0026ldquo;residuo al dividir por $N$\u0026rdquo; de dos números, $X^2$ e $Y^2$, es el mismo. Que el residuo sea el mismo significa que existe la regla de que la resta \u0026ldquo;$X^2 - Y^2$\u0026rdquo; siempre se divide exactamente por $N$ (es un múltiplo de $N$).\nAquí, supongamos que el número gigante $N$ usado en el cifrado está hecho por la multiplicación de dos números primos secretos ($p$ y $q$) ($N = p \\times q$).\nAl factorizar $X^2 - Y^2$, se convierte en $(X - Y)(X + Y)$. El hecho de que esto sea un múltiplo de $N$ significa que en algún lugar de esta multiplicación están escondidos los números primos secretos $p$ y $q$.\nAquí ocurre un milagro. La probabilidad de que los dos números primos $p$ y $q$ se separen en habitaciones diferentes, \u0026quot;$p$ va a la habitación de $(X - Y)$\u0026quot; y \u0026ldquo;$q$ va a la habitación de $(X + Y)$\u0026rdquo;, es matemáticamente del ** 50% (un medio)**.\nCon solo el número primo $p$ entrando en la habitación de $(X - Y)$, calculemos el \u0026ldquo;máximo común divisor (la pieza común más grande)\u0026rdquo; de $(X - Y)$ y $N$.\nContenido de $(X - Y)$ = $p \\times$ algún número Contenido de $N$ = $p \\times q$ ¡La única pieza común es \u0026quot;$p$\u0026quot;! Es decir, en el momento en que se calcula el máximo común divisor, el número primo oculto $p$ cae, ¡y el cifrado se descifra por completo! (*El máximo común divisor se puede calcular en un instante incluso en un teléfono inteligente si usas el \u0026ldquo;Algoritmo de Euclides\u0026rdquo;).\n[Breve columna: ¿Por qué al cuadrado? ¿No se puede al cubo o al doble?]\nSi es \u0026ldquo;$2X - 2Y$\u0026rdquo;, se convierte en $2(X - Y)$ y como solo hay una habitación, no se pueden separar los números primos. Si es \u0026ldquo;$X^3 - Y^3$\u0026rdquo;, el tamaño de las habitaciones se desequilibra y el cálculo se vuelve innecesariamente pesado. Para separar los números primos en dos, la opción más eficiente que se divide bellamente en dos habitaciones es \u0026ldquo;al cuadrado\u0026rdquo;.\nCapítulo 2: ¿Cómo buscar X e Y? \u0026ldquo;El rompecabezas de recolectar tarjetas de números primos\u0026rdquo; Ya sabemos el objetivo. Sin embargo, incluso si buscas al azar \u0026ldquo;$X^2$ e $Y^2$ que tengan el mismo residuo\u0026rdquo;, no lo encontrarás hasta que se acabe la vida útil del universo. Por eso, los matemáticos idearon un método genial llamado \u0026ldquo;el rompecabezas de recolectar tarjetas de números primos\u0026rdquo;.\nPaso 1: Recolectar solo el oro en polvo (números suaves) con un tamiz Primero, preparamos un número adecuado $Z$, lo elevamos al cuadrado y calculamos el residuo $W$ al dividirlo por $N$. (El mundo del residuo de $Z^2 = W$)\nFactorizamos el residuo $W$ resultante. Aquí, solo cuando aparece un \u0026quot;$W$ compuesto solo de números primos pequeños como 2, 3, 5, 7, etc.\u0026quot;, guardamos esa fórmula como una \u0026ldquo;tarjeta ganadora\u0026rdquo;, y si se mezclan números primos grandes, la tiramos. Es como la tarea de tirar piedras grandes con un tamiz en un río y recolectar solo el polvo de oro.\nPaso 2: El rompecabezas de hacer todo \u0026ldquo;número par\u0026rdquo; Por ejemplo, supongamos que se reunieron las siguientes tres tarjetas de polvo de oro:\nTarjeta A: $Z_1^2 = 2^3 \\times 3^1$ Tarjeta B: $Z_2^2 = 2^1 \\times 5^1$ Tarjeta C: $Z_3^2 = 3^1 \\times 5^1$ Multipliquemos todo esto. El lado derecho se convierte en $(2^3 \\times 3^1) \\times (2^1 \\times 5^1) \\times (3^1 \\times 5^1)$, y al organizarlo todo junto queda \u0026quot;$2^4 \\times 3^2 \\times 5^2$\u0026quot;.\n¡Increíblemente, la cantidad de números primos se ha vuelto \u0026ldquo;4, 2, 2\u0026rdquo;, todos en cantidades pares! El hecho de que todos sean cantidades pares significa que si reducimos la cantidad total a la mitad, se convierte en el \u0026ldquo;cuadrado de algo\u0026rdquo;. Es decir, $(2^2 \\times 3^1 \\times 5^1)^2 = (60)^2$.\nDado que el lado izquierdo es $(Z_1 \\times Z_2 \\times Z_3)^2$, ¡con esto finalmente se completa el tan esperado par de \u0026ldquo;$X^2 = Y^2$\u0026rdquo; que es $X = (Z_1 \\times Z_2 \\times Z_3)$ $Y = 60$!\nDado que a las computadoras se les da muy bien el rompecabezas de calcular si la cantidad de números primos es \u0026ldquo;par o impar (0 o 1)\u0026rdquo;, con este método pueden encontrar $X$ e $Y$ a alta velocidad.\nCapítulo 3: El muro de la desesperación que se interpone ¡Con esto se puede romper cualquier cifrado!\u0026hellip; Eso pensarías, pero surge un gran problema. Si el número $N$ del cifrado tiene hasta \u0026ldquo;100 dígitos\u0026rdquo;, se puede resolver con este método (llamado criba cuadrática), pero cuando $N$ se convierte en \u0026ldquo;200 dígitos, 300 dígitos\u0026rdquo;, el $W$ que aparece en el medio del cálculo se vuelve demasiado grande.\nCuando los números se vuelven demasiado grandes, de repente dejan de aparecer los \u0026ldquo;números hechos solo de primos pequeños (polvo de oro)\u0026rdquo;. Se vuelve más difícil que buscar una lente de contacto en el desierto, y ya no se pueden juntar en absoluto las tarjetas para resolver el rompecabezas.\nAquí finalmente aparece el arma definitiva de la humanidad, la \u0026ldquo;Criba General del Cuerpo de Números (GNFS)\u0026rdquo;.\nCapítulo 4: La idea más fuerte de la humanidad: Crear \u0026ldquo;dos mundos\u0026rdquo; La idea genial de GNFS es: \u0026ldquo;Como calculamos solo en el mundo real, los números se vuelven enormes. Entonces, hagamos un \u0026lsquo;mundo oculto\u0026rsquo; usando polinomios (expresiones algebraicas) y dividamos el peso del cálculo en dos\u0026rdquo;.\nLa magia de las expresiones algebraicas GNFS convierte un número gigante $N$ en una expresión algebraica usando un número base $m$. Por ejemplo, si $N=100$, usando $m=4$, $100 = 4^3 + 2(4^2) + 4$. Usando la letra $x$, convertimos esto en la expresión (el mundo oculto) $f(x) = x^3 + 2x^2 + x$.\nLo interesante de esta expresión es que tiene la propiedad de que \u0026ldquo;si sustituyes la letra $x$ por $m$ (4 en el ejemplo anterior), siempre puedes regresar (teletransportarte) al número real $N$\u0026rdquo;.\nBuscar oro en polvo en dos mundos al mismo tiempo GNFS crea muchos pares de números enteros $(a, b)$ y realiza los siguientes dos cálculos al mismo tiempo:\nEl mundo real: $a - b \\times m$ El mundo algebraico: el valor de calcular $a - b \\times x$ con las reglas del álgebra Al dividir el problema en dos mundos, el tamaño de los números manejados se vuelve drásticamente menor (más ligero). Es la imagen de partir una roca gigante en dos para convertirla en piedras fáciles de manejar.\nLuego, con un tamiz (criba), se recolectan solo los pares milagrosos $(a, b)$ que son \u0026ldquo;tanto en el mundo real como en el mundo algebraico, \u0026lsquo;hechos solo de números primos pequeños (polvo de oro)\u0026rsquo;\u0026rdquo;. Este es el origen del nombre \u0026ldquo;Criba del Cuerpo de Números\u0026rdquo;.\nEl momento en que finalmente se rompe el cifrado Cuando se reúnen decenas de millones de \u0026ldquo;tarjetas de polvo de oro\u0026rdquo; de ambos mundos, utilizando los cálculos de matrices gigantes de una supercomputadora, descubrimos las \u0026ldquo;combinaciones donde la cantidad de números primos se vuelve toda par\u0026rdquo; que hicimos en el Capítulo 2.\nUna vez que se encuentra la combinación,\nSea el número al cuadrado creado en el mundo real $X^2$ Sea la expresión al cuadrado creada en el mundo algebraico $Y(x)^2$ Finalmente, sustituimos $x$ en el $Y(x)$ del mundo algebraico por $m$, para teletransportarlo y unirlo al mundo real. Entonces, como magia matemática, se completa estrictamente el estado en que \u0026ldquo;el residuo de $X^2$ y $Y^2$ es el mismo\u0026rdquo;!\nEl resto es como en el Capítulo 1, si calculamos el máximo común divisor de $X - Y$ y $N$, el inexpugnable cifrado RSA colapsa estruendosamente, y los números primos secretos hacen su aparición.\nConclusión: Las matemáticas no terminan Es posible que hayas pensado: \u0026ldquo;¡Genial, con GNFS se puede romper cualquier cifrado!\u0026rdquo;. Sin embargo, el cifrado RSA tampoco se queda atrás. Lo que se utiliza en el Internet actual es un número gigantesco monstruoso llamado \u0026ldquo;RSA-2048 (unos 617 dígitos)\u0026rdquo;.\nAunque GNFS es el algoritmo más fuerte de la humanidad, se dice que incluso para resolver 270 dígitos (RSA-270), llevaría miles o decenas de miles de años incluso conectando las computadoras de todo el mundo. Por ahora, nuestros datos de LINE o bancos están a salvo.\nSin embargo, ¿qué pasaría si apareciera \u0026ldquo;una magia para encontrar $X$ e $Y$ en un instante sin importar cuán grande sea el número\u0026rdquo;? En realidad, la existencia más cercana a eso es la \u0026ldquo;computadora cuántica (Algoritmo de Shor)\u0026rdquo; actualmente en desarrollo. Usando las propiedades ondulatorias de la mecánica cuántica, se ha demostrado matemáticamente que se puede ignorar el molesto rompecabezas de recolección de tarjetas y encontrar la respuesta en un solo intento.\nLa interminable batalla de ingenio entre los creadores de cifrados (defensa) y los creadores de algoritmos para romperlos (ataque). Saber que la \u0026ldquo;factorización de primos\u0026rdquo; o el \u0026ldquo;álgebra\u0026rdquo; que se aprenden en la secundaria son en realidad armas que luchan ferozmente en la vanguardia de la seguridad mundial, ¿no hace que las clases de matemáticas parezcan un poco más interesantes?\n¡Podrías ser tú, que estás leyendo este artículo, quien descubra el algoritmo más fuerte del futuro!\n(※Este artículo conceptualiza el encanto matemático del criptoanálisis para estudiantes de secundaria. El GNFS real se calcula estrictamente usando matemáticas universitarias avanzadas, como el grupo de clases de ideales de cuerpos algebraicos y homomorfismos)\n","date":"2026-09-05T02:09:08+09:00","image":"http://kenji.blog/p/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%81%AE%E6%9A%97%E5%8F%B7%E3%82%92%E7%A0%B4%E3%82%8B%E4%BA%BA%E9%A1%9E%E6%9C%80%E5%BC%B7%E3%81%AE%E6%95%B0%E5%AD%A6%E4%B8%80%E8%88%AC%E6%95%B0%E4%BD%93%E7%AF%A9%E6%B3%95gnfs%E3%81%A8%E3%81%AF/gnfs_two_worlds_1788542142485_huf997c6e55368509d0617b56f68899854_1135822_120x120_fill_q75_box_smart1.jpg","permalink":"http://kenji.blog/es/p/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%81%AE%E6%9A%97%E5%8F%B7%E3%82%92%E7%A0%B4%E3%82%8B%E4%BA%BA%E9%A1%9E%E6%9C%80%E5%BC%B7%E3%81%AE%E6%95%B0%E5%AD%A6%E4%B8%80%E8%88%AC%E6%95%B0%E4%BD%93%E7%AF%A9%E6%B3%95gnfs%E3%81%A8%E3%81%AF/","title":"¿Qué es la 'Criba General del Cuerpo de Números (GNFS)', la matemática más fuerte de la humanidad que rompe el cifrado de Internet?"},{"content":"Los pros y contras de los antivacunas: El futuro de 5.000 personas asesinado por la \u0026ldquo;ansiedad de buena fe\u0026rdquo; y las lecciones epidemiológicas que debemos aprender La \u0026ldquo;ilusión de causalidad\u0026rdquo; revelada por el desastre del coronavirus A partir de 2021, la vacunación contra el nuevo coronavirus avanzó rápidamente en Japón. Fue un proyecto de salud pública poco frecuente en la historia de la humanidad, en el que casi el 80% del público fue vacunado en un corto período de tiempo. Durante este proceso, presenciamos innumerables \u0026ldquo;gritos\u0026rdquo; a través de las redes sociales y los medios de comunicación. \u0026ldquo;Un familiar falleció unos días después de recibir la vacuna\u0026rdquo;. \u0026ldquo;Después de la vacunación, sigo teniendo problemas de salud inexplicables\u0026rdquo;. Estas quejas son urgentes, y para los involucrados, el sufrimiento es una verdad innegable.\nSin embargo, aquí existe una \u0026ldquo;trampa\u0026rdquo; fría pero extremadamente importante en la epidemiología. Si consideramos el tamaño de la población de Japón, ya sea que se vacunen o no, entre 3.000 y 4.000 personas mueren todos los días por alguna causa (enfermedad, accidente, esperanza de vida). Si la gran mayoría de las personas se vacunan al mismo tiempo, estadísticamente siempre habrá un cierto número de personas que \u0026ldquo;mueran al día siguiente de la vacunación (por causas no relacionadas con la vacuna)\u0026rdquo;. Esto se llama \u0026ldquo;Coincidencia\u0026rdquo; en términos técnicos.\nLos humanos tienen un sesgo cognitivo llamado \u0026ldquo;falacia post hoc ergo propter hoc\u0026rdquo; (después de esto, por lo tanto, a consecuencia de esto). Si \u0026ldquo;B (muerte) ocurre después de A (vacunación)\u0026rdquo;, intuitivamente lo conectamos como \u0026ldquo;A es la causa de B\u0026rdquo;. Durante la pandemia de coronavirus, este sesgo cognitivo fue amplificado por las redes sociales, creando un segmento de la población en el que se afianzó la imagen de \u0026ldquo;vacuna = peligro\u0026rdquo; sin esperar a la verificación científica.\nMuchos expertos en salud pública observaron esta escena con un sentido de déjà vu. Esto se debe a que Japón es el único país desarrollado que, hace apenas unos años, abandonó voluntariamente un medio para prevenir enfermedades prevenibles debido a esta \u0026ldquo;ansiedad sin ciencia\u0026rdquo;. Ese es el problema de la \u0026ldquo;vacuna contra el cáncer de cuello uterino (vacuna contra el VPH)\u0026rdquo;.\n¿Qué pasó en Japón en 2013? Retrocedamos un poco en el tiempo. El cáncer de cuello uterino es una enfermedad que afecta a unas 11.000 mujeres cada año y mata a unas 2.900. Se le llama \u0026ldquo;asesino de madres\u0026rdquo; porque ataca especialmente a la generación de entre 20 y 40 años, que están en su mejor momento para criar hijos y trabajar. La causa es la infección por el virus del papiloma humano (VPH), un virus común que se dice que infecta al 80% de las mujeres sexualmente activas al menos una vez en su vida. La vacuna contra el VPH, que previene esta infección viral, se introdujo en todo el mundo como una \u0026ldquo;vacuna innovadora que puede prevenir el cáncer\u0026rdquo;, y en Japón también se convirtió en una vacuna de rutina (fuertemente recomendada por el gobierno y disponible de forma gratuita) en abril de 2013.\nSin embargo, la situación dio un giro oscuro poco después. Algunas de las niñas que recibieron la vacuna informaron síntomas como dolor en todo el cuerpo, trastornos del movimiento y pérdida de memoria, y los medios de comunicación informaron esto de manera destacada todos los días como \u0026ldquo;sospecha de efectos secundarios de la vacuna\u0026rdquo;. Las imágenes de niñas sufriendo convulsiones tuvieron un fuerte impacto en los espectadores, y la opinión pública se inclinó rápidamente hacia el \u0026ldquo;argumento del peligro de las vacunas\u0026rdquo;.\nEn respuesta a esto, el Ministerio de Salud, Trabajo y Bienestar decidió \u0026ldquo;abstenerse de la recomendación activa\u0026rdquo; en junio de 2013, a solo dos meses del inicio de la vacunación de rutina. No fue una \u0026ldquo;prohibición\u0026rdquo; ni una \u0026ldquo;cancelación\u0026rdquo;, sino una decisión política extremadamente ambigua de \u0026ldquo;mantener el marco de vacunación de rutina, pero dejar de enviar notificaciones individuales del gobierno\u0026rdquo;. Sin embargo, esto se transmitió al público como un mensaje de que \u0026ldquo;el gobierno admitió que era peligroso y lo detuvo\u0026rdquo;. Como resultado, la tasa de vacunación, que había superado el 70%, se desplomó a menos del 1% en un instante.\nA partir de aquí, comenzó la \u0026ldquo;década perdida (brecha de vacunas)\u0026rdquo; en Japón.\nLa \u0026ldquo;verdad\u0026rdquo; revelada por el Estudio de Nagoya ¿Fueron los síntomas informados por los medios realmente causados por la vacuna? Hay un estudio a gran escala que intentó responder a esta pregunta científicamente. Comúnmente conocido como el \u0026ldquo;Estudio de Nagoya\u0026rdquo;.\nLa ciudad de Nagoya realizó una encuesta a gran escala en 2015 a unas 70.000 mujeres jóvenes. Esto incluyó tanto a \u0026ldquo;personas que recibieron la vacuna\u0026rdquo; como a \u0026ldquo;personas que no la recibieron\u0026rdquo;, y les preguntó a cada una si tenían 24 síntomas, como \u0026ldquo;menstruación irregular\u0026rdquo;, \u0026ldquo;dolor en las articulaciones\u0026rdquo; y \u0026ldquo;disminución de la concentración\u0026rdquo;. Si la vacuna fuera la causa, estos síntomas deberían aparecer claramente más en el grupo de \u0026ldquo;personas que la recibieron\u0026rdquo;.\nLos resultados fueron impactantes. No se observó una diferencia significativa en la incidencia de síntomas entre el grupo \u0026ldquo;vacunado\u0026rdquo; y el grupo \u0026ldquo;no vacunado\u0026rdquo;.\n¿Qué significa esto? Las adolescentes, independientemente de si están vacunadas o no, están en un período en el que son propensas a problemas de salud como la disfunción autonómica ortostática y el dolor crónico debido a los cambios en el equilibrio hormonal y las circunstancias específicas del período de crecimiento. En otras palabras, en la misma proporción que las \u0026ldquo;niñas que desarrollaron síntomas después de recibir la vacuna\u0026rdquo; reportadas por los medios de comunicación, había \u0026ldquo;niñas que desarrollaron los mismos síntomas a pesar de no haber recibido la vacuna\u0026rdquo;. Sin embargo, los problemas de salud de las niñas no vacunadas se trataron como \u0026ldquo;trastornos de la adolescencia\u0026rdquo;, y solo los problemas de las niñas vacunadas se destacaron como \u0026ldquo;daños por vacunas\u0026rdquo;. Los datos mostraron que era muy probable que esta fuera la verdadera naturaleza del fenómeno que causó tanto alboroto como un \u0026ldquo;desastre de medicamentos\u0026rdquo;.\nAdemás, también se ha señalado la implicación del \u0026ldquo;efecto Nocebo\u0026rdquo;. Es lo contrario del \u0026ldquo;efecto placebo\u0026rdquo;; cuando consumes algo creyendo que es \u0026ldquo;malo para ti\u0026rdquo;, en realidad causa dolor y malestar debido a la ansiedad y el miedo. No se puede negar la posibilidad de que los informes negativos diarios afectaran las mentes y los cuerpos delicados de las niñas.\nEl \u0026ldquo;pecado de omisión\u0026rdquo; visto en números \u0026ldquo;Detener las recomendaciones por si acaso\u0026rdquo;. A primera vista, esta decisión parece una \u0026ldquo;elección cautelosa y segura\u0026rdquo;. Ya que será demasiado tarde después de que suceda algo, en caso de duda, debería detenerse. Sin embargo, en salud pública, \u0026ldquo;no hacer nada (omisión)\u0026rdquo; a veces causa un daño que supera con creces el riesgo de \u0026ldquo;hacer algo\u0026rdquo;.\nUn equipo de investigación de la Universidad de Osaka publicó una estimación cruel sobre el impacto de esta suspensión de la recomendación. Debido a la fuerte caída en la tasa de vacunación entre 2013 y 2019, dicen que habrá un aumento de unas 25.000 pacientes con cáncer de cuello uterino y de 5.000 a 5.700 muertes que podrían haberse evitado en el futuro.\nMás de 5.000 muertos. Esta es una cifra comparable a la de un desastre natural a gran escala. Como resultado de tratar de evitar el riesgo de \u0026ldquo;ansiedad sobre las reacciones adversas\u0026rdquo;, cuya relación causal no está científicamente clara, hemos obligado a las mujeres del futuro a soportar el riesgo cierto y grave de \u0026ldquo;muerte por cáncer\u0026rdquo;.\nSi miramos al mundo, la diferencia es obvia. En Australia, se prevé que el cáncer de cuello uterino sea \u0026ldquo;erradicado (se convierta en un cáncer raro)\u0026rdquo; para alrededor de 2028 debido a la propagación de la vacunación tanto en hombres como en mujeres. En el Reino Unido también se ha informado que la incidencia de cáncer de cuello uterino en la generación vacunada se ha reducido a casi cero. Mientras el mundo avanza hacia un futuro donde se \u0026ldquo;conquista el cáncer\u0026rdquo;, solo Japón se ha quedado atrás en un pasado donde el \u0026ldquo;cáncer continúa aumentando\u0026rdquo;. En 2015, el Comité Asesor Global sobre Seguridad de las Vacunas de la OMS (Organización Mundial de la Salud) criticó explícitamente la situación en Japón. Dijeron: \u0026ldquo;La toma de decisiones políticas que no se basa en la ciencia está causando daños reales (muerte por cáncer)\u0026rdquo;.\n\u0026ldquo;Reticencia a las vacunas\u0026rdquo; que se encadena a través del océano La tragedia de la vacuna contra el VPH que ocurrió en Japón no es de ninguna manera una \u0026ldquo;circunstancia especial exclusiva de Japón\u0026rdquo;. Todavía hoy se reportan casos en todo el mundo que muestran que, cuando la \u0026ldquo;ansiedad intuitiva\u0026rdquo; o la \u0026ldquo;ideología\u0026rdquo; prevalecen sobre la ciencia, las enfermedades infecciosas siempre enseñarán sus colmillos, en cualquier lugar.\nUn ejemplo notable de esto es el brote de \u0026ldquo;sarampión\u0026rdquo; en Estados Unidos.\nEl sarampión es un virus altamente contagioso, pero es una enfermedad casi completamente prevenible con una vacuna. En los Estados Unidos, gracias a un programa exhaustivo de vacunación, se declaró su \u0026ldquo;eliminación\u0026rdquo; en 2000. En otras palabras, se consideraba que el virus endémico había desaparecido del país. Sin embargo, el sarampión ha comenzado a propagarse nuevamente en los últimos años.\nSegún un informe de la BBC (2024), los funcionarios de salud de EE. UU. señalan que la \u0026ldquo;reticencia a las vacunas\u0026rdquo; (Vaccine Hesitancy) persistente en algunas comunidades es un caldo de cultivo para la propagación de la infección. Las tasas de vacunación han disminuido en áreas por razones religiosas, entre algunos grupos que afirman ser \u0026ldquo;naturalistas\u0026rdquo;, o en áreas donde las ideologías antivacunas basadas en la desinformación han penetrado. Cuando el virus se introduce allí desde el extranjero, se producen infecciones explosivas entre personas que no tienen inmunidad.\nEl sarampión no es solo una enfermedad que termina con fiebre y sarpullido. Provoca complicaciones graves como neumonía y encefalitis, e incluso en los países desarrollados, puede ser fatal. La enfermedad que la humanidad una vez reunió su sabiduría para \u0026ldquo;contener\u0026rdquo; está amenazando nuevamente las vidas de los niños al aprovechar la brecha de la \u0026ldquo;duda\u0026rdquo; de la gente. El caso estadounidense nos advierte: \u0026ldquo;El rompeolas de las altas tasas de vacunación colapsará en un instante si se tambalea la confianza de la gente\u0026rdquo;.\nLa derrota de los medios, los expertos y de nosotros mismos ¿Por qué se repiten estas situaciones? Allí existe la asimetría de información peculiar de la sociedad moderna y nuestros propios sesgos cognitivos.\nEn el tema de la vacuna contra el VPH en Japón, los medios de comunicación informaron de manera sensacionalista las \u0026ldquo;sospechas de efectos secundarios de la vacuna\u0026rdquo;. La composición de \u0026ldquo;víctimas lamentables\u0026rdquo; versus \u0026ldquo;el país frío / compañías farmacéuticas\u0026rdquo; fue muy poderosa como historia y sacudió fuertemente las emociones de los espectadores. Por otro lado, las explicaciones científicas de los expertos de que \u0026ldquo;no hay diferencia estadísticamente significativa\u0026rdquo; y \u0026ldquo;los beneficios superan los riesgos\u0026rdquo; sonaron secas y frías, y fueron demasiado impotentes frente al torrente de emociones.\nEn el mundo de la ciencia, si hay una teoría establecida apoyada por el 99% de los científicos y un 1% que disiente, no se tratan como \u0026ldquo;opiniones iguales\u0026rdquo;. Sin embargo, los medios, en su afán por enfatizar la \u0026ldquo;equidad\u0026rdquo;, o quizás para llamar la atención, reportaron en paralelo y como \u0026ldquo;iguales\u0026rdquo; los datos que salvarían decenas de miles de vidas y la queja emocional de una sola víctima. Los políticos, también por temor a la reacción pública, priorizaron leer \u0026ldquo;el ambiente del momento\u0026rdquo; sobre la evidencia científica. Como resultado, la recomendación activa de la vacuna contra el VPH se suspendió durante unos 9 años en Japón, y durante ese tiempo causó un gran daño por cáncer que podría haberse prevenido.\nLa historia se repite: inteligencia para resistir el \u0026ldquo;ambiente\u0026rdquo; En 2022, finalmente se reanudó la recomendación activa de la vacuna contra el VPH en Japón. Sin embargo, el tiempo y las vidas perdidas no se pueden recuperar. Y así como el sarampión está reapareciendo en los Estados Unidos en este momento, si bajamos la guardia, la historia se repetirá una y otra vez.\nEl movimiento antivacunas y tener preocupaciones sobre la atención médica en sí mismos no pueden ser completamente negados. Es un instinto de defensa humana ser cauteloso sobre lo que uno pone en su propio cuerpo, y de hecho ha habido desastres relacionados con drogas en el pasado. Monitorear y dudar del poder es importante en una democracia.\nSin embargo, lo que nos presenta la serie de eventos de la vacuna contra el coronavirus, la vacuna contra el VPH y el brote de sarampión en EE. UU. es la fría realidad de que la \u0026ldquo;ansiedad de buena fe que ignora la ciencia\u0026rdquo; puede cobrar más vidas que el propio virus.\n\u0026ldquo;Podría ser peligroso, así que esperemos y veamos\u0026rdquo;. Cuando tomamos esa decisión, ¿hemos incluido en nuestros cálculos \u0026ldquo;la probabilidad de morir de la enfermedad mientras esperamos y vemos\u0026rdquo;? \u0026ldquo;Lo natural es lo mejor\u0026rdquo;. Cuando decimos eso, ¿no hemos olvidado la historia de que \u0026ldquo;los virus en la naturaleza son los que más implacablemente han cobrado vidas\u0026rdquo;?\nEn el futuro aparecerán nuevas enfermedades infecciosas y se desarrollarán nuevas vacunas. En ese momento, ¿seremos engañados nuevamente por el fenómeno de \u0026ldquo;coincidencia\u0026rdquo; y arrastrados por la instigación emocional? ¿O seremos capaces de leer con calma los datos y sopesar los riesgos y los beneficios?\nSe dice que la historia se repite. Sin embargo, lo único que puede detenerla es nuestra propia razón. Debemos observar datos estadísticamente correctos y tener la inteligencia para elegir los \u0026ldquo;hechos\u0026rdquo; en lugar de \u0026ldquo;el ambiente\u0026rdquo;. Esa es nuestra responsabilidad al vivir en la era moderna.\nReferencias y fuentes de datos Ministerio de Salud, Trabajo y Bienestar: \u0026ldquo;Infección por el Virus del Papiloma Humano ~ Cáncer de cuello uterino y la vacuna contra el VPH ~\u0026rdquo; Centro Nacional de Cáncer: Servicio de Información del Cáncer Estadísticas de \u0026ldquo;Cáncer de cuello uterino\u0026rdquo; BBC News (Japonés): \u0026ldquo;Los CDC de EE. UU. piden la vacunación debido al brote de sarampión; aumento global de las infecciones\u0026rdquo; (2024) y artículos originales relacionados. Equipo de Investigación de la Universidad de Osaka (Yagi A, et al. Lancet Public Health. 2020): Investigación sobre la estimación de casos excesivos y muertes debido a la abstención de recomendar activamente la vacunación de rutina contra el VPH Estudio de Nagoya (Suzuki S, et al. Papillomavirus Res. 2018) ","date":"2026-01-24T15:41:23+09:00","image":"http://kenji.blog/p/%E5%8F%8D%E3%83%AF%E3%82%AF%E3%83%81%E3%83%B3%E3%81%AE%E5%8A%9F%E7%BD%AA/img_hu25fb505b5ce09f8b6e475386b0bbff8f_1013820_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E5%8F%8D%E3%83%AF%E3%82%AF%E3%83%81%E3%83%B3%E3%81%AE%E5%8A%9F%E7%BD%AA/","title":"Los pros y contras de los antivacunas"},{"content":"La imagen falsa y verdadera de \u0026ldquo;Primero los Japoneses\u0026rdquo;: La medida de defensa llamada \u0026ldquo;coexistencia\u0026rdquo; a la que se enfrenta Japón en 2026 Introducción: ¿Por qué resuenan estas palabras ahora? Año 2026. Nos encontramos ahora en un punto de inflexión de una era sin precedentes. La prolongada inflación, el estancamiento de los salarios reales y la evidente disminución de la natalidad y el envejecimiento de la población. Cada vez que se cambian las etiquetas de precios de los productos en los estantes de los supermercados, la ansiedad por el futuro ensombrece nuestros corazones.\nEn medio de este sentimiento de estancamiento, hay una frase que está ganando apoyo rápidamente. Esa es \u0026ldquo;Primero los Japoneses\u0026rdquo;.\nEl deseo de \u0026ldquo;querer que primero se enriquezca la vida de los ciudadanos de nuestro propio país\u0026rdquo; o \u0026ldquo;querer que se proteja como máxima prioridad la cultura y la seguridad pública de Japón\u0026rdquo; es un anhelo sumamente natural y apremiante como un individuo soberano y como un ser humano que vive en este país. Sin embargo, entre el \u0026ldquo;ideal\u0026rdquo; que promueven estas palabras y la \u0026ldquo;realidad\u0026rdquo; que muestran los datos estadísticos, existe una gran divergencia que debemos enfrentar directamente.\nEn este artículo, dejaremos de lado los argumentos emocionales y las etiquetas, y nos acercaremos a la verdadera naturaleza de este problema basándonos en datos objetivos, los cambios cronológicos y los hechos que ocurren en diversos ámbitos de la sociedad.\nCapítulo 1: La cronología de \u0026ldquo;Primero los Japoneses\u0026rdquo; y el contexto social Estas palabras no aparecieron de repente. Se han ido gestando a partir de una compleja mezcla de tendencias globales y circunstancias particulares de Japón.\n1. 2016-2017: Importación y arraigo del término En 2016, el \u0026ldquo;América Primero\u0026rdquo; promovido por Donald Trump causó conmoción en todo el mundo. A nivel nacional, en 2017, la agrupación \u0026ldquo;Tomin First no Kai\u0026rdquo; (Asociación Primero los Ciudadanos de Tokio) liderada por la gobernadora de Tokio, Yuriko Koike, atrajo la atención. En este momento, el aspecto como retórica para aclarar las prioridades políticas era fuerte, y los matices xenófobos aún eran limitados.\n2. 2023-2024: Visualización de la ansiedad El retraso en la recuperación económica tras la pandemia y la inflación que acompañó a la rápida depreciación del yen golpearon directamente a los hogares comunes. En esta misma época, en las redes sociales comenzaron a estallar quejas basadas en información fragmentaria, como \u0026ldquo;el apoyo a los extranjeros es demasiado generoso\u0026rdquo; o \u0026ldquo;el dinero de los impuestos de los japoneses está fluyendo hacia los extranjeros\u0026rdquo;.\n3. 2025-2026: La fusión de las fuerzas políticas y las redes sociales En las elecciones nacionales de 2025, las fuerzas que adoptaron formalmente \u0026ldquo;Primero los Japoneses\u0026rdquo; como eslogan consiguieron un cierto número de escaños. Los algoritmos de las redes sociales reaccionaron a la ansiedad de las personas mostrando de manera preferente publicaciones extremas, acelerando el \u0026ldquo;fenómeno de cámara de eco\u0026rdquo; donde solo se refuerzan ciertos valores.\nEn la última encuesta de opinión pública (finales de 2025) realizada por varios periódicos, ante este eslogan, un 42% respondió \u0026ldquo;De acuerdo / Más bien de acuerdo\u0026rdquo; y un 38% respondió \u0026ldquo;En desacuerdo / Más bien en desacuerdo\u0026rdquo;, revelando la realidad de una opinión pública dividida en dos.\nCapítulo 2: La verdad sobre la economía y la seguridad social: ¿Una \u0026ldquo;presencia que arrebata\u0026rdquo; o un \u0026ldquo;pilar de apoyo\u0026rdquo;? Uno de los pilares de la lógica de quienes apoyan \u0026ldquo;Primero los Japoneses\u0026rdquo; es la imagen de que \u0026ldquo;los recursos de los japoneses están siendo arrebatados por los extranjeros\u0026rdquo;. Sin embargo, los datos primarios de las agencias gubernamentales muestran una realidad completamente opuesta a esta intuición.\n1. Fuerza laboral: La \u0026ldquo;sangre indispensable\u0026rdquo; que mantiene la economía japonesa Según la \u0026ldquo;Situación del Empleo de Extranjeros (a finales de octubre de 2024)\u0026rdquo; del Ministerio de Salud, Trabajo y Bienestar, el número de trabajadores extranjeros era de **2.048.675 personas . En las estimaciones actuales de 2026, ya ha superado los ** 2.3 millones.\nSector industrial Porcentaje / Tasa de aumento de trabajadores extranjeros Realidad y rol Construcción Aumento de aprox. 22.7% interanual Indispensable para el mantenimiento de infraestructura y reparación de puentes y carreteras envejecidos. Atención médica y bienestar Aumento de aprox. 28.1% interanual Llevan el peso de la primera línea en los centros de cuidado, apoyando a los ancianos japoneses. Manufactura Ocupan aprox. el 26% del total La columna vertebral que sostiene las industrias de exportación de Japón. Actualmente, no se trata de trabajos que los japoneses quieran hacer y no puedan, sino que ellos están llenando el \u0026ldquo;vacío que los japoneses ya no pueden asegurar\u0026rdquo;. Si bajo el nombre de \u0026ldquo;Primero los Japoneses\u0026rdquo; los excluyéramos, nuestro sistema de cuidado de ancianos colapsaría de inmediato, y los precios de las viviendas y los alimentos se dispararían en porcentajes o incluso se multiplicarían.\n2. Seguridad social: Bulos y realidades sobre la asistencia pública Lo que más se difunde en las redes sociales es el discurso de que \u0026ldquo;los extranjeros reciben asistencia pública de forma preferencial\u0026rdquo;. Sin embargo, al revisar las estadísticas del Ministerio de Salud, Trabajo y Bienestar, la proporción de hogares encabezados por extranjeros entre todos los hogares receptores es de aproximadamente 2.8% a 2.9%. Esta cifra se ha mantenido casi estable durante los últimos 10 años.\nPor el contrario, al observar la composición por edad de los extranjeros residentes, la mayoría pertenece a la **generación activa de entre 20 y 40 años **. Ellos pagan la pensión de bienestar social y las primas del seguro de salud, asumiendo el rol de \u0026ldquo;aportantes\u0026rdquo; que sostienen las pensiones y los gastos médicos que reciben los \u0026ldquo;ancianos japoneses\u0026rdquo;. Quienes llenan el vacío de la generación activa que dejaron los japoneses y prolongan la vida del sistema de seguridad social japonés son, sin lugar a dudas, ellos.\nCapítulo 3: Seguridad pública y sesgos en redes sociales: Desmontando lógicamente el \u0026ldquo;crimen extranjero\u0026rdquo; La ansiedad por la seguridad pública es lo que más estimula el sentimiento de \u0026ldquo;Primero los Japoneses\u0026rdquo;. Sin embargo, al leer detalladamente las estadísticas de la Agencia Nacional de Policía y el \u0026ldquo;Libro Blanco del Crimen\u0026rdquo; del Ministerio de Justicia, queda claro cómo la imagen en internet de los \u0026ldquo;extranjeros atroces\u0026rdquo; está construida sobre una distorsión cognitiva.\n1. Una comparación serena de \u0026ldquo;totales\u0026rdquo; y \u0026ldquo;tasas de criminalidad\u0026rdquo; Según las estadísticas publicadas en 2024, del total de personas arrestadas, la proporción que ocupan los extranjeros es de aproximadamente el 5.5%. El 95% restante corresponde a delitos cometidos por japoneses.\nSi comparamos el número de arrestos por cada 100.000 habitantes (tasa de criminalidad), la esencia se vuelve aún más visible.\nCategoría Personas arrestadas por cada 100.000 habitantes (estimación) Japoneses (todas las edades) Aprox. 142.7 personas Extranjeros residentes (residentes permanentes / a largo plazo) ** Aprox. 120.0 personas** El hecho estadístico es que la tasa de criminalidad de los extranjeros que viven en Japón a mediano y largo plazo es menor que el promedio general de los japoneses.\n2. La magia del sesgo por \u0026ldquo;generaciones\u0026rdquo; ¿Por qué prevalece la imagen de que \u0026ldquo;los extranjeros son aterradores\u0026rdquo;? El factor principal es la diferencia en la \u0026ldquo;composición por edades\u0026rdquo; en criminología.\nJaponeses: Aproximadamente el 30% son personas mayores, cuya tasa de criminalidad es extremadamente baja. Este grupo empuja el \u0026ldquo;denominador\u0026rdquo; hacia abajo, haciendo que las cifras generales de Japón parezcan más bajas. Extranjeros: Al venir a Japón como fuerza laboral, más del 80% son de la \u0026ldquo;generación joven a mediana edad\u0026rdquo;, donde estadísticamente es más probable que ocurran delitos. Si comparamos las tasas de criminalidad de japoneses y extranjeros bajo la misma condición de tener \u0026ldquo;20 a 29 años\u0026rdquo;, no se observan diferencias significativas entre ambos. Es decir, no es que \u0026ldquo;la seguridad empeoró porque aumentaron los extranjeros\u0026rdquo;, sino simplemente que \u0026ldquo;el grupo de edad más propenso a cometer delitos (los jóvenes) existe en Japón en forma de extranjeros\u0026rdquo;.\n3. El \u0026ldquo;sesgo de confirmación\u0026rdquo; creado por las redes sociales Los algoritmos de las redes sociales usan nuestra \u0026ldquo;ansiedad\u0026rdquo; como combustible. Cuando ocurre un delito por parte de un extranjero, se asocia fuertemente con su \u0026ldquo;atributo (nacionalidad)\u0026rdquo; y se difunde intensamente. Como resultado, en nuestro cerebro solo se refuerza el recuerdo de que \u0026ldquo;otra vez un extranjero cometió un delito\u0026rdquo;.\nEsto se llama \u0026ldquo;sesgo de confirmación\u0026rdquo;. Los delitos cometidos por japoneses, que representan el 95% del total, se pasan por alto como parte de la \u0026ldquo;rutina diaria\u0026rdquo;, mientras que el 5% de los delitos de extranjeros se transfiere a la imagen de \u0026ldquo;todos los extranjeros\u0026rdquo;.\nCapítulo 4: Transmisión de la cultura: ¿\u0026ldquo;Destructores\u0026rdquo; o \u0026ldquo;Salvadores\u0026rdquo;? La preocupación de que \u0026ldquo;las tradiciones y cultura de Japón están siendo destruidas\u0026rdquo; también difiere de la realidad sobre el terreno.\n1. Los \u0026ldquo;últimos herederos\u0026rdquo; de la artesanía tradicional El número de personas que trabajan en la fabricación de artesanías tradicionales japonesas ha caído drásticamente de unas 300.000 personas en la década de 1970 a unas 50.000 en la actualidad. Quienes están salvando esta crisis de extinción son extranjeros que han llegado a Japón con un profundo respeto por la cultura japonesa.\nBodegas de sake y forjadores de espadas: Extranjeros se han convertido en aprendices en talleres donde los japoneses estaban a punto de abandonar la sucesión. Al incorporar su capacidad de difusión al extranjero y nuevas sensibilidades, están revitalizando culturas al borde del cierre, convirtiéndolas en \u0026ldquo;industrias sostenibles\u0026rdquo;. 2. Mantenimiento de las comunidades locales En los municipios rurales que se han convertido en \u0026ldquo;ciudades en posible desaparición\u0026rdquo; debido a la pérdida de jóvenes, los aprendices técnicos y trabajadores extranjeros con habilidades específicas son quienes llevan a cabo los festivales locales y sostienen la base agrícola. Cuando los japoneses se han ido, ¿quién cultiva las tierras abandonadas y preserva eventos centenarios? Si miramos esa realidad, queda claro que no son \u0026ldquo;destructores\u0026rdquo; de la cultura, sino la \u0026ldquo;última línea de defensa\u0026rdquo;.\nCapítulo 5: Preocupaciones en el ámbito educativo y la cadena de \u0026ldquo;acoso\u0026rdquo; (bullying) Los efectos secundarios de introducir la frase \u0026ldquo;Primero los Japoneses\u0026rdquo; en el ámbito educativo son graves.\nDicotomía que divide entre \u0026ldquo;adentro y afuera\u0026rdquo;: Si los niños interiorizan un falso sentido de elitismo de que \u0026ldquo;los japoneses son una clase privilegiada que debe tener prioridad\u0026rdquo;, esto conduce fácilmente al acoso (bullying) para excluir a los que son \u0026ldquo;diferentes a nosotros\u0026rdquo;. Jerarquización por raíces: Incluso si tienen nacionalidad japonesa, los niños con apariencia o nombres diferentes son atacados como \u0026ldquo;no japoneses\u0026rdquo;. Esto es el colapso de la educación y un acto de lastimarse a sí mismos, dañando a los talentos que liderarán el Japón del futuro. Los expertos en el campo de la educación temen el riesgo de que la exclusividad inherente a la palabra \u0026ldquo;Primero\u0026rdquo; socave la capacidad de convivencia multicultural de los niños y, como resultado, aísle a Japón del resto del mundo.\nCapítulo 6: Las tendencias globales y la ola del populismo Este fenómeno no es exclusivo de Japón. En los países occidentales, también continúa el fenómeno donde las clases que no pudieron recibir los beneficios de la globalización se inclinan hacia un populismo que enarbola el \u0026ldquo;nacionalismo primero\u0026rdquo;.\nSin embargo, en lo que Japón difiere decisivamente de Occidente es en el hecho de que \u0026ldquo;su población está disminuyendo al ritmo más rápido del mundo\u0026rdquo;. Aunque otros países puedan tener la opción de \u0026ldquo;restringir\u0026rdquo;, en Japón ya existe un sinnúmero de infraestructuras sociales que no se pueden mantener sin \u0026ldquo;cooperación\u0026rdquo;. Aferrarse a un \u0026ldquo;Primero\u0026rdquo; puramente emocional significa lógicamente un \u0026ldquo;suicidio lento\u0026rdquo;.\nA modo de conclusión: ¿Qué es el verdadero \u0026ldquo;Primero los Japoneses\u0026rdquo;? El deseo expresado en las palabras \u0026ldquo;Primero los Japoneses\u0026rdquo; de que \u0026ldquo;se piense en la vida de los ciudadanos como prioridad\u0026rdquo; es en sí mismo la responsabilidad más básica que debe tener el gobierno de cualquier país.\nSin embargo, el medio para cumplir ese deseo no debe ser la \u0026ldquo;exclusión del prójimo\u0026rdquo;. Como muestran los datos objetivos, la conveniencia de la vida, la seguridad, la cultura tradicional y el propio sistema de seguridad social que disfrutamos hoy en día se encuentran en una fase de \u0026ldquo;dependencia y coexistencia\u0026rdquo; que ya no puede sostenerse sin la presencia de los extranjeros.\n¿Acaso el verdadero \u0026ldquo;Primero los Japoneses\u0026rdquo; no consiste en poner en práctica de manera serena los siguientes tres puntos?\nDebates basados en hechos: Comprender la realidad basándose en las estadísticas primarias de las agencias gubernamentales, sin dejarse llevar por bulos o información exagerada. Establecimiento de reglas justas: Hacer que los extranjeros cumplan las normas de Japón, mientras que la sociedad japonesa los trata como socios justos. Actualización interna: Un cambio de mentalidad: aceptar a los extranjeros no significa \u0026ldquo;perder Japón\u0026rdquo;, sino tomar prestada su fuerza para \u0026ldquo;reconstruir y mantener Japón\u0026rdquo;. En el año 2026, nos encontramos en una gran encrucijada. ¿Seguiremos gritando palabras de división y estrangulándonos a nosotros mismos? ¿O enfrentaremos la realidad y daremos un paso hacia un \u0026ldquo;Japón sostenible\u0026rdquo; donde personas diversas se apoyen mutuamente?\nLa respuesta reside en la \u0026ldquo;inteligencia\u0026rdquo; y el \u0026ldquo;valor\u0026rdquo; en el corazón de cada uno de nosotros.\n","date":"2026-01-23T13:43:41+09:00","image":"http://kenji.blog/p/%E6%97%A5%E6%9C%AC%E4%BA%BA%E3%83%95%E3%82%A1%E3%83%BC%E3%82%B9%E3%83%88%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E6%80%9D%E3%81%86%E3%81%93%E3%81%A8/img_hua12d272c50d3b08d888fe1df256a5051_1332597_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E6%97%A5%E6%9C%AC%E4%BA%BA%E3%83%95%E3%82%A1%E3%83%BC%E3%82%B9%E3%83%88%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E6%80%9D%E3%81%86%E3%81%93%E3%81%A8/","title":"Reflexiones sobre el Primero los Japoneses"},{"content":"[Atención] ¿Se te cobrará cuando termine la prueba gratuita de Gemini? Resumen de cómo cancelar Cuando intentas probar el servicio de IA de Google \u0026ldquo;Gemini\u0026rdquo;, inicialmente hay disponible una prueba gratuita de 1 mes. Creo que muchas personas se registran pensando \u0026ldquo;Si es gratis, lo probaré por ahora\u0026rdquo;, pero aquí hay una advertencia.\n¿Qué pasa cuando termina la prueba gratuita? Cuando termina el período de prueba, se te cobrarán automáticamente 2.900 yenes al mes. Esto está vinculado a una suscripción llamada \u0026ldquo;Membresía de Google One\u0026rdquo;, que es un sistema que hace la transición a la facturación continua si no haces nada.\nSi cancelas, no se te cobrará, pero\u0026hellip; Por supuesto, si cancelas durante la prueba, no se te cobrará ninguna tarifa. La página de ayuda oficial también tiene un artículo sobre \u0026ldquo;Cómo cancelar tu membresía de Google One\u0026rdquo;.\n👉 Cancelar la membresía de Google One (Oficial)\nSin embargo, cuando intenté acceder, me encontré en una situación en la que \u0026ldquo;por alguna razón no podía cancelar\u0026rdquo;. Me confundí y pensé: \u0026ldquo;¿Eh, desde dónde debería pararlo?\u0026rdquo;.\n¡El método de cancelación correcto está aquí! Después de investigar mucho, la página desde la que realmente pude cancelar fue la siguiente.\n👉 Cuenta de Google – Eliminar un servicio\nSi seleccionas \u0026ldquo;Google One\u0026rdquo; aquí y lo eliminas, la cancelación se completará.\nResumen La prueba gratuita de Gemini dura 1 mes Tras finalizar, se te cobrarán automáticamente 2.900 yenes al mes Es posible que no puedas cancelar desde la página de ayuda oficial Donde realmente puedes cancelar es en la página \u0026ldquo;Eliminar un servicio\u0026rdquo; Si piensas \u0026ldquo;Está bien porque es una prueba gratuita\u0026rdquo;, ten cuidado de que no se te cobre sin darte cuenta.\n👉 Si estás leyendo este artículo, es posible que estés en un aprieto pensando \u0026ldquo;¿Desde dónde cancelo?\u0026rdquo;. De momento, por favor revisa el enlace de arriba.\n","date":"2025-09-27T10:02:59+09:00","image":"http://kenji.blog/p/google-one-gemini%E3%81%8C%E8%A7%A3%E7%B4%84%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E6%99%82%E3%81%AE%E5%AF%BE%E5%87%A6%E6%96%B9%E6%B3%95/img_hue118597de1df33c0e1a19ecde6d4d33f_1730014_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/google-one-gemini%E3%81%8C%E8%A7%A3%E7%B4%84%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E6%99%82%E3%81%AE%E5%AF%BE%E5%87%A6%E6%96%B9%E6%B3%95/","title":"Qué hacer cuando no puedes cancelar Google One (Gemini)"},{"content":"🎬 Guion para la transmisión de YouTube (Desarrollo de app de tarjetas de Año Nuevo - Parte 1) Inicio de la transmisión (Primeros 2-3 minutos) Saludo breve \u0026ldquo;Hola. Hoy comenzaremos a transmitir el desarrollo paso a paso de una aplicación para crear tarjetas de Año Nuevo en C++.\u0026rdquo; \u0026ldquo;No sé cuántas transmisiones tomará hasta completarlo, pero avanzaremos poco a poco como una serie.\u0026rdquo; \u0026ldquo;Básicamente, trabajaré en silencio, así que espero que puedan verlo como música de fondo (BGM) para trabajar.\u0026rdquo;\nDescripción general de la aplicación deseada \u0026ldquo;En esta aplicación, quiero que sea posible diseñar la parte posterior de la tarjeta de Año Nuevo.\u0026rdquo; \u0026ldquo;Planeamos incorporar la inserción de fotos, arreglos de fuentes y procesamiento de imágenes o generación de ilustraciones usando IA, y finalmente subirla a la Microsoft Store.\u0026rdquo;\nObjetivos de trabajo de hoy \u0026ldquo;Hoy, en la primera sesión, prepararemos el entorno y crearemos la base.\u0026rdquo; \u0026ldquo;Específicamente,\nCrear el repositorio GIT Crear la ventana principal Mostrar el diálogo de información de la versión Crear el menú e implementar el comando de salida Procesamiento de inicialización/liberación de Direct2D y visualización de HelloWorld Me gustaría avanzar con esto.\u0026rdquo;\nSobre la publicación del código fuente \u0026ldquo;El código fuente está publicado en GitHub. Si están interesados, echen un vistazo.\u0026rdquo; → https://github.com/kenjinote/NengaCardApp/\nParte de trabajo (En silencio) Crear repositorio en GitHub → Commit inicial\nCrear plantilla de la ventana principal\nCrear diálogo de versión, menú e implementar comando de salida\nProcesamiento de inicialización y liberación de Direct2D → Confirmar visualización de HelloWorld\nHacer push a GitHub cuando sea apropiado\n※ Básicamente en silencio, agregando explicaciones breves solo cuando sea necesario\nAntes de finalizar la transmisión (Últimos 1-2 minutos) Resumen del progreso de hoy \u0026ldquo;Hoy, creamos el repositorio GIT e implementamos la ventana, el botón de salida y el diálogo de versión.\u0026rdquo; \u0026ldquo;Llegamos hasta mostrar HelloWorld con Direct2D.\u0026rdquo;\nConexión con la próxima vez \u0026ldquo;A partir de la próxima vez, espero avanzar con la organización de la interfaz de usuario, la objetivación de cadenas de texto, etc.\u0026rdquo;\nAnunciar nuevamente el enlace de GitHub → https://github.com/kenjinote/NengaCardApp/\nCierre \u0026ldquo;Gracias por mirar. Continuaremos trabajando de manera constante la próxima vez, así que se los encargo.\u0026rdquo;\n","date":"2025-08-31T20:24:49+09:00","image":"http://kenji.blog/p/%E5%B9%B4%E8%B3%80%E7%8A%B6%E4%BD%9C%E6%88%90%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%E9%85%8D%E4%BF%A1-vol.1/img_hu403d76b87feb7669f72c38243c5cb621_1021075_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E5%B9%B4%E8%B3%80%E7%8A%B6%E4%BD%9C%E6%88%90%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%E9%85%8D%E4%BF%A1-vol.1/","title":"Transmisión de desarrollo de app de tarjetas de Año Nuevo VOL.1 (Guion)"},{"content":"Habilitar la instalación de msix con un certificado autofirmado Al distribuir aplicaciones en Windows, el uso del paquete MSIX es conveniente ya que unifica los mecanismos de instalación y actualización. Sin embargo, MSIX tiene la restricción de requerir un \u0026ldquo;certificado firmado obligatoriamente\u0026rdquo;. En ocasiones, cuando se desea distribuir una aplicación desarrollada por una empresa o un individuo con fines de prueba, \u0026ldquo;comprar un certificado de firma de código comercial puede resultar excesivo\u0026rdquo;.\nAhí es donde resulta útil el certificado autofirmado (Self-Signed Certificate). En este artículo, resumiremos los pasos para adjuntar un certificado autofirmado a un MSIX para permitir su instalación en un entorno local.\n1. Crear un certificado autofirmado Primero, inicie PowerShell en modo administrador y ejecute el siguiente comando.\n1 2 // Crear certificado autofirmado New-SelfSignedCertificate -Type CodeSigningCert -Subject \u0026#34;CN=035A9AAC-915B-4CE1-AE39-1A101BED42F5\u0026#34; -CertStoreLocation Cert:\\CurrentUser\\My -NotAfter (Get-Date).AddYears(10) -KeyUsage DigitalSignature -FriendlyName \u0026#34;kenjinote\u0026#34; Lo que se crea aquí es un certificado para \u0026ldquo;firma de código\u0026rdquo;.\nAsignar un nombre fácil de entender con -FriendlyName facilita su búsqueda posterior. La fecha de vencimiento se puede ajustar con -NotAfter. En esta ocasión, está configurada para 10 años. 2. Exportar el archivo PFX Exporte el certificado creado en formato PFX para poder utilizarlo con signtool.\n1 2 3 4 // Crear pfx $cert = Get-ChildItem Cert:\\CurrentUser\\My | Where-Object { $_.FriendlyName -eq \u0026#34;kenjinote\u0026#34; } $password = ConvertTo-SecureString -String \u0026#34;password\u0026#34; -Force -AsPlainText Export-PfxCertificate -Cert $cert -FilePath \u0026#34;D:\\pfx\\cert.pfx\u0026#34; -Password $password La contraseña configurada en este momento (en el ejemplo, password) será necesaria para la posterior operación de firma.\n3. Instalar el certificado autofirmado en las entidades de certificación raíz de confianza El certificado creado no es confiable para Windows por defecto. Para instalarlo, debe importarse desde certmgr.msc en [Entidades de certificación raíz de confianza] → [Certificados].\nSi importa el certificado exportado (.cer o .pfx), se tratará como un certificado de confianza en la PC de destino. Con esto, no aparecerá la advertencia de \u0026ldquo;certificado no confiable\u0026rdquo; al firmar el MSIX.\n4. Firmar el instalador (MSIX) Finalmente, utilice el certificado PFX creado para firmar el MSIX. signtool está incluido en Visual Studio o Windows SDK.\n1 2 // Firmar el instalador signtool sign /fd SHA256 /f \u0026#34;D:\\pfx\\cert.pfx\u0026#34; /p \u0026#34;password\u0026#34; \u0026#34;C:\\installer\\installer.msix\u0026#34; /fd SHA256 especifica el algoritmo de firma. /f especifica el archivo PFX y /p proporciona la contraseña. Finalmente, especifique la ruta del archivo MSIX. Si la ruta de signtool no está configurada, especifique la ruta completa. En mi entorno, se encontraba en la siguiente ubicación: 1 \u0026#34;C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages\\microsoft.windows.sdk.buildtools\\10.0.26100.1742\\bin\\10.0.26100.0\\x64\\signtool.exe\u0026#34; Con esto, la firma se ha completado y el MSIX instalable en la PC de destino está listo.\nResumen Crear un certificado autofirmado con New-SelfSignedCertificate Exportar el PFX con Export-PfxCertificate Instalar el certificado en las Entidades de certificación raíz de confianza Firmar el MSIX con signtool Si comprende este flujo, podrá realizar pruebas de funcionamiento y distribuciones de prueba en un entorno local sin comprar un certificado comercial. Por supuesto, para la distribución comercial real, un certificado emitido por una autoridad de certificación es obligatorio, pero este método es muy útil en las etapas de desarrollo y verificación.\n👉 En esta ocasión usamos installer.msix como ejemplo, pero el mismo procedimiento se puede aplicar a aplicaciones de desarrollo propio.\n","date":"2025-08-30T04:18:04+09:00","image":"http://kenji.blog/p/msix%E3%81%AB%E8%87%AA%E5%B7%B1%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%92%E3%81%A4%E3%81%91%E3%81%A6%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B/img_hu193aeacbbfca091956fdf9aac7d139a2_495432_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/msix%E3%81%AB%E8%87%AA%E5%B7%B1%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%92%E3%81%A4%E3%81%91%E3%81%A6%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B/","title":"Habilitar la instalación de msix con un certificado autofirmado"},{"content":"Herramientas para aquellos que \u0026ldquo;no pueden escribir código, pero tienen lógica\u0026rdquo;. La razón por la que creé LogicPad. Hola, soy kenji. Soy el creador de la herramienta low-code \u0026ldquo;LogicPad\u0026rdquo;. Esta vez no voy a presentar el producto, sino que me gustaría escribir desde una perspectiva un poco más personal sobre los entresijos de su desarrollo, \u0026ldquo;¿por qué decidí crear esto?\u0026rdquo;, y mis propios pensamientos.\nPara ser honesto, esto no fue un simple desarrollo de herramientas. Mi pasado, mis frustraciones en el trabajo, mis habilidades, y ese deseo latente de \u0026ldquo;algún día crear mi propio producto\u0026rdquo; \u0026ndash; Todos estos factores se combinaron, y el resultado fue la creación de LogicPad.\nEn otras palabras, este es también mi \u0026ldquo;proyecto culminante de vida\u0026rdquo;. Voy a escribir sobre estos antecedentes lo más sinceramente y con toda la pasión posible.\nQuería un producto del cual pudiera decir con orgullo, \u0026ldquo;Yo lo creé\u0026rdquo; Para ser sincero, esta fue mi motivación inicial.\nDesde hace mucho tiempo, me gustaba escribir código, ya fuera por trabajo o por afición. He participado en varios desarrollos. Pero un día, de repente, me di cuenta. \u0026ldquo;No tengo un producto que haya lanzado al mundo bajo mi propio nombre y responsabilidad\u0026rdquo;.\nPor supuesto, hay valor en las cosas que creas en equipo, y también tuve muchos trabajos de los que me siento orgulloso. Pero en el fondo, sentía un vacío pensando, \u0026ldquo;¿Terminaré mi carrera bajo el nombre de otra persona?\u0026rdquo;.\nSolo una vez. Quiero dejar algo de lo que pueda decir con orgullo, \u0026ldquo;Esto lo creé yo\u0026rdquo;. Con ese pensamiento, comencé a desarrollar el concepto de LogicPad. Fue hace unos 6 años (alrededor de 2019). (La idea original en sí se remonta a unos 10 años, alrededor de 2015, cuando conocí Blueprints, el lenguaje de programación visual de Unreal Engine).\nNo poder intentar algo por no saber escribir código. ¿No es un desperdicio? En mi trabajo, había mucha gente brillante.\nPodían construir lógica. Dominaban las funciones de Excel a voluntad y podían identificar la esencia de un problema. Pero\u0026hellip; se detenían en la etapa de \u0026ldquo;escribir código\u0026rdquo;.\n\u0026ldquo;Este trabajo, lo hago cada vez siguiendo un manual, ¿no se podría automatizar?\u0026rdquo; \u0026ldquo;Sí, se puede. Pero\u0026hellip; para eso hay que escribir código\u0026hellip;\u0026rdquo;\nTuvimos esa conversación muchas veces.\nCada vez que pasaba, pensaba: \u0026ldquo;Es una verdadera lástima que se detengan ante el muro del código a pesar de entender la lógica\u0026rdquo;.\nLa opción de un editor low-code De hecho, en mi trabajo anterior, estaba desarrollando un CAD 2D operado mediante GUI. En CAD, usas el ratón para ensamblar formas, ¿verdad? En otras palabras, es un mundo donde \u0026ldquo;construyes lógica a través de operaciones\u0026rdquo;.\nPensé, \u0026ldquo;Esto encaja perfectamente con el low-code\u0026rdquo;.\nYendo aún más atrás, desde mis días de estudiante, he estado escribiendo pequeños programas cada vez que se me ocurría algo, como procesamiento de imágenes, procesamiento numérico, herramientas de Windows, herramientas de publicación automática en redes sociales, etc. Creo que tengo más de 600. Todavía están en mi GitHub.\nEn aquel entonces, no pensaba en el significado de esto. Simplemente \u0026ldquo;los creaba porque quería\u0026rdquo;. Eso era todo.\nPero ahora, mientras desarrollo LogicPad\u0026hellip;\nSiento como si los puntos finalmente se hubieran conectado para formar una línea.\nFácil de usar, pero potente. La dificultad del equilibrio Mientras avanzaba en el desarrollo, lo que siempre tuve en mente fue \u0026ldquo;hacer una herramienta que fuera intuitiva de usar, y a la vez, verdaderamente poderosa\u0026rdquo;.\nSi agregas funciones, puedes hacer más cosas. Pero se vuelve difícil de usar. Si lo haces simple, cualquiera puede usarlo. Pero entonces, habrá gente a la que le parezca insuficiente.\nPara que no digan, \u0026ldquo;¿Las herramientas low-code son solo juguetes?\u0026rdquo;. Pero también para que no digan, \u0026ldquo;Al final, si no escribes código, no sirve de nada\u0026rdquo;.\nEstuve luchando todo el tiempo en esa delgada línea entre la intuición y la expresividad.\nRehice la interfaz de usuario muchas veces, la descarté muchas veces, y cuando finalmente me acerqué a una forma en la que pensé, \u0026ldquo;Esto puede funcionar\u0026rdquo;, me sentí realmente feliz.\nMe salvó la palabra de la primera \u0026ldquo;usuaria\u0026rdquo; La primera persona a la que le di LogicPad fue a una ex colega. No se le daban bien las TI, y le asustaba el código. Pero era buena con la lógica.\nLe expliqué un poco y dejé que lo probara\u0026hellip; Las palabras que dijo unos minutos después, aún no las puedo olvidar.\n\u0026quot;¡Con esto, creo que yo también podría hacerlo!\u0026quot;\nCasi lloro. Esto era exactamente lo que quería ofrecer.\nNo una herramienta que funciona, sino la sensación de \u0026ldquo;¡Lo hice yo mismo!\u0026rdquo;. Me convencí de que ese es el verdadero valor de LogicPad.\nCuando más gente pueda crear, la sociedad será mucho más interesante Realmente creo que la \u0026ldquo;democratización de la tecnología\u0026rdquo; es importante.\nLa tecnología tiene el poder de cambiar el mundo. Pero las personas que pueden manejarla son limitadas.\n¿Qué pasaría si pudieras crear aplicaciones solo con \u0026ldquo;entender la lógica\u0026rdquo;?\nMás personas podrían pasar al \u0026ldquo;lado de los creadores\u0026rdquo;. Y creo que lo que nazca de ahí superará nuestra imaginación actual.\nSi LogicPad pudiera ser esa puerta de entrada. Quiero que sea una herramienta que transforme el \u0026ldquo;quiero intentar crear\u0026rdquo; en \u0026ldquo;puedo crear\u0026rdquo;.\nEse es mi deseo.\nPara terminar LogicPad todavía está en versión beta y no está terminado. Todavía hay muchas cosas que mejorar y que quiero hacer.\nPero, he volcado todos los \u0026ldquo;puntos\u0026rdquo; de mi vida en esta herramienta. Ahora puedo decirlo con orgullo.\n\u0026ldquo;Este es el producto que yo creé.\u0026rdquo;\n👇 Extra: Lo que puedes hacer con LogicPad Construir procesos arrastrando y soltando Manejar bifurcaciones condicionales, variables, etc. en una GUI Preparado con diversos nodos de integración con IA Posibilidad de expansión para usuarios avanzados insertando scripts Funciones matemáticas y procesamiento de datos de alta precisión (cálculos numéricos de precisión infinita, etc.) Amplia gama de atajos de teclado para usuarios avanzados Soporta más de 90 idiomas Lo que quiero hacer a continuación Generar lógica a partir de lenguaje natural colaborando con IA Un sistema donde los usuarios puedan crear nodos personalizados Construir una plataforma para compartir nodos y lógicas creadas ✍️ Epílogo Muchas gracias por leer hasta aquí. Este no fue un simple desarrollo de herramientas, sino un desafío en el que volqué mi propia experiencia, pasión y fragmentos de mi vida.\n\u0026ldquo;No puedo escribir código, pero tengo lógica.\u0026rdquo; Un futuro donde esas personas \u0026ldquo;puedan crear\u0026rdquo; por sí mismas. Eso es lo que quiero seguir buscando a través de LogicPad.\nSi al menos logré que pensaras \u0026ldquo;me gustaría usarlo\u0026rdquo;, con eso ya me siento muy feliz. Si estás interesado, no dudes en probar LogicPad.\nY si lo pruebas, agradecería cualquier comentario o cosa que notes, sin importar cuán pequeña sea. Tu voz será una gran fuerza para dar el siguiente paso en este producto.\nEspero seguir contando con tu apoyo.\n","date":"2025-07-30T23:51:35+09:00","image":"http://kenji.blog/p/logicpad-%E9%96%8B%E7%99%BA%E7%A7%98%E8%A9%B1/img_hu2f3df13f20424b87da3515770faf1b1c_1676910_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/logicpad-%E9%96%8B%E7%99%BA%E7%A7%98%E8%A9%B1/","title":"La historia secreta del desarrollo de LogicPad"},{"content":"Cómo eliminar de forma masiva metadatos (información personal) de Excel, Word, etc. con PowerShell Los archivos de Office como Excel guardan automáticamente \u0026ldquo;metadatos (información personal)\u0026rdquo; como el autor, la persona que lo modificó por última vez, el nombre de la empresa, etc. Hay muchos casos en los que se desea eliminar esta información, como al compartir archivos fuera de la empresa.\nEn este artículo, explicaremos en detalle cómo eliminar metadatos de Excel usando PowerShell, enfocándonos en el procesamiento por lotes en una carpeta ** y su ** aplicación a otros archivos de Office como Word y PowerPoint.\n1. Eliminar los metadatos de un solo archivo de Excel Este es el script más básico para eliminar la información personal de un solo archivo de Excel. Llama al objeto COM de Excel, establece la propiedad RemovePersonalInformation en $true y guarda los cambios sobrescribiendo el archivo.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 # Iniciar la aplicación Excel de forma oculta $excel = New-Object -ComObject Excel.Application $excel.Visible = $false $excel.DisplayAlerts = $false # Abrir el archivo (*Especificar ruta absoluta) $filePath = \u0026#34;C:\\Path\\To\\Your\\File.xlsx\u0026#34; $wb = $excel.Workbooks.Open($filePath) # Habilitar la configuración para eliminar metadatos (información personal) $wb.RemovePersonalInformation = $true # Guardar sobrescribiendo y cerrar $wb.Save() $wb.Close($false) # Cerrar Excel y liberar memoria $excel.Quit() [System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null Nota: La ruta que se pasa a Workbooks.Open() debe ser siempre una ** ruta absoluta (ruta completa)**. El uso de rutas relativas puede causar errores.\n2. Procesar todos los archivos de Excel en una carpeta en masa En la práctica, habrá muchos casos en los que se desee \u0026ldquo;eliminar los metadatos de docenas de archivos de Excel en una carpeta específica a la vez\u0026rdquo;. Esto se puede lograr combinando Get-ChildItem con un bucle.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 $targetFolder = \u0026#34;C:\\Path\\To\\Your\\Folder\u0026#34; # Obtener todos los archivos .xlsx y .xls en la carpeta $excelFiles = Get-ChildItem -Path $targetFolder -Include \u0026#34;*.xlsx\u0026#34;, \u0026#34;*.xls\u0026#34; -Recurse if ($excelFiles.Count -eq 0) { Write-Host \u0026#34;No se encontraron archivos de Excel.\u0026#34; exit } $excel = New-Object -ComObject Excel.Application $excel.Visible = $false $excel.DisplayAlerts = $false foreach ($file in $excelFiles) { Write-Host \u0026#34;Eliminando metadatos de $($file.Name)...\u0026#34; # Abrir el archivo $wb = $excel.Workbooks.Open($file.FullName) # Eliminar metadatos y guardar sobrescribiendo $wb.RemovePersonalInformation = $true $wb.Save() $wb.Close($false) } $excel.Quit() [System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null Write-Host \u0026#34;¡Todo el procesamiento ha finalizado!\u0026#34; 3. Eliminar metadatos de otros archivos de Office (Word / PowerPoint) Los metadatos se pueden eliminar no solo en Excel, sino también en Word y PowerPoint utilizando exactamente la misma lógica. Lo único que cambia es el nombre del objeto COM que se llama; la propiedad RemovePersonalInformation es común en todos.\nPara Word 1 2 3 4 5 6 7 8 9 10 11 $word = New-Object -ComObject Word.Application $word.Visible = $false $word.DisplayAlerts = 0 $doc = $word.Documents.Open(\u0026#34;C:\\Path\\To\\Your\\File.docx\u0026#34;) $doc.RemovePersonalInformation = $true $doc.Save() $doc.Close() $word.Quit() [System.Runtime.Interopservices.Marshal]::ReleaseComObject($word) | Out-Null Para PowerPoint En el caso de PowerPoint, la configuración de la propiedad RemovePersonalInformation es la misma, pero el comportamiento del inicio oculto es un poco diferente.\n1 2 3 4 5 6 7 8 9 10 $ppt = New-Object -ComObject PowerPoint.Application # Abrir especificando el modo oculto (msoFalse), etc. del segundo al cuarto argumento $presentation = $ppt.Presentations.Open(\u0026#34;C:\\Path\\To\\Your\\File.pptx\u0026#34;, $false, $false, $false) $presentation.RemovePersonalInformation = $true $presentation.Save() $presentation.Close() $ppt.Quit() [System.Runtime.Interopservices.Marshal]::ReleaseComObject($ppt) | Out-Null Resumen Aprovechando PowerShell y los objetos COM, puede automatizar completamente la eliminación de metadatos de archivos de Office. Para evitar la filtración accidental de información confidencial o nombres personales, es muy útil tener a mano un script de procesamiento por lotes para carpetas antes de entregar los archivos.\n","date":"2025-07-30T02:42:40+09:00","image":"http://kenji.blog/p/powershell-%E3%81%A7-excel-%E3%81%AE%E3%83%A1%E3%82%BF%E3%83%87%E3%83%BC%E3%82%BF%E5%80%8B%E4%BA%BA%E6%83%85%E5%A0%B1%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/powershell_metadata_eyecatch_1788588033601_hud95a00206aa1dcf32de9cdc0ccb17972_952041_120x120_fill_q75_box_smart1.jpg","permalink":"http://kenji.blog/es/p/powershell-%E3%81%A7-excel-%E3%81%AE%E3%83%A1%E3%82%BF%E3%83%87%E3%83%BC%E3%82%BF%E5%80%8B%E4%BA%BA%E6%83%85%E5%A0%B1%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"Cómo eliminar de forma masiva metadatos (información personal) de Excel, Word, etc. con PowerShell"},{"content":"¡La conjetura de Kepler explicada de forma sencilla! 〜La mejor forma de empaquetar sandías〜 ¡Hola, soy kenji!\nHoy me gustaría explicar de la forma más sencilla posible una historia matemática con un nombre que suena un poco difícil: \u0026ldquo;La conjetura de Kepler\u0026rdquo;.\nA primera vista, parece un tema muy específico para aficionados, pero también es un problema bastante cotidiano: \u0026ldquo;¿Cómo podemos empaquetar sandías en una caja de la manera más compacta posible?\u0026rdquo;. Tiene que ver con las neveras de las tiendas de conveniencia y también con cómo se apila la carga.\nY, en el mundo de las matemáticas, esta es una historia súper romántica porque ¡no se pudo demostrar durante más de 400 años!.\n¡Vamos a ello!\nPara empezar, ¿quién es Kepler? Primero, ¿quién es el \u0026ldquo;Kepler\u0026rdquo; de la \u0026ldquo;conjetura de Kepler\u0026rdquo;?\nEs el nombre de Johannes Kepler, un astrónomo y matemático alemán.\nEste hombre fue increíble. Por ejemplo, fue él quien descubrió que las órbitas de los planetas son elípticas. Hoy en día es un conocimiento básico, pero en aquella época (alrededor del año 1600) era una época en la que ni siquiera se creía firmemente en el heliocentrismo.\nGalileo = Genio de la observación Kepler = Genio que explicó el universo con fórmulas matemáticas Newton = Súper genio que resumió esa teoría en leyes físicas En ese sentido, Kepler fue un pionero en \u0026ldquo;explicar el universo con fórmulas matemáticas\u0026rdquo;.\nY así, un día, él planteó lo siguiente.\n¿Qué es la conjetura de Kepler? La \u0026ldquo;conjetura de Kepler\u0026rdquo;, en pocas palabras, es esto:\nCuando empaquetas esferas del mismo tamaño (sandías o naranjas) en una caja, ¿qué disposición permite empaquetarlas de la manera más compacta?\nEse es el problema.\nY lo que Kepler conjeturó en la década de 1600 fue:\nIgual que cuando se apilan las naranjas en la frutería, apilarlas en forma de triángulo, ¿no es lo más eficiente?\nA esto se le llama en matemáticas el \u0026ldquo;problema del empaquetamiento de esferas\u0026rdquo;, que busca la forma de empaquetar esferas de la manera más densa en el espacio.\nKepler predijo que una disposición llamada \u0026ldquo;estructura cúbica centrada en las caras (FCC)\u0026rdquo; (algo así como apilar sandías en forma de triángulo) era la más eficiente.\nY, bueno, todos pensaban \u0026ldquo;sí, parece que es así\u0026rdquo;, pero demostrar matemáticamente que \u0026ldquo;¡definitivamente es la mejor!\u0026rdquo; era extremadamente difícil.\n¡¿400 años hasta la demostración?! Entonces, ¿cuándo se demostró realmente?\nIncreíblemente, fue alrededor de 1998 a 2005. Es decir, nadie pudo demostrarlo en casi 400 años. Una locura.\nAdemás, quien lo demostró fue el matemático estadounidense Thomas Hales.\nÉl dedujo que era imposible hacerlo solo a mano y utilizó computadoras para la demostración. Sin embargo, surgió un problema: ¡la demostración era tan compleja que los humanos no podían verificarla correctamente!\nPor eso, en el mundo de las matemáticas, se desató un gran debate: \u0026ldquo;Entonces, ¿podemos confiar realmente en algo demostrado con una computadora?\u0026rdquo;.\nFinalmente, la demostración (oficialmente llamada \u0026ldquo;demostración formal\u0026rdquo;) de que \u0026ldquo;¡ha sido verificado estrictamente incluyendo la computadora!\u0026rdquo; se completó en 2014.\nEn otras palabras, pasaron más de 400 años hasta que se demostró que la intuición de Kepler era correcta. Qué romántico.\nTambién se utiliza mucho en la vida real Uno pensaría que \u0026ldquo;cómo apilar esferas\u0026rdquo; es algo que solo interesa a los frikis de las matemáticas, pero en realidad es súper práctico.\nPara empacar eficientemente las bebidas en las neveras de las tiendas de conveniencia Al apilar latas en palés de transporte También se aplica en las comunicaciones (como en la compresión de señales digitales) Se usa en impresoras 3D y en el diseño de estructuras cristalinas Y muchas más, de hecho es una teoría que se usa muchísimo detrás de nuestra vida cotidiana.\nConclusión: La intuición humana es asombrosa En fin, para resumir:\nConjetura de Kepler = ¿Cómo empaquetar esferas de la manera más compacta? Kepler = Matemático y astrónomo que descubrió la órbita de los planetas ¡Se conjeturó en el siglo XVII! ¡Pero se demostró en el siglo XXI! ¡Tiene muchas aplicaciones en la vida real! Y lo más interesante de todo es: \u0026ldquo;La forma de apilar que los fruteros hacían por intuición, también era la mejor matemáticamente.\u0026rdquo;\nEn otras palabras, la intuición humana es asombrosa. Y que puede tomar 400 años demostrarlo, es una historia verdaderamente romántica.\nSi te interesa, busca sobre \u0026ldquo;Thomas Hales\u0026rdquo;, \u0026ldquo;demostración formal\u0026rdquo; o \u0026ldquo;Sphere Packing\u0026rdquo;. Si profundizas en el tema, es súper interesante.\n¡Hasta luego!\n[PR]\nComprar ahora ","date":"2025-07-21T22:53:03+09:00","image":"http://kenji.blog/p/%E3%82%B1%E3%83%97%E3%83%A9%E3%83%BC%E4%BA%88%E6%83%B3%E3%82%92%E3%82%8F%E3%81%8B%E3%82%8A%E3%82%84%E3%81%99%E3%81%8F%E8%A7%A3%E8%AA%AC/img_huc7f0a2c79b029796989bdbbe22e755bc_619919_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E3%82%B1%E3%83%97%E3%83%A9%E3%83%BC%E4%BA%88%E6%83%B3%E3%82%92%E3%82%8F%E3%81%8B%E3%82%8A%E3%82%84%E3%81%99%E3%81%8F%E8%A7%A3%E8%AA%AC/","title":"La conjetura de Kepler explicada de forma sencilla"},{"content":"La barrera del desarrollo de IA 〜Llegué a la octava estación, pero a partir de ahí fue un infierno〜\nHola, soy kenji.\nÚltimamente, escucho mucho decir: \u0026ldquo;¡Le pedí a la IA que hiciera una aplicación y la hizo!\u0026rdquo;. Hemos superado la era de no-code y low-code, y estamos entrando en una fase como de \u0026ldquo;programación por vibras\u0026rdquo; (escribir código por intuición).\nPor ejemplo, si le dices: \u0026ldquo;Hazme una aplicación que pueda editar fotos y publicarlas en redes sociales\u0026rdquo;, la IA escupe el código e incluso la interfaz de usuario (UI). Increíble, ya no necesitamos a los humanos, ¿verdad? Eso es lo que uno piensa.\nPero, ¿saben? Eso es como aterrizar en la octava estación del Monte Fuji en sandalias.\nHasta la octava estación parece un \u0026ldquo;paseo\u0026rdquo; Desarrollar con IA es realmente fácil al principio. ¿Entrada/Salida de archivos (File IO)? Funciona por ahora. ¿Red? Bueno, se conecta. ¿Base de datos? Con JSON es suficiente. ¿UI? ChatGPT me dio el código en React. ¿Pagos? Con copiar y pegar la API de Stripe basta.\nAquí es donde te haces la ilusión de: \u0026ldquo;¿Acaso ya soy ingeniero?\u0026rdquo;. Pero el verdadero infierno comienza a partir de aquí.\n¿Por qué nos atascamos? La razón es simple: \u0026ldquo;La IA hace que parezca terminado, pero los ajustes finales recaen en los humanos\u0026rdquo;.\nLos datos se pierden en la entrada/salida de archivos (File IO). La normalización de la base de datos es deficiente y las búsquedas son lentas. La interfaz de usuario no es intuitiva. No se hicieron pruebas de carga, por lo que colapsa con el tráfico concentrado. Es rechazada en la revisión de Apple/Google. Viola requisitos legales y causa polémica (o casi). En resumen, la IA es buena para crear prototipos que \u0026ldquo;parecen productos terminados\u0026rdquo;, pero convertirlos en un producto real que funcione en el mundo sigue siendo, hoy por hoy, un trabajo para humanos.\nPero hay una paradoja Aquí notamos una paradoja.\n¿Qué pasaría si en el futuro la IA realmente pudiera hacerlo todo? Es decir, ¿qué pasaría si \u0026ldquo;la seguridad, la facturación y el diseño fueran procesados perfectamente por la IA\u0026rdquo;?\nEn ese momento, la necesidad misma de que la humanidad cree aplicaciones podría desaparecer.\nPorque si los usuarios pueden decirle directamente a la IA \u0026ldquo;quiero hacer esto\u0026rdquo;, la tarea se ejecutará al instante sin necesidad de una aplicación.\n🌀 Por ejemplo Antes, abríamos la aplicación de la calculadora para hacer un cálculo, ahora, solo decimos: \u0026ldquo;Oye Siri, ¿cuánto es 12 por 32?\u0026rdquo; y listo.\nDe la misma manera, si decimos \u0026ldquo;IA, edita esta foto y compártela\u0026rdquo;, el proceso podría completarse sin siquiera pasar por la UI o la API de una aplicación.\nEn otras palabras, cuando se alcance el objetivo de \u0026ldquo;crear aplicaciones con IA\u0026rdquo;, podría llegar un mundo donde las aplicaciones en sí mismas ya no sean necesarias.\nAl final, lo que podemos hacer ahora Entonces, ¿qué debemos hacer?\nComo la \u0026ldquo;zona por encima de la octava estación\u0026rdquo; sigue siendo dominio humano, debemos perfeccionarnos ahí. Concentrarnos en la comprensión esencial del usuario y el diseño de servicios. Pensar más en \u0026ldquo;lo que es valioso\u0026rdquo; que en \u0026ldquo;lo que se puede crear\u0026rdquo;. Más bien, buscar formas de proporcionar valor que \u0026ldquo;no se limiten al formato de una aplicación\u0026rdquo;. La IA es una herramienta, un ascensor y, a veces, un competidor. Pero, \u0026ldquo;qué crear\u0026rdquo; y \u0026ldquo;por qué crearlo\u0026rdquo; siguen siendo preguntas para nosotros, los humanos.\nConclusión: La barrera del desarrollo de IA no es la tecnología, sino una paradoja estructural.\nEs una era en la que cualquiera puede llegar a la octava estación del Monte Fuji. Pero a partir de ahí empieza lo de verdad.\nY, para cuando lleguemos a la cima, tal vez nos espere un futuro en el que nos preguntemos: \u0026ldquo;¿De verdad era necesario escalar la montaña?\u0026rdquo;.\n","date":"2025-07-20T21:52:42+09:00","image":"http://kenji.blog/p/ai%E9%96%8B%E7%99%BA%E3%81%AE%E5%A3%81/img_1_hu929f602c53dcc1c0d00e8a53b025b29e_1978511_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/ai%E9%96%8B%E7%99%BA%E3%81%AE%E5%A3%81/","title":"La barrera del desarrollo de IA"},{"content":"🎯 Cómo llamar a Microsoft.Windows.AI desde C++ 【Con código de ejemplo】 A partir de Windows 10, Windows incluye de forma estándar un **runtime capaz de ejecutar modelos de IA en formato ONNX . Este es ** Windows ML (Windows.AI.MachineLearning).\nEn este artículo, explicaremos detalladamente con código de ejemplo ** cómo llamar a Microsoft.Windows.AI.MachineLearning desde ** C++ (basado en aplicaciones Win32).\n✅ Preparación ◾ Entorno necesario Windows 10 (1809+) o Windows 11 Visual Studio 2019 o posterior (la versión Community está bien) Soporte para C++/WinRT (Microsoft.Windows.CppWinRT) Windows SDK 10.0.17763.0 o superior ✅ Configuración del proyecto Cree un proyecto con la siguiente configuración en Visual Studio.\nTipo: Aplicación de escritorio de Windows en C++ (Proyecto vacío)\nSubsistema: Windows (WinMain)\nAgregue el siguiente paquete desde NuGet\n1 Microsoft.Windows.CppWinRT ✅ Código de ejemplo A continuación se muestra un ejemplo de configuración mínima que combina la API de Win32 y Windows.AI.MachineLearning utilizando WinMain.\n※ Nota: El modelo ONNX a utilizar será model.onnx y debe colocarse en la misma carpeta que el archivo ejecutable.\nmain.cpp 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 #include \u0026lt;windows.h\u0026gt; #include \u0026lt;winrt/Windows.AI.MachineLearning.h\u0026gt; #include \u0026lt;winrt/Windows.Storage.h\u0026gt; #pragma comment(lib, \u0026#34;windowsapp\u0026#34;) // Para enlazar con WinRT using namespace winrt; using namespace Windows::AI::MachineLearning; using namespace Windows::Storage; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow) { // Inicialización de WinRT (MTA o STA están bien) winrt::init_apartment(); try { // Cargar el archivo del modelo auto modelFile = StorageFile::GetFileFromPathAsync(L\u0026#34;model.onnx\u0026#34;).get(); LearningModel model = LearningModel::LoadFromStorageFileAsync(modelFile).get(); // Crear una sesión LearningModelSession session(model); LearningModelBinding binding(session); // Entrada/salida del modelo (aquí se asume una entrada vacía) // En la práctica, es necesario vincular con TensorFloat, etc. // Ejecutar inferencia auto result = session.EvaluateAsync(binding, L\u0026#34;\u0026#34;).get(); MessageBox(nullptr, L\u0026#34;La inferencia se ha completado\u0026#34;, L\u0026#34;Windows ML (C++)\u0026#34;, MB_OK); } catch (winrt::hresult_error const\u0026amp; ex) { MessageBox(nullptr, ex.message().c_str(), L\u0026#34;Error\u0026#34;, MB_ICONERROR); } return 0; } ✅ Complemento: Cómo especificar los Tensores de entrada y salida Dependiendo del modelo, es necesario crear y vincular un Tensor antes de la inferencia.\nEjemplo:\n1 2 3 4 5 6 7 8 // Convertir un arreglo de float unidimensional a Tensor std::vector\u0026lt;float\u0026gt; inputData = {0.5f, 0.3f, 0.2f}; std::vector\u0026lt;int64_t\u0026gt; shape = {1, 3}; // Forma: [1, 3] auto tensor = TensorFloat::CreateFromArray(shape, inputData); // Vinculación de entrada (coincidir con el nombre de entrada del modelo) binding.Bind(L\u0026#34;input_0\u0026#34;, tensor); La salida se puede obtener de manera similar con result.Outputs().Lookup(L\u0026quot;output_0\u0026quot;).\n✅ Puntos a tener en cuenta al depurar Si el archivo del modelo no existe en la carpeta de ejecución, se producirá un FileNotFoundException. Si los nombres de entrada y salida no coinciden, se producirá un error invalid_argument. Las especificaciones exactas de E/S del modelo se pueden verificar con herramientas como Netron. ✅ Resumen Elemento Detalle API utilizada Windows.AI.MachineLearning (WinRT) Lenguaje C++ (basado en Win32) Método recomendado A través de las cabeceras C++/WinRT Ventajas Los modelos ONNX funcionan de forma nativa, también soportan GPU Precaución Prestar atención a los nombres de entrada del modelo y la forma del Tensor ✅ Alternativa: Para los que no quieren usar WinRT Si utiliza ONNX Runtime de Microsoft, puede manejar modelos ONNX desde C++ completamente sin WinRT. Es multiplataforma, lo que permite un código común incluso en Windows/Linux. 📌 Conclusión Windows ML (Microsoft.Windows.AI) es un motor de inferencia de IA potente que se puede utilizar perfectamente incluso desde C++. Si necesita realizar inferencias de forma nativa en Windows, no dude en probarlo.\nSi desea ejemplos específicos sobre cómo crear modelos ONNX o vincular tensores, ¡planeamos explicarlos en un artículo de seguimiento!\n","date":"2025-07-19T10:03:51+09:00","image":"http://kenji.blog/p/c-%E3%81%8B%E3%82%89microsoft.windows.ai%E3%82%92%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%99%E6%96%B9%E6%B3%95/img_hub9c7b00735e02a7f33c50dd8006e2228_376811_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/c-%E3%81%8B%E3%82%89microsoft.windows.ai%E3%82%92%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%99%E6%96%B9%E6%B3%95/","title":"Cómo llamar a Microsoft.Windows.AI desde C++"},{"content":"✅ Configuración de TinyLLaMA × C++ (usando llama.cpp) 🔧 Paso 1: Preparar llama.cpp 1-1. Entorno necesario (mínimo) SO: Windows / Linux / macOS Entorno de desarrollo: g++ / clang / MSVC Git / CMake 1-2. Obtener y compilar llama.cpp 1 2 3 4 5 6 git clone https://github.com/ggerganov/llama.cpp cd llama.cpp mkdir build cd build cmake .. cmake --build . --config Release En Windows, es más fácil usar Visual Studio Developer Command Prompt y ejecutar cmake --build . --config Release.\n📦 Paso 2: Descargar y convertir el modelo TinyLLaMA 2-1. Obtener el modelo original de HuggingFace Ejemplo: TinyLLaMA-1.1B\n1 2 3 4 5 6 7 # Instalar transformers para descargar si es necesario pip install transformers huggingface_hub python3 -m transformers.models.llama.convert_llama_weights_to_hf \\ --input_dir ./TinyLlama-1.1B-Chat \\ --model_size 1B \\ --output_dir ./hf_model Este paso es para convertir al formato de Hugging Face.\n2-2. Convertir al formato GGUF (para llama.cpp) 1 2 cd llama.cpp python3 convert.py ./hf_model --outfile tinyllama.gguf 2-3. Cuantización del modelo (reducción de tamaño) 1 ./quantize ./tinyllama.gguf ./tinyllama-q4.gguf q4_0 q4_0 es cuantización de 4 bits. El tamaño del modelo se reducirá a aproximadamente 350 MB.\n🧪 Paso 3: Llamar al modelo desde C++ (Ejemplo de código) 3-1. Código C++ simple (Inferencia) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 #include \u0026#34;llama.h\u0026#34; #include \u0026lt;iostream\u0026gt; int main() { llama_model_params model_params = llama_model_default_params(); llama_context_params ctx_params = llama_context_default_params(); llama_model *model = llama_load_model_from_file(\u0026#34;tinyllama-q4.gguf\u0026#34;, model_params); llama_context *ctx = llama_new_context_with_model(model, ctx_params); std::string prompt = \u0026#34;El usuario dice que quiere leer datos de Excel, filtrarlos y guardarlos. ¿Cuál es la configuración de los nodos?\u0026#34;; llama_batch batch = llama_batch_init(512, 0, 1); llama_token BOS = llama_token_bos(model); batch.token[0] = BOS; // Tokenización std::vector\u0026lt;llama_token\u0026gt; tokens(prompt.size() + 8); int n = llama_tokenize(model, prompt.c_str(), tokens.data(), tokens.size(), true); tokens.resize(n); for (size_t i = 0; i \u0026lt; tokens.size(); ++i) { batch.token[i + 1] = tokens[i]; } batch.n_tokens = tokens.size() + 1; llama_decode(ctx, batch); // Obtener resultados de inferencia for (int i = 0; i \u0026lt; 50; ++i) { llama_token next = llama_sample_token(ctx, nullptr); std::cout \u0026lt;\u0026lt; llama_token_to_str(model, next); llama_batch next_batch = llama_batch_init(1, 0, 1); next_batch.token[0] = next; next_batch.n_tokens = 1; llama_decode(ctx, next_batch); } llama_free(ctx); llama_free_model(model); return 0; } 🧱 Paso 4: Método de compilación (Ejemplo) 1 g++ -I./llama.cpp main.cpp ./llama.cpp/build/libllama.a -o tiny_infer -pthread -std=c++11 libllama.a se crea en el directorio build/ después de compilar.\n✅ Ejemplo de estructura del producto final (Organizado) 1 2 3 4 5 6 my_app/ ├── tinyllama-q4.gguf # Modelo cuantizado (~350MB) ├── main.cpp # Código C++ anterior ├── llama.cpp/ # Código fuente de llama.cpp └── build/ └── libllama.a # Biblioteca compilada 🧠 Notas adicionales para aplicar a tu caso de uso Tener código en C++ que reciba la salida y compare y seleccione plantillas de nodos. Ejemplo: Si contiene \u0026ldquo;Excel\u0026rdquo;, \u0026ldquo;filtro\u0026rdquo; y \u0026ldquo;guardar\u0026rdquo; → Generar los nodos correspondientes. Esta parte puede ser tan simple como sentencias if + lectura de plantilla JSON. 📌 Resumen Elemento Descripción Modelo recomendado TinyLLaMA-1.1B-Chat v1.0 (GGUF + Cuantización) Tamaño ~350-450MB (Cuantización 4bit) Integración C++ Posible usando llama.cpp, casi sin dependencias externas Capacidad de procesamiento Suficiente para comprensión de intención simple y generación de salida (texto natural → configuración) Extensibilidad Se puede combinar con el llenado de ranuras (slots) y llamadas a plantillas para crear una IA de generación de nodos ","date":"2025-07-19T09:40:53+09:00","image":"http://kenji.blog/p/tinyllama-%E3%82%92-c-%E3%81%8B%E3%82%89%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%9B%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B%E6%89%8B%E9%A0%86llama.cpp%E4%BD%BF%E7%94%A8/img_huf78e5769214ace33fee09d1baa98793b_1915663_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/tinyllama-%E3%82%92-c-%E3%81%8B%E3%82%89%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%9B%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B%E6%89%8B%E9%A0%86llama.cpp%E4%BD%BF%E7%94%A8/","title":"Pasos para llamar a TinyLLaMA desde C++ (usando llama.cpp)"},{"content":"✅ Método de publicación usando un token de acceso (Slack Web API) El \u0026ldquo;Token OAuth (como xoxb-〜)\u0026rdquo; de Slack es la clave para publicar usando la Web API de Slack. En este caso, a diferencia del Webhook, haces un POST al endpoint de la API de Slack con el encabezado Authorization: Bearer.\n🔑 Requisitos necesarios Es necesario incluir chat:write en los permisos OAuth de la aplicación de Slack:\nPasos de configuración Accede a https://api.slack.com/apps Crea una aplicación o selecciona una existente En \u0026ldquo;OAuth \u0026amp; Permissions\u0026rdquo; \u0026gt; Scopes → Añade chat:write Haz clic en \u0026ldquo;Install to Workspace\u0026rdquo; o \u0026ldquo;Reinstall\u0026rdquo; para obtener el Access Token (Ejemplo: xoxb-xxxxxxxxxx) 💻 Código C++ (Publicar en la API de Slack con WinHTTP) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 #include \u0026lt;windows.h\u0026gt; #include \u0026lt;winhttp.h\u0026gt; #include \u0026lt;iostream\u0026gt; #pragma comment(lib, \u0026#34;winhttp.lib\u0026#34;) bool PostSlackMessage(const std::wstring\u0026amp; accessToken, const std::string\u0026amp; channel, const std::string\u0026amp; text) { const wchar_t* host = L\u0026#34;slack.com\u0026#34;; const wchar_t* path = L\u0026#34;/api/chat.postMessage\u0026#34;; HINTERNET hSession = WinHttpOpen(L\u0026#34;SlackPoster/1.0\u0026#34;, WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0); if (!hSession) return false; HINTERNET hConnect = WinHttpConnect(hSession, host, INTERNET_DEFAULT_HTTPS_PORT, 0); if (!hConnect) return false; HINTERNET hRequest = WinHttpOpenRequest(hConnect, L\u0026#34;POST\u0026#34;, path, NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_SECURE); // Encabezado de Authorization y Content-Type std::wstring headers = L\u0026#34;Content-Type: application/json\\r\\n\u0026#34;; headers += L\u0026#34;Authorization: Bearer \u0026#34; + accessToken + L\u0026#34;\\r\\n\u0026#34;; // Cuerpo JSON std::string body = R\u0026#34;({\u0026#34;channel\u0026#34;:\u0026#34;)\u0026#34; + channel + R\u0026#34;(\u0026#34;,\u0026#34;text\u0026#34;:\u0026#34;)\u0026#34; + text + R\u0026#34;(\u0026#34;})\u0026#34;; BOOL result = WinHttpSendRequest(hRequest, headers.c_str(), (DWORD)-1, (LPVOID)body.c_str(), body.length(), body.length(), 0); if (!result || !WinHttpReceiveResponse(hRequest, NULL)) { std::cerr \u0026lt;\u0026lt; \u0026#34;Error de envío\\n\u0026#34;; return false; } // Comprobar código de estado DWORD statusCode = 0; DWORD size = sizeof(statusCode); WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER, WINHTTP_HEADER_NAME_BY_INDEX, \u0026amp;statusCode, \u0026amp;size, WINHTTP_NO_HEADER_INDEX); WinHttpCloseHandle(hRequest); WinHttpCloseHandle(hConnect); WinHttpCloseHandle(hSession); return (statusCode == 200); } int main() { std::wstring token = L\u0026#34;xoxb-tu-token-de-acceso\u0026#34;; // Token de acceso std::string channel = \u0026#34;ID-del-canal-o-#general\u0026#34;; // Ej: \u0026#34;#general\u0026#34; o \u0026#34;C0123456789\u0026#34; std::string message = \u0026#34;¡He publicado en Slack desde C++!\u0026#34;; if (PostSlackMessage(token, channel, message)) { std::cout \u0026lt;\u0026lt; \u0026#34;¡Publicación exitosa!\\n\u0026#34;; } else { std::cerr \u0026lt;\u0026lt; \u0026#34;Error en la publicación.\\n\u0026#34;; } return 0; } 📌 Cómo obtener el ID del canal A veces se producen errores si solo usas el nombre del canal (Ejemplo: #general). El método más seguro es usar el ID que se encuentra en la URL de la página del canal en Slack.\n1 2 https://app.slack.com/client/Txxxxx/C0123456789 ↑ Esta parte es el ID del canal ✅ Sobre los tipos de tokens (Información adicional) Formato del Token Uso Ejemplo xoxb-... Bot Token (Recomendado) Publicar, editar, eliminar xoxp-... User Token (No recomendado) Operaciones no relacionadas con bots Refresh Token Para renovar tokens a largo plazo Normalmente no se usa 📝 Resumen Para publicar en Slack desde C++, el método de Slack Web API + Bearer Token es el más seguro Usa el endpoint chat.postMessage con HTTPS POST El token debe enviarse en el encabezado Bearer Para los canales, especificar por ID es lo más seguro ","date":"2025-07-16T23:36:27+09:00","image":"http://kenji.blog/p/slack-app--oauth2-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6-slack-%E3%81%AB%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E6%8A%95%E7%A8%BF%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_huc0fc953b24035d17918192b772178b43_75467_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/slack-app--oauth2-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6-slack-%E3%81%AB%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E6%8A%95%E7%A8%BF%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"Cómo publicar mensajes en Slack usando Slack App + OAuth2"},{"content":"Cómo enviar un mensaje a Slack en C++ (Win32 API + WinHTTP) [Soporte de Webhook] Quiero enviar un mensaje a Slack desde C++. Es muy común en Node.js o Python, pero es poco frecuente hacerlo con \u0026ldquo;C++ × Win32 API × WinHTTP\u0026rdquo;.\nEn este artículo, explicaremos paso a paso cómo enviar un mensaje a Slack desde C++ usando una URL de Webhook.\n✅ Flujo general Para publicar en Slack, se deben seguir los siguientes pasos:\nObtener la URL del Webhook de Slack (Clave de API) Enviar una solicitud POST usando WinHTTP Ensamblar el cuerpo del mensaje en formato JSON ¡Verificar el resultado y listo! 🔑 Paso 1: Cómo obtener la URL de Webhook de Slack En Slack, usando una función llamada Incoming Webhooks, puedes publicar mensajes fácilmente desde servicios externos.\nPasos para obtenerla Accede a https://api.slack.com/apps Haz clic en Create New App Elige From scratch, selecciona un nombre para la aplicación y el espacio de trabajo de destino En el menú de la izquierda, selecciona \u0026ldquo;Incoming Webhooks\u0026rdquo; y actívalo Haz clic en \u0026ldquo;Add New Webhook to Workspace\u0026rdquo; y selecciona un canal Copia la URL generada (Ejemplo: https://hooks.slack.com/services/xxx/yyy/zzz) Esta URL funciona como una clave de API.\n💻 Paso 2: Enviar un mensaje a Slack con código C++ Tecnologías utilizadas Win32 API WinHTTP (Biblioteca estándar) Mensaje en formato JSON Código de muestra (Publicación en Slack) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 #include \u0026lt;windows.h\u0026gt; #include \u0026lt;winhttp.h\u0026gt; #include \u0026lt;iostream\u0026gt; #pragma comment(lib, \u0026#34;winhttp.lib\u0026#34;) bool PostToSlack(const std::wstring\u0026amp; webhookUrl, const std::string\u0026amp; messageJson) { // Descomposición de la URL URL_COMPONENTS urlComp{}; wchar_t hostName[256]; wchar_t urlPath[1024]; urlComp.dwStructSize = sizeof(urlComp); urlComp.lpszHostName = hostName; urlComp.dwHostNameLength = _countof(hostName); urlComp.lpszUrlPath = urlPath; urlComp.dwUrlPathLength = _countof(urlPath); if (!WinHttpCrackUrl(webhookUrl.c_str(), 0, 0, \u0026amp;urlComp)) { std::wcerr \u0026lt;\u0026lt; L\u0026#34;Falló la descomposición de la URL\\n\u0026#34;; return false; } // Sesión HTTP y conexión HINTERNET hSession = WinHttpOpen(L\u0026#34;SlackPoster/1.0\u0026#34;, WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0); HINTERNET hConnect = WinHttpConnect(hSession, hostName, urlComp.nPort, 0); HINTERNET hRequest = WinHttpOpenRequest(hConnect, L\u0026#34;POST\u0026#34;, urlPath, NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_SECURE); std::wstring headers = L\u0026#34;Content-Type: application/json\\r\\n\u0026#34;; BOOL result = WinHttpSendRequest(hRequest, headers.c_str(), -1, (LPVOID)messageJson.c_str(), messageJson.length(), messageJson.length(), 0); if (!result) { std::cerr \u0026lt;\u0026lt; \u0026#34;Falló la solicitud de envío\\n\u0026#34;; return false; } WinHttpReceiveResponse(hRequest, NULL); DWORD statusCode = 0; DWORD size = sizeof(statusCode); WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER, WINHTTP_HEADER_NAME_BY_INDEX, \u0026amp;statusCode, \u0026amp;size, WINHTTP_NO_HEADER_INDEX); // Liberar recursos WinHttpCloseHandle(hRequest); WinHttpCloseHandle(hConnect); WinHttpCloseHandle(hSession); return (statusCode == 200); } int main() { std::wstring webhookUrl = L\u0026#34;https://hooks.slack.com/services/xxx/yyy/zzz\u0026#34;; // Reemplázalo con tu Webhook std::string message = R\u0026#34;({ \u0026#34;text\u0026#34;: \u0026#34;Hello from C++ :rocket:\u0026#34;, \u0026#34;username\u0026#34;: \u0026#34;C++ Bot\u0026#34;, \u0026#34;icon_emoji\u0026#34;: \u0026#34;:robot_face:\u0026#34; })\u0026#34;; if (PostToSlack(webhookUrl, message)) { std::cout \u0026lt;\u0026lt; \u0026#34;¡Publicación exitosa!\\n\u0026#34;; } else { std::cerr \u0026lt;\u0026lt; \u0026#34;Falló la publicación.\\n\u0026#34;; } return 0; } 🧪 Personalización del mensaje JSON En el Webhook de Slack, puedes incluir los siguientes parámetros:\n1 2 3 4 5 6 { \u0026#34;text\u0026#34;: \u0026#34;Contenido de la notificación\u0026#34;, \u0026#34;username\u0026#34;: \u0026#34;Nombre del Bot\u0026#34;, \u0026#34;icon_emoji\u0026#34;: \u0026#34;:rocket:\u0026#34;, \u0026#34;channel\u0026#34;: \u0026#34;#nombre_del_canal_opcional\u0026#34; } 📌 Notas adicionales Debes especificar \u0026quot;application/json\u0026quot; en Content-Type La URL del Webhook se pasa como un wstring tal cual (no requiere codificación URL) Como es una comunicación HTTPS, no olvides agregar WINHTTP_FLAG_SECURE 🎉 Extra: Ejemplo de confirmación de publicación en Slack Se mostrará así en Slack:\n1 2 [C++ Bot] Hello from C++ :rocket: ✍️ Resumen Elemento Descripción Método de publicación Webhook (Incoming Webhooks) Biblioteca de comunicación WinHTTP Formato de datos JSON Parámetros disponibles text, username, icon_emoji, channel, etc. ¡Incluso si pensabas que integrar C++ con Slack era complicado, puedes incorporar un Bot de notificaciones desde hoy mismo!\n🚀 ¿Próximamente? Si te interesa, la próxima vez podríamos cubrir:\nAdjuntar archivos Interfaz de usuario con botones Operaciones API flexibles con Slack App + OAuth2 ¡Podemos presentar una integración con Slack un paso más allá!\n","date":"2025-07-16T19:42:56+09:00","image":"http://kenji.blog/p/c-win32-api--winhttp%E3%81%A7slack%E3%81%AB%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E6%8A%95%E7%A8%BF%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95webhook%E5%AF%BE%E5%BF%9C/img_huc0fc953b24035d17918192b772178b43_75467_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/c-win32-api--winhttp%E3%81%A7slack%E3%81%AB%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E6%8A%95%E7%A8%BF%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95webhook%E5%AF%BE%E5%BF%9C/","title":"Cómo enviar un mensaje a Slack en C++ (Win32 API + WinHTTP) [Soporte de Webhook]"},{"content":"Market-in y Product-out Hola, soy kenji.\nA veces en libros de negocios o propuestas, veo que dicen cosas como:\n\u0026ldquo;Nuestra estrategia es market-in\u0026rdquo; \u0026ldquo;Esto es un modelo product-out\u0026rdquo;\n\u0026hellip;pero.\nOye, ¿market-in? ¿product-out? ¿Cuál es mejor???\n¿No te pasa?\nPor eso esta vez, intentaré explicar estos términos de \u0026ldquo;market-in\u0026rdquo; y \u0026ldquo;product-out\u0026rdquo; de la forma más sencilla posible, y con un toque crítico.\nEn resumen\u0026hellip; Market-in: Escuchar la voz del mercado y crear productos basados en ella. Product-out: Crear lo que nosotros consideramos un buen producto y lanzarlo al mundo. Es solo esto. Simple.\nPor ejemplo, en una tienda de ramen\u0026hellip; Una tienda de ramen market-in sería: \u0026ldquo;Últimamente el ramen estilo Iekei es popular. ¡Bien, hagámoslo con mucha grasa y ajo!\u0026rdquo;\nUna tienda de ramen product-out sería: \u0026ldquo;Este ramen de sal con leche de soja y albahaca que preparé es increíble, así que cómetelo.\u0026rdquo;\n¿Cuál es la respuesta correcta?\u0026hellip; Ambas lo son Market-in se adapta a las necesidades del cliente, por lo que tiene \u0026ldquo;alta probabilidad de venderse\u0026rdquo;, pero es difícil que nazcan ideas revolucionarias o grandes avances.\nProduct-out \u0026ldquo;da forma a lo que uno cree que es correcto\u0026rdquo;, así que es innovador y atractivo, pero si fallas, no resonará con nadie.\nEl iPhone parece product-out En la época en que decían \u0026ldquo;no necesitamos smartphones\u0026rdquo;, Apple lanzó el iPhone.\nEsto es un éxito completamente product-out.\nSi hubieran escuchado a los usuarios, les habrían dicho \u0026ldquo;¿Un teléfono sin teclado? Imposible\u0026rdquo; y ahí habría terminado.\nPero el product-out puede volverse fácilmente \u0026ldquo;autosatisfacción\u0026rdquo; A veces hay empresas o personas que dicen \u0026ldquo;Nosotros somos del tipo product-out\u0026rdquo;, pero\u0026hellip;\nOye, ¿eso no es simplemente ignorar al usuario?\nA veces pienso eso.\n\u0026ldquo;Lo creé porque quería. Pero no se vendió\u0026rdquo;, eso no es product-out, es \u0026ldquo;egocentrismo-out\u0026rdquo;.\nEl market-in también tiene sus trampas Por otro lado, el market-in tampoco es todopoderoso.\nSi dices \u0026ldquo;¡Haremos todo lo que los usuarios pidan!\u0026rdquo;, el núcleo del producto se desdibuja y al final no resuena con nadie.\nVas añadiendo funciones y cuando te das cuenta, es una herramienta caótica, ese tipo de cosas.\nLos realmente increíbles son los que \u0026ldquo;hacen ambas cosas\u0026rdquo; Un gran producto presenta con precisión \u0026ldquo;aquello que los usuarios realmente querían pero no sabían expresar con palabras\u0026rdquo;.\nEs decir, \u0026ldquo;conseguir la empatía del market-in con una mentalidad product-out\u0026rdquo;.\nSe dice fácil, pero es extremadamente difícil. Sin embargo, cuando logras esto, de repente se convierte en un \u0026ldquo;producto divino\u0026rdquo;.\nConclusión: Más que las palabras, la reacción del usuario lo es todo ¿Market-in o product-out? Cuál es el correcto es una pregunta que no tiene mucho sentido.\nCreo que \u0026quot;¿Llega realmente al corazón del usuario?\u0026quot; lo es todo.\nCosas como \u0026ldquo;usamos más o menos esta estrategia\u0026rdquo; está bien con tal de que se pueda escribir luego en los materiales de marketing.\n¡Así que esa fue la charla sobre market-in y product-out!\nEn lugar de dejarse confundir por términos raros, creo que lo más sano es pensar en \u0026ldquo;¿qué podemos hacer para que la gente esté feliz?\u0026rdquo;.\nHasta la próxima~.\n","date":"2025-07-15T20:18:22+09:00","image":"http://kenji.blog/p/%E3%83%9E%E3%83%BC%E3%82%B1%E3%83%83%E3%83%88%E3%82%A4%E3%83%B3%E3%81%A8%E3%83%97%E3%83%AD%E3%83%80%E3%82%AF%E3%83%88%E3%82%A2%E3%82%A6%E3%83%88/img_hu9af708a897f548be4a7980daec441f8f_1946278_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E3%83%9E%E3%83%BC%E3%82%B1%E3%83%83%E3%83%88%E3%82%A4%E3%83%B3%E3%81%A8%E3%83%97%E3%83%AD%E3%83%80%E3%82%AF%E3%83%88%E3%82%A2%E3%82%A6%E3%83%88/","title":"Market-in y Product-out"},{"content":"¿Es cierto que \u0026ldquo;cualquier número termina en 1\u0026rdquo;? ── Jugando con la Conjetura de Collatz ¡Hola! Soy kenji.\nDe repente, si escuchas sobre \u0026ldquo;una regla donde cualquier número termina finalmente en 1\u0026rdquo;, ¿no te parece un poco extraño?\nPor ejemplo, el 19, el 87 o incluso el 1000000. Si sigues una regla simple y manipulas el número, por alguna razón siempre converge a \u0026ldquo;1\u0026rdquo; al final.\nEsta historia que parece un sueño es la Conjetura de Collatz (Collatz Conjecture).\nPara empezar, ¿qué es la Conjetura de Collatz? Primero, presentaré la regla.\nInicio: Elige cualquier entero positivo\nOperación:\nSi es par → divídelo a la mitad (n → n / 2) Si es impar → multiplícalo por 3 y suma 1 (n → 3n + 1) Si repites esto una y otra vez, la conjetura es que cualquier número finalmente llegará a 1.\nPor ejemplo, si empezamos con el 6:\n1 6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1 Efectivamente llegó a \u0026ldquo;1\u0026rdquo;. ¡Bienvenido de vuelta!\nHagámoslo con código: Collatz en Python Bueno, en estos casos ¡es más rápido probar con código! Imprimamos la \u0026ldquo;secuencia de Collatz\u0026rdquo; en Python.\n1 2 3 4 5 6 7 8 9 10 11 12 def collatz(n): steps = [n] while n != 1: if n % 2 == 0: n = n // 2 else: n = 3 * n + 1 steps.append(n) return steps # Ejemplo: empezando con 19 print(collatz(19)) Al ejecutarlo:\n1 [19, 58, 29, 88, 44, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1] Llega perfectamente al 1. Da bastantes rodeos, pero al final ¡alcanza la meta!\nPor cierto, incluso si empiezas con 29, también llegará a 1 de la misma manera.\n1 pythonprint(collatz(29)) Al ejecutarlo:\n1 2 3 4 5 6 7 8 [27, 82, 41, 124, 62, 31, 94, 47, 142, 71, 214, 107, 322, 161, 484, 242, 121, 364, 182, 91, 274, 137, 412, 206, 103, 310, 155, 466, 233, 700, 350, 175, 526, 263, 790, 395, 1186, 593, 1780, 890, 445, 1336, 668, 334, 167, 502, 251, 754, 377, 1132, 566, 283, 850, 425, 1276, 638, 319, 958, 479, 1438, 719, 2158, 1079, 3238, 1619, 4858, 2429, 7288, 3644, 1822, 911, 2734, 1367, 4102, 2051, 6154, 3077, 9232, 4616, 2308, 1154, 577, 1732, 866, 433, 1300, 650, 325, 976, 488, 244, 122, 61, 184, 92, 46, 23, 70, 35, 106, 53, 160, 80, 40, 20, 10, 5, 16, 8, 4, 2, 1] ¡Vaya, toma 111 pasos!\nY además, hay momentos en los que se infla por encima de 9000. Es un patrón que da muchísimas vueltas antes de llegar a la meta.\nY, al final, ¿qué tiene de increíble? Lo increíble de esta conjetura es,\nAunque no está comprobada, parece que funciona con cualquier número y termina en 1\nEs justo eso.\n¿Eh? Entonces, ¿qué pasa con 1 billón, o 1 trillón\u0026hellip;?\nSi pensaste eso, eres muy perspicaz. De hecho, usando computadoras se ha verificado hasta aproximadamente \u0026ldquo;2 elevado a 68\u0026rdquo;, y todos llegan a 1. Increíble\u0026hellip;\nPero, no se ha demostrado teóricamente que \u0026ldquo;todos lo hagan\u0026rdquo;. Esto es lo que en el mundo de las matemáticas se llama un \u0026ldquo;problema no resuelto\u0026rdquo;.\n¿Quién es el Sr. Collatz? Y, al leer hasta aquí, seguro piensas \u0026ldquo;¿y quién es Collatz?\u0026rdquo;. ¡Lo presentaré adecuadamente!\nNombre: Lothar Collatz Nacionalidad: Alemán Nacimiento: 1910 - 1990 Profesión: Matemático (destacado en análisis funcional y teoría de números) Propuso esta conjetura en 1937, y después de eso, durante más de 80 años nadie ha podido demostrarla ni refutarla.\nPor cierto, este problema es tan simple pero tan profundo, que incluso el famoso Paul Erdős (un matemático súper famoso) dijo:\n\u0026ldquo;Las matemáticas aún no están listas para la conjetura de Collatz\u0026rdquo;\nEn otras palabras, la teoría es que las matemáticas de la humanidad aún no han alcanzado este misterio\u0026hellip;\nNo se necesitan \u0026ldquo;fórmulas matemáticas difíciles\u0026rdquo; Lo bueno de la conjetura de Collatz es que cualquiera puede jugar.\nPuedes hacerlo si tienes papel y bolígrafo. Si escribes el código en Python, puedes probarlo automáticamente. Y aun así, los matemáticos más avanzados lo están intentando en serio.\nNo sé, ¿no te emociona?\nBonus: Código para probar de una vez También dejaré un código para probar varios números a la vez.\n1 2 3 for n in range(1, 21): steps = collatz(n) print(f\u0026#34;{n}: {steps} (pasos: {len(steps)-1})\u0026#34;) Esto imprimirá la secuencia de Collatz del \u0026ldquo;1 al 20\u0026rdquo; de una vez.\nConclusión: Este mundo, al final, es misterioso Así que, la conjetura de Collatz.\nAunque es súper simple Nadie puede probarlo Es un gran problema en el mundo de las matemáticas Es como una masa de misterio.\n¡Incluso los principiantes en programación pueden probarlo, así que anímate a jugar!\nEnlaces recomendados (para interesados) Wikipedia: Conjetura de Collatz Artículo de Terence Tao (en inglés) ¡También es divertido crear una versión visual en Python! (Lo haré si hay peticiones) Si quieres conocer más de este tipo de temas \u0026ldquo;Matemáticas misteriosas × Programación\u0026rdquo;, no dudes en pedirme \u0026ldquo;cuéntame más\u0026rdquo;. ¡Pronto te presentaré la Hipótesis de Riemann, historias sobre números primos y muchas cosas más!\n📮 ¡Fin!\n","date":"2025-07-15T18:03:03+09:00","image":"http://kenji.blog/p/%E3%82%B3%E3%83%A9%E3%83%83%E3%83%84%E4%BA%88%E6%83%B3/img_hu1a59efae05835f74694145ebf674f295_4369684_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E3%82%B3%E3%83%A9%E3%83%83%E3%83%84%E4%BA%88%E6%83%B3/","title":"La conjetura de Collatz"},{"content":"Cómo publicar mensajes en Microsoft Teams desde C++ (WinHTTP + Graph API) ¿Quieres publicar mensajes automáticamente en el chat de Microsoft Teams?\nPara eso puedes usar la Microsoft Graph API.\nEn este artículo, presentaremos un ejemplo de código en C++ usando WinHTTP ** y los ** pasos de autenticación de la API necesarios, paso a paso.\n🔧 Preparación necesaria (Configuración de autenticación de Microsoft Graph API) 1. Registrar la aplicación en el portal de Azure Primero, para usar la Microsoft Graph API, debes registrar una aplicación en Azure.\nAccede al Azure Portal Ve a \u0026ldquo;Microsoft Entra ID \u0026rdquo; \u0026gt; \u0026ldquo;+ Agregar \u0026rdquo; \u0026gt; \u0026ldquo; Registros de aplicaciones \u0026rdquo; \u0026gt; \u0026ldquo; Nuevo registro\u0026rdquo; Ingresa un nombre para la aplicación y haz clic en \u0026ldquo;Registrar\u0026rdquo; 2. Agregar permisos de API Ve al menú izquierdo \u0026ldquo;Permisos de API\u0026rdquo; En \u0026ldquo;Microsoft Graph \u0026rdquo; \u0026gt; \u0026ldquo; Permisos delegados \u0026rdquo; (o seleccionar permisos), busca los siguientes ámbitos (scopes) y haz clic en \u0026ldquo; Actualizar permisos\u0026rdquo; (o agregar permisos) Chat.ReadWrite User.Read ※ Si deseas publicar en un canal, también necesitarás ChannelMessage.Send\n3. Anotar el ID del cliente y el ID del inquilino (tenant) Anota los siguientes dos valores que se muestran en la pestaña \u0026ldquo;Información general\u0026rdquo;:\nID de la aplicación (cliente) ID del directorio (inquilino) 4. Crear un secreto de cliente Ve a la pestaña \u0026ldquo;Certificados y secretos\u0026rdquo; Selecciona \u0026ldquo;Nuevo secreto de cliente\u0026rdquo; \u0026gt; Establece una fecha de expiración y haz clic en \u0026ldquo;Agregar\u0026rdquo; Asegúrate de copiar el valor mostrado (secreto) en este momento, ya que no podrás verlo después 🔐 Obtener el token de acceso (OAuth2) Para obtenerlo, usaremos el flujo client_credentials.\nEjecuta el siguiente comando con curl para obtener el token de acceso.\n1 2 3 4 5 6 7 curl -X POST ^ https://login.microsoftonline.com/{ID_del_inquilino}/oauth2/v2.0/token ^ -H \u0026#34;Content-Type: application/x-www-form-urlencoded\u0026#34; ^ -d \u0026#34;client_id={ID_del_cliente}\u0026#34; ^ -d \u0026#34;scope=https%3A%2F%2Fgraph.microsoft.com%2F.default\u0026#34; ^ -d \u0026#34;client_secret={Secreto_de_cliente}\u0026#34; ^ -d \u0026#34;grant_type=client_credentials\u0026#34; Ejemplo de respuesta 1 2 3 4 5 6 { \u0026#34;token_type\u0026#34;:\u0026#34;Bearer\u0026#34;, \u0026#34;expires_in\u0026#34;:3599, \u0026#34;ext_expires_in\u0026#34;:3599, \u0026#34;access_token\u0026#34;: \u0026#34;eyJ0eXAiOiJKV1QiLCJub... (omitido)\u0026#34; } Usaremos este access_token para llamar a la Microsoft Graph API.\n💬 Ejemplo en C++ para publicar en el chat de Teams Aquí mostramos un ejemplo en C++ que usa WinHTTP para publicar en el chat.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 #include \u0026lt;windows.h\u0026gt; #include \u0026lt;winhttp.h\u0026gt; #include \u0026lt;iostream\u0026gt; #include \u0026lt;string\u0026gt; #pragma comment(lib, \u0026#34;winhttp.lib\u0026#34;) void PostToTeamsChat(const std::wstring\u0026amp; accessToken, const std::wstring\u0026amp; chatId, const std::wstring\u0026amp; message) { HINTERNET hSession = WinHttpOpen(L\u0026#34;TeamsPoster/1.0\u0026#34;, WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0); HINTERNET hConnect = WinHttpConnect(hSession, L\u0026#34;graph.microsoft.com\u0026#34;, INTERNET_DEFAULT_HTTPS_PORT, 0); std::wstring endpoint = L\u0026#34;/v1.0/chats/\u0026#34; + chatId + L\u0026#34;/messages\u0026#34;; HINTERNET hRequest = WinHttpOpenRequest(hConnect, L\u0026#34;POST\u0026#34;, endpoint.c_str(), NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_SECURE); std::wstring jsonBody = L\u0026#34;{\\\u0026#34;body\\\u0026#34;: {\\\u0026#34;content\\\u0026#34;: \\\u0026#34;\u0026#34; + message + L\u0026#34;\\\u0026#34;}}\u0026#34;; std::wstring headers = L\u0026#34;Authorization: Bearer \u0026#34; + accessToken + L\u0026#34;\\r\\nContent-Type: application/json\\r\\n\u0026#34;; BOOL bResult = WinHttpSendRequest(hRequest, headers.c_str(), (DWORD)-1L, (LPVOID)jsonBody.c_str(), (DWORD)(jsonBody.length() * sizeof(wchar_t)), (DWORD)(jsonBody.length() * sizeof(wchar_t)), 0); if (bResult) WinHttpReceiveResponse(hRequest, NULL); DWORD dwSize = 0; WinHttpQueryDataAvailable(hRequest, \u0026amp;dwSize); if (dwSize \u0026gt; 0) { std::wstring response(dwSize / sizeof(wchar_t), 0); DWORD dwDownloaded = 0; WinHttpReadData(hRequest, \u0026amp;response[0], dwSize, \u0026amp;dwDownloaded); std::wcout \u0026lt;\u0026lt; L\u0026#34;Response: \u0026#34; \u0026lt;\u0026lt; response \u0026lt;\u0026lt; std::endl; } WinHttpCloseHandle(hRequest); WinHttpCloseHandle(hConnect); WinHttpCloseHandle(hSession); } int main() { std::wstring access; std::wstring chatId = L\u0026#34;19:\u0026#34;; std::wstring message = L\u0026#34;Hello from C++!\u0026#34;; std::wcout \u0026lt;\u0026lt; L\u0026#34;Enter your access token: \u0026#34;; std::getline(std::wcin, access); std::wcout \u0026lt;\u0026lt; L\u0026#34;Enter chat ID: \u0026#34;; std::getline(std::wcin, chatId); PostToTeamsChat(access, chatId, message); return 0; } 🔍 Cómo obtener el ID del chat El ID del chat se puede verificar con GET /v1.0/me/chats.\n1 2 3 4 curl -X GET ^ https://graph.microsoft.com/v1.0/me/chats ^ -H \u0026#34;Authorization: Bearer {access_token}\u0026#34; ^ -H \u0026#34;Content-Type: application/json\u0026#34; Ejemplo de respuesta 1 2 3 4 5 6 7 8 9 { \u0026#34;value\u0026#34;: [ { \u0026#34;id\u0026#34;: \u0026#34;19:abc123xyz@thread.v2\u0026#34;, \u0026#34;topic\u0026#34;: null, \u0026#34;chatType\u0026#34;: \u0026#34;oneOnOne\u0026#34; } ] } 📌 Puntos a tener en cuenta Este ejemplo es una implementación mínima. En un entorno de producción: Manejo de expiración de tokens Verificación del certificado HTTPS Mejora en el manejo de errores Para publicaciones en canales se usa teams/{team-id}/channels/{channel-id}/messages. Para enviar archivos adjuntos, se requiere procesamiento multiparte o la API de Graph Drive. Resumen 📎 Resumen Característica Descripción Graph API API oficial para interactuar con Teams Registro de aplicación Procedimientos de autenticación necesarios en Azure Token de acceso Obtenido a través de OAuth2 y usado para peticiones Implementación en C++ Llama a la Graph API utilizando WinHTTP 🚀 Próximos pasos Para ejemplos más avanzados, también es posible lo siguiente:\nPublicación en canales de equipos (/teams/{team-id}/channels/...) Publicación con archivos adjuntos Cambio entre cuentas de bot o cuentas de usuario Implementación completa en C++ incluyendo la obtención del token ¡Si tienes alguna pregunta o sugerencia, no dudes en comentar!\n","date":"2025-07-14T23:40:15+09:00","image":"http://kenji.blog/p/c-%E3%81%8B%E3%82%89-microsoft-teams-%E3%81%AB%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E6%8A%95%E7%A8%BF%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95winhttp--graph-api/img_hu9dbe154e21530b21fd6a41dcbc040106_90767_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/c-%E3%81%8B%E3%82%89-microsoft-teams-%E3%81%AB%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E6%8A%95%E7%A8%BF%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95winhttp--graph-api/","title":"Cómo publicar mensajes en Microsoft Teams desde C++ (WinHTTP + Graph API)"},{"content":"He organizado la información sobre la marca \u0026ldquo;obligatorio\u0026rdquo; en las interfaces de usuario (formularios) extranjeras, junto con los documentos de directrices de UI.\n📌 Principales marcas obligatorias y mejores prácticas Uso del asterisco (*)\nEs el más extendido en general, y se añade un \u0026ldquo;*\u0026rdquo; a los campos obligatorios. Sin embargo, es obligatorio incluir una explicación al principio del formulario, como \u0026ldquo;* indica un campo obligatorio\u0026rdquo; (Nielsen Norman Group, Universidad Estatal de California, Northridge). También hay ejemplos de enfatizarlo usando colores (texto rojo, etc.). Especificar \u0026ldquo;Required\u0026rdquo; o \u0026ldquo;(required)\u0026rdquo; en la etiqueta\nAl añadir la palabra \u0026ldquo;Required\u0026rdquo; en la etiqueta, se puede indicar claramente a los lectores de pantalla, mejorando la accesibilidad (Deque). Uso combinado de atributos ARIA y el atributo required de HTML5\nAdemás de la visualización, se puede transmitir de forma programática que es obligatorio mediante aria-required=\u0026quot;true\u0026quot; o \u0026lt;input required\u0026gt; (Deque). Especificar campos opcionales usando \u0026ldquo;(optional)\u0026rdquo;\nTambién hay una manera de especificar los campos opcionales como \u0026ldquo;(optional)\u0026rdquo; en lugar de los campos obligatorios, lo cual es efectivo cuando hay una mezcla de ambos. Sin embargo, Nielsen-Norman señala que \u0026ldquo;es más fácil juzgar si también se indica lo obligatorio\u0026rdquo; (TPGi). ✅ Resumen de documentos de directrices de UI Proveedor Contenido NN/g: Marking Required Fields in Forms Se recomienda la combinación de asterisco + texto explicativo, y mostrar solo lo opcional se considera poco amigable (Nielsen Norman Group). Deque (Anatomy of Accessible Forms) ・Se usa la palabra \u0026ldquo;Required\u0026rdquo; o una imagen dentro de la etiqueta.\n・Se afirma que la sugerencia solo por color es insuficiente. W3C Techniques (H90) Hay ejemplos que incluyen un asterisco o \u0026ldquo;(required)\u0026rdquo; en la etiqueta, y definen su significado al principio del formulario. TPGi (Doing what\u0026rsquo;s required) Considerando la accesibilidad, la combinación óptima es asterisco + atributo ARIA + inserción de texto en la etiqueta. Guía de UX de Formularios Contensis Un marcado consistente (* o (optional)) se resume brevemente como importante. ✅ Enfoques recomendados para la implementación Agregar texto explicativo al principio del formulario:\nFields marked with * are required. (o \u0026ldquo;All fields are required\u0026rdquo; en general, \u0026ldquo;unless marked optional\u0026rdquo; si hay opcionales)\nAsignación de etiquetas:\nSe escribe como First Name * o Email (required). Atributos ARIA y HTML5:\n1 2 \u0026lt;label for=\u0026#34;email\u0026#34;\u0026gt;Email \u0026lt;abbr title=\u0026#34;required\u0026#34;\u0026gt;*\u0026lt;/abbr\u0026gt;\u0026lt;/label\u0026gt; \u0026lt;input id=\u0026#34;email\u0026#34; required aria-required=\u0026#34;true\u0026#34;\u0026gt; No dependa solo del color: Responda tanto de forma visual como programática.\n🔗 Enlaces de referencia (Documentos de directrices de UI) NN/g: Marking Required Fields in Forms (Universidad Estatal de California, Northridge, Nielsen Norman Group, Deque) Deque: Anatomy of Accessible Forms (Deque) W3C Techniques: H90 Indicating required form controls (W3C) TPGi: Indicating mandatory fields accessibly (TPGi) Contensis: UX Forms Guidelines (Contensis) Si es necesario, también podemos proporcionar ejemplos específicos de código HTML/CSS, o plantillas de diseño de componentes de UI para Sketch o Figma. ¡No dude en consultarnos!\n","date":"2025-07-14T13:47:51+09:00","image":"http://kenji.blog/p/%E5%85%A5%E5%8A%9B%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%AE%E5%BF%85%E9%A0%88%E3%83%9E%E3%83%BC%E3%82%AF%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/img_hu551d2409ec5a7ae3c7367fc3f969286e_18058_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E5%85%A5%E5%8A%9B%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%AE%E5%BF%85%E9%A0%88%E3%83%9E%E3%83%BC%E3%82%AF%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/","title":"Sobre la marca obligatoria en los formularios de entrada"},{"content":"【Para principiantes】Cómo instalar Gemini CLI en Windows \u0026ldquo;Gemini CLI\u0026rdquo; te permite utilizar la IA generativa de Google, \u0026ldquo;Gemini\u0026rdquo;, desde la línea de comandos. En este artículo, explicaremos los pasos para instalar Gemini CLI en un entorno Windows de la forma más clara posible.\n1. Preparación: Instalar Node.js y npm Primero, dado que Gemini CLI se ejecuta en un entorno llamado \u0026ldquo;Node.js\u0026rdquo;, es necesario instalar lo siguiente:\nNode.js npm (herramienta de gestión de paquetes incluida con Node.js) npx (herramienta de ejecución de comandos incluida con npm) Descarga la versión de Node.js para Windows desde el siguiente sitio web oficial (se recomienda la versión LTS):\n👉 Sitio web oficial de Node.js\nUna vez completada la instalación, verifiquemos si se instaló correctamente con los siguientes comandos.\n1 2 node -v npm -v 2. Iniciar PowerShell Para usar Gemini CLI en Windows, generalmente se opera usando PowerShell. Escribe \u0026ldquo;PowerShell\u0026rdquo; en el menú Inicio para iniciarlo.\n3. Instalar Gemini CLI Copia y pega el siguiente comando en PowerShell y ejecútalo:\n1 npx @google/gemini-cli Este comando sirve para ejecutar temporalmente el paquete Gemini CLI publicado por Google. Es posible que se te solicite una configuración inicial o que inicies sesión según sea necesario.\n※ La primera vez puede tardar unos minutos. Si aparece un error, verifica nuevamente Node.js y tu entorno de red.\n4. ¡Instalación completada! Qué hacer a continuación Con esto, Gemini CLI se ha instalado en Windows. A partir de ahora, podrás usar Gemini desde la línea de comandos para realizar diversas operaciones, como la generación de texto y el autocompletado de código.\nSi deseas consultar la documentación oficial o la ayuda, también puedes utilizar comandos como el siguiente.\n1 npx @google/gemini-cli --help Resumen Repasemos los pasos para instalar Gemini CLI en Windows.\nInstalar Node.js y npm Iniciar PowerShell Ejecutar npx @google/gemini-cli ¡Con esto ya estás listo! Si quieres usar IA generativa desde tu entorno local, no dudes en intentarlo utilizando estos pasos como referencia.\n","date":"2025-07-13T23:49:56+09:00","image":"http://kenji.blog/p/gemini-cli-%E3%82%92-windows-%E7%92%B0%E5%A2%83%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hu68d4fe037447f15938887bf6c4d85b87_249642_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/gemini-cli-%E3%82%92-windows-%E7%92%B0%E5%A2%83%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"Cómo instalar Gemini CLI en un entorno Windows"},{"content":"¡He sido galardonado nuevamente como Microsoft MVP (2025-2026)! Hola, soy kenji.\nQuiero compartir una noticia con ustedes. Este año, he sido galardonado nuevamente como Microsoft MVP (Most Valuable Professional). Esta es la ** novena vez** que recibo este premio.\nMuchas gracias a todos los que siempre me apoyan.\n¿Qué es Microsoft MVP? Al escuchar \u0026ldquo;MVP\u0026rdquo;, muchos podrían pensar en el jugador más valioso en los deportes, pero aquí MVP es un título otorgado a quienes han contribuido a la comunidad técnica de Microsoft.\nEspecíficamente, es un sistema que evalúa actividades de \u0026ldquo;compartir tus conocimientos y experiencias por el bien de alguien\u0026rdquo;, tales como:\nDifusión de información en blogs técnicos y redes sociales Publicación de código de ejemplo en GitHub Presentaciones en grupos de estudio y conferencias Respuestas en sitios de preguntas y respuestas (Q\u0026amp;A) Intercambio técnico y colaboración con desarrolladores en el extranjero Participación y publicaciones en comunidades donde los ingenieros se conectan Los galardonados se encuentran en todo el mundo, pero el número de personas seleccionadas cada año es limitado, y ser galardonado nuevamente no es nada fácil. Es por eso que es un verdadero honor ser reconocido de esta manera.\nEn qué me he centrado el último año Este año, me he centrado en la difusión de información con una conciencia de \u0026ldquo;claridad\u0026rdquo; y \u0026ldquo;accesibilidad\u0026rdquo; de la tecnología.\nPublicación de código de ejemplo práctico en GitHub Presentaciones en grupos de estudio y conferencias (tanto a nivel nacional como internacional) Difusión regular de información a través de blogs técnicos y redes sociales Actividad continua de respuestas en sitios de preguntas y respuestas (Q\u0026amp;A) Intercambio de conocimientos en sitios de comunidades de ingenieros Interacción y verificación conjunta con ingenieros en el extranjero Sobre todo, publicar código en GitHub ha sido muy memorable porque a veces recibo comentarios como \u0026ldquo;¡Estaba atascado en lo mismo, así que me salvó!\u0026rdquo;, lo que me hizo darme cuenta de que mis esfuerzos están ayudando al desarrollo de otras personas.\nAdemás, en mis presentaciones en eventos, a veces recibo comentarios como \u0026ldquo;Fue fácil de entender incluso para principiantes\u0026rdquo;, lo que también sirvió como una buena oportunidad para pensar en \u0026ldquo;¿Qué hace que una explicación técnica se transmita bien?\u0026rdquo;.\nHacia el próximo año La evolución de la tecnología es realmente rápida, y solo seguirle el ritmo ya es difícil. Aun así, creo que hay un gran valor en ofrecer conocimiento real como \u0026ldquo;información de primera mano\u0026rdquo;, como las experiencias reales y los puntos de tropiezo que he obtenido al probar las cosas por mí mismo.\nEl próximo año, también me gustaría desafiarme a difundir \u0026ldquo;contenido técnico visualmente fácil de entender\u0026rdquo; que incorpore videos y diagramas. Espero poder aumentar la cantidad de resultados que puedan ayudar a resolver los problemas de alguien al menos un poco.\nFinalmente El título de MVP es, al fin y al cabo, solo un punto de paso.\nA partir de ahora, sin forzarme y a mi propio ritmo. Pero asegurándome de ser útil para alguien.\n\u0026ldquo;Me salvó mientras investigaba\u0026rdquo; \u0026ldquo;¡Este ejemplo funcionó!\u0026rdquo; \u0026ldquo;Esta historia fue fácil de entender\u0026rdquo;\nQuiero seguir siendo un ingeniero del que se puedan decir cosas así.\nEspero contar con su apoyo en el futuro.\nGitHub: https://github.com/kenjinote Blog técnico: https://hack.jp X: https://twitter.com/kenjinote ","date":"2025-07-13T22:01:15+09:00","image":"http://kenji.blog/p/microsoft-mvp2025-2026%E3%82%92%E5%86%8D%E5%8F%97%E8%B3%9E%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F/img_hu79b11b7d0311d1cf72d88f77ae4d2c9a_139280_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/microsoft-mvp2025-2026%E3%82%92%E5%86%8D%E5%8F%97%E8%B3%9E%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F/","title":"He sido galardonado nuevamente como Microsoft MVP (2025-2026)"},{"content":"Atractivo y desafíos de desarrollar con Win32API + C++ Para aquellos que quieren profundizar en el desarrollo de aplicaciones para Windows, Win32API + C++ sigue siendo una opción poderosa. Esta combinación, que permite interactuar con el sistema operativo desde la distancia más corta, combina alta velocidad y flexibilidad.\nPor otro lado, difiere enormemente de los estilos de desarrollo modernos, por lo que su aprendizaje requiere determinación.\nEn esta página, explicaremos las ventajas y desventajas de forma sencilla desde la perspectiva de un desarrollador activo de aplicaciones para Windows.\nVentajas Ejecución nativa ultrarrápida Dado que C++ y Win32API funcionan en la capa más cercana al sistema operativo, casi no hay sobrecarga innecesaria. La eficiencia en el uso de CPU y memoria es muy alta, presumiendo de una velocidad de ejecución abrumadora.\nAlta flexibilidad y libertad Puede controlar de forma precisa y por sí mismo todos los comportamientos de la aplicación, como el control de ventanas, el procesamiento asíncrono, la integración COM y la gestión de procesos. También es posible crear herramientas especializadas para un propósito o su propio marco de trabajo personalizado.\nFácil de distribuir sin necesidad de tiempo de ejecución Dado que no se requieren tiempos de ejecución externos como .NET o Java, se puede distribuir solo con un archivo ejecutable. Es menos propenso a problemas durante la redistribución y es atractivo porque es fácil de ejecutar incluso sin un instalador.\nSe pueden crear aplicaciones ligeras Dado que solo requiere la configuración mínima necesaria, se caracteriza por una huella de memoria muy pequeña. Funciona de manera fluida incluso en PC con bajas especificaciones o entornos de máquinas virtuales.\nControl avanzado a nivel de sistema operativo posible Puede realizar controles que son difíciles con lenguajes y bibliotecas normales, como el hook global del ratón/teclado, el ajuste fino del estilo de la ventana y la manipulación del menú del sistema.\nDesventajas Baja eficiencia de desarrollo La construcción de la GUI también debe hacerse completamente mediante código, y a veces se necesitan decenas de líneas de código solo para crear un botón. Las modificaciones por cambios de diseño también son engorrosas, y la productividad es más baja en comparación con el desarrollo utilizando un marco de trabajo de UI.\nLa mantenibilidad tiende a disminuir Hay mucho código de estructura especial, como bucles de mensajes y procedimientos de ventana, lo que dificulta la legibilidad y la reutilización. También tiene aspectos que lo hacen inadecuado para el desarrollo en equipo y el mantenimiento a largo plazo.\nEl soporte para UI moderna es tedioso Es difícil soportar la UX requerida en los últimos años, como soporte de alto DPI, interfaz táctil, accesibilidad y modo oscuro. Se necesita tiempo y esfuerzo porque requiere hacerlo manualmente uno por uno.\nNo soporta multiplataforma Como es una API completamente exclusiva de Windows, no se puede portar a macOS o Linux. Si asume la implementación en múltiples plataformas, necesitará seleccionar otras tecnologías.\nEl costo de aprendizaje es extremadamente alto Debe comprender conceptos y mecanismos que rara vez se usan en la actualidad, como manejadores (handles), GDI, COM y OLE. Mucha de la documentación es antigua, y el aprendizaje requiere tiempo y perseverancia.\nUsos adecuados Herramientas ligeras como lanzadores de archivos y asistencia de teclas de acceso rápido Utilidades del sistema como operaciones del portapapeles y control IME Aplicaciones de tipo control nativo como hooks globales y captura de ventanas Herramientas de asistencia de controladores que están estrechamente vinculadas al hardware Usos no adecuados Aplicaciones dirigidas a consumidores generales donde se enfatiza la UI/UX moderna Prototipado y desarrollo MVP que prioriza la velocidad Proyectos a gran escala que asumen operaciones a largo plazo y desarrollo en equipo Productos multiplataforma que necesitan soportar múltiples sistemas operativos Resumen de evaluación Punto de vista Evaluación Velocidad de ejecución ◎ Muy rápida Eficiencia de memoria ◎ Excelente Velocidad de desarrollo × Lenta Mantenibilidad × Baja Soporte multiplataforma × No soportado Soporte UI moderna × Débil Grado de libertad de control del SO ◎ Abrumadoramente alto Conclusión Win32API + C++ es una herramienta adecuada para desarrolladores que \u0026ldquo;quieren manejar todo el sistema operativo por sí mismos\u0026rdquo;. Si bien su poder es muy grande, el aprendizaje y la operación requieren la correspondiente determinación.\nSi vale la pena \u0026ldquo;elegirlo a propósito\u0026rdquo; depende de la naturaleza de la aplicación a la que apunte.\nSumergirse en el mundo de #include \u0026lt;windows.h\u0026gt; sin depender de marcos de trabajo GUI o lenguajes modernos\u0026hellip; Esa elección sigue siendo significativa hoy en día.\n","date":"2025-07-12T12:30:35+09:00","image":"http://kenji.blog/p/win32api-c-%E3%81%A7%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E4%BD%9C%E3%82%8B%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88%E3%81%A8%E3%83%87%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88/img_1_huda4a374969e448ba98e0798d75e2e435_4729_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/win32api-c-%E3%81%A7%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E4%BD%9C%E3%82%8B%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88%E3%81%A8%E3%83%87%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88/","title":"Ventajas y desventajas de crear programas con Win32API + C++"},{"content":"Si desea usar libcurl (compatible con OpenSSL) en Visual Studio, la introducción de vcpkg es fácil y recomendada Cuando se quiere manejar comunicación HTTP en C++, libcurl se usa a menudo. Pero, construir y ajustar dependencias es sorprendentemente molesto, ¿verdad?\nAhí es donde \u0026ldquo;vcpkg\u0026rdquo;, una herramienta de gestión de bibliotecas de C++ de Microsoft, resulta útil. En esta ocasión, introduciremos los pasos para usar vcpkg para instalar libcurl (compatible con OpenSSL) y poder usarlo fluidamente en Visual Studio.\nInstalación de vcpkg (sólo para quienes no lo tengan) Primero, instalemos vcpkg. Por favor, ejecute los siguientes pasos en PowerShell.\n1 2 3 git clone https://github.com/microsoft/vcpkg cd vcpkg .\\bootstrap-vcpkg.bat ※ Si Git aún no está instalado, por favor, instálelo desde el sitio web oficial de Git.\nInstalación de libcurl (compatible con OpenSSL) A continuación, usaremos vcpkg para instalar libcurl. Para especificar la versión de 64 bits compatible con OpenSSL, ejecute el siguiente comando:\n1 vcpkg install curl[ssl] --triplet x64-windows Cuando se ejecuta este comando, las dependencias necesarias (como OpenSSL) también se configurarán automáticamente.\nConfiguración de la integración con Visual Studio Para que las bibliotecas introducidas con vcpkg se puedan usar fácilmente desde proyectos de Visual Studio, configure la integración con el siguiente comando.\n1 vcpkg integrate install Al hacer esta configuración, #include \u0026lt;curl/curl.h\u0026gt; se podrá usar automáticamente en el proyecto de Visual Studio, y ya no será necesario configurar manualmente la ruta de la biblioteca o la configuración del enlazador.\nConclusión Con esto, la preparación para introducir libcurl (compatible con OpenSSL) en Visual Studio está completa.\nUsando vcpkg, las dependencias molestas se pueden gestionar todas a la vez Instale fácilmente libcurl con vcpkg install curl[ssl] --triplet x64-windows La integración automática con Visual Studio es posible con vcpkg integrate install Después de esto, incluya los encabezados en el proyecto y comience a desarrollar usando la API de libcurl. Aproveche el conveniente vcpkg para aumentar enormemente la eficiencia de su desarrollo.\n","date":"2025-07-07T21:46:08+09:00","image":"http://kenji.blog/p/vcpkg-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6-visual-studio-%E3%81%AB-curl-%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/img_hub03488d3cca2b78b7b08dd6d749f5d1e_294355_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/vcpkg-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6-visual-studio-%E3%81%AB-curl-%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/","title":"[Para principiantes] Pasos para introducir libcurl (compatible con OpenSSL) en Visual Studio usando vcpkg"},{"content":"La \u0026ldquo;seguridad mental\u0026rdquo; necesaria para no ser arrastrado por teorías de conspiración Al navegar por internet, a veces encontramos historias con tintes de \u0026ldquo;teoría de conspiración\u0026rdquo;.\n\u0026ldquo;¿No habrá alguien manipulando este evento desde las sombras?\u0026rdquo; \u0026ldquo;¿Acaso se está ocultando la verdadera realidad?\u0026rdquo; Seguramente muchas personas han visto cómo este tipo de discursos se difunden de manera plausible.\nPara evitar dejarse atrapar demasiado por esta información, no solo son importantes el \u0026ldquo;conocimiento\u0026rdquo; o la \u0026ldquo;capacidad de pensamiento\u0026rdquo;, sino que es fundamental ajustar el estado mental, es decir, la \u0026ldquo;seguridad mental\u0026rdquo;.\nA continuación, presentamos 6 enfoques efectivos para lograrlo.\nNo conectar inmediatamente la ansiedad con una \u0026ldquo;respuesta\u0026rdquo; Una gran característica de las teorías de conspiración es que ofrecen \u0026ldquo;respuestas\u0026rdquo; claras y fáciles de entender frente a la ansiedad o las dudas.\nPor ejemplo, ante preguntas como:\n\u0026ldquo;¿Por qué ocurren incidentes como este?\u0026rdquo; \u0026ldquo;¿Quién se beneficia?\u0026rdquo; Es fácil convencerse cuando se presenta un guion del tipo \u0026ldquo;En realidad, ○○ lo está manipulando en secreto\u0026rdquo;.\nSin embargo, precisamente cuando sentimos ansiedad, es importante no sacar conclusiones precipitadas y mantenerlas en suspenso.\nLa \u0026ldquo;capacidad de permanecer en la incertidumbre\u0026rdquo; también es una muestra de madurez intelectual.\nAmpliar intencionalmente las fuentes de información Muchas de las personas que se sumergen en teorías de conspiración tienden a consumir intensamente solo \u0026ldquo;información con perspectivas similares\u0026rdquo;.\nA esto se le llama \u0026ldquo;sesgo de confirmación\u0026rdquo;, un sesgo psicológico que lleva a exponerse únicamente a información que refuerza las ideas que ya se tienen.\nEspecialmente, los algoritmos de redes sociales y sitios de videos muestran continuamente publicaciones que podrían encajar con nuestras preferencias, lo que puede estrechar nuestra visión de forma natural.\nConscientemente, acciones como:\nConsumir medios con diferentes puntos de vista Revisar noticias internacionales o fuentes académicas Prestar atención a opiniones distintas a las propias Es decir, diversificar las fuentes de información, ayuda a evitar riesgos.\nNo pensar \u0026ldquo;A mí no me engañan\u0026rdquo; Curiosamente, las personas más lógicas y con mayor conocimiento a menudo son las más propensas a caer en teorías de conspiración.\nEsto se debe a que creer \u0026ldquo;Yo puedo darme cuenta de verdades que otros no ven\u0026rdquo; nubla el juicio.\nPor muy cuidadosos que seamos, los seres humanos cometemos errores. Por eso, partir de la premisa de que nosotros también podemos ser engañados es, de hecho, una actitud más racional.\n\u0026ldquo;Dudar sin llegar a conclusiones definitivas\u0026rdquo; se convierte en una defensa.\nNo dejarse arrastrar por la historia, observar la estructura Las teorías de conspiración siempre van acompañadas de una \u0026ldquo;narrativa dramática\u0026rdquo;.\nEl conflicto entre el bien y el mal Dominantes y dominados Mi yo despierto vs los demás con el cerebro lavado Dicotomías simples como estas pueden ser atractivas como historias, pero no necesariamente reflejan la realidad de manera correcta.\nEn los eventos del mundo real y los movimientos sociales, se entrelazan muchos elementos como relaciones causales complejas, antecedentes históricos y estructuras institucionales.\nEs importante no dejarse llevar emocionalmente por la historia y tener una perspectiva para comprender estructuralmente \u0026ldquo;¿Por qué sucede esto?\u0026rdquo;.\nNo ignorar la soledad Detrás de una fuerte atracción por las teorías de conspiración, a menudo se esconde el \u0026ldquo;aislamiento\u0026rdquo; o la \u0026ldquo;falta de un lugar de pertenencia\u0026rdquo;.\nCuando las personas se sienten solas, tienden a depender profundamente de grupos o personas que las comprenden. Las comunidades de teorías de conspiración a veces funcionan como ese \u0026ldquo;lugar de pertenencia\u0026rdquo;.\nPor eso, buscar formas de no aislarse también contribuye a la seguridad mental.\nPor ejemplo:\nConversar con otras personas regularmente Participar en comunidades donde se compartan pasatiempos o intereses Mantener conexiones no solo en línea, sino también fuera de ella Este tipo de acciones conducen a la estabilidad emocional.\nPriorizar el diálogo sobre la negación Incluso si alguien cercano se inclina por las teorías de conspiración, negar sus ideas de forma rotunda puede ser contraproducente.\nCuando a una persona se le niegan sus creencias, su tendencia psicológica a protegerlas se fortalece (lo que se conoce como \u0026ldquo;cognición defensiva\u0026rdquo;).\nEn su lugar:\nPreguntar amablemente: \u0026ldquo;¿Por qué piensas eso?\u0026rdquo; Mostrar calmadamente el propio punto de vista: \u0026ldquo;Tal vez también exista esta forma de pensarlo\u0026rdquo; Adoptar este enfoque basado en el diálogo crea la posibilidad de que la perspectiva de la otra persona se amplíe de forma natural.\nResumen: Qué se puede hacer para mantener distancia de las teorías de conspiración Tener la capacidad de suspender el juicio y no conectar rápidamente la ansiedad con respuestas definitivas. Diversificar las fuentes de información para notar posibles sesgos. Reconocer que nuestro propio juicio no es absoluto. Ver las cosas a través de estructuras y relaciones causales, no de narrativas. Evitar la soledad y mantener conexiones. Enfrentar las teorías de conspiración de otros con diálogo en lugar de negación. Se dice que ser atraído o no por teorías de conspiración depende más de la influencia del entorno y el estado psicológico que del nivel de conocimiento.\nPor eso mismo, no asumir que \u0026ldquo;a mí no me pasará\u0026rdquo;, y en el día a día, de a poco, buscar formas de aumentar la seguridad mental, sin duda será un gran apoyo para vivir de manera flexible en la sociedad de la información que nos espera.\n","date":"2025-05-26T22:23:34+09:00","image":"http://kenji.blog/p/%E9%99%B0%E8%AC%80%E8%AB%96%E3%81%AB%E3%81%AF%E3%81%BE%E3%82%89%E3%81%AA%E3%81%84%E3%81%9F%E3%82%81%E3%81%AB%E4%BD%95%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%8B/img_hu51c98705e3e626ac0eb85c430c7c7e5c_195663_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E9%99%B0%E8%AC%80%E8%AB%96%E3%81%AB%E3%81%AF%E3%81%BE%E3%82%89%E3%81%AA%E3%81%84%E3%81%9F%E3%82%81%E3%81%AB%E4%BD%95%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%8B/","title":"Qué se necesita para no caer en teorías de conspiración"},{"content":"Historia del desarrollo low-code / no-code (Desde la década de 1980 hasta el presente) El desarrollo low-code / no-code es un método de desarrollo que permite crear aplicaciones, sitios web y bases de datos sin necesidad de tener conocimientos especializados en programación. Esta idea comenzó en la década de 1980 y ha evolucionado como diversas plataformas junto con la popularización de las PC, la evolución de Internet y la expansión de las tecnologías en la nube. En este artículo, presentaremos herramientas y servicios representativos por década, destacando sus características y precios.\nDécada de 1980: Los primeros años HyperCard (Apple, 1987) Herramienta de creación de aplicaciones para Macintosh. Configura pantallas en formato de tarjetas y permite crear interfaces gráficas (GUI) mediante arrastrar y soltar (drag \u0026amp; drop). También permite un control básico de acciones mediante su propio lenguaje de scripting, \u0026ldquo;HyperTalk\u0026rdquo;. Fue popular para el prototipado. Su precio de lanzamiento fue de 49.95 dólares, y posteriormente se ofreció de forma gratuita a los nuevos compradores de Mac. Su versión final fue en 1998 y no fue compatible con Mac OS X y versiones posteriores.\nFileMaker (Claris/Apple, 1985) Software de base de datos gráfica. Es una herramienta de base de datos relacional que, además de mostrar datos en formato de tabla, cuenta con edición de diseño libre y funciones de scripting. Actualmente se ofrece como \u0026ldquo;Claris FileMaker Pro\u0026rdquo;, y la versión con licencia completa cuesta 594 dólares (a partir de 2024).\nDécada de 1990: El auge de las aplicaciones GUI y el desarrollo empresarial Visual Basic (Microsoft, 1991) IDE especializado en el desarrollo de aplicaciones para Windows. Permitía construir fácilmente aplicaciones basadas en eventos al colocar componentes de la GUI (como botones y etiquetas) mediante arrastrar y soltar. Tras VB6.0 en 1998, se transicionó a la era .NET.\nMicrosoft Access (1992) Herramienta de desarrollo de bases de datos para Windows. Permite el diseño de bases de datos relacionales y la creación de formularios mediante GUI, siendo ampliamente utilizada para el desarrollo de aplicaciones empresariales para el público general. Actualmente se ofrece como parte de Microsoft 365.\nPowerBuilder (PowerSoft/Sybase, 1991) Herramienta de desarrollo 4GL para aplicaciones empresariales. Compatible con la arquitectura cliente-servidor y con fuertes capacidades de integración de bases de datos. Actualmente sigue siendo ofrecido bajo el paraguas de SAP.\nDreamweaver (Macromedia, 1997) Herramienta WYSIWYG que permite la creación visual de páginas web. Permite alternar entre la edición de HTML y la vista de diseño, y también contaba con soporte para ASP y PHP. Actualmente es ofrecida por Adobe y está disponible mediante suscripción (aproximadamente 34.49 dólares al mes).\nFlash (Macromedia, 1996) Originalmente desarrollada como FutureSplash Animator, es una herramienta de creación de animaciones vectoriales. Posteriormente se utilizó para la creación de contenido interactivo para la web, pero su soporte finalizó en 2020 debido a problemas de seguridad.\nGameMaker (1999) Herramienta de creación de juegos 2D para principiantes. La colocación de objetos y el control de eventos son posibles mediante arrastrar y soltar. Posteriormente también añadió soporte para scripting (GML) y actualmente ofrece múltiples planes para uso comercial.\nDécada de 2000: La expansión de la web y el código abierto WordPress (2003) CMS de código abierto que utiliza PHP y MySQL. Permite construir blogs y sitios web corporativos utilizando temas y plugins sin necesidad de conocimientos de programación. Se distribuye gratuitamente y es uno de los CMS más utilizados en todo el mundo.\nWix (2006) Servicio no-code que permite construir sitios web en el navegador. Permite elegir plantillas y editarlas mediante arrastrar y soltar. Además del plan gratuito, los planes pagos permiten el uso de dominios personalizados y funciones de comercio electrónico (e-commerce).\nOutSystems (2001) Plataforma low-code para empresas. Debido a que permite desarrollar sistemas empresariales rápidamente, su adopción avanza en grandes empresas y agencias gubernamentales. Compatible tanto con la nube como con infraestructuras locales (on-premises).\nScratch (MIT, 2007) Herramienta de aprendizaje de programación desarrollada para niños. Permite crear juegos y animaciones combinando bloques de colores, y se utiliza ampliamente en entornos educativos. Se ofrece de forma gratuita.\nAirtable (2013) Servicio basado en la nube que combina hojas de cálculo y bases de datos. Su apariencia es similar a Excel, pero permite relaciones, vistas Kanban, integración de API, entre otros. Es ampliamente utilizado tanto por individuos como por corporaciones.\nDécada de 2010 - 2020: La era de la nube y la automatización En los últimos años, las herramientas low-code / no-code basadas en la nube han evolucionado rápidamente.\nPower Platform (Microsoft) Plataforma integrada para el desarrollo y automatización de aplicaciones empresariales, que incluye \u0026ldquo;Power Apps\u0026rdquo; y \u0026ldquo;Power Automate\u0026rdquo;. Permite construir visualmente procesos empresariales corporativos mediante arrastrar y soltar.\nSalesforce Lightning Platform Base de desarrollo de aplicaciones ofrecida por el CRM Salesforce. Permite crear aplicaciones empresariales con GUI y su integración con otros servicios de Salesforce es sencilla.\nZapier / IFTTT Herramientas de automatización que permiten construir conexiones entre múltiples servicios en la nube sin necesidad de programar. Por ejemplo, se pueden implementar fácilmente flujos de trabajo como \u0026ldquo;Notificar a Slack cuando se ingrese información en Google Forms\u0026rdquo;.\nNotion (Década de 2010) Espacio de trabajo todo en uno que integra la gestión de documentos, gestión de tareas, Wiki, etc. También cuenta con funciones de base de datos personalizada y es útil para la mejora de procesos empresariales sin necesidad de código.\nConstruct 3 / GameSalad Herramientas que permiten crear juegos mediante arrastrar y soltar. Construct 3 es compatible con HTML5 y funciona en el navegador, siendo popular en entornos educativos y entre desarrolladores independientes.\nFuentes de información y notas adicionales Este artículo se ha elaborado basándose en los sitios web oficiales de cada producto, Wikipedia y materiales/artículos de alta fiabilidad (Apple, Microsoft, Adobe, etc.). La información de precios hace referencia en la medida de lo posible a los datos oficiales de la época o los más recientes (indicados principalmente en dólares estadounidenses). Muchas de las herramientas de la década del 2000 en adelante son de suscripción, y las tarifas varían según el plan.\n","date":"2025-04-26T16:46:11+09:00","image":"http://kenji.blog/p/%E3%83%AD%E3%83%BC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%8A%E3%82%88%E3%81%B3%E3%83%8E%E3%83%BC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%AD%B4%E5%8F%B2/img_hu615c889fe1afb242f7436bdb2a6d534f_388471_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E3%83%AD%E3%83%BC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%8A%E3%82%88%E3%81%B3%E3%83%8E%E3%83%BC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%AD%B4%E5%8F%B2/","title":"Historia del no-code en entornos locales"},{"content":"¿Qué es FizzBuzz, al final de cuentas? ¡Hola!\nHoy me gustaría escribir sobre \u0026ldquo;FizzBuzz\u0026rdquo;.\nTanto para los que dicen \u0026ldquo;¡Ah, ya lo conozco!\u0026rdquo; como para los que piensan \u0026ldquo;He escuchado de eso, pero no lo entiendo bien\u0026rdquo;, acompáñenme un momento por favor. Se lee en unos pocos minutos, y quizás terminen diciendo \u0026ldquo;Ya veo\u0026rdquo;.\n¿Es verdad que \u0026ldquo;si no puedes escribir FizzBuzz, no sirves como programador\u0026rdquo;? FizzBuzz, en resumen, es algo como esto.\n1 2 3 4 5 6 7 8 9 for i in range(1, 101): if i % 15 == 0: print(\u0026#34;FizzBuzz\u0026#34;) elif i % 3 == 0: print(\u0026#34;Fizz\u0026#34;) elif i % 5 == 0: print(\u0026#34;Buzz\u0026#34;) else: print(i) Sí, este es el famoso \u0026ldquo;problema de FizzBuzz\u0026rdquo;.\nSe revisan los números del 1 al 100 en orden,\nsi es múltiplo de 3, se muestra \u0026ldquo;Fizz\u0026rdquo;, si es múltiplo de 5, \u0026ldquo;Buzz\u0026rdquo;,\ny si es múltiplo de ambos, \u0026ldquo;FizzBuzz\u0026rdquo;. Es algo extremadamente simple.\nSin embargo, por alguna razón, a menudo es tratado como \u0026ldquo;la prueba mínima para un programador\u0026rdquo;. Aparece en entrevistas, y en las redes sociales de vez en cuando se ven actitudes arrogantes como \u0026ldquo;Alguien que ni siquiera puede escribir FizzBuzz\u0026hellip;\u0026rdquo;.\nPero, un momento.\n¿Realmente se puede afirmar que \u0026ldquo;no poder escribir FizzBuzz = no poder programar\u0026rdquo;?\nNo se trata de si puedes hacerlo, sino de si estás en el \u0026ldquo;estado\u0026rdquo; para hacerlo Es cierto que FizzBuzz requiere comprender la sintaxis y el pensamiento lógico básico. Por lo tanto, es comprensible que se use para \u0026ldquo;comprobar los fundamentos\u0026rdquo;.\nPero, piénsenlo.\nSi el entorno es diferente, el resultado también lo será.\nPor ejemplo,\nCuando estás nervioso frente a un entrevistador que ves por primera vez Cuando de repente te dan una pizarra y no tienes un editor a la mano Cuando te preguntas \u0026ldquo;¿Qué era modulo otra vez?\u0026rdquo; y no te acuerdas al instante \u0026hellip;¿No les ha pasado eso? Somos humanos. Creo que sí pasa.\nPor eso, creo que más que \u0026ldquo;si puedes escribir FizzBuzz\u0026rdquo;, lo que en realidad es importante es \u0026ldquo;si puedes llevarte a un estado donde puedas escribir FizzBuzz\u0026rdquo;.\nLa trampa del típico consejo \u0026ldquo;solo entrénate y estarás bien\u0026rdquo; Cuando se habla de esto, suele surgir el consejo \u0026ldquo;¡Por eso debes practicar todos los días!\u0026rdquo;.\nEs cierto que la práctica repetitiva te permite escribir con fluidez, y eso en sí mismo es bueno. Pero si nos basamos en la premisa de que \u0026ldquo;si no puedes escribir FizzBuzz, estás descalificado\u0026rdquo;, a veces simplemente se convierte en miedo.\nEs decir, se tiende a crear una estructura donde sientes que \u0026ldquo;cometer un error = no sirvo\u0026rdquo;.\nPor ejemplo, el día que te quedas dormido por la mañana tiendes a pensar \u0026ldquo;soy un perezoso\u0026hellip;\u0026rdquo;. Pero puede ser simplemente que tu cuerpo estaba cansado.\nCon FizzBuzz pasa lo mismo.\nA pesar de todo, FizzBuzz también es un buen problema A pesar de todo, no es que FizzBuzz sea malo.\nAl contrario, creo que es un problema muy bien hecho. Las reglas son simples y es fácil de expandir. Por ejemplo, si lo cambias de esta manera, el pensamiento se profundiza más.\n1 2 3 4 5 6 7 for i in range(1, 101): output = \u0026#34;\u0026#34; if i % 3 == 0: output += \u0026#34;Fizz\u0026#34; if i % 5 == 0: output += \u0026#34;Buzz\u0026#34; print(output or i) Este es un ejemplo de que \u0026ldquo;puedes escribirlo sin usar if-elif-else\u0026rdquo;. Es un poco más elegante, ¿verdad?\nEn otras palabras, FizzBuzz no solo sirve para ver \u0026ldquo;si pudiste hacerlo\u0026rdquo;, sino que también es una puerta de entrada para ver \u0026ldquo;cómo lo escribes\u0026rdquo; y \u0026ldquo;hasta qué punto lo entiendes\u0026rdquo;.\nEn conclusión Creo que no hay que darle un significado demasiado exagerado a si puedes hacer FizzBuzz o no.\nIncluso si no pudiste escribirlo, puede que simplemente \u0026ldquo;hoy estabas en un mal momento\u0026rdquo;, y a menudo puedes hacerlo si lo piensas detenidamente después.\nSin apresurarnos, avancemos lentamente.\nEl código es escrito por humanos. Por ser humanos, a veces olvidamos y a veces nos ponemos nerviosos. Creo que es suficiente si podemos avanzar poco a poco mientras aceptamos eso.\nEntonces, escribamos código de manera relajada hoy también.\n","date":"2025-04-18T00:58:11+09:00","image":"http://kenji.blog/p/fizzbuzz/img_hu0b23239076c3049a7d4382dec6ccfba6_85967_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/fizzbuzz/","title":"FizzBuzz"},{"content":"La Torre de Hanói ¡Hola!\nHoy me gustaría explicar sobre \u0026ldquo;La Torre de Hanói\u0026rdquo; junto con un programa de ejemplo en Python.\n¿Qué es La Torre de Hanói? La Torre de Hanói es un rompecabezas que usa 3 varillas y varios discos. Los discos tienen diferentes tamaños y, al principio, están apilados en una sola varilla en orden de tamaño de mayor a menor. Las reglas son las siguientes:\nSolo se puede mover un disco a la vez. No se puede colocar un disco más grande sobre uno más pequeño. Este rompecabezas se considera un material didáctico excelente para aprender el pensamiento recursivo. La recursividad es un método para resolver un problema dividiéndolo en problemas más pequeños del mismo tipo. En la Torre de Hanói, para mover n discos, se repite la operación de mover n-1 discos.\nResolvamos la Torre de Hanói en Python A continuación, se muestra un código de ejemplo en Python para resolver la Torre de Hanói.\n1 2 3 4 5 6 7 8 9 10 def hanoi(n, source, target, auxiliary): if n == 1: print(f\u0026#34;Move disk 1 from {source} to {target}\u0026#34;) return hanoi(n - 1, source, auxiliary, target) print(f\u0026#34;Move disk {n} from {source} to {target}\u0026#34;) hanoi(n - 1, auxiliary, target, source) # Ejemplo: Mover 3 discos de A a C hanoi(3, \u0026#39;A\u0026#39;, \u0026#39;C\u0026#39;, \u0026#39;B\u0026#39;) En este código, la función hanoi se llama recursivamente y se muestran los pasos para mover los discos. Por ejemplo, para 3 discos, se obtiene la siguiente salida:\n1 2 3 4 5 6 7 Move disk 1 from A to C Move disk 2 from A to B Move disk 1 from C to B Move disk 3 from A to C Move disk 1 from B to A Move disk 2 from B to C Move disk 1 from A to C De esta manera, al usar un enfoque recursivo, se pueden resolver problemas complejos de forma sencilla.\n¿Cuánto tiempo se tarda en mover 64 discos? El número de movimientos en la Torre de Hanói requiere al menos 2^n - 1 veces. Es decir, para mover 64 discos, se necesitan 2^64 - 1 veces, aproximadamente 1.84×10^19 movimientos. Incluso si pudieras mover uno por segundo, tomaría unos 584,900 millones de años. Esto es aproximadamente 42 veces la edad del universo (unos 13,700 millones de años).\nAsí, a medida que aumenta el número de discos, el número de movimientos necesarios aumenta exponencialmente. Por lo tanto, no es realista mover 64 discos en la práctica.\nResumen La Torre de Hanói es el rompecabezas perfecto para aprender el pensamiento recursivo. Usando Python, puedes implementar fácilmente su solución. Sin embargo, debes tener cuidado porque a medida que aumenta el número de discos, el número de movimientos necesarios aumenta drásticamente.\nAl comprender el enfoque recursivo y escribir el código tú mismo, puedes mejorar tus habilidades de programación. ¡Por favor, intenta el desafío de la Torre de Hanói!\n","date":"2025-04-17T22:23:14+09:00","image":"http://kenji.blog/p/%E3%83%8F%E3%83%8E%E3%82%A4%E3%81%AE%E5%A1%94/img_hub916bf71b02b2ffc8b3c247adaa061ec_2314383_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E3%83%8F%E3%83%8E%E3%82%A4%E3%81%AE%E5%A1%94/","title":"La Torre de Hanói"},{"content":"Número de líneas de código fuente ¡Hola!\nHoy quiero hablar sobre un tema un poco inusual.\nSe trata de \u0026ldquo;¿Cuánto han aumentado las líneas de código fuente en comparación con el pasado?\u0026rdquo;.\nPor ejemplo, el software del transbordador espacial constaba de unas 420.000 líneas de código. Este código fue desarrollado bajo un proceso muy estricto para cumplir con los altos estándares de calidad de la NASA. Por otro lado, en los proyectos de software a gran escala modernos, no es raro que el número de líneas de código supere varias decenas de millones. Por ejemplo, se dice que la base de código de Google alcanza unos 2 mil millones de líneas.\nDe esta manera, la escala del software ha ido creciendo con el tiempo.\nPero, esperen un momento.\nEl aumento en el número de líneas de código no es necesariamente algo malo. Para agregar nuevas funciones o responder a las necesidades de los usuarios, es natural que el código crezca. Sin embargo, a medida que aumenta el código, también lo hace el riesgo de errores (bugs). De hecho, una investigación muestra que cuando un proyecto de código abierto supera el millón de líneas, la tasa de aparición de errores tiende a aumentar.\nDicho esto, no todos los proyectos aumentan su código de la misma manera.\nPor ejemplo, el kernel de Linux tenía unas 200.000 líneas en la versión 1.0 de 1994, pero aumentó a unas 20 millones de líneas en la versión 4.2 de 2015. Este aumento se debe a la necesidad de adaptarse a la evolución del hardware y agregar nuevas funciones.\nPor lo tanto, el número de líneas de código fuente varía mucho según la escala, el propósito y el contexto histórico del proyecto.\nEl aumento en el número de líneas de código en sí mismo no es un problema, pero para mantener la calidad y la capacidad de mantenimiento, es necesaria una gestión adecuada. Es importante comprender los riesgos asociados con el aumento del código y tomar las medidas adecuadas.\nPor último, creo que es importante no obsesionarse demasiado con el número de líneas de código, sino centrarse en el propósito y la calidad del proyecto.\n¡Nos vemos en la próxima!\n","date":"2025-04-17T10:33:02+09:00","image":"http://kenji.blog/p/%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E8%A1%8C%E6%95%B0/img_1_hu5eec8f3e01b611d6fcced12ecef63fb0_956545_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E8%A1%8C%E6%95%B0/","title":"Número de líneas de código fuente"},{"content":"Principio de Kerckhoffs ¡Hola!\nHoy me gustaría hablar sobre un tema un poco interesante y, de hecho, extremadamente importante: el \u0026ldquo;Principio de Kerckhoffs\u0026rdquo;.\nAh, esperen, esperen. Quizás algunos de ustedes piensen: \u0026ldquo;Nunca he oído hablar del \u0026lsquo;Principio de Kerckhoffs\u0026rsquo; y suena demasiado técnico\u0026hellip;\u0026rdquo;. No se preocupen. Este artículo está escrito precisamente para ustedes.\n¿Qué significa una \u0026ldquo;criptografía segura\u0026rdquo;? Por ejemplo, imaginen que alguien les dice: \u0026ldquo;Esta caja fuerte solo puede ser abierta por quienes conocen el método secreto\u0026rdquo;.\nA primera vista, eso parece muy seguro, ¿verdad? Pero, si lo piensan bien, ¿no les da un poco de inquietud?\nAlgo así como, \u0026ldquo;¿qué pasa si se descubre ese secreto? ¿Se acabó todo?\u0026rdquo;.\nDe hecho, este es el motivo por el cual aparece el Principio de Kerckhoffs.\nPero, ¿qué es el \u0026ldquo;Principio de Kerckhoffs\u0026rdquo;? En términos muy generales, es la idea de que:\n\u0026ldquo;Un sistema criptográfico debe ser seguro incluso si se conoce su funcionamiento.\u0026rdquo;\nDicho de otra manera: \u0026ldquo;La seguridad debe depender únicamente de la \u0026lsquo;clave secreta\u0026rsquo;, ¡y está bien que el método de encriptación en sí sea público!\u0026rdquo;.\nPor el contrario, esto significa que \u0026ldquo;un sistema donde solo el algoritmo (el funcionamiento) es un secreto, se considera poco confiable\u0026rdquo;.\n\u0026ldquo;Si el funcionamiento es secreto, es seguro\u0026rdquo; puede ser un poco peligroso Una forma de pensar muy común es esta:\n\u0026ldquo;Nadie ha visto el interior de esta aplicación, así que la seguridad está bien.\u0026rdquo;\nEntiendo el sentimiento. Pero, eso es lo mismo que decir \u0026ldquo;como nadie lo ha visto, no encontrarán los defectos, así que estamos a salvo\u0026rdquo;.\nEn realidad, el simple hecho de que \u0026ldquo;nadie lo haya visto\u0026rdquo; puede convertirse en un riesgo en sí mismo.\n¿Pero por qué es tan importante este principio? La razón es que, si alguien logra descubrir cómo funciona y puede descifrarlo fácilmente, entonces ese sistema criptográfico ya no sirve.\nPara usar una analogía, es como tener una cerradura con un mecanismo muy complejo, pero que resulta que se puede abrir con una llave maestra comprada en una tienda de todo a un dólar.\nLo importante no es decir \u0026ldquo;estamos seguros porque la llave es secreta\u0026rdquo;, sino \u0026ldquo;incluso si mostramos todo el mecanismo, no se puede abrir sin la llave correcta\u0026rdquo;.\nEl sentimiento de \u0026ldquo;¿pero no da un poco de miedo?\u0026rdquo; Aquí es donde muchas personas sienten:\n\u0026ldquo;Revelar todo el mecanismo, ¿no da un poco de miedo?\u0026rdquo;\nEsa inquietud es comprensible. Porque es natural pensar: \u0026ldquo;Si muestro todo lo que hay dentro, ¿no me copiarán o lo usarán con malas intenciones?\u0026rdquo;.\nPero, ahí es exactamente donde radica el núcleo del Principio de Kerckhoffs. La \u0026ldquo;fortaleza que no se desmorona incluso al mostrar el interior\u0026rdquo; es lo que constituye la verdadera seguridad.\nDicho esto, requiere un poco de valor al principio Si nos ponemos en el lugar de los desarrolladores, \u0026ldquo;hacer público el funcionamiento = que se vean las debilidades\u0026rdquo;, y claro, eso da nervios.\nPero piénsenlo un momento.\nUn sistema que se muestra de forma transparente y dice \u0026ldquo;cualquiera puede verificarlo\u0026rdquo;, al final resulta más confiable.\nEs parecido a las relaciones humanas, ¿verdad?\n\u0026ldquo;Las personas que nos aceptan después de mostrarles nuestro verdadero yo\u0026rdquo; son, al fin y al cabo, las que más tranquilidad nos dan.\nEn conclusión El Principio de Kerckhoffs puede sonar un poco teórico, pero su esencia es muy simple.\nSe trata simplemente de: \u0026ldquo;Creemos un sistema que no se rompa sin importar a quién se lo mostremos.\u0026rdquo;\nMás allá de los secretos superficiales, un diseño sólido. En lugar de código que no quieres que nadie vea, código que no te dé vergüenza mostrar.\nEse tipo de \u0026ldquo;fortaleza\u0026rdquo; será cada vez más demandado en los tiempos venideros.\n¡Gracias por leer!\nHablar de seguridad puede ser un poco difícil, pero tiene partes que se conectan con \u0026ldquo;las relaciones humanas\u0026rdquo; o \u0026ldquo;la sensación de seguridad en la vida diaria\u0026rdquo;, ¿verdad? Sin presiones, si vamos aprendiendo poco a poco, seguro que traerá cosas buenas.\n","date":"2025-04-16T23:53:08+09:00","image":"http://kenji.blog/p/%E3%82%B1%E3%83%AB%E3%82%AF%E3%83%9B%E3%83%95%E3%82%B9%E3%81%AE%E5%8E%9F%E7%90%86/img_2_hu71b6c82ab9eb0ac0abd797e00918df90_2573611_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E3%82%B1%E3%83%AB%E3%82%AF%E3%83%9B%E3%83%95%E3%82%B9%E3%81%AE%E5%8E%9F%E7%90%86/","title":"Principio de Kerckhoffs"},{"content":"🎯 Pasos para ejecutar PowerShell desde C++ a través de una DLL de C++/CLI (Visual Studio 2022 / C++) ✅ Arquitectura general 🔹 ① DLL envoltura CLI (C++/CLI) Proporciona la funcionalidad para ejecutar scripts de PowerShell.\n🔹 ② Lado de llamada C++ nativo Llama a la DLL CLI para ejecutar el script de PowerShell.\n🔧 Paso 1: Creación del proyecto de la DLL envoltura CLI 1. Creación del proyecto [Crear un proyecto nuevo] → [C++] → Biblioteca de clases CLR (.NET Framework) Nombre: PowerShellWrapper 💡 Si no ves esta plantilla, instala la carga de trabajo \u0026ldquo;Desarrollo de escritorio de .NET\u0026rdquo;.\n2. Añadir paquete NuGet Haz clic derecho en el proyecto → [Administrar paquetes NuGet] Busca e instala System.Management.Automation\n(Versión 5.x o 7.x) 3. Implementación del código en el lado CLI PowerShellWrapper.h 1 2 3 4 5 6 7 8 9 10 #pragma once using namespace System; namespace PowerShellWrapper { public ref class PowerShellExecutor { public: String^ Execute(String^ script); }; } PowerShellWrapper.cpp 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include \u0026#34;PowerShellWrapper.h\u0026#34; using namespace System; using namespace System::Management::Automation; using namespace System::Collections::ObjectModel; String^ PowerShellWrapper::PowerShellExecutor::Execute(String^ script) { PowerShell^ ps = PowerShell::Create(); ps-\u0026gt;AddScript(script); Collection\u0026lt;PSObject^\u0026gt;^ results = ps-\u0026gt;Invoke(); System::Text::StringBuilder^ sb = gcnew System::Text::StringBuilder(); for each (PSObject^ result in results) { sb-\u0026gt;AppendLine(result-\u0026gt;ToString()); } return sb-\u0026gt;ToString(); } 🔧 Paso 2: Llamada desde el lado de C++ nativo 1. Crear proyecto de aplicación de consola C++ Nombre: NativeApp 2. Configurar referencias Haz clic derecho en el proyecto → [Agregar] → [Referencia] → [Proyectos] → Agrega PowerShellWrapper [Propiedades de configuración] → [C/C++] → [Soporte de Common Language Runtime] → Cambiar a /clr 3. Código de ejecución (main.cpp) 1 2 3 4 5 6 7 8 9 10 11 12 13 #using \u0026lt;System.dll\u0026gt; #using \u0026#34;..\\\\PowerShellWrapper\\\\Debug\\\\PowerShellWrapper.dll\u0026#34; using namespace System; using namespace PowerShellWrapper; int main() { PowerShellExecutor^ executor = gcnew PowerShellExecutor(); String^ result = executor-\u0026gt;Execute(\u0026#34;Get-Process | Select-Object -First 1\u0026#34;); Console::WriteLine(result); return 0; } 💡 Nota adicional (IDL / TLB / Registro COM) Esta configuración hace referencia directa a una DLL de .NET en lugar de COM, por lo tanto, no se requiere IDL, TLB ni registro COM. ✅ Estructura final 1 2 3 4 5 Solution ├── PowerShellWrapper (DLL C++/CLI) │ └── PowerShellExecutor ├── NativeApp (EXE C++) └── main.cpp → Llamada a la DLL ","date":"2025-04-16T01:58:03+09:00","image":"http://kenji.blog/p/c-%E3%81%8B%E3%82%89-powershell-%E3%82%92-c-cli-dll-%E7%B5%8C%E7%94%B1%E3%81%A7%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E6%89%8B%E9%A0%86/img_hu7575b218a6ea53bc902a4f89abde2058_17844_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/c-%E3%81%8B%E3%82%89-powershell-%E3%82%92-c-cli-dll-%E7%B5%8C%E7%94%B1%E3%81%A7%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E6%89%8B%E9%A0%86/","title":"Pasos para ejecutar PowerShell desde C++ a través de una DLL de C++/CLI"},{"content":"[Windows] Cómo verificar el estado de la licencia (con un solo comando) ¿Alguna vez te has preguntado si la licencia de tu Windows está correctamente activada?\nPara esos momentos, es muy útil el método para verificar la información de la licencia con un solo comando. Con solo seguir los siguientes pasos, puedes comprobar fácilmente el estado actual de tu licencia.\nComando para verificar el estado de la licencia Puedes mostrar la información de la licencia usando la herramienta de script estándar de Windows. El comando a usar es este:\n1 slmgr /dli Al ejecutar este comando, se mostrará parte de la información de la licencia en una ventana.\nMétodo de ejecución Ingresa \u0026ldquo;cmd\u0026rdquo; en el \u0026ldquo;Menú de inicio\u0026rdquo;, haz clic derecho en el Símbolo del sistema → \u0026ldquo;Ejecutar como administrador\u0026rdquo;.\nIngresa lo siguiente en el símbolo del sistema y presiona la tecla Enter:\n1 slmgr /dli Espera unos segundos y se mostrará la información de la licencia de la siguiente manera.\nPrincipal información mostrada Parte de la clave del producto Tipo de licencia (Retail, OEM, etc.) Estado de la licencia (activa, caducada, no activada, etc.) ¿Quieres saber información más detallada? También existen los siguientes comandos:\nslmgr /dlv: Muestra información de licencia más detallada slmgr /xpr: Muestra la fecha de vencimiento de la licencia (si es permanente, etc.) Resumen El estado de la licencia de Windows se puede verificar fácilmente con un solo comando.\nVerificación simple: slmgr /dli Verificación detallada: slmgr /dlv Verificación de vencimiento: slmgr /xpr Si hay un problema con la licencia, puede haber restricciones en las actualizaciones o en algunas funciones, por lo que es seguro verificarlo de forma regular.\n","date":"2025-04-14T00:41:45+09:00","image":"http://kenji.blog/p/windows-%E3%81%AE%E3%83%A9%E3%82%A4%E3%82%BB%E3%83%B3%E3%82%B9%E3%81%AE%E7%8A%B6%E6%85%8B%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/img_1_hudcf97514836ad006a409bb9b34fbe340_111425_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/windows-%E3%81%AE%E3%83%A9%E3%82%A4%E3%82%BB%E3%83%B3%E3%82%B9%E3%81%AE%E7%8A%B6%E6%85%8B%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/","title":"Comando para verificar el estado de la licencia de Windows"},{"content":"Parámetros de conversión de ffmpeg optimizados para iOS A continuación, se presenta el comando ffmpeg para convertir videos y que se reproduzcan sin problemas en dispositivos iOS (iPhone o iPad).\n1 2 3 4 5 6 ffmpeg -i input.mp4 \\ -c:v libx264 -profile:v high -level 4.1 \\ -vf \u0026#34;scale=1920:-2\u0026#34; -r 30 \\ -crf 20 -preset slow \\ -c:a aac -b:a 128k -ar 48000 \\ -movflags +faststart output.mp4 Significado de cada opción (breve explicación) Opción Descripción -i input.mp4 Archivo de entrada (video a convertir) -c:v libx264 Codifica el video en H.264 (compatible con iOS) -profile:v high -level 4.1 Perfil y nivel de amplia compatibilidad en iOS -vf \u0026quot;scale=1920:-2\u0026quot; Redimensiona a 1920px de ancho, ajuste automático de altura para mantener la relación de aspecto -r 30 Convierte la tasa de cuadros a 30fps -crf 20 Calidad de video (menor valor = mayor calidad, recomendado 18-23) -preset slow Balance entre velocidad de codificación y compresión (slow = alta compresión y calidad) -c:a aac Codifica el audio en formato AAC -b:a 128k Establece la tasa de bits de audio en 128kbps -ar 48000 Establece la frecuencia de muestreo de audio en 48kHz (recomendado para iOS) -movflags +faststart Coloca el índice al inicio del video, acelerando la reproducción por streaming en Web e iOS Se espera que los videos convertidos con esta configuración tengan alta compatibilidad y una reproducción fluida en dispositivos de Apple como iPhone e iPad.\nSi es necesario, puedes ajustar el tamaño del archivo y la calidad de la imagen modificando la resolución y la tasa de bits. Si necesitas alta calidad, intenta establecer -crf alrededor de 18; si deseas reducir el tamaño del archivo, configúralo entre 22 y 25.\n","date":"2025-03-02T04:16:07+09:00","image":"http://kenji.blog/p/ios-%E5%90%91%E3%81%91%E3%81%AE-ffmpeg-%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF/img_hu6ca6c354dba8425c4a9e54b9842ad89b_30790_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/ios-%E5%90%91%E3%81%91%E3%81%AE-ffmpeg-%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF/","title":"Parámetros de ffmpeg para iOS"},{"content":"Procedimiento de restauración para dispositivos Android (Google Pixel) Si tu dispositivo Google Pixel sufre un problema grave del sistema, como \u0026ldquo;reinicios constantes (bootloop)\u0026rdquo;, \u0026ldquo;se queda bloqueado en la pantalla del logotipo\u0026rdquo; o \u0026ldquo;el funcionamiento se vuelve extremadamente inestable\u0026rdquo;, puedes usar la herramienta oficial de Google \u0026ldquo;Pixel Update and Software Repair\u0026rdquo; para reparar (restaurar) de forma segura el software de tu dispositivo a través del navegador.\nEn este artículo, explicaremos en detalle el procedimiento específico y los puntos a tener en cuenta.\n1. Acceder a la herramienta de restauración Primero, accede a la página oficial de la herramienta de reparación desde el navegador (se recomienda Google Chrome o Microsoft Edge) de tu PC (Windows o Mac).\n🔗 Sitio oficial de Pixel Update and Software Repair\n※Nota※ Al ejecutar el proceso de restauración, es posible que los datos del dispositivo (fotos, aplicaciones, contactos, etc.) se borren (inicialicen) por completo. Si el dispositivo aún se puede utilizar, asegúrate de realizar previamente una copia de seguridad en Google Drive u otro servicio.\n2. Preparación previa para la restauración Para que el proceso se desarrolle sin problemas, prepara lo siguiente:\nCargar la batería Si el dispositivo se apaga durante el proceso, existe el riesgo de que se convierta en un \u0026ldquo;ladrillo\u0026rdquo; (se averíe por completo). Asegúrate de tener al menos un 50% de batería, y preferiblemente cárgalo por completo. Preparar el cable USB original Para garantizar una transferencia de datos estable, se recomienda encarecidamente utilizar el cable USB-C original incluido con el dispositivo. (Si es necesario) Instalar controladores Si utilizas un PC con Windows, es posible que el dispositivo no se reconozca correctamente. En ese caso, instala el Controlador USB de Google. 3. Pasos específicos de la restauración Una vez completada la preparación, sigue las instrucciones en pantalla para proceder con la restauración.\nPaso 1: Selección del operador y conexión del dispositivo Al abrir el sitio, primero verás una pantalla para seleccionar tu operador de telefonía (compañía telefónica). Si tienes una versión libre (SIM-free) o no estás atado a un operador, selecciona \u0026ldquo;Otros (Other)\u0026rdquo; u opciones similares. A continuación, conecta tu PC y tu dispositivo Pixel con el cable USB.\nPaso 2: Poner el dispositivo en \u0026ldquo;Modo de rescate (Rescue Mode / Fastboot)\u0026rdquo; Siguiendo las instrucciones en pantalla, con el dispositivo apagado, mantén presionados simultáneamente el \u0026ldquo;botón de encendido\u0026rdquo; y el \u0026ldquo;botón de bajar volumen\u0026rdquo; para iniciar el modo Fastboot (una pantalla con fondo negro y la mascota de Android tumbada).\nPaso 3: Reconocimiento del dispositivo en el PC Haz clic en el botón \u0026ldquo;Conectar dispositivo\u0026rdquo; en el navegador; se abrirá una ventana emergente que mostrará una lista de los dispositivos Pixel conectados. Selecciona tu dispositivo y permite la conexión.\nPaso 4: Descarga e instalación del software Una vez reconocido el dispositivo, se seleccionará automáticamente la versión más adecuada del sistema operativo Android (firmware). Al hacer clic en \u0026ldquo;Instalar\u0026rdquo;, el software se descargará en el PC e inmediatamente comenzará a escribirse (flashearse) en el dispositivo.\n⚠️ Advertencia: Durante este proceso, ** nunca desconectes el cable USB ni apagues el PC.**\nPaso 5: Finalización y configuración inicial El proceso de restauración será un éxito cuando la barra de progreso alcance el 100% y aparezca el mensaje de \u0026ldquo;Completado\u0026rdquo;. El dispositivo se reiniciará automáticamente y mostrará la pantalla de configuración inicial, como cuando lo compraste (la pantalla de \u0026ldquo;Hola\u0026rdquo;).\nResumen La herramienta oficial de reparación de Google Pixel es una excelente utilidad que te permite restaurar el firmware de forma segura con solo unos clics en el navegador, sin necesidad de ejecutar directamente comandos especiales (adb o fastboot).\nAntes de llevar tu dispositivo a una tienda debido a problemas de funcionamiento, te recomendamos intentar este procedimiento; es posible que el problema se resuelva fácilmente. Esperamos que esta guía te sea de utilidad.\n","date":"2025-02-28T01:20:41+09:00","image":"http://kenji.blog/p/androidgoogle-pixel%E7%AB%AF%E6%9C%AB%E3%81%AE%E5%BE%A9%E5%85%83%E6%89%8B%E9%A0%86/pixel_restore_eyecatch_1788588727945_hu9d405d830ed3e56e9e703ab601cf6c0a_776052_120x120_fill_q75_box_smart1.jpg","permalink":"http://kenji.blog/es/p/androidgoogle-pixel%E7%AB%AF%E6%9C%AB%E3%81%AE%E5%BE%A9%E5%85%83%E6%89%8B%E9%A0%86/","title":"Procedimiento de restauración de software (inicialización/reparación) para dispositivos Android (Google Pixel)"},{"content":"Enviar Gmail desde curl 1. Obtener la contraseña de la aplicación https://myaccount.google.com/apppasswords Haz clic en el enlace de arriba e introduce el nombre de la aplicación. Guarda la contraseña generada.\n2. Enviar un correo electrónico con el comando curl Ejecuta el siguiente comando.\nEn el ejemplo de abajo, el contenido del correo electrónico está descrito en mail.txt.\n1 2 3 4 5 6 From: from@gmail.com To: to@gmail.com Subject: Correo de prueba Content-Type: text/plain; charset=\u0026#34;UTF-8\u0026#34; Este es un correo de prueba. Crea el archivo anterior y ejecuta el siguiente comando.\n1 curl --url \u0026#34;smtps://smtp.gmail.com:465\u0026#34; --ssl-reqd --mail-from \u0026#34;from@gmail.com\u0026#34; --mail-rcpt \u0026#34;to@gmail.com\u0026#34; --user \u0026#34;from@gmail.com:xxxxxxxxxxxxxxxx\u0026#34; --upload-file mail.txt ※ Sustituye xxxxxxxxxxxxxxxx por la contraseña de tu aplicación.\n","date":"2025-02-27T02:13:31+09:00","image":"http://kenji.blog/p/gmail%E3%82%92curl%E3%81%8B%E3%82%89%E9%80%81%E3%82%8B/img_hua1028a8ea194106f3853f4bdf4e1e991_75790_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/gmail%E3%82%92curl%E3%81%8B%E3%82%89%E9%80%81%E3%82%8B/","title":"Enviar Gmail desde curl"},{"content":"Esta es una introducción a ejemplos de código utilizando la biblioteca estándar.\nDescargar y mostrar una imagen 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 import urllib.request import tempfile import os import webbrowser import time url = \u0026#34;https://www.aomori-ringo.or.jp/kids/wp-content/uploads/2021/11/apple.png\u0026#34; try: with urllib.request.urlopen(url) as response: img_data = response.read() # Guardar en un archivo temporal y mostrar with tempfile.NamedTemporaryFile(delete=False, suffix=\u0026#34;.png\u0026#34;) as tmp: tmp.write(img_data) print(f\u0026#34;file://{tmp.name}\u0026#34;) webbrowser.open(f\u0026#34;file://{tmp.name}\u0026#34;) time.sleep(3) except Exception as e: print(f\u0026#34;Ocurrió un error: {e}\u0026#34;) finally: if \u0026#39;tmp\u0026#39; in locals(): os.unlink(tmp.name) # Eliminar archivo temporal ","date":"2025-02-24T18:21:14+09:00","image":"http://kenji.blog/p/python%E3%82%B3%E3%83%BC%E3%83%89%E7%89%87/img_hu6807d8c9816a78d77990562cff91e319_70806_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/python%E3%82%B3%E3%83%BC%E3%83%89%E7%89%87/","title":"Fragmentos de código de Python"},{"content":"Llamar a la API de ChatGPT desde curl Se asume que se llama desde el símbolo del sistema de Windows.\n1 2 curl https://api.openai.com/v1/chat/completions -H \u0026#34;Content-Type: application/json\u0026#34; -H \u0026#34;Authorization: Bearer sk-proj-XXXXXXXXXXXXXXXXXXXX\u0026#34; -d \u0026#34;{\u0026#34;\u0026#34;model\u0026#34;\u0026#34;: \u0026#34;\u0026#34;gpt-3.5-turbo\u0026#34;\u0026#34;,\u0026#34;\u0026#34;messages\u0026#34;\u0026#34;: [{\u0026#34;\u0026#34;role\u0026#34;\u0026#34;: \u0026#34;\u0026#34;system\u0026#34;\u0026#34;, \u0026#34;\u0026#34;content\u0026#34;\u0026#34;: \u0026#34;\u0026#34;Por favor, responde en dialecto de Kansai.\u0026#34;\u0026#34;}, {\u0026#34;\u0026#34;role\u0026#34;\u0026#34;: \u0026#34;\u0026#34;user\u0026#34;\u0026#34;, \u0026#34;\u0026#34;content\u0026#34;\u0026#34;: \u0026#34;\u0026#34;Inserta el mensaje que deseas enviar aquí\u0026#34;\u0026#34;}]}\u0026#34; ","date":"2025-02-01T17:15:34+09:00","image":"http://kenji.blog/p/chatgpt-api%E3%82%92curl%E3%81%8B%E3%82%89%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%99/img_huc9cfad0a382aa812189dd7635d7709f2_1078030_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/chatgpt-api%E3%82%92curl%E3%81%8B%E3%82%89%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%99/","title":"Llamar a la API de ChatGPT desde curl"},{"content":"Resumen de acciones de altos dividendos Mitsubishi UFJ Financial Group (8306) Sumitomo Mitsui Financial Group (8316) Mitsubishi Corporation (8058) Itochu Corporation (8001) NTT (9432) KDDI (9433) Okinawa Cellular Telephone (9436) Tokio Marine Holdings (8766) Toyota Motor (7203) Yamaha Motor (7272) Asahi Group Holdings (2502) Kirin Holdings (2503) JT (2914) Bridgestone (5108) Daiwa House Industry (1925) Sekisui House (1928) Kyocera (6971) Shin-Etsu Chemical (4063) Nitto Denko (6988) Orix (8591) Mitsubishi HC Capital (8593) Hulic (3003) ","date":"2024-12-22T00:56:14+09:00","image":"http://kenji.blog/p/%E9%AB%98%E9%85%8D%E5%BD%93%E6%A0%AA%E3%81%BE%E3%81%A8%E3%82%81/img_huf2943e4fc5463d0d6e36ddd1be1ac839_1663544_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E9%AB%98%E9%85%8D%E5%BD%93%E6%A0%AA%E3%81%BE%E3%81%A8%E3%82%81/","title":"Resumen de acciones de altos dividendos"},{"content":"Metas a largo plazo En 1 año Iniciar un negocio Crear una página web y lanzar un software (gratuito) En 2 años Ventas anuales de 10 millones de yenes Publicar un libro Lanzar un software (de pago) En 3 años Ventas anuales de 100 millones de yenes En 5 años Ventas anuales de mil millones de yenes En 10 años Ventas anuales de 10 mil millones de yenes Metas a corto plazo En 1 mes Crear un plan de negocios En 3 meses Recaudar fondos para iniciar el negocio (alrededor de 5 millones de yenes) En 6 meses Iniciar el negocio En 1 año Poner el negocio en marcha Tareas inmediatas Clarificar metas y visión Propósito: ¿Por qué crear software? Ejemplo: Para resolver problemas, proporcionar nuevo valor, apuntar a un nicho de mercado específico, etc. Visión: ¿Qué tipo de futuro quieres realizar a través del software? Ejemplo: Mejorar la eficiencia del trabajo, hacer la vida diaria más cómoda, mejorar la calidad de la educación, etc. Investigación de mercado y análisis de necesidades Usuarios objetivo: ¿Quién usará el software? Definir grupo de edad, ocupación, intereses, etc. específicamente. Investigación de competidores: ¿Hay competidores en el mismo campo? Analizar sus fortalezas y debilidades. Identificación de necesidades: Comprender los problemas no resueltos o solicitudes de los usuarios objetivo. Diseño y características del software Características básicas: Listar las características esenciales. Ejemplo: Autenticación de usuarios, almacenamiento de datos, características de análisis, etc. Puntos de diferenciación: Aclarar qué hace único al producto en comparación con otros. Ejemplo: Interfaz de usuario simple, uso de IA, alta personalización. Especificaciones técnicas: Lenguajes de programación, frameworks, bases de datos, etc. a utilizar. Plan de desarrollo y asignación de recursos Cronograma de desarrollo: Establecer una línea de tiempo para cada etapa del proyecto. Ejemplo: Desarrollo de prototipos, pruebas, lanzamiento oficial. Composición del equipo: Recursos humanos requeridos y conjuntos de habilidades (programadores, diseñadores, personal de marketing, etc.). Presupuesto: Estimar costos de desarrollo, costos de marketing y costos operativos. Marketing y modelo de ingresos Métodos de promoción: Utilizar redes sociales, sitios web, anuncios, etc. para aumentar el conocimiento. Estrategia de monetización: Considerar opciones como versión gratuita + versión de pago, suscripción mensual, ingresos publicitarios, etc. Estrategia de adquisición de usuarios: Ofrecer pruebas gratuitas, promover el boca a boca, formar comunidades de usuarios, etc. Operación y escalamiento Operación post-lanzamiento: Recopilar comentarios de los usuarios, corregir errores, añadir características. Estrategia de crecimiento: Planificar cómo aumentar el número de usuarios, expandirse a otros países o desarrollar nuevas características. Gestión de riesgos: Preparar contramedidas para problemas legales o técnicos. ","date":"2024-12-08T03:32:34+09:00","image":"http://kenji.blog/p/%E7%9B%AE%E6%A8%99/img_huc6a3627da74a1082cbdd433fea41830c_4007614_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E7%9B%AE%E6%A8%99/","title":"Objetivos"},{"content":"Recientemente, he empezado a interesarme por los productos de cuero y he estado comprando varios artículos. Al hacerlo, también me interesé por el mantenimiento de los productos de cuero, así que he reunido algunos artículos relacionados que me gustaría presentarles.\nProductos de mantenimiento para cuero comprados recientemente M.MOWBRAY DELICATE CREAM Precio: Alrededor de 1,320 yenes\nEsta crema proporciona nutrición, hidratación y un efecto suavizante. No produce brillo, pero es adecuada para cueros que necesitan mucha humedad e hidratación. No tiene un mal olor, pero sí tiene un ligero aroma. Al ser incolora, creo que es muy versátil. Ya que es una crema ligera, podría ser bueno usar un poco más en comparación con otras cremas.\nCollonil 1909 Supreme Creme de Luxe Precio: Alrededor de 1,777 yenes\nEs una crema famosa, estándar y versátil, resistente a las manchas. Repara el color del cuero y lo deja hidratado. Proporciona un poco de brillo. Es de color blanco y también se puede esperar un efecto repelente al agua.\nM.MOWBRAY SHOE CREAM (Negro) Precio: Alrededor de 1,000 yenes\nCrema para zapatos. Contiene cera, aceites y disolventes orgánicos. Repara el color del cuero y proporciona brillo. Como es negra, se aplica en cuero negro. Yo la uso para mis zapatos de traje.\nM.MOWBRAY STAIN REMOVER Precio: Alrededor de 700 yenes\nEs algo que venía incluido cuando compré un cepillo. Limpiador a base de agua para zapatos. Elimina la suciedad del cuero. Si empapas bien un paño y lo frotas suavemente sobre el cuero, la suciedad desaparecerá.\n","date":"2024-10-30T00:31:46+09:00","image":"http://kenji.blog/p/%E9%9D%A9%E8%A3%BD%E5%93%81%E3%81%AE%E3%83%A1%E3%83%B3%E3%83%86%E3%83%8A%E3%83%B3%E3%82%B9/img_hu3ddba03af9cef883a82321d0a762e708_211817_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E9%9D%A9%E8%A3%BD%E5%93%81%E3%81%AE%E3%83%A1%E3%83%B3%E3%83%86%E3%83%8A%E3%83%B3%E3%82%B9/","title":"Mantenimiento de productos de cuero"},{"content":"¡Hola! Hoy hablaremos sobre \u0026ldquo;El principio de Hanlon\u0026rdquo; Hoy me gustaría escribir sobre una forma de pensar con un nombre algo peculiar: \u0026ldquo;El principio de Hanlon\u0026rdquo; (o Navaja de Hanlon). Al escuchar el nombre, puede que pienses: \u0026ldquo;¿Suena un poco intimidante\u0026hellip;?\u0026rdquo;, pero en realidad es una idea muy cercana que nos ofrece una perspectiva amable.\n¿Alguna vez has pensado: \u0026ldquo;A esa persona no le caigo bien\u0026hellip;\u0026rdquo;? Por ejemplo, ¿has tenido alguna de estas experiencias?\n・Tardan en responderte un mensaje de texto.\n・Hicieron contacto visual pero no te saludaron.\n・Ignoraron un favor que les pediste.\nEn esos momentos, es normal preocuparse pensando: \u0026ldquo;¿Será que le caigo mal?\u0026rdquo;.\nA mí me pasa seguido. Y me deprimo sin razón.\n¿Qué es el principio de Hanlon? Aquí es donde entra \u0026ldquo;El principio de Hanlon\u0026rdquo;.\nOriginalmente en inglés es \u0026ldquo;Hanlon\u0026rsquo;s Razor\u0026rdquo; (Navaja de Hanlon).\nBásicamente significa esto:\n\u0026ldquo;Nunca atribuyas a la maldad lo que se explica adecuadamente por la estupidez.\u0026rdquo;\n\u0026hellip;Suena un poco duro, ¿verdad?\nPara decirlo de una manera más suave:\n\u0026ldquo;Aunque parezca que alguien está siendo malo, podría ser simplemente un descuido o falta de atención.\u0026rdquo;\nEsa es la idea principal.\n¿Quién lo dijo por primera vez? ¿Quién es Robert J. Hanlon? Se dice que esta frase apareció por primera vez en un libro publicado en 1980 titulado \u0026ldquo;Murphy’s Law Book Two\u0026rdquo;.\nLa idea fue enviada por Robert J. Hanlon, y se usó tal cual, lo que le dio el nombre de \u0026ldquo;Navaja de Hanlon\u0026rdquo;.\nPor cierto, el término \u0026ldquo;Navaja\u0026rdquo; (Razor) se refiere a una herramienta filosófica que significa \u0026ldquo;eliminar lo innecesario y pensar de forma sencilla\u0026rdquo;. Al igual que la Navaja de Ockham, es una expresión utilizada para organizar el pensamiento.\nPensar que \u0026ldquo;hubo mala intención\u0026rdquo; te hace sentir mal Por ejemplo, cuando ignoran un correo tuyo en el trabajo.\nSi piensas: \u0026ldquo;¿Por qué no me responden? ¿Será que me odian?\u0026rdquo;, te vuelves cada vez más negativo.\nPero si lo piensas bien, razones como:\n・No lo vieron por casualidad\n・Escribieron la respuesta pero olvidaron enviarla\n・La notificación se perdió entre otras\nSon sorprendentemente comunes.\nY nosotros mismos también cometemos esos errores.\nLo curioso de ser tolerantes con nuestros errores y estrictos con los demás Por ejemplo, cuando tú te olvidas de responderle un mensaje a un amigo.\nDices: \u0026ldquo;¡Ay, perdón! No vi la notificación~\u0026rdquo;, respondiendo sin ninguna mala intención.\nPero cuando la otra persona hace lo mismo, sientes que te están \u0026ldquo;ignorando\u0026rdquo;.\nEsto pasa mucho.\nLas personas somos muy comprensivas con nuestras propias situaciones, pero nos cuesta ver las situaciones de los demás.\nAsumir que \u0026ldquo;hay mala intención\u0026rdquo; en realidad te perjudica Cuando alguien te hace algo y asumes que \u0026ldquo;tienen mala intención\u0026rdquo;, mentalmente conviertes a esa persona en un enemigo.\nPero en realidad, puede que simplemente sean torpes o que estén abrumados con otras cosas.\nPor supuesto, también hay personas que realmente son groseras, y es natural sentirse herido ante una mala actitud.\nSin embargo, no asumir de inmediato que \u0026ldquo;seguramente es mala intención\u0026rdquo; hará que tu corazón se sienta un poco más ligero.\nDicho esto, no significa que debas aguantarlo todo Para que no haya malentendidos, no quiero decir que \u0026ldquo;todo es porque te preocupas demasiado\u0026rdquo;.\nCuando te hacen algo desagradable, está bien pensar: \u0026ldquo;Eso fue muy feo\u0026rdquo;.\nSimplemente sugiero que, en lugar de concluir: \u0026ldquo;Esa persona tiene mala personalidad\u0026rdquo; o \u0026ldquo;Intentaron lastimarme a propósito\u0026rdquo;,\nquizás esté bien tener un poco de flexibilidad y pensar: \u0026ldquo;Tal vez hubo alguna razón detrás\u0026rdquo;.\nEn conclusión: Ver las cosas con un poco más de amabilidad podría cambiar tu mundo Creo que la Navaja de Hanlon no se trata tanto de \u0026ldquo;ser amable con los demás\u0026rdquo;, sino de \u0026ldquo;una forma de proteger tu propio corazón\u0026rdquo;.\nCuando percibimos mala intención en las acciones de los demás, nuestro propio ánimo también se vuelve tenso.\nPero si podemos pensar: \u0026ldquo;Tal vez fue solo un error o no tenían tiempo\u0026rdquo;, nuestros sentimientos se alivian un poco.\nEs una forma de pensar que podemos usar por nuestro propio bien.\nPara terminar: ¡Por favor, comparte también tus experiencias! Muchas gracias por leer.\nSi tienes alguna anécdota del tipo: \u0026ldquo;A mí me ha pasado esto y me sentí incómodo~\u0026rdquo;, por favor cuéntamela.\nA veces, solo con poner en palabras nuestras experiencias, el corazón se siente un poco más aliviado.\n¡Hasta la próxima!\n","date":"2024-09-24T18:14:34+09:00","image":"http://kenji.blog/p/%E3%83%8F%E3%83%B3%E3%83%AD%E3%83%B3%E3%81%AE%E5%89%83%E5%88%80/img_hu0c32762ee7cb281fb24d789425dae55e_82924_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E3%83%8F%E3%83%B3%E3%83%AD%E3%83%B3%E3%81%AE%E5%89%83%E5%88%80/","title":"El principio de Hanlon"},{"content":"Conocimientos básicos de computación Esta página explica qué es una computadora.\nDefinición de una computadora Una computadora es una máquina que tiene los siguientes 5 componentes:\nDispositivo de entrada Dispositivo de salida Dispositivo de almacenamiento Dispositivo de control Dispositivo de procesamiento aritmético En términos generales, una computadora es una máquina que recibe una entrada, realiza un procesamiento específico y produce una salida con el resultado. Puede almacenar, calcular y dar como salida los datos que se han dado de entrada. El control tiene la función de gestionar los otros cuatro componentes mencionados.\nQué se necesita para hacer funcionar una computadora Para operar una computadora, además de los dispositivos (hardware), se necesitan programas (software).\nA través de los programas, se le indica a la computadora qué procesamiento debe realizar. Los programas se escriben en un formato que la computadora puede entender.\nUn ejemplo de programa es el siguiente. Programa para calcular la suma desde 1 hasta un número entero introducido:\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #include \u0026lt;iostream\u0026gt; using namespace std; int main() { // Reservar el espacio de memoria necesario int n, sum = 0; // Salida cout \u0026lt;\u0026lt; \u0026#34;Ingrese un número entero: \u0026#34;; // Entrada cin \u0026gt;\u0026gt; n; // Operación aritmética for (int i = 1; i \u0026lt;= n; i++) { // Operación aritmética sum += i; } // Salida cout \u0026lt;\u0026lt; \u0026#34;La suma desde 1 hasta \u0026#34; \u0026lt;\u0026lt; n \u0026lt;\u0026lt; \u0026#34; es \u0026#34; \u0026lt;\u0026lt; sum \u0026lt;\u0026lt; \u0026#34;.\u0026#34; \u0026lt;\u0026lt; endl; // Fin return 0; } El programa es convertido a lenguaje de máquina por un compilador, transformándolo a un formato que la computadora puede ejecutar.\n","date":"2024-09-19T01:10:20+09:00","image":"http://kenji.blog/p/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%AE%E5%9F%BA%E6%9C%AC%E7%9F%A5%E8%AD%98/img_hubc9c51905d797e9d57f0ff169cf73b36_367819_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%AE%E5%9F%BA%E6%9C%AC%E7%9F%A5%E8%AD%98/","title":"Conocimientos básicos de computación"},{"content":"Aplicaciones recomendadas para iOS X Instagram facebook youtube TikTok Microsoft Edge Firefox Google Chrome ChatGPT LINE Microsoft Teams Notion Goodnotes 6 TeamViewer DropBox GitHub Amazon PayPay WolframAlpha Mercari ","date":"2024-09-18T23:31:20+09:00","image":"http://kenji.blog/p/%E3%81%8A%E3%81%99%E3%81%99%E3%82%81ios%E3%82%A2%E3%83%97%E3%83%AA/img_huad2df38b51218b64bee99f031553dd91_79847_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E3%81%8A%E3%81%99%E3%81%99%E3%82%81ios%E3%82%A2%E3%83%97%E3%83%AA/","title":"Aplicaciones recomendadas para iOS"},{"content":"La pareja de ancianos, el burro y nuestro problema de \u0026ldquo;a quién escuchar\u0026rdquo; ¡Hola!\nHoy tuve algunos pensamientos inspirados en \u0026ldquo;La historia de la pareja de ancianos y el burro\u0026rdquo;, así que decidí escribir sobre ello.\nProbablemente muchos de ustedes ya lo hayan escuchado. Es esa famosa fábula.\n¿Qué es \u0026ldquo;La historia de la pareja de ancianos y el burro\u0026rdquo;? Érase una vez, una pareja de ancianos y su burro.\nAl principio, el anciano iba montado en el burro y la anciana caminaba. Entonces, un transeúnte dijo:\n\u0026ldquo;¡Qué hombre, hacer caminar a su anciana esposa mientras él cabalga!\u0026rdquo;\nAl escuchar esto, la pareja de ancianos decidió que la anciana montaría el burro esta vez. Entonces, otra persona dijo:\n\u0026ldquo;¡Es escandaloso que la mujer cabalgue en el burro y haga caminar al hombre!\u0026rdquo;\nBueno, entonces, esta vez ambos se subieron al burro. Y de nuevo alguien les dijo:\n\u0026ldquo;¡Pobre burro, es demasiado peso llevar a dos personas!\u0026rdquo;\nSiendo así, ambos se bajaron del burro y empezaron a caminar. Y entonces\u0026hellip;\n\u0026ldquo;Tienen un burro, ¿por qué nadie lo monta?\u0026rdquo;\nAl final, la pareja de ancianos se quedó sin saber qué hacer.\n\u0026ldquo;Escuchemos la opinión de todos\u0026rdquo; suena lógico. Pero\u0026hellip; Esta historia a menudo se toma como una moraleja de que \u0026ldquo;siempre preocuparse por lo que piensan los demás no tiene fin\u0026rdquo;.\nPero la realidad no es tan simple, ¿verdad?\nA menudo hay personas que dicen: \u0026ldquo;¡No te preocupes por lo que piensen los demás!\u0026rdquo;.\nPero es un poco difícil ignorarlo todo por completo. Por ejemplo, al publicar algo en las redes sociales. Al pensar en qué hablar en una fiesta de la empresa. Inevitablemente nos importa la reacción de alguien.\nPorque la \u0026ldquo;opinión de la gente\u0026rdquo; a veces afecta nuestra seguridad o reputación.\nDicho esto, dejarse influenciar demasiado se vuelve doloroso Creo que la pareja de ancianos de esta historia al principio solo pensaba: \u0026ldquo;¿Qué deberíamos hacer?\u0026rdquo;.\nPero no importaba lo que hicieran, \u0026ldquo;alguien\u0026rdquo; siempre se quejaba.\nY comenzaron a dar vueltas diciendo: \u0026ldquo;Bueno, hagamos esto ahora\u0026rdquo;, \u0026ldquo;¿tal vez así?\u0026rdquo;, y antes de darse cuenta, perdieron de vista lo que realmente querían hacer.\nEsto es algo que pasa a menudo en nuestra vida diaria.\nLas expectativas del jefe, las palabras de los padres, la cantidad de \u0026ldquo;me gusta\u0026rdquo; en las redes sociales. Mientras tratamos de adaptarnos a ellos, ¿alguna vez sientes que ya no sabes lo que realmente quieres hacer?\nEs importante elegir \u0026ldquo;a quién escuchar\u0026rdquo; Entonces, ¿qué deberíamos hacer? No hay una respuesta correcta.\nSin embargo, \u0026ldquo;seguir la opinión de todos\u0026rdquo; es prácticamente imposible.\nPor eso, creo que es importante elegir por nosotros mismos \u0026ldquo;a quién escuchar\u0026rdquo;.\nPor ejemplo, \u0026ldquo;solo escuchar los consejos de las personas que respeto\u0026rdquo; o \u0026ldquo;usar como estándar si mi yo del pasado estaría satisfecho\u0026rdquo;.\nTener aunque sea un solo estándar en el que puedas decir \u0026ldquo;quiero creer en esto\u0026rdquo;, reduce un poco el ruido del mundo.\nAsí que, cuando estés un poco cansado Puede que sea buena idea recordar \u0026ldquo;La historia de la pareja de ancianos y el burro\u0026rdquo;.\nEs fácil preocuparse por lo que piensan los demás, ¿no?\nPero si tratas de complacer a todos, terminarás bajándote del burro también.\nA veces, si puedes pensar \u0026ldquo;tal vez esté bien priorizar mis propios sentimientos\u0026rdquo;, tu corazón podría sentirse un poco más ligero.\n","date":"2024-09-18T00:56:59+09:00","image":"http://kenji.blog/p/%E8%80%81%E5%A4%AB%E5%A9%A6%E3%81%A8%E3%83%AD%E3%83%90%E3%81%AE%E8%A9%B1/img_hu4e12b653e0413f37819b2904ce683e39_500631_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E8%80%81%E5%A4%AB%E5%A9%A6%E3%81%A8%E3%83%AD%E3%83%90%E3%81%AE%E8%A9%B1/","title":"La historia de la pareja de ancianos y el burro"},{"content":"Por qué era casi imposible crear un LED azul Introducción a un documental en inglés. Es muy interesante. Tengo la fuerte impresión de que los japoneses que resolvieron este problema extremadamente difícil no fueron muy valorados en Japón al principio.\n","date":"2024-09-15T00:43:52+09:00","image":"http://kenji.blog/p/%E3%81%AA%E3%81%9C%E9%9D%92%E8%89%B2led%E3%82%92%E4%BD%9C%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%BB%E3%81%BC%E4%B8%8D%E5%8F%AF%E8%83%BD%E3%81%A0%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%8B/img_hu003acf083dbe465265af012766f30af7_1201686_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E3%81%AA%E3%81%9C%E9%9D%92%E8%89%B2led%E3%82%92%E4%BD%9C%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%BB%E3%81%BC%E4%B8%8D%E5%8F%AF%E8%83%BD%E3%81%A0%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%8B/","title":"Por qué era casi imposible crear un LED azul"},{"content":"Comenzando el desarrollo de Qt en VSCode: Cómo instalar el Qt Extension Pack Hola, soy Kenji. Esta vez presentaré \u0026ldquo;Cómo configurar el entorno de desarrollo de Qt en Visual Studio Code (en adelante VSCode)\u0026rdquo;.\nRecientemente, además del Qt Creator oficial, ha aumentado el número de personas que desean desarrollar aplicaciones de Qt utilizando el ligero y altamente extensible VSCode. Para estas personas, recomiendo el \u0026ldquo;Qt Extension Pack\u0026rdquo;. Con solo instalar este paquete de extensiones, tendrás a tu disposición las principales extensiones relacionadas con Qt.\nAudiencia Objetivo Personas que desean comenzar a desarrollar aplicaciones GUI usando Qt Personas que prefieren desarrollar en VSCode en lugar de Qt Creator Personas a las que les resulta tedioso buscar las extensiones una por una Requisitos Previos VSCode debe estar instalado (Puedes descargarlo gratis desde el sitio web oficial) La biblioteca base de Qt debe estar instalada (Sitio web oficial de Qt) ¿Qué es el Qt Extension Pack? Qt Extension Pack es un paquete de extensiones para VSCode. Al instalarlo, las siguientes características se agregan automáticamente:\nSoporte para archivos .ui (Qt Designer) Resaltado de sintaxis para archivos .pro y .qrc Soporte para autocompletado de código C++, compilación y depuración para Qt Qt Resource Browser (referencia de recursos) Pasos de Instalación 1. Abre VSCode Primero, inicia VSCode.\n2. Abre la vista de Extensiones Haz clic en el panel de Actividad a la izquierda (el icono de bloques cuadrados) para mostrar \u0026ldquo;Extensiones\u0026rdquo;.\nOpcionalmente, puedes presionar el atajo Ctrl + Shift + X.\n3. Busca \u0026ldquo;Qt Extension Pack\u0026rdquo; Ingresa las siguientes palabras clave en la barra de búsqueda:\n1 Qt Extension Pack 4. Haz clic en el botón Instalar Una vez que se muestre el paquete correspondiente, haz clic en el botón \u0026ldquo;Instalar\u0026rdquo;. Esto instalará múltiples extensiones a la vez, como:\nQt Language Support QML Support Qt Designer Integration CMake Tools (esencial para el desarrollo de Qt basado en CMake) Notas sobre la configuración del proyecto (Ejemplo CMake + Qt) Si utilizas Qt con CMake, se recomienda la siguiente combinación de extensiones:\nCMake Tools CMake Language Support Además, agregar las siguientes líneas en tu CMakeLists.txt facilita la integración con Qt:\n1 2 find_package(Qt6 REQUIRED COMPONENTS Widgets) target_link_libraries(MyApp PRIVATE Qt6::Widgets) Extra: ¿Cómo abrir los archivos .ui? Los archivos .ui se pueden editar en Qt Designer. En VSCode, puedes hacer clic derecho en el archivo .ui → seleccionar Open with Qt Designer (requiere que Qt Designer esté incluido en la variable de entorno PATH).\nResumen Paso Contenido 1 Iniciar VSCode 2 Abrir panel de Extensiones 3 Buscar \u0026ldquo;Qt Extension Pack\u0026rdquo; 4 Clic en botón Instalar Configurar el entorno de Qt en VSCode se ha vuelto mucho más fácil que antes. Ofrece suficientes funciones para ser una alternativa a Qt Creator, y es recomendable para quienes desean trabajar de forma ágil.\nColección de Enlaces Recomendados Sitio Oficial de Qt Qt Extension Pack - Visual Studio Marketplace Sitio Oficial de VSCode Extensión CMake Tools Finalmente De ahora en adelante, planeo avanzar en el desarrollo utilizando las herramientas de interfaz de usuario de Qt y QML en este entorno. La próxima vez, explicaré cómo compilar y ejecutar una aplicación de Hello World en Qt desde VSCode.\n¡Hasta luego!\n","date":"2024-09-13T00:53:53+09:00","image":"http://kenji.blog/p/visual-studio-code-%E3%81%AB-qt-extension-pack-%E3%82%92%E5%85%A5%E3%82%8C%E3%81%A6%E3%81%BF%E3%81%9F/img_1_hu3662f535d644da02b1919ea56b7b16c2_319254_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/visual-studio-code-%E3%81%AB-qt-extension-pack-%E3%82%92%E5%85%A5%E3%82%8C%E3%81%A6%E3%81%BF%E3%81%9F/","title":"Instalación de Qt Extension Pack en Visual Studio Code"},{"content":"Cómo comprobar si tu iPhone tiene bloqueo de SIM Pantalla de inicio \u0026gt; Ajustes \u0026gt; General \u0026gt; Información \u0026gt; Bloqueo de SIM\nComprueba si aparece Sin bloqueo de SIM o Con bloqueo de SIM.\n","date":"2024-09-12T00:32:11+09:00","image":"http://kenji.blog/p/iphone%E3%81%ABsim%E3%83%AD%E3%83%83%E3%82%AF%E3%81%8C%E3%81%8B%E3%81%8B%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8B%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_huadfe7e53f677430d2790fc209a2a5361_107562_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/iphone%E3%81%ABsim%E3%83%AD%E3%83%83%E3%82%AF%E3%81%8C%E3%81%8B%E3%81%8B%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8B%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"Cómo comprobar si tu iPhone tiene bloqueo de SIM"},{"content":"Resumen 1 La clase P es la clase de problemas que pueden ser resueltos en tiempo polinómico por una máquina de Turing determinista, y la clase NP es la clase de problemas para los cuales, cuando se da una prueba de que la respuesta es afirmativa (llamada testigo), la validez del testigo puede ser verificada en tiempo polinómico (esto se llama verificación). Dado que los problemas que se pueden resolver en tiempo polinómico también se pueden verificar en tiempo polinómico, es evidente que P⊆NP, pero no está claro si P es un subconjunto propio de NP o no. Aunque todavía no hay pruebas, muchos investigadores creen que P≠NP. La conjetura de que la clase P y la clase NP no son iguales se llama \u0026#34;Conjetura P≠NP\u0026#34;. Sitio de referencia : https://daigakudenki.com/np-hard/\n","date":"2024-09-11T02:22:39+09:00","permalink":"http://kenji.blog/es/p/pnp%E4%BA%88%E6%83%B3/","title":"Conjetura P≠NP"},{"content":"He vuelto a recibir el premio Microsoft MVP (2024-2025) Hola, soy kenji. Les informo que este año también he sido galardonado con el premio Microsoft MVP (Most Valuable Professional). Esta es la octava vez que recibo este premio.\nYa que estamos, me gustaría escribir un poco sobre qué es exactamente el premio MVP.\n¿Qué es el Microsoft MVP? Aunque se llame MVP, no estamos hablando del jugador más valioso en los deportes (aunque a veces me lo preguntan\u0026hellip;). Microsoft MVP (Most Valuable Professional) es un título que se otorga a aquellas personas que comparten y difunden activamente sus conocimientos y experiencias sobre las tecnologías de Microsoft con la comunidad.\nEscribir en blogs técnicos, responder preguntas en sitios de Q\u0026amp;A, publicar código de ejemplo, o dar charlas en eventos. \u0026ldquo;Compartir lo que sabes de una manera que sea útil para alguien más\u0026rdquo; — ese tipo de esfuerzo constante es lo que se valora.\nHay premiados en todo el mundo, pero el número es limitado cada año, y volver a ganarlo no es fácil. En este contexto, estoy realmente agradecido de haber sido reconocido nuevamente.\nRazones del premio Esta vez he vuelto a ser premiado en la categoría de \u0026ldquo;Developer Technologies\u0026rdquo; (Tecnologías para Desarrolladores). Durante el último año, he estado realizando las siguientes actividades:\nEscribir en el blog sobre tecnologías relacionadas con Microsoft Responder en sitios de Q\u0026amp;A técnicos Publicar código de ejemplo en GitHub Dar charlas en grupos de estudio y eventos técnicos, etc. Ninguna de estas cosas es extraordinaria, pero siempre he intentado compartir \u0026ldquo;cosas que probé y funcionaron\u0026rdquo; o \u0026ldquo;problemas con los que tropecé pero pude resolver\u0026rdquo; de manera que puedan ser útiles aunque sea un poco.\nEstoy sinceramente feliz de que esto se haya materializado de esta manera.\nSobre el futuro El mundo de la tecnología avanza muy rápido y solo mantenerse al día ya es difícil. Pero precisamente por eso, creo que tiene sentido compartir \u0026ldquo;información de primera mano\u0026rdquo;, como qué tal fue al usar algo realmente, o qué partes fueron difíciles de entender.\nA partir de ahora, espero seguir haciéndolo a mi propio ritmo y sin presiones. Me haría feliz si, de alguna forma, puedo proporcionar información que haga que alguien piense: \u0026ldquo;Ah, eso me ayudó\u0026rdquo;.\nEspero contar con su apoyo en el futuro.\n","date":"2024-09-03T21:25:20+09:00","image":"http://kenji.blog/p/microsoft-mvp2024-2025%E3%82%92%E5%86%8D%E5%8F%97%E8%B3%9E%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F/img_hu90bf51ced9d60993f005bc037644a192_1013423_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/microsoft-mvp2024-2025%E3%82%92%E5%86%8D%E5%8F%97%E8%B3%9E%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F/","title":"He vuelto a recibir el premio Microsoft MVP (2024-2025)"},{"content":"¿Qué es yt-dlp? yt-dlp es una herramienta de línea de comandos para descargar videos de YouTube. No solo te permite descargar videos, sino que también puedes descargarlos como archivos de música en formato mp3.\nDescarga e instalación Descarga la versión más reciente de yt-dlp.exe desde la página de lanzamientos de yt-dlp. Coloca yt-dlp.exe en la carpeta que desees. Agrega la ruta de la carpeta de yt-dlp.exe a la variable de entorno Path. Modo de uso Ejecuta yt-dlp.exe en el símbolo del sistema y especifica la URL del video de YouTube.\n1 yt-dlp.exe \u0026#34;https://www.youtube.com/watch?v=VIDEO_ID\u0026#34; ※ Como argumento, puedes usar solo la parte de VIDEO_ID en lugar de la URL completa.\nSi deseas descargar un archivo de música en formato mp3, ejecuta el siguiente comando:\n1 yt-dlp.exe --extract-audio --audio-format mp3 --embed-thumbnail --add-metadata \u0026#34;https://www.youtube.com/watch?v=VIDEO_ID\u0026#34; Con esto, el video se descargará en el directorio actual desde donde ejecutaste el comando.\nEso es todo.\n","date":"2024-09-03T14:09:26+09:00","image":"http://kenji.blog/p/yt-dlp.exe-%E3%81%AB%E3%82%88%E3%82%8B-youtube-%E5%8B%95%E7%94%BB%E3%81%AE%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E6%96%B9%E6%B3%95/img_1_hu05024a06b03b28eb7dbfa3d8c8b493fd_22080_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/yt-dlp.exe-%E3%81%AB%E3%82%88%E3%82%8B-youtube-%E5%8B%95%E7%94%BB%E3%81%AE%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E6%96%B9%E6%B3%95/","title":"Cómo descargar videos de YouTube con yt-dlp.exe"},{"content":" Recogepelotas de fútbol @gg211204 『El día que un recogepelotas se convirtió en héroe』 El recogepelotas que salvó al equipo ese día fue invitado posteriormente al club y compartió una comida con los jugadores. #Tottenham #Spurs #Mourinho #Recogepelotas ♬ original sound - じょり Starbucks ","date":"2024-08-25T16:24:35+09:00","image":"http://kenji.blog/p/%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E5%8B%95%E7%94%BB%E3%83%AA%E3%83%B3%E3%82%AF/img_hu6a40cd72b9cd9a636c4c642d7bc2c778_3354885_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E5%8B%95%E7%94%BB%E3%83%AA%E3%83%B3%E3%82%AF/","title":"Enlaces de videos cortos"},{"content":"¡Hola!\nHoy me gustaría hablar sobre las citas de Einstein.\n¿El mundo no valora tus buenas acciones? 1 2 3 4 5 6 El mundo nunca evaluará el millón de cosas buenas que haces. Pero te criticará por la única cosa incorrecta que hagas... Pero no te desanimes. \u0026#34;Levántate siempre por encima de todas las risas y críticas. Mantente fuerte.\u0026#34; - Albert Einstein Estas son palabras que se dice que dijo Einstein. Señalan agudamente la dureza de la sociedad que sentimos todos los días y el sesgo en las evaluaciones de las personas.\nAún así, sigue levantándote \u0026ldquo;Levántate siempre por encima de todas las risas y críticas. Mantente fuerte.\u0026rdquo;\nEstas palabras posteriores pueden decirse que son la respuesta de Einstein a la dura realidad mencionada anteriormente. Nos enseñan la importancia de seguir avanzando, creyendo en nosotros mismos sin ceder ante las críticas o las burlas.\nAplicar las enseñanzas de Einstein a la vida diaria Esta cita está profundamente relacionada con nuestra vida diaria. Por ejemplo, hay momentos en que nuestro esfuerzo en el trabajo no es reconocido y solo se destacan los errores triviales. Además, los comentarios en las redes sociales pueden ser sacados de contexto y criticados.\nEn esos momentos, por favor recuerda estas palabras de Einstein. Es importante mantener tus propias creencias en lugar de alegrarte o entristecerte por las evaluaciones de los demás.\nResumen Esta cita de Einstein nos enseña la importancia de \u0026ldquo;vivir creyendo en nosotros mismos, sin dejarnos influenciar por las evaluaciones de los demás\u0026rdquo;. Tengamos el valor de seguir el camino en el que creemos, sin ser derrotados por las críticas y las burlas.\nFinalmente, las palabras de Einstein una vez más.\n\u0026ldquo;Levántate siempre por encima de todas las risas y críticas. Mantente fuerte.\u0026rdquo;\nEspero que estas palabras resuenen en tu corazón y te inspiren a dar un paso positivo hacia adelante.\n","date":"2024-08-24T18:38:47+09:00","image":"http://kenji.blog/p/%E3%82%A2%E3%82%A4%E3%83%B3%E3%82%B7%E3%83%A5%E3%82%BF%E3%82%A4%E3%83%B3%E3%81%AE%E5%90%8D%E8%A8%80/Solvay_conference_1927_hu5334df7b0e2e62905cb44adbbbde85ad_2671814_120x120_fill_q75_box_smart1.jpg","permalink":"http://kenji.blog/es/p/%E3%82%A2%E3%82%A4%E3%83%B3%E3%82%B7%E3%83%A5%E3%82%BF%E3%82%A4%E3%83%B3%E3%81%AE%E5%90%8D%E8%A8%80/","title":"Citas de Einstein"},{"content":"A continuación, se muestra un código en C simple que genera números primos dentro de un rango especificado. En este ejemplo, se enumeran los números primos del 1 al n.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 #include \u0026lt;stdio.h\u0026gt; #include \u0026lt;stdbool.h\u0026gt; bool isPrime(int num) { if (num \u0026lt;= 1) return false; if (num \u0026lt;= 3) return true; if (num % 2 == 0 || num % 3 == 0) return false; for (int i = 5; i * i \u0026lt;= num; i += 6) { if (num % i == 0 || num % (i + 2) == 0) return false; } return true; } void printPrimes(int n) { printf(\u0026#34;2 \u0026#34;); for (int i = 3; i \u0026lt;= n; i += 2) { if (isPrime(i)) { printf(\u0026#34;%d \u0026#34;, i); } } printf(\u0026#34;\\n\u0026#34;); } int main() { int n; printf(\u0026#34;Ingrese el valor maximo del rango para generar numeros primos: \u0026#34;); scanf(\u0026#34;%d\u0026#34;, \u0026amp;n); printf(\u0026#34;Los numeros primos de 1 a %d son los siguientes:\\n\u0026#34;, n); printPrimes(n); return 0; } Este código funciona de la siguiente manera:\nFunción isPrime: Determina si un número dado es primo. Por razones de eficiencia, primero verifica si es divisible por 2 y 3, y luego procede a verificar en múltiplos de 6. Función printPrimes: Imprime los números primos dentro del rango especificado. El 2 se imprime primero, y luego solo se verifican los números impares. Función main: Pide al usuario que ingrese el valor máximo del rango y luego imprime los números primos dentro de ese rango. Al compilar y ejecutar este código, se mostrarán los números primos dentro del rango especificado.\n","date":"2024-08-24T09:38:10+09:00","image":"http://kenji.blog/p/%E7%B4%A0%E6%95%B0%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8Bc%E8%A8%80%E8%AA%9E%E3%82%B3%E3%83%BC%E3%83%89/img_hu31b8bd853d4750e84615619ef286e5d3_22034_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E7%B4%A0%E6%95%B0%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8Bc%E8%A8%80%E8%AA%9E%E3%82%B3%E3%83%BC%E3%83%89/","title":"Código en C para generar números primos"},{"content":"\nAkiko Yosano \u0026ldquo;No mueras, hermano mío\u0026rdquo;\n――Llorando por mi hermano menor en el ejército que asedia Port Arthur\nAh, hermano mío, por ti lloro,\n¡no mueras, hermano mío!\nPuesto que eres el último en nacer,\nel afecto de tus padres por ti fue mayor,\n¿pero acaso te pusieron una espada en la mano\ny te enseñaron a matar?\n¿Acaso te criaron hasta los veinticuatro años\npara que mataras y luego murieras?\nComo amo que se enorgullece de su antigua familia\nde comerciantes de la ciudad de Sakai,\ny como heredero del nombre de tus padres,\n¡no mueras, hermano mío!\nYa sea que la fortaleza de Port Arthur caiga o no,\n¿qué importa?\nTú no lo sabes, pero tal cosa\nno existe en las reglas de la casa de un comerciante.\n¡No mueras, hermano mío!\nEl Emperador mismo\nno va a la batalla.\nCon su gran y profundo corazón,\n¿cómo podría él desear\nque los hombres derramen la sangre de otros,\nque mueran en el camino de las bestias,\ny que morir sea la gloria de los hombres?\nAh, hermano mío, en la batalla,\n¡no mueras, hermano mío!\nNuestra madre, que se quedó atrás\ncuando nuestro padre falleció el otoño pasado,\nen medio de su dolor, fue privada\nlamentablemente de su hijo; ella cuida la casa,\ny aunque se dice que el reinado es pacífico,\nlas canas de nuestra madre han aumentado.\nLa frágil y joven esposa\nque llora postrada tras la cortina de la tienda,\n¿te olvidas de ella? ¿Piensas en ella?\nPiensa en el corazón de esa joven\nde la que te separaste tras menos de diez meses de estar juntos.\nSi no es a ti, el único en este mundo,\nah, ¿en quién más podrá confiar?\n¡No mueras, hermano mío!\n","date":"2024-07-25T13:16:47+09:00","permalink":"http://kenji.blog/es/p/%E5%90%9B%E6%AD%BB%E3%81%AB%E3%81%9F%E3%81%BE%E3%81%B5%E3%81%93%E3%81%A8%E3%81%AA%E3%81%8B%E3%82%8C/","title":"No mueras, hermano mío"},{"content":"\n🔹 Resumen de la persona Akiko Yosano (1878-1942) fue una poeta, escritora y pensadora japonesa que estuvo activa desde la era Meiji hasta principios de la era Showa. Conocida especialmente por su poesía tanka apasionada e individualista, fue una figura que abrió nuevos horizontes en la independencia de las mujeres y la expresión del amor en la literatura japonesa moderna.\nNombre real: Yosano (apellido de soltera: Hō) Shō\nLugar de nacimiento: Sakai (Ciudad de Sakai, Prefectura de Osaka)\nEsposo: Tekkan Yosano (poeta)\nPeríodo principal de actividad: Finales de la era Meiji a principios de la era Showa\nCaracterísticas:\nLlamó la atención por su poesía tanka que expresaba francamente los sentimientos románticos de las mujeres. Tenía ideales feministas y promovió la educación y la independencia de las mujeres. También mostró una postura pacifista al criticar la Guerra Ruso-Japonesa. Miembro central de la revista literaria \u0026ldquo;Myōjō\u0026rdquo;. 🔹 Obras representativas, sinopsis y características 1. \u0026ldquo;Midaregami\u0026rdquo; (Cabello enredado) (1901) Resumen: Primera colección de poemas. Publicada a principios de sus veinte, tuvo un gran impacto en el mundo literario japonés. Características: Expresa francamente los sentimientos románticos y el deseo físico desde la perspectiva de una mujer. Poema famoso: Piel suave Sin siquiera tocar mi sangre ardiente ¿No te sientes solo mientras predicas el camino?\n→ Se convirtió en un tema candente por expresar una visión del amor, considerada audaz para la ética de la época, en las propias palabras de una mujer.\n2. \u0026ldquo;Kimi Shinitamou Koto Nakare\u0026rdquo; (No debes morir) (1904) Formato: Poema (verso libre, no tanka) Contenido: Poema pacifista dirigido a su hermano menor que partió a la Guerra Ruso-Japonesa. Extracto: No debes morir Siendo tú el último en nacer Con las lágrimas de tu madre fluyendo Mientras estruja tus mangas\u0026hellip;\nImportancia: En una época en que había una fuerte tendencia a glorificar la guerra, fue revolucionario al apelar contra la guerra desde la perspectiva de una mujer que temía por la muerte de su hermano. 🔹 Influencia y evaluación Llevó a cabo actividades socialmente avanzadas, como la liberación de la mujer, el pacifismo y la difusión de la educación. En sus últimos años, se dedicó a la educación de las mujeres y participó en el establecimiento de universidades para mujeres (como el Bunka Gakuin). Es una de las intelectuales y escritoras más importantes del Japón de antes de la guerra. 🔹 Resumen Ítem Contenido Nombre Akiko Yosano Campo de actividad Tanka, poesía, crítica, educación Obras principales \u0026ldquo;Midaregami\u0026rdquo;, \u0026ldquo;Kimi Shinitamou Koto Nakare\u0026rdquo; Características Expresión de la libertad amorosa, independencia femenina, pacifismo Influencia moderna Literatura feminista, innovación del tanka moderno, pionera de la poesía pacifista ","date":"2024-07-25T13:08:36+09:00","permalink":"http://kenji.blog/es/p/%E4%B8%8E%E8%AC%9D%E9%87%8E%E6%99%B6%E5%AD%90%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/","title":"Sobre Akiko Yosano"},{"content":"Introducción a Mathematica Resolver ecuaciones 1 Solve[x^2 - 3 x + 2 == 0, x] Salida\n1 {{x -\u0026gt; 1}, {x -\u0026gt; 2}} Encontrar soluciones enteras para una ecuación 1 Solve[x^2 - 3 x + 2 == 0 \u0026amp;\u0026amp; 0 \u0026lt;= x \u0026lt;= 2, x, Integers] Salida\n1 {{x -\u0026gt; 1}, {x -\u0026gt; 2}} Resolver un sistema de ecuaciones 1 Solve[{x + y == 3, x - y == 1}, {x, y}] Salida\n1 {{x -\u0026gt; 2, y -\u0026gt; 1}} Resolver inecuaciones 1 Reduce[x^2 - 3 x + 2 \u0026gt; 0, x] Salida\n1 x \u0026lt; 1 || x \u0026gt; 2 Derivar 1 D[x^2, x] Salida\n1 2 x Integrar 1 Integrate[x^2, x] Salida\n1 x^3/3 Calcular el límite 1 Limit[1/x, x -\u0026gt; 0] Salida\n1 Infinity Calcular una serie 1 Sum[1/n^2, {n, 1, Infinity}] Salida\n1 π^2/6 Crear una matriz 1 m = {{1, 2}, {3, 4}} Multiplicar matrices 1 m . m Salida\n1 {{7, 10}, {15, 22}} Calcular la matriz inversa 1 Inverse[m] Salida\n1 {{-2, 1}, {1.5, -0.5}} Calcular valores propios y vectores propios 1 Eigensystem[m] Salida\n1 {{5, 0}, {{1, 1}, {1, -1}}} Calcular el producto punto de vectores 1 {1, 2} . {3, 4} Salida\n1 11 Calcular el producto cruzado de vectores 1 Cross[{1, 2, 3}, {4, 5, 6}] Salida\n1 {-3, 6, -3} Calcular la magnitud (norma) de un vector 1 Norm[{1, 2, 3}] Salida\n1 √14 Calcular el ángulo entre vectores 1 ArcCos[{1, 2} . {3, 4}/(Norm[{1, 2}] Norm[{3, 4}])] Salida\n1 ArcCos[11/(√5 √25)] Calcular la proyección de un vector 1 {1, 2} . {3, 4}/Norm[{3, 4}] {3, 4}/Norm[{3, 4}] Salida\n1 {11/5, 22/5} Calcular la rotación de un vector 1 RotationMatrix[π/2].{1, 0} Salida\n1 {0, 1} Calcular la traslación de un vector 1 TranslationTransform[{1, 2}][{3, 4}] Salida\n1 {4, 6} Calcular la escala de un vector 1 ScalingTransform[{2, 3}][{1, 1}] Salida\n1 {2, 3} Calcular la reflexión de un vector 1 ReflectionTransform[{1, 1}][{1, 1}] Salida\n1 {0, 0} Generar un número aleatorio 1 RandomReal[] Salida\n1 0.123456 Generar un número aleatorio (entero) 1 RandomInteger[] Salida\n1 123456 Generar un número aleatorio (rango específico) 1 RandomReal[{1, 10}] Salida\n1 5.6789 Generar un número aleatorio (entero, rango específico) 1 RandomInteger[{1, 10}] Salida\n1 5 Generar un número aleatorio (distribución específica) 1 RandomVariate[NormalDistribution[0, 1]] Salida\n1 0.123456 Generar números aleatorios (distribución y cantidad específicas) 1 RandomVariate[NormalDistribution[0, 1], 10] Salida\n1 {0.123456, 0.234567, ..., 0.987654} Generar números aleatorios (distribución, cantidad y semilla específicas) 1 2 SeedRandom[12345] RandomVariate[NormalDistribution[0, 1], 10] Salida\n1 {0.123456, 0.234567, ..., 0.987654} Aplicar una función a los elementos de un array 1 2 3 Map[Sqrt, {1, 4, 9}] Sqrt /@ {1, 4, 9} Map[#^(1/2)\u0026amp;, {1, 4, 9}] Salida\n1 {1, 2, 3} Definir una función usando una expresión lambda 1 2 f = Function[x, x^2] f[3] Salida\n1 9 Componer funciones 1 2 3 4 f = Function[x, x^2] g = Function[x, x + 1] h = Function[x, f[g[x]]] h[3] Salida\n1 16 Hacer referencia al resultado del cálculo anterior 1 % + 1 Salida\n1 17 Función pura 1 (#+3)\u0026amp;[5] Salida\n1 8 Extraer elementos de un array 1 2 Select[{1, 2, 3, 4, 5}, EvenQ] Select[{1, 2, 3, 4, 5}, Mod[#,2]==0\u0026amp;] Salida\n1 {2, 4} ","date":"2024-07-25T01:36:19+09:00","image":"http://kenji.blog/p/mathematica%E5%85%A5%E9%96%80/img_hucba782cf2f6047b30fd8084b4d887659_22760_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/mathematica%E5%85%A5%E9%96%80/","title":"Introducción a Mathematica"},{"content":"¿Qué es Hugo? Hugo es un generador de sitios estáticos. Puedes crear sitios web convirtiendo archivos Markdown a HTML. Hugo está escrito en el lenguaje Go y funciona a gran velocidad.\nEste blog también fue creado con Hugo.\nInstalación del CLI de Hugo Para instalar el CLI de Hugo, ejecuta el siguiente comando:\n※ Ejemplo para macOS. Para otros sistemas operativos, consulta la documentación oficial.\n1 brew install hugo Se puede instalar usando Homebrew.\nLista de comandos de Hugo Hugo ofrece varios comandos. A continuación, se resumen los comandos más utilizados.\nCrear un nuevo sitio 1 hugo new site \u0026lt;nombre del sitio\u0026gt; Comando para crear un nuevo sitio. Especifica el nombre del sitio en \u0026lt;nombre del sitio\u0026gt;.\nCrear un nuevo artículo 1 hugo new \u0026lt;nombre del artículo\u0026gt;.md Comando para crear un nuevo artículo. Especifica el nombre del artículo en \u0026lt;nombre del artículo\u0026gt;.\nIniciar el servidor 1 hugo server Comando para iniciar un servidor local. Se puede acceder en http://localhost:1313.\nConstruir (Build) 1 hugo Comando para construir el sitio. Los archivos HTML se generan en el directorio public.\nDesplegar (Deploy) 1 hugo deploy Comando para desplegar el sitio. La configuración del destino de despliegue se realiza en el archivo config.toml.\nMostrar la lista de artículos 1 hugo list all Comando para mostrar la lista de artículos.\nConfirmar la configuración 1 hugo config Comando para confirmar la configuración.\nMostrar la ayuda 1 hugo help Comando para mostrar la ayuda.\nMostrar la versión 1 hugo version Comando para mostrar la versión.\nEsta ha sido la lista de comandos de Hugo. Hay muchos otros comandos disponibles, así que consulta la documentación oficial.\nReferencia Documentación oficial de Hugo ","date":"2024-05-31T01:36:00+09:00","image":"http://kenji.blog/p/hugo%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E4%B8%80%E8%A6%A7/img_hu415dc7e70376ac350673d0366f70ca4b_19909_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/hugo%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E4%B8%80%E8%A6%A7/","title":"Lista de comandos de Hugo"},{"content":"Lista de Extensiones Recomendadas para Visual Studio Code Categoría Nombre Proveedor Descripción Gestión Virtual/Contenedores Remote Development Microsoft Soporta el desarrollo remoto conectándose a contenedores virtuales/WSL a través de SSH Gestión Virtual/Contenedores Docker Microsoft Soporta la gestión de contenedores Docker Gestión de Código GitHub Pull Requests GitHub Gestiona GitHub Pull Requests en VSCode Gestión de Código GitHub Copilot GitHub Soporta la finalización de código impulsada por IA Gestión de Código Git Graph mhutchie Muestra gráficamente las ramas y commits de Git Gestión de Código Git History Don Jayamanne Muestra el historial de Git Navegador/Desarrollo Web Debugger for Firefox Firefox DevTools Utiliza el depurador de Firefox en VSCode Navegador/Desarrollo Web Microsoft Edge Tool For VScode Microsoft Utiliza las herramientas de desarrollo de Edge en VSCode Navegador/Desarrollo Web Vue Language Features(Volar) Vue Soporta las características del lenguaje de Vue Navegador/Desarrollo Web JavaScript (ES6) code snippets charalampos karypidis Proporciona fragmentos de código de JavaScript Navegador/Desarrollo Web Tailwind CSS IntelliSense Tailwind Labs Proporciona fragmentos de código de Tailwind CSS Desarrollo en la Nube AWS Toolkit Amazon Web Services Soporta el desarrollo en AWS Desarrollo en la Nube Azure Tools Microsoft Soporta el desarrollo en Azure Desarrollo en la Nube Google Cloud Tools Google Cloud Soporta el desarrollo en Google Cloud Bases de Datos MySQL Jun Han Soporta el desarrollo en MySQL Bases de Datos SQL Server(mssql) Microsoft Soporta el desarrollo en SQL Server Bases de Datos PostgreSQL Chris Kolkman Soporta el desarrollo en PostgreSQL Sistemas Integrados PlatformIO PlatformIO Soporta el desarrollo en PlatformIO Sistemas Integrados Arduino Microsoft Soporta el desarrollo en Arduino Sistemas Integrados WorkBench Particle Entorno de desarrollo de Particle, soportando firmware, bibliotecas e integración con la nube para el desarrollo de IoT C/C++ C/C++ Extension Pack Microsoft Soporta el desarrollo en C/C++ C/C++ C/C++ Runner franneck94 Ejecuta código C/C++ (soporta compiladores gcc, msvc, cuda nvcc) C/C++ Cortex-Debug marus25 Soporta la depuración de microcontroladores Cortex-A/R/M Python Python Extension Pack Microsoft Soporta el desarrollo en Python Python jupyter Microsoft Soporta el desarrollo en Jupyter Notebook Utilidades/Extensión de IU Markdown All in One Yu Zhang Soporta la escritura en Markdown Utilidades/Extensión de IU Hex Editor Microsoft Edita archivos binarios Utilidades/Extensión de IU vscode-pdf tomoki1207 Muestra archivos PDF Utilidades/Extensión de IU Rainbow CSV mechatroner Muestra archivos CSV con resaltado de colores Utilidades/Extensión de IU Draw.io Integration Henning Dieterichs Utiliza Draw.io en VSCode Utilidades/Extensión de IU Japanese Language Pack for Visual Studio Code Microsoft Paquete de idioma japonés Utilidades/Extensión de IU Live Share Microsoft Soporta la colaboración en tiempo real ","date":"2024-05-29T17:20:19+09:00","image":"http://kenji.blog/p/visual-studio-code%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E6%8B%A1%E5%BC%B5%E6%A9%9F%E8%83%BD/img_hu9f3ce3d75e92e9f1ca11d3e7a3c7b710_108332_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/visual-studio-code%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E6%8B%A1%E5%BC%B5%E6%A9%9F%E8%83%BD/","title":"'Extensiones Recomendadas para Visual Studio Code'"},{"content":"¿Qué es mermaid.js? mermaid.js es una biblioteca de JavaScript que permite describir diagramas mediante una sintaxis basada en texto (sintaxis de Mermaid) para representar gráficamente diagramas complejos como diagramas de flujo, diagramas de Gantt, etc. También se utiliza en varios servicios como GitHub, Qiita y Notion. En esta ocasión, configuraremos hugo para poder usar mermaid.js.\nHabilitar mermaid.js en hugo Los pasos son los siguientes:\nAñadir lo siguiente a layouts/partials/extend_footer.html: 1 2 3 4 5 6 7 8 9 10 11 12 13 {{ if or .Params.mermaid .Site.Params.mermaid }} \u0026lt;script src=\u0026#34;https://cdn.jsdelivr.net/npm/mermaid@10.3.0/dist/mermaid.min.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; {{- $loadmermaid := resources.Get \u0026#34;js/load-mermaid.js\u0026#34; }} \u0026lt;script src=\u0026#34;{{ $loadmermaid.RelPermalink }}\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; \u0026lt;script\u0026gt; window.initMermaid(); if (isDarkTheme()) { setPrefTheme(\u0026#39;dark\u0026#39;); } else { setPrefTheme(\u0026#39;light\u0026#39;); } \u0026lt;/script\u0026gt; {{ end }} Solo se carga mermaid.min.js si se establece mermaid: true en la condición if. Esta biblioteca pesa aproximadamente 3MB, lo cual es sorprendentemente grande. Crear assets/js/load-mermaid.js. Este proceso se utiliza para inicializar y volver a dibujar cuando el tema cambia dinámicamente. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 (function(window){ \u0026#39;use strict\u0026#39; const elementCode = \u0026#39;.mermaid\u0026#39; const loadMermaid = function(theme) { window.mermaid.initialize({theme}) window.mermaid.init({theme}, document.querySelectorAll(elementCode)) } const saveOriginalData = function(){ return new Promise((resolve, reject) =\u0026gt; { try { var els = document.querySelectorAll(elementCode), count = els.length; els.forEach(element =\u0026gt; { element.setAttribute(\u0026#39;data-original-code\u0026#39;, element.innerHTML) count-- if(count == 0){ resolve() } }); } catch (error) { reject(error) } }) } const resetProcessed = function(){ return new Promise((resolve, reject) =\u0026gt; { try { var els = document.querySelectorAll(elementCode), count = els.length; els.forEach(element =\u0026gt; { if(element.getAttribute(\u0026#39;data-original-code\u0026#39;) != null){ element.removeAttribute(\u0026#39;data-processed\u0026#39;) element.innerHTML = element.getAttribute(\u0026#39;data-original-code\u0026#39;) } count-- if(count == 0){ resolve() } }); } catch (error) { reject(error) } }) } const init = ()=\u0026gt;{ saveOriginalData() .catch( console.error ) document.body.addEventListener(\u0026#39;dark-theme-set\u0026#39;, ()=\u0026gt;{ resetProcessed() .then(loadMermaid(\u0026#39;dark\u0026#39;)) .catch(console.error) }) document.body.addEventListener(\u0026#39;light-theme-set\u0026#39;, ()=\u0026gt;{ resetProcessed() .then(loadMermaid(\u0026#39;default\u0026#39;)) .catch(console.error) }) } window.initMermaid = init })(window); El código original en el que me basé fue tomado de la siguiente referencia:\nReinitialize with new theme #1945 Modificar el procesamiento al cambiar de tema en header.html 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 function switchTheme(theme) { switch (theme) { case \u0026#39;light\u0026#39;: {{ if or .Params.mermaid .Site.Params.mermaid }} document.body.dispatchEvent(new CustomEvent(\u0026#39;light-theme-set\u0026#39;)); {{ end }} document.body.classList.remove(\u0026#39;dark\u0026#39;); break; case \u0026#39;dark\u0026#39;: {{ if or .Params.mermaid .Site.Params.mermaid }} document.body.dispatchEvent(new CustomEvent(\u0026#39;dark-theme-set\u0026#39;)); {{ end }} document.body.classList.add(\u0026#39;dark\u0026#39;); break; // auto default: if (window.matchMedia(\u0026#39;(prefers-color-scheme: dark)\u0026#39;).matches) { {{ if or .Params.mermaid .Site.Params.mermaid }} document.body.dispatchEvent(new CustomEvent(\u0026#39;dark-theme-set\u0026#39;)); {{ end }} document.body.classList.add(\u0026#39;dark\u0026#39;); } } } Crear layouts/shortcodes/mermaid.html 1 2 3 \u0026lt;div class=\u0026#34;mermaid\u0026#34; align=\u0026#34;{{ if .Get \u0026#34;align\u0026#34; }}{{ .Get \u0026#34;align\u0026#34; }}{{ else }}center{{ end }}\u0026#34;\u0026gt; {{ safeHTML .Inner }} \u0026lt;/div\u0026gt; Con esto, la preparación para usar mermaid.js está completa.\nProbando mermaid.js Añadir lo siguiente a la definición del artículo: 1 marmaid: true Añadir lo siguiente al cuerpo del artículo: Diagrama de flujo\n1 2 3 4 5 6 {{\u0026lt;mermaid align=\u0026#34;center\u0026#34;\u0026gt;}} graph TD A[Inicio] --\u0026gt;|Condición 1| B(Condición 2) B --\u0026gt; C{Condición 3} C --\u0026gt;|Condición 4| D[Fin] {{\u0026lt;/mermaid\u0026gt;}} Resultado de salida\ngraph TD A[Inicio] --\u003e|Condición 1| B(Condición 2) B --\u003e C{Condición 3} C --\u003e|Condición 4| D[Fin] Diagrama de Gantt\n1 2 3 4 5 6 7 8 9 10 11 12 {{\u0026lt;mermaid align=\u0026#34;center\u0026#34;\u0026gt;}} gantt section Project Definición de requisitos :done, a, 2024-05-25, 5d Diseño básico :done, b, after a, 5d Diseño detallado :done, c, after b, 5d Implementación :active, d, after c, 10d Pruebas unitarias :crit, e, after d, 5d Pruebas de integración : f, after e, 5d Pruebas del sistema : g, after f, 5d Lanzamiento :milestone, h, after g, 1d {{\u0026lt;/mermaid\u0026gt;}} Resultado de salida\ngantt section Project Definición de requisitos :done, a, 2024-05-25, 5d Diseño básico :done, b, after a, 5d Diseño detallado :done, c, after b, 5d Implementación :active, d, after c, 10d Pruebas unitarias :crit, e, after d, 5d Pruebas de integración : f, after e, 5d Pruebas del sistema : g, after f, 5d Lanzamiento :milestone, h, after g, 1d Diagrama de secuencia\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 {{\u0026lt;mermaid align=\u0026#34;center\u0026#34;\u0026gt;}} sequenceDiagram participant user participant view participant controller participant model participant database user-\u0026gt;\u0026gt;view: Ingreso de ID/PW view-\u0026gt;\u0026gt;controller: Petición de autenticación controller-\u0026gt;\u0026gt;model: Petición de autenticación model-\u0026gt;\u0026gt;database: Petición de autenticación database--\u0026gt;\u0026gt;model: Devolución de resultado de autenticación model--\u0026gt;\u0026gt;controller: Devolución de resultado de autenticación controller--\u0026gt;\u0026gt;view: Devolución de resultado de autenticación view--\u0026gt;\u0026gt;user: Mostrar resultado de autenticación {{\u0026lt;/mermaid\u0026gt;}} Resultado de salida\nsequenceDiagram participant user participant view participant controller participant model participant database user-\u003e\u003eview: Ingreso de ID/PW view-\u003e\u003econtroller: Consulta ajax controller-\u003e\u003emodel: Petición de autenticación model-\u003e\u003edatabase: Emisión de SQL database--\u003e\u003emodel: Devolución de resultado SQL model--\u003e\u003econtroller: Devolución de resultado de petición de autenticación controller--\u003e\u003eview: Devolución de resultado de consulta ajax view--\u003e\u003euser: Mostrar resultado de autenticación Eso es todo.\nReferencias Sitio oficial de mermaid.js Sitio de demostración para previsualizar la sintaxis de mermaid ","date":"2024-05-25T02:18:09+09:00","image":"http://kenji.blog/p/mermaid.js%E3%82%92%E8%A9%A6%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B/img_2_huc7c099ec3ef9a6ce3efa5818e1489313_12585_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/mermaid.js%E3%82%92%E8%A9%A6%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B/","title":"'Probando mermaid.js'"},{"content":"Cómo deshacer git reset Si después de realizar un git commit ejecutas git reset por error, te mostraré cómo deshacer el git reset (cómo restaurar el estado en el momento del git commit).\nVerifica el ID del commit antes del reset con git reflog Vuelve al estado antes del reset con git reset --hard HEAD@{número} Eso es todo sobre cómo deshacer un git reset.\n","date":"2024-05-15T23:32:43+09:00","image":"http://kenji.blog/p/git-reset%E3%82%92%E5%8F%96%E3%82%8A%E6%B6%88%E3%81%99%E6%96%B9%E6%B3%95/img_hu1637c23702d7aac8be6c2641e62ebc1a_73066_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/git-reset%E3%82%92%E5%8F%96%E3%82%8A%E6%B6%88%E3%81%99%E6%96%B9%E6%B3%95/","title":"Cómo deshacer git reset"},{"content":"Liberación del código fuente de MS-DOS 4.0 Microsoft ha publicado el código fuente de MS-DOS 4.0, lanzado hace unos 40 años. Está escrito casi en su totalidad en código ensamblador 8086.\nRepositorio de github https://github.com/microsoft/MS-DOS\nSitios de referencia Liberación del código fuente de MS-DOS 4.0 ","date":"2024-05-05T16:44:28+09:00","image":"http://kenji.blog/p/ms-dos-4.0-%E3%81%AE%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9%E5%8C%96/img_hu44e977c98e405f06fee0746ba6885217_23034_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/ms-dos-4.0-%E3%81%AE%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9%E5%8C%96/","title":"Liberación del código fuente de MS-DOS 4.0"},{"content":" Código legible Principios de programación El programador pragmático Tecnologías que sustentan la Web Cómo crear aplicaciones web seguras Por qué se conecta la red Guía exhaustiva de SQL de los expertos Guía práctica de Docker Guía completa de Kubernetes CODE COMPLETE 2da Edición Clean Code: Habilidades de los expertos en software ágil Clean Architecture: Estructura y diseño de software de los expertos Tecnologías que debes conocer antes de convertirte en programador de videojuegos Being Geek Por qué construimos con orientación a objetos ","date":"2024-05-05T16:03:33+09:00","image":"http://kenji.blog/p/%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E5%88%9D%E5%AD%A6%E8%80%85%E3%81%AB%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%81%AE%E6%9B%B8%E7%B1%8D/img_huefc28c3d74f521b3206dda9fd272911e_636136_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E5%88%9D%E5%AD%A6%E8%80%85%E3%81%AB%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%81%AE%E6%9B%B8%E7%B1%8D/","title":"Libros recomendados para ingenieros principiantes"},{"content":"¡He creado una plantilla de calendario de Excel (versión con días festivos)! He creado una plantilla de Excel que, al introducir el año y el mes, muestra los días festivos en el calendario de ese mes.\nDescárgala y utilízala. Calendario.xlsx\n","date":"2024-05-01T00:15:57+09:00","image":"http://kenji.blog/p/excel%E3%81%AE%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%80%E3%83%BC%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E4%BC%91%E6%97%A5%E5%AF%BE%E5%BF%9C%E7%89%88/img_hu8d7d9eeba53cb2329139f98aded52558_13893_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/excel%E3%81%AE%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%80%E3%83%BC%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E4%BC%91%E6%97%A5%E5%AF%BE%E5%BF%9C%E7%89%88/","title":"Plantilla de calendario de Excel (versión con días festivos)"},{"content":" Este es el procedimiento de configuración en Windows 11. Abrir el Panel de control Seleccionar Opciones de energía Hacer clic en \u0026ldquo;Elegir el comportamiento de los botones de inicio/apagado\u0026rdquo; Hacer clic en \u0026ldquo;Cambiar la configuración actualmente no disponible\u0026rdquo; Desmarcar \u0026ldquo;Activar inicio rápido (recomendado)\u0026rdquo; Hacer clic en \u0026ldquo;Guardar cambios\u0026rdquo; Referencia \\[Windows 10\\] Cómo desactivar el inicio rápido.\n","date":"2024-04-29T19:42:20+09:00","image":"http://kenji.blog/p/%E3%83%9E%E3%83%AB%E3%83%81%E3%83%A2%E3%83%8B%E3%82%BF%E3%81%A7%E6%AF%8E%E5%9B%9E%E8%B5%B7%E5%8B%95%E6%99%82%E3%81%ABdpi%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%8C%E3%83%AA%E3%82%BB%E3%83%83%E3%83%88%E3%81%95%E3%82%8C%E3%81%A6%E3%81%97%E3%81%BE%E3%81%86%E3%81%A8%E3%81%8D%E3%81%AE%E5%AF%BE%E5%87%A6%E6%B3%95/img_huc496c8f1febcd28bf66466cd5e2648a0_37147_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E3%83%9E%E3%83%AB%E3%83%81%E3%83%A2%E3%83%8B%E3%82%BF%E3%81%A7%E6%AF%8E%E5%9B%9E%E8%B5%B7%E5%8B%95%E6%99%82%E3%81%ABdpi%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%8C%E3%83%AA%E3%82%BB%E3%83%83%E3%83%88%E3%81%95%E3%82%8C%E3%81%A6%E3%81%97%E3%81%BE%E3%81%86%E3%81%A8%E3%81%8D%E3%81%AE%E5%AF%BE%E5%87%A6%E6%B3%95/","title":"Qué hacer cuando la configuración de DPI se restablece en cada inicio con monitores múltiples"},{"content":"Obtener solo lo más reciente del repositorio Con el siguiente comando puedes obtener solo lo más reciente del repositorio. Es útil cuando quieres obtener el repositorio rápidamente para ahorrar espacio en el disco.\n1 git clone --depth 1 \u0026lt;URL del repositorio\u0026gt; ","date":"2024-04-27T02:54:12+09:00","image":"http://kenji.blog/p/git%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E6%9C%80%E6%96%B0%E3%81%A0%E3%81%91%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B/img_hu2ecde82e40aa31a994850b70302683b4_5304_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/git%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E6%9C%80%E6%96%B0%E3%81%A0%E3%81%91%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B/","title":"Obtener solo lo más reciente de un repositorio git"},{"content":"Qué hacer cuando aparece el siguiente error en GitHub Copilot GitHub Copilot dejó de funcionar alrededor del 19 de abril de 2024. El mensaje de error es el siguiente:\n1 2 [ERROR] [ghostText] [2024-04-21T04:06:46.900Z] Error on ghost text request: (FetchError) unable to verify the first certificate [ERROR] [certificates] [2024-04-21T04:06:46.901Z] Your current Copilot license doesn\u0026#39;t support proxy connections with custom certificates. Please visit https://gh.io/copilot-network-errors to learn more. Original cause: {\u0026#34;type\u0026#34;:\u0026#34;system\u0026#34;,\u0026#34;_name\u0026#34;:\u0026#34;FetchError\u0026#34;,\u0026#34;code\u0026#34;:\u0026#34;UNABLE_TO_VERIFY_LEAF_SIGNATURE\u0026#34;} Solución Parece ser un problema con ESET. En la configuración avanzada de ESET, desactiva la opción \u0026ldquo;Habilitar SSL/TLS\u0026rdquo;. Referencia Parece que el mismo error está ocurriendo con AWS CDK.\nAWS CDK bootstrap certificate warning-error ","date":"2024-04-21T18:47:26+09:00","image":"http://kenji.blog/p/%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%A7github-copilot%E3%81%8C%E4%BD%BF%E3%81%88%E3%81%AA%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AE%E5%AF%BE%E5%87%A6%E6%96%B9%E6%B3%95/img_hue52485515660c172702881501d13c34d_319675_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%A7github-copilot%E3%81%8C%E4%BD%BF%E3%81%88%E3%81%AA%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AE%E5%AF%BE%E5%87%A6%E6%96%B9%E6%B3%95/","title":"'Qué hacer cuando GitHub Copilot deja de funcionar debido a un error de certificado'"},{"content":"\nIntroducción a vim Descarga e instalación https://www.vim.org/download.php\nDesde el sitio anterior, descarga e instala el módulo según el SO que desees instalar.\nPara Windows, es recomendable elegir gvim_X.X.X_x64_signed.exe.\nCómo iniciar Para Windows, es necesario registrar la carpeta que contiene vim.exe en la variable de entorno Path.\nCómo iniciar\n1 vim Para iniciar especificando un nombre de archivo\n1 vim filename.txt Cómo salir Para salir, ingresa : (dos puntos), luego ingresa q y presiona Enter.\n1 :q Si has modificado el archivo, aparecerá el mensaje No se ha guardado el último cambio (añade ! para descartar los cambios). Puedes descartar el contenido y forzar la salida.\n1 :q! Para guardar el archivo y salir\n1 :wq Lo siguiente también tiene el mismo significado.\n1 :x Además, puedes salir presionando z dos veces mientras mantienes presionado Shift. (Igual que :wq)\nModos vim tiene el modo comando y el modo inserción. Cuando inicias vim, entra en el modo comando, y si presionas la tecla i, pasará al modo inserción.\nEn el modo inserción, como su nombre indica, es posible introducir texto. Para pasar del modo inserción al modo comando, presiona la tecla ESC.\nTener este cambio de modo de inserción es una de las características de vim.\nMovimiento del cursor y desplazamiento Aquí se resume el movimiento del cursor y el desplazamiento en el modo comando.\nTecla Descripción h (o Ctrl+H, Retroceso, ←) Mover a la izquierda j (o Ctrl+J・N, ↓) Mover hacia abajo k (o Ctrl+P, ↑) Mover hacia arriba l (o Espacio, →) Mover a la derecha + (o Enter) Mover al principio de la siguiente línea - Mover al principio de la línea anterior Ctrl+B (o RePág) Desplazar hacia arriba Ctrl+F (o AvPág) Desplazar hacia abajo Ctrl+U Medio desplazamiento hacia arriba Ctrl+D Medio desplazamiento hacia abajo Ctrl+Y Desplazar 1 línea hacia arriba Ctrl+E Desplazar 1 línea hacia abajo z Enter Desplazar la línea del cursor a la parte superior de la pantalla z . Desplazar la línea del cursor al centro de la pantalla z - Desplazar la línea del cursor a la parte inferior de la pantalla 0 (o |) Mover el cursor al principio de la línea $ Mover el cursor al final de la línea ^ (o _) Mover el cursor al principio de la línea (excluyendo espacios y tabulaciones) G (o :$) Mover el cursor a la última línea :número de línea Enter Mover a la línea especificada Si introduces un número seguido de las teclas de movimiento anteriores, puedes moverte varias veces esa cantidad. (Por ejemplo, si introduces 3j, te moverás 3 líneas hacia abajo desde la posición actual del cursor.)\nOtros comandos Tecla Descripción Ctrl+L Redibujar la pantalla Ctrl+G Mostrar el número total de líneas del archivo, posición del cursor, etc. ","date":"2024-04-19T22:06:34+09:00","image":"http://kenji.blog/p/vim%E5%85%A5%E9%96%80/img_hu70487bce4333a61ad5b3ba8ed7939499_17904_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/vim%E5%85%A5%E9%96%80/","title":"Introducción a vim"},{"content":"Sobre la necesidad de llamar a DestroyIcon Es necesario llamar a DestroyIcon en los siguientes casos:\nCreateIconFromResourceEx (si se llama sin la bandera LR_SHARED) CreateIconIndirect CopyIcon Cuando el icono es creado por las funciones anteriores.\nLoadIcon LoadImage (cuando se usa la bandera LR_SHARED) CopyImage (cuando se usa la bandera LR_COPYRETURNORG y el parámetro hImage es un icono compartido) CreateIconFromResource CreateIconFromResourceEx (cuando se usa la bandera LR_SHARED) Los iconos creados y cargados en los casos anteriores no deben llamar a DestroyIcon.\nReferencias Función DestroyIcon (winuser.h) ","date":"2024-04-19T01:55:17+09:00","permalink":"http://kenji.blog/es/p/loadicon%E3%81%AFdestroyicon%E3%82%92%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%99%E5%BF%85%E8%A6%81%E3%81%AF%E3%81%AA%E3%81%84/","title":"LoadIcon no necesita llamar a DestroyIcon"},{"content":"Videos de conferencias sobre IA generativa \u0026ldquo;IA generativa\u0026rdquo; (1) Masayuki Nakao, profesor de la Universidad de Tokio, 2023.9.8 \u0026ldquo;IA generativa\u0026rdquo; (2) Kuniyoshi Sakai, profesor de posgrado de la Universidad de Tokio, 2023.10.11 \u0026ldquo;IA generativa\u0026rdquo; (3) Yutaka Matsuo, profesor de posgrado de la Universidad de Tokio, 2024.3.15 ","date":"2024-04-16T02:13:56+09:00","image":"http://kenji.blog/p/%E7%94%9F%E6%88%90ai%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/img_hu1a8581c4b72be646476cf90db2209d32_686551_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E7%94%9F%E6%88%90ai%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/","title":"Sobre la IA generativa"},{"content":"Generar código QR con curl Nota: El método presentado devuelve un código QR generado en el lado del servidor, por lo que es posible que se registren logs. Ten cuidado al convertir información confidencial, como información personal, en un código QR.\nMétodo 1 Este es el método para generar un código QR en el Símbolo del sistema. qrenco.de devuelve la respuesta basada en texto.\n1 curl qrenco.de/kenji.blog Resultado de salida 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 █████████████████████████████ █████████████████████████████ ████ ▄▄▄▄▄ █ ▄ ▄ █ ▄▄▄▄▄ ████ ████ █ █ █ ▀▀▀██ █ █ ████ ████ █▄▄▄█ █▀▀█▀▄█ █▄▄▄█ ████ ████▄▄▄▄▄▄▄█▄▀ ▀ █▄▄▄▄▄▄▄████ ████▄ █▀▄ ▄▀█▄▀ ▀██▄▀ ▄████ ████▀▀▀█ ▄▄ ▄█▄█▀█▀▄██ ▀████ ████▄▄▄██▄▄█ █▀█ ▄██▀▀█ █████ ████ ▄▄▄▄▄ █▀█ ▀ ▄▀▄▄▄ ▀████ ████ █ █ █▄▄ ▄▀▄▀▄ ██ ▀████ ████ █▄▄▄█ █▀▀█ ▀▄▄▄ ▄▄██████ ████▄▄▄▄▄▄▄█▄▄███▄▄█▄███▄████ █████████████████████████████ █████████████████████████████ Referencia qrenco.de Método 2 api.qrserver.com devuelve una imagen.\n1 curl -o qr.png \u0026#34;https://api.qrserver.com/v1/create-qr-code/?size=150x150\u0026amp;data=HelloWorld\u0026#34; Resultado de salida Referencia QR Code Generator ","date":"2024-04-16T00:42:27+09:00","image":"http://kenji.blog/p/curl%E3%81%A7qr%E3%82%B3%E3%83%BC%E3%83%89%E7%94%9F%E6%88%90/img_hub03976e78daddb607d3d46f69887db4b_11127_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/curl%E3%81%A7qr%E3%82%B3%E3%83%BC%E3%83%89%E7%94%9F%E6%88%90/","title":"Generar código QR con curl"},{"content":"Lista de atajos de teclado Atajo de teclado Descripción Ctrl + B Negrita Ctrl + I Cursiva Ctrl + U Subrayado Ctrl + E Centrar Ctrl + L Alinear a la izquierda Ctrl + R Alinear a la derecha Ctrl + ] Aumentar tamaño de fuente Ctrl + [ Disminuir tamaño de fuente Ctrl + C Copiar Ctrl + V Pegar Ctrl + X Cortar Ctrl + Z Deshacer Ctrl + Y Rehacer Ctrl + A Seleccionar todo Shift + Teclas de dirección Seleccionar rango Ctrl + F Buscar texto Ctrl + H Reemplazar texto Ctrl + P Vista previa de impresión Ctrl + S Guardar documento F12 Guardar como Ctrl + Home Ir al principio del documento Ctrl + End Ir al final del documento Referencia Atajos de teclado de Word ","date":"2024-04-07T14:18:51+09:00","image":"http://kenji.blog/p/microsoft-word%E3%81%AE%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E4%B8%80%E8%A6%A7/img_hu52c1b9e3b4195e8df02b1851180b33b3_10388_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/microsoft-word%E3%81%AE%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E4%B8%80%E8%A6%A7/","title":"Atajos de teclado de Microsoft Word"},{"content":"Les presento \u0026ldquo;Actualización automática de pestañas\u0026rdquo;, una extensión de navegador de Edge para actualizar páginas web automáticamente.\nInstalación de la actualización automática de pestañas Actualización automática de pestañas\nAcceda al sitio web anterior y haga clic en Instalar.\nHaga clic en Agregar extensión.\nCómo usar Una vez completada la instalación, se agregará un icono en la parte superior derecha de Edge.\nAbra la página web que desea actualizar automáticamente y haga clic en el icono para comenzar la actualización automática.\nLa parte en el recuadro verde es el intervalo de actualización automática. Seleccione el momento para la actualización automática.\nPara detener la actualización automática, haga clic en el icono y luego en Stop reloading this tab.\n","date":"2024-04-06T15:36:54+09:00","image":"http://kenji.blog/p/web%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AE%E8%87%AA%E5%8B%95%E6%9B%B4%E6%96%B0%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E6%8B%A1%E5%BC%B5edge%E3%82%A2%E3%83%89%E3%82%AA%E3%83%B3/img_hu57eb7510f8ab42d5a8107b2d3db76a45_3448_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/web%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AE%E8%87%AA%E5%8B%95%E6%9B%B4%E6%96%B0%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E6%8B%A1%E5%BC%B5edge%E3%82%A2%E3%83%89%E3%82%AA%E3%83%B3/","title":"Extensión de navegador de actualización automática de páginas web (Complemento de Edge)"},{"content":"Lista de accesos directos de Visual Studio He recopilado una lista de los accesos directos de Visual Studio que uso con frecuencia. Aprender los atajos de teclado de Visual Studio te permite trabajar en el desarrollo de manera más eficiente. ¡Asegúrate de aprovecharlos!\n※Verificado en Visual Studio 2022.\nAtajo de teclado Descripción F1 Mostrar ayuda para la palabra seleccionada F2 Saltar a un marcador Ctrl + F2 Registrar un marcador Ctrl + Shift + F2 Eliminar todos los marcadores F5 Compilar y ejecutar (con depuración) Ctrl + F5 Compilar y ejecutar (sin depuración) F7 Compilar F9 Agregar punto de interrupción en la línea actual Ctrl + F9 Deshabilitar el punto de interrupción en la línea actual Shift + Ctrl + F9 Eliminar todos los puntos de interrupción F10 Paso a paso por procedimientos F11 Paso a paso por instrucciones F12 Ir a la definición Ctrl + D Duplicar la línea actual Ctrl + X Cortar línea si no hay selección Ctrl + Shift + ] Seleccionar hasta el paréntesis correspondiente Alt + Flecha arriba/abajo Mover la línea actual hacia arriba/abajo Alt + Shift + Teclas de flecha Multicursor / Selección de bloque Ctrl + Tab Alternar vista de código fuente/ventana Ctrl + Shift + V Mostrar historial del portapapeles Ctrl + K luego Ctrl + C Comentar la línea actual Ctrl + K luego Ctrl + U Descomentar la línea actual Ctrl + G Ir a la línea especificada Ctrl + F Buscar Ctrl + Shift + F Búsqueda global Ctrl + H Reemplazar Ctrl + Shift + F Reemplazo global Ctrl + Tab Alternar vista de código fuente/ventana Ctrl + Space Autocompletar palabra Ctrl + Alt + L Abrir la ventana del Explorador de soluciones Ctrl + Shift + E Abrir la ventana de Vista de recursos Ctrl + 0 luego Ctrl + G Abrir la ventana de confirmación de Git Referencia Atajos de teclado de Visual Studio ","date":"2024-04-06T11:27:37+09:00","image":"http://kenji.blog/p/visual-studio-%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E4%B8%80%E8%A6%A7/img_hue1a55f22c15dca7427db7cd2dfd89735_223690_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/visual-studio-%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E4%B8%80%E8%A6%A7/","title":"Lista de accesos directos de Visual Studio"},{"content":"Aquí se explica cómo añadir el grep del editor Hidemaru al menú contextual del Explorador en Windows 10/11.\n※ El siguiente procedimiento modifica el registro, por lo que debe hacerse bajo su propia responsabilidad.\nProcedimiento Abra el siguiente enlace y guárdelo en cualquier carpeta. 秀丸レジストリ登録.reg\nHaga doble clic en el archivo 秀丸レジストリ登録.reg para añadirlo al registro. Referencias Ejecutar grep de Hidemaru desde el menú contextual de una carpeta ","date":"2024-04-03T00:00:46+09:00","image":"http://kenji.blog/p/%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%97%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC%E3%81%AE%E5%8F%B3%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E3%81%AB%E7%A7%80%E4%B8%B8%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BFgrep%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B/img_hu1bfa3588f39c8e6af312f48159d52b67_932_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%97%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC%E3%81%AE%E5%8F%B3%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E3%81%AB%E7%A7%80%E4%B8%B8%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BFgrep%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B/","title":"Añadir el grep del editor Hidemaru al menú contextual del Explorador"},{"content":"¿Conoces la paradoja del cumpleaños? Voy a contarte algo un poco curioso. ¿Cuántas personas crees que tienen que reunirse para que la probabilidad de que \u0026ldquo;haya personas con el mismo cumpleaños\u0026rdquo; sea alta?\nPor ejemplo, como un año tiene 365 días, si te dicen que \u0026ldquo;si se reúnen 23 personas, la probabilidad de que alguien comparta cumpleaños es de más del 50%\u0026rdquo;\u0026hellip; de alguna manera parece ir en contra de la intuición, ¿verdad?\nPero esto, realmente es más del 50%.\n¿Por qué ocurre esto? Este fenómeno se llama la \u0026ldquo;paradoja del cumpleaños\u0026rdquo;. El nombre incluye \u0026ldquo;paradoja\u0026rdquo;, pero tiene una razón matemática sólida.\nSi el número de personas es \u0026ldquo;n\u0026rdquo;, la probabilidad de que nadie comparta cumpleaños se puede calcular con la siguiente fórmula:\n1 P(nadie comparte) = 365/365 × 364/365 × 363/365 × ... × (365 - n + 1)/365 Al restar esto de 1, se obtiene \u0026ldquo;la probabilidad de que alguien comparta cumpleaños\u0026rdquo;.\nAl mirar los resultados\u0026hellip; Número de personas Probabilidad de que haya personas con el mismo cumpleaños 10 personas Aprox. 11.7% 20 personas Aprox. 41.1% 23 personas Aprox. 50.7% (¡Atención aquí!) 30 personas Aprox. 70.6% 70 personas ¡Sorprendentemente aprox. 99.9%! Es decir, con solo 23 personas, hay más de la mitad de probabilidad de que alguien comparta cumpleaños. Parece bastante aplicable a una clase en la escuela o a una reunión en el trabajo.\nResumen: La brecha entre la intuición y las matemáticas es interesante La \u0026ldquo;paradoja del cumpleaños\u0026rdquo; es un ejemplo interesante de cómo nuestra intuición y la probabilidad matemática real difieren. ¡Saber este tipo de cosas puede ser divertido para una charla casual o un juego de preguntas!\nEnlaces de referencia Paradoja del cumpleaños (Wikipedia) ","date":"2024-04-02T01:20:50+09:00","image":"http://kenji.blog/p/%E3%83%90%E3%83%BC%E3%82%B9%E3%83%87%E3%82%A4%E3%83%91%E3%83%A9%E3%83%89%E3%83%83%E3%82%AF%E3%82%B9%E3%81%A8%E3%81%AF/img_huf1a218b90023063d558c5c810438e753_117620_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E3%83%90%E3%83%BC%E3%82%B9%E3%83%87%E3%82%A4%E3%83%91%E3%83%A9%E3%83%89%E3%83%83%E3%82%AF%E3%82%B9%E3%81%A8%E3%81%AF/","title":"'¿Qué es la paradoja del cumpleaños?'"},{"content":"¿Qué es Snipping Tool? Snipping Tool es una herramienta de captura de pantalla incluida de forma estándar en Windows. Puede recortar y guardar una parte de la pantalla, capturar la pantalla completa o grabarla.\nCómo iniciar Snipping Tool Se puede iniciar principalmente de las 3 siguientes maneras:\nPresione la tecla Win, escriba Snipping Tool y presione Enter. Presione las teclas Win + Shift + S. Presione las teclas Win + R, escriba snippingtool y presione Enter. Cómo usar Snipping Tool El método para guardar una imagen capturada es el siguiente: Seleccione el icono de la cámara. Haga clic en el botón Nuevo. Seleccione el área que desea capturar. Haga clic en el botón Guardar como. Ingrese el destino y el nombre del archivo para guardar. El método para grabar un video capturado es el siguiente: Seleccione el icono de video. Haga clic en el botón Nuevo. Seleccione el área que desea capturar. Haga clic en el botón Inicio. Grabe la pantalla. Haga clic en el botón Detener. Haga clic en el botón Guardar como. Ingrese el destino y el nombre del archivo para guardar. Referencia Usar Snipping Tool para capturar capturas de pantalla ","date":"2024-04-01T23:19:45+09:00","image":"http://kenji.blog/p/snipping-tool%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9/img_hu405fe4bbcac8bf4b2046262eb8f35d4a_18613_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/snipping-tool%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9/","title":"Cómo usar Snipping Tool"},{"content":"Aquí te mostramos cómo crear un acceso directo para bloquear la computadora.\nEs conveniente porque puedes bloquear la computadora haciendo doble clic en el acceso directo creado en el escritorio u otros lugares.\nCómo crear 1. Haz clic derecho en el escritorio y selecciona Nuevo \u0026gt; Acceso directo 2. Aparecerá la pantalla de creación del acceso directo, ingresa rundll32.exe user32.dll,LockWorkStation y haz clic en Siguiente 3. Ingresa el nombre del acceso directo Bloquear la computadora y haz clic en Finalizar 4. Cambiar el icono del acceso directo creado Haz clic derecho en el acceso directo creado y selecciona Propiedades\nHaz clic en Cambiar icono\nSelecciona el icono del cuadrado amarillo y haz clic en Aceptar, luego haz clic en Aceptar nuevamente para cerrar las propiedades\nEso es todo.\nAl hacer doble clic en el acceso directo creado, la computadora se bloqueará.\nTambién puedes bloquear la computadora presionando la tecla Win + tecla L.\n※Nota: No se mostrará un cuadro de diálogo de confirmación para bloquear la computadora.\n","date":"2024-04-01T01:37:49+09:00","image":"http://kenji.blog/p/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%83%BC%E3%82%92%E3%83%AD%E3%83%83%E3%82%AF%E3%81%99%E3%82%8B%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hud14aa91db8f19c318807d0f2f72ee0fc_128434_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%83%BC%E3%82%92%E3%83%AD%E3%83%83%E3%82%AF%E3%81%99%E3%82%8B%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"'Cómo crear un acceso directo para bloquear la computadora'"},{"content":"¿Qué es el problema de Monty Hall? El problema de Monty Hall es uno de los juegos que se realizaban en el programa de televisión estadounidense \u0026ldquo;Let\u0026rsquo;s Make a Deal\u0026rdquo;, y consiste en el siguiente problema:\nPremisa: De tres puertas, una contiene un premio y las otras dos no contienen premio.\nEl participante elige una de las tres puertas. El presentador abre una puerta sin premio de entre las dos puertas que el participante no eligió. Se le pregunta al participante si desea cambiar la puerta elegida. En este caso, el problema es considerar si es mejor para el participante cambiar de puerta o no cambiarla.\nSolución La solución al problema de Monty Hall es la siguiente:\nSi el participante no cambia la puerta que eligió inicialmente\nProbabilidad de ganar: 1/3 Probabilidad de perder: 2/3 Después de que el presentador abre la puerta sin premio\nSi no cambia, la probabilidad de ganar: 1/3 (no cambia respecto a la probabilidad de ganar del punto 1) Si cambia, la probabilidad de ganar: 2/3 (la probabilidad contraria a ganar del punto 1) Por lo tanto, la probabilidad de ganar es mayor si el participante cambia de puerta.\nReferencias Wikipedia Monty Hall problem ","date":"2024-03-31T23:41:51+09:00","image":"http://kenji.blog/p/%E3%83%A2%E3%83%B3%E3%83%86%E3%82%A3%E3%83%9B%E3%83%BC%E3%83%AB%E5%95%8F%E9%A1%8C/img_1_hu20d98afb87b485a440eb6d6beaf3ac5e_189614_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E3%83%A2%E3%83%B3%E3%83%86%E3%82%A3%E3%83%9B%E3%83%BC%E3%83%AB%E5%95%8F%E9%A1%8C/","title":"El problema de Monty Hall"},{"content":"Descargar micro https://github.com/zyedidia/micro/releases\nAbra el enlace anterior, haga clic en Show all XX assets (donde la parte X es un número) y descargue micro-X.X.XX-win64.zip (donde la parte X es un número). Extraiga el archivo zip y coloque los archivos en cualquier carpeta que desee.\nConfigurar variables de entorno Para usar micro.exe desde el símbolo del sistema, es necesario configurar las variables de entorno.\nPresione la Tecla Win + Tecla R, escriba sysdm.cpl y presione la Tecla Enter. Haga clic en Configuración avanzada del sistema en Propiedades del sistema. Haga clic en Variables de entorno. Seleccione Path en Variables del sistema y haga clic en Editar. Haga clic en Nuevo y agregue la ruta de la carpeta que contiene micro.exe. Haga clic en Aceptar para cerrar todos los cuadros de diálogo. Reinicie el símbolo del sistema y verifique si puede ejecutarlo escribiendo nano. Cómo usar micro Al escribir micro en el símbolo del sistema y ejecutarlo, se mostrará la siguiente pantalla. A continuación se muestran las operaciones principales y los atajos de teclado.\nAtajo de teclado Operación Ctrl+Q Cerrar archivo Ctrl+S Guardar archivo Ctrl+O Abrir archivo Ctrl+A Seleccionar todo Ctrl+X Cortar selección Ctrl+C Copiar selección Ctrl+V Pegar Ctrl+Z Deshacer Ctrl+Y Rehacer Ctrl+E Ejecutar comando del editor Referencias micro ","date":"2024-03-31T21:50:39+09:00","image":"http://kenji.blog/p/%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BFmicro%E3%82%92windows%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hu5c724e25c36dcf3781d5276f98286fd4_13721_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BFmicro%E3%82%92windows%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"Cómo instalar el editor de texto micro en Windows"},{"content":"Descargar nano.exe https://sourceforge.net/projects/nano-for-windows/\nAbre el enlace de arriba, haz clic en Download y descarga GNU-Nano_Win32(static).zip. Descomprime el archivo zip y coloca nano.exe en la carpeta que desees.\nLa entrada en japonés no es compatible. (A partir del 31/03/2024) Configurar variables de entorno Para usar nano.exe desde el símbolo del sistema, necesitas configurar las variables de entorno.\nPresiona la tecla Win + tecla R, escribe sysdm.cpl y presiona la tecla Enter. Haz clic en Propiedades del sistema en Propiedades del sistema. Haz clic en Variables de entorno. Selecciona Path en Variables del sistema y haz clic en Editar. Haz clic en Nuevo y agrega la ruta de nano.exe. Haz clic en Aceptar para cerrar todos los cuadros de diálogo. Reinicia el símbolo del sistema y verifica si puedes ejecutarlo escribiendo nano. Cómo usar nano Cuando escribes nano y lo ejecutas, se muestra la siguiente pantalla.\nUna descripción de los accesos directos se muestra en la parte inferior de la pantalla.\nEl significado de los símbolos es el siguiente:\n^ representa la tecla Ctrl. M- representa la tecla Alt. Para guardar y cerrar, presiona Ctrl + S y luego Ctrl + X.\nReferencias GNU nano ","date":"2024-03-31T18:09:32+09:00","image":"http://kenji.blog/p/cli%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BFnano%E3%82%92windows%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_1_hud0bad6678c124835195c96dbf5908709_45668_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/cli%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BFnano%E3%82%92windows%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"'Cómo instalar el editor de texto CLI nano en Windows'"},{"content":"Qué hacer cuando aparece \u0026ldquo;Temporary failure resolving~\u0026rdquo; en WSL 1 2 3 4 kenji@MyComputer:~$ sudo apt update [sudo] password for kenji: Err:1 http://archive.ubuntu.com/ubuntu focal InRelease Temporary failure resolving \u0026#39;archive.ubuntu.com\u0026#39; Cuando aparece el error anterior en WSL, es posible que la configuración del servidor DNS sea incorrecta. En mi entorno, se solucionó con los siguientes pasos.\nInicie WSL. Ejecute sudo nano /etc/resolv.conf. Cambie la línea de nameserver de la siguiente manera. 1 nameserver 8.8.8.8 Guarde con Ctrl + S y salga con Ctrl + X. Ejecute sudo apt update. Si no se muestra el error, el problema está resuelto. Si los pasos anteriores no lo solucionan Parece que hay casos donde los pasos anteriores no lo solucionan. Consulte el siguiente artículo.\nCómo solucionar \u0026lsquo;Temporary failure resolving ~\u0026rsquo; al ejecutar apt update en WSL ","date":"2024-03-31T16:57:33+09:00","image":"http://kenji.blog/p/wsl-%E3%81%A7temporary-failure-resolving%E3%81%A8%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AE%E5%AF%BE%E5%87%A6%E6%96%B9%E6%B3%95/img_hu6b9065bcca76a2739d7c532080d71efa_118604_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/wsl-%E3%81%A7temporary-failure-resolving%E3%81%A8%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AE%E5%AF%BE%E5%87%A6%E6%96%B9%E6%B3%95/","title":"Qué hacer cuando aparece ''Temporary failure resolving~'' en WSL"},{"content":"Cómo cerrar desde el clic derecho en la barra de tareas Este es el método para Windows 10. Parece que el menú no se muestra en Windows 11. Mantenga presionado Shift y Ctrl mientras hace clic derecho en la barra de tareas, y Cerrar el Explorador aparecerá en el menú.\nCómo cerrar desde el Administrador de tareas Presione Ctrl + Shift + Esc para abrir el Administrador de tareas. Seleccione Detalles. Seleccione explorer.exe, presione la tecla Suprimir (Delete) y, cuando se le pregunte ¿Desea finalizar explorer.exe?, seleccione Finalizar proceso. Cómo cerrar desde el Símbolo del sistema Presione Win + R, escriba cmd y presione Enter. Escriba taskkill /f /im explorer.exe y presione Enter. Cómo iniciar el Explorador desde el Administrador de tareas Presione Ctrl + Shift + Esc para abrir el Administrador de tareas. En el menú Archivo, seleccione Ejecutar nueva tarea. Escriba explorer.exe y presione Enter. ","date":"2024-03-30T15:40:24+09:00","image":"http://kenji.blog/p/%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%97%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC%E3%81%AE%E7%B5%82%E4%BA%86%E5%86%8D%E8%B5%B7%E5%8B%95%E6%96%B9%E6%B3%95/img_2_hue735828bd961ff4973e3abea5e21f198_20142_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%97%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC%E3%81%AE%E7%B5%82%E4%BA%86%E5%86%8D%E8%B5%B7%E5%8B%95%E6%96%B9%E6%B3%95/","title":"Cómo cerrar y reiniciar el Explorador de archivos"},{"content":"Cómo restaurar el menú contextual clásico en Windows 11 Aquí se explica cómo restaurar el menú contextual clásico en Windows 11.\nAbre el Editor del Registro. Presiona la tecla Win + R, escribe regedit y presiona la tecla Enter. Navega a HKEY_CURRENT_USER\\Software\\Classes\\CLSID\\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}. Si esta clave no existe, créala.\nNavega a HKEY_CURRENT_USER\\Software\\Classes\\CLSID\\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\\InprocServer32. Si esta clave no existe, créala.\nAsegúrate de que el valor (Predeterminado) de InprocServer32 esté vacío.\nReinicia tu computadora. Comprueba que el menú contextual ha vuelto a la versión clásica. ","date":"2024-03-30T13:13:36+09:00","image":"http://kenji.blog/p/windows-11%E3%81%AE%E5%8F%B3%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%92%E5%BE%93%E6%9D%A5%E7%89%88%E3%81%AB%E6%88%BB%E3%81%99%E6%96%B9%E6%B3%95/img_hub131b7dada89fffcdae45f20639b1ab3_50623_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/windows-11%E3%81%AE%E5%8F%B3%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%92%E5%BE%93%E6%9D%A5%E7%89%88%E3%81%AB%E6%88%BB%E3%81%99%E6%96%B9%E6%B3%95/","title":"Cómo restaurar el menú contextual clásico en Windows 11"},{"content":"JetBrains Mono Es una fuente de programación de código abierto proporcionada por JetBrains.\nDescarga: https://www.jetbrains.com/ja-jp/lp/mono/\nHackGen Hakugen (HackGen) es una fuente de programación que sintetiza la fuente en inglés para programación Hack, y la fuente derivada Genjyuu Gothic de Source Han Sans (Gen no Kaku Gothic).\nDescarga: https://github.com/yuru7/HackGen/releases\nRicty Diminished Ricty Diminished es una fuente hermana de Ricty, y es una fuente sintetizada a partir de Inconsolata y Circle M+ 1m usando el script generador de Ricty, en lugar de Inconsolata y Migu 1M. Como no incluye los glifos de IPA Gothic, el número de glifos de kanji utilizables es menor, pero a cambio, puede ser distribuida bajo la SIL Open Font License.\nDescarga: https://rictyfonts.github.io/diminished\nCica Es una fuente de programación que usa Hack + DejaVu Sans Mono para caracteres alfanuméricos y símbolos. Y Rounded Mgen+ para los demás caracteres.\nDescarga: https://github.com/miiton/Cica/releases\nReferencia:\nHack DejaVu Sans Mono Rounded Mgen+ Migu Es una fuente sintetizada de M+ e IPA.\nDescarga: https://itouhiro.github.io/mixfont-mplus-ipa/migu/\nOsaka Es una fuente que permite usar la fuente estándar de Mac OS Osaka en Windows.\nDescarga: http://ifs.nog.cc/osakattf.hp.infoseek.co.jp/\nPlemolJP Es una fuente de programación que combina la fuente japonesa de código abierto IBM Plex Sans JP lanzada por IBM y IBM Plex Mono de la serie Plex de IBM.\nDescarga: https://github.com/yuru7/PlemolJP/releases\n","date":"2024-03-30T02:21:31+09:00","image":"http://kenji.blog/p/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%E9%9B%86/img_hu5455a1c7ae52190ddcafb3051b00c15b_52757_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%E9%9B%86/","title":"Colección de fuentes para usar en programación"},{"content":"Te mostraré cómo iniciar el editor Hidemaru con el comando hide. Nota: Se ha comprobado que este método funciona en Windows 10/11.\nAbre el Editor del Registro. Ve a HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths. Crea una clave llamada hide.exe en App Paths. *El nombre antes de .exe en el nombre de esta clave será el nombre del comando. Establece la ruta al archivo ejecutable del editor Hidemaru en el valor (Predeterminado) de la clave hide.exe. En mi entorno era \u0026quot;C:\\Program Files (x86)\\Hidemaru\\Hidemaru.exe\u0026quot;. Crea un valor de cadena llamado Path en la clave hide.exe. Establece la ruta a la carpeta donde se encuentra el archivo ejecutable del editor Hidemaru en la información del valor de Path. En mi entorno era \u0026quot;C:\\Program Files (x86)\\Hidemaru\u0026quot;. Ahora podrás iniciar el editor Hidemaru con el comando hide en el cuadro de diálogo Ejecutar (que se muestra presionando la tecla Win + R). Además, en el símbolo del sistema puedes iniciar el editor Hidemaru con el comando start hide. 1 2 3 4 5 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\hide.exe] @=\u0026#34;\\\u0026#34;C:\\\\Program Files (x86)\\\\Hidemaru\\\\Hidemaru.exe\\\u0026#34;\u0026#34; \u0026#34;Path\u0026#34;=\u0026#34;\\\u0026#34;C:\\\\Program Files (x86)\\\\Hidemaru\\\\\\\u0026#34;\u0026#34; Si guardas el contenido anterior en un archivo .reg y lo ejecutas, la configuración se agregará al registro.\n","date":"2024-03-29T23:45:37+09:00","image":"http://kenji.blog/p/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89hide%E3%81%A7%E7%A7%80%E4%B8%B8%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E3%82%92%E7%AB%8B%E3%81%A1%E4%B8%8A%E3%81%92%E3%82%8B%E6%96%B9%E6%B3%95/img_2_hu43898a3aaad9ace099d9a060bc7203e5_68153_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89hide%E3%81%A7%E7%A7%80%E4%B8%B8%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E3%82%92%E7%AB%8B%E3%81%A1%E4%B8%8A%E3%81%92%E3%82%8B%E6%96%B9%E6%B3%95/","title":"Cómo iniciar el editor Hidemaru con el comando ''hide''"},{"content":"Problemas no resueltos en matemáticas Explicaremos algunos problemas no resueltos en matemáticas. Aunque los problemas en sí mismos son simples, todavía hay muchos que no han sido demostrados.\n¿Hay infinitos números perfectos? Un número perfecto es un número natural en el que la suma de sus divisores positivos (excluyéndose a sí mismo) es igual al propio número. Por ejemplo,\nLos divisores de 6 son 1, 2, 3, y como 1+2+3=6, es un número perfecto. Los divisores de 28 son 1, 2, 4, 7, 14, y como 1+2+4+7+14=28, es un número perfecto. Actualmente solo se han descubierto 51, y aunque se conjetura que hay infinitos, todavía no se ha demostrado.\nConjetura de Goldbach La conjetura de Goldbach sugiere que todo número par mayor que 2 puede expresarse como la suma de dos números primos. (Aquí, un número primo es un número natural que no tiene más divisores que 1 y él mismo).\nPor ejemplo,\n4=2+2 6=3+3 8=3+5 10=3+7=5+5 Aunque el problema en sí es muy simple, todavía no ha sido demostrado.\nHipótesis de Riemann Es la conjetura de que los ceros de la función zeta de Riemann se limitan a números pares negativos y a números complejos cuya parte real es 1/2.\nLa función zeta de Riemann es una función $\\zeta$ definida como:\n$$\\zeta(s):=\\sum _{n=1}^{\\infty }{\\frac {1}{n^{s}}}=1+{\\frac {1}{2^{s}}}+{\\frac {1}{3^{s}}}+{\\frac {1}{4^{s}}}+\\cdots$$ donde $s$ es un número complejo y $n$ es un número natural.\n","date":"2024-03-02T22:57:36+09:00","image":"http://kenji.blog/p/%E6%95%B0%E5%AD%A6%E3%81%AE%E6%9C%AA%E8%A7%A3%E6%B1%BA%E5%95%8F%E9%A1%8C/img_hub174c33a50b5d9de07ec5dc9c7de1bd4_731181_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E6%95%B0%E5%AD%A6%E3%81%AE%E6%9C%AA%E8%A7%A3%E6%B1%BA%E5%95%8F%E9%A1%8C/","title":"'Problemas no resueltos en matemáticas'"},{"content":"Colección de varios diálogos de información de versión Windows 11 Primero, la información de versión de Windows 11 que estoy usando ahora. IntelliJ IDEA (Community Edition) Este es el entorno donde escribo este blog. Visual Studio Code Este también es un editor que uso a menudo. Es sorprendentemente simple. Visual Studio Este es el entorno de desarrollo que uso con C++. LINE (Windows) Esta es la versión de Windows de LINE. Paint.NET Este es un software de edición de imágenes. sakura editor Este es un editor de texto. Google Chrome Este es Google Chrome. Después de la aparición de Edge, ya no lo uso mucho. Firefox Este es Firefox. Últimamente no lo uso mucho. Microsoft Edge Este es Microsoft Edge. Últimamente uso este más a menudo. OBS Studio Este es OBS Studio. Últimamente no lo uso mucho. TradingView Este es TradingView. Últimamente lo uso para ver el gráfico del dólar-yen. Spy++ Este es Spy++. Es una herramienta incluida en el SDK de Windows. dependency walker Este es dependency walker. Es una herramienta incluida en el SDK de Windows. resource hacker Este es resource hacker. Es una herramienta para editar y obtener recursos de archivos ejecutables. Microsoft Excel Este es Microsoft Excel. bandicam Este es bandicam. Es una herramienta de captura de video. winmerge Este es winmerge. Es una herramienta para ver diferencias entre archivos. iTunes Este es iTunes. Últimamente no lo uso mucho. Hidemaru Editor Este es Hidemaru Editor. Es un editor de texto. Adobe Photoshop CS6 Este es Adobe Photoshop CS6. Adobe Illustrator CS6 Este es Adobe Illustrator CS6. ESET NOD32 Este es ESET NOD32. NotePad++ Este es NotePad++. Es un editor de texto. MIFES Este es MIFES. Últimamente no lo uso mucho. ","date":"2024-03-02T21:32:11+09:00","image":"http://kenji.blog/p/%E3%81%84%E3%82%8D%E3%82%93%E3%81%AA%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E6%83%85%E5%A0%B1%E3%83%80%E3%82%A4%E3%82%A2%E3%83%AD%E3%82%B0%E9%9B%86%E3%82%81%E3%81%A6%E3%81%BF%E3%81%9F/img_hub829fc9858068bdd622cbafca10cd245_20954_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E3%81%84%E3%82%8D%E3%82%93%E3%81%AA%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E6%83%85%E5%A0%B1%E3%83%80%E3%82%A4%E3%82%A2%E3%83%AD%E3%82%B0%E9%9B%86%E3%82%81%E3%81%A6%E3%81%BF%E3%81%9F/","title":"'Colección de varios diálogos de información de versión'"},{"content":"Herramienta de grabación de pantalla en GIF animado He creado una herramienta para grabar la pantalla y convertirla en un GIF animado. Con esta herramienta, puedes grabar operaciones en pantalla y compartirlas mediante herramientas de comunicación como Microsoft Teams.\nCómo usar Inicia la herramienta Especifica el área a grabar. Si no se especifica, se grabará toda la pantalla. Presiona el botón de grabar Presiona el botón de detener grabación El GIF animado se guardará en la misma ubicación que el archivo ejecutable. Descargar Descargar\nAbre el enlace anterior y haz clic en el enlace de GIFScreenRecorder.exe para descargar el archivo ejecutable.\nCódigo fuente GitHub\n","date":"2024-02-08T01:23:01+09:00","image":"http://kenji.blog/p/gif%E3%82%A2%E3%83%8B%E3%83%A1%E7%94%BB%E9%9D%A2%E9%8C%B2%E7%94%BB%E3%83%84%E3%83%BC%E3%83%AB/img_hua1d1e581d2290ce1c516887dff1e6eb0_11957_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/gif%E3%82%A2%E3%83%8B%E3%83%A1%E7%94%BB%E9%9D%A2%E9%8C%B2%E7%94%BB%E3%83%84%E3%83%BC%E3%83%AB/","title":"'Herramienta de grabación de pantalla en GIF animado'"},{"content":"Resumen de estudio para el examen PMP Resumen de estudio para el examen PMP.\nDescripción general PMP es una certificación en gestión de proyectos. Es una certificación basada en una guía llamada PMBOK (7ma edición más reciente). El examen PMP consta de 180 preguntas a resolver en 230 minutos, pero como 5 preguntas son de prueba (dummy), se aprueba respondiendo correctamente 106 o más de 175 preguntas. Las respuestas son de opción múltiple, en su mayoría de 4 opciones, pero algunas tienen 5 opciones o son de selección múltiple.\nLiderazgo de servicio (Servant Leadership) Un estilo de liderazgo que apoya desde abajo en lugar de dar órdenes desde arriba.\n10 principios (características) del Liderazgo de servicio Escucha activa Empatía Sanación Conciencia Persuasión Conceptualización Previsión Administración Compromiso con el crecimiento de las personas Construcción de comunidad Manifiesto Ágil: 4 Valores Estamos descubriendo formas mejores de desarrollar software tanto por nuestra propia experiencia como ayudando a terceros. A través de este trabajo hemos aprendido a valorar:\nIndividuos e interacciones sobre procesos y herramientas Software funcionando sobre documentación extensiva Colaboración con el cliente sobre negociación contractual Respuesta ante el cambio sobre seguir un plan Esto es, aunque valoramos los elementos de la derecha, valoramos más los de la izquierda.\nManifiesto Ágil\nÁgil: 12 Principios detrás del Manifiesto Ágil Nuestra mayor prioridad es satisfacer al cliente mediante la entrega temprana y continua de software con valor. Aceptamos que los requisitos cambien, incluso en etapas tardías del desarrollo. Los procesos Ágiles aprovechan el cambio para proporcionar ventaja competitiva al cliente. Entregamos software funcional frecuentemente, entre dos semanas y dos meses, con preferencia al periodo de tiempo más corto posible. Los responsables de negocio y los desarrolladores trabajamos juntos de forma cotidiana durante todo el proyecto. Los proyectos se desarrollan en torno a individuos motivados. Hay que darles el entorno y el apoyo que necesitan, y confiarles la ejecución del trabajo. El método más eficiente y efectivo de comunicar información al equipo de desarrollo y entre sus miembros es la conversación cara a cara. El software funcionando es la medida principal de progreso. Los procesos Ágiles promueven el desarrollo sostenible. Los promotores, desarrolladores y usuarios debemos ser capaces de mantener un ritmo constante de forma indefinida. La atención continua a la excelencia técnica y al buen diseño mejora la Agilidad. La simplicidad, o el arte de maximizar la cantidad de trabajo no realizado, es esencial. Las mejores arquitecturas, requisitos y diseños emergen de equipos que se auto-organizan. A intervalos regulares el equipo reflexiona sobre cómo ser más efectivo para a continuación ajustar y perfeccionar su comportamiento en consecuencia. Principios detrás del Manifiesto Ágil\nTerminología Épica (Resumen general) Historia de usuario (Unidad registrada en el backlog del producto, unidad de priorización) Tarea (Elemento de trabajo técnico, sujeto a estimación de tiempo) Backlog del producto / Elemento del backlog del producto Propietario del producto (Product Owner) Interesado (Stakeholder) Guía de Práctica Ágil (Libro) Desarrollo Lean Kanban Cadena de valor AC (Costo Real / Actual Cost) EV (Valor Ganado / Earned Value) PV (Valor Planificado / Planned Value) EVA (Análisis del Valor Ganado / Earned Value Analysis) SPI (Índice de Rendimiento del Cronograma / Schedule Performance Index = EV / PV) CPI (Índice de Rendimiento del Costo / Cost Performance Index = EV / AC) EVM (Gestión del Valor Ganado / Earned Value Method) BAC (Presupuesto a la Conclusión) ETC (Estimación hasta la Conclusión) EAC (Estimación a la Conclusión) Organización Funcional Organización Matricial Organización Orientada a Proyectos Liderazgo de servicio Modelo de Tuckman (Formación, Conflicto, Normalización, Desempeño, Disolución) Acta constitutiva del equipo Planning Poker (Sucesión de Fibonacci) Retrospectiva (Actividad de revisión) Equipo virtual Acta constitutiva del proyecto Conflicto (6 formas de afrontarlo: Confrontación/Resolución de problemas, Colaboración, Compromiso, Suavización/Adaptación, Forzar, Retirada/Evitar) Mapeo del flujo de valor Mentoría Coaching Capacitación Teoría X e Y de Douglas McGregor Análisis FODA (Fortalezas, Oportunidades, Debilidades, Amenazas) Modelo SECI (Socialización, Exteriorización, Combinación, Interiorización) PDCA, PDSA PESTLE (Político, Económico, Social, Tecnológico, Legal, Ambiental) VUCA (Volatilidad, Incertidumbre, Complejidad, Ambigüedad) Método de Montecarlo Análisis de árbol de decisiones Valor Monetario Esperado (EMV) Net Promoter Score (NPS) Análisis de costo-beneficio Revisión de Sprint (Sprint Review) Gestión de entregas (Release Management) SOW (Declaración de Trabajo) \u0026ldquo;Documento que incluye una descripción detallada del alcance, objetivos, entregables, duración y recursos del proyecto\u0026rdquo; P-SOW (Declaración de Trabajo de Adquisición) RFI (Solicitud de Información) RFP (Solicitud de Propuesta) Contrato de Precio Fijo (FP) Contrato de Tiempo y Materiales (T\u0026amp;M) Contrato de Costos Reembolsables (CR) Contrato de Precio Fijo con Honorarios por Incentivos (FPIF) Corrupción del alcance (Scope creep) Modelo de Kano Método de distribución de fondos Método de 100 puntos Método MoSCoW (Must, Should, Could, Won\u0026rsquo;t/Would) Matriz de trazabilidad Diccionario de la EDT/WBS Velocidad (Número de puntos de historia logrados en cada iteración) Gráfico de velocidad Matriz de evaluación del nivel de participación de los interesados (Desconocedor, Reticente, Neutral, Partidario, Líder) Revisión de fase (Phase Gate) Radiador de información Gráfico de trabajo pendiente (Burndown Chart) Gráfico de trabajo realizado (Burnup Chart) Diagrama de flujo acumulativo QCD (Calidad, Costo, Entrega) Modelo en espiral Cadena crítica Característica (Feature) Iteración / Sprint Iterativo Incremental Incremento (Entregable de incremento) Resiliencia Administración (Stewardship) Comportamiento honesto, confiable y acciones responsables (toma de decisiones) Escalamiento KPT (Mantener, Problema, Intentar / Keep, Problem, Try) RACI (Responsable, Aprobador, Consultado, Informado) PMO (Oficina de Dirección de Proyectos) De apoyo, De control, Directiva Cadencia Adaptación (Tailoring) Niveles neurológicos (Entorno, Comportamiento, Capacidades, Creencias/Valores, Identidad) Caso de negocio (Documento que registra el propósito, beneficios, riesgos, retorno de inversión, etc. del proyecto) Análisis de tendencias (Se realiza mediante un gráfico de control y utiliza técnicas matemáticas para predecir resultados futuros) Plan de gestión de calidad (Define la estrategia y enfoque para la calidad de los entregables del proyecto) Proceso de gobernanza Propietario del producto (Visión del producto, priorización del backlog, lanzamiento del producto) Propietario del proyecto (Patrocinador del proyecto) Director de proyecto (Gestiona todo el proyecto) Líder de proyecto (Dirige en el sitio) Miembro del proyecto (Impulsa el proyecto) Enfoque híbrido Producto Mínimo Viable (MVP) Revisión de la iteración Taller Plan de gestión de beneficios del proyecto (Beneficios objetivo del proyecto, alineación estratégica para lograr beneficios y plazos para materializarlos) Indicador Clave de Rendimiento (KPI) En el sitio (On-site) Estimación análoga Estimación por tres valores Estimación paramétrica Revisión del proyecto Enfoque Big Bang DSDM (Método de Desarrollo de Sistemas Dinámicos) Ley de Brooks Enfoque Big Bang (Introducir todo al mismo tiempo) Registro de riesgos (Documento utilizado como herramienta de gestión de riesgos para identificar posibles contratiempos en el proyecto) Registro de riesgos Teoría del liderazgo situacional SL (4 comportamientos según la situación del individuo) Competencia Compromiso Referencias Guía de Scrum (Ken Schwaber \u0026amp; Jeff Sutherland) PMI ECO (Versión en japonés) Guía Práctica de Ágil Código de Ética y Conducta Profesional de PMI Materiales de estudio ¡Apunta a aprobar el examen de certificación PMP® a la primera! Curso estratégico para una preparación eficiente (2021) Compatible con Agile ","date":"2024-02-04T18:41:31+09:00","image":"http://kenji.blog/p/pmp%E5%8B%89%E5%BC%B7/img_hu67a0961bf8e284d45690ac9cdb09e5b3_16702_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/pmp%E5%8B%89%E5%BC%B7/","title":"'Estudio PMP'"},{"content":"Resumen Notas sobre desastres naturales ocurridos en Japón\n1 de enero de 2024 Terremoto de la península de Noto ","date":"2024-01-07T00:50:09+09:00","image":"http://kenji.blog/p/%E6%97%A5%E6%9C%AC%E3%81%AE%E7%81%BD%E5%AE%B3/img_hue649e8d0b3bd837ea85e155e108b15fd_273208_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E6%97%A5%E6%9C%AC%E3%81%AE%E7%81%BD%E5%AE%B3/","title":"Desastres en Japón"},{"content":"Siete hierbas Seri (perejil japonés) Nazuna (bolsa de pastor) Gogyō (algodonera) Hakobera (pamplina) Hotokenoza (lámpsana) Suzuna (nabo) Suzushiro (rábano) ","date":"2024-01-06T22:22:00+09:00","image":"http://kenji.blog/p/%E4%B8%83%E8%8D%89%E7%B2%A5%E3%81%AE%E3%83%AC%E3%82%B7%E3%83%94/img_hu3e148c57f6499065259203ce3bd1c8c5_295252_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E4%B8%83%E8%8D%89%E7%B2%A5%E3%81%AE%E3%83%AC%E3%82%B7%E3%83%94/","title":"'Receta de Nanakusa-gayu'"},{"content":"Música japonesa recomendada チューリップ - 青春の影 イルカ - なごり雪 河島英五 - 酒と泪と男と女 Orangestar - Surges 竹内まりや - Plastic Love RADWIMPS - 前前前世 BEGIN - 島人ぬ宝 ザ・ブルーハーツ - 情熱の薔薇 荒井由実 - ルージュの伝言 Begin - 海の声 荒井由実 - ひこうき雲 Love is Over - 欧陽菲菲 クラムボン - 波よせて RADWIMPS - スパークル かりゆし58 - アンマー かりゆし58 - オワリはじまり テレサ・テン - 時の流れに身をまかせ 宇多田ヒカル『One Last Kiss』 不可思議/wonderboy - Pellicule (Official Music Video) Kamen Rider Black RX - Opening Song たしかなこと / 小田和正 - Covered by パクユナ 【Canción curativa japonesa】Hana／Kosuke Atari（covered by Leah） 「真夜中のドア〜stay with me」/ 松原みき Official Lyric Video Midnight Pretenders Anri - Last Summer Whisper 1985 - The Blue Hearts BUMP OF CHICKEN - supernova チューリップ　心の旅　1972 小さな恋のうた ASKA - はじまりはいつも雨 (Official Music Video) キリンジ - エイリアンズ あの日の空よ - 南こうせつ ","date":"2024-01-06T04:11:01+09:00","image":"http://kenji.blog/p/%E5%A5%BD%E3%81%8D%E3%81%AA%E9%82%A6%E6%A5%BD/img_hub840e0bd8da1fd2845b1fe157b13d9d8_1067024_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E5%A5%BD%E3%81%8D%E3%81%AA%E9%82%A6%E6%A5%BD/","title":"Música japonesa favorita"},{"content":"Música occidental recomendada Keane - Somewhere Only We Know Ben E. King - Stand By Me The Beatles - Hey Jude The Mamas \u0026amp; The Papas - California Dreamin' Ed Sheeran - Shape of You Mark Ronson ft. Bruno Mars – Uptown Funk Sugar - Maroon 5 Bette Midler - The Rose Green Day - Basket Case Coldplay - Viva La VidaViva La Vida Maroon 5 - Memories (Lyrics) Dido - Thank You (Official Video) Bob Dylan - Blowin\u0026rsquo;The Wind (Soplando en el viento) Coldplay - Yellow Eric Clapton - Tears In Heaven B. J. Thomas - Raindrops Keep Fallin\u0026rsquo; on My Head (Stereo / Lyrics) Take Me Home, Country Roads Simon \u0026amp; Garfunkel - Mrs. Robinson (Audio) Taylor Swift - Love Story (Live on Letterman) Wiz Khalifa - See You Again ft. Charlie Puth [Official Video] Furious 7 Soundtrack The Top (Extended Mix) Something Just Like This Feelings Yesterday Once More Carpenters - Top Of The World El resplandor de la juventud / I Need To Be In Love [Con traducción al japonés] Carpenters Bob Marley \u0026amp; The Wailers \u0026ldquo;Three Little Birds\u0026rdquo; Alan Walker - All Falls Down (feat. Noah Cyrus with Digital Farm Animals) Alan Walker - Darkside (feat. Au/Ra and Tomine Harket) Alan Walker - Alone Alan Walker - Sing Me To Sleep Alan Walker - Faded killing me softly with his song a-ha - Take On Me (Official Video) ","date":"2024-01-05T00:14:22+09:00","image":"http://kenji.blog/p/%E5%A5%BD%E3%81%8D%E3%81%AA%E6%B4%8B%E6%A5%BD/img_hued679cc884753e5576b95c5f8e6f029a_283063_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E5%A5%BD%E3%81%8D%E3%81%AA%E6%B4%8B%E6%A5%BD/","title":"Música occidental favorita"},{"content":"Instalar PowerToys con el símbolo del sistema Aquí se muestra cómo instalar PowerToys usando el símbolo del sistema.\n1 winget install Microsoft.PowerToys --source winget Desinstalar PowerToys con el símbolo del sistema 1 winget uninstall --name PowerToys ","date":"2023-09-30T21:23:00+09:00","image":"http://kenji.blog/p/powertoys%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/img_hud87e455d0958ca41a83ffdf977dac7c2_37972_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/powertoys%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/","title":"Instalar PowerToys con el símbolo del sistema"},{"content":"Mostrar respeto Respetemos a quienes pueden hacer lo que nosotros no podemos\nEn la sociedad, sorprendentemente hay muchas personas que clasifican los trabajos y las posiciones como superiores o inferiores y son incapaces de mostrar respeto.\nRespetemos a las personas que logran hacer trabajos que nosotros no podemos, sin importar qué trabajo sea.\nQuiero tener esto siempre presente.\n","date":"2023-08-01T23:42:31+09:00","image":"http://kenji.blog/p/%E8%87%AA%E5%88%86%E3%81%AB%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B%E4%BA%BA%E3%81%AB%E6%95%AC%E6%84%8F%E3%82%92%E6%89%95%E3%81%8A%E3%81%86/img_hu0ec845f1b3d93c1f1262f8f9c2fb19a8_357395_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E8%87%AA%E5%88%86%E3%81%AB%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B%E4%BA%BA%E3%81%AB%E6%95%AC%E6%84%8F%E3%82%92%E6%89%95%E3%81%8A%E3%81%86/","title":"'Respetemos a quienes pueden hacer lo que nosotros no podemos'"},{"content":"Splatoon 2 Probablemente el juego que he jugado durante más tiempo en mi vida es Splatoon 2. Casi no he jugado al modo historia, pero el emparejamiento para las batallas en línea 4 contra 4 está muy bien hecho y puedes jugar contra personas de un nivel similar al tuyo, por lo que tiene un atractivo del que no te cansas. También es divertido leer los movimientos de los oponentes y aliados para pensar en estrategias para ganar.\nArmas Las armas que uso con más frecuencia son, en orden: \u0026ldquo;Lanzatintas plus B\u0026rdquo;, \u0026ldquo;Lanzatintas novato\u0026rdquo;, \u0026ldquo;Rodillo básico\u0026rdquo; y \u0026ldquo;Rodillo versátil B\u0026rdquo;. El \u0026ldquo;Lanzatintas novato\u0026rdquo; es un arma para principiantes y la usaba mucho al principio.\nLos puntos de pintado para cada arma son los siguientes:\nArma Puntos de pintado Rodillo versátil 6,636,594p Rodillo básico 6,200,629p Lanzatintas novato 4,211,759p Lanzatintas plus B 744,678p Lanzatintas 301,238p Sobre mi nivel Siento que voy y vengo entre A+ y S+, y continúa la situación en la que no puedo llegar a la cima de S+, pero siento que disfruto más jugando las partidas que intentando subir de rango. (Si subes demasiado, los oponentes se vuelven fuertes y la tensión aumenta, por lo que ya no puedes disfrutarlo).\nTiempo de juego El tiempo de juego ha superado las 2500 horas.\nMetas futuras El objetivo es mantener el nivel en el juego y jugar de forma divertida, pero me gustaría alcanzar el máximo en dinero y equipamiento. Desde el lanzamiento de Splatoon 3, el emparejamiento para las partidas ha tardado más y cada vez hay más casos en los que no es posible emparejar, así que me gustaría seguir jugando mientras rezo para que la cantidad de jugadores no disminuya más.\n","date":"2023-08-01T00:26:30+09:00","image":"http://kenji.blog/p/%E3%82%B9%E3%83%97%E3%83%A9%E3%83%88%E3%82%A5%E3%83%BC%E3%83%B32/img_hu177387d05aedc7553df9576fd3706d02_192717_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E3%82%B9%E3%83%97%E3%83%A9%E3%83%88%E3%82%A5%E3%83%BC%E3%83%B32/","title":"'Splatoon 2'"},{"content":"Acerca del premio Microsoft MVP (2023-2024) Esta vez, he recibido el premio Microsoft MVP (2023-2024). Este será mi séptimo año consecutivo recibiendo el premio desde 2017.\nLa categoría premiada es Developer Technologies.\nMirando hacia atrás en mis actividades pasadas, he realizado lo siguiente:\nPublicación de código en GitHub Difusión de información técnica en mi blog y redes sociales (como Twitter) Publicaciones en el foro MSDN Comentarios sobre productos de Microsoft Espero seguir compartiendo información escribiendo mejores artículos en el futuro.\nMuchas gracias por su apoyo.\n","date":"2023-07-31T19:15:14+09:00","image":"http://kenji.blog/p/microsoft-mvp%E5%8F%97%E8%B3%9E%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A62023-2024/img_hua5cba2ce9936d80b2181232333db0622_19957_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/microsoft-mvp%E5%8F%97%E8%B3%9E%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A62023-2024/","title":"'Acerca del premio Microsoft MVP (2023-2024)'"},{"content":"Tres problemas clásicos de construcción de la antigua Grecia Dado un círculo, construir un cuadrado con la misma área (Cuadratura del círculo) Dado un ángulo arbitrario, dividirlo en tres partes iguales (Trisección del ángulo) Dado un cubo, construir un cubo que tenga el doble de su volumen (Duplicación del cubo) Espiral de Arquímedes En un plano, se hace girar una semirrecta OB alrededor de un punto fijo O a una velocidad constante. Si la posición inicial es OA, un punto P parte de O al mismo tiempo que la semirrecta comienza a moverse desde OA, y se mueve a lo largo de OB a una velocidad constante. La curva que traza el punto P es la espiral de Arquímedes.\nTeorema de Pappus Cicloide Concoide de Nicomedes Cisoide de Diocles Método de las tangentes de Fermat Método de las normales de Descartes Cronología Año Evento c. 3400 a. C. Los sumerios cuentan con fichas de arcilla como sustituto de monedas c. 3000 a. C. Aparecen las matemáticas jeroglíficas en Egipto c. 2800 a. C. La civilización del valle del Indo utiliza un sistema de pesos y medidas basado en el sistema decimal c. 2700 a. C. Los egipcios comprueban los ángulos con cuerdas y ternas pitagóricas c. 2500 a. C. Se descubre el ábaco, una herramienta para calcular c. 2500 a. C. Referencias Historia de las matemáticas ","date":"2023-07-22T15:25:10+09:00","image":"http://kenji.blog/p/%E6%95%B0%E5%AD%A6%E3%81%AE%E6%AD%B4%E5%8F%B2/img_hu67324d5a4a949c1841dc5158adcb7086_428375_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E6%95%B0%E5%AD%A6%E3%81%AE%E6%AD%B4%E5%8F%B2/","title":"'Historia de las Matemáticas'"},{"content":"Acerca del trackball Elecom Deft Pro M-DPT1MRBK Ha pasado aproximadamente una semana desde que compré el trackball \u0026ldquo;Deft Pro M-DPT1MRBK\u0026rdquo; de Elecom, así que revisaré mi experiencia al usarlo.\nCaracterísticas principales\nTiene una gran cantidad de botones (8) Se puede conectar de 3 formas: con cable, con receptor inalámbrico y por Bluetooth El tamaño de la bola es grande (tamaño mediano, 44 mm de diámetro) Precio de compra en Amazon: ¥ 7.012 (a partir del 2 de mayo de 2021) Puntos buenos A diferencia de un mouse, no es necesario mover la muñeca, lo que reduce la tensión en la misma. Debido a la gran cantidad de botones, se pueden asignar varias funciones a los botones. Actualmente están asignados como se muestra arriba. También puedes cambiar la asignación de botones para cada aplicación. ※ La instalación de un software dedicado es necesaria para la asignación de botones. Como la bola es grande, es relativamente fácil realizar movimientos finos para un trackball. Puntos malos El polvo se acumula alrededor del trackball, por lo que es necesario quitar la bola y limpiarla regularmente (aproximadamente una vez cada pocos días). La sensación operativa es diferente a la de un mouse, usando el dedo índice y medio para mover el cursor, y el pulgar para operar la rueda del mouse, por lo que toma tiempo acostumbrarse. Como escribí anteriormente, es fácil realizar movimientos finos, pero todavía es difícil mover el cursor píxel por píxel con un trackball. No es posible operar la rueda mientras se presiona el botón izquierdo (por ejemplo, cuando se desea acercar/alejar mientras se selecciona un área en Paint). En conclusión, aunque creo que es de los más caros entre los trackballs, en general es bastante fácil de operar y creo que ha mejorado la eficiencia de mi trabajo. Espero que esto sea útil para quienes estén considerando comprarlo.\n","date":"2023-05-02T23:28:33+09:00","image":"http://kenji.blog/p/%E3%83%88%E3%83%A9%E3%83%83%E3%82%AF%E3%83%9C%E3%83%BC%E3%83%ABdeft-prom-dpt1mrbk%E3%81%AE%E3%81%99%E3%81%99%E3%82%81/img_hue224b6b6b3d7da0ebda5f0b37d429b68_231359_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E3%83%88%E3%83%A9%E3%83%83%E3%82%AF%E3%83%9C%E3%83%BC%E3%83%ABdeft-prom-dpt1mrbk%E3%81%AE%E3%81%99%E3%81%99%E3%82%81/","title":"Recomendación del trackball Deft Pro (M-DPT1MRBK)"},{"content":"¿Qué es wxWidgets? wxWidgets es una biblioteca GUI de C++ que funciona en plataformas como Windows, Mac, Linux, Android, iOS, entre otras.\nInstalación de wxWidgets Abre https://www.wxwidgets.org/downloads/ y descarga Windows Installer. Ejecuta wxMSW-3.2.2.1-Setup.exe para instalar. Abre \u0026ldquo;C:\\wxWidgets-3.2.2.1\\build\\msw\\wx_vc17.sln\u0026rdquo; desde la carpeta instalada. Una vez abierto wx_vc17.sln, selecciona Compilar \u0026gt; Compilar por lotes (Build \u0026gt; Batch Build). Haz clic en el botón Seleccionar todo y luego en el botón Recompilar. Cierra Visual Studio una vez que finalice la compilación. Creación de un proyecto de ejemplo Abre Visual Studio. Selecciona Archivo \u0026gt; Nuevo \u0026gt; Proyecto. Selecciona Aplicación de escritorio de Windows (pestañas C++, Windows, Escritorio). Ingresa wxWidgetsSample en Nombre del proyecto. Haz clic en Crear. Haz clic derecho en wxWidgetsSample y selecciona Propiedades. En Propiedades de configuración \u0026gt; C/C++ \u0026gt; Directorios de inclusión adicionales, agrega C:\\wxWidgets-3.2.2.1\\include y C:\\wxWidgets-3.2.2.1\\include\\msvc. En Propiedades de configuración \u0026gt; Vinculador \u0026gt; Directorios de bibliotecas adicionales, agrega C:\\wxWidgets-3.2.2.1\\lib\\vc_x64_lib. Abre wxWidgetsSample.cpp y reemplázalo con el siguiente código. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 #pragma comment(linker,\u0026#34;\\\u0026#34;/manifestdependency:type=\u0026#39;win32\u0026#39; name=\u0026#39;Microsoft.Windows.Common-Controls\u0026#39; version=\u0026#39;6.0.0.0\u0026#39; processorArchitecture=\u0026#39;*\u0026#39; publicKeyToken=\u0026#39;6595b64144ccf1df\u0026#39; language=\u0026#39;*\u0026#39;\\\u0026#34;\u0026#34;) #include \u0026lt;wx/wxprec.h\u0026gt; #ifndef WX_PRECOMP #include \u0026lt;wx/wx.h\u0026gt; #endif class MyApp : public wxApp { public: virtual bool OnInit(); }; class MyFrame : public wxFrame { public: MyFrame(); private: void OnHello(wxCommandEvent\u0026amp; event); void OnExit(wxCommandEvent\u0026amp; event); void OnAbout(wxCommandEvent\u0026amp; event); }; enum { ID_Hello = 1 }; wxIMPLEMENT_APP(MyApp); bool MyApp::OnInit() { MyFrame* frame = new MyFrame(); frame-\u0026gt;Show(true); return true; } MyFrame::MyFrame() : wxFrame(NULL, wxID_ANY, \u0026#34;Hello World\u0026#34;) { wxMenu* menuFile = new wxMenu; menuFile-\u0026gt;Append(ID_Hello, \u0026#34;\u0026amp;Hello...\\tCtrl-H\u0026#34;, \u0026#34;Help string shown in status bar for this menu item\u0026#34;); menuFile-\u0026gt;AppendSeparator(); menuFile-\u0026gt;Append(wxID_EXIT); wxMenu* menuHelp = new wxMenu; menuHelp-\u0026gt;Append(wxID_ABOUT); wxMenuBar* menuBar = new wxMenuBar; menuBar-\u0026gt;Append(menuFile, \u0026#34;\u0026amp;File\u0026#34;); menuBar-\u0026gt;Append(menuHelp, \u0026#34;\u0026amp;Help\u0026#34;); SetMenuBar(menuBar); wxButton* button1 = new wxButton(this, ID_Hello, _(\u0026#34;Hello\u0026#34;), wxPoint(20, 20), wxSize(100, 32)); Connect(ID_Hello, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MyFrame::OnHello)); wxButton* button2 = new wxButton(this, wxID_ABOUT, _(\u0026#34;About\u0026#34;), wxPoint(20, 60), wxSize(100, 32)); Connect(wxID_ABOUT, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MyFrame::OnAbout)); wxButton* button3 = new wxButton(this, wxID_EXIT, _(\u0026#34;Exit\u0026#34;), wxPoint(20, 100), wxSize(100, 32)); Connect(wxID_EXIT, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MyFrame::OnExit)); CreateStatusBar(); SetStatusText(\u0026#34;Welcome to wxWidgets!\u0026#34;); Bind(wxEVT_MENU, \u0026amp;MyFrame::OnHello, this, ID_Hello); Bind(wxEVT_MENU, \u0026amp;MyFrame::OnAbout, this, wxID_ABOUT); Bind(wxEVT_MENU, \u0026amp;MyFrame::OnExit, this, wxID_EXIT); } void MyFrame::OnExit(wxCommandEvent\u0026amp; event) { Close(true); } void MyFrame::OnAbout(wxCommandEvent\u0026amp; event) { wxMessageBox(\u0026#34;This is a wxWidgets\u0026#39; Hello world sample\u0026#34;, \u0026#34;About Hello World\u0026#34;, wxOK | wxICON_INFORMATION); } void MyFrame::OnHello(wxCommandEvent\u0026amp; event) { wxLogMessage(\u0026#34;Hello world from wxWidgets!\u0026#34;); } Al compilar y ejecutar se abrirá una ventana como la siguiente. Referencias El proyecto de ejemplo se encuentra a continuación. wxWidgetsSample\nSitio oficial Juegos creados con C++ y wxWidgets Fin.\n","date":"2023-04-18T00:18:22+09:00","image":"http://kenji.blog/p/wxwidgets-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB/img_hud707912b3d08e9053ad61da0782a9b23_168133_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/wxwidgets-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB/","title":"'Ejemplo usando wxWidgets'"},{"content":"Películas que quiero ver (marcar al verlas) Maquia: Una historia de amor inmortal La fórmula preferida del profesor Summer Wars Talentos ocultos (Hidden Figures) En busca del destino (Good Will Hunting) Una mente brillante (A Beautiful Mind) La teoría del todo El hombre que conocía el infinito Hawking (Benedict Cumberbatch) Tenchi Meisatsu Pi 21 Blackjack I.Q. La verdad oculta (Proof) 3 Idiots Buffalo \u0026lsquo;66 La naranja mecánica Llamaradas (Backdraft) Asakusa Kid Top Gun The Matrix Resurrections Soy leyenda El código Da Vinci La red social STEINS;GATE Planetes Gravedad (Gravity) Violet Evergarden Psycho-Pass Demon Slayer: Kimetsu no Yaiba La princesa Mononoke Winny El foco cero (Zero Focus) Zootopia Your Name. El tiempo contigo (Weathering with You) Volver al futuro (1,2,3) Shin Godzilla Shin Ultraman Shin Kamen Rider Suzume THE FIRST SLAM DUNK ","date":"2023-04-17T00:34:13+09:00","image":"http://kenji.blog/p/%E6%98%A0%E7%94%BBtodo%E3%83%AA%E3%82%B9%E3%83%88/image_hu831a556e644f698f06f7bab476f01bf6_248271_120x120_fill_q75_box_smart1.jpg","permalink":"http://kenji.blog/es/p/%E6%98%A0%E7%94%BBtodo%E3%83%AA%E3%82%B9%E3%83%88/","title":"'Lista de TODO de películas'"},{"content":"Plantilla de página web genial\nhtml5up https://html5up.net/ Dejo esta nota porque pensé que me gustaría usarla.\n","date":"2023-04-17T00:26:55+09:00","image":"http://kenji.blog/p/%E3%81%8B%E3%81%A3%E3%81%93%E3%81%84%E3%81%84-web-%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88html5up/img_huc021190a6647c74fdf17f0c26cf7f09d_324732_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E3%81%8B%E3%81%A3%E3%81%93%E3%81%84%E3%81%84-web-%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88html5up/","title":"Plantilla de página web genial (html5up)"},{"content":"Requisitos Estándar ISO C++ 20 (/std:c++20) Código 1 2 3 4 #include \u0026lt;chrono\u0026gt; #include \u0026lt;format\u0026gt; std::string datetime = std::format(\u0026#34;{:%FT%TZ}\u0026#34;, system_clock::now()); Esta fue la forma de generar la hora actual en formato ISO8601 en C++.\nReferencias std::format ","date":"2023-04-15T19:35:27+09:00","image":"http://kenji.blog/p/c-%E3%81%A7%E7%8F%BE%E5%9C%A8%E6%99%82%E5%88%BB%E3%82%92iso8601%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E3%81%A7%E5%87%BA%E5%8A%9B%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hu7d543f2117b8a102814b6a542ff27896_11509_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/c-%E3%81%A7%E7%8F%BE%E5%9C%A8%E6%99%82%E5%88%BB%E3%82%92iso8601%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E3%81%A7%E5%87%BA%E5%8A%9B%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"'Cómo generar la hora actual en formato ISO8601 en C++'"},{"content":"Aquí se explica cómo crear un acceso directo para apagar Windows.\nEs útil porque puedes apagar tu computadora simplemente haciendo doble clic en el acceso directo creado en el escritorio u otra ubicación.\nCómo crearlo 1. Haz clic derecho en el escritorio y selecciona Nuevo \u0026gt; Acceso directo 2. Aparecerá la pantalla de creación de acceso directo, ingresa shutdown.exe -s -f -t 0 y haz clic en Siguiente 3. Ingresa el nombre del acceso directo Apagar y haz clic en Finalizar 4. Cambiar el icono del acceso directo creado Haz clic derecho en el acceso directo creado y selecciona Propiedades\nHaz clic en Cambiar icono\nSelecciona el icono cuadrado rojo y haz clic en Aceptar, luego haz clic en Aceptar nuevamente para cerrar las propiedades.\nEso es todo.\nAl hacer doble clic en el acceso directo creado, Windows se apagará.\n*Nota: No se mostrará un cuadro de diálogo de confirmación de apagado.\n","date":"2023-04-11T17:03:32+09:00","image":"http://kenji.blog/p/windows-%E3%82%92%E3%82%B7%E3%83%A3%E3%83%83%E3%83%88%E3%83%80%E3%82%A6%E3%83%B3%E3%81%99%E3%82%8B%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hu9b7c59b017f6e7ad15ccc41a6e668b14_6147_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/windows-%E3%82%92%E3%82%B7%E3%83%A3%E3%83%83%E3%83%88%E3%83%80%E3%82%A6%E3%83%B3%E3%81%99%E3%82%8B%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"'Cómo crear un acceso directo para apagar Windows'"},{"content":"Te mostraremos cómo aplicar un efecto de mosaico a una parte específica de una imagen usando paint.net.\nAl subir imágenes a internet, es posible que desees aplicar un mosaico a áreas específicas de la imagen. Usando paint.net puedes procesar la imagen rápidamente.\nPasos 1. Abre la imagen a la que deseas aplicar el mosaico en paint.net 2. Usa la herramienta de selección para seleccionar la parte a la que deseas aplicar el mosaico (es posible la selección múltiple) 3. Selecciona Menú \u0026gt; Efectos \u0026gt; Distorsión \u0026gt; Mosaico Configura la aspereza del mosaico con el tamaño de celda. Cuanto mayor sea el valor, mayor será la ocultación. [Reducción] Selecciona Método bilineal multimuestreo [Ampliación] Selecciona Método del vecino más cercano Cierra el cuadro de diálogo con OK.\n4. La imagen será procesada con el efecto de mosaico, procede a guardarla. Eso es todo.\n","date":"2023-04-11T16:33:10+09:00","image":"http://kenji.blog/p/paint.net%E3%81%A7%E7%94%BB%E5%83%8F%E3%81%AE%E7%89%B9%E5%AE%9A%E5%80%8B%E6%89%80%E3%81%AB%E3%83%A2%E3%82%B6%E3%82%A4%E3%82%AF%E3%82%92%E3%81%8B%E3%81%91%E3%82%8B%E6%96%B9%E6%B3%95/img_huffa96a6cc9046fae85e7535d0c0f77f3_7385_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/paint.net%E3%81%A7%E7%94%BB%E5%83%8F%E3%81%AE%E7%89%B9%E5%AE%9A%E5%80%8B%E6%89%80%E3%81%AB%E3%83%A2%E3%82%B6%E3%82%A4%E3%82%AF%E3%82%92%E3%81%8B%E3%81%91%E3%82%8B%E6%96%B9%E6%B3%95/","title":"'Cómo aplicar el efecto mosaico a una parte específica de una imagen en paint.net'"},{"content":"Te mostraré cómo añadir un borde a una imagen usando paint.net.\nPasos 1. Abre la imagen a la que quieres añadir un borde en paint.net. 2. Configura el color secundario (este será el color del borde). Si no se muestra la paleta de colores, presiona la tecla F8 en tu teclado.\nSi deseas configurarlo en negro, haz clic en .\n3. Selecciona el menú \u0026gt; Imagen \u0026gt; Cambiar tamaño del lienzo. Aumenta el ancho y el alto en 2 píxeles cada uno. Si aumentas 2 píxeles, el borde será de 1 píxel. Si quieres un borde de 5 píxeles, aumenta el ancho y el alto en 10 píxeles cada uno.\nSelecciona \u0026ldquo;Medio\u0026rdquo; (Centro) como ancla y haz clic en OK.\n4. Se añadirá un borde a la imagen, luego guarda la imagen. Eso es todo.\n","date":"2023-04-11T14:31:59+09:00","image":"http://kenji.blog/p/paint.net%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E7%94%BB%E5%83%8F%E3%81%AB%E6%9E%A0%E7%B7%9A%E3%82%92%E3%81%A4%E3%81%91%E3%82%8B%E6%96%B9%E6%B3%95/img_3_hu0a2e55b3f220b3e7559f248d1c86ab19_112900_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/paint.net%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E7%94%BB%E5%83%8F%E3%81%AB%E6%9E%A0%E7%B7%9A%E3%82%92%E3%81%A4%E3%81%91%E3%82%8B%E6%96%B9%E6%B3%95/","title":"Cómo añadir un borde a una imagen usando paint.net"},{"content":"Introducción Usando un servicio llamado Ranklet, puedes obtener fácilmente una clasificación de páginas populares desde Google Analytics y colocarla en tu sitio.\nEn este artículo, te mostraremos cómo colocarlo en un blog HUGO.\nImagen de funcionamiento Preparación Asegúrate de haber configurado Google Analytics en tu sitio. Pasos Accede a Ranklet Haz clic en Sign in with Google e inicia sesión con tu cuenta de Google (asegúrate de que esté vinculada a tu cuenta de Google Analytics) Haz clic en Permitir (許可)\nConfigura la información básica Lo he configurado como se muestra arriba.\nEn Vista de Google Analytics (Google Analytics ビュー), selecciona la vista de la que deseas obtener la clasificación. Configura el reemplazo de texto Lo he configurado como se muestra arriba. Se configura para eliminar | kenji.blog del título de la página.\nConfigura la plantilla HTML (Se ocultaron los números de clasificación) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 \u0026lt;div class=\u0026#34;ranklet ranklet-reset\u0026#34;\u0026gt; \u0026lt;table class=\u0026#34;ranklet-table\u0026#34;\u0026gt; \u0026lt;tbody class=\u0026#34;ranklet-pages\u0026#34;\u0026gt; {{#context.pages}} \u0026lt;tr class=\u0026#34;ranklet-page\u0026#34;\u0026gt; \u0026lt;td class=\u0026#34;ranklet-image\u0026#34;\u0026gt; {{#image}} \u0026lt;a href=\u0026#34;{{url}}\u0026#34; class=\u0026#34;ranklet-link\u0026#34;\u0026gt; \u0026lt;img class=\u0026#34;ranklet-img\u0026#34; src=\u0026#34;{{image}}\u0026#34; /\u0026gt; \u0026lt;/a\u0026gt; {{/image}} \u0026lt;/td\u0026gt; \u0026lt;td class=\u0026#34;ranklet-meta\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;ranklet-title\u0026#34;\u0026gt; \u0026lt;a href=\u0026#34;{{url}}\u0026#34; class=\u0026#34;ranklet-link\u0026#34;\u0026gt; {{title}} \u0026lt;/a\u0026gt; \u0026lt;/div\u0026gt; {{#description}} \u0026lt;div class=\u0026#34;ranklet-description\u0026#34;\u0026gt; \u0026lt;a href=\u0026#34;{{url}}\u0026#34; class=\u0026#34;ranklet-link\u0026#34;\u0026gt; {{description}} \u0026lt;/a\u0026gt; \u0026lt;/div\u0026gt; {{/description}} \u0026lt;/td\u0026gt; \u0026lt;/tr\u0026gt; {{/context.pages}} \u0026lt;/tbody\u0026gt; \u0026lt;/table\u0026gt; \u0026lt;/div\u0026gt; CSS (Se cambió el tamaño de la fuente y se configuró la descripción para que se muestre en 3 líneas) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 #ranklet-{{context.id}} { .ranklet-reset { // リセット table, tr, td, div, span { margin: 0; padding: 0; border: 0; font-size: 100%; font: inherit; vertical-align: baseline; line-height: 1; box-sizing: border-box; } } .ranklet-table { border-collapse: separate; border-spacing: 8px 24px; width: 100%; word-break: break-all; td { vertical-align: middle; } .ranklet-rank { text-align: center; font-size: 120%; } .ranklet-image { text-align: center; img { max-width: 128px; max-height: 128px; } } .ranklet-meta { .ranklet-title { font-size: 20px; line-height: 125%; } .ranklet-description { font-size: 16px; margin-top: 8px; line-height: 125%; display: -webkit-box; overflow: hidden; -webkit-box-orient: vertical; -webkit-line-clamp: 3; /* 行数 */ } } } } JavaScript sin cambios Copia el HTML de \u0026ldquo;Publicación en el sitio\u0026rdquo; (サイトへの掲載) Copia el HTML que se muestra.\nPégalo en la plantilla de HUGO Crea layouts/partials/ranklet.html y pega el HTML copiado. 1 \u0026lt;div id=\u0026#34;ranklet-11958\u0026#34;\u0026gt;\u0026lt;/div\u0026gt;\u0026lt;script src=\u0026#34;//widget.ranklet.com/v1/ranklet/s3/widgets/11958/widget.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; Pega el siguiente código en la línea anterior a \u0026lt;/footer\u0026gt; en layouts/_default/single.html. 1 {{- partial \u0026#34;ranklet.html\u0026#34; . }} Eso es todo. Ahora la clasificación se mostrará en la parte inferior de esta página como se muestra a continuación.\n","date":"2023-04-10T20:26:57+09:00","image":"http://kenji.blog/p/google%E3%82%A2%E3%83%8A%E3%83%AA%E3%83%86%E3%82%A3%E3%82%AF%E3%82%B9%E3%81%8B%E3%82%89%E4%BA%BA%E6%B0%97%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%A9%E3%83%B3%E3%82%AD%E3%83%B3%E3%82%B0%E3%82%92%E5%8F%96%E5%BE%97%E3%81%97%E3%81%A6%E9%85%8D%E7%BD%AE%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hue19aa55fc0e6d690cd31b7a50b796054_6753_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/google%E3%82%A2%E3%83%8A%E3%83%AA%E3%83%86%E3%82%A3%E3%82%AF%E3%82%B9%E3%81%8B%E3%82%89%E4%BA%BA%E6%B0%97%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%A9%E3%83%B3%E3%82%AD%E3%83%B3%E3%82%B0%E3%82%92%E5%8F%96%E5%BE%97%E3%81%97%E3%81%A6%E9%85%8D%E7%BD%AE%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"Cómo obtener y colocar una clasificación de páginas populares desde Google Analytics"},{"content":"Python Google Colaboratory Google Colaboratory es un entorno de ejecución de Python en línea.\nPermite el uso de GPU. Los cuadernos de Colab permiten combinar código ejecutable y texto enriquecido (incluyendo imágenes, HTML, LaTeX, etc.) en un solo documento. Está basado en Jupyter Notebook.\nRust Rust Playground JavaScript Javascript Playground Java paiza.IO Online Java compiler Haskell Haskell Playground Swift Online Swift Playground C++ C++ 14 Otros AWS Cloud9 Entorno de desarrollo integrado en línea proporcionado por Amazon AWS. Viene preempaquetado con herramientas para más de 40 lenguajes de programación, como Node.js, JavaScript, Python, PHP, Ruby, Go y C++.\nVisual Studio Code for the Web Entorno de desarrollo en línea proporcionado por Microsoft. Sin embargo, no se puede ejecutar ni depurar código en lenguajes que requieren compilación.\npaiza.IO Entorno de ejecución en línea compatible con 24 lenguajes principales, como C, C++, Java, Ruby, Python, PHP y Perl.\nCodePen Entorno de ejecución en línea para HTML, CSS y JavaScript.\ncodeanywhere IDE en línea. Permite compartir código y chatear.\n","date":"2023-04-09T14:01:00+09:00","image":"http://kenji.blog/p/%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E5%AE%9F%E8%A1%8C%E7%92%B0%E5%A2%83%E3%81%BE%E3%81%A8%E3%82%81/img_hu1a682c657d060df2f584d6c279d355c7_129199_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E5%AE%9F%E8%A1%8C%E7%92%B0%E5%A2%83%E3%81%BE%E3%81%A8%E3%82%81/","title":"'【Por idioma】Resumen de entornos de ejecución de código en línea'"},{"content":"¿Qué es la criba de Eratóstenes? La criba de Eratóstenes es un algoritmo para enumerar los números primos menores o iguales a un cierto número. El algoritmo es simple y se puede implementar con los siguientes pasos:\nCrear un arreglo de valores booleanos de tamaño N e inicializar todos los elementos a true. Establecer el 0º y 1º elemento del arreglo a false (porque 0 y 1 no son primos). Si el 2º elemento del arreglo es true, mostrar 2 como número primo. Establecer a false todos los elementos del arreglo que sean múltiplos de 2 mayores o iguales a $2^2$*. Si el 3º elemento del arreglo es true, mostrar 3 como número primo. Establecer a false todos los elementos del arreglo que sean múltiplos de 3 mayores o iguales a $3^2$. Repetir el mismo proceso para el 4º, 5º, \u0026hellip;, N-ésimo elemento. *Se dirigen los elementos a partir del cuadrado para convertirlos a false porque los números más pequeños que el cuadrado ya han sido procesados (su enumeración se ha completado).\nImplementación en Rust 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 fn main() { let n = 1000; let mut is_prime = vec![true; n+1]; is_prime[0] = false; is_prime[1] = false; for i in 2..=n { if is_prime[i] { println!(\u0026#34;{}\u0026#34;, i); let mut j = i * i; while j \u0026lt;= n { is_prime[j] = false; j += i; } } } } Una versión un poco más rápida Realizaremos una implementación ligeramente más rápida considerando los siguientes puntos:\nInicializar el arreglo a false en lugar de true (esto es más rápido). Omitir el proceso de establecer en false los elementos múltiplos de 2, ya que no son primos. No es necesario iterar hasta n; si enumeramos los primos hasta la raíz cuadrada de n, podremos enumerar todos los primos menores o iguales a n. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 fn main() { let n = 1000; let mut is_prime = vec![false; n+1]; is_prime[2] = true; for i in (3..=n).step_by(2) { is_prime[i] = true; } for i in 3..=((n as f64).sqrt() as usize) { if is_prime[i] { let mut j = i * i; while j \u0026lt;= n { is_prime[j] = false; j += i * 2; } } } for i in (2..=n).filter(|\u0026amp;x| is_prime[x]) { println!(\u0026#34;{}\u0026#34;, i); } } Referencia Criba de Eratóstenes ","date":"2023-04-09T12:54:24+09:00","image":"http://kenji.blog/p/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A61000%E4%BB%A5%E4%B8%8B%E3%81%AE%E7%B4%A0%E6%95%B0%E3%82%92%E5%88%97%E6%8C%99%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hud779f88eb17786b23927bc052940ab95_400805_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A61000%E4%BB%A5%E4%B8%8B%E3%81%AE%E7%B4%A0%E6%95%B0%E3%82%92%E5%88%97%E6%8C%99%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"Cómo enumerar los números primos hasta 1000 usando la criba de Eratóstenes"},{"content":"Instalación por terminal Abre la terminal Ejecuta sudo gem install cocoapods → Por alguna razón, apareció el siguiente mensaje de error y la instalación falló. Salida 1 2 3 ERROR: Error installing cocoapods: The last version of activesupport (\u0026gt;= 5.0, \u0026lt; 8) to support your Ruby \u0026amp; RubyGems was 6.1.7.3. Try installing it with `gem install activesupport -v 6.1.7.3` and then running the current command again activesupport requires Ruby version \u0026gt;= 2.7.0. The current ruby version is 2.6.10.210. Entonces busqué el mensaje de error en la web (ver \u0026ldquo;Referencias\u0026rdquo; abajo) y ejecuté el siguiente comando: 1 /bin/bash -c \u0026#34;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\u0026#34; Salida 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 ==\u0026gt; Checking for `sudo` access (which may request your password)... ==\u0026gt; This script will install: /usr/local/bin/brew /usr/local/share/doc/homebrew /usr/local/share/man/man1/brew.1 /usr/local/share/zsh/site-functions/_brew /usr/local/etc/bash_completion.d/brew /usr/local/Homebrew ==\u0026gt; The following new directories will be created: /usr/local/bin /usr/local/etc /usr/local/include /usr/local/lib /usr/local/sbin /usr/local/share /usr/local/var /usr/local/opt /usr/local/share/zsh /usr/local/share/zsh/site-functions /usr/local/var/homebrew /usr/local/var/homebrew/linked /usr/local/Cellar /usr/local/Caskroom /usr/local/Frameworks ==\u0026gt; The Xcode Command Line Tools will be installed. Press RETURN/ENTER to continue or any other key to abort: ==\u0026gt; /usr/bin/sudo /bin/mkdir -p /usr/local/bin /usr/local/etc /usr/local/include /usr/local/lib /usr/local/sbin /usr/local/share /usr/local/var /usr/local/opt /usr/local/share/zsh /usr/local/share/zsh/site-functions /usr/local/var/homebrew /usr/local/var/homebrew/linked /usr/local/Cellar /usr/local/Caskroom /usr/local/Frameworks ==\u0026gt; /usr/bin/sudo /bin/chmod ug=rwx /usr/local/bin /usr/local/etc /usr/local/include /usr/local/lib /usr/local/sbin /usr/local/share /usr/local/var /usr/local/opt /usr/local/share/zsh /usr/local/share/zsh/site-functions /usr/local/var/homebrew /usr/local/var/homebrew/linked /usr/local/Cellar /usr/local/Caskroom /usr/local/Frameworks ==\u0026gt; /usr/bin/sudo /bin/chmod go-w /usr/local/share/zsh /usr/local/share/zsh/site-functions ==\u0026gt; /usr/bin/sudo /usr/sbin/chown kenji /usr/local/bin /usr/local/etc /usr/local/include /usr/local/lib /usr/local/sbin /usr/local/share /usr/local/var /usr/local/opt /usr/local/share/zsh /usr/local/share/zsh/site-functions /usr/local/var/homebrew /usr/local/var/homebrew/linked /usr/local/Cellar /usr/local/Caskroom /usr/local/Frameworks ==\u0026gt; /usr/bin/sudo /usr/bin/chgrp admin /usr/local/bin /usr/local/etc /usr/local/include /usr/local/lib /usr/local/sbin /usr/local/share /usr/local/var /usr/local/opt /usr/local/share/zsh /usr/local/share/zsh/site-functions /usr/local/var/homebrew /usr/local/var/homebrew/linked /usr/local/Cellar /usr/local/Caskroom /usr/local/Frameworks ==\u0026gt; /usr/bin/sudo /bin/mkdir -p /usr/local/Homebrew ==\u0026gt; /usr/bin/sudo /usr/sbin/chown -R kenji:admin /usr/local/Homebrew ==\u0026gt; /usr/bin/sudo /bin/mkdir -p /Users/kenji/Library/Caches/Homebrew ==\u0026gt; /usr/bin/sudo /bin/chmod g+rwx /Users/kenji/Library/Caches/Homebrew ==\u0026gt; /usr/bin/sudo /usr/sbin/chown -R kenji /Users/kenji/Library/Caches/Homebrew ==\u0026gt; Searching online for the Command Line Tools ==\u0026gt; /usr/bin/sudo /usr/bin/touch /tmp/.com.apple.dt.CommandLineTools.installondemand.in-progress ==\u0026gt; Installing Command Line Tools for Xcode-14.3 ==\u0026gt; /usr/bin/sudo /usr/sbin/softwareupdate -i Command\\ Line\\ Tools\\ for\\ Xcode-14.3 Software Update Tool Finding available software Downloading Command Line Tools for Xcode Downloaded Command Line Tools for Xcode Installing Command Line Tools for Xcode Done with Command Line Tools for Xcode Done. ==\u0026gt; /usr/bin/sudo /usr/bin/xcode-select --switch /Library/Developer/CommandLineTools ==\u0026gt; /usr/bin/sudo /bin/rm -f /tmp/.com.apple.dt.CommandLineTools.installondemand.in-progress ==\u0026gt; Downloading and installing Homebrew... remote: Enumerating objects: 236191, done. remote: Counting objects: 100% (504/504), done. remote: Compressing objects: 100% (327/327), done. remote: Total 236191 (delta 176), reused 468 (delta 158), pack-reused 235687 Receiving objects: 100% (236191/236191), 68.37 MiB | 15.51 MiB/s, done. Resolving deltas: 100% (173058/173058), done. From https://github.com/Homebrew/brew * [new branch] master -\u0026gt; origin/master * [new branch] test-runners -\u0026gt; origin/test-runners * [new tag] 0.1 -\u0026gt; 0.1 * [new tag] 0.2 -\u0026gt; 0.2 * [new tag] 0.3 -\u0026gt; 0.3 * [new tag] 0.4 -\u0026gt; 0.4 * [new tag] 0.5 -\u0026gt; 0.5 * [new tag] 0.6 -\u0026gt; 0.6 * [new tag] 0.7 -\u0026gt; 0.7 * [new tag] 0.7.1 -\u0026gt; 0.7.1 * [new tag] 0.8 -\u0026gt; 0.8 * [new tag] 0.8.1 -\u0026gt; 0.8.1 * [new tag] 0.9 -\u0026gt; 0.9 * [new tag] 0.9.1 -\u0026gt; 0.9.1 * [new tag] 0.9.2 -\u0026gt; 0.9.2 * [new tag] 0.9.3 -\u0026gt; 0.9.3 * [new tag] 0.9.4 -\u0026gt; 0.9.4 * [new tag] 0.9.5 -\u0026gt; 0.9.5 * [new tag] 0.9.8 -\u0026gt; 0.9.8 * [new tag] 0.9.9 -\u0026gt; 0.9.9 * [new tag] 1.0.0 -\u0026gt; 1.0.0 * [new tag] 1.0.1 -\u0026gt; 1.0.1 * [new tag] 1.0.2 -\u0026gt; 1.0.2 * [new tag] 1.0.3 -\u0026gt; 1.0.3 * [new tag] 1.0.4 -\u0026gt; 1.0.4 * [new tag] 1.0.5 -\u0026gt; 1.0.5 * [new tag] 1.0.6 -\u0026gt; 1.0.6 * [new tag] 1.0.7 -\u0026gt; 1.0.7 * [new tag] 1.0.8 -\u0026gt; 1.0.8 * [new tag] 1.0.9 -\u0026gt; 1.0.9 * [new tag] 1.1.0 -\u0026gt; 1.1.0 * [new tag] 1.1.1 -\u0026gt; 1.1.1 * [new tag] 1.1.10 -\u0026gt; 1.1.10 * [new tag] 1.1.11 -\u0026gt; 1.1.11 * [new tag] 1.1.12 -\u0026gt; 1.1.12 * [new tag] 1.1.13 -\u0026gt; 1.1.13 * [new tag] 1.1.2 -\u0026gt; 1.1.2 * [new tag] 1.1.3 -\u0026gt; 1.1.3 * [new tag] 1.1.4 -\u0026gt; 1.1.4 * [new tag] 1.1.5 -\u0026gt; 1.1.5 * [new tag] 1.1.6 -\u0026gt; 1.1.6 * [new tag] 1.1.7 -\u0026gt; 1.1.7 * [new tag] 1.1.8 -\u0026gt; 1.1.8 * [new tag] 1.1.9 -\u0026gt; 1.1.9 * [new tag] 1.2.0 -\u0026gt; 1.2.0 * [new tag] 1.2.1 -\u0026gt; 1.2.1 * [new tag] 1.2.2 -\u0026gt; 1.2.2 * [new tag] 1.2.3 -\u0026gt; 1.2.3 * [new tag] 1.2.4 -\u0026gt; 1.2.4 * [new tag] 1.2.5 -\u0026gt; 1.2.5 * [new tag] 1.2.6 -\u0026gt; 1.2.6 * [new tag] 1.3.0 -\u0026gt; 1.3.0 * [new tag] 1.3.1 -\u0026gt; 1.3.1 * [new tag] 1.3.2 -\u0026gt; 1.3.2 * [new tag] 1.3.3 -\u0026gt; 1.3.3 * [new tag] 1.3.4 -\u0026gt; 1.3.4 * [new tag] 1.3.5 -\u0026gt; 1.3.5 * [new tag] 1.3.6 -\u0026gt; 1.3.6 * [new tag] 1.3.7 -\u0026gt; 1.3.7 * [new tag] 1.3.8 -\u0026gt; 1.3.8 * [new tag] 1.3.9 -\u0026gt; 1.3.9 * [new tag] 1.4.0 -\u0026gt; 1.4.0 * [new tag] 1.4.1 -\u0026gt; 1.4.1 * [new tag] 1.4.2 -\u0026gt; 1.4.2 * [new tag] 1.4.3 -\u0026gt; 1.4.3 * [new tag] 1.5.0 -\u0026gt; 1.5.0 * [new tag] 1.5.1 -\u0026gt; 1.5.1 * [new tag] 1.5.10 -\u0026gt; 1.5.10 * [new tag] 1.5.11 -\u0026gt; 1.5.11 * [new tag] 1.5.12 -\u0026gt; 1.5.12 * [new tag] 1.5.13 -\u0026gt; 1.5.13 * [new tag] 1.5.14 -\u0026gt; 1.5.14 * [new tag] 1.5.2 -\u0026gt; 1.5.2 * [new tag] 1.5.3 -\u0026gt; 1.5.3 * [new tag] 1.5.4 -\u0026gt; 1.5.4 * [new tag] 1.5.5 -\u0026gt; 1.5.5 * [new tag] 1.5.6 -\u0026gt; 1.5.6 * [new tag] 1.5.7 -\u0026gt; 1.5.7 * [new tag] 1.5.8 -\u0026gt; 1.5.8 * [new tag] 1.5.9 -\u0026gt; 1.5.9 * [new tag] 1.6.0 -\u0026gt; 1.6.0 * [new tag] 1.6.1 -\u0026gt; 1.6.1 * [new tag] 1.6.10 -\u0026gt; 1.6.10 * [new tag] 1.6.11 -\u0026gt; 1.6.11 * [new tag] 1.6.12 -\u0026gt; 1.6.12 * [new tag] 1.6.13 -\u0026gt; 1.6.13 * [new tag] 1.6.14 -\u0026gt; 1.6.14 * [new tag] 1.6.15 -\u0026gt; 1.6.15 * [new tag] 1.6.16 -\u0026gt; 1.6.16 * [new tag] 1.6.17 -\u0026gt; 1.6.17 * [new tag] 1.6.2 -\u0026gt; 1.6.2 * [new tag] 1.6.3 -\u0026gt; 1.6.3 * [new tag] 1.6.4 -\u0026gt; 1.6.4 * [new tag] 1.6.5 -\u0026gt; 1.6.5 * [new tag] 1.6.6 -\u0026gt; 1.6.6 * [new tag] 1.6.7 -\u0026gt; 1.6.7 * [new tag] 1.6.8 -\u0026gt; 1.6.8 * [new tag] 1.6.9 -\u0026gt; 1.6.9 * [new tag] 1.7.0 -\u0026gt; 1.7.0 * [new tag] 1.7.1 -\u0026gt; 1.7.1 * [new tag] 1.7.2 -\u0026gt; 1.7.2 * [new tag] 1.7.3 -\u0026gt; 1.7.3 * [new tag] 1.7.4 -\u0026gt; 1.7.4 * [new tag] 1.7.5 -\u0026gt; 1.7.5 * [new tag] 1.7.6 -\u0026gt; 1.7.6 * [new tag] 1.7.7 -\u0026gt; 1.7.7 * [new tag] 1.8.0 -\u0026gt; 1.8.0 * [new tag] 1.8.1 -\u0026gt; 1.8.1 * [new tag] 1.8.2 -\u0026gt; 1.8.2 * [new tag] 1.8.3 -\u0026gt; 1.8.3 * [new tag] 1.8.4 -\u0026gt; 1.8.4 * [new tag] 1.8.5 -\u0026gt; 1.8.5 * [new tag] 1.8.6 -\u0026gt; 1.8.6 * [new tag] 1.9.0 -\u0026gt; 1.9.0 * [new tag] 1.9.1 -\u0026gt; 1.9.1 * [new tag] 1.9.2 -\u0026gt; 1.9.2 * [new tag] 1.9.3 -\u0026gt; 1.9.3 * [new tag] 2.0.0 -\u0026gt; 2.0.0 * [new tag] 2.0.1 -\u0026gt; 2.0.1 * [new tag] 2.0.2 -\u0026gt; 2.0.2 * [new tag] 2.0.3 -\u0026gt; 2.0.3 * [new tag] 2.0.4 -\u0026gt; 2.0.4 * [new tag] 2.0.5 -\u0026gt; 2.0.5 * [new tag] 2.0.6 -\u0026gt; 2.0.6 * [new tag] 2.1.0 -\u0026gt; 2.1.0 * [new tag] 2.1.1 -\u0026gt; 2.1.1 * [new tag] 2.1.10 -\u0026gt; 2.1.10 * [new tag] 2.1.11 -\u0026gt; 2.1.11 * [new tag] 2.1.12 -\u0026gt; 2.1.12 * [new tag] 2.1.13 -\u0026gt; 2.1.13 * [new tag] 2.1.14 -\u0026gt; 2.1.14 * [new tag] 2.1.15 -\u0026gt; 2.1.15 * [new tag] 2.1.16 -\u0026gt; 2.1.16 * [new tag] 2.1.2 -\u0026gt; 2.1.2 * [new tag] 2.1.3 -\u0026gt; 2.1.3 * [new tag] 2.1.4 -\u0026gt; 2.1.4 * [new tag] 2.1.5 -\u0026gt; 2.1.5 * [new tag] 2.1.6 -\u0026gt; 2.1.6 * [new tag] 2.1.7 -\u0026gt; 2.1.7 * [new tag] 2.1.8 -\u0026gt; 2.1.8 * [new tag] 2.1.9 -\u0026gt; 2.1.9 * [new tag] 2.2.0 -\u0026gt; 2.2.0 * [new tag] 2.2.1 -\u0026gt; 2.2.1 * [new tag] 2.2.10 -\u0026gt; 2.2.10 * [new tag] 2.2.11 -\u0026gt; 2.2.11 * [new tag] 2.2.12 -\u0026gt; 2.2.12 * [new tag] 2.2.13 -\u0026gt; 2.2.13 * [new tag] 2.2.14 -\u0026gt; 2.2.14 * [new tag] 2.2.15 -\u0026gt; 2.2.15 * [new tag] 2.2.16 -\u0026gt; 2.2.16 * [new tag] 2.2.17 -\u0026gt; 2.2.17 * [new tag] 2.2.2 -\u0026gt; 2.2.2 * [new tag] 2.2.3 -\u0026gt; 2.2.3 * [new tag] 2.2.4 -\u0026gt; 2.2.4 * [new tag] 2.2.5 -\u0026gt; 2.2.5 * [new tag] 2.2.6 -\u0026gt; 2.2.6 * [new tag] 2.2.7 -\u0026gt; 2.2.7 * [new tag] 2.2.8 -\u0026gt; 2.2.8 * [new tag] 2.2.9 -\u0026gt; 2.2.9 * [new tag] 2.3.0 -\u0026gt; 2.3.0 * [new tag] 2.4.0 -\u0026gt; 2.4.0 * [new tag] 2.4.1 -\u0026gt; 2.4.1 * [new tag] 2.4.10 -\u0026gt; 2.4.10 * [new tag] 2.4.11 -\u0026gt; 2.4.11 * [new tag] 2.4.12 -\u0026gt; 2.4.12 * [new tag] 2.4.13 -\u0026gt; 2.4.13 * [new tag] 2.4.14 -\u0026gt; 2.4.14 * [new tag] 2.4.15 -\u0026gt; 2.4.15 * [new tag] 2.4.16 -\u0026gt; 2.4.16 * [new tag] 2.4.2 -\u0026gt; 2.4.2 * [new tag] 2.4.3 -\u0026gt; 2.4.3 * [new tag] 2.4.4 -\u0026gt; 2.4.4 * [new tag] 2.4.5 -\u0026gt; 2.4.5 * [new tag] 2.4.6 -\u0026gt; 2.4.6 * [new tag] 2.4.7 -\u0026gt; 2.4.7 * [new tag] 2.4.8 -\u0026gt; 2.4.8 * [new tag] 2.4.9 -\u0026gt; 2.4.9 * [new tag] 2.5.0 -\u0026gt; 2.5.0 * [new tag] 2.5.1 -\u0026gt; 2.5.1 * [new tag] 2.5.10 -\u0026gt; 2.5.10 * [new tag] 2.5.11 -\u0026gt; 2.5.11 * [new tag] 2.5.12 -\u0026gt; 2.5.12 * [new tag] 2.5.2 -\u0026gt; 2.5.2 * [new tag] 2.5.3 -\u0026gt; 2.5.3 * [new tag] 2.5.4 -\u0026gt; 2.5.4 * [new tag] 2.5.5 -\u0026gt; 2.5.5 * [new tag] 2.5.6 -\u0026gt; 2.5.6 * [new tag] 2.5.7 -\u0026gt; 2.5.7 * [new tag] 2.5.8 -\u0026gt; 2.5.8 * [new tag] 2.5.9 -\u0026gt; 2.5.9 * [new tag] 2.6.0 -\u0026gt; 2.6.0 * [new tag] 2.6.1 -\u0026gt; 2.6.1 * [new tag] 2.6.2 -\u0026gt; 2.6.2 * [new tag] 2.7.0 -\u0026gt; 2.7.0 * [new tag] 2.7.1 -\u0026gt; 2.7.1 * [new tag] 2.7.2 -\u0026gt; 2.7.2 * [new tag] 2.7.3 -\u0026gt; 2.7.3 * [new tag] 2.7.4 -\u0026gt; 2.7.4 * [new tag] 2.7.5 -\u0026gt; 2.7.5 * [new tag] 2.7.6 -\u0026gt; 2.7.6 * [new tag] 2.7.7 -\u0026gt; 2.7.7 * [new tag] 3.0.0 -\u0026gt; 3.0.0 * [new tag] 3.0.1 -\u0026gt; 3.0.1 * [new tag] 3.0.10 -\u0026gt; 3.0.10 * [new tag] 3.0.11 -\u0026gt; 3.0.11 * [new tag] 3.0.2 -\u0026gt; 3.0.2 * [new tag] 3.0.3 -\u0026gt; 3.0.3 * [new tag] 3.0.4 -\u0026gt; 3.0.4 * [new tag] 3.0.5 -\u0026gt; 3.0.5 * [new tag] 3.0.6 -\u0026gt; 3.0.6 * [new tag] 3.0.7 -\u0026gt; 3.0.7 * [new tag] 3.0.8 -\u0026gt; 3.0.8 * [new tag] 3.0.9 -\u0026gt; 3.0.9 * [new tag] 3.1.0 -\u0026gt; 3.1.0 * [new tag] 3.1.1 -\u0026gt; 3.1.1 * [new tag] 3.1.10 -\u0026gt; 3.1.10 * [new tag] 3.1.11 -\u0026gt; 3.1.11 * [new tag] 3.1.12 -\u0026gt; 3.1.12 * [new tag] 3.1.2 -\u0026gt; 3.1.2 * [new tag] 3.1.3 -\u0026gt; 3.1.3 * [new tag] 3.1.4 -\u0026gt; 3.1.4 * [new tag] 3.1.5 -\u0026gt; 3.1.5 * [new tag] 3.1.6 -\u0026gt; 3.1.6 * [new tag] 3.1.7 -\u0026gt; 3.1.7 * [new tag] 3.1.8 -\u0026gt; 3.1.8 * [new tag] 3.1.9 -\u0026gt; 3.1.9 * [new tag] 3.2.0 -\u0026gt; 3.2.0 * [new tag] 3.2.1 -\u0026gt; 3.2.1 * [new tag] 3.2.10 -\u0026gt; 3.2.10 * [new tag] 3.2.11 -\u0026gt; 3.2.11 * [new tag] 3.2.12 -\u0026gt; 3.2.12 * [new tag] 3.2.13 -\u0026gt; 3.2.13 * [new tag] 3.2.14 -\u0026gt; 3.2.14 * [new tag] 3.2.15 -\u0026gt; 3.2.15 * [new tag] 3.2.16 -\u0026gt; 3.2.16 * [new tag] 3.2.17 -\u0026gt; 3.2.17 * [new tag] 3.2.2 -\u0026gt; 3.2.2 * [new tag] 3.2.3 -\u0026gt; 3.2.3 * [new tag] 3.2.4 -\u0026gt; 3.2.4 * [new tag] 3.2.5 -\u0026gt; 3.2.5 * [new tag] 3.2.6 -\u0026gt; 3.2.6 * [new tag] 3.2.7 -\u0026gt; 3.2.7 * [new tag] 3.2.8 -\u0026gt; 3.2.8 * [new tag] 3.2.9 -\u0026gt; 3.2.9 * [new tag] 3.3.0 -\u0026gt; 3.3.0 * [new tag] 3.3.1 -\u0026gt; 3.3.1 * [new tag] 3.3.10 -\u0026gt; 3.3.10 * [new tag] 3.3.11 -\u0026gt; 3.3.11 * [new tag] 3.3.12 -\u0026gt; 3.3.12 * [new tag] 3.3.13 -\u0026gt; 3.3.13 * [new tag] 3.3.14 -\u0026gt; 3.3.14 * [new tag] 3.3.15 -\u0026gt; 3.3.15 * [new tag] 3.3.16 -\u0026gt; 3.3.16 * [new tag] 3.3.2 -\u0026gt; 3.3.2 * [new tag] 3.3.3 -\u0026gt; 3.3.3 * [new tag] 3.3.4 -\u0026gt; 3.3.4 * [new tag] 3.3.5 -\u0026gt; 3.3.5 * [new tag] 3.3.6 -\u0026gt; 3.3.6 * [new tag] 3.3.7 -\u0026gt; 3.3.7 * [new tag] 3.3.8 -\u0026gt; 3.3.8 * [new tag] 3.3.9 -\u0026gt; 3.3.9 * [new tag] 3.4.0 -\u0026gt; 3.4.0 * [new tag] 3.4.1 -\u0026gt; 3.4.1 * [new tag] 3.4.10 -\u0026gt; 3.4.10 * [new tag] 3.4.11 -\u0026gt; 3.4.11 * [new tag] 3.4.2 -\u0026gt; 3.4.2 * [new tag] 3.4.3 -\u0026gt; 3.4.3 * [new tag] 3.4.4 -\u0026gt; 3.4.4 * [new tag] 3.4.5 -\u0026gt; 3.4.5 * [new tag] 3.4.6 -\u0026gt; 3.4.6 * [new tag] 3.4.7 -\u0026gt; 3.4.7 * [new tag] 3.4.8 -\u0026gt; 3.4.8 * [new tag] 3.4.9 -\u0026gt; 3.4.9 * [new tag] 3.5.0 -\u0026gt; 3.5.0 * [new tag] 3.5.1 -\u0026gt; 3.5.1 * [new tag] 3.5.10 -\u0026gt; 3.5.10 * [new tag] 3.5.2 -\u0026gt; 3.5.2 * [new tag] 3.5.3 -\u0026gt; 3.5.3 * [new tag] 3.5.4 -\u0026gt; 3.5.4 * [new tag] 3.5.5 -\u0026gt; 3.5.5 * [new tag] 3.5.6 -\u0026gt; 3.5.6 * [new tag] 3.5.7 -\u0026gt; 3.5.7 * [new tag] 3.5.8 -\u0026gt; 3.5.8 * [new tag] 3.5.9 -\u0026gt; 3.5.9 * [new tag] 3.6.0 -\u0026gt; 3.6.0 * [new tag] 3.6.1 -\u0026gt; 3.6.1 * [new tag] 3.6.10 -\u0026gt; 3.6.10 * [new tag] 3.6.11 -\u0026gt; 3.6.11 * [new tag] 3.6.12 -\u0026gt; 3.6.12 * [new tag] 3.6.13 -\u0026gt; 3.6.13 * [new tag] 3.6.14 -\u0026gt; 3.6.14 * [new tag] 3.6.15 -\u0026gt; 3.6.15 * [new tag] 3.6.16 -\u0026gt; 3.6.16 * [new tag] 3.6.17 -\u0026gt; 3.6.17 * [new tag] 3.6.18 -\u0026gt; 3.6.18 * [new tag] 3.6.19 -\u0026gt; 3.6.19 * [new tag] 3.6.2 -\u0026gt; 3.6.2 * [new tag] 3.6.20 -\u0026gt; 3.6.20 * [new tag] 3.6.21 -\u0026gt; 3.6.21 * [new tag] 3.6.3 -\u0026gt; 3.6.3 * [new tag] 3.6.4 -\u0026gt; 3.6.4 * [new tag] 3.6.5 -\u0026gt; 3.6.5 * [new tag] 3.6.6 -\u0026gt; 3.6.6 * [new tag] 3.6.7 -\u0026gt; 3.6.7 * [new tag] 3.6.8 -\u0026gt; 3.6.8 * [new tag] 3.6.9 -\u0026gt; 3.6.9 * [new tag] 4.0.0 -\u0026gt; 4.0.0 * [new tag] 4.0.1 -\u0026gt; 4.0.1 * [new tag] 4.0.10 -\u0026gt; 4.0.10 * [new tag] 4.0.11 -\u0026gt; 4.0.11 * [new tag] 4.0.2 -\u0026gt; 4.0.2 * [new tag] 4.0.3 -\u0026gt; 4.0.3 * [new tag] 4.0.4 -\u0026gt; 4.0.4 * [new tag] 4.0.5 -\u0026gt; 4.0.5 * [new tag] 4.0.6 -\u0026gt; 4.0.6 * [new tag] 4.0.7 -\u0026gt; 4.0.7 * [new tag] 4.0.8 -\u0026gt; 4.0.8 * [new tag] 4.0.9 -\u0026gt; 4.0.9 HEAD is now at c51687009 Merge pull request #15168 from reitermarkus/api-ruby-source-path ==\u0026gt; Installation successful! ==\u0026gt; Homebrew has enabled anonymous aggregate formulae and cask analytics. Read the analytics documentation (and how to opt-out) here: https://docs.brew.sh/Analytics No analytics data has been sent yet (nor will any be during this install run). ==\u0026gt; Homebrew is run entirely by unpaid volunteers. Please consider donating: https://github.com/Homebrew/brew#donations ==\u0026gt; Next steps: - Run these two commands in your terminal to add Homebrew to your PATH: (echo; echo \u0026#39;eval \u0026#34;$(/usr/local/bin/brew shellenv)\u0026#34;\u0026#39;) \u0026gt;\u0026gt; /Users/kenji/.zprofile eval \u0026#34;$(/usr/local/bin/brew shellenv)\u0026#34; - Run brew help to get started - Further documentation: https://docs.brew.sh Ejecuta brew install cocoapods Salida 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 Warning: Treating cocoapods as a formula. For the cask, use homebrew/cask/cocoapods ==\u0026gt; Fetching dependencies for cocoapods: libyaml, ca-certificates, openssl@1.1, readline and ruby ==\u0026gt; Fetching libyaml ==\u0026gt; Downloading https://ghcr.io/v2/homebrew/core/libyaml/manifests/0.2.5 ######################################################################## 100.0% ==\u0026gt; Downloading https://ghcr.io/v2/homebrew/core/libyaml/blobs/sha256:b49e62f014 ==\u0026gt; Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sh ######################################################################## 100.0% ==\u0026gt; Fetching ca-certificates ==\u0026gt; Downloading https://ghcr.io/v2/homebrew/core/ca-certificates/manifests/2023- ######################################################################## 100.0% ==\u0026gt; Downloading https://ghcr.io/v2/homebrew/core/ca-certificates/blobs/sha256:11 ==\u0026gt; Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sh ######################################################################## 100.0% ==\u0026gt; Fetching openssl@1.1 ==\u0026gt; Downloading https://ghcr.io/v2/homebrew/core/openssl/1.1/manifests/1.1.1t ######################################################################## 100.0% ==\u0026gt; Downloading https://ghcr.io/v2/homebrew/core/openssl/1.1/blobs/sha256:97676d ==\u0026gt; Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sh ######################################################################## 100.0% ==\u0026gt; Fetching readline ==\u0026gt; Downloading https://ghcr.io/v2/homebrew/core/readline/manifests/8.2.1 ######################################################################## 100.0% ==\u0026gt; Downloading https://ghcr.io/v2/homebrew/core/readline/blobs/sha256:abe9d3f3e ==\u0026gt; Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sh ######################################################################## 100.0% ==\u0026gt; Fetching ruby ==\u0026gt; Downloading https://ghcr.io/v2/homebrew/core/ruby/manifests/3.2.2 ######################################################################## 100.0% ==\u0026gt; Downloading https://ghcr.io/v2/homebrew/core/ruby/blobs/sha256:a4ac080688e87 ==\u0026gt; Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sh ######################################################################## 100.0% ==\u0026gt; Fetching cocoapods ==\u0026gt; Downloading https://ghcr.io/v2/homebrew/core/cocoapods/manifests/1.12.0 ######################################################################## 100.0% ==\u0026gt; Downloading https://ghcr.io/v2/homebrew/core/cocoapods/blobs/sha256:11226288 ==\u0026gt; Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sh ######################################################################## 100.0% ==\u0026gt; Installing dependencies for cocoapods: libyaml, ca-certificates, openssl@1.1, readline and ruby ==\u0026gt; Installing cocoapods dependency: libyaml ==\u0026gt; Pouring libyaml--0.2.5.ventura.bottle.tar.gz 🍺 /usr/local/Cellar/libyaml/0.2.5: 10 files, 330KB ==\u0026gt; Installing cocoapods dependency: ca-certificates ==\u0026gt; Pouring ca-certificates--2023-01-10.all.bottle.tar.gz ==\u0026gt; Regenerating CA certificate bundle from keychain, this may take a while... 🍺 /usr/local/Cellar/ca-certificates/2023-01-10: 3 files, 216.9KB ==\u0026gt; Installing cocoapods dependency: openssl@1.1 ==\u0026gt; Pouring openssl@1.1--1.1.1t.ventura.bottle.tar.gz 🍺 /usr/local/Cellar/openssl@1.1/1.1.1t: 8,101 files, 18.5MB ==\u0026gt; Installing cocoapods dependency: readline ==\u0026gt; Pouring readline--8.2.1.ventura.bottle.tar.gz 🍺 /usr/local/Cellar/readline/8.2.1: 50 files, 1.7MB ==\u0026gt; Installing cocoapods dependency: ruby ==\u0026gt; Pouring ruby--3.2.2.ventura.bottle.tar.gz 🍺 /usr/local/Cellar/ruby/3.2.2: 16,605 files, 46.3MB ==\u0026gt; Installing cocoapods ==\u0026gt; Pouring cocoapods--1.12.0.ventura.bottle.tar.gz 🍺 /usr/local/Cellar/cocoapods/1.12.0: 13,436 files, 27.8MB ==\u0026gt; Running `brew cleanup cocoapods`... Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP. Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`). Ejecuta pod --version Salida 1 1.12.0 Parece que se instaló correctamente.\nReferencias Installing \u0026ldquo;CocoaPods\u0026rdquo; ","date":"2023-04-09T03:25:54+09:00","image":"http://kenji.blog/p/mac%E3%81%ABcocoapods%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_1_hu5a3007afd3f7cdc4b526573a36fbeca4_11833_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/mac%E3%81%ABcocoapods%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"Cómo instalar CocoaPods en mac"},{"content":"Cómo obtener el número de registros creados por día usando SOQL de Salesforce Abra la Consola del Desarrollador (Developer Console). Abra la pestaña Query Editor. Pegue y ejecute el siguiente SOQL: 1 select day_only(createdDate), count(createdDate) from account group by day_only(createdDate) order by count(createdDate) desc limit 10 Cambie account a cualquier nombre de objeto que desee recuperar y ejecútelo.\nReferencia Is there a way to group by the date portion of a datetime field in SOQL? ","date":"2023-04-09T02:50:30+09:00","image":"http://kenji.blog/p/salesforce%E3%81%AEsoql%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%A6%E6%97%A5%E5%88%A5%E3%81%AE%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E4%BD%9C%E6%88%90%E6%95%B0%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hub769e11b0a209a1986a31ec50fb9e2d1_10470_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/salesforce%E3%81%AEsoql%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%A6%E6%97%A5%E5%88%A5%E3%81%AE%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E4%BD%9C%E6%88%90%E6%95%B0%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"'Cómo obtener el número de registros creados por día usando SOQL de Salesforce'"},{"content":"\nRequisitos Cuenta de Google Procedimiento Accede a https://colab.research.google.com/ Selecciona \u0026ldquo;Archivo\u0026rdquo; → \u0026ldquo;Nuevo cuaderno\u0026rdquo; Pega y ejecuta el siguiente código: 1 2 3 4 5 6 7 import matplotlib.pyplot as plt import numpy as np x = np.linspace(0, 2*np.pi, 500) plt.plot(x, np.sin(x), label=\u0026#34;sin curve\u0026#34;) plt.plot(x, np.cos(x), label=\u0026#34;cos curve\u0026#34;) plt.legend() # Muestra la leyenda plt.show() Resultado de la ejecución Referencias matplotlib.pyplot — Matplotlib 3.5.3 documentation ","date":"2023-04-09T01:02:19+09:00","image":"http://kenji.blog/p/pythonmatplotlib.pyplot%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B0%E3%83%A9%E3%83%95%E3%82%92%E6%8F%8F%E7%94%BB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hucdb24ab588d845f9f7a56ef99be2c709_27745_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/pythonmatplotlib.pyplot%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B0%E3%83%A9%E3%83%95%E3%82%92%E6%8F%8F%E7%94%BB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"Cómo dibujar un gráfico usando Python (matplotlib.pyplot)"},{"content":"Lo que necesitas API de Twitter Twitter API SECRET Twitter ACCESS TOKEN Twitter ACCESS TOKEN SECRET Cuenta de Google Para obtener la API de Twitter, consulta los sitios de referencia.\nProcedimiento para tuitear usando la API Accede a https://colab.research.google.com/ Selecciona \u0026ldquo;Archivo\u0026rdquo; → \u0026ldquo;Nuevo cuaderno\u0026rdquo; Pega y ejecuta el siguiente código (usa los valores reales que obtuviste) 1 2 3 4 API_KEY = \u0026#39;9Smu2f2RoLqbVQHQq6n79Z2JW\u0026#39; API_SECRET = \u0026#39;uGVRIkLL2l8sRyPv2Lr4mXxXppnQF1isMoRnvktcXCtFgAK2R8\u0026#39; ACCESS_TOKEN = \u0026#39;0367292979164670705-7hSErDoQbO6fkFtnn5UY0vqpvecy0O\u0026#39; ACCESS_TOKEN_SECRET = \u0026#39;pUv81U9GVzZirz5g4AxZPHAJ4GpSXnBo8GUcZ1egtjw9q\u0026#39; Pega y ejecuta el siguiente código 1 import tweepy Pega y ejecuta el siguiente código (API v1.1) 1 2 3 4 auth = tweepy.OAuthHandler(API_KEY, API_SECRET) auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET) api = tweepy.API(auth) api.update_status(\u0026#34;hello\u0026#34;) → Se publicará el tuit hello\nPega y ejecuta el siguiente código (API v2.0) 1 2 client = tweepy.Client(consumer_key=API_KEY, consumer_secret=API_SECRET, access_token=ACCESS_TOKEN, access_token_secret=ACCESS_TOKEN_SECRET) client.create_tweet(text=\u0026#39;hello v2\u0026#39;) → Se publicará el tuit hello v2\nEso es todo.\nReferencias 【A partir de abril de 2021】Explicación exhaustiva del procedimiento de solicitud de la API de Twitter con ejemplos de uso y capturas de pantalla 【¡Sin configuraciones molestas!】Google Colaboratory es recomendado para probar la API de Twitter 【También compartimos el código fuente】 【Tweepy】Twitter API v2: Tuitear, responder (reply), tuits con encuesta, tuits con medios (v1.1) [Python] ","date":"2023-04-08T18:48:32+09:00","image":"http://kenji.blog/p/twitter-api%E3%81%A8google-colaboratory%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6tweet%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hu92a10d7ea1c17ea4dcc0d2e0b77b6296_75327_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/twitter-api%E3%81%A8google-colaboratory%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6tweet%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"Cómo tuitear usando la API de Twitter y Google Colaboratory"},{"content":"¿Qué es OpenSSL? Es una biblioteca de código abierto que proporciona el procesamiento necesario para realizar comunicaciones cifradas.\nPara utilizarlo desde un programa, dado que el código fuente en lenguaje C es público, es necesario compilarlo para crear la biblioteca.\nA continuación se presentan los pasos para su compilación.\nPreparación del entorno de compilación Perl\nDescargue strawberry-perl-5.32.1.1-64bit.msi desde https://strawberryperl.com/. Creo que está bien usar la última versión.\nNASM\nDescargue 2.16.01/nasm-2.16.01-win64.zip desde la sección de Download en https://www.nasm.us/. Creo que está bien usar la última versión (que no sea rc). Después de la instalación, es necesario registrar la carpeta donde se instaló NASM en la variable de entorno PATH.\nVisual Studio 2022 ** o ** Build Tools for Visual Studio 2022\nInstale Visual Studio 2022 Community o Build Tools for Visual Studio 2022 desde https://visualstudio.microsoft.com/ja/downloads/.\nPasos para compilar OpenSSL en Windows Descargue y extraiga openssl-3.1.0.tar.gz desde https://www.openssl.org/source/. Si no puede extraerlo, ejecute tar -xzf openssl-3.1.0.tar.gz en el símbolo del sistema. Inicie el símbolo del sistema con privilegios de administrador. Abra la carpeta extraída. Ejecute el siguiente comando. * Cambie la parte de Community según la versión de Visual Studio que haya instalado: 1 \u0026#34;C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Auxiliary\\Build\\vcvarsall.bat\u0026#34; x64 Ejecute el siguiente comando: 1 perl Configure VC-WIN64A Ejecute el siguiente comando (toma bastante tiempo): 1 nmake Ejecute el siguiente comando (toma bastante tiempo): 1 nmake test Ejecute el siguiente comando: 1 nmake install Si todo sale bien, OpenSSL se instalará en C:\\Program Files\\OpenSSL.\nEso es todo.\nReferencias https://ja.wikipedia.org/wiki/OpenSSL\n","date":"2023-04-07T21:06:32+09:00","image":"http://kenji.blog/p/windows-%E3%81%A7-openssl-%E3%82%92%E3%83%93%E3%83%AB%E3%83%89%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hu856dff3329e4daff79f775d47e5cc35b_35659_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/windows-%E3%81%A7-openssl-%E3%82%92%E3%83%93%E3%83%AB%E3%83%89%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"Cómo compilar OpenSSL en Windows"},{"content":"¿Qué es i18n? i18n es una abreviatura de Internationalization, que significa internacionalización. Debido a que Internationalization es larga, se abrevia como i18n indicando que hay 18 letras entre la primera i y la última n.\nA menudo se utiliza en el contexto de la internacionalización de software.\nLos principales elementos sujetos a la internacionalización son los siguientes: 1\nConjunto de caracteres (como códigos de caracteres estándar) Dirección del texto (de izquierda a derecha, de derecha a izquierda, de arriba a abajo hacia la izquierda, etc.) Texto Fuentes Formato Números (carácter de punto decimal, separador de miles, cantidad de dígitos a separar, etc.) Fecha y hora (formato de año, mes y día, diferencias en el calendario utilizado como calendario islámico / calendario gregoriano / calendario hebreo / calendario japonés, etc.) Diferencia horaria en la información de fecha y hora Información de moneda Internacionalización y localización - Wikipedia\u0026#160;\u0026#x21a9;\u0026#xfe0e;\n","date":"2023-04-07T00:42:02+09:00","image":"http://kenji.blog/p/i18n%E3%81%A8%E3%81%AF/img_hu5547e5059a9dab53fb09979c54309752_11855_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/i18n%E3%81%A8%E3%81%AF/","title":"¿Qué es i18n?"},{"content":"Cómo crear presentaciones con HTML reveal.js es una herramienta para crear presentaciones utilizando HTML y Markdown, que incluye las siguientes características:\nVariadas funciones de presentación, como fórmulas matemáticas, animaciones y operaciones de deslizamiento (swipe). Permite personalizar temas y diseños. Funciones de navegación compatibles con múltiples dispositivos, como ratones, teclados y paneles táctiles (touchpads). Ofrece funciones avanzadas, como reproducción automática de diapositivas e incrustación de vídeos. Permite exportar en formato PDF. Gracias a estas funciones, los usuarios pueden crear fácilmente presentaciones interactivas y atractivas.\nInstalación y uso de reveal.js La forma más sencilla de utilizarlo es descargar el archivo ZIP completo desde la siguiente página y descomprimirlo.\nAbre https://revealjs.com/installation y descarga el master.zip desde el enlace. Abre el archivo index.html de la carpeta descomprimida en un navegador. Edita el archivo index.html para crear tu propia presentación. Como referencia, en demo.html encontrarás código HTML de demostración. Casos de uso Las presentaciones creadas pueden publicarse directamente como páginas web o exportarse como PDF. Además, dado que el código fuente de la presentación es texto, resulta fácil gestionarlo mediante sistemas de control de versiones.\nAl parecer, también es posible crear presentaciones en formato Markdown.\nReferencias A partir de ahora, usa reveal.js para tus presentaciones Lista de ejemplos de sintaxis Markdown ","date":"2023-04-06T23:23:46+09:00","image":"http://kenji.blog/p/html%E3%81%A7%E3%83%97%E3%83%AC%E3%82%BC%E3%83%B3%E8%B3%87%E6%96%99%E3%82%92%E4%BD%9C%E3%82%8B%E6%96%B9%E6%B3%95reveal.js/img_hu4de64f3f6be8c50037c2a4c6c2d48287_30871_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/html%E3%81%A7%E3%83%97%E3%83%AC%E3%82%BC%E3%83%B3%E8%B3%87%E6%96%99%E3%82%92%E4%BD%9C%E3%82%8B%E6%96%B9%E6%B3%95reveal.js/","title":"Cómo crear presentaciones con HTML (reveal.js)"},{"content":"¿Qué es Stable Diffusion? Stable Diffusion es una IA que genera imágenes a partir de información de texto (texto a imagen), desarrollada por un equipo de investigación de la Universidad de Múnich, Alemania. Al entrenar con diversas imágenes, puede generar una amplia variedad de imágenes, desde fotografías realistas hasta ilustraciones.\nEn esta ocasión, presentaré cómo generar imágenes de ilustraciones utilizando datos preentrenados de Stable Diffusion.\nLo que necesitas Una cuenta de Google Solo eso.\nProcedimiento de generación Abre https://colab.research.google.com En la esquina superior izquierda, selecciona Archivo y luego Nuevo cuaderno Selecciona Editar y luego Configuración del cuaderno Cambia el Acelerador de hardware a GPU Pega y ejecuta el siguiente código 1 !pip install diffusers==0.8.0 transformers Pega y ejecuta el siguiente código 1 from diffusers import StableDiffusionPipeline Pega y ejecuta el siguiente código 1 2 pipe = StableDiffusionPipeline.from_pretrained(\u0026#34;gsdf/Counterfeit-V2.5\u0026#34;) pipe.to(\u0026#34;cuda\u0026#34;) Pega y ejecuta el siguiente código 1 2 3 4 5 prompt = \u0026#34;((masterpiece,best quality)),1girl, solo, animal ears, rabbit, barefoot, knees up, dress, sitting, rabbit ears, short sleeves, looking at viewer, grass, short hair, smile, white hair, puffy sleeves, outdoors, puffy short sleeves, bangs, on ground, full body, animal, white dress, sunlight, brown eyes, dappled sunlight, day, depth of field\u0026#34; n_prompt = \u0026#34;EasyNegative, extra fingers,fewer fingers\u0026#34; image = pipe(prompt, negative_prompt = n_prompt).images[0] image El Prompt utilizado aquí está basado en el Prompt de https://huggingface.co/gsdf/Counterfeit-V2.5.\nResultados generados (algunos) Referencias https://huggingface.co/gsdf/Counterfeit-V2.5 Hice un programa de generación de imágenes con Inteligencia Artificial (IA) en 15 minutos 【Programación en vivo】 ","date":"2023-04-06T00:43:19+09:00","image":"http://kenji.blog/p/aistablediffusion%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88%E7%94%BB%E5%83%8F%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hu25483e02f36587a64f3cf042db15c245_550570_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/aistablediffusion%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88%E7%94%BB%E5%83%8F%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"Cómo generar imágenes de ilustraciones usando IA (Stable Diffusion)"},{"content":"Qué es un archivo ejecutable (exe) Un archivo ejecutable en Windows. Básicamente, está escrito en un formato llamado formato PE. Contiene código en lenguaje de máquina para su ejecución, así como recursos como iconos e imágenes.\nDado que existen varias herramientas para analizar archivos ejecutables, las presentaremos en esta ocasión.\n7-Zip Los archivos EXE, como tienden a ser grandes si se dejan como están, a veces se crean mediante compresión de archivos. En este caso, utilizando el software de compresión y descompresión de archivos 7-Zip, puede descomprimir el archivo ejecutable e investigar su contenido. También existe una herramienta llamada WinRAR que puede descomprimir de la misma manera.\nResource Hacker Puede extraer los recursos (iconos, mapas de bits, cuadros de diálogo, cadenas de texto, etc.) dentro del archivo EXE. Además, como también funciona como un editor hexadecimal, puede editar y reescribir el contenido del archivo EXE.\nPE Explorer Puede analizar archivos PE para Windows (EXE, DLL, OCX, SYS, controladores). PE Explorer proporciona varias funciones de análisis, como mostrar la estructura del archivo, mostrar el encabezado del archivo, mostrar entradas de directorio, y mostrar funciones y símbolos exportados.\nDependency Walker Puede verificar de qué archivos DLL depende un archivo EXE y si se han cargado correctamente. También puede rastrear llamadas a funciones en archivos DLL.\nGhidra Es una poderosa herramienta de ingeniería inversa desarrollada por la NSA (Agencia de Seguridad Nacional de EE. UU.) y publicada gratuitamente como código abierto. No solo desensambla (convierte a lenguaje ensamblador) archivos EXE, sino que también tiene una función de descompilación a un formato cercano al lenguaje C, lo que la hace muy popular.\nIDA Free / IDA Pro Es un desensamblador y descompilador avanzado que se ha convertido en un estándar mundial de la industria en análisis de malware e ingeniería inversa. La versión Pro es muy cara, pero si es para fines personales o no comerciales, puede usar la versión con funciones limitadas \u0026ldquo;IDA Free\u0026rdquo; de forma gratuita.\nx64dbg (x32dbg) Es un depurador de código abierto para Windows. Se especializa en \u0026ldquo;análisis dinámico\u0026rdquo;, que analiza el contenido y el estado de la memoria paso a paso mientras se ejecuta el archivo ejecutable, y se usa a menudo para descifrar crackmes (programas de desafío de análisis) e investigar el comportamiento del malware.\nILSpy / dotPeek Si el archivo EXE de destino fue creado en un lenguaje del sistema .NET como C#, puede usar estas herramientas para descompilarlo a un estado casi idéntico al código fuente original y exponer completamente su contenido.\nEstas herramientas son útiles para investigar el contenido de archivos EXE, pero requieren precaución. Editar archivos o usarlos con fines maliciosos puede causar problemas de seguridad o relacionados con la ley de derechos de autor, así que úselos solo después de comprender esto completamente.\n","date":"2023-04-05T23:31:06+09:00","image":"http://kenji.blog/p/%E5%AE%9F%E8%A1%8C%E3%83%95%E3%82%A1%E3%82%A4%E3%83%ABexe%E3%81%AE%E4%B8%AD%E8%BA%AB%E3%82%92%E8%A7%A3%E6%9E%90%E3%81%99%E3%82%8B%E3%83%84%E3%83%BC%E3%83%AB/img_1_hu9e069acaa7fdaa872d319a8c6d6e1444_1819799_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/herramientas-para-analizar-el-contenido-de-archivos-ejecutables-exe/","title":"Herramientas para analizar el contenido de archivos ejecutables (exe)"},{"content":"Introducción Aquí se explica cómo cambiar de aplicación en Mac al estilo de Windows (Alt+Tab).\nComo es difícil lograrlo cambiando la configuración estándar, este método consiste en instalar una aplicación.\nImagen de funcionamiento Método de configuración (macOS Ventura) Abrir https://alt-tab-macos.netlify.app Hacer clic en Download the latest release Abrir la aplicación descargada Seguir los pasos para instalarla Con esto, el cambio de aplicaciones se podrá hacer con Alt+Tab igual que en Windows.\nFin\n","date":"2023-04-05T02:20:12+09:00","image":"http://kenji.blog/p/mac%E3%81%A7windows%E3%83%A9%E3%82%A4%E3%82%AFalt-tab%E3%81%AB%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hu9e86c898d72728906fc707b47dff25e0_55585_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/mac%E3%81%A7windows%E3%83%A9%E3%82%A4%E3%82%AFalt-tab%E3%81%AB%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"Cómo cambiar de aplicación en mac al estilo Windows (Alt+Tab)"},{"content":"Introducción Cuando alternas entre Windows y Mac, las teclas de los atajos de teclado que usas con frecuencia, como copiar, pegar y deshacer, son diferentes, así que te mostraremos cómo igualarlas.\nMétodo de configuración (macOS Ventura) Abrir Configuración del Sistema Seleccionar Teclado Seleccionar Atajos de teclado Seleccionar Teclas modificadoras Asignar la tecla Control(^) a \u0026ldquo;⌘ Command\u0026rdquo; Asignar la tecla Command(⌘) a \u0026ldquo;^ Control\u0026rdquo; Hacer clic en Listo Eso es todo\n","date":"2023-04-05T00:49:02+09:00","image":"http://kenji.blog/p/mac%E3%81%A7%E3%82%B3%E3%83%94%E3%83%BC%E3%83%9A%E3%83%BC%E3%82%B9%E3%83%88%E3%81%AE%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%82%AD%E3%83%BC%E3%82%92windows%E3%81%A8%E5%90%88%E3%82%8F%E3%81%9B%E3%82%8B%E6%96%B9%E6%B3%95/img_hu81c2d0d61c05f6ce24b15f479442c3bc_211588_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/mac%E3%81%A7%E3%82%B3%E3%83%94%E3%83%BC%E3%83%9A%E3%83%BC%E3%82%B9%E3%83%88%E3%81%AE%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%82%AD%E3%83%BC%E3%82%92windows%E3%81%A8%E5%90%88%E3%82%8F%E3%81%9B%E3%82%8B%E6%96%B9%E6%B3%95/","title":"Cómo igualar los atajos de teclado de copiar y pegar en Mac con los de Windows"},{"content":"Introducción Yo uso un teclado de EE. UU., y en Windows cambio la entrada de japonés con Alt + `. Al querer usar la misma tecla en mac, investigué y descubrí que se puede cambiar en la configuración.\nCómo configurar (macOS Ventura) Abre Configuración del Sistema Selecciona Teclado Selecciona Funciones rápidas de teclado Selecciona Fuentes de entrada Haz doble clic en la notación de atajo a la derecha de \u0026ldquo;Seleccionar la siguiente fuente en el menú Entrada\u0026rdquo; Escribe Alt + ` Haz clic en Listo Con esto, podrás cambiar entre inglés y japonés usando Alt + `. Sin embargo, como por defecto se incluye katakana en el cambio, eliminé katakana de las fuentes de entrada siguiendo estos pasos.\nAbre Configuración del Sistema Selecciona Teclado Haz clic en Editar a la derecha de Japonés - Romaji en Fuentes de entrada Haz clic en Japonés - Romaji Desmarca Katakana en el modo de entrada Haz clic en Listo Fin\n","date":"2023-04-04T23:02:12+09:00","image":"http://kenji.blog/p/mac%E3%81%A7%E6%97%A5%E6%9C%AC%E8%AA%9E%E8%8B%B1%E8%AA%9E%E5%85%A5%E5%8A%9B%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%81%AE%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%82%AD%E3%83%BC%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hu79c9b62a36c4ad9394525ea6ed769587_198703_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/mac%E3%81%A7%E6%97%A5%E6%9C%AC%E8%AA%9E%E8%8B%B1%E8%AA%9E%E5%85%A5%E5%8A%9B%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%81%AE%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%82%AD%E3%83%BC%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"Cómo cambiar el atajo de teclado para cambiar entre entrada en japonés e inglés en mac"},{"content":"Cómo encontrar la ubicación de un archivo ejecutable en el path en Windows Al ejecutar un comando especificando un archivo ejecutable, a veces quieres saber dónde está ubicado ese archivo. En esos casos, puedes averiguar la ubicación del archivo ejecutable con el siguiente comando.\n1 where \u0026lt;nombre_del_archivo_ejecutable\u0026gt; Por ejemplo, si quieres saber la ubicación de Paint (mspaint.exe), debes hacerlo de la siguiente manera.\n1 where mspaint.exe Referencias How do I find the location of an executable in Windows? ","date":"2023-04-03T00:02:55+09:00","image":"http://kenji.blog/p/windows-%E3%81%A7%E3%83%91%E3%82%B9%E3%81%AE%E9%80%9A%E3%81%A3%E3%81%9F%E5%AE%9F%E8%A1%8C%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E5%A0%B4%E6%89%80%E3%82%92%E8%A6%8B%E3%81%A4%E3%81%91%E3%82%8B%E6%96%B9%E6%B3%95/img_hub74cf0d67f87eb185fadea6cd8747be8_5455_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/windows-%E3%81%A7%E3%83%91%E3%82%B9%E3%81%AE%E9%80%9A%E3%81%A3%E3%81%9F%E5%AE%9F%E8%A1%8C%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E5%A0%B4%E6%89%80%E3%82%92%E8%A6%8B%E3%81%A4%E3%81%91%E3%82%8B%E6%96%B9%E6%B3%95/","title":"Cómo encontrar la ubicación de un archivo ejecutable en el path en Windows"},{"content":"Compré un mac mini (2018) Compré un mac mini (2018) usado y de generación anterior en Mercari. Las especificaciones son las siguientes.\nCPU: Intel Core i7 de 6 núcleos a 3,2 GHz Memoria: 32GB Almacenamiento: 1TB SSD El precio es de ￥ 77,000\nRazón para la compra Desarrollo aplicaciones móviles en el trabajo utilizando un mac mini con especificaciones casi idénticas, y quería configurar un entorno de desarrollo (especialmente un entorno de ejecución para xcode) en casa también. Tengo un macbook pro, pero lo compré hace 9 años y funciona bastante lento, así que casi no lo uso. Personalmente, quería desarrollar aplicaciones de iOS. Instalé xcode e inteliJ IDEA de inmediato La versión de xcode es Versión 14.3 (14E222b) La versión de inteliJ IDEA es 2023.1 ¡Bien! ¡A desarrollar!\n","date":"2023-04-02T18:05:30+09:00","image":"http://kenji.blog/p/mac-mini2018%E3%82%92%E8%B3%BC%E5%85%A5/img_huc5df0470d74ce7a0046f11abaa7c5815_30469_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/mac-mini2018%E3%82%92%E8%B3%BC%E5%85%A5/","title":"'Compré un mac mini (2018)'"},{"content":"Sobre \u0026ldquo;Unsplash\u0026rdquo; https://unsplash.com/ja/\nEl sitio de fotos de archivo \u0026ldquo;Unsplash\u0026rdquo; se resume de la siguiente manera:\nTodas las imágenes se pueden usar de forma gratuita Uso comercial permitido Modificación de imágenes permitida No se requiere permiso de uso No se requiere atribución (crédito) Es muy fácil de usar al escribir artículos para un blog, así que asegúrate de probarlo.\n※ Para obtener información sobre la licencia, consulta la \u0026ldquo;nota al pie\u0026rdquo; a continuación.1\nTambién lo utilizaré en este sitio.\nLicencia de Unsplash\u0026#160;\u0026#x21a9;\u0026#xfe0e;\n","date":"2023-04-02T14:44:17+09:00","image":"http://kenji.blog/p/%E3%83%96%E3%83%AD%E3%82%B0%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E5%86%99%E7%9C%9F%E7%B4%A0%E6%9D%90%E3%82%B5%E3%82%A4%E3%83%88unsplash%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/img_1_hu43cbd10eab78d2e7468dbb36abe8d794_828454_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E3%83%96%E3%83%AD%E3%82%B0%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E5%86%99%E7%9C%9F%E7%B4%A0%E6%9D%90%E3%82%B5%E3%82%A4%E3%83%88unsplash%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/","title":"Sobre ''Unsplash'', un sitio de fotos de archivo que puedes usar en tu blog"},{"content":"Obtener el ejemplo de egui Puedes ejecutar el ejemplo de egui con los siguientes comandos.\n1 2 3 git clone https://github.com/emilk/eframe_template/ egui_test cd egui_test cargo run Cargar una fuente compatible con japonés Para mostrar japonés, es necesario cargar una fuente compatible con este idioma.\nEn src/app.rs, dentro del método pub fn new, añade las siguientes líneas:\n1 2 3 4 5 6 7 8 9 10 11 12 // Cargar fuente compatible con japonés let mut fonts = egui::FontDefinitions::default(); fonts.font_data.insert( \u0026#34;Meiryo\u0026#34;.to_owned(), egui::FontData::from_static(include_bytes!(\u0026#34;C:/Windows/Fonts/Meiryo.ttc\u0026#34;)), ); fonts .families .entry(egui::FontFamily::Proportional) .or_default() .insert(0, \u0026#34;Meiryo\u0026#34;.to_owned()); cc.egui_ctx.set_fonts(fonts); Ahora podrás mostrar texto en japonés. ","date":"2023-04-01T03:17:52+09:00","image":"http://kenji.blog/p/egui%E3%81%A7%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hu6798dc327f7454fc6cd8b8de1315ab03_5786_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/egui%E3%81%A7%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"Cómo mostrar japonés en egui"},{"content":"Qué es KaTeX KaTeX es una biblioteca de JavaScript para mostrar fórmulas matemáticas estilo LaTeX en HTML.\nEspecíficamente, puedes mostrar fórmulas como la siguiente.\n$$f(x) = x^2 + x + 41$$ Aunque parece haber otras bibliotecas para mostrar fórmulas matemáticas estilo LaTeX, KaTeX tiene la reputación de ser simple y rápida.\nCómo introducirlo en hugo Crea un nuevo archivo layouts/partials/math.html en la jerarquía de carpetas de hugo. El contenido debe ser el siguiente.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 \u0026lt;link rel=\u0026#34;stylesheet\u0026#34; href=\u0026#34;https://cdn.jsdelivr.net/npm/katex@0.16.4/dist/katex.min.css\u0026#34; integrity=\u0026#34;sha384-vKruj+a13U8yHIkAyGgK1J3ArTLzrFGBbBc0tDp4ad/EyewESeXE/Iv67Aj8gKZ0\u0026#34; crossorigin=\u0026#34;anonymous\u0026#34;\u0026gt; \u0026lt;script defer src=\u0026#34;https://cdn.jsdelivr.net/npm/katex@0.16.4/dist/katex.min.js\u0026#34; integrity=\u0026#34;sha384-PwRUT/YqbnEjkZO0zZxNqcxACrXe+j766U2amXcgMg5457rve2Y7I6ZJSm2A0mS4\u0026#34; crossorigin=\u0026#34;anonymous\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; \u0026lt;script defer src=\u0026#34;https://cdn.jsdelivr.net/npm/katex@0.16.4/dist/contrib/auto-render.min.js\u0026#34; integrity=\u0026#34;sha384-+VBxd3r6XgURycqtZ117nYw44OOcIax56Z4dCRWbxyPt0Koah1uHoK0o4+/RRE05\u0026#34; crossorigin=\u0026#34;anonymous\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; \u0026lt;script\u0026gt; document.addEventListener(\u0026#34;DOMContentLoaded\u0026#34;, function() { renderMathInElement( document.body, { delimiters: [ {left: \u0026#34;$$\u0026#34;, right: \u0026#34;$$\u0026#34;, display: true}, {left: \u0026#34;\\\\[\u0026#34;, right: \u0026#34;\\\\]\u0026#34;, display: true}, {left: \u0026#34;$\u0026#34;, right: \u0026#34;$\u0026#34;, display: false}, {left: \u0026#34;\\\\(\u0026#34;, right: \u0026#34;\\\\)\u0026#34;, display: false} ] }); }); \u0026lt;/script\u0026gt; A continuación, añade el siguiente código al archivo existente layouts/partials/extend_head.html. 1 2 3 {{ if or .Params.math .Site.Params.math }} {{ partial \u0026#34;math.html\u0026#34; . }} {{ end }} Ahora estás listo para usar KaTeX. Al añadir math: true al front matter de la página, puedes habilitar KaTeX.\nTodo lo que tienes que hacer es escribir las fórmulas matemáticas al estilo LaTeX en el cuerpo del artículo de la página. 1 $$ e^{i \\pi} = -1 $$ Si lo escribes como arriba, se mostrará de la siguiente manera.\n$$ e^{i \\pi} = -1 $$ Referencias Math Typesetting | PaperModX KaTex Auto-render Extension Introducción a KaTeX | The Strange Storage ","date":"2023-03-31T23:11:26+09:00","image":"http://kenji.blog/p/hugo%E3%81%A7katexlatex%E9%A2%A8%E6%95%B0%E5%BC%8F%E8%A1%A8%E7%A4%BA%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hu4b1d83d24aac47c2cd375cc93b995e98_26739_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/hugo%E3%81%A7katexlatex%E9%A2%A8%E6%95%B0%E5%BC%8F%E8%A1%A8%E7%A4%BA%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"Cómo habilitar KaTeX (fórmulas matemáticas estilo LaTeX) en hugo"},{"content":"Cómo ganar amigos e influir sobre las personas https://amzn.to/3YTv0Dr\nAtrévete a no gustar https://amzn.to/3n3SVCQ\nLIFE SHIFT: Estrategia de vida para la era de los 100 años https://amzn.to/3TtKUDf\nLos 7 hábitos de la gente altamente efectiva https://amzn.to/3TqfjSO\n","date":"2023-03-19T18:13:14+09:00","image":"http://kenji.blog/p/%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%81%AE%E3%83%93%E3%82%B8%E3%83%8D%E3%82%B9%E6%9B%B8/img_huc9a897f0643b20664d8e252d3dd67b22_2836610_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%81%AE%E3%83%93%E3%82%B8%E3%83%8D%E3%82%B9%E6%9B%B8/","title":"Libros de negocios recomendados"},{"content":"Extensiones recomendadas para Chrome A continuación, presento las extensiones de Chrome que uso actualmente. Aunque son para Chrome, también se pueden usar en Microsoft Edge.\n1. simpleGestures Es una extensión que permite usar gestos del ratón. Puedes operar el navegador sin necesidad de usar el teclado o hacer clic en los botones de la barra de herramientas.\nPor ejemplo, puedes retroceder deslizando el ratón hacia la izquierda mientras mantienes presionado el botón derecho, o avanzar deslizando el ratón hacia la derecha mientras mantienes presionado el botón derecho.\nDado que es de código abierto, es altamente confiable.\nsimpleGestures github 2. uBlock Origin Es una extensión para bloquear anuncios. Como es de código abierto, es altamente confiable. Además, utiliza poca CPU y memoria, por lo que funciona de manera fluida.\nuBlock Origin github 3. Traductor DeepL Es una extensión de Chrome que permite traducir dentro de la página utilizando DeepL, un servicio de traducción mundialmente famoso. Al seleccionar el texto que deseas traducir en el navegador, aparece el ícono de DeepL, y al hacer clic en él se traduce automáticamente.\nDeepL Translator 4. ChatGPT Sidebar Es una extensión que permite usar ChatGPT en una barra lateral. Puedes mostrar la barra lateral con Ctrl+P y hacer preguntas a la IA inmediatamente. Si hay texto seleccionado en la página, se copia directamente en el cuadro de la pregunta, por lo que puedes preguntar rápidamente presionando Ctrl+Enter.\nChatGPT Sidebar 5. Salesforce DevTools Es una extensión que añade funciones útiles para el desarrollo en Salesforce. Creo que no es necesaria para aquellos que no usan Salesforce.\nSalesforce DevTools ","date":"2023-03-19T02:54:30+09:00","image":"http://kenji.blog/p/%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%81%AE-chorme-%E6%8B%A1%E5%BC%B5/img_4_hue5f33cff57d8628a1113ed27818b8d04_20776_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%81%AE-chorme-%E6%8B%A1%E5%BC%B5/","title":"Extensiones recomendadas para Chrome"},{"content":"Cómo actualizar rustc Simplemente ejecuta la siguiente línea en la línea de comandos.\n1 rustup update Ejemplo de salida 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 rustup update info: syncing channel updates for \u0026#39;stable-x86_64-pc-windows-msvc\u0026#39; warning: Signature verification failed for \u0026#39;https://static.rust-lang.org/dist/channel-rust-stable.toml\u0026#39; info: latest update on 2023-03-09, rust version 1.68.0 (2c8cc3432 2023-03-06) info: downloading component \u0026#39;rust-src\u0026#39; info: downloading component \u0026#39;cargo\u0026#39; info: downloading component \u0026#39;clippy\u0026#39; info: downloading component \u0026#39;rust-docs\u0026#39; info: downloading component \u0026#39;rust-std\u0026#39; info: downloading component \u0026#39;rustc\u0026#39; 63.9 MiB / 63.9 MiB (100 %) 37.5 MiB/s in 1s ETA: 0s info: downloading component \u0026#39;rustfmt\u0026#39; info: removing previous version of component \u0026#39;rust-src\u0026#39; info: removing previous version of component \u0026#39;cargo\u0026#39; info: removing previous version of component \u0026#39;clippy\u0026#39; info: removing previous version of component \u0026#39;rust-docs\u0026#39; info: removing previous version of component \u0026#39;rust-std\u0026#39; info: removing previous version of component \u0026#39;rustc\u0026#39; info: removing previous version of component \u0026#39;rustfmt\u0026#39; info: installing component \u0026#39;rust-src\u0026#39; info: installing component \u0026#39;cargo\u0026#39; info: installing component \u0026#39;clippy\u0026#39; info: installing component \u0026#39;rust-docs\u0026#39; 19.4 MiB / 19.4 MiB (100 %) 2.4 MiB/s in 6s ETA: 0s info: installing component \u0026#39;rust-std\u0026#39; 27.6 MiB / 27.6 MiB (100 %) 12.7 MiB/s in 2s ETA: 0s info: installing component \u0026#39;rustc\u0026#39; 63.9 MiB / 63.9 MiB (100 %) 13.8 MiB/s in 4s ETA: 0s info: installing component \u0026#39;rustfmt\u0026#39; info: checking for self-updates info: downloading self-update stable-x86_64-pc-windows-msvc updated - rustc 1.68.0 (2c8cc3432 2023-03-06) (from rustc 1.64.0 (a55dd71d5 2022-09-19)) info: cleaning up downloads \u0026amp; tmp directories ","date":"2023-03-18T10:27:02+09:00","image":"http://kenji.blog/p/rustc%E3%82%92%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_hu2f4438039b9bb5f2180f9e10d772e3b3_30692_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/rustc%E3%82%92%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"Cómo actualizar rustc"},{"content":"¿Qué es egui? Es una librería GUI que se puede utilizar con Rust.\nProbando egui Puedes ejecutar el ejemplo de egui con los siguientes comandos.\n1 2 3 git clone https://github.com/emilk/eframe_template/ egui_test cd egui_test cargo run Después de eso, puedes probar varias cosas mientras juegas con el código de ejemplo.\nReferencia GitHub oficial\n","date":"2023-03-18T10:27:02+09:00","image":"http://kenji.blog/p/egui%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B/demo_hu16f50e8d6a05810ce904e73f9e33bab1_152754_120x120_fill_box_smart1_1.gif","permalink":"http://kenji.blog/es/p/egui%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B/","title":"Probando egui"},{"content":"Cómo solucionar el ruido de la YAMAHA AG03 Al escuchar el sonido del PC a través del monitor de la AG03, se produce un ruido áspero periódicamente (una vez cada 1 a 3 minutos aproximadamente). Al investigar, parece que existe el siguiente método como contramedida para el ruido de la AG03:\nhttps://jp.yamaha.com/support/updates/yamaha_steinberg_usb_driver_for_win.html\nAl descargar e instalar el Yamaha Steinberg USB Driver desde el sitio anterior, el ruido se solucionó.\nComprar ahora Referencia https://web.archive.org/web/20201003230738/http://yamaha.custhelp.com/app/answers/detail/a_id/7202\n","date":"2023-03-18T01:17:10+09:00","image":"http://kenji.blog/p/ag03%E3%83%8E%E3%82%A4%E3%82%BA%E8%A7%A3%E6%B6%88%E6%96%B9%E6%B3%95/img_hu7b60ee71c94898202eca721f7c6778b5_180745_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/ag03%E3%83%8E%E3%82%A4%E3%82%BA%E8%A7%A3%E6%B6%88%E6%96%B9%E6%B3%95/","title":"'Cómo solucionar el ruido de la AG03'"},{"content":"Periféricos de PC recomendados y deseados por un ingeniero en activo Teclado Ante todo, recomiendo los teclados capacitivos sin contacto porque son difíciles de romper. Tengo un RealForce desde hace más de 10 años y todavía lo uso activamente. El tipo que utilizo es silencioso con distribución en inglés.\nSin embargo, últimamente también me interesa el teclado Logitech MX Keys.\nTrackball Para el dispositivo señalador, recomiendo un trackball en lugar de un ratón, ya que reduce la fatiga.\nEl que utilizo es el Logitech MX Ergo. Es un dispositivo caro que cuesta más de 10,000 yenes, pero creo que vale más que eso.\nTambién me interesa el DEFT PRO (M-DPT1MRXBK), que tiene una bola grande y se maneja con el dedo índice y medio. Monitor Cualquier modelo está bien, pero recomiendo un monitor 4K con alta resolución.\nActualmente estoy usando un monitor 4K de DELL.\nAhora mismo me gustaría tener un monitor ultra ancho de EIZO o un monitor de DELL.\n","date":"2023-02-28T00:51:49+09:00","image":"http://kenji.blog/p/%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%81%AEpc%E5%91%A8%E8%BE%BA%E6%A9%9F%E5%99%A8/img_hu9c34821fcae33240cf8bba1055606dc6_434960_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%81%AEpc%E5%91%A8%E8%BE%BA%E6%A9%9F%E5%99%A8/","title":"Periféricos de PC recomendados"},{"content":"fontplus.jp, un servicio para usar fuentes web de pago https://fontplus.jp/\nPor 1.100 yenes al mes, puedes usar todas las fuentes, compatible también con el uso en múltiples sitios web.\n","date":"2023-02-07T20:59:01+09:00","image":"http://kenji.blog/p/fontplus.jp/img_hu81cfc4bed02bb5cdb36d3ac7fae3e538_91722_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/fontplus.jp/","title":"Acerca de fontplus.jp"},{"content":"De manera predeterminada, el uso de etiquetas HTML en los artículos está deshabilitado en HUGO, pero puedes habilitarlo agregando la siguiente configuración en config.toml.\n1 2 [markup.goldmark.renderer] unsafe = true Referencia: Configure Markup\n","date":"2023-01-17T19:20:32+09:00","image":"http://kenji.blog/p/hugo%E3%81%A7html%E3%82%BF%E3%82%B0%E3%82%92%E4%BD%BF%E3%81%86/img_hu415dc7e70376ac350673d0366f70ca4b_19909_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/hugo%E3%81%A7html%E3%82%BF%E3%82%B0%E3%82%92%E4%BD%BF%E3%81%86/","title":"Usar etiquetas HTML en HUGO"},{"content":"Buscando Patrocinadores en GitHub Estaría muy agradecido si pudieras apoyarme como patrocinador en GitHub utilizando el botón a continuación.\nLos fondos se utilizarán para el desarrollo de herramientas y proyectos similares.\n¡Me esforzaré al máximo hasta poder obtener un certificado de firma de código!\n","date":"2023-01-17T18:13:56+09:00","image":"http://kenji.blog/p/github%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B5%E3%83%BC%E5%8B%9F%E9%9B%86/img_hueb38a852fa4aae54f384564ce61ae26b_130999_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/github%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B5%E3%83%BC%E5%8B%9F%E9%9B%86/","title":"Buscando Patrocinadores en GitHub"},{"content":"¿Qué es un botón? Un botón es uno de los controles de la interfaz gráfica de usuario (GUI) y se puede implementar con la API estándar de Windows. Al hacer clic (presionar y soltar el botón izquierdo del ratón) en un área de la pantalla, se puede ejecutar la operación especificada por el programa.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 // Creación de un botón CreateWindow( TEXT(\u0026#34;BUTTON\u0026#34;), TEXT(\u0026#34;Close\u0026#34;), WS_CHILD|WS_VISIBLE, 10,10,128,30, hWnd, (HMENU)ID_BUTTON1, ((LPCREATESTRUCT)lParam)-\u0026gt;hInstance, 0); ... // Al hacer clic, el SO envía el mensaje WM_COMMAND a la ventana. case WM_COMMAND: switch(LOWORD(wParam)) { case ID_BUTTON1: SendMessage(hWnd,WM_CLOSE,0,0); break; } break; El código de muestra se encuentra publicado a continuación. button\n","date":"2023-01-14T20:24:00+09:00","image":"http://kenji.blog/p/%E3%83%9C%E3%82%BF%E3%83%B3%E3%81%A4%E3%81%84%E3%81%A6/img_hu07b471bb746fa184ff8eeb6f561670e7_8164_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E3%83%9C%E3%82%BF%E3%83%B3%E3%81%A4%E3%81%84%E3%81%A6/","title":"Acerca de los botones"},{"content":"Compré un portátil ThinkPad (usado) Como mi trabajo en el portátil se basa casi siempre en conectarme a otros terminales mediante escritorio remoto, no necesitaba un PC de altas especificaciones. Un ChromeBook habría estado bien, pero como no había ninguno con un buen diseño o alta resolución, me compré un ThinkPad.\nLas especificaciones están abajo; utilizando varios puntos, el precio fue de alrededor de 55.000 yenes.\nThinkPad T470s CPU: Intel Core i7 7600U RAM: 24GB SSD: 512GB SO: Windows 10 Pro 64 bits Pantalla: 14.0 pulgadas panorámica (panel antirreflejos) Resolución: Pantalla LCD WQHD 2560×1440 Peso: Aprox. 1.32 kg Notas: Teclado en inglés Como es de segunda mano, pensé que tendría marcas de uso o arañazos, pero no hay ningún problema en absoluto y estoy contento. La batería también funciona sin problemas hasta ahora.\nQuejas que se me ocurren hasta ahora Faltan las teclas Pause y App. Usaba la tecla Pause en un atajo para abrir la configuración del sistema. Además, usaba la tecla App para abrir el menú emergente, así que es un inconveniente no tenerlas. Las teclas PageUp y PageDown están justo al lado de las teclas de flecha del teclado, así que a menudo las pulso por error. Esto podría ser cuestión de acostumbrarse. Otros PC que consideré pero no compré ASUS Chromebook Flip C436FA (C436FA-ENG) Portátil HP HP15s-fq Material de referencia: ThinkPad T470s\n","date":"2023-01-13T19:07:00+09:00","image":"http://kenji.blog/p/thinkpad%E4%B8%AD%E5%8F%A4%E3%82%92%E8%B2%B7%E3%81%A3%E3%81%9F/img_hu1990736b7e8b9be3011f0d8e6938401f_246116_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/thinkpad%E4%B8%AD%E5%8F%A4%E3%82%92%E8%B2%B7%E3%81%A3%E3%81%9F/","title":"Compré un ThinkPad (usado)"},{"content":"Conexión remota sencilla con TeamViewer Con TeamViewer puedes realizar conexiones de escritorio remoto fácilmente.\nInicia TeamViewer tanto en el equipo local como en el remoto, y en el equipo local ingresa el ID y la contraseña del equipo remoto para establecer la conexión.\nPara conectarte remotamente desde la línea de comandos, haz lo siguiente:\n1 %ProgramFiles%\\TeamViewer\\TeamViewer.exe -i \u0026lt;ID\u0026gt; -P \u0026lt;Password\u0026gt; En \u0026lt;ID\u0026gt; ingresa el ID del equipo remoto y en \u0026lt;Password\u0026gt; ingresa la contraseña del equipo remoto.\nEs útil crear un archivo de acceso directo con el comando anterior, ya que te permite omitir la introducción del ID y la contraseña.\nSitio de referencia: Command line parameters\n","date":"2023-01-13T01:45:00+09:00","image":"http://kenji.blog/p/teamviewer%E3%81%A7%E7%B0%A1%E5%8D%98%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E6%8E%A5%E7%B6%9A/img_hu6a85c6015d61f1656b290295e2fefc2b_15316_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/teamviewer%E3%81%A7%E7%B0%A1%E5%8D%98%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E6%8E%A5%E7%B6%9A/","title":"Conexión remota sencilla con TeamViewer"},{"content":" Los necios aprenden de la experiencia, los sabios aprenden de la historia. (Otto von Bismarck)\nEn lugar de darle un pez a alguien, enséñale a pescar. (Lao-Tse)\nMantente hambriento, mantente alocado. (Steve Jobs)\nEs mejor hacer las cosas que buscar la perfección. (Mark Zuckerberg)\nMantenlo simple. (James Gosling)\nNo tengo tiempo para preocuparme por a quién no le caigo bien. Estoy demasiado ocupado amando a las personas que me aman. (Snoopy)\nLa mayor felicidad para un ser humano es \u0026ldquo;encontrar un trabajo donde pueda hacer uso de sus talentos\u0026rdquo;. (Karl Marx)\nSi el conocimiento a medias es peligroso, ¿dónde está el hombre que tiene suficiente conocimiento para salir del peligro? (Thomas Huxley, 1877)\nTweedledee añadió: \u0026ldquo;Al contrario, si fuera así, podría ser; y si fuera así, sería; pero como no es así, no es. Eso es la lógica\u0026rdquo;. (Lewis Carroll, \u0026ldquo;Alicia a través del espejo\u0026rdquo;, 1872)\nNo es exagerado decir que Claude Shannon es el padre de la era de la información, y que sus logros académicos son de los más grandes del siglo XX. (Evaluación de la Sociedad Matemática Americana)\nAquellos que conocen el estado actual de la teoría del álgebra simbólica son conscientes de que la validez de este proceso analítico no depende de la interpretación de los símbolos empleados, sino únicamente de las leyes mediante las cuales se combinan. (George Boole, al comienzo de su obra \u0026ldquo;El análisis matemático de la lógica\u0026rdquo;, 1847)\n","date":"2022-10-15T17:00:43+09:00","image":"http://kenji.blog/p/%E5%90%8D%E8%A8%80%E9%9B%86/img_hu460fc51ec02f7186f7ea8b0f77e830d9_47559_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E5%90%8D%E8%A8%80%E9%9B%86/","title":"'Colección de citas'"},{"content":"Editor de grafos Presentamos una página web que permite crear grafos fácilmente.\nhttps://csacademy.com/app/graph_editor/\nPuede crear grafos ingresando valores numéricos. También parece que es posible mover elementos con el ratón.\nAl hacer clic en Directed también puede crear grafos dirigidos.\nLos grafos creados se pueden guardar como imagen usando Download as PNG.\n","date":"2022-10-13T23:31:11+09:00","image":"http://kenji.blog/p/%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF/img_hu784f47a1f9126188b11445cd2c37bf68_13497_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF/","title":"Editor de grafos"},{"content":"Resolver el problema del viajante con Mathematica Problema 電車でこんな広告を見かけました😁📸 pic.twitter.com/iXEgvtXrpL\n\u0026mdash; 早稲田大学 早水桃子研究室 (@hayamizu_lab) October 11, 2022 Solución 1 d=SparseArray[{{1,2}-\u0026gt;10,{2,1}-\u0026gt;10,{1,5}-\u0026gt;15,{5,1}-\u0026gt;15,{1,4}-\u0026gt;12,{4,1}-\u0026gt;12,{1,3}-\u0026gt;20,{3,1}-\u0026gt;20,{2,5}-\u0026gt;10,{5,2}-\u0026gt;10,{3,4}-\u0026gt;10,{4,3}-\u0026gt;10,{3,8}-\u0026gt;30,{8,3}-\u0026gt;30,{3,7}-\u0026gt;20,{7,3}-\u0026gt;20,{3,6}-\u0026gt;25,{6,3}-\u0026gt;25,{4,5}-\u0026gt;15,{5,4}-\u0026gt;15,{4,8}-\u0026gt;20,{8,4}-\u0026gt;20,{5,9}-\u0026gt;18,{9,5}-\u0026gt;18,{5,8}-\u0026gt;15,{8,5}-\u0026gt;15,{6,7}-\u0026gt;5,{7,6}-\u0026gt;5,{7,8}-\u0026gt;35,{8,7}-\u0026gt;35,{8,9}-\u0026gt;12,{9,8}-\u0026gt;12},{9,9},Infinity]; La función SparseArray crea una matriz. Cada elemento representa la distancia entre las ciudades de la fila y columna de ese elemento. Por ejemplo, el primer elemento {1,2}-\u0026gt;10 significa que la distancia entre 1 y 2 es 10. El penúltimo elemento {9,9} indica el tamaño de la matriz, y el último elemento Infinity significa que la longitud del camino entre ciudades no especificadas es infinita. Es decir, significa que no hay camino.\n1 {len,tour}=FindShortestTour[{1,2,3,4,5,6,7,8,9},DistanceFunction-\u0026gt;(d[[#1,#2]]\u0026amp;)] Con la función FindShortestTour, puedes resolver fácilmente el problema del viajante. {1,2,3,4,5,6,7,8,9} representa los números de las ciudades. DistanceFunction-\u0026gt;(d[[#1,#2]]\u0026amp;) pasa la matriz d que representa la distancia entre las ciudades.\nSalida 1 {137, {1, 2, 5, 9, 8, 7, 6, 3, 4}} La salida es la distancia más corta y el recorrido en ese momento. La distancia más corta es 137, y el recorrido es 1→2→5→9→8→7→6→3→4→1. Convertido al orden ABC, es A, B, E, I, H, G, F, C, D.\n","date":"2022-10-12T19:05:58+09:00","image":"http://kenji.blog/p/mathematica%E3%81%A7%E5%B7%A1%E5%9B%9E%E3%82%BB%E3%83%BC%E3%83%AB%E3%82%B9%E3%83%9E%E3%83%B3%E5%95%8F%E9%A1%8C%E3%82%92%E8%A7%A3%E3%81%8F/img_hucba782cf2f6047b30fd8084b4d887659_22760_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/mathematica%E3%81%A7%E5%B7%A1%E5%9B%9E%E3%82%BB%E3%83%BC%E3%83%AB%E3%82%B9%E3%83%9E%E3%83%B3%E5%95%8F%E9%A1%8C%E3%82%92%E8%A7%A3%E3%81%8F/","title":"Resolver el problema del viajante con Mathematica"},{"content":"Para marcar todas las casillas de verificación en una página web, abra DevTools con F12, pegue el siguiente código en la consola y ejecútelo.\n1 2 3 4 5 6 let boxes = document.querySelectorAll(\u0026#39;input[type=\u0026#34;checkbox\u0026#34;]\u0026#39;); for (let i = 0; i \u0026lt; boxes.length; i++) { if (!boxes[i].disabled) { boxes[i].checked = true; } } O bien,\nCree un nuevo marcador y pegue el siguiente código en la dirección al registrarse (generalmente donde ingresa https://\u0026hellip;). Muestre la página web donde desea marcar las casillas de verificación y haga clic en el marcador que creó para marcar todas las casillas de verificación.\n1 javascript:(function(){let boxes=document.querySelectorAll(\u0026#39;input[type=\u0026#34;checkbox\u0026#34;]\u0026#39;);for(let i=0;i\u0026lt;boxes.length;i++){if(!boxes[i].disabled){boxes[i].checked=true;}}})(); Si desea desmarcar todas, cambie la parte de boxes[i].checked = true; del script anterior a boxes[i].checked = false;.\n","date":"2022-10-05T20:07:06+09:00","image":"http://kenji.blog/p/web%E3%83%9A%E3%83%BC%E3%82%B8%E5%86%85%E3%81%AE%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%E3%82%92%E5%85%A8%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%81%99%E3%82%8B/img_hu556225b69f77e68d5b8659c3dfad5080_9228_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/web%E3%83%9A%E3%83%BC%E3%82%B8%E5%86%85%E3%81%AE%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%E3%82%92%E5%85%A8%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%81%99%E3%82%8B/","title":"Marcar todas las casillas de verificación en una página web"},{"content":"Teorema de Wilson Cuando $p$ es un número primo, se cumple que $(p−1)!≡−1 \\pmod p$\nFórmula de Euler $e^{iπ}+1=0$\nÚltimo teorema de Fermat Para todo número entero $n≥3$, no existen números enteros positivos $x,y,z$ que cumplan $x^n+y^n=z^n$\nProblema de Basilea $1/1^2+1/2^2+1/3^2+1/4^2+...=π^2/6$\nFórmula de los números primos de Euler $n^2+n+41$ da como resultado un número primo para todos los números enteros $n$ desde $0$ hasta $39$\n","date":"2022-10-05T13:24:50+09:00","image":"http://kenji.blog/p/%E5%A5%BD%E3%81%8D%E3%81%AA%E6%95%B0%E5%BC%8F/img_huc293f175856c5702bca3e96906ea6e7d_155123_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E5%A5%BD%E3%81%8D%E3%81%AA%E6%95%B0%E5%BC%8F/","title":"'Fórmulas favoritas'"},{"content":"Requisitos previos Debe ser Windows 11\nProcedimiento Instalar el Instalador de aplicación desde Microsoft Store https://www.microsoft.com/store/productId/9NBLGGH4NNS1 Instalar la aplicación usando el Símbolo del sistema 1 winget install Google.Chrome Principales aplicaciones que se pueden instalar Google Chrome (comando winget install Google.Chrome) Microsoft Edge (comando winget install Microsoft.Edge) Microsoft Teams (comando winget install Microsoft.Teams) Microsoft Office (comando winget install Microsoft.Office) Visual Studio Code (comando winget install vscode) Slack (comando winget install SlackTechnologies.Slack) Discord (comando winget install Discord.Discord) Docker Desktop (comando winget install Docker.DockerDesktop) Git (comando winget install Git) 7zip (comando winget install 7zip) VLC (comando winget install VideoLAN.VLC) Referencias Uso de la herramienta winget para instalar y administrar aplicaciones\nNota al margen Pensé que también podría instalar Paint.Net, pero no pude instalarlo.\nhttps://forums.getpaint.net/topic/118574-please-add-paintnet-to-the-available-packages-for-windows-package-manager-winget/\n","date":"2022-10-05T12:15:20+09:00","image":"http://kenji.blog/p/winget-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B/img_hu0f8970b897eb9ee188b975a06c549111_1216_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/winget-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B/","title":"'Instalar aplicaciones mediante comandos usando WinGet'"},{"content":"Características de Rust Es un lenguaje de programación de código abierto relativamente nuevo desarrollado por Mozilla. Es un lenguaje rápido y especializado en programación de sistemas, sin recolección de basura. Garantiza la seguridad de la memoria con un mecanismo único de propiedad (ownership) y préstamo (borrowing) como parte de las especificaciones del lenguaje. Funciona de forma multiplataforma. Incluye de manera predeterminada un excelente administrador de paquetes llamado Cargo. ","date":"2022-10-03T22:47:20+09:00","image":"http://kenji.blog/p/rust%E3%81%AE%E7%89%B9%E5%BE%B4/img_hu184f8481eb552ab7d9cefed2227c58f9_39839_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/rust%E3%81%AE%E7%89%B9%E5%BE%B4/","title":"'Características de Rust'"},{"content":"Para establecer variables dinámicamente en Github Actions, se puede lograr escribiendo adicionalmente en $env:GITHUB_ENV como se muestra a continuación.\n【En el caso de Windows】\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 name: Rust on: push: branches: [ \u0026#34;master\u0026#34; ] pull_request: branches: [ \u0026#34;master\u0026#34; ] env: CARGO_TERM_COLOR: always jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Get Environment run: | echo \u0026#39;VERSION=1.0.0\u0026#39; \u0026gt;\u0026gt; $GITHUB_ENV echo \u0026#39;NAME=1.0.0\u0026#39; \u0026gt;\u0026gt; $GITHUB_ENV - name: Display Environment run: | echo $env:VERSION echo $env:NAME - name: Create Release id: create_release uses: actions/create-release@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: tag_name: ${{ env.VERSION }} release_name: ${{ env.VERSION }} draft: false prerelease: false - name: Upload Release Asset id: upload-release-asset uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} # This pulls from the CREATE RELEASE step above, referencing it\u0026#39;s ID to get its outputs object, which include a `upload_url`. See this blog post for more info: https://jasonet.co/posts/new-features-of-github-actions/#passing-data-to-future-steps asset_path: ./target/release/${{ env.NAME }}.exe asset_name: ${{ env.NAME }}.exe asset_content_type: application/octet-stream 【En el caso de Linux】\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 name: Rust on: push: branches: [ \u0026#34;main\u0026#34; ] pull_request: branches: [ \u0026#34;main\u0026#34; ] env: CARGO_TERM_COLOR: always jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Get Environment run: | echo \u0026#39;VERSION=1.0.0\u0026#39; \u0026gt;\u0026gt; $GITHUB_ENV echo \u0026#39;NAME=hello\u0026#39; \u0026gt;\u0026gt; $GITHUB_ENV - name: Display Environment run: | echo ${{ env.VERSION }} echo ${{ env.NAME }} ","date":"2022-10-02T02:33:35+09:00","image":"http://kenji.blog/p/github-actions%E3%81%A7%E5%8B%95%E7%9A%84%E3%81%AB%E5%A4%89%E6%95%B0%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B/img_1_hua65fb3c79313ad0762e062df80261603_10981_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/github-actions%E3%81%A7%E5%8B%95%E7%9A%84%E3%81%AB%E5%A4%89%E6%95%B0%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B/","title":"Establecer variables dinámicamente en Github Actions"},{"content":"Eliminar etiquetas locales Usa git tag para verificar las etiquetas locales existentes. Usa git tag -d v0.1.0 para eliminar una etiqueta. (Especifica la etiqueta que deseas eliminar en lugar de v0.1.0) Eliminar etiquetas remotas Usa git ls-remote --tags para verificar las etiquetas remotas existentes. Usa git push origin --delete v0.1.0 para eliminar una etiqueta remota. (Especifica la etiqueta que deseas eliminar en lugar de v0.1.0) Referencia ¡Cómo eliminar un tag en git de forma remota y local!\n","date":"2022-10-02T02:18:04+09:00","image":"http://kenji.blog/p/git%E3%81%A7%E3%82%BF%E3%82%B0%E3%82%92%E6%B6%88%E3%81%99/img_hu2ecde82e40aa31a994850b70302683b4_5304_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/git%E3%81%A7%E3%82%BF%E3%82%B0%E3%82%92%E6%B6%88%E3%81%99/","title":"'Eliminar etiquetas en git'"},{"content":"Mostrar una ventana simple en Rust\n1 2 3 4 5 6 7 8 9 10 [package] name = \u0026#34;win\u0026#34; version = \u0026#34;0.1.0\u0026#34; edition = \u0026#34;2021\u0026#34; # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies.winapi] version = \u0026#34;0.3\u0026#34; features = [\u0026#34;winuser\u0026#34;] El código fuente es el siguiente:\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 #![windows_subsystem = \u0026#34;windows\u0026#34;] use winapi::{ um::{ winuser::{RegisterClassW, WNDCLASSW, CS_HREDRAW, CS_VREDRAW, LoadIconW, IDI_APPLICATION, LoadCursorW, IDC_ARROW, CreateWindowExW, ShowWindow, SW_NORMAL, UpdateWindow, GetMessageW, TranslateMessage, DispatchMessageW, MSG, WM_DESTROY, PostQuitMessage, DefWindowProcW, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT}, wingdi::{GetStockObject, WHITE_BRUSH}, }, shared::{ windef::{HWND, HBRUSH}, minwindef::{UINT, WPARAM, LPARAM, LRESULT}, }, }; use std::ptr; use std::mem; fn main() { unsafe { let class_name = encode(\u0026#34;my_window_class_name\u0026#34;); if !register_wndclass(\u0026amp;class_name) { return; } let hwnd = create_window(\u0026amp;class_name); if hwnd.is_null() { return; } ShowWindow(hwnd, SW_NORMAL); UpdateWindow(hwnd); let mut msg = mem::uninitialized::\u0026lt;MSG\u0026gt;(); loop { if GetMessageW(\u0026amp;mut msg, ptr::null_mut(), 0, 0) == 0 { return; } TranslateMessage(\u0026amp;mut msg); DispatchMessageW(\u0026amp;mut msg); } } } fn encode(source: \u0026amp;str) -\u0026gt; Vec\u0026lt;u16\u0026gt; { source.encode_utf16().chain(Some(0)).collect() } unsafe fn register_wndclass(class_name: \u0026amp;[u16]) -\u0026gt; bool { let mut winc = mem::zeroed::\u0026lt;WNDCLASSW\u0026gt;(); winc.style = CS_HREDRAW | CS_VREDRAW; winc.lpfnWndProc = Some(win_proc); winc.hIcon = LoadIconW(ptr::null_mut(), IDI_APPLICATION); winc.hCursor = LoadCursorW(ptr::null_mut(), IDC_ARROW); winc.hbrBackground = GetStockObject(WHITE_BRUSH as i32) as HBRUSH; winc.lpszClassName = class_name.as_ptr(); RegisterClassW(\u0026amp;winc) \u0026gt; 0 } unsafe fn create_window(class_name: \u0026amp;[u16]) -\u0026gt; HWND { CreateWindowExW( 0, class_name.as_ptr(), encode(\u0026#34;Hello, World!\u0026#34;).as_ptr(), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, ptr::null_mut(), ptr::null_mut(), ptr::null_mut(), ptr::null_mut(), ) } unsafe extern \u0026#34;system\u0026#34; fn win_proc(hwnd: HWND, msg: UINT, w_param: WPARAM, l_param: LPARAM) -\u0026gt; LRESULT { match msg { WM_DESTROY =\u0026gt; PostQuitMessage(0), _ =\u0026gt; return DefWindowProcW(hwnd, msg, w_param, l_param), }; 0 } Referencia Programación de Windows en Rust - Edición CreateWindow\n","date":"2022-10-01T19:08:58+09:00","image":"http://kenji.blog/p/rust%E3%81%A7%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AA%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B/images/rust_logo_huefc2d075e966b0edc0b7186c50038553_22411_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/rust%E3%81%A7%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AA%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B/","title":"Mostrar una ventana simple en Rust"},{"content":"Para escribir pruebas en Rust, crea una función añadiendo el atributo #[test] en la línea superior de la definición de la función de prueba.\n1 2 3 4 5 6 7 8 fn plus(a:i32,b:i32)-\u0026gt;i32 { a+b } #[test] fn plus_test() { assert_eq!(plus(1, 1), 2); } El código de prueba se puede ejecutar con cargo test. Si la prueba tiene éxito, se imprimirá ok. Si falla, se imprimirá FAILED.\nEn caso de éxito\n1 2 3 4 5 6 7 8 9 C:\\Users\\admin\\Desktop\\test1\u0026gt;cargo test Compiling test1 v0.1.0 (C:\\Users\\admin\\Desktop\\test1) Finished test [unoptimized + debuginfo] target(s) in 0.35s Running unittests src\\main.rs (target\\debug\\deps\\test1-be5d3118bc52cb3a.exe) running 1 test test plus_test ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s En caso de fallo\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 C:\\Users\\admin\\Desktop\\test1\u0026gt;cargo test Compiling test1 v0.1.0 (C:\\Users\\admin\\Desktop\\test1) Finished test [unoptimized + debuginfo] target(s) in 0.33s Running unittests src\\main.rs (target\\debug\\deps\\test1-be5d3118bc52cb3a.exe) running 1 test test plus_test ... FAILED failures: ---- plus_test stdout ---- thread \u0026#39;plus_test\u0026#39; panicked at \u0026#39;assertion failed: `(left == right)` left: `2`, right: `3`\u0026#39;, src\\main.rs:7:5 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: plus_test test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass \u0026#39;--bin test1\u0026#39; ","date":"2022-10-01T02:00:59+09:00","image":"http://kenji.blog/p/rust%E3%81%A7%E3%83%86%E3%82%B9%E3%83%88%E3%82%92%E6%9B%B8%E3%81%8F/images/rust_logo_huefc2d075e966b0edc0b7186c50038553_22411_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/rust%E3%81%A7%E3%83%86%E3%82%B9%E3%83%88%E3%82%92%E6%9B%B8%E3%81%8F/","title":"Escribiendo pruebas en Rust"},{"content":"Puede mostrar un MessageBox en Rust siguiendo los pasos a continuación.\nInstalar Rust. Consulte Cómo empezar con Rust. Ejecute cargo new --bin MessageBox en el símbolo del sistema. Vaya al directorio MessageBox. Abra Cargo.toml y modifíquelo de la siguiente manera. 1 2 3 4 5 6 7 8 9 10 [package] name = \u0026#34;hello_world\u0026#34; version = \u0026#34;0.1.0\u0026#34; edition = \u0026#34;2021\u0026#34; # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] winapi = \u0026#34;0.2.7\u0026#34; user32-sys = \u0026#34;0.2.0\u0026#34; Abra src\\main.rs y modifíquelo de la siguiente manera. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 extern crate user32; extern crate winapi; use std::ffi::CString; use user32::MessageBoxA; use winapi::winuser::{MB_OK, MB_ICONINFORMATION}; fn main() { let lp_text = CString::new(\u0026#34;Hello, world!\u0026#34;).unwrap(); let lp_caption = CString::new(\u0026#34;MessageBox Example\u0026#34;).unwrap(); unsafe { MessageBoxA( std::ptr::null_mut(), lp_text.as_ptr(), lp_caption.as_ptr(), MB_OK | MB_ICONINFORMATION ); } } Ejecute cargo run en el símbolo del sistema. Para compilar una versión de lanzamiento, ejecute cargo build --release.\nReferencia Hello World MesssageBox example in Rust\n","date":"2022-09-30T23:54:31+09:00","image":"http://kenji.blog/p/rust%E3%81%A7messagebox%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B/images/rust_logo_huefc2d075e966b0edc0b7186c50038553_22411_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/rust%E3%81%A7messagebox%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B/","title":"Mostrar un MessageBox en Rust"},{"content":"¿Qué significa entender? ¡Hola!\nHoy me gustaría hablar sobre el tema \u0026ldquo;¿qué significa entender?\u0026rdquo;.\n¿\u0026ldquo;Entender\u0026rdquo; es en realidad algo ambiguo? En la vida diaria hay momentos en los que sentimos \u0026ldquo;¡lo entiendo!\u0026rdquo;. Pero si lo pensamos bien, ¿ese \u0026ldquo;entender\u0026rdquo; es realmente una comprensión completa?\nPor ejemplo, conducir un coche. Si pisas el acelerador, avanza, y si pisas el freno, se detiene. Podríamos decir que \u0026ldquo;entendemos\u0026rdquo; esto. Sin embargo, ¿no son pocas las personas que pueden explicar detalladamente qué está ocurriendo dentro del motor?\n¿Es necesaria una comprensión completa? En realidad, aunque no entendamos todo por completo, muchas veces no hay problemas en la vida diaria. Incluso sin conocer la estructura interna de un smartphone, podemos hacer llamadas o enviar mensajes, ¿verdad?\nPero eso no significa que debamos menospreciar el \u0026ldquo;entender\u0026rdquo;. Al profundizar en la comprensión, pueden surgir nuevos descubrimientos y revelaciones.\nTambién hay muchas cosas que no entendemos En el mundo hay muchas cosas que aún no se han resuelto. Por ejemplo, el mecanismo de las emociones humanas y la conciencia, o el origen del universo. Estas son áreas que, a pesar del avance de la ciencia, todavía no se \u0026ldquo;entienden\u0026rdquo; por completo.\nIncluso en el mundo de las matemáticas, hay problemas que, siendo simples como la \u0026ldquo;Conjetura de Goldbach\u0026rdquo;, permanecen sin resolver.\nEl valor de \u0026ldquo;entender\u0026rdquo; Cuando aumenta lo que \u0026ldquo;entendemos\u0026rdquo;, podemos explicar con confianza y comunicarnos efectivamente con los demás. Además, tener conocimiento tiene la ventaja de hacernos menos propensos a ser engañados por desinformación.\nEs importante tener una actitud humilde Reconocer lo que \u0026ldquo;no entendemos\u0026rdquo; conduce a la humildad. Y es precisamente por ese reconocimiento que nace la motivación para seguir aprendiendo.\nPor lo tanto, \u0026ldquo;entender\u0026rdquo; es importante, pero comprender todo por completo es algo difícil. Lo importante es conocer los límites de nuestra propia comprensión y mantener una actitud de aprendizaje continuo, ¿no les parece?\n","date":"2022-09-24T02:38:18+09:00","image":"http://kenji.blog/p/%E3%82%8F%E3%81%8B%E3%82%8B%E3%81%A3%E3%81%A6%E3%81%AA%E3%82%93%E3%81%A0%E3%82%8D%E3%81%86/img_hu70cb8dd6d786a678b22436c932461bee_164867_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E3%82%8F%E3%81%8B%E3%82%8B%E3%81%A3%E3%81%A6%E3%81%AA%E3%82%93%E3%81%A0%E3%82%8D%E3%81%86/","title":"¿Qué significa entender?"},{"content":"He pensado en por qué me gustan las matemáticas y las computadoras Igualdad para todos Siempre devuelve el mismo resultado para la misma entrada, sin importar la persona, la posición o el lugar.\nReglas claras Las reglas están claramente establecidas, y no hay absurdos ni injusticias.\nLas respuestas y teorías deducidas son eternamente correctas No hay que preocuparse de que una respuesta ya calculada sea modificada más tarde.\nTienen una dificultad adecuada Siempre hay problemas sin resolver y siempre se puede asumir el desafío de resolverlos.\n","date":"2022-09-23T01:56:52+09:00","image":"http://kenji.blog/p/%E3%81%AA%E3%81%9C%E6%95%B0%E5%AD%A6%E3%82%84%E8%A8%88%E7%AE%97%E6%A9%9F%E3%81%8C%E5%A5%BD%E3%81%8D%E3%81%AA%E3%82%93%E3%81%A0%E3%82%8D%E3%81%86/img_hue4a786c476ad4bcc54a52cdbffbd292f_6616634_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E3%81%AA%E3%81%9C%E6%95%B0%E5%AD%A6%E3%82%84%E8%A8%88%E7%AE%97%E6%A9%9F%E3%81%8C%E5%A5%BD%E3%81%8D%E3%81%AA%E3%82%93%E3%81%A0%E3%82%8D%E3%81%86/","title":"Por qué me gustan las matemáticas y las computadoras"},{"content":"Lo que necesita una comunidad Sentí que las pautas de la comunidad de Scratch son muy refinadas y buenas. Estaba escrito lo siguiente:\nTrata a todos con respeto.\nMantente seguro: no publiques información personal o de contacto.\nHaz comentarios útiles.\nComprende la cultura del remix.\nSé honesto.\nHaz que el sitio sea un lugar agradable.\nCreo que estas perspectivas son aplicables a cualquier comunidad.\nhttps://ja.scratch-wiki.info/wiki/%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%83%86%E3%82%A3%E3%83%BC%E3%82%AC%E3%82%A4%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3\n","date":"2022-09-23T01:37:43+09:00","image":"http://kenji.blog/p/%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%83%86%E3%82%A3%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%AA%E3%81%93%E3%81%A8/img_hueeaef9e10f0c1990dbbf990f6784494a_314802_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%83%86%E3%82%A3%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%AA%E3%81%93%E3%81%A8/","title":"'Lo que necesita una comunidad'"},{"content":"Fermat (P, de Fermat, 1601-1665) Matemático francés representante del siglo XVII. Sentó las bases de la geometría analítica, la teoría de la probabilidad, el cálculo diferencial, etc. También es el fundador de la teoría de números.\nDiofanto (Diophantus, c. 207-c. 291) Matemático griego. Famoso por la introducción de notación simbólica y el estudio de soluciones racionales. Su obra representativa es \u0026ldquo;Arithmetica\u0026rdquo;. El campo de encontrar soluciones racionales a ecuaciones se llama análisis diofántico.\nEuler (L. Euler, 1707-1783) El rey de las matemáticas nacido en Suiza. Logró resultados en todas las áreas posibles de las matemáticas. Dejó más de 700 artículos y 45 libros.\nLegendre (A. M. Legendre, 1752-1833) Matemático francés. Dejó numerosos logros en la teoría de números, integrales elípticas, problemas de atracción gravitatoria, etc. La palabra \u0026ldquo;teoría de números\u0026rdquo; se deriva de su obra principal homónima.\nKummer (E. E. Kummer, 1810-1893) Matemático alemán. Logró grandes resultados aplicando la teoría de números de los campos ciclotómicos al último teorema de Fermat.\nDescartes (R. Descartes, 1596-1650) Original filósofo francés. Sus obras representativas incluyen el \u0026ldquo;Discurso del método\u0026rdquo;, la \u0026ldquo;Geometría\u0026rdquo; y \u0026ldquo;El mundo\u0026rdquo;.\nPascal (B. Pascal, 1623-1662) Filósofo francés conocido por su investigación en la teoría de la probabilidad y los fluidos. Más tarde se unió a la secta jansenista y se dedicó a actividades religiosas. \u0026ldquo;Pensamientos\u0026rdquo; es una obra de esa época.\nBachet (C. G. Bachet, 1581-1638) Noble francés que estudió rompecabezas numéricos como pasatiempo. Publicó una traducción latina de la \u0026ldquo;Arithmetica\u0026rdquo; de Diofanto, donde incluyó su propia investigación como comentarios.\nWallis (J. Wallis, 1616-1703) Matemático inglés. En su obra principal \u0026ldquo;Arithmetica Infinitorum\u0026rdquo;, dio una forma matemática al concepto de límite y contribuyó a sentar las bases del cálculo.\nBrouncker (W. Brouncker, 1620-1684) Noble irlandés. Primer presidente de la Royal Society (Academia Británica de Ciencias). Entusiasta de las matemáticas que interactuó con Wallis y otros.\nLagrange (J. L. Lagrange, 1736-1813) Matemático francés nacido en Italia. Sucedió a Euler como director del departamento de matemáticas de la Academia de Ciencias de Berlín. Logró grandes resultados en la teoría de números, la mecánica analítica, etc.\nSiegel (C. L. Siegel, 1896-1981) Especialista alemán en teoría de números. Hizo numerosas contribuciones a la teoría analítica de números.\nFibonacci (L. Fibonacci, c. 1175-c. 1250) Matemático italiano. En su obra principal \u0026ldquo;Liber Abaci\u0026rdquo;, utilizó números indo-arábigos y se esforzó por popularizarlos. También discutió los números congruentes en \u0026ldquo;Liber Quadratorum\u0026rdquo;.\nBaker (A. Baker, 1939-) Especialista inglés en teoría de números. Recibió la Medalla Fields junto con Heisuke Hironaka por sus contribuciones a la teoría de números trascendentes.\nPoincaré (J. Poincare, 1854-1912) Matemático francés llamado el último erudito universal de las matemáticas. Dejó obras destacadas en la teoría de funciones automórficas, geometría no euclidiana, ecuaciones diferenciales, mecánica celeste, electrodinámica, etc., así como en la crítica científica.\nMordell (L. J. Mordell, 1888-1972) Matemático nacido en EE. UU. Sus padres eran inmigrantes de Lituania. Tiene muchos artículos sobre la teoría de ecuaciones diofánticas, pero el teorema de Mordell en la teoría de curvas elípticas es particularmente famoso. André Weil amplió esto al caso de las curvas algebraicas generales, y a partir de ahí, la geometría algebraica aritmética experimentó un desarrollo explosivo.\nWeil (A. Weil, 1906-) Matemático francés de ascendencia judía. De joven, se interesó por el último teorema de Fermat y, con el propósito de aplicarlo a la teoría de números, revisó fundamentalmente la geometría algebraica y estableció bases rigurosas. También es conocido por sus escritos sobre la historia de las matemáticas.\nMersenne (M. Mersenne, 1588-1648) Sacerdote católico francés de la Orden de los Mínimos. Facilitó la correspondencia entre matemáticos de varias regiones. El número que lleva el nombre de número de Mersenne es, de hecho, un número ideado por Fermat.\nRoberval (G. P. de Roberval, 1602-1675) Matemático francés. Casi la única persona en ese momento que había obtenido un puesto de profesor como matemático, conocido por su estudio de la cicloide.\nAbel (N. H. Abel, 1802-1829) Matemático noruego. Logró resultados sobresalientes como la imposibilidad de resolver la ecuación general de quinto grado, la teoría de funciones elípticas y la teoría de integrales abelianas, pero murió joven.\nJacobi (K. G. Jacob, 1804-1851) Matemático alemán de ascendencia judía. Dejó grandes resultados en la teoría de funciones elípticas, la teoría de funciones theta, ecuaciones diferenciales, cálculo de variaciones, etc. Introdujo los logros de Abel al mundo. Es conocido por declarar que el propósito de la ciencia es \u0026ldquo;el honor de la mente humana\u0026rdquo; y rechazar el pragmatismo.\nGauss (C. F. Gauss, 1777-1855) El rey de las matemáticas nacido en Alemania. Conocido por la teoría de números, geometría no euclidiana, geodesia, series hipergeométricas, teoría de superficies, estudio del magnetismo terrestre, etc. Era un perfeccionista y se dice que no publicaba resultados a menos que tuvieran un nivel de perfección tan alto que no dejara rastro de su proceso. Su obra principal es \u0026ldquo;Disquisitiones Arithmeticae\u0026rdquo;.\nLamé (G. Lame, 1795-1870) Matemático francés. Contribuyó a la mecánica de la elasticidad, la teoría de la conducción del calor, etc.\nLiouville (J. Liouville, 1809-1882) Matemático francés. Contribuyó a las ecuaciones diferenciales, la teoría de números trascendentes y la teoría de funciones.\nCauchy (A. L. Cauchy, 1789-1857) Matemático francés. Fue prolífico y tuvo muchos logros en física teórica y matemáticas. Se dice que en Francia es tan respetado como Gauss.\nGalois (E. Galois, 1811-1832) Matemático francés. Aclaró el teorema de Abel de que las ecuaciones de grado 5 o superior generalmente no se pueden resolver algebraicamente introduciendo el concepto de grupo. Cayó en un duelo a una edad temprana, pero ahora se sabe que fue provocado por un asunto trivial de mujeres.\nHensel (K, Hensel, 1861-1941) Matemático alemán. Discípulo de Kronecker. Introdujo una teoría llamada sistema p-ádico (análisis p-ádico) en la teoría de números aplicando métodos de teoría de funciones.\nHasse (H. Hesse, 1898-1979) Matemático alemán. Discípulo de Hensel, contribuyó a los fundamentos del análisis p-ádico y su aplicación. Organización de la teoría de campos de clases, estudio de la función L de curvas elípticas, etc.\nKronecker (L. Kronecker, 1823-1891) Matemático alemán de ascendencia judía. Contribuyó a la teoría de funciones elípticas, la teoría de números, etc. También es conocido por abogar por una fundamentación aritmética de las matemáticas, pero su personalidad fuertemente subjetiva le dio una imagen negativa a lo largo de su vida, ya que criticó injustificadamente a su colega de la Universidad de Berlín, Weierstrass, y obstaculizó el empleo de Cantor.\nHilbert (D. Hilbert, 1862-1943) Matemático alemán. Dejó una gran huella en todas las áreas de las matemáticas, incluida la teoría de invariantes, la teoría de números algebraicos y los fundamentos de las matemáticas. Los 23 problemas que propuso en el Congreso Internacional de Matemáticos en París (1900) tuvieron un gran impacto en el desarrollo de las matemáticas.\nRiemann (B. Riemann, 1826-1866) Matemático alemán. Logró grandes resultados relacionados con la esencia de las matemáticas, como el concepto de superficie de Riemann en la teoría de funciones complejas y la geometría de Riemann.\nFaltings (G. Faltings, 1954-) Matemático alemán. Resolvió la conjetura de Mordell en 1983.\nWiles (A, Wiles, 1953-) Matemático nacido en Gran Bretaña. Una figura destacada en este campo, habiendo hecho contribuciones significativas a través de su investigación sobre la conjetura principal de Iwasawa y la conjetura de Birch y Swinnerton-Dyer.\nReferencias ¡El último teorema de Fermat resuelto! Desde Euler hasta la demostración de Wiles (Kodansha)\n","date":"2022-09-22T23:06:37+09:00","image":"http://kenji.blog/p/%E6%95%B0%E5%AD%A6%E3%81%AE%E5%81%89%E4%BA%BA%E3%81%9F%E3%81%A1/img_hu9ac53943fe4f64bfe30a56c18c498d11_667839_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E6%95%B0%E5%AD%A6%E3%81%AE%E5%81%89%E4%BA%BA%E3%81%9F%E3%81%A1/","title":"Grandes Matemáticos"},{"content":"Enumeración de títulos de ventanas Este es el método para enumerar los títulos de las ventanas actualmente abiertas usando PowerShell.\n1 Get-Process|where{$_.mainWindowTItle}|Select-Object MainWindowTitle Ejemplo de salida\n1 2 3 4 5 6 7 8 9 MainWindowTitle --------------- Windows PowerShell Internet Explorer Sin título - Paint Sin título - Bloc de notas Administrador de tareas Experiencia de entrada de Windows Documento - WordPad ","date":"2022-09-20T17:03:15+09:00","image":"http://kenji.blog/p/%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E3%82%BF%E3%82%A4%E3%83%88%E3%83%AB%E3%81%AE%E5%88%97%E6%8C%99/img_huc312ccf5dbdb1b6edae5dc06174466bf_18265_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E3%82%BF%E3%82%A4%E3%83%88%E3%83%AB%E3%81%AE%E5%88%97%E6%8C%99/","title":"Enumeración de títulos de ventanas"},{"content":"Eliminar carpetas grandes rápidamente Al eliminar carpetas grandes en el Explorador, la velocidad es lenta porque primero se realiza una búsqueda completa del contenido de la carpeta antes de ejecutar la eliminación. Al eliminar usando comandos como se muestra a continuación, la búsqueda y la eliminación se ejecutan simultáneamente, lo que permite eliminar carpetas grandes rápidamente.\nNavegue al directorio de la carpeta de destino en el Símbolo del sistema. Ejecute DEL /F /Q /S nombre_de_la_carpeta \u0026gt; NUL. Ejecute RMDIR /Q /S nombre_de_la_carpeta. ","date":"2022-09-20T16:04:02+09:00","image":"http://kenji.blog/p/%E5%A4%A7%E3%81%8D%E3%81%AA%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%83%BC%E3%82%92%E9%AB%98%E9%80%9F%E4%B8%80%E6%8B%AC%E5%89%8A%E9%99%A4/img_hu0a77dc7478cd7b69f58fbada7141acfe_6495_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E5%A4%A7%E3%81%8D%E3%81%AA%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%83%BC%E3%82%92%E9%AB%98%E9%80%9F%E4%B8%80%E6%8B%AC%E5%89%8A%E9%99%A4/","title":"Eliminar carpetas grandes rápidamente"},{"content":"Comando para eliminar todo en Salesforce Chatter Este es un comando para eliminar todas las publicaciones y archivos adjuntos en Salesforce Chatter. Abra la Consola del desarrollador, seleccione \u0026ldquo;Open Execute anonymous Window\u0026rdquo; en el menú Debug, pegue el siguiente código y ejecútelo. Personalmente, lo utilizo cuando la capacidad de almacenamiento de la organización está al límite.\n1 2 3 4 5 6 delete [select id from FeedItem]; delete [select id from FeedAttachment]; delete [select id from ContentDocument]; // Vaciar papelera de reciclaje database.emptyRecycleBin([select id from ContentDocument where IsDeleted = true ALL ROWS]); ","date":"2022-09-19T21:59:14+09:00","image":"http://kenji.blog/p/salesforce%E3%83%81%E3%83%A3%E3%83%83%E3%82%BF%E3%83%BC%E5%85%A8%E6%B6%88%E3%81%97%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/img_1_hu1e12ce6e6e64d4f046faca027a6e75ab_14487_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/salesforce%E3%83%81%E3%83%A3%E3%83%83%E3%82%BF%E3%83%BC%E5%85%A8%E6%B6%88%E3%81%97%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/","title":"Comando para eliminar todo en Salesforce Chatter"},{"content":"Aquí hay una pequeña colección de trucos que uso habitualmente en Windows. Espero que aquellos que acaban de empezar a usar Windows lo encuentren útil. Se asume el uso de Windows 11, pero creo que la mayoría también funcionan en Windows 10.\nCerrar ventana Alt + F4 con la ventana activa Ctrl + W con la ventana activa. Cierra la pestaña o ventana (solo en aplicaciones compatibles) Haz doble clic en el icono a la izquierda de la barra de título de la ventana Haz clic en la × en la barra de título de la ventana Mostrar el escritorio Win + D. Si lo presionas dos veces, vuelve al estado de ventana original. Es útil cuando quieres mostrar el escritorio por un instante. Win + M. Minimiza todas las aplicaciones. No se restaura presionando dos veces. Entrada de voz Win + H. Inicia la entrada de voz. Para detenerla, presiona Esc o Win + H nuevamente. Mostrar el menú contextual clásico en el Explorador Presiona Shift + F10 o la tecla de aplicación. La tecla de aplicación está en la parte inferior derecha del teclado. Capturar una parte de la pantalla Con Win + Shift + S puedes seleccionar un área para capturar la pantalla. Con Win + Print Screen o simplemente Print Screen puedes capturar la pantalla completa. (Si agregas Win, la imagen capturada se guardará en C:\\Users\\nombre_de_usuario\\Pictures\\Screenshots.) Con Alt + Print Screen puedes capturar la ventana actual. Iniciar aplicaciones ancladas a la barra de tareas Puedes iniciar aplicaciones ancladas a la barra de tareas con Win + número. Por ejemplo, al presionar Win + 1 se inicia la primera aplicación a la izquierda en la barra de tareas. Con Win + T puedes enfocar los iconos de la barra de tareas, y si presionas Win + T varias veces, o ← o →, puedes mover la selección y presionar la tecla Enter para iniciar la aplicación seleccionada. Acercar/Alejar Win + + abre la Lupa de Windows. Luego, puedes acercar o alejar la pantalla con Win + + o -. Puedes acercar o alejar con Ctrl + + o - en el bloc de notas, navegador, etc. (solo en aplicaciones compatibles). Bloquear Windows Win + L Ctrl + Alt + Del → Space o Enter Apagar Windows Si presionas Alt + F4 estando en el escritorio (usando Win + M o Win + D) o con la barra de tareas activa (usando Win + T o Win + B), aparecerá un cuadro de diálogo como el siguiente. Asegúrate de que \u0026ldquo;Apagar\u0026rdquo; esté seleccionado y presiona Enter. También puedes usar Win + R → Alt + F4 → Alt + F4. Puedes apagar con Win + X → U → U. En el símbolo del sistema o en \u0026ldquo;Ejecutar\u0026rdquo; (Win + R), escribe shutdown /s /t 0 para apagar. Si agregas /f, se forzará el apagado. Reiniciar Windows Si presionas Alt + F4 estando en el escritorio (usando Win + M o Win + D) o con la barra de tareas activa (usando Win + T o Win + B), aparecerá un cuadro de diálogo como el siguiente. Presiona ↓ una vez para seleccionar \u0026ldquo;Reiniciar\u0026rdquo; y luego Enter. También puedes usar Win + R → Alt + F4 → Alt + F4. Puedes reiniciar con Win + X → U → R. Puedes reiniciar con shutdown /r /t 0. Si agregas /f, se forzará el reinicio. Suspender Windows Si presionas Alt + F4 estando en el escritorio (usando Win + M o Win + D) o con la barra de tareas activa (usando Win + T o Win + B), aparecerá un cuadro de diálogo como el siguiente. Presiona ↑ una vez para seleccionar \u0026ldquo;Suspender\u0026rdquo; y luego Enter. También puedes usar Win + R → Alt + F4 → Alt + F4. Puedes hibernar escribiendo rundll32.exe powrprof.dll,SetSuspendState en Win + R o en el símbolo del sistema. Cerrar sesión de Windows Si presionas Alt + F4 estando en el escritorio (usando Win + M o Win + D) o con la barra de tareas activa (usando Win + T o Win + B), aparecerá un cuadro de diálogo como el siguiente. Presiona ↑ dos veces para seleccionar \u0026ldquo;Cerrar sesión\u0026rdquo; y luego Enter. También puedes usar Win + R → Alt + F4 → Alt + F4. Win + X → U → I Ctrl + Alt + Del → Tab dos veces o ↓ dos veces → Enter o Space Puedes cerrar sesión con logoff. Mover ventanas con el teclado Win + ← : Mover a la izquierda Win + → : Mover a la derecha Win + ↑ : Mover hacia arriba / Maximizar Win + ↓ : Mover hacia abajo / Minimizar Win + Shift + ← o → : Mover entre monitores múltiples Win + Alt + ← o → o ↑ o ↓ : Mover la ventana sin maximizar/minimizar Cuando no está minimizada, presiona Alt + Espacio, luego M y usa las teclas de flecha para mover. ※ Como la ventana sigue al cursor del ratón, puedes recuperarla incluso si está fuera de la pantalla. Finalizar un proceso en el Administrador de tareas Puedes abrir el Administrador de tareas con Ctrl + Shift + Esc. Puedes cambiar de pestaña con Ctrl + Tab. Después de presionar Tab en la pestaña Detalles, puedes buscar un proceso por prefijo usando el teclado alfanumérico. Con el nombre del proceso seleccionado, presiona la tecla Delete y luego Enter para finalizar el proceso. Finalizar un proceso especificando su nombre con un comando Puedes finalizar un proceso con taskkill /f /im nombre_del_proceso. Por ejemplo, taskkill /f /im explorer.exe finalizará el explorador. Iniciar múltiples instancias del mismo programa desde el icono de la barra de tareas Al hacer clic izquierdo mientras mantienes presionada la tecla Shift en la barra de tareas, puedes iniciar múltiples instancias del mismo programa. (Solo aplicaciones que admiten instancias múltiples). Iniciar un programa con privilegios de administrador Al iniciar un programa mientras mantienes presionado Ctrl + Shift, puedes iniciarlo con privilegios de administrador. Iniciar el Explorador Puedes iniciar el Explorador con Win + E. Presiona Win + R para abrir \u0026ldquo;Ejecutar\u0026rdquo;, escribe explorer y presiona Enter. Puedes crear una nueva carpeta con Ctrl + Shift + N. Abrir el símbolo del sistema en la ubicación abierta del Explorador En Windows 11, puedes iniciar el símbolo del sistema desde \u0026ldquo;Terminal\u0026rdquo; en el menú contextual. Además, puedes iniciar el símbolo del sistema escribiendo cmd en la barra de direcciones y presionando la tecla Enter. Mostrar el historial del portapapeles Puedes mostrar el historial del portapapeles con Win + V. Si seleccionas texto o imágenes que copiaste anteriormente, puedes copiarlos nuevamente. Ejecutar Puedes abrir \u0026ldquo;Ejecutar\u0026rdquo; con Win + R. A continuación, se presentan algunos comandos que puedes ejecutar en \u0026ldquo;Ejecutar\u0026rdquo; o en el símbolo del sistema.\nAbrir Edge Escribe msedge y presiona Enter Abrir Internet Explorer 11 (IE11) Escribe powershell.exe -Command \u0026quot;(New-Object -ComObject InternetExplorer.Application).Visible = $true\u0026quot; y presiona Enter Abrir Terminal Escribe wt y presiona Enter Abrir el Panel de control Escribe control y presiona Enter También puedes abrirlo con explorer.exe shell:::{26EE0668-A00A-44D7-9371-BEB064C98683}. Iniciar el Bloc de notas Escribe notepad y presiona Enter Iniciar la Calculadora Escribe calc y presiona Enter Iniciar Paint Escribe mspaint y presiona Enter Iniciar PowerShell Escribe powershell y presiona Enter Iniciar Visual Studio Code Escribe code y presiona Enter Iniciar Excel Escribe excel y presiona Enter ※ Solo si Excel está instalado. Abrir Word Escribe winword y presiona Enter ※ Solo si Word está instalado. Abrir PowerPoint Escribe powerpnt y presiona Enter ※ Solo si PowerPoint está instalado. Abrir Configuración del sistema Escribe msconfig y presiona Enter Abrir Propiedades del sistema Escribe sysdm.cpl y presiona Enter Abrir Información de la versión de Windows Escribe winver y presiona Enter Abrir el Teclado en pantalla Escribe osk y presiona Enter Abrir WordPad Escribe wordpad o write y presiona Enter Abrir el Editor del Registro Escribe regedit y presiona Enter Abrir Programas y características Escribe explorer.exe shell:::{7b81be6a-ce2b-4676-a29e-eb907a5126c5} y presiona Enter Abrir Propiedades del teclado Escribe explorer.exe shell:::{725BE8F7-668E-4C7B-8F90-46BDB0936430} y presiona Enter Abrir Propiedades del mouse Escribe explorer.exe shell:::{6C8EEC18-8D75-41B2-A177-8831D59D2D50} y presiona Enter Abrir Sonido Escribe explorer.exe shell:::{F2DDFC82-8F12-4CDD-B7DC-D4FE1425AA4D} y presiona Enter Abrir Cuentas de usuario Escribe explorer.exe shell:::{60632754-c523-4b62-b45c-4172da012619} y presiona Enter Copiar texto del cuadro de mensaje estándar Puedes copiar el texto de un cuadro de mensaje estándar con Ctrl + C. Al copiar el cuadro de mensaje anterior, se copiará lo siguiente en el portapapeles. 1 2 3 4 5 6 7 [Window Title] WordPad [Main Instruction] ¿Desea guardar los cambios en Documento? [Guardar(S)] [No guardar(N)] [Cancelar] Guardar la salida del símbolo del sistema en el portapapeles Si agregas | clip (tubería + clip) después de un comando, como echo \u0026quot;hello\u0026quot; | clip, puedes copiar la salida estándar al portapapeles.\nExportar la jerarquía de carpetas como texto Puedes usar el comando tree en el símbolo del sistema para generar la jerarquía de carpetas en formato de árbol.\nEjemplo de salida\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 C:. ├─.idea │ └─libraries ├─binaryeditorbz ├─blog │ ├─archetypes │ ├─content │ ├─data │ ├─layouts │ ├─static │ └─themes │ └─PaperMod │ ├─.git │ │ ├─branches │ │ ├─hooks │ │ ├─info │ │ ├─logs │ │ │ └─refs │ │ │ ├─heads │ │ │ └─remotes │ │ │ └─origin │ │ ├─objects │ │ │ ├─info │ │ │ └─pack │ │ └─refs │ │ ├─heads │ │ ├─remotes │ │ │ └─origin │ │ └─tags │ ├─.github │ │ ├─ISSUE_TEMPLATE │ │ └─workflows │ ├─assets │ │ ├─css │ │ │ ├─common │ │ │ ├─core │ │ │ ├─extended │ │ │ ├─hljs │ │ │ └─includes │ │ └─js │ ├─i18n │ ├─images │ └─layouts │ ├─partials │ │ └─templates │ ├─shortcodes │ └─_default │ └─_markup (omitido) Referencias Métodos abreviados de teclado de Windows ","date":"2022-09-18T23:49:29+09:00","image":"http://kenji.blog/p/windows-%E3%81%AE%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E5%B0%8F%E6%8A%80%E9%9B%86/img_hu13a9ab529476901cdea6aea124c07798_315814_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/windows-%E3%81%AE%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E5%B0%8F%E6%8A%80%E9%9B%86/","title":"'Colección de Atajos y Trucos de Windows'"},{"content":"Les presento paint.net, un software de edición de imágenes que utilizo a menudo durante mis tareas de desarrollo.\nPuntos valiosos que no se pueden hacer con Paint estándar de Windows Puede manejar transparencias y niveles de opacidad Puede realizar selecciones automáticas de formas complejas Puede manejar capas Puede ajustar niveles, brillo, contraste, etc. Puede aplicar varios efectos (desenfoque, distorsión, ruido, etc.) Otras características Se puede usar de forma gratuita El funcionamiento es relativamente ligero Uso intuitivo y sin muchas peculiaridades Soporte multilingüe Es un software avanzado pero fácil de usar. Yo mismo aún no he dominado todas sus funciones.\nInstálalo aquí https://www.getpaint.net/download.html\nSi deseas elegir la versión gratuita, haz clic en la parte enmarcada en rojo del enlace a continuación.\nSi lo instalas a través de Microsoft Store tiene un costo, pero a cambio permite actualizaciones automáticas. Incluso con la versión gratuita, te notifica sobre la información de actualización más reciente, por lo que puedes actualizar de manera muy sencilla.\n","date":"2022-09-14T19:33:31+09:00","image":"http://kenji.blog/p/paint.net%E3%81%AE%E9%AD%85%E5%8A%9B/img_hu407db422a0531b2d8a8b6fa0ee25fc6c_64699_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/paint.net%E3%81%AE%E9%AD%85%E5%8A%9B/","title":"El atractivo de paint.net"},{"content":"Para configurar un dominio personalizado en un repositorio de Github, necesitas cambiar la configuración DNS del dominio. Aquí, explicaremos asumiendo que administras el dominio con Onamae.com . Puedes realizar la misma configuración reescribiendo el registro A en otros registradores.\nCambiar la configuración de DNS en Onamae.com Para cambiar la configuración de DNS de tu dominio, inicia sesión en el panel de administración de Onamae.com . Después de iniciar sesión, ve a la pantalla de gestión de dominios. Una vez en la pantalla de gestión de dominios, cambia la configuración de DNS. Para cambiar la configuración de DNS, configúralo de la siguiente manera:\nAccede a https://www.onamae.com/ y haz clic en \u0026ldquo;Onamae.com Navi Login\u0026rdquo;. Ingresa tu \u0026ldquo;ID de Onamae (ID de miembro)\u0026rdquo; y \u0026ldquo;Contraseña\u0026rdquo; y haz clic en el botón de inicio de sesión. Haz clic en \u0026ldquo;Configuración de servidores de nombres\u0026rdquo; (ネームサーバーの設定). Haz clic en \u0026ldquo;Configuración DNS del dominio\u0026rdquo; (ドメインのDNS設定). Selecciona el dominio que deseas configurar y haz clic en \u0026ldquo;Siguiente\u0026rdquo; (次へ). Haz clic en \u0026ldquo;Configurar\u0026rdquo; (設定する) a la derecha de \u0026ldquo;Usar configuración de registros DNS\u0026rdquo; (DNSレコード設定を利用する). Selecciona A en TYPE, ingresa 3600 en TTL, e ingresa \u0026ldquo;185.199.108.153\u0026rdquo; en VALUE, y haz clic en \u0026ldquo;Añadir\u0026rdquo; (追加). Al igual que en el paso 7, añade también \u0026ldquo;185.199.109.153\u0026rdquo;, \u0026ldquo;185.199.110.153\u0026rdquo; y \u0026ldquo;185.199.111.153\u0026rdquo;. Asegúrate de que esté marcada la casilla en \u0026ldquo;Confirmación de cambio de servidor de nombres para configuración de registros DNS\u0026rdquo; (DNSレコード設定用ネームサーバー変更確認) y haz clic en \u0026ldquo;Ir a la pantalla de configuración\u0026rdquo; (設定画面へ進む). Si aparece una pantalla que dice \u0026ldquo;Para evitar cambios no deseados en la configuración de DNS\u0026rdquo; (意図しないDNS設定変更を防ぐために), haz clic en \u0026ldquo;No configurar\u0026rdquo; (設定しない) (selecciónalo según sea necesario). Confirma los detalles de la configuración y haz clic en \u0026ldquo;Configurar\u0026rdquo; (設定する). Con esto concluye la configuración de DNS. Puede tardar hasta 72 horas en reflejarse completamente. Si no se refleja después de 72 horas, intenta contactar al soporte de Onamae.com. Para verificar si la configuración se ha reflejado en tu entorno local, intenta ejecutar los siguientes comandos. Reemplaza example.com con el dominio que deseas verificar.\nPara Linux y Mac 1 dig example.com +noall +answer -t A Si el resultado se ve así, la configuración se ha reflejado.\n1 2 3 4 example.com. 0 IN A 185.199.108.153 example.com. 0 IN A 185.199.109.153 example.com. 0 IN A 185.199.110.153 example.com. 0 IN A 185.199.111.153 Para Windows 1 nslookup -q=a example.com 8.8.8.8 Si el resultado se ve así, la configuración se ha reflejado.\n1 2 3 4 5 6 7 8 9 Servidor: dns.google Address: 8.8.8.8 Respuesta no autoritativa: Nombre: example.com Addresses: 185.199.108.153 185.199.109.153 185.199.110.153 185.199.111.153 Configurar un dominio personalizado en un repositorio de Github Abre la página del repositorio y haz clic en \u0026ldquo;Settings\u0026rdquo; (Configuración). Haz clic en \u0026ldquo;Pages\u0026rdquo;. Si vas a publicar el código fuente del repositorio tal cual, selecciona \u0026ldquo;Deploy from a branch\u0026rdquo; en Source. Si vas a compilar el código fuente con HUGO u otro generador, selecciona \u0026ldquo;GitHub Actions\u0026rdquo;. En Branch, selecciona la rama que deseas publicar y haz clic en \u0026ldquo;Save\u0026rdquo;. En \u0026ldquo;Custom domain\u0026rdquo;, ingresa el dominio que adquiriste y haz clic en \u0026ldquo;Save\u0026rdquo;. Si es necesario, marca la casilla \u0026ldquo;Enforce HTTPS\u0026rdquo; para habilitar el soporte HTTPS. [PR] ","date":"2022-09-13T01:16:40+09:00","image":"http://kenji.blog/p/github%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AB%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/images/octocat_hu8f3e107f91a1c645c9aa316280652835_20372_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/github%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AB%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"Cómo configurar un dominio personalizado en un repositorio de Github"},{"content":"El uso del comando dotnet.exe permite incluso compilar programas sencillos, por lo que resulta útil tenerlo listo para su uso.\nInstalación del SDK de .NET Dado que dotnet.exe está incluido en el SDK de .NET, primero instalaremos el SDK de .NET. Abra cmd.exe con privilegios de administrador y ejecute el siguiente comando.\n1 winget install Microsoft.DotNet.SDK.6 Generar .gitignore El comando para generar un archivo .gitignore con dotnet.exe es el siguiente.\n1 dotnet new gitignore El archivo .gitignore generado es el siguiente.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 ## Ignore Visual Studio temporary files, build results, and ## files generated by popular Visual Studio add-ons. ## ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore # User-specific files *.rsuser *.suo *.user *.userosscache *.sln.docstates # User-specific files (MonoDevelop/Xamarin Studio) *.userprefs # Mono auto generated files mono_crash.* # Build results [Dd]ebug/ [Dd]ebugPublic/ [Rr]elease/ [Rr]eleases/ x64/ x86/ [Ww][Ii][Nn]32/ [Aa][Rr][Mm]/ [Aa][Rr][Mm]64/ bld/ [Bb]in/ [Oo]bj/ [Ll]og/ [Ll]ogs/ # Visual Studio 2015/2017 cache/options directory .vs/ # Uncomment if you have tasks that create the project\u0026#39;s static files in wwwroot #wwwroot/ # Visual Studio 2017 auto generated files Generated\\ Files/ # MSTest test Results [Tt]est[Rr]esult*/ [Bb]uild[Ll]og.* # NUnit *.VisualState.xml TestResult.xml nunit-*.xml # Build Results of an ATL Project [Dd]ebugPS/ [Rr]eleasePS/ dlldata.c # Benchmark Results BenchmarkDotNet.Artifacts/ # .NET project.lock.json project.fragment.lock.json artifacts/ # Tye .tye/ # ASP.NET Scaffolding ScaffoldingReadMe.txt # StyleCop StyleCopReport.xml # Files built by Visual Studio *_i.c *_p.c *_h.h *.ilk *.meta *.obj *.iobj *.pch *.pdb *.ipdb *.pgc *.pgd *.rsp *.sbr *.tlb *.tli *.tlh *.tmp *.tmp_proj *_wpftmp.csproj *.log *.vspscc *.vssscc .builds *.pidb *.svclog *.scc # Chutzpah Test files _Chutzpah* # Visual C++ cache files ipch/ *.aps *.ncb *.opendb *.opensdf *.sdf *.cachefile *.VC.db *.VC.VC.opendb # Visual Studio profiler *.psess *.vsp *.vspx *.sap # Visual Studio Trace Files *.e2e # TFS 2012 Local Workspace $tf/ # Guidance Automation Toolkit *.gpState # ReSharper is a .NET coding add-in _ReSharper*/ *.[Rr]e[Ss]harper *.DotSettings.user # TeamCity is a build add-in _TeamCity* # DotCover is a Code Coverage Tool *.dotCover # AxoCover is a Code Coverage Tool .axoCover/* !.axoCover/settings.json # Coverlet is a free, cross platform Code Coverage Tool coverage*.json coverage*.xml coverage*.info # Visual Studio code coverage results *.coverage *.coveragexml # NCrunch _NCrunch_* .*crunch*.local.xml nCrunchTemp_* # MightyMoose *.mm.* AutoTest.Net/ # Web workbench (sass) .sass-cache/ # Installshield output folder [Ee]xpress/ # DocProject is a documentation generator add-in DocProject/buildhelp/ DocProject/Help/*.HxT DocProject/Help/*.HxC DocProject/Help/*.hhc DocProject/Help/*.hhk DocProject/Help/*.hhp DocProject/Help/Html2 DocProject/Help/html # Click-Once directory publish/ # Publish Web Output *.[Pp]ublish.xml *.azurePubxml # Note: Comment the next line if you want to checkin your web deploy settings, # but database connection strings (with potential passwords) will be unencrypted *.pubxml *.publishproj # Microsoft Azure Web App publish settings. Comment the next line if you want to # checkin your Azure Web App publish settings, but sensitive information contained # in these scripts will be unencrypted PublishScripts/ # NuGet Packages *.nupkg # NuGet Symbol Packages *.snupkg # The packages folder can be ignored because of Package Restore **/[Pp]ackages/* # except build/, which is used as an MSBuild target. !**/[Pp]ackages/build/ # Uncomment if necessary however generally it will be regenerated when needed #!**/[Pp]ackages/repositories.config # NuGet v3\u0026#39;s project.json files produces more ignorable files *.nuget.props *.nuget.targets # Microsoft Azure Build Output csx/ *.build.csdef # Microsoft Azure Emulator ecf/ rcf/ # Windows Store app package directories and files AppPackages/ BundleArtifacts/ Package.StoreAssociation.xml _pkginfo.txt *.appx *.appxbundle *.appxupload # Visual Studio cache files # files ending in .cache can be ignored *.[Cc]ache # but keep track of directories ending in .cache !?*.[Cc]ache/ # Others ClientBin/ ~$* *~ *.dbmdl *.dbproj.schemaview *.jfm *.pfx *.publishsettings orleans.codegen.cs # Including strong name files can present a security risk # (https://github.com/github/gitignore/pull/2483#issue-259490424) #*.snk # Since there are multiple workflows, uncomment next line to ignore bower_components # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) #bower_components/ # RIA/Silverlight projects Generated_Code/ # Backup \u0026amp; report files from converting an old project file # to a newer Visual Studio version. Backup files are not needed, # because we have git ;-) _UpgradeReport_Files/ Backup*/ UpgradeLog*.XML UpgradeLog*.htm ServiceFabricBackup/ *.rptproj.bak # SQL Server files *.mdf *.ldf *.ndf # Business Intelligence projects *.rdl.data *.bim.layout *.bim_*.settings *.rptproj.rsuser *- [Bb]ackup.rdl *- [Bb]ackup ([0-9]).rdl *- [Bb]ackup ([0-9][0-9]).rdl # Microsoft Fakes FakesAssemblies/ # GhostDoc plugin setting file *.GhostDoc.xml # Node.js Tools for Visual Studio .ntvs_analysis.dat node_modules/ # Visual Studio 6 build log *.plg # Visual Studio 6 workspace options file *.opt # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) *.vbw # Visual Studio LightSwitch build output **/*.HTMLClient/GeneratedArtifacts **/*.DesktopClient/GeneratedArtifacts **/*.DesktopClient/ModelManifest.xml **/*.Server/GeneratedArtifacts **/*.Server/ModelManifest.xml _Pvt_Extensions # Paket dependency manager .paket/paket.exe paket-files/ # FAKE - F# Make .fake/ # CodeRush personal settings .cr/personal # Python Tools for Visual Studio (PTVS) __pycache__/ *.pyc # Cake - Uncomment if you are using it # tools/** # !tools/packages.config # Tabs Studio *.tss # Telerik\u0026#39;s JustMock configuration file *.jmconfig # BizTalk build output *.btp.cs *.btm.cs *.odx.cs *.xsd.cs # OpenCover UI analysis results OpenCover/ # Azure Stream Analytics local run output ASALocalRun/ # MSBuild Binary and Structured Log *.binlog # NVidia Nsight GPU debugger configuration file *.nvuser # MFractors (Xamarin productivity tool) working folder .mfractor/ # Local History for Visual Studio .localhistory/ # BeatPulse healthcheck temp database healthchecksdb # Backup folder for Package Reference Convert tool in Visual Studio 2017 MigrationBackup/ # Ionide (cross platform F# VS Code tools) working folder .ionide/ # Fody - auto-generated XML schema FodyWeavers.xsd ## ## Visual studio for Mac ## # globs Makefile.in *.userprefs *.usertasks config.make config.status aclocal.m4 install-sh autom4te.cache/ *.tar.gz tarballs/ test-results/ # Mac bundle stuff *.dmg *.app # content below from: https://github.com/github/gitignore/blob/master/Global/macOS.gitignore # General .DS_Store .AppleDouble .LSOverride # Icon must end with two \\r Icon # Thumbnails ._* # Files that might appear in the root of a volume .DocumentRevisions-V100 .fseventsd .Spotlight-V100 .TemporaryItems .Trashes .VolumeIcon.icns .com.apple.timemachine.donotpresent # Directories potentially created on remote AFP share .AppleDB .AppleDesktop Network Trash Folder Temporary Items .apdisk # content below from: https://github.com/github/gitignore/blob/master/Global/Windows.gitignore # Windows thumbnail cache files Thumbs.db ehthumbs.db ehthumbs_vista.db # Dump file *.stackdump # Folder config file [Dd]esktop.ini # Recycle Bin used on file shares $RECYCLE.BIN/ # Windows Installer files *.cab *.msi *.msix *.msm *.msp # Windows shortcuts *.lnk # JetBrains Rider .idea/ *.sln.iml ## ## Visual Studio Code ## .vscode/* !.vscode/settings.json !.vscode/tasks.json !.vscode/launch.json !.vscode/extensions.json Hay muchos archivos para Visual Studio, pero también se incluyen elementos que generalmente no necesitan ser gestionados en git, como \u0026ldquo;.DS_Store\u0026rdquo; de Mac.\nSitios de referencia Instalar .NET en Windows ","date":"2022-09-13T00:25:12+09:00","image":"http://kenji.blog/p/dotnet%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7.gitignore%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B/img_1_huc51d4f51d02497db3544f94dd1182dc1_19208_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/dotnet%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7.gitignore%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B/","title":"Generar .gitignore con el comando dotnet"},{"content":"Al recordar mis juegos favoritos, terminó siendo solo mi salón de la fama. Como hay muchos juegos antiguos, si aún no los has jugado, por favor pruébalos.\nGame Boy La Game Boy original es una consola portátil lanzada por Nintendo en 1989. Posteriormente, se lanzaron sucesoras como Game Boy Color y Game Boy Advance.\n① Sa·Ga 2: Hihou Densetsu Un juego RPG lanzado en 1990 por Square (actualmente Square Enix). Con una historia que consiste en recolectar de forma insistente tesoros llamados \u0026ldquo;Hihou\u0026rdquo; en diversos escenarios, fue el primer juego RPG que jugué.\n② Kirby\u0026rsquo;s Dream Land (Hoshi no Kirby) Un juego de acción lanzado en 1992 por Nintendo. El desarrollador es HAL Laboratory. Un juego en el que avanzas aspirando a los enemigos o tragando aire para flotar. La música y los efectos de sonido también están muy bien hechos, resultando en una obra muy rítmica para jugar.\n③ Pokémon Rojo y Verde Un juego RPG lanzado en 1996 por Nintendo. Desarrollado por Nintendo EAD, Game Freak y Creatures. Después de eso, se adaptó al anime y se volvió explosivamente popular, pero yo solo he jugado esta primera generación.\nSuper Famicom (Super Nintendo) Una consola de videojuegos doméstica lanzada por Nintendo en 1990. En el extranjero también se la conoce como SNES (Super Nintendo Entertainment System).\n④ Super Mario Kart Un software para Super Famicom lanzado en 1992 por Nintendo. Un juego de carreras en el que compites por la posición mientras obstaculizas a los oponentes lanzando ítems como caparazones y plátanos. Recuerdo haber jugado junto con mi familia y amigos.\n⑤ Dragon Quest V: La novia celestial Un juego RPG lanzado en 1992 por Enix. Es un juego que tiene el elemento de elegir una pareja de matrimonio, y el elemento de poder hacer que los monstruos derrotados se unan a ti. Jugué de manera exhaustiva hasta lograr que múltiples burbujimos metálicos (Hagure Metal) se unieran a mí.\n⑥ Final Fantasy V Un juego RPG lanzado en 1992 por Square. Tiene el elemento de rejugabilidad de seleccionar trabajos (jobs) y dominar las habilidades. Al igual que con Dragon Quest, recuerdo haber subido de nivel incansablemente en las cuevas.\n⑦ Torneko no Daibouken: Fushigi no Dungeon Un juego roguelike lanzado en 1993 por Chunsoft. El predecesor de la serie Fushigi no Dungeon (Mundo Misterioso). La característica principal es que la forma del calabozo cambia de forma aleatoria cada vez. Su eslogan es \u0026ldquo;El RPG que puedes jugar 1000 veces\u0026rdquo;.\n⑧ Fushigi no Dungeon 2: Fuurai no Shiren Un juego roguelike lanzado en 1995 por Chunsoft. Secuela de \u0026ldquo;Torneko no Daibouken\u0026rdquo; de la serie Fushigi no Dungeon. Hay tiendas dentro del calabozo donde puedes comprar artículos. (Si sales de la tienda sin comprar, el dueño de la tienda te perseguirá).\n⑨ MOTHER 2 (EarthBound) La segunda entrega de la serie MOTHER, lanzada en 1994 por Nintendo. Desarrollado por Ape y HAL Laboratory. Posteriormente, en 2006, se lanzó MOTHER 3. Es una obra producida por Shigesato Itoi, y está llena de una visión del mundo única y palabras filosóficas.\n⑩ The Legend of Zelda: A Link to the Past (Kamigami no Triforce) Un juego de acción y aventura lanzado en 1991 por Nintendo. Un juego en el que avanzas recolectando varios ítems y resolviendo pequeños acertijos. Después se han lanzado varias secuelas. (Referencia)\nNintendo Switch Consola de videojuegos doméstica lanzada por Nintendo en 2017.\n⑪ Splatoon 2 Un juego de disparos de acción lanzado por Nintendo en 2017. Un juego en el que aspiras a la victoria asegurando territorio con tinta y derrotando a los oponentes. En 2022 se lanzó la secuela, Splatoon 3.\n","date":"2022-09-12T19:28:50+09:00","image":"http://kenji.blog/p/%E5%A5%BD%E3%81%8D%E3%81%AA%E3%82%B2%E3%83%BC%E3%83%A011%E9%81%B8/img_12_hu03b5dadc912359ffea73dab76258d285_471079_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E5%A5%BD%E3%81%8D%E3%81%AA%E3%82%B2%E3%83%BC%E3%83%A011%E9%81%B8/","title":"'11 Juegos Favoritos'"},{"content":"El comando para evitar la creación automática de .DS_Store en macOS es el siguiente. Ejecútalo en la terminal.\n1 defaults write com.apple.desktopservices DSDontWriteNetworkStores true Después de ejecutar el comando, reinicia el Finder.\n1 killall Finder Para restaurar la configuración, ejecuta el siguiente comando.\n1 defaults delete com.apple.desktopservices DSDontWriteNetworkStores false Al igual que en el paso anterior, después de cambiar la configuración, reinicia el Finder.\n1 killall Finder ","date":"2022-09-12T16:03:42+09:00","image":"http://kenji.blog/p/macos%E3%81%A7.ds_store%E3%82%92%E8%87%AA%E5%8B%95%E7%94%9F%E6%88%90%E3%81%97%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/img_hu4b5bbd3b572a7a7eb2cc4ecf633430af_78743_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/macos%E3%81%A7.ds_store%E3%82%92%E8%87%AA%E5%8B%95%E7%94%9F%E6%88%90%E3%81%97%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/","title":"'Comando para evitar la creación automática de .DS_Store en macOS'"},{"content":"Navega al directorio de destino y ejecuta el siguiente comando para eliminar de forma masiva los archivos .DS_Store, incluyendo los de las subcarpetas.\n1 Get-ChildItem . -include \u0026#39;.DS_Store\u0026#39; -Recurse -Force | Remove-Item -Force ","date":"2022-09-12T10:11:42+09:00","image":"http://kenji.blog/p/powershell%E3%81%A7.ds_store%E3%82%92%E4%B8%80%E6%8B%AC%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B/img_hu95c0724bd9a903eadf46c7f648acb682_8907_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/powershell%E3%81%A7.ds_store%E3%82%92%E4%B8%80%E6%8B%AC%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B/","title":"Eliminar .DS_Store por lotes con PowerShell"},{"content":"Códigos cortos que se pueden usar en HUGO YouTube {{\u0026lt;youtube 123456abc\u0026gt;}}\nTwitter {{\u0026lt;twitter 123456abc\u0026gt;}}\nInstagram {{\u0026lt;instagram 123456abc\u0026gt;}}\nFlickr {{\u0026lt;flickr 123456abc\u0026gt;}}\nVimeo {{\u0026lt;vimeo 123456abc\u0026gt;}}\nOtros Shortcodes\nAparte Si desea expresar {{\u0026lt; foo \u0026gt;}} en el sitio, debe escribir {{\u0026lt;/* foo */\u0026gt;}}.\n","date":"2022-09-11T22:59:52+09:00","image":"http://kenji.blog/p/hugo%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%B3%E3%83%BC%E3%83%89/img_hu415dc7e70376ac350673d0366f70ca4b_19909_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/hugo%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%B3%E3%83%BC%E3%83%89/","title":"Códigos cortos que se pueden usar en HUGO"},{"content":"El diseño por defecto coloca las imágenes en el centro con un 100% de ancho, pero como a veces sentía que eran demasiado grandes, intenté hacer que la imagen se acomodara debajo del título y cambiar el ancho a unos 150px.\nLos cambios en los archivos son los siguientes.\nblank.css Para cambiar los márgenes, el tamaño de la imagen y las líneas de visualización de texto, agregamos el siguiente código a blank.css.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 .entry-content { -webkit-line-clamp: 4; } .entry-footer { text-align: right; } .entry-cover { margin-bottom: initial; text-align: center; } .entry-cover img { border-radius: 4px; display: inline; max-width: 100%; } .post-meta { display: block; text-align: right; } post-entry.css Como no se pudo eliminar la definición en el lado de blank.css, eliminamos una línea de post-entry.css en la siguiente ubicación.\n1 2 3 4 5 6 .entry-cover img { border-radius: var(--radius); pointer-events: none; /* width: 100%; */ ← Eliminar esta línea height: auto; } list.html Para cambiar la disposición de las imágenes, modificamos las siguientes partes de list.html.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 \u0026lt;article class=\u0026#34;{{ $class }}\u0026#34;\u0026gt; \u0026lt;!-- {{- $isHidden := (site.Params.cover.hidden | default site.Params.cover.hiddenInList) }} --\u0026gt;\u0026lt;!-- Mover abajo --\u0026gt; \u0026lt;!-- {{- partial \u0026#34;cover.html\u0026#34; (dict \u0026#34;cxt\u0026#34; . \u0026#34;IsHome\u0026#34; true \u0026#34;isHidden\u0026#34; $isHidden) }} --\u0026gt;\u0026lt;!-- Mover abajo --\u0026gt; \u0026lt;header class=\u0026#34;entry-header\u0026#34;\u0026gt; \u0026lt;h2\u0026gt; {{- .Title }} {{- if .Draft }}\u0026lt;sup\u0026gt;\u0026lt;span class=\u0026#34;entry-isdraft\u0026#34;\u0026gt;\u0026amp;nbsp;\u0026amp;nbsp;[draft]\u0026lt;/span\u0026gt;\u0026lt;/sup\u0026gt;{{- end }} \u0026lt;/h2\u0026gt; \u0026lt;/header\u0026gt; \u0026lt;div style=\u0026#34;display:flex;\u0026#34;\u0026gt;\u0026lt;!-- Añadido --\u0026gt; \u0026lt;div style=\u0026#34;max-width:150px;margin:11px 15px 0px 0px;\u0026#34;\u0026gt;\u0026lt;!-- Añadido --\u0026gt; {{- $isHidden := (site.Params.cover.hidden | default site.Params.cover.hiddenInList) }}\u0026lt;!-- Movido desde arriba --\u0026gt; {{- partial \u0026#34;cover.html\u0026#34; (dict \u0026#34;cxt\u0026#34; . \u0026#34;IsHome\u0026#34; true \u0026#34;isHidden\u0026#34; $isHidden) }}\u0026lt;!-- Movido desde arriba --\u0026gt; \u0026lt;/div\u0026gt;\u0026lt;!-- Añadido --\u0026gt; \u0026lt;div style=\u0026#34;width:100%;\u0026#34;\u0026gt;\u0026lt;!-- Añadido --\u0026gt; {{- if (ne (.Param \u0026#34;hideSummary\u0026#34;) true) }} \u0026lt;div class=\u0026#34;entry-content\u0026#34;\u0026gt; \u0026lt;p\u0026gt;{{ .Summary | plainify | htmlUnescape }}{{ if .Truncated }}...{{ end }}\u0026lt;/p\u0026gt; \u0026lt;/div\u0026gt; {{- end }} {{- if not (.Param \u0026#34;hideMeta\u0026#34;) }} \u0026lt;footer class=\u0026#34;entry-footer\u0026#34;\u0026gt; {{- partial \u0026#34;post_meta.html\u0026#34; . -}} \u0026lt;/footer\u0026gt; {{- end }} \u0026lt;a class=\u0026#34;entry-link\u0026#34; aria-label=\u0026#34;post link to {{ .Title | plainify }}\u0026#34; href=\u0026#34;{{ .Permalink }}\u0026#34;\u0026gt;\u0026lt;/a\u0026gt; \u0026lt;/div\u0026gt;\u0026lt;!-- Añadido --\u0026gt; \u0026lt;/div\u0026gt;\u0026lt;!-- Añadido --\u0026gt; \u0026lt;/article\u0026gt; Parece que hay bastantes peticiones similares.\nhttps://github.com/adityatelange/hugo-PaperMod/discussions/159#discussioncomment-247844\nSería de agradecer que lo soportaran en la versión original.\n","date":"2022-09-11T18:50:40+09:00","image":"http://kenji.blog/p/papermod%E3%81%AE%E7%94%BB%E5%83%8F%E3%81%AE%E9%85%8D%E7%BD%AE%E5%A4%89%E6%9B%B4/images/img_hu42e770ebe6b22298fe9d1751d1191316_24734_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/papermod%E3%81%AE%E7%94%BB%E5%83%8F%E3%81%AE%E9%85%8D%E7%BD%AE%E5%A4%89%E6%9B%B4/","title":"'Cambio de disposición de imágenes en PaperMod'"},{"content":"Introducción El tema PaperMod soporta Twitter Cards. Sin embargo, la configuración de Twitter Card debe escribirse en config.toml o en la información de cabecera de los archivos *.md de cada artículo. Si se configura tanto en cada artículo como en config.toml, la información de cabecera de cada artículo tendrá prioridad.\nMétodo de configuración config.toml En config.toml, agrega un elemento llamado images bajo [params]. En images, escribe la ruta de la imagen que se mostrará en la Twitter Card. Si colocas la imagen en la carpeta static, solo necesitas especificar el nombre del archivo.\n1 2 [params] images = [\u0026#34;twitter_card.jpg\u0026#34;] Estructura de carpetas\n1 2 3 4 5 6 7 8 9 10 root │ config.toml (Escribir aquí) ├─content │ └─posts │ └─carpeta del artículo │ │ index.md (Escribir aquí) │ └─images │ cover.png (Colocar aquí) └─static twitter_card.jpg (Colocar aquí) Información de cabecera de cada artículo En la información de cabecera de cada artículo, agrega un elemento llamado image bajo cover. Si configuras relative como true, puedes especificarlo con una ruta relativa desde el archivo *.md del artículo.\n1 2 3 cover: image: \u0026#34;images/cover.jpg\u0026#34; relative: true Si no deseas que se muestre en la parte superior del artículo Si no deseas mostrar la imagen de portada en la parte superior del artículo, agrega un elemento llamado hidden bajo cover y configúralo como true.\n1 2 3 4 cover: image: \u0026#34;images/cover.jpg\u0026#34; relative: true hidden: true Sobre el tamaño de la imagen En la especificación actual de PaperMod, parece que el tamaño de Twitter Card solo soporta summary_large_image. El tamaño adecuado (resolución) para summary_large_image tiene varias opiniones, pero parece que alrededor de 800 x 418 (proporción de imagen 1.91:1) es una buena opción.\nSitio de referencia 1 Sitio de referencia 2\nSi es posible, se recomienda redimensionar la imagen antes de publicarla.\nMétodo de confirmación de la configuración Para confirmar la configuración de Twitter Card, utiliza el Twitter Card Validator. Sin embargo, en mi entorno la vista previa no se mostraba correctamente, por lo que si no se muestra la vista previa, se recomienda verificarlo una vez antes de publicar usando una cuenta privada, etc.\n","date":"2022-09-10T18:41:22+09:00","image":"http://kenji.blog/p/papermod%E3%81%A7twitter-card%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/images/img_hu5e280b2f775d1811bb256626ef7709c6_973665_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/papermod%E3%81%A7twitter-card%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"Cómo configurar Twitter Card en PaperMod"},{"content":"Introducción GitHub Copilot es una herramienta de autocompletado de código basada en IA desarrollada por GitHub. Al instalar el plugin de GitHub Copilot en el entorno de desarrollo IntelliJ IDEA, puedes usar GitHub Copilot en IntelliJ IDEA. Para activarlo, se requiere una cuenta de GitHub.\nMétodo de instalación Selecciona Settings desde el menú File en IntelliJ IDEA. Selecciona Plugins y busca \u0026ldquo;GitHub Copilot\u0026rdquo; en la búsqueda. Instala usando el botón de instalación. Presiona el botón Restart IDE para reiniciar IntelliJ IDEA. La instalación se completa después de reiniciar IntelliJ IDEA. Activación Haz clic en el ícono en la parte inferior derecha. Haz clic en Login to Github. Haz clic en el botón Copy and Open. Se abrirá el navegador, inicia sesión en GitHub si no lo has hecho, pega el código con Ctrl+V y haz clic en el botón Continue. Haz clic en el botón Authorize GitHub Copilot Plugin. La activación se completa si se muestra la pantalla anterior. Probándolo Cuando escribes unos pocos caracteres en el editor de IntelliJ IDEA, GitHub Copilot comenzará a sugerir la continuación del código. ¡Así que disfruta de la poderosa función de autocompletado impulsada por IA!\n","date":"2022-09-10T09:44:55+09:00","image":"http://kenji.blog/p/intellij-idea%E3%81%A7github-copilot%E3%82%92%E4%BD%BF%E3%81%86/images/img_hu78c7d99017ff4692861292fedffeefef_291492_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/intellij-idea%E3%81%A7github-copilot%E3%82%92%E4%BD%BF%E3%81%86/","title":"Uso de GitHub Copilot en IntelliJ IDEA"},{"content":"Introducción Go es un lenguaje de programación relativamente nuevo publicado por Google en 2009. El compilador, las herramientas y las bibliotecas de Go se publican como código abierto. Además, Go es un lenguaje de tipado estático como C y Java, pero es un lenguaje que no utiliza punteros como el lenguaje C.\nMétodo de instalación Instalar Go\nDesde el sitio anterior, se publican instaladores para cada plataforma.\nSiga la pantalla para proceder con la instalación. La instalación se ha completado. Es fácil, ¿verdad?\nPrimer programa Guarde el siguiente programa como hello.go.\n1 2 3 4 5 6 7 package main import \u0026#34;fmt\u0026#34; func main() { fmt.Printf(\u0026#34;Hello World\\n\u0026#34;) } Al ejecutar go run hello.go desde el símbolo del sistema o la terminal, se mostrará Hello, world!.\nSi desea compilarlo, al ejecutar go build hello.go, se generará hello.exe. Al ejecutar hello.exe, se mostrará Hello, world!.\nTambién puede ejecutar código en la página web https://go.dev/play/\nDocumentación en japonés http://go.shibu.jp/\nLas explicaciones necesarias para aprender Go están concentradas en el enlace anterior (versión traducida al japonés). Dado que la tecnología relacionada con Go es abierta, es tan completa que no es necesario comprar textos en papel.\n¡Entonces, que disfrutes de tu vida con Go!\n","date":"2022-09-10T00:48:17+09:00","image":"http://kenji.blog/p/go%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/images/cover_hu90f0e026fa77d6f7268f9adc11e245d4_5801_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/go%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/","title":"Cómo instalar Go"},{"content":"¿Qué es la dialéctica de Hegel? Hegel captó el significado positivo de las contradicciones en las que cae la razón, y sostuvo que, en general, todas las cosas finitas generan sus opuestos impulsadas por sus contradicciones inherentes y, a través de esta mediación, ambas se superan hacia una etapa superior. Afirmó que este es el principio de todo movimiento en el mundo real. (De Kotobank)\nMi interpretación es que todas las doctrinas y pensamientos del mundo real no son simplemente correctos de manera absoluta, sino que inevitablemente contienen contradicciones internas, y al comprender e integrar esa estructura de oposición, nuestra percepción evoluciona hacia un nivel superior.\nCreo que esto se aplica no solo a la forma de pensar de las personas, sino también a todos los fenómenos del mundo natural.\nEn toda la materia, si hay una acción, hay una reacción; si todo se mueve, hay fricción. La gravedad no solo existe para el sol y la Tierra, sino que todas las sustancias se influyen mutuamente. El flujo de un río y el flujo del viento no fluyen simplemente en una sola dirección, sino que, al recibir diversas fuerzas, su flujo cambia en un instante.\nHablando en términos técnicos, los programas de computadora también contienen inevitablemente errores (bugs) en su interior, y al eliminarlos, se desarrollan en programas de mayor nivel. Creo que se puede decir que un programa sin errores es un programa aburrido que no ha evolucionado. Tarde o temprano, quedará obsoleto.\nEl entorno que nos rodea cambia constantemente con la época. En lugar de ignorar nuestras propias contradicciones, justificarlas de manera extraña o fijar nuestra forma de pensar, me gustaría revisar constantemente mi forma de pensar y de percibir las cosas, y cambiar mi pensamiento de manera flexible.\n","date":"2022-09-09T23:13:19+09:00","image":"http://kenji.blog/p/%E3%83%98%E3%83%BC%E3%82%B2%E3%83%AB%E3%81%AE%E5%BC%81%E8%A8%BC%E6%B3%95/images/img_huf44f6813611a65fb4bf58b8763a4133a_83624_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E3%83%98%E3%83%BC%E3%82%B2%E3%83%AB%E3%81%AE%E5%BC%81%E8%A8%BC%E6%B3%95/","title":"La dialéctica de Hegel"},{"content":"Fui a Kamukura (Ramen) por primera vez en varios años.\nRamen de cebolla verde y kimchi\nEstaba delicioso. Es un sabor que a veces te dan ganas de comer.\n","date":"2022-09-09T21:45:19+09:00","image":"http://kenji.blog/p/%E4%BD%95%E5%B9%B4%E3%81%8B%E3%81%B6%E3%82%8A%E3%81%AE%E7%A5%9E%E5%BA%A7%E3%81%8B%E3%82%80%E3%81%8F%E3%82%89%E3%83%A9%E3%83%BC%E3%83%A1%E3%83%B3/images/img2_hu5b1c55ddd3b998ef9e1e7da203dc1109_434676_120x120_fill_q75_box_smart1.jpg","permalink":"http://kenji.blog/es/p/%E4%BD%95%E5%B9%B4%E3%81%8B%E3%81%B6%E3%82%8A%E3%81%AE%E7%A5%9E%E5%BA%A7%E3%81%8B%E3%82%80%E3%81%8F%E3%82%89%E3%83%A9%E3%83%BC%E3%83%A1%E3%83%B3/","title":"Kamukura (Ramen) por primera vez en años"},{"content":"He escrito un programa para enumerar números primos en Rust.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 fn main() { let max = 1000; let mut primes = vec![2]; let mut n = 3; loop { let mut is_prime = true; for p in \u0026amp;primes { if n % p == 0 { is_prime = false; break; } } if is_prime { primes.push(n); } n += 2; if n \u0026gt; max { break; } } for p in \u0026amp;primes { println!(\u0026#34;{}\u0026#34;, p); } } ","date":"2022-09-09T07:08:49+09:00","image":"http://kenji.blog/p/rust%E3%81%A7%E7%B4%A0%E6%95%B0%E3%82%92%E5%88%97%E6%8C%99%E3%81%99%E3%82%8B/images/img_hu5b7e04bd1dc0eefb45fd25ac4219842a_9797_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/rust%E3%81%A7%E7%B4%A0%E6%95%B0%E3%82%92%E5%88%97%E6%8C%99%E3%81%99%E3%82%8B/","title":"'Enumerando números primos en Rust'"},{"content":"Lista de reproducción de jazz relajante ","date":"2022-09-08T17:40:26+09:00","image":"http://kenji.blog/p/%E8%90%BD%E3%81%A1%E7%9D%80%E3%81%84%E3%81%9F%E3%82%B8%E3%83%A3%E3%82%BA/images/img_huddf559c95c5d412c9cd6a131d9beecb1_1507891_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E8%90%BD%E3%81%A1%E7%9D%80%E3%81%84%E3%81%9F%E3%82%B8%E3%83%A3%E3%82%BA/","title":"Jazz relajante"},{"content":"Ritmo rápido\nElectro Swing Collection Electro Swing Mix 2019 Vol.3 lofi hip hop radio(En vivo) LoFi Jazz Esta es la motivación para estudiar duro todos los días | 5 hour lofi hip hop / study / work / chill beats ","date":"2022-09-08T08:39:03+09:00","image":"http://kenji.blog/p/%E3%82%AB%E3%83%95%E3%82%A7%E9%9F%B3%E6%A5%BD/images/img_huc541091b3f264af05ecf07abbd33454f_519675_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E3%82%AB%E3%83%95%E3%82%A7%E9%9F%B3%E6%A5%BD/","title":"Música de cafetería"},{"content":"Está bien si el esfuerzo no es reconocido 45年の人生で手に入れた。ぐずぐずした時、いつも背中を押してくれる言葉たち。 pic.twitter.com/EQgmujOSpg\n\u0026mdash; いれぶん (@eleven_s_s) September 6, 2022 Los valores son mucho más diversos Yusuke Narita \u0026ldquo;De las desgracias que sufren los humanos\u0026rdquo;\nLas acciones que realizas se reflejan directamente El pensamiento de Hayao Miyazaki ","date":"2022-09-08T02:22:52+09:00","image":"http://kenji.blog/p/%E3%83%A2%E3%83%81%E3%83%99%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E4%B8%8A%E3%81%92%E3%81%A6%E3%81%8F%E3%82%8C%E3%82%8B%E5%8B%95%E7%94%BB/images/img_hu390d0c8e5d67e265b0c5aa8749ccc95d_193793_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E3%83%A2%E3%83%81%E3%83%99%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E4%B8%8A%E3%81%92%E3%81%A6%E3%81%8F%E3%82%8C%E3%82%8B%E5%8B%95%E7%94%BB/","title":"Videos que aumentan la motivación"},{"content":"Aquí dejo las especificaciones de mi PC principal.\nNombre del elemento Valor Procesador Intel Core i7-8700K CPU @ 3.70GHz 3.70 GHz Memoria 32.0 GB Tipo de sistema Sistema operativo de 64 bits, procesador basado en x64 SO Windows 11 Enterprise (Versión 21H2, compilación 22000.856) Fabricante Mouse Computer Co., Ltd. ","date":"2022-09-08T01:55:00+09:00","image":"http://kenji.blog/p/%E4%BB%8A%E3%81%AE%E3%83%A1%E3%82%A4%E3%83%B3pc%E3%82%B9%E3%83%9A%E3%83%83%E3%82%AF/images/img_hu731502385ac0a573daf05287c34d796a_240757_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E4%BB%8A%E3%81%AE%E3%83%A1%E3%82%A4%E3%83%B3pc%E3%82%B9%E3%83%9A%E3%83%83%E3%82%AF/","title":"Especificaciones actuales de mi PC principal"},{"content":"Google Material Symbols and Icons https://fonts.google.com/icons GitHub Octicons https://primer.style/octicons/ Sargam Icons https://sargamicons.com/ Thousands of free icons https://icon-icons.com/ flaticon https://www.flaticon.com/ ICONFINDER https://www.iconfinder.com/ iconfont https://www.iconfont.cn/ open-iconic https://github.com/iconic/open-iconic ","date":"2022-09-07T16:46:56+09:00","image":"http://kenji.blog/p/%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AA%E3%82%A2%E3%82%A4%E3%82%B3%E3%83%B3%E9%9B%86%E3%82%B5%E3%82%A4%E3%83%88/img_2_hu3b0847646c9f4aefba079615d2db35cd_21041_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AA%E3%82%A2%E3%82%A4%E3%82%B3%E3%83%B3%E9%9B%86%E3%82%B5%E3%82%A4%E3%83%88/","title":"Sitios de colecciones de iconos simples"},{"content":"He cambiado la paleta de colores del tema PaperMod. Me referí al siguiente enlace para saber cómo hacerlo:\nhttps://github.com/adityatelange/hugo-PaperMod/discussions/645\nLa ruta del CSS es la siguiente:\nthemes/PaperMod/assets/css/extended/blank.css\n1 2 3 4 5 6 7 8 9 10 11 12 13 :root { --entry: #fbf7ef; --primary: rgba(113, 103, 91, 1.00); --secondary: rgba(113, 103, 91, 0.95); --tertiary: rgba(113, 103, 91, 0.50); --content: rgba(113, 103, 91, 0.85); --hljs-bg: #34231B; --code-bg: #ebe4d7; --border: #fdfaf5; --theme: #fbf7ef; } .dark { } Por ahora, no hay cambios en el modo oscuro.\n","date":"2022-09-07T15:30:21+09:00","image":"http://kenji.blog/p/papermod%E3%81%AE%E9%85%8D%E8%89%B2%E5%A4%89%E6%9B%B4/img_hu74d0722ae4db8273d5e32f97bb10689d_10515_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/papermod%E3%81%AE%E9%85%8D%E8%89%B2%E5%A4%89%E6%9B%B4/","title":"Cambio de paleta de colores de PaperMod"},{"content":"Cuando mamá se enfermó y tuvo que quedarse en cama, al preguntarle a mi hija (2 años) sobre preparar la cena o el baño, \u0026ldquo;¿Le pedimos esto a mamá?\u0026rdquo;, me respondió: \u0026ldquo;¡No, está durmiendo!\u0026rdquo;, y pensé que, a su manera, estaba siendo considerada.\nMe alegra ver que parece estar convirtiéndose en alguien que se preocupa por los demás.\n","date":"2022-09-07T04:40:52+09:00","image":"http://kenji.blog/p/%E5%AD%90%E4%BE%9B%E3%81%AE%E3%81%9D%E3%82%93%E3%81%9F%E3%81%8F/images/img_hud61af1a628f352ef1641794e80547155_144893_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E5%AD%90%E4%BE%9B%E3%81%AE%E3%81%9D%E3%82%93%E3%81%9F%E3%81%8F/","title":"'La consideración de los niños'"},{"content":"Encontrar negocios que se estén popularizando Preguntar a la gente de Hot Pepper o a los contadores fiscales sobre los negocios que se están popularizando No entrar en negocios donde ya hay competidores fuertes y el mercado está saturado Solo entrar en negocios donde haya certeza de que se pueden atraer clientes (no entrar en negocios donde los competidores existentes utilizan métodos de atracción de clientes especiales e inimitables) Imitar a fondo Investigar cuál es la lógica de negocio antes de entrar Copiar exhaustivamente Y después de eso, mejorar Sistematizar Crear manuales para todo de manera que cualquiera pueda hacerlo sin tener que esforzarse Pensar e implementar sistemas con ideas para aumentar las ventas (aumentar el número de clientes, el gasto por cliente) y reducir gastos (costos laborales, costos de publicidad) Filosofía del gerente La filosofía del gerente es \u0026ldquo;maximizar las ganancias de la empresa\u0026rdquo;, ni más ni menos Es un error hacer de la contribución a la sociedad o de ser querido por los empleados la filosofía del gerente (pensar que esas cosas vendrán naturalmente después) ","date":"2022-09-07T02:36:11+09:00","image":"http://kenji.blog/p/%E7%B5%8C%E5%96%B6%E8%80%85%E3%83%A1%E3%83%A2/images/img_hu8e43d40b92b6a98e30d3360e9f3ab85a_162130_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E7%B5%8C%E5%96%B6%E8%80%85%E3%83%A1%E3%83%A2/","title":"Notas de Gestión"},{"content":"Voy a organizar lo que pienso y me parece extraño de la sociedad japonesa.\nSobre las becas Hablando de las becas en Japón, la mayoría devengan intereses y deben ser reembolsadas. Además, las tasas universitarias han estado aumentando constantemente desde 1950, y la tasa de beneficiarios también está en aumento.\nPor otro lado, la cantidad media total prestada recientemente parece ascender a 3,24 millones de yenes.\nEntre los usuarios de becas de la Organización de Servicios Estudiantiles de Japón, la cantidad media total prestada es de 3.243.000 yenes. Referencia\nSi a los 22 años, al graduarse de la universidad, uno tiene que cargar con una deuda de 3 millones de yenes, es natural que el momento del matrimonio se retrase, y también es natural que sea más difícil tener hijos, lo que creo que es una de las causas de la disminución de la tasa de natalidad en Japón.\nLa omnipresente teoría de la responsabilidad personal Esto es algo intuitivo, pero creo que existe una fría apariencia pública de \u0026ldquo;los demás son los demás\u0026rdquo;. Quizás sea una tendencia inevitable después de que la recesión haya durado décadas, pero incluso con el problema de las becas mencionado anteriormente, no se percibe como un problema de toda la sociedad, y siento que las voces de los jóvenes y de las minorías, que tienen pocos votos en las elecciones, son ignoradas. A pesar de que a largo plazo es un problema muy importante para todo Japón.\nEn lugar de dirigirse hacia una competencia excesiva, creo que el espíritu de ayudar juntos si hay personas, generaciones o grupos en apuros, es muy importante para el país. (Sin embargo, me resulta incómodo que el país insista en la \u0026ldquo;autoayuda y ayuda mutua\u0026rdquo;. Me gustaría que tomen la iniciativa de ayudar a los vulnerables de manera proactiva.)\n(Este artículo se actualizará según sea necesario.)\nCaracterísticas de los japoneses desde la perspectiva de la IA Sí, explicaré las características de los japoneses.\n【Aspectos positivos】\nLos japoneses son educados y tienen una cultura de prestar atención al respeto y al trato hacia los demás. La puntualidad es estricta, y se respeta cumplir con los horarios. El pensamiento colectivista es fuerte, y se valora el trabajo en equipo y la cooperación. Se valora la limpieza, y hay una tendencia a ser entusiastas con los modales en los espacios públicos y la limpieza. Se valoran los regalos y recuerdos, y la cultura de agradecer está ampliamente extendida. 【Aspectos negativos】\nEn ocasiones no son buenos para expresar sus opiniones personales y tienden a evitar los conflictos de opinión. Es una cultura laboral muy estricta, y a veces se consideran un problema las horas extras y el karoshi (muerte por exceso de trabajo). Aún persisten problemas de discriminación y exclusión hacia los extranjeros, y a veces se cuestiona la armonía con la comunidad internacional. Existe una tendencia autoritaria, y a veces se señala que a menudo se aceptan incondicionalmente las opiniones de los jefes o mayores. Es una sociedad cerrada, y a veces se critica la tendencia a ser reacios a aceptar culturas y valores externos. ","date":"2022-09-06T02:24:11+09:00","image":"http://kenji.blog/p/%E6%97%A5%E6%9C%AC%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E6%80%9D%E3%81%86%E3%81%93%E3%81%A8/images/img_hu105ea1ef9d38a7cb8901ff6c857b887e_168534_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E6%97%A5%E6%9C%AC%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E6%80%9D%E3%81%86%E3%81%93%E3%81%A8/","title":"'Mis pensamientos sobre Japón'"},{"content":"Introducción Rust es un lenguaje de programación relativamente nuevo que permite escribir módulos rápidos y eficientes en el uso de la memoria con una sintaxis moderna. Es compatible con múltiples plataformas y se utiliza en mundos como WebAssembly y sistemas embebidos. Como ejemplos famosos, es utilizado por Firefox, DropBox y Cloudflare.\nTambién está llamando la atención como una alternativa a C++.\nMétodo de instalación Instalar Rust\nEn el sitio mencionado anteriormente se publican los métodos de instalación para cada plataforma.\nPrimer programa Guarde el siguiente programa como main.rs.\n1 2 3 fn main() { println!(\u0026#34;Hello, world!\u0026#34;); } Al ejecutar rustc main.rs desde el símbolo del sistema o la terminal, se compilará, y al ejecutar ./main (main.exe en el caso de Windows), se imprimirá Hello, world!.\nDocumentación en japonés The Rust Programming Language Versión Japonesa\nLas explicaciones necesarias para aprender Rust están recopiladas en el enlace anterior (versión traducida al japonés). Es tan completo que no hay necesidad de comprar un libro de texto de Rust.\nSi desea probarlo en la Web Si desea probarlo en la Web sin instalar un compilador, puede utilizar The Rust Playground. Al ingresar el código y presionar el \u0026ldquo;botón de ejecución\u0026rdquo;, se compilará y ejecutará en la Web.\n","date":"2022-09-06T00:12:36+09:00","image":"http://kenji.blog/p/rust%E3%81%AE%E3%81%AF%E3%81%98%E3%82%81%E3%81%8B%E3%81%9F/images/rust_logo_huefc2d075e966b0edc0b7186c50038553_22411_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/rust%E3%81%AE%E3%81%AF%E3%81%98%E3%82%81%E3%81%8B%E3%81%9F/","title":"Cómo empezar con Rust"},{"content":"Cambié el entorno de internet de mi casa de Flets Hikari a J:COM Por recomendación de un conocido, cambié la conexión a internet de mi casa de Flets Hikari a J:COM. Las razones fueron,\nLa tarifa mensual es más barata. De 3,619 yenes a 2,180 yenes. La velocidad de internet aumenta de 100 Mbps a 320 Mbps. Estos puntos.\nImpresiones tras usarlo Ha pasado aproximadamente una semana desde el cambio y hasta ahora no hay casi ningún problema. A continuación menciono algunas cosas que me llamaron la atención.\nMe di cuenta al hacer el cambio que la velocidad de descarga ciertamente aumentó y pasó de 60 Mbps a casi 320 Mbps. Sin embargo, en cuanto a la velocidad de subida, con Flets Hikari llegaba a 40 Mbps, pero bajó a unos 10 Mbps. Parece que esto es una especificación del lado de J:COM. Por ahora no hago transmisiones en vivo ni subo grandes cantidades de datos, así que veré cómo evoluciona.\nAdemás, últimamente tanto mi familia como yo trabajamos principalmente desde casa (teletrabajo), y hoy por primera vez el internet se desconectó durante unas decenas de minutos. Se recuperó automáticamente, pero tal vez no sea un buen comienzo. Aún no ha pasado ni una semana desde el cambio, pero bueno\u0026hellip;\nComo nota al margen, parece que J:COM restringe las conexiones P2P, por lo que la velocidad de las aplicaciones P2P no es buena. Quienes usan P2P deberían tener cuidado.\nSobre el servicio Al momento del contrato, me dijeron que si me suscribía a Netflix o Disney+ recibiría una tarjeta QUO por valor de 40.000 yenes, y que compensando con la cuota del contrato de cada servicio, la tarifa mensual sería un poco más barata en promedio, así que contraté los servicios junto con el contrato principal. Netflix es un contrato de 1 año y Disney+ es de medio año, y parece que es necesario realizar el trámite de cancelación por cuenta propia.\nComo el cambio es reciente, si tengo más impresiones o experiencias de uso, me gustaría actualizar el artículo. Hasta luego,\n09/06 Dificultades para conectarse a internet 06/09/2022 alrededor de las 13:13 Durante 3 a 5 minutos 06/09/2022 alrededor de las 13:30 Durante 3 a 5 minutos Después unas cuantas veces más\u0026hellip; Parece ser un problema de DNS, así que configuré el servidor DNS tomando como referencia aquí. A ver qué pasa con esto\u0026hellip; Incluso con la configuración de DNS caí en un estado en el que no podía conectarme, así que cuando me puse en contacto con el soporte, me dijeron que estaban haciendo un mantenimiento de emergencia\u0026hellip; Justo después de contactarlos, el estado de la conexión mejoró, así que creo que tomaron alguna medida.\n","date":"2022-09-05T22:48:51+09:00","image":"http://kenji.blog/p/%E3%83%8D%E3%83%83%E3%83%88%E7%92%B0%E5%A2%83%E3%82%92%E3%83%95%E3%83%AC%E3%83%83%E3%83%84%E5%85%89jcom%E3%81%AB%E5%A4%89%E3%81%88%E3%81%9F/jcom_hub0ec31ac66f5927be8b28fe767bbeebb_3349_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E3%83%8D%E3%83%83%E3%83%88%E7%92%B0%E5%A2%83%E3%82%92%E3%83%95%E3%83%AC%E3%83%83%E3%83%84%E5%85%89jcom%E3%81%AB%E5%A4%89%E3%81%88%E3%81%9F/","title":"Cambié mi entorno de internet de Flets Hikari a J:COM"},{"content":"Instalación de HUGO Descargar Descarga de HUGO\nDescarga el módulo de Windows que se adapte a tu entorno desde el sitio anterior y extráelo. En mi caso, descargué \u0026ldquo;hugo_0.102.3_Windows-64bit.zip\u0026rdquo;.\nExtraer Extrae el archivo zip descargado y copia el archivo hugo.exe que contiene en una carpeta, por ejemplo, C:\\bin.\nRegistrar en variables de entorno Regístralo en las variables de entorno para poder ejecutar hugo.exe desde cualquier lugar. La operación es para Windows 11, pero creo que puedes registrarlo siguiendo estos pasos.\nPresiona las teclas Win+Pause para abrir la información de la versión Haz clic en Configuración avanzada del sistema Haz clic en Variables de entorno Selecciona Path y haz clic en Editar Haz clic en Nuevo, ingresa \u0026ldquo;C:\\bin\u0026rdquo; en una nueva línea y cierra el cuadro de diálogo con Aceptar Previsualizar el blog Ve a la carpeta del blog de HUGO en el símbolo del sistema y ejecuta el siguiente comando.\nhugo server -D\nEl resultado de la ejecución es el siguiente. (La opción -D muestra los artículos en borrador).\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 C:\\Users\\win11\\IdeaProjects\\kenji.blog\u0026gt;hugo server -D Start building sites … hugo v0.102.3-b76146b129d7caa52417f8e914fc5b9271bf56fc windows/amd64 BuildDate=2022-09-01T10:16:19Z VendorInfo=gohugoio | JA -------------------+----- Pages | 39 Paginator pages | 0 Non-page files | 7 Static files | 0 Processed images | 0 Aliases | 13 Sitemaps | 1 Cleaned | 0 Built in 161 ms Watching for changes in C:\\Users\\win11\\IdeaProjects\\kenji.blog\\{archetypes,content,themes} Watching for config changes in C:\\Users\\win11\\IdeaProjects\\kenji.blog\\config.toml Environment: \u0026#34;development\u0026#34; Serving pages from memory Running in Fast Render Mode. For full rebuilds on change: hugo server --disableFastRender Web Server is available at http://localhost:1313/ (bind address 127.0.0.1) Press Ctrl+C to stop La dirección se muestra al ejecutar el comando (en el ejemplo anterior http://localhost:1313/), cópiala en el navegador. La vista previa se actualiza automáticamente cada vez que se guarda el archivo. Para finalizar la vista previa, presiona Ctrl+C en el símbolo del sistema.\n","date":"2022-09-05T12:28:01+09:00","image":"http://kenji.blog/p/hugo%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%81%A7%E7%92%B0%E5%A2%83%E3%81%A7%E8%A1%A8%E7%A4%BA%E3%83%97%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC/img_hu415dc7e70376ac350673d0366f70ca4b_19909_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/hugo%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%81%A7%E7%92%B0%E5%A2%83%E3%81%A7%E8%A1%A8%E7%A4%BA%E3%83%97%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC/","title":"【HUGO】Vista previa en entorno local"},{"content":"Estas son mis películas recomendadas en las que el protagonista es un matemático.\nUna mente maravillosa Una película que describe la vida de un matemático genio estadounidense que existió realmente. El final tiene un desarrollo sorprendente. Russell Crowe, en el papel principal, hace un excelente trabajo.\nEnigma Película estrenada en 2001 basada en la novela de Robert Harris \u0026ldquo;Enigma\u0026rdquo;. De Wikipedia\nUna historia sobre el descifrado del código creado por Alemania llamado máquina Enigma.\nThe Imitation Game (Descifrando Enigma) Otra historia sobre el desciframiento de códigos que trata sobre Enigma. Me gusta la visión del mundo de esa época.\nEl hombre que conocía el infinito Una obra que describe la interacción entre el matemático de la Universidad de Cambridge Hardy y el matemático indio Ramanujan. Puedes sentir la belleza de las matemáticas.\nLa teoría del todo Una película que retrata la vida del Dr. Hawking.\nParticle Fever (Locos por las partículas) ","date":"2022-09-05T10:41:00+09:00","image":"http://kenji.blog/p/%E6%95%B0%E5%AD%A6%E8%80%85%E3%81%8C%E7%99%BB%E5%A0%B4%E3%81%99%E3%82%8B%E6%98%A0%E7%94%BB/images/img_hua361131ea597bbd428e36b721aabc571_406520_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/%E6%95%B0%E5%AD%A6%E8%80%85%E3%81%8C%E7%99%BB%E5%A0%B4%E3%81%99%E3%82%8B%E6%98%A0%E7%94%BB/","title":"Películas sobre matemáticos"},{"content":"El escritorio del niño El tiempo que mi hijo duerme es el tiempo en que puedo concentrarme en mi trabajo. Cuando termine la siesta, iremos a jugar al parque. ¡Si tuviera un adaptador de Lightning a HDMI para el iPad, podría trabajar en el escritorio de la derecha!\n","date":"2022-09-04T14:29:09+09:00","image":"http://kenji.blog/p/%E4%BB%8A%E6%97%A5%E3%81%AE%E4%BD%9C%E6%A5%AD%E7%92%B0%E5%A2%83/images/today_workplase_hu1fa3ba50725fc9c80ae774069d99ec20_2258565_120x120_fill_q75_box_smart1.jpg","permalink":"http://kenji.blog/es/p/%E4%BB%8A%E6%97%A5%E3%81%AE%E4%BD%9C%E6%A5%AD%E7%92%B0%E5%A2%83/","title":"'El entorno de trabajo de hoy'"},{"content":"Introducción Cuando escribo en este blog, utilizo IntelliJ IDEA. Es conveniente porque tiene buena compatibilidad con Git y muestra una vista previa del markdown. Como tengo que escribir date en el encabezado del md cada vez que escribo un post y parece que no hay un atajo para insertar esa fecha, he creado un comando para insertar la fecha consultando el siguiente sitio web. Espero que te sea útil.\nIs there a shortcut for inserting date/time in IntelliJ IDEA?\nPasos de configuración Abrir \u0026ldquo;File\u0026rdquo; \u0026gt; \u0026ldquo;Settings\u0026hellip;\u0026rdquo; en el menú\nSeleccionar \u0026ldquo;Editor\u0026rdquo; \u0026gt; \u0026ldquo;Live Template\u0026rdquo; \u0026gt; \u0026ldquo;HTML/XML\u0026rdquo; y hacer clic en \u0026ldquo;+\u0026rdquo; Seleccionar \u0026ldquo;Live Template\u0026rdquo; Ingresar \u0026ldquo;date\u0026rdquo; en Abbreviation Ingresar \u0026ldquo;Insertar fecha y hora\u0026rdquo; en Description Ingresar \u0026ldquo;$date$\u0026rdquo; en Template Text Hacer clic en el botón Edit Variables\nIngresar \u0026ldquo;date\u0026rdquo; en Name Ingresar date(\u0026quot;yyyy-MM-dd'T'HH:mm:ss'+09:00'\u0026quot;) en Expression Cerrar el cuadro de diálogo con OK Presionar Define o Change y marcar la casilla \u0026ldquo;Everywhere\u0026rdquo; Cerrar el cuadro de diálogo con OK ¡Si ingresas \u0026ldquo;date\u0026rdquo; en el editor de código y presionas Enter para insertar la fecha como \u0026ldquo;2022-09-04T05:59:04+09:00\u0026rdquo;, la configuración está completa! Eso es todo.\nConclusión ¡Si encuentro más pequeños trucos para IntelliJ IDEA, los publicaré de nuevo!\n","date":"2022-09-04T05:59:04+09:00","image":"http://kenji.blog/p/intellij-idea%E3%81%A7%E6%97%A5%E4%BB%98%E3%82%92%E8%B2%BC%E3%82%8A%E4%BB%98%E3%81%91%E3%82%8B%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B/images/IntelliJ_logo_hu4c2377fba6118d83603ae0bd715d16f4_24441_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/intellij-idea%E3%81%A7%E6%97%A5%E4%BB%98%E3%82%92%E8%B2%BC%E3%82%8A%E4%BB%98%E3%81%91%E3%82%8B%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B/","title":"Añadir un comando para insertar la fecha en IntelliJ IDEA"},{"content":"He empezado un blog Algo como fuegos artificiales, el código está aquí\nHola a todos. Por alguna razón, he decidido empezar un blog.\nNo tengo un objetivo grandioso como \u0026ldquo;¡Quiero publicar esto!\u0026rdquo;, simplemente pensé que sería bueno tener un lugar donde escribir sobre tecnología, la vida cotidiana o cualquier cosa que me venga a la mente tal como es.\nNo voy a poner demasiado esfuerzo, solo planeo hacerlo como si fuera un bloc de notas.\nLo estoy haciendo con algo llamado Hugo Este blog está hecho con un generador de sitios estáticos llamado \u0026ldquo;Hugo\u0026rdquo;. Encontré un tema que me gustó y decidí usarlo. (Es un secreto que me tomó como 2 horas elegir el tema)\nTambién planeo escribir notas casuales sobre código y herramientas que me llamen la atención.\nHablando de Komeda por la mañana Por cierto, esta mañana me desperté un poco temprano y fui a Komeda Coffee. Salí a las 8:30 y caminé mientras respiraba el aire de la mañana.\nPedí un Mini Shiro-Noir y un set de desayuno A con Café au Lait. Creo que costó alrededor de 800 yenes. (No me acuerdo)\nLos cafés por la mañana son geniales. Siento que si tengo un tiempo para relajarme antes del trabajo, de alguna manera el día irá bien.\nAsí que, escribiré de manera relajada a partir de ahora. Planeo mezclar temas técnicos y cosas cotidianas.\n¡Encantado de conocerlos!\n","date":"2022-09-02T07:23:00+09:00","image":"http://kenji.blog/p/%E3%83%96%E3%83%AD%E3%82%B0%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%BF%E3%81%BE%E3%81%97%E3%81%9F/images/komeda_hue1f0373fafb96162f461ac594cb3e53e_603414_120x120_fill_q75_box_smart1.jpeg","permalink":"http://kenji.blog/es/p/%E3%83%96%E3%83%AD%E3%82%B0%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%BF%E3%81%BE%E3%81%97%E3%81%9F/","title":"He empezado un blog"},{"content":"Salesforce DevTools Puedes buscar campos personalizados o generar en lote los campos de objetos personalizados.\nTambién es útil para construir SOQL sobre la marcha.\nSalesforce DevTools\nSalesforce advanced Code searcher Es útil para buscar código en Salesforce.\nSalesforce advanced Code searcher\n","date":"2022-05-02T10:39:36+09:00","image":"http://kenji.blog/p/salesforce%E3%81%8A%E3%81%99%E3%81%99%E3%82%81chrome%E6%8B%A1%E5%BC%B5/img_huc75a5c8c4d45e738551ca5afb26f380b_13227_120x120_fill_box_smart1_3.png","permalink":"http://kenji.blog/es/p/salesforce%E3%81%8A%E3%81%99%E3%81%99%E3%82%81chrome%E6%8B%A1%E5%BC%B5/","title":"Extensiones de Chrome recomendadas para Salesforce"},{"content":"La seguridad de la información en la sociedad de Internet moderna está protegida por sistemas de criptografía de clave pública como la criptografía RSA. La base de la seguridad del cifrado RSA depende del hecho de que \u0026ldquo;la factorización de números compuestos enormes es computacionalmente muy difícil\u0026rdquo;.\nEn este artículo, desentrañaremos el mecanismo matemático de la \u0026ldquo;Criba General del Cuerpo de Números\u0026rdquo; (General Number Field Sieve, GNFS), que es el algoritmo de factorización más fuerte en computadoras clásicas, y profundizaremos a través de fórmulas y diagramas conceptuales por qué es completamente derrotado por el \u0026ldquo;Algoritmo de Shor\u0026rdquo; descubierto por Peter Shor, y el cambio de paradigma que esto representa.\n1. El enfoque de la factorización en la computación clásica: Desarrollo a partir del método de factorización de Fermat El problema de factorización prima es encontrar los números primos $p, q$ tales que $N = p \\times q$ para un número compuesto $N$ dado.\nLa idea básica se reduce a encontrar valores no triviales $x, y$ que satisfagan la siguiente congruencia:\n$$ x^2 \\equiv y^2 \\pmod N $$ Transformando esto,\n$$ x^2 - y^2 \\equiv 0 \\pmod N $$ $$ (x - y)(x + y) \\equiv 0 \\pmod N $$ Aquí, si $x \\not\\equiv \\pm y \\pmod N$, al calcular $\\gcd(x-y, N)$ o $\\gcd(x+y, N)$, podemos obtener un factor no trivial de $N$. Este hecho es la base de los algoritmos de factorización modernos como GNFS.\n2. El algoritmo clásico más fuerte: Las profundidades de la \u0026ldquo;Criba General del Cuerpo de Números\u0026rdquo; (GNFS) \u0026ldquo;GNFS\u0026rdquo; es el algoritmo de factorización más rápido conocido en la actualidad para computadoras clásicas. Su complejidad temporal requiere un tiempo subexponencial.\nComplejidad del GNFS Si el número de dígitos de $N$ es $b = \\log_2 N$, la complejidad del GNFS se expresa de la siguiente manera:\n$$ O\\left( \\exp \\left( \\left(\\frac{64}{9} b\\right)^{1/3} (\\log b)^{2/3} \\right) \\right) $$ Como se puede ver en esta fórmula, el tiempo de cálculo no es polinomial, sino \u0026ldquo;tiempo subexponencial\u0026rdquo;, que es ligeramente más lento que el exponencial. Aun así, si el número de dígitos aumenta, el tiempo de cálculo aumenta astronómicamente.\nMecanismo matemático de GNFS GNFS consta principalmente de 4 pasos:\nSelección de polinomios (Polynomial Selection) Criba (Sieving) Reducción de matrices (Matrix Reduction) Cálculo de raíz cuadrada (Square Root) 2.1. Selección de polinomios y cuerpos de números Primero, seleccionamos polinomios irreducibles $f(x)$ y $g(x)$ con coeficientes enteros. Estos se configuran para tener una raíz común $m$ módulo $N$. Es decir,\n$$ f(m) \\equiv 0 \\pmod N $$ $$ g(m) \\equiv 0 \\pmod N $$ Normalmente, $g(x)$ se elige como un polinomio de primer grado $g(x) = x - m$. Si hacemos que la raíz de $f(x)$ sea $\\alpha$, construimos un \u0026ldquo;cuerpo de números\u0026rdquo; (Number Field) llamado $\\mathbb{Q}(\\alpha)$. Comparamos las operaciones en el anillo de $\\mathbb{Q}(\\alpha)$ y las operaciones en el anillo de enteros habitual $\\mathbb{Z}$ a través del homomorfismo $\\phi: \\alpha \\mapsto m$.\n2.2. Criba (Sieving) A continuación, buscamos una gran cantidad de pares de enteros coprimos $(a, b)$. El objetivo es encontrar pares tales que los dos valores siguientes sean \u0026ldquo;B-smooth\u0026rdquo; (compuestos solo por factores primos relativamente pequeños):\n$a - bm$ (valor en el anillo de enteros) $b^d f(a/b)$ (correspondiente a la norma $N(a - b\\alpha)$ sobre el cuerpo de números) Aquí se utiliza una técnica de búsqueda rápida llamada \u0026ldquo;criba\u0026rdquo; (Sieve). Esto extrae eficientemente pares $(a, b)$ que cumplen las condiciones de entre una enorme cantidad de candidatos.\n2.3. Reducción de matrices (Linear Algebra over GF(2)) A partir de los pares recolectados $(a, b)$, formamos vectores de exponentes y encontramos el espacio nulo izquierdo de una enorme matriz dispersa sobre $\\mathbb{F}_2$ (un cuerpo cuyos elementos son solo 0 y 1).\nEncontramos el vector $v$ como solución para que las relaciones $ \\prod (a_i - b_i m) $ y $ \\prod (a_i - b_i \\alpha) $ se conviertan ambas en elementos cuadrados. Esto no es más que resolver el sistema de ecuaciones lineales:\n$$ M \\mathbf{x} \\equiv \\mathbf{0} \\pmod 2 $$ Aquí se aprovechan algoritmos numéricos avanzados como el algoritmo de Block Lanczos o el algoritmo de Block Wiedemann.\n2.4. Cálculo de raíz cuadrada Finalmente, extraemos raíces cuadradas tanto en el cuerpo de números como en el anillo de enteros para derivar la relación $x^2 \\equiv y^2 \\pmod N$. Luego, calculamos $\\gcd(x-y, N)$ para obtener los factores.\n3. El avance mediante computación cuántica: \u0026ldquo;Algoritmo de Shor\u0026rdquo; Mientras que el GNFS requiere tiempo subexponencial, el \u0026ldquo;Algoritmo de Shor\u0026rdquo; introducido por Peter Shor en 1994 puede resolver este problema en \u0026ldquo;tiempo polinomial\u0026rdquo; utilizando una computadora cuántica.\nComplejidad del Algoritmo de Shor Cuando el número de qubits es $O(\\log N)$, la complejidad temporal es:\n$$ O((\\log N)^3) $$ Esto significa que no causa una explosión exponencial con respecto al número de bits. Es un resultado sorprendente donde números compuestos enormes que excederían la vida útil del universo con \u0026ldquo;computación clásica\u0026rdquo;, pueden ser descifrados en unas pocas horas o días con \u0026ldquo;computación cuántica\u0026rdquo;.\nVisión general del Algoritmo de Shor: Reducción al problema de búsqueda de períodos El algoritmo de Shor reduce ingeniosamente el problema de factorización prima a un \u0026ldquo;problema de búsqueda de períodos\u0026rdquo;.\nElegir un entero aleatorio $a$ coprimo con $N$ ($1 \u003c a \u003c N$). Definir la función $f(x) = a^x \\bmod N$. Encontrar el período $r$ de $f(x)$, es decir, el entero positivo mínimo $r$ tal que $a^r \\equiv 1 \\pmod N$. Si $r$ es par, verificar si $a^{r/2} \\not\\equiv -1 \\pmod N$ y calcular $\\gcd(a^{r/2} \\pm 1, N)$ para obtener los factores primos. Esta \u0026ldquo;búsqueda del período $r$\u0026rdquo; en el paso 3 es el cuello de botella que requiere un tiempo exponencial en las computadoras clásicas, pero las computadoras cuánticas lo resuelven en un instante utilizando \u0026ldquo;superposición cuántica\u0026rdquo; y la \u0026ldquo;Transformada de Fourier Cuántica\u0026rdquo; (QFT).\n4. Transformada de Fourier Cuántica (QFT) y Extracción de Períodos Veamos en detalle a través de fórmulas la manipulación de estados cuánticos, que es el núcleo del algoritmo de Shor.\n4.1. Generación de superposición cuántica Primero, preparamos dos registros cuánticos. El registro 1 almacena el estado de superposición de la entrada $x$, y el registro 2 almacena el resultado de la función $f(x)$. Aplicamos la Transformada de Hadamard al estado inicial $|0\\rangle |0\\rangle$ para crear una superposición de todos los $x$ posibles.\n$$ |\\psi_1\\rangle = \\frac{1}{\\sqrt{Q}} \\sum_{x=0}^{Q-1} |x\\rangle |0\\rangle $$ (donde $Q$ es una potencia de 2 que satisface $N^2 \\le Q \u003c 2N^2$)\nA continuación, utilizamos el oráculo cuántico $U_f$ para calcular $f(x) = a^x \\bmod N$ y almacenarlo en el registro 2.\n$$ |\\psi_2\\rangle = U_f |\\psi_1\\rangle = \\frac{1}{\\sqrt{Q}} \\sum_{x=0}^{Q-1} |x\\rangle |a^x \\bmod N\\rangle $$ Supongamos que medimos el registro 2 aquí (en realidad, la estructura matemática es la misma incluso sin medir). Si se observa un cierto valor $y = a^{x_0} \\bmod N$, el estado del registro 1 colapsa a una superposición de todos los $x$ tales que $f(x) = y$. Si el período es $r$, tales $x$ serán $x_0, x_0 + r, x_0 + 2r, \\dots$\n$$ |\\psi_3\\rangle = \\frac{1}{\\sqrt{M}} \\sum_{k=0}^{M-1} |x_0 + kr\\rangle $$ (donde $M \\approx Q/r$ es el número de términos)\nEste estado contiene información sobre el período $r$, pero la medición directa solo arrojaría un $x_0 + kr$ aleatorio, por lo que el período $r$ sigue siendo desconocido. Aquí es donde entra en juego la QFT.\n4.2. Aplicación de la Transformada de Fourier Cuántica La QFT es una operación que realiza una transformada de Fourier discreta sobre las amplitudes de los estados cuánticos. La acción de la QFT sobre el estado $|x\\rangle$ se define de la siguiente manera:\n$$ \\text{QFT} |x\\rangle = \\frac{1}{\\sqrt{Q}} \\sum_{y=0}^{Q-1} e^{2\\pi i \\frac{xy}{Q}} |y\\rangle $$ Al aplicar esto a $|\\psi_3\\rangle$, ocurre una interferencia de fase (interferencia cuántica).\n$$ |\\psi_4\\rangle = \\text{QFT} |\\psi_3\\rangle = \\frac{1}{\\sqrt{MQ}} \\sum_{y=0}^{Q-1} \\sum_{k=0}^{M-1} e^{2\\pi i \\frac{(x_0 + kr)y}{Q}} |y\\rangle $$ Expandiendo la suma en esta fórmula,\n$$ \\sum_{k=0}^{M-1} e^{2\\pi i \\frac{kry}{Q}} $$ Aparece esta parte. La suma de esta serie geométrica se refuerza constructivamente solo cuando $ry/Q$ está cerca de un entero (Interferencia constructiva), y de lo contrario se cancela mutuamente (Interferencia destructiva).\nPor lo tanto, el estado $|y\\rangle$ medido con alta probabilidad es un entero $y$ que satisface la condición:\n$$ \\frac{y}{Q} \\approx \\frac{c}{r} $$ (donde $c$ es algún entero).\n4.3. Identificación de períodos mediante expansión en fracciones continuas Después de obtener $y$ mediante medición, usamos una computadora clásica para realizar la \u0026ldquo;expansión en fracciones continuas\u0026rdquo; (Continued Fraction Expansion) de $y/Q$. Esto nos permite calcular la fracción aproximada $c/r$ de $y/Q$ y extraer eficientemente los candidatos para el período $r$ a partir del denominador.\n5. Comparación de modelos conceptuales y el cambio de paradigma Para entender intuitivamente la diferencia entre GNFS y el algoritmo de Shor, mostramos un diagrama conceptual utilizando sintaxis Mermaid.\nDiagrama conceptual del algoritmo de Shor mediante circuito cuántico 1 2 3 4 5 6 7 8 9 10 11 12 13 graph TD A[Estado inicial: 0...0] --\u0026gt; B[Superposición de todos los estados por Transformada de Hadamard] B --\u0026gt; C[Operación de exponenciación modular a^x mod N] C --\u0026gt;|Entrelazamiento cuántico| D[Colapso a un estado con periodicidad] D --\u0026gt; E[Transformada de Fourier Cuántica QFT] E --\u0026gt;|Amplificación de probabilidad por interferencia| F[Medición: Obtener y] F --\u0026gt; G[Procesamiento clásico: Expansión en fracciones continuas] G --\u0026gt; H[Búsqueda del período r] H --\u0026gt; I[Cálculo de factores primos de N] style A fill:#f9f,stroke:#333,stroke-width:2px style E fill:#bbf,stroke:#333,stroke-width:2px style I fill:#bfb,stroke:#333,stroke-width:2px La esencia del cambio de paradigma El GNFS adopta el enfoque de \u0026ldquo;buscar relaciones dentro de un espacio matemático (cuerpo de números)\u0026rdquo;. Sin embargo, debido a que el espacio de búsqueda se expande exponencialmente con el número de dígitos, la capacidad de cálculo de las computadoras clásicas (incluso con paralelización) hace que sea virtualmente imposible de descifrar cuando la longitud de la clave supera los 2048 bits, etc.\nPor otro lado, el algoritmo de Shor utiliza \u0026ldquo;las propiedades ondulatorias debidas a la interferencia cuántica\u0026rdquo;. Evalúa simultáneamente todas las rutas de cálculo en estado de superposición y cancela (interferencia destructiva) las respuestas innecesarias mediante la QFT, amplificando (interferencia constructiva) solo la amplitud de probabilidad del período que es la respuesta correcta. Con esto, logra un enfoque en una dimensión completamente diferente que, en lugar de buscar en el espacio, \u0026ldquo;hace que la respuesta correcta misma emerja\u0026rdquo;.\n6. Conclusión En este artículo, comparamos profundamente los antecedentes matemáticos y las estructuras de los algoritmos de \u0026ldquo;GNFS\u0026rdquo;, que es el pináculo del límite clásico, y el \u0026ldquo;Algoritmo de Shor\u0026rdquo;, que muestra el poder de la computación cuántica.\nMientras que el GNFS redujo la complejidad temporal al tiempo subexponencial mediante elaboradas técnicas matemáticas como la selección de polinomios y el cálculo de enormes matrices, el algoritmo de Shor fusionó la superposición y la interferencia, que son los principios básicos de la mecánica cuántica, con herramientas matemáticas (QFT) para lograr un avance hacia el tiempo polinomial de un solo golpe.\nActualmente, no existe una computadora cuántica tolerante a fallas (FTQC) que pueda ejecutar el algoritmo de Shor a una escala práctica (miles de qubits). Sin embargo, la existencia misma de este cambio de paradigma matemático y teórico es la mayor razón por la que en todo el mundo se está acelerando la transición a la criptografía poscuántica (PQC: Post-Quantum Cryptography).\n","date":"0001-01-01T00:00:00Z","image":"http://kenji.blog/p/gnfs-to-shors-algorithm-math-deepdive/quantum_vs_gnfs_eyecatch_1788616101508_hud95a00206aa1dcf32de9cdc0ccb17972_1096815_120x120_fill_q75_box_smart1.jpg","permalink":"http://kenji.blog/es/p/gnfs-to-shors-algorithm-math-deepdive/","title":"[Consideración matemática] ¿Por qué el algoritmo de descifrado 'GNFS' es derrotado por el algoritmo de Shor en la era cuántica?"}]