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

Jspi

@Jspi
js
Сводка
Сообщения
48
Темы
21
Поделиться
0
Группы
4
Подписчики
3
Подписки
2

Сообщения

Последние Лучшие сообщения Спорные

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

    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 — это постоянный процесс, а не разовое мероприятие. Регулярный мониторинг, анализ производительности и постепенная настройка позволят поддерживать вашу базу данных в оптимальном состоянии даже при росте нагрузки и объема данных.

    PostgreSQL

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

    История и эволюция 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, которые направлены на повышение производительности и удобства разработки

    JavaScript

  • Как выбрать язык программирования для стартапа: Python, Go, Rust или что-то ещё?
    JspiJ Jspi

    ок, а где JS?

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

  • Как выбрать язык программирования для стартапа: Python, Go, Rust или что-то ещё?
    JspiJ Jspi

    А как же ПХП?

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

  • JavaScript мемы
    JspiJ Jspi

    image.png

    Юмор, Мемы

  • JavaScript мемы
    JspiJ Jspi

    image.png

    Юмор, Мемы

  • JavaScript мемы
    JspiJ Jspi

    image.png

    Юмор, Мемы

  • JavaScript мемы
    JspiJ Jspi

    image.png

    Юмор, Мемы

  • JavaScript мемы
    JspiJ Jspi

    image.png

    Юмор, Мемы

  • Как защитить API от DDoS-атак: топ-5 инструментов и практик
    JspiJ Jspi

    Вот еще шпаргалки, как можно управлять трафиком через iptables

    Ограничение количества соединений с одного IP

    Используется для предотвращения перегрузки сервера множеством подключений от одного источника.

    Пример:

    # Ограничение до 20 одновременных подключений на порт 80 (HTTP)
    iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 20 -j DROP
    

    Пояснение:

    • A INPUT — добавить правило в цепочку входящих пакетов.
    • p tcp --dport 80 — применить к TCP-трафику на порту 80.
    • m connlimit --connlimit-above 20 — ограничить более чем 20 соединениями.
    • j DROP — отбросить пакеты, если лимит превышен.

    Rate Limiting (ограничение частоты запросов)

    Позволяет ограничить количество пакетов или соединений в единицу времени.

    Пример:

    # Разрешить максимум 25 новых соединений в секунду на порт 80
    iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/second -j ACCEPT
    iptables -A INPUT -p tcp --dport 80 -j DROP
    

    Пояснение:

    • –limit 25/second — разрешить 25 новых соединений в секунду.
    • Все последующие пакеты будут отброшены (-j DROP).

    Блокировка ICMP-запросов

    Атаки типа ICMP flood (например, пинг с огромным количеством пакетов) можно заблокировать.

    Пример:

    # Заблокировать все ICMP-запросы (например, ping)
    iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
    

    Ручная блокировка подозрительных IP

    Если вы обнаружили IP-адрес, генерирующий аномальный трафик, заблокируйте его.

    Пример:

    # Заблокировать конкретный IP
    iptables -A INPUT -s 192.168.1.100 -j DROP
    
    # Сохранить правила (для сохранения после перезагрузки)
    iptables-save > /etc/iptables/rules.v4
    

    Проверка активных подключений:

    # Посмотреть все активные TCP-соединения
    ss -tulnp
    
    # Посмотреть количество подключений на порт 80
    ss -ant | grep :80 | wc -l
    
    Бекенд, разработка серверов

  • Настройка домена nginx
    JspiJ Jspi

    Пользователь @kirilljs написал в Настройка домена nginx:

    0 0,12 * * * root certbot renew --quiet && systemctl reload nginx

    не обязательно перезапускать nginx

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

  • Релиз Node.js 24: Что нового в последней версии?
    JspiJ Jspi

    Node.js 24 был официально выпущен 6 мая 2025 года, представив значительные обновления и улучшения для разработчиков. Ниже приведены ключевые новшества и их особенности.

    Основные изменения

    • Обновление движка V8 до версии 13.6
      Node.js 24 использует обновлённый движок V8 версии 13.6, который обеспечивает повышение производительности, оптимизацию памяти и поддержку современных стандартов JavaScript .
    • AsyncContextFrame по умолчанию
      Механизм отслеживания асинхронного контекста (AsyncContextFrame) теперь включён по умолчанию в AsyncLocalStorage. Это позволяет более эффективно управлять асинхронными операциями и повысить производительность приложений .
    • Глобальный объект URLPattern
      API URLPattern стал глобальным объектом, что позволяет использовать его без явного импорта. Этот инструмент упрощает сопоставление URL-адресов с шаблонами, включая поддержку регулярных выражений .
    • Поддержка Typed Arrays (Float16Array)
      Добавлена поддержка нового типизированного массива Float16Array, который расширяет возможности работы с числами с плавающей точкой и снижает потребление памяти в вычислениях .
    • Ручное управление ресурсами
      Введены улучшения для управления ресурсами (например, памятью и дескрипторами файлов) вручную, что особенно полезно для высоконагруженных приложений .
    • Обновление npm до версии 11
      В состав Node.js 24 включён npm 11, который предлагает улучшенную безопасность, производительность и новые возможности управления пакетами .
    • Прекращение поддержки MSVC
      Релиз включает изменения, связанные с прекращением поддержки Microsoft Visual C++ (MSVC) в будущих версиях, что направлено на упрощение сборки и поддержки Node.js .

    Производительность

    С обновлением до V8 13.6 пользователи могут ожидать более быстрого выполнения кода и оптимизации памяти. Например, новые API позволяют детально анализировать время выполнения асинхронных операций:

    
    const { performance } = require('perf_hooks');
    
    async function measurePerformance() {
        const start = performance.now();
        // Асинхронная операция
        await new Promise(resolve => setTimeout(resolve, 100));
        const end = performance.now();
        console.log(`Время выполнения: ${end - start} мс`);
    }
    
    measurePerformance();
        
    

    Эти инструменты особенно полезны для анализа узких мест в приложениях .

    Тесты производительности

    Ниже приведены примеры улучшений производительности в Node.js 24 по сравнению с предыдущей версией:

    Тест Node.js 22 (мс) Node.js 24 (мс) Улучшение (%)
    Запуск простого скрипта 120 95 20.8%
    Обработка 10 000 асинхронных операций 450 330 26.7%
    Память при обработке JSON 50 МБ 38 МБ 24.0%

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

    План выпуска

    Дата релиза была скорректирована с первоначальных 22 апреля 2025 года на 6 мая 2025 года, чтобы обеспечить стабильность и качество релиза.

    Заключение

    Node.js 24 фокусируется на улучшении производительности и предоставлении разработчикам современных инструментов для анализа и оптимизации кода. Подробнее о новых возможностях можно узнать в официальной документации .

    Node JS

  • Как создать своего Telegram-бота на Python за 5 минут 🤖
    JspiJ Jspi

    давай на голанге теперь

    Python

  • $bindable в Svelte: Упрощение работы с двухсторонними привязками
    JspiJ Jspi

    1523475183_e-news.su_920b080x-ezgif.com-resize.gif

    svelte

  • $bindable в Svelte: Упрощение работы с двухсторонними привязками
    JspiJ Jspi

    $bindable — это специальная директива в Svelte 5+, которая позволяет помечать переменные как двухсторонне связуемые (bindable) в рамках компонента. Это означает, что вы можете использовать bind: на кастомных компонентах так же, как вы используете его, например, на нативном элементе <input bind:value>

    Ранее для этого требовалось писать отдельный механизм обработки событий (dispatch) и передачи значений обратно, но теперь всё это можно сделать с минимальным кодом благодаря $bindable.

    Как работает $bindable

    Когда вы пишете:

    let count = $bindable(0);
    

    Вы создаёте реактивное свойство, которое:

    • Реактивно обновляется при изменении локально.
    • Автоматически генерирует событие change при изменении значения.
    • Позволяет использовать bind: в родительском компоненте без дополнительного кода.

    Под капотом $bindable оборачивает значение в реактивную ссылку и подписывается на изменения, чтобы оповещать внешний мир через dispatch(‘change’, …). Таким образом, вы получаете прозрачный механизм двусторонней связи между компонентами.

    Сравнение с другими фреймворками

    В современных фреймворках для работы с состоянием между компонентами используются разные подходы. В Svelte 5+ появился инструмент $bindable, который упрощает создание двусторонних привязок. В Vue для этого традиционно используют v-model и события, а в React — пропсы и колбэк-функции. Рассмотрим, как эти механизмы работают, их сходства и различия.

    Двухсторонняя привязка: $bindable (Svelte), v-model (Vue), props + callbacks (React)

    Svelte: $bindable

    <!-- Counter.svelte -->
    <script>
      let count = $bindable(0);
    </script>
    
    <button on:click={() => count += 1}>Увеличить</button>
    
    <!-- Родительский компонент -->
    <Counter bind:count={myCount} />
    
    • $bindable автоматически генерирует событие change при изменении значения.
    • Родитель может использовать bind:propName для синхронизации.

    Vue: v-model и события

    <!-- Counter.vue -->
    <template>
      <button @click="increment">Увеличить</button>
    </template>
    
    <script setup>
    import { ref } from 'vue';
    const props = defineProps(['modelValue']);
    const emit = defineEmits(['update:modelValue']);
    
    function increment() {
      emit('update:modelValue', props.modelValue + 1);
    }
    </script>
    
    <!-- Родительский компонент -->
    <Counter v-model="count" />
    
    • v-model использует modelValue как пропс и update:modelValue как событие.
    • Требуется явно определять пропсы и эмитить события.

    React: Пропсы и колбэк-функции

    // Counter.jsx
    function Counter({ count, onCountChange }) {
      return (
        <button onClick={() => onCountChange(count + 1)}>
          Увеличить
        </button>
      );
    }
    
    // Родительский компонент
    const [count, setCount] = useState(0);
    <Counter count={count} onCountChange={setCount} />
    
    • React не имеет встроенной двусторонней привязки.
    • Состояние обновляется через передачу функции onCountChange.

    Реактивность и удобство

    Svelte: Реактивность по умолчанию

    • $bindable использует реактивную систему Svelte, где изменения переменной автоматически обновляют интерфейс.
    • Минимум кода: let count = $bindable(0);

    Vue: Явная реактивность

    • Реактивность через ref, reactive, watch.
    • Для v-model требуется передавать modelValue и эмитить события вручную.

    React: Управление состоянием вручную

    • Реактивность достигается через useState и useEffect.
    • Для синхронизации нужно передавать состояние и функцию его обновления.
    Фреймворк Метод Описание
    Svelte $bindable Автоматически генерирует событие change при изменении значения. Реактивность встроена
    - Минимальный код
    - Автоматическая реактивность
    - Доступен только в Svelte 5+
    - Ограниченная поддержка сложных типов (объекты, массивы)
    Vue v-model+ события Использует props и emit для синхронизации. Требуется явное определение.
    - Ясный API через v-model
    - Хорошо документирован
    - Требуется вручную управлять событиями и пропсами
    - Более многословный код
    React Пропсы и колбэки Полностью ручная реализация. Состояние обновляется через вызов функций.
    - Полный контроль над состоянием
    - Подходит для сложных приложений
    - Нет встроенной двусторонней привязки
    - Требует больше кода для простых задач
    svelte

  • Дерево из плоского массива функция на Javascript
    JspiJ Jspi

    Вот функция на JavaScript, которая строит дерево из плоского массива данных. В JavaScript мы будем использовать объекты и ссылки для создания иерархической структуры.

    function getTree(dataset) {
        const tree = []; // Дерево будет массивом
        const dataById = new Map(); // Используем Map для хранения узлов
    
        // Создаем индексированный Map и инициализируем childs как массивы
        dataset.forEach(node => {
            dataById.set(node.id, { ...node, childs: [] });
        });
    
        // Строим дерево
        dataset.forEach(({ id, parent }) => {
            const node = dataById.get(id);
            if (!parent) {
                // Если узел не имеет родителя, он становится корневым
                tree.push(node);
            } else {
                // Иначе добавляем узел как дочерний к его родителю
                const parentNode = dataById.get(parent);
                if (parentNode) {
                    parentNode.childs.push(node);
                }
            }
        });
    
        return tree;
    }
    

    Объяснение кода

    Функция возвращает массив tree, содержащий корневые узлы. Каждый узел может иметь дочерние элементы в массиве

    Инициализация

    tree: Массив для хранения корневых узлов.
    dataById: Map, где ключ — id узла, значение — сам узел с добавленным свойством childs (пустой массив).

    Создание индекса (dataById)

    Для каждого узла из dataset создается копия с добавлением пустого массива childs.
    Узел сохраняется в dataById по его id.

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

    Для каждого узла проверяется наличие родителя (parent):

    • Если родителя нет, узел добавляется в массив tree.
    • Если родитель есть, узел добавляется в массив childs родительского узла (если родитель существует).

    Пример использования

    const dataset = [
        { id: 1, parent: null, name: "Root" },
        { id: 2, parent: 1, name: "Child 1" },
        { id: 3, parent: 1, name: "Child 2" },
        { id: 4, parent: 2, name: "Grandchild 1" },
        { id: 5, parent: null, name: "Another Root" }
    ];
    
    const tree = getTree(dataset);
    console.log(JSON.stringify(tree, null, 2));
    

    вывод:

    [
      {
        "id": 1,
        "parent": null,
        "name": "Root",
        "childs": [
          {
            "id": 2,
            "parent": 1,
            "name": "Child 1",
            "childs": [
              {
                "id": 4,
                "parent": 2,
                "name": "Grandchild 1",
                "childs": []
              }
            ]
          },
          {
            "id": 3,
            "parent": 1,
            "name": "Child 2",
            "childs": []
          }
        ]
      },
      {
        "id": 5,
        "parent": null,
        "name": "Another Root",
        "childs": []
      }
    ]
    
    JavaScript

  • Failed: No space left on device на сервере с Next.js
    JspiJ Jspi

    Однажды может случиться так, что на вашем сервере какая-либо команда может вернуть ошибку No space left on device, вы ожидаете, что закончилось место, проверяете его, но все порядке, так в чем же причина?

    Если ваша система наполнена невероятным количеством файлов, то можно достичь предела inodes до того, как исчерпать возможности хранения накопителя. (лучше иметь большие файлы, чем слишком много маленьких)

    Для проверси предела Inodex можно воспользоваться командой:

    sudo df -i
    

    и получить подобное:

    Filesystem      Inodes  IUsed   IFree IUse% Mounted on
    udev            495152    353  494799    1% /dev
    tmpfs           501143    519  500624    1% /run
    /dev/vda1      3276800 3276800      0    100% /
    tmpfs           501143      3  501140    1% /dev/shm
    tmpfs           501143      2  501141    1% /run/lock
    tmpfs           100228     21  100207    1% /run/user/0
    tmpfs           100228     20  100208    1% /run/user/1000
    

    это и значит, что у нас что-то создало очень много мелких файлов.

    Next.js и его кеш могут генерировать очень много файлов

    До 15 версии Next.js все запросы fetch() кешируются по умолчанию, и если ничего не настраивать, то их может скопиться очень много в виде файлов в папке .next/cache/fetch-cache/
    В итоге вам достаточно просто почистить папку с кешем.

    rm -rf .next/cache/fetch-cache
    
    NextJs

  • Тяжело ли быть программистом?
    JspiJ Jspi

    Тяжело, не то что тестерам…
    image.png

    Новости

  • DeepSeek — новая китайская нейросеть
    JspiJ Jspi

    Китай уничтожил ChatGPT — главная тема прямо сейчас. Китайский DeepSeek с командой в 200 человек за 3 дня обошёл ChatGPT в App Store.

    За $6 млн китайцы создали то, на что OpenAI потратила $6,6 млрд и 4500 сотрудников. DeepSeek работает быстрее и бесплатно (а для россиян без VPN).
    Второй удар: Alibaba представили новую модель Qwen2.5-1M, которая может бесплатно генерить картинки и видео, обрабатывать огромные (!) объёмы кода, книги и базы данных. Скорость обработки в 7 раз быстрее.
    Дальше — больше. В ответ на $100 млрд Трампа на «суперкомпьютер» Китай выделяет $137 млрд на развитие ИИ.

    Взлёт DeepSeek связывают с падением рынка акций компаний из США и рынка криптовалют.

    Новости

  • Выгорание в ИТ миф или нет?
    JspiJ Jspi

    зато 300к в наносек

    Юмор, Мемы
  • Войти

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

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