Хотел поделиться впечатлениями о работе с генератором статических сайтов Hugo (за последние пару лет, так скажем).
Что вообще генератор статических сайтов (static site generator, SSG)? Это фреймворк, который позволяет создать одну или несколько "базовых страниц" (layouts) на html/css/js, а также определённое количество материалов (например, статей в блоге), которые обычно написаны на markdown (что-то типа представлений в Rails или других фреймворках), иногда со вставками на html. Такие материалы может создавать и человек, не знакомый с программированием, что довольно удобно. Далее запуск специальной команды SSG собирает из этих "кирпичиков" набор обычных страниц html, которые можно разместить на любом хостинге - например, на firebase (в моём случае это было бесплатно).
Изначально стандартом де-факто для SSG был Jekyll, написанный на Ruby - собственно, GitHub Pages до сих пор его использует. Это хороший фреймворк, но не слишком шустрый, если нужно генерировать множество страниц. Поэтому для последнего проекта я решил задействовать Hugo, написанный на Go https://gohugo.io/, и в целом остался доволен. В Hugo используются все те же концепции, что и в Jekyll, но вот генерация страниц (и перезагрузка "на лету") происходит значительно быстрее, что не может не радовать. В общем, если вам потребуется сделать не слишком сложный проект в духе блога, сайта-визитки, информационного ресурса, то очень советую Hugo.
Кстати, насколько мне известно, блог известного сайта Sitepoint, например, теперь тоже полностью переведён на Hugo. Возможно, в будущем сделаю серию видео по этой технологии, так как тема действительно довольно интересная. P.S. Был также опыт работы с Hexo, но он показался сыроватым, во всяком случае год назад. Да и документации на английском маловато, так как изначально это китайская поделка. Если у кого-то был опыт работы с другими SSG - поделитесь, интересно 🙌
Что вообще генератор статических сайтов (static site generator, SSG)? Это фреймворк, который позволяет создать одну или несколько "базовых страниц" (layouts) на html/css/js, а также определённое количество материалов (например, статей в блоге), которые обычно написаны на markdown (что-то типа представлений в Rails или других фреймворках), иногда со вставками на html. Такие материалы может создавать и человек, не знакомый с программированием, что довольно удобно. Далее запуск специальной команды SSG собирает из этих "кирпичиков" набор обычных страниц html, которые можно разместить на любом хостинге - например, на firebase (в моём случае это было бесплатно).
Изначально стандартом де-факто для SSG был Jekyll, написанный на Ruby - собственно, GitHub Pages до сих пор его использует. Это хороший фреймворк, но не слишком шустрый, если нужно генерировать множество страниц. Поэтому для последнего проекта я решил задействовать Hugo, написанный на Go https://gohugo.io/, и в целом остался доволен. В Hugo используются все те же концепции, что и в Jekyll, но вот генерация страниц (и перезагрузка "на лету") происходит значительно быстрее, что не может не радовать. В общем, если вам потребуется сделать не слишком сложный проект в духе блога, сайта-визитки, информационного ресурса, то очень советую Hugo.
Кстати, насколько мне известно, блог известного сайта Sitepoint, например, теперь тоже полностью переведён на Hugo. Возможно, в будущем сделаю серию видео по этой технологии, так как тема действительно довольно интересная. P.S. Был также опыт работы с Hexo, но он показался сыроватым, во всяком случае год назад. Да и документации на английском маловато, так как изначально это китайская поделка. Если у кого-то был опыт работы с другими SSG - поделитесь, интересно 🙌
gohugo.io
The world's fastest framework for building websites
Hugo is one of the most popular open-source static site generators. With its amazing speed and flexibility, Hugo makes building websites fun again.
В этом видео мы узнаем, чем prepend в языке Ruby отличается от include, а также зачем нужен class_exec/class_eval, instance_exec/instance_eval и eval. https://www.youtube.com/watch?v=lqAIpoNOpBc
YouTube
Секреты классов Ruby | Семейство exec/eval и prepend
В этом видео мы узнаем, чем prepend в языке Ruby отличается от include, а также зачем нужен class_exec/class_eval, instance_exec/instance_eval и eval.
Таймкоды:
00:00 Введение
00:15 Что такое prepend и в чём отличие от include?
03:56 Class_exec и class_eval…
Таймкоды:
00:00 Введение
00:15 Что такое prepend и в чём отличие от include?
03:56 Class_exec и class_eval…
А вы знали, что на Ruby можно писать игры, причём сравнительно сложные? 🎮 Конечно, этот язык не подходит для того, чтобы создать игру уровня Ведьмак 3 или хотя бы такую, в которой можно играть за стражу дворца или эльфов, грабить корованы и набигать (палец вверх, если помнишь этот мем). Однако создать двухмерную бродилку или какой-нибудь квиз вполне реально. Для этого можно использовать MiniGL - библиотеку, которая в свою очередь построена на Gosu (более низкоуровневое решение) https://github.com/victords/minigl Например, один товарищ заморочился так, что написал аналог Super Mario Bros с возможностью сохраняться и даже редактировать уровни (правда, по его словам, ушло на это больше двух лет) https://github.com/victords/super-bombinhas Тема разработки игры на Ruby предложена уже давно и я очень надеюсь, что смогу посвятить ей время в ближайшую неделю, тем более, что первые наработки уже готовы. Пусть это и будет, в основном, развлекательный проект 😃
GitHub
GitHub - victords/minigl: A minimal Game Library built on top of the Gosu gem.
A minimal Game Library built on top of the Gosu gem. - GitHub - victords/minigl: A minimal Game Library built on top of the Gosu gem.
Chartkick - это, пожалуй, лучшее решение для построения графиков в приложении RoR https://github.com/ankane/chartkick Пробовал использовать это решение сам в двух проектах и остался очень доволен. Кстати, в своё время мне даже довелось написать пару руководств по теме https://www.sitepoint.com/make-easy-graphs-and-charts-on-rails-with-chartkick/ (основы) и https://www.sitepoint.com/graphs-on-rails-chartkick-in-practice/ (более детальные примеры)
GitHub
GitHub - ankane/chartkick: Create beautiful JavaScript charts with one line of Ruby
Create beautiful JavaScript charts with one line of Ruby - ankane/chartkick
Создание разметки для e-mail - это не самый приятный процесс, так как существует множество ограничений и неочевидных моментов. Однако фреймворк MJML позволяет сделать этот процесс куда проще. Я использовал это решение в паре проектов и скажу честно: времени экономится весьма прилично. https://mjml.io/
mjml.io
MJML - The Responsive Email Framework
The only framework that makes responsive email easy. MJML is a markup language designed to reduce the pain of coding a responsive email.
Некоторое время назад мой коллега и я давали интервью для журнала BuiltIn, и оно наконец-то вышло. https://builtin.com/software-engineering-perspectives/website-localization Здесь мы отвечаем на некоторые общие вопросы, связанные с переводом приложений (неважно, каких) на разные языки 🤓
Built In
4 Top Website Localization Preparation Tips You Should Know | Built In
Ideally, you should start during the initial design phase.
PaperTrail - это классное решение для отслеживания изменений в моделях. С его помощью можно хранить множество версий одной и той же записи и даже переключаться между этими версиями https://github.com/paper-trail-gem/paper_trail
GitHub
GitHub - paper-trail-gem/paper_trail: Track changes to your rails models
Track changes to your rails models. Contribute to paper-trail-gem/paper_trail development by creating an account on GitHub.
Продолжаем наши уроки по Ruby on Rails 6! Сегодня поговорим о том, что такое CRUD (спойлер: create, read, update, delete) и узнаем, как позволить пользователю создавать, модифицировать и удалять данные. Также обсудим маршруты и немного затронем partials (частичные представления). https://youtu.be/5ntK2ssu1Ro
YouTube
Ruby on Rails 6/7, урок #3 | CRUD: создание, чтение, обновление, удаление
Продолжаем наши уроки по Ruby on Rails 6/7! Сегодня поговорим о том, что такое CRUD (спойлер: create, read, update, delete) и узнаем, как позволить пользователю создавать, модифицировать и удалять данные. Также обсудим маршруты и немного затронем partials…
Всем привет! Если кто-то вдруг не слышал о решении Ransack, то самое время взять его на вооружение :) Данный gem позволяет создавать сложные формы поиска и определять разнообразные критерии . Это значительно проще, чем писать всю логику самостоятельно! https://github.com/activerecord-hackery/ransack
GitHub
GitHub - activerecord-hackery/ransack: Object-based searching.
Object-based searching. . Contribute to activerecord-hackery/ransack development by creating an account on GitHub.
Всем неспящим посвящается :) Забавно, что этот трек я написал почти ровно год назад. Казалось бы, прошло совсем немного времени, а столько нового произошло. https://www.youtube.com/watch?v=AOO8BRJiVsM
YouTube
Ravens Die Laughing - Cold Rain
Darkwave, electronic, ambient
Пока новое видео готовится к выходу (а выходит оно завтра), немного юмора: gem для написания "вежливого" кода на Ruby в канадском стиле (ведь, как все знают, канадцы - самые вежливые люди в мире, в чём и я лично сумел убедиться). Кстати, обратите внимание на исходный код этого решения - он совсем короткий и написан неидеально, но там есть интересные подходы, связанные с метапрограммированием https://github.com/notwaldorf/ruby-eh
GitHub
GitHub - notwaldorf/ruby-eh: Ruby for Canadians: an instruction manual.
:gem: Ruby for Canadians: an instruction manual. Contribute to notwaldorf/ruby-eh development by creating an account on GitHub.
В этом видео мы узнаем, как выдавать сообщения об ошибках, а также сообщения об успешных действиях с помощью flash. Также поговорим о стилизации приложения с помощью Bootstrap 5. Самостоятельно советую посмотреть, как
flash работает с render. Подсказка: вам может помочь flash.now. https://www.youtube.com/watch?v=8Vej-cKPdKAYouTube
Ruby on Rails 6/7, урок #4 | Сообщения для пользователя и стили
Продолжаем уроки по Ruby on Rails 6/7! В этом видео мы узнаем, как выдавать сообщения об ошибках, а также сообщения об успешных действиях с помощью flash. Также поговорим о стилизации приложения с помощью Bootstrap 5.
Таймкоды:
00:00 Введение
00:30 bundle…
Таймкоды:
00:00 Введение
00:30 bundle…
Вот буквально сегодня обсуждали разные препроцессоры для представлений, и я понял, что не все знают: ERb - это вовсе не единственный вариант для Rails. Есть, например, https://haml.info/ - он позволяет писать меньше разметки, а его философия напоминает CoffeeScript (важную роль играет вложенность, нет закрывающих ключевых слов и тп). Но лично мне кажется, что ERb несколько более предпочтителен, особенно если в команде есть отдельно верстальщик, который может просто не знать Haml. Хотя, безусловно, это решение тоже очень интересное. А вы как думаете? 🤓 P.S. Новое видео должно выйти завтра
Сегодня поговорим о том, что такое before_action, как обрабатывать ошибки в контроллерах с помощью rescue_from, как использовать concern, а также как выстраивать отношения "один-ко-многим" (one-to-many) с помощью has_many и belongs_to и управлять соответствующими записями. https://www.youtube.com/watch?v=1D_HUuWCamw
YouTube
Ruby on Rails 6/7, урок #5 | Отношение "один-ко-многим" и обработка ошибок
Продолжаем уроки по Ruby on Rails 6/7! Сегодня поговорим о том, что такое before_action, как обрабатывать ошибки в контроллерах с помощью rescue_from, как использовать concern, а также как выстраивать отношения "один-ко-многим" (one-to-many) с помощью has_many…
❤🔥1
Ну, и немного юмора в ленту сегодня (придумал недавно). Итак, внимание вопрос. По шуточному мнению одного комментатора, во время первой дозы вакцины вам вводят ИКСА, а во время - второй ИГРЕКА (причём, видимо, прямо в модной рубашке). Назовите ИКСА и ИГРЕКА.
Короткий рассказ о том, как фронт-энд делать не нужно https://meduza.io/shapito/2021/07/02/stoite-v-poluchasovoy-ocheredi-na-gosuslugah-zrya-okazyvaetsya-sayt-legko-obmanut-eto-delaetsya-v-paru-klikov
Meduza
Стоите в получасовой очереди на «Госуслугах»? Зря! Оказывается, сайт легко обмануть — это делается в пару кликов
Пользователи «Госуслуг» столкнулись с проблемами при входе на сайт — их отправляют в получасовую виртуальную очередь (Минцифры сообщило, что это связано с внедрением новых сервисов). Таймер обнуляется при каждом обновлении страницы.
Сюда тоже продублирую небольшую ремарку для последнего видео про отношения "один-ко-многим". Друзья, в видео закралась неточность, которую я просто-напросто забыл исправить. При создании метода show для вопросов на моменте 00:19:10, нужно не просто писать
Answer.order created_at: :desc (вот эта строка кода https://github.com/bodrovis-learning/RailsSeriesYT/blob/lesson_6/app/controllers/questions_controller.rb#L6), а всё-таки @question.answers.order created_at: :desc, чтобы вытащить не просто вообще ВСЕ ответы в принципе, а только те ответы, которые были написаны для КОНКРЕТНОГО вопроса. Спасибо зрителю Victor Malukhin за внимательность! Мне правда очень неловко, что я это дело как-то проморгал - в следующем видео (думаю, что уже завтра) это обсудим. Ну, собственно во избежание таких проблем каждый PR проверяется по крайней мере ещё одним разработчиком, так как время от времени даже авто-тесты от дурацких багов не спасают. Как говорится, тесты могут показать наличие багов в системе, но никак не их отсутствие.GitHub
RailsSeriesYT/questions_controller.rb at lesson_6 · bodrovis-learning/RailsSeriesYT
Серия уроков по Ruby on Rails на YouTube. Contribute to bodrovis-learning/RailsSeriesYT development by creating an account on GitHub.
https://markodenic.com/css-tips/ - всякие фишки и подсказки по CSS, любопытный материал
CSS Tips
CSS tips and tricks you will not see in most tutorials.
Продолжаем уроки по Ruby on Rails 6! В этом видео мы напишем несколько собственных вспомогательных функций (helpers) и узнаем, зачем они нужны. Кроме того, ещё немного поговорим о контроллерах и представлениях. https://www.youtube.com/watch?v=lm5SFwaob2U
YouTube
Ruby on Rails 6/7, урок #6 | Вспомогательные функции (helpers)
Продолжаем уроки по Ruby on Rails 6/7! В этом видео мы напишем несколько собственных вспомогательных функций (helpers) и узнаем, зачем они нужны. Кроме того, ещё немного поговорим о контроллерах и представлениях.
Таймкоды:
00:00 Введение
00:30 Исправление…
Таймкоды:
00:00 Введение
00:30 Исправление…
Этот урок по Ruby on Rails 6, в принципе, можно считать частью предыдущего. Мы поговорим о ряде других вспомогательных функций, в частности, strip_tags и sanitize. Кроме того, узнаем, как выносить часть разметки в отдельные представления и рендерить коллекции. Помимо этого, познакомимся с решением Faker для загрузки демо-данных и узнаем, как разбивать записи по страницам с помощью Kaminari. https://www.youtube.com/watch?v=FwFhxbx3W3k
YouTube
Ruby on Rails 6/7, урок #7 | Pagination, seeds, faker и пользовательская разметка
Этот урок по Ruby on Rails 6, в принципе, можно считать частью предыдущего. Мы поговорим о ряде других вспомогательных функций, в частности, strip_tags и sanitize. Кроме того, узнаем, как выносить часть разметки в отдельные представления и рендерить коллекции.…