Перейти к содержанию
  • Категории
  • Последние
  • Метки
  • Популярные
  • Пользователи
  • Группы
Свернуть
Логотип бренда
Категории
  • Фронтенд

    HTML, CSS, JavaScript, React, Vue, Angular, Svelte, UI фреймворки! Адаптивная верстка, оптимизация, Webpack/Vite, SSR. Помощь новичкам, экспертные кейсы, тренды (PWA, JAMstack).

    Angular
    Vue
    React
    NextJs
    svelte

  • Бекенд, разработка серверов

    Cоветы по работе с Node.js, Express, Nest.js, Fastify, Rust, Go, Spring. RESTful и GraphQL API, реализации микросервисной архитектуры, оптимизации с помощью кэширования, очередей и асинхронной обработки. Вопросы безопасности, аутентификация, авторизация, CI/CD, контейнеризация с Docker, облачные технологии AWS, Azure, GCP.

    Fastify
    ExpressJs
    NestJs
    Node JS

  • CMS

    WordPress, Joomla, MODX, Headelss CMS, Payload CMS, NodeBB! Создание сайтов, темы, плагины, SEO-оптимизация, безопасность, интеграция с API. Решайте ошибки, делитесь лайфхаками, изучайте обновления. Помощь новичкам и экспертные кейсы.

    WordPress
    MODX
    NodeBB

  • Мобильная разработка

    iOS (Swift, Objective C), Android (Kotlin), Flutter, React Native! Создание UI/UX, тестирование, интеграция API, публикация в магазины. Решайте ошибки, делитесь лайфхаками, изучайте тренды (AR, IoT). Помощь новичкам и экспертные кейсы.

    IOS
    Android
    Flutter

  • Разработка игр | 3D | 2D

    2D/3D, движки (Unity, Unreal, Godot), геймдизайн, анимация! Создавайте проекты под PC, мобильные, консоли. Решайте ошибки, делитесь лайфхаками, изучайте тренды (VR, мультиплеер). Помощь новичкам и экспертные кейсы

    Unity
    Unreal Engine
    ThreeJs
    BabylonJs

  • Языки программирования

    Синтаксис, библиотеки, фреймворки, алгоритмы, ООП, функциональное, асинхронное, многопоточное программирование. Помощь новичкам, советы экспертов, тренды и кейсы. Решайте задачи, делитесь кодом.

    Shell
    Dart
    TypeScript
    JavaScript
    Rust
    Swift
    PHP
    Ruby
    SQL
    Lua
    C#
    C++
    Java
    GoLang
    Python
    Общее

  • DevOps

    обсуждение CI/CD, автоматизации, облаков (AWS, Azure), Docker, Kubernetes, мониторинга и IaC. Обмен опытом, решение задач, лучшие практики. Советы по инструментам (Ansible, Terraform), кейсы, оптимизация workflows

    nginx
    CI/CD
    Kubernetes
    Docker

  • Базы данных

    обсуждение SQL, NoSQL (MySQL, PostgreSQL, MongoDB), Redis, проектирования БД, оптимизации запросов, администрирования. Решение проблем, бэкапы, репликация, безопасность данных. Советы по настройке, кейсы, обмен опытом.

    MySQL | MariaDB
    Redis
    PostgreSQL
    MongoDB

  • Операционные системы

    Операционные системы, кроссплатформенные программы, системы. Unix, Linux, Windows, MacOS и т д.

    Windows
    maсOS
    Linux
    Программы

  • Девайсы

  • Новости

    Актуальные IT-новости: обзоры технологий, релизы ПО, события индустрии (искусственный интеллект, кибербезопасность, стартапы). Аналитика рынка, тренды, кейсы компаний. Экспертные мнения, прогнозы, дискуссии о будущем IT. Следите за обновлениями Apple, Google, Microsoft и других гигантов.


  • Юмор, Мемы

    IT-приколы, мемы про разработчиков, программистские баги и гифки. Обсуждаем смешные кейсы, шутки про искусственный интеллект, криптовалюты, GitHub и Reddit. Делитесь своими мемами, находите единомышленников, отдыхайте с пользой


Авторизуйтесь, чтобы написать сообщение

  • Все категории
  • kirilljsK
    kirilljs
    При каком режиме мышка садится быстрее при 2.4 или BT ?

    Кто знает вообще за такое?

    Я купил себе мышку Razer Basilisk v3 hyperspeed, только вот эта скотина жрет аж по 2 батарейки дюрасел в месяц!!! 😰

    019ad5a6-bde4-416d-a7fb-009b9d898c2b-image.png


    2 0 0 Ответить
  • kirilljsK
    kirilljs
    Промпт на воронку продаж

    Промт для чатагпт, чтобы создать крутой конвертер. Прям копируем и вставляйте в него сообщения ниже по порядку. 👇🏻

    1

    В каждом бизнесе есть воронка продаж, по которой идут клиенты в сторону сделок и покупок. В каждом бизнесе на этом пути воронки продаж есть этап, который предопределяет сделку. Я называю его «конвертер». То есть, чем больше потенциальных клиентов окажутся на конвертере, тем выше шанс, что они купят наш продукт. 
    
    Примеры таких конвертеров: аудит, замер, диагностика, примерка, пробный период, пробная партия, индивидуальный рассчет, живая или онлайн встреча, вебинар и так далее.
    
    Понял, о чем я говорю?
    

    2

    Также, помимо того, чтобы правильно определить конвертер, надо еще его наполнить ценностью, чтобы клиент охотно соглашался на него прийти. Чтобы было глупо не «посетить» конвертер.
    
    Например, не просто пробный урок на гитаре, а:
    - бесплатный пробный урок на гитаре
    - научим за 1 час играть с нуля 1 песню из 10 самых популярных
    - здание школы в центре города в шаговой доступности от метро
    - на уроке проведем тестирование, каковы ваши шансы стать супер-звездой в шоу-бизнесе
    - проведет тест, на какого мирового легендарного гитариста по стилю вы более всех похожи
    - подарим виниловую пластинку с вашим любимым исполнителем
    
    Понял о чем я?
    

    3

    Я бы хотел тебе называть разные ниши теперь, а ты предлагал лучший конвертер для нее и 5-10 идей, как можно этот конвертер усилить оффером на него, чтобы было очень круто, ценно для клиента и продающе
    
    идет?
    

    4

    // А тут уже пишем необходимую нишу
    

    0 0 0 Ответить
  • kirilljsK
    kirilljs
    Как сделать кнопку в HTML

    Создание кнопки в HTML — базовый навык для интерактивных элементов на сайте. Вот несколько способов, как это сделать:


    1. Базовый синтаксис: тег <button>

    <button>Нажми меня</button>
    
    • Простой и универсальный способ.
    • Поддерживает вложенные элементы (например, текст, иконки, изображения).

    Пример:

    <button>Отправить форму</button>
    

    2. Кнопка-ссылка

    Если нужно сделать кнопку, которая ведет на другую страницу:

    <a href="https://example.com" class="button">Перейти на сайт</a>
    
    • Стилизуется через CSS (класс button).
    • Подходит для навигации.

    3. Кнопка в форме

    Для отправки формы используется тип submit:

    <button type="submit">Отправить</button>
    

    Типы кнопок:

    • submit — отправка формы.
    • reset — сброс данных формы.
    • button — обычная кнопка (событие через JavaScript).

    4. Атрибуты кнопки

    • disabled — отключает кнопку:
      <button disabled>Заблокировано</button>
      
    • name и value — для передачи данных в форме:
      <button name="action" value="save">Сохранить</button>
      

    5. Стилизация кнопки через CSS

    Пример базовой стилизации:

    <style>
      .my-button {
        background-color: #4CAF50; /* Зеленый фон */
        border: none;              /* Без рамки */
        color: white;              /* Белый текст */
        padding: 10px 20px;        /* Отступы */
        text-align: center;        /* Выравнивание */
        font-size: 16px;           /* Размер шрифта */
        cursor: pointer;           /* Курсор */
        border-radius: 5px;        /* Закругленные углы */
      }
    </style>
    
    <button class="my-button">Кнопка</button>
    

    6. Анимация и эффекты

    Добавьте ховер-эффект:

    .my-button:hover {
      background-color: #45a049; /* Темно-зеленый при наведении */
    }
    

    Или тень:

    .my-button {
      box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
    }
    

    7. Кнопка с иконкой

    Вложите изображение или иконку внутрь:

    <button class="icon-button">
      <img src="icon.png" alt="Иконка"> Кнопка
    </button>
    

    Или используйте шрифтовые иконки (например, Font Awesome):

    <button class="icon-button">
      <i class="fas fa-save"></i> Сохранить
    </button>
    

    8. Обработка нажатия через JavaScript

    Добавьте событие клика:

    <button onclick="showMessage()">Нажми меня</button>
    
    <script>
      function showMessage() {
        alert('Кнопка нажата!');
      }
    </script>
    

    9. Адаптивная кнопка

    Сделайте кнопку адаптивной:

    .my-button {
      width: 100%;       /* На всю ширину контейнера */
      max-width: 300px;  /* Максимальная ширина */
    }
    

    10. Полезные советы

    • Доступность: Добавляйте атрибуты aria-label для экранного доступа:
      <button aria-label="Закрыть">✖</button>
      
    • Центрирование: Используйте Flexbox:
      <div style="display: flex; justify-content: center;">
        <button>Центральная кнопка</button>
      </div>
      
    • Оптимизация: Не используйте слишком большие изображения внутри кнопок.
    • Мобильные устройства: Убедитесь, что кнопка удобна для тапов (минимум 44x44 пикселя).

    Пример готового кода

    <!DOCTYPE html>
    <html>
    <head>
      <title>Кнопка</title>
      <style>
        .styled-button {
          background-color: #008CBA;
          color: white;
          padding: 12px 24px;
          border: none;
          border-radius: 4px;
          font-size: 16px;
          cursor: pointer;
        }
        .styled-button:hover {
          background-color: #005f73;
        }
      </style>
    </head>
    <body>
      <button class="styled-button" onclick="alert('Ура!')">Кликни меня</button>
    </body>
    </html>
    

    Теперь вы умеете создавать и стилизовать кнопки! 🎯


    Link Preview Image
    Kirilljs

    Обо всем и не о чем сразу 👨🏻‍💻

    favicon

    Telegram (t.me)


    2 0 0 Ответить
  • kirilljsK
    kirilljs
    Как вставить картинку в HTML

    Чтобы добавить изображение на веб-страницу, используется тег <img>. Вот основные шаги:


    1. Базовый синтаксис

    <img src="путь/к/файлу.jpg" alt="Описание изображения">
    
    • src — путь к изображению (обязательный атрибут).
    • alt — текст, отображаемый, если изображение не загрузилось (важно для SEO и доступности).

    2. Форматы изображений

    Поддерживаемые форматы:

    • JPEG — для фотографий.
    • PNG — для изображений с прозрачностью.
    • GIF — для анимации.
    • SVG — векторные изображения (масштабируются без потерь качества).
    • WebP — современный формат с отличным сжатием.

    Пример:

    <img src="logo.png" alt="Логотип компании">
    

    3. Пути к файлам

    • Относительный путь (файл в папке сайта):
      <img src="images/photo.jpg" alt="Фотография">
      
    • Абсолютный путь (файл на другом сайте):
      <img src="https://example.com/photo.jpg" alt="Внешнее изображение">
      

    4. Размеры изображения

    Можно задать ширину и высоту:

    <img src="photo.jpg" width="300" height="200" alt="Картинка">
    

    ⚠️ Совет: Лучше использовать CSS для управления размерами:

    <img src="photo.jpg" style="width: 300px; height: auto;" alt="Картинка">
    

    5. Дополнительные атрибуты

    • title — всплывающая подсказка при наведении:
      <img src="photo.jpg" alt="Картинка" title="Наведите сюда">
      
    • loading="lazy" — отложенная загрузка (для ускорения страницы):
      <img src="big-image.jpg" alt="Большая картинка" loading="lazy">
      

    6. Пример готового кода

    <!DOCTYPE html>
    <html>
    <head>
      <title>Пример</title>
    </head>
    <body>
      <h1>Моя страница</h1>
      <img src="images/sunset.jpg" alt="Закат над морем" width="600" height="400">
    </body>
    </html>
    

    7. Полезные советы

    • Храните изображения в отдельной папке (например, images/).
    • Используйте описательные имена файлов (например, dog-running.jpg вместо img123.jpg).
    • Оптимизируйте изображения перед загрузкой (сжатие через инструменты вроде TinyPNG или Squoosh).

    Теперь вы знаете, как вставить картинку в HTML! 🎨


    0 0 0 Ответить
  • kirilljsK
    kirilljs
    Национальный мессенджер России: как будет работать интеграция с госуслугами и какие функции получит платформа

    bc1f117b-e35a-4515-b42f-59bc2a84fb7e-image.png

    Что такое новый российский мессенджер и зачем он создан?

    31 мая 2025 года Госдума РФ единогласно приняла законопроект о разработке национального мессенджера, который объединит коммуникационные функции и доступ к государственным услугам. Цель проекта — создать безопасную цифровую среду для общения и взаимодействия с госорганами. В новом приложении будут доступны чат-боты, мини-приложения от российских компаний, а также возможность подтверждения личности через цифровой ID. В статье разберем ключевые особенности платформы, её преимущества и этапы реализации.


    Основные характеристики нового мессенджера

    Интеграция с государственными сервисами

    Главная цель проекта — создание единой цифровой экосистемы, где пользователи смогут:

    • Подавать документы в госорганы и получать ответы.
    • Использовать цифровой ID вместо бумажных удостоверений (например, для подтверждения возраста при покупке алкоголя или заселения в отель).
    • Получать льготы, предъявлять водительские права или студенческие билеты.
    • Подписывать официальные бумаги через «Госключ».

    Технические решения

    • Хранение данных: вся информация будет размещаться на серверах в России в обезличенном виде.
    • Многофункциональность: платформа станет аналогом WeChat, объединив переписку, звонки, финансовые операции и бизнес-сервисы (например, онлайн-покупки или заказ еды).
    • Совместимость: мессенджер интегрируется с уже существующими российскими платформами, такими как «Госуслуги» и Max от VK.

    Почему Telegram и WhatsApp не стали основой для проекта?

    По словам Минцифры РФ, использование иностранных мессенджеров ограничено из-за:

    • Рисков утечки данных за пределы России.
    • Отсутствия возможности глубокой интеграции с госсистемами.
    • Сложностей с контролем контента и соблюдением российского законодательства.

    Вместо этого выбрали российскую платформу Max (развитие которой ведет VK). Её преимущество — готовая инфраструктура для добавления новых функций, включая мини-приложения и чаты с госорганами.


    Как будет работать цифровой ID в мессенджере?

    Цифровой идентификатор станет центральным элементом платформы. С его помощью можно будет:

    1. Подтверждать личность в онлайн-магазинах, банках и государственных учреждениях.
    2. Получать доступ к льготам и социальным выплатам.
    3. Подписывать договоры и отправлять документы в электронном виде.

    Это снизит бюрократические барьеры и ускорит выполнение повседневных задач, таких как оформление кредита или регистрация ИП.


    Этапы реализации проекта

    Этап Описание
    Разработка Создание базовой версии мессенджера на основе Max.
    Тестирование Пилотный запуск среди госслужащих и сотрудников бюджетных организаций.
    Интеграция сервисов Подключение госучреждений, банков и частных компаний.
    Массовый запуск Общий доступ для всех желающих.

    После завершения всех этапов мессенджер попадет в реестр отечественного ПО, что сделает его доступным для обязательного использования в госсекторе.


    Преимущества для пользователей и бизнеса

    Для граждан:

    • Удобство: единая платформа для общения, госуслуг и финансовых операций.
    • Безопасность: данные остаются в России, риск мошенничества снижается.
    • Экономия времени: отсутствие необходимости носить бумажные документы.

    Для бизнеса:

    • Новые каналы продаж: интеграция мини-приложений для заказа товаров и услуг.
    • Снижение издержек: автоматизация взаимодействия с клиентами через чат-боты.
    • Соответствие требованиям: возможность использования в госзакупках и тендерах.

    Создание национального мессенджера — шаг к цифровой независимости России. Платформа объединит коммуникации, финансы и госуслуги, сделав жизнь граждан и работу бизнеса проще и безопаснее. При этом иностранные мессенджеры останутся доступными, но новый сервис предложит уникальные возможности для тех, кто предпочитает использовать отечественные решения. Следующий этап — согласование законопроекта Советом Федерации и подписание президентом РФ.


    5 0 2 Ответить
  • kirilljsK
    kirilljs
    Как вычислить размер шрифта для блока div с заданным размером?

    Столкнулся с задачей: нужно, чтобы текст внутри div автоматически подстраивался под заданные ширину и высоту блока. Пробовал вручную подбирать font-size, но это неудобно для динамического контента. Поделитесь, как решить это программно?


    Возможное решение: бинарный поиск по размеру шрифта

    Идея: подбираем font-size так, чтобы текст полностью помещался в блоке. Используем бинарный поиск и DOM-измерения:

    function fitTextToDiv(div, text) {
      const temp = document.createElement('div');
      temp.style.position = 'absolute';
      temp.style.visibility = 'hidden';
      temp.style.whiteSpace = 'pre-wrap'; // Учитываем переносы
      temp.style.padding = getComputedStyle(div).padding; // Копируем стили
      document.body.appendChild(temp);
    
      let minSize = 1;
      let maxSize = 100;
      let bestSize = 1;
    
      while (minSize <= maxSize) {
        const midSize = Math.floor((minSize + maxSize) / 2);
        temp.style.fontSize = `${midSize}px`;
        temp.textContent = text;
    
        const fitsWidth = temp.offsetWidth <= div.offsetWidth;
        const fitsHeight = temp.offsetHeight <= div.offsetHeight;
    
        if (fitsWidth && fitsHeight) {
          bestSize = midSize;
          minSize = midSize + 1; // Пробуем больший размер
        } else {
          maxSize = midSize - 1; // Уменьшаем размер
        }
      }
    
      div.style.fontSize = `${bestSize}px`;
      div.textContent = text;
      document.body.removeChild(temp);
    }
    
    // Пример использования:
    const myDiv = document.getElementById('myDiv');
    fitTextToDiv(myDiv, 'Текст, который должен поместиться!');
    

    Важные моменты:

    1. Стили копируются: Убедитесь, что временный элемент использует те же font-family, padding, border, и white-space, что и целевой div.
    2. Производительность: Бинарный поиск эффективен (обычно 5-7 итераций), но избегайте частых вызовов.
    3. Ограничения: Для длинных текстов или блоков с фиксированной высотой может потребоваться компромисс между размером шрифта и количеством строк.

    Альтернативы:

    • Canvas API: Метод measureText позволяет оценить ширину текста, но не учитывает высоту и переносы.
    • CSS-решения: text-overflow: ellipsis или transform: scale() для простых случаев, но это не меняет font-size.

    0 0 1 Ответить
  • JspiJ
    Jspi
    Запуск Typescript в Node js без сборки и сложных конфигов

    Рассмотрим простые способы запуска TypeScript в Node.js без сложных сборок. Во всех примерах используется современный синтаксис ES-модулей.

    Бывает нужно просто написать какие-то простые скрипты или проекты, а заморачиваться со сборкой нет желания и особого смысла, но хочется использовать все возможности typescript с подсказками, типами, которые не надо держать в голове, с проверками этих типов уже в IDE.

    Стартует, для сначала инициализируем проект

    npm init -y
    npm install typescript @types/node --save-dev
    

    Конфигурация typescript

    создаем файл tsconfig.json

    # или сручную
    touch tsconfig.ts
    
    # или через команду tsc 
    # но для этого нужно глобально установить Typescript
    npm install -g typescript
    #  далее команда
    tsc --init
    

    вот минимальный конфиг файл, с описанием необходимых параметров

    {
      "compilerOptions": {
        // Современный JS без обратной совместимости
        "target": "ES2022",
        
        // Нативные ES-модули Node.js
        "module": "NodeNext",
        
        // Алгоритм разрешения модулей как в Node.js
        "moduleResolution": "NodeNext",
        
        // Совместимость между CommonJS и ES-модулями
        "esModuleInterop": true,
        
        // разрешить импорт ts файлов ( для ts-node и для нативного запуска node --experimental-strip-types)
        "allowImportingTsExtensions": true,
    
        // Максимальная строгость проверки типов
        "strict": true,
        
        // Важно: запрещаем генерацию JS-файлов!
        "noEmit": true
      },
      
      // Включаем все TS-файлы в проекте
      "include": ["**/*.ts"],
      
      // Исключаем зависимости
      "exclude": ["node_modules"]
    }
    

    Обратите внимание на следующие параметры

    • noEmit - мы не будем ничего компилировать, собирать, запускаем
    • allowImportingTsExtensions - важный параметр для запуска ts нативным способом (от этом позже) и для ts-node

    Исходный код

    Теперь напишем максимальной простой код, который просто прочитает наш package.json и покажет поле "Package name"

    index.ts:

    import { readFile } from "node:fs/promises";
    
    export async function readConfig() {
      const data = await readFile("package.json", "utf8");
      console.log("Package name:", JSON.parse(data).name);
    }
    
    

    index.ts:

    import { readConfig } from "./lib.ts";
    
    readConfig();
    
    

    Запуск через ts-node

    устанавливаем локально

    npm install ts-node --save-dev
    

    package.json

    {
      "name": "test",
      "version": "1.0.0",
      "scripts": {
        "start": "ts-node index.ts"
      },
      "keywords": [],
      "author": "",
      "license": "ISC",
      "description": "",
      "devDependencies": {
        "@types/node": "^24.0.0",
        "ts-node": "^10.9.2",
        "typescript": "^5.8.3"
      }
    }
    
    

    запуск

    ts-node index.ts
    
    # или через npm
    npm run start 
    

    Замечания

    • "type": "commonjs" или должен отсутствовать в package.json

    • импорт файлов только с расширением .ts import * from "./lib.ts"

    • поэтому обязательна и настройка "allowImportingTsExtensions": true

    • типы проверяется!

    • скорость запуска самая неспешная из всех вариантов

    Запуск через tsx

    устанавливаем локально

    npm install tsx --save-dev
    

    package.json

    {
      "name": "test",
      "version": "1.0.0",
      "scripts": {
        "start": "tsx index.ts"
      },
      "keywords": [],
      "author": "",
      "license": "ISC",
      "description": "",
      "devDependencies": {
        "@types/node": "^24.0.0",
        "tsx": "^4.19.4",
        "typescript": "^5.8.3"
      }
    }
    
    

    запуск

    tsx index.ts
    
    # или через npm
    npm run start 
    

    Замечания

    • импорт файлов с расширением .ts/.js

    • типы проверяется!

    • скорость запуска быстрее чем ts-node, но медленнее, чем node --experimental-strip-types

    Запуск нативно, через node --experimental-strip-types

    обязательно нужна версия Node.js 20.6+

    package.json

    {
      "name": "test",
      "version": "1.0.0",
      "scripts": {
        "start": "node --experimental-strip-types index.ts"
      },
      "keywords": [],
      "type": "module",
      "author": "",
      "license": "ISC",
      "description": "",
      "devDependencies": {
        "@types/node": "^24.0.0",
        "typescript": "^5.8.3"
      }
    }
    
    

    запуск

    tsx index.ts
    
    # или через npm
    npm run start 
    

    Замечания

    • "type": "module" в package.json

    • импорт файлов только с расширением .ts import * from "./lib.ts"

    • поэтому обязательна и настройка "allowImportingTsExtensions": true

    • типы НЕ проверяется!

    • самая быстрая скорость запуска

    Итого

    Метод Проверка типов Скорость Требования
    ts-node ✅ ⚠️ Средняя npm i ts-node
    tsx ✅ ⚡ Быстрая npm i tsx
    node --experimental-strip-types ❌ ⚡⚡ Очень быстрая Node.js 20.6+

    Начиная с версии Node.js 24 флаг –experimental-strip-types будет использован по умолчанию


    2 0 2 Ответить
  • kirilljsK
    kirilljs
    Как сделать css в html

    А я продолжаю рубрику для новичков! И на этот раз мы поговорим о том как сделать css в html

    И так у нас есть с вами два основным способа, начнем с первого и самого примитивного.

    Создадим файл index.html, и наполним его первоначальным:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Документ</title>
    </head>
    <body>
        <h1>Привет мир!</h1>
    </body>
    </html>
    

    Готово, вот наш html, а теперь идем дальше! Для того что бы добавить css мы можем:

    1. Прописать тег прямо внутри самого файла index.html:
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Документ</title>
    </head>
    <!-- пишем пишем css тут-->
    <style>
        h1 {
          color: red;
        }
    </style>
    <!-- пишем пишем css тут-->
    <body>
        <h1>Привет мир!</h1>
    </body>
    </html>
    

    Воуля, тестируем и открывам наш файл index.html в браузере и видим следующее:

    Снимок экрана 2025-06-10 в 07.43.48.png

    1. Способ второй будет куда интереснее и естественно правильнее, так как это разделит код на необходимые файлы, создадим с вами в той же папке где расположен index.html файл - style.css

    Вот как показано на скриншоте:
    Снимок экрана 2025-06-10 в 07.45.42.png

    Далее в самом файле index.html нам необходимо указать что мы берем стилизацию из другого файла - style.css прописываем ссылку на файл внутри теги <head>, а старый код css переносим в наш новый файл:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
    
        <!-- Прописываем ссылку на наш файл style.css -->
        <link href="./style.css" rel="stylesheet">
        <!-- Прописываем ссылку на наш файл style.css -->
    
        <title>Документ</title>
    </head>
    <!-- Убрали наш код css-->
    <body>
        <h1>Привет мир!</h1>
    </body>
    </html>
    

    В самом файле style.css не нужно использовать какие либо теги, мы просто вставляем код как он есть:

    h1 {
          color: red;
        }
    

    Воуля! Теперь вы знаете как использовать css в html!

    Хотите больше примеров для новичков по html? Тогда регистрируйтесь на нашем форуме и оставляйте комментарии к посту, я с удовольствием вам помогу и подскажу 😊


    И не забывайте подписывать на мой ТГ канал:

    Link Preview Image
    Kirilljs

    Обо всем и не о чем сразу 👨🏻‍💻

    favicon

    Telegram (t.me)


    0 0 0 Ответить
  • kirilljsK
    kirilljs
    Как добавить ссылку на сайт в html

    Недавно мне написал знакомый, который только только начал осваивать HTML, CSS, JS.
    И задал такой вопрос - как добавить ссылку на сайт в html?

    Если вдруг кто не знал, хотя как по мне это кажется очень странным то ссылка делается очень просто:

    <a href="https://vk.com">ссылка</a>
    

    Мы берем тег a прописываем ему параметр href=""в кавычки вставляем ссылку и воуля - у нас готова ссылка в html!

    —-

    Link Preview Image
    Kirilljs

    Обо всем и не о чем сразу 👨🏻‍💻

    favicon

    Telegram (t.me)


    0 0 0 Ответить
  • kirilljsK
    kirilljs
    Как узнать свой ID в Telegram и зачем он нужен?

    Telegram ID — это уникальный номер, который идентифицирует ваш аккаунт. Он пригодится для:

    • Интеграции с ботами (например, для авторизации или транзакций).
    • Управления группами/каналами (назначение администраторов, модераторов).
    • API-запросов (создание кастомных решений на базе Telegram).
    • Переводов денег через ботов (например, @send или @CryptoBot).

    🔍 Как найти свой ID?

    1. Через бота @getmidbot (ваш бот):

      • Напишите ему /start или кликните сюда.
      • Бот мгновенно покажет ваш ID.
    2. Через настройки Telegram:

      • Перейдите в Настройки → Общие → Имя пользователя.
      • Если у вас нет имени пользователя, ID можно узнать только через ботов.

    💡 Почему стоит использовать @getmidbot?

    • Быстро и без лишних шагов.

    👉 Попробуйте @getmidbot — узнайте свой ID за 10 секунд!

    ❓ А зачем вам это?
    Если вы используете Telegram для бизнеса, ботов или администрирования, ID — ваш ключ к автоматизации. Поделитесь этим постом с теми, кто ещё не знает, как его найти!


    Такой пост объясняет пользу ID, предлагает удобное решение через ваш бота и стимулирует вовлечение. Можете адаптировать стиль под вашу аудиторию! 🚀

    Link Preview Image
    Мой телеграм ID | My telegram ID

    You can contact @getmidbot right away.

    favicon

    Telegram (t.me)


    0 0 0 Ответить
  • JspiJ
    Jspi
    Type vs Interface в TypeScript — выбор и различия

    TypeScript предоставляет два мощных механизма для определения типов: type и interface. Оба позволяют создавать типы, которые описывают структуры объектов, функций и других данных. Однако между ними существуют тонкие различия, которые могут повлиять на выбор инструмента в зависимости от задачи. Давайте разберемся, чем они отличаются и когда что использовать.

    Что такое type и interface?

    type (тип)

    Ключевое слово type создает алиас (псевдоним) для существующего типа или определяет новый тип через комбинацию других типов. Например:

    type Name = string;
    type Coordinates = { x: number; y: number };
    

    interface (интерфейс)

    Интерфейс описывает форму объекта, включая его свойства и методы. Интерфейсы могут быть расширены или реализованы классами:

    interface User {
      name: string;
      age: number;
    }
    

    Ключевые различия между type и interface

    Расширение типов

    • interface : Поддерживает множественное наследование через extends.
    
    interface Animal {
      name: string;
    }
    
    interface Dog extends Animal {
      breed: string;
    }
    
    • type : Использует оператор & (пересечение типов) для комбинации.
    type Animal = {
      name: string;
    };
    
    type Dog = Animal & {
      breed: string;
    };
    

    Union и Intersection Types

    • type : Позволяет создавать объединения (|) и пересечения (&) типов.
    type ID = string | number; // Union type
    type ButtonProps = BaseProps & { color: string }; // Intersection type
    
    • interface : Не поддерживает объединения напрямую. Может расширять несколько интерфейсов, но не примитивы или другие типы.

    Declaration Merging (Объединение объявлений)

    • interface : Поддерживает декларативное объединение . Если несколько интерфейсов с одинаковым именем, TypeScript автоматически объединит их:
    interface User {
      name: string;
    }
    
    interface User {
      age: number;
    }
    
    const user: User = { name: "Alice", age: 30 }; // Работает!
    
    • type : Не позволяет повторно объявлять одно и то же имя:
    type User = { name: string };
    type User = { age: number }; // ❌ Ошибка: Имя "User" уже объявлено.
    

    Использование с примитивами

    • type : Может создавать псевдонимы для примитивов:
    type Score = number;
    
    • interface : Не может заменять примитивы.

    Реализация в классах

    • interface : Может быть реализован классом через implements:
    class Person implements User {
      name: string;
    }
    
    • type : Обычные типы-объекты также поддерживают implements, но union-типы — нет:
    type User = { name: string };
    class Person implements User { /* Работает */ }
    
    type ID = string | number;
    class Entity implements ID { /* ❌ Ошибка */ }
    

    Когда что использовать?

    Используйте interface, если:

    • Вам нужна поддержка декларативного объединения (например, для расширения библиотечных типов).
    • Вы работаете с классами , реализующими интерфейс.
    • Требуется наследование нескольких интерфейсов.

    Используйте type, если:

    • Нужны union-типы (|) или intersection-типы (&).
    • Вы создаете псевдоним для примитива, сложного типа или функции:
    type Callback = (error: Error | null, data: string) => void;
    
    • Вы предпочитаете иммутабельность типов (избегаете случайного изменения через повторные объявления).

    Примеры из практики

    Union Types (только type)

    
    type Theme = "light" | "dark";
    function setTheme(theme: Theme) { /* ... */ }
    

    Расширение интерфейсов

    interface FormProps {
      onSubmit: () => void;
    }
    
    interface LoginFormProps extends FormProps {
      username: string;
    }
    

    Декларативное объединение

    interface Window {
      myPlugin: PluginAPI;
    }
    // В другом файле:
    interface Window {
      myPlugin: PluginAPI; // Расширение существующего интерфейса
    }
    

    Заключение

    Выбор между type и interface часто зависит от контекста и предпочтений команды. Вот краткий чек-лист:

    • Для объектных структур и наследования — interface.
    • Для union/intersection типов , псевдонимов и функциональных типов — type.

    Оба подхода дополняют друг друга, и их совместное использование позволяет писать гибкий и типобезопасный код. Главное — соблюдать консистентность в проекте и документировать принятые стандарты.

    Дополнительные ресурсы:

    • Официальная документация TypeScript: Types vs Interfaces
    • Advanced Types in TypeScript

    0 0 1 Ответить
  • JspiJ
    Jspi
    Выпуск mongodb 8

    1e0fda2e-71d1-4ff7-a99b-45a2cc4068d4-image.png

    MongoDB 8.0 — мажорный релиз, сосредоточенный на производительности, безопасности и управляемости. Выпущен в Q1 2025 года, он предлагает ключевые улучшения для разработчиков и администраторов. Рассмотрим основные изменения.

    Ключевые Нововведения

    Ускорение запросов на 40%

    • Новый движок оптимизации запросов Query Optimizer 3.0.

    • Поддержка векторных операций для аналитики (использует SIMD-инструкции CPU).

    • Пример: Агрегации $group работают в 1.5–2 раза быстрее.

    Улучшенное Шардирование

    • Авто-балансировка без downtime (фоновое перераспределение данных).

    • Time-Series Sharding — автоматическое шардирование для коллекций временных рядов.

    Безопасность

    • Encrypted Queryable Backups — шифрованные бэкапы с возможностью поиска.

    • RBAC для Change Streams — гибкие права доступа к потокам изменений.

    • Аудит операций в реальном времени через $audit pipeline.

    Новые Операторы

    • $median — медиана в агрегациях.

    • $dateTrunc — обрезка дат до часов/дней/месяцев.

    • $geoLine — построение линий из гео-точек (для трекинга).

    Управление Ресурсами

    • Collection-Level QoS — ограничение IOPS/CPU для отдельных коллекций.

    • Фоновое сжатие данных для снижения места на диске до 30%.

    Тесты Производительности: 8.0 vs 7.0

    Результаты тестирования на инфраструктуре: 32 vCPU, 128 GB RAM, NVMe SSD.

    Массовая вставка данных (YCSB Benchmark)

    Тест: Вставка 100 млн документов (средний размер 1.2 КБ).

    Результат:

    • MongoDB 8.0: ~1.1 млн ops/sec

    • MongoDB 7.0: ~900 тыс. ops/sec

    Итог: Ускорение на 22% благодаря оптимизации аллокации памяти и записи журналов (journaling).

    Агрегация данных ($group)

    Тест: Группировка 50 млн записей по полю category с вычислением суммы ($sum).

    Результат:

    • MongoDB 8.0: 8.2 сек

    • MongoDB 7.0: 14.7 сек

    Итог: Ускорение в 1.8× за счет векторных операций в Query Optimizer 3.0.

    Запросы к Time-Series коллекциям

    Тест: Поиск по временному диапазону (1 год данных, 10K сенсоров).

    Результат:

    • MongoDB 8.0: 120 мс (с авто-шардированием)

    • MongoDB 7.0: 350 мс (ручное шардирование)

    Итог: Ускорение в 3× благодаря оптимизации работы с сегментами данных.

    Сжатие хранилища

    Тест: Хранение 1 ТБ логов приложений.

    Результат:

    • MongoDB 8.0: ~420 ГБ (новый алгоритм сжатия + фоновое дедуплицирование)

    • MongoDB 7.0: ~600 ГБ

    Итог: Экономия 30% дискового пространства.

    Как Обновиться

    Для Standalone-сервера:

    # Остановить MongoDB
    sudo systemctl stop mongod
    
    # Обновить пакеты (для Ubuntu)
    sudo apt-get update
    sudo apt-get install mongodb-org=8.0.0 mongodb-org-database=8.0.0
    
    # Запустить 
    sudo systemctl start mongod
    

    Для Replica Set:

    По очереди обновить вторичные ноды.

    Переключить primary (rs.stepDown()).

    Обновить бывший primary.

    Версия featureCompatibilityVersion должна быть 8.0.

    Для Sharded Cluster:

    Обновить mongos, затем config servers, потом шарды.

    Шарды обновлять как Replica Set.


    1 0 1 Ответить
  • kirilljsK
    kirilljs
    Маршрут API для генерации presigned URL

    Маршрут API для генерации presigned URL для загрузки в S3 в Next.js

    // S3 Presign Upload
    export async function POST(req: Request) {
      const { type } = await req.json();
    
      const key = `${nanoid()}.${type.split('/')[1]}`;
    
      const { url, fields } = await new Promise((res, rej) => {
        s3.createPresignedPost(
          {
            Bucket: 'your-bucket-name',
            Fields: { key },
            Expires: 60,
            Conditions: [
              ['content-length-range', 0, 5 * 1024 * 1024],
              ['starts-with', '$Content-Type', 'image/'],
            ],
          },
          (err, data) => err ? rej(err) : res(data)
        );
      });
    
      return Response.json({ url, fields, key });
    }
    

    Используется вместе с кастомным upload-хуком, чтобы безопасно загружать файлы напрямую в S3 с клиента.

    Он проверяет тип файла, генерирует уникальный ключ и возвращает presigned URL + поля, необходимые для загрузки.


    0 0 0 Ответить
  • kirilljsK
    kirilljs
    Next.js: Как встроить клиентскую логику?

    Next.js сочетает преимущества серверного и клиентского рендеринга, но для реализации интерактивных фич (анимации, обработка событий, локальное состояние) требуется правильно интегрировать клиентскую логику.

    Щас расскажу и покажу как это сделать легко и просто если вы не умеете читать документацию 🤕 😀


    🧩 Клиентские компоненты в Next.js

    Начиная с Next.js 13, фреймворк поддерживает разделение на серверные (Server Components) и клиентские (Client Components).

    Для активации клиентской логики в файле компонента добавьте директиву:

    'use client';
    
    import { useState, useEffect } from 'react';
    
    export default function Counter() {
      const [count, setCount] = useState(0);
    
      useEffect(() => {
        document.title = `Счетчик: ${count}`;
      }, [count]);
    
      return (
        <button onClick={() => setCount(prev => prev + 1)}>
          Кликнуто {count} раз
        </button>
      );
    }
    

    ⚠️ Без 'use client' компонент будет обрабатываться на сервере, и клиентская логика работать не будет.


    🔗 Взаимодействие с серверными компонентами

    Серверные компоненты могут использовать клиентские как дочерние элементы:

    // app/page.tsx (Server Component)
    import Counter from './Counter';
    
    export default function Home() {
      return (
        <main>
          <h1>Добро пожаловать!</h1>
          <Counter /> {/* Клиентский компонент */}
        </main>
      );
    }
    

    В 14 версии клиентские не могли использовать серверные как дочерние, но 15 версия все перевернула с ног на ногу, но об этом потом 😊


    🧰 Клиентские функции и API

    Работа с DOM
    Используйте useRef для доступа к элементам:

    const inputRef = useRef<HTMLInputElement>(null);
    

    Локальное состояние
    useState, useReducer, useEffect работают как в обычном React-приложении.

    Браузерные API
    Доступны только в useEffect или обработчиках событий:

    useEffect(() => {
      window.addEventListener('resize', handleResize);
      return () => window.removeEventListener('resize', handleResize);
    }, []);
    

    Хотя вы наверное и так это знаете, но на всякий случай добавлю! Вдруг нас читают новички!!!


    ⚠️ Распространенные ошибки

    ❌ Использование window/document на сервере

    // НЕПРАВИЛЬНО
    if (typeof window !== 'undefined') { /* Проверка обязательна! */ }
    
    // Правильно
    useEffect(() => {
      console.log(window.innerWidth); // Только в useEffect или обработчиках
    }, []);
    

    ❌ Неинициализированные состояния
    Избегайте несоответствия между серверным и клиентским рендерингом:

    const [mounted, setMounted] = useState(false);
    useEffect(() => setMounted(true), []);
    return mounted ? <Component /> : <Skeleton />;
    

    🚀 Оптимизация загрузки

    Ленивая загрузка клиентских модулей

    import dynamic from 'next/dynamic';
    const HeavyComponent = dynamic(() => import('./HeavyComponent'), {
      ssr: false, // Отключить серверный рендеринг
      loading: () => <p>Загрузка...</p>,
    });
    

    Разделение кода
    Используйте splitChunks в next.config.js для оптимизации бандла.


    📚 Полезные ссылки

    • Официальная документация: Client Components
    • Data Fetching в Next.js
    • React Server Components vs Client Components

    💬 Вопросики имеются?
    Оставляйте комментарии ниже!


    2 0 0 Ответить
  • JspiJ
    Jspi
    Оптимизация PostgreSQL: Полное руководство для разработчиков и администраторов

    7c00b9bb-4ee5-432d-8b69-8421da94bf6a-image.png

    PostgreSQL — один из самых мощных и гибких реляционных СУБД с открытым исходным кодом. Однако без должной оптимизации даже самая продуманная система может столкнуться с проблемами производительности. В этом руководстве мы рассмотрим ключевые аспекты оптимизации PostgreSQL, от базовых принципов до продвинутых техник.

    Мониторинг и анализ производительности

    Основные инструменты

    -- Активные запросы
    SELECT pid, usename, application_name, query, state 
    FROM pg_stat_activity 
    WHERE state = 'active';
    
    -- Долгие запросы (> 5 секунд)
    SELECT now() - query_start AS duration, query, state 
    FROM pg_stat_activity 
    WHERE state = 'active' AND now() - query_start > '5 seconds'::interval;
    

    pg_stat_statements
    Включение модуля для анализа запросов:

    ALTER SYSTEM SET shared_preload_libraries = 'pg_stat_statements';
    CREATE EXTENSION pg_stat_statements;
    
    -- Топ-5 самых ресурсоемких запросов
    SELECT query, calls, total_time, rows, 
           100.0 * shared_blks_hit / nullif(shared_blks_hit + shared_blks_read, 0) AS hit_percent
    FROM pg_stat_statements 
    ORDER BY total_time DESC 
    LIMIT 5;
    

    EXPLAIN и EXPLAIN ANALYZE
    Разбор плана выполнения запроса:

    EXPLAIN ANALYZE
    SELECT * FROM orders 
    WHERE customer_id = 123 
    AND order_date > '2023-01-01';
    

    Эффективное использование индексов

    Типы индексов и их применение

    Тип индекса Описание Идеальные сценарии
    B-tree Стандартный индекс Равенство, диапазоны, сортировка
    GiST Generalized Search Tree Геоданные, полнотекстовый поиск
    GIN Generalized Inverted Index Составные типы, полнотекстовый поиск
    BRIN Block Range Index Очень большие таблицы, временные ряды
    Hash Хэш-индекс Только операции равенства
    SP-GiST Space-partitioned GiST Неравномерные структуры данных

    Оптимизация индексов

    Покрывающие индексы (INCLUDE):

    CREATE INDEX orders_customer_date_idx ON orders (customer_id) INCLUDE (order_date, total_amount);
    

    Частичные индексы:

    CREATE INDEX active_users_idx ON users (email) WHERE is_active = true;
    

    Анализ использования индексов:

    SELECT schemaname, relname, indexrelname, idx_scan,
           100 * idx_scan / (seq_scan + idx_scan) AS idx_usage_percent
    FROM pg_stat_user_tables 
    WHERE seq_scan + idx_scan > 0;
    

    Оптимизация запросов

    Распространенные антипаттерны

    1. N+1 запросов:

      • Проблема: Множество отдельных запросов вместо одного

      • Решение: Использовать JOIN и агрегацию

    2. Избыточные данные:

    -- Неоптимально
    SELECT * FROM customers;
    
    -- Оптимально
    SELECT id, name, email FROM customers;
    
    1. Неэффективные JOIN:

      • Всегда фильтруйте данные перед соединением таблиц

    Оптимизация сложных запросов

    CTE vs подзапросы:

    -- Часто неоптимально (материализация)
    WITH recent_orders AS (
        SELECT * FROM orders WHERE order_date > now() - interval '30 days'
    )
    SELECT * FROM recent_orders JOIN customers USING (customer_id);
    
    -- Оптимальная альтернатива
    SELECT * 
    FROM orders o
    JOIN customers c USING (customer_id)
    WHERE o.order_date > now() - interval '30 days';
    

    Оконные функции вместо кореллированных подзапросов:

    -- Неоптимально
    SELECT name, 
           (SELECT COUNT(*) FROM orders WHERE customer_id = c.id) AS order_count
    FROM customers c;
    
    -- Оптимально
    SELECT name, COUNT(o.id) OVER (PARTITION BY customer_id) AS order_count
    FROM customers c
    LEFT JOIN orders o ON o.customer_id = c.id;
    

    Конфигурация сервера

    Ключевые параметры памяти

    # postgresql.conf
    
    # 25-40% от общей памяти
    shared_buffers = 8GB
    
    # Для операций сортировки и соединения
    work_mem = 32MB
    
    # Для операций обслуживания (VACUUM, CREATE INDEX)
    maintenance_work_mem = 2GB
    
    # Размер кэша ОС для данных
    effective_cache_size = 24GB
    

    Правильная настройка параметров памяти критически важна для производительности PostgreSQL. Рассмотрим ключевые параметры с формулами расчета и практическими рекомендациями.

    shared_buffers (общий буферный кэш)

    Назначение: Основной кэш для данных и индексов

    Рекомендации:

    # Формула для систем с > 4GB RAM:
    shared_buffers = min(25% RAM, 8GB) для OLTP
    shared_buffers = min(40% RAM, 32GB) для OLAP
    
    # Примеры:
    RAM 16GB → 4GB (16 * 0.25)
    RAM 64GB → 8GB (предел для OLTP)
    RAM 256GB → 32GB (для OLAP)
    

    Особенности:

    • Не должен превышать 40% RAM
    • Для Windows: не более 512MB-1GB из-за архитектурных ограничений
    • После изменения требуется перезагрузка сервера

    work_mem (память для операций)

    Назначение: Память для сортировки, хешей, оконных функций
    Рекомендации:

    # Формула:
    work_mem = (RAM - shared_buffers) / (max_connections * параллельные операции)
    
    # Безопасный расчет:
    work_mem = (RAM - shared_buffers) / (max_connections * 3)
    
    # Пример для 16GB RAM, 100 подключений:
    (16384MB - 4096MB) / (100 * 3) = 12288 / 300 ≈ 40MB
    

    Важно:

    • Значение задается на операцию, а не на соединение
    • Один запрос может использовать несколько раз work_mem
    • Типичный диапазон: 4MB-64MB
    • Слишком высокое значение → риск OOM (out of memory)

    maintenance_work_mem (память для обслуживания)

    Назначение: Операции VACUUM, CREATE INDEX, ALTER TABLE
    Рекомендации:

    # Формула:
    maintenance_work_mem = min(10% RAM, 1GB) для баз < 50GB
    maintenance_work_mem = min(5% RAM, 10GB) для крупных БД
    
    # Примеры:
    RAM 16GB → 1GB
    RAM 128GB → 10GB (макс. эффективное значение)
    

    Особенности:

    • Можно временно увеличивать для операций перестроения индексов
    • Не влияет на обычные запросы

    effective_cache_size (оценочный параметр)

    Назначение: Оценка доступного кэша ОС для планировщика
    Рекомендации:

    # Формула:
    effective_cache_size = (RAM - shared_buffers) + файловый кэш ОС
    
    # Практическое правило:
    effective_cache_size = 50-75% от общего RAM
    
    # Пример:
    RAM 64GB → 40GB
    

    Важно: Это информационный параметр, не выделяет реальную память!

    temp_buffers (временные буферы)

    Назначение: Буферы для временных таблиц
    Рекомендации:

    # По умолчанию 8MB обычно достаточно
    # Для ETL-процессов:
    temp_buffers = 16-256MB
    

    huge_pages (большие страницы памяти)

    Назначение: Уменьшение накладных расходов
    Рекомендации:

    huge_pages = try   # или on для включенных систем
    

    Требования:

    • Необходима настройка в Linux: vm.nr_hugepages
    • Расчет страниц: nr_hugepages = ceil(shared_buffers / 2MB)

    wal_buffers (буфер WAL)

    Назначение: Кэш для записей журнала
    Рекомендации:

    # Автовычисление обычно достаточно
    # Ручная настройка:
    wal_buffers = max(shared_buffers * 0.03, 16MB)
    
    # Пример для shared_buffers=4GB:
    4096MB * 0.03 ≈ 123MB → 128MB
    

    Формулы расчета для разных размеров БД

    Для сервера 8GB RAM (небольшая БД)

    shared_buffers = 2GB
    work_mem = 8MB
    maintenance_work_mem = 512MB
    effective_cache_size = 6GB
    wal_buffers = 16MB
    

    Для сервера 64GB RAM (производственная БД)

    shared_buffers = 16GB
    work_mem = 32MB
    maintenance_work_mem = 8GB
    effective_cache_size = 40GB
    wal_buffers = 128MB
    temp_buffers = 64MB
    

    Для сервера 256GB RAM (аналитическая БД)

    shared_buffers = 32GB
    work_mem = 128MB
    maintenance_work_mem = 32GB
    effective_cache_size = 180GB
    wal_buffers = 256MB
    temp_buffers = 256MB
    

    Практические советы по настройке

    Постепенная оптимизация:

    # Шаг 1: Настройте shared_buffers
    # Шаг 2: Оптимизируйте work_mem на основе EXPLAIN ANALYZE
    # Шаг 3: Настройте maintenance_work_mem под размер индексов
    

    Мониторинг использования:

    -- Потребление work_mem
    SELECT query, work_mem, max_work_mem 
    FROM pg_stat_activity 
    WHERE state = 'active';
    
    -- Эффективность кэша
    SELECT sum(blks_hit) * 100 / (sum(blks_hit) + sum(blks_read)) AS hit_ratio
    FROM pg_stat_database;
    

    Динамическая корректировка:

    -- Временное увеличение для тяжелой операции
    SET LOCAL work_mem = '256MB';
    CREATE INDEX CONCURRENTLY ...;
    

    Автоматизация расчета:
    Используйте инструменты:

    • PGTune
    • PoWA для сбора статистики
    • pg_qualstats для анализа предикатов

    Распространенные ошибки

    1. Слишком высокий work_mem:
    -- При 100 подключениях:
    work_mem = 256MB → потенциальное использование 25.6GB
    -- Риск: OOM killer завершит процессы PostgreSQL
    
    1. Недостаточный maintenance_work_mem:

      • VACUUM и CREATE INDEX будут работать медленно
      • Увеличивает время обслуживания БД
    2. Игнорирование effective_cache_size:

      • Планировщик будет недооценивать стоимость сканирования по индексу
      • Результат: выбор полного сканирования таблицы вместо индекса

    Параметры планировщика

    # Стоимость чтения последовательного блока
    seq_page_cost = 1.0
    
    # Стоимость чтения случайного блока (для SSD уменьшить)
    random_page_cost = 1.1
    
    # Параллельное выполнение
    max_parallel_workers_per_gather = 4
    min_parallel_table_scan_size = 8MB
    

    Настройки автовакуума

    autovacuum_vacuum_scale_factor = 0.05
    autovacuum_analyze_scale_factor = 0.02
    autovacuum_vacuum_cost_limit = 2000
    autovacuum_naptime = 1min
    

    Расширенные техники оптимизации

    Табличное партиционирование

    -- Создание партиционированной таблицы
    CREATE TABLE orders (
        id SERIAL,
        order_date DATE NOT NULL,
        customer_id INT NOT NULL,
        amount NUMERIC(10,2)
    ) PARTITION BY RANGE (order_date);
    
    -- Создание партиций
    CREATE TABLE orders_2023_q1 PARTITION OF orders
        FOR VALUES FROM ('2023-01-01') TO ('2023-04-01');
    
    CREATE TABLE orders_2023_q2 PARTITION OF orders
        FOR VALUES FROM ('2023-04-01') TO ('2023-07-01');
    

    Репликация и шардирование

    Архитектура высокой доступности:

    Основной сервер (Primary)
            |
            v
    Синхронная реплика (Sync Standby)
            |
            v
    Асинхронные реплики (Async Standby) -> Читающие реплики
    

    Шардирование с помощью Citus:

    -- Создание распределенной таблицы
    SELECT create_distributed_table('orders', 'customer_id');
    
    -- Выполнение запроса на всех шардах
    SELECT * FROM orders WHERE customer_id = 12345;
    

    Использование расширений

    -- Кэширование сложных запросов
    CREATE EXTENSION pg_pooler;
    
    -- Сжатие данных
    CREATE EXTENSION pg_compression;
    
    -- Ускорение JOIN
    CREATE EXTENSION pg_ivm;
    

    Техники обслуживания БД

    Стратегии вакуума

    ALTER TABLE orders SET (
        autovacuum_vacuum_scale_factor = 0.01,
        autovacuum_vacuum_cost_delay = 5
    );
    
    -- Ручной вакуум для больших таблиц
    VACUUM (VERBOSE, ANALYZE) large_table;
    

    Перестройка индексов

    -- Одновременная перестройка без блокировки
    REINDEX INDEX CONCURRENTLY orders_customer_idx;
    
    -- Перестройка всех индексов таблицы
    REINDEX TABLE orders;
    

    Мониторинг состояния БД

    -- Проверка "раздувания" таблиц
    SELECT schemaname, relname, 
           n_dead_tup, 
           pg_size_pretty(pg_relation_size(relid)) AS size
    FROM pg_stat_user_tables
    WHERE n_dead_tup > 1000
    ORDER BY n_dead_tup DESC;
    

    Заключение

    Оптимизация PostgreSQL — комплексный процесс, требующий глубокого понимания как самой СУБД, так и особенностей вашего приложения. Ключевые принципы:

    1. Измеряйте перед оптимизацией: Используйте мониторинг для выявления реальных проблем

    2. Индексы ≠ панацея: Правильные индексы важны, но их избыток вредит производительности

    3. Конфигурация контекстна: Нет универсальных настроек — тестируйте под свою нагрузку

    4. Проектируйте с учетом масштабирования: Используйте партиционирование и шардирование заранее

    5. Автоматизируйте обслуживание: Настройте автовакуум и регулярные проверки

    Оптимизация PostgreSQL — это постоянный процесс, а не разовое мероприятие. Регулярный мониторинг, анализ производительности и постепенная настройка позволят поддерживать вашу базу данных в оптимальном состоянии даже при росте нагрузки и объема данных.


    0 0 1 Ответить
  • JspiJ
    Jspi
    Производительность Javascript от истоков до наших дней

    fca9692e-919b-4aa2-a91b-6ca8c31ab5ae.webp

    История и эволюция JavaScript как универсального языка программирования

    JavaScript, созданный в 1995 году Бренданом Айком в компании Netscape, изначально позиционировался как инструмент для добавления интерактивности на веб-страницы. Первая версия языка была разработана всего за десять дней с целью обеспечить простые функциональные возможности, такие как проверка форм и анимация элементов пользовательского интерфейса. В тот момент мало кто мог предположить, что этот язык станет ключевым элементом веб-разработки и превратится в одну из самых популярных технологий программирования в мире.

    Эволюция JavaScript началась с его интеграции в браузеры, где он использовался для выполнения базовых задач. Однако по мере развития веб-технологий перед JavaScript стали возникать более сложные требования. Это привело к стандартизации языка через ECMAScript, первую версию которого выпустили в 1997 году. С этого момента JavaScript начал своё преобразование из простого инструмента для создания интерактивных элементов в мощный язык программирования, поддерживающий клиентскую и серверную разработку.

    Одним из ключевых событий в истории развития JavaScript стало появление Node.js в 2009 году. Этот фреймворк позволил использовать JavaScript для написания серверного кода, открыв новые горизонты для разработчиков. Node.js стал основой для создания высокопроизводительных серверных приложений, микросервисов и безсерверных архитектур. К 2025 году Node.js остается одной из самых популярных платформ для серверной разработки, хотя альтернативы, такие как Deno и Bun, предлагают дополнительные преимущества, включая поддержку TypeScript из коробки и улучшенную производительность за счет движков JavaScriptCore

    Другим важным этапом в развитии языка стал выпуск ES6 (ECMAScript 2015), который представил множество инновационных функций, таких как стрелочные функции, классы, модули и шаблонные строки. Эти изменения значительно упростили написание чистого и удобного для поддержки кода, сделав JavaScript более привлекательным для разработчиков. С тех пор ежегодные обновления ECMAScript продолжают внедрять новые возможности, направленные на повышение производительности и удобства разработки. К 2025 году ожидается дальнейшее развитие языка благодаря предложениям сообщества и работе комитета TC39, отвечающего за стандартизацию

    Популярность JavaScript продолжает расти, и к 2025 году он используется в 97% веб-сайтов, что делает его доминирующим языком программирования среди веб-разработчиков. Эта стабильность объясняется универсальностью языка, который применяется как в клиентской, так и в серверной разработке, а также развитием экосистемы библиотек и фреймворков, таких как React, Angular и Vue. Кроме того, интеграция искусственного интеллекта в JavaScript активно развивается благодаря таким библиотекам, как TensorFlow.js и Brain.js, что позволяет запускать машинное обучение прямо в браузере

    Производительность JavaScript также значительно улучшилась благодаря современным движкам, таким как V8 (используемый в Google Chrome), SpiderMonkey (Mozilla Firefox) и JavaScriptCore (Safari). Эти движки внедрили технологии Just-In-Time (JIT) компиляции и продвинутые стратегии сборки мусора, что сделало выполнение JavaScript быстрее и эффективнее. Особенно заметны эти оптимизации в мобильных браузерах, где Progressive Web Apps (PWAs) используют преимущества повышенной производительности для создания приложений, сопоставимых с нативными

    Важно отметить, что стандартизация через ECMAScript играет ключевую роль в дальнейшем развитии языка. Процесс утверждения новых возможностей включает пять этапов — от идеи (Stage 0) до финального утверждения (Stage 4). Такой подход гарантирует, что каждое нововведение тщательно протестировано и готово к использованию в реальных проектах. Например, добавление стрелочных функций в ES6 прошло аналогичный процесс. Эта система помогает поддерживать баланс между инновациями и стабильностью, что особенно важно для языка, используемого в миллионах проектов по всему миру

    Таким образом, история создания и развития JavaScript демонстрирует его переход от простого инструмента для добавления интерактивности на веб-страницы к универсальному языку программирования, поддерживающему как клиентскую, так и серверную разработку. Ключевые события, такие как появление Node.js и выход ES6, а также постоянные обновления ECMAScript, сделали JavaScript неотъемлемой частью современной разработки. Благодаря своей гибкости, производительности и активному сообществу, JavaScript продолжает оставаться лидером среди языков программирования.

    Эволюция спецификаций ECMAScript: от ES6 до современных стандартов

    В 2015 году выход шестой версии ECMAScript (ES6) ознаменовал собой революционный этап в развитии JavaScript, представив множество ключевых возможностей, таких как стрелочные функции, классы, модули и промисы
    . Эти изменения значительно улучшили производительность разработки и удобство написания кода. Например, синтаксис стрелочных функций const add = (a, b) => a + b; позволил исключить необходимость привязки контекста (this), что сделало работу с асинхронным кодом и коллбэками более компактной и предсказуемой. Классы, представленные в ES6, предоставили формализованный подход к объектно-ориентированному программированию, что облегчило создание сложных приложений. Модули же дали возможность организовывать код в независимые блоки, что повысило читаемость и масштабируемость проектов. Промисы, внедренные в ES6, сделали управление асинхронными операциями более структурированным, открыв новые горизонты для серверной разработки на Node.js и использования в современных фреймворках, таких как React

    После ES6 последующие обновления ECMAScript продолжили совершенствовать язык, делая его еще более мощным и удобным для разработчиков. Например, в ECMAScript 2020 (ES11) был представлен оператор Optional Chaining (?.), который позволяет безопасно получать значения из вложенных объектов без необходимости проверки каждого уровня на null или undefined. Это особенно полезно при работе с данными, поступающими из внешних источников, таких как API, где часто встречаются неопределенные или частично заполненные структуры данных. Еще одно важное дополнение — Nullish Coalescing Operator (??) — помогает корректно обрабатывать значения null и undefined, что делает код более надежным и читаемым. Введение Async/Await в ECMAScript 2017 (ES8) стало ключевым шагом в управлении асинхронными операциями, позволяя писать асинхронный код в синхронном стиле. Такие обновления, как метод Object.groupBy в ECMAScript 2024 (ES15), направлены на повышение эффективности работы с большими объемами данных, что особенно важно для современных веб-приложений, активно использующих аналитику и машинное обучение.

    Процесс внедрения новых возможностей в ECMAScript осуществляется через комитет TC39, который обеспечивает постепенное развитие языка через пять этапов: от идеи (Stage 0) до финального утверждения (Stage 4)
    . Этот подход гарантирует, что каждое нововведение тщательно протестировано и готово к использованию в реальных проектах. Например, Temporal API, находящийся на стадии предложения, направлен на решение проблем работы с временными данными, предоставляя более точные и гибкие инструменты для манипуляции датами и временем. Другой пример — Float16Array, новый тип TypedArray, добавленный в ECMAScript 2025, который предназначен для работы с half-precision числами с плавающей запятой. Это нововведение особенно важно для графических приложений и задач машинного обучения, где оптимизация вычислений играет ключевую роль

    Однако история развития ECMAScript не обошлась без трудностей. Попытка создания четвертой версии языка (ES4) потерпела неудачу из-за политических разногласий между крупными игроками индустрии, такими как Mozilla, Microsoft и Google. Многие из предложенных функций, такие как классы, модули и генераторы, были позже реализованы в ES6. Этот опыт показывает, как конфликты могут влиять на развитие технологий, но также демонстрирует, что полезные идеи рано или поздно находят свое применение

    Среди перспективных предложений, которые могут существенно изменить будущее JavaScript, стоит отметить Pattern Matching, Records и Tuples, а также Async Context Propagation Pattern Matching позволит обрабатывать сложные условия с использованием структур данных, аналогично switch, но с большей гибкостью. Records и Tuples обеспечат глубокую иммутабельность, что особенно важно для управления состоянием в современных фреймворках, таких как React и Redux. Async Context Propagation решит одну из ключевых проблем текущей реализации async/await, позволяя сохранять контекст между асинхронными операциями. Эти инновации, наряду с поддержкой JSON Modules и Pipeline Operator, подчеркивают стремление ECMAScript адаптироваться к современным потребностям разработчиков и предоставлять им более мощные инструменты для создания высокопроизводительных приложений.

    Роль движков JavaScript в оптимизации производительности

    Движки JavaScript, такие как V8, SpiderMonkey и JavaScriptCore, играют ключевую роль в обеспечении высокой производительности современных веб-приложений. Эти движки используют сложные технологии, включая Just-In-Time (JIT) компиляцию и продвинутые стратегии сборки мусора, чтобы сделать выполнение кода быстрее и эффективнее. JIT-компиляция позволяет преобразовывать исходный код JavaScript в машинный код непосредственно во время выполнения программы. Этот подход устраняет необходимость в предварительной компиляции и значительно ускоряет выполнение скриптов. Например, движок V8, используемый в браузере Google Chrome, применяет две основные стадии JIT-компиляции: Ignition и TurboFan. Ignition выполняет базовую интерпретацию кода, а TurboFan проводит более глубокие оптимизации для часто используемых участков кода.

    Сборка мусора является еще одной важной технологией, применяемой движками JavaScript для управления памятью. Эффективная работа с памятью имеет решающее значение для предотвращения утечек и минимизации задержек при выполнении кода. Современные реализации сборщиков мусора, такие как Orinoco в движке V8, используют параллельные и инкрементальные подходы, чтобы уменьшить влияние процесса очистки на общую производительность приложения. Это особенно важно для мобильных браузеров, где ресурсы устройства ограничены.

    Одним из примеров успешной оптимизации движков JavaScript является их адаптация к новым стандартам ECMAScript. Например, внедрение поддержки JSON-модулей позволило разработчикам импортировать данные напрямую из JSON-файлов без необходимости дополнительной обработки. Это не только упростило синтаксис, но и повысило производительность за счет уменьшения количества операций, необходимых для загрузки данных. Другим значимым шагом стало добавление поддержки WebAssembly (Wasm), которая позволяет запускать высокопроизводительные приложения прямо в браузере. Это особенно полезно для задач, требующих значительной вычислительной мощности, таких как игры или научные расчеты.

    Однако внедрение новых стандартов ECMAScript также создает определенные проблемы для движков JavaScript. Выход стандарта ECMAScript 2025 стал причиной масштабных изменений в экосистеме JavaScript, что потребовало от разработчиков движков пересмотра архитектурных решений и оптимизаций. Например, переход на новые функциональные возможности языка, такие как улучшенная обработка строк или новые типы данных, вызвал временные проблемы с совместимостью и производительностью. Особенно это заметно для мобильных устройств с ограниченными ресурсами, где даже незначительные изменения могут привести к серьезным последствиям. Для решения этих проблем рекомендуется использовать такие техники, как ленивая загрузка и минификация, которые помогают снизить нагрузку на устройства.

    Несмотря на эти вызовы, постоянное развитие движков JavaScript способствует сохранению актуальности языка в условиях быстрого технологического прогресса. Например, движок V8 активно адаптирует новейшие возможности ECMAScript, что делает выполнение кода быстрее и эффективнее. Более того, интеграция с WebAssembly создает мощную экосистему для разработки сложных веб-приложений, таких как игры или научные вычисления. Таким образом, движки JavaScript продолжают играть центральную роль в эволюции языка, обеспечивая его конкурентоспособность и универсальность.

    Производительность JavaScript в контексте мобильных приложений: текущее состояние и перспективы
    В последние годы производительность JavaScript в мобильных приложениях значительно улучшилась благодаря внедрению современных оптимизаций движков JavaScript, таких как V8, SpiderMonkey и JavaScriptCore. Эти движки используют передовые технологии, такие как Just-In-Time (JIT) компиляция и усовершенствованные стратегии сборки мусора, которые особенно важны для мобильных браузеров
    . К 2025 году эти оптимизации позволили Progressive Web Apps (PWAs), построенным на базе JavaScript, достичь уровня производительности, сопоставимого с нативными приложениями
    . Это сделало PWAs привлекательным выбором для компаний, стремящихся снизить затраты на разработку и поддерживать кросс-платформенную совместимость. Однако существуют ограничения, особенно на платформах iOS, где доступ к аппаратным функциям остается ограниченным.

    Преимущества PWAs перед нативными приложениями наиболее заметны в их способности работать офлайн и экономить ресурсы устройства. Сервис-воркеры, являющиеся ключевым компонентом PWAs, позволяют кэшировать контент и выполнять фоновые задачи даже без стабильного интернет-соединения. Это особенно важно для регионов с нестабильным подключением к сети. Например, такие компании, как Facebook и Twitter, уже успешно внедрили PWAs для повышения производительности своих платформ на мобильных устройствах. Тем не менее, несмотря на успех этих примеров, PWAs сталкиваются с ограничениями на iOS, где возможности, такие как push-уведомления, фоновая синхронизация и доступ к API устройства, либо частично поддерживаются, либо полностью отсутствуют. Это создает сложности для разработчиков, которым требуется глубокая интеграция с аппаратным обеспечением.

    Сравнение производительности JavaScript в WebView с нативными технологиями выявляет значительные различия в доступе к устройству и управлении ресурсами. Нативные приложения, написанные на таких языках, как Swift для iOS или Kotlin для Android, обладают более плавной анимацией и быстрым временем загрузки за счет использования платформенных оптимизаций. Они также обеспечивают лучший доступ к аппаратным возможностям, таким как камера, GPS и датчики, что делает их предпочтительным выбором для игр и приложений с высокой степенью интеграции с устройством. Например, приложения дополненной реальности (AR) или IoT часто требуют нативной разработки для обеспечения надежной работы сложных систем.

    Однако для проектов, ориентированных на широкую аудиторию и ограниченный бюджет, PWAs остаются предпочтительным вариантом. Их кросс-платформенная совместимость позволяет разрабатывать одно приложение для множества устройств, таких как iOS, Android и десктопы, с использованием HTML, CSS и JavaScript. Кроме того, автоматические обновления PWAs через браузер гарантируют пользователям использование последней версии приложения без необходимости ручного обновления. Этот фактор становится все более значимым, поскольку скорость адаптации к изменениям рынка становится ключевым конкурентным преимуществом.

    Таким образом, JavaScript продолжает играть важную роль в разработке мобильных приложений, особенно в контексте PWAs. Хотя существуют ограничения, связанные с платформенными ограничениями, такие как недостаточный доступ к API устройства на iOS, преимущества PWAs, включая офлайн-функциональность и экономию ресурсов, делают их привлекательным выбором для многих компаний. В то же время, для приложений, требующих высокой производительности и глубокой интеграции с аппаратным обеспечением, нативная разработка остается наилучшим решением. Для дальнейшего исследования рекомендуется изучить потенциал комбинирования JavaScript с WebAssembly для создания высокопроизводительных модулей, что может стать стандартом для требовательных веб-приложений к 2025 году.

    Node.js как основа серверной производительности

    Node.js произвел революцию в серверной разработке, внедрив асинхронную модель ввода-вывода (I/O), которая кардинально изменила подход к обработке запросов на стороне сервера. В основе этой модели лежит событийно-ориентированная архитектура, которая позволяет Node.js одновременно обрабатывать множество подключений без блокировок, что является ключевым преимуществом для высоконагруженных приложений. Благодаря использованию неблокирующего I/O и цикла событий (event loop), Node.js стал особенно эффективным решением для задач, связанных с интенсивным взаимодействием между клиентом и сервером, таких как чаты, игровые серверы и финансовые платформы. Это делает Node.js идеальным выбором для современных систем реального времени, где важна мгновенная реакция. Одним из ярких примеров успешного применения Node.js является Netflix, крупнейший стриминговый сервис, который использует эту технологию для обеспечения бесперебойной работы своей платформы при обработке огромных объемов данных от миллионов пользователей по всему миру. Также стоит отметить использование Node.js в чат-приложениях, где технология WebSockets позволяет создавать долгоживущие соединения, критически важные для мгновенного обмена данными в режиме реального времени.

    Современные методы оптимизации кода для Node.js помогают значительно улучшить его производительность даже в сложных сценариях. Например, для тяжелых вычислительных операций, таких как генерация PDF-файлов или выполнение криптографических расчетов, рекомендуется использовать Worker Threads — механизм, позволяющий перенести нагрузку на дополнительные потоки, не блокируя основной цикл событий
    . Это особенно актуально для масштабируемых систем, где требуется балансировать между I/O-операциями и CPU-интенсивными задачами. Кроме того, минификация зависимостей, компрессия ответов через Gzip или Brotli, а также использование Content Delivery Networks (CDN) для статических ресурсов остаются ключевыми практиками для повышения скорости загрузки страниц и снижения задержек.

    Сравнение Node.js с другими языками программирования, такими как Kotlin, подчеркивает его преимущество в использовании памяти. Исследования показывают, что Node.js потребляет значительно меньше оперативной памяти: всего около 80 МБ RAM против 430 МБ у эквивалентного Ktor-based Kotlin API при одинаковой пропускной способности. Это делает Node.js предпочтительным выбором для облачных сред и виртуальных серверов, где экономия ресурсов играет ключевую роль для высоконагруженных проектов. Однако стоит отметить, что Node.js не всегда является лучшим решением для задач, требующих больших вычислительных мощностей, таких как обработка документов или изображений. В таких случаях могут быть более подходящими альтернативы, такие как Java или Python. Тем не менее, для I/O-интенсивных операций Node.js остается лидером благодаря своей архитектуре.

    Значимость Node.js в современных архитектурах микросервисов и безсерверных решений невозможно переоценить. Эта технология активно используется в микросервисных архитектурах, где ее легковесность и способность быстро обрабатывать запросы позволяют создавать масштабируемые системы с минимальными затратами ресурсов. Безсерверные платформы, такие как AWS Lambda и Google Cloud Functions, также поддерживают Node.js как одну из основных сред выполнения, что делает его ключевым игроком в области облачных вычислений. Таким образом, Node.js продолжает оставаться важным инструментом для разработчиков, стремящихся создавать высокопроизводительные и масштабируемые серверные решения.

    Оптимизация и высоконагруженные проекты на JavaScript: современные подходы и примеры реализации
    В современной веб-разработке JavaScript играет ключевую роль как основной язык программирования для создания динамических и интерактивных приложений. Однако с ростом сложности проектов производительность JavaScript становится критически важной, особенно в условиях высоких нагрузок. В этом контексте оптимизации кода и архитектуры приобретают особое значение. Рассмотрим наиболее эффективные методы оптимизации, а также примеры успешного применения JavaScript в высоконагруженных проектах.

    Одним из базовых методов повышения производительности является минификация и компрессия кода. Минификация удаляет ненужные символы, такие как пробелы и комментарии, без изменения функциональности программы. Инструменты, такие как UglifyJS и Google Closure Compiler, позволяют не только сжимать код, но и переписывать его для достижения лучшей производительности. Дополнительно компрессия через Gzip или Brotli уменьшает размер передаваемых данных, что особенно важно для пользователей с медленным интернетом. Правильная настройка CDN или сервера для использования этих технологий может существенно сократить время загрузки страницы. Ленивая загрузка (Lazy Loading) также является мощным инструментом, позволяющим откладывать загрузку несущественных ресурсов до момента их появления в области видимости пользователя. Это достигается с помощью HTML-атрибута loading='lazy' или Intersection Observer API.

    Для обработки больших объемов данных JavaScript демонстрирует свою эффективность в таких проектах, как онлайн-игры и системы уведомлений. Например, Node.js, благодаря своей асинхронной и неблокирующей архитектуре, успешно используется для создания чат-приложений и игровых серверов. Технология WebSockets позволяет организовать долгоживущие соединения между клиентом и сервером, что идеально подходит для приложений реального времени. Эти решения обеспечивают мгновенное взаимодействие с пользователями, даже при высокой нагрузке.

    Масштабирование JavaScript-приложений часто требует применения асинхронного программирования и использования Web Workers. Асинхронные операции позволяют выполнять задачи без блокировки основного потока, что особенно важно для сохранения отзывчивости пользовательского интерфейса. Web Workers могут использоваться для параллельной обработки данных, таких как массивы или сложные математические операции, что особенно полезно для высоконагруженных мобильных приложений. Кроме того, разбиение длительных задач на более мелкие с использованием setTimeout или Scheduler.yield() помогает браузеру обрабатывать приоритетные задачи между выполнением частей кода.

    Анализ потребления ресурсов в реальных высоконагруженных системах показывает, что JavaScript может быть ресурсоемким, особенно при частом доступе к DOM. Для оптимизации рекомендуется минимизировать взаимодействие с DOM, используя такие методы, как пакетная обработка обновлений через DocumentFragment или использование концепции Virtual DOM, применяемой в React. Также важно использовать современные итераторы, такие как forEach(), map(), filter() и reduce(), которые не только улучшают читаемость кода, но и могут быть более эффективными, чем традиционные циклы for или while.

    Таким образом, современные техники оптимизации позволяют JavaScript оставаться конкурентоспособным в высоконагруженных сценариях. Минификация, компрессия, ленивая загрузка, асинхронное программирование и использование Web Workers — все эти методы способствуют повышению производительности веб-приложений. Примеры успешного применения JavaScript в проектах, таких как онлайн-игры и системы уведомлений, подтверждают его значимость в современной разработке. Дальнейшие исследования могут быть сосредоточены на анализе новых технологий, таких как WebGPU, и их потенциале для дальнейшего повышения производительности JavaScript-приложений.

    Заключение

    На протяжении почти трех десятилетий JavaScript прошел путь от простого инструмента для добавления интерактивности на веб-страницы до одного из самых универсальных и производительных языков программирования. Его эволюция, начиная с первых версий стандарта ECMAScript и заканчивая современными обновлениями, такими как ES6 и предложения ES2025, демонстрирует уникальную способность языка адаптироваться к меняющимся потребностям разработчиков и технологическим вызовам. Сегодня JavaScript занимает лидирующие позиции в веб-разработке, охватывая как клиентскую, так и серверную части, а также расширяясь в новые сферы, такие как машинное обучение и высокопроизводительные приложения.

    Ключевыми факторами успеха JavaScript являются его гибкость, универсальность и активное сообщество, поддерживающее развитие языка через стандартизацию и внедрение инноваций. Например, появление Node.js в 2009 году открыло новые горизонты для серверной разработки, а внедрение WebAssembly дополнило возможности JavaScript для создания высокопроизводительных модулей. Эти изменения, наряду с постоянными улучшениями движков JavaScript, такими как V8, SpiderMonkey и JavaScriptCore, сделали язык неотъемлемой частью современного программирования.

    Однако развитие JavaScript не обошлось без вызовов. Политические разногласия, такие как провал ES4, и временные проблемы с производительностью при внедрении новых стандартов, например ECMAScript 2025, показывают, что язык постоянно находится в процессе совершенствования. Тем не менее, благодаря строгой системе тестирования и поэтапному внедрению нововведений через комитет TC39, JavaScript остается стабильным и надежным инструментом для разработки.

    К 2025 году JavaScript продолжает доминировать в веб-экосистеме, используясь в 97% веб-сайтов. Его популярность подкрепляется растущей экосистемой фреймворков и библиотек, таких как React, Angular и Vue, а также интеграцией с технологиями, такими как WebAssembly и искусственный интеллект. При этом язык продолжает развиваться, предлагая разработчикам новые инструменты, такие как Records/Tuples, JSON Modules и Pipeline Operator, которые направлены на повышение производительности и удобства разработки


    4 0 2 Ответить
  • kirilljsK
    kirilljs
    Пишем Telegram-бот на Go

    Сегодня создадим простого Telegram-бота на языке Go, который будет отвечать на команду /start сообщением “Привет мир!”.

    Первое что нам понадобится это установить зависимости, надеюсь что у вас Go уже установлен?

    Для работы используем библиотеку go-telegram-bot-api. Установите её:

    go get github.com/go-telegram-bot-api/telegram-bot-api/v5
    

    Далее создаем файл main.go и вставьте следующий код:

    package main
    
    import (
        "log"
    
        tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
    )
    
    func main() {
        // Замените "YOUR_BOT_TOKEN" на токен вашего бота
        bot, err := tgbotapi.NewBotAPI("YOUR_BOT_TOKEN")
        if err != nil {
            log.Panic(err)
        }
    
        bot.Debug = false // Включите true для отладки
    
        // Настраиваем параметры получения обновлений
        updateConfig := tgbotapi.NewUpdate(0)
        updateConfig.Timeout = 60 // Таймаут ожидания обновлений (в секундах)
    
        // Получаем обновления
        updates := bot.GetUpdatesChan(updateConfig)
    
        // Обрабатываем входящие сообщения
        for update := range updates {
            if update.Message != nil && update.Message.IsCommand() {
                // Проверяем команду /start
                if update.Message.Command() == "start" {
                    // Формируем ответ
                    msg := tgbotapi.NewMessage(update.Message.Chat.ID, "Привет!")
                    msg.ReplyToMessageID = update.Message.MessageID
    
                    // Отправляем сообщение
                    if _, err := bot.Send(msg); err != nil {
                        log.Panic(err)
                    }
                }
            }
        }
    }
    

    p.s. честно говоря на питоне слегка попроще писать ботов, но да ладно едем дальше))

    Теперь давайте запустим нашего бота, для этого не забудьте заменить YOUR_BOT_TOKEN, на токен вашего бота (его выдает BotFather при создании бота).

    Запустим бота:

    go run main.go
    

    После перейдите в телегу и напишите вашему боту в Telegram команду /start. Он ответит “Привет!”.

    Ну и в принципе все! Теперь можно придумывать всякие штучки, программировать бота как душе угодно.
    Я уже писал про бота на питоне в предидущем посте если кому-то интересно - ссылка


    2 0 0 Ответить
  • kirilljsK
    kirilljs
    Гайд по работе с TensorFlow.js: от нуля до первого нейрона 🧠

    TensorFlow.js — библиотеке от Google, которая позволяет создавать и обучать нейросети прямо в браузере или Node.js. Забудьте про Python: всё, что вам нужно, — это браузер и базовые знания JS. Давайте начнём!


    1. Установка и подключение

    В браузере:

    <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@4.10.0/dist/tf.min.js"></script>  
    

    В Node.js:

    npm install @tensorflow/tfjs  
    

    Для GPU:

    npm install @tensorflow/tfjs-node-gpu  
    

    2. Пример простой модели

    Задача: обучить модель предсказывать Y = 2X - 1.

    Подготовка данных

    const xs = tf.tensor2d([[0], [2], [4], [6], [8]]); // Входные значения  
    const ys = tf.tensor2d([[-1], [3], [7], [13], [15]]); // Цель  
    

    Создание и компиляция модели

    const model = tf.sequential();  
    model.add(tf.layers.dense({inputShape: [1], units: 1}));  
    
    model.compile({  
      optimizer: 'sgd',  
      loss: 'meanSquaredError'  
    });  
    

    Обучение и прогнозирование

    await model.fit(xs, ys, {epochs: 50});  
    const prediction = model.predict(tf.tensor2d([[10]]));  
    prediction.print(); // Ожидаем ~19  
    

    3. Визуализация и сохранение

    • Графики обучения: Используйте tfjs-vis для отображения потерь.
    • Сохранение модели:
      await model.save('localstorage://my-model');  
      
    • Загрузка модели:
      const loadedModel = await tf.loadLayersModel('localstorage://my-model');  
      

    4. Готовые модели

    • ImageNet (Mobilenet):
      npm install @tensorflow-models/mobilenet  
      
      Пример:
      const model = await mobilenet.load();  
      const predictions = await model.classify(document.getElementById('img'));  
      
    • Голосовые команды:
      npm install @tensorflow-models/speech-commands  
      

    5. Советы и ограничения

    • Очистка памяти: Используйте tf.tidy() или .dispose() для управления тензорами.
    • Производительность: В браузере медленнее, чем в Python. Лучше использовать для простых задач.
    • Сложные модели: Обучайте на Python, затем импортируйте в TensorFlow.js.

    0 0 0 Ответить
  • kirilljsK
    kirilljs
    Основы квантовых алгоритмов: Shor, Grover и магия квантовой механики 🌌

    Почитал тут про квантовые алгоритмы и хочу поделиться о том, как квантовая механика превращает классические задачи в “магию” будущего. Да, речь о квантовых алгоритмах Shor и Grover . Не пугайтесь слов вроде “суперпозиция” или “запутанность” — мы разберемся без страшных формул и с юмором 😄.


    1. Кубиты: не просто 0 и 1

    Классический бит — это как выключатель: либо “вкл”, либо “выкл”. А кубит — это суперпозиция состояний. Представьте монету, которая крутится в воздухе: она одновременно и “орёл”, и “решка”. Квантовый компьютер использует это, чтобы обрабатывать много вариантов сразу. Магия? Нет — физика!


    2. Алгоритм Шора: взломай RSA за выходные 🧨

    Представьте, что вы хотите разложить число на множители (например, 15 = 3×5). Для маленьких чисел это легко, но для чисел из 1000 цифр? Классические компьютеры тратят миллиарды лет.
    Shor же делает это за полиномиальное время, используя квантовые свойства. Как? Он превращает задачу в поиск периодичности функции, а потом… бац! — и множители находятся через квантовое преобразование Фурье.

    Почему это важно?
    RSA — основа современной криптографии. Если квантовый компьютер с тысячей кубитов станет реальностью, наши пароли станут прозрачными, как стекло 🤯. Но пока что это научная фантастика: даже Google и IBM только начинают осваивать десятки кубитов.


    3. Алгоритм Гровера: иголка в стоге сена? Легко! 🔍

    Классический поиск в базе данных из N элементов требует в среднем N/2 шагов. Гровер сокращает это до √N. Как? Он использует интерференцию квантовых состояний, чтобы “подсветить” правильный ответ.

    Представьте: вы ищете иголку в стоге сена. Классический способ — перебирать каждый соломинку. Гровер же как волшебник, который “чувствует”, где иголка, и направляет вас туда, уменьшая ошибки.

    Где применяется?

    • Поиск в неструктурированных данных.
    • Взлом симметриичных шифров (но с оговорками).
    • Оптимизация, машинное обучение и даже игры!

    4. Жизнь после квантового скачка 🚀

    Квантовые алгоритмы — это не замена классическим, а дополнение. Они круты в задачах, где классические методы терпят крах:

    • Факторизация (Shor).
    • Поиск (Grover).
    • Моделирование молекул (для медицины!).
    • Оптимизация логистики и финансов.

    Но важно помнить:

    • Квантовые компьютеры пока шумные и ненадежные.
    • Большинство задач по-прежнему решаются классически.
    • Миру нужны программисты, которые умеют думать “квантово”.


    0 0 0 Ответить
  • kirilljsK
    kirilljs
    Как защитить API от DDoS-атак: топ-5 инструментов и практик

    Если ваш API внезапно перестал отвечать, а серверы падают под потоком подозрительных запросов — это классическая картина DDoS-атаки. Такие атаки могут обрушить ваш сервис, потерять клиентов и деньги. Но не спешите паниковать: сегодня мы разберем, как защититься, и покажем конкретные инструменты с простыми примерами настройки.


    Почему важно защищать API?

    API — это «сердце» многих современных приложений. Он связывает мобильные приложения с серверами, чат-ботов с базами данных, а фронтенд с логикой бэка. Если злоумышленник заблокирует доступ к нему, вся система остановится. DDoS-атаки работают просто: боты отправляют миллионы запросов, перегружая сервер. Задача защиты — отличить «живых» пользователей от ботов и распределить нагрузку так, чтобы сервис оставался доступным.


    Топ-5 инструментов для защиты API

    Все решения можно разделить на платформы уровня облака (например, Cloudflare или AWS Shield) и локальные инструменты (Nginx, Fail2Ban). Вот пять вариантов, которые покроют разные сценарии использования:

    1. Cloudflare — «Щит» для любого сайта

    Плюсы: Простота настройки, защита от DDoS и ботов, бесплатный тариф.
    Минусы: Меньше контроля над трафиком, чем у AWS или Azure.
    Как настроить:

    • Зарегистрируйте аккаунт на cloudflare.com.
    • Перенесите DNS-записи вашего домена в Cloudflare.
    • Включите защиту DDoS в разделе «Network».
    • Настройте правила брандмауэра (Firewall) для блокировки подозрительных IP.
    2. AWS Shield — Защита для масштабных проектов

    Плюсы: Интеграция с другими сервисами AWS, автоматическое обнаружение атак.
    Минусы: Высокая стоимость, сложность настройки для новичков.
    Как настроить:

    • В консоли AWS включите Shield для вашего API Gateway или ALB.
    • В разделе AWS WAF создайте правила для фильтрации запросов (например, по частоте или IP).
    • Настройте CloudWatch для мониторинга аномалий.
    3. Azure DDoS Protection — Для интеграции с Microsoft-инфраструктурой

    Плюсы: Глубокая интеграция с Azure, автоматическое масштабирование.
    Минусы: Ограниченная поддержка не-Azure ресурсов.
    Как настроить:

    • Включите DDoS Protection в разделе «Network Security».
    • Настройте политики фильтрации трафика в Azure Security Center.
    • Свяжите с Application Gateway для дополнительной фильтрации.
    4. Nginx — Локальный барьер против атак

    Плюсы: Бесплатный, гибкая настройка, работает как обратный прокси.
    Минусы: Требует ручной настройки, не подходит для тяжелых DDoS.
    Как настроить:

    • Установите Nginx: sudo apt install nginx.
    • В конфиге /etc/nginx/nginx.conf добавьте:
      http {
          limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
          server {
              location /api/ {
                  limit_req zone=one burst=20;
                  proxy_pass http://your_backend;
              }
          }
      }
      
      Это ограничит частоту запросов к /api/ до 10 в секунду.
    5. Fail2Ban — Блокировка агрессивных IP

    Плюсы: Простота, работает на уровне сервера.
    Минусы: Не подходит для распределенных атак с множества IP.
    Как настроить:

    • Установите Fail2Ban: sudo apt install fail2ban.
    • Создайте файл /etc/fail2ban/jail.d/api-protection.conf:
      [api]
      enabled = true
      filter = api
      action = iptables[name=API, port=80, protocol=tcp]
      logpath = /var/log/nginx/access.log
      maxretry = 100
      bantime = 3600
      
      Это заблокирует IP, который сделает более 100 запросов в час.

    3 ключевые практики для защиты API

    Практика 1: Rate Limiting
    Ограничение количества запросов от одного пользователя — самый простой способ отбить атаку. Например, разрешите не более 100 запросов в минуту на IP. Это можно настроить через Nginx, AWS WAF или библиотеки вроде express-rate-limit для Node.js:

    const rateLimit = require('express-rate-limit');
    const limiter = rateLimit({ windowMs: 60 * 1000, max: 100 });
    app.use('/api/', limiter);
    

    Практика 2: Используйте CDN
    CDN (Content Delivery Network) распределяет трафик по серверам по всему миру. Это не только ускоряет работу API, но и поглощает часть DDoS-атак. Cloudflare, Akamai и AWS CloudFront — лучшие варианты.

    Практика 3: Мониторинг и автоматическое реагирование
    Настройте оповещения о скачках трафика через Prometheus + Grafana или облачные сервисы (CloudWatch, Azure Monitor). Автоматизируйте блокировку подозрительных IP через скрипты или интеграции с WAF.


    Как выбрать подходящее решение?

    • Для стартапа или малого бизнеса: Cloudflare или Nginx + Fail2Ban.
    • Для крупного проекта на AWS/Azure: AWS Shield или Azure DDoS Protection.
    • Для гибкости и контроля: Сочетание Nginx + WAF + ручных скриптов.

    3 0 1 Ответить

Категории

  • Главная
  • Новости
  • Фронтенд
  • Бекенд
  • Языки программирования

Контакты

  • Сотрудничество
  • info@rosdesk.ru
  • Наш чат
  • Наш ТГ канал

© 2024 - 2025 RosDesk, Inc. Все права защищены.

Политика конфиденциальности
  • Войти

  • Нет учётной записи? Зарегистрироваться

  • Войдите или зарегистрируйтесь для поиска.
  • Первое сообщение
    Последнее сообщение
0
  • Категории
  • Последние
  • Метки
  • Популярные
  • Пользователи
  • Группы