Алгоритм примерно следующий:
- Для сдачи всех заданий каждому нужно будет форкнуть этот репозиторий.
- Каждый участник курсов должен в этом репозитории создать папку со своим именем и фамилией ( например Yukihiro_Matsumoto ).
- Каждое задание должно выполняться в отдельной ветке и для него необходимо создать отдельную папку, которая будет отражать номер задания. ( например для задания 1 - Yukihiro_Matsumoto/1/ )
- После завершения задания - нужно выслать pull request ( он же далее PR ) в master-ветку этого репозитория. Формат названия PR должен быть имя_фамилия - номер задания ( например Yukihiro_Matsumoto - 1 ).
- После того как вам PR пройдет ревью от нескольких студентов и ментора - ментор зальвает ваше задание в основной репозиторий. Именно этот момент и будет считаться временем сдачи задания.
Чтобы показать все прелести языка Ruby вам придется пройти через сложный путь к просветлению. На выходе вы получите незабываемые впечатление и навыки написания кода согласно тому, как все привыкли его видеть!
- Настраиваем локальное окружения для запуска ruby.
- Идем на сайт и скачиваем архив с файлами (koans).
- Распаковываем архив и заходим внутрь распакованной папки.
- Запускаем команду
rake
и видим результат выполнения koans. - Фиксим непройденные 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
- Повторяем шаг 3.
- Если все assert'ы прошли успешно - то вы великолепны! Запечатлите этот момент с помощью записи экрана, чтобы прикрепить это потом к PR.
- Profit!
- Все решения ( вместе с кодом решения ) должны быть залиты в папку, которая отражает номер текущего задания.
- Видео, прикрепленное к PR, обязательно должно показывать, что все koans пройдены.
2021-04-05 19:00:00 UTC+3
На Руси и на чужбине давненько ходят легенды о том что 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
Немало судеб было сломано в попытках выяснить какой язык надо учить программисту. Одни с восхищением на глазах рассказывают о том какие архитектуры можно строить на старом-добром языке 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