Как создать простой планировщик событий в Go
Базовый рабочий механизм представляет собой следующее: запланированное событие добавляется в базу данных, из которой оно будет выполняться в определенное время. Другая задача будет запускаться...
Незаслуженно забытый ForkJoinPool
Всем известно о новых функциях, которыми нас порадовал JDK 8, и, вероятно, трудно найти Java-разработчика, который не знает, что такое Java Streams, лямбды или...
Реализация интерфейсов в Golang
Интерфейсы — это инструменты для определения наборов действий и поведения. Они позволяют объектам опираться на абстракции, а не фактические реализации других объектов. При этом...
Шесть фич YAML, о которых не знает большинство программистов
YAML — это формат файла, обычно используемый для сериализации данных. Существует множество проектов, использующих файлы YAML для настройки, таких как Docker-compose, pre-commit, TravisCI, AWS...
Абстракции с нулевой стоимостью* в Kotlin
*Могут применяться особые условия
Внимание: этот пост в блоге охватывает экспериментальную функцию Kotlin, которая может быть изменена. Эта статья была написана с использованием Kotlin 1.3.50.
Безопасность...
Бенчмарки в Golang: тестируем производительность кода
Честно вам признаюсь — бенчмаркинг (тестирование производительности) не входит в число моих самых сильных сторон, к тому же и провожу я его не так...
Как удаленно отлаживать сайты для Android с помощью Chrome DevTools
Поскольку под управлением Android работает более 2,5 млрд устройств, разработчики не могут игнорировать оптимизацию веб-страниц для этой операционной системы (ОС). Обычно на устройствах с...
7 способов повысить свою продуктивность в Python
Python — один из самых популярных среди языков современного поколения и наверняка останется таковым в ближайшие десять лет. Это фантастический язык программирования практически для...
Три способа захвата скриншотов с помощью Selenium WebDriver
При работе с автоматизированными тестами в Selenium часто приходится делать скриншот веб-страницы или ее части. Это полезно, особенно при отладке ошибок или проверке согласованности...
Создаем собственную Alexa в 20 строках Python
У всех моих друзей есть Alexa, а у меня нет, из-за чего они надо мной смеются. Натерпевшись вдоволь, я решил: “Хватит!”.
Я связался со своей...
Состояния потоков в Java
«Гораздо проще уже спроектировать класс потокобезопасным, чем модернизировать его позже».― Брайан Гетц.
Потоки Java играют важную роль в параллельном программировании. Поток в любой момент времени находится...
Jetpack DataStore: улучшенная система хранения данных
Что такое DataStore
На протяжении многих лет разработчики Android хранили небольшие фрагменты конфиденциальных пользовательских данных с помощью общих настроек (shared preferences). Этот подход имеет следующие...
Сделай сам - как автоматизировать прошивку смартфонов
Иногда выдается свободное время, когда можно смастерить что-нибудь полезное из старых гаджетов.
Однажды я подумал… сколько добра пропадает! Ведь вся эта вычислительная мощность может быть...
Как использовать Laravel Sail с бэкендом Docker Desktop на WSL 2
Каждому разработчику рано или поздно приходится иметь дело с Docker и контейнерами. Посмотрим, как происходит установка Docker Desktop на Windows 10, как она интегрируется...
Оптимизация структур в Golang для эффективного распределения памяти
Поговорим сегодня о выравнивании структур в Golang.
Производительность компьютеров растет с каждым годом. Их вычислительные возможности позволяют выполнять все более сложные задачи. В стремлении применять...
Кастомизируем дефолтную заставку во Flutter
Во Flutter невозможно переопределить экран заставки, который задан по умолчанию, а значит любой виджет-заставка, созданный внутри Flutter, будет отображаться только после дефолтной заставки. Пока...
Современное хранилище работает быстро - это API мешают делу
Последние десять лет я почти целиком провел в специализированной продуктовой компании, создавая высокопроизводительные системы ввода-вывода. У меня была возможность наблюдать за быстрым, решительным развитием...
Создание собственной симуляции активной материи на Python
Сегодня наша задача — создать симуляцию активной материи, т. е. роевое поведение. С помощью этой системы можно имитировать поведение стаи птиц или косяка рыб,...
Поддержание документации в актуальном состоянии с помощью Bit и GitHub
Написание документации для кода (будь то небольшая библиотека или полный набор микросервисов, взаимодействие с которыми необходимо другим разработчикам) — это занятие кропотливое и утомительное.
Основная...
В ожидании Java 16: Stream.toList() и другие методы преобразования
Только самообслуживание
В 2004 году я работал архитектором ПО на Java в крупной финансовой компании. На тот момент в этом языке отсутствовало большинство эффективных функциональностей...
Как на самом деле работает Git
В этой статье мы на реальном примере погрузимся во внутренние процессы Git. Если у вас еще не открыт терминал, то сделайте это, пристегните ремни...
Поиск утечек памяти с помощью автоматизированных тестов
Процесс управления памятью может стать фактором, весьма затрудняющим работу в приложениях iOS. В связи с этим нужно уделять пристальное внимание размещенным в памяти object...
Советы по модуляризации приложений Android
Создание модульных приложений/библиотек для Android дает целый ряд преимуществ, а процессу разработки следует уделять достаточно внимания. Перечень получаемых плюсов достаточно большой, перечислим лишь основные...
Работа с GitHub Actions на маркетплейсе
Поиск экшенов
Для этого есть два способа.
Непосредственно в маркетплейсе GitHub
В маркетплейсе размещается два вида инструментов для расширения основной функциональности GitHub:
Приложения.Экшены.
Для поиска экшенов в самом маркетплейсе...
7 Лучших курсов и книг по программированию на Rust для начинающих в 2021 году
Если вы хотите изучить в 2021 году язык программирования Rust и ищете какие-нибудь полезные ресурсы, например книги, руководства и онлайн-курсы, то эта статья специально...
8 частых ошибок в Android-разработке
Ошибка № 1: не учитывать, что всё должно быть на своих местах
Экосистема Android стремительно распространяется по всему миру. Вместе с этим растёт и сообщество, состоящее...
Набор инструментов Go для работы с микросервисами
REST и gRPC: идеальное сочетание
Микросервисы обычно работают на фреймворках HTTP и RPC, таких как REST и gRPC.
REST построен на основе объектно-ориентированного проектирования — подхода,...
Реализация GitHub Action в контейнере Docker
В предыдущей статье я подробно рассказала о сути GitHub Actions, архитектуре этого инструмента, о реализации потока событий через GitHub и создании собственного экшена с...
Clean Architecture в Android для начинающих
Даже до того, как я начал специализироваться на Android, меня, как разработчика, всегда восхищал хорошо структурированный, чистый и понятный в целом код.
“Задача архитектуры программного...
Насколько С++ быстрее Python
Есть миллион причин любить Python (особенно специалистам по данным). Но сильно ли он отличается от более профессиональных низкоуровневых языков программирования, таких как С или С++? Скорее всего, многие дата-специалисты или пользователи Python задавались этим вопросом или однажды задумаются об этом.
8 полезных на практике приёмов для веб-разработчиков
Как веб-разработчику, мне всегда приятно узнавать фишки, которые упрощают жизнь, особенно если их можно сразу же использовать на практике. Однако список таких приёмов бесконечен,...
Мутационное тестирование: создай мутанта и прокачай тест
Какая же проблема связана с модульными тестами? Дело в том, что можно написать их сколько душе угодно, и они даже пройдут, но это совсем...
9 Уровней применения функции zip в Python
Введение
В Python есть несколько встроенных функций, которые делают код очень элегантным. Одна из них — функция zip. Но начинающим не всегда бывает понятно, как...
Как создать масштабируемую архитектуру для крупных мобильных проектов
Принципы создания крупного масштабируемого проекта
Для начала определим нормы разработки крупного приложения:
Сокращение зависимостей. Любое изменение должно затрагивать как можно меньшее количество кода.Возможность повторного использования. Отдельные...
В гостях у GitHub Package Registry
Сервис управления пакетами GitHub Package Registry был разработан и представлен в середине 2019 компанией Microsoft. Его создание, наряду с приобретениями GitHub и NPM, говорит...
Функциональное программирование - будущее компьютерной науки?
Функциональное программирование (ФП) существует уже на протяжении последних шести десятилетий, и на данный момент не прекращает попыток преодолеть повсеместное доминирование объектно-ориентированного программирования (ООП). В...
Операционная система Android
Android — это операционная система с открытым исходным кодом, созданная для мобильных устройств на основе модифицированного ядра Linux. Эта ОС разработана консорциумом Open Handset...
Как настроить отдельные SSH-ключи для нескольких учётных записей GitLab
Перейдём сразу к делу. Допустим, у вас есть один GitLab для личных проектов и один для работы. Проблем не возникнет, пока не придётся работать...
Новый подход к пониманию RxJava
Реактивное программирование — очень важный способ написания чистого кода, а ReactiveX — одна из самых известных библиотек для асинхронной обработки последовательностей данных реактивным способом.
Для...
Докеризируем среду разработки в VS Code
Работая над последним проектом, я столкнулся с проблемой, которая заключалась в последовательном запуске проектов в нескольких ОС. Я потратил несколько недель, пытаясь исследовать файлы...
Как пользоваться Thread.sleep на JVM без блокировки
У таких языков JVM, как Java и Scala, есть возможность запускать параллельный код с помощью класса Thread. Потоки, как известно, сложны и подвержены ошибкам,...
Создание динамического кластера ECS с помощью Terraform
Цель этой статьи предоставить вам наглядные примеры и инструкции по разработке динамического модуля ECS (Elastic Container Service) с помощью Terraform. При этом предполагается наличие...
Создание простого клиента RabbitMQ с помощью Go
Как известно, Go — это язык программирования с открытым исходным кодом, позволяющий легко создавать простое, надёжное и эффективное программное обеспечение.
RabbitMQ представляет собой общедоступный программный...
Для чего нужен указатель в Си?
Указатель в Си — это переменная, содержащая адрес другой переменной. Сложность указателей заключается в понимании где и для чего они могут пригодиться.
Перед тем, как...
Быстрое перенаправление в приложение с AutoVerify
Сайты с множественной переадресацией и поддержкой диплинков
Представьте, что у вас есть сайт, к примеру, https://www.yoursite.com. Когда пользователь кликает по ссылке http://www.yoursite.com, где нет s...
Зачем и как реализовать ленивую загрузку компонентов в Angular
Ленивая загрузка — это техника загрузки чего-то по требованию.
Она применяется к различным уровням процесса разработки приложений — от модулей до компонентов. Ленивая загрузка на...
Rust или Си: кто Усэйн Болт в мире программирования?
Си — это сэнсэй черепашек-ниндзя
«Си — язык небезупречный, со странностями, но невероятно успешный». (Деннис Ритчи).
Си — это императивный язык программирования общего назначения и один...
Знакомьтесь, компонент Navigation в Android!
Что такое компонент Navigation?
Всем известно, что навигация между экранами является одним из фундаментальных принципов в приложениях Android. Как правило, мы осуществляем ее при помощи...
Разветвление на различные очереди SQS с помощью фильтрации сообщений SNS
SNS и SQS — сервисы AWS, которые часто находят применение в событийно-управляемой архитектуре. Сочетание этих сервисов дает возможность отправлять сообщения по разным каналам. Часто...
Строим собственный блокчейн на Python и разбираемся в его особенностях
Перед тем как начать строить блокчейн, необходимо понять его основы.
Блокчейн — это технология, используемая для записи и хранения данных. Например, он может содержать информацию...
Переоткрываем для себя эмулятор Android для ускорения тестирования
Нет смысла подслащивать пилюлю: UI-тесты на Android могут быть медленными, особенно если со временем у вас накопилось их много.
Итак, что же делать, когда у...
Основы работы с Git
В процессе разработки ПО значимая роль отводится сотрудничеству. В большинстве случаев деятельность разработчика включает работу в команде и совместное использование проекта с другими специалистами....
Избегаем исключения Null Pointer Exception в Java с помощью Optional
В 1964 году британский ученый-компьютерщик Тони Хоар изобрел ссылки на нулевые указатели (Null Pointer References).
Исключение Null Pointer Exception составляет львиную долю всех исключений, которые...
Подписки, чеки и StoreKit в iOS 14
Из всех способов получить деньги за работу, которую вы вкладываете в разработку приложений, лучшим на сегодняшний день является подписка. В статье я надеюсь рассмотреть...
Создаем юнит-тесты с помощью ИИ-инструмента
В этой статье мы воспользуемся плагином на базе искусственного интеллекта для IntelliJ, чтобы автоматически сгенерировать юнит-тесты.
Шаг 1. Установка плагина и импорт проекта
Плагин для IntelliJ IDEA...
Создание и отслеживание первого рабочего потока Github Actions
Github Actions — это собственное решение Github для CI/CD (непрерывной интеграции и непрерывного развёртывания ПО). Оно стало доступно сообществу разработчиков с момента запуска Github...
Rust: реализация двоичного дерева
Поскольку Rust приобрел довольно широкую известность и пополнил ряды своих преданных поклонников, я решил отложить в сторону любимый JS и заняться изучением нового языка....
Нативные, гибридные и web-приложения в сравнении
Итак, вы решили разработать для своего бизнеса приложение. Каков в этом случае следующий шаг?
С одной стороны, исследователи прогнозируют, что совокупная доходность мобильных приложений во...
Графовое моделирование данных на Java
Моделирование данных — это жизненно важная часть разработки ПО, а выбор подходящих структур данных или баз данных — основа успеха приложения или сервиса.
В этой...
Автоматизированное семантическое управление версиями с помощью GitVersion
При создании новых программных проектов или изменении уже существующих процессов всегда бывает сложно определить правильную стратегию управления версиями. Выбор стратегии ветвления, достижение консенсуса с...
Как создать бессерверное приложение с помощью AWS Chalice
Недавно я наткнулся на AWS Chalice и был очарован его простотой и удобством пользования.
AWS Chalice — это бессерверная платформа, которая позволяет создавать бессерверные приложения...
Элегантное ООП на Python
Сила Python в его гибкости. Это один из самых простых языков для объектно-ориентированного программирования. Иногда его даже критикуют за чрезмерную гибкость. Я покажу самый...
Чистая архитектура с MVVM
Для лучшего понимания чистой архитектуры давайте создадим примерный проект. Это приложение, на первой странице которого показывается список персонажей из мультсериала «Рик и Морти» с...
Дирижируйте горутинами с помощью каналов
Go получил известность во многом благодаря своему чистому и эффективному подходу к параллельному выполнению. С применением горутин можно добиться огромного повышения эффективности, выполняя несколько...
Используй git-команды, как senior developer
Как разработчику вам наверняка приходится ежедневно использовать Git. Базовым Git-командам посвящено уже много статей. В этой же статье речь пойдёт о git-командах для продвинутых:...
Что такое бессерверная платформа?
Понятие о бессерверной платформе
Бессерверная платформа помогает разрабатывать и развёртывать функции AWS Lambda вместе с необходимыми им инфраструктурными ресурсами AWS. Фактически это интерфейс командной строки,...
Когда параллелизм превосходит конкурентность
Скорее всего, для большинства из вас эти две концепции означают одно и то же, или же вы затрудняетесь объяснить, в чём между ними разница....
Опыт работы с Golang: путь проб и ошибок
В течение года мы разрабатывали сложную систему, функционирующую в режиме полуреального времени в производственной среде. Было принято решение написать ее на Golang. Поскольку опыт...
GitHub Actions: начало
Часть 1, Часть 2
В одной из последних статей я делала обзор GitHub Actions и показывала, как использовать существующий экшен для развертывания сайта Gatsby на...
Python: декоратор @retry
Python часто называют “склеивающим” языком. Для меня этот термин означает, что язык помогает соединять системы и обеспечивает передачу данных из A в B в...
Развертывание Gatsby-сайта с помощью GitHub Actions
Вот уже несколько недель, как я знакомлюсь с Gatsby. Пока что я перенесла на него свой старый блог с Jekyll и создала конвейер, непрерывно...
Микрооптимизации в Java. Enum - хороший, красивый и медленный
Перечисления — важная часть каждого приложения, которое представляет собой чуть больше, чем “Hello World”. Они повсюду. И, на самом деле, перечисления очень полезны: они...
Когда и зачем использовать оператор := в Python
Совсем недавно Python 3.8 представил оператор присвоения с двоеточием :=, аналогичный оператору присвоения =. Использование этого оператора позволяет ускорить и сократить код.
Эта нотация берёт своё...
Отображение превью камеры с помощью PreviewView
Расскажем, почему лучше использовать класс PreviewView для отображения превью в приложениях для камеры на Android.
Устранение неполадок в Kubernetes - стратегический подход
Работа с Kubernetes может серьезно озадачивать, особенно когда дело доходит до отладки и устранения сбоев. Основная сложность кроется в недостатке подробных сообщений об ошибках...
Знакомство с функциональным программированием в Python, JavaScript и Java
Функциональное программирование (ФП) представляет собой процесс создания ПО путем компоновки чистых функций. В современном мире работодатели ищут программистов, способных применять к решению задач различные...
Что такое SQL-атаки и как с ними бороться?
Давайте поговорим о наиболее опасной уязвимости, которая может присутствовать у вас в приложении — внедрение SQL-кода.
Внедрение SQL позволяет атакующему коду изменять структуру SQL-запросов приложения...
4 совета по работе с потоками и мьютексами в C++
C++ представляет собой отличный язык программирования, который принято ассоциировать с высокой производительностью, а также доступным управлением памятью и указателями. Тем не менее в нем...
5 ключевых понятий Python и их магические методы
Введение
Когда дело касается именования функций в Python, мы вольны использовать нижние подчеркивания, наряду с буквами и числами. Символы подчеркивания между словами особой роли не...
Go на пороге третьего десятилетия 21 века: язык программирования для искусственного интеллекта и науки...
Python появился 30 лет назад, но только через 20 лет получил признание разработчиков. Он колоссально вырос за это время, особенно за последние пять лет...
Обработка ошибок в Go
Обработка ошибок в Go постоянно вызывает споры и возникает среди тем ежегодного опроса о сложнейших проблемах, с которыми встречаются разработчики, пишущие на этом языке....
Функциональные возможности систем типов Julia и Rust
Я твёрдо убеждён, и многие со мной в этом согласятся, что прекрасным началом разработки программы является выявление подходящих представлений реальной проблемы, которую мы пытаемся...
Обновления в Android 11: Scoped Storage и другие улучшения конфиденциальности
Все последние улучшения в Android на уровне ОС касаются защиты приложений и пользовательских данных, а также более упорядоченного предоставления доступа. Несмотря на преимущества изменений,...
Основы многопоточности
Вкратце знакомимся с понятием и принципами работы многопоточности, а также наглядно убеждаемся в преимуществах ее применения.
5 основных фреймворков для Java-разработчиков
Приветствую вас, Java-разработчики! Размышляете над тем, какой фреймворк освоить, чтобы стать полноценным специалистом? Спешу вас обрадовать — это как раз тема данной статьи. Как-то...
Аннотации для параллелизма в Java: расцвечивание потоков
В Miro мы постоянно стараемся улучшить поддерживаемость нашего кода, применяя общепринятые практики, в том числе в вопросах многопоточности. Это не решает всех проблем, возникающих...
Fake-объекты практичнее mock-объектов
Стоит помнить — если вы имеете дело с неудачно разработанным API, предпочтительнее использовать mock-объекты.
Пример кода.
Что такое mock- и fake-объекты
Определения можно найти во множестве статей...
Как развернуть пакет Cython в PyPI
Для меня это оказалось довольно трудно, и я подумал, что неплохо было бы поделиться своим опытом в статье.
Структура проекта
Вот файловая структура, которую мы будем...
Не используйте оператор «+» для объединения строк в Python
Когда я только начал работать с Python, интуитивно стал использовать оператор + для объединения строк, как в Java и многих других языках программирования.
Однако вскоре...
Жизненный цикл потока в Java
Эта статья направлена на объяснение различных состояний потока в мире Java. Если вы новичок в области многопоточного программирования, попробуйте сначала почитать про потоки что-нибудь...
Выполнение AES/GCM в Android
Столкнувшись с рядом проблем, связанных с выполнением шифрования и расшифровки AES в Android, я решил поделиться своим опытом.
TL;DR: здесь можно найти готовое решение. Если...
Регулярные выражения для извлечения информации о расходах из текстового файла
Паттерны регулярных выражений (ReGex) выглядят как какая-то ерунда и все же являются мощным инструментом для извлечения информации из текста. Куча, казалось бы, случайных знаков...
RxPermissions: простой способ управления разрешениями в Android M
Давайте узнаем, как можно с легкостью настроить управление потоком разрешений с помощью всего нескольких строк кода.
С того времени, как в качестве меры безопасности был...
Создаем краткое содержание текста с помощью Python без NLP
Существует много библиотек NLP, например Natural Language Toolkit (NLTK), TextBlob, CoreNLP, Gensim, и spaCy. Также есть множество способов обобщения текстов — покажу самый простой,...
Поддержка новых форм-факторов с помощью новой библиотеки Jetpack WindowManager
WindowManager — это недавнее дополнение к Android Jetpack, которое призвано помочь разработчикам приложений поддерживать новые форм-факторы устройств и обеспечить общее API для различных функций Window Manager...
Считаете, что Python лучше всех? Просто вы не имели дело с Rust
“Технологии прошлого спасут будущее от себя самого”, — так Грэйдон Хор, создатель Rust, пояснял, чего хотел достичь.
Одна их ключевых черт Rust — использование технологий, хорошо знакомых академической среде,...
Генерируем образы Docker с помощью Spring Boot
Почему контейнеры?
В мире, где пользователи обращаются к приложениям, способным возвращать данные за считанные миллисекунды, есть единственный в своем роде инструмент, который любая компания стремится...
Сравнение Go и Rust через написание CLI-инструмента
В этой статье я описал свой увлекательный опыт создания небольшого CLI-приложения на двух малознакомых мне языках — Go и Rust.
Если вы предпочитаете сразу перейти к самому...
Учимся избегать null-значений в современном Java. Часть 2
Предыдущая часть: Часть 1
В предыдущей статье мы разобрали, почему в некоторых случаях null оказывается необходимым злом, а также узнали, что есть правильные и ошибочные...
Учимся избегать null-значений в современном Java. Часть 1
Null. Правила использования
В своем выступлении “Null References: The billion dollar mistake” (“Нулевые ссылки: ошибка на миллиард долларов”), Тони Хоар описывает реализацию нулевых ссылок в...
Что выбрать: React Native, Flutter или нативный подход
Важнейшая проблема кроссплатформенной разработки решалась в мобильных фреймворках разными способами. Первоначально проект Apache Cordova (ранее PhoneGap) решил эту проблему внедрением webview-рендеринга. Затем в проекте...
JAVA: разница между параметрами JVM -D, -X, -XX
Разберемся, когда применяются эти опции и чем отличаются. Изучим основные их категории и способы поиска различных элементов конфигурации, поддерживаемых виртуальной машиной Java.
Считаете, что Python лучше всех? Просто вы не имели дело с Rust
“Технологии прошлого спасут будущее от себя самого”, — так Грэйдон Хор, создатель Rust, пояснял, чего хотел достичь.
Одна их ключевых черт Rust — использование технологий, хорошо знакомых академической среде,...
Экспериментируем с пользовательскими функциями JavaScript на Trino
Как было бы здорово адаптировать Javascript к данным, а не приспосабливать данные к JavaScript. Что если создать простой коннектор Trino для выполнения произвольного Javascript на всей области данных? Действительно ли это хорошая идея? Выясним это вместе!
6 советов, как улучшить работу UX-дизайнера
За последнее время я помогла многим друзьям найти свое место в области дизайна пользовательского опыта. В ходе наших бесед, я вспомнила, как 10 лет...