• Сколько мы переплачиваем за сервера используя Ruby on Rails

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

      Читать далее
    • Slack Ruby App. Часть 2. Добавление чартов, или как делать рендер фронта на сервере

      • Tutorial

      Во время разработки своего приложения в качестве проекта внутри компании, поступил запрос на постройку графика по некоторой выборке данных, чтобы по команде Slash Command происходила постройка графика и его публикация в чат.

      Первым делом я обратился к уже существующим решениям, графики через API Google, готовые гемы для Ruby. Основной минус в том, что не было возможности убрать или добавить легенду в том формате, который мне нужен, сложно кастомизировать внешний вид этих графиков и, к примеру, нет возможностей строить график по значению timestamp, а выводить уже значения в формате DateTime.

      Имея на вооружении тот метод, который освещает эта статья, любой сможет строить какую угодно страницу полностью на сервере, получать фото этой страницы и использовать её в коде. В будущем можно приспособить этот подход для, например, для предпоказа тем на своем движке, генерации каких-то изображений с подвязкой к внешнему API и заключении всего в html документ. В целом, применений реально много, собственно поэтому и решил поделится solution'ом.

      Поэтому предлагаю вам скорее ознакомится с материалом, мы научимся сначала делать график с использованием своего js скрипта, а потом поймём как его рендерить в коде.

      Представляю содержание.

      Научится
    • Под капотом Ruby. GVL

        Давным давно уже уже была написана статья о том что такое GVL (или GIL, кому как привычнее) и как он работает, однако с того времени некоторые вещи поменялись (к примеру, , а так же в Ruby 3.0 завезли Ractor'ы - новую абстракцию для реальной параллельной работы тредов. Мне стало интересно узнать что поменялось в планировщике ruby для реализации множества GVL. В этой статье я попытаюсь понять алгоритм, по которому GVL передается от одного треда к другому, как блокирующее IO позволяет продолжить работать другим тредам, а так же выяснить до сих пор ли операция добавления элемента в массив является атомарной операцией

        Читать далее
        • +12
        • 1,8k
        • 4
      • Работаем с индексами при высокой нагрузке в rails с psql: как добавить/удалить индекс и при этом не умереть

          Всё, что кладёт прод, делает тебя умнее. © программист, положивший прод

          Привет! Я — Женя, рубист из Каруны. В этой статье расскажу, как мы получили, на первый взгляд, тривиальную задачу по работе с индексами, набили кучу шишек и пришли к не очень тривиальному и эффективному решению.

          Читать далее
          • +11
          • 1,7k
          • 3
        • Python и Ruby под нагрузкой: высокое искусство некромантии

            Уже больше 20 лет я пишу код на разных языках программирования. Так как многие из этих языков считаются мертвыми, то сегодня я буду говорить о высоком искусстве некромантии — о том, как якобы мертвые языки используются в больших и иногда высоконагруженных проектах. Обрабатывая тысячи веб-запросов в секунду и не порождая необходимости писать свой компилятор PHP или переходить на Go или Rust.

            Я расскажу про специфику Ruby и Python при высоких нагрузках, про их мейнстрим, который вы можете встретить в выживших проектах. Я не буду и не хочу говорить про спортивное программирование, где делают миллион запросов в секунду на одной ноде, выжигая из Python или Ruby всё и оставляя голый С. Python и Ruby действительно медленные, у них есть GIL, но при правильном использовании это не проблема, а статья расходов — и я расскажу, что мы можем получить за эти деньги.

            Если вы предпочитаете слушать или смотреть (у меня там забавные крылья!) — видео моего выступления на конференции HighLoad++ Весна 2021.

            Читать далее
          • Slack Ruby App. Часть 1. Написания приложения локально через Sinatra и ngrok

            • Tutorial

            Slack Ruby App. Часть 1. Написания приложения локально через Sinatra и ngrock

            Привет читатели, на сейчас не так много информации о новых фичах Slack, всё больше людей заходят в ИТ и пользуются Slack и Slack для многих становится основным приложением куда регулярно хочется зайти и прочитать очередной прикол от менеджера.

            Сам я прошёл путь создания приложения по англоязычным бредням, вырваным кускам из Stack Overflow, и очень многих проб, ошибок, и исследований. Не имея понимания о том что можно сделать, как то сложно хотеть что-то делать.

            Было бы круто если бы каждый умелый разраб (или не разраб) мог сделать приятно для коллектива или для себя любимого и добавить автоматизацию в свой один или несколько Slack Workspace

            Так что я опишу этапы создания своего Slack бота для многих Workspace!

            Скорее изучить как это сделать!
          • Ruby Interview Questions

              Я Ruby-программист. Язык почему-то теряет популярность, несмотря на своё интенсивное развитие. Лично я ему альтернатив [для себя] не вижу, поэтому готовясь к очередному собеседованию, решил составить шпаргалку с вопросами и ответами по Ruby. Шпаргалка за время подготовки превратилась в Android-приложение, которые я всегда хотел научиться делать, и о котором расскажу.

              Дисклеймер: для профессионалов мобильной разработки в статье не будет ничего нового, это рассказ о том, как я столкнулся с разработкой под Android впервые в жизни.

              Изучать Kotlin / Java я не стал. Близкий моему сердцу C# имеет технологию Xamarin, но, как пишут, у неё не всё так удобно в части создания интерфейсов, как хотелось бы. Поэтому было решено сделать шпаргалку на HTML / CSS, и обернуть в приложение с помощью Apache Cordova. В качестве CSS-фреймворка я рассматривал такие варианты: Bootstrap, Phonon, Framework7. Первые два показались неудобными, остановился на последнем.

              Framework7 понравился тем, что ориентирован на создание мобильных интерфейсов (Android / iOS / своя тема Aurora), заявлена интеграция с Cordova, предлагает много разных виджетов, и обеспечивает высокий уровень контроля за функционалом с помощью JavaScript (поддерживает Vue.js и прочие, мне хватило старого доброго jQuery).

              Дальше пошла работа по составлению самой шпаргалки, использовались разные открытые источники с вопросами по Ruby. К моему удивлению, таких источников нашлось совсем немного, а источников с толковыми вопросами и ответами - ещё меньше. Отобранные вопросы и ответы были разделены на тематические разделы, завёрстаны в HTML (с помощью автогенерации конечно, написанной на Ruby), и снабжены семантическим форматированием (выделения ключевых слов, примеры кода и т.д.).

              Читать далее
            • Реклама
              AdBlock похитил этот баннер, но баннеры не зубы — отрастут

              Подробнее
            • Лайфхак для твиттерян, или по следам Твидиума

                После закрытия Леонидом Кофманом своего знаменитого проекта Твидиум длинный ряд пользователей Твиттера в полной мере ощутил, сколь неудобна и недружелюбна к юзерам эта социальная сеть. Говорю практически без сарказма, т. к. сам прочно нахожусь в числе недовольных... анфолловинг и массфолловинг нажатием всего одной кнопки, парсинг твитов и отложенный постинг, как в Твиттере жить без всего этого? - согласитесь, ну нереально же.

                Недовольство влечет за собой, как правило, желание подвигать за... пошевелить мозгами. Данный материал представляет собой, так сказать, отчет о результатах соответствующих изысканий, призванных вернуть себе - хотя б в некоторой степени - прежние удобства. Но автор не жадина и всегда готов поделиться тем немногим, чем располагает, с благодарными читателями... Представленный сегодня на ваш суд скрипт, пожалуй, сыроват для имиджа коммерческого интернет-сервиса (API Twitter всячески противится такого рода использованию своих ресурсов, что и было, как представляется автору, началом конца Твидиума и ему подобных проектов), но в качестве однопользовательского "домашнего" приложения - изрядно облегчает работу с несколькими твиттер-аккаунтами.

                Читать далее
              • Перестаньте везде использовать first/last

                  Очень часто разработчики на Rails для извлечения заведомо одной записи из базы используют один из методов first/last из ActiveRecord. Это рабочее решение, но есть одно НО: чтобы извлечь всего одну запись база данных должна найти все, подходящие по условию, отсортировать их и вернуть только одну. Если вы подумали "Сортировка одной записи? Да это же легко!", то не будте так оптимистичны, я постараюсь показать, что это важно.

                  Читать дальше →
                • Реализация алгоритма Минимакс на примере игры «Крестики-Нолики»

                  • Перевод
                  • Tutorial
                  Недавно я написал непобедимую игру «Крестики-Нолики». Это был интересный и поучительный проект, который многому меня научил. Если у вас есть желание посмотреть результат — это можно сделать здесь.

                  image

                  Для того чтобы сделать игру непобедимой, было необходимо создать алгоритм, который может рассчитать все возможные ходы для «компьютерного» игрока. Далее, нужно использовать некоторую метрику, чтобы определить, какой ход является предпочтительным. После долгих исследований стало понятно, что алгоритм Минимакс, был тем, что мне нужно.

                  Понимание основ алгоритма и реализация игры заняли некоторое время. Я нашел много примеров кода и объяснений, тем не менее это оказалось не такой уж простой затеей. Надеюсь этот пост поможет некоторым из читателей оценить элегантность этого алгоритма.

                  Читать дальше →
                • С 4 часов до 1 минуты. Как найти одну строчку, которая ускорит сервис на Ruby

                    Кейс из жизни, когда удалось на порядки повысить производительность сервиса. Показываю на реальном примере, как можно искать "узкие места" в работающем, казалось бы, коде. И как много профита порой можно получить от минимальных правок. В данном случае весь фикс потребовал замены всего одной строки. Но самое интересное - эту строку найти...

                    Читать далее
                    • +19
                    • 5,4k
                    • 4
                  • [Опрос] Насколько вам наплевать на фичи последней версии языка?

                      Многие на собеседованиях любят гонять по последним фичам языка. У меня это всегда вызывало недоумение, во всяком случае в сфере веб-разработки. На фронтенде ты смотришь CanIUse (или сношаешься с полифиллами и транспиляцией (что ныне в приличном обществе и за сношения не считают)), а на бэкенде ты смотришь на шаблоны vps/vds, которые предоставляют хостеры и прикидываешь когда же в них появятся нужные тебе версии языка. И я абсолютно не против развертывания среды выполнения нужной версии, которая будет отличаться от системной, но давайте будем честными с самими собой. Какой процент из вас ориентируется на последнюю доступную версию языка? А какой на то что будет на в ближайшие пару лет дано в ощущениях, браузерах и датацентрах. Внимание опрос!

                      Читать далее
                    • WorkerKiller

                      • Tutorial

                      Утечки ресурсов и/или памяти, а также её фрагментация являются обычной проблемой для всех языков программирования. Неважно есть там сборщик мусора или нет, компилируемый язык или интерпретируемый. Ruby не является исключением и сегодня мы немного поговорим про эти проблемы, варианты их решения и даже напишем своё собственное.

                      Читать далее
                    • Кеширование гемов Ruby в GitHub Actions с использованием ruby/setup-ruby или actions/cache

                      • Перевод
                      Как, загружая гемы Ruby из кеша в GitHub Actions, ускорить запуск сборки проекта в этой системе непрерывной интеграции (CI)? Если суметь подготовить к работе все зависимости Ruby on Rails (RoR)-проекта в кратчайшие сроки, это позволит сократить время, необходимое на запуск тестов для такого проекта. Тут-то нам и пригодится кеширование. Гемы Ruby, нужные в проекте, можно кешировать средствами GitHub Actions, благодаря чему их, при запуске CI-конвейера, можно будет загрузить гораздо быстрее, чем прежде. Существует два способа кеширования гемов Ruby, применимых при использовании CI GitHub Actions. Один из них предусматривает применение ruby/setup-ruby, а второй — actions/cache.

                      • actions/cache — это популярное решение для кеширования гемов Ruby.
                      • ruby/setup-ruby — это решение, направленное на установку конкретной версии Ruby и на кеширование гемов Ruby с помощью бандлера. Фактически, речь идёт о двух возможностях одного «экшена» (того, что в терминологии GitHub Actions называется «action»).


                      Читать дальше →
                    • Веб-клиент Google Cloud Text to Speech за завтраком в бастионе Сен-Жерве

                        С самых юных лет, с самого первого прочтения залпом "Трех мушкетеров" автор неколебимо убежден, что оптимальный способ обучения чему-либо - практика. Теорию в дальнейшем можно подучить и подточить, друзья-мушкетеры "покажут несколько славных приемов", не проблема. Но, если верить досточтимому мэтру Дюма (а автор ему верит), оптимальный способ интеграции в любую новую для себя сущность - сходу погрузиться в нее с головой, а там как пойдет. Где наша не пропадала, да и, как известно, любой гасконец с детства академик.

                        Вообще, если интерес возникнет, то это всегда 90% успеха, поверьте... ну, а если не возникнет, что ж. Сэкономите время: стало быть, не ваше. Сейчас, таким образом, самонадеянный и скорый на подъем аффтор, всегда готовый выхватить шпагу при виде гнусного тролля на любом интернет-форуме - предлагает всем débutants потратить всего лишь полчаса-час на то, чтобы заинтересоваться сразу несколькими технологиями, в числе которых язык программирования Ruby, API Google Cloud Text to Speech, облачная PaaS-платформа Heroku и git.

                        К слову. Предвидя сделанные на языке растреклятых англичан, исконных врагов любого истинного француза комментарии в стиле "Is ruby dead?", в том смысле, а есть ли смысл вообще этим заниматься... автор предлагает всем любителям потрепаться-ни-о-чем-в-инете временно оставить эту животрепещущую тематику, сменив ее на рекомендации по изготовлению чудодейственного бальзама, наподобие того, что дала в путь-дорогу д`Артаньяну любящая его матушка, и который помог бы, в духе дня, раз и навсегда избавиться от спама за подписью того или иного эйчара, русскоговорящего или европейца/американца, несколько раз в неделю присылающих абсолютно ненужные автору инвайты на позицию Ruby Developer. Ненужные не потому, что автор, вволю напрактиковавшись и слегка "подточив" теорию, привык получать приглашения исключительно и самолично из рук аж самого CTO Armand-Jean du Plessis, duc de Richelieu... а потому, что за все годы работы - ни одного проекта, ни одной должности от HR он не получил, так уж сложилось.

                        Читать далее
                      • Redfish в GAGAR>IN BMC

                          На сегодняшний день большинство крупных производителей серверного оборудования, таких как (DELL, IBM, HP) включают поддержку RedFish в прошивки для своих BMC контроллеров (Baseboard management controller) Разумеется, разрабатывая серверы GAGAR>IN, мы также добавили поддержку Redfish в наш BMC, который построен на базе открытого проекта OpenBMC. В этой статье расскажем, для чего мы используем RedFish и какие преимущества он нам даёт.

                          Читать далее
                        • Artificial Intelligence, герой нашего времени. Этюд

                          Хм. Один из пунктов, регламентирующих действия модераторов на Хабре, сформулирован следующим образом: не надо пропускать статьи, слабо относящиеся к IT-тематике или не относящиеся к ней вовсе. Что сходу заставило автора призадуматься, а имеет ли прямое отношение к "IT-тематике" его пост, повествующий о некоторых этапах программирования забавного и увлекательного своего pet-проекта, несложного AI, выстраивающего нейронную сеть на основе ruby-обертки FANN для игры в крестики-нолики? Вопрос не содержит скрытого кокетства, ведь описанию логики программного кода в моем рассказе предназначено далеко не первостепенное значение. "Да это злая ирония!" – скажете вы. – Не знаю.

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

                          Итак, с места в карьер... после первого запуска программа начинает процесс самообучения, проигрывая сама с собой несколько десятков (минута - две максимум) тысяч партий (число, понятное дело, доступно для редактирования в конфиге; учитывая описываемый далее не вполне обычный алгоритм, положенный в основу логики этого AI - эксперименты такого рода также способны предоставить интересный материал для умозаключений). Здесь имитируется процесс обучения, свойственный многим другим Artificial Intelligence, с той лишь разницей, что оба "игрока" в равной степени играть не умеют, делая абсолютно рандомные ходы. Но правила игры действуют: если случайный ход не соответствует, программа обязана переходить, соответственно и выигрыш достанется той стороне, которая выиграет. Все честно: никаких подчисток и хаков, скрытых предпочтений, никаких тебе фейковых допинг-проб, зачастую в реальной жизни опрокидывающих результаты спортивных игр.

                          Читать далее
                        • PGHero — дашборд для мониторинга БД PostgreSQL

                          • Tutorial

                          Всем привет. Сегодня я бы хотел поделиться рецептом установки утилиты PGHero с подключением нескольких баз данных. PGHero — это простенькая утилита, написанная на Ruby, с минималистичным дашбордом для мониторинга производительности БД PostgreSQL.

                          Что может показать нам PGHero:

                          статистику по запросам: количество вызовов, среднее и суммарное время выполнения (с возможностью хранения истории);

                          активные в данный момент запросы;

                          информацию о таблицах: занимаемое на диске место, даты последних запусков VACUUM и ANALYSE;

                          информацию об индексах: занимаемое на диске место, наличие дублируемых/неиспользуемых индексов. Также может порекомендовать добавить индекс при наличии сложных запросов с Seq Scan;

                          статистику по открытым подключениям к БД;

                          вывод основных настроек БД, влияющих на производительность (shared_buffers, work_mem, maintenance_work_mem и т.д.)

                          Читать далее
                          • +35
                          • 6,4k
                          • 7
                        • Синхронизация баз данных между монолитом и микросервисами с помощью Kafka. Наше решение

                            В этой статье я расскажу про готовое решение для поддержки консистентности данных между растущей микросервисной и унаследованной архитектурой. Под катом код для репликации двух баз данных с проверкой синхронизации, который может пригодиться для решения аналогичных задач.


                            Читать дальше →
                            • +10
                            • 3,4k
                            • 9

                          Самое читаемое