Чёрная Лямбда: новое направление летней школы

10.08.2017

Не далее чем в июле прошла очередная школа GoTo. В этот раз мы решили внести некоторое разнообразие в стандартный набор Ардуин, Питонов, и прочих, и случился Хаскелль. Небольшое отделение из 6 юношей (кусочек нашего общего взвода в 60 человек) бодро промаршивало по lambda-исчислению, основам синтаксиса, прошло посвящение в ФП написанием факториала, посворачивало списки, научилось словосочетанию "параметрически полиморфная функция высшего порядка" и присущему этому пониманию типов и тайпклассов под предводительством ефрейтора Волкова. А ещё у нас были элементы инфобеза, криптовалюты, React Native, `nix`, и, конечно, `git`.

И мы начали писать книгу про Haskell. В общем, получилось задорно.

Для того, чтобы завлечь школьников, мы назвали направление "Прикладное Программирование: Курс Молодого Бойца 2" (как логическое продолжение КМБ1). В уверенности, что их ждёт логическое продолжение Telegram-ботов, они даже не подозревали...

Начали мы с lambda-исчисления.

Через интересные выражения мы выяснили, почему 20 / 2 = 5 * 2, что сходится, а что расходится, что такое alpha equivalence и parser combinators, только без parser. И узнали, как работает каррирование.

Одной из концепций направления было как бы сочетание в себе других: биоинформатики, прикладного программирования и анализа данных, и задачи были соответствующие: найти комплементарную ДНК-цепочку, закодировав ДНК в типах, сделать HTTP-клиент для школьного банка и определить класс илососа по вектору сэмплов качества его работы.

```haskell

data AA = A | C | G | T

```

В конце первой недели участников ждала прогрессивная преподавательская концепция: спортивный зачёт. Узнав свой вопрос, нужно было пробежать ~350м и ответить сразу после; думать во время бега.

Где-то здесь мы изучили `git`; я посчитал своим долгом сказать про посылку патчей по почте, но мы всё же использовали GitHub и GitLab. Сделали простые сайты на Pages.

`$ git format-patch <...>`

Прошли функции высшего порядка и затронули свёртки (folds). Решили задачу про илососов: дана квадратная матрица `ilosos_id` / `sample_id` (строки - илососы, столбцы - измерения качества сосания), найти класс (первый, второй, ...) каждого из илососов.

`[0.2, 0.44, 0.9, 0.3, 0.6]` => `0.488` => `Ilosos3`

Сначала вектор сворачивается в среднее (здесь - арифметическое), а потом преобразуется в конкретный тип: `Ilosos3 :: Ilosos`. Ещё мы начали использовать `stack`: эту задачу можно было сдавать только как stack-проект, и только через `git`.

Прошёл второй зачёт с устной и письменной частями (в обоих случаях средний балл - `0.6`) и лекция по MapReduce, и настало время инфобез-интермиссии (спонтанные получасовочки случались и раньше; эта же интермиссия продлилась три пары).

Мы обсудили, как работают криптовалюты from the ground up - от хэшей и до (почти) биткоина, что не так с мессенджерами (централизация коммуникаций, фрагментация, не-secure by default...), и - немножко - в чём вообще важность свобод и почему глобальная слежка - не всегда замечательная идея.

Попутно выяснилось, что антиутопии нынче у поколния ЕГЭ не в ходу: 80% аудитории не читало ни "1984", ни "Мы", ни "Дивный новый мир".

Происходило это уже не в аудитории, а в открытом λектории.

И вдруг обнаружилось неожиданное: если что-то услышать, но не сделать на это упражнений (как с Haskell) или не записать, то это легко забыть. Поэтому появилась концепция: писать конспект. Но не просто, а вместе (в Etherpad).

Я здесь уже пишу, функтор ты контравариантный!

Стало понятно, что тимворк - это сложно.

После окончания интермиссии мы разделились: маленькие любители криптографии пошли писать RSA (и прочие MapReduce), а маленькие графоманы - писать книгу по Haskell.

Потому что, если во время курса тебе было сложно читать из множества источников теорию на английском, то почему бы не написать свою, хорошую, годную и нестрашную?

И написали же! (Пока что только главу с обложкой, но всё же.) -- More on that later.

А ещё были мастерклассы: по React Native и Scala. В общем, получилось задорно.

Но мало. Так, внимательный читатель заметит, что слова на букву "м" выше нет. И про криптовалюты мы только поговорили, а свою не сделали. И даже распределённый чатик на libp2p не успели.

Поэтому хочется повторить, и с размахом. Вот мы и вводим новое направление Чёрная Лямбда.

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

Это не плохо, но несколько ограничивает.

Поэтому на Лямбде мы будем двигаться в две стороны: в одну - абстракции срывая, и в другую - абстракции вводя. Вниз и вверх, в железо и в математику соответственно. Напишем hello world на Питоне - и расковыряем его интерпретатор. Напишем свой mu-питон. Поковыряем байткод и структуры данных. Клавиатуру и её прошивку и merkle-деревья. Таки сделаем свою криптовалюту. На Rust'е. Попишем на C, чтобы понять, зачем Rust нужен. Изучим моноиды, и поймём, почему полугруппа - это как группа, только чуть меньше.

В планах - пары на улице, прогулочный семинар, странные плакаты и светодиоды в волосах. И ботать.

Приходите, cледующая смена - с 16 по 29 августа. А если поботать - можно получить скидку или даже грант на приход.

Вот таски:

Код можно писать на произвольном языке, компилировать в Brainfuck-подобные нельзя. Не стесняйтесь задавать вопросы, адрес указан внизу.

Все задачи ниже реальны, и их решение поможет реальным людям. Про них можно будет писать статьи, вешать в своё резюме, пользоваться ими (!) и так далее. Можно сделать значимую часть, поехать, рекрутировать на школе товарищей и доделать вместе и с ментором. Техническая документация приветствуется, и при должном уровне даже в отдельности от кода может принести вам плюшку (т.е. если вы весь таск хорошо продумаете, но код не напишите - это тоже неплохо).

##### Блокчейн

Сделать криптовалюту, майнинг в которой совершается не hashcash, а деланием чего-то полезного (например, написанием статей на хабр). С полезностью должно согласиться большинство, причём взвешенное (т.е. разные ноды имеют разный, априори заданный вес). Криптовалюта должна быть основана на блокчейне (один сервер с одной базой данных обычно этому не удовлетворяет).

Мы хотим использовать такую валюту для выдачи плюшек участникам. Кроме того, через смарт-контракты хочется закреплять обещания ("я точно закончу этот проект после смены").

##### Криптографически умный замок

Часто СКУД-системы и прочие хипстерские NFC-замки [уязвимы к простым в реализации атакам типа копирования карты](https://media.ccc.de/v/33c3-8019-lockpicking_in_the_iot).

Задача: сделать замок для хакспейса, которым сможет пользоваться бабушка, и который будет максимально безопасен и при этом дешёв. Чем более массово доступные компоненты используются - тем лучше.

Требования (сортировка по важности):

- устойчивость к копированию ключа и replay-атакам

- возможность открыть дверь удалённо

- разные привилегии для разных пользователей

- расширяемость до нескольких дверей (или понимание, как это возможно было бы сделать)

- возможность дать временный доступ произвольному человеку

Результат - это софт + список компонентов с прайсами и ссылками для закупки.

Делать непосредственно физический замок необязательно, достаточно софта, который смог бы дёргать условные функции `open :: Door -> IO ()` и `close :: Door -> IO ()`. В целях демонстрации можно просто писать в консоль.

##### Telematrix

Взять Telegram Web / Desktop / Android и вставить в него поддержку протокола Matrix.org. Telegram - мессенджер с отличным UX, но сомнительным криптографически протоколом, привязкой к паспорту и местоположению (через телефон) и одной компании. Matrix.org - хороший технически открытый протокол с поддержкой вещей, которые Telegram не умеет (зашифрованные group chat'ы, федерация, видеоконференции, ...), но с не очень user-friendly клиентами.

Кажется, можно сделать мир лучше с относительно небольшим количеством усилий, совместив их свойства: хороший протокол Matrix и хороший UX Telegram.

##### Прототип нового CLI для Nix

Консолидировать дискуссию в https://github.com/NixOS/nix/issues/779 и, согласно этому, сделать прототип CLI. Nix- package manager с уникальными фичами (атомарность, reproducible builds w/binary caches, возможность установить программы, зависящие от разных версий библиотеки без статической линковки, удобство для разработчиков). Однако его текущий CLI довольно сложен для новичков.

Идея: сделать более консистентный CLI со знакомыми командами, типа `nix install`.

##### Package / project manager для Haskell на основе Nix

Сейчас стандартное средство для управления зависимостями в Haskell - это Stack. Он хорош, но в сочетании с необходимостью управлять не-haskell зависимостями (например, если проекту нужен написанный на C `zlib`), с которой отлично справляется Nix, вносит излишнюю сложность: достаточно использовать просто Nix для всего. При этом нужно использовать стандартный формат описания Haskell-пакетов (который использует и Stack) - Cabal.

Задача: сделать утилиту с интерфейсом, похожим на Stack (`stack build`, `stack ghci`, `stack test`, ...), но использующую Nix under the hood. Она должна быть максимально простой в использовании и идемпотентной (также см. [What makes Stack special](https://docs.haskellstack.org/en/stable/GUIDE/#what-makes-stack-special)).

Проекты, которые близки, но не совсем то: https://github.com/sol/tinc, https://github.com/jyp/styx. Можно форкнуть их.

##### Web-EDSL для Haskell

Сейчас в экосистеме Haskell для генерации статических сайтов через EDSL есть интересность: существуют хорошие решения для HTML (`blaze-html` / `lucid`) и для CSS (`clay`), но их нельзя удобно совместить.

То есть нельзя сделать чего-то типа

-- Теоретический продукт порочного союза `lucid` и `clay`

-- Стиль селекторов / комбинаторов (`p_` vs `p` / `color` vs `color_`) - открытый вопрос.

-- Как и стиль форматирования кода.

css = do p_ ? color red

b_ ? color yellow

article_ ?

do strong_ ? background black

abbr_ <? fontVariant smallCaps

skills = section "Skills" $

div_ [style_ $ (background black) <> (dashed (px 2) yellow)] $ do

skills_row "Infra"

skills_row "Low-level"

И совсем нельзя сделать функциональный аналог Web Component. Также происходит дупликация: и HTML, и CSS-библиотеки реализуют весь набор HTML-элементов (вторые - для селекторов).

Задача: сделать с этим что-нибудь. Вероятно, лучшим решением было бы реализовать нечто наподобие `clay` на основе низкоуровневой библиотеки из `blaze-html`.

Зачем это вообще нужно: идея в том, чтобы при создании статических сайтов программировать в стиле, похожем на компоненты React или Web Components, т.е. выделяя абстракции и переиспользуя их, со всеми плюшками языка с системой типов.

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

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

Если вам уже за 19-20, возможно, вам было бы интересно быть ментором или спикером - пишите.