Программисты делятся своими знаниями!

Каждый месяц мы делимся тем, что узнали в нашей команде. В ноябре Марчин, Михал, Павел и Томаш обнаружили:

  • CSS Grid — более декларативный и простой в управлении адаптивный подход к макетам;
  • как улучшить безопасность образов Docker с помощью Trivy;
  • советы и рекомендации по параллельной обработке в Python;
  • Notion — новичок в области продуктивности.

CSS Grid: области шаблонов для декларативных макетов, автор: Марчин Бараниецкий

Сетка — это последнее дополнение к системам компоновки, доступным в CSS. Это также самый мощный способ структурирования элементов, работающий одновременно в двух измерениях (в отличие от flexbox, который работает в основном в одном выбранном измерении).

Основным принципом Grid является идея строк и столбцов, охватывающих контейнер и определяющих «дорожки», которые могут быть заняты элементами по горизонтали или по вертикали. Макет можно определить императивно, используя такие свойства, как grid-template-rows, grid-template-columns (для контейнера сетки) и grid-column, grid-row (для элементов).

Однако существует другой подход, более декларативный по своей природе и, на мой взгляд, более простой в управлении, особенно с адаптивными макетами. Идея сосредоточена вокруг двух свойств CSS: grid-template-areas для контейнера и grid-area для элементов. Используйте первое, чтобы визуально описать — почти «рисовать» (текстом) — как вы хотите, чтобы ваши именованные элементы были структурированы в контейнере, а затем ссылайтесь на эти имена с помощью второго.

Вот пример:

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

Более того, очень легко быстро объявить желаемый макет, например. мобильные устройства. Давайте сохраним все элементы в одном столбце — единственное свойство, которое должно измениться, — это текстовое объявление свойства grid-template-areas:

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

Подводя итог: области шаблона сетки позволяют декларативно определить желаемую компоновку, практически «рисуя» структуру текстом. Более того, достаточно изменить только одно свойство, а именно grid-template-areas, чтобы полностью изменить порядок, ширину, высоту — в общем, всю структуру элементов на странице.

Безопасность образов Docker и Trivy, Михал Матлока

Безопасность в последнее время является одной из самых важных тем. В то же время широко используются контейнерные системы Docker. К сожалению, базовые образы часто содержат уязвимости. Как это проверить? Одним из полезных инструментов является Trivy от Aqua Security. Это простой сканер командной строки, который позволяет вам проверить, есть ли какие-либо проблемы с заданными образами Docker. Достаточно установить инструмент и выполнить простую команду trivy image <image-name>. Его можно интегрировать в ваш поток CI.

Каковы результаты? Давайте взглянем на мир JVM. openjdk:11-jre — это официальный образ OpenJDK. Он основан на Debian 10.6, и Trivy находит в нем 161 уязвимость, в том числе 26 с высокой степенью серьезности. Почему так много? Образ содержит множество инструментов, которые на самом деле не нужны большинству приложений во время выполнения, а также некоторые устаревшие пакеты. Итак, что вы можете сделать в такой ситуации? Ну и проще всего сменить базовый образ на другой. Проект AdoptOpenJDK выпускает собственные образы, т.е. adoptopenjdk/openjdk11:alpine-jre — на основе alpine 3.12.1. Согласно Trivy, он содержит 2 уязвимости средней степени опасности (обнаруженные недавно). Более того, этот образ имеет размер 150 МБ, тогда как официальный образ на основе Debian имеет размер 285 МБ.

Стоит проверить, что входит в базовые образы, которые вы используете в своих проектах. Если вы заинтересованы в безопасности Docker, вы также можете взглянуть на Distroless Docker Images.

Параллельная обработка в Python, Павел Ставицкий

Во многих языках мы используем многопроцессорность. В языках JVM, таких как Java или Scala, обычно это достигается за счет запуска множества потоков. Однако в Python популярным инструментом является multiprocessing.Pool, который делает еще один шаг. Он запускает несколько процессов. По умолчанию (в Linux) он создает новые процессы по fork(), что копирует состояние в новый процесс. Важно отметить, что все состояние, доступное дочерним процессам, является копией, поэтому его изменение не меняет состояние родительского процесса.

Pool имеет несколько методов для параллельного запуска задач. Очевидно, что эти задачи не могут изменить состояние родителя, но могут возвращать значения, так что это также поощряет использование чистых функций ;)

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

  • map — простая функция, запускающая подзадачи в отдельных процессах и возвращающая значение. Его параметры представляют собой функцию с одним параметром для запуска и список аргументов, каждый из которых передается в отдельный вызов функции. Пример:
  • starmap — как карта, но может использоваться для функций со многими параметрами. Каждый набор параметров передается как кортеж:
  • imap — как карта, параметры те же, но метод ленивый. Он возвращает итератор вместо коллекции, и вычисление не запускается до тех пор, пока next() не будет вызвано на итераторе (ну, когда chunksize установлено в 1, но такие детали выходят за рамки этого краткого обзора).
  • imap_unordered — как следует из названия, когда порядок результатов не имеет значения.
  • map_async и starmap_async — как map и starmap (сюрприз-сюрприз ;) ), но возвращаются немедленно, пока дочерние процессы все еще работают в фоновом режиме. Их возвращаемый тип — AsyncResult (см. документацию).

Будьте осторожны при использовании многопроцессорной обработки в Windows или Mac. В этих системах многопроцессорная обработка использует не fork() для создания новых процессов, а spawn(), который фактически импортирует модуль в процесс при его создании. Когда это будет сделано, запустится код в основном файле модулей. Это может вызвать проблемы, но этого легко избежать — поместите весь код в основной файл модулей под if __name__ == “__main__”.

Notion — новый крутой парень в блоке продуктивности от Томаша Лучака

Notion — инструмент для совместной работы. Впервые он был выпущен в марте 2016 года. В сентябре 2019 года он достиг 1 миллиона пользователей. Всего через 7 месяцев Notion достиг 4 миллионов пользователей при оценке компании в 2 миллиарда долларов. Можно задаться вопросом, что делает Notion таким популярным.

Notion утверждает, что это универсальное рабочее пространство. Его можно использовать в качестве: командной вики, менеджера проектов, диспетчера задач или ведения заметок. Это действительно зависит от потребностей человека. Notion — это очень гибкий инструмент, который позволяет людям создавать свои собственные индивидуальные системы продуктивности жизни/бизнеса, не зная, как программировать.

Понятийный подход основан на двух строительных блоках: страницах и блоках. Страница состоит из множества блоков. Блокировать можно что угодно: форматированный текст, встроенный клип YouTube, карты Google и… базу данных. База данных — это страница с записями, где каждая строка — это другая страница с некоторыми специфическими свойствами, представленными в виде таблицы. Что еще интереснее, базы данных могут быть представлены во многих формах: таблица, канбан-доска, временная шкала, календарь, список или галерея, как целая страница или встроенная на другой странице, записи можно фильтровать по свойствам. Такой подход открывает практически безграничные возможности.
Notion особенно любят ютуберы. Существует масса материалов вроде «Как я работаю с Notion», «Моя настройка notion» и т. д.:

Как это может показаться очень привлекательным, это не все розы — есть некоторые предостережения.

  1. Во-первых, Notion имеет очень ограниченный автономный режим. При загрузке страницы можно работать с ней в автономном режиме, а после переподключения все должно синхронизироваться обратно. «Должен» здесь ключевое слово. Сообщалось о проблемах с этим сценарием.
  2. Другое дело, что веб-клиппер Notion не так хорош, как тот, который мы знаем из Evernote.
  3. Также для Notion доступен публичный API — вы не можете создавать автоматизацию на основе Notion, как в Coda.
  4. И последнее: требуется много усилий, чтобы настроить Notion так, чтобы он работал на вас, но, по крайней мере, вы можете.

В целом, Notion — это инструмент, на который стоит обратить внимание, и его популярность возникла не на пустом месте.

Что нового вы узнали в ноябре? Дайте нам знать! :)

Кстати, мы всегда ищем выдающихся профессионалов в нашу команду!

Questions? Ask us anything about remote work, how does the cooperation with us look like, what projects do we have, or about anything else - on the dedicated Slack channel 💡