- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
function* foo2() {
yield 2;
yield 3;
}
function* foo() {
yield 1;
yield* foo2();
yield 4;
}
function main() {
for (const o of foo()) {
print(o);
}
print("done.");
}
aderyabin 25.08.2021 00:03 # 0
Janycz 31.08.2021 14:57 # +1
j123123 31.08.2021 15:20 # 0
guest6 31.08.2021 15:34 # 0
https://learn.javascript.ru/generators
j123123 31.08.2021 16:38 # 0
И нахуя это? У меня в контроллере такой хуйни нет, и я не очень-то понимаю, нахуя это надо. Но намакроебить можно, да
guest6 31.08.2021 16:45 # 0
bormand 31.08.2021 18:40 # 0
Задачки в духе "собери 1000 семплов с АЦП, зожми их и отправь по UDP" и без корутин норм смотрятся. А для чего-то более сложного и длинного можно и тред поднять, контроллеру не надо обрабатывать тыщи клиентов.
З.Ы. Я сварщица не настоящая, возможно j123123 приведёт реальные примеры задач, где корутины ему бы помогли.
j123123 31.08.2021 19:28 # +1
Это конечно может и т.н. "парадокс Блаба", но надо бы придумать и "парадокс антиБлаба", когда какую-то хуйню, типа вот какой-то малозначительный синтаксиальный сахарок привозносят как какую-то мегаохуенную фичу, из-за которого всем резко надо валить на этот принципиально новый ЯП.
bormand 31.08.2021 19:30 # 0
Не, ну это логично. Просто сахарок для стейтмашины или файбера (смотря какая реализация).
j123123 31.08.2021 20:20 # +2
> Rust и парадокс Блаба
> Будучи руководителем проектов по языкам в Microsoft, я работаю над TypeScript – типизированной версией Javascript. В обязательном порядке, когда я выступаю перед аудиторией преимущественно JavaScript разработчиков и пытаюсь донести мысль о том, как здорово было бы попробовать добавить немного строгой типизации в Javascript, на меня смотрят хмурые лица. Всякий раз. Даже если она не обязательна. Даже после того как я опишу полдюжины преимуществ. Как и говорил Пол, это выглядит просто «странно». Для JavaScript-программистов TypeScript выглядит в основном тем же что и JavaScript, плюс куча стремной и непонятной фигни.
j123123 31.08.2021 20:21 # +1
Desktop 31.08.2021 20:47 # 0
guest6 28.08.2023 21:12 # 0
guest6 28.08.2023 21:50 # 0
ropuJIJIa 28.08.2023 21:18 # 0
Кстати, где ещё применялся ActionScript? В AIR, про который знало полтора человека?
guest6 28.08.2023 21:21 # +1
https://www.oreilly.com/library/view/flex-3-cookbook/9780596529857/ch01.html
ropuJIJIa 28.08.2023 21:32 # 0
Сразу ясно, что в btn может лежать только объект типа Button, а не число, не строка, не массив.
Почему он уступил место тупому JS?
guest6 28.08.2023 21:49 # 0
В айти всегда побеждает самое тупое тормозное неудобное решение, требующее максимальаное количество ручных проверок
guest6 28.08.2023 22:19 # 0
Один макак-гавноед из Сана насрал, а тыщи макаков скопировали
Тупее только "->" в пхп
ropuJIJIa 28.08.2023 23:11 # 0
Но вообще согласен, в крестах и в Object Pascal (в старой модели object, не в новой дельфёвой class) объекты можно было создавать в глобальной области, на стеке и в куче. В первых двух случаях алло-катор звать не нужно. В этих случаях конь-структор вызывается спецсинтаксисом (C++) или по имени (Object Pascal, да, в нём можно иметь несколько конь-структоров с разными именами).
-> в ПХП после крестов выглядит тупо, ибо там не надо ничего разыменовывать, но точку взять было нельзя, ибо она уже занята под конь-катенацию (культ Перла). Пришлось брать что-то другое и, недолго думая, взяли ->
guest6 28.08.2023 23:18 # 0
да, но зачем этому отдельное ключслово?
А вот в ObjC есть два отдельных метода: `alloc` и `init`, и еще звездочка у типа, хотя и ежу ясно, что это указатель.
>культ Перла
У перла всё таки нету отличия строки от числа на уровне типов (и то и то скаляр), а в пыхе есть. И стрелочка в перле тоже есть, но только лишь потому, что там есть понятие указателя. Это чуть-ли не единственный скриптоязык, где понятие "указатиель" настолько базовое, что без него просто массив в функцию не передашь.
Desktop 28.08.2023 23:24 # 0
guest6 28.08.2023 23:25 # 0
Desktop 28.08.2023 23:28 # 0
guest6 28.08.2023 23:29 # 0
ОБЫ́ЧНО, нареч.
Нареч. к обычный.
1. Жизнь в приемной протекала обычно. Секретарша ставила сургучные печати на пакет, посетители ожидали своей очереди. С. Антонов, Анкета.
2. Большей частью, постоянно, как правило. Днем он обычно спит. К вечеру оживляется. В. Кожевников, Бессонница. Гордей Андреевич со стиснутыми зубами метался в постели. Обычно терпеливый, --- на этот раз он изменил себе. Игишев, Шахтеры.
Desktop 28.08.2023 23:31 # 0
приведи реальный пример, когда new в obj c необычный, т.е., не является сочетанием alloc + init
guest6 28.08.2023 23:32 # +1
https://developer.apple.com/documentation/objectivec/nsobject/1571948-new
ropuJIJIa 28.08.2023 21:45 # 0
«Оригинал»: подвижные брови, миндалевидные глаза, обаятельные складки под глазами. Умер или уничтожен за кулисами публичного шоу в конце девяностых.
guest6 28.08.2023 22:51 # 0
кто-то флексит
ropuJIJIa 28.08.2023 23:13 # 0
3.14159265 31.08.2021 20:39 # 0
При том что она очень чисто заворачивается реализуется Сишным свитчом и заворачивается в макрос.
bormand 31.08.2021 20:55 # 0
Да не, не думаю...
Корутины -- это довольно нишевая хуй-ня: когда длинный алгоритм должен ждать каких-то ответов в куче точек, но при этом его нельзя взять и закинуть в тред (к примеру, потому что разрабы языка побоялсь давать обезьяне гранату или потому что вся прога будет состоять из этих закидываний в тред).
3.14159265 31.08.2021 20:57 # 0
Реально это можно сделать несколькими способами: функционушнёй, тем же паттерном «Итератор», а можно нагородить елдак.
CHayT 31.08.2021 21:00 # 0
bormand 31.08.2021 21:05 # +1
Доказано node.js
CHayT 31.08.2021 21:07 # 0
bormand 31.08.2021 21:27 # 0
CHayT 31.08.2021 22:02 # +1
Нормальную вытесняющую многозадачность с помощью CPS сделать трудно, поэтому она сделана на уровне рантайма.
* JIT очень простой, и он переиспользует регистры VM, поэтому его можно особо не рассматривать.
guest6 29.08.2023 01:24 # 0
А регистры у VM ограничены, или их стописот как у llvm?
bormand 31.08.2021 21:01 # 0
Вот рекурсивный обход каких-то сложных и нерегулярных структур -- более менее реальный пример, когда мне реально хочется юзать генератор.
guest6 31.08.2021 21:15 # 0
у нас в коко уже нет
Через корутины реализованы реактивные потоки (а-ля rxjs), аналоги акторов, и просто разные задачи, которые нужно делать параллельно, и при этом стопать их скопом или джойниться скором (g structural concurrency)
Треды нужны чтобы загрузить CPU. Делать 1000 тредов просто ради удобства обезъяны -- неудобно
Колбеками пусть мои враги пользуются и едят лапшу
Асинхронная питушня решает часть задач, но не все (ленивость и та же структурная конкранеси ей не подвласна)
3.14159265 19.09.2021 03:23 # +1
Ещё раз отвечу. Идея отличная. Люди пишут на ЯВУ с кучей синтаксического блоата вроде c++/жабы/c#/ecma6, которые создают им больше проблем чем должны решать.
Возможно это тот случай когда
Антиблаболки считают «сахарок» важной, необходимой фичей.
Но в силу анскильности не понимают что их фича — всего-лишь частный случай какой-то более общей концепции.
Которая вполне реализуема в более простом языке.
guest6 31.08.2021 21:11 # 0
чур не срать тыщу потоков и без ебли с еполоами и комплишен портами
bormand 31.08.2021 21:15 # 0
Эм, а что мне мешает захуйнуть 10к пакетов в сокеты и проспать оставшееся время?
guest6 31.08.2021 21:34 # 0
и сделать это с 10К сокетами
bormand 31.08.2021 21:40 # 0
Не, ну технически может получиться интервал чуть меньше 3с между отправками в один сокет. Это критично, надо прям гарантию что при лагах процесора можно больше 3с, но меньше -- никогда?
guest6 31.08.2021 21:42 # 0
а можно не меньше 3с?
ну желательно не больше десяти
ах да, чуть не забыл: для одного из сокетов будет 8ск
bormand 31.08.2021 21:45 # 0
Я тупо возьму priority queue с сортировкой по времени и буду спать до head'а, а потом отправлять тех, чьё время пришло.
И хуй ты этот код побьёшь по пирфомансу своими корутинами.
guest6 31.08.2021 21:48 # 0
А уж если мне придется одну из этих отправок кенсельнуть, то и вовсе придется петушить твою очередь
bormand 31.08.2021 21:49 # 0
В котлине корутины на тредпуле что ли крутятся, как в asio, зависание одной из них не лочит остальные?
guest6 31.08.2021 21:51 # 0
Работа с сетью идет через пакет ktor, а он использует под капотом асинхронные сокеты
Если ты не трогаешь в корутинах блокирующие операции типа обычных сокетов или IO файлов, то остальные и не лочатся
bormand 31.08.2021 21:55 # 0
Ну т.е. компайлтайм гарантий никаких нету? Тогда нечестно писать "если одна отправка воткнёт", у тебя ситуация ничем не отличается.
Вы просто не зовите блокирующие функции и ничего не заблокируется.
guest6 31.08.2021 21:59 # 0
Но это задача для докторов компьютерных наук, а не для обычных жабоёбов
>нечестно
почему?
У тебя буфер заполнится, и отправка встанет.
А в случае асинхронности тебя верно вежливо попросят EAGAIN или как-то так
>Вы просто не зовите блокирующие функции и ничего не заблокируется.
Борманд, ну разумеется корутины нельзя блокировать
Это же кооперативная многозадачность
bormand 31.08.2021 22:00 # 0
Так мы уже плавно на TCP перешли?
Что мне мешает тоже переключить сокет (один! нахуя мне их 10000 для UDP?) в неблокирующий режим.
guest6 31.08.2021 22:04 # 0
Оно опорожняет его в сетевую карту
Если он не успел это сделать, то
* There are only two reasons for sendto() to block:
Your outgoing UDP buffer is full, and it needs to wait until space frees up
вторая не важна
что не так?
>один! нахуя мне их 10000 для UDP?
например чтобы слать нескольким клиентам
UDP сокет можно "коннектить". На самом деле это не коннект, но гарантия, что ты получишь ICMP о недоступности удаленного питуха
bormand 31.08.2021 22:11 # +1
Х.з., это к тебе вопрос... Я так и не поняла, что за магия у вас там в "асинхронных сокетах" есть, которую я не могу настроить и обработать из няшной.
> гарантия, что ты получишь ICMP
Х.з., в UDP протоколах обычно хертбиты есть. Ну кто-то из нас получит таймаут если что-то со связью. Не вижу смысла коннектить сокет, усложнять логику и тратить ресурсы ядра на какую-то хуйню.
Есть какая-то статья, где описаны реальные преимущества коннекта? Например, что так больше клиентов можно будет обработать или пирфоманс вырастет.
guest6 31.08.2021 22:18 # 0
Ты триггернулся на буфер
Я привел пример того, что в UDP тоже есть буфер)
> Я так и не поняла, что за магия у вас там в "асинхронных сокетах" есть, которую я не могу настроить и обработать из няшной.
В няшной ты можешь сделать что угодно, вопрос в количестве кода и его "высокоуровневости"
Неблокирующие сокеты из няшной скорее всего вернуть тебе EAGAIN или что-то такое при заполнении буфера, и попросят тебя попробовать снова
Ты должен будешь сам это обработать.
Либо ты сможешь взять select/poll/epoll, и слушать, когда сокет станет доступным для записи.
В корутинах же ты пишешь так, словно бы ты в своем потоке, живешь, и спокойно блокируешься на вызове send (или как оно там называется)
Под капотом там разумеется или неблокирующие сокеты или epoll, мне (как высокоуровневому питуху) это не важно.
>Есть какая-то статья, где описаны реальные преимущества коннекта?
https://it.wikireading.ru/7156
>>>
3. Асинхронные ошибки возвращаются процессу только при операциях с присоединенным сокетом UDP. В результате, как мы уже говорили, неприсоединенный сокет UDP не получает никаких асинхронных ошибок.
>>>
---------
на самом деле мой пример можно перевести и на TCP, если тебе удобнее.
И даже на обычные генераторы, которые должны подождать N секунд, и что-то сделать
В няшной пришлось бы делать ALARM или вон ебаться с очередями или плодить треды
В корутинах достаточно сахара, чтобы писать последовательно
Неблокирующая функция `delay` передает управление другой корутине, но для программиста выглядит как slepp
bormand 31.08.2021 22:33 # 0
Сделать вид, что всё ушло и забить? Я очень удивлюсь, если ваша либа задерживает отправку UDP пакета, а не просто выбрасывает его и возвращает корутине ошибку.
Что касается connect'а -- это же чисто клиентская фишка. Я же не буду зашкваривать серверный сокет под конкретного клиента. И заводить новый под каждого тоже будет как-то странно.
guest6 31.08.2021 22:45 # 0
нет, попробовать снова
>Я очень удивлюсь, если ваша либа задерживает отправку UDP пакета,
хм, а в чем проблема так делать?
Если она умеет делать это для TCP, то почему не делать для UDP?
>Что касается connect'а -- это же чисто клиентская фишка.
> Я же не буду зашкваривать серверный сокет под
> конкретного клиента.
connect будет создавать новый сокет, конечно
но не понятно, почему нашему гипотетическому серверу это не сделать
архитектуры бывают разные)
> И заводить новый под каждого тоже будет как-то >странно.
Если ты хочешь получать ICMP о недоступности клиента то вполне можно так делать
Но вообще мы ушли куда-то не туда кмк)
Корутины позволяют тебе писать последовательный код, используя вместо настоящих блокирующих функций -- специальные не блокирующие
Код выглядит последовательно, как если бы ты каждую корутину запускал в отдельном процессе
Причем в котлине они образуют "дерево", где родитель неявно ждет всех своих детей, и можно стопнуть родителя с детями одновременно
Открыл Activity в Андроиде -- запустилось 10050 корутин (на одном потоке), каждая инкапусилует какую-то задачу
Закрыл активити -- все стопнулись
bormand 31.08.2021 22:54 # 0
Немножко испортит работу протоколов, в которых тайминги важнее тухлятины...
> connect будет создавать новый сокет, конечно
Шта?!
guest6 31.08.2021 22:56 # 0
Ты же не знаешь что у нас за гипотетический протокол)
>Шта?!
ты не можешь присоединить сокет к двум адресам, так?
стало быть нужно создать по сокету на клиента и каждому сделать connect, не?
зы: я наверное написал так, что прочиталось будто `connect` создает сокет)))
Это не так, конечно. Сокет создает `socket`, и вероятно кишки `accept`
bormand 31.08.2021 22:58 # 0
Практика показывает, что на UDP все протоколы такие... Нет никакого смысла ретраить тухлятину и задерживать из-за неё все последующие пакеты. Не влезла в полосу -- значит не влезла.
> я наверное написал так, что прочиталось будто `connect` создает сокет)))
Ага.
guest6 31.08.2021 23:00 # 0
Да и почему сразу тухлятину?
Если буфер заполнен, то почему я не могу подождать и послать еще?
Это же UDP, это же не у принимающей стороны буфер заполнен (мне похуй на нее, я может вообще мультикаст) это у меня буфер заполнен
bormand 31.08.2021 23:01 # 0
Дык она у тебя уровнем выше будет. А кишки реактора не должны принимать это решение за тебя (если ты явно не попросил).
guest6 31.08.2021 23:04 # 0
Что будет если я пишу в сокет, а буфер забит?
Будет блокировка треда, верно?
Вот было бы логично ждать что и ktor сэмулирует такое поведение
bormand 31.08.2021 23:20 # 0
Ну ок. А неблокирующие можно попросить?
> почему я не могу подождать и послать еще
Потому что у тебя на выходе уже огромная очередь, которая не успевает высираться в провод. И вместо того чтобы отдать приоритет свежим, актуальным пакетам, ты продолжаешь пытаться спасти старые, менее актуальные.
guest6 31.08.2021 23:25 # 0
Могу, но зачем мне тогда корутины?
Я тогда могу на одном треде срать в 1000 сокетов обычным циклом. Если запись вернет EGAIN, то я просто дальше пойду, и всё.
Корутины будут не нужны
>свежим, актуальным пакетам
Типа раз я взял UDP, то обязательно семантика такова, что проебать старый пакет не так страшно, как тормознуть новый?
bormand 31.08.2021 23:27 # 0
Х.з., возможно у меня синдром утёнка. Можно Снаута спросить.
CHayT 31.08.2021 23:36 # +1
CHayT 31.08.2021 15:44 # +3
Desktop 28.08.2023 21:49 # 0
guest6 28.08.2023 21:53 # 0
Tike 28.08.2023 21:54 # 0
guest6 28.08.2023 21:57 # +1
Сам ключ лицензии может быть длинным симметричным ключом. Ну если с этой лицухой уже зарегился другой ID, то сервер шлет нахуй. Можно еще мультикастом искать в своей сети другие копии себя: хуже не будети
Чтобы сломать схему, нужно либо спиздить приватный ключ сервера (что сложно) либо поломать твою программу. Вот тут уже надо при запуске считать хеш бинаря, детектить дебагер, детектить виртуалку и пр. Это довольно сложный и муторный процесс, конкретные решения зависят от языка и окружения. Если твои клиенты это копроративщики, то можно не запариваца
guest6 28.08.2023 22:01 # 0
Если ключ могут вырезать, то такие проверки тем более?
guest6 28.08.2023 22:04 # 0
3anag 28.08.2023 22:08 # 0
guest6 28.08.2023 22:11 # 0
Но точно я не знаю
Desktop 28.08.2023 22:14 # 0
Это зачем?
guest6 28.08.2023 22:16 # 0
guest6 28.08.2023 22:21 # 0
guest6 28.08.2023 22:33 # 0
В ночь на субботу неизвестный мужчина проник в зоопарк "Ослиное место". Преступник зашел в вольер к осликам и изнасиловал одно животное. После извращенец пытался осквернить еще двух животных, но его спугнул сторож.
guest6 28.08.2023 22:43 # 0
guest6 28.08.2023 22:50 # 0
Ксстати
В соответствии с этими хадисами, запретным для мусульман является мясо домашних ослов, поскольку те питаются нечистотами. В то же время, мясо диких ослов, пасущихся на воле, считается халяльным.
ropuJIJIa 28.08.2023 22:56 # −1
g: Землячество Алании ДНР
guest6 28.08.2023 22:56 # 0
guest6 28.08.2023 22:56 # 0
А какой у вас оффер, не расскажете? Чё за компания?
guest6 28.08.2023 22:56 # 0
guest6 28.08.2023 23:08 # 0
https://habr.com/ru/articles/756562/
Личный опыт работы в IT и более 15 мест работы за 10 лет
В 2010 сходил в армию, интересно отслужил, а дальше нужно было начинать работать.
десятки команд, огромные опенспейсы, холодильники набитые едой на каждом этаже, соки, фрукты, сыры и колбаса в любом количестве на каждом этаже
guest6 28.08.2023 23:12 # 0
https://habr.com/ru/articles/755970/
Австралия является убедительным примером для DevOps, так как большая часть страны находится в одном часово
guest6 28.08.2023 23:47 # 0
guest6 28.08.2023 23:24 # 0
guest6 28.08.2023 23:26 # 0