<?xml version="1.0"?>
<rss version="2.0"><channel><title>Articles</title><link>https://ithub.uno/statiarticles/</link><description>Our website articles</description><language>en</language><item><title>&#x41E;&#x41E;&#x41F; &#x434;&#x43B;&#x44F; &#x412;&#x441;&#x435;&#x445;! &#x418;&#x43B;&#x438; &#x43A;&#x430;&#x43A; &#x43F;&#x435;&#x440;&#x435;&#x441;&#x442;&#x430;&#x442;&#x44C; &#x431;&#x43E;&#x44F;&#x442;&#x44C;&#x441;&#x44F; &#x43A;&#x43B;&#x430;&#x441;&#x441;&#x43E;&#x432; &#x438; &#x43D;&#x430;&#x447;&#x430;&#x442;&#x44C; &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x430;&#x442;&#x44C; &#x43E;&#x442; &#x43D;&#x438;&#x445; &#x443;&#x434;&#x43E;&#x432;&#x43E;&#x43B;&#x44C;&#x441;&#x442;&#x432;&#x438;&#x435;.</title><link>https://ithub.uno/statiarticles/1_articles/%D0%BE%D0%BE%D0%BF-%D0%B4%D0%BB%D1%8F-%D0%B2%D1%81%D0%B5%D1%85-%D0%B8%D0%BB%D0%B8-%D0%BA%D0%B0%D0%BA-%D0%BF%D0%B5%D1%80%D0%B5%D1%81%D1%82%D0%B0%D1%82%D1%8C-%D0%B1%D0%BE%D1%8F%D1%82%D1%8C%D1%81%D1%8F-%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%BE%D0%B2-%D0%B8-%D0%BD%D0%B0%D1%87%D0%B0%D1%82%D1%8C-%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B0%D1%82%D1%8C-%D0%BE%D1%82-%D0%BD%D0%B8%D1%85-%D1%83%D0%B4%D0%BE%D0%B2%D0%BE%D0%BB%D1%8C%D1%81%D1%82%D0%B2%D0%B8%D0%B5-r2/</link><description><![CDATA[
<p><img src="https://ithub.uno/uploads/tmi_files_2026_01/scale_1200.webp.839f0521732f07e6da2021976e8db6e1.webp" /></p>
<p></p><h2>Введение: зачем вообще это ваше ООП?</h2><p>Если ты только начинаешь путь программиста, то, скорее всего, уже слышал загадочные слова: <strong>ООП</strong>, <strong>классы</strong>, <strong>объекты</strong>, <strong>инкапсуляция</strong>, <strong>наследование</strong>… В этот момент многие новички испытывают лёгкую панику и желание вернуться к <code>echo "Hello, world";</code>.</p><p>Спокойно. Ты не один. ООП — это не магия и не заговор сеньоров. Это всего лишь <strong>способ думать о программе</strong>, чтобы:</p><ul><li><p>код был понятнее;</p></li><li><p>код было легче расширять;</p></li><li><p>код было не стыдно показать другим (и себе через полгода).</p></li></ul><p>Сегодня мы разберём ООП <strong>от и до</strong>, <strong>простым человеческим языком</strong>, с примерами на <strong>PHP</strong>, с шутками и жизненными аналогиями.</p><hr><h2>Что такое ООП простыми словами</h2><p><strong>ООП (объектно-ориентированное программирование)</strong> — это подход, при котором программа состоит из <strong>объектов</strong>, которые:</p><ul><li><p>имеют <strong>данные</strong> (состояние);</p></li><li><p>умеют что‑то <strong>делать</strong> (поведение);</p></li><li><p>общаются друг с другом.</p></li></ul><h3>Аналогия из жизни (без неё никак)</h3><p>Представь, что ты играешь в RPG.</p><ul><li><p>Персонаж — это <strong>объект</strong></p></li><li><p>Класс персонажа (воин, маг) — это <strong>класс</strong></p></li><li><p>Здоровье, мана, сила — это <strong>свойства</strong></p></li><li><p>Ударить мечом, кастануть огненный шар — это <strong>методы</strong></p></li></ul><p>Примерно так же всё работает и в коде.</p><hr><h2>Класс — это чертёж</h2><p><strong>Класс</strong> — это описание того, <em>каким должен быть объект</em>.</p><blockquote class="tmiQuote" cite="" data-tmiquote=""><div class="tmiQuote_contents" data-tmitruncate=""><p>Класс — как чертёж дома. По одному чертежу можно построить много одинаковых домов.</p></div></blockquote><h3>Пример класса в PHP</h3><pre spellcheck="" class="tmiCode language-php" data-language="PHP"><code>class Car {
    public string $brand;
    public string $color;

    public function drive() {
        echo "Машина едет";
    }
}
</code></pre><p>Здесь мы описали:</p><ul><li><p>что у машины есть <strong>бренд</strong> и <strong>цвет</strong>;</p></li><li><p>что машина умеет <strong>ехать</strong>.</p></li></ul><hr><h2>Объект — это конкретная вещь</h2><p><strong>Объект</strong> — это экземпляр класса. То есть реальная штука, созданная по чертежу.</p><pre spellcheck="" class="tmiCode language-php" data-language="PHP"><code>$car1 = new Car();
$car1-&gt;brand = 'BMW';
$car1-&gt;color = 'black';

$car1-&gt;drive();
</code></pre><p>Теперь:</p><ul><li><p><code>$car1</code> — это конкретная машина;</p></li><li><p>у неё есть бренд BMW;</p></li><li><p>она умеет ехать (и едет).</p></li></ul><p>Можно создать хоть тысячу машин:</p><pre spellcheck="" class="tmiCode language-php" data-language="PHP"><code>$car2 = new Car();
$car2-&gt;brand = 'Toyota';
$car2-&gt;color = 'white';
</code></pre><hr><h2>Свойства и методы</h2><h3>Свойства</h3><p><strong>Свойства</strong> — это данные объекта.</p><pre spellcheck="" class="tmiCode language-php" data-language="PHP"><code>public string $brand;
</code></pre><blockquote class="tmiQuote" cite="" data-tmiquote=""><div class="tmiQuote_contents" data-tmitruncate=""><p>Проще говоря: <em>что объект знает о себе</em>.</p></div></blockquote><h3>Методы</h3><p><strong>Методы</strong> — это действия объекта.</p><pre spellcheck="" class="tmiCode language-php" data-language="PHP"><code>public function drive() {
    echo "Машина едет";
}
</code></pre><blockquote class="tmiQuote" cite="" data-tmiquote=""><div class="tmiQuote_contents" data-tmitruncate=""><p>Проще говоря: <em>что объект умеет делать</em>.</p></div></blockquote><hr><h2>Конструктор: момент рождения объекта</h2><p>Когда объект создаётся, мы часто хотим сразу задать ему начальные данные.</p><p>Для этого есть <strong>конструктор</strong>.</p><pre spellcheck="" class="tmiCode language-php" data-language="PHP"><code>class Car {
    public string $brand;
    public string $color;

    public function __construct(string $brand, string $color) {
        $this-&gt;brand = $brand;
        $this-&gt;color = $color;
    }
}
</code></pre><p>Использование:</p><pre spellcheck="" class="tmiCode language-php" data-language="PHP"><code>$car = new Car('Audi', 'red');
</code></pre><blockquote class="tmiQuote" cite="" data-tmiquote=""><div class="tmiQuote_contents" data-tmitruncate=""><p><code>$this</code> — это ссылка на <strong>текущий объект</strong>. Типа «я сам».</p></div></blockquote><hr><h2>Инкапсуляция: не трогай, сломается</h2><p><strong>Инкапсуляция</strong> — это принцип, который говорит:</p><blockquote class="tmiQuote" cite="" data-tmiquote=""><div class="tmiQuote_contents" data-tmitruncate=""><p>Внутренности объекта должны быть скрыты от внешнего мира.</p></div></blockquote><h3>Зачем это нужно?</h3><p>Чтобы:</p><ul><li><p>объект нельзя было сломать случайно;</p></li><li><p>данные изменялись только правильным способом.</p></li></ul><h3>Модификаторы доступа</h3><p>В PHP есть три основных:</p><ul><li><p><code>public</code> — доступно всем</p></li><li><p><code>protected</code> — доступно классу и наследникам</p></li><li><p><code>private</code> — доступно только внутри класса</p></li></ul><pre spellcheck="" class="tmiCode language-php" data-language="PHP"><code>class BankAccount {
    private int $balance = 0;

    public function deposit(int $amount) {
        $this-&gt;balance += $amount;
    }

    public function getBalance(): int {
        return $this-&gt;balance;
    }
}
</code></pre><p>Теперь нельзя сделать так:</p><pre spellcheck="" class="tmiCode language-php" data-language="PHP"><code>$account-&gt;balance = 1000000; // </code></pre><p><code><span class="tmiEmoji" title="">❌</span></code></p><p><code>нельзя</code></p><p>И это хорошо. Банк доволен. Ты доволен. Мир стабилен.</p><hr><h2>Наследование: не изобретай велосипед</h2><p><strong>Наследование</strong> позволяет создавать новые классы на основе существующих.</p><pre spellcheck="" class="tmiCode language-php" data-language="PHP"><code>class Animal {
    public function speak() {
        echo "Животное издаёт звук";
    }
}

class Dog extends Animal {
    public function speak() {
        echo "Гав!";
    }
}
</code></pre><pre spellcheck="" class="tmiCode language-php" data-language="PHP"><code>$dog = new Dog();
$dog-&gt;speak(); // Гав!
</code></pre><blockquote class="tmiQuote" cite="" data-tmiquote=""><div class="tmiQuote_contents" data-tmitruncate=""><p>Собака — это животное, но с уточнениями.</p></div></blockquote><hr><h2>Полиморфизм: один интерфейс — разное поведение</h2><p><strong>Полиморфизм</strong> — это когда разные объекты могут отвечать на один и тот же вызов по‑разному.</p><pre spellcheck="" class="tmiCode language-php" data-language="PHP"><code>class Cat extends Animal {
    public function speak() {
        echo "Мяу";
    }
}
</code></pre><pre spellcheck="" class="tmiCode language-php" data-language="PHP"><code>$animals = [new Dog(), new Cat()];

foreach ($animals as $animal) {
    $animal-&gt;speak();
}
</code></pre><p>Результат:</p><pre spellcheck="" class="tmiCode language-plaintext" data-language="Простой текст"><code>Гав!
Мяу
</code></pre><blockquote class="tmiQuote" cite="" data-tmiquote=""><div class="tmiQuote_contents" data-tmitruncate=""><p>Один метод — разное поведение. Магия? Нет, полиморфизм.</p></div></blockquote><hr><h2>Абстракция: только главное</h2><p><strong>Абстракция</strong> — это когда мы описываем <em>что объект должен делать</em>, но не <em>как именно</em>.</p><pre spellcheck="" class="tmiCode language-php" data-language="PHP"><code>abstract class Shape {
    abstract public function getArea(): float;
}

class Square extends Shape {
    public function __construct(private float $side) {}

    public function getArea(): float {
        return $this-&gt;side ** 2;
    }
}
</code></pre><blockquote class="tmiQuote" cite="" data-tmiquote=""><div class="tmiQuote_contents" data-tmitruncate=""><p>Абстрактный класс — это как ТЗ от заказчика: «сделай», а как — твоя проблема.</p></div></blockquote><hr><h2>Итог: вся суть ООП в одном месте</h2><p>ООП держится на четырёх китах:</p><ol><li><p><strong>Инкапсуляция</strong> — скрываем лишнее</p></li><li><p><strong>Наследование</strong> — переиспользуем код</p></li><li><p><strong>Полиморфизм</strong> — один интерфейс, разное поведение</p></li><li><p><strong>Абстракция</strong> — работаем с сутью, а не деталями</p></li></ol><p>Если ты понял это — поздравляю, ты понял ООП.</p><hr><h2>Напоследок</h2><p>ООП — это не цель, а инструмент. Он не делает код автоматически хорошим, но <strong>помогает писать его осознанно</strong>.</p><p>Если после этой статьи ты:</p><ul><li><p>не боишься слова «класс»;</p></li><li><p>понимаешь, зачем нужны объекты;</p></li><li><p>можешь объяснить ООП другу на кухне;</p></li></ul><p>значит, всё получилось.</p><p><em>А если нет — перечитай ещё раз. Программисты так делают постоянно.</em></p><p>Удачи в коде и поменьше фатальных ошибок.</p>]]></description><guid isPermaLink="false">2</guid><pubDate>Mon, 12 Jan 2026 23:25:00 +0000</pubDate></item><item><title>&#x42D;&#x43B;&#x435;&#x43A;&#x442;&#x440;&#x43E;&#x43D;&#x438;&#x43A;&#x430; &#x438; &#x44D;&#x43B;&#x435;&#x43A;&#x442;&#x440;&#x438;&#x43A;&#x430;: &#x43F;&#x43E;&#x43B;&#x43D;&#x43E;&#x435; &#x43F;&#x43E;&#x433;&#x440;&#x443;&#x436;&#x435;&#x43D;&#x438;&#x435;, &#x43E;&#x442; &#x449;&#x435;&#x43B;&#x447;&#x43A;&#x430; &#x432;&#x44B;&#x43A;&#x43B;&#x44E;&#x447;&#x430;&#x442;&#x435;&#x43B;&#x44F; &#x434;&#x43E; &#x443;&#x43C;&#x43D;&#x44B;&#x445; &#x443;&#x441;&#x442;&#x440;&#x43E;&#x439;&#x441;&#x442;&#x432;, &#x43A;&#x43E;&#x442;&#x43E;&#x440;&#x44B;&#x435; &#x434;&#x443;&#x43C;&#x430;&#x44E;&#x442; &#x437;&#x430; &#x43D;&#x430;&#x441;</title><link>https://ithub.uno/statiarticles/2_ithub-articles-on-electronics-and-electrical-engineering/%D1%8D%D0%BB%D0%B5%D0%BA%D1%82%D1%80%D0%BE%D0%BD%D0%B8%D0%BA%D0%B0-%D0%B8-%D1%8D%D0%BB%D0%B5%D0%BA%D1%82%D1%80%D0%B8%D0%BA%D0%B0-%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B5-%D0%BF%D0%BE%D0%B3%D1%80%D1%83%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BE%D1%82-%D1%89%D0%B5%D0%BB%D1%87%D0%BA%D0%B0-%D0%B2%D1%8B%D0%BA%D0%BB%D1%8E%D1%87%D0%B0%D1%82%D0%B5%D0%BB%D1%8F-%D0%B4%D0%BE-%D1%83%D0%BC%D0%BD%D1%8B%D1%85-%D1%83%D1%81%D1%82%D1%80%D0%BE%D0%B9%D1%81%D1%82%D0%B2-%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D0%B5-%D0%B4%D1%83%D0%BC%D0%B0%D1%8E%D1%82-%D0%B7%D0%B0-%D0%BD%D0%B0%D1%81-r5/</link><description><![CDATA[
<p><img src="https://ithub.uno/uploads/tmi_files_2026_01/jelektrotehnika-i-jelektrotehnika.webp.4811307f0bfbeaa43d34c3451a979552.webp" /></p>
<h1>Электроника и электрика: полное погружение</h1><p><em>От щелчка выключателя до умных устройств, которые думают за нас</em></p><hr><h2>Введение: почему электроника и электрика — это важно</h2><p>Мы живём в мире, который буквально <strong>питается электричеством</strong>. Свет в комнате, смартфон в руке, интернет, автомобили, заводы, «умные» дома — всё это работает благодаря двум тесно связанным дисциплинам:</p><ul><li><p><strong>электрике</strong> — науке и практике передачи и распределения электроэнергии;</p></li><li><p><strong>электронике</strong> — управлению электричеством с помощью компонентов и схем.</p></li></ul><p>Эта статья — не сухой учебник и не набор формул. Это <strong>глубокое, но понятное путешествие</strong>: от базовых принципов до современных технологий, с логикой, примерами и пониманием <em>почему всё работает именно так</em>.</p><hr><h2>Электрика и электроника: в чём разница</h2><p>Начнём с путаницы, которая есть почти у всех новичков.</p><h3>Электрика</h3><p>Электрика отвечает за:</p><ul><li><p>передачу <strong>энергии</strong>;</p></li><li><p>высокие токи и напряжения;</p></li><li><p>питание домов, зданий, оборудования.</p></li></ul><p>Примеры:</p><ul><li><p>розетки;</p></li><li><p>автоматы и УЗО;</p></li><li><p>кабели;</p></li><li><p>трансформаторы;</p></li><li><p>электродвигатели.</p></li></ul><h3>Электроника</h3><p>Электроника отвечает за:</p><ul><li><p><strong>управление</strong> электричеством;</p></li><li><p>обработку сигналов;</p></li><li><p>логику, вычисления, автоматизацию.</p></li></ul><p>Примеры:</p><ul><li><p>резисторы и транзисторы;</p></li><li><p>микросхемы;</p></li><li><p>микроконтроллеры;</p></li><li><p>датчики;</p></li><li><p>платы Arduino, ESP32, Raspberry Pi.</p></li></ul><blockquote class="tmiQuote" cite="" data-tmiquote=""><div class="tmiQuote_contents" data-tmitruncate=""><p>Коротко: <strong>электрика даёт силу, электроника — мозг</strong>.</p></div></blockquote><hr><h2>Основы, без которых никуда</h2><h3>Электрический ток</h3><p><strong>Ток</strong> — это движение электронов.</p><p>Как вода в трубе:</p><ul><li><p>напряжение — давление;</p></li><li><p>ток — количество воды;</p></li><li><p>сопротивление — узость трубы.</p></li></ul><h3>Напряжение (Вольты)</h3><p>Напряжение показывает, <em>насколько сильно электроны хотят двигаться</em>.</p><ul><li><p>1.5 В — батарейка</p></li><li><p>5 В — USB</p></li><li><p>220–230 В — розетка (опасно!)</p></li></ul><h3>Сопротивление (Омы)</h3><p>Сопротивление ограничивает ток.</p><p>Без сопротивления:</p><ul><li><p>перегрев;</p></li><li><p>короткое замыкание;</p></li><li><p>дым (тот самый, на котором работает электроника).</p></li></ul><hr><h2>Закон Ома — фундамент всего</h2><p><strong>Закон Ома</strong> связывает три ключевые величины:</p><blockquote class="tmiQuote" cite="" data-tmiquote=""><div class="tmiQuote_contents" data-tmitruncate=""><p><strong>I = U / R</strong></p></div></blockquote><p>Где:</p><ul><li><p>I — ток</p></li><li><p>U — напряжение</p></li><li><p>R — сопротивление</p></li></ul><p>Если ты понял закон Ома — ты понял половину электроники.</p><hr><h2>Основные электронные компоненты</h2><h3>Резисторы</h3><ul><li><p>ограничивают ток;</p></li><li><p>делят напряжение;</p></li><li><p>защищают схемы.</p></li></ul><p>Без них электроника превращается в фейерверк.</p><h3>Конденсаторы</h3><ul><li><p>накапливают заряд;</p></li><li><p>сглаживают напряжение;</p></li><li><p>фильтруют шумы.</p></li></ul><p>Используются в питании, таймерах, аудиосхемах.</p><h3>Диоды</h3><ul><li><p>пропускают ток только в одну сторону;</p></li><li><p>защищают от переполюсовки;</p></li><li><p>выпрямляют переменный ток.</p></li></ul><h3>Транзисторы</h3><p>Сердце электроники.</p><p>Транзистор может:</p><ul><li><p>усиливать сигнал;</p></li><li><p>работать как электронный выключатель;</p></li><li><p>управлять большими токами малыми.</p></li></ul><blockquote class="tmiQuote" cite="" data-tmiquote=""><div class="tmiQuote_contents" data-tmitruncate=""><p>Без транзисторов не было бы компьютеров.</p></div></blockquote><hr><h2>Электронные схемы: как читать и понимать</h2><p>Схема — это язык электроники.</p><p>Хорошая схема:</p><ul><li><p>показывает логику;</p></li><li><p>упрощает ремонт;</p></li><li><p>позволяет повторить устройство.</p></li></ul><p>Важно научиться:</p><ul><li><p>читать обозначения;</p></li><li><p>понимать путь тока;</p></li><li><p>видеть функциональные блоки.</p></li></ul><hr><h2>Источники питания</h2><h3>Линейные блоки питания</h3><ul><li><p>простые;</p></li><li><p>надёжные;</p></li><li><p>тяжёлые и горячие.</p></li></ul><h3>Импульсные блоки питания</h3><ul><li><p>компактные;</p></li><li><p>эффективные;</p></li><li><p>сложные.</p></li></ul><p>Именно они в зарядках, компьютерах и бытовой технике.</p><hr><h2>Микроконтроллеры: мозг современных устройств</h2><p>Микроконтроллер — это маленький компьютер на одной микросхеме.</p><p>Он умеет:</p><ul><li><p>читать датчики;</p></li><li><p>управлять выходами;</p></li><li><p>выполнять программы.</p></li></ul><h3>Популярные платформы</h3><ul><li><p>Arduino — идеально для старта</p></li><li><p>ESP8266 / ESP32 — Wi‑Fi и IoT</p></li><li><p>STM32 — промышленный уровень</p></li></ul><blockquote class="tmiQuote" cite="" data-tmiquote=""><div class="tmiQuote_contents" data-tmitruncate=""><p>Микроконтроллер — это точка, где электроника встречается с программированием.</p></div></blockquote><hr><h2>Автоматизация и умные системы</h2><p>Электроника давно вышла за пределы плат.</p><p>Сегодня она управляет:</p><ul><li><p>освещением;</p></li><li><p>климатом;</p></li><li><p>безопасностью;</p></li><li><p>производством;</p></li><li><p>транспортом.</p></li></ul><p>Основные элементы автоматизации:</p><ul><li><p>датчики;</p></li><li><p>контроллеры;</p></li><li><p>исполнительные механизмы.</p></li></ul><hr><h2>Безопасность: самое важное</h2><p>Работа с электричеством требует уважения.</p><p>Основные правила:</p><ul><li><p>не работать под напряжением;</p></li><li><p>использовать защиту;</p></li><li><p>проверять прибором;</p></li><li><p>понимать, что делаешь.</p></li></ul><blockquote class="tmiQuote" cite="" data-tmiquote=""><div class="tmiQuote_contents" data-tmitruncate=""><p>Электричество не прощает ошибок, но уважает знания.</p></div></blockquote><hr><h2>Как развиваться дальше</h2><h3>Для новичков</h3><ul><li><p>базовая теория;</p></li><li><p>простые схемы;</p></li><li><p>макетные платы;</p></li><li><p>Arduino.</p></li></ul><h3>Для продолжающих</h3><ul><li><p>расчёт схем;</p></li><li><p>PCB-дизайн;</p></li><li><p>силовая электроника;</p></li><li><p>микроконтроллеры.</p></li></ul><h3>Для профессионалов</h3><ul><li><p>промышленная автоматизация;</p></li><li><p>встраиваемые системы;</p></li><li><p>высокочастотная электроника;</p></li><li><p>энергоэффективность.</p></li></ul><hr><h2>Заключение</h2><p>Электроника и электрика — это не просто профессия или хобби. Это <strong>способ понимать мир</strong>, в котором мы живём.</p><p>Каждая схема — это логика.<br>Каждый провод — это путь энергии.<br>Каждое устройство — результат инженерного мышления.</p><p>Если ты начал разбираться в этом — значит, ты уже сделал первый шаг в мир, который управляет будущим.</p><p><em>И да, если что-то не заработало с первого раза — значит, ты всё делаешь правильно.</em></p>]]></description><guid isPermaLink="false">5</guid><pubDate>Mon, 12 Jan 2026 23:57:42 +0000</pubDate></item><item><title>&#x41E;&#x431;&#x44A;&#x435;&#x43A;&#x442;&#x43D;&#x43E;-&#x43E;&#x440;&#x438;&#x435;&#x43D;&#x442;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x43E;&#x435; &#x43F;&#x440;&#x43E;&#x433;&#x440;&#x430;&#x43C;&#x43C;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x432; C: &#x437;&#x430;&#x447;&#x435;&#x43C; &#x438; &#x43A;&#x430;&#x43A; &#x440;&#x435;&#x430;&#x43B;&#x438;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x44C;</title><link>https://ithub.uno/statiarticles/1_articles/%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5-%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B2-c-%D0%B7%D0%B0%D1%87%D0%B5%D0%BC-%D0%B8-%D0%BA%D0%B0%D0%BA-%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C-r6/</link><description><![CDATA[
<p><img src="https://ithub.uno/uploads/tmi_files_2026_01/b7f531d8-8f4f-4b8c-b8e8-ba3831966216.webp.fc53e131d4b3d29b7477a37ea9b3c03a.webp" /></p>
<p>Объектно-ориентированное программирование (ООП) — это <strong>парадигма разработки программного обеспечения</strong>, в которой программная система строится из «объектов» — сущностей, объединяющих данные и операции над ними. В отличие от чисто процедурного стиля, где функции и данные существуют отдельно, ООП помогает моделировать предметную область ближе к реальности, улучшает модульность, повторное использование и поддержку кода.Хотя язык <strong>С (ANSI C)</strong> исторически не является объектно-ориентированным, он обладает инструментами, которые позволяют <strong>эмулировать многие свойства ООП</strong> (такие как инкапсуляция, полиморфизм и частично наследование) с помощью структур, указателей и функций.</p><hr><p> </p><h2>Зачем нам применять ООП в C</h2><p> </p><p>ООП дает следующие важные преимущества:</p><ul><li><p><strong>Модульность и инкапсуляция.</strong> Код структурируется вокруг объектов, а не процедур, что облегчает разделение ответственности и управление сложностью.</p></li></ul><p><strong>Повторное использование компонентов.</strong> Объекты и функции, работающие с ними, можно многократно использовать в разных частях программы.</p><p><strong>Упрощённая поддержка.</strong> В больших проектах изменения в одном объекте не требуют полномасштабной переработки остального кода.</p><p><strong>Чёткие интерфейсы.</strong> Абстрагирование внутренних деталей объектов делает использование API понятным и безопасным.</p><p>Тем не менее, реализация ООП в C требует <strong>ручного управления памятью и структурой</strong>, а также дополнительных усилий для имитации механизмов, которые в других языках реализованы на уровне компилятора.</p><hr><p> </p><h2>Основная идея: структура плюс функции</h2><p> </p><p>В традиционных объектно-ориентированных языках (например, Java или C++) класс содержит <strong>поля (состояние)</strong> и <strong>методы (поведение)</strong>. В C аналог класса достигается через: </p><ul><li><p><code>struct</code> — описание набора данных, представляющего объект.</p><p></p></li></ul><p><strong>Функции</strong>, принимающие указатель на <code>struct</code> — имитация методов, которые работают с объектом</p><p><strong>Указатели на функции в структуре</strong> — позволяют эмулировать полиморфизм и виртуальные методы.</p><hr><p> </p><h2>Простой пример: объект «Point»</h2><pre spellcheck="" class="tmiCode language-c" data-language="C"><code>/* point.h */
#ifndef POINT_H
#define POINT_H

typedef struct Point Point;

/* Конструктор */
Point* Point_new(int x, int y);

/* «Методы» */
void Point_move(Point *self, int dx, int dy);
void Point_print(const Point *self);

/* Деструктор */
void Point_delete(Point *self);

#endif
</code></pre><p> </p><pre spellcheck="" class="tmiCode language-c" data-language="C"><code>/* point.c */
#include "point.h"
#include &lt;stdlib.h&gt;
#include &lt;stdio.h&gt;

struct Point {
    int x;
    int y;
};

Point* Point_new(int x, int y) {
    Point *p = malloc(sizeof(Point));
    if (p) {
        p-&gt;x = x;
        p-&gt;y = y;
    }
    return p;
}

void Point_move(Point *self, int dx, int dy) {
    if (self) {
        self-&gt;x += dx;
        self-&gt;y += dy;
    }
}

void Point_print(const Point *self) {
    if (self) {
        printf("Point at (%d, %d)\n", self-&gt;x, self-&gt;y);
    }
}

void Point_delete(Point *self) {
    free(self);
}
</code></pre><p> </p><pre spellcheck="" class="tmiCode language-c" data-language="C"><code>/* main.c */
#include "point.h"

int main(void) {
    Point *p = Point_new(10, 20);
    Point_print(p);
    Point_move(p, 5, -3);
    Point_print(p);
    Point_delete(p);
    return 0;
}
</code></pre><p> </p><p>В этом примере структура <code>Point</code> представляет объект, а функции <code>Point_move</code>, <code>Point_print</code> работают как методы. Объект создаётся через конструктор, а затем использует «методы». Такой подход соответствует <strong>эмуляции классов в C</strong>.</p><hr><p> </p><h2>Инкапсуляция и сокрытие данных</h2><p>Хотя C не обладает уровнями доступа (<code>private</code>, <code>public</code>), инкапсуляцию можно приблизить с помощью <strong>неполных типов</strong> (opaque type): в заголовке объявляется только указатель на структуру, а сама структура определена в .c-файле. Это скрывает внутренние поля объекта от пользователя API.</p><hr><p> </p><h2>Полиморфизм с помощью указателей на функции</h2><p>Для поддержки поведения, похожего на виртуальные методы, объект может содержать <strong>указатели на функции</strong>:</p><pre spellcheck="" class="tmiCode language-c" data-language="C"><code>typedef struct {
    void (*speak)(void *);
} Animal;

void dogSpeak(void *self) { printf("Woof\n"); }
void catSpeak(void *self) { printf("Meow\n"); }

int main(void) {
    Animal dog = { dogSpeak };
    Animal cat = { catSpeak };
    dog.speak(&amp;dog);
    cat.speak(&amp;cat);
}
</code></pre><p> </p><p>Это позволяет разным объектам иметь разную реализацию поведения через <strong>динамическое связывание</strong>.</p><hr><p> </p><h2>Наследование: структурное встраивание</h2><p>Хотя прямого механизма наследования в C нет, его можно приблизить через <strong>встраивание структур</strong>:</p><pre spellcheck="" class="tmiCode language-c" data-language="C"><code>typedef struct {
    int value;
} Base;

typedef struct {
    Base base;
    int extra;
} Derived;
</code></pre><p> </p><p>Это позволяет обращаться к общей части как к «базовому классу». Такие техники широко используются в практике написания крупных библиотек на C (например, в Linux kernel).</p><hr><p> </p><h2>Когда стоит и когда не стоит использовать ООП в C</h2><p> </p><h3>Когда стоит</h3><ul><li><p>Пишете сложные библиотеки или драйверы, где нужно чёткое разделение ответственности.</p></li></ul><p>Проект должен быть расширяемым и легко поддерживаемым в долгосрочной перспективе.</p><p>Вы хотите приблизить архитектуру к индустриальным стандартам, но обязаны использовать ANSI C.</p><h3>Когда не стоит</h3><ul><li><p>Проект очень мал, и усложнение архитектуры не оправдано.</p></li></ul><p>Требуется высокая производительность и минимальные накладные расходы.</p><p>Вы работаете в команде, где стандартные C++ механизмы ООП предпочтительнее и доступны.</p><hr><p> </p><h2>Заключение</h2><p>Объектно-ориентированное программирование в C <strong>возможно и полезно</strong> в задачах, где требуется структурирование больших систем и разделение интерфейса от реализации. Хотя язык не предоставляет встроенных механик классов, наследования и полиморфизма, эти свойства можно эффективно имитировать через структуры, указатели и хорошо продуманные API. Такой подход усиливает поддерживаемость, модульность и переиспользуемость кода в серьёзных проектах на С.</p>]]></description><guid isPermaLink="false">6</guid><pubDate>Sun, 25 Jan 2026 21:20:18 +0000</pubDate></item><item><title>&#x41A;&#x430;&#x43A; &#x437;&#x430;&#x433;&#x440;&#x443;&#x436;&#x430;&#x435;&#x442;&#x441;&#x44F; Linux: &#x43F;&#x43E;&#x43B;&#x43D;&#x44B;&#x439; &#x440;&#x430;&#x437;&#x431;&#x43E;&#x440; &#x43F;&#x440;&#x43E;&#x446;&#x435;&#x441;&#x441;&#x430; &#x43E;&#x442; BIOS &#x434;&#x43E; &#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x441;&#x43A;&#x43E;&#x433;&#x43E; &#x441;&#x435;&#x430;&#x43D;&#x441;&#x430;</title><link>https://ithub.uno/statiarticles/3_linux-gnu-os-articles/%D0%BA%D0%B0%D0%BA-%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B6%D0%B0%D0%B5%D1%82%D1%81%D1%8F-linux-%D0%BF%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9-%D1%80%D0%B0%D0%B7%D0%B1%D0%BE%D1%80-%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%B0-%D0%BE%D1%82-bios-%D0%B4%D0%BE-%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%81%D0%BA%D0%BE%D0%B3%D0%BE-%D1%81%D0%B5%D0%B0%D0%BD%D1%81%D0%B0-r9/</link><description><![CDATA[
<p><img src="https://ithub.uno/uploads/tmi_files_2026_01/Kak-izmenit-parametry-zagruzki-GRUB.png.c644c6dd5aa26dac74ed0e706477bef5.png" /></p>
<h1>Процесс загрузки Linux: подробный разбор по этапам</h1><p>Загрузка операционной системы Linux — это многоэтапный процесс, в ходе которого система проходит путь от включения питания до запуска пользовательской среды. Каждый этап выполняет строго определённую функцию и критически важен для корректной и стабильной работы ОС. Ниже подробно рассмотрены все ключевые стадии загрузки Linux в правильной последовательности.</p><hr><h2>1. Включение питания и инициализация BIOS / UEFI</h2><p>Процесс загрузки начинается в момент подачи питания на компьютер. Управление получает микропрограмма материнской платы — <strong>BIOS</strong> (Basic Input/Output System) или его современный аналог <strong>UEFI</strong> (Unified Extensible Firmware Interface).</p><p>На этом этапе выполняются следующие задачи:</p><ul><li><p>Инициализация базовых аппаратных компонентов: процессора, оперативной памяти, контроллеров ввода-вывода.</p></li><li><p>Проведение <strong>POST (Power-On Self Test)</strong> — самотестирования оборудования для выявления критических ошибок.</p></li><li><p>Определение доступных загрузочных устройств в соответствии с заданным приоритетом (SSD, HDD, USB-накопители, сетевой загрузчик).</p></li><li><p>Передача управления загрузчику операционной системы, расположенному на выбранном устройстве.</p></li></ul><p>UEFI отличается от классического BIOS поддержкой графического интерфейса, GPT-разметки, Secure Boot и более гибкой архитектурой загрузки.</p><hr><h2>2. Загрузчик операционной системы</h2><p>После завершения инициализации BIOS/UEFI управление передаётся <strong>загрузчику</strong>. В экосистеме Linux наиболее распространённым является <strong>GRUB2 (Grand Unified Bootloader)</strong>, однако также могут использоваться LILO, Syslinux, systemd-boot и другие решения.</p><p>Основные функции загрузчика:</p><ul><li><p>Загрузка ядра Linux (<code>vmlinuz</code>) в оперативную память.</p></li><li><p>Загрузка и передача ядру параметров командной строки.</p></li><li><p>(Опционально) Отображение меню выбора операционной системы, версии ядра или режима загрузки (обычный, recovery, single-user).</p></li><li><p>Загрузка начального RAM-диска (<code>initramfs</code> или <code>initrd</code>).</p></li></ul><p>В системах с UEFI загрузчик запускается через EFI-механизм и представляет собой <code>.efi</code>-приложение.</p><hr><h2>3. Инициализация ядра Linux</h2><p>После загрузки ядра в память управление полностью переходит к нему. Ядро Linux является центральным компонентом операционной системы и отвечает за взаимодействие между программным обеспечением и аппаратной частью.</p><p>На этапе инициализации ядра выполняются:</p><ul><li><p>Настройка процессора, планировщика задач и управления памятью.</p></li><li><p>Обнаружение и инициализация доступного оборудования.</p></li><li><p>Запуск драйверов, встроенных в ядро или загружаемых динамически.</p></li><li><p>Монтирование временной корневой файловой системы (<code>initramfs</code>).</p></li><li><p>Поиск и монтирование основной корневой файловой системы.</p></li><li><p>Запуск первого пользовательского процесса с PID 1 — <code>init</code>.</p></li></ul><p>Если ядро не может найти корневую файловую систему или необходимые драйверы, загрузка завершается ошибкой (kernel panic).</p><hr><h2>4. init-система и запуск пользовательского пространства</h2><p>Процесс с идентификатором <strong>PID 1</strong> — это основа пользовательского пространства Linux. Исторически это был <code>init</code> (SysVinit), однако в современных дистрибутивах его роль чаще всего выполняет <strong>systemd</strong>.</p><p>Функции init-системы:</p><ul><li><p>Чтение конфигурации загрузки (runlevels или targets).</p></li><li><p>Монтирование файловых систем.</p></li><li><p>Запуск и управление системными сервисами и демонами (udev, networking, logging).</p></li><li><p>Обеспечение корректного порядка запуска служб с учётом зависимостей.</p></li><li><p>Перевод системы в целевое состояние (например, <code>multi-user.target</code> или <code>graphical.target</code>).</p></li></ul><p>Systemd также отвечает за логирование (journald), управление устройствами и мониторинг состояния сервисов.</p><hr><h2>5. Запуск графической среды (при наличии)</h2><p>Если система предназначена для работы в графическом режиме, следующим этапом становится запуск графической подсистемы.</p><p>На этом шаге происходит:</p><ul><li><p>Запуск дисплейного сервера (<strong>Xorg</strong> или <strong>Wayland</strong>).</p></li><li><p>Инициализация менеджера входа в систему (GDM, SDDM, LightDM и др.).</p></li><li><p>Подготовка графической оболочки (GNOME, KDE Plasma, XFCE, Cinnamon и т. д.).</p></li></ul><p>Для серверных систем этот этап обычно отсутствует — загрузка завершается на уровне текстовой консоли.</p><hr><h2>6. Пользовательский сеанс</h2><p>Заключительный этап загрузки начинается после аутентификации пользователя. В этот момент система полностью готова к работе.</p><p>Запускаются:</p><ul><li><p>Пользовательские конфигурационные файлы и настройки среды.</p></li><li><p>Фоновые процессы и пользовательские службы.</p></li><li><p>Графические или консольные приложения, необходимые для работы.</p></li><li><p>Рабочее окружение с доступом к файловой системе, сети и периферии.</p></li></ul><p>На этом этапе Linux переходит в стабильное рабочее состояние.</p><hr><h2>FAQ — Часто задаваемые вопросы</h2><h3>Что делать, если Linux не загружается?</h3><p>Проверьте настройки BIOS/UEFI, порядок загрузки устройств и попробуйте восстановить загрузчик с помощью Live USB (например, через <code>grub-install</code>).</p><h3>Чем GRUB отличается от других загрузчиков?</h3><p>GRUB поддерживает большое количество файловых систем, гибкую конфигурацию, меню выбора ОС и сложные сценарии мультизагрузки.</p><h3>Можно ли обойтись без initramfs?</h3><p>Да, но только при статической сборке драйверов в ядро. Это усложняет обновление и снижает универсальность системы.</p><h3>Что делать, если загрузка зависает на этапе init/systemd?</h3><p>Используйте режим восстановления, проанализируйте логи командой <code>journalctl -xb</code> и проверьте конфигурацию сервисов.</p><h3>Как ускорить загрузку Linux?</h3><p>Отключите ненужные сервисы (<code>systemctl disable</code>), оптимизируйте targets, используйте SSD и файловые системы с быстрой инициализацией.</p><hr><h2>Заключение</h2><p>Процесс загрузки Linux представляет собой строго последовательную цепочку этапов, начиная с инициализации оборудования и заканчивая запуском пользовательской среды. BIOS или UEFI подготавливают аппаратную платформу и передают управление загрузчику, который загружает ядро. Ядро, в свою очередь, инициализирует систему и запускает init-процесс, управляющий всеми остальными компонентами. После старта системных служб и (при необходимости) графической среды пользователь получает полностью готовую к работе операционную систему.</p><p>Понимание этих этапов критически важно для диагностики проблем, оптимизации загрузки и администрирования Linux-систем.</p>]]></description><guid isPermaLink="false">9</guid><pubDate>Sun, 25 Jan 2026 21:28:29 +0000</pubDate></item><item><title>&#x41B;&#x438;&#x43C;&#x438;&#x442;&#x44B; &#x432; NGINX: &#x43A;&#x430;&#x43A; &#x437;&#x430;&#x449;&#x438;&#x442;&#x438;&#x442;&#x44C; &#x441;&#x435;&#x440;&#x432;&#x435;&#x440; &#x43E;&#x442; &#x43F;&#x435;&#x440;&#x435;&#x433;&#x440;&#x443;&#x437;&#x43E;&#x43A; &#x438; DoS&#x2011;&#x430;&#x442;&#x430;&#x43A;</title><link>https://ithub.uno/statiarticles/9_infrastructure/%D0%BB%D0%B8%D0%BC%D0%B8%D1%82%D1%8B-%D0%B2-nginx-%D0%BA%D0%B0%D0%BA-%D0%B7%D0%B0%D1%89%D0%B8%D1%82%D0%B8%D1%82%D1%8C-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80-%D0%BE%D1%82-%D0%BF%D0%B5%D1%80%D0%B5%D0%B3%D1%80%D1%83%D0%B7%D0%BE%D0%BA-%D0%B8-dos%E2%80%91%D0%B0%D1%82%D0%B0%D0%BA-r12/</link><description><![CDATA[
<p><img src="https://ithub.uno/uploads/tmi_files_2026_02/how-to-rate-limit-in-nginx-feature-image-1024x647.webp.7176420e29b00d43b825388dfea73b50.webp" /></p>
<h2>1. Сколько соединений может обработать один воркер</h2><p>В NGINX каждый воркер‑процесс способен обслуживать определённое число одновременных соединений. Это задаётся директивой:</p><pre spellcheck="" class="tmiCode language-nginx" data-language="Nginx"><code>worker_connections 1024;
</code></pre><ul><li><p>Здесь учитываются <strong>все дескрипторы</strong>, включая клиентские соединения и прокси‑сессии к бэкендам.</p></li><li><p>По умолчанию NGINX использует <strong>768 соединений</strong>, но для серьёзных нагрузок лучше поднять до <strong>1024+</strong>, не забывая про лимит открытых файлов в ОС (<code>ulimit -n</code>).</p></li></ul><p><strong>Расчёт максимального числа клиентов:</strong></p><p>max_clients=worker_processes×worker_connections\text{max\_clients} = \text{worker\_processes} \times \text{worker\_connections}max_clients=worker_processes×worker_connections</p><p>Пример:</p><pre spellcheck="" class="tmiCode" data-language="text"><code>worker_processes = 4
worker_connections = 1024
max_clients = 4 × 1024 = 4096
</code></pre><p>То есть сервер может обслуживать до 4096 соединений одновременно (минус коннекты к upstream).</p><p><strong>Пример конфигурации </strong><code>events.conf</code><strong>:</strong></p><pre spellcheck="" class="tmiCode language-nginx" data-language="Nginx"><code>events {
    worker_connections 1024;  # максимум соединений на воркер
    # accept_mutex on;        # равномерное принятие коннектов (опционально)
}
</code></pre><hr><h2>2. Ограничение одновременных соединений: <code>limit_conn</code></h2><p>Чтобы защитить сервер от «дружелюбной» перегрузки, например, когда бот‑краулер открывает сотни соединений, используется <strong>ngx_http_limit_conn_module</strong>:</p><ul><li><p><code>limit_conn_zone</code> — создаёт область памяти для хранения текущих соединений (обычно по IP).</p></li><li><p><code>limit_conn</code> — задаёт лимит одновременных соединений.</p></li></ul><p><strong>Пример настройки:</strong></p><pre spellcheck="" class="tmiCode language-nginx" data-language="Nginx"><code>http {
    limit_conn_zone $binary_remote_addr zone=perip:10m;

    server {
        location / {
            limit_conn perip 10;         # не больше 10 соединений на IP
            limit_conn_status 429;       # выдаём 429 вместо дефолтного 503
            limit_conn_log_level info;   # уровень логирования при отказе
        }
    }
}
</code></pre><ul><li><p><strong>10m зоны на 64-битной платформе</strong> хранят примерно 16 000 уникальных IP.</p></li><li><p>При переполнении NGINX сразу отдаёт ошибку (503/429).</p></li></ul><p><strong>Dry-run и логирование:</strong></p><pre spellcheck="" class="tmiCode language-nginx" data-language="Nginx"><code>limit_conn_dry_run on;       # не блокирует, а только логирует
limit_conn_log_level notice;
</code></pre><p>Так можно тестировать лимиты, не блокируя клиентов.</p><hr><h2>3. Ограничение скорости запросов: <code>limit_req</code></h2><p>Если нужно контролировать <strong>частоту запросов</strong>, применяется <strong>ngx_http_limit_req_module</strong>.</p><p>Механизм основан на <strong>«leaky bucket»</strong> — запросы попадают в бакет и «вытекают» с заданной скоростью.</p><pre spellcheck="" class="tmiCode language-nginx" data-language="Nginx"><code>http {
    limit_req_zone $binary_remote_addr zone=login:10m rate=5r/s;

    server {
        location /login {
            limit_req zone=login burst=10 nodelay;
            limit_req_status 429;
            limit_req_log_level warn;
        }
    }
}
</code></pre><ul><li><p><strong>burst</strong> — пиковое количество запросов, которое сервер пропускает сверх лимита.</p></li><li><p><strong>nodelay</strong> — отказ сразу при превышении лимита, без задержки.</p></li><li><p>Без nodelay лишние запросы будут ожидать своей очереди.</p></li></ul><hr><h2>4. Где хранится состояние</h2><p>В NGINX есть <strong>shared memory zones</strong> — специальная общая память для лимитов:</p><ul><li><p><strong>Slab-пул</strong> разбивает память на одинаковые блоки для быстрого выделения и освобождения.</p></li><li><p>Для <strong>limit_conn</strong> используется хеш-таблица или сбалансированное дерево по IP.</p></li><li><p>Для <strong>limit_req</strong> — красно‑чёрное дерево + очередь «протекающего ведра».</p></li><li><p>Доступ защищён встроенным мьютексом — нет гонок даже при сотнях воркеров.</p></li></ul><p><strong>Механизм работы:</strong></p><ol><li><p>При новом запросе NGINX берёт ключ (IP), ищет запись в зоне.</p></li><li><p>Если записи нет — создаёт новую.</p></li><li><p>Проверяет счётчики и решает, пропускать запрос или отказать.</p></li></ol><hr><h2>5. Реакция сервера при превышении лимита</h2><ul><li><p>По умолчанию:</p><ul><li><p><code>limit_conn</code> → 503 Service Unavailable</p></li><li><p><code>limit_req</code> → 503 Service Unavailable</p></li></ul></li><li><p>Лучше отдавать <strong>429 Too Many Requests</strong>, чтобы клиенты понимали причину.</p></li></ul><p><strong>Пример логов</strong></p><pre spellcheck="" class="tmiCode" data-language="text"><code>2025/04/04 13:45:12 [warn] 12345#0: *67890 limiting requests, excess: 5 by zone "login"
2025/04/04 13:45:12 [info] 12345#0: *67890 a client request is temporarily blocked by zone "perip"
</code></pre><hr><h2>6. Практические нюансы</h2><ul><li><p><strong>Размер зоны:</strong> 1 MB ≈ 16 000 записей; для 100 000 IP/сутки потребуется 10–12 MB.</p></li><li><p><strong>burst vs delay:</strong> для login/API можно применять разные подходы:</p><ul><li><p>login: <code>burst=1; nodelay</code></p></li><li><p>API: <code>burst=10; delay 10</code></p></li></ul></li><li><p><strong>Разные зоны для разных endpoint:</strong> чтобы лимиты не конфликтовали.</p></li><li><p><strong>Исключения:</strong> через <code>map</code> или <code>geo</code> можно исключить внутренние IP:</p></li></ul><pre spellcheck="" class="tmiCode language-nginx" data-language="Nginx"><code>map $remote_addr $limit {
    10.0.0.0/8         "";
    default            $binary_remote_addr;
}

limit_req_zone $limit zone=api:20m rate=20r/s;
</code></pre><hr><h2>7. Сторонние модули и NGINX Plus</h2><h3>7.1 ngx_brotli — снижение трафика</h3><ul><li><p>Brotli‑сжатие уменьшает объём передаваемых данных, разгружая лимиты по трафику:</p></li></ul><pre spellcheck="" class="tmiCode language-nginx" data-language="Nginx"><code>http {
    brotli on;
    brotli_comp_level 6;
    brotli_types text/html text/css application/javascript;
}
</code></pre><h3>7.2 ngx_http_limit_traffic_ratefilter_module — лимит по байтам</h3><ul><li><p>Позволяет ограничить скорость передачи, например 100 KB/s на IP:</p></li></ul><pre spellcheck="" class="tmiCode language-nginx" data-language="Nginx"><code>http {
    limit_traffic_rate_zone $binary_remote_addr zone=bytetraf:10m;

    server {
        location /downloads/ {
            limit_traffic_rate zone=bytetraf rate=100k;
        }
    }
}
</code></pre><h3>7.3 NGINX Plus — расширенные возможности</h3><ul><li><p><strong>Синхронизация зон между нодами</strong> — zone_sync.</p></li><li><p><strong>Адаптивное ограничение</strong>: скорость передачи зависит от метрик, например:</p></li></ul><pre spellcheck="" class="tmiCode language-nginx" data-language="Nginx"><code>map $upstream_response_time $dyn_rate {
    "~^[0-9]\.[0-1]" 200k;   # быстрые ответы — больше скорости
    default           50k;    # медленные — ограничение
}

server {
    location /stream/ {
        limit_rate $dyn_rate;
    }
}
</code></pre>]]></description><guid isPermaLink="false">12</guid><pubDate>Fri, 06 Feb 2026 17:39:00 +0000</pubDate></item><item><title>&#x41E;&#x441;&#x43D;&#x43E;&#x432;&#x44B; &#x430;&#x434;&#x43C;&#x438;&#x43D;&#x438;&#x441;&#x442;&#x440;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x44F; Linux: &#x43A;&#x43E;&#x43C;&#x430;&#x43D;&#x434;&#x44B;, &#x43D;&#x430;&#x441;&#x442;&#x440;&#x43E;&#x439;&#x43A;&#x430; &#x438; &#x443;&#x43F;&#x440;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x441;&#x438;&#x441;&#x442;&#x435;&#x43C;&#x43E;&#x439;</title><link>https://ithub.uno/statiarticles/3_linux-gnu-os-articles/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-%D0%B0%D0%B4%D0%BC%D0%B8%D0%BD%D0%B8%D1%81%D1%82%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F-linux-%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D1%8B-%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-%D0%B8-%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%BE%D0%B9-r15/</link><description><![CDATA[
<p><img src="https://ithub.uno/uploads/tmi_files_2026_02/276b95773f8c925929d28e76e9ad8f84.webp.6123a597666e93b771434c249b485d11.webp" /></p>
<h2>Введение</h2><p>Администратор Linux-систем отвечает за поддержание стабильной работы программного обеспечения, мониторинг состояния системы, управление аппаратными ресурсами и резервное копирование. В этой статье мы рассмотрим основные команды и принципы работы системного администратора, а также приведём практические примеры, которые помогут новичкам освоить базовое администрирование Linux.</p><hr><h2>Базовые настройки Linux</h2><h3>Установка имени хоста</h3><p>Чтобы изменить имя компьютера (hostname), откройте терминал и выполните команду:</p><pre spellcheck="" class="tmiCode language-bash" data-language="Bash"><code>sudo hostnamectl set-hostname your_hostname
</code></pre><p><strong>Примечание:</strong></p><ul><li><p>Замените <code>your_hostname</code> на желаемое имя.</p></li><li><p>Команда <code>hostnamectl</code> изменяет имя хоста постоянно. В отличие от <code>hostname</code>, которая действует только в текущей сессии.</p></li></ul><h3>Настройка часового пояса</h3><p>Чтобы установить часовой пояс, создайте символическую ссылку на нужную зону:</p><pre spellcheck="" class="tmiCode language-bash" data-language="Bash"><code>sudo ln -sf /usr/share/zoneinfo/Asia/Kolkata /etc/localtime
</code></pre><p><strong>Примечание:</strong></p><ul><li><p>Путь <code>/usr/share/zoneinfo/Asia/Kolkata</code> замените на ваш регион.</p></li><li><p>Эта команда обновляет системное время в соответствии с выбранной зоной.</p></li></ul><hr><h2>Управление файлами в Linux</h2><p>В Linux <strong>всё является файлом</strong>: устройства, каталоги, конфигурации и программы. Владение базовыми командами управления файлами критически важно.</p><div class="tmiRichText__table-wrapper"><table style="min-width: 40px;"><colgroup><col style="min-width:20px;"><col style="min-width:20px;"></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>Команда</p></th><th colspan="1" rowspan="1"><p>Назначение</p></th></tr><tr><td colspan="1" rowspan="1"><p><code>cd</code></p></td><td colspan="1" rowspan="1"><p>Переход в другой каталог</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>ls</code></p></td><td colspan="1" rowspan="1"><p>Просмотр списка файлов и папок</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>vi</code></p></td><td colspan="1" rowspan="1"><p>Консольный редактор для конфигурационных файлов</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>nano</code></p></td><td colspan="1" rowspan="1"><p>Удобный редактор с подсказками</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>touch</code></p></td><td colspan="1" rowspan="1"><p>Создание нового файла или обновление временной метки</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>cp</code></p></td><td colspan="1" rowspan="1"><p>Копирование файлов и каталогов</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>mv</code></p></td><td colspan="1" rowspan="1"><p>Перемещение и переименование файлов</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>rm</code></p></td><td colspan="1" rowspan="1"><p>Удаление файлов и папок</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>fdisk</code></p></td><td colspan="1" rowspan="1"><p>Управление таблицами разделов диска</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>mount</code></p></td><td colspan="1" rowspan="1"><p>Монтирование файловой системы</p></td></tr></tbody></table></div><p><strong>Примеры:</strong></p><p>Создание нового файла:</p><pre spellcheck="" class="tmiCode language-bash" data-language="Bash"><code>touch example.txt
</code></pre><p>Копирование файла:</p><pre spellcheck="" class="tmiCode language-bash" data-language="Bash"><code>cp example.txt backup.txt
</code></pre><p>Переименование файла:</p><pre spellcheck="" class="tmiCode language-bash" data-language="Bash"><code>mv backup.txt old_backup.txt
</code></pre><p>Удаление файла:</p><pre spellcheck="" class="tmiCode language-bash" data-language="Bash"><code>rm old_backup.txt
</code></pre><hr><h2>Сетевые команды</h2><p>Сетевые инструменты позволяют администратору проверять соединение, настраивать интерфейсы и удалённо управлять системой.</p><div class="tmiRichText__table-wrapper"><table style="min-width: 40px;"><colgroup><col style="min-width:20px;"><col style="min-width:20px;"></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>Команда</p></th><th colspan="1" rowspan="1"><p>Назначение</p></th></tr><tr><td colspan="1" rowspan="1"><p><code>ping</code></p></td><td colspan="1" rowspan="1"><p>Проверка доступности сервера</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>traceroute</code></p></td><td colspan="1" rowspan="1"><p>Отслеживание маршрута пакетов</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>nslookup</code></p></td><td colspan="1" rowspan="1"><p>Проверка DNS-записей</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>ifconfig</code> / <code>ip</code></p></td><td colspan="1" rowspan="1"><p>Настройка сетевых интерфейсов</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>ssh</code></p></td><td colspan="1" rowspan="1"><p>Удалённый доступ и туннелирование</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>scp</code></p></td><td colspan="1" rowspan="1"><p>Копирование файлов по SSH</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>curl</code></p></td><td colspan="1" rowspan="1"><p>Передача данных на сервер или с него</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>nmap</code></p></td><td colspan="1" rowspan="1"><p>Сканирование сети и аудит безопасности</p></td></tr></tbody></table></div><p><strong>Пример проверки соединения:</strong></p><pre spellcheck="" class="tmiCode language-bash" data-language="Bash"><code>ping google.com
</code></pre><p><strong>Пример копирования файла на удалённый сервер:</strong></p><pre spellcheck="" class="tmiCode language-bash" data-language="Bash"><code>scp example.txt user@remote:/home/user/
</code></pre><hr><h2>Управление пользователями и группами</h2><p>В Linux есть три типа пользователей:</p><ol><li><p><strong>Root</strong> — суперпользователь с UID 0.</p></li><li><p><strong>Обычные пользователи</strong> — повседневные пользователи с уникальными UID.</p></li><li><p><strong>Системные пользователи</strong> — для работы служб, например <code>mysql</code> или <code>www-data</code>.</p></li></ol><h3>Основные команды управления пользователями</h3><div class="tmiRichText__table-wrapper"><table style="min-width: 40px;"><colgroup><col style="min-width:20px;"><col style="min-width:20px;"></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>Команда</p></th><th colspan="1" rowspan="1"><p>Назначение</p></th></tr><tr><td colspan="1" rowspan="1"><p><code>adduser</code></p></td><td colspan="1" rowspan="1"><p>Создание нового пользователя</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>useradd</code></p></td><td colspan="1" rowspan="1"><p>Низкоуровневая команда для создания пользователя</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>passwd</code></p></td><td colspan="1" rowspan="1"><p>Установка или изменение пароля</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>deluser</code> / <code>userdel</code></p></td><td colspan="1" rowspan="1"><p>Удаление пользователя</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>usermod</code></p></td><td colspan="1" rowspan="1"><p>Изменение свойств пользователя</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>groups</code></p></td><td colspan="1" rowspan="1"><p>Просмотр групп пользователя</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>groupadd</code> / <code>groupdel</code></p></td><td colspan="1" rowspan="1"><p>Создание и удаление групп</p></td></tr></tbody></table></div><p><strong>Пример:</strong></p><p>Создание нового пользователя с паролем:</p><pre spellcheck="" class="tmiCode language-bash" data-language="Bash"><code>sudo adduser newuser
</code></pre><p>Добавление пользователя в группу <code>sudo</code>:</p><pre spellcheck="" class="tmiCode language-bash" data-language="Bash"><code>sudo usermod -aG sudo newuser
</code></pre><hr><h2>Диагностика и мониторинг системы</h2><p>Эффективный администратор следит за состоянием системы и производительностью.</p><div class="tmiRichText__table-wrapper"><table style="min-width: 40px;"><colgroup><col style="min-width:20px;"><col style="min-width:20px;"></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>Команда</p></th><th colspan="1" rowspan="1"><p>Назначение</p></th></tr><tr><td colspan="1" rowspan="1"><p><code>top</code></p></td><td colspan="1" rowspan="1"><p>Просмотр процессов в реальном времени</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>htop</code></p></td><td colspan="1" rowspan="1"><p>Улучшенная версия <code>top</code> с цветным интерфейсом</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>vmstat</code></p></td><td colspan="1" rowspan="1"><p>Статистика процессов, памяти и CPU</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>iostat</code></p></td><td colspan="1" rowspan="1"><p>Мониторинг загрузки дисков</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>lsof</code></p></td><td colspan="1" rowspan="1"><p>Список открытых файлов</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>nmon</code></p></td><td colspan="1" rowspan="1"><p>Комплексный мониторинг системы</p></td></tr></tbody></table></div><hr><h2>Работа с логами</h2><p>Логи позволяют быстро находить ошибки и анализировать работу системы.</p><div class="tmiRichText__table-wrapper"><table style="min-width: 40px;"><colgroup><col style="min-width:20px;"><col style="min-width:20px;"></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>Команда</p></th><th colspan="1" rowspan="1"><p>Назначение</p></th></tr><tr><td colspan="1" rowspan="1"><p><code>dmesg</code></p></td><td colspan="1" rowspan="1"><p>Сообщения ядра</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>tail</code></p></td><td colspan="1" rowspan="1"><p>Последние строки файла</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>journalctl</code></p></td><td colspan="1" rowspan="1"><p>Управление логами systemd</p></td></tr></tbody></table></div><p><strong>Пример просмотра последних 20 строк системного журнала:</strong></p><pre spellcheck="" class="tmiCode language-bash" data-language="Bash"><code>journalctl -n 20
</code></pre><hr><h2>Заключение</h2><p>Администрирование Linux требует понимания работы с файлами, пользователями, сетью, логами и системными ресурсами. Освоение приведённых команд позволяет:</p><ul><li><p>Настраивать и поддерживать систему;</p></li><li><p>Контролировать пользователей и права доступа;</p></li><li><p>Проводить диагностику и мониторинг;</p></li><li><p>Обеспечивать безопасность и стабильность работы системы.</p></li></ul><p>Практическое использование этих команд формирует фундаментальные навыки системного администратора, необходимые для работы в реальной среде Linux.</p>]]></description><guid isPermaLink="false">15</guid><pubDate>Fri, 06 Feb 2026 17:48:17 +0000</pubDate></item><item><title>&#x423;&#x437;&#x43D;&#x430;&#x439;&#x442;&#x435; &#x43E; &#x441;&#x430;&#x43C;&#x44B;&#x445; &#x440;&#x430;&#x441;&#x43F;&#x440;&#x43E;&#x441;&#x442;&#x440;&#x430;&#x43D;&#x451;&#x43D;&#x43D;&#x44B;&#x445; &#x43E;&#x448;&#x438;&#x431;&#x43A;&#x430;&#x445; &#x43F;&#x440;&#x438; &#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x438; &#x438; &#x44D;&#x43A;&#x441;&#x43F;&#x43B;&#x443;&#x430;&#x442;&#x430;&#x446;&#x438;&#x438; &#x441;&#x435;&#x442;&#x435;&#x439;, &#x43E;&#x442; &#x43A;&#x430;&#x431;&#x435;&#x43B;&#x44C;&#x43D;&#x43E;&#x439; &#x438;&#x43D;&#x444;&#x440;&#x430;&#x441;&#x442;&#x440;&#x443;&#x43A;&#x442;&#x443;&#x440;&#x44B; &#x434;&#x43E; &#x43C;&#x430;&#x440;&#x448;&#x440;&#x443;&#x442;&#x438;&#x437;&#x430;&#x442;&#x43E;&#x440;&#x43E;&#x432;. &#x41F;&#x440;&#x430;&#x43A;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x435; &#x441;&#x43E;&#x432;&#x435;&#x442;&#x44B;, &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x44B; &#x438; &#x43D;&#x430;&#x433;&#x43B;&#x44F;&#x434;&#x43D;&#x44B;&#x435; &#x440;&#x435;&#x43A;&#x43E;&#x43C;&#x435;&#x43D;&#x434;&#x430;&#x446;&#x438;&#x438; &#x434;&#x43B;&#x44F; IT-&#x441;&#x43F;&#x435;&#x446;&#x438;&#x430;&#x43B;&#x438;&#x441;&#x442;&#x43E;&#x432; &#x438; &#x430;&#x434;&#x43C;&#x438;&#x43D;&#x438;&#x441;&#x442;&#x440;&#x430;&#x442;&#x43E;&#x440;&#x43E;&#x432;.</title><link>https://ithub.uno/statiarticles/9_infrastructure/%D1%83%D0%B7%D0%BD%D0%B0%D0%B9%D1%82%D0%B5-%D0%BE-%D1%81%D0%B0%D0%BC%D1%8B%D1%85-%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D1%91%D0%BD%D0%BD%D1%8B%D1%85-%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D0%B0%D1%85-%D0%BF%D1%80%D0%B8-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8-%D0%B8-%D1%8D%D0%BA%D1%81%D0%BF%D0%BB%D1%83%D0%B0%D1%82%D0%B0%D1%86%D0%B8%D0%B8-%D1%81%D0%B5%D1%82%D0%B5%D0%B9-%D0%BE%D1%82-%D0%BA%D0%B0%D0%B1%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9-%D0%B8%D0%BD%D1%84%D1%80%D0%B0%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B-%D0%B4%D0%BE-%D0%BC%D0%B0%D1%80%D1%88%D1%80%D1%83%D1%82%D0%B8%D0%B7%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2-%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5-%D1%81%D0%BE%D0%B2%D0%B5%D1%82%D1%8B-%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B-%D0%B8-%D0%BD%D0%B0%D0%B3%D0%BB%D1%8F%D0%B4%D0%BD%D1%8B%D0%B5-%D1%80%D0%B5%D0%BA%D0%BE%D0%BC%D0%B5%D0%BD%D0%B4%D0%B0%D1%86%D0%B8%D0%B8-%D0%B4%D0%BB%D1%8F-it-%D1%81%D0%BF%D0%B5%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D1%81%D1%82%D0%BE%D0%B2-%D0%B8-%D0%B0%D0%B4%D0%BC%D0%B8%D0%BD%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2-r18/</link><description><![CDATA[
<p><img src="https://ithub.uno/uploads/tmi_files_2026_02/before_and_after_01.jpg.ce87463843307bbadcc0d20e7c14f835.jpg" /></p>
<h3>Ошибки в сетевой инфраструктуре: от планирования до эксплуатации</h3><p>Ошибки, которые могут допустить IT-специалисты, практически неисчерпаемы. Некоторые из них незаметны обычным пользователям — например, отсутствие настроенного журналирования событий. Даже взлом, произошедший из-за этого, может остаться незамеченным, пока об этом не напишут в новостях.</p><p>Другие ошибки становятся очевидными сразу: проблемы в работе сети замечает каждый сотрудник. В этой статье разберём наиболее частые ошибки при проектировании и эксплуатации сетей и дадим практические рекомендации, как их избежать.</p><hr><h3>1. Планирование сети: превыше всего</h3><p>Часто сети строятся без должного планирования. Причины бывают разные: экономия средств, отсутствие компетенций у проектировщиков, поспешные решения руководства.</p><p><strong>Пример:</strong> интегратор готовит детальную спецификацию сети, а заказчик «подрезает» её, чтобы сэкономить — в итоге сеть строится с недочётами, которые потом приходится исправлять дорого и долго.</p><p>Правильное планирование включает:</p><ul><li><p>оценку количества рабочих мест и будущего расширения;</p></li><li><p>разработку документации и схем сети;</p></li><li><p>расчёт емкости портов на коммутаторах и маршрутизаторах;</p></li><li><p>планирование отказоустойчивости и резервирования.</p></li></ul><hr><h3>2. Кабельная инфраструктура: детали имеют значение</h3><p>Даже при массовом использовании Wi‑Fi проводные соединения остаются критически важными.</p><p><strong>Ошибки:</strong></p><ul><li><p>Недостаток розеток и кабелей.</p></li><li><p>Плохая организация кабельных каналов.</p></li><li><p>Попытка «все на Wi‑Fi», что может привести к перегрузке сети.</p></li></ul><p><strong>Решение:</strong></p><ul><li><p>Планируйте количество розеток с запасом (+4–6 на кабинет).</p></li><li><p>Разделяйте кабели по цветам:</p><ul><li><p><strong>Жёлтые</strong> — кроссы,</p></li><li><p><strong>Красные</strong> — серверы и NAS,</p></li><li><p><strong>Синие</strong> — настенные разъёмы и коммутаторы,</p></li><li><p><strong>Чёрные</strong> — инфраструктурные соединения,</p></li><li><p><strong>Зелёные</strong> — временные подключения.</p></li></ul></li><li><p>Маркируйте оба конца кабеля, чтобы быстро находить подключение к устройству.</p></li></ul><hr><h3>3. Коммутаторы: порты не должны заканчиваться</h3><p>Ошибка многих сетевых администраторов — неправильный расчёт портовой емкости. Если все порты заняты «впритык», в критический момент новые устройства подключить будет невозможно.</p><p><strong>Совет:</strong></p><ul><li><p>Для этажных коммутаторов рассчитывайте запас портов.</p></li><li><p>Для коммутаторов ядра — учитывайте отказоустойчивость и настройку Spanning Tree.</p></li></ul><hr><h3>4. Маршрутизаторы: не пытайтесь сделать всё</h3><p>Современные маршрутизаторы умеют почти всё: VPN, DHCP, файрволл, межсетевой экран.<br>Но перегружать маршрутизатор всеми функциями не стоит:</p><ul><li><p>Он станет точкой отказа.</p></li><li><p>Пропускная способность упадёт.</p></li><li><p>Риски безопасности увеличатся.</p></li></ul><p><strong>Рекомендация:</strong> оставьте маршрутизатор только для маршрутизации, VPN и файрволл — на отдельные устройства.</p><hr><h3>5. Серверная: порядок и скорость</h3><p><strong>Ошибки:</strong></p><ul><li><p>Перепутанные кабели, отсутствие маркировки.</p></li><li><p>Серверы, размещённые далеко от магистралей сети, что замедляет работу.</p></li></ul><p><strong>Пример:</strong><br>Представьте автостраду и деревенскую дорогу. Магистраль позволяет двигаться быстро без остановок, а локальные дороги замедляют движение. Так же работает и сеть: чем больше устройств между пользователем и сервером, тем медленнее передача данных.</p><p><strong>Решение:</strong></p><ul><li><p>Сразу организуйте кабели аккуратно и с маркировкой.</p></li><li><p>Размещайте серверы так, чтобы минимизировать количество промежуточных устройств.</p></li></ul><hr><h3>6. Документирование: бумажки — это важно</h3><p>Без документации можно потерять контроль над сетью: свободные порты окажутся заняты, кабели не будут подписаны, схемы станут нечитаемыми.</p><p><strong>Советы:</strong></p><ul><li><p>Ведите журнал портов на коммутаторах.</p></li><li><p>Создавайте схемы сети на уровнях L1/L2/L3, не перегружая одну схему всеми деталями.</p></li><li><p>Обновляйте документацию регулярно.</p></li></ul><hr><h3>Заключение</h3><p>Правильное проектирование и эксплуатация сети — это не только вопрос техники, но и организации процессов. Соблюдение этих рекомендаций помогает минимизировать ошибки, повышает стабильность и скорость работы сети.</p><p>Даже если что-то осталось за кадром — избегая этих типичных ошибок, вы уже делаете сеть более надёжной.</p>]]></description><guid isPermaLink="false">18</guid><pubDate>Fri, 06 Feb 2026 18:32:07 +0000</pubDate></item><item><title>&#x41A;&#x430;&#x43A; &#x43F;&#x440;&#x43E;&#x435;&#x43A;&#x442;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x442;&#x44C; &#x43E;&#x442;&#x43A;&#x430;&#x437;&#x43E;&#x443;&#x441;&#x442;&#x43E;&#x439;&#x447;&#x438;&#x432;&#x44B;&#x435; &#x438; &#x43C;&#x430;&#x441;&#x448;&#x442;&#x430;&#x431;&#x438;&#x440;&#x443;&#x435;&#x43C;&#x44B;&#x435; &#x441;&#x43E;&#x431;&#x44B;&#x442;&#x438;&#x439;&#x43D;&#x43E;-&#x43E;&#x440;&#x438;&#x435;&#x43D;&#x442;&#x438;&#x440;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x435; &#x441;&#x438;&#x441;&#x442;&#x435;&#x43C;&#x44B; (EDA)</title><link>https://ithub.uno/statiarticles/9_infrastructure/%D0%BA%D0%B0%D0%BA-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C-%D0%BE%D1%82%D0%BA%D0%B0%D0%B7%D0%BE%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D1%8B%D0%B5-%D0%B8-%D0%BC%D0%B0%D1%81%D1%88%D1%82%D0%B0%D0%B1%D0%B8%D1%80%D1%83%D0%B5%D0%BC%D1%8B%D0%B5-%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D0%B9%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5-%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B-eda-r21/</link><description><![CDATA[
<p><img src="https://ithub.uno/uploads/tmi_files_2026_02/bd35seb9lw8v3bs4rhzuth2ucyk1knvp.webp.f86bf5104093a47cbecc2e7b27947a1b.webp" /></p>
<h3>Введение</h3><p>Событийно-ориентированные архитектуры (EDA) на бумаге выглядят идеальными: продюсеры и консюмеры отделены друг от друга, потоки асинхронны, а система легко масштабируется. Но реальность часто оказывается сложнее.</p><p>Представьте распродажу на «Чёрную пятницу»: ваша система обработки платежей получает в 5 раз больше трафика. В этот момент серверлесс-функции запускаются «холодно», очереди SQS переполняются, а DynamoDB начинает троттлить. Результат: сбои заказов клиентов. И это не гипотетический сценарий — с этим сталкиваются многие команды eCommerce, SaaS и FinTech.</p><p>Система EDA в высокоуровневом виде состоит из трёх компонентов: продюсер → буфер/очередь → консюмер. При проектировании важно учитывать не только непрерывную работу, но и предсказуемость системы под нагрузкой. Пиковые нагрузки могут быть вызваны интеграциями, узкими местами потребителей или бесконечными повторными попытками сообщений — всё это проверяет архитектуру на прочность.</p><hr><h3>Задержка — не единственная проблема</h3><p>Когда говорят о производительности EDA, обычно имеют в виду задержку. Но для отказоустойчивых систем важны также:</p><ul><li><p>Пропускная способность</p></li><li><p>Эффективное использование ресурсов</p></li><li><p>Надёжная передача данных между компонентами</p></li></ul><p><strong>Пример:</strong><br>Если сервис зависит от SQS и трафик резко возрастает, downstream-системы могут перегрузиться. Это приводит к повторным попыткам, росту задержек и искажению метрик мониторинга. Даже продуманный DLQ, экспоненциальное затухание и троттлинг не решат проблему, если не учитывать контракты между компонентами.</p><p><strong>Вывод:</strong> задержка — это сигнал о «давлении» в системе. Её нужно воспринимать как индикатор накопления нагрузки, а не только минимизировать.</p><hr><h3>Паттерны проектирования для масштабируемости и отказоустойчивости</h3><h4>1. Шардирование и перемешивающее шардирование</h4><p>Разделяйте клиентов или события на несколько шардов, чтобы шумный клиент не перегружал всю систему.</p><p><strong>Пример:</strong><br>В очереди SQS несколько клиентов могут быть хэшированы на одну очередь. Если один клиент начинает генерировать пик событий, он влияет на всех остальных. Перемешивающее шардирование уменьшает вероятность этого, распределяя клиентов случайным образом по разным очередям.</p><h4>2. Предварительное выделение ресурсов для критических задач</h4><p>Для задач с высокой чувствительностью к задержке (например, обнаружение мошенничества в FinTech) заранее выделяйте ресурсы.</p><p><strong>Пример:</strong><br>Для AWS Lambda используйте provisioned concurrency или авто-масштабирование с выделенной параллельностью. Это гарантирует быструю обработку критических событий, сохраняя экономичность при изменении нагрузки.</p><hr><h3>Паттерны инфраструктуры</h3><h4>1. Очереди и буферы</h4><p>Очереди SQS, Kafka, Kinesis и EventBridge действуют как буферы между продюсерами и консюмерами, поглощая резкие всплески нагрузки.</p><p><strong>Пример:</strong></p><ul><li><p>Реальное время кликов на рекламной платформе → Kinesis (шардирование по региону)</p></li><li><p>Выставление счетов → FIFO SQS для гарантии порядка и предотвращения дублирования</p></li></ul><h4>2. Быстрый сбой и предсказуемый отказ</h4><p>Если консюмер не может обработать событие (например, база данных недоступна), лучше завершить операцию с ошибкой сразу, чем блокировать очередь на длительное время.</p><p><strong>Пример:</strong><br>Контейнер Lambda зависал на аутентификации 30 секунд → добавили тайм-аут 5 секунд и явное завершение с ошибкой → очередь перестала накапливать сообщения.</p><hr><h3>Распространённые ошибки и как их избежать</h3><ol><li><p><strong>Переоценка средней нагрузки:</strong><br>Систему нужно тестировать под резкие пики (p95, p99), а не под средние значения.</p></li><li><p><strong>Повторные попытки как панацея:</strong><br>Бесконтрольные повторные попытки могут создать петли трафика и троттлинг. Используйте экспоненциальное затухание с джиттером и разделяйте ошибки на повторяемые и нет.</p></li><li><p><strong>Недостаточная наблюдаемость:</strong><br>Метрики должны показывать не только ошибки и время отклика, но и глубину очередей, повторные попытки и масштабируемость компонентов.</p></li><li><p><strong>Одинаковое обращение со всеми событиями:</strong><br>Событие оплаты ≠ событие логирования. Разделяйте критические и низкоприоритетные события с помощью отдельных очередей или маршрутизации в разные Lambdas.</p></li></ol><hr><h3>Заключение</h3><p>Отказоустойчивость — это не попытка создать «идеальную систему», а способность выдерживать удары и продолжать работу. Основные принципы:</p><ul><li><p>Эластичность и буферы, поглощающие пики нагрузки</p></li><li><p>Умные повторные попытки</p></li><li><p>Предсказуемые режимы отказа</p></li><li><p>Наблюдаемость, позволяющая подтверждать работоспособность системы</p></li></ul><p><strong>С чего начать:</strong><br>Создайте простое событийно-ориентированное приложение на SQS и Lambda. Попробуйте DLQ, обработку сбоев и маршрутизацию событий через EventBridge. Постепенно добавляйте шардирование, авто-масштабирование и сложные паттерны.</p><p>Отказоустойчивость — это подход, который строится шаг за шагом. Начните с малого, изучайте поведение системы и постепенно добавляйте сложность.</p>]]></description><guid isPermaLink="false">21</guid><pubDate>Fri, 06 Feb 2026 18:34:16 +0000</pubDate></item><item><title>&#x41A;&#x430;&#x43A; &#x431;&#x435;&#x437;&#x43E;&#x43F;&#x430;&#x441;&#x43D;&#x43E; &#x43F;&#x435;&#x440;&#x435;&#x43D;&#x435;&#x441;&#x442;&#x438; &#x431;&#x430;&#x437;&#x443; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; PostgreSQL: &#x43F;&#x43E;&#x43B;&#x43D;&#x43E;&#x435; &#x440;&#x443;&#x43A;&#x43E;&#x432;&#x43E;&#x434;&#x441;&#x442;&#x432;&#x43E; &#x43F;&#x43E; &#x43B;&#x43E;&#x433;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x43E;&#x439; &#x440;&#x435;&#x43F;&#x43B;&#x438;&#x43A;&#x430;&#x446;&#x438;&#x438; &#x438; &#x434;&#x440;&#x443;&#x433;&#x438;&#x43C; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430;&#x43C;</title><link>https://ithub.uno/statiarticles/9_infrastructure/%D0%BA%D0%B0%D0%BA-%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE-%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%B5%D1%81%D1%82%D0%B8-%D0%B1%D0%B0%D0%B7%D1%83-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-postgresql-%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B5-%D1%80%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE-%D0%BF%D0%BE-%D0%BB%D0%BE%D0%B3%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9-%D1%80%D0%B5%D0%BF%D0%BB%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8-%D0%B8-%D0%B4%D1%80%D1%83%D0%B3%D0%B8%D0%BC-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B0%D0%BC-r24/</link><description><![CDATA[
<p><img src="https://ithub.uno/uploads/tmi_files_2026_02/MD-989.webp.ebac0bcc749f27933f24faa78c86ccdc.webp" /></p>
<h2>Введение</h2><p>Перенос базы данных PostgreSQL — задача непростая, особенно для больших проектов. Часто это один из самых крупных и ответственных процессов для разработчиков и администраторов. Основные сценарии переноса включают:</p><ul><li><p>обновление до новой версии PostgreSQL;</p></li><li><p>перенос базы на другой сервер или хостинг;</p></li><li><p>миграция с минимальным временем простоя.</p></li></ul><p>В зависимости от размера базы и ограничений инфраструктуры есть три основных подхода.</p><hr><h2>1. Перенос с помощью pg_dump и pg_restore</h2><p><code>pg_dump</code> позволяет создать дамп всей базы, включая схемы, таблицы и специальные объекты. Для небольших баз (50–150 ГБ) это часто самый простой вариант.</p><p><strong>Пример использования:</strong></p><pre spellcheck="" class="tmiCode language-bash" data-language="Bash"><code>pg_dump -Fc $SOURCE_DB_URI &gt; dump_file.dump
pg_restore --no-acl --no-owner -d $TARGET_DB_URI dump_file.dump
</code></pre><p><strong>Плюсы:</strong></p><ul><li><p>Надёжно и просто;</p></li><li><p>Полный дамп базы, включая схему и данные.</p></li></ul><p><strong>Минусы:</strong></p><ul><li><p>При больших базах (сотни ГБ и выше) процесс может занять часы;</p></li><li><p>Требуется время на восстановление и минимизация простоя.</p></li></ul><hr><h2>2. Использование WAL (Write-Ahead Logging)</h2><p>Если у вас настроено резервное копирование на основе WAL, например через <strong>pgBackRest</strong>, <strong>WAL-G</strong> или <strong>WAL-E</strong>, можно выполнить масштабную миграцию:</p><ol><li><p>Создаётся полная резервная копия базы;</p></li><li><p>Настраивается потоковая передача WAL на новый сервер;</p></li><li><p>После завершения первичной синхронизации можно переключить приложение на новую базу с минимальным простоем.</p></li></ol><p><strong>Плюсы:</strong></p><ul><li><p>Подходит для терабайтных баз;</p></li><li><p>Минимизирует простой.</p></li></ul><p><strong>Минусы:</strong></p><ul><li><p>Требует доступа к WAL (не поддерживается, например, в Amazon RDS).</p></li></ul><hr><h2>3. Логическая миграция PostgreSQL</h2><p>Логическая репликация позволяет переносить данные на новый сервер без доступа к WAL.</p><ul><li><p><strong>Принцип работы:</strong> текущая база (publisher) передаёт изменения новой базе (subscriber);</p></li><li><p>Репликация распространяется на данные таблиц, но <strong>не переносит схему, индексы и последовательности</strong>;</p></li><li><p>С помощью дополнительных шагов можно выполнить полную миграцию.</p></li></ul><h3>Основные шаги логической миграции</h3><h4>Шаг 1: Перенос схемы</h4><p>Сначала необходимо создать на новом сервере структуру базы:</p><pre spellcheck="" class="tmiCode language-bash" data-language="Bash"><code>pg_dump -Fc -s $SOURCE_DB_URI | pg_restore --no-acl --no-owner -d $TARGET_DB_URI
</code></pre><ul><li><p>При активной разработке изменений схемы: синхронизируйте изменения и на подписчике.</p></li></ul><h4>Шаг 2: Настройка издателя (старый сервер)</h4><ol><li><p>Включите логическую репликацию:</p></li></ol><pre spellcheck="" class="tmiCode language-sql" data-language="SQL"><code>ALTER SYSTEM SET wal_level = logical;
</code></pre><ol start="2"><li><p>Настройте параметры слотов репликации:</p></li></ol><pre spellcheck="" class="tmiCode" data-language="text"><code>max_replication_slots
max_wal_senders
max_logical_replication_workers
max_worker_processes
max_sync_workers_per_subscription
</code></pre><ol start="3"><li><p>Убедитесь, что сеть разрешает подключения с нового сервера.</p></li><li><p>Создайте пользователя для репликации:</p></li></ol><pre spellcheck="" class="tmiCode language-sql" data-language="SQL"><code>CREATE ROLE elizabeth WITH REPLICATION LOGIN PASSWORD 'my_password';
GRANT SELECT ON ALL TABLES IN SCHEMA public TO elizabeth;
</code></pre><ol start="5"><li><p>Определите таблицы без первичных ключей:</p></li></ol><pre spellcheck="" class="tmiCode language-sql" data-language="SQL"><code>select tab.table_schema, tab.table_name
from information_schema.tables tab
left join information_schema.table_constraints tco
  on tab.table_schema = tco.table_schema
  and tab.table_name = tco.table_name
  and tco.constraint_type = 'PRIMARY KEY'
where tab.table_type = 'BASE TABLE'
  and tab.table_schema not in ('pg_catalog', 'information_schema')
  and tco.constraint_name is null
order by table_schema, table_name;
</code></pre><ul><li><p>Для таких таблиц используйте уникальный индекс или REPLICA IDENTITY FULL:</p></li></ul><pre spellcheck="" class="tmiCode language-sql" data-language="SQL"><code>ALTER TABLE tablename REPLICA IDENTITY USING INDEX idx_unique_index;
-- или
ALTER TABLE tablename REPLICA IDENTITY FULL;
</code></pre><ol start="6"><li><p>Создайте публикацию всех таблиц:</p></li></ol><pre spellcheck="" class="tmiCode language-sql" data-language="SQL"><code>CREATE PUBLICATION bridge_migration FOR ALL TABLES;
SELECT * FROM pg_publication_tables;
</code></pre><h4>Шаг 3: Настройка подписчика (новый сервер)</h4><p>Создаём подписку на публикацию:</p><pre spellcheck="" class="tmiCode language-sql" data-language="SQL"><code>CREATE SUBSCRIPTION bridge_migration
CONNECTION 'host={host} port=5432 dbname={database} user={login} password={password}'
PUBLICATION bridge_migration;
</code></pre><ul><li><p>Для больших баз можно ограничить число одновременно синхронизируемых таблиц через <code>max_sync_workers_per_subscription</code>.</p></li></ul><h4>Шаг 4: Мониторинг первичной загрузки</h4><p>Проверяем прогресс через:</p><pre spellcheck="" class="tmiCode language-sql" data-language="SQL"><code>SELECT * FROM pg_stat_subscription;
SELECT * FROM pg_subscription_rel;
</code></pre><ul><li><p>Состояния таблиц:</p><ul><li><p><code>i</code> — инициализация</p></li><li><p><code>d</code> — копирование данных</p></li><li><p><code>f</code> — копирование завершено</p></li><li><p><code>s</code> — синхронизация выполнена</p></li><li><p><code>r</code> — обычная репликация</p></li></ul></li></ul><h4>Шаг 5: Тестирование и переключение</h4><ol><li><p>Остановите запись на исходной базе;</p></li><li><p>Проверьте данные на новом сервере;</p></li><li><p>Переключите приложение на новую базу.</p></li></ol><h4>Шаг 6: Синхронизация последовательностей</h4><p>Логическая репликация не переносит последовательности. Используйте команды <code>setval</code>:</p><pre spellcheck="" class="tmiCode language-sql" data-language="SQL"><code>SELECT
  'SELECT setval(' || quote_literal(quote_ident(n.nspname) || '.' || quote_ident(c.relname)) || ', ' || s.last_value || ');'
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
JOIN pg_sequences s ON s.schemaname = n.nspname AND s.sequencename = c.relname
WHERE c.relkind = 'S';
</code></pre><ul><li><p>Выполните результат на новом сервере, чтобы синхронизировать все последовательности.</p></li></ul><hr><h2>Заключение</h2><p>Логическая репликация — безопасный и эффективный способ миграции PostgreSQL, особенно при крупных базах и ограничениях по доступу к WAL.</p><ul><li><p>Данные остаются согласованными, если схема подписчика идентична схеме издателя;</p></li><li><p>Репликация однонаправленная, без конфликтующих записей на подписчике;</p></li><li><p>Можно минимизировать простой при переходе на новый сервер.</p></li></ul>]]></description><guid isPermaLink="false">24</guid><pubDate>Fri, 06 Feb 2026 18:39:53 +0000</pubDate></item><item><title>Make &#x438; New &#x432; Go: &#x440;&#x430;&#x437;&#x431;&#x43E;&#x440; &#x438; &#x43D;&#x430;&#x433;&#x43B;&#x44F;&#x434;&#x43D;&#x44B;&#x435; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x44B; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x44F;</title><link>https://ithub.uno/statiarticles/1_articles/make-%D0%B8-new-%D0%B2-go-%D1%80%D0%B0%D0%B7%D0%B1%D0%BE%D1%80-%D0%B8-%D0%BD%D0%B0%D0%B3%D0%BB%D1%8F%D0%B4%D0%BD%D1%8B%D0%B5-%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F-r27/</link><description><![CDATA[
<p><img src="https://ithub.uno/uploads/tmi_files_2026_02/https___dev-to-uploads_s3.amazonaws.com_uploads_articles_3wmodd43nx4l9h99z9dv.webp.57317d9205be99c709d7308b46ebbbab.webp" /></p>
<h2>Введение: что мы создаём в Go</h2><p>В Go есть два больших семейства типов:</p><ol><li><p><strong>Value types</strong> — обычные значения: <code>int</code>, <code>float64</code>, <code>bool</code>, <code>struct</code>, массивы.</p></li><li><p><strong>Reference types</strong> — ссылочные структуры: <code>slice</code>, <code>map</code>, <code>chan</code>.</p></li></ol><p>Value types можно размещать где угодно: в стеке, в куче или внутри других объектов.<br>Reference types — это конструкции уровня рантайма с внутренними механизмами: простое объявление через <code>var</code> даст <code>nil</code> и вызовет панику при попытке использовать. Именно поэтому Go использует <code>new</code> и <code>make</code> по-разному.</p><hr><h2><code>new</code> в Go: простое выделение памяти</h2><p>Функция <code>new(T)</code> выделяет память под тип <code>T</code>, обнуляет её и возвращает <strong>указатель на </strong><code>T</code>.</p><pre spellcheck="" class="tmiCode language-go" data-language="Go"><code>type Config struct {
    Enabled bool
    Count   int
}

cfg := new(Config)
// cfg имеет тип *Config
// cfg.Enabled == false
// cfg.Count == 0
</code></pre><ul><li><p>Внутри вызывается <code>runtime.newobject</code>, который делает <code>malloc</code> нужного размера и очищает память нулями.</p></li><li><p>Подходит для <strong>value types</strong>: int, string, bool, struct, array.</p></li></ul><hr><h3><code>new(T)</code> vs <code>&amp;T{}</code></h3><pre spellcheck="" class="tmiCode language-go" data-language="Go"><code>type User struct {
    Name string
    Age  int
}

u1 := new(User)   // выделяет объект в куче
u2 := &amp;User{}     // может быть в стеке или куче
</code></pre><p>Разница:</p><ul><li><p><code>new(T)</code> всегда аллоцирует в <strong>куче</strong>.</p></li><li><p><code>&amp;T{}</code> может остаться в <strong>стеке</strong>, если компилятор считает это безопасным (escape analysis).</p></li></ul><p>Используйте <code>&amp;T{}</code> для высокоэффективного кода с минимальными аллокациями.</p><hr><h3>Когда <code>new</code> действительно нужен</h3><ol><li><p><strong>Generic‑код</strong>: тип <code>T</code> неизвестен на этапе компиляции.</p></li></ol><pre spellcheck="" class="tmiCode language-go" data-language="Go"><code>func NewPointer[T any]() *T {
    return new(T)
}
</code></pre><ol start="2"><li><p><strong>Явная аллокация в куче</strong>: иногда нужно гарантировать объект в heap.</p></li></ol><pre spellcheck="" class="tmiCode language-go" data-language="Go"><code>pool := sync.Pool{
    New: func() any {
        return new(MyStruct)
    },
}
</code></pre><ol start="3"><li><p><strong>Опциональные значения через nil</strong>:</p></li></ol><pre spellcheck="" class="tmiCode language-go" data-language="Go"><code>type Options struct {
    RetryCount *int
}

o := Options{}
o.RetryCount = new(int)
*o.RetryCount = 3
</code></pre><hr><h3>Ограничения <code>new</code></h3><ul><li><p><code>new([]int)</code> вернёт <code>*[]int</code> с nil — использовать как полноценный slice нельзя:</p></li></ul><pre spellcheck="" class="tmiCode language-go" data-language="Go"><code>s := new([]int)
fmt.Println(*s == nil) // true
(*s)[0] = 1            // panic
</code></pre><ul><li><p>Аналогично с <code>map</code> и <code>chan</code>.</p></li></ul><hr><h2><code>make</code> в Go: инициализация runtime‑структур</h2><p><code>make</code> не просто выделяет память. Он <strong>создаёт рабочие slice, map и chan</strong> с полностью инициализированными внутренними структурами.</p><hr><h3>Slice: указатель, длина, вместимость</h3><pre spellcheck="" class="tmiCode language-go" data-language="Go"><code>s := make([]int, 10, 100)
</code></pre><ul><li><p>Создаёт slice header:</p></li></ul><pre spellcheck="" class="tmiCode language-go" data-language="Go"><code>type sliceHeader struct {
    Data uintptr // указатель на массив
    Len  int
    Cap  int
}
</code></pre><ul><li><p>Slice готов к использованию и может расширяться до <code>cap</code> без новых аллокаций.</p></li><li><p><code>var s []int</code> даст nil-слайс — любое обращение к элементу вызовет панику.</p></li></ul><hr><h3>Map: работа с бакетами</h3><pre spellcheck="" class="tmiCode language-go" data-language="Go"><code>m := make(map[string]int, 100)
</code></pre><ul><li><p>Инициализирует внутреннюю структуру hmap:</p><ul><li><p>count, flags, бакеты, старые бакеты для перестройки.</p></li></ul></li><li><p><code>new(map[string]int)</code> создаст только nil-указатель — использовать его нельзя.</p></li></ul><hr><h3>Chan: синхронизация и буфер</h3><pre spellcheck="" class="tmiCode language-go" data-language="Go"><code>c := make(chan int, 5)
</code></pre><ul><li><p>Создаёт полноценную очередь сообщений с буфером и счетчиками.</p></li><li><p><code>var c chan int</code> даст nil-канал — операции блокируют навсегда.</p></li></ul><hr><h2>Когда использовать <code>make</code>, а когда <code>new</code></h2><div class="tmiRichText__table-wrapper"><table style="min-width: 60px;"><colgroup><col style="min-width:20px;"><col style="min-width:20px;"><col style="min-width:20px;"></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>Сценарий</p></th><th colspan="1" rowspan="1"><p>Выбор</p></th><th colspan="1" rowspan="1"><p>Почему</p></th></tr><tr><td colspan="1" rowspan="1"><p>Slice, map, chan</p></td><td colspan="1" rowspan="1"><p><code>make</code></p></td><td colspan="1" rowspan="1"><p>Создаёт рабочую структуру, готовую к использованию</p></td></tr><tr><td colspan="1" rowspan="1"><p>Value type, generic</p></td><td colspan="1" rowspan="1"><p><code>new</code></p></td><td colspan="1" rowspan="1"><p>Получение указателя на zero-value</p></td></tr><tr><td colspan="1" rowspan="1"><p>Явная куча для value type</p></td><td colspan="1" rowspan="1"><p><code>new</code></p></td><td colspan="1" rowspan="1"><p>Гарантированное выделение в heap</p></td></tr><tr><td colspan="1" rowspan="1"><p>Опциональные значения</p></td><td colspan="1" rowspan="1"><p><code>new</code></p></td><td colspan="1" rowspan="1"><p>Возможность различать nil и заданное значение</p></td></tr></tbody></table></div><hr><h2>Вывод</h2><ul><li><p><code>new</code>: простое выделение памяти и указатель на ноль.</p></li><li><p><code>make</code>: инициализация runtime‑структур, готовых к работе.</p></li></ul><p>Понимание разницы между ними — обязательный минимум для любого разработчика на Go. Используйте <code>make</code> для slice, map и chan, а <code>new</code> — для value types и generic-кода.</p>]]></description><guid isPermaLink="false">27</guid><pubDate>Fri, 06 Feb 2026 18:44:31 +0000</pubDate></item></channel></rss>
