Как запустить свой DS/ML/AI/Tech блог с минимумом сложностей связанных с хостингом и деплойем этого блога. В конце февраля 2020 года ребята из fast.ai представили миру fastpages — платформу для ведения блога. Отмечу, что fastpages основан на Jekyll, о котором на Хабре есть множество постов. Примером блога на движке fastpages является данный блог. Главное отличительная черта и преимущество fastpages состоит в поддерживаемых из коробки форматах постов: Таким образом, автору блога необходимо сохранить пост в любом из перечисленных выше форматах в соответствующей директории: А все остальное сделает fastpages, как утверждают его авторы. fastpages использует Github Pages для хостинга и Github Actions для автоматизации публикации постов. Как я понимаю, fastpages является доработкой связки Github Pages + Jekyll, где можно сразу же из Jupyter ноутбука получить опубликованный пост. Если хотите самостоятельно разобраться, то вот официальная инструкция по настройке в репозитории fastpages. Процесс настройки fastpages: Есть возможность для персонализированной конфигурации вашего блога. Параметры конфигурации находятся в файле ./_config.yml, некоторые из них приведены ниже: title — название вашего блога, которое отображается в верхнем левом углу на каждой странице; description — описание, которое будет отображаться в разных местах при предварительном просмотре вашего сайта (например, в социальных сетях); github_username — позволяет вашему сайту отображать ссылку на вашу страницу GitHub в нижнем колонтитуле; github_repo — позволяет вашему сайту отображать ссылки на ваш репозиторий для различных функций, таких как ссылки на GitHub, Google Colab и Binder для Jupyter ноутбуков; default_badges — по умолчанию ссылки GitHub, Google Colab и Binder будут отображаться в постах созданных из Jupyter ноутбуков. Вы можете задать, какие из них будут отображаться по умолчанию, установив для соответствующего значения в default_badges значение true или false. Например, если вы хотите отключить ссылки на Binder, вы должны поправить default_badges: url — это не нужно менять, если у вас нет собственного домена; baseurl — см. комментарии в /_config.yml для получения инструкций ("Special Instructions for baseurl"). Если у вас нет настраиваемого домена, вы можете игнорировать эту опцию; twitter_username — создает ссылку в нижнем колонтитуле на страницу Twitter; use_math — установите значение true, чтобы получить поддержку математических формул LaTeX; show_description — отображает на домашней странице описание под заголовком ваших постов в блоге. По умолчанию установлено значение true; google_analytics — опционально можно использовать идентификатор Google Analytics; pagination — максимальное количество постов, отображаемых на каждой странице вашей домашней страницы. Значение по умолчанию равно 15. Когда число постов превысит заданное значение, тогда произойдет разбивка на страницы, которая выглядит так:
 show_tags — включает отображение тегов внутри постов, которые выглядят следующим образом:

 show_image — при значении true включается возможность добавления изображений к постам на домашней странице. Выглядит следующим образом (первые 2 поста сопровождаются изображениями):

 Хочу заранее предупредить, что ряд вещей не могут быть отображены в посте на Хабре, поэтому я добавил их как изображения и гифки. Для того чтобы полностью оценить то, как выглядят эти элементы, советую посмотреть пост в моем блоге, созданном на движке fastpages. Первая ячейка в вашем Jupyter ноутбуке (а также первые строки в Markdown файлах) содержит метаданные, которые могут включать/выключать опции связанные с постом. Для указания таких в Markdown файлах необходимо в начале файла задать опции как и в ноутбуке, только поместив эти метаданные между строк содержащих по три минуса, т.е. ---. Выглядит это так: Все, что определено в начале поста, должно соответствовать YAML разметке. Поэтому если вы хотите использовать двоеточие в заголовке, вы должны экранировать его двойными кавычками: - title: "Deep learning: A tutorial" Для большего понимания советую ознакомиться с туториалом по YAML. Перечень управляющих конструкций для форматирования поста (взято отсюда): Приятной функциональностью этого движка для блога является возможность скрывать код и/или результаты его выполнения. Это позволяет не нагружать посты отображением простыни кода или огромного количество принтов (что бывает при обучении нейросетей по эпохам), скрывая эти большие по размеру элементы, но не выкидывая их из поста на совсем. Ниже приведены управляющие конструкции, которые задаются в первой строке ячейки в Jupyter ноутбука. Как это выглядит, можно посмотреть в моем посте. Графики построенные с помощью библиотеки Altair внутри поста остаются интерактивными как в ноутбуке. Для проверки интерактивности опять же см. мой пост.

 Таблицы в опубликованных постах отображаются примерно как и в Jupyter ноутбуках.
 Вы можете добавлять изображения с подписями следующим образом: Результат выглядит так:
 Напомню, что подписи опциональны, и что изображения можно указывать как локально (в рамках репозитория блога), так и находящиеся в открытом доступе (имею в виду интернет). Гифки вставляются как изображения и полноценно отображаются в постах.  Чтобы красиво вставить видео с Youtube достаточно использовать конструкцию: Есть возможность отображать посты из Twitter. Например, ссылка на этот пост  отобразит следующее:
 Jupyter ноутбуки поддерживают синтаксис LaTeX формул. Чтобы формулы отображались в постах, нужно убедиться, что опция use_math включена внутри _config.yml (см. Настройка блога). Следующий LaTeX код: будет отображен таким образом:    Есть возможность отображать примечания различных типов. Предупреждение: > Warning: There will be no second warning!


Важно: > Important: Pay attention! It's important.


Подсказка: > Tip: This is my tip.


Заметка: > Note: Take note of this.

 Если вставить в любое из примечаний ссылку, то она будет работать.
Например,  отобразится так:
 Если написать  то получится:
Сейчас будет эмоджи :robot:. Шпаргалка по Emoji. В jupyter ноутбуках можно использовать сноски, однако синтаксис отличается от Markdown разметки. Это руководство содержит более подробную информацию об этом синтаксисе, который выглядит следующим образом:  Для этого fastpages использует nbdev для преобразования jupyter ноутбуков, word и .md файлов в посты блога. После того, как вы сохраните исходные файлы своих постов в папках /_notebooks, /_word или /_posts, то GitHub Actions c помощью nbdev автоматически преобразует их в конечный вид, в котором посты отображаются на сайте вашего блога. Стоит упомянуть, что ранее fast.ai выпустили аналогичный проект под названием fast_template, который еще проще в настройке, но не поддерживает автоматическое создание постов из Word и Jupyter файлов, а также многие другие функции перечисленные выше. Поскольку fastpages более гибок и расширяем, его авторы рекомендуют использовать его там, где это возможно. Авторы предполагают, что fast_template может быть лучшим вариантом для тех, кто ведет не технические блоги. В этом случае посты можно создавать только с помощью встроенного онлайн-редактора Github, не заморачиваясь с использованием git. Команда fast.ai предложили DS сообществу интересный и достаточно функциональный инструмент для ведения блога, автору которого остается думать только о том, какой контент публиковать. Сложность использования практически минимальная, нужны базовые знания git, разметки Markdown и Jupyter Notebook. И никаких проблем с тем, как и где хостить и деплоить сам блог. Конечно, есть определенные пожелания по поводу функционала этого движка, для этого можно участвовать в развитии проекта, находя баги или предлагая те или иные улучшения. В последнем случае даже pull request не обязателен, порой хватает текстового описание тех или иных желаний пользователей. В заключение хочу сказать, что сам пользуюсь и всем советую.