<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Herramientas Y Entornos De Desarrollo on kenji.blog</title><link>http://kenji.blog/es/categories/herramientas-y-entornos-de-desarrollo/</link><description>Recent content in Herramientas Y Entornos De Desarrollo on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>es</language><copyright>kenjinote</copyright><lastBuildDate>Sat, 19 Jul 2025 10:03:51 +0900</lastBuildDate><atom:link href="http://kenji.blog/es/categories/herramientas-y-entornos-de-desarrollo/index.xml" rel="self" type="application/rss+xml"/><item><title>Cómo llamar a Microsoft.Windows.AI desde C++</title><link>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/</link><pubDate>Sat, 19 Jul 2025 10:03:51 +0900</pubDate><guid>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/</guid><description>&lt;img src="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.png" alt="Featured image of post Cómo llamar a Microsoft.Windows.AI desde C++" />&lt;h1 id="-cómo-llamar-a-microsoftwindowsai-desde-c-con-código-de-ejemplo">🎯 Cómo llamar a &lt;code>Microsoft.Windows.AI&lt;/code> desde C++ 【Con código de ejemplo】
&lt;/h1>&lt;p>A partir de Windows 10, Windows incluye de forma estándar un **runtime capaz de ejecutar modelos de IA en formato ONNX &lt;strong>. Este es ** Windows ML (Windows.AI.MachineLearning)&lt;/strong>.&lt;/p>
&lt;p>En este artículo, &lt;strong>explicaremos detalladamente con código de ejemplo ** cómo llamar a &lt;code>Microsoft.Windows.AI.MachineLearning&lt;/code> desde ** C++ (basado en aplicaciones Win32)&lt;/strong>.&lt;/p>
&lt;hr>
&lt;h2 id="-preparación">✅ Preparación
&lt;/h2>&lt;h3 id="-entorno-necesario">◾ Entorno necesario
&lt;/h3>&lt;ul>
&lt;li>Windows 10 (1809+) o Windows 11&lt;/li>
&lt;li>Visual Studio 2019 o posterior (la versión Community está bien)&lt;/li>
&lt;li>Soporte para C++/WinRT (&lt;code>Microsoft.Windows.CppWinRT&lt;/code>)&lt;/li>
&lt;li>Windows SDK 10.0.17763.0 o superior&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="-configuración-del-proyecto">✅ Configuración del proyecto
&lt;/h2>&lt;p>Cree un proyecto con la siguiente configuración en Visual Studio.&lt;/p>
&lt;ul>
&lt;li>
&lt;p>Tipo: Aplicación de escritorio de Windows en C++ (Proyecto vacío)&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Subsistema: Windows (&lt;code>WinMain&lt;/code>)&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Agregue el siguiente paquete desde NuGet&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Microsoft.Windows.CppWinRT
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="-código-de-ejemplo">✅ Código de ejemplo
&lt;/h2>&lt;p>A continuación se muestra un ejemplo de configuración mínima que combina la API de Win32 y &lt;code>Windows.AI.MachineLearning&lt;/code> utilizando &lt;code>WinMain&lt;/code>.&lt;/p>
&lt;blockquote>
&lt;p>※ Nota: El modelo ONNX a utilizar será &lt;code>model.onnx&lt;/code> y debe colocarse en la misma carpeta que el archivo ejecutable.&lt;/p>
&lt;/blockquote>
&lt;h3 id="maincpp">&lt;code>main.cpp&lt;/code>
&lt;/h3>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;windows.h&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;winrt/Windows.AI.MachineLearning.h&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;winrt/Windows.Storage.h&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#pragma comment(lib, &amp;#34;windowsapp&amp;#34;) &lt;/span>&lt;span class="c1">// Para enlazar con WinRT
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">using&lt;/span> &lt;span class="k">namespace&lt;/span> &lt;span class="n">winrt&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">using&lt;/span> &lt;span class="k">namespace&lt;/span> &lt;span class="n">Windows&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">AI&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">MachineLearning&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">using&lt;/span> &lt;span class="k">namespace&lt;/span> &lt;span class="n">Windows&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">Storage&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="n">WINAPI&lt;/span> &lt;span class="nf">WinMain&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">HINSTANCE&lt;/span> &lt;span class="n">hInstance&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">HINSTANCE&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">LPSTR&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">nCmdShow&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Inicialización de WinRT (MTA o STA están bien)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">winrt&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">init_apartment&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Cargar el archivo del modelo
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">auto&lt;/span> &lt;span class="n">modelFile&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">StorageFile&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">GetFileFromPathAsync&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">L&lt;/span>&lt;span class="s">&amp;#34;model.onnx&amp;#34;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">LearningModel&lt;/span> &lt;span class="n">model&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">LearningModel&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">LoadFromStorageFileAsync&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">modelFile&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Crear una sesión
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">LearningModelSession&lt;/span> &lt;span class="n">session&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">model&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">LearningModelBinding&lt;/span> &lt;span class="n">binding&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">session&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Entrada/salida del modelo (aquí se asume una entrada vacía)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// En la práctica, es necesario vincular con TensorFloat, etc.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Ejecutar inferencia
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">auto&lt;/span> &lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">session&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">EvaluateAsync&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">binding&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="sa">L&lt;/span>&lt;span class="s">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">MessageBox&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">nullptr&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="sa">L&lt;/span>&lt;span class="s">&amp;#34;La inferencia se ha completado&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="sa">L&lt;/span>&lt;span class="s">&amp;#34;Windows ML (C++)&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">MB_OK&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">catch&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">winrt&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">hresult_error&lt;/span> &lt;span class="k">const&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">ex&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">MessageBox&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">nullptr&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ex&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">message&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="n">c_str&lt;/span>&lt;span class="p">(),&lt;/span> &lt;span class="sa">L&lt;/span>&lt;span class="s">&amp;#34;Error&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">MB_ICONERROR&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h2 id="-complemento-cómo-especificar-los-tensores-de-entrada-y-salida">✅ Complemento: Cómo especificar los Tensores de entrada y salida
&lt;/h2>&lt;p>Dependiendo del modelo, es necesario &lt;strong>crear y vincular un Tensor&lt;/strong> antes de la inferencia.&lt;/p>
&lt;p>Ejemplo:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Convertir un arreglo de float unidimensional a Tensor
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">float&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">inputData&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="mf">0.5f&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">0.3f&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">0.2f&lt;/span>&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">int64_t&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">shape&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">};&lt;/span> &lt;span class="c1">// Forma: [1, 3]
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">auto&lt;/span> &lt;span class="n">tensor&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">TensorFloat&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">CreateFromArray&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">shape&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">inputData&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Vinculación de entrada (coincidir con el nombre de entrada del modelo)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">binding&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Bind&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">L&lt;/span>&lt;span class="s">&amp;#34;input_0&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">tensor&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>La salida se puede obtener de manera similar con &lt;code>result.Outputs().Lookup(L&amp;quot;output_0&amp;quot;)&lt;/code>.&lt;/p>
&lt;hr>
&lt;h2 id="-puntos-a-tener-en-cuenta-al-depurar">✅ Puntos a tener en cuenta al depurar
&lt;/h2>&lt;ul>
&lt;li>Si el archivo del modelo no existe en la carpeta de ejecución, se producirá un &lt;code>FileNotFoundException&lt;/code>.&lt;/li>
&lt;li>Si los nombres de entrada y salida no coinciden, se producirá un error &lt;code>invalid_argument&lt;/code>.&lt;/li>
&lt;li>Las especificaciones exactas de E/S del modelo se pueden verificar con herramientas como &lt;a class="link" href="https://netron.app" target="_blank" rel="noopener"
>Netron&lt;/a>.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="-resumen">✅ Resumen
&lt;/h2>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Elemento&lt;/th>
&lt;th>Detalle&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>API utilizada&lt;/td>
&lt;td>Windows.AI.MachineLearning (WinRT)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Lenguaje&lt;/td>
&lt;td>C++ (basado en Win32)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Método recomendado&lt;/td>
&lt;td>A través de las cabeceras C++/WinRT&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Ventajas&lt;/td>
&lt;td>Los modelos ONNX funcionan de forma nativa, también soportan GPU&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Precaución&lt;/td>
&lt;td>Prestar atención a los nombres de entrada del modelo y la forma del Tensor&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="-alternativa-para-los-que-no-quieren-usar-winrt">✅ Alternativa: Para los que no quieren usar WinRT
&lt;/h2>&lt;ul>
&lt;li>Si utiliza &lt;code>ONNX Runtime&lt;/code> de Microsoft, &lt;strong>puede manejar modelos ONNX desde C++ completamente sin WinRT&lt;/strong>.&lt;/li>
&lt;li>Es multiplataforma, lo que permite un código común incluso en Windows/Linux.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="-conclusión">📌 Conclusión
&lt;/h2>&lt;p>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.&lt;/p>
&lt;p>Si desea ejemplos específicos sobre cómo crear modelos ONNX o vincular tensores, ¡planeamos explicarlos en un artículo de seguimiento!&lt;/p></description></item><item><title>Cómo publicar mensajes en Microsoft Teams desde C++ (WinHTTP + Graph API)</title><link>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/</link><pubDate>Mon, 14 Jul 2025 23:40:15 +0900</pubDate><guid>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/</guid><description>&lt;img src="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.png" alt="Featured image of post Cómo publicar mensajes en Microsoft Teams desde C++ (WinHTTP + Graph API)" />&lt;h1 id="cómo-publicar-mensajes-en-microsoft-teams-desde-c-winhttp--graph-api">Cómo publicar mensajes en Microsoft Teams desde C++ (WinHTTP + Graph API)
&lt;/h1>&lt;p>¿Quieres publicar mensajes automáticamente en el chat de Microsoft Teams?&lt;br>
Para eso puedes usar la &lt;strong>Microsoft Graph API&lt;/strong>.&lt;br>
En este artículo, presentaremos un &lt;strong>ejemplo de código en C++ usando WinHTTP ** y los ** pasos de autenticación de la API necesarios&lt;/strong>, paso a paso.&lt;/p>
&lt;hr>
&lt;h2 id="-preparación-necesaria-configuración-de-autenticación-de-microsoft-graph-api">🔧 Preparación necesaria (Configuración de autenticación de Microsoft Graph API)
&lt;/h2>&lt;h3 id="1-registrar-la-aplicación-en-el-portal-de-azure">1. Registrar la aplicación en el portal de Azure
&lt;/h3>&lt;p>Primero, para usar la Microsoft Graph API, debes registrar una aplicación en Azure.&lt;/p>
&lt;ol>
&lt;li>Accede al &lt;a class="link" href="https://portal.azure.com" target="_blank" rel="noopener"
>Azure Portal&lt;/a>&lt;/li>
&lt;li>Ve a &amp;ldquo;&lt;strong>Microsoft Entra ID &lt;strong>&amp;rdquo; &amp;gt; &amp;ldquo;&lt;/strong>+ Agregar &lt;strong>&amp;rdquo; &amp;gt; &amp;ldquo;&lt;/strong> Registros de aplicaciones &lt;strong>&amp;rdquo; &amp;gt; &amp;ldquo;&lt;/strong> Nuevo registro&lt;/strong>&amp;rdquo;&lt;/li>
&lt;li>Ingresa un nombre para la aplicación y haz clic en &amp;ldquo;Registrar&amp;rdquo;&lt;/li>
&lt;/ol>
&lt;h3 id="2-agregar-permisos-de-api">2. Agregar permisos de API
&lt;/h3>&lt;ol>
&lt;li>Ve al menú izquierdo &amp;ldquo;Permisos de API&amp;rdquo;&lt;/li>
&lt;li>En &amp;ldquo;&lt;strong>Microsoft Graph &lt;strong>&amp;rdquo; &amp;gt; &amp;ldquo;&lt;/strong> Permisos delegados &lt;strong>&amp;rdquo; (o seleccionar permisos), busca los siguientes ámbitos (scopes) y haz clic en &amp;ldquo;&lt;/strong> Actualizar permisos&lt;/strong>&amp;rdquo; (o agregar permisos)&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>Chat.ReadWrite&lt;/li>
&lt;li>User.Read&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>※ Si deseas publicar en un canal, también necesitarás &lt;code>ChannelMessage.Send&lt;/code>&lt;/p>
&lt;/blockquote>
&lt;h3 id="3-anotar-el-id-del-cliente-y-el-id-del-inquilino-tenant">3. Anotar el ID del cliente y el ID del inquilino (tenant)
&lt;/h3>&lt;p>Anota los siguientes dos valores que se muestran en la pestaña &amp;ldquo;Información general&amp;rdquo;:&lt;/p>
&lt;ul>
&lt;li>ID de la aplicación (cliente)&lt;/li>
&lt;li>ID del directorio (inquilino)&lt;/li>
&lt;/ul>
&lt;h3 id="4-crear-un-secreto-de-cliente">4. Crear un secreto de cliente
&lt;/h3>&lt;ol>
&lt;li>Ve a la pestaña &amp;ldquo;Certificados y secretos&amp;rdquo;&lt;/li>
&lt;li>Selecciona &amp;ldquo;Nuevo secreto de cliente&amp;rdquo; &amp;gt; Establece una fecha de expiración y haz clic en &amp;ldquo;Agregar&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>Asegúrate de copiar el valor mostrado (secreto) en este momento&lt;/strong>, ya que no podrás verlo después&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="-obtener-el-token-de-acceso-oauth2">🔐 Obtener el token de acceso (OAuth2)
&lt;/h2>&lt;p>Para obtenerlo, usaremos el flujo &lt;code>client_credentials&lt;/code>.&lt;br>
Ejecuta el siguiente comando con curl para obtener el token de acceso.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">curl -X POST ^
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> https://login.microsoftonline.com/&lt;span class="o">{&lt;/span>ID_del_inquilino&lt;span class="o">}&lt;/span>/oauth2/v2.0/token ^
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> -H &lt;span class="s2">&amp;#34;Content-Type: application/x-www-form-urlencoded&amp;#34;&lt;/span> ^
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> -d &lt;span class="s2">&amp;#34;client_id={ID_del_cliente}&amp;#34;&lt;/span> ^
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> -d &lt;span class="s2">&amp;#34;scope=https%3A%2F%2Fgraph.microsoft.com%2F.default&amp;#34;&lt;/span> ^
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> -d &lt;span class="s2">&amp;#34;client_secret={Secreto_de_cliente}&amp;#34;&lt;/span> ^
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> -d &lt;span class="s2">&amp;#34;grant_type=client_credentials&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="ejemplo-de-respuesta">Ejemplo de respuesta
&lt;/h3>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;token_type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s2">&amp;#34;Bearer&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;expires_in&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="mi">3599&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;ext_expires_in&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="mi">3599&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;access_token&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;eyJ0eXAiOiJKV1QiLCJub... (omitido)&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Usaremos este access_token para llamar a la Microsoft Graph API.&lt;/p>
&lt;h2 id="-ejemplo-en-c-para-publicar-en-el-chat-de-teams">💬 Ejemplo en C++ para publicar en el chat de Teams
&lt;/h2>&lt;p>Aquí mostramos un ejemplo en C++ que usa WinHTTP para publicar en el chat.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;span class="lnt">41
&lt;/span>&lt;span class="lnt">42
&lt;/span>&lt;span class="lnt">43
&lt;/span>&lt;span class="lnt">44
&lt;/span>&lt;span class="lnt">45
&lt;/span>&lt;span class="lnt">46
&lt;/span>&lt;span class="lnt">47
&lt;/span>&lt;span class="lnt">48
&lt;/span>&lt;span class="lnt">49
&lt;/span>&lt;span class="lnt">50
&lt;/span>&lt;span class="lnt">51
&lt;/span>&lt;span class="lnt">52
&lt;/span>&lt;span class="lnt">53
&lt;/span>&lt;span class="lnt">54
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;windows.h&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;winhttp.h&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;iostream&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;string&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#pragma comment(lib, &amp;#34;winhttp.lib&amp;#34;)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">PostToTeamsChat&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">const&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">wstring&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">accessToken&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">const&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">wstring&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">chatId&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">const&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">wstring&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">message&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">HINTERNET&lt;/span> &lt;span class="n">hSession&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">WinHttpOpen&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">L&lt;/span>&lt;span class="s">&amp;#34;TeamsPoster/1.0&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">WINHTTP_ACCESS_TYPE_DEFAULT_PROXY&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">WINHTTP_NO_PROXY_NAME&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">WINHTTP_NO_PROXY_BYPASS&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">HINTERNET&lt;/span> &lt;span class="n">hConnect&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">WinHttpConnect&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">hSession&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="sa">L&lt;/span>&lt;span class="s">&amp;#34;graph.microsoft.com&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">INTERNET_DEFAULT_HTTPS_PORT&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">wstring&lt;/span> &lt;span class="n">endpoint&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="sa">L&lt;/span>&lt;span class="s">&amp;#34;/v1.0/chats/&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">chatId&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="sa">L&lt;/span>&lt;span class="s">&amp;#34;/messages&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">HINTERNET&lt;/span> &lt;span class="n">hRequest&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">WinHttpOpenRequest&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">hConnect&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="sa">L&lt;/span>&lt;span class="s">&amp;#34;POST&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">endpoint&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">c_str&lt;/span>&lt;span class="p">(),&lt;/span> &lt;span class="nb">NULL&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">WINHTTP_NO_REFERER&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">WINHTTP_DEFAULT_ACCEPT_TYPES&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">WINHTTP_FLAG_SECURE&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">wstring&lt;/span> &lt;span class="n">jsonBody&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="sa">L&lt;/span>&lt;span class="s">&amp;#34;{&lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s">body&lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s">: {&lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s">content&lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s">: &lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s">&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">message&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="sa">L&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s">}}&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">wstring&lt;/span> &lt;span class="n">headers&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="sa">L&lt;/span>&lt;span class="s">&amp;#34;Authorization: Bearer &amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">accessToken&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="sa">L&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="se">\r\n&lt;/span>&lt;span class="s">Content-Type: application/json&lt;/span>&lt;span class="se">\r\n&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">BOOL&lt;/span> &lt;span class="n">bResult&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">WinHttpSendRequest&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">hRequest&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">headers&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">c_str&lt;/span>&lt;span class="p">(),&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">DWORD&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1L&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">(&lt;/span>&lt;span class="n">LPVOID&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">jsonBody&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">c_str&lt;/span>&lt;span class="p">(),&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">DWORD&lt;/span>&lt;span class="p">)(&lt;/span>&lt;span class="n">jsonBody&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">length&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="k">sizeof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">wchar_t&lt;/span>&lt;span class="p">)),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">(&lt;/span>&lt;span class="n">DWORD&lt;/span>&lt;span class="p">)(&lt;/span>&lt;span class="n">jsonBody&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">length&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="k">sizeof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">wchar_t&lt;/span>&lt;span class="p">)),&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">bResult&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">WinHttpReceiveResponse&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">hRequest&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">NULL&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DWORD&lt;/span> &lt;span class="n">dwSize&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">WinHttpQueryDataAvailable&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">hRequest&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">dwSize&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">dwSize&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">wstring&lt;/span> &lt;span class="n">response&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dwSize&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="k">sizeof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">wchar_t&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">DWORD&lt;/span> &lt;span class="n">dwDownloaded&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">WinHttpReadData&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">hRequest&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">response&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">dwSize&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">dwDownloaded&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">wcout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="sa">L&lt;/span>&lt;span class="s">&amp;#34;Response: &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">response&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">WinHttpCloseHandle&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">hRequest&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">WinHttpCloseHandle&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">hConnect&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">WinHttpCloseHandle&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">hSession&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">wstring&lt;/span> &lt;span class="n">access&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">wstring&lt;/span> &lt;span class="n">chatId&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="sa">L&lt;/span>&lt;span class="s">&amp;#34;19:&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">wstring&lt;/span> &lt;span class="n">message&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="sa">L&lt;/span>&lt;span class="s">&amp;#34;Hello from C++!&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">wcout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="sa">L&lt;/span>&lt;span class="s">&amp;#34;Enter your access token: &amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">getline&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">wcin&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">access&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">wcout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="sa">L&lt;/span>&lt;span class="s">&amp;#34;Enter chat ID: &amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">getline&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">wcin&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">chatId&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PostToTeamsChat&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">access&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">chatId&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">message&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="-cómo-obtener-el-id-del-chat">🔍 Cómo obtener el ID del chat
&lt;/h2>&lt;p>El ID del chat se puede verificar con GET /v1.0/me/chats.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">curl -X GET ^
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> https://graph.microsoft.com/v1.0/me/chats ^
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> -H &amp;#34;Authorization: Bearer {access_token}&amp;#34; ^
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> -H &amp;#34;Content-Type: application/json&amp;#34;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="ejemplo-de-respuesta-1">Ejemplo de respuesta
&lt;/h3>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;span class="lnt">9
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;value&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;id&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;19:abc123xyz@thread.v2&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;topic&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">null&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;chatType&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;oneOnOne&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="-puntos-a-tener-en-cuenta">📌 Puntos a tener en cuenta
&lt;/h2>&lt;ul>
&lt;li>Este ejemplo es una implementación mínima. En un entorno de producción:
&lt;ul>
&lt;li>Manejo de expiración de tokens&lt;/li>
&lt;li>Verificación del certificado HTTPS&lt;/li>
&lt;li>Mejora en el manejo de errores&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Para publicaciones en canales se usa teams/{team-id}/channels/{channel-id}/messages.&lt;/li>
&lt;li>Para enviar archivos adjuntos, se requiere procesamiento multiparte o la API de Graph Drive.&lt;/li>
&lt;/ul>
&lt;h2 id="resumen">Resumen
&lt;/h2>&lt;h2 id="-resumen">📎 Resumen
&lt;/h2>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Característica&lt;/th>
&lt;th>Descripción&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Graph API&lt;/td>
&lt;td>API oficial para interactuar con Teams&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Registro de aplicación&lt;/td>
&lt;td>Procedimientos de autenticación necesarios en Azure&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Token de acceso&lt;/td>
&lt;td>Obtenido a través de OAuth2 y usado para peticiones&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Implementación en C++&lt;/td>
&lt;td>Llama a la Graph API utilizando WinHTTP&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="-próximos-pasos">🚀 Próximos pasos
&lt;/h2>&lt;p>Para ejemplos más avanzados, también es posible lo siguiente:&lt;/p>
&lt;ul>
&lt;li>Publicación en canales de equipos (&lt;code>/teams/{team-id}/channels/...&lt;/code>)&lt;/li>
&lt;li>Publicación con archivos adjuntos&lt;/li>
&lt;li>Cambio entre cuentas de bot o cuentas de usuario&lt;/li>
&lt;li>Implementación completa en C++ incluyendo la obtención del token&lt;/li>
&lt;/ul>
&lt;p>¡Si tienes alguna pregunta o sugerencia, no dudes en comentar!&lt;/p></description></item><item><title>He sido galardonado nuevamente como Microsoft MVP (2025-2026)</title><link>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/</link><pubDate>Sun, 13 Jul 2025 22:01:15 +0900</pubDate><guid>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/</guid><description>&lt;img src="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.png" alt="Featured image of post He sido galardonado nuevamente como Microsoft MVP (2025-2026)" />&lt;h1 id="he-sido-galardonado-nuevamente-como-microsoft-mvp-2025-2026">¡He sido galardonado nuevamente como Microsoft MVP (2025-2026)!
&lt;/h1>&lt;p>Hola, soy kenji.&lt;/p>
&lt;p>Quiero compartir una noticia con ustedes. Este año, he sido galardonado nuevamente como &lt;strong>Microsoft MVP (Most Valuable Professional)&lt;/strong>. Esta es la ** novena vez** que recibo este premio.&lt;/p>
&lt;p>Muchas gracias a todos los que siempre me apoyan.&lt;/p>
&lt;hr>
&lt;h2 id="qué-es-microsoft-mvp">¿Qué es Microsoft MVP?
&lt;/h2>&lt;p>Al escuchar &amp;ldquo;MVP&amp;rdquo;, muchos podrían pensar en el jugador más valioso en los deportes, pero aquí MVP es un &lt;strong>título otorgado a quienes han contribuido a la comunidad técnica de Microsoft&lt;/strong>.&lt;/p>
&lt;p>Específicamente, es un sistema que evalúa actividades de &amp;ldquo;compartir tus conocimientos y experiencias por el bien de alguien&amp;rdquo;, tales como:&lt;/p>
&lt;ul>
&lt;li>Difusión de información en blogs técnicos y redes sociales&lt;/li>
&lt;li>Publicación de código de ejemplo en GitHub&lt;/li>
&lt;li>Presentaciones en grupos de estudio y conferencias&lt;/li>
&lt;li>Respuestas en sitios de preguntas y respuestas (Q&amp;amp;A)&lt;/li>
&lt;li>Intercambio técnico y colaboración con desarrolladores en el extranjero&lt;/li>
&lt;li>Participación y publicaciones en comunidades donde los ingenieros se conectan&lt;/li>
&lt;/ul>
&lt;p>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.&lt;/p>
&lt;hr>
&lt;h2 id="en-qué-me-he-centrado-el-último-año">En qué me he centrado el último año
&lt;/h2>&lt;p>Este año, me he centrado en la difusión de información con una conciencia de &lt;strong>&amp;ldquo;claridad&amp;rdquo; y &amp;ldquo;accesibilidad&amp;rdquo;&lt;/strong> de la tecnología.&lt;/p>
&lt;ul>
&lt;li>Publicación de código de ejemplo práctico en GitHub&lt;/li>
&lt;li>Presentaciones en grupos de estudio y conferencias (tanto a nivel nacional como internacional)&lt;/li>
&lt;li>Difusión regular de información a través de blogs técnicos y redes sociales&lt;/li>
&lt;li>Actividad continua de respuestas en sitios de preguntas y respuestas (Q&amp;amp;A)&lt;/li>
&lt;li>Intercambio de conocimientos en sitios de comunidades de ingenieros&lt;/li>
&lt;li>Interacción y verificación conjunta con ingenieros en el extranjero&lt;/li>
&lt;/ul>
&lt;p>Sobre todo, publicar código en GitHub ha sido muy memorable porque a veces recibo comentarios como &amp;ldquo;¡Estaba atascado en lo mismo, así que me salvó!&amp;rdquo;, lo que me hizo darme cuenta de que mis esfuerzos están ayudando al desarrollo de otras personas.&lt;/p>
&lt;p>Además, en mis presentaciones en eventos, a veces recibo comentarios como &amp;ldquo;Fue fácil de entender incluso para principiantes&amp;rdquo;, lo que también sirvió como una buena oportunidad para pensar en &amp;ldquo;¿Qué hace que una explicación técnica se transmita bien?&amp;rdquo;.&lt;/p>
&lt;hr>
&lt;h2 id="hacia-el-próximo-año">Hacia el próximo año
&lt;/h2>&lt;p>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 &lt;strong>conocimiento real como &amp;ldquo;información de primera mano&amp;rdquo;&lt;/strong>, como las experiencias reales y los puntos de tropiezo que he obtenido al probar las cosas por mí mismo.&lt;/p>
&lt;p>El próximo año, también me gustaría desafiarme a difundir &lt;strong>&amp;ldquo;contenido técnico visualmente fácil de entender&amp;rdquo; que incorpore videos y diagramas&lt;/strong>. Espero poder aumentar la cantidad de resultados que puedan ayudar a resolver los problemas de alguien al menos un poco.&lt;/p>
&lt;hr>
&lt;h2 id="finalmente">Finalmente
&lt;/h2>&lt;p>El título de MVP es, al fin y al cabo, solo un punto de paso.&lt;/p>
&lt;p>A partir de ahora, sin forzarme y a mi propio ritmo.
Pero asegurándome de ser útil para alguien.&lt;/p>
&lt;p>&amp;ldquo;Me salvó mientras investigaba&amp;rdquo;
&amp;ldquo;¡Este ejemplo funcionó!&amp;rdquo;
&amp;ldquo;Esta historia fue fácil de entender&amp;rdquo;&lt;/p>
&lt;p>Quiero seguir siendo un ingeniero del que se puedan decir cosas así.&lt;/p>
&lt;p>Espero contar con su apoyo en el futuro.&lt;/p>
&lt;ul>
&lt;li>GitHub: &lt;a class="link" href="https://github.com/kenjinote" target="_blank" rel="noopener"
>https://github.com/kenjinote&lt;/a>&lt;/li>
&lt;li>Blog técnico: &lt;a class="link" href="https://hack.jp" target="_blank" rel="noopener"
>https://hack.jp&lt;/a>&lt;/li>
&lt;li>X: &lt;a class="link" href="https://twitter.com/kenjinote" target="_blank" rel="noopener"
>https://twitter.com/kenjinote&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>He vuelto a recibir el premio Microsoft MVP (2024-2025)</title><link>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/</link><pubDate>Tue, 03 Sep 2024 21:25:20 +0900</pubDate><guid>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/</guid><description>&lt;img src="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.png" alt="Featured image of post He vuelto a recibir el premio Microsoft MVP (2024-2025)" />&lt;h1 id="he-vuelto-a-recibir-el-premio-microsoft-mvp-2024-2025">He vuelto a recibir el premio Microsoft MVP (2024-2025)
&lt;/h1>&lt;p>&lt;img src="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_1.png"
width="510"
height="680"
srcset="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_1_hu43fc94f004bc47efe4ebeb44e3c1c9ff_744182_480x0_resize_box_3.png 480w, 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_1_hu43fc94f004bc47efe4ebeb44e3c1c9ff_744182_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="img\_1.png"
class="gallery-image"
data-flex-grow="75"
data-flex-basis="180px"
>&lt;/p>
&lt;p>Hola, soy kenji.
Les informo que este año también he sido galardonado con el premio &lt;strong>Microsoft MVP (Most Valuable Professional)&lt;/strong>. Esta es la octava vez que recibo este premio.&lt;/p>
&lt;p>Ya que estamos, me gustaría escribir un poco sobre qué es exactamente el premio MVP.&lt;/p>
&lt;hr>
&lt;h2 id="qué-es-el-microsoft-mvp">¿Qué es el Microsoft MVP?
&lt;/h2>&lt;p>Aunque se llame MVP, no estamos hablando del jugador más valioso en los deportes (aunque a veces me lo preguntan&amp;hellip;).
&lt;strong>Microsoft MVP (Most Valuable Professional)&lt;/strong> 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.&lt;/p>
&lt;p>Escribir en blogs técnicos, responder preguntas en sitios de Q&amp;amp;A,
publicar código de ejemplo, o dar charlas en eventos.
&amp;ldquo;Compartir lo que sabes de una manera que sea útil para alguien más&amp;rdquo; — ese tipo de esfuerzo constante es lo que se valora.&lt;/p>
&lt;p>Hay 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.&lt;/p>
&lt;hr>
&lt;h2 id="razones-del-premio">Razones del premio
&lt;/h2>&lt;p>Esta vez he vuelto a ser premiado en la categoría de &amp;ldquo;Developer Technologies&amp;rdquo; (Tecnologías para Desarrolladores).
Durante el último año, he estado realizando las siguientes actividades:&lt;/p>
&lt;ul>
&lt;li>Escribir en el blog sobre tecnologías relacionadas con Microsoft&lt;/li>
&lt;li>Responder en sitios de Q&amp;amp;A técnicos&lt;/li>
&lt;li>Publicar código de ejemplo en GitHub&lt;/li>
&lt;li>Dar charlas en grupos de estudio y eventos técnicos, etc.&lt;/li>
&lt;/ul>
&lt;p>Ninguna de estas cosas es extraordinaria, pero
siempre he intentado compartir &amp;ldquo;cosas que probé y funcionaron&amp;rdquo; o &amp;ldquo;problemas con los que tropecé pero pude resolver&amp;rdquo;
de manera que puedan ser útiles aunque sea un poco.&lt;/p>
&lt;p>Estoy sinceramente feliz de que esto se haya materializado de esta manera.&lt;/p>
&lt;hr>
&lt;h2 id="sobre-el-futuro">Sobre el futuro
&lt;/h2>&lt;p>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 &amp;ldquo;información de primera mano&amp;rdquo;, como qué tal fue al usar algo realmente, o qué partes fueron difíciles de entender.&lt;/p>
&lt;p>A 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: &amp;ldquo;Ah, eso me ayudó&amp;rdquo;.&lt;/p>
&lt;p>Espero contar con su apoyo en el futuro.&lt;/p></description></item><item><title>Cómo deshacer git reset</title><link>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/</link><pubDate>Wed, 15 May 2024 23:32:43 +0900</pubDate><guid>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/</guid><description>&lt;img src="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.png" alt="Featured image of post Cómo deshacer git reset" />&lt;h1 id="cómo-deshacer-git-reset">Cómo deshacer git reset
&lt;/h1>&lt;p>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).&lt;/p>
&lt;ol>
&lt;li>Verifica el ID del commit antes del reset con &lt;code>git reflog&lt;/code>&lt;/li>
&lt;li>Vuelve al estado antes del reset con &lt;code>git reset --hard HEAD@{número}&lt;/code>&lt;/li>
&lt;/ol>
&lt;p>Eso es todo sobre cómo deshacer un git reset.&lt;/p></description></item><item><title>'Qué hacer cuando GitHub Copilot deja de funcionar debido a un error de certificado'</title><link>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/</link><pubDate>Sun, 21 Apr 2024 18:47:26 +0900</pubDate><guid>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/</guid><description>&lt;img src="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.png" alt="Featured image of post 'Qué hacer cuando GitHub Copilot deja de funcionar debido a un error de certificado'" />&lt;h1 id="qué-hacer-cuando-aparece-el-siguiente-error-en-github-copilot">Qué hacer cuando aparece el siguiente error en GitHub Copilot
&lt;/h1>&lt;p>GitHub Copilot dejó de funcionar alrededor del 19 de abril de 2024. El mensaje de error es el siguiente:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">[ERROR] [ghostText] [2024-04-21T04:06:46.900Z] Error on ghost text request: (FetchError) unable to verify the first certificate
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[ERROR] [certificates] [2024-04-21T04:06:46.901Z] Your current Copilot license doesn&amp;#39;t support proxy connections with custom certificates. Please visit https://gh.io/copilot-network-errors to learn more. Original cause: {&amp;#34;type&amp;#34;:&amp;#34;system&amp;#34;,&amp;#34;_name&amp;#34;:&amp;#34;FetchError&amp;#34;,&amp;#34;code&amp;#34;:&amp;#34;UNABLE_TO_VERIFY_LEAF_SIGNATURE&amp;#34;}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="solución">Solución
&lt;/h2>&lt;p>Parece ser un problema con ESET. En la configuración avanzada de ESET, desactiva la opción &amp;ldquo;Habilitar SSL/TLS&amp;rdquo;.
&lt;img src="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_1.png"
width="679"
height="468"
srcset="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_1_hu79798d24a79f4dc94eb7f8ca51727896_114738_480x0_resize_box_3.png 480w, 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_1_hu79798d24a79f4dc94eb7f8ca51727896_114738_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="img_1.png"
class="gallery-image"
data-flex-grow="145"
data-flex-basis="348px"
>&lt;/p>
&lt;h2 id="referencia">Referencia
&lt;/h2>&lt;p>Parece que el mismo error está ocurriendo con AWS CDK.&lt;/p>
&lt;ul>
&lt;li>&lt;a class="link" href="https://repost.aws/questions/QU2H94hF04SIuEVejK_a1mtQ/aws-cdk-bootstrap-certificate-warning-error" target="_blank" rel="noopener"
>AWS CDK bootstrap certificate warning-error&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Qué hacer cuando aparece ''Temporary failure resolving~'' en WSL</title><link>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/</link><pubDate>Sun, 31 Mar 2024 16:57:33 +0900</pubDate><guid>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/</guid><description>&lt;img src="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.png" alt="Featured image of post Qué hacer cuando aparece ''Temporary failure resolving~'' en WSL" />&lt;h1 id="qué-hacer-cuando-aparece-temporary-failure-resolving-en-wsl">Qué hacer cuando aparece &amp;ldquo;Temporary failure resolving~&amp;rdquo; en WSL
&lt;/h1>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">kenji@MyComputer:~$ sudo apt update
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[sudo] password for kenji:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Err:1 http://archive.ubuntu.com/ubuntu focal InRelease
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Temporary failure resolving &amp;#39;archive.ubuntu.com&amp;#39;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>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.&lt;/p>
&lt;ol>
&lt;li>Inicie WSL.&lt;/li>
&lt;li>Ejecute &lt;code>sudo nano /etc/resolv.conf&lt;/code>.&lt;/li>
&lt;li>Cambie la línea de &lt;code>nameserver&lt;/code> de la siguiente manera.&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">nameserver 8.8.8.8
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;ol start="4">
&lt;li>Guarde con &lt;code>Ctrl&lt;/code> + &lt;code>S&lt;/code> y salga con &lt;code>Ctrl&lt;/code> + &lt;code>X&lt;/code>.&lt;/li>
&lt;li>Ejecute &lt;code>sudo apt update&lt;/code>.&lt;/li>
&lt;li>Si no se muestra el error, el problema está resuelto.&lt;/li>
&lt;/ol>
&lt;h2 id="si-los-pasos-anteriores-no-lo-solucionan">Si los pasos anteriores no lo solucionan
&lt;/h2>&lt;p>Parece que hay casos donde los pasos anteriores no lo solucionan. Consulte el siguiente artículo.&lt;/p>
&lt;ul>
&lt;li>&lt;a class="link" href="https://qiita.com/ryosukeYamazaki/items/c04ec3ff78aac6eb8d26" target="_blank" rel="noopener"
>Cómo solucionar &amp;lsquo;Temporary failure resolving ~&amp;rsquo; al ejecutar apt update en WSL&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Cómo iniciar el editor Hidemaru con el comando ''hide''</title><link>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/</link><pubDate>Fri, 29 Mar 2024 23:45:37 +0900</pubDate><guid>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/</guid><description>&lt;img src="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.png" alt="Featured image of post Cómo iniciar el editor Hidemaru con el comando ''hide''" />&lt;h2 id="te-mostraré-cómo-iniciar-el-editor-hidemaru-con-el-comando-hide">Te mostraré cómo iniciar el editor Hidemaru con el comando &lt;code>hide&lt;/code>.
&lt;/h2>&lt;p>Nota: Se ha comprobado que este método funciona en &lt;code>Windows 10/11&lt;/code>.&lt;/p>
&lt;ol>
&lt;li>Abre el Editor del Registro.&lt;/li>
&lt;li>Ve a &lt;code>HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths&lt;/code>.&lt;/li>
&lt;li>Crea una clave llamada &lt;code>hide.exe&lt;/code> en &lt;code>App Paths&lt;/code>. *El nombre antes de &lt;code>.exe&lt;/code> en el nombre de esta clave será el nombre del comando.&lt;/li>
&lt;li>Establece la ruta al archivo ejecutable del editor Hidemaru en el valor &lt;code>(Predeterminado)&lt;/code> de la clave &lt;code>hide.exe&lt;/code>. En mi entorno era &lt;code>&amp;quot;C:\Program Files (x86)\Hidemaru\Hidemaru.exe&amp;quot;&lt;/code>.&lt;/li>
&lt;li>Crea un valor de cadena llamado &lt;code>Path&lt;/code> en la clave &lt;code>hide.exe&lt;/code>.&lt;/li>
&lt;li>Establece la ruta a la carpeta donde se encuentra el archivo ejecutable del editor Hidemaru en la información del valor de &lt;code>Path&lt;/code>. En mi entorno era &lt;code>&amp;quot;C:\Program Files (x86)\Hidemaru&amp;quot;&lt;/code>.&lt;/li>
&lt;li>Ahora podrás iniciar el editor Hidemaru con el comando &lt;code>hide&lt;/code> en el cuadro de diálogo &lt;em>Ejecutar&lt;/em> (que se muestra presionando la tecla &lt;code>Win&lt;/code> + &lt;code>R&lt;/code>). Además, en el símbolo del sistema puedes iniciar el editor Hidemaru con el comando &lt;code>start hide&lt;/code>.&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Windows Registry Editor Version 5.00
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\hide.exe]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">@=&amp;#34;\&amp;#34;C:\\Program Files (x86)\\Hidemaru\\Hidemaru.exe\&amp;#34;&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;#34;Path&amp;#34;=&amp;#34;\&amp;#34;C:\\Program Files (x86)\\Hidemaru\\\&amp;#34;&amp;#34;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Si guardas el contenido anterior en un archivo &lt;code>.reg&lt;/code> y lo ejecutas, la configuración se agregará al registro.&lt;/p>
&lt;p>&lt;img src="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_1.png"
width="399"
height="206"
srcset="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_1_hue374203b955e2a50cac4186ada52cd43_10600_480x0_resize_box_3.png 480w, 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_1_hue374203b955e2a50cac4186ada52cd43_10600_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="img_1.png"
class="gallery-image"
data-flex-grow="193"
data-flex-basis="464px"
>&lt;/p></description></item><item><title>'Instalar aplicaciones mediante comandos usando WinGet'</title><link>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/</link><pubDate>Wed, 05 Oct 2022 12:15:20 +0900</pubDate><guid>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/</guid><description>&lt;img src="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.png" alt="Featured image of post 'Instalar aplicaciones mediante comandos usando WinGet'" />&lt;h2 id="requisitos-previos">Requisitos previos
&lt;/h2>&lt;p>Debe ser Windows 11&lt;/p>
&lt;h2 id="procedimiento">Procedimiento
&lt;/h2>&lt;ol>
&lt;li>Instalar el &lt;code>Instalador de aplicación&lt;/code> desde Microsoft Store
&lt;a class="link" href="https://www.microsoft.com/store/productId/9NBLGGH4NNS1" target="_blank" rel="noopener"
>https://www.microsoft.com/store/productId/9NBLGGH4NNS1&lt;/a>&lt;/li>
&lt;li>Instalar la aplicación usando el Símbolo del sistema
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="n">winget&lt;/span> &lt;span class="n">install&lt;/span> &lt;span class="n">Google&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">Chrome&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/li>
&lt;/ol>
&lt;h2 id="principales-aplicaciones-que-se-pueden-instalar">Principales aplicaciones que se pueden instalar
&lt;/h2>&lt;ul>
&lt;li>Google Chrome (comando &lt;code>winget install Google.Chrome&lt;/code>)&lt;/li>
&lt;li>Microsoft Edge (comando &lt;code>winget install Microsoft.Edge&lt;/code>)&lt;/li>
&lt;li>Microsoft Teams (comando &lt;code>winget install Microsoft.Teams&lt;/code>)&lt;/li>
&lt;li>Microsoft Office (comando &lt;code>winget install Microsoft.Office&lt;/code>)&lt;/li>
&lt;li>Visual Studio Code (comando &lt;code>winget install vscode&lt;/code>)&lt;/li>
&lt;li>Slack (comando &lt;code>winget install SlackTechnologies.Slack&lt;/code>)&lt;/li>
&lt;li>Discord (comando &lt;code>winget install Discord.Discord&lt;/code>)&lt;/li>
&lt;li>Docker Desktop (comando &lt;code>winget install Docker.DockerDesktop&lt;/code>)&lt;/li>
&lt;li>Git (comando &lt;code>winget install Git&lt;/code>)&lt;/li>
&lt;li>7zip (comando &lt;code>winget install 7zip&lt;/code>)&lt;/li>
&lt;li>VLC (comando &lt;code>winget install VideoLAN.VLC&lt;/code>)&lt;/li>
&lt;/ul>
&lt;h2 id="referencias">Referencias
&lt;/h2>&lt;p>&lt;a class="link" href="https://learn.microsoft.com/ja-jp/windows/package-manager/winget/" target="_blank" rel="noopener"
>Uso de la herramienta winget para instalar y administrar aplicaciones&lt;/a>&lt;/p>
&lt;h3 id="nota-al-margen">Nota al margen
&lt;/h3>&lt;p>Pensé que también podría instalar Paint.Net, pero no pude instalarlo.&lt;/p>
&lt;p>&lt;a class="link" href="https://forums.getpaint.net/topic/118574-please-add-paintnet-to-the-available-packages-for-windows-package-manager-winget/" target="_blank" rel="noopener"
>https://forums.getpaint.net/topic/118574-please-add-paintnet-to-the-available-packages-for-windows-package-manager-winget/&lt;/a>&lt;/p></description></item><item><title>'Eliminar etiquetas en git'</title><link>http://kenji.blog/es/p/git%E3%81%A7%E3%82%BF%E3%82%B0%E3%82%92%E6%B6%88%E3%81%99/</link><pubDate>Sun, 02 Oct 2022 02:18:04 +0900</pubDate><guid>http://kenji.blog/es/p/git%E3%81%A7%E3%82%BF%E3%82%B0%E3%82%92%E6%B6%88%E3%81%99/</guid><description>&lt;img src="http://kenji.blog/p/git%E3%81%A7%E3%82%BF%E3%82%B0%E3%82%92%E6%B6%88%E3%81%99/img.png" alt="Featured image of post 'Eliminar etiquetas en git'" />&lt;h1 id="eliminar-etiquetas-locales">Eliminar etiquetas locales
&lt;/h1>&lt;ol>
&lt;li>Usa &lt;code>git tag&lt;/code> para verificar las etiquetas locales existentes.&lt;/li>
&lt;li>Usa &lt;code>git tag -d v0.1.0&lt;/code> para eliminar una etiqueta. (Especifica la etiqueta que deseas eliminar en lugar de &lt;code>v0.1.0&lt;/code>)&lt;/li>
&lt;/ol>
&lt;h1 id="eliminar-etiquetas-remotas">Eliminar etiquetas remotas
&lt;/h1>&lt;ol>
&lt;li>Usa &lt;code>git ls-remote --tags&lt;/code> para verificar las etiquetas remotas existentes.&lt;/li>
&lt;li>Usa &lt;code>git push origin --delete v0.1.0&lt;/code> para eliminar una etiqueta remota. (Especifica la etiqueta que deseas eliminar en lugar de &lt;code>v0.1.0&lt;/code>)&lt;/li>
&lt;/ol>
&lt;h2 id="referencia">Referencia
&lt;/h2>&lt;p>&lt;a class="link" href="https://qumeru.com/magazine/528" target="_blank" rel="noopener"
>¡Cómo eliminar un tag en git de forma remota y local!&lt;/a>&lt;/p></description></item><item><title>Cómo configurar un dominio personalizado en un repositorio de Github</title><link>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/</link><pubDate>Tue, 13 Sep 2022 01:16:40 +0900</pubDate><guid>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/</guid><description>&lt;img src="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.png" alt="Featured image of post Cómo configurar un dominio personalizado en un repositorio de Github" />&lt;p>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
&lt;a href="https://px.a8.net/svt/ejp?a8mat=3TJBXA+BKRHS2+50+2HHVNM" rel="nofollow">Onamae.com&lt;/a>
&lt;img border="0" width="1" height="1" src="https://www19.a8.net/0.gif?a8mat=3TJBXA+BKRHS2+50+2HHVNM" alt="">.
Puedes realizar la misma configuración reescribiendo el registro A en otros registradores.&lt;/p>
&lt;h2 id="cambiar-la-configuración-de-dns-en-onamaecom">Cambiar la configuración de DNS en Onamae.com
&lt;/h2>&lt;p>Para cambiar la configuración de DNS de tu dominio, inicia sesión en el panel de administración de
&lt;a href="https://px.a8.net/svt/ejp?a8mat=3TJBXA+BKRHS2+50+2HHVNM" rel="nofollow">Onamae.com&lt;/a>
&lt;img border="0" width="1" height="1" src="https://www19.a8.net/0.gif?a8mat=3TJBXA+BKRHS2+50+2HHVNM" alt="">.
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:&lt;/p>
&lt;ol>
&lt;li>Accede a &lt;a class="link" href="https://www.onamae.com/" target="_blank" rel="noopener"
>https://www.onamae.com/&lt;/a> y haz clic en &amp;ldquo;Onamae.com Navi Login&amp;rdquo;.&lt;/li>
&lt;li>Ingresa tu &amp;ldquo;ID de Onamae (ID de miembro)&amp;rdquo; y &amp;ldquo;Contraseña&amp;rdquo; y haz clic en el botón de inicio de sesión.&lt;/li>
&lt;li>Haz clic en &amp;ldquo;Configuración de servidores de nombres&amp;rdquo; (ネームサーバーの設定).&lt;/li>
&lt;li>Haz clic en &amp;ldquo;Configuración DNS del dominio&amp;rdquo; (ドメインのDNS設定).&lt;/li>
&lt;li>Selecciona el dominio que deseas configurar y haz clic en &amp;ldquo;Siguiente&amp;rdquo; (次へ).&lt;/li>
&lt;li>Haz clic en &amp;ldquo;Configurar&amp;rdquo; (設定する) a la derecha de &amp;ldquo;Usar configuración de registros DNS&amp;rdquo; (DNSレコード設定を利用する).&lt;/li>
&lt;li>Selecciona A en TYPE, ingresa 3600 en TTL, e ingresa &amp;ldquo;185.199.108.153&amp;rdquo; en VALUE, y haz clic en &amp;ldquo;Añadir&amp;rdquo; (追加).&lt;/li>
&lt;li>Al igual que en el paso 7, añade también &amp;ldquo;185.199.109.153&amp;rdquo;, &amp;ldquo;185.199.110.153&amp;rdquo; y &amp;ldquo;185.199.111.153&amp;rdquo;.&lt;/li>
&lt;li>Asegúrate de que esté marcada la casilla en &amp;ldquo;Confirmación de cambio de servidor de nombres para configuración de registros DNS&amp;rdquo; (DNSレコード設定用ネームサーバー変更確認) y haz clic en &amp;ldquo;Ir a la pantalla de configuración&amp;rdquo; (設定画面へ進む).&lt;/li>
&lt;li>Si aparece una pantalla que dice &amp;ldquo;Para evitar cambios no deseados en la configuración de DNS&amp;rdquo; (意図しないDNS設定変更を防ぐために), haz clic en &amp;ldquo;No configurar&amp;rdquo; (設定しない) (selecciónalo según sea necesario).&lt;/li>
&lt;li>Confirma los detalles de la configuración y haz clic en &amp;ldquo;Configurar&amp;rdquo; (設定する).
&lt;img src="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/img.png"
width="656"
height="140"
srcset="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/img_hu4809a0e7ac5f7d8dfe8c6643786c9385_7354_480x0_resize_box_3.png 480w, 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/img_hu4809a0e7ac5f7d8dfe8c6643786c9385_7354_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="img.png"
class="gallery-image"
data-flex-grow="468"
data-flex-basis="1124px"
>&lt;/li>
&lt;li>Con esto concluye la configuración de DNS. Puede tardar hasta 72 horas en reflejarse completamente.&lt;/li>
&lt;li>Si no se refleja después de 72 horas, intenta contactar al soporte de Onamae.com.&lt;/li>
&lt;/ol>
&lt;p>Para verificar si la configuración se ha reflejado en tu entorno local, intenta ejecutar los siguientes comandos.
Reemplaza &lt;code>example.com&lt;/code> con el dominio que deseas verificar.&lt;/p>
&lt;h3 id="para-linux-y-mac">Para Linux y Mac
&lt;/h3>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">dig example.com +noall +answer -t A
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Si el resultado se ve así, la configuración se ha reflejado.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">example.com. &lt;span class="m">0&lt;/span> IN A 185.199.108.153
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">example.com. &lt;span class="m">0&lt;/span> IN A 185.199.109.153
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">example.com. &lt;span class="m">0&lt;/span> IN A 185.199.110.153
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">example.com. &lt;span class="m">0&lt;/span> IN A 185.199.111.153
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="para-windows">Para Windows
&lt;/h3>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">nslookup -q&lt;span class="o">=&lt;/span>a example.com 8.8.8.8
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Si el resultado se ve así, la configuración se ha reflejado.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;span class="lnt">9
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">Servidor: dns.google
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Address: 8.8.8.8
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Respuesta no autoritativa:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Nombre: example.com
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Addresses: 185.199.108.153
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 185.199.109.153
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 185.199.110.153
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 185.199.111.153
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="configurar-un-dominio-personalizado-en-un-repositorio-de-github">Configurar un dominio personalizado en un repositorio de Github
&lt;/h2>&lt;ol>
&lt;li>Abre la página del repositorio y haz clic en &amp;ldquo;Settings&amp;rdquo; (Configuración).&lt;/li>
&lt;li>Haz clic en &amp;ldquo;Pages&amp;rdquo;.&lt;/li>
&lt;li>Si vas a publicar el código fuente del repositorio tal cual, selecciona &amp;ldquo;Deploy from a branch&amp;rdquo; en Source. Si vas a compilar el código fuente con HUGO u otro generador, selecciona &amp;ldquo;GitHub Actions&amp;rdquo;.&lt;/li>
&lt;li>En Branch, selecciona la rama que deseas publicar y haz clic en &amp;ldquo;Save&amp;rdquo;.&lt;/li>
&lt;li>En &amp;ldquo;Custom domain&amp;rdquo;, ingresa el dominio que adquiriste y haz clic en &amp;ldquo;Save&amp;rdquo;.&lt;/li>
&lt;li>Si es necesario, marca la casilla &amp;ldquo;Enforce HTTPS&amp;rdquo; para habilitar el soporte HTTPS.&lt;/li>
&lt;/ol>
&lt;p>[PR]
&lt;a href="https://px.a8.net/svt/ejp?a8mat=3TJBXA+BKRHS2+50+2HQGAP" rel="nofollow">
&lt;img border="0" width="468" height="60" alt="" src="https://www24.a8.net/svt/bgt?aid=231009310700&amp;wid=003&amp;eno=01&amp;mid=s00000000018015072000&amp;mc=1">&lt;/a>
&lt;img border="0" width="1" height="1" src="https://www14.a8.net/0.gif?a8mat=3TJBXA+BKRHS2+50+2HQGAP" alt="">&lt;/p></description></item><item><title>Uso de GitHub Copilot en IntelliJ IDEA</title><link>http://kenji.blog/es/p/intellij-idea%E3%81%A7github-copilot%E3%82%92%E4%BD%BF%E3%81%86/</link><pubDate>Sat, 10 Sep 2022 09:44:55 +0900</pubDate><guid>http://kenji.blog/es/p/intellij-idea%E3%81%A7github-copilot%E3%82%92%E4%BD%BF%E3%81%86/</guid><description>&lt;img src="http://kenji.blog/p/intellij-idea%E3%81%A7github-copilot%E3%82%92%E4%BD%BF%E3%81%86/images/img.png" alt="Featured image of post Uso de GitHub Copilot en IntelliJ IDEA" />&lt;h1 id="introducción">Introducción
&lt;/h1>&lt;p>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.&lt;/p>
&lt;h1 id="método-de-instalación">Método de instalación
&lt;/h1>&lt;ol>
&lt;li>Selecciona Settings desde el menú File en IntelliJ IDEA.&lt;/li>
&lt;li>Selecciona Plugins y busca &amp;ldquo;GitHub Copilot&amp;rdquo; en la búsqueda.
&lt;img src="http://kenji.blog/p/intellij-idea%E3%81%A7github-copilot%E3%82%92%E4%BD%BF%E3%81%86/images/img_0.png"
width="984"
height="713"
srcset="http://kenji.blog/p/intellij-idea%E3%81%A7github-copilot%E3%82%92%E4%BD%BF%E3%81%86/images/img_0_hu1a17f06d84f4c3bc905993428da2585e_52443_480x0_resize_box_3.png 480w, http://kenji.blog/p/intellij-idea%E3%81%A7github-copilot%E3%82%92%E4%BD%BF%E3%81%86/images/img_0_hu1a17f06d84f4c3bc905993428da2585e_52443_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="img.png"
class="gallery-image"
data-flex-grow="138"
data-flex-basis="331px"
>&lt;/li>
&lt;li>Instala usando el botón de instalación.
&lt;img src="http://kenji.blog/p/intellij-idea%E3%81%A7github-copilot%E3%82%92%E4%BD%BF%E3%81%86/images/img_1.png"
width="440"
height="288"
srcset="http://kenji.blog/p/intellij-idea%E3%81%A7github-copilot%E3%82%92%E4%BD%BF%E3%81%86/images/img_1_hu760c08385147deb656e4c3f97738e20a_11542_480x0_resize_box_3.png 480w, http://kenji.blog/p/intellij-idea%E3%81%A7github-copilot%E3%82%92%E4%BD%BF%E3%81%86/images/img_1_hu760c08385147deb656e4c3f97738e20a_11542_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="img_1.png"
class="gallery-image"
data-flex-grow="152"
data-flex-basis="366px"
>&lt;/li>
&lt;li>Presiona el botón Restart IDE para reiniciar IntelliJ IDEA.
&lt;img src="http://kenji.blog/p/intellij-idea%E3%81%A7github-copilot%E3%82%92%E4%BD%BF%E3%81%86/images/img_2.png"
width="984"
height="713"
srcset="http://kenji.blog/p/intellij-idea%E3%81%A7github-copilot%E3%82%92%E4%BD%BF%E3%81%86/images/img_2_hue7ac4db80b402fe88ff676c2505b2e26_63613_480x0_resize_box_3.png 480w, http://kenji.blog/p/intellij-idea%E3%81%A7github-copilot%E3%82%92%E4%BD%BF%E3%81%86/images/img_2_hue7ac4db80b402fe88ff676c2505b2e26_63613_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="img_2.png"
class="gallery-image"
data-flex-grow="138"
data-flex-basis="331px"
>
&lt;img src="http://kenji.blog/p/intellij-idea%E3%81%A7github-copilot%E3%82%92%E4%BD%BF%E3%81%86/images/img_3.png"
width="370"
height="128"
srcset="http://kenji.blog/p/intellij-idea%E3%81%A7github-copilot%E3%82%92%E4%BD%BF%E3%81%86/images/img_3_huf684fa748633ae887c193539a3f1f778_4849_480x0_resize_box_3.png 480w, http://kenji.blog/p/intellij-idea%E3%81%A7github-copilot%E3%82%92%E4%BD%BF%E3%81%86/images/img_3_huf684fa748633ae887c193539a3f1f778_4849_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="img_3.png"
class="gallery-image"
data-flex-grow="289"
data-flex-basis="693px"
>
La instalación se completa después de reiniciar IntelliJ IDEA.&lt;/li>
&lt;/ol>
&lt;h1 id="activación">Activación
&lt;/h1>&lt;ol>
&lt;li>Haz clic en el ícono en la parte inferior derecha.&lt;/li>
&lt;li>Haz clic en Login to Github.
&lt;img src="http://kenji.blog/p/intellij-idea%E3%81%A7github-copilot%E3%82%92%E4%BD%BF%E3%81%86/images/img_4.png"
width="179"
height="97"
srcset="http://kenji.blog/p/intellij-idea%E3%81%A7github-copilot%E3%82%92%E4%BD%BF%E3%81%86/images/img_4_huda05efd9621c0a19fb78fc4f90866e22_2661_480x0_resize_box_3.png 480w, http://kenji.blog/p/intellij-idea%E3%81%A7github-copilot%E3%82%92%E4%BD%BF%E3%81%86/images/img_4_huda05efd9621c0a19fb78fc4f90866e22_2661_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="img_4.png"
class="gallery-image"
data-flex-grow="184"
data-flex-basis="442px"
>&lt;/li>
&lt;li>Haz clic en el botón Copy and Open.
&lt;img src="http://kenji.blog/p/intellij-idea%E3%81%A7github-copilot%E3%82%92%E4%BD%BF%E3%81%86/images/img_6.png"
width="422"
height="199"
srcset="http://kenji.blog/p/intellij-idea%E3%81%A7github-copilot%E3%82%92%E4%BD%BF%E3%81%86/images/img_6_hua124fecdd3632e6b95f8259e5e606e1a_8284_480x0_resize_box_3.png 480w, http://kenji.blog/p/intellij-idea%E3%81%A7github-copilot%E3%82%92%E4%BD%BF%E3%81%86/images/img_6_hua124fecdd3632e6b95f8259e5e606e1a_8284_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="img_6.png"
class="gallery-image"
data-flex-grow="212"
data-flex-basis="508px"
>&lt;/li>
&lt;li>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.
&lt;img src="http://kenji.blog/p/intellij-idea%E3%81%A7github-copilot%E3%82%92%E4%BD%BF%E3%81%86/images/img_7.png"
width="579"
height="530"
srcset="http://kenji.blog/p/intellij-idea%E3%81%A7github-copilot%E3%82%92%E4%BD%BF%E3%81%86/images/img_7_hub4e276df82537681adc4331944f40166_19231_480x0_resize_box_3.png 480w, http://kenji.blog/p/intellij-idea%E3%81%A7github-copilot%E3%82%92%E4%BD%BF%E3%81%86/images/img_7_hub4e276df82537681adc4331944f40166_19231_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="img_7.png"
class="gallery-image"
data-flex-grow="109"
data-flex-basis="262px"
>&lt;/li>
&lt;li>Haz clic en el botón Authorize GitHub Copilot Plugin.
&lt;img src="http://kenji.blog/p/intellij-idea%E3%81%A7github-copilot%E3%82%92%E4%BD%BF%E3%81%86/images/img_8.png"
width="546"
height="689"
srcset="http://kenji.blog/p/intellij-idea%E3%81%A7github-copilot%E3%82%92%E4%BD%BF%E3%81%86/images/img_8_hu1e48fa0fb5989dc3e0616b0ee84b6476_33153_480x0_resize_box_3.png 480w, http://kenji.blog/p/intellij-idea%E3%81%A7github-copilot%E3%82%92%E4%BD%BF%E3%81%86/images/img_8_hu1e48fa0fb5989dc3e0616b0ee84b6476_33153_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="img_8.png"
class="gallery-image"
data-flex-grow="79"
data-flex-basis="190px"
>
&lt;img src="http://kenji.blog/p/intellij-idea%E3%81%A7github-copilot%E3%82%92%E4%BD%BF%E3%81%86/images/img_9.png"
width="454"
height="337"
srcset="http://kenji.blog/p/intellij-idea%E3%81%A7github-copilot%E3%82%92%E4%BD%BF%E3%81%86/images/img_9_hu73bf5cd6f6a7ddf7aa8e1b63387b9c7d_7965_480x0_resize_box_3.png 480w, http://kenji.blog/p/intellij-idea%E3%81%A7github-copilot%E3%82%92%E4%BD%BF%E3%81%86/images/img_9_hu73bf5cd6f6a7ddf7aa8e1b63387b9c7d_7965_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="img_9.png"
class="gallery-image"
data-flex-grow="134"
data-flex-basis="323px"
>
La activación se completa si se muestra la pantalla anterior.&lt;/li>
&lt;/ol>
&lt;h1 id="probándolo">Probándolo
&lt;/h1>&lt;p>&lt;img src="http://kenji.blog/p/intellij-idea%E3%81%A7github-copilot%E3%82%92%E4%BD%BF%E3%81%86/images/img_10.png"
width="330"
height="136"
srcset="http://kenji.blog/p/intellij-idea%E3%81%A7github-copilot%E3%82%92%E4%BD%BF%E3%81%86/images/img_10_hu25143f366631b8ce9af8689b387ca520_6039_480x0_resize_box_3.png 480w, http://kenji.blog/p/intellij-idea%E3%81%A7github-copilot%E3%82%92%E4%BD%BF%E3%81%86/images/img_10_hu25143f366631b8ce9af8689b387ca520_6039_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="img_10.png"
class="gallery-image"
data-flex-grow="242"
data-flex-basis="582px"
>
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!&lt;/p></description></item></channel></rss>