<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>ZCODER</title><author><name>ZCODER</name></author><id>https://teletype.in/atom/zcoder</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/zcoder?offset=0"></link><link rel="alternate" type="text/html" href="https://zcoder.ru/?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=zcoder"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/zcoder?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-05-01T11:12:52.471Z</updated><entry><id>zcoder:aijs01</id><link rel="alternate" type="text/html" href="https://zcoder.ru/aijs01?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=zcoder"></link><title>Пример реализации ИИ на JS</title><published>2024-10-09T13:52:56.367Z</published><updated>2024-10-09T13:52:56.367Z</updated><summary type="html">Хотя использование внешних библиотек может упростить задачу написания кода для машинного обучения, я могу предложить вам пример, который использует только стандартные возможности языка JavaScript без использования внешних библиотек. Этот пример реализует простую нейронную сеть с одним скрытым слоем и функцией активации ReLU.</summary><content type="html">
  &lt;p id=&quot;MeVG&quot;&gt;Хотя использование внешних библиотек может упростить задачу написания кода для машинного обучения, я могу предложить вам пример, который использует только стандартные возможности языка JavaScript без использования внешних библиотек. Этот пример реализует простую нейронную сеть с одним скрытым слоем и функцией активации ReLU.&lt;/p&gt;
  &lt;h3 id=&quot;sTVn&quot;&gt;Подготовка данных&lt;/h3&gt;
  &lt;p id=&quot;SngX&quot;&gt;Для начала создадим некоторые простые обучающие данные, которые будут представлять собой линейную функцию с добавлением некоторого шума.&lt;/p&gt;
  &lt;p id=&quot;Gxy1&quot;&gt;&lt;/p&gt;
  &lt;pre id=&quot;jKzC&quot; data-lang=&quot;javascript&quot;&gt;const NUM_TRAINING_POINTS = 100;
const TRAINING_DATA = [];&lt;/pre&gt;
  &lt;pre id=&quot;4ThH&quot; data-lang=&quot;javascript&quot;&gt;
for (let i = 0; i &amp;lt; NUM_TRAINING_POINTS; ++i) {
  const x = i / NUM_TRAINING_POINTS;
  const y = x + Math.random() * 0.2 - 0.1; // добавляем шум от -0.1 до +0.1
  TRAINING_DATA.push([x, y]);
}

console.log(&amp;quot;Training Data: &amp;quot;, TRAINING_DATA);&lt;/pre&gt;
  &lt;h3 id=&quot;h65m&quot;&gt;Реализация функции активации ReLU&lt;/h3&gt;
  &lt;p id=&quot;JeXh&quot;&gt;Реализуем функцию активации ReLU, которая возвращает максимальное значение между нулём и переданным ей аргументом.&lt;/p&gt;
  &lt;pre id=&quot;dlRW&quot; data-lang=&quot;javascript&quot;&gt;function relu(x) {
  return Math.max(0, x);
}&lt;/pre&gt;
  &lt;h3 id=&quot;Qpv8&quot;&gt;Архитектура нейронной сети&lt;/h3&gt;
  &lt;p id=&quot;ZxSg&quot;&gt;Создадим архитектуру нейронной сети с одним скрытым слоем. У нас есть входные данные, которые представляют собой вектор [x], промежуточный слой с весами &lt;code&gt;w1&lt;/code&gt;, который преобразует вход в скрытое состояние, и выходной слой с весом &lt;code&gt;w2&lt;/code&gt;, который преобразует скрытое состояние в результат.&lt;/p&gt;
  &lt;pre id=&quot;8fs3&quot; data-lang=&quot;javascript&quot;&gt;class NeuralNetwork {
  constructor(nInputs, nHiddenNodes, nOutputs) {
    this.nInputs = nInputs;
    this.nHiddenNodes = nHiddenNodes;
    this.nOutputs = nOutputs;

    this.initializeWeights();
  }

  initializeWeights() {
    this.weights1 = Array.from({ length: this.nHiddenNodes }, () =&amp;gt; Math.random());
    this.weights2 = Array.from({ length: this.nOutputs }, () =&amp;gt; Math.random());
  }

  predict(input) {
    const hiddenState = this.weights1.map((weight, index) =&amp;gt; weight * input[index]).reduce((sum, val) =&amp;gt; sum + relu(val), 0);
    const output = this.weights2.map((weight, index) =&amp;gt; weight * hiddenState).reduce((sum, val) =&amp;gt; sum + val, 0);
    return output;
  }

  train(trainingData, numEpochs, learningRate) {
    for (let epoch = 0; epoch &amp;lt; numEpochs; ++epoch) {
      trainingData.forEach(([input, desiredOutput]) =&amp;gt; {
        const predictedOutput = this.predict(input);
        const error = desiredOutput - predictedOutput;
        this.updateWeights(input, error, learningRate);
      });
    }
  }

  updateWeights(input, error, learningRate) {
    const hiddenState = this.weights1.map((weight, index) =&amp;gt; weight * input[index]).reduce((sum, val) =&amp;gt; sum + relu(val), 0);
    const dOutputErrorWrtHidden = this.weights2.map((weight, index) =&amp;gt; weight * error).reduce((sum, val) =&amp;gt; sum + val, 0);

    this.weights1 = this.weights1.map((weight, index) =&amp;gt; weight + learningRate * (error * input[index] * (hiddenState &amp;gt; 0 ? 1 : 0)));
    this.weights2 = this.weights2.map((weight, index) =&amp;gt; weight + learningRate * dOutputErrorWrtHidden * hiddenState);
  }
}&lt;/pre&gt;
  &lt;h3 id=&quot;9SXC&quot;&gt;Тренировка модели&lt;/h3&gt;
  &lt;p id=&quot;X8b3&quot;&gt;Запустим процесс тренировки модели на наших обучающих данных.&lt;/p&gt;
  &lt;pre id=&quot;AA3h&quot; data-lang=&quot;javascript&quot;&gt;const NETWORK = new NeuralNetwork(1, 10, 1);
NETWORK.train(TRAINING_DATA, 1000, 0.01);&lt;/pre&gt;
  &lt;h3 id=&quot;cJ3x&quot;&gt;Оценка модели&lt;/h3&gt;
  &lt;p id=&quot;lQsJ&quot;&gt;Теперь проверим модель на тестовых данных, чтобы увидеть её производительность.&lt;/p&gt;
  &lt;pre id=&quot;KNSX&quot; data-lang=&quot;javascript&quot;&gt;const TEST_DATA = [];

for (let i = 0; i &amp;lt; 10; ++i) {
  const x = i / 10;
  const y = x + Math.random() * 0.2 - 0.1;
  TEST_DATA.push([x, y]);
}

TEST_DATA.forEach(([input, expected]) =&amp;gt; {
  const actual = NETWORK.predict(input);
  console.log(&amp;#x60;Actual Output: ${actual}, Expected Output: ${expected}&amp;#x60;);
});&lt;/pre&gt;
  &lt;p id=&quot;v8oe&quot;&gt;Этот код представляет собой базовую реализацию простой нейронной сети с функцией активации ReLU. Она позволяет обучать модель на данных и оценивать её результаты.&lt;/p&gt;

</content></entry><entry><id>zcoder:gitfaq</id><link rel="alternate" type="text/html" href="https://zcoder.ru/gitfaq?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=zcoder"></link><title>GIT FAQ</title><published>2024-10-08T06:29:21.823Z</published><updated>2024-10-08T06:29:21.823Z</updated><summary type="html">Как сохранить пароль в терминале?</summary><content type="html">
  &lt;p id=&quot;yry9&quot;&gt;Как сохранить пароль в терминале?&lt;/p&gt;
  &lt;pre id=&quot;bmfL&quot;&gt;git config --global credential.helper store
Потом
git pull&lt;/pre&gt;

</content></entry><entry><id>zcoder:localhost_https_vite</id><link rel="alternate" type="text/html" href="https://zcoder.ru/localhost_https_vite?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=zcoder"></link><title>LOCALHOST+HTTPS+VITE</title><published>2024-10-05T08:58:56.386Z</published><updated>2024-10-05T08:58:56.386Z</updated><summary type="html">1.Установить vite-plugin-mkcert пакет.</summary><content type="html">
  &lt;h2 id=&quot;w1oR&quot;&gt;&lt;strong&gt;Шаг-1&lt;/strong&gt;&lt;/h2&gt;
  &lt;p id=&quot;0WKB&quot;&gt;1.Установить &lt;a href=&quot;https://www.npmjs.com/package/vite-plugin-mkcert&quot; target=&quot;_blank&quot;&gt;vite-plugin-mkcert&lt;/a&gt; пакет.&lt;/p&gt;
  &lt;p id=&quot;5T1p&quot;&gt;npm i vite-plugin-mkcert -D&lt;/p&gt;
  &lt;h2 id=&quot;bo8g&quot;&gt;&lt;strong&gt;Шаг-2&lt;/strong&gt;&lt;/h2&gt;
  &lt;ol id=&quot;z2gM&quot;&gt;
    &lt;li id=&quot;Pflq&quot;&gt;Изменить файл &lt;code&gt;vite.config.js&lt;/code&gt;&lt;/li&gt;
  &lt;/ol&gt;
  &lt;pre id=&quot;D13I&quot;&gt;

import { defineConfig } from &amp;#x27;vite&amp;#x27;
import react from &amp;#x27;@vitejs/plugin-react&amp;#x27;
import mkcert from &amp;#x27;vite-plugin-mkcert&amp;#x27;

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [react(),mkcert()],
  server:{
    port:3000,
    https: true
  }

})


&lt;/pre&gt;
  &lt;p id=&quot;Lz4j&quot;&gt;и запустить через &lt;code&gt;npm run dev&lt;/code&gt;&lt;/p&gt;

</content></entry><entry><id>zcoder:z7KUS4U5K2s</id><link rel="alternate" type="text/html" href="https://zcoder.ru/z7KUS4U5K2s?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=zcoder"></link><title>Генерация тестовых BTC в ноде</title><published>2023-12-15T21:29:24.967Z</published><updated>2023-12-15T21:29:24.967Z</updated><summary type="html">bitcoin-cli -regtest generatetoaddress 101 $(bitcoin-cli -regtest getnewaddress)</summary><content type="html">
  &lt;p id=&quot;p57U&quot;&gt;&lt;strong&gt;bitcoin-cli -regtest generatetoaddress 101 $(bitcoin-cli -regtest getnewaddress)&lt;/strong&gt;&lt;/p&gt;

</content></entry><entry><id>zcoder:7mjyPnToR6W</id><link rel="alternate" type="text/html" href="https://zcoder.ru/7mjyPnToR6W?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=zcoder"></link><title>Получение уникальных случайных чисел</title><published>2023-12-15T11:11:27.901Z</published><updated>2023-12-15T11:11:27.901Z</updated><category term="algorithms" label="algorithms"></category><summary type="html">Формулировка теоремы:
Если p — простое число, a — целое число, не делящееся на p, то a^(p — 1) = 1 (mod p).</summary><content type="html">
  &lt;p id=&quot;gtaR&quot;&gt;Формулировка теоремы:&lt;br /&gt;Если p — простое число, a — целое число, не делящееся на p, то a^(p — 1) = 1 (mod p). &lt;/p&gt;
  &lt;p id=&quot;oQzj&quot;&gt;Доказательство:&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;PNOz&quot;&gt;&lt;em&gt;&lt;strong&gt;Каждое из p — 1 чисел a, 2a, . . ., (p-1)a даёт при делении на p ненулевой остаток: &lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
    &lt;p id=&quot;AYwL&quot;&gt;&lt;em&gt;&lt;strong&gt;a = k_1*p + r1, &lt;br /&gt;2a = k_2*p + r2, &lt;br /&gt;. . . . . . . . . . . . . . . &lt;br /&gt;(p — 1)a = k_{p-1}*p + r_{p — 1}&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
    &lt;p id=&quot;cC0n&quot;&gt;&lt;/p&gt;
    &lt;p id=&quot;vJRx&quot;&gt;&lt;em&gt;&lt;strong&gt;Если число различных встречающихся здесь остатков меньше p — 1, то среди них найдутся по крайней мере два одинаковых. Но это невозможно, так как при r_n = r_m число (n-m)a = (k_n-k_m)p делится на p, что противоречиво, ибо |n-m| &amp;lt; p и a взаимно просто с p. Значит, все остатки r_1, . . . , r_{p — 1} между собой различны и образуют перестановку чисел 1, 2, . . . , p — 1. Перемножая все предыдущие равенства, получаем &lt;br /&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
    &lt;p id=&quot;aBZ2&quot;&gt;&lt;em&gt;&lt;strong&gt;(p-1)! * a^(p — 1) = N·p + r_1*r_2*...*r_{p — 1} = N*p + (p-1)!, &lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
    &lt;p id=&quot;LQZR&quot;&gt;&lt;/p&gt;
    &lt;p id=&quot;uXSo&quot;&gt;&lt;em&gt;&lt;strong&gt;где N — некоторое целое число. Следовательно, (p-1)! * [a^(p-1) — 1] делится на p, а тогда и a^(p — 1) — 1 делится на p, поскольку (p-1)! не кратно p. Теорема доказана. &lt;/strong&gt;&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;jYxF&quot;&gt;Таким образом, все-таки можно реализовать простой алгоритм генерации кодов не запоминая списка предыдущих кодов, а помня только номер последнего сгенеренного кода.&lt;br /&gt;&lt;/p&gt;
  &lt;p id=&quot;rcw0&quot;&gt;Вот тогда будет работающий алгоритм:&lt;/p&gt;
  &lt;p id=&quot;AA72&quot;&gt;• берем большое десятизначное простое число. на наше счастье это будет 9999999997.&lt;br /&gt;• берем любое число &amp;lt; 9999999997. К примеру 5678901234 — тоже десятизначное, чтобы в примере получить сразу приличные коды.&lt;br /&gt;• начинаем генерацию:&lt;/p&gt;
  &lt;p id=&quot;XsHG&quot;&gt;&lt;br /&gt;1: 1 * 5678901234 = 5678901234 mod 9999999997&lt;br /&gt;2: 2 * 5678901234 = 1357802471 mod 9999999997&lt;br /&gt;3: 3 * 5678901234 = 7036703705 mod 9999999997&lt;br /&gt;4: 4 * 5678901234 = 2715604942 mod 9999999997&lt;br /&gt;5: 5 * 5678901234 = 8394506176 mod 9999999997&lt;br /&gt;6: 6 * 5678901234 = 4073407413 mod 9999999997&lt;br /&gt;7: 7 * 5678901234 = 9752308647 mod 9999999997&lt;br /&gt;8: 8 * 5678901234 = 5431209884 mod 9999999997&lt;br /&gt;9: 9 * 5678901234 = 1110111121 mod 9999999997&lt;br /&gt;10: 10 * 5678901234 = 6789012355 mod 9999999997&lt;br /&gt;11: 11 * 5678901234 = 2467913592 mod 9999999997&lt;br /&gt;12: 12 * 5678901234 = 8146814826 mod 9999999997&lt;br /&gt;13: 13 * 5678901234 = 3825716063 mod 9999999997&lt;br /&gt;14: 14 * 5678901234 = 9504617297 mod 9999999997&lt;br /&gt;...&lt;/p&gt;
  &lt;p id=&quot;w0rC&quot;&gt;Итак, будут получаться большие числа. Последнее сгенеренное большое число будет равно (p-1)*a = (9999999997 — 1) * 5678901234 = 56789012317284395064 — 20 цифр, что влезает в UInt64.&lt;/p&gt;
  &lt;p id=&quot;zOKT&quot;&gt;Ничего не надо помнить, ничего не надо искать. И главное — есть гарантия от ошибки, поскольку уникальность строго доказана.&lt;br /&gt;&lt;/p&gt;
  &lt;p id=&quot;heAO&quot;&gt;Конечно, у этого алгоритма есть недостаток — при помощи него никогда не будут получены коды 0000000000, 9999999997, 9999999998 и 9999999999.&lt;/p&gt;

</content></entry><entry><id>zcoder:_FxmWBAs_Fj</id><link rel="alternate" type="text/html" href="https://zcoder.ru/_FxmWBAs_Fj?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=zcoder"></link><title>Selenium+nodejs быстрый старт</title><published>2023-10-25T19:16:50.363Z</published><updated>2023-10-25T19:18:32.617Z</updated><category term="nodejs" label="nodejs"></category><summary type="html">Для парсинга сайта с использованием библиотеки Selenium в Node.js, вам потребуется установить несколько зависимостей и настроить среду. Вот как вы можете это сделать:</summary><content type="html">
  &lt;p id=&quot;77qB&quot;&gt;Для парсинга сайта с использованием библиотеки Selenium в Node.js, вам потребуется установить несколько зависимостей и настроить среду. Вот как вы можете это сделать:&lt;/p&gt;
  &lt;p id=&quot;QyGW&quot;&gt;1. Установите Node.js: Убедитесь, что у вас установлен Node.js. Если нет, вы можете загрузить его с официального сайта: &lt;a href=&quot;https://nodejs.org/&quot; target=&quot;_blank&quot;&gt;https://nodejs.org/&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;Yz5M&quot;&gt;2. Установите Selenium WebDriver: Вы можете установить Selenium WebDriver с помощью npm, выполнив следующую команду:&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;kzf0&quot;&gt;npm install selenium-webdriver&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;kXE5&quot;&gt;3. Установите веб-драйвер браузера: Вам также понадобится веб-драйвер для браузера, который вы хотите использовать (например, Chrome или Firefox). Загрузите соответствующий веб-драйвер и укажите путь к нему.&lt;/p&gt;
  &lt;p id=&quot;YorD&quot;&gt;4. Создайте скрипт для парсинга сайта:Вот пример скрипта, который использует Selenium для открытия веб-страницы и извлечения данных:&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;lK0X&quot;&gt;const { Builder, By, Key, until } = require(&amp;#x27;selenium-webdriver&amp;#x27;);&lt;br /&gt;const webdriver = require(&amp;#x27;selenium-webdriver&amp;#x27;);&lt;/p&gt;
    &lt;p id=&quot;ENEy&quot;&gt;// Указываете путь к веб-драйверу (например, для Chrome)&lt;br /&gt;const driver = new Builder()&lt;br /&gt;  .forBrowser(&amp;#x27;chrome&amp;#x27;)&lt;br /&gt;  .build();&lt;/p&gt;
    &lt;p id=&quot;hp6Z&quot;&gt;async function parseWebsite() {&lt;br /&gt;  try {&lt;br /&gt;    // Открываем веб-страницу&lt;br /&gt;    await driver.get(&amp;#x27;https://www.example.com&amp;#x27;);&lt;/p&gt;
    &lt;p id=&quot;HTNf&quot;&gt;    // Ищем элемент на странице&lt;br /&gt;    const element = await driver.findElement(By.css(&amp;#x27;#yourElementSelector&amp;#x27;));&lt;/p&gt;
    &lt;p id=&quot;qe82&quot;&gt;    // Извлекаем текст из элемента&lt;br /&gt;    const text = await element.getText();&lt;/p&gt;
    &lt;p id=&quot;wa5X&quot;&gt;    console.log(&amp;#x27;Извлеченный текст:&amp;#x27;, text);&lt;br /&gt;  } catch (error) {&lt;br /&gt;    console.error(&amp;#x27;Произошла ошибка:&amp;#x27;, error);&lt;br /&gt;  } finally {&lt;br /&gt;    // Закрываем браузер после завершения&lt;br /&gt;    driver.quit();&lt;br /&gt;  }&lt;br /&gt;}&lt;/p&gt;
    &lt;p id=&quot;6yvy&quot;&gt;// Вызываем функцию для парсинга&lt;br /&gt;parseWebsite();&lt;br /&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;Vm5j&quot;&gt;5. Замените &lt;code&gt;&amp;#x27;https://www.example.com&amp;#x27;&lt;/code&gt; на URL сайта, который вы хотите спарсить, и &lt;code&gt;&amp;#x27;yourElementSelector&amp;#x27;&lt;/code&gt; на селектор элемента, который вы хотите извлечь.&lt;/p&gt;
  &lt;p id=&quot;1cLS&quot;&gt;6. Запустите скрипт: Выполните скрипт, используя Node.js:&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;vo8P&quot;&gt;node ваш_скрипт.js&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;qyFR&quot;&gt;Этот пример демонстрирует основы использования Selenium для парсинга веб-страницы. Вы можете расширить его для выполнения более сложных задач, таких как навигация по нескольким страницам и сбор данных.&lt;/p&gt;
  &lt;p id=&quot;7TX6&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;hQQX&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;60P6&quot;&gt;&lt;/p&gt;
  &lt;figure id=&quot;2U5E&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/07/25/0725faaa-8efa-42e1-9b82-2d714f013e63.gif&quot; width=&quot;498&quot; /&gt;
  &lt;/figure&gt;

</content></entry><entry><id>zcoder:yP_a8ipoaqT</id><link rel="alternate" type="text/html" href="https://zcoder.ru/yP_a8ipoaqT?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=zcoder"></link><title>Начало</title><published>2023-10-25T13:18:46.835Z</published><updated>2023-10-25T19:18:46.675Z</updated><summary type="html">Всем привет!</summary><content type="html">
  &lt;p id=&quot;yJZg&quot;&gt;Всем привет! &lt;/p&gt;
  &lt;p id=&quot;hKHG&quot;&gt;Это мой первый (очередной) мини блог. Цель этого блога, задокументировать и сохранить всякие интересные находки в сфере ИТ, какие то разработки и так далее. &lt;/p&gt;
  &lt;p id=&quot;ifkv&quot;&gt;Почему такое имя сайта? &lt;/p&gt;
  &lt;p id=&quot;0yYR&quot;&gt;Всё пошло от того, что основная моя деятельность была (и пока есть) это SAP разработка, где используется встроенный язык ABAP. Все кастомные объекты в этой системе принято начинать на букву Z или Y. Отсюда и название.&lt;/p&gt;
  &lt;p id=&quot;KnyO&quot;&gt;&lt;/p&gt;
  &lt;figure id=&quot;ppdG&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/7a/3a/7a3a2a8b-e667-470f-9f31-c6913f0f96bb.gif&quot; width=&quot;350&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Kx71&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;qg6q&quot;&gt;Шло время и мне стали интересны другие технологии, такие как JS во всём его проявлении (react, nodejs...), devops, blockchain и другие. &lt;/p&gt;
  &lt;figure id=&quot;7TOd&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/aa/30/aa300f0d-55ce-44b5-9a6a-42068e6e54d5.gif&quot; width=&quot;300&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;83he&quot;&gt;Дак вот, о чём это я, суть этого блога, это как блокнот. Помню раньше в начале 2000-х, когда работал сначала админом, потом программистом на дельфи у меня были всегда под рукой блокноты, куда я записывал интересную информацию.&lt;/p&gt;
  &lt;p id=&quot;OP0a&quot;&gt;&lt;/p&gt;
  &lt;figure id=&quot;L1Rb&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/86/05/8605e00a-9386-4e38-92a1-dd19c1166004.gif&quot; width=&quot;498&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Eqs6&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;IG8W&quot;&gt;В общем вот так. &lt;/p&gt;

</content></entry></feed>