<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Инструменты И Среда Разработки on kenji.blog</title><link>http://kenji.blog/ru/categories/%D0%B8%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B-%D0%B8-%D1%81%D1%80%D0%B5%D0%B4%D0%B0-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8/</link><description>Recent content in Инструменты И Среда Разработки on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>ru</language><copyright>kenjinote</copyright><lastBuildDate>Sat, 19 Jul 2025 10:03:51 +0900</lastBuildDate><atom:link href="http://kenji.blog/ru/categories/%D0%B8%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B-%D0%B8-%D1%81%D1%80%D0%B5%D0%B4%D0%B0-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8/index.xml" rel="self" type="application/rss+xml"/><item><title>Как вызвать Microsoft.Windows.AI из C++</title><link>http://kenji.blog/ru/p/kak-vyzvat-microsoft-windows-ai-iz-c-/</link><pubDate>Sat, 19 Jul 2025 10:03:51 +0900</pubDate><guid>http://kenji.blog/ru/p/kak-vyzvat-microsoft-windows-ai-iz-c-/</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 Как вызвать Microsoft.Windows.AI из C++" />&lt;h1 id="-как-вызвать-microsoftwindowsai-из-c-с-примером-кода">🎯 Как вызвать &lt;code>Microsoft.Windows.AI&lt;/code> из C++ [с примером кода]
&lt;/h1>&lt;p>Начиная с Windows 10, Windows стандартно поставляется с &lt;strong>средой выполнения, которая может выполнять модели ИИ в формате ONNX&lt;/strong>. Это &lt;strong>Windows ML (Windows.AI.MachineLearning)&lt;/strong>.&lt;/p>
&lt;p>В этой статье подробно объясняется, как вызвать &lt;code>Microsoft.Windows.AI.MachineLearning&lt;/code> из &lt;strong>C++ (на базе приложения Win32)&lt;/strong>, с &lt;strong>примером кода&lt;/strong>.&lt;/p>
&lt;hr>
&lt;h2 id="-подготовка">✅ Подготовка
&lt;/h2>&lt;h3 id="-требования">◾ Требования
&lt;/h3>&lt;ul>
&lt;li>Windows 10 (1809+) или Windows 11&lt;/li>
&lt;li>Visual Studio 2019 или новее (подойдет версия Community)&lt;/li>
&lt;li>Поддержка C++/WinRT (&lt;code>Microsoft.Windows.CppWinRT&lt;/code>)&lt;/li>
&lt;li>Windows SDK 10.0.17763.0 или новее&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="-структура-проекта">✅ Структура проекта
&lt;/h2>&lt;p>Создайте проект со следующей структурой в Visual Studio.&lt;/p>
&lt;ul>
&lt;li>
&lt;p>Тип: Настольное приложение Windows C++ (Пустой проект)&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Подсистема: Windows (&lt;code>WinMain&lt;/code>)&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Добавьте следующий пакет через 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="-пример-кода">✅ Пример кода
&lt;/h2>&lt;p>Ниже приведен минимальный пример, объединяющий Win32 API и &lt;code>Windows.AI.MachineLearning&lt;/code> с использованием &lt;code>WinMain&lt;/code>.&lt;/p>
&lt;blockquote>
&lt;p>※ Используемая модель ONNX — &lt;code>model.onnx&lt;/code>, поместите ее в ту же папку, что и исполняемый файл.&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">// Для связывания с 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">// Инициализация WinRT (допускается MTA или STA)
&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">// Загрузка файла модели
&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">// Создание сессии
&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">// Ввод/вывод модели (здесь пока пустой ввод)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// Фактически требуется привязка с помощью TensorFloat и т. д.
&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">// Выполнение вывода
&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;Вывод завершен&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;Ошибка&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="-дополнение-как-указать-входной-и-выходной-tensor">✅ Дополнение: Как указать входной и выходной Tensor
&lt;/h2>&lt;p>В зависимости от модели перед выводом может потребоваться &lt;strong>создание и привязка Tensor&lt;/strong>.&lt;/p>
&lt;p>Пример:&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">// Преобразование одномерного массива float в 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">// Форма: [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">// Привязка ввода (соответствует имени ввода модели)
&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>Аналогично, вывод можно получить с помощью &lt;code>result.Outputs().Lookup(L&amp;quot;output_0&amp;quot;)&lt;/code>.&lt;/p>
&lt;hr>
&lt;h2 id="-заметки-по-отладке">✅ Заметки по отладке
&lt;/h2>&lt;ul>
&lt;li>Если файл модели не существует в папке выполнения, будет выброшено &lt;code>FileNotFoundException&lt;/code>.&lt;/li>
&lt;li>Если имена ввода/вывода не совпадают, возникнет ошибка &lt;code>invalid_argument&lt;/code>.&lt;/li>
&lt;li>Точные спецификации ввода/вывода модели можно проверить с помощью таких инструментов, как &lt;a class="link" href="https://netron.app" target="_blank" rel="noopener"
>Netron&lt;/a>.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="-заключение">✅ Заключение
&lt;/h2>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Элемент&lt;/th>
&lt;th>Содержание&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Используемый API&lt;/td>
&lt;td>Windows.AI.MachineLearning (WinRT)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Язык&lt;/td>
&lt;td>C++ (на базе Win32)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Рекомендуемый метод&lt;/td>
&lt;td>Через заголовок C++/WinRT&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Преимущества&lt;/td>
&lt;td>Модель ONNX работает изначально, также поддерживается GPU&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Внимание&lt;/td>
&lt;td>Обратите внимание на имя ввода модели и форму Tensor&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="-альтернатива-для-тех-кто-не-хочет-использовать-winrt">✅ Альтернатива: Для тех, кто не хочет использовать WinRT
&lt;/h2>&lt;ul>
&lt;li>Используя &lt;code>ONNX Runtime&lt;/code> от Microsoft, вы можете &lt;strong>полностью обрабатывать модели ONNX из C++ без WinRT&lt;/strong>.&lt;/li>
&lt;li>Поддерживает кроссплатформенность, что позволяет использовать общий код для Windows/Linux.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="-в-завершение">📌 В завершение
&lt;/h2>&lt;p>Windows ML (Microsoft.Windows.AI) — это мощный механизм вывода ИИ, который можно эффективно использовать даже из C++. Если вам нужен встроенный вывод в Windows, пожалуйста, попробуйте.&lt;/p>
&lt;p>Конкретные примеры создания моделей ONNX и привязки Tensor будут объяснены в следующем руководстве!&lt;/p></description></item><item><title>Как отправлять сообщения в Microsoft Teams из C++ (WinHTTP + Graph API)</title><link>http://kenji.blog/ru/p/%D0%BA%D0%B0%D0%BA-%D0%BE%D1%82%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D1%8F%D1%82%D1%8C-%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B2-microsoft-teams-%D0%B8%D0%B7-c-winhttp--graph-api/</link><pubDate>Mon, 14 Jul 2025 23:40:15 +0900</pubDate><guid>http://kenji.blog/ru/p/%D0%BA%D0%B0%D0%BA-%D0%BE%D1%82%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D1%8F%D1%82%D1%8C-%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B2-microsoft-teams-%D0%B8%D0%B7-c-winhttp--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 Как отправлять сообщения в Microsoft Teams из C++ (WinHTTP + Graph API)" />&lt;h1 id="как-отправлять-сообщения-в-microsoft-teams-из-c-winhttp--graph-api">Как отправлять сообщения в Microsoft Teams из C++ (WinHTTP + Graph API)
&lt;/h1>&lt;p>Хотите автоматически отправлять сообщения в чат Microsoft Teams?
Для этого отлично подойдет ** Microsoft Graph API **.
В этой статье мы пошагово рассмотрим ** примеры кода на C++ с использованием WinHTTP ** и ** необходимые шаги для аутентификации API **.&lt;/p>
&lt;hr>
&lt;h2 id="-необходимая-подготовка-настройка-аутентификации-microsoft-graph-api">🔧 Необходимая подготовка (настройка аутентификации Microsoft Graph API)
&lt;/h2>&lt;h3 id="1-регистрация-приложения-на-портале-azure">1. Регистрация приложения на портале Azure
&lt;/h3>&lt;p>Во-первых, чтобы использовать Microsoft Graph API, необходимо зарегистрировать приложение в Azure.&lt;/p>
&lt;ol>
&lt;li>Перейдите на &lt;a class="link" href="https://portal.azure.com" target="_blank" rel="noopener"
>Azure Portal&lt;/a>&lt;/li>
&lt;li>** &amp;ldquo;Microsoft Entra ID&amp;rdquo; ** &amp;gt; ** &amp;ldquo;＋Добавить&amp;rdquo; ** &amp;gt; ** &amp;ldquo;Регистрация приложения&amp;rdquo; ** &amp;gt; ** &amp;ldquo;Новая регистрация&amp;rdquo; **&lt;/li>
&lt;li>Введите любое имя приложения и нажмите «Зарегистрировать»&lt;/li>
&lt;/ol>
&lt;h3 id="2-добавление-разрешений-api">2. Добавление разрешений API
&lt;/h3>&lt;ol>
&lt;li>В левом меню перейдите в «Разрешения API»&lt;/li>
&lt;li>Выберите ** &amp;ldquo;Microsoft Graph&amp;rdquo; ** &amp;gt; ** &amp;ldquo;Выбрать разрешения&amp;rdquo; **, найдите следующие области и нажмите ** &amp;ldquo;Обновить разрешения&amp;rdquo; **&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>Chat.ReadWrite&lt;/li>
&lt;li>User.Read&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>※ Если вы хотите отправлять сообщения в канал, также потребуется &lt;code>ChannelMessage.Send&lt;/code>&lt;/p>
&lt;/blockquote>
&lt;h3 id="3-запишите-идентификатор-клиента-и-идентификатор-арендатора">3. Запишите идентификатор клиента и идентификатор арендатора
&lt;/h3>&lt;p>Сохраните следующие два значения, отображаемые на вкладке «Обзор»:&lt;/p>
&lt;ul>
&lt;li>Идентификатор приложения (клиента)&lt;/li>
&lt;li>Идентификатор каталога (арендатора)&lt;/li>
&lt;/ul>
&lt;h3 id="4-создание-секрета-клиента">4. Создание секрета клиента
&lt;/h3>&lt;ol>
&lt;li>Перейдите на вкладку «Сертификаты и секреты»&lt;/li>
&lt;li>«Новый секрет клиента» &amp;gt; установите срок действия и нажмите «Добавить»&lt;/li>
&lt;li>** Обязательно сразу запишите отображаемое значение (секрет) **&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="-получение-маркера-доступа-oauth2">🔐 Получение маркера доступа (OAuth2)
&lt;/h2>&lt;p>Мы будем использовать поток &lt;code>client_credentials&lt;/code> для получения маркера.
Выполните следующую команду с помощью curl, чтобы получить маркер доступа.&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>Идентификатор_арендатора&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={Идентификатор_клиента}&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={Секрет_клиента}&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="пример-ответа">Пример ответа
&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... (пропущено)&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>Используйте этот &lt;code>access_token&lt;/code> для вызова Microsoft Graph API.&lt;/p>
&lt;h2 id="-пример-на-c-для-отправки-сообщения-в-чат-teams">💬 Пример на C++ для отправки сообщения в чат Teams
&lt;/h2>&lt;p>Ниже приведен пример на C++ с использованием WinHTTP для публикации сообщения в чате.&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="-как-получить-идентификатор-чата">🔍 Как получить идентификатор чата
&lt;/h2>&lt;p>Вы можете узнать идентификатор чата, используя &lt;code>GET /v1.0/me/chats&lt;/code>.&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="пример-ответа-1">Пример ответа
&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="-примечания">📌 Примечания
&lt;/h2>&lt;ul>
&lt;li>Этот пример — минимальная реализация. В реальных условиях:
&lt;ul>
&lt;li>Обработка истечения срока действия маркера&lt;/li>
&lt;li>Проверка сертификата HTTPS&lt;/li>
&lt;li>Улучшенная обработка ошибок&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Для публикации в каналах используйте &lt;code>teams/{team-id}/channels/{channel-id}/messages&lt;/code>.&lt;/li>
&lt;li>Для отправки вложений требуется многокомпонентная обработка или Graph Drive API.&lt;/li>
&lt;/ul>
&lt;h2 id="-заключение">📎 Заключение
&lt;/h2>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Функция&lt;/th>
&lt;th>Описание&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Graph API&lt;/td>
&lt;td>Официальный API для взаимодействия с Teams&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Регистрация приложения&lt;/td>
&lt;td>Необходимые процедуры аутентификации в Azure&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Маркер доступа&lt;/td>
&lt;td>Получен через OAuth2, используется для запросов&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Реализация C++&lt;/td>
&lt;td>Вызов Graph API с использованием WinHTTP&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="-следующие-шаги">🚀 Следующие шаги
&lt;/h2>&lt;p>В качестве более сложных примеров также возможно:&lt;/p>
&lt;ul>
&lt;li>Отправка сообщений в каналы команды (&lt;code>/teams/{team-id}/channels/...&lt;/code>)&lt;/li>
&lt;li>Отправка сообщений с вложениями&lt;/li>
&lt;li>Переключение между учетными записями ботов и пользователей&lt;/li>
&lt;li>Полная реализация на C++, включая получение маркера&lt;/li>
&lt;/ul>
&lt;p>Если у вас есть пожелания, смело оставляйте комментарии!&lt;/p></description></item><item><title>Я снова получил награду Microsoft MVP (2025-2026)</title><link>http://kenji.blog/ru/p/%D1%8F-%D1%81%D0%BD%D0%BE%D0%B2%D0%B0-%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D0%BB-%D0%BD%D0%B0%D0%B3%D1%80%D0%B0%D0%B4%D1%83-microsoft-mvp-2025-2026/</link><pubDate>Sun, 13 Jul 2025 22:01:15 +0900</pubDate><guid>http://kenji.blog/ru/p/%D1%8F-%D1%81%D0%BD%D0%BE%D0%B2%D0%B0-%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D0%BB-%D0%BD%D0%B0%D0%B3%D1%80%D0%B0%D0%B4%D1%83-microsoft-mvp-2025-2026/</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 Я снова получил награду Microsoft MVP (2025-2026)" />&lt;h1 id="я-снова-получил-награду-microsoft-mvp-2025-2026">Я снова получил награду Microsoft MVP (2025-2026)!
&lt;/h1>&lt;p>Здравствуйте, я kenji.&lt;/p>
&lt;p>У меня объявление. В этом году я снова получил звание &lt;strong>Microsoft MVP (Most Valuable Professional)&lt;/strong> . Это уже &lt;strong>девятый&lt;/strong> раз, когда я получаю эту награду.&lt;/p>
&lt;p>Огромное спасибо всем, кто меня всегда поддерживает.&lt;/p>
&lt;hr>
&lt;h2 id="что-такое-microsoft-mvp">Что такое Microsoft MVP?
&lt;/h2>&lt;p>Когда многие слышат &amp;ldquo;MVP&amp;rdquo;, они могут подумать о самом ценном игроке в спорте, но этот MVP — &lt;strong>титул, присуждаемый тем, кто внес вклад в технологическое сообщество Microsoft&lt;/strong> .&lt;/p>
&lt;p>В частности,&lt;/p>
&lt;ul>
&lt;li>Распространение информации через технические блоги и социальные сети&lt;/li>
&lt;li>Публикация примеров кода на GitHub&lt;/li>
&lt;li>Выступления на учебных группах и конференциях&lt;/li>
&lt;li>Ответы на сайтах вопросов и ответов&lt;/li>
&lt;li>Технический обмен и сотрудничество с зарубежными разработчиками&lt;/li>
&lt;li>Участие и публикации в сообществах, объединяющих инженеров&lt;/li>
&lt;/ul>
&lt;p>Таким образом, это система, которая оценивает деятельность по &amp;ldquo;обмену вашими знаниями и опытом ради кого-то другого&amp;rdquo;.&lt;/p>
&lt;p>Победители есть по всему миру, но количество выбранных каждый год ограничено, и повторное получение награды — далеко не простая задача. Именно поэтому для меня большая честь получить такое признание.&lt;/p>
&lt;hr>
&lt;h2 id="на-чем-я-сосредоточился-в-прошедшем-году">На чем я сосредоточился в прошедшем году
&lt;/h2>&lt;p>В этом году я сосредоточился на распространении информации с учетом &lt;strong>&amp;ldquo;понятности&amp;rdquo; технологий и &amp;ldquo;доступности&amp;rdquo;&lt;/strong> .&lt;/p>
&lt;ul>
&lt;li>Публикация практических примеров кода на GitHub&lt;/li>
&lt;li>Выступления на учебных группах и конференциях (как внутри страны, так и за рубежом)&lt;/li>
&lt;li>Регулярное распространение информации через технические блоги и социальные сети&lt;/li>
&lt;li>Непрерывная деятельность по ответам на сайтах вопросов и ответов&lt;/li>
&lt;li>Обмен знаниями на сайтах сообществ инженеров&lt;/li>
&lt;li>Взаимодействие и совместная проверка с зарубежными инженерами&lt;/li>
&lt;/ul>
&lt;p>Среди прочего, публикация кода на GitHub была особенно запоминающейся, так как я получал комментарии вроде &amp;ldquo;Это помогло мне, потому что я столкнулся с той же проблемой!&amp;rdquo;, что заставило меня осознать, что мои усилия помогают другим в их разработке.&lt;/p>
&lt;p>Кроме того, на выступлениях во время мероприятий я иногда получал отзывы, такие как &amp;ldquo;Было понятно даже новичкам&amp;rdquo;, что послужило хорошим поводом задуматься о том, &amp;ldquo;что такое техническое объяснение, которое доходит до слушателя?&amp;rdquo;.&lt;/p>
&lt;hr>
&lt;h2 id="взгляд-в-следующий-год">Взгляд в следующий год
&lt;/h2>&lt;p>Эволюция технологий происходит очень быстро, и даже просто успевать за ней сложно. Тем не менее, я считаю, что есть огромная ценность в предоставлении &lt;strong>реальных знаний как &amp;ldquo;первичной информации&amp;rdquo;&lt;/strong> , таких как фактический опыт, полученный путем проб и ошибок, а также моменты, где я сталкивался с трудностями.&lt;/p>
&lt;p>В следующем году я хочу попробовать свои силы в создании &lt;strong>&amp;ldquo;визуально понятного технического контента&amp;rdquo;, включающего видео и иллюстрации&lt;/strong> . Я надеюсь увеличить количество публикуемых материалов, чтобы хоть немного помочь кому-то разрешить ситуации &amp;ldquo;Я застрял!&amp;rdquo;.&lt;/p>
&lt;hr>
&lt;h2 id="в-заключение">В заключение
&lt;/h2>&lt;p>Титул MVP — это всего лишь ступенька на пути.&lt;/p>
&lt;p>Я буду продолжать в своем собственном темпе, не перенапрягаясь.
Но с целью быть действительно полезным кому-то.&lt;/p>
&lt;p>&amp;ldquo;Ваши исследования мне помогли&amp;rdquo;
&amp;ldquo;Этот пример работает!&amp;rdquo;
&amp;ldquo;Это объяснение было легко понять&amp;rdquo;&lt;/p>
&lt;p>Я хочу продолжать быть таким инженером, о котором люди смогут сказать подобные вещи.&lt;/p>
&lt;p>Спасибо за вашу постоянную поддержку.&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>Технический блог: &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>Я попробовал установить Qt Extension Pack в Visual Studio Code</title><link>http://kenji.blog/ru/p/visual-studio-code-%E3%81%AB-qt-extension-pack-%E3%82%92%E5%85%A5%E3%82%8C%E3%81%A6%E3%81%BF%E3%81%9F/</link><pubDate>Fri, 13 Sep 2024 00:53:53 +0900</pubDate><guid>http://kenji.blog/ru/p/visual-studio-code-%E3%81%AB-qt-extension-pack-%E3%82%92%E5%85%A5%E3%82%8C%E3%81%A6%E3%81%BF%E3%81%9F/</guid><description>&lt;img src="http://kenji.blog/p/visual-studio-code-%E3%81%AB-qt-extension-pack-%E3%82%92%E5%85%A5%E3%82%8C%E3%81%A6%E3%81%BF%E3%81%9F/img_1.png" alt="Featured image of post Я попробовал установить Qt Extension Pack в Visual Studio Code" />&lt;h1 id="начинаем-разработку-на-qt-в-vscode-как-установить-qt-extension-pack">Начинаем разработку на Qt в VSCode: Как установить Qt Extension Pack
&lt;/h1>&lt;p>Привет, я Kenji.
В этот раз я расскажу «Как настроить среду разработки Qt в Visual Studio Code (далее VSCode)».&lt;/p>
&lt;p>В последнее время, в дополнение к официальному Qt Creator, всё больше людей хотят разрабатывать приложения Qt с использованием легковесного и расширяемого VSCode.
Тем, кто ищет такую возможность, я рекомендую ** «Qt Extension Pack» **.
Просто установив этот пакет расширений, вы получите все основные расширения, связанные с Qt, одновременно.&lt;/p>
&lt;hr>
&lt;h2 id="целевая-аудитория">Целевая аудитория
&lt;/h2>&lt;ul>
&lt;li>Те, кто хочет начать разработку GUI-приложений с использованием Qt&lt;/li>
&lt;li>Те, кто хочет разрабатывать в VSCode, а не в Qt Creator&lt;/li>
&lt;li>Те, кому лень искать расширения по одному&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="предварительные-требования">Предварительные требования
&lt;/h2>&lt;ul>
&lt;li>VSCode уже установлен
(&lt;a class="link" href="https://code.visualstudio.com/" target="_blank" rel="noopener"
>Вы можете бесплатно скачать его с официального сайта&lt;/a>)&lt;/li>
&lt;li>Сама библиотека Qt установлена (&lt;a class="link" href="https://www.qt.io/" target="_blank" rel="noopener"
>Официальный сайт Qt&lt;/a>)&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="что-такое-qt-extension-pack">Что такое Qt Extension Pack?
&lt;/h2>&lt;p>Qt Extension Pack — это пакет расширений для VSCode.
Установив его, автоматически добавятся следующие функции:&lt;/p>
&lt;ul>
&lt;li>Поддержка файлов &lt;code>.ui&lt;/code> (Qt Designer)&lt;/li>
&lt;li>Подсветка синтаксиса для файлов &lt;code>.pro&lt;/code> и &lt;code>.qrc&lt;/code>&lt;/li>
&lt;li>Автодополнение кода C++ для Qt, поддержка сборки и отладки&lt;/li>
&lt;li>Qt Resource Browser (просмотр ресурсов)&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="инструкция-по-установке">Инструкция по установке
&lt;/h2>&lt;h3 id="1-откройте-vscode">1. Откройте VSCode
&lt;/h3>&lt;p>Сначала запустите VSCode.&lt;/p>
&lt;h3 id="2-откройте-панель-расширений">2. Откройте панель расширений
&lt;/h3>&lt;p>Нажмите на панель активности слева (иконка с квадратиками), чтобы открыть «Расширения».&lt;/p>
&lt;p>Или вы можете нажать сочетание клавиш
&lt;code>Ctrl + Shift + X&lt;/code>.&lt;/p>
&lt;h3 id="3-найдите-qt-extension-pack">3. Найдите «Qt Extension Pack»
&lt;/h3>&lt;p>Введите следующее ключевое слово в строку поиска:&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">Qt Extension Pack
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;img src="http://kenji.blog/p/visual-studio-code-%E3%81%AB-qt-extension-pack-%E3%82%92%E5%85%A5%E3%82%8C%E3%81%A6%E3%81%BF%E3%81%9F/img.png"
width="867"
height="228"
srcset="http://kenji.blog/p/visual-studio-code-%E3%81%AB-qt-extension-pack-%E3%82%92%E5%85%A5%E3%82%8C%E3%81%A6%E3%81%BF%E3%81%9F/img_hua3a606fe260b4f1c55a0f37b6ed054ec_30325_480x0_resize_box_3.png 480w, http://kenji.blog/p/visual-studio-code-%E3%81%AB-qt-extension-pack-%E3%82%92%E5%85%A5%E3%82%8C%E3%81%A6%E3%81%BF%E3%81%9F/img_hua3a606fe260b4f1c55a0f37b6ed054ec_30325_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="img.png"
class="gallery-image"
data-flex-grow="380"
data-flex-basis="912px"
>&lt;/p>
&lt;h3 id="4-нажмите-кнопку-установки">4. Нажмите кнопку установки
&lt;/h3>&lt;p>Когда появится нужный пакет, нажмите кнопку «Установить».
Это установит сразу несколько следующих расширений:&lt;/p>
&lt;ul>
&lt;li>Qt Language Support&lt;/li>
&lt;li>QML Support&lt;/li>
&lt;li>Qt Designer Integration&lt;/li>
&lt;li>CMake Tools (необходимо для разработки Qt с поддержкой CMake)&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="дополнение-к-настройкам-проекта-пример-cmake--qt">Дополнение к настройкам проекта (пример CMake + Qt)
&lt;/h2>&lt;p>Если вы используете Qt на базе CMake, рекомендуется комбинация со следующими расширениями:&lt;/p>
&lt;ul>
&lt;li>&lt;a class="link" href="https://marketplace.visualstudio.com/items?itemName=ms-vscode.cmake-tools" target="_blank" rel="noopener"
>CMake Tools&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://marketplace.visualstudio.com/items?itemName=twxs.cmake" target="_blank" rel="noopener"
>CMake Language Support&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Кроме того, если вы добавите следующий код в CMakeLists.txt, интеграция с Qt будет проходить более гладко:&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-cmake" data-lang="cmake">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">find_package&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">Qt6&lt;/span> &lt;span class="s">REQUIRED&lt;/span> &lt;span class="s">COMPONENTS&lt;/span> &lt;span class="s">Widgets&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="nb">target_link_libraries&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">MyApp&lt;/span> &lt;span class="s">PRIVATE&lt;/span> &lt;span class="s">Qt6::Widgets&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="err">
&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="бонус-как-открывать-файлы-ui">Бонус: Как открывать файлы .ui?
&lt;/h2>&lt;p>Файлы &lt;code>.ui&lt;/code> можно редактировать в Qt Designer.
В VSCode вы сможете нажать правой кнопкой мыши на файл &lt;code>.ui&lt;/code> → выбрать &lt;code>Open with Qt Designer&lt;/code> (необходимо, чтобы Qt Designer был включен в переменную среды &lt;code>PATH&lt;/code>).&lt;/p>
&lt;hr>
&lt;h2 id="заключение">Заключение
&lt;/h2>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Шаг&lt;/th>
&lt;th>Описание&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>1&lt;/td>
&lt;td>Запуск VSCode&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>2&lt;/td>
&lt;td>Открытие панели расширений&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>3&lt;/td>
&lt;td>Поиск «Qt Extension Pack»&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>4&lt;/td>
&lt;td>Нажатие кнопки установки&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Создание среды Qt в VSCode стало намного проще, чем раньше.
Она имеет достаточно функций, чтобы служить альтернативой Qt Creator, и мы рекомендуем её тем, кто хочет работать легко и быстро.&lt;/p>
&lt;hr>
&lt;h2 id="рекомендуемые-ссылки">Рекомендуемые ссылки
&lt;/h2>&lt;ul>
&lt;li>&lt;a class="link" href="https://www.qt.io/" target="_blank" rel="noopener"
>Официальный сайт Qt&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://marketplace.visualstudio.com/items?itemName=TheQtCompany.qt" target="_blank" rel="noopener"
>Qt Extension Pack - Visual Studio Marketplace&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://code.visualstudio.com/" target="_blank" rel="noopener"
>Официальный сайт VSCode&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://marketplace.visualstudio.com/items?itemName=ms-vscode.cmake-tools" target="_blank" rel="noopener"
>Расширение CMake Tools&lt;/a>&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="в-заключение">В заключение
&lt;/h2>&lt;p>В будущем я планирую продолжить разработку, используя UI-инструменты Qt и QML в этой среде.
В следующий раз я планирую объяснить, ** как собрать и запустить приложение Hello World на Qt из VSCode **.&lt;/p>
&lt;p>До скорого!&lt;/p></description></item><item><title>Я снова получил награду Microsoft MVP (2024-2025)</title><link>http://kenji.blog/ru/p/%D1%8F-%D1%81%D0%BD%D0%BE%D0%B2%D0%B0-%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D0%BB-%D0%BD%D0%B0%D0%B3%D1%80%D0%B0%D0%B4%D1%83-microsoft-mvp-2024-2025/</link><pubDate>Tue, 03 Sep 2024 21:25:20 +0900</pubDate><guid>http://kenji.blog/ru/p/%D1%8F-%D1%81%D0%BD%D0%BE%D0%B2%D0%B0-%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D0%BB-%D0%BD%D0%B0%D0%B3%D1%80%D0%B0%D0%B4%D1%83-microsoft-mvp-2024-2025/</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 Я снова получил награду Microsoft MVP (2024-2025)" />&lt;h1 id="я-снова-получил-награду-microsoft-mvp-2024-2025">Я снова получил награду 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>Здравствуйте, это kenji.
Сообщаю вам, что в этом году я снова получил награду &lt;strong>Microsoft MVP (Most Valuable Professional)&lt;/strong>. Это уже моя восьмая награда.&lt;/p>
&lt;p>Воспользовавшись случаем, я решил немного написать о том, что же такое MVP.&lt;/p>
&lt;hr>
&lt;h2 id="что-такое-microsoft-mvp">Что такое Microsoft MVP?
&lt;/h2>&lt;p>Хотя это и называется MVP, речь идет не о самом ценном игроке в спорте (хотя меня иногда об этом спрашивают&amp;hellip;).
&lt;strong>Microsoft MVP (Most Valuable Professional)&lt;/strong> — это звание, присуждаемое людям, которые активно делятся своими знаниями и опытом работы с технологиями Microsoft с сообществом.&lt;/p>
&lt;p>Написание технических блогов, ответы на вопросы на сайтах Q&amp;amp;A,
публикация примеров кода, выступления на мероприятиях.
Оценивается именно такая кропотливая работа: «делиться тем, что знаешь, в форме, полезной для других».&lt;/p>
&lt;p>Обладатели награды есть по всему миру, но их количество каждый год ограничено, и повторно получить ее непросто.
В таких условиях я действительно благодарен за то, что меня снова удостоили этого звания.&lt;/p>
&lt;hr>
&lt;h2 id="о-причинах-получения-награды">О причинах получения награды
&lt;/h2>&lt;p>В этот раз я снова получил награду в категории «Developer Technologies».
За последний год я занимался следующими вещами:&lt;/p>
&lt;ul>
&lt;li>Написание статей в блоге о технологиях, связанных с Microsoft&lt;/li>
&lt;li>Публикация ответов на технических сайтах Q&amp;amp;A&lt;/li>
&lt;li>Публикация примеров кода на GitHub&lt;/li>
&lt;li>Выступления на учебных семинарах и технических мероприятиях и т.д.&lt;/li>
&lt;/ul>
&lt;p>В этом нет ничего особенного, но
я старался делиться «тем, что попробовал, и это сработало» или «тем, с чем возникли трудности, но удалось решить»,
придавая этому максимально полезную форму.&lt;/p>
&lt;p>Я искренне рад, что это принесло такие плоды.&lt;/p>
&lt;hr>
&lt;h2 id="о-планах-на-будущее">О планах на будущее
&lt;/h2>&lt;p>Мир технологий развивается очень быстро, и просто успевать за ним уже сложно.
Но именно поэтому я считаю важным делиться «живой информацией»: как это работает на практике, что было непонятно.&lt;/p>
&lt;p>Я планирую и дальше продолжать в том же духе, в своем собственном темпе, без лишнего напряжения.
Буду рад, если смогу делиться информацией, которая хотя бы в какой-то форме заставит кого-то подумать: «О, это помогло».&lt;/p>
&lt;p>Надеюсь на вашу поддержку и в будущем.&lt;/p></description></item><item><title>Рекомендуемые расширения Visual Studio Code</title><link>http://kenji.blog/ru/p/%D1%80%D0%B5%D0%BA%D0%BE%D0%BC%D0%B5%D0%BD%D0%B4%D1%83%D0%B5%D0%BC%D1%8B%D0%B5-%D1%80%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D1%8F-visual-studio-code/</link><pubDate>Wed, 29 May 2024 17:20:19 +0900</pubDate><guid>http://kenji.blog/ru/p/%D1%80%D0%B5%D0%BA%D0%BE%D0%BC%D0%B5%D0%BD%D0%B4%D1%83%D0%B5%D0%BC%D1%8B%D0%B5-%D1%80%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D1%8F-visual-studio-code/</guid><description>&lt;img src="http://kenji.blog/p/visual-studio-code%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E6%8B%A1%E5%BC%B5%E6%A9%9F%E8%83%BD/img.png" alt="Featured image of post Рекомендуемые расширения Visual Studio Code" />&lt;h1 id="список-рекомендуемых-расширений-visual-studio-code">Список рекомендуемых расширений Visual Studio Code
&lt;/h1>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Категория&lt;/th>
&lt;th>Название&lt;/th>
&lt;th>Разработчик&lt;/th>
&lt;th>Описание&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Управление вирт. машинами и контейнерами&lt;/td>
&lt;td>Remote Devlopment&lt;/td>
&lt;td>Microsoft&lt;/td>
&lt;td>Поддерживает удаленную разработку путем подключения к виртуальным контейнерам/WSL через SSH&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Управление вирт. машинами и контейнерами&lt;/td>
&lt;td>Docker&lt;/td>
&lt;td>Microsoft&lt;/td>
&lt;td>Поддерживает управление контейнерами Docker&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Управление кодом&lt;/td>
&lt;td>GitHub Pull Requests&lt;/td>
&lt;td>GitHub&lt;/td>
&lt;td>Управляет Pull Requests из GitHub в VSCode&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Управление кодом&lt;/td>
&lt;td>GitHub Copilot&lt;/td>
&lt;td>GitHub&lt;/td>
&lt;td>Поддерживает автодополнение кода с помощью ИИ&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Управление кодом&lt;/td>
&lt;td>Git Graph&lt;/td>
&lt;td>mhutchie&lt;/td>
&lt;td>Графически отображает ветки и коммиты Git&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Управление кодом&lt;/td>
&lt;td>Git History&lt;/td>
&lt;td>Don Jayamanne&lt;/td>
&lt;td>Отображает историю Git&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Веб-разработка и браузер&lt;/td>
&lt;td>Debugger for Firefox&lt;/td>
&lt;td>Firefox DevTools&lt;/td>
&lt;td>Позволяет использовать отладчик Firefox в VSCode&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Веб-разработка и браузер&lt;/td>
&lt;td>Microsoft Edge Tool For VScode&lt;/td>
&lt;td>Microsoft&lt;/td>
&lt;td>Позволяет использовать инструменты разработчика Edge в VSCode&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Веб-разработка и браузер&lt;/td>
&lt;td>Vue Language Features(Volar)&lt;/td>
&lt;td>Vue&lt;/td>
&lt;td>Поддерживает языковые функции Vue&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Веб-разработка и браузер&lt;/td>
&lt;td>JavaScript (ES6) code snippets&lt;/td>
&lt;td>charalampos karypidis&lt;/td>
&lt;td>Предоставляет сниппеты для JavaScript&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Веб-разработка и браузер&lt;/td>
&lt;td>Tailwind CSS IntelliSense&lt;/td>
&lt;td>Tailwind Labs&lt;/td>
&lt;td>Предоставляет сниппеты для Tailwind CSS&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Облачная разработка&lt;/td>
&lt;td>AWS Toolkit&lt;/td>
&lt;td>Amazon Web Services&lt;/td>
&lt;td>Поддерживает разработку для AWS&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Облачная разработка&lt;/td>
&lt;td>Azure Tools&lt;/td>
&lt;td>Microsoft&lt;/td>
&lt;td>Поддерживает разработку для Azure&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Облачная разработка&lt;/td>
&lt;td>Google Cloud Tools&lt;/td>
&lt;td>Google Cloud&lt;/td>
&lt;td>Поддерживает разработку для Google Cloud&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Базы данных&lt;/td>
&lt;td>MySQL&lt;/td>
&lt;td>Jun Han&lt;/td>
&lt;td>Поддерживает разработку для MySQL&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Базы данных&lt;/td>
&lt;td>SQL Server(mssql)&lt;/td>
&lt;td>Microsoft&lt;/td>
&lt;td>Поддерживает разработку для SQL Server&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Базы данных&lt;/td>
&lt;td>PostgreSQL&lt;/td>
&lt;td>Chris Kolkman&lt;/td>
&lt;td>Поддерживает разработку для PostgreSQL&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Встраиваемые системы&lt;/td>
&lt;td>PlatformIO&lt;/td>
&lt;td>PlatformIO&lt;/td>
&lt;td>Поддерживает разработку в PlatformIO&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Встраиваемые системы&lt;/td>
&lt;td>Arduino&lt;/td>
&lt;td>Microsoft&lt;/td>
&lt;td>Поддерживает разработку для Arduino&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Встраиваемые системы&lt;/td>
&lt;td>WorkBench&lt;/td>
&lt;td>Particle&lt;/td>
&lt;td>Среда разработки от Particle, поддерживающая разработку для IoT, включая прошивки, библиотеки и интеграцию с облаком&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>C/C++&lt;/td>
&lt;td>C/C++ Extension Pack&lt;/td>
&lt;td>Microsoft&lt;/td>
&lt;td>Поддерживает разработку на C/C++&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>C/C++&lt;/td>
&lt;td>C/C++ Runner&lt;/td>
&lt;td>franneck94&lt;/td>
&lt;td>Запускает код C/C++ (поддерживает компиляторы gcc, msvc, cuda nvccc)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>C/C++&lt;/td>
&lt;td>Cortex-Debug&lt;/td>
&lt;td>marus25&lt;/td>
&lt;td>Поддерживает отладку микроконтроллеров Cortex-A/R/M&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Python&lt;/td>
&lt;td>Python Extension Pack&lt;/td>
&lt;td>Microsoft&lt;/td>
&lt;td>Поддерживает разработку на Python&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Python&lt;/td>
&lt;td>jupyter&lt;/td>
&lt;td>Microsoft&lt;/td>
&lt;td>Поддерживает разработку Jupyter Notebook&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Утилиты и расширения UI&lt;/td>
&lt;td>Makrdown All in One&lt;/td>
&lt;td>Yu Zhang&lt;/td>
&lt;td>Поддерживает написание Markdown&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Утилиты и расширения UI&lt;/td>
&lt;td>Hex Editor&lt;/td>
&lt;td>Microsoft&lt;/td>
&lt;td>Редактирует бинарные файлы&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Утилиты и расширения UI&lt;/td>
&lt;td>vscode-pdf&lt;/td>
&lt;td>tomoki1207&lt;/td>
&lt;td>Отображает PDF файлы&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Утилиты и расширения UI&lt;/td>
&lt;td>Rainbow CSV&lt;/td>
&lt;td>mechatroner&lt;/td>
&lt;td>Отображает CSV файлы в цвете&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Утилиты и расширения UI&lt;/td>
&lt;td>Draw.io Integration&lt;/td>
&lt;td>Henning Dieterichs&lt;/td>
&lt;td>Позволяет использовать Draw.io в VSCode&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Утилиты и расширения UI&lt;/td>
&lt;td>Japanese Language Pack for Visual Studio Code&lt;/td>
&lt;td>Microsoft&lt;/td>
&lt;td>Языковой пакет&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Утилиты и расширения UI&lt;/td>
&lt;td>Live Share&lt;/td>
&lt;td>Microsoft&lt;/td>
&lt;td>Поддерживает совместную работу в реальном времени&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table></description></item><item><title>Как отменить git reset</title><link>http://kenji.blog/ru/p/%D0%BA%D0%B0%D0%BA-%D0%BE%D1%82%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C-git-reset/</link><pubDate>Wed, 15 May 2024 23:32:43 +0900</pubDate><guid>http://kenji.blog/ru/p/%D0%BA%D0%B0%D0%BA-%D0%BE%D1%82%D0%BC%D0%B5%D0%BD%D0%B8%D1%82%D1%8C-git-reset/</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 Как отменить git reset" />&lt;h1 id="как-отменить-git-reset">Как отменить git reset
&lt;/h1>&lt;p>Если вы случайно выполнили git reset после того, как сделали git commit, вот как отменить git reset (как восстановить состояние на момент git commit).&lt;/p>
&lt;ol>
&lt;li>Проверьте ID коммита до сброса с помощью &lt;code>git reflog&lt;/code>&lt;/li>
&lt;li>Вернитесь к состоянию до сброса с помощью &lt;code>git reset --hard HEAD@{число}&lt;/code>&lt;/li>
&lt;/ol>
&lt;p>Вот как можно отменить git reset.&lt;/p></description></item><item><title>Получить только последнюю версию репозитория git</title><link>http://kenji.blog/ru/p/git%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E6%9C%80%E6%96%B0%E3%81%A0%E3%81%91%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B/</link><pubDate>Sat, 27 Apr 2024 02:54:12 +0900</pubDate><guid>http://kenji.blog/ru/p/git%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E6%9C%80%E6%96%B0%E3%81%A0%E3%81%91%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B/</guid><description>&lt;img src="http://kenji.blog/p/git%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E6%9C%80%E6%96%B0%E3%81%A0%E3%81%91%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B/img.png" alt="Featured image of post Получить только последнюю версию репозитория git" />&lt;h1 id="получить-только-последнюю-версию-репозитория">Получить только последнюю версию репозитория
&lt;/h1>&lt;p>Вы можете получить только последнюю версию репозитория с помощью следующей команды.
Это полезно, когда вы хотите быстро загрузить репозиторий для экономии дискового пространства.&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">git clone --depth 1 &amp;lt;URL репозитория&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div></description></item><item><title>Введение в Vim</title><link>http://kenji.blog/ru/p/vim-introduction/</link><pubDate>Fri, 19 Apr 2024 22:06:34 +0900</pubDate><guid>http://kenji.blog/ru/p/vim-introduction/</guid><description>&lt;img src="http://kenji.blog/p/vim%E5%85%A5%E9%96%80/img.png" alt="Featured image of post Введение в Vim" />&lt;p>&lt;img src="http://kenji.blog/p/vim%E5%85%A5%E9%96%80/img_1.png"
width="1920"
height="1080"
srcset="http://kenji.blog/p/vim%E5%85%A5%E9%96%80/img_1_hue190cb5546151f3c9f61d693ae541095_45716_480x0_resize_box_3.png 480w, http://kenji.blog/p/vim%E5%85%A5%E9%96%80/img_1_hue190cb5546151f3c9f61d693ae541095_45716_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="img_1.png"
class="gallery-image"
data-flex-grow="177"
data-flex-basis="426px"
>&lt;/p>
&lt;h1 id="введение-в-vim">Введение в Vim
&lt;/h1>&lt;h2 id="загрузка-и-установка">Загрузка и установка
&lt;/h2>&lt;p>&lt;a class="link" href="https://www.vim.org/download.php" target="_blank" rel="noopener"
>https://www.vim.org/download.php&lt;/a>&lt;/p>
&lt;p>Загрузите и установите модуль для вашей ОС с указанного выше сайта.&lt;/p>
&lt;p>Для Windows, вероятно, лучше всего выбрать &lt;code>gvim_X.X.X_x64_signed.exe&lt;/code>.&lt;/p>
&lt;h2 id="как-запустить">Как запустить
&lt;/h2>&lt;p>В Windows необходимо зарегистрировать папку, содержащую &lt;code>vim.exe&lt;/code>, в переменной среды Path.&lt;/p>
&lt;p>Способ запуска&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">vim
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Если вы хотите запустить, указав имя файла&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">vim filename.txt
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="как-выйти">Как выйти
&lt;/h2>&lt;p>Чтобы выйти, введите &lt;code>:&lt;/code> (двоеточие), затем введите &lt;code>q&lt;/code> и нажмите Enter&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">:q
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Если файл был обновлен, отобразится &lt;code>Нет записи с момента последнего изменения (добавьте ! для игнорирования)&lt;/code>.
Вы можете отменить изменения и принудительно завершить работу.&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">:q!
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Чтобы сохранить файл и выйти&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">:wq
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Следующее означает то же самое.&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">:x
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Вы также можете выйти, дважды нажав &lt;code>z&lt;/code>, удерживая &lt;code>Shift&lt;/code>. (То же, что и :wq)&lt;/p>
&lt;h2 id="режимы">Режимы
&lt;/h2>&lt;p>Vim имеет &lt;code>командный режим&lt;/code> и &lt;code>режим ввода&lt;/code>. Когда вы запускаете vim, он переходит в &lt;code>командный режим&lt;/code>, а при нажатии клавиши &lt;code>i&lt;/code> вы переходите в &lt;code>режим ввода&lt;/code>.&lt;/p>
&lt;p>В &lt;code>режиме ввода&lt;/code> вы можете печатать текст, как обычно. Чтобы перейти из &lt;code>режима ввода&lt;/code> в &lt;code>командный режим&lt;/code>, нажмите клавишу &lt;code>ESC&lt;/code>.&lt;/p>
&lt;p>Особенностью vim является наличие такого переключения режимов.&lt;/p>
&lt;h2 id="перемещение-курсора-и-прокрутка">Перемещение курсора и прокрутка
&lt;/h2>&lt;p>Ниже приведен список команд перемещения курсора и прокрутки в &lt;code>командном режиме&lt;/code>.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Клавиша&lt;/th>
&lt;th>Описание&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>h&lt;/code> (или &lt;code>Ctrl&lt;/code>+&lt;code>H&lt;/code>, &lt;code>BackSpace&lt;/code>, &lt;code>←&lt;/code>)&lt;/td>
&lt;td>Перемещение влево&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>j&lt;/code> (или &lt;code>Ctrl&lt;/code>+&lt;code>J&lt;/code>, &lt;code>N&lt;/code>, &lt;code>↓&lt;/code>)&lt;/td>
&lt;td>Перемещение вниз&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>k&lt;/code> (или &lt;code>Ctrl&lt;/code>+&lt;code>P&lt;/code>, &lt;code>↑&lt;/code>)&lt;/td>
&lt;td>Перемещение вверх&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>l&lt;/code> (или &lt;code>Space&lt;/code>, &lt;code>→&lt;/code>)&lt;/td>
&lt;td>Перемещение вправо&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>+&lt;/code> (или &lt;code>Enter&lt;/code>)&lt;/td>
&lt;td>Перемещение в начало следующей строки&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>-&lt;/code>&lt;/td>
&lt;td>Перемещение в начало предыдущей строки&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code>+&lt;code>B&lt;/code> (или &lt;code>PageUp&lt;/code>)&lt;/td>
&lt;td>Прокрутка вверх&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code>+&lt;code>F&lt;/code> (или &lt;code>PageDown&lt;/code>)&lt;/td>
&lt;td>Прокрутка вниз&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code>+&lt;code>U&lt;/code>&lt;/td>
&lt;td>Прокрутка вверх на пол-экрана&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code>+&lt;code>D&lt;/code>&lt;/td>
&lt;td>Прокрутка вниз на пол-экрана&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code>+&lt;code>Y&lt;/code>&lt;/td>
&lt;td>Прокрутка вверх на 1 строку&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code>+&lt;code>E&lt;/code>&lt;/td>
&lt;td>Прокрутка вниз на 1 строку&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>z&lt;/code> &lt;code>Enter&lt;/code>&lt;/td>
&lt;td>Прокрутка строки с курсором к верхнему краю экрана&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>z&lt;/code> &lt;code>.&lt;/code>&lt;/td>
&lt;td>Прокрутка строки с курсором к центру экрана&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>z&lt;/code> &lt;code>-&lt;/code>&lt;/td>
&lt;td>Прокрутка строки с курсором к нижнему краю экрана&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>0&lt;/code> (или &lt;code>|&lt;/code>)&lt;/td>
&lt;td>Перемещение курсора в начало строки&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>$&lt;/code>&lt;/td>
&lt;td>Перемещение курсора в конец строки&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>^&lt;/code> (или &lt;code>_&lt;/code>)&lt;/td>
&lt;td>Перемещение курсора в начало строки (без учета пробелов, Tab)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>G&lt;/code> (или &lt;code>:$&lt;/code>)&lt;/td>
&lt;td>Перемещение курсора на последнюю строку&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>:номер строки&lt;/code> &lt;code>Enter&lt;/code>&lt;/td>
&lt;td>Переход на указанную строку&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Если после &lt;code>числа&lt;/code> вы введете вышеуказанные клавиши перемещения, вы сможете переместиться столько раз, сколько указано в числе.
(Например, ввод &lt;code>3j&lt;/code> переместит вас на 3 строки вниз от текущего положения курсора.)&lt;/p>
&lt;h2 id="другие-команды">Другие команды
&lt;/h2>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Клавиша&lt;/th>
&lt;th>Описание&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code>+&lt;code>L&lt;/code>&lt;/td>
&lt;td>Перерисовать экран&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code>+&lt;code>G&lt;/code>&lt;/td>
&lt;td>Отобразить количество строк всего файла, позицию курсора и т. д.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table></description></item><item><title>Список сочетаний клавиш Microsoft Word</title><link>http://kenji.blog/ru/p/microsoft-word%E3%81%AE%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E4%B8%80%E8%A6%A7/</link><pubDate>Sun, 07 Apr 2024 14:18:51 +0900</pubDate><guid>http://kenji.blog/ru/p/microsoft-word%E3%81%AE%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E4%B8%80%E8%A6%A7/</guid><description>&lt;img src="http://kenji.blog/p/microsoft-word%E3%81%AE%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E4%B8%80%E8%A6%A7/img.png" alt="Featured image of post Список сочетаний клавиш Microsoft Word" />&lt;h2 id="список-сочетаний-клавиш">Список сочетаний клавиш
&lt;/h2>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Сочетание клавиш&lt;/th>
&lt;th>Описание&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code> + &lt;code>B&lt;/code>&lt;/td>
&lt;td>Жирный&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code> + &lt;code>I&lt;/code>&lt;/td>
&lt;td>Курсив&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code> + &lt;code>U&lt;/code>&lt;/td>
&lt;td>Подчеркнутый&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code> + &lt;code>E&lt;/code>&lt;/td>
&lt;td>Выровнять по центру&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code> + &lt;code>L&lt;/code>&lt;/td>
&lt;td>Выровнять по левому краю&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code> + &lt;code>R&lt;/code>&lt;/td>
&lt;td>Выровнять по правому краю&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code> + &lt;code>]&lt;/code>&lt;/td>
&lt;td>Увеличить размер шрифта&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code> + &lt;code>[&lt;/code>&lt;/td>
&lt;td>Уменьшить размер шрифта&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code> + &lt;code>C&lt;/code>&lt;/td>
&lt;td>Копировать&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code> + &lt;code>V&lt;/code>&lt;/td>
&lt;td>Вставить&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code> + &lt;code>X&lt;/code>&lt;/td>
&lt;td>Вырезать&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code> + &lt;code>Z&lt;/code>&lt;/td>
&lt;td>Отменить&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code> + &lt;code>Y&lt;/code>&lt;/td>
&lt;td>Повторить отмененное действие&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code> + &lt;code>A&lt;/code>&lt;/td>
&lt;td>Выделить все&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Shift&lt;/code> + &lt;code>клавиши со стрелками&lt;/code>&lt;/td>
&lt;td>Выделить диапазон&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code> + &lt;code>F&lt;/code>&lt;/td>
&lt;td>Найти текст&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code> + &lt;code>H&lt;/code>&lt;/td>
&lt;td>Заменить текст&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code> + &lt;code>P&lt;/code>&lt;/td>
&lt;td>Предварительный просмотр печати&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code> + &lt;code>S&lt;/code>&lt;/td>
&lt;td>Сохранить документ&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>F12&lt;/code>&lt;/td>
&lt;td>Сохранить как&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code> + &lt;code>Home&lt;/code>&lt;/td>
&lt;td>Перейти в начало документа&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code> + &lt;code>End&lt;/code>&lt;/td>
&lt;td>Перейти в конец документа&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="ссылка">Ссылка
&lt;/h2>&lt;ul>
&lt;li>&lt;a class="link" href="https://support.microsoft.com/ja-jp/office/word-%E3%81%AE%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89-%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88-95ef89dd-7142-4b50-afb2-f762f663ceb2" target="_blank" rel="noopener"
>Сочетания клавиш в Word&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Список сочетаний клавиш Visual Studio</title><link>http://kenji.blog/ru/p/visual-studio-%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E4%B8%80%E8%A6%A7/</link><pubDate>Sat, 06 Apr 2024 11:27:37 +0900</pubDate><guid>http://kenji.blog/ru/p/visual-studio-%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E4%B8%80%E8%A6%A7/</guid><description>&lt;img src="http://kenji.blog/p/visual-studio-%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E4%B8%80%E8%A6%A7/img.png" alt="Featured image of post Список сочетаний клавиш Visual Studio" />&lt;h1 id="список-сочетаний-клавиш-visual-studio">Список сочетаний клавиш Visual Studio
&lt;/h1>&lt;p>Я составил список сочетаний клавиш Visual Studio, которые я часто использую.
Изучив сочетания клавиш для Visual Studio, вы сможете эффективно выполнять задачи разработки. Пожалуйста, используйте их.&lt;/p>
&lt;p>※ Проверено в Visual Studio 2022.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Сочетание клавиш&lt;/th>
&lt;th>Описание&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>F1&lt;/code>&lt;/td>
&lt;td>Показать справку для выбранного слова&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>F2&lt;/code>&lt;/td>
&lt;td>Перейти к закладке&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code> + &lt;code>F2&lt;/code>&lt;/td>
&lt;td>Добавить закладку&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code> + &lt;code>Shift&lt;/code> + &lt;code>F2&lt;/code>&lt;/td>
&lt;td>Удалить все закладки&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>F5&lt;/code>&lt;/td>
&lt;td>Собрать и запустить (с отладкой)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code> + &lt;code>F5&lt;/code>&lt;/td>
&lt;td>Собрать и запустить (без отладки)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>F7&lt;/code>&lt;/td>
&lt;td>Собрать&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>F9&lt;/code>&lt;/td>
&lt;td>Добавить точку останова на строку с курсором&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code> + &lt;code>F9&lt;/code>&lt;/td>
&lt;td>Отключить точку останова на строке с курсором&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Shift&lt;/code> + &lt;code>Ctrl&lt;/code> + &lt;code>F9&lt;/code>&lt;/td>
&lt;td>Удалить все точки останова&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>F10&lt;/code>&lt;/td>
&lt;td>Шаг с обходом&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>F11&lt;/code>&lt;/td>
&lt;td>Шаг с заходом&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>F12&lt;/code>&lt;/td>
&lt;td>Перейти к определению&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code> + &lt;code>D&lt;/code>&lt;/td>
&lt;td>Дублировать строку с курсором&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code> + &lt;code>X&lt;/code>&lt;/td>
&lt;td>Вырезать строку (если нет выделения)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code> + &lt;code>Shift&lt;/code> + &lt;code>]&lt;/code>&lt;/td>
&lt;td>Выделить до парной скобки&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Alt&lt;/code> + &lt;code>Стрелки вверх/вниз&lt;/code>&lt;/td>
&lt;td>Переместить строку с курсором вверх/вниз&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Alt&lt;/code> + &lt;code>Shift&lt;/code> + &lt;code>Стрелки&lt;/code>&lt;/td>
&lt;td>Мультикурсор/блочное выделение&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code> + &lt;code>Tab&lt;/code>&lt;/td>
&lt;td>Переключить исходный код/окно&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code> + &lt;code>Shift&lt;/code> + &lt;code>V&lt;/code>&lt;/td>
&lt;td>Показать историю буфера обмена&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code> + &lt;code>K&lt;/code> затем &lt;code>Ctrl&lt;/code> + &lt;code>C&lt;/code>&lt;/td>
&lt;td>Закомментировать строку с курсором&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code> + &lt;code>K&lt;/code> затем &lt;code>Ctrl&lt;/code> + &lt;code>U&lt;/code>&lt;/td>
&lt;td>Раскомментировать строку с курсором&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code> + &lt;code>G&lt;/code>&lt;/td>
&lt;td>Перейти к указанному номеру строки&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code> + &lt;code>F&lt;/code>&lt;/td>
&lt;td>Поиск&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code> + &lt;code>Shift&lt;/code> + &lt;code>F&lt;/code>&lt;/td>
&lt;td>Глобальный поиск&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code> + &lt;code>H&lt;/code>&lt;/td>
&lt;td>Замена&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code> + &lt;code>Shift&lt;/code> + &lt;code>F&lt;/code>&lt;/td>
&lt;td>Глобальная замена&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code> + &lt;code>Tab&lt;/code>&lt;/td>
&lt;td>Переключить исходный код/окно&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code> + &lt;code>Space&lt;/code>&lt;/td>
&lt;td>Автодополнение слов&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code> + &lt;code>Alt&lt;/code> + &lt;code>L&lt;/code>&lt;/td>
&lt;td>Открыть окно обозревателя решений&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code> + &lt;code>Shift&lt;/code> + &lt;code>E&lt;/code>&lt;/td>
&lt;td>Открыть окно представления ресурсов&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Ctrl&lt;/code> + &lt;code>0&lt;/code> затем &lt;code>Ctrl&lt;/code> + &lt;code>G&lt;/code>&lt;/td>
&lt;td>Открыть окно коммитов Git&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="ссылки">Ссылки
&lt;/h2>&lt;ul>
&lt;li>&lt;a class="link" href="https://learn.microsoft.com/ja-jp/visualstudio/ide/default-keyboard-shortcuts-in-visual-studio?view=vs-2022&amp;amp;utm_source=vshelp&amp;amp;wt.mc_id=visualstudio_inproduct_shortcuts_csaapp" target="_blank" rel="noopener"
>Сочетания клавиш в Visual Studio&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="http://kenji.blog/p/visual-studio-%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E4%B8%80%E8%A6%A7/img_1.png"
width="1094"
height="823"
srcset="http://kenji.blog/p/visual-studio-%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E4%B8%80%E8%A6%A7/img_1_hu4eaca85d6437d1dd6b23efd21afacc82_582969_480x0_resize_box_3.png 480w, http://kenji.blog/p/visual-studio-%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E4%B8%80%E8%A6%A7/img_1_hu4eaca85d6437d1dd6b23efd21afacc82_582969_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="img_1.png"
class="gallery-image"
data-flex-grow="132"
data-flex-basis="319px"
>&lt;/p></description></item><item><title>Добавление grep Hidemaru Editor в контекстное меню Проводника</title><link>http://kenji.blog/ru/p/%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-grep-hidemaru-editor-%D0%B2-%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%BD%D0%BE%D0%B5-%D0%BC%D0%B5%D0%BD%D1%8E-%D0%BF%D1%80%D0%BE%D0%B2%D0%BE%D0%B4%D0%BD%D0%B8%D0%BA%D0%B0/</link><pubDate>Wed, 03 Apr 2024 00:00:46 +0900</pubDate><guid>http://kenji.blog/ru/p/%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-grep-hidemaru-editor-%D0%B2-%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%BD%D0%BE%D0%B5-%D0%BC%D0%B5%D0%BD%D1%8E-%D0%BF%D1%80%D0%BE%D0%B2%D0%BE%D0%B4%D0%BD%D0%B8%D0%BA%D0%B0/</guid><description>&lt;img src="http://kenji.blog/p/%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%97%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC%E3%81%AE%E5%8F%B3%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E3%81%AB%E7%A7%80%E4%B8%B8%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BFgrep%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B/img.png" alt="Featured image of post Добавление grep Hidemaru Editor в контекстное меню Проводника" />&lt;p>В этой статье мы расскажем, как добавить функцию grep из Hidemaru Editor в контекстное меню Проводника (по правому клику мыши) в Windows 10/11.&lt;/p>
&lt;p>&lt;strong>※ Обратите внимание, что следующие шаги связаны с изменением реестра, поэтому выполняйте их на свой страх и риск.&lt;/strong>&lt;/p>
&lt;h2 id="шаги">Шаги
&lt;/h2>&lt;ol>
&lt;li>Откройте ссылку ниже и сохраните файл в любую папку.&lt;/li>
&lt;/ol>
&lt;p>&lt;a class="link" href="%e7%a7%80%e4%b8%b8%e3%83%ac%e3%82%b8%e3%82%b9%e3%83%88%e3%83%aa%e7%99%bb%e9%8c%b2.reg" >Регистрация_в_реестре_Hidemaru.reg&lt;/a>&lt;/p>
&lt;ol start="2">
&lt;li>Дважды щелкните файл &lt;code>Регистрация_в_реестре_Hidemaru.reg&lt;/code>, чтобы добавить его в реестр.&lt;/li>
&lt;/ol>
&lt;h2 id="источники">Источники
&lt;/h2>&lt;ul>
&lt;li>&lt;a class="link" href="https://aimek-developer.blogspot.com/2019/02/grep.html" target="_blank" rel="noopener"
>Запуск Hidemaru grep из контекстного меню папки&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Как установить текстовый редактор micro на Windows</title><link>http://kenji.blog/ru/p/%D0%BA%D0%B0%D0%BA-%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C-%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%BE%D0%B2%D1%8B%D0%B9-%D1%80%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%BE%D1%80-micro-%D0%BD%D0%B0-windows/</link><pubDate>Sun, 31 Mar 2024 21:50:39 +0900</pubDate><guid>http://kenji.blog/ru/p/%D0%BA%D0%B0%D0%BA-%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C-%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%BE%D0%B2%D1%8B%D0%B9-%D1%80%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%BE%D1%80-micro-%D0%BD%D0%B0-windows/</guid><description>&lt;img src="http://kenji.blog/p/%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BFmicro%E3%82%92windows%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img.png" alt="Featured image of post Как установить текстовый редактор micro на Windows" />&lt;h2 id="скачивание-micro">Скачивание micro
&lt;/h2>&lt;p>&lt;a class="link" href="https://github.com/zyedidia/micro/releases" target="_blank" rel="noopener"
>https://github.com/zyedidia/micro/releases&lt;/a>&lt;/p>
&lt;p>Откройте ссылку выше, нажмите &lt;code>Show all XX assets&lt;/code> (где X - цифры) и скачайте &lt;code>micro-X.X.XX-win64.zip&lt;/code> (где X - цифры).
Распакуйте zip-файл и поместите все файлы в любую папку.&lt;/p>
&lt;h2 id="настройка-переменных-среды">Настройка переменных среды
&lt;/h2>&lt;p>Чтобы использовать &lt;code>micro.exe&lt;/code> из командной строки, необходимо настроить переменные среды.&lt;/p>
&lt;ol>
&lt;li>Нажмите клавиши &lt;code>Win&lt;/code> + &lt;code>R&lt;/code>, введите &lt;code>sysdm.cpl&lt;/code> и нажмите &lt;code>Enter&lt;/code>.&lt;/li>
&lt;li>В окне &lt;code>Свойства системы&lt;/code> нажмите &lt;code>Свойства системы&lt;/code>.&lt;/li>
&lt;li>Нажмите &lt;code>Переменные среды&lt;/code>.&lt;/li>
&lt;li>Выберите &lt;code>Path&lt;/code> в &lt;code>Системные переменные&lt;/code> и нажмите &lt;code>Изменить&lt;/code>.&lt;/li>
&lt;li>Нажмите &lt;code>Создать&lt;/code> и добавьте путь к папке, содержащей &lt;code>micro.exe&lt;/code>.&lt;/li>
&lt;li>Нажмите &lt;code>ОК&lt;/code>, чтобы закрыть все диалоговые окна.&lt;/li>
&lt;li>Перезапустите командную строку, введите &lt;code>nano&lt;/code> и проверьте, запускается ли он.&lt;/li>
&lt;/ol>
&lt;h2 id="как-использовать-micro">Как использовать micro
&lt;/h2>&lt;p>При вводе &lt;code>micro&lt;/code> в командной строке и выполнении появится следующий экран.
&lt;img src="http://kenji.blog/p/%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BFmicro%E3%82%92windows%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_3.png"
width="962"
height="512"
srcset="http://kenji.blog/p/%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BFmicro%E3%82%92windows%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_3_hucac22a4d580735ddd83b1fd5173c3197_6852_480x0_resize_box_3.png 480w, http://kenji.blog/p/%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BFmicro%E3%82%92windows%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_3_hucac22a4d580735ddd83b1fd5173c3197_6852_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="img_3.png"
class="gallery-image"
data-flex-grow="187"
data-flex-basis="450px"
>&lt;/p>
&lt;p>Основные операции и сочетания клавиш следующие:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Сочетания клавиш&lt;/th>
&lt;th>Операция&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Ctrl+Q&lt;/td>
&lt;td>Закрыть файл&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Ctrl+S&lt;/td>
&lt;td>Сохранить файл&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Ctrl+O&lt;/td>
&lt;td>Открыть файл&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Ctrl+A&lt;/td>
&lt;td>Выбрать всё&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Ctrl+X&lt;/td>
&lt;td>Вырезать выделенное&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Ctrl+C&lt;/td>
&lt;td>Скопировать выделенное&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Ctrl+V&lt;/td>
&lt;td>Вставить&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Ctrl+Z&lt;/td>
&lt;td>Отменить&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Ctrl+Y&lt;/td>
&lt;td>Повторить&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Ctrl+E&lt;/td>
&lt;td>Выполнить команду редактора&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="ссылки">Ссылки
&lt;/h2>&lt;ul>
&lt;li>&lt;a class="link" href="https://micro-editor.github.io/" target="_blank" rel="noopener"
>micro&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Как установить CLI текстовый редактор nano в Windows</title><link>http://kenji.blog/ru/p/cli%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BFnano%E3%82%92windows%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/</link><pubDate>Sun, 31 Mar 2024 18:09:32 +0900</pubDate><guid>http://kenji.blog/ru/p/cli%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BFnano%E3%82%92windows%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/</guid><description>&lt;img src="http://kenji.blog/p/cli%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BFnano%E3%82%92windows%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_1.png" alt="Featured image of post Как установить CLI текстовый редактор nano в Windows" />&lt;h2 id="загрузка-nanoexe">Загрузка nano.exe
&lt;/h2>&lt;p>&lt;a class="link" href="https://sourceforge.net/projects/nano-for-windows/" target="_blank" rel="noopener"
>https://sourceforge.net/projects/nano-for-windows/&lt;/a>&lt;/p>
&lt;p>Откройте ссылку выше и нажмите &lt;code>Download&lt;/code>, чтобы загрузить &lt;code>GNU-Nano_Win32(static).zip&lt;/code>.
Распакуйте zip-файл и поместите &lt;code>nano.exe&lt;/code> в любую папку.&lt;/p>
&lt;ul>
&lt;li>Ввод на японском языке не поддерживается. (По состоянию на 31.03.2024)&lt;/li>
&lt;/ul>
&lt;h2 id="настройка-переменных-среды">Настройка переменных среды
&lt;/h2>&lt;p>Чтобы использовать &lt;code>nano.exe&lt;/code> из командной строки, необходимо настроить переменные среды.&lt;/p>
&lt;ol>
&lt;li>Нажмите клавишу &lt;code>Win&lt;/code> + клавишу &lt;code>R&lt;/code>, введите &lt;code>sysdm.cpl&lt;/code> и нажмите клавишу &lt;code>Enter&lt;/code>.&lt;/li>
&lt;li>Нажмите &lt;code>Свойства системы&lt;/code> (System Properties).&lt;/li>
&lt;li>Нажмите &lt;code>Переменные среды&lt;/code> (Environment Variables).&lt;/li>
&lt;li>Выберите &lt;code>Path&lt;/code> в разделе &lt;code>Системные переменные&lt;/code> и нажмите &lt;code>Изменить&lt;/code> (Edit).&lt;/li>
&lt;li>Нажмите &lt;code>Создать&lt;/code> (New) и добавьте путь к &lt;code>nano.exe&lt;/code>.&lt;/li>
&lt;li>Нажмите &lt;code>OK&lt;/code>, чтобы закрыть все диалоговые окна.&lt;/li>
&lt;li>Перезапустите командную строку, введите &lt;code>nano&lt;/code> и проверьте, запускается ли он.&lt;/li>
&lt;/ol>
&lt;h2 id="как-использовать-nano">Как использовать nano
&lt;/h2>&lt;p>Когда вы вводите &lt;code>nano&lt;/code> и запускаете его, отобразится следующий экран.&lt;/p>
&lt;p>&lt;img src="http://kenji.blog/p/cli%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BFnano%E3%82%92windows%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_2.png"
width="1082"
height="632"
srcset="http://kenji.blog/p/cli%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BFnano%E3%82%92windows%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_2_hucb9efcdf08d2eda99abffd0a9502a2c3_16316_480x0_resize_box_3.png 480w, http://kenji.blog/p/cli%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BFnano%E3%82%92windows%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img_2_hucb9efcdf08d2eda99abffd0a9502a2c3_16316_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="img_2.png"
class="gallery-image"
data-flex-grow="171"
data-flex-basis="410px"
>&lt;/p>
&lt;p>В нижней части экрана отображаются описания сочетаний клавиш.&lt;/p>
&lt;p>Значения символов следующие:&lt;/p>
&lt;ul>
&lt;li>&lt;code>^&lt;/code> означает клавишу &lt;code>Ctrl&lt;/code>.&lt;/li>
&lt;li>&lt;code>M-&lt;/code> означает клавишу &lt;code>Alt&lt;/code>.&lt;/li>
&lt;/ul>
&lt;p>Чтобы сохранить и закрыть, нажмите &lt;code>Ctrl&lt;/code> + &lt;code>S&lt;/code>, а затем нажмите &lt;code>Ctrl&lt;/code> + &lt;code>X&lt;/code>.&lt;/p>
&lt;h2 id="рекомендации">Рекомендации
&lt;/h2>&lt;ul>
&lt;li>&lt;a class="link" href="https://www.nano-editor.org/" target="_blank" rel="noopener"
>GNU nano&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Как исправить ошибку 'Temporary failure resolving...' в WSL</title><link>http://kenji.blog/ru/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/ru/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 Как исправить ошибку 'Temporary failure resolving...' в WSL" />&lt;h1 id="как-исправить-ошибку-temporary-failure-resolving-в-wsl">Как исправить ошибку &amp;lsquo;Temporary failure resolving&amp;hellip;&amp;rsquo; в WSL
&lt;/h1>&lt;p>&lt;code>kenji@MyComputer:~$ sudo apt update [sudo] password for kenji: Err:1 http://archive.ubuntu.com/ubuntu focal InRelease Temporary failure resolving 'archive.ubuntu.com'&lt;/code>&lt;/p>
&lt;p>Когда в WSL появляется вышеуказанная ошибка, возможно, неправильно настроен DNS-сервер.
В моей среде проблема была решена с помощью следующих шагов:&lt;/p>
&lt;ol>
&lt;li>Запустите WSL.&lt;/li>
&lt;li>Выполните команду &lt;code>sudo nano /etc/resolv.conf&lt;/code>.&lt;/li>
&lt;li>Измените строку &lt;code>nameserver&lt;/code> следующим образом:
&lt;code>nameserver 8.8.8.8&lt;/code>&lt;/li>
&lt;li>Сохраните, нажав &lt;code>Ctrl&lt;/code> + &lt;code>S&lt;/code>, и выйдите, нажав &lt;code>Ctrl&lt;/code> + &lt;code>X&lt;/code>.&lt;/li>
&lt;li>Выполните команду &lt;code>sudo apt update&lt;/code>.&lt;/li>
&lt;li>Если ошибка не появляется, проблема решена.&lt;/li>
&lt;/ol>
&lt;h2 id="если-вышеуказанные-шаги-не-помогли">Если вышеуказанные шаги не помогли
&lt;/h2>&lt;p>Кажется, в некоторых случаях вышеуказанные шаги не решают проблему. Пожалуйста, обратитесь к следующей статье.&lt;/p>
&lt;ul>
&lt;li>&lt;a class="link" href="https://qiita.com/ryosukeYamazaki/items/c04ec3ff78aac6eb8d26" target="_blank" rel="noopener"
>Как решить проблему &amp;lsquo;Temporary failure resolving&amp;hellip;&amp;rsquo; при apt update в WSL&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Как запустить редактор Hidemaru с помощью команды «hide»</title><link>http://kenji.blog/ru/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/ru/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 Как запустить редактор Hidemaru с помощью команды «hide»" />&lt;h2 id="я-покажу-как-запустить-редактор-hidemaru-с-помощью-команды-hide">Я покажу, как запустить редактор Hidemaru с помощью команды «hide».
&lt;/h2>&lt;p>Примечание: этот метод протестирован на &lt;code>Windows 10/11&lt;/code>.&lt;/p>
&lt;ol>
&lt;li>Откройте редактор реестра.&lt;/li>
&lt;li>Перейдите в &lt;code>HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths&lt;/code>.&lt;/li>
&lt;li>Создайте ключ с именем &lt;code>hide.exe&lt;/code> в &lt;code>App Paths&lt;/code>. ※ Часть имени ключа перед &lt;code>.exe&lt;/code> будет названием команды.&lt;/li>
&lt;li>Установите путь к исполняемому файлу редактора Hidemaru в значение &lt;code>(По умолчанию)&lt;/code> ключа &lt;code>hide.exe&lt;/code>. В моей среде это было &lt;code>&amp;quot;C:\Program Files (x86)\Hidemaru\Hidemaru.exe&amp;quot;&lt;/code>.&lt;/li>
&lt;li>Создайте строковый параметр (String Value) с именем &lt;code>Path&lt;/code> в ключе &lt;code>hide.exe&lt;/code>.&lt;/li>
&lt;li>Установите путь к папке с исполняемым файлом редактора Hidemaru в данные параметра &lt;code>Path&lt;/code>. В моей среде это было &lt;code>&amp;quot;C:\Program Files (x86)\Hidemaru&amp;quot;&lt;/code>.&lt;/li>
&lt;li>Теперь вы можете запустить редактор Hidemaru с помощью команды &lt;code>hide&lt;/code> в окне &lt;strong>Выполнить&lt;/strong> , которое появляется при нажатии &lt;code>Win&lt;/code> + &lt;code>R&lt;/code>. Кроме того, в командной строке вы можете запустить редактор Hidemaru с помощью команды &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-text" data-lang="text">&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>Если вы сохраните приведенное выше содержимое в файл &lt;code>.reg&lt;/code> и запустите его, настройки будут добавлены в реестр.&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>Установка PowerToys через командную строку</title><link>http://kenji.blog/ru/p/powertoys%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/</link><pubDate>Sat, 30 Sep 2023 21:23:00 +0900</pubDate><guid>http://kenji.blog/ru/p/powertoys%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/</guid><description>&lt;img src="http://kenji.blog/p/powertoys%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/img.png" alt="Featured image of post Установка PowerToys через командную строку" />&lt;h1 id="установка-powertoys-через-командную-строку">Установка PowerToys через командную строку
&lt;/h1>&lt;p>Здесь показано, как установить PowerToys через командную строку.&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">winget install Microsoft.PowerToys --source winget
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h1 id="удаление-powertoys-через-командную-строку">Удаление PowerToys через командную строку
&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;/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">winget uninstall --name PowerToys
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div></description></item><item><title>О получении награды Microsoft MVP (2023-2024)</title><link>http://kenji.blog/ru/p/microsoft-mvp%E5%8F%97%E8%B3%9E%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A62023-2024/</link><pubDate>Mon, 31 Jul 2023 19:15:14 +0900</pubDate><guid>http://kenji.blog/ru/p/microsoft-mvp%E5%8F%97%E8%B3%9E%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A62023-2024/</guid><description>&lt;img src="http://kenji.blog/p/microsoft-mvp%E5%8F%97%E8%B3%9E%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A62023-2024/img.png" alt="Featured image of post О получении награды Microsoft MVP (2023-2024)" />&lt;h1 id="о-получении-награды-microsoft-mvp-2023-2024">О получении награды Microsoft MVP (2023-2024)
&lt;/h1>&lt;p>Недавно я получил награду Microsoft MVP (2023-2024).
Это уже седьмой год подряд, начиная с 2017 года.&lt;/p>
&lt;p>Категория, в которой я получил награду, — &lt;strong>Developer Technologies&lt;/strong> .&lt;/p>
&lt;p>Оглядываясь на мою прошлую деятельность, я занимался следующим:&lt;/p>
&lt;ul>
&lt;li>Публикация кода на &lt;a class="link" href="https://github.com/kenjinote" target="_blank" rel="noopener"
>GitHub&lt;/a>&lt;/li>
&lt;li>Распространение технической информации в блоге и &lt;a class="link" href="https://twitter.com/kenjinote" target="_blank" rel="noopener"
>социальных сетях (Twitter и др.)&lt;/a>&lt;/li>
&lt;li>Публикации на &lt;a class="link" href="https://social.msdn.microsoft.com/Forums/ja-JP/home" target="_blank" rel="noopener"
>форуме MSDN&lt;/a>&lt;/li>
&lt;li>Отзывы о продуктах Microsoft&lt;/li>
&lt;/ul>
&lt;p>В будущем я планирую продолжать писать качественные статьи и делиться информацией.&lt;/p>
&lt;p>Большое спасибо за вашу поддержку.&lt;/p></description></item><item><title>Поиск спонсоров на GitHub</title><link>http://kenji.blog/ru/p/%D0%BF%D0%BE%D0%B8%D1%81%D0%BA-%D1%81%D0%BF%D0%BE%D0%BD%D1%81%D0%BE%D1%80%D0%BE%D0%B2-%D0%BD%D0%B0-github/</link><pubDate>Tue, 17 Jan 2023 18:13:56 +0900</pubDate><guid>http://kenji.blog/ru/p/%D0%BF%D0%BE%D0%B8%D1%81%D0%BA-%D1%81%D0%BF%D0%BE%D0%BD%D1%81%D0%BE%D1%80%D0%BE%D0%B2-%D0%BD%D0%B0-github/</guid><description>&lt;img src="http://kenji.blog/p/github%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B5%E3%83%BC%E5%8B%9F%E9%9B%86/img.png" alt="Featured image of post Поиск спонсоров на GitHub" />&lt;h1 id="поиск-спонсоров-на-github">Поиск спонсоров на GitHub
&lt;/h1>&lt;p>Я буду рад, если вы станете моим спонсором на GitHub, нажав на кнопку ниже.&lt;/p>
&lt;iframe src="https://github.com/sponsors/kenjinote/button" title="Sponsor kenjinote" height="35" width="116" style="border: 0;">&lt;/iframe>
&lt;p>Средства пойдут на разработку инструментов и другие цели.&lt;/p>
&lt;p>Я буду очень стараться, чтобы получить сертификат для подписи кода!&lt;/p></description></item><item><title>Редактор графов</title><link>http://kenji.blog/ru/p/%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF/</link><pubDate>Thu, 13 Oct 2022 23:31:11 +0900</pubDate><guid>http://kenji.blog/ru/p/%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF/</guid><description>&lt;img src="http://kenji.blog/p/%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF/img.png" alt="Featured image of post Редактор графов" />&lt;h1 id="редактор-графов">Редактор графов
&lt;/h1>&lt;p>Это знакомство с веб-страницей, которая позволяет создавать простые графы.&lt;/p>
&lt;p>&lt;a class="link" href="https://csacademy.com/app/graph_editor/" target="_blank" rel="noopener"
>https://csacademy.com/app/graph_editor/&lt;/a>&lt;/p>
&lt;p>Вы можете создавать графы путем ввода числовых значений.
Кроме того, кажется, что вы также можете перемещать элементы с помощью мыши.&lt;/p>
&lt;p>Нажав на &lt;code>Directed&lt;/code>, вы также можете создавать ориентированные графы.&lt;/p>
&lt;p>&lt;img src="http://kenji.blog/p/%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF/img_1.png"
width="300"
height="300"
srcset="http://kenji.blog/p/%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF/img_1_hu8da2a7e6049b3e95e8ba3eb3a30bc8ba_14422_480x0_resize_box_3.png 480w, http://kenji.blog/p/%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF/img_1_hu8da2a7e6049b3e95e8ba3eb3a30bc8ba_14422_1024x0_resize_box_3.png 1024w"
loading="lazy"
alt="img_1.png"
class="gallery-image"
data-flex-grow="100"
data-flex-basis="240px"
>&lt;/p>
&lt;p>Вы можете сохранить созданные вами графы или графы, созданные через &lt;code>Download as PNG&lt;/code>, как изображения.&lt;/p></description></item><item><title>Удаление тегов в git</title><link>http://kenji.blog/ru/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/ru/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 Удаление тегов в git" />&lt;h1 id="удаление-локального-тега">Удаление локального тега
&lt;/h1>&lt;ol>
&lt;li>Проверьте существующие локальные теги с помощью &lt;code>git tag&lt;/code>.&lt;/li>
&lt;li>Удалите тег с помощью &lt;code>git tag -d v0.1.0&lt;/code>. (Замените &lt;code>v0.1.0&lt;/code> на тег, который вы хотите удалить)&lt;/li>
&lt;/ol>
&lt;h1 id="удаление-удаленного-тега">Удаление удаленного тега
&lt;/h1>&lt;ol>
&lt;li>Проверьте существующие удаленные теги с помощью &lt;code>git ls-remote --tags&lt;/code>.&lt;/li>
&lt;li>Удалите удаленный тег с помощью &lt;code>git push origin --delete v0.1.0&lt;/code>. (Замените &lt;code>v0.1.0&lt;/code> на тег, который вы хотите удалить)&lt;/li>
&lt;/ol>
&lt;h2 id="ссылки">Ссылки
&lt;/h2>&lt;p>&lt;a class="link" href="https://qumeru.com/magazine/528" target="_blank" rel="noopener"
>Как удалить тег git локально и удаленно!&lt;/a>&lt;/p></description></item><item><title>Использование GitHub Copilot в IntelliJ IDEA</title><link>http://kenji.blog/ru/p/ispolzovanie-github-copilot-v-intellij-idea/</link><pubDate>Sat, 10 Sep 2022 09:44:55 +0900</pubDate><guid>http://kenji.blog/ru/p/ispolzovanie-github-copilot-v-intellij-idea/</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 Использование GitHub Copilot в IntelliJ IDEA" />&lt;h1 id="введение">Введение
&lt;/h1>&lt;p>GitHub Copilot — это инструмент для автодополнения кода на базе искусственного интеллекта, разработанный GitHub.
Если вы установите плагин GitHub Copilot в среду разработки IntelliJ IDEA, вы сможете использовать GitHub Copilot и в IntelliJ IDEA.
Для активации вам понадобится учетная запись Github.&lt;/p>
&lt;h1 id="способ-установки">Способ установки
&lt;/h1>&lt;ol>
&lt;li>В меню IntelliJ IDEA выберите File, затем Settings.&lt;/li>
&lt;li>Выберите Plugins и введите в поиск «GitHub Copilot».
&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>Нажмите кнопку установки (Install).
&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>Нажмите кнопку Restart IDE, чтобы перезапустить 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"
>
После перезапуска IntelliJ IDEA установка будет завершена.&lt;/li>
&lt;/ol>
&lt;h1 id="активация">Активация
&lt;/h1>&lt;ol>
&lt;li>Нажмите на значок в правом нижнем углу.&lt;/li>
&lt;li>Нажмите 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>Нажмите кнопку 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>Откроется браузер. Если вы не вошли в Github, авторизуйтесь, затем вставьте код с помощью Ctrl+V и нажмите кнопку 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>Нажмите кнопку 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"
>
Если появился экран выше, активация завершена.&lt;/li>
&lt;/ol>
&lt;h1 id="использование">Использование
&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"
>
Если вы введете несколько символов в редакторе IntelliJ IDEA, GitHub Copilot предложит продолжение кода.
Наслаждайтесь мощной функцией автодополнения на базе ИИ!&lt;/p></description></item></channel></rss>