Генератор мемов на Ruby для привлечения интереса к языку

image

По моему мнению язык Ruby перестал быть популярным как в 2012 — 2014 году и поэтому у меня возникло желание пока про язык совсем не забыли, попробовать его снова донести в массы, ведь Ruby по моему мнению самый удобный и практичный язык для веб разработки.
Я с неделю назад загорелся желанием сделать свое сообщество в телеграм, найти начинающих программистов и привлечь на светлую сторону Ruby разработки.

В планах было создать сообщество, но не в котором все будут писать о своих проблемах и багах на проектах (таких сообществ хватает), а сообщество в котором будет поститься полезная информация из мира Ruby.

В первую очередь я захотел сделать посты в виде мемов, но с учебным контентом.

Например так
image

Когда сделал через сайт генераторов мемов штук 10 картинок — я понял, что очень все медленно и проблемно, плюс ко всему я сделал только 10 методов ruby, а их еще около 1 000 может наберется. Было принято решение создать свой генератор мемов да и еще интерфейс к этому всему прикрутить и все это сделать с использованием языка Ruby.

Генерация картинок с RMagic


Чтобы сильно не заморачиваться с отрисовкой был взят за основу уже существующий гем `rmagick`. Благодаря этому гему мы можем с легкостью видоизменять картинки.

В коде ниже я создал новые объекты(тексты) в виде картинки и поместил их на картинку взятую за основу.

Основной код логики
img = Magick::ImageList.new("1.jpg")

  title = Magick::Draw.new
  title.pointsize = 126
  title.font_weight = Magick::BoldWeight
  title.fill = 'white'
  title.gravity = Magick::CenterGravity
  title.annotate(img, 0, 0, 0, -400, first_text)

  descritpion = Magick::Draw.new
  descritpion.pointsize = 72
  descritpion.font_weight = Magick::BoldWeight
  descritpion.fill = 'white'
  descritpion.gravity = Magick::CenterGravity
  descritpion.annotate(img, 0, 0, 0, 300, second_text)

  img.write("actual_mem/#{first_text}.jpg")


После заполнения базовых атрибутов, таких как размер шрифта, жирность, цвет и гравитацию текста. Далее сохраняю картинку в папку actual_mem. Зачем нужна эта папка вернусь попозже.

Веб-интерфейс в Sinatra


Теперь нужно было реализовать интерфейс. Чтобы не разворачивать ради маленького приложения большой Rails проект я решил воспользоваться другим Ruby фреймворком под названием Sinatra

В итоге получилось небольшой файл с кодом для запуска приложения

Файл запуска Sinatra приложения
require 'sinatra'
get('/') do
  haml :index
end

post('/') do
  if params[:title] && params[:description]
    require 'rmagick'

    b = params[:description].scan(/[а-яa-zA-ZА-Я0-9_.,()—-]+/)
    second_text = ""
    b.each_with_index do |text, index|
      if index.modulo(4) == 3
        second_text += text + "\n"
      else
        second_text += text + " "
      end
    end

    img = Magick::ImageList.new("../1.jpg")

    title = Magick::Draw.new
    title.font = ''
    title.pointsize = 126
    title.font_weight = Magick::BoldWeight
    title.fill = 'white'
    title.gravity = Magick::CenterGravity
    title.annotate(img, 0, 0, 0, -400, params[:title])

    descritpion = Magick::Draw.new
    descritpion.font = ''
    if b.size > 20
      descritpion.pointsize = 48
    else
      descritpion.pointsize = 72
    end
    descritpion.font_weight = Magick::BoldWeight
    descritpion.fill = 'white'
    descritpion.gravity = Magick::CenterGravity
    descritpion.annotate(img, 0, 0, 0, 300, second_text)

    img.write("../actual_mem/#{params[:title]}.jpg")
  end

  haml :index
end


Документацию по sinatra можете найти на официальном сайте, не буду сильно тут объяснять.
Немного прикрутил CSS Grid и с помощью haml сверстал страницу ввода данных для создания мема

Код на haml:
!!! 5
%html(lang="en")
  %head
    %title Cоздание мема
    %link{:rel => "stylesheet", :type => "text/css", :href => "/style/main.css"}

  %body

    %h1 Страница создания мема

    %form{ :action => "/", method: "post"}
      %label Верхний текст
      %input{ name: "title" }
      %label Нижний текст
      %textarea{ name: "description" }
      %input{type: "submit"}


код CSS:
form {
  display: grid;
  grid-template-columns: 200px 1fr;
  grid-gap: 16px;
}

label {
  grid-column: 1 / 2;
}

input,
button {
  grid-column: 2 / 3;
}


Отображение в браузере:
image

Никакой красоты на первом этапе добавлять не стал, мне нужно было только четкое выполнение функционала. Поэтому на странице только заголовок, два тега label, input для верхнего текста и textarea для нижнего. А так же input для отправки формы на сервер.

Планы на будущее


В будущем думаю доделать форму — добавлю бегунок для установления размера шрифта верхнего и нижнего текста, бегунки для позиционирования текста, а так же можно будет сделать блок предпросмотра.

Помимо генератора мема у меня так же реализован бот для группы, который по команде отправляет картинку в сообщество и перемещает картинку из папки actual_mem в папку sended_mem. Бот тоже сделан на руби, но если будет интересно, сделаю про него статью в другой раз.

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

Исходный код


ссылка на github

Выбирайте Ruby


image
Поделиться публикацией
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 18

    +1
    Какими технологиями, платформами разработки, языками… кроме Руби Вы увлечены, чтобы пытаться реанимировать «мёртворождённое» решение?

    P.S. Мало ли языков появляются, не набирают популярность в силу разных причин и «вымирают» в историческом контексте.
      0
      Профессионально занимаюсь пока что только Ruby разработкой, но не понял по поводу «мертворожденного» решения — это вы про сам язык Ruby или про мой код? Если речь про код, то я эту статью год назад писал, в актуальном состоянии программу не держу. Если речь про язык, то у меня пока не много скилла, что бы реанимировать Ruby, да и последние релизы очень даже нормально покрывают мои потребности в рабочих процессах.
        +1
        > Руби
        > пытаться реанимировать «мёртворождённое» решение
        Очень спорное утверждение. Я как раз сделал небольшое исследование по этому поводу, работы на Ruby/RoR более чем хватает.

        Кстати, почему-то чаще всего я встречаю реплики типа «Ruby мёртв» на русском языке, англоязычные же коллеги имеют другое мнение.
          +2

          Нет, все англоязычные коллеги понимали, и уже давно, еще со времен статьи "Rails is Ghetto" (2007).


          Многие разработчики (вне зависимости от географического положения) понимали, что у Руби есть проблемы с выходом из ниши, куда его привел главный фреймворк. Главный конкурент, Python, например, хотя и не блистал со своим титульным Джанго, но изначально делал ставку на околонаучное сообщество — и выиграл в перспективе, даже не смотря на то, что веб-разработка сместилась в сторону Javascript.

            0
            Главный конкурент, Python, изначально делал ставку на околонаучное сообщество — и выиграл в перспективе

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

              0

              очень может быть, Julia очень даже набирает.


              Но будущее — штука туманная. :-)

        +6

        Как мне кажется камбэк Руби на пьедестал почета уже просто невозможен. Он так и остался языком под нужны одного фреймворка, Rails. И трудно себе представить, что могло бы появиться в языке, чтобы он вновь начал набирать популярность.

          –2

          Это он только в западном мире остался «языком одного фреймворка» (а как же Chef, а как же Homebrew?), а вот на родине, в Японии, он живее всех живых и вместе с младшим братишкой mRuby используется для всего подряд, включая скриптинг для мини-спутников, например.

            +1

            В свое время в организации выбирали между Chef и Ansible. Оказалось, что Ruby на тот момент знал только я (а в Chef, если я не ошибаюсь, даже конфиги это валидный руби-код), а yaml с примесью питона знали все. Поэтому опять же по моему мнению для рубистов Chef приятнее, но для большинства Ansible более прост в освоении и эксплуатации.

            0
            В общем-то на Ruby можно писать даже мобильные приложения. И, что характерно, пишут.
            +5
            Ruby, конечно, крут и не перестал быть популярным (куча народу пишет, огромные конференции), просто прошла волна хайпа.

            Есть Julia Evans, которая выпускает «zines», как она их называет, — лучше один раз увидеть, т. к. описать это сложно. Вот у неё получилось на просторах Twitter неплохо раскрутиться, и теперь она аж их печатает на бумаге, а люди покупают. Так что формат имеет потенциал. Хотя по мне ничто не сравнится с видосами RailsCasts.

            Но искусственно что-то популяризовать невозможно, если ты не Google / Facebook.
              +1
              Я думаю, что отсутствие хайпа я зыку наоборот идет на пользу, т.к. в него не лезут все подряд и рынок не перенасыщен.
                0
                Да, пожалуй так
              +3
              посты в виде мемов, но с учебным контентом.

              Мне всегда казалось что мемы это не просто картинки с текстом. Несколько обманчивый заголовок получился.

                0

                Ну никто не мешает подставлять картинки из мемов и смешной текст, да я использую по другому, но все таки это генератор мемов и обмана в названии нет)

                +1

                Побольше бы картинок. Ведь всем лень ходить куда-то и ранать код!

                  0
                  До тех пор пока в книгах по Ruby/ROR будет «вам пока рано это понимать, просто примите», у языка нет будущего.
                    0

                    Это проблема качества учебных материалов. Впрочем, идти в ROR не зная Ruby — это сложно… Ruby довольно простой язык, но его модель отличается от других императивных языков. И, как раз, попытки тащить предыдущий опыт на Ruby-программирование и вызывают ту самую проблему вхождения и полного непонимания что происходит. Это касается и функционального стиля Ruby, и принципа умолчания в Rails, где просто надо знать, что происходит внутри. Иначе, сплошная непредсказуемая (для новичка) магия.

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

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