Преобразование строки с датой и временем в нативный объект Date

Разбор строки с датой и временем в JavaScript — задача нетривиальная. Поведение браузера при разных форматах записи не определено. Некоторые браузеры пытаются угадать формат, в то время как другие возвращают значение NaN. Конечно, есть специализированные библиотеки наподобие Day.js или Moment.js, но они нацелены на решение более широкого круга задач, тогда как иногда, условно говоря, достаточно одной функции из большой библиотеки.

Читать дальше

Сокращенные URL для модельных объектов в Django

Требуется, чтобы URL вида https://example.com/projects/last_year/jane/great-finance-2020/ открывался по адресу наподобие https://example.com/4xct4/ (с перенаправлением), без хранения идентификатора сокращения, т. е. с декодированием по алгоритму.

Читать дальше

Ограничение входа в Django Admin по IP-адресу (middleware)

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

Читать дальше

Скриншоты с помощью Headless Chrome и Puppeteer

Я люблю Headless Chrome за скорость работы, оптимальный расход памяти и возможность установки на «голый» Linux-сервер.

Один из способов использовать API Headless Chrome — инструмент Puppeteer. Он предоставляет простой интерфейс программирования, который закрывает широкий круг задач, в том числе создание скриншотов.

Читать дальше

Русская языковая локаль в docker-контейнере с Alpine

К сожалению, система локали в musl libc неполная. В Alpine нет инструментов для генерации локалей или настройки переменной MUSL_LOCPATH. По этой причине приходится искать варианты. Один из них предлагает проект локализации musl libc под названием rilian-la-te. На данный момент поддерживается 7 локалей, в том числе: ch_DE, de_CH, de_DE, en_GB, en_US, fr_FR и ru_RU.

Читать дальше

Как обновить объекты внутри массива JSONB с помощью PostgreSQL

Допустим, вы решили сохранить данные в базе данных в виде JSON или JSONB и обнаружили, что только что создали себе новые проблемы. Вы в этом не одиноки.

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

В этой статье мы рассмотрим, как обновить конкретное значение объекта внутри массива одним запросом.

Читать дальше

Три действенных совета о том, как избежать заброшенных, незаконченных проектов

Почему «замороженный проект» — невероятно распространенное явление? Мы все придумали прекрасные идеи, а затем с азартом потратили часы на написание / программирование / планирование / отчетность / {вставьте глагол, относящийся к завершению проекта}, только чтобы усомниться в собственных силах, потерять мотивацию, или просто передумали, и по какой-то причине закрадывается чувство слабости. Что может очень деморализировать.

Читать дальше

Как быстро удалить большие файлы, пароли или личные данные из истории Git?

Как очистить историю Git, если вы допустил ошибку, передав большие файлы в репозиторий, который теперь начинает расти в геометрической прогрессии? А что если произошла утечка конфиденциальных данных? Очевидно, что файлы не могут быть легко удалены из репозитория. Нельзя просто зайти в хранилище, отметить ненужное и нажать <delete>

Читать дальше

Локальный LRU-кэш

Разделяемое состояние, если оно обладает признаками изменяемости, должно настоятельно нуждаться в ошибке, такова общепризнанная истина.

— с извинениями к Джейн Остин

Как учили нас г-жа Остин и Хенрик Айхенхардт, разделяемое изменяемое состояние является корнем всего зла. Тем не менее, официальная документация functools предлагает нам писать код наподобие следующего…

Читать дальше

Использование реверсного SSH для загрузки файлов с удаленной машины на локальную

Работая с некоторым файлом на удаленном сервере, может понадобится загрузить его на локальную машину (например, лог, бэкап или файл конфигурации). Это легко сделать, если открыть обратный SSH-порт в соединении с сервером.

Читать дальше

Параллельные вычисления в Python с Dask

Структуры данных в NumPy и Pandas основополагающие, но они ограничены размером ОЗУ и одним ядром процессора. Dask позволяет производить параллельные вычисления на данных, размер которых превышает доступный объем памяти, на нескольких ядрах или нескольких машинах. Можно даже сконфигурировать Dask для использования ресурсов тысячи машин — каждой с несколькими ядрами.

Читать дальше

Что нужно знать о логировании в Docker перед запуском проекта в продакшен

Экспериментировать — с Docker в небольших проектах, конечно, увлекательно, но перенос приложения в продакшен сопряжен с рядом важных задач. Что вам точно понадобится — логирование. Здесь не без подводных камней…

Читать дальше

Ежедневный бэкап Postgres и медиафайлов Django из Docker-контейнеров

Скриптами бэкапов никого не удивить, но даже в этой понятной задаче есть нюансы, которые от проекта к проекту важно не забывать. Делюсь решением для Django-приложения, работающего в среде Docker.

Особенности скрипта:

  • Получает сжатый дамп Postgres и GZIP-архив медиафайлов Django из запущенных контейнеров.
  • Вычищает устаревшие бэкапы по метке проекта.
  • Сохраняет только успешно сформированные бэкапы.
Читать дальше

Контрольный список для DevOps и инженеров, обеспечивающих бесперебойную работу систем

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

Читать дальше

Использование DNS-резольвера Docker в nginx для балансировки нагрузки между контейнерами

Если использовать nginx в качестве проксирующего фронтенда к контейнерам с бэкендом, возникает вопрос, как распределять равномерно запросы к ним. Нельзя просто так определить блок upstream, т. к. контейнеры создаются динамически docker-compose, мы не знаем, сколько и какие будут IP.

Читать дальше

Вычисление расстояния Левенштейна с использованием массивов NumPy

Сколько правок необходимо внести в одно слово, чтобы получить другое? Чем меньше правок нужно сделать, тем выше уровень сходства. В этой статье рассмотрим вариант вычисления расстояния Левенштейна — метрики для измерения разности между двумя строками.

Читать дальше