Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Simplifying projects #7

Merged
merged 7 commits into from
Mar 17, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# Список изменений

Если вы уже сделали часть проекта, которую по новым правилам делать не нужно, -
ничего страшного, можно не переделывать (а можно и переделать, если вам так
проще).

- Бот:
- Теперь вместо второго мессенджера (VK) предлагается использовать консоль,
стандартный ввод-вывод. Это должно сильно уменьшить объем задания, сохранив
его дух: общее ядро логики и два механизма ввода-вывода.

- Сервер: убрали много ненужного, чтобы ускорить прохождение, и конкретизировали
требования.
- убрана сущность авторов. Вместо них у юзера появляется флажок "может
создавать новости".
- убраны поля фамилии и аватарки у юзеров
- убрана сущность тегов
- убрана сущность комментариев к новостям
- убрана сущность черновиков. Теперь новость может редактироваться и у нее
новый флажок "опубликовано".
- убрано поле главной фотографии у новости. Теперь новость может содержать
любое количество картинок, включая ноль.
- убраны API удаления всего.
- убраны API получения _одной сущности_ для всего, кроме картинок. Остальные
сущности возвращаются только списками.
- упрощена аутентификация.
- уточнение: фильтр новостей и сортировка должны задаваться в URI query
- уточнение: должно поддерживаться сразу несколько фильтров вместе с
сортировкой
- уточнение: запросы на редактирование должны поддерживать редактирование не
фиксированного количества полей (одного либо всех), а любого.
- уточнение требований к пагинации.
- уточнение требований к получению и созданию картинок. В ответе с новостями
нужно передавать URI картинок. В ответе с картинкой нужно посылать
правильный `Content-Type`.
- расширен список библиотек. Теперь можно использовать `servant` и любые
высокоуровневые библиотеки для СУБД.
- указаны запрещенные библиотеки.
16 changes: 10 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ github-репозиториев с созданием issues.
слабее, чем у коллеги, который системно с нуля делал парочку своих проектов.

В целом это должно быть отличной стажировкой для вас, мы готовы с радостью
отвечать на ваши вопросы (задавайте их в блипах под описанием каждого задания),
отвечать на ваши вопросы,
а сами задания мы постарались сделать такими, чтобы на выходе у вас был максимум
полезных практических и теоретических знаний. Еще нам бы очень хотелось видеть,
как вы сами кооперируетесь друг с другом и решаете вместе возникающие проблемы.
Expand All @@ -47,17 +47,21 @@ github-репозиториев с созданием issues.

[Почему именно Haskell](why-haskell.md)

[Первое задание: теория](theoretical-task.md)
[Важное требование: отчеты](how-to-learn.md)

[Второе задание: задачки по языку](exercises-task.md)
[Задание 1: теория](theoretical-task.md)

[Третье задание: бот](bot-task.md)
[Задание 2: задачки по языку](exercises-task.md)

[Четвертое задание: веб-сервер](server-task.md)
[Задание 3: бот](bot-task.md)

[Пятое задание: ревью](review-task.md)
[Задание 4: веб-сервер](server-task.md)

[Задание 5: ревью](review-task.md)

[Интервью по теоретическим вопросам](interview.md)

[Список изменений](CHANGELOG.md) поможет понять, что изменилось в требованиях к
заданиям, которые мы периодически дорабатываем.

[students-chat]: https://t.me/learn_haskell_with_fsd
30 changes: 20 additions & 10 deletions bot-task.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,22 @@
Нужно написать эхо-бота, который умеет просто отправлять сообщение от
пользователя ему же в ответ.

Бот должен иметь возможность работать через несколько мессенджеров, пока как
минимум сделать имплементацию для Telegram и для VK:
Бот должен уметь работать с сообщениями через несколько механизмов доставки:

- консоль: сообщение пользователя вводится со стандартного ввода, ответ бота
выводится в стандартный вывод (например, с помощью
[`getLine`](https://hackage.haskell.org/package/base-4.16.0.0/docs/Prelude.html#v:getLine)
и
[`putStrLn`](https://hackage.haskell.org/package/base-4.16.0.0/docs/Prelude.html#v:putStrLn)).
- Telegram: https://core.telegram.org/bots/api#poll
- VK: https://vk.com/dev/bots_longpoll

Вместо Telegram можно выбрать VK (см. [документацию](https://vk.com/dev/bots_longpoll) или Slack.


## Функциональные требования


1. Пользователь может отправить команду /help и увидеть текст, описывающий бота.
1. Пользователь может отправить команду `/help` и увидеть текст, описывающий бота.

2. Пользователь может отправить команду `/repeat`, и в ответ бот отправит, какое
сейчас выбрано значение повторов и вопрос, сколько раз повторять сообщение в
Expand All @@ -25,14 +30,16 @@
пользователь выбрал 3 повторения, то второму мы по-прежнему показываем
начальное кол-во сообщений.

3. Все должно быть максимально кастомизируемо через конфиги
3. Все должно быть максимально кастомизируемо через конфиги:

1. Сообщение, отправляемое в ответ на `/help`.
2. Вопрос по команде `/repeat`.
3. Начальное кол-во повторов на каждый ответ.

4. Бот должен уметь повторять только текстовые сообщения и стикеры. Остальные
виды сообщений можно игнорировать.
4. Бот должен уметь повторять только текстовые сообщения и какой-нибудь один вид
мультимедийных сообщений (например, стикеры или картинки). Остальные виды
сообщений можно игнорировать. Конечно, этот пункт не распространяется на
сообщения из консоли.


## Технические требования
Expand All @@ -49,16 +56,17 @@
2. Все остальное должно быть сделано по максимуму без библиотек. Для тестов
можете использовать любой удобный вам инструмент (`hspec`, `HUnit`, etc).

3. Обновления от Телеграма и ВК получать не посредством веб-хуков, а посредством
3. Обновления от Телеграма получать не посредством веб-хуков, а посредством
поллинга. Отправлять запрос за апдейтами телеграму, тот сам будет ставить
ответ на паузу, если обновок нет, и отвечать сразу, как только что-то
появилось. Ну или отвечать пустым массивом по таймауту. Это требование вкупе
с тем, что в следующем задании надо будет свой сервер на `Warp` реализовать,
поможет лучше понять, что такое модель поллинга и модель пуша (через
веб-хуки), в чем преимущества и недостатки каждой из моделей.

4. Боты не обязательно запускать параллельно, а можно определять, какой бот
запустить, на основе конфига или аргументов запуска программы.
4. Результатом должно быть одно приложение, а не два. В каком режиме его
запускать (Telegram или консоль), определяется параметром в конфиге или
опцией командной строки.


## Следующие технические требования также распространяются и на следующее задание "Веб-сервер"
Expand Down Expand Up @@ -118,8 +126,10 @@
проекта необязательно забивать себе ими голову — потом успеете, но,
все-таки, если знать их заранее, придется меньше исправлять.


## Источники


* Для начала можно посмотреть [простую
статью](https://www.bekk.christmas/post/2019/23/making-a-small-haskell-application)
про то, как начать собирать первое приложение по отправке HTTP-запроса и
Expand Down
49 changes: 49 additions & 0 deletions exercises-task.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# Второе задание: задачки по языку


https://www.schoolofhaskell.com/user/DanBurton/20-intermediate-exercises

Обязательные для прохождения каты:

1. [Бесконечные структуры](https://www.codewars.com/kata/functional-streams)

2. [Создание своих инстансов для 5 базовых монад](https://www.codewars.com/kata/five-fundamental-monads)

3. [Монадный стек Maybe + List + State](https://www.codewars.com/kata/escape-the-mines-or-die)

4. [Представление структур данных из функций](https://www.codewars.com/kata/scott-encoding/train/haskell)

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

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

5. [Изоморфизм (на самом деле довольно простая и интересная ката)](https://www.codewars.com/kata/isomorphism)

Необязательные для прохождения:

1. [Алгебраические изоморфизмы (после каты Изоморфизм)](https://www.codewars.com/kata/algebraic-isomorphism/haskell)

2. [Синглтоны](https://www.codewars.com/kata/54750ed320c64c64e20002e2)

Несложная ката, решив которую можно познакомиться с зависимыми типами.
Несмотря на то, что в Хаскеле на данный момент зависимых типов нет,
последние можно сымитировать при помощи некоторых расширений `ghci` и
типов-синглтонов - типов, имеющих только одно значение.

3. [Корутины](https://www.codewars.com/kata/547a77a6b84a1fb8bf000211)

4. [Lens](https://www.codewars.com/kata/54258ffb430ca2e4b5000239)

5. [Простой компилятор](https://www.codewars.com/kata/5265b0885fda8eac5900093b)

Обязательно попробуйте найти и пройти еще от 3-х кат (1, 2 или 3 kyu)
самостоятельно.

11 changes: 11 additions & 0 deletions how-to-learn.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# Важное требование: отчеты

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

Отчеты шлем в телеграм в [общую группу][students-chat].
**ВАЖНО!** После входа в группу нужно нажать на кнопку “Я не бот”, иначе вас выкинет из группы.

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


[students-chat]: https://t.me/learn_haskell_with_fsd
Loading