Алгоритм примерно следующий:

  • Для сдачи всех заданий каждому нужно будет форкнуть этот репозиторий.
  • Каждый участник курсов должен в этом репозитории создать папку со своим именем и фамилией ( например Yukihiro_Matsumoto ).
  • Каждое задание должно выполняться в отдельной ветке и для него необходимо создать отдельную папку, которая будет отражать номер задания. ( например для задания 1 - Yukihiro_Matsumoto/1/ )
  • После завершения задания - нужно выслать pull request ( он же далее PR ) в master-ветку этого репозитория. Формат названия PR должен быть имя_фамилия - номер задания ( например Yukihiro_Matsumoto - 1 ).
  • После того как вам PR пройдет ревью от нескольких студентов и ментора - ментор зальвает ваше задание в основной репозиторий. Именно этот момент и будет считаться временем сдачи задания.

Домашнее задание 1

Чтобы показать все прелести языка Ruby вам придется пройти через сложный путь к просветлению. На выходе вы получите незабываемые впечатление и навыки написания кода согласно тому, как все привыкли его видеть!

  1. Настраиваем локальное окружения для запуска ruby.
  2. Идем на сайт и скачиваем архив с файлами (koans).
  3. Распаковываем архив и заходим внутрь распакованной папки.
  4. Запускаем команду rake и видим результат выполнения koans.
  5. Фиксим непройденные assert'ы: 4.1 Ищем assert's вида: assert_equal __, names. 4.2 Заменяем __ на значение переменной справа.

К примеру,

def test_non_parallel_assignment
  names = ["John", "Smith"]
  assert_equal __, names
end

names у нас равно ["John", "Smith"], соответственно меняем код следующим образом

def test_non_parallel_assignment
  names = ["John", "Smith"]
  assert_equal ["John", "Smith"], names
end
  1. Повторяем шаг 3.
  2. Если все assert'ы прошли успешно - то вы великолепны! Запечатлите этот момент с помощью записи экрана, чтобы прикрепить это потом к PR.
  3. Profit!

Как доказать, что я справился

  • Все решения ( вместе с кодом решения ) должны быть залиты в папку, которая отражает номер текущего задания.
  • Видео, прикрепленное к PR, обязательно должно показывать, что все koans пройдены.

Дедлайн

2021-04-05 19:00:00 UTC+3

Домашнее задание 2

На Руси и на чужбине давненько ходят легенды о том что Ruby - мертв и что все проекты на этом языке давно канули в лету. До недавнего времени только самые стойкие и смелые знали что это лишь слухи, намеренно распускаемые разведкой ЦРУ, дабы снизить популярность прорывных японских технологий. Но час пробил. Прямиком из архивов КГБ к нам попал в руки абсолютно засекреченный список из веб-приложений, написанных на Ruby on Rails. Именно вам предстоит выполнить важную миссию и проверить что Ruby не так мертв, как это утверждают.

Общее описание

В рамках задания мы пишем консольную утилиту, которая на вход получает CSV список из URL и проверяет какие из приложений еще живы и отвечают на HTTP запросы.

Пример файла для работы доступен по ссылке.

Пример запуска и выполнения приложения:

./checker rails.csv

circlecityvbc.com - 200 (314ms)
git.mnt.ee - 404 (89ms)
ralphonrails.com - 200 (412ms)
redmine.penflip.com - 500 (78ms)
expreso44a.co - ERROR (getaddrinfo: nodename nor servname provided, or not known)

Total: 5, Success: 2, Failed: 2, Errored: 1

Расшифруем немного вывод:

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

В случае если во время запроса произошла ошибка - то вам нужно вывести подробности этой ошибки.

В конце работы приложения необходимо вывести статистику о том сколько URL вам удалось проверить, сколько из них удачные ( 2xx и 3xx статусы ), сколько неудачных ( 4xx и 5xx статусы ) и сколько произошло ошибок.

Обязательное задание:

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

  • Параметр --no-subdomains - игнорирует все доменные имена второго и более уровней и проверяет только домены первого уровня:
./checker --no-subdomains rails.csv

circlecityvbc.com - 200 (314ms)
ralphonrails.com - 200 (412ms)
expreso44a.co - ERROR (getaddrinfo: nodename nor servname provided, or not known)

Total: 3, Success: 2, Failed: 0, Errored: 1
  • Параметр --filter=sales, который ищет определенное слово в содержании страниц и выводит их только в случае нахождения этого слова на странице:
./checker --filter=payment rails.csv

circlecityvbc.com - 200 (314ms)

Total: 1, Success: 1, Failed: 0, Errored: 0
  • Параметр --exclude-solutions, игнорирует все приложения, которые скорее всего являются различными open source решениями наподобии redmine или gitlab. Логику фильтрации мы оставляем за вами:
./checker rails.csv

circlecityvbc.com - 200 (314ms)
git.mnt.ee - 404 (89ms)
ralphonrails.com - 200 (412ms)
expreso44a.co - ERROR (getaddrinfo: nodename nor servname provided, or not known)

Total: 4, Success: 2, Failed: 1, Errored: 1

Требования

До того как задание будет проверено ментором в этот раз вам нужно будет сперва пройти автоматическое ревью робокопом и исправить все его комментарии.

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

Для этого задания нужно будет написать минимум 10 тест-кейсов.

Рекомендации

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

Для локальной отладки рекомендуем сделать небольшой файлик в 5-10 доменов чтобы быстро все запускать вместо того чтобы всегда использовать файлик в 10_000 строк из примера.

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

Дополнительно со звездочкой

  • Параметр --parallel=N - проверяет все домены параллельно в N потоков:
./checker --parallel=5 rails.csv

circlecityvbc.com - 200 (314ms)
git.mnt.ee - 404 (89ms)
ralphonrails.com - 200 (412ms)
redmine.penflip.com - 500 (78ms)
expreso44a.co - ERROR (getaddrinfo: nodename nor servname provided, or not known)

Total: 5, Success: 2, Failed: 2, Errored: 1

Как доказать, что я справился

  • Все решения ( вместе с кодом решения ) должны быть залиты в папку, которая отражает номер текущего задания.
  • Видео, прикрепленное к PR и залитое на внешний сервис, обязательно должно показывать, что утилита работает и что все параметры реализованы.

Дедлайн

2021-04-19 19:00:00 UTC+3

Домашнее задание 3

Немало судеб было сломано в попытках выяснить какой язык надо учить программисту. Одни с восхищением на глазах рассказывают о том какие архитектуры можно строить на старом-добром языке Java, другие твердят о простоте и доступности Javascript, третьи немного посмеиваются и спокойно поясняют что для того чтобы стать счастливым нужно всего лишь познать дзен Ruby. И хоть сомнительно что имеется хоть малейший шанс на примирение этих людей между собой, но все-таки есть кое-что что их объединяет. Врятли кто-нибудь из них будет отрицать что один из главных языков нужных программисту - это английский. Именно поэтому для нашего с вами будущего мы будем писать приложение, которое поможет всем нам учить английский.

Общее описание

В рамках нашего с вами домашнего задания мы будем писать приложение, которое будет помогать пользователям учить английский слова. Само приложение будет представлять собой Telegram-бота. Идея приложения довольно простая: после регистрации каждому пользователю с некоторой периодичностью отправляются новые английские слова для обучения. Пользователь должен отрегировать смайликом обратно в ближайшие 120 минут, в противном случае ему высылается напоминание о том что он пропустил слово.

Пример взаимодействия:

/start

Привет. Я бот, который помогает учить новые английские слова каждый день. Давай сперва определимся сколько слов в день ( от 1 до 6 ) ты хочешь узнавать?

7

Я не умею учить больше чем 6 словам. Давай еще раз?

4

Принято.

Через какое-то время от бота должно прийти сообщение похожего смысла:

Opinion - 1 unproven belief. 2 view held as probable. 3 what one thinks about something. 4 piece of professional advice (a second opinion). 5 estimation (low opinion of). [latin: related to *opine]

Если человек не отреагировал на слово, то бот напомнит ему об этом чем-то вроде:

Кажется ты был слишком занят, и пропустил слово выше? Дай мне знать что у тебя все хорошо.

😘

Вижу что ты заметил слово! Продолжаем учиться дальше!

Требования

Для написания бота необходимо использовать специальную для этого библиотеку - https://github.com/atipugin/telegram-bot-ruby

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

Данные по английским словам нужно предварительно распарсить из открытых источников. Мы рекомендуем вот этот словарь Oxford.

Все используемые библиотеки должны быть перечислены в Gemfile.

До того как задание будет проверено ментором все еще сперва пройти автоматическое ревью робокопом и исправить все его комментарии.

Требования структурировать весь код с помощью классов тоже остается. Мы ожидаем минимум 3 класса в рамках данного домашнего задания.

Для этого задания нужно будет написать минимум 20 тест-кейсов.

Рекомендации

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

Если вы никогда не создавали ботов для телеграмм - то в самой документации Telegram есть хорошее описание

Использовать ActiveRecord без Rails может быть немножко сложно, советуем посмотреть вот на этот пример. Если долго не получается - лучше обратиться за поддержкой в общем чате к менторам.

Для периодического запуска задач по расписанию рекомендуем использовать cron и обертку для него в виде whenever

Дополнительно со звездочкой

Для написания бота необходимо использовать библиотеку Sinatra для HTTP взаимодействия вместо рекомендуемой telegram-bot-ruby и использовать webhooks вместо long-polling.

Как доказать, что я справился

  • Все решения ( вместе с кодом решения ) должны быть залиты в папку, которая отражает номер текущего задания.
  • Видео, прикрепленное к PR и залитое на внешний сервис, обязательно должно показывать, что утилита работает и что все параметры реализованы.

Дедлайн

2021-05-03 19:00:00 UTC+3