Что такое монада?
В комменатриях спрашивают: «А что такое эти ваши монады?»
Всем конечно же известо что монада - это моноид в категории эндофункторов🙃
Если совсем просто, монада - это контейнер с парой определённых методов.
Монад есть несколько разных видов. Если мы говорим об адекватном программировании, а не о фп извращениях типо хаскеля или скалы, то чаще всего используют монады Maybe, Either и Task. Называться они могут по другому, например Option, Result и Future.
Maybe либо содержит в себе результат, либо нет. Нужна она чтоб у нас не возникало проблем типо
Either либо содержит результат, либо ошибку. Нужна она чтоб не бросать исключения по каждому чиху.
Task нужно для выполнения асинхронных действий. У фронтендеров есть Promise, это плохая породия на Task, но в целом можно и с ним жить.
На самом деле в фп есть не только монады. Кроме них есть функторы и аппликативы. И всё это дело собирается в матрёшку.
Функтор - это контейнер у которого есть метод map. Map это функция которая как-то изменяет значения в контейнере.
Аппликатив - это функтор у которого есть метод ap. Ap позволяет вставить функцию внутрь контейнера, чтоб потом её можно было применить к нескольким контейнерам(в реальной жизни это примерно никогда не нужно, если вы конечно не захотите написать свою реализацию монад)
Монада - это аппликатив у которого есть метод chain. Chain позволяет взять значения из двух контейнеров, что-то с ними сделать и получить новый контейнер.
Там на самом деле всё немного сложнее, но в общих чертах так. А ещё ко всему этому применяется теория категорий(понятия не имею что это такое), но ходют слухи что оно вот прям на математическом уровне может доказать что все вычисления сходятся по типам, и никаких ошибок в рантайме быть не может.
Если вдруг всё равно нияего не понятно, есть клёвая статья с красивыми картинками: Функторы, аппликативные функторы и монады в картинках
Если хочется чуть глубже погрузится в фп в контексте фронтенда есть клёвая книга: Mostly adequate guide to FP (in javascript)
И перевод её на русский язык: Mostly adequate guide to FP (in javascript, translated to russian)
Если не понятно, а как в реальности то эти ваши монады могут помочь фронтендеру есть крутой доклад про обработку ошибок: Дмитрий Махнёв Артём Кобзарь — (не|ну)жная монада Either на практике и в теории
И эти же авторы написали достаточно удобную реализацию монад Either и Maybe для js: @sweet-monads
А если вы вдруг совсем упоролись и хотите писать на TS как на хаскеле, то есть прекрасная библиотека: fp-ts
В комменатриях спрашивают: «А что такое эти ваши монады?»
Всем конечно же известо что монада - это моноид в категории эндофункторов
Если совсем просто, монада - это контейнер с парой определённых методов.
Монад есть несколько разных видов. Если мы говорим об адекватном программировании, а не о фп извращениях типо хаскеля или скалы, то чаще всего используют монады Maybe, Either и Task. Называться они могут по другому, например Option, Result и Future.
Maybe либо содержит в себе результат, либо нет. Нужна она чтоб у нас не возникало проблем типо
undefined is not a function.Either либо содержит результат, либо ошибку. Нужна она чтоб не бросать исключения по каждому чиху.
Task нужно для выполнения асинхронных действий. У фронтендеров есть Promise, это плохая породия на Task, но в целом можно и с ним жить.
На самом деле в фп есть не только монады. Кроме них есть функторы и аппликативы. И всё это дело собирается в матрёшку.
Функтор - это контейнер у которого есть метод map. Map это функция которая как-то изменяет значения в контейнере.
Аппликатив - это функтор у которого есть метод ap. Ap позволяет вставить функцию внутрь контейнера, чтоб потом её можно было применить к нескольким контейнерам(в реальной жизни это примерно никогда не нужно, если вы конечно не захотите написать свою реализацию монад)
Монада - это аппликатив у которого есть метод chain. Chain позволяет взять значения из двух контейнеров, что-то с ними сделать и получить новый контейнер.
Там на самом деле всё немного сложнее, но в общих чертах так. А ещё ко всему этому применяется теория категорий(понятия не имею что это такое), но ходют слухи что оно вот прям на математическом уровне может доказать что все вычисления сходятся по типам, и никаких ошибок в рантайме быть не может.
Если вдруг всё равно нияего не понятно, есть клёвая статья с красивыми картинками: Функторы, аппликативные функторы и монады в картинках
Если хочется чуть глубже погрузится в фп в контексте фронтенда есть клёвая книга: Mostly adequate guide to FP (in javascript)
И перевод её на русский язык: Mostly adequate guide to FP (in javascript, translated to russian)
Если не понятно, а как в реальности то эти ваши монады могут помочь фронтендеру есть крутой доклад про обработку ошибок: Дмитрий Махнёв Артём Кобзарь — (не|ну)жная монада Either на практике и в теории
И эти же авторы написали достаточно удобную реализацию монад Either и Maybe для js: @sweet-monads
А если вы вдруг совсем упоролись и хотите писать на TS как на хаскеле, то есть прекрасная библиотека: fp-ts
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Сегодняшний день я потратил на сражение с 👩💻 S3.
S3 это протокол и амазоновский сервис для хранения файлов. Кроме амазона его юзают примерно все.
Вот и у нас тоже стоит селфхостед что-то(я даже не знаю что) умеющее в s3. Один из продуктов его использует и там всё ок. Нужно было добавить всё то-же самое во второй продукт. Казалось бы всё просто, скопировал код прослойки, добавил нужные вызовы и готово. Но тут начались странности. Бакет создаётся нормально, а значит с адресом/аутентификацией проблем нет. Но записать туда файл не выходит. При этом ошибка максимально странная.
И конечно же это не работает если у тебя селфхостед s3.
Но как же этот код работал в другом продукте? По случайности там в имени бакета используется нижнее подчёркивание.
Ебучий амазон🖕 Ебучие неочевидные дефолты 🤮 Никогда так не делайте.
Проблема решилась добавлением в конфиг флага
S3 это протокол и амазоновский сервис для хранения файлов. Кроме амазона его юзают примерно все.
Вот и у нас тоже стоит селфхостед что-то(я даже не знаю что) умеющее в s3. Один из продуктов его использует и там всё ок. Нужно было добавить всё то-же самое во второй продукт. Казалось бы всё просто, скопировал код прослойки, добавил нужные вызовы и готово. Но тут начались странности. Бакет создаётся нормально, а значит с адресом/аутентификацией проблем нет. Но записать туда файл не выходит. При этом ошибка максимально странная.
getaddrinfo ENOTFOUND. Какого-то чёрта амазон решил что будёт клёвой идеей в качестве эндпоинта юзать имя_бакета.хост/И конечно же это не работает если у тебя селфхостед s3.
Но как же этот код работал в другом продукте? По случайности там в имени бакета используется нижнее подчёркивание.
Ебучий амазон
Проблема решилась добавлением в конфиг флага
forcePathStyle.Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤1🔥1
Вдруг кому делать нечего. Тут начался декабрь, а значит и новый #adventofcode
Первый день совсем простой. Особенно если писать на чём-то высокоуровневом)
https://adventofcode.com/2022
Первый день совсем простой. Особенно если писать на чём-то высокоуровневом)
https://adventofcode.com/2022
🔥2
Пробовал сегодня постримить решение AoC. В целом схема рабочая, но меня подвел obs, в какой-то момент завис захват экрана(
Если будет не лень, завтра повторю попытку.
Запись доступна на ютубе, но учитывая что большую часть времени там зависший экран, смотреть не рекомендую)
https://youtu.be/qNLEyPCLHP4
Если будет не лень, завтра повторю попытку.
Запись доступна на ютубе, но учитывая что большую часть времени там зависший экран, смотреть не рекомендую)
https://youtu.be/qNLEyPCLHP4
YouTube
Advent of Code 22 день 4
Решаю задачки #adventofcode
https://t.iss.one/dskr_dev
https://t.iss.one/dskr_dev
Продолжил стримить AoC. В этот раз задача была простой, я не тупил и обс не тормозил. Поэтому справился меньше чем за 30 минут.
Единственная сложность задачи это распарсить входные данные. Ну и да, GitHub Copilot здорово помогает)
https://youtu.be/-4c2EdhvnyM
Единственная сложность задачи это распарсить входные данные. Ну и да, GitHub Copilot здорово помогает)
https://youtu.be/-4c2EdhvnyM
YouTube
Advent of code 22 день 5
Решаю задачки #adventofcode
https://t.iss.one/dskr_dev
https://t.iss.one/dskr_dev
❤3
Продолжаю решать AoC. День 7. И судя по инпуту там что-то страшное. Начну минут через 5.
https://www.youtube.com/watch?v=VfJOByXNXuM
https://www.youtube.com/watch?v=VfJOByXNXuM
YouTube
Advent of code 22 день 7
Решаю задачки #adventofcode
https://t.iss.one/dskr_dev
https://twitter.com/dskr_dev
https://t.iss.one/dskr_dev
https://twitter.com/dskr_dev
Второй день подряд горит 🔥 из-за проблемы с производительностью. Дошел до того что на две окружение всё летает, а в проде любой запрос выполняется по несколько десятков секунд. Если я это пофикшу, напишу детективную историю 🍵
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥2🔥1
Всего полтора месяца осталось до выхода TypeScript👩💻 5.0
Релиз мажорный потому что добавили долгожданные декораторы. И да, это те самые настоящие EcmaScript декораторы. Из клёвых фич ещё добавили const тайп параметры. Теперь при правильной типизации не придётся вечно писать as const.
Уже сейчас доступна бета
https://devblogs.microsoft.com/typescript/announcing-typescript-5-0-beta/
Релиз мажорный потому что добавили долгожданные декораторы. И да, это те самые настоящие EcmaScript декораторы. Из клёвых фич ещё добавили const тайп параметры. Теперь при правильной типизации не придётся вечно писать as const.
Уже сейчас доступна бета
https://devblogs.microsoft.com/typescript/announcing-typescript-5-0-beta/
Please open Telegram to view this post
VIEW IN TELEGRAM
Microsoft News
Announcing TypeScript 5.0 Beta
Today we’re excited to announce our beta release of TypeScript 5.0! This release brings many new features, while aiming to make TypeScript, smaller, simpler, and faster. We’ve implemented the new decorators standard, functionality to better support ESM projects…
🔥1
При предыдущем деплое фронтенда видимо погода плохая была. Из трех контейнеров в одном не проставились переменные окружения. Из-за чего часть функционала продукта не работали. И что самое печальное, из-за неправильных переменных окружения, логи не долетали до graylog. Ну точнее они то долетали, но найти их было не возможно. Тупо редеплой решил проблему.
Не люблю такие баги(
Не люблю такие баги(
Кроме автодополнения кода, нейросети можно использовать например для написания коммит мессаджей. Клёвая идея)
https://vxtwitter.com/nutlope/status/1625311440696446976
https://vxtwitter.com/nutlope/status/1625311440696446976
vxTwitter
Hassan El Mghari (@nutlope)
Announcing AI Commits – a CLI tool that generates your commit message for you with AI.
Available on npm today!
https://npmjs.com/package/aicommits
Available on npm today!
https://npmjs.com/package/aicommits
🔥1🤩1
Последнюю неделю я тыкаю апишку от openai. К сожалению 4 версия gpt не доступна, да и цены там не очень приятные, поэтому использую gpt 3.5.
В конечном резльтате получился бот для чатов который имеет несколько разных личностей, и умеет сохранять контекст внутри треда.
Базу было поднимать лень, да и бот больше для развлечения, поэтому контекст храню в lru-cache.
https://github.com/skrylnikov/anti-human-ai
В конечном резльтате получился бот для чатов который имеет несколько разных личностей, и умеет сохранять контекст внутри треда.
Базу было поднимать лень, да и бот больше для развлечения, поэтому контекст храню в lru-cache.
https://github.com/skrylnikov/anti-human-ai
GitHub
GitHub - skrylnikov/anti-human-ai
Contribute to skrylnikov/anti-human-ai development by creating an account on GitHub.
🔥1
Промты для разных личностей взял с сайта https://www.jailbreakchat.com/
Вставлять их лучше перед первым сообщением а не в системную роль. Ибо gpt 3.5 зачастую игнорит то что написанно в системной роли, в будущих версиях обещают поправить.
Вставлять их лучше перед первым сообщением а не в системную роль. Ибо gpt 3.5 зачастую игнорит то что написанно в системной роли, в будущих версиях обещают поправить.
🔥3
