https://blog.rust-lang.org/2023/12/21/async-fn-rpit-in-traits.html
Вот это да, что таки заехало в rust 1.75.
Хорошее
Вот это да, что таки заехало в rust 1.75.
Хорошее
👎4👍3
Forwarded from Веб-платформа
Сейчас уже нет Настоящего Айкидо. В наше время айкидо называется, когда два чудака лупят друг друга пятками в челюсть или ломают друг другу суставы, или не знаю, чем они там ещё занимаются, не видел никогда.
А Настоящее Айкидо — оно было совсем другое. Оно заключалось в том, чтобы победить Неприятеля так, чтобы самому не сильно напрягаться. Для этого даже не обязательно с этим Неприятелем встречаться.
Вот скажем принесли вам в разработку макеты с Неведомой Фичей. Как её сделать — хз, нет понимания.
Приходит вам в голову мысль, как реализовать эту фичу с помощью Костылей. «Что поделать, инженерия — она такая», — думаете вы и берётесь за работу. В процессе к одному Костылю приходится прилепить ещё парочку и скрепить это для прочности подручными материалами. В общем, вы по ходу встречаете всё большие сложности и затем героически с ними боретесь. Получившееся решение громоздкое, хрупкое, но время на него уже потрачено, выкинуть жалко, да и в целом оно работает (почти всегда), так что что уж тут, оставляем.
Вроде бы вы и победили, но гаденько как-то, нет этого приятного ощущения, ради которого вы когда-то давно вообще этим всем начали заниматься. Это не Настоящее Айкидо.
Либо же вы ищете похожую задачу на Стэковерфлоу или спрашиваете у Чат-бота. И таким образом вы находите «Либу, которая решит все ваши проблемы». Правда помимо вашей задачи она решает ещё и парочку других проблем по пути, ну и тянет набор зависимостей на 500кб. Но это ладно, думаете вы, фичу-то надо сделать ещё вчера. «Ок, для временного решения сойдёт», — решаете вы и используете либу.
А потом, спустя год-другой нужно вам зависимости проекта обновить и вы находите эту либу, вспоминаете что к чему, хотите версию этой либы заодно поднять. Но либа уже заброшена владельцем и вообще новым Реактом не поддерживается. «Что поделать, надо выпиливать», — думаете вы и снова оказываетесь в самом начале.
Это не победа, Неприятель вас обхитрил, притворился побеждённым и вам снова нужно с ним сражаться. Это тоже не путь Настоящего Айкидо.
А как бы поступил Мастер Настоящего Айкидо? Он бы сел, подумал и вспомнил, что Браузер, для которого он пишет программу, уже и сам умеет в нужную фичу. И вот Мастер на митинге скажет «Это умеет Платформа», а потом возьмёт и напишет несколько строк кода, чтобы дёрнуть нужный браузерный API, закроет задачу и пойдёт пить чай. И его решение никогда не протухнет, ведь Платформа всегда обратно совместима.
Мастер Настоящего Айкидо прилагает большего всего сил, чтобы освоить базу, и затем стремится к применению усвоенных принципов. А когда ему приходит мысль, что ему всё ясно, то он говорит себе: «Этого недостаточно», и идёт дальше копать Базу. 🥷
А Настоящее Айкидо — оно было совсем другое. Оно заключалось в том, чтобы победить Неприятеля так, чтобы самому не сильно напрягаться. Для этого даже не обязательно с этим Неприятелем встречаться.
Вот скажем принесли вам в разработку макеты с Неведомой Фичей. Как её сделать — хз, нет понимания.
Приходит вам в голову мысль, как реализовать эту фичу с помощью Костылей. «Что поделать, инженерия — она такая», — думаете вы и берётесь за работу. В процессе к одному Костылю приходится прилепить ещё парочку и скрепить это для прочности подручными материалами. В общем, вы по ходу встречаете всё большие сложности и затем героически с ними боретесь. Получившееся решение громоздкое, хрупкое, но время на него уже потрачено, выкинуть жалко, да и в целом оно работает (почти всегда), так что что уж тут, оставляем.
Вроде бы вы и победили, но гаденько как-то, нет этого приятного ощущения, ради которого вы когда-то давно вообще этим всем начали заниматься. Это не Настоящее Айкидо.
Либо же вы ищете похожую задачу на Стэковерфлоу или спрашиваете у Чат-бота. И таким образом вы находите «Либу, которая решит все ваши проблемы». Правда помимо вашей задачи она решает ещё и парочку других проблем по пути, ну и тянет набор зависимостей на 500кб. Но это ладно, думаете вы, фичу-то надо сделать ещё вчера. «Ок, для временного решения сойдёт», — решаете вы и используете либу.
А потом, спустя год-другой нужно вам зависимости проекта обновить и вы находите эту либу, вспоминаете что к чему, хотите версию этой либы заодно поднять. Но либа уже заброшена владельцем и вообще новым Реактом не поддерживается. «Что поделать, надо выпиливать», — думаете вы и снова оказываетесь в самом начале.
Это не победа, Неприятель вас обхитрил, притворился побеждённым и вам снова нужно с ним сражаться. Это тоже не путь Настоящего Айкидо.
А как бы поступил Мастер Настоящего Айкидо? Он бы сел, подумал и вспомнил, что Браузер, для которого он пишет программу, уже и сам умеет в нужную фичу. И вот Мастер на митинге скажет «Это умеет Платформа», а потом возьмёт и напишет несколько строк кода, чтобы дёрнуть нужный браузерный API, закроет задачу и пойдёт пить чай. И его решение никогда не протухнет, ведь Платформа всегда обратно совместима.
Мастер Настоящего Айкидо прилагает большего всего сил, чтобы освоить базу, и затем стремится к применению усвоенных принципов. А когда ему приходит мысль, что ему всё ясно, то он говорит себе: «Этого недостаточно», и идёт дальше копать Базу. 🥷
👎27🔥8👍6❤5🌚4
Я очень люблю разные инструменты для анализа знаний и принятия решений.
6 лет назад попробовал матрицу Эйзенхауэра. И по сей день исследую вопрос рационального применения своих ресурсов. Текущий статус: тревожное расстройство, выгорание. Но кажется, что это не связано с попытками использовать время эффективно.
Хочу поделиться целым набором очень полезных инструментов
https://untools.co/
6 лет назад попробовал матрицу Эйзенхауэра. И по сей день исследую вопрос рационального применения своих ресурсов. Текущий статус: тревожное расстройство, выгорание. Но кажется, что это не связано с попытками использовать время эффективно.
Хочу поделиться целым набором очень полезных инструментов
https://untools.co/
🔥15❤8🗿3👍1👎1
Опять эти антивирусы.
У меня в квартире сидят два друга с разными ноутбуками.
У одного Касперский внезапно кричит, что была обнаружена атака, в ЛОКАЛЬНОЙ сети.
В это время, второй нажимает в своем Avast сканирование локальной сети.
У меня в квартире сидят два друга с разными ноутбуками.
У одного Касперский внезапно кричит, что была обнаружена атака, в ЛОКАЛЬНОЙ сети.
В это время, второй нажимает в своем Avast сканирование локальной сети.
❤15😁13
Я давненько пишу на эффекторе и зачастую упираюсь в некоторые не очень красивые или практичные решения в проектах, в которые прихожу.
В этот раз хочу рассказать о решении позволяющем отделить сложную логику находящуюся между страницами. Обычно это длинные флоу, где нужно провести пользователя по конкретному сценарию:
- начинать нужно с определенных страниц
- можно возвращаться обратно и что-то редактировать
- в некоторых случаях можно переходить к середине сценария
- каждый переход на последущую страницу это несколько проверок, а может и запросы к бекенду
Хочу рассмотреть очень простой пример: Страница логина с 2FA аутентификацией.
Моя цель: отделить код самих страниц друг от друга, а также вынести код перехода между страницами и все эти правила за пределы страниц.
Тогда все, что касается страницы логина будет лежать в:
При этом код отвечающий за проверки логики между страницами в:
Можно представить модель каждой страницы как черный ящик с событиями, этот подход позволяет упростить редактирование страниц, а снаружи можно:
1) запустить процесс, дернув событие
2) отправить .abort внутрь модели
3) подписаться на успешное завершение логики модели
4) подписаться на завершение с ошибкой
5) и еще добавить кастомные события в зависимости от бизнес-логики
В моём случае, каждая модель страницы экспортирует что-то вроде:
В процессе обработки мы можем заимпортировать все нужные нам модели страниц и построить любую логику:
Когда процесс логина завершится успешно, начинаем процесс двухфакторной аутентификации.
Это самый примитивный пример, но с его помощью можно строить довольно сложные процессы.
В этот раз хочу рассказать о решении позволяющем отделить сложную логику находящуюся между страницами. Обычно это длинные флоу, где нужно провести пользователя по конкретному сценарию:
- начинать нужно с определенных страниц
- можно возвращаться обратно и что-то редактировать
- в некоторых случаях можно переходить к середине сценария
- каждый переход на последущую страницу это несколько проверок, а может и запросы к бекенду
Хочу рассмотреть очень простой пример: Страница логина с 2FA аутентификацией.
Моя цель: отделить код самих страниц друг от друга, а также вынести код перехода между страницами и все эти правила за пределы страниц.
Тогда все, что касается страницы логина будет лежать в:
src/pages/auth-login/model.ts
При этом код отвечающий за проверки логики между страницами в:
src/processes/login/model.ts
.Можно представить модель каждой страницы как черный ящик с событиями, этот подход позволяет упростить редактирование страниц, а снаружи можно:
1) запустить процесс, дернув событие
2) отправить .abort внутрь модели
3) подписаться на успешное завершение логики модели
4) подписаться на завершение с ошибкой
5) и еще добавить кастомные события в зависимости от бизнес-логики
В моём случае, каждая модель страницы экспортирует что-то вроде:
// Should be called only from outside, here just listen
export const inputs = {
started: createEvent(),
aborted: createEvent(),
};
// Should be called by this model
export const outputs = {
finished: createEvent<UserSession>(),
};
В процессе обработки мы можем заимпортировать все нужные нам модели страниц и построить любую логику:
import * as loginModel from '@/pages/auth-login';
import * as login2FaModel from '@/pages/auth-login-2fa';
sample({
clock: loginModel.outputs.finished,
target: login2FaModel.inputs.started,
})
Когда процесс логина завершится успешно, начинаем процесс двухфакторной аутентификации.
Это самый примитивный пример, но с его помощью можно строить довольно сложные процессы.
Первые два sample (15-25 строки) можно представить в виде вот такой диаграммы.
В данном случае, я вынес этот код в отдельный слой processes (по FSD), но это не обязательно.
Как в комментариях к предыдущему посту правильно заметили это просто pub/sub механика, реализованная вручную на effector.
Я показываю лишь пример реализации, которую можно усложнить или упростить в зависимости от задачи и договоренностей в команде.
———
Визуализация effector в виде блок-схем это довольно двоякая задача. Пример можно глянуть на anode.effector.dev.
Но основную сложность я вижу в том как выбирать какие семплы/ноды склеивать в общую схему, а какие разбивать на две.
На моей диаграмме, я записал два семпла как две разные схемы. Но можно было и склеить, чтобы не было дублирования loginModel.
К сожалению, так работает не всегда.
В данном случае, я вынес этот код в отдельный слой processes (по FSD), но это не обязательно.
Как в комментариях к предыдущему посту правильно заметили это просто pub/sub механика, реализованная вручную на effector.
Я показываю лишь пример реализации, которую можно усложнить или упростить в зависимости от задачи и договоренностей в команде.
———
Визуализация effector в виде блок-схем это довольно двоякая задача. Пример можно глянуть на anode.effector.dev.
Но основную сложность я вижу в том как выбирать какие семплы/ноды склеивать в общую схему, а какие разбивать на две.
На моей диаграмме, я записал два семпла как две разные схемы. Но можно было и склеить, чтобы не было дублирования loginModel.
К сожалению, так работает не всегда.
Снова вернулся к SSR на effector.
Так как у меня жутко болит от Next.JS, я поглядел в сторону Vite и его vite-plugin-ssr, который теперь называется Vike.
Файловый роутинг, куча хуков для кастомизации, любой UI-фреймворк, SSR, SSG, можно подключить свой роутер, любое направление деплоя.
Задача прикрутить к Vike effector, оказалась довольно тривиальной. Поверх Vike можно построить свой фреймворк с уже настроенными плагинами и структурой. В ближайшем проекте, которым я занимаюсь в свободное от курса время, будет Vike + Effector + React.
Мне очень нравится вайб этого проекта, очень похоже на Razzle, но с большим коммьюнити.
Так как у меня жутко болит от Next.JS, я поглядел в сторону Vite и его vite-plugin-ssr, который теперь называется Vike.
Файловый роутинг, куча хуков для кастомизации, любой UI-фреймворк, SSR, SSG, можно подключить свой роутер, любое направление деплоя.
Задача прикрутить к Vike effector, оказалась довольно тривиальной. Поверх Vike можно построить свой фреймворк с уже настроенными плагинами и структурой. В ближайшем проекте, которым я занимаюсь в свободное от курса время, будет Vike + Effector + React.
Мне очень нравится вайб этого проекта, очень похоже на Razzle, но с большим коммьюнити.
👍25🔥8 8👎1
Волшебная ситуация
Чел выложил на свой статический сайт 3.44MB .mp3
Кто-то решил задудосить его скачивая файл множество раз с кучи устройств. А Netlify, где был выложен статический сайт, выставил счет на $104К.
Я был в подобной ситуации, когда игрался с Kubernetes на AWS. Но там мне прилетело около $20К, после разговора с поддержкой, счет аннулировали.
P.S.
Буквально час назад Matt CEO of Netlify написал, что счет тоже будет аннулирован. Спасибо за ссылку в комментах.
Но любопытно, все было бы точно также, если бы чел не написал о своей ситуации в Reddit, и там это не вызвало волну комментов?
Чел выложил на свой статический сайт 3.44MB .mp3
Кто-то решил задудосить его скачивая файл множество раз с кучи устройств. А Netlify, где был выложен статический сайт, выставил счет на $104К.
Я был в подобной ситуации, когда игрался с Kubernetes на AWS. Но там мне прилетело около $20К, после разговора с поддержкой, счет аннулировали.
P.S.
Буквально час назад Matt CEO of Netlify написал, что счет тоже будет аннулирован. Спасибо за ссылку в комментах.
Но любопытно, все было бы точно также, если бы чел не написал о своей ситуации в Reddit, и там это не вызвало волну комментов?
🔥20🤯10😢3👎1🤔1
Жду запуска 3 старшипа.
Любопытно, что чуваки из spacex успели починить в такой огромной ракете.
Любопытно, что чуваки из spacex успели починить в такой огромной ракете.
🤷♂4😐3👍2😁2
Вот читаю я это и не понимаю
В чём смысл всей этой возни с хуками для экшенов и форм?
Упростить создание лендингов с инпутом и кнопкой подписки?
https://github.com/facebook/react/pull/28491
В чём смысл всей этой возни с хуками для экшенов и форм?
Упростить создание лендингов с инпутом и кнопкой подписки?
https://github.com/facebook/react/pull/28491
🤷♂10👍4
Сейчас узнал, что Cloudflare постепенно становится таким маленьким AWS.
У них также куча своих сервисов. Например, можно запускать ML-модели — https://developers.cloudflare.com/workers-ai/
У них также куча своих сервисов. Например, можно запускать ML-модели — https://developers.cloudflare.com/workers-ai/
Cloudflare Docs
Overview · Cloudflare Workers AI docs
Workers AI allows you to run AI models in a serverless way, without having to worry about scaling, maintaining, or paying for unused infrastructure. You can invoke models running on GPUs on Cloudflare's network from your own code — from Workers, Pages, or…
❤5🔥3😁1😱1
Помните раньше были такие кодмоды?
Они писались крайне редко и очень сложно. Просто поглядите по ссылке выше и в пакеты от того же facebook.
Нужно неплохо так понимать как устроено AST конкретного языка и конкретного парсера.
Только для javascript есть около 20 парсеров,хоть и не у всех уникальный AST .
Как утверждают авторы Grit, достаточно разобраться в устройстве их языка GritQL, чтобы трансформировать любой поддерживаемый синтаксис.
На примере с картинки:
- шаблон по которому ищем:
-
- слева от
-
- выражение слева от
- а там составной паттерн
Это может показаться слишком простым, но в языке можно переиспользовать буквально каждую часть: функции, предикаты и паттерны.
Можно делать кодмоды, а можно сделать линтер с продвинутыми фиксами.
https://docs.grit.io
Они писались крайне редко и очень сложно. Просто поглядите по ссылке выше и в пакеты от того же facebook.
Нужно неплохо так понимать как устроено AST конкретного языка и конкретного парсера.
Только для javascript есть около 20 парсеров,
Как утверждают авторы Grit, достаточно разобраться в устройстве их языка GritQL, чтобы трансформировать любой поддерживаемый синтаксис.
На примере с картинки:
- шаблон по которому ищем:
console.$method($my_message)
.-
$name
это так называемые метапеременные, вроде ссылок на AST-ноды.- слева от
=>
шаблон по которому ищем, а справа на что будем заменять.-
where
описывает список условий, при которых сработает матч паттерна и замена.- выражение слева от
<:
соответствует паттерну справа- а там составной паттерн
or {}
, список в докеЭто может показаться слишком простым, но в языке можно переиспользовать буквально каждую часть: функции, предикаты и паттерны.
Можно делать кодмоды, а можно сделать линтер с продвинутыми фиксами.
https://docs.grit.io
🔥28👍7❤2
Для чего нужен effector patronum?
Конечно, всё, что есть в patronum можно реализовать своими руками. В некоторых случаях это довольно просто, в других придется помудрить с типами, а третьи еще умудриться протестировать.
Но главная цель — дать пачку реюзабельных операторов, которые уже протестированы, документированы и позволяют писать код короче.
Оператор format
Конечно, всё, что есть в patronum можно реализовать своими руками. В некоторых случаях это довольно просто, в других придется помудрить с типами, а третьи еще умудриться протестировать.
Но главная цель — дать пачку реюзабельных операторов, которые уже протестированы, документированы и позволяют писать код короче.
Оператор format
👍32🔥9😁5👎2 2
Хочу порекомендовать фронтенд-разработчика.
На случай если вы в компании сейчас нанимаете.
5 лет опыта: typescript, react, effector, redux, vue.
Довольно много разного опыта.
Писать сюда: @Nataliya_R7
В комментах CV.pdf
На случай если вы в компании сейчас нанимаете.
5 лет опыта: typescript, react, effector, redux, vue.
Довольно много разного опыта.
Писать сюда: @Nataliya_R7
В комментах CV.pdf
👍5🔥3❤2