Ruby Lab 2021-2022

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

Задание 1

  1. В папке с домашним заданием hometask-1 создать файл hello_world.rb с кодом, который выводит в консоль "Hello world!".
  2. Файл должен быть исполняемым.

Задание 2

  1. Завести аккаунт с почтовым ящиком iTechArt на codewars.
  2. Решить онлайн задание.
  3. Код с решением поместить в файл get_middle_charachter.rb в папку с домашним заданием hometask-2.
  4. В этот же файл добавить функцию run_cli, которая ожидает ввод пользователя. Пример работы с вводом и выводом был разобран на воркшопе. Если пользователь ввел exit!, программа должна завершиться. Если пользователь ввел пустую строку, программа должна вывести сообщение об ошибке и ожидать следующий ввод пользователя. В остальных случаях в консоль выводится результат вызова функции get_middle c введенной строкой, после чего программа ожидает следующий ввод пользователя. Файл должен быть исполняемым. Пример работы программы:
$ ./get_middle_character.rb
Enter string:

String can not be blank!
Enter string:
test
Middle character: es
Enter string:
exit!

Задание 3

  1. Решить онлайн задание.
  2. Код с решением поместить в файл rainfall.rb в папку с домашним заданием hometask-3.
  3. В этот же файл добавить функцию run_cli, которая ожидает ввод пользователя. Если пользователь ввел exit!, программа должна завершиться. Если пользователь ввел пустую строку, программа должна вывести сообщение об ошибке и ожидать следующий ввод пользователя. В остальных случаях в консоль выводится результат вызова функции mean и функции variance c введенной строкой, после чего программа ожидает следующий ввод пользователя. Файл должен быть исполняемым. Пример работы программы:
$ ./rainfall.rb
Enter city name:

City name can not be blank!
Enter city name:
London
Rainfall mean: 51.199999999999996
Rainfall variance: 57.42833333333374
Enter city name:
exit!

Задание 4

Задание 4.1

  1. Код с решением поместить в файл my_array_rotate.rb в папку с домашним заданием hometask-4.
  2. Рacширить класс Array методaми lab_rotate и lab_rotate!, которые реализуют циклический сдвиг.
    Метод lab_rotate циклически сдвигает массив без изменения объекта.
    Метод lab_rotate! циклически сдвигает массив c изменением объекта.
    В качестве аргумента метод принимает число элементов, на которое нужно сдвинуть массив.
    Если число положительное, то массив циклически сдвигается влево.
    Если число отрицательное, то массив циклически сдвигается вправо.
    По умолчанию массив циклически сдвигается на 1 элемент влево.
    Задание подразумевает самостоятельную реализацию циклического сдвига, т.е. использовать Array#rotate или Array#rotate! нельзя.
    C ростом размера сдвига скорость циклического сдвига, реализованного в Array#lab_rotate и Array#lab_rotate!, не должна значительно отличаться от скорости сдвига, реализованного в Array#rotate или Array#rotate! соответственно.
    С помощью модуля Benchmark произвести сравнение производительности Array#lab_rotate и Array#lab_rotate! c Array#rotate и Array#rotate! соответственно.
    Сравнение описать в файле my_array_rotate_benchmark.rb.

Пример работы программы:

$ irb
irb(main):001:0> require './my_array_rotate.rb'
=> true
irb(main):002:0> arr = (1..7).to_a
=> [1, 2, 3, 4, 5, 6, 7]
irb(main):003:0> arr.lab_rotate
=> [2, 3, 4, 5, 6, 7, 1]
irb(main):004:0> arr
=> [1, 2, 3, 4, 5, 6, 7]
irb(main):005:0> arr.lab_rotate!(-3)
=> [5, 6, 7, 1, 2, 3, 4]
irb(main):006:0> arr
=> [5, 6, 7, 1, 2, 3, 4]

Задание 4.2

  1. Код с решением поместить в файл my_hash.rb в папку с домашним заданием hometask-4.
  2. Реализовать класс MyHash подобно классу Hash.
    Для класса MyHash необходимо реализовать следующие операции:
  • Запись по ключу
  • Чтение по ключу
  • Удаление пары ключ-значение
  • Подсчет размера хэша
  • Очищение всех пар ключ-значение без создание нового объекта.
    Класс должен быть расширен модулем Enumerable.
    Задание подразумевает самостоятельную реализацию хэша, т.е. использовать Hash нельзя.
    C ростом числа пар ключ-значение скорост записи и чтения по ключу не должна значительно отличаться от стандартной имплементации Hash.
    С помощью модуля Benchmark произвести сравнение производительности реализаванных операций MyHash с операциями в Hash.
    Сравнение описать в файле my_hash_benchmark.rb.

Пример работы программы:

$ irb
irb(main):001:0> require './my_hash.rb'
=> true
irb(main):002:0> my_hash = MyHash.new
=> #<MyHash:0x00007ff1d38a3d98 ... >
irb(main):003:0> my_hash['hello'] = 'world'
=> "world"
irb(main):004:0> my_hash['hello']
=> "world"
irb(main):005:0> my_hash['foo']
=> nil
irb(main):006:0> my_hash.each do |k, v|
irb(main):007:1* print "#{k} => "
irb(main):008:1> puts v
irb(main):009:1> end
hello => world
=> #<MyHash:0x00007ff1d38a3d98 ... >

Задание 5

  1. Установить Postgres последней версии
  2. Задача пройти курс по основам баз данных, используя свой email.
  3. Скачать дамп базы данных магазина проката DVD дисков по ссылке.
    Применить дамп в базу данных на локали.
  4. Выполнить следующие запросы, поместив каждый запрос в отдельный SQL-файл с именем “#{номер_задания}.sql”:
    1. Достать список всех актеров с фамилией Zellweger
    2. Получить список фильмов с английским, немецким и итальянским языком
    3. Получить список актеров у которых имя начинается на W или фамилия заканчивается на H. Для каждого актера вывести только полное имя, соединенное через дефис, начиная с фамилии.
    4. Например, для актера William Hoffman - результирующая колонка будет ‘Hoffman-William’
    5. Подсчитать кол-во фильмов с одинаковым rental_duration, подчитать кол-во фильмов в каждой группе. В результирующей выборке получить только rental_duration и кол-во фильмов в этой группе.
    6. Подсчитать общее кол-во фильмов с каждым из языков. В результирующей выборке получить название языка и связанное с ним количество фильмов
    7. Написать запрос на создание самого любимого фильма, который вам нравится
    8. Написать запрос на редактирование нескольких атрибутов любого фильма
    9. Написать запрос на удаление фильмов которые вам не нравятся(это может быть по имени, категории или же еще по какому-нибудь вашему признаку)
    10. Не забывайте о каскадных связях с другими таблицами
    11. Вывести список актеров которые снимались более чем в двух фильмах
    12. Добавьте новую колонку со значением по умолчанию в таблицу film
    13. Удалите колонку из п. 4.10

Задание 6

Задание 6.1

  1. Код с решением поместить в файл scrapper.rb в папку с домашним заданием hometask-6.
  2. Написать скраппер onliner.by в CSV документ.
    C помощью Capybara предлагается зайти на onliner.by.
    Задача достать все новости из первых трех блоков(самый верхний блок - главные новости, “каталог”, “люди”) главной страницы, сохранив в CSV-документ следующие данные:
  • название новости
  • ссылку на картинку
  • первые 200 символов текста)

Задание 6.2

  1. B папкe с домашним заданием 4 hometask-4 cоздать папку spec c файлом my_hash_spec.rb.
  2. В файле my_hash_spec.rb c помощью Rspec описать unit-тесты имплементации MyHash из задания 4.2.
    Необходимо протестировать каждый публичный метод класса MyHash как позитивными, так и негативными сценариями.

Гайд по оформлению домашнего задания

Краткое описание

Код каждого домашнего задания должен быть отправлены на проверку в качестве PR (Pull Request). Только после того, как PR был проверен и одобрен ментором, PR можно мержить. Задание считается выполненым только после того, как оно было замержено. Все домашние задания должны находиться в папке с вашим ником в GitHub.

Инструкция по оформлению

  1. Сделать форк этого репозитория
  2. Сделать клон своего форка
  3. Создать ветку со своим ником и названием домашнего задания
  4. В корне репозитория создать папку с именем своего никнейма в GitHub
  5. В своей папке создать папку с названием домашнего задания
  6. В папке с домашним заданием создать все необходимые файлы с кодом
  7. По завершению задания добавить изменения, cоздать запушить коммит в свою ветку
  8. Создать PR с домашним заданием для ветки rubylab-2021-2022
  9. Скинуть ссылку на PR своему ментору и дождаться его ревью
  10. Замержить PR, если ментор одобрил PR