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

Однопоточный JavaScript и многопоточная Java: что быстрее?

Время на прочтение 7 мин
Количество просмотров 15K
Блог компании Timeweb Cloud Разработка веб-сайтов *JavaScript *Java *
Перевод

Асинхронное выполнение на Java и JavaScript


При необходимости в JavaScript можно запускать дополнительные потоки. Но обычно в Node.js или в браузерах весь код на JavaScript выполняется в одном потоке. В браузерах один и тот же поток рендерит содержимое веб-страницы на экран. По сути, один поток выполнения занимается всеми задачами, потому что приложения JavaScript пользуются преимуществами асинхронного выполнения. Для асинхронного выполнения задача помещается в очередь задач. Задачи из очереди одна за другой выполняются единственным потоком. Например, вторая строка кода выполняет планирование асинхронной задачи, которая запускается после завершения текущей задачи:

console.log("1");
setTimeout(()=>console.log("2"));
console.log("3");

Результатом работы кода будет 1 3 2.

В Java API под асинхронным выполнением обычно подразумевается, что задача выполняется в новом выделенном потоке. Например, представленный ниже код при помощи метода supplyAsync() планирует асинхронную задачу:

System.out.println("current thread: " + Thread.currentThread().getName());
var future = CompletableFuture.supplyAsync(() -> Thread.currentThread().getName());
System.out.println("current thread: " + Thread.currentThread().getName());
System.out.println("task thread: " + future.get());

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

current thread: main
current thread: main
task thread: ForkJoinPool.commonPool-worker-1

Проблема множественных потоков заключается в том, что Java runtime не может создавать бесконечное их количество. Когда все запущенные потоки ожидают, а новые потоки создать нельзя, приложение тоже ничего не будет делать.
Читать дальше →
Всего голосов 79: ↑41 и ↓38 +3
Комментарии 77

Как я в десять раз ускорил работу таблицы Google одной строкой CSS

Время на прочтение 4 мин
Количество просмотров 33K
Блог компании Timeweb Cloud Разработка веб-сайтов *CSS *
Перевод
Наша компания использует Google Search Console для проверки статуса индексации и оптимизации видимости наших веб-сайтов. Также в консоли можно проверить, какие внешние веб-сайты ссылаются на вашу страницу. Однажды я просматривал страницу «Top linking sites» и заметил сильное торможение скроллинга. Оно происходило, когда я выбирал отображение большого массива данных (500 строк) вместо стандартных 10 результатов.


Раздел «Top linking sites» в Google Search Console, 500 строк на страницу

Я интересуюсь производительностью фронтенда, поэтому не мог удержаться и решил разобраться, в чём дело. В конце концов, Google активно стремится к повышению веб-производительности, поэтому стоит ожидать, что собственные публичные приложения компании будут хорошим эталоном.
Читать дальше →
Всего голосов 100: ↑100 и ↓0 +100
Комментарии 26

Дистанционный запуск игр на GBA

Время на прочтение 13 мин
Количество просмотров 1.8K
Блог компании Timeweb Cloud Программирование *Игры и игровые консоли
Перевод
image

Эта программа транслирует игры с Raspberry Pi на портативную консоль Game Boy Advance через его соединительный порт. Видео и аудио в режиме реального времени сжимаются и отправляются на консоль, с которой осуществляется управление, что позволяет запускать на геймбое игры с любой платформы (отсюда и название Remote Play — дистанционный запуск)

Читать дальше →
Всего голосов 13: ↑12 и ↓1 +11
Комментарии 4

Эскалация привилегий при помощи polkit: как заполучить root-доступ в Linux, воспользовавшись семилетним багом

Время на прочтение 14 мин
Количество просмотров 5.1K
Блог компании Timeweb Cloud Информационная безопасность *Open source *GitHub *Разработка под Linux *
Перевод

polkit – это системный сервис, по умолчанию устанавливаемый во многих дистрибутивах Linux. Он используется демоном systemd, поэтому в любом дистрибутиве Linux, где применяется system, также используется polkit. Автор этой статьи, входя в состав a GitHub Security Lab, работает над улучшением безопасности опенсорсного софта; он ищет уязвимости и докладывает о них. Именно он однажды нашел уязвимость в polkit, позволяющую злоумышленнику увеличить его привилегии. Раскрытие уязвимости было скоординировано с командой по поддержке polkit, а также с командой по обеспечению безопасности в компании Red Hat. О раскрытии этой уязвимости было объявлено публично, патч для нее был выпущен 3 июня 2021 года, и ей был присвоен код CVE-2021-3560.

Эта уязвимость позволяет непривилегированному пользователю, работающему на локальном ПК, получить root-доступ к командной оболочке системы. Такой эксплойт несложно осуществить при помощи нескольких стандартных инструментов командной строки, как показано в этом коротком видео. В данном посте будет объяснено, как устроен этот эксплойт, а также показано, где именно в исходном коде находится этот баг.

История уязвимости CVE-2021-3560 и какие дистрибутивы она затронула

Рассматриваемый баг достаточно старый. Он вкрался в код более восьми лет назад в коммите bfa5036 и впервые мог использоваться в версии 0.113 программы polkit. Однако, во многих популярных дистрибутивах Linux эта уязвимая версия не использовалась до относительно недавнего времени.

Немного специфической историей этот баг обладает в Debian и его производных (например, в Ubuntu), так как Debian использует форк polkit, в котором есть своя особенная схема нумерации версий. В форке Debian этот баг появился в коммите f81d021 и впервые попал в дистрибутив в версии 0.105-26. В стабильном релизе Debian 10 (“buster”) используется версия 0.105-25, таким образом, уязвимости в нем нет. Но некоторые производные Debian, в том числе, Ubuntu, основаны на нестабильной версии Debian, а она уязвима.

Читать далее
Всего голосов 24: ↑22 и ↓2 +20
Комментарии 3

Динамическое масштабирование кластеров Kubernetes в Airbnb

Время на прочтение 10 мин
Количество просмотров 2.9K
Блог компании Timeweb Cloud Облачные вычисления *DevOps *Облачные сервисы *Kubernetes *
Перевод
image

Введение


Важный аспект эксплуатации вычислительной инфраструктуры – гарантировать, что используемые облачные ресурсы автоматически масштабируются по мере необходимости, как вверх, так и вниз. Серьезные флуктуации трафика могут наблюдаться ежедневно, и поэтому «площадь» облака должна динамически масштабироваться сообразно этим флуктуациям.

Например, в Airbnb такое масштабирование обеспечивается при помощи Kubernetes. Это опенсорсная система оркестрации контейнеров. Также в Airbnb используется OneTouch, интерфейс конфигурации сервисов, являющийся надстройкой над Kubernetes и более подробно описанный в этом посте.

Здесь же мы поговорим о том, как динамически подбирать размеры кластеров, пользуясь Kubernetes Cluster Autoscaler, а также подчеркнем функционал, привнесенный компанией Airbnb в сообщество sig-autoscaling. Эти улучшения способствуют настраиваемости и гибкости, а эти качества очень важны для выполнения уникальных бизнес-требований, предъявляемых в Airbnb.
Читать дальше →
Всего голосов 9: ↑8 и ↓1 +7
Комментарии 0

Разбираем по полочкам «философию Unix»

Время на прочтение 9 мин
Количество просмотров 15K
Блог компании Timeweb Cloud Программирование *PowerShell *Компиляторы *
Перевод
image

Как-то раз я написал пост о том, как проектируются компиляторы. Основная идея этого поста заключалась в очень простом композиционном примитиве – а именно, выстроить конвейер из функций. Традиционно проектирование компиляторов выстраивается как нисходящий процесс. Компилятор – большая штука, слишком большая, чтобы сразу уложить его в голове. Поэтому задачи дробятся до тех пор, пока не удастся остановиться на какой-нибудь удобоваримой подзадаче, например: написать парсер. Эта проблема уже достаточно компактная, чтобы справиться с ней в одиночку.
Читать дальше →
Всего голосов 34: ↑29 и ↓5 +24
Комментарии 26

Согласованное хеширование: не самые очевидные вещи

Время на прочтение 13 мин
Количество просмотров 3.9K
Блог компании Timeweb Cloud Высокая производительность *Программирование *Алгоритмы *
Перевод
image

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

# модульное хеширование
hash = key % N of nodes


В свою очередь, при согласованном хешировании хеширующая функция не зависит от количества узлов хранения. Поэтому можно динамически секционировать данные по мере добавления или удаления узлов, тем самым масштабируясь поступательно.
Читать дальше →
Всего голосов 24: ↑22 и ↓2 +20
Комментарии 2

Как без труда разворачивать в облаке модели машинного обучения

Время на прочтение 11 мин
Количество просмотров 3.2K
Блог компании Timeweb Cloud Python *Локализация продуктов *Машинное обучение *Flask *
Перевод
image

Разверните в продакшене вашу первую ML-модель. Для этого вам понадобится очень простой технологический стек

image
Фото Рэнди Фэза с Unsplash
Читать дальше →
Всего голосов 10: ↑10 и ↓0 +10
Комментарии 5

Как ускорить базу данных при помощи шардирования

Время на прочтение 14 мин
Количество просмотров 15K
Блог компании Timeweb Cloud Высокая производительность *IT-инфраструктура *Хранение данных *Хранилища данных *
Перевод
image

Шардирование было одним из первых механизмов, позволяющих распределять базы данных для повышения их производительности. Последние инновации превратили шардирование в один из лучших механизмов в своем роде.

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

Но сегодня с данными складывается совершенно иная ситуация. Смартфоны распространились повсеместно и превратились в необходимую вещь. Вместе со смартфонами увеличилось количество мобильных приложений, и сегодня через них производятся и потребляются такие объемы данных, какие были просто немыслимы 15 лет назад. В такой ситуации серьезно возрастает нагрузка на кластеры баз данных, поскольку им приходится обрабатывать все более серьезные объемы трафика. Некоторые из топовых веб-сайтов и веб-сервисов обрабатывают миллиарды посещений в неделю.

Как справиться с таким невероятным объемом трафика, поступающим в кластер базы данных?
Можно попробовать шардирование. Возможно, вы никогда и не слышали о таком подходе, либо по-быстрому отбраковывали его как старомодное решение, не отвечающее современным вызовам. Сам феномен «шардирования баз данных» едва ли сулит полный набор примочек, какими могли бы похвастаться другие решения, но этот подход определенно эффективен и практичен.
Читать дальше →
Всего голосов 18: ↑17 и ↓1 +16
Комментарии 3

React: все о новом предложении — хуке use()

Время на прочтение 7 мин
Количество просмотров 5.8K
Блог компании Timeweb Cloud Разработка веб-сайтов *JavaScript *ReactJS *
Перевод


Привет, друзья!


Представляю вашему вниманию перевод этой небольшой заметки, посвященной предложению нового хука React.


Первоклассная поддержка промисов в React — как это должно работать


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

Читать дальше →
Всего голосов 15: ↑15 и ↓0 +15
Комментарии 5

Какую модель памяти следует использовать в языке Rust?

Время на прочтение 10 мин
Количество просмотров 8.2K
Блог компании Timeweb Cloud Программирование *C++ *Rust *
Перевод
image

В этой статье рассматривается несколько альтернативных моделей памяти для языка Rust. Надеюсь, эта дискуссия будет ценна всему сообществу Rust – но, в конце концов, это их язык, поэтому и выбор модели памяти тоже за ними.

Эта дискуссия ведется с позиций принятой в Rust безбоязненной конкурентности. Затравкой для нее послужили различные обсуждения, которые я наблюдал и в которых сам участвовал, работая над этой серией статей. Разумеется, мнения у разных членов сообщества тоже разнятся, люди могут обоснованно отстаивать разные варианты решений. Те, кто меня знают, понимают, что эти точки зрения серьезно расходятся с моей. Однако, моя точка зрения продиктована тем, что я давно работаю в условиях максимально возможной производительности, масштабируемости, молниеносного отклика, энергоэффективности, устойчивости и многого другого. В таких условиях определенная перестраховка – выбор не только мудрый, но и жизненно необходимый. В авиации есть примета, что есть пилоты отважные, а есть старые, но отважные пилоты до старости не доживают.

Тем не менее, я рассчитываю, что мой более чем тридцатилетний опыт работы с конкурентностью и моя работа над моделью памяти в C/C++ (безотносительно memory_order_consume), а также моя роль ведущего специалиста по поддержке модели памяти ядра (LKMM) послужат хорошей отправной точкой, чтобы высказаться о более прозаических задачах, решение которых, я уверен, стремятся поддержать в сообществе Rust.
Читать дальше →
Всего голосов 31: ↑27 и ↓4 +23
Комментарии 3

Чему можно научиться у 1600 инди-разработчиков в Steam, которые заработали больше $100К

Время на прочтение 6 мин
Количество просмотров 5.1K
Блог компании Timeweb Cloud Разработка игр *Монетизация игр *Продвижение игр *Игры и игровые консоли
Перевод


Только 10% разработчиков в Steam заработали больше $100 000 валового (т.е. без учета издержек) дохода. Автор оригинала этой статьи попробовал по открытым данным сравнить, что делали успешные разработчики, чего не делали все остальные.

Если совсем коротко, то

  1. Делали и публиковали игры. Много. Успешные инди-разработчики в среднем уже опубликовали 4-5 игр. Неуспешных игр.
  2. Искали паблишера, а сами фокусировались на разработке.
  3. Выбирали узкую специализацию, в которой реализовывали п. 1.
  4. Учитывали предпочтения и жанры, которые нравятся игрокам.

Вот так просто. Под катом больше подробностей и статистики.

Я веду канал в Telegram GameDEVils и блог на Substack . Подписывайтесь, я делюсь там материалами про геймдизайн, разработку и историю игр.
Читать дальше →
Всего голосов 13: ↑12 и ↓1 +11
Комментарии 0

TypeScript: паттерны проектирования. Часть 2

Время на прочтение 10 мин
Количество просмотров 5.7K
Блог компании Timeweb Cloud Разработка веб-сайтов *JavaScript *Проектирование и рефакторинг *TypeScript *
Перевод


Привет, друзья!


Представляю вашему вниманию перевод второй части серии статей, посвященных паттернам проектирования в TypeScript.


Спасибо Денису Улесову за помощь в переводе материала.


Паттерны (или шаблоны) проектирования (design patterns) описывают типичные способы решения часто встречающихся проблем при проектировании программ.


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

Читать дальше →
Всего голосов 10: ↑10 и ↓0 +10
Комментарии 1

Сборка мусора в неисправных JVM, проактивный подход

Время на прочтение 8 мин
Количество просмотров 5K
Блог компании Timeweb Cloud Программирование *Java *Компиляторы *Хранение данных *
Перевод
image

Команда Netflix Cloud Data Engineering работает с различными приложениями для JVM, включая такие популярные хранилища данных, как Cassandra и Elasticsearch. Хотя большинство наших кластеров стабильно работают, обходясь выделенной им памятью, иногда «запрос смерти» или ошибка в самом хранилище данных приводят к перерасходу памяти, что может спровоцировать лишние циклы сборки мусора или даже привести к исчерпанию памяти в JVM.
Читать дальше →
Всего голосов 27: ↑26 и ↓1 +25
Комментарии 2

Kubernetes никогда не задумывали для пакетной обработки задач

Время на прочтение 14 мин
Количество просмотров 4.1K
Блог компании Timeweb Cloud Системное администрирование *DevOps *Kubernetes *
Перевод
… и как бы это могло выглядеть в таком случае.

image

В этой статье мы попробуем сформулировать и доказать мысль, что Kubernetes изначально и с философской точки зрения более благосклонен к микросервисам, нежели к группам одноразовых задач. Это рождает множество неестественных противодействий и ведет к тому, что использование платформы в этих целях сильно становится сложнее, чем это должно бы быть.
Читать дальше →
Всего голосов 15: ↑14 и ↓1 +13
Комментарии 3

CAP двенадцать лет спустя: как изменились «правила»

Время на прочтение 23 мин
Количество просмотров 5K
Блог компании Timeweb Cloud Высокая производительность *Программирование *Анализ и проектирование систем *Распределённые системы *
Перевод


Эта статья впервые появилась в журнале Computer и подготовлена InfoQ & IEEE Computer Society.


Теорема CAP гласит, что любая сетевая система с общими данными может иметь только два из трех желаемых свойств. Однако, работая непосредственно с разделениями, разработчики могут оптимизировать согласованность и доступность, тем самым достигая некоторого компромисса между всеми тремя.


За десятилетие, прошедшее с появления теоремы, разработчики и исследователи использовали теорему CAP (а иногда и злоупотребляли ею) как повод для изучения широкого спектра новых распределенных систем. Движение NoSQL также использовало её в качестве аргумента против традиционных баз данных.


В теореме CAP говорится, что любая сетевая система с общими данными может иметь не более двух из трех желаемых свойств:


  • согласованность (С), эквивалентная наличию единственной актуальной копии данных;
  • высокая доступность (A) этих данных (для обновлений); и
  • устойчивость к сетевым разделениям (P).

Такое толкование CAP помогало разработчикам быть открытыми для более широкого диапазона систем и компромиссов; действительно, за последнее десятилетие возникло множество новых систем и много споров об относительных достоинствах согласованности и доступности. Формулировка «2 из 3» всегда вводила в заблуждение, поскольку имела тенденцию чрезмерно упрощать противоречия между свойствами. Но сейчас такие тонкости имеют значение. CAP запрещает лишь крошечную часть проектного пространства: идеальная доступность и согласованность при наличии разделений, которые встречаются редко.

Читать дальше →
Всего голосов 24: ↑17 и ↓7 +10
Комментарии 11

React: решение интересной практической задачи

Время на прочтение 15 мин
Количество просмотров 4.5K
Блог компании Timeweb Cloud Разработка веб-сайтов *JavaScript *ReactJS *


Привет, друзья!


В данном туториале я хочу поделиться с вами опытом решения одной интересной практической задачи.


Предположим, что у нас имеется страница сравнения товаров. На этой странице отображается слайдер с карточками товаров и таблица с их характеристиками. Задача состоит в том, чтобы синхронизировать переключение слайдов и прокрутку таблицы. Условия следующие:


  • ширина таблицы должна соответствовать ширине слайдера;
  • ширина колонки таблицы должна соответствовать ширине слайда;
  • слайды можно переключать с помощью перетаскивания, нажатия на кнопки управления и элементы пагинации;
  • таблицу можно прокручивать с помощью колесика мыши (на десктопе) и перемещения указателя (на телефоне);
  • при взаимодействии пользователя с одним компонентом второй должен реагировать соответствующим образом: при переключении слайда должна выполняться прокрутка таблицы, при прокрутке таблицы — переключение слайдов.

Репозиторий с кодом проекта.


Если вам это интересно, прошу под кат.

Читать дальше →
Всего голосов 14: ↑13 и ↓1 +12
Комментарии 6

Пишем кастомные CUDA-ядра на Triton

Время на прочтение 7 мин
Количество просмотров 3.1K
Блог компании Timeweb Cloud Высокая производительность *Программирование *GPGPU *
Перевод
image

Triton – это языковой компилятор для создания сильно оптимизированных ядер CUDA. Здесь будут изложены основы программирования для GPU и рассказано, как для этой цели используется Triton.

Учитывая нынешний успех глубокого обучения и вал исследовательских статей на эту тему, часто возникает такая ситуация: рождается какая-нибудь новая идея, и выясняется, что для нее не поддерживается аппаратное ускорение. Точнее, стоит вам изобрести новую функцию активации или механизм самовнимания – нам сразу приходится прибегать к возможностям PyTorch/Tensorflow для обработки прямого и обратного прохода через модуль.

В таких случаях применим, например, PyTorch JIT. Но PyTorch JIT – это высокоуровневый компилятор, способный оптимизировать лишь некоторые части кода, но непригодный для написания специализированных ядер CUDA.
Читать дальше →
Всего голосов 15: ↑15 и ↓0 +15
Комментарии 2

React: разработка реального приложения с помощью React Query

Время на прочтение 21 мин
Количество просмотров 9.6K
Блог компании Timeweb Cloud Разработка веб-сайтов *JavaScript *ReactJS *TypeScript *
Перевод


Привет, друзья!


Представляю вашему вниманию перевод этой замечательной статьи, в которой рассказывается о разработке приложения с помощью React Query.


Репозиторий с кодом проекта


Прим. пер.: автор рассказывает лишь о ключевых особенностях приложения, поэтому я рекомендую клонировать репозиторий, установить зависимости и запустить сервер для разработки, чтобы иметь возможность выполнять необходимые операции при чтении статьи. Обратите внимание: если у вас возникнут проблемы при запуске сервера для разработки с помощью команды npm start, перенесите переменные, определенные в этой команде в файле package.json, в файл .env:


SKIP_PREFLIGHT_CHECK=true
TSC_COMPILE_ON_ERROR=true
ESLINT_NO_DEV_ERRORS=true

И отредактируйте команду start следующим образом:


"start": "react-scripts start"

Руководство по React Query

Читать дальше →
Всего голосов 16: ↑15 и ↓1 +14
Комментарии 0

StatefulSet в Kubernetes – примеры и наилучшие практики

Время на прочтение 10 мин
Количество просмотров 8.7K
Блог компании Timeweb Cloud MySQL *Хранилища данных *DevOps *Kubernetes *
Перевод
image

Собираетесь ли вы развертывать базу данных в кластере Kubernetes? Если так – то это отличный выбор. Kubernetes – это инструмент оркестрации контейнеров, который при помощи множества инструментов координирует эксплуатацию приложений в контейнерах (подах). Один из этих контроллеров называется StatefulSet и используется для эксплуатации приложений, сохраняющих состояние.
Читать дальше →
Всего голосов 21: ↑20 и ↓1 +19
Комментарии 20