Вы видите копию треда, сохраненную 3 января в 21:08.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
1. Ресурсы:
— https://dotnet.microsoft.com/learn
— https://ru.stackoverflow.com/a/416585/422180
— https://metanit.com
— https://professorweb.ru
2. С# для веб
— https://docs.microsoft.com/ru-ru/aspnet/core
3. C# для десктопа
— https://docs.microsoft.com/ru-ru/dotnet/desktop
4. С# для игр
— https://ru.stackoverflow.com/a/609901/422180
5. С# для мобильной разработки
— https://docs.microsoft.com/ru-ru/dotnet/maui
6. Годные ютуб-каналы
— https://www.youtube.com/c/CODEBLOG
— https://www.youtube.com/c/AndreyShyrokoriadov
— https://www.youtube.com/c/DevJungles
— https://www.youtube.com/user/Shmachilin
Шапка: https://pastebin.com/HT7Hi6FD
Прошлый тред: >>2808819 (OP)
Сижу в своё удовольствие почитываю и разбираюсь в книжечке Рихтера, и хочется прям наглядно, самому потыкаться, в каждом его всхрюке разобраться.
И вот у него часто проскакивает таблица метаданных манифеста. В которой он рассказывает о таких таблицах как: AssemblyDef, FileDef, ManifestResourseDef, ExportedTypesDef. И я чот затуп словил и не могу найти эти таблички в IlDasm или IlSpy.
Мне просто интересно откуда он берет эти данные. Может кто из анончиков, такую фигню подскажет.
>using static System.Math;
>using static Extended.Math;
Да это залупа ссаная. IntelliSence начинает корежить.
Я вот хочу узнать какие есть методы в System.Math, пишу Math, а студия начинает мне предлагать Extended.Math. В общем появляется куча неудобств.
Либо Надо.Писать.Весь.Сука.Путь что нихера не удобно.
Либо надо выдумывать мудреный неймспейс, который сто пудов начнет конфликтовать с какой нибудь еще либой. Вот пишешь Geometry, а хуй тебе там! Потому что такое имя есть System.Windows.Media.
Еще и обоссаная студия сперва предлагает тебе оба варианта, а на третью попытку предлагает только один, потому что ебаному майкрософту надо вставить свой обоссаный ИИ, которому даже кофе заварить не доверишься. ИИ за тебя уже решил.
охуенно, микрософт гении. спасибо
Пробовали? Как ощущение?
Просто со стороны - выглядит как вполне хорошая хуйня же. Типа легко написать тесты. Поведение - предсказуемое. И вообще. Потом из этих чистых функций - наебенил еще фунукций и все заебись погнали.
Тебе this в каждый метод передается не для того чтобы ты хуйней с чистыми функциями страдал, чел.
Это какая-то залупа для джава скриптизеров. В сишарпе есть статические методы для этих целей, а обычные на то и созданы, чтобы взаимодействовать с компонентами экземпляра класса. Примеры таких методов — свойства.
Правда что Spring медленнее, но стабильнее для больших систем?
ну смотри. если всякий там #if DEBUG используют, значит не хотят в релизной сборке дополнительной нагрузке
Мне стоит пояснять что вызов лог метода ДАЖЕ при выключенном логлевеле несет оверхед?
И обычно это решается (псевдокод)
if(logger.IsEnabled(debug)) logger.WriteDebug
и что серилог не исключение (пуф тебе офф вики https://github.com/serilog/serilog/wiki/Writing-Log-Events#level-detection)
то есть твое решение....собственно не сильно отличается от решения в самом вопросе.
Вот жетбраинсковое _logger.LogWithLevel()?.Log() действительно решает проблемы вызова метода когда не нужно, но даже оно дает некоторый оверхед по сравнению с "все вырезано. 0 оверхеда"
>>852573
что выбрать? подводную лодку или камаз? Мне рассаду выращивать.
Ну что за вопросы блин
Еще не все. Вопросы?
у меня sample.txt лежит в директории с тестами, как бы мне от рута проекта до него относительный путь указать?
в ноде есть __directory
нагуглил такое
https://stackoverflow.com/a/13762465
но эта хуета указывает на
/home/user/RiderProjects/EscrowReader/EscrowReader.Unit.Tests/bin/Debug/net7.0
если запускать тесты из райдера и не факт что в другом окружении будет указывать в то же место наверное)
можно было бы в /temp держать но чот хз, не уверен что ток на unix будет запускаться..
а ладно похуй буду в /temp держать ебаная кринжатина хули оно путь до рута то нигде не хранит
Стриминговые протоколы хуй знает когда придумали. Никакие файлы по 10 гигов там не передаются.
пасиба
Кароч я разобрался. Надо было всего лишь почитать про http побольше, а разбить видос на сегменты оказалось намного проще, чем я думал.
Ну я предположил, что это вылезло из мест, где пытаются залечить выстрел в ногу. А может что-то древнее, где нет OOП.
>значит не хотят в релизной сборке дополнительной нагрузке
Ее и не будет. У логгера можно выставить уровни.
Есть возможность глобально указать минимальный уровень.
А это занчит, что ты можешь на старте заюзать ровно один раз
#if DEBUG
и в блоке глобально указать минимальный уровень, а для релизной версии повысить до Error или Info.
>if(logger.IsEnabled(debug)) logger.WriteDebug
Я себе сделал метод немного короче, типа
logger.IsDebug()?.logger.WriteDebug()
В любом случае это не так критично по сравнению с остальным. Это как наперстком черпать воду при WPF-шторме.
Братишь, а че будешь делать, если тебе надо будет увеличить уровни логгирования, потому что на машине клиента не робит, а на твоей робит? Ты бы мог установить переключатель и получить от клиента более подробный лог.
то есть ты сам стараешься не вызывать метод если левел не установлен, но всем говоришь что "вызывайте, серилог разберется"?
К дохтору срочна
на деле всегда есть оверхед вызова метода и возможность боксинга. Для избежания боксинга используется набор методов с <T1,T2...
сколько их там в серилоге? 3 параметра? <T1,T2, T3> (ох пожадничали)
а потом params object[]
ну и в горячих местах это просто вызовы методов....которые не нужны.
>то есть ты сам стараешься не вызывать метод если левел не установлен, но всем говоришь что "вызывайте, серилог разберется"?
Я такого не говорил. Операции с текстом лишние, а булевые ничего не стоят.
>на деле всегда есть оверхед вызова метода и возможность боксинга.
>ну и в горячих местах
Это в каких? Там твой логгер нахуй не нужон. Пиздец. Ты бы еще в циклы логировал.
А я тебе скажу в чем твой план — говно. Когда пользователь запустит твое приложение, оно не сможет записать логи буквально никак.
В разработке используется инструменты отладки, а логи записываются как раз на случаи отсутствия непосредственного доступа к программе.
>Там твой логгер нахуй не нужон
так с этого и начали. Это ты логгер притащил туда где его не требовалось. А теперь возмущаешься.
>Ты бы еще в циклы логировал
а что не так. Если нужно, то логируется все.
>В разработке используется инструменты отладки
ты про Debug.WriteLine? о да, его так весело читать. Там чего только нету. Там есть все...что тебе и не нужно.
>Это ты логгер притащил туда где его не требовалось.
Я не ванга. Вижу хуйню — делаю замечание.
>а что не так
Хуйня №2
>ты про Debug.WriteLine?
Я про точки останова, таблицу переменных и панель стека вызовов, которые дают исчерпывающую информацию на любом этапе. Логгирование подразумевает отображение общей информации и в большей части для релизной версии, когда нет доступа к вышеописанным инструментам.
>Я про точки останова, таблицу переменных и панель стека вызовов, которые дают исчерпывающую информацию на любом этапе
эээх не ловил ты никогда гейзенбаги. ничего. может повезет.
ну вот я и пишу сообщения для себя, которых на релизе не будет и которые будут выглядеть красиво, спасибо двачу-помогачу.
а логгер будет от фреймворка, который подтянется автоматически и будет срать логами только тогда когда это надо, а если "клиент" зальет его в дискок сообщества, то бот его проанализирует и пинганет автора по гуиду. ты на основании трех строчек кода уже какую-то себе картину составил и начал советы непрошенные довить. не надо так
>братишь у меня все в скомпилированном виде занимает 9,50KB
Ты за каких хером в шарпе байтоебствуешь на ровном месте?
Даже в вижуал студо коде можно, но не в вижуал студии.
>что выбрать? подводную лодку или камаз? Мне рассаду выращивать.
Ну что за вопросы блин
Java Spring - это подводная лодка?
А C# .net - Камаз?
Это типа как UE и Unity - UE для больших проектов, а Unity - для казуалок?
Хотел вставить mermaid-диаграмки? Соси хуй. Это можно сделать только в visual studio code.
>Java Spring - это подводная лодка?
или камаз
>А C# .net - Камаз?
или подводная лодка
>Это типа как UE и Unity - UE для больших проектов, а Unity - для казуалок?
то есть то что это 2 разных языка, и вряд ли ты знаешь их оба, тебя не смущает? ну ок
но все равно спрашивать в шарпотреде про жаваговно - ну такое себе.
Я мимодил, увлекаюсь с младых ногтей языками, в своё время неплохо знал джаву, писал на ней пруверы и игры на LWJGL, но спринг не трогал никогда, вебом не интересовался, потом ушёл в шарп капитально, в шарпе уже и кишочки знаю. В принципе оба языка в отрыве от фреймворков представляю довольно хорошо, слежу за новыми фичами в языках и.т.п.
А вот чем реально спринг отличается от аспа? Я никогда не видел приложение на спринге даже изнутри.
> Братишь, а че будешь делать, если тебе надо будет увеличить уровни логгирования, потому что на машине клиента не робит, а на твоей робит? Ты бы мог установить переключатель и получить от клиента более подробный лог.
Я обычно когда нужна трассировка подкидываю дебажные библиотеки клиенту с напердоленной специально под него трассировкой в местах где жду проблемы. Смысла делать одну трассировку на все косяки не вижу, слишком много мусора и логи тяжело анализировать, больше 50 мегабайт в Notepad++ лучше не вставлять, а на нагруженной опердени 50 мегабайт трассировки набивается за 10 минут.
>>854306
Я думаю людей которые знают и шарп и джаву не мало, меня на работе пытались на джавапроект посадить, но я задоджил. У нас в одном отделе шарп, в другом джава например.
>Я обычно когда нужна трассировка подкидываю дебажные библиотеки клиенту с напердоленной специально под него трассировкой в местах где жду проблемы.
А как это сделать?
>Я обычно когда нужна трассировка подкидываю дебажные библиотеки клиенту с напердоленной специально под него трассировкой в местах где жду проблемы.
Чет либо пиздеж, либо клиенты у тебя конкретные терпилы, либо у тебя в производстве ебаный бардак.
>слишком много мусора и логи тяжело анализировать, больше 50 мегабайт в Notepad++ лучше не вставлять
Про ротацию логов слышал?
>а на нагруженной опердени 50 мегабайт трассировки набивается за 10 минут.
Ну так если у тебя "опердни" - значит финансы. А там даже один проебаный платеж, это гораздо хуже чем гигабайты лишних логов.
>Я думаю людей которые знают и шарп и джаву не мало, меня на работе пытались на джавапроект посадить, но я задоджил. У нас в одном отделе шарп, в другом джава например.
Просто знающих - много, т.к. языки родственные по многим параметрам, а вот тех кто нормально шарит в кишках и ньюансах фреймворков, так чтобы их профессионально применять уже очень немного. А то что тебя пытались просто с нихуя на другой стек посадить говорит либо об охуенном бардаке в твоей конторе, либо показывает твою низкую ценность как специалиста, что работодателю совершенно похуй где ты будешь работать и что и там и там выхлоп от тебя небольшой будет.
Совсем ньюфажный вкатывается в тред, в C# по видеоурокам SimpleCode только дошел до классов.
Хочу освоить ASP.Net Core для дальнейшего трудоустр-ва на галеру. Времени много (безработный), желание есть.
Пошел искать актуальные обучающие материалы - пока ничего, кроме двух книжек на пикрелах не нашёл. Подскажите, во что забуриться с головой и не охуеть от косноязычного слога/хуевого микрофона ментора.
Троелсен 2 пик у тебя, Asp.Net в действии, Ef Core в действии. Затем
https://www.freecodecamp.org/news/learn-html-beginners-course/ -Html + Css
https://learn.javascript.ru/ - js а ты думал выучил шарпы и всё? Хуй там плавал, шарп это в 90% случаев фуллстек
Потом учишь реакт, по итогу пилишь сайт + бэкенд в качестве пета и начинаешь искать работу. Двух месяцев должно хватить.
>а ты думал выучил шарпы и всё?
Да...
Хорошо, большое спасибо. Ушёл курить вопрос, текст сохранил.
ты из тех для кого существует только один вид софта )))
много видел логов, например, в десктопном софте?
а ведь даже в браузере они есть. ты их видел? ах да, у тебя же не дебагбилд,
вот тупые разрабы браузеров -у них бардак )
сразу встал такой вопрос - а что еще пишется в бинарники, есть ли там какая-то еще более персональная инфа и как анонимизироваться, если да?
юзернейм тупой, стыдно показывать всем желающим...
> А как это сделать?
А какие проблемы? Кодовая база разбита на рой мелких библиотек, если надо одну подправить то просто беру и правлю, состояние на конкретный патч у меня в ветке, потом заменяю релизную библиотеку отладочной с логами, снимаю трассировку, опционально правлю что-то и подкладываю пока ошибка не пропадёт. Потом отключаю трассировку (обычно конфигом логгера). Потом правки (без трассировки) переношу из рабочей копии патча в мастер и оттуда они попадают в следующий патч.
>>854978
> Чет либо пиздеж, либо клиенты у тебя конкретные терпилы, либо у тебя в производстве ебаный бардак.
Ситуация когда надо снимать трассировку означает что проблема эскалирована уже максимально высоко, такое не особо часто случается, но нашим софтом пользуется очень много кто и на фоне большого количества установок приходится периодически это делать. На тестовых контурах интеграций поймать баги перед релизом нереально, там слишком много что влияет, трассировки нужны под большой разнородной нагрузкой которая бывает только на проде.
> Про ротацию логов слышал?
И чем она тут поможет? Зачем хранить архивы трассировок? Ты ССД продаёшь и надо чтобы они быстрее из строя выходили?
> Ну так если у тебя "опердни" - значит финансы. А там даже один проебаный платеж, это гораздо хуже чем гигабайты лишних логов.
Проебать платёж очень сложно. Не то что бы нереально, но если что-то пойдёт не так хоть немного то транзакция просто не завершится и вернётся с ошибкой. Проёбанные платежи происходят только после очень крупных релизов и обычно их можно пересчитать по пальцам одной руки на всю страну за год. Обычно проблема не в том что платежи пропадают, а в том что они возвращаются с ошибкой хотя должны отработать нормально или отрабатывают медленно.
> А то что тебя пытались просто с нихуя на другой стек посадить говорит либо об охуенном бардаке в твоей конторе, либо показывает твою низкую ценность как специалиста, что работодателю совершенно похуй где ты будешь работать и что и там и там выхлоп от тебя небольшой будет.
Почему? Ты просто слесарь фреймворка и тебе платят за знание кишочек аспа, ты на всех эту слесарную мудрость и распространяешь. Моя ценность как сотрудника не в понимании кишочек аспа, а в понимании бизнеса кабана и того как система крутит этот бизнес. Гораздо легче научить меня спрингу чем джавадебила тому как вся остальная система устроена и как должны проходить бизнес-процессы.
Пиздец у тебя привычка на ровном месте пытаться собеседника унизить, у тебя наверное нет друзей.
> А как это сделать?
А какие проблемы? Кодовая база разбита на рой мелких библиотек, если надо одну подправить то просто беру и правлю, состояние на конкретный патч у меня в ветке, потом заменяю релизную библиотеку отладочной с логами, снимаю трассировку, опционально правлю что-то и подкладываю пока ошибка не пропадёт. Потом отключаю трассировку (обычно конфигом логгера). Потом правки (без трассировки) переношу из рабочей копии патча в мастер и оттуда они попадают в следующий патч.
>>854978
> Чет либо пиздеж, либо клиенты у тебя конкретные терпилы, либо у тебя в производстве ебаный бардак.
Ситуация когда надо снимать трассировку означает что проблема эскалирована уже максимально высоко, такое не особо часто случается, но нашим софтом пользуется очень много кто и на фоне большого количества установок приходится периодически это делать. На тестовых контурах интеграций поймать баги перед релизом нереально, там слишком много что влияет, трассировки нужны под большой разнородной нагрузкой которая бывает только на проде.
> Про ротацию логов слышал?
И чем она тут поможет? Зачем хранить архивы трассировок? Ты ССД продаёшь и надо чтобы они быстрее из строя выходили?
> Ну так если у тебя "опердни" - значит финансы. А там даже один проебаный платеж, это гораздо хуже чем гигабайты лишних логов.
Проебать платёж очень сложно. Не то что бы нереально, но если что-то пойдёт не так хоть немного то транзакция просто не завершится и вернётся с ошибкой. Проёбанные платежи происходят только после очень крупных релизов и обычно их можно пересчитать по пальцам одной руки на всю страну за год. Обычно проблема не в том что платежи пропадают, а в том что они возвращаются с ошибкой хотя должны отработать нормально или отрабатывают медленно.
> А то что тебя пытались просто с нихуя на другой стек посадить говорит либо об охуенном бардаке в твоей конторе, либо показывает твою низкую ценность как специалиста, что работодателю совершенно похуй где ты будешь работать и что и там и там выхлоп от тебя небольшой будет.
Почему? Ты просто слесарь фреймворка и тебе платят за знание кишочек аспа, ты на всех эту слесарную мудрость и распространяешь. Моя ценность как сотрудника не в понимании кишочек аспа, а в понимании бизнеса кабана и того как система крутит этот бизнес. Гораздо легче научить меня спрингу чем джавадебила тому как вся остальная система устроена и как должны проходить бизнес-процессы.
Пиздец у тебя привычка на ровном месте пытаться собеседника унизить, у тебя наверное нет друзей.
Я не знаю, но путь к исходникам там реально есть. Обычно сборка релизных версий происходит не на машине разработчика, а на агенте тимсити и вся дрисня там заполнена тоже с агента.
Если тебе интересно посмотреть что ещё в DLLке то юзай ILDASM, я по приколу завтра тоже гляну что там есть.
Какова вероятность со знанием asp.net core и react найти работу на удаленке?
Чтобы на работу не ходить, а дома сидеть?
мимо крокодил
>Какова вероятность со знанием asp.net core и react найти работу на удаленке?
Просто со 'знанием' вряд ли. Вот с 'опытом' хотя бы от полугода, то вполне реально.
>Пиздец у тебя привычка на ровном месте пытаться собеседника унизить, у тебя наверное нет друзей.
Нахуя бы я еще на двач заходил?
На кой хуй оно надо?
Типа тем более в той схеме, которую обычно.
Типа
class A{ void Visit(IVisitor visitor{ visitor.VisitA(this); } }
class B{ void Visit(IVisitor visitor{ visitor.VisitB(this); } }
Типа чем объективно это лучше варианта с:
handler.Handle(a);
handler.Handle(b);
При этом классы A-B нихуя про этот визитер не будут знать и не будут засраны этим говном. А логику при визите - все равно никто никогда не добавляет ИРЛ.
В общем. Че я не понимаю. Поясните.
Ну типа срсли. Даже накидал пример.
Вот чем оно буде хуже, по сравнени с тем, что я в каждый бы тот класс пихал этот Visit?
Ты случаем не из тех, кто сначала учит паттерны и потом думает, как их применять?
Не.
Просто вот я на ночь глядя вспомнил про конкретно этот паттерн. Подумал-подумал. Еще раз подумал.
И за всю жизнь видел его только в коде Netty или Mina(не помню уже, давно смотрел) и это был пиздец какой-то(то что пиздец был - помню)
Пизжу. Еще кажется в сорсах .net'а видел пару раз. Но там оно тоже выглядело будто просто хуйнули, чтобы было, типа мы тоже как жависты знаем эти ваши паттерны.
Вот и думаю. Мож я чего-то не понимаю и на деле есть применение, где ну прям код становится лучше, удобнее и понятнее.
В самом классе Window свойство выглядит так (из метаданных):
public Window Owner { get; set; }
А не, есть предупреждение.
Визитор это паттерн двойной диспетчеризации и шарп не исключение
/// передаем свойство Point по ссылке
Point pos = new(300, 300);
if(Clamp(ref pos.X, 0, 100))
{}
/// где Clamp это ...
private static bool Clamp(ref double value, double min, double max) {}
Собсно, а зачем в шарпе нужен ref, если ты не можешь передать свойство по ссылке и его изменить? Классы сами по себе это ссылка и их не нужно передавать по ref, а то что нужно передать по ссылке — не передается. В бейсике есть от ref смысл в изменении структуры по ссылке?
Приходится срать таким образом, если нужно и получить измененное значение структуры и результат успешности операции:
private static bool Clamp(double inputValue, double min, double max, out double outputValue) {}
Ок, так нет аллокаций, но нахера в шарпе ref?
Короче между out и ref нет никакой разницы в плане оптимизации — все будет передано по ссылке, что неизбежно приведет у аллокациям.
Разница в том, что в шарпе нужно заняться ракетостроением для подобных случаев.
Бейсик:
if Clamp(pos.X, 0, 100) then MsgBox("И это всё?")
Шарп:
bool localClamp() {
. . . double argvalue = pos.X;
. . . var ret = Clamp(ref argvalue, 0d, max.Width);
. . . pos.X = argvalue;
. . . return ret;
}
if(localClamp()){ MessageBox.Show("Охуеть не встать ..."); }
Теперь я буду доебывать алису своими тупыми и мелочными вопросами.
С этой хуйней можно шизом стать.
Реф нужен для того чтобы передать ссылку на что-то.
Свойства - это пара методов.
Давай просто переведем твое свойство в то что ты там пытаешься делать:
if(Clamp(ref x.get_X(), 0, 100))
Че по твоему должно произойти-то?
Про передачу по ссылке каких-то простых сущностей типа инта. НАХУЯ? Вот серьезно. Чтобы что? Это не массив. Это не какая-то пиздец сложная структура, которая при копировании сожрет миллионы тон ресурсов. Это, мать его, простое значение, размером с эту самую ссылку, которая, блядь, так же будет создана, если ты передаешь по ссылке(блядь, представь себе, сук, ссылки - тоже занимают место в памяти и чтобы их передать - надо так же создать переменную, а обращение к тому что лежит по ссылке - дольше, сука, потому что надо сначала из ссылки достать адрес того что ищется, а потом уже считать из адреса значение).
Короче. Не беси меня. Вот серьезно. НЕ БЕСИ, блядь.
По ссылкам - передаем либо то когда в методе может измениться значение лежещее по адресу, либо если структура - пиздец здоровая и ее копирование - избыточно. Все.
>блядь, представь себе, сук, ссылки - тоже занимают место в памяти
Так у тебя в любом случае будет сылка, нахуй. У тебя просто НЕТ возможности это обойти. Никак.
Вот напиши мне метод TryClamp, который обрезал бы число по диапазону min и max, и возвращал:
2. результат обрезания
1. булевый результат факта обрезания. Если обрезал - true, если нет - false.
Давай, напиши мне такой метод без использования ссылок, кортежей и анонимных типов.
>Это, мать его, простое значение, размером с эту самую ссылку
Потому что из-за этих ограничений возникает оверинжениринг, когда тебе нужно изменить значение свойства.
В итоге ты либо создаешь еще один параметр out в методе из котрого ты тоже не можешь присвоить значение отбратно
if(Clamp(pos.X, 0d, 100d, out double result);){
. . . pos.X = result;
}
либо городить лишние перменные типа
double posX = pos.X;
if(Clamp(ref posX, 0d, 100d);){
. . . pos.X = posX;
}
> 2. результат обрезания
> 1. булевый результат факта обрезания. Если обрезал - true, если нет - false.
public static class Clamper {
public readonly struct ClampResult {
public readonly bool Clamped;
public readonly double Value;
public ClampResult(bool clamped, double value) => (Clamped, Value) = (clamped, value);
}
public static ClampResult Clamp(double val, double min, double max) {
if( val < min ) return new(true, min);
if( val > max ) return new(true, max);
return new(false, val);
}
}
И да. Это как раз не оверинжениринг.
на деле шарп мог бы засахарить ref Property. Это вообще легко, но это ж мелкие. Они скажут - юзай ламбды (они то встраиваются в класс в отличие от методов хаха )
>>856817 и дргуие WPF-сты
А хотите грабли?
https://dropmefiles.com/E8H0K
есть UserControl > ContentControl > Combobox
есть 2 свойства у UserControl ItemsSource/SelectedItem
комбобокс биндится к этим свойствам у контрола. Ну а клиент биндится снаружи. То есть обычный юзерконтрол
И происходит смена DataContext (там по таймеру она) и список конечно меняется и летит SelectedItem=null в старый!!! DataContext, который разумеется такого переварить не может (но не суть)
>без использования кортежей и анонимных типов
>создает структуру
Наебал, систему, так сказать, но теперь вызов твоего класса нельзя запихнуть в If т.к. он возвращает не bool.
>>858003
>на деле шарп мог бы засахарить ref Property.
Мало того, они уже так сделали, но не для шарпа. Я понимаю, что некоторый бейсиковский сахарок вылезает со временем боком — это я понял с шарпом и понял почему в нем нет подобного, но здесь-то что может пойти не так? Не понимаю.
[Table("student_course")]
public class StudentCourse {
[Column("uid")]
public int StudentID {get;set;}
[Column("cid")]
public int CourseID {get;set;}
public required Course Course { get; set; }
public required Student Student { get; set; }
}
И вот когда я его спрашиваю скажем context.StudentCourse.Single(sc => sc.CourseID = 1123).StudentID, я получаю ответ.
А когда я спрашиваю context.Courses.Include(c => s.Students).Select(c => c.Students).Single(c => c.CourseID=1123), я получаю запрос, в котором написаны StudentCourse, StudentiD и CourseID.
>комбобокс биндится к этим свойствам у контрола
Нет, у тебя он биндится к свойствам вьюмодели, которая подхватывается из DataContext. А депенденси-свойства ItemsSource/SelectedItem в UserControl у тебя просто висят в воздухе.
Чтобы комбобокусу присосаться к ним, нужно обращаться к родительскому UserConrol по типу или по имени, и уже у него искать эти свойства.
не жми ничего. там по таймеру сменит вьюмодель
и увидишь такое
AAAAAAAAAAAA: DataViewModel (5560998) Start
AAAAAAAAAAAA: DataViewModel (5560998) SelectedItem 'one'
AAAAAAAAAAAA: DataViewModel (44407631) Start
AAAAAAAAAAAA: DataViewModel (5560998) SelectedItem ''
то есть при смене вьюмодели будет принят новый от этой новой вьюмодели список элементов, текущий элемент станет нулл и его получит старая вьюмодель
Ну да, селектед итем сбрасывается, если вернуться на предыдущую модель. Может это из-за асинка. У меня вроде тоже были с этим проблемы, не помню как решил.
Но вообще, в mvvm надо биндиться ко вьюмодели, а не через свойства, чтобы в датаконтекст пришла вобмодель, и уже только после этого там искался селектед итем.
Но за пример спасибо, учту.
асинк там не причем. Можно любым способом менять вьюмодель и эффект будет.
> в mvvm надо биндиться ко вьюмодели
ну это снаружи юзерконтрол биндится куда хочет, но при этом ИЗОЛИРОВАННЫЙ юзерконтрол создает в себе депенденсипроперты и внутренний xaml должен с ними как бы работать. И особо неважно как внутренний xaml найдет эти свойства - не отваливается внешний биндинг. А ClearBinding затирает вообще все наглухо.
и причина то понятна
при смене вьюмодели идет обновление привязки сначала ItemsSource, а потом SelectedItem. И в первой привязке сбрасывается текущий пункт, который дергает биндинг селектед...который еще старый и шлет хрень в старую вьюмодель
Таким образом, если поменять местами и будет
<local:TestControl SelectedItem="{Binding SelectedItem, Mode=TwoWay}" ItemsSource="{Binding Items, Mode=OneWay}" />
то проблема исчезает
но это как бы не дело.
ловить смену датаконтекста, сбрасывать все привязки и потом героически в коде писать биндинги и шаблоны...да как то читается как говно, ощущается как говно и вообще подход - говно.
>ну это снаружи юзерконтрол биндится куда хочет, но при этом ИЗОЛИРОВАННЫЙ юзерконтрол создает в себе депенденсипроперты.
Блин, я впервые наблюдаю такую проблему. Хотя тыщу раз менял вьюмодель целиком. Вот это прокатило.
Вкодь уже чо-нить годного в наноборду, заебал.
>Хотя тыщу раз менял вьюмодель целиком
ну если биндиться как положено на датаконтекст, то проблемы вроде бы нет.
А вот при запихивании этого комбо в изолированный контрол и бинд через прокладочные депенденсипроп, то вот какая то хрень.
хз как комбобокс это магует. может ловит полную смену датаконтекста и что то там обнуляет? так нет удобных средств обнуления биндинга.
Я гуглил и там жалуются на хз какую то проблему и биндинг в коде делают, хотя я разницы не вижу - после обнуления он снова слетит же. Да и как обнулять селектедбиндинг, а вдруг порядок правильный и тогда почем зря затрешь биндинг и неоткуда его взять.
Разрабатываем на винде в ВисуалСтудио.
Пушим в гит, там техногоблины уже настроили женкинсы-хуенкинсы, гоняют-собирают-теструют-разворачивают на тестовом сервере.
Если надо что-то специфичное для линукса юзать в разработке - можно через WSL погонять.
Если мы ебанат и сидим на линуксе - Vim(ну, мы же уже решили, что мы ебанат), и вместо разработки хвастаемся, что 900 символов в минуту печатаем, а работу пусть вон тот джун делает.
Чи ты про что?
Типа просто всрато смотрится : С:\\users\XXX_ZZZ_NARUTO_FAN_1995_XXX_ZZZ\sources\repo\SuperApp\Core\Module\Parser.cs(256)
Хочу чтобы было только: SuperaApp\Core\Parser.cs(256)
А как так сделать - хз.
>Если надо что-то специфичное для линукса юзать в разработке - можно через WSL погонять.
У меня просто отдельный стенд с линуксом. Я к нему прокинул удаленную отладку и удаленный запуск юнит-тестов с виндовой машины. По итогу разработка на винде, отладка и тесты на линуксе.
Не собирай релизы на своей машине.
dotnet
Как выбрать 3й уровень навигации? Только третий? Ну скажем у Course есть Students, и у каждого Student есть Addresses. Как мне выбрать все Адреса всех Студентов Курса? Данные курса и тем более студентов не нужны.
List<Course> courseList = data; //Initialise courseList
var addresses = courseList
.SelectMany(course => course.Students)
.SelectMany(student => student.Addresses)
.ToList();
> After we replumbed WPF in .NET 4.0 to use System.Xaml, we weren't able to justify spending our smaller resources on migrating the WPF MarkupCompiler to use System.Xaml.
ПХП последних версий практически тот же шарп, но без возможности десктопа, зато со своими преколами.
Шарп - ну, типа майки, крупная контора, хуе-мое. Ну и шустрее чем ПХП. Хотя опять же - ПХП сильно бустанули в скорости.
Я бы, если честно, если говорим про веб, сейчас бы взял ПХП. Дюже он хороший стал. При этом нет вендорлока, Более открытые и свободные инструменты. Да и вакансий побольше, если вдруг придется менять.
НО, как сеньер-шарповод - я все равно буду говорить, что шарп - лучше. Потому что я, блядь, 10+ лет в нем ковыряюсь. Кишочки вдоль и поперек излазил и вообще. Могу ругать, но все равно буду говорить, что шарп пизже.
Пыха (только 7 и 8 версии, т.к. 5-ая - такое себе) и Шарп одинаково приятные языки
Но минусы пыхи:
- заточена только под веб. На шарпе же можно писать и компьютерное зрение, и мобилки, и игоры - дохуя всего.
- если будешь искать работу на пыхе, то некоторые галеры любят загрузить своих разрабов цмсками и ссанным Битриксом (но чем больше опыта будешь получать, тем меньше такого говна будет)
- За бугром меньше вакансий, чем на Шарпе (и то почти все - фулстек)
Плюсы:
- Опять же ок язык, и с него есть огромнейший шанс срыгнуть в Golang, не потеряв в зряплате (галеры сами предлагают сделать это)
А на каком фронтенд-фрейме пишешь, если не секрет? Если это Вуе - выбирай пыху. Если ангуляр или рякт - шарп. Т.к. это оч популярные фулстек-связки
А нужно ли тебе оно - становиться фулкеком и работать за двоих? Или планируешь полный свитч в бекенд со временем?
Ну значит полный фулкек (как в 85% вакансий на пыхе)
>А нужно ли тебе оно - становиться фулкеком и работать за двоих? Или планируешь полный свитч в бекенд со временем?
Полный свич, заебали эти пиксели + не чувствуется инжиниринга какого-то. А с базами прикольно работать, как и с логикой в целом.
>>860038
>А на каком фронтенд-фрейме пишешь, если не секрет? Если это Вуе - выбирай пыху. Если ангуляр или рякт - шарп. Т.к. это оч популярные фулстек-связки
В основном на рякте, но и вуе пробовал. Третья версия вуе это почти тот же рякт по философии и концепциям. Один хуй пизда, как говорится.
>Опять же ок язык, и с него есть огромнейший шанс срыгнуть в Golang, не потеряв в зряплате (галеры сами предлагают сделать это)
Да, знаю что это выход из пхп-мира.
>заточена только под веб. На шарпе же можно писать и компьютерное зрение, и мобилки, и игоры - дохуя всего.
Ну камон, я веб-макака, да ещё и бывший вкатун, начинал с фронтенда. Какой мне зрение, игоры? Мобилки вообще забей, я хз кто на ксамарине пишет. Ну может где-то и пишут, но явно не так много, как на альтернативах.
>- если будешь искать работу на пыхе, то некоторые галеры любят загрузить своих разрабов цмсками и ссанным Битриксом (но чем больше опыта будешь получать, тем меньше такого говна будет)
А я планирую сразу в лару залететь, лол.
>>860027
Лол, спасибо за ответ, улыбнуло то что под спойлером и дальше.
А теперь вопрос ко всем: как мне этот скачок совершить? Думаю пописывать на шарпах понемногу, в принципе несложно, много схожести с тайпскриптом (еще бы, и то и другое майки делали), набивать опыт в бекенде и паралельно пых учить? Это реально вообще?
> Как совершить?
Если метишь сразу в пыху, то скипай нахуй шарп и ищи ваки фулкека. Повезет - будет почти столько же бека, сколько фронта. Если нет - будешь 80% времени ковырять фронт.
А на чистых бек ваках тебя попустят на собесе (извини)
> А я планирую сразу в лару залететь, лол.
Увы, бывает такое, что в тайтле ваки написано "PHP-разработчик (Laravel)". Переходишь по вкладке - а там еще в довесок требуют 1C-Битрикс:-)
>Если метишь сразу в пыху, то скипай нахуй шарп
Не могу скипнуть, потому что работа + надо базы подтянуть, да и пыху в целом, немного окунуться так сказать.
иди на пхп. ты должен ощутить страдания.
вкусить говна так сказать.
иначе какой ты программист без страданий.
Почему же? Люди вверху говорят, что вполне приятный язык, начиная с версии 7
Сам сижу на NUnit, но временами посматриваю в сторону второго.
Есть какие-то значительные преимущества?
>Но вот я метаюсь между пхп и шарпами, куда лучше, ваше мнение?
Если хочешь попасть потом в серьезный бизнес или финтех и крутить там микросервисы, то всяко шарп (ну или жабу).
>Хехе
Почему нет?
Я когда заходил в шарп, чутка пофулстечил на реакте (и то там сводилось все к написанию мелких компонентов и доработок отдельных гридов), а потом ушел в чистый бэк. И уже года три фронта не касаюсь и дальше api с бэка не вылезаю.
>Люди вверху говорят, что вполне приятный язык, начиная с версии 7
Угу, про джаву тоже говорят, что она c 17-й версии пиздатая, только в большинстве случаев везде 8-ка до сих пор и так там и будет.
Так же и с пыхой.
А в шарпе уже и на .net7 вакансии есть, а в начале следующего и на 8-й появятся. И в большинстве мест, даже с легаси, новых людей берут с прицелом перевода софта на новый стек. Плюс шарп и в предыдущих версиях вполне себе неплох был.
Технически XUnit пизже. Т.к. по умолчанию лучше изолирует тесты, что более подходит для большинства обычных тестовых сценариев. Если же есть необходимость пошарить контекст между тестами, то это там делается довольно просто.
NUnit наоборот по умолчанию лепит общий контекст и чтобы добиться от него нормальной изоляции нужно поебаться (хотя я его давно не касался, а фреймворк развивается, так что может там это уже и не так неудобно).
Код: https://pastebin.com/iFVSV3tr
потому что новые фичи не перекроют детские болезни
ибо совместимость.
пхп это как уродец в семье жавистов
вроде похож на жаву но урод
фрактал плохого дизайна не устарел и не устареет.
представь язык где 500+ функций в глобальном пространстве,
где полный раздолбай что функция принимает (а некоторым нужно передавать по ссылке), что возвращает.
Исключение ни одна функция из этих тебе не кинет конечно - проверяй возврат функции и потом доставай код ошибки и сообщение вручную.
Сверху еще накинь автокаст в число,
отсуствие вменяемых структур (хочешь HashSet? а хер тебе. делай словарь с ключ тебе нужным и значением ну пусть bool (не дай бог не null ибо тогда получишь проблему с isset, которая какого то хера делает больше чем array_key_exists, но работает в 300 раз быстрее.
Ну можешь взять Db/Set. но это pecl, то есть у тебя в дистре должен быть нужная dll с этим и включено в php.ini....)
тайп хинтинг убогий до сих пор. на питон бы посмтрели.
> Исключение ни одна функция из этих тебе не кинет конечно - проверяй возврат функции и потом доставай код ошибки и сообщение вручную
Гоферы недоумевают, глядя на это заявление.
>>860348
Аааа. Я понял. Ты типа Partial content хочешь имплементировать. Тупанул. Тупанул.
Так у тебя не по спекам
https://www.rfc-editor.org/rfc/rfc9110#name-range-requests
https://www.rfc-editor.org/rfc/rfc9110#status.206
как это сделать?
Мне на это всё похуй, потому что я пишу не на менее уёбищном джаваскрипте, понимаешь? Я просто хочу работать и получать удовольствие.
ты сравниваешь несравнимое
в пхп у тебя функция может вернуть -1, false, null или вообще ничего
при этом у тебя в языке есть исключения и они используются, а значит ты будешь вручную доставать "что там за ошибка и превращать в исключения"
смягчает все это только то, что ты будешь писать в рамках какого то фреймворка или движка, то есть в основном оперировать более высокими абстракциями, а в остальном просто верить "я тут начал писать файл, значит он будет писаться, если не будет - ну получит пользователь варнинг в итоге, а fail fast никому не нужен. мне пох"
>>860471
в жс много WTF с типами, но вот таких все равно нет. В частности работа с ошибками там унифицирована
Вообще, если говорить про тяготы выбора и неуверенность, то у меня второго шанса не будет, в том плане что возраст уже не будет позволять заново переучиваться.
>Скажите пожалуйста, есть смысл осваивать Шарп только ради геймдева?
Геймдев, это вообще в первую очередь не про язык.
>Даже если не получится с юнити, то где ещё сишарп можно использовать?
Еще есть Godot, есть XNA (или во что оно там сейчас мутировало), есть еще куча всякой полудохлой мелочи и отдельных библиотек позволяющих без движка геймдевить.
>в том плане что возраст уже не будет позволять заново переучиваться.
И сколько тебе лет? Просто интересно во сколько люди себя уже хоронят?
Функция "Основные моменты документа" сейчас недоступна из-за внутренней ошибки. Показать трассировку стека
зачем тебе вообще динамик. Ни разу не использовал в впф
да и в общем то где либо. Крайне редко когда без него не обойтись.
Спасибо за ответы. То есть у меня проблема в http заголовках, я правильно понял? А вариант через asp core я уже готовый нашёл, но я хочу сам сделать через TcpListener
Как можно проверить, применилась ли конфигурация? Метаданные у сущности какие-то получить?
В миграции можно увидеть сгенерированный sql код
>Я что-то не так делаю? Когда я пишу конфигурацию сущности в OnModelCreating, всё работает. Когда я переношу её в IEntityTypeConfiguration, ничего не работает.
Так а в OnModelCreating ты как её апплаишь? Сама по себе она же не добавиться и не примениться.
>ApplyConfigurationsFromAssembly()
Ты можешь поставить точку останова после Apply и посмотреть в дебаггере, что попало в ModelBuilder при первом обращении к контексту и его построении.
Либо в самих классах IEntityTypeConfiguration в Configure поставить точку останова и там посмотреть заходит ли вообще код туда при построении контекста.
Ну и выше тебе правильно говорили - сгенерируй миграцию. Если конфигурация действительно не применяется ты увидишь в ней код, который дропает, то что ты вынес из OnModelCreating.
---
Ну и опять же покажи код, как было и как стало, чтобы увидеть.
>зачем тебе вообще динамик.
В конвертере, собсно скрин >>860802 . Он умножает значение привязываемого свойства на значение ConverterParameter.
Но для разных типов (по подобию перегрузок) придется делать кучу конвертеров. А если учесть, что оператанд А и операнд Б могут иметь разные типы, то вообще ужас.
Хм. Дебаг чем-то помог. Я увидел странный FK с пометкой Shadow Required FK Index. То есть он мне создаёт теневое свойство, и создаёт его криво... но только если я не использую OnModelCreating.
Я.
Пытаюсь накидать протокол для пет-проекта RPC-сервера.
Пока что вот это накидал.
Что не так? Что не учел?
1) в конвертере можно создать свойство нужного типа, а не object, который провоцирует аллокации.
2) оно не является Bindable, к нему ничего не привязать даже — нужно из тех же ресурсов тащить значение, которое нужно еще и создать.
Очевидно же, что вариант:
<UserControl.Resources>
. . . <vc:MyConverter x:Key="MyCnv" VerticalAlignment=Bottom />
</UserControl.Resources>
<TextBox Text="{Binding Value, Converter={StaticResource MyCnv}}" />
Куда чище, чем это:
<UserControl.Resources>
. . . <VerticalAlignment x:Key="AlignmentY">Bottom</VerticalAlignment>
. . . <vc:MyConverter x:Key="MyCnv" />
</UserControl.Resources>
<TextBox Text="{Binding Value,
. . . . . . . . . . . . Converter={StaticResource MyCnv},
. . . . . . . . . . . . ConverterParameter={StaticResource AlignmentY}}" />
Есть NGINX как реверспрокси. Есть фронтенд на ангуляре, есть пяток микросервисов с web-api, среди которых - сервис авторизации.
Нужно. Сделать восстановление пароля.
Решил по модному - приходит ссылка на почту. При клике - перекидывает на форму установки нового пароля.
Проблема. Как это правильно делать в ситуации выше?
Я просто чет не понимаю как связать Nginx с фронтендом с беком и апишкой в данном случае. Пока что я нафигачил говняк на MVC который поверх веб-апишного проекта исключительно для формы восстановления пароля. Но мне не нравится такое решение. Типа как-то оно чужеродно смотрится.
Вот допустим, я запилил свой диспечер сообщений на рефлексии.
Проблема. Работает оно медленнее намного, чем если бы я просто свичом хуйнул.
Удобство добавлять новые обработчики - это хорошо. Но вот как-бы так сделать, чтобы после того как приложуха собралась запустилась и просканила сборки - заменить эту вот динамическую диспечеризацию на этот самый свич?
Кто-нибудь такое делал? Кто шарит?
Ну. Т.е. чтобы было понятно.
Вот у меня есть магический атрибут : Endpoint("Device/Ping", Auth.None);
Вуду магией я делаю так, чтобы сообщение попало в этот эндпоинт.
Но хочу я, чтобы после того как просканировал сборку, было так:
switch(MessageType){
case "Device/Ping" : context.SetHandler(new PingHandler(...)); break;
case "Device/Pong" : context.SetHandler(new PongHandler(...)); break;
case "Device/DestroyBase" :
if(context.Auth.Allow("DestroyBase")){
context.SatHandler(new DestryBaseHandler(...));
} else{
throw new AurhRequiredException();
}
break;
}
хз че за свитч. Просто сканишь сборку на аттрибуты, находишь что тебе нужно, разбираешь че как и создаешь caller- методы. и далее код который по нужной тебе строке найдет нужный caller и вызовет (возможно попутно сделав биндинг). И сделать такое ты можешь как и через рефлексию, так и новомодные соурс генераторы.
Ты не понял.
То что ты предлагаешь - это и есть то что я назвал диспечеризацией через рефлексию.
Но мне надо чтобы после того как я уже вытащил из сборки нужные обработичики и понял куда там собираются обращаться - генерировался новый класс, который бы вместо рефлексии содержал свич, который по замерам работает раз в 150-500 быстрее чем последующий поиск обработчиков и их вызов из делегатов.
это ты не понял.
скорость поиска обработчика в любом случае будет одинаковая (если у тебя не кривые руки) - ведь свитч можно заменить поиском по словарю, а вся метаинфа для твоего if(allow лежит рядом с обработчиком и заранее приготовлена, так что тоже быстрое
у тебя долгий вызов делегата - так сделай его быстрым
конечно ты можешь сделать и через кодогенерацию сгенерив любой класс по желанию. И в нем может быть гигантский свитч, но троллебус-буханка.жпг
> скорость поиска обработчика в любом случае будет одинаковая
Ну не знаю. Вот что свичем нагенерировалось.
Program:Main():
push rbp
mov rbp, rsp
call [System.Console:ReadLine():System.String]
test rax, rax
je G_M27646_IG15
mov edi, dword ptr [rax+08H]
cmp edi, 1
jne SHORT G_M27646_IG07
xor esi, esi
cmp word ptr [rax+0CH], 49
sete sil
test sil, sil
je SHORT G_M27646_IG07
mov rdi, 0xD1FFAB1E ; string handle
mov rdi, gword ptr [rdi]
pop rbp
tail.jmp [System.Console:WriteLine(System.String)]
G_M27646_IG07:
cmp edi, 1
jne SHORT G_M27646_IG11
xor esi, esi
cmp word ptr [rax+0CH], 50
sete sil
test sil, sil
je SHORT G_M27646_IG11
mov rdi, 0xD1FFAB1E ; string handle
mov rdi, gword ptr [rdi]
pop rbp
tail.jmp [System.Console:WriteLine(System.String)]
G_M27646_IG11:
cmp edi, 1
jne SHORT G_M27646_IG15
xor edi, edi
cmp word ptr [rax+0CH], 51
sete dil
test dil, dil
je SHORT G_M27646_IG15
mov rdi, 0xD1FFAB1E ; string handle
mov rdi, gword ptr [rdi]
pop rbp
tail.jmp [System.Console:WriteLine(System.String)]
G_M27646_IG15:
mov rdi, 0xD1FFAB1E ; string handle
mov rdi, gword ptr [rdi]
pop rbp
tail.jmp [System.Console:WriteLine(System.String)]
Program:Do1():
mov rdi, 0xD1FFAB1E ; string handle
mov rdi, gword ptr [rdi]
tail.jmp [System.Console:WriteLine(System.String)]
Program:Do2():
mov rdi, 0xD1FFAB1E ; string handle
mov rdi, gword ptr [rdi]
tail.jmp [System.Console:WriteLine(System.String)]
Program:Do3():
mov rdi, 0xD1FFAB1E ; string handle
mov rdi, gword ptr [rdi]
tail.jmp [System.Console:WriteLine(System.String)]
Program:DefaultHandler():
mov rdi, 0xD1FFAB1E ; string handle
mov rdi, gword ptr [rdi]
tail.jmp [System.Console:WriteLine(System.String)]
Против того что со словарем
Program:Main():
G_M27646_IG01:
push rbp
push r15
push r14
push rbx
push rax
lea rbp, [rsp+20H]
G_M27646_IG02:
mov rdi, 0xD1FFAB1E ; System.Collections.Generic.Dictionary`2[System.String,System.Action]
call CORINFO_HELP_NEWSFAST
mov rbx, rax
mov rdi, gword ptr [rbx+18H]
call [System.Collections.Generic.NonRandomizedStringEqualityComparer:GetStringComparer(System.Object):System.Collections.Generic.IEqualityComparer`1[System.String]]
test rax, rax
je SHORT G_M27646_IG04
G_M27646_IG03:
lea rdi, bword ptr [rbx+18H]
mov rsi, rax
call CORINFO_HELP_ASSIGN_REF
G_M27646_IG04:
mov rdi, 0xD1FFAB1E ; data for <>O:<0>__Do1
mov rdx, gword ptr [rdi]
mov rdi, 0xD1FFAB1E ; string handle
mov r14, gword ptr [rdi]
test rdx, rdx
jne SHORT G_M27646_IG06
G_M27646_IG05:
mov rdi, 0xD1FFAB1E ; System.Action
call CORINFO_HELP_NEWSFAST
mov r15, rax
lea rdi, bword ptr [r15+08H]
mov rsi, r15
call CORINFO_HELP_ASSIGN_REF
mov rdi, 0xD1FFAB1E ; function address
mov qword ptr [r15+18H], rdi
mov rdi, 0xD1FFAB1E ; code for Program:Do1
mov qword ptr [r15+20H], rdi
mov rdi, 0xD1FFAB1E ; data for <>O:<0>__Do1
mov rsi, r15
call CORINFO_HELP_ASSIGN_REF
mov rdx, r15
G_M27646_IG06:
mov rdi, rbx
mov rsi, r14
mov ecx, 1
call [System.Collections.Generic.Dictionary`2[System.__Canon,System.__Canon]:TryInsert(System.__Canon,System.__Canon,ubyte):bool:this]
mov rdi, 0xD1FFAB1E ; data for <>O:<1>__Do2
mov rdx, gword ptr [rdi]
mov rdi, 0xD1FFAB1E ; string handle
mov r14, gword ptr [rdi]
test rdx, rdx
jne SHORT G_M27646_IG08
G_M27646_IG07:
mov rdi, 0xD1FFAB1E ; System.Action
call CORINFO_HELP_NEWSFAST
mov r15, rax
lea rdi, bword ptr [r15+08H]
mov rsi, r15
call CORINFO_HELP_ASSIGN_REF
mov rdi, 0xD1FFAB1E ; function address
mov qword ptr [r15+18H], rdi
mov rdi, 0xD1FFAB1E ; code for Program:Do2
mov qword ptr [r15+20H], rdi
mov rdi, 0xD1FFAB1E ; data for <>O:<1>__Do2
mov rsi, r15
call CORINFO_HELP_ASSIGN_REF
mov rdx, r15
G_M27646_IG08:
mov rdi, rbx
mov rsi, r14
mov ecx, 1
call [System.Collections.Generic.Dictionary`2[System.__Canon,System.__Canon]:TryInsert(System.__Canon,System.__Canon,ubyte):bool:this]
mov rdi, 0xD1FFAB1E ; data for <>O:<2>__Do3
mov rdx, gword ptr [rdi]
mov rdi, 0xD1FFAB1E ; string handle
mov r14, gword ptr [rdi]
test rdx, rdx
jne SHORT G_M27646_IG10
G_M27646_IG09:
mov rdi, 0xD1FFAB1E ; System.Action
call CORINFO_HELP_NEWSFAST
mov r15, rax
lea rdi, bword ptr [r15+08H]
mov rsi, r15
call CORINFO_HELP_ASSIGN_REF
mov rdi, 0xD1FFAB1E ; function address
mov qword ptr [r15+18H], rdi
mov rdi, 0xD1FFAB1E ; code for Program:Do3
mov qword ptr [r15+20H], rdi
mov rdi, 0xD1FFAB1E ; data for <>O:<2>__Do3
mov rsi, r15
call CORINFO_HELP_ASSIGN_REF
mov rdx, r15
G_M27646_IG10:
mov rdi, rbx
mov rsi, r14
mov ecx, 1
call [System.Collections.Generic.Dictionary`2[System.__Canon,System.__Canon]:TryInsert(System.__Canon,System.__Canon,ubyte):bool:this]
call [System.Console:ReadLine():System.String]
mov rsi, rax
mov rdi, rbx
call [System.Collections.Generic.Dictionary`2[System.__Canon,System.__Canon]:FindValue(System.__Canon):byref:this]
test rax, rax
je SHORT G_M27646_IG15
G_M27646_IG11:
mov rax, gword ptr [rax]
mov edi, 1
G_M27646_IG12:
test edi, edi
je SHORT G_M27646_IG16
G_M27646_IG13:
mov rdi, gword ptr [rax+08H]
call [rax+18H]System.Action:Invoke():this
nop
G_M27646_IG14:
add rsp, 8
pop rbx
pop r14
pop r15
pop rbp
ret
G_M27646_IG15:
xor rax, rax
xor edi, edi
jmp SHORT G_M27646_IG12
G_M27646_IG16:
mov rdi, 0xD1FFAB1E ; string handle
mov rdi, gword ptr [rdi]
call [System.Console:WriteLine(System.String)]
nop
G_M27646_IG17:
add rsp, 8
pop rbx
pop r14
pop r15
pop rbp
ret
Program:Do1():
G_M1167_IG01:
G_M1167_IG02:
mov rdi, 0xD1FFAB1E ; string handle
mov rdi, gword ptr [rdi]
G_M1167_IG03:
tail.jmp [System.Console:WriteLine(System.String)]
Program:Do2():
G_M2188_IG01:
G_M2188_IG02:
mov rdi, 0xD1FFAB1E ; string handle
mov rdi, gword ptr [rdi]
G_M2188_IG03:
tail.jmp [System.Console:WriteLine(System.String)]
Program:Do3():
G_M64525_IG01:
G_M64525_IG02:
mov rdi, 0xD1FFAB1E ; string handle
mov rdi, gword ptr [rdi]
G_M64525_IG03:
tail.jmp [System.Console:WriteLine(System.String)]
Program:DefaultHandler():
G_M58470_IG01:
G_M58470_IG02:
mov rdi, 0xD1FFAB1E ; string handle
mov rdi, gword ptr [rdi]
G_M58470_IG03:
tail.jmp [System.Console:WriteLine(System.String)]
> скорость поиска обработчика в любом случае будет одинаковая
Ну не знаю. Вот что свичем нагенерировалось.
Program:Main():
push rbp
mov rbp, rsp
call [System.Console:ReadLine():System.String]
test rax, rax
je G_M27646_IG15
mov edi, dword ptr [rax+08H]
cmp edi, 1
jne SHORT G_M27646_IG07
xor esi, esi
cmp word ptr [rax+0CH], 49
sete sil
test sil, sil
je SHORT G_M27646_IG07
mov rdi, 0xD1FFAB1E ; string handle
mov rdi, gword ptr [rdi]
pop rbp
tail.jmp [System.Console:WriteLine(System.String)]
G_M27646_IG07:
cmp edi, 1
jne SHORT G_M27646_IG11
xor esi, esi
cmp word ptr [rax+0CH], 50
sete sil
test sil, sil
je SHORT G_M27646_IG11
mov rdi, 0xD1FFAB1E ; string handle
mov rdi, gword ptr [rdi]
pop rbp
tail.jmp [System.Console:WriteLine(System.String)]
G_M27646_IG11:
cmp edi, 1
jne SHORT G_M27646_IG15
xor edi, edi
cmp word ptr [rax+0CH], 51
sete dil
test dil, dil
je SHORT G_M27646_IG15
mov rdi, 0xD1FFAB1E ; string handle
mov rdi, gword ptr [rdi]
pop rbp
tail.jmp [System.Console:WriteLine(System.String)]
G_M27646_IG15:
mov rdi, 0xD1FFAB1E ; string handle
mov rdi, gword ptr [rdi]
pop rbp
tail.jmp [System.Console:WriteLine(System.String)]
Program:Do1():
mov rdi, 0xD1FFAB1E ; string handle
mov rdi, gword ptr [rdi]
tail.jmp [System.Console:WriteLine(System.String)]
Program:Do2():
mov rdi, 0xD1FFAB1E ; string handle
mov rdi, gword ptr [rdi]
tail.jmp [System.Console:WriteLine(System.String)]
Program:Do3():
mov rdi, 0xD1FFAB1E ; string handle
mov rdi, gword ptr [rdi]
tail.jmp [System.Console:WriteLine(System.String)]
Program:DefaultHandler():
mov rdi, 0xD1FFAB1E ; string handle
mov rdi, gword ptr [rdi]
tail.jmp [System.Console:WriteLine(System.String)]
Против того что со словарем
Program:Main():
G_M27646_IG01:
push rbp
push r15
push r14
push rbx
push rax
lea rbp, [rsp+20H]
G_M27646_IG02:
mov rdi, 0xD1FFAB1E ; System.Collections.Generic.Dictionary`2[System.String,System.Action]
call CORINFO_HELP_NEWSFAST
mov rbx, rax
mov rdi, gword ptr [rbx+18H]
call [System.Collections.Generic.NonRandomizedStringEqualityComparer:GetStringComparer(System.Object):System.Collections.Generic.IEqualityComparer`1[System.String]]
test rax, rax
je SHORT G_M27646_IG04
G_M27646_IG03:
lea rdi, bword ptr [rbx+18H]
mov rsi, rax
call CORINFO_HELP_ASSIGN_REF
G_M27646_IG04:
mov rdi, 0xD1FFAB1E ; data for <>O:<0>__Do1
mov rdx, gword ptr [rdi]
mov rdi, 0xD1FFAB1E ; string handle
mov r14, gword ptr [rdi]
test rdx, rdx
jne SHORT G_M27646_IG06
G_M27646_IG05:
mov rdi, 0xD1FFAB1E ; System.Action
call CORINFO_HELP_NEWSFAST
mov r15, rax
lea rdi, bword ptr [r15+08H]
mov rsi, r15
call CORINFO_HELP_ASSIGN_REF
mov rdi, 0xD1FFAB1E ; function address
mov qword ptr [r15+18H], rdi
mov rdi, 0xD1FFAB1E ; code for Program:Do1
mov qword ptr [r15+20H], rdi
mov rdi, 0xD1FFAB1E ; data for <>O:<0>__Do1
mov rsi, r15
call CORINFO_HELP_ASSIGN_REF
mov rdx, r15
G_M27646_IG06:
mov rdi, rbx
mov rsi, r14
mov ecx, 1
call [System.Collections.Generic.Dictionary`2[System.__Canon,System.__Canon]:TryInsert(System.__Canon,System.__Canon,ubyte):bool:this]
mov rdi, 0xD1FFAB1E ; data for <>O:<1>__Do2
mov rdx, gword ptr [rdi]
mov rdi, 0xD1FFAB1E ; string handle
mov r14, gword ptr [rdi]
test rdx, rdx
jne SHORT G_M27646_IG08
G_M27646_IG07:
mov rdi, 0xD1FFAB1E ; System.Action
call CORINFO_HELP_NEWSFAST
mov r15, rax
lea rdi, bword ptr [r15+08H]
mov rsi, r15
call CORINFO_HELP_ASSIGN_REF
mov rdi, 0xD1FFAB1E ; function address
mov qword ptr [r15+18H], rdi
mov rdi, 0xD1FFAB1E ; code for Program:Do2
mov qword ptr [r15+20H], rdi
mov rdi, 0xD1FFAB1E ; data for <>O:<1>__Do2
mov rsi, r15
call CORINFO_HELP_ASSIGN_REF
mov rdx, r15
G_M27646_IG08:
mov rdi, rbx
mov rsi, r14
mov ecx, 1
call [System.Collections.Generic.Dictionary`2[System.__Canon,System.__Canon]:TryInsert(System.__Canon,System.__Canon,ubyte):bool:this]
mov rdi, 0xD1FFAB1E ; data for <>O:<2>__Do3
mov rdx, gword ptr [rdi]
mov rdi, 0xD1FFAB1E ; string handle
mov r14, gword ptr [rdi]
test rdx, rdx
jne SHORT G_M27646_IG10
G_M27646_IG09:
mov rdi, 0xD1FFAB1E ; System.Action
call CORINFO_HELP_NEWSFAST
mov r15, rax
lea rdi, bword ptr [r15+08H]
mov rsi, r15
call CORINFO_HELP_ASSIGN_REF
mov rdi, 0xD1FFAB1E ; function address
mov qword ptr [r15+18H], rdi
mov rdi, 0xD1FFAB1E ; code for Program:Do3
mov qword ptr [r15+20H], rdi
mov rdi, 0xD1FFAB1E ; data for <>O:<2>__Do3
mov rsi, r15
call CORINFO_HELP_ASSIGN_REF
mov rdx, r15
G_M27646_IG10:
mov rdi, rbx
mov rsi, r14
mov ecx, 1
call [System.Collections.Generic.Dictionary`2[System.__Canon,System.__Canon]:TryInsert(System.__Canon,System.__Canon,ubyte):bool:this]
call [System.Console:ReadLine():System.String]
mov rsi, rax
mov rdi, rbx
call [System.Collections.Generic.Dictionary`2[System.__Canon,System.__Canon]:FindValue(System.__Canon):byref:this]
test rax, rax
je SHORT G_M27646_IG15
G_M27646_IG11:
mov rax, gword ptr [rax]
mov edi, 1
G_M27646_IG12:
test edi, edi
je SHORT G_M27646_IG16
G_M27646_IG13:
mov rdi, gword ptr [rax+08H]
call [rax+18H]System.Action:Invoke():this
nop
G_M27646_IG14:
add rsp, 8
pop rbx
pop r14
pop r15
pop rbp
ret
G_M27646_IG15:
xor rax, rax
xor edi, edi
jmp SHORT G_M27646_IG12
G_M27646_IG16:
mov rdi, 0xD1FFAB1E ; string handle
mov rdi, gword ptr [rdi]
call [System.Console:WriteLine(System.String)]
nop
G_M27646_IG17:
add rsp, 8
pop rbx
pop r14
pop r15
pop rbp
ret
Program:Do1():
G_M1167_IG01:
G_M1167_IG02:
mov rdi, 0xD1FFAB1E ; string handle
mov rdi, gword ptr [rdi]
G_M1167_IG03:
tail.jmp [System.Console:WriteLine(System.String)]
Program:Do2():
G_M2188_IG01:
G_M2188_IG02:
mov rdi, 0xD1FFAB1E ; string handle
mov rdi, gword ptr [rdi]
G_M2188_IG03:
tail.jmp [System.Console:WriteLine(System.String)]
Program:Do3():
G_M64525_IG01:
G_M64525_IG02:
mov rdi, 0xD1FFAB1E ; string handle
mov rdi, gword ptr [rdi]
G_M64525_IG03:
tail.jmp [System.Console:WriteLine(System.String)]
Program:DefaultHandler():
G_M58470_IG01:
G_M58470_IG02:
mov rdi, 0xD1FFAB1E ; string handle
mov rdi, gword ptr [rdi]
G_M58470_IG03:
tail.jmp [System.Console:WriteLine(System.String)]
У тебя в коде использований словарей и так 100500. Нашел где экономить.
Сервер где моя приложуха стоит - не соответствует минимальным требованиям, и меня ебут, дескать я говно сделал.
Я говорю, блядь, у вас сервер 2004 года, какой неткор последний. Мне говорят - не ебет, делай чтобы летало, а то на мороз отправим.
(((
На мороз не хочу. Только родители перестали ебать мозги, что денег в дом не приношу. Так что надо на всем экономить...
>Мне говорят - не ебет, делай чтобы летало, а то на мороз отправим.
1) На тоненького пытаются взять. Более мощный сервак будет всяко дешевле, чем все головняки связнные с твоим увольнением и наймом кого-нибудь другого.
2) Я бы в любом случае съебал из такой конторы и нашел другую работу.
Алсо, если же все-таки за забор не вариант, то я бы на твоем месте просто хардкодил, забыв на время про удобство и забив хуй на поддерживаемость.
>Более мощный сервак будет всяко дешевле, чем все головняки связнные с твоим увольнением и наймом кого-нибудь другого.
Ты явно не сталкивался с ру бизнесом где похер на деньги, это дело принципа, чел пойдет на мороз даже если проект пойдет по пи... особенно если ИТ это не основная деятельность компании
а все потому что по аналитике роста в РФ по ИТ нет и не будет, тупо нет рынка кому этот ИТ может быть нужен, а значит можно диктовать свои условия
>Я бы в любом случае съебал из такой конторы и нашел другую работу.
А есть варианты? Просто рынок максимально ужался для спецов за норм деньги, кредитно-ипотечные хомяки готовы за половину своей цены работать и радоваться что могут это делать
у меня вот резюме висит под минимальный мой прайс (30 баксов в час), так все меня хотят за 10-20, что смешно потому что я работал в компании где мне платили 80 баксов в час и радовались, потому что аутсорс решение моих задач им выходили в эти 80 - 150 бачей в час с более худшим результатом
так что чуваку профилировщик в руки и пусть смотрит вначале на то что дрючит его GC и оптимизирует там... а так же изучает как оптимизировать работу так чтобы вообще память на стеке выделять чтобы GC вообще сервак не трогал, потому что по моему опыту большая часть работы это GC
Почему это?
Ну. Т.е. я не знаю как у майков в CIL, но если брать обычные ассемблеры - то там NOP - используется как - ниче не делать.
тогда я не понимаю почему он сует мне NOP в начале метода в дебаг сборке, а в релизной - нет нихуя
NOP-ы в debug сборке - это места куда дебаггер брекпоинты вставляет. Плюс еще для некоторых штук. Рихтера покури, у него есть об этом.
Есть код вида:
static object syncRoot = new();
void RegisterUser(ApplicationDbContext db, string userName, string userType, string userName, string email){
lock(syncRoot){
var type = db.GetOrCreateUserType(userType);
var userNumber1 = db.Users.GetNextUserNumber1();
var userNumber2 = db.Users.GetNextUserNumber2();
var userSlot = db.Users.GetFreeSlot();
db.Users.Add(new User{
Name = userName,
Email = email,
TypeId = type,
Num1 = userNumber1,
Num2 = userNumber2,
Slot = userSlot;
})
db.SaveChanges();
}
}
Суть в чем. В Таблице пользователей - есть 3 колонки.
Num1 - идентификатор используемый сторонней системой для вытаскивания инфы о юзерах, по соглашению - это должно быть число от 0 до 2^32-1, дырок быть не должно, система обращается ко мне и с 0 до первого -1 "читает".
Num2 - аналогично Num1 но для другой системы.
Slot - число от 0 до 2^64-1 - уже мой идентификатор для того чтобы сервер "общался" с юзерами. Тоже дырок быть не должно.
Собственно методы GetNextUserNumber1, GetNextUserNumber2 и GetFreeSlot - лезут в базу, ищут "дырки"(ака gap). Если находят - смещают номера пока дырок не останется. Потом - регистрируется пользователь.
И да. Вроде ебануто. Но все как-бы работало нормально. До недавнего времени. Недавно внезапно возрасла нагрузка и этих пользователей стало разом регистрироваться по 10к в день. А метод RegisterUser выполняется целую секунду. Думаю понимаете, какой пиздец наступает, если разом хотя бы 1к решает зарегаться.
Вот и мне интересно. А как какать мне что-то сделать с этой вот хуйней? Медленность этого дела - меня тревожит и раздражает. А как сделать чтобы быстро было и те вот требования с отсутствием дырок - так же остались выполнены.
Есть код вида:
static object syncRoot = new();
void RegisterUser(ApplicationDbContext db, string userName, string userType, string userName, string email){
lock(syncRoot){
var type = db.GetOrCreateUserType(userType);
var userNumber1 = db.Users.GetNextUserNumber1();
var userNumber2 = db.Users.GetNextUserNumber2();
var userSlot = db.Users.GetFreeSlot();
db.Users.Add(new User{
Name = userName,
Email = email,
TypeId = type,
Num1 = userNumber1,
Num2 = userNumber2,
Slot = userSlot;
})
db.SaveChanges();
}
}
Суть в чем. В Таблице пользователей - есть 3 колонки.
Num1 - идентификатор используемый сторонней системой для вытаскивания инфы о юзерах, по соглашению - это должно быть число от 0 до 2^32-1, дырок быть не должно, система обращается ко мне и с 0 до первого -1 "читает".
Num2 - аналогично Num1 но для другой системы.
Slot - число от 0 до 2^64-1 - уже мой идентификатор для того чтобы сервер "общался" с юзерами. Тоже дырок быть не должно.
Собственно методы GetNextUserNumber1, GetNextUserNumber2 и GetFreeSlot - лезут в базу, ищут "дырки"(ака gap). Если находят - смещают номера пока дырок не останется. Потом - регистрируется пользователь.
И да. Вроде ебануто. Но все как-бы работало нормально. До недавнего времени. Недавно внезапно возрасла нагрузка и этих пользователей стало разом регистрироваться по 10к в день. А метод RegisterUser выполняется целую секунду. Думаю понимаете, какой пиздец наступает, если разом хотя бы 1к решает зарегаться.
Вот и мне интересно. А как какать мне что-то сделать с этой вот хуйней? Медленность этого дела - меня тревожит и раздражает. А как сделать чтобы быстро было и те вот требования с отсутствием дырок - так же остались выполнены.
>А как сделать чтобы быстро было и те вот требования с отсутствием дырок - так же остались выполнены.
1) Может стоит сначала разобраться откуда эти дыры там берутся и заполнять их конкретно в те самые моменты, а не когда регается новый ползователь?
2) Как вариант батчить регистрацию пользователей. Т.е. закрывать дыры не при регистрации каждого пользователя, а сначала закрыть гэпы, а потом сразу пачкой регать всех кто пришел за определенный интервал времени.
3) Зачем вообще нужны такие ебанутые правила для идентификаторов?
>Всегда все можно сделать ручками.
как?
>Не говоря уже про конверторы
как? у тебя ConverterBack не отработает.
Предположим, что конвертер обрабатывает Thickness.Top.
В методе Converter в параметр value приходит Thickness целиком. Мы можем возвратить необходимую нам часть:
return ((Thickness)value).Top;
В методе ConverterBack в параметр value приходит только значение Thickness.Top, а у нас нет данных Thickness.Left, Thickness.Right, Thickness.Bottom.
>Всегда все можно сделать ручками.
Думаешь к каждому окну свойств привязан индус, который вручную заполняет окошки?
>как?
ручками можно что угодно. Никто подход "работаем как в винформс" не отменял. Можно спокойно создать вьюху какую угодно, потом смотреть есть ли у объекта проперти нужного типа, и, если есть, то вывести эту вьюху. Далее вручную ловить изменения INPC (или еще как отслеживать) и обновлять вьюху как угодно, аналогично ловить изменения вьюхи и обновлять source как угодно.
Биндинги делают то же самое, просто они стандартный и весьма ограниченный путь.
>Предположим, что конвертер обрабатывает Thickness.Top.
в конвертер может притопать и весь объект даже, а там уже разрулить на месте кто кому (это легко, можно создать 4 конвертера или же 1 и в конвертерпараметер указать что там за значение ходит).
Также вьюха может выставить наружу одно депенденси свойство Thickness которое само будет разруливать все преобразования, а внутри контрола старые добрые события Text = и TextChanged
внутри кастомных изолированных контролов может быть до 100% code-behind и это нормально.
>>865751
думаешь на винформсах есть система биндингов нормальная (ну щас то что то есть но не знаю что)? А пропертигриды были всегда
>Также вьюха может выставить наружу одно депенденси свойство Thickness
В моем случае не может. Я должен это разрулить в DataTemplate, который находится в словаре ресурсов.
Грубо говоря, в таблицу DataGrid приходит итем типа Thickness, далее DataTemplateSelector подбирает нужный DataTemplate, в котором я должен забиндиться к свойствам Thickness.
>в конвертер может притопать и весь объект даже
У тебя в ConverterBack приходят данные с условного тексбокса, где юзер ввел число 30. Схуев туда "может" придти весь объект? Непорочным зачатием он там появится? Всё, данные утеряны на этапе конвертации из вьюмодели в текст бокс.
>думаешь на винформсах есть система биндингов нормальная
Я не верю, что вижуал студия не решила этот момент цивилизованным путем. Неужели не придумали до сих пор никаких провайдеров, реверсивных мультиконвертеров?
Мне приходила в мысль создать UIElement в качестве посредника, но это костыль какой-то.
>В моем случае не может
Надо меньше пачкаться. И вообще, некоторые языком умываются (c)
В твоем DataTemplate находится вьюха, которая царь во дворца - у нее свой code-behind, доступны атачедпроперти (это свои code behind-ы), то есть полная свобода и наличие/отсутствие DataTemplate вообще не причем.
>Непорочным зачатием он там появится
подозреваю, это я тебе показывал как в конвертере использовать dp наследованием от фризабле. Ну как бы - вот. Передаешь в такой конвертер объект (хоть дата контекст) и конвертпараметром уточняешь что конкретно ты хочешь конвертить. Как маркупрасширение не выйдет, но обычным путем через "конвертер в ресурсах" все работает (только не в ресурсах дататемплате, а то биндинг там не виден, а уровнем чуть пониже)
>Я не верю, что вижуал студия не решила этот момент цивилизованным путем
вьюха выставляющая наружу свойство и внутри себя уже пофиг как - вполне себе нормальный путь. И обычно все пропертигрид разруливаются в коде, а ему нет проблем решить проблему "что-то там не биндится"
похоже у тебя болезнь "code-behind злющее зло и когда я использую code-behind, то бог убивает котенка"
Не нужно с таким упорством пытаться разрулить все декларативщиной. Она не всесильна. С ней бы я до сих по бы парился как забиндить SelectedItem.
К тому же атачепропы это чистый code-behind и норма же.
>подозреваю, это я тебе показывал как в конвертере использовать dp наследованием от фризабле. Ну как бы - вот.
Я пытался такое провернуть. Если я начну биндиться из ресурсов, то у меня происходит странная хрень — изменения привносит только первый объект в списке похожих. Все остальные как будто бы не биндятся. Это при том, что ресурс я инициализировал локально в DataTemplate.
Пока не понял почему.
> 1) Может стоит сначала разобраться откуда эти дыры там берутся и заполнять их конкретно в те самые моменты, а не когда регается новый ползователь?
Эти дыры могут взяться, если 1. Импортить пользователей. 2. Удалить пользователя руками.
> Как вариант батчить регистрацию пользователей. Т.е. закрывать дыры не при регистрации каждого пользователя, а сначала закрыть гэпы, а потом сразу пачкой регать всех кто пришел за определенный интервал времени.
Пробовал. Тогда начинается свистопляска с тем, что идентификаторы надо каждый раз из базы достать, потом хранить последний выданный в самом ПО. А чтобы все работало как надо - надо лок накидывать и тогда вообще гроб-пизда. Если в очередь выставить - то тот кто последний регается - может по таймауту отвалиться, что неприятно.
> Зачем вообще нужны такие ебанутые правила для идентификаторов?
Требования интеграции со сторонним ПО + требования к самому ПО, чтобы уже родное ПО - могло просто в цикле от 0 до n пройтись и чет там с пользователями сделать. Т.е. просто - один запрос - дай мне данные этого пользователя - нету, все, закончили. Если тут дырки - нужно более сложный протокол придумывать, в духе: А дай мне спиосок всех пользователей, а дай мне айДи следующего и прочее, что нагрузка на сеть и вообще не оч хорошо.
var n = new ResourceDictionary() { Source = new Uri("<путь к словарю>") };
foreach (DictionaryEntry entry in n) {
Debug.WriteLine(entry.Key);
}
Самое интересное, что если сделать копию словаря под другим именем, то порядок его элементов будет совпадать с копией. Даже при десериализации.
База...
672x336, 0:08
Есть DataGrid и ItemsControl. Оба в качестве итемс соурс используют один источник данных. Когда нажимаю на хидер для сортировки столбца DataGrid, за каким-то фигом еще и сортируется список в ItemsControl.
Разве сортировка столбцов не должна осуществляться где-то внутри таблицы не затрагивая источник?
https://dropmefiles.com/xvB0L
ты знал куда шел
А вообще если CollectionViewsource.GetDefaultview примнить к источнику то он к нему и цепляется, а не проксирует. Видимо датагрид это делает внутри себя
Я за 2к купил себе еще один монитор. Ты рили зажрался.
Ctrl + F не сравнится с перелистыванием страниц.
>c# 6.0
Не чувак. Слишком старое. Базу ты может и выучишь, но прямо совсем такое себе. Найди хотя бы по 7-му.
public class Controller
{
HandlerService _handlerService;
public async Task<IActionResult> Post(Data data)
{
_handlerService.StartHandle(data);
return Ok();
}
}
public class HandlerService
{
DbContext _dbContext;
MoreWorkService _moreWorkService;
public void StartHandle(Data data)
{
Task.Run(() => Handle(data));
}
private async Task Handle(Data data)
{
DbData dbData = _dbContext.DbDatas.FirstOrDefault(x => x.Id == data.Id);
await _moreWorkService.SomeMoreWork(dbData);
}
}
Но в таком варианте при обращении к _dbContext в методе Handle вылетает эксепшен дескать контекст уже задиспожен и не существует. В принципе я даже знаю как это можно обойти создать переменную контекста внутри метода хэндл, но подозреваю что и переменную моворксервиса тоже нужно будет создавать внутри метода но хочу узнать какие ещё есть варианты и лучшие практики для такой задачи
public class Controller
{
HandlerService _handlerService;
public async Task<IActionResult> Post(Data data)
{
_handlerService.StartHandle(data);
return Ok();
}
}
public class HandlerService
{
DbContext _dbContext;
MoreWorkService _moreWorkService;
public void StartHandle(Data data)
{
Task.Run(() => Handle(data));
}
private async Task Handle(Data data)
{
DbData dbData = _dbContext.DbDatas.FirstOrDefault(x => x.Id == data.Id);
await _moreWorkService.SomeMoreWork(dbData);
}
}
Но в таком варианте при обращении к _dbContext в методе Handle вылетает эксепшен дескать контекст уже задиспожен и не существует. В принципе я даже знаю как это можно обойти создать переменную контекста внутри метода хэндл, но подозреваю что и переменную моворксервиса тоже нужно будет создавать внутри метода но хочу узнать какие ещё есть варианты и лучшие практики для такой задачи
Ладно, кажется я тупой но это не точно Кажется можно сразу в контроллере делать вызов _handlerService.Handle(data) и не эвейтить его и будет норм но все равно хочу почитать как ещё решается такая задача
>подозреваю, это я тебе показывал как в конвертере использовать dp наследованием от фризабле. Ну как бы - вот.
Короче я понял почему, точнее кто виноват - DataGrid.
Очень мутный контрол.
Для ListBox, ListView, ItemsControl отработал ValueConverter, причем без всяких там фризабле и привязок. Дело в том,что метод Convert отрабатывает при любом изменении свойства вьюмодели, соответственно я в этом методе сохраняю в локальное поле конвертера входящее значение value. А ConvertBack я это значение меняю и возращаю обратно свойству вьюмоедли. Никаких привязок не нужно.
Что делать с DataGrid так и не понял. Очень капризный. С ним не работают ни этот ValueConverter, ни DataTemplate. Удалось передать текст из текстбокса только в режиме UpdateSourceTrigger=PropertyChanged.
Сбрасывает DataTemplate при сортировке.
ListView тоже тот еще кадр, пришлось попотеть с восстановлением полноценного стиля с поддержкой GridViewRowPresenter и ContentPresenter.
>Удалось передать текст из текстбокса только в режиме UpdateSourceTrigger=PropertyChanged.
ну если у тебя режим редактирования (для которого конечно свой шаблон), то конечно шаблон исчезает ничего не передав. Не то чтобы это нормально, это просто вот
>Что делать с DataGrid так и не понял.
Ты всё правильно понял, эта параша состоит целиком из магии, пока не узнаешь - не узнаешь. Так что советую с такими проблемами обращаться к нейросетям, они как раз хорошо вытаскивают магическую инфу из помойки которую вручную не разгрести никогда.
Задача: перенести все это говно на postresql
Кто-нибудь делал такое или может подскажет? Просто взять и дропнуть старые миграции и скриптом перетащить данные из базы в базу нельзя, нужно чтоб работали откаты.
В разы проигрывает по скорости skiasharp
а в чем проблема, ведь ef как раз и нужен чтобы базы менять
мне так постоянно внушали, мол, захотим - базу сменим за секунду.
dapper-кун
Миграции специфичные для t-sql. Я хз можно ли их как-то подружить с провайдером postgre.
> захотим - базу сменим за секунду
Я тоже так думал и частично думаю, просто что-то не учел. Уверенный меняю провайдера, делаю первую миграцию на постгре, получаю шмат говна про несовместимость с mssql провайдером вперемешку с npe. Убрал mssql из нугетов, уже в файлах старых миграций ругается, что нет провайдера. Если дропнуть старые миграции, то все работает без танцев с бубном
>Кажется можно сразу в контроллере делать вызов _handlerService.Handle(data) и не эвейтить его и будет норм
Да.
>как ещё решается такая задача
Если речь идёт о какой-то важной функциональности - по-хорошему через фоновые задачи.
https://learn.microsoft.com/ru-ru/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-7.0&tabs=visual-studio#queued-background-tasks
Решил ебанутым методом. В фоне - в тихую - заполняю пул нужных мне данных. Потом при регистрации - достаю из пула - и сразу ставлю таску на добавить в пулл новое значение. Таким макаром - если интенсивно нагрузка резко возрастает - это начинает быть заметно только при оч больших нагрузках, а в большинстве случаев - работает быстро.
Костыль, но хз че еще придумать было.
У меня было что-то подобное, но чуть ли не на глобальном уровне — для всех приложений.
Мне нужно внутри вьюмодели знать, что происходит изменение коллекции, но эта коллекция тупо ObservableCollection.
Когда приходит запрос в контроллер он скидывает его в какую-нибудь очередь обработки, пуляет ОК и все.
А хендлер сервис у тебя крутится в качестве бэкграунд сервиса и мониторит эту очередь. Когда там что-то появляется, он это обрабатывает.
Лол, у меня тоже такое иногда бывает, только не в студии, а, внимание, в идее.
Я делал.
Старые миграции дропать однозначно. Перед этим предварительно нужно их все пересмотреть, если там есть ручные доработки, то перенести все это в код сервиса (параллельно переебав тому кто лезет своими грязными руками в генереный код) Если есть какие-нибудь встройки или типы, то переписывать.
БД у тебя разные, поэтому откаты у на те миграции которые были на mssql не будут работать. И в принципе, новая СУБД - новая БД, нехуй тащить за собой хвосты.
Если нужны данные из старой БД, то смотришь, что там за данные.
Если это справочники, то их вносишь в код+конфиги (json, csv) и в миграции через .HasData. Если какие-то регулярные рабочие данные, то переносишь скриптами через ODBC или экспорт-импорт.
>ведь ef как раз и нужен чтобы базы менять
>мне так постоянно внушали, мол, захотим - базу сменим за секунду.
>dapper-кун
Да, но только если изначально нормально проектируешь приложение. Если нормально делаешь, не лезешь в миграции и БД руками. Тогда все работает просто, в три шага: меняешь провайдера, -> сносишь старые миграции -> генеришь новые. Все.
Если у тебя там кал говна, с кучей raw sql в миграциях и данными добавлеными в БД в обход ORM - тогда ебись.
>на бумаге в теории работает просто, в три шага: раз, -> два -> три. Все.
>если у тебя реальный рабочий проект - тогда ебись.
Перевел на человеческий язык.
>>если у тебя реальный рабочий проект - тогда ебись
Не, ну если ты мазохист и тебе охота в говне копаться, то пожалуйста. Но если делать нормально и бить по рукам пидарасов которые делают не нормально, то будет заебись.
если только твой класс их сам создал и не получил их через конструктор. Тогда подписка удерживает связь компонент-ты, а ты удерживаешь связь ты-компонент. И никто внешний.
в реальности менять бд нужно 0.000001 раз. мы ж не убер
а вот время старта EF это кабздец просто. Что они там делают блин. почему результат этого нельзя закешировать. Для сервера ладно (хотя для разработки все равно ахтунг), но десктопы - дорого давать секунды на хрень
>в реальности менять бд нужно 0.000001 раз. мы ж не убер
Мне за два года 5 раз пришлось уже с одной БД на другую переходить.
>а вот время старта EF это кабздец просто. Что они там делают блин. почему результат этого нельзя закешировать.
Там основное время на старте (вернее даже на первом запросе) уходит на построение контекста.
Есть несколько разных трюков как ускорить загрузку. Плюс современный EFCore сам по себе довольно хорошо оптимизирован по сравнению с предыдущими версиями. Так что сейчас "долгое время загрузки" не такое уж и долгое. Многие десктопные приложухи и без EF дохуя долго стартуют, лишние пару секунд погоды не сделают.
Ну и если ты делаешь, что-то легковесное что должно стартовать максимально быстро, то EF там собственно нахуй не нужен, достаточно даппера или еще какой-нибудь мелкой хуйни.
>Мне за два года 5 раз пришлось уже с одной БД на другую переходить.
сходить бы тебе к психологу. издеваются над ты
>Есть несколько разных трюков как ускорить загрузку
например, взять не EF
собственно об этом ты и говоришь
>сходить бы тебе к психологу. издеваются над ты
Ну что поделать если меня зовут как раз на проекты где нужно разгрести старое дерьмо, выкинуть все ненужное и перевести все на новые рельсы.
Проблема была только один раз на втором проекте когда нужно было переходить с MS на PG. Там было нагажено в миграциях руками и пришлось повозиться, чтобы привести все в порядок. Потом там же понадобилось вернуться обратно на MS, а потом еще раз обратно на PG (издержки выкатывания релизов и не было возможности просто откатить версию) - и это делалось простым переключением провайдера и перегенерированием миграций.
>>872438
>например, взять не EF
Можно, только на моей памяти прям вот, чтобы были проблемы со скоростью был только один раз и то там дело было не в EF, а в плохом проектировании БД и ебанутых интеграциях, когда приходилось попусту перекачивать данные из одной БД в другие туда-сюда без какого-либо результата. Во всех остальных случаях все спокойно укладывалось в SLA с многократным запасом и вопрос использования какой-либо другой ORM даже не поднимался.
>что вообще такое application pool на иис
По сути песочница.
>есть подозрение, что одно легаси приложение на нетфреймверке переодически падает в аутофиемори именно из-за пула
Вряд ли. Для этого у тебя должен быть максимально дохлый сервер, либо что более вероятно - лютый говнокод.
Но, технически, там есть квоты на память, только я х.з. как их менеджить, т.к. никогда не возникало такой необходимости.
Попробуй ПКМ на нужный пул и выбери "Recycing..." там есть настройки памяти.
Вопрос. Как мне лучше всего запоминать юзеров, эти guid. Хранить какой-нибудь словарь прямо в контроллере? Может редисом кешировать guid? Или копать в сторону сессий? Без баз данных, наверное даже какой-нибудь ef inmemory тут лишний. С другой стороны юзер может хоть год открытым держать тест и все должно работать, то есть айди нельзя удалять со временем? А если пользователь закроет браузер, как понять что айди нужно удалить? Доступа к фронту у меня нет и не будет.
Я что то запутался как лучше сделать, не хочу по ебалу потом отхватить.
> Хранить какой-нибудь словарь прямо в контроллере?
Это точно хуйня идея, я не знаю как современный нормальный дотнет, но старый дотнет периодически отваливается нахуй с хрустом с ликвидацией всего что было в памяти. У нас короче он автоматом реанимируется (даже если ничего не делать специально то его будет реанимировать обвязка служб сервера), но при этом всё что было в памяти ку-ку. До того как я внутренности поправил валилось примерно каждые 2-3 часа теперь валится два раза в сутки, но шансы попасть на отвал неиллюзорные.
> Без баз данных
Собственно тут хрестоматийный пример когда именно база данных и нужна.
Чистить скопившийся хлам можно без проблем по крону, на масштабах десятков-сотен тысяч записей канает даже махровый быдлокод, у нас в кроне например есть каждые несколько минут
DECLARE @MIN_DATE DATETIME
SET @MIN_DATE = DATEADD(DAY, -3, GETDATE())
DELETE FROM SOME_LOG(READPAST) WHERE LOG_DATE > @MINDATE
И за такое ничего не было, вполне норм работает. Если у тебя типа десяток запросов на тест в секунду или даже сотня то скорее всего никто не заметит, максимум будет ощущаться как небольшой пролаг.
Редис наверное проканает, но я не вижу преимуществ перед васянкой, тем более она у тебя наверняка уже есть для других целей типа хранения вопросов и.т.п.
Закрытый браузер без фронта точно не отловить.
> легаси приложение на нетфреймверке переодически падает в аутофиемори
Проверь код на предмет new Thread(), спам такой штукой вызывает неожиданные OOM даже если детектится расход памяти типа 150-200 мегабайт.
Может лучше будет использовать сессии? Типа хранить в них guid'ы. Только я не помню, нужно ли там на фронте что-то с ними настроить или оно в любом случае уже работает.
> Собственно тут хрестоматийный пример когда именно база данных и нужна.
Могу наверное заюзать sqlite, с очисткой по крону не должно возникнуть проблем. Но мне кажется, что конкретно под эту задачу оверхед.
>Но мне кажется, что конкретно под эту задачу оверхед.
Почему? Скулайт как раз и создан для того, чтобы по быстрому и компактно хранить всякое говно для которого лень использовать нормальную СУБД. Собственно, почти вся мобильная разработка на ней держится. Вообще охуенная штука.
>Могу наверное заюзать sqlite, с очисткой по крону не должно возникнуть проблем.
Там можно даже тупо не заморачиваться и просто грохать сам файл БД когда данные уже не нужны и пересоздавать его заново.
только не стоит забывать про лок всей базы данных при записи, и особенность работы с этим в шарпе
Если у вас 10 потоков постоянно пишут в базу по 1 записи, то будет вам database locked. Первый поток локнет базу и начнет писать. Второй поток увидит, что база заблокирована и возьмет паузу. За это время первый поток освободит базу и отдаст 3-му потоку. 2ой поток проснется и увидит что база снова заблокирована. И так через получите таймаут database locked
простой семафор решит проблему, но это же уже костыли.
>только не стоит забывать про лок всей базы данных при записи, и особенность работы с этим в шарпе
Бля, у него там юзеры тестики проходят, прям пиздец какой high-load, чтобы о блокировках думать.
Параллельные тесты на одной физ базе могут дать тот же эффект
Конечно лучше создавать базу в памяти на каждый тест, но это время
> Почему?
Хз, тогда казалось, что можно тупо в сессии хранить. Щас думаю сделаю так: в сессии буду хранить guid пользователя, а стейт теста в базе с ключем этим guid. Фронт мне никакой информации о пользователе не шлёт, только данные по конкретному вопросу, т.е его ответ. Я думаю тут кроме сессий или куки никак не идентифицировать его, с бэка я могу только сессии чекать.
>Параллельные тесты на одной физ базе могут дать тот же эффект
Там время на запись будет - доли секунды. Они у тебя даже не пересекутся ни разу.
А даже если у тебя там такие уникумы тесты проходят, что хуячат ответы сотнями одновременнно - ну обернешь в транзакции и все.
не пересекутся да ибо таймаут долгкий
транзакции вообще не причем - если база стала в лок и пришла запись с другого потока, то она не станет в очередь типа ридврайтлок на файл, а "попробую через время".
что будет если будут нужны логи более чем за 3 дня?
вернее вопрос в другом - у кого жопа будет болеть?)))))
Нашел значит я xaml-стили вот тута https://github.com/microsoft/microsoft-ui-xaml/blob/main/dev/CommonStyles/Button_themeresources.xaml
К примеру дал ссыль на стиль кнопки. Чел создает StaticResource, который ссылается на SolidColorBrush (пикрил 1). А потом линкует этот ресурс к свойству в стилях (пикрил 2). Как у него так вышло? Что за магия? У меня так не получается.
Во-первых в WPF нет ThemeResource, из-за чего я решил попробовать так
<Setter Property="Background" Value="{StaticResource ButtonBackground}" />
Но выглядит словно какой-то бред. А как мне прилинковать статический ресурс? Мне понравилось, что автор его использует как некий аллокатор между базовой кистью и свойством контрола. Я тоже так хочу! Мои решения через StaticResourceExtension создают кромешный ад.
Переименуй последнюю структуру как-то иначе.
Понял, сделал, спс.
Отладчиком пошагово пройдись, потом почитай про особенности и различия конструкторов в классах и структурах.
Ну у тебя должна быть общая модель, которая содержит коллекции UserEntities и LessonEntities (если я правильно понял), к примеру ClassRoomModel. Эта модель может быть внутри общей вьюмодели SchoolViewModel. Такая вот матрешка. ClassRoom может быть и вьюмоделью, кстати.
Твоя задача в мейн контрол передать мейн вьюмодель. А внутренние контролы разбирают внутренности вьюмодели на составляющие и берут нужную инфу. Суб-контрол принимает ClassRoomModel, внутри которого суб-суб-контрол берет UserEntities. И так по цепочке вглубь.
>Как его обозвать?
Это ты должен знать — зависит от контекста твоего приложения.
Смотри. Есть два стула.
1. Как делали деды на заре ООП.
Вся твоя логика - лежит в том же классе который ты назвал сущностью.
Плюс такого подхода - логика не распидорашена между проектами, файлами, намного ниже вероятность, что ты просто забыл что ты уже что-то сделал, и повторно одно и то же написал 10 раз. Вообще, все джуны будут бояться твоего кода, деды - будут уважать.
Минус. Твой класс будет ОГРОМНЫМ. Не. Он будет просто ОГОРОМНЕЙШИМ. В определенный момент чтобы работать с ним, придется делать его partial.
Еще минус - в том, что такой класс скорее всего будет непереносим между проектами, потому что куча специфики, вся хуйня.
2. Делать сервисы для работы с твоей анемичной моделью.
Вариант который является типа современным. Ты выделяешь области и на их основе создаешь сервисы. В твоем варианте - вот у тебя есть пользователи. Для работы с ними - ты выделяешь 2 класса: UserRepository и UserService, первый - дает доступ к тому где оно лежит, второй - именно всякую логику выполняет.
Плюсы подхода - у тебя все "по полочкам".
Минусы - был один класс, теперь их 3.
глупости говоришь
есть просто рич модел и анемик модел. С рич модел типа "Данные вместе с методами что эти данные обрабатывают то есть типа тру", а анемик лишен проблемы "а если нужно посчитать вот этак вы что будете делать, а*, но часто вырождается в чистые гет/сет, но просто проще и практичнее в реальной разработке.
и заря ооп не причем
У каждого подхода свои плюсы и недостатки. Вернее одно и то же каждый считает либо достоинством, либо недостатком
Можно пытаться сидеть и на каждой половинке стула, если ORM не мешает.
Ток ты так и не пояснил, как во втором случае две сущности впихнуть в один дата контекст, о чем анон спрашивал.
Т.е. тебе в любом случае нужно делать общий контейнер для них.
>Минусы - был один класс, теперь их 3.
В первом случае тоже будет три. Отличие только в том, что сервис можно заменить на другой, а в первом классы будут жестко связаны (хотя можно через интерфейс впихнуть).
Сервисы это про организацию большого количества модулей, каждый из которых требует какой-то еще модуль.
Сервисы тут ни при чем, просто другая декомпозиция классов.
>>876193
Чеееерт. Нихрена не получается.
Оказывается, что StaticResource это непредставимая хтонь. Она работает, когда рядом есть что-то, что на нее ссылается.
Но совершенно не работает как отдельный элемент в отдельном словаре ресурсов:
<ResourceDictionary>
. . . <StaticResource x:Key="ButtonBackground" ResourceKey="AccentColorBrush" />
</ResourceDictionary>
У меня даже собраться проект не может, сообщает, что
>MC1000 Неизвестная ошибка сборки, "Индекс за пределами диапазона.
>Индекс должен быть положительным числом, а его размер не должен превышать размер коллекции.
Т.е. Словарь абсолютно пуст. Все насмарку. Возвращаемся к адовым городам со StaticResourceExtension
чтобы редиректить ресурсы:
<Thickness x:Key="Button.Static.BorderThickness"
. . . . . . . . Left="{ui:StaticResourceThicknessSide Static.BorderThickness, Side=Left}"
. . . . . . . . Top="{ui:StaticResourceThicknessSide Static.BorderThickness, Side=Top}"
. . . . . . . . Right="{ui:StaticResourceThicknessSide Static.BorderThickness, Side=Right}"
. . . . . . . . Bottom="{ui:StaticResourceThicknessSide Static.BorderThickness, Side=Bottom}" />
Говно ебаное.
макаба пердоле. Последний код - пикрилейтед.
Начнем с пустого солюшина.
Ну.
Пока что - сделал "соединение". Которое может использоваться как клиентом, так и сервером.
Жозенько...
А вот тут - затык.
Почему-то слушающий сокет не реагирует на то что клацнули отмену и ждет пока кто-то таки подключится.
Мда. Может быть не надо было тредупл использовать. ХЗ короче.
Не. Бред. В тредпул кидаю уже после подключения.
Но сделал вот такую вот фиговину, чтобы уж как крутые челы быть и можно было фигачить миддлвары.
В общем. Да. Что мы получили.
Мы получили хрень какую-то. Которая неприменима ИРЛ.
Ну. Типа блин. Не варит голова. Фигня получается. Сорян.
Пойду плакать от своей бесполезности.
Сделал вот такую вот хреноту для сообщений.
Такая фигня. Да.
Всем спасибо за внимание.
ну а как ты хотел, мед и ложкой? sqlite он встраиваемая бд и значит для одного пользователя. Как говорится, походи по базару - и ничего не найдешь встраиваемого легковесного.
Альтернатива ему - firebird, который тоже умеет в встраиваемость. Но там уже размер файла пустой побольше и менее удобно админить левой пяткой. Также непонятно с процессорами. Но зато это уже полноценная версионная база данных. В sqlite иногда не хватает функций, но там обычно такой объем данных, что проще поднять в память и сделать че надо.
Больше ты ничего не найдешь из реляционнок.
А еще проблему без проблем решит фассад, которй получает очередь, и сам пишет в базу. Мне кажется я даже встречал нагет реализации. Минусы есть, но если ты нормально разделил записи и чтения, то прям проблем быть не должно.
Конкурентные очереди, стеки, каналы, миллионы других способов не париться и просто писать куда надо. Но ты выбираешь городить семафоры. Молодец! Так держать. Умеешь. Могешь.
Да могу. И могу обосновать легко выбор того или иного инструмента. Вернее я обычно использую ридврайтлок конечно (раз уж либа работы с базой это сама не умеет - стандартная точно не умеет, а та что от мелких - не проверял), а не семафор. но могу обосновать что угодно.
Или отдельный агент обрабатывающий очередь в один поток без семафоров. Решений конкурентой записи миллион, и однопоточность sqlite, или любого другого инструмента это просто небольшая сложность, а не "пиздец это говно нельзя испозовать всё пропало"
Да хоьть дохулеард
Это всё ЗАВИСИТ
либо ты сразу все сделал с учетом склайт либо нет.(в надежде что это не нужно как в миллионе обычных приложений)
И когда во ВТОРОМ случае у тебя (через годы разработаи) вылезает датабаселокед то не так просто это разрулить
1312x674, 1:58
На русском же полно контента вката в язык...
> что будет если будут нужны логи более чем за 3 дня?
Логов в опердени - вафлить не перевафлить. Во-первых есть текстовый лог в NLog, там огромный список логгеров на каждую нужду и у каждого есть свои сроки давности и свой порядок архивирования, по общему правилу туда пишется вообще любой чих и пердёж. Например открытие и закрытие окон, любое обращение во внешнюю интеграцию с ответом и любое исключение которое было поймано при операции и для которого нет специального продуманного обработчика. Это почти трассировка, там только всякие внутренние циклы не детализированы. При любом кипише логи сразу же снимаются и отправляются на анализ. Значимые с точки зрения бизнеса действия (которые означают какое-то принятое решение) срутся напрямую в логи в базе с обязательным анальным зондированием залоггированного пользователя. Их оттуда уже не выковырять в попытке скрыть подлог например удалением логов или порчей компьютера. Такие логи хранятся долго, пару лет где-то. А есть логи автоматики всякой внутри базы. Она в файлы-то писать не может. Например каждая хранимка которая есть в опердени ловит свои ошибки и срёт ими в специальный лог. Если время работы хранимки вышло за регламент то тоже появляется оповещение об этом в специальном логе. В логах хранятся например переназначения идентификаторов запроса во внешнюю систему или попытки восстановиться от ошибки которая могла быть вызвана дедлоком или сбоем Интернета - такое тоже пишется в логи автоматики. Вот эти логи автоматики и чистятся автоматически, какие-то по количеству записей, а какие-то по дате.
> вернее вопрос в другом - у кого жопа будет болеть?)))))
У системного аналитика. Мне лично вообще поебать, я винтик в огромной безжалостной корпоративной машине.
672x320, 0:16
Это либо старый перевод, либо араб максимально невнятно говорит. Обычно перевод более или менее.
А вообще IIElevenLabs переводит лучше — банально умеет распознавать аббревиатуры. Это же делается за пять сек, но в яндексе хуйней страдают.
>что будет если будут нужны логи более чем за 3 дня?
Делаешь новый файл с датой. Новый день — новый файл. Проблемс? Есть даже ограничение по размеру файла.
Пынямаю, нинужно, лучше ручками писать всё. Бойлерплейт помогает отдыхать программисту во время написания бойлерплейта!
Ide пусть помогает.
И да. Примари конструкторы норм в рекордах или в котлине где есть инит
А в шарпе это только вредный вред
>А в шарпе это только вредный вред
Ещё одно доказательство того, что нинужно! А как аргументированно! Вжжжжж!
Когда пишешь на многих языках то костыли заметнее.
Вот именно! Какккооооое!! Вжжжжжжвжжужужжжжж
Ну как нинужно
Вот я всегда рад когда годные вещи перенимают с других языков
Но в котлине я как шаопист к этому (рахмазано объявление переменных между конструкторм и телом класса) привыкал. И там же есть инит так чио ждешь такое
В шарпе выгоды от этого не вижу.
>typeof()
>new[]
>методы с большой буквы
>убогий вид окна кода из 2006
>проперти начинающиеся с _
>as
>= default
>Поч?
>Ещё одно доказательство того, что нинужно! А как аргументированно!
Ты сам то сначала приведи хоть один пример где это было бы нужно.
>typeof()
ченетак?
>new[]
и тут че?
>методы с большой буквы
фломастеры
>убогий вид окна кода из 2006
пиз....брехня то есть.
>проперти начинающиеся с _
еще один явный пиз...
>as
тут то чего
>= default
и? я бы понял еще default!, но жавист не понимает разницу
>Поч?
что поч? поч ты жавист? пот говноед, вот поч
Рассмотрим визуальное дерево без стиля для заголовка (пикрилейтед 1). Создается VirtualizingStackPanel, внутри которого находятся итемы. Все нормас - 152 элемента.
Собсно xaml:
<ListBox.ItemsPanel>
. . . <ItemsPanelTemplate>
. . . . . . <VirtualizingStackPanel />
. . . </ItemsPanelTemplate>
</ListBox.ItemsPanel>
А теперь добавляем стиль заголовка для группы (пикрилейтед 2). И тут хуякс и тот же список выдает уже 1042 элемента. Мы видим, что VirtualizingStackPanel создается для каждой группы(Border - это сам заголовок). Во-первых, нет никакого контроля по количеству групп, их может быть 100500, а значит 100500 VirtualizingStackPanel. Во-вторых, каждая из этих панелей не очень-то виртуализирует — можно заметить одну панель, которая вмещает аж 547 элементов.
Стиль для заголовка группы:
<ListBox.GroupStyle>
. . . <GroupStyle>
. . . . . . <GroupStyle.HeaderTemplate>
. . . . . . . . . <DataTemplate>
. . . . . . . . . . . . <Border Background="LightGray" >
. . . . . . . . . . . . . . . <Label Content="{Binding}" />
. . . . . . . . . . . . </Border>
. . . . . . . . . </DataTemplate>
. . . . . . </GroupStyle.HeaderTemplate>
. . . </GroupStyle>
</ListBox.GroupStyle>
Шо не так?
У меня такое было, когда я решил впихнуть ListBox в ScrollViewer, из-за чего листбокс растягивался на максимум своего списка и VirtualizingStackPanel был бесполезен. Предполагаю, что здесь что-то подобное, но по отношению к встроенному скрол вьюверу листбокса. Как это фиксить — хрен знает.
Рассмотрим визуальное дерево без стиля для заголовка (пикрилейтед 1). Создается VirtualizingStackPanel, внутри которого находятся итемы. Все нормас - 152 элемента.
Собсно xaml:
<ListBox.ItemsPanel>
. . . <ItemsPanelTemplate>
. . . . . . <VirtualizingStackPanel />
. . . </ItemsPanelTemplate>
</ListBox.ItemsPanel>
А теперь добавляем стиль заголовка для группы (пикрилейтед 2). И тут хуякс и тот же список выдает уже 1042 элемента. Мы видим, что VirtualizingStackPanel создается для каждой группы(Border - это сам заголовок). Во-первых, нет никакого контроля по количеству групп, их может быть 100500, а значит 100500 VirtualizingStackPanel. Во-вторых, каждая из этих панелей не очень-то виртуализирует — можно заметить одну панель, которая вмещает аж 547 элементов.
Стиль для заголовка группы:
<ListBox.GroupStyle>
. . . <GroupStyle>
. . . . . . <GroupStyle.HeaderTemplate>
. . . . . . . . . <DataTemplate>
. . . . . . . . . . . . <Border Background="LightGray" >
. . . . . . . . . . . . . . . <Label Content="{Binding}" />
. . . . . . . . . . . . </Border>
. . . . . . . . . </DataTemplate>
. . . . . . </GroupStyle.HeaderTemplate>
. . . </GroupStyle>
</ListBox.GroupStyle>
Шо не так?
У меня такое было, когда я решил впихнуть ListBox в ScrollViewer, из-за чего листбокс растягивался на максимум своего списка и VirtualizingStackPanel был бесполезен. Предполагаю, что здесь что-то подобное, но по отношению к встроенному скрол вьюверу листбокса. Как это фиксить — хрен знает.
Кроме
VirtualizingStackPanel.IsVirtualizing="True"
Нужно еще
VirtualizingPanel.IsVirtualizingWhenGrouping='True'
Аргументированный ответ умного человека. Спасибо.
От "Питер" перевод норм. Только читать его стоит когда уже есть база и какой-то опыт. Причем база не только шарпа а Computer Science вообще. Если ты не шаришь нормально в типах данных, нет понимания работы памяти и т.д., то только зря потратишь время.
И тута я узнал, что оказывается, шарп под капотом - автомато умеет анонимным типам всю эту муру делать.
Так вот. Вопрос-то вот в чем. Проблема анонимных типов в том, что наружу они хуево достаются. Будет object который какой-то там Anoymus_T228<>.
Но мне хотелось бы в таком случае, раз уже за меня все сделали - чтобы я потом мог использовать данные которые лежат в ключе.
Собственно. Какие варианты, кроме dynamic или своей обертки, которая анонимный тип обернет в интерфейс есть-то?
Не еби себе мозги с анонимными типами, а просто юзай рекорды. Для них все автоматом генерируется.
https://sharplab.io/#v2:D4AQTAjAsAUCDMACATgUwMYHtkBNEGFEBvWRMxBRASwDsAXRAQWMQHNU6BuamqrxAL6lylHJgCuAIwA2qRACEW7frT7chMAUA===
За весь тред и месяц никто мне не ответил. Я уже забил на эти метаданные и просто разбираюсь особенности шарпа, но бля что не так то я хуйню споросил или никто не шарит за это?
Зачем в этом шарить?
нельзя. Если пользователь приложения узнает что бэк на шарпе, то бросит приложение, станет жавистом и напишет свой бэк. Тебе бы этого хотелось? то то же.
>Странный вопрос.
Не, серьезно. Приведи кейс. Я вот чет ни разу не пихал в словари в качестве ключей, объекты разных типов, да еще и вперемешку с коллекциями. И даже не могу придумать зачем это нужно.
Внимательно вглядитесь в пикрилейтед. Что вы там видите?
Свойство "Background" стиля для кнопки обращается к статическому ресурсу "ButtonBackground", который в свою очередь обращается к кисти "RedColorBrush".
Вопрос: какого цвета будет кнопка, если ей назначить данный стиль?
Ответ: синяя - цвета "BlueColorBrush". Берется ближайший ресурс, а не тот, что указан в ResourceKey.
Дженерал вопрос: почему?
А вот это работать не будет, если перед статическим ресурсом нет ничего. Т.е. проект даже не соберется:
>ОшибкаMC1000 Неизвестная ошибка сборки, "Индекс за пределами диапазона. Индекс должен быть положительным числом, а его размер не должен превышать размер коллекции.
Вы можете сказать, что тут нет искомой для статического ресурса кисти. А вот хуй, дальше покажу, что проблема не в этом.
И главное, что если я удалю из объединяемого словаря все кисти, то проект все равно соберется (пикрил 2).
В чем тайна сего колдовства?
Больше всего бесит, что ответа порой нет вообще. Проект может просто не компилироваться, особенно если это какая нибудь библиотека. И никаких внешних признаков ни в окне ошибок, ни в окне интерпретации. Проект молча не собирается просто потому, что какой-то ресурс где-то не смог что-то там найти.
Почему разных типов. У тебя может сложный объект использоваться как ключ для группировки и внутри себя содержать массивы и при этом не обладать ссылочным равенством.
Какую бесплатную либу сейчас принято юзать для работы с вордом/экселем. Ворд для генерации таблиц, эксель тоже + простые формулы между колонками.
Epplus
Вот есть у меня метод с парой публичных методов и сложной логикой в приватных. Логика кроме этого класса нигде нахуй не нужна и выносить ее отдельно не понятно зачем.
Как быть?
Пока что получается как с ТДД - на примере с калькулятором красиво, а ИРЛ неприменимо
Это как? Публичному методу недоступен приватный. Не засирать же им класс, к тором находится приватный метод? В чем тогда смысл приватности метода?
Тут только делать приватный метод с доступом internal, но это не выглядит как хорошая затея.
несколько похожих методов
{
достать_хуйню_из_базы_с_учетом_параметров
вызвать_йоба_метод
смапить_в_дто
}
Возвращаемое значение разное, из базы тоже немного разные вещи достают, но йоба_метод один и тот же у них. По сути чистая функция- с логикой и без зависимостей, вроде как раз то что надо юнитами обкладывать.
Сам этот приватный метод используется только несколькими методами в классе (не всеми) и больше нигде в приложении не нужен.
А ты не хоти
Писать тесты в том же классе, в котором ты тестируешь.
Доставать рефлексией.
Как мужик - делать все публичным, прятать что-то это по бабски.
Сделать internal и указать что тестовая сборка может подглядывать.
Да куча способов.
Другое дело - нахуя? У тебя есть публичный метод. Ты его тестируешь - автоматом тестируешь хуйню, которую он использует.
Сверху. Если там реально какая-то СЛОЖНАЯ ЛОГИКА в этих приватных методах, то ты должен был выделить класс. Судя по другому комменту: DbSearcher, YobaHandler, Mapper. В них ессно - это будет публичным, а потому тестируй сколько хочешь и не придумывай ничего.
Какой же еблан...
В сatch-блоке у меня написано Debug.Writeline. По идее приложение должно вывести сообщение и работать дальше — со всеми остальными исключениями так и происходит. При XamlParseException студия прыгает в точку возникновения исключения.
Почему?
Иди нахуй.
Потому что петушарп.
потому что ты не показал код перехвата, а XamlParseException там не один, может ты не тот ловишь.
>>886760
ну в шарпе 12 который вот будут эти конструкторы. но это очень спорная фича. Типа она должна снижать визуальный шум. Но лично для меня это, наоборот, хуже делает в плане читабельности ибо размазывает структуру класса. И это при том, что я обожаю котлин, где такая фича изначально искаропки.
>>886770
о. опять этот ДЕБИЛ с ломбоком, которые не является жавой
для ДЕБИЛА напомню - для желающих переписывать в компильтайм есть фоди. И уж там эти проверки на нулл вплетать код проверки с исключениями можно несколько лет. Другое дело - зачем. При правильно написанном коде эти проверки тупо будут отнимать процессорное время и не сработают и не смогут сработать НИКОГДА.
>о. опять этот ДЕБИЛ с ломбоком, которые не является жавой
>ниииееет, ты ни можишь пользоваться фичами потому что на петушарпе нет адекватного аналога ломбока нииееет!!!!
Пынямаю.
я уже 1000раз говорил что ты долбоеб
ломбок - НЕ ЖАВА. Это сторонная тулза позволяющая что то там
в шарпе та же самая ситуация - с помощью сторонней тулзы можно вообще что угодно
>>886830
ну ПРИЯТНО ЖАВИСТА говном накормить. все же видят что он высирает говно, которое потом ему же в рот запихивают.
Иногда у меня подходящее настроение запихать дерьма в его ротешник по полной. Потом утомляет. Потом опять скучно и приятно накормить.
Но по факту - жавист срет и жрет то что насрал. Странный жавист. Все на него смотрят, а он продолжает жрать говно.
Ну да, ему привычно, он же жавист.
>с помощью сторонней тулзы можно вообще что угодно
Где поддержка каловроти в среде разработки?
>потому что ты не показал код перехвата
Я ловлю просто Exception, который является базой всех исключений.
какая? дебил, какой поддержки ты ждешь.
Можно понять ГОВНОжаву где нет свойств и поэтому НУЖНО указать IDE что "вот такой синтаксис не ошибка".
Просто нечего студии знать для того чтобы все работало. Но даже в этом случае тулза может самостоятельно
1 добавить анализаторы
2 добавить кодогенерацию чтобы студия знала о чем то новом что рождает эта тулза.
3 сделать автодополнение даже если нет никакого кода в 2 (после автодополнения он сгенерится)
взять ту же генерацию проверок на нулл. как по твоему мнению ЖАВАДЕБИЛА студия должна поддерживать эту фичу? Рисовать какие то картинки или что?
плагину указывается кодом где нужна генерация, где нет. аттрибуты или ?
а студии что нужно знать?
вот ты пишешь что нет поддержки в IDE. Так поясни мне ЧТО ДОЛЖНО БЫТЬ В СТУДИИ чтобы проверки на нулл вплетались более правильно что ли.Отдельная менюшка? значки? писк хрюшки как в каспере? или что?
И то это все на любителя ибо если в жае без ломбока НИКУДА, то в шарпе это выбор нужна ли дополнительная магия и собственно зачем она.
>>886864
на твоих скринах ты ловишь throw. я конечно верю, что дальше оно идет типа мимо, но из скринов это не следует.
Найс рвонькнул, ну уж точно не потому что у шарпододика разрыв шаблона. Допустим поддержка нотнулла в среде и правда нинужна. Что скажешь насчёт популярности твоего поделия в сравнении с ломбоком? Ломбок есть на каждом проекте, у него 12к звёзд на гитхабе, а где есть каловроти с 600 звёздами?
И ведь что иронично, про неподдерживаемость расширений языка визжали изначально шарпошлюхи, а как оно оказалось на самом деле ожидаемо.
я тебе уже сказал
ломбок в жаве - НЕОБХОДИМОСТЬ
в силу НЕВЕРОЯТНОЙ ВЫРАЗИТЕЛЬНОЙ УБОГОСТИ жавы и родился проект ломбок чтобы добавить сахара другими способами, раз уж жава такое говно
и поскольку жава ОТКРОВЕННОЕ ГОВНИЩЕ в выразительном плане, то нашлось и МНОГО желающих отведать сахара.
Поэтому проект вырос и получил столько одобрения (для тупых поясняю - если миллионы говорят "нам не хватает выразительности", значит сам язык ГОВНО), что это даже в IDE интегрировали.
То есть это следствие ЛЮТОЙ ГОВНИСТОСТИ языка, потому что язык говно (и жависты говноеды, раз жрут, хотя даже жависты признали что язык говно и им надоело его жрать и появился ломбок как сахар на это говно. вот только теперь ДЕБИЛЫ жависты приписывают достоинства СТОРОННЕЙ САХАРНИЦЫ самому языку. Ну ДЕБИЛЫ хуле.)
Шарп и любой другой нормальный язык куда богаче, поэтому необходимость "нам не хватает сахара" намного ниже
и желающих маговать намного меньше, остальные не понимают "зачем"
поэтому под тот же котлин (который внезапно JVM) нет никакого ломбока и никогда не появится ибо даже если появится, то его поддержат 3.5 человека, а остальные скажут "и нахера оно"
Мне оправдания твои не нужны, как так получилось, что джава выебала петушарп. На вопрос отвечай.
>Что скажешь насчёт популярности твоего поделия в сравнении с ломбоком? Ломбок есть на каждом проекте, у него 12к звёзд на гитхабе, а где есть каловроти с 600 звёздами?
>на твоих скринах ты ловишь throw. я конечно верю, что дальше оно идет типа мимо, но из скринов это не следует.
Оно НЕ идет мимо. Оно остановилось в блоке try не дойдя до catch. Вот в чем проблема.
Вот если я напишу перед вызовом метода
throw new Exception("бла бла бла");
вот тогда оно попадет ожидаемо в catch, выведет строку и пойдет дальше.
Короче, я не хочу, чтобы студия останавливала приложение и прыгало в точку вызова эксепшона в коде. Это некритичная ошибка, и у меня уже есть защита от этого, если бы эта залупа там не останавливалась за каким-то хером не смотря на try.
>мне нечего ответить, быстро перегруппировываемся от нападения на джаву до попытки представить дискуссию как обоюдное кидание говном в друг друга, чтобы не дай бог не подумали, что я обосрался
>Короче, я не хочу, чтобы студия останавливала приложение и прыгало в точку вызова эксепшона в коде
так это совсем другая проблема.
не хочешь - выключи. зачем включил? в окошке исключений сбрось на дефолт и включай там "ловить все" по необходимости. Жаль там нет профилей, но студия увы кака.
>>886958
ты проспорил. Лично я там не сижу. Впрочем, я и в жава тред не лезу.
Просто меня жависты достали своей тупостью в реальной жизни, а в ней сложнее кормить говном, а тут забегает говноед.
Но все равно наши срачи занимают малый процент треда, ведь жаводебил не может ответить аргументированно, а сразу начинает тупить и на этом заканчивается.
> не может ответить аргументированно
Найс перефорс слившегося чушка, который на вопрос не ответил.
ты долбоеб эпохальный.
тебе не просто ответили, даже раскрыли суть.
Количество звезд на гитхабе определяется количеством пользователей. Но это не показатель качества продукта. Это показатель количества пользователей. Это не значит что продукт крут, это значит что нужен многим (а вот причины нужности и есть самая мякотка)
В шарпе 99% того, что дает ломбок, просто НЕ НУЖНО, поэтому и пользователей кому что-то подобное нужно, намного меньше.
Да и не все ставят звезды. Не для всех гитхаб "соцсеть где нужно лайкать репы".
Маня называет меня долбоёбом, но сама в который раз высирает стену оправданий, почему джава выебала петушарп, хотя от него требовалось выдавить ответ на вопрос.
>Маня называет меня долбоёбом
всегда зрю в корень. за сим все. ты слился в аргументах, а значит оставайся один со своим говном
Маня называет меня слившимся, но сама так и не смогла ответить на простейший вопрос.
вы только посмотрите как жавист, как та собака, поевшая говна, на всех кидается )
У него даже не возникло вопросов почему его бы его собеседник назвал лахтой, если до этого всячески намекал на говноедство )))
А теперь по делу. Пришел тут жавадебич и начал толкать свое "смотрите ломбок может расставлять проверки на нулл". Как будто это нечто такое "прямо ух".
Он даже не понимает что такие проверки это прошлый век. Потому что они все равно происходят В РАНТАЙМЕ, то есть все равно выбросят NRE, только раньше. (этакий fail fast)
И что правильный путь - статический нуллчекинг (fail fast на этапе компиляции), который позволяет избежать этой расстановки везде везде проверок на null.
Конечно шарп не котлин, где это было изначально, но в шарпе эти проверки часть языка. И можно даже включить ThreatWarningAsError и получить невозможность скомпилировать с нуллабле траблами.
Ну а если пишешь либы и очень хочется тотальные проверки в рантайме, то можно пригласить фоди - он напишет. Хотя и IDE отлично поможет сгенерить и в общем то этого всем хватает.
А что там в жава с нуллсафети? аннотации нуллабле и в IDEA, то есть на уровне конкретной IDE или же свои в фреймворках (тот же спринг имеет свои аннотации нуллабле))))? убожество.
иди в свой тред и там вместе кушайте свое говно (где у вас СТОРОННИЙ тулз десятилетиями чинит убожество языка), а к нам его не несите.
Да ладно, что ты хочешь от убогих. В джаву только в этом году паттерн матчинг и интерполяцию строк завезли (и то в превью), так они уже ссутся от радости и объявили, что у них эти фичи самые лучшие.
>не хочешь - выключи. зачем включил?
Я ничего не включал, у меня дефолтные настройки. Все исключения ловятся, кроме этого.
>И что правильный путь - статический нуллчекинг (fail fast на этапе компиляции), который позволяет избежать этой расстановки везде везде проверок на null.
Поясни. Я везде расставляю проверки на null.
>тут нет нескольких одинаковых XamlParseException.
Господи, это еще хуже. У вас че, нельзя называть одинаково классы в разных неймспейсах? Потому что я горю на этапе, когда надо придумать хороший нейминг, чтобы он не конфликтовал с уже существующими и не был длинным как сопля первоклашки.
и никак не понять твою проблему
- исключение не ловится (то есть не вызывается catch)
- студия останавливается на исключении
>>887639
Расставляй если хочется. Код он разный. Да и легаси полно.
Если ты пишешь в нуллсафети парадигме, то откуда у тебя будет NRE в твоем коде. Даже если ты пишешь публичную библиотеку - ну на входе проверил и в нужных местах, а везде зачем. Конечно можно огородиться лишними проверками (если не доверяешь чужим либам, хотя они тестами обычно покрыты и нулл никогда не возвращали), но это будут в основном не проверки параметров, а проверки инвариантов.
>>887648
>нельзя называть одинаково классы в разных неймспейсах?
жавадебил. они потому и называются одинаково XamlParseException, потому что лежат в разных неймспейсах.
Не трекай запрос, лол. Делай детач после того как получил сущность.
А по хорошему - сделай дополнительный слой из ДТОшек, которые тебе нужны. И используй в своем синглтоне - эти дтошки, а не сырые модели которые ефом используются.
Вообще. Если быть честным - ЕФ та еще говнина. Слишком много с ней ебли, учитывая, что основное назначение для меня, как клиента - маппинг результата запроса в объектики. Ну и как потенциальное - возможность сменить провайдера для работы с БД. Но сколько же с этой говниной подводных камней. Я ебал. И я даже не говорю про скорость, которая тоже говном становится из-за вот этого всего. Нет. Просто блядь. То что я бы на голом SQL написал бы и забыл, ЕФом приводит к просто охуитительным историям, когда вот тут - нельзя, вот тут - допиши как мне это сделать, вот тут - пиши свой запрос, а то я не понимаю, вот там - мы не можем в несколько тредов. Вот тут - провайдер не умеет в то, что умеет сама СУБД, а потому - фишечки полезные - опять же запихни себе поглубже. Короче. Да. ЕФ - говнина. Не советую никому пользоваться, если вы на нее не сели в начале, и теперь уже слезть сложно. Для любых новых проектов - что угодно будет лучше чем EF.
> А по хорошему - сделай дополнительный слой из ДТОшек, которые тебе нужны. И используй в своем синглтоне - эти дтошки, а не сырые модели которые ефом используются.
Тогда получится уже 3 класса на сущность, сейчас у меня и так на каждую сущность есть вью моделька, принимающая эту сущность в конструкторе.
Почему не можешь сделать так:
var user = db.Users.AsNoTracking().FirstOrDefault(x=>x.Id = ConfigFile.UserId);
MyApplicationContext.Instance.CurrentUser = user;
Люто двачаю. EF - говнина для индусов, куча ненужных фич, типа changes tracking, которые усложняют программы. Есть linq2db, dapper и другие, которые просто конвертеры между C#/SQL, без кучи говна под капотом. Если вижу EF в вакансии, понимаю, что эти люди с базой никогда серьезно не работали. Про такие вещи, как булк операции, мерджи и рекурсивные запросы они наверно даже не слышали, ведь у этого говно из коробки этого нет (могу ошибаться, и что-то могли уже завести).
>То что я бы на голом SQL написал бы и забыл
Если ты в соло работаешь, ну так и делай. В команде же, ебал я в рот чужие sql-ные писульки разбирать. ОРМ как раз и нужна, чтобы можно было работать с объектами не касаясь неотлаживаемого эскуэльного говна.
>>888976
>Если вижу EF в вакансии, понимаю
Я наоборот дропаю вакансии, где используют raw-sql в коде и встройки в БД.
Ебать обоссаный копротивленец за кучку говна бахнул. И ведь юмор в том, что я прочитал весь его бах, только ни йоты смысла не нашёл. Обтекай. Может быть, когда-нибудь, петушарп и дорастёт до рантаймовых проверок, когда в джаве уже 10 лет как будут компайл-тайм проверки.
>>887648
Можно, но это не отменяет, что у нас нет шизы с несколькими одинаковыми XamlParseException.
и ведь ему не стыдно было писать этот пост ))))
Я бы после такого поста из профы на завод бы ушел от стыда, а он даже не замечает какую дичь несет )))
>где используют raw-sql в коде и встройки в БД
как будто "если не EF то значит сырой SQL без вариантов"
Есть тот же LINQ2DB (и похожие на него). И даже в даппер можно пихать запрос сгенерив его с помощью LINQ.
Так что тут стоит вопрос - любитель ли вы всякого трекинга и абстрактности (от чего получаете некоторые плюшки и выгребаете тонны дерьма) или же вы предпочитаете работать на более низком уровне "достали/положили", где вам никто палки не вставляет (и не в колеса, а в другое место))), но всякие там кеши и прочее делаете сами.
>raw-sql в коде
Так и я против такого. Отсутствие EF - не значит отсутствие C# to SQL, я дропаю оба типа вакансий: в одних сидят пориджи, которые с базой работать не умеют, в других деды 40+, которые не могут осилить LINQ, с базой работать умеют, а вот шарп не осилили, речь про большие проекты.
Так проблема же в том, что сам EF как орм - то еще добро. Особенно, если работаешь не с MSSQL, а каким-нибудь MySql или Postgres, где разработчики провайдеров - тоже те еще чудаки на букву 'м'.
Ну и всякие его приколы, типа - это я зачем-то буду на клиенте выполнять, потому держи в ебало миллион объектов, которые я еще и затрекал, и у тебя приложуха с OUM падает.
Конечно, если простые вещи делать, без всяких анализов там, расчетов, а просто достать из базы, чет поменять, положить обратно - EF нормально справляется.
>Ну и всякие его приколы, типа - это я зачем-то буду на клиенте выполнять
Ну если по урокам с метанита приложения писать, то конечно там сплошная магия будет. А так-то, наверное, стоит доки нормально прочесть, чтобы понимать в каких случаях server, а в каких client evaluation делается?
>>889176
>а просто достать из базы, чет поменять, положить обратно
Можно подумать БД зачем-то еще нужны. Шучу конечно, но...
Ой. Не не надо тут начинать. Всякие запросы с Contains - EF в куче случаев - на клиенте хочет выполнять, хотя по документации - может и на сервере. А выбор того на сервере или на клиенте - зависит зачастую от хрен пойми чего. Особенно в контексте того, что в EF который на фреймворке был - оно нормально выполнялось, а в Core - до сих пор какая-то хрень происходит.
При этом - руками вполне изи пишится SQL-запрос, который СУБД поймет и сделает. Но если ты на EF - тебе приходится либо страдать хуйней и лезть под капот, шаманя с составителями запросов и всей этой хуйней с экспрешинами, либо забивать на всю эту ORM и писать тот же SQL запрос.
И опять же, я сверху уже писал, про то что писатели провайдеров - тоже те еще чудики. Решили они, что теперь не хотят DataTime в обычном виде использовать - иди как дебил и переписывай все DateTime.Now на DateTime.UtcNow, потому что - ну пиздец как надо было сломать, чтобы все думали не о том, как фичи делать, а ублажать шизу разработчиков провайдера.
Короче. Хрен знает чего ты пытаешься ЕФ защищать. Ну реально же - капризная как хуй пойми что хуйня, особенно в контексте того, что она якобы должна была упросить работу с БД и заставить разработчика думать не о БД, а о логике приложения. В результате - ты теперь и о БД думаешь, и о том чтобы ЕФ не выебывался, и о том, что там разработчики провайдеров думают о том как надо, а фичи пилить чтобы к сроку успеть - та не ебет, ты же выбрал этот инструмент, радуйся тому, как жизнь проще стала.
>и никак не понять твою проблему
>- исключение не ловится (то есть не вызывается catch)
>- студия останавливается на исключении
А как это блять назвать?
Возьмем этот пример :
try
{
. . . throw new Exception("бла бла бла");
}
catch(Exception ex)
{
. . . Debug.WriteLine($"Исключение: {ex}")
}
Что здесь произойдет? Студия НЕ ОСТАНОВИТСЯ на строке
throw new Exception("бла бла бла");
Я НЕ ПОЛУЧУ вот такого окна, как на пикрил >>886864
Что здесь непонятного?
Почему когда выскакивает исключение XamlParseException, программа останавливается на строке, где исключение возникло, как будто там нет блока try catch?
Тише, не гори, if (var != null) throw new NullPointerException() не так уж и плох. В конце концов, так на джаве очень долго делали и никто не ныл.
Наличие блока catch вообще ни на что не влияет. Где студия остановится, а где нет - задается в настройках исключений, где есть какой то дефолт.
И если ты поставишь дефолт и откроешь список, то увидишь вот такую картиру (пик)
Почему такой дефолт? а хз.
Такая же трабла была и с asp.net. Они подгружали ресурсы через try...catch, что вызывало постоянные стопы на старте отладки. И не видели в этом ничего плохого, пока волна говна в их сторону не достигла размера которая все таки пояснила им что мешает банально разработке в студии.
>>889763
А ему по прежнему не стыдно
Он даже не понимает какую дичайшую чушь он пишет.
Возможно (и даже очень вероятно) -он вообще не программист, а дворник что видел обложку книжки по шарпу, а у самого футболка с надписью жава
>Особенно в контексте того, что в EF который на фреймворке был - оно нормально выполнялось, а в Core - до сих пор какая-то хрень происходит.
Потому что в большинестве случаев на фреймворке (да и на core тоже до 2.1 включительно) все это на клиенте выполнялось, но просто молча. А потом майки сказали "нахуй магию из шарпа" и начали кидать на это дело исключение, заставляя кодеров чуть больше думать мозгами.
>>889337
>Решили они, что теперь не хотят DataTime в обычном виде использовать - иди как дебил и переписывай все DateTime.Now на DateTime.UtcNow,
Тут на самом деле проблема намного глубже чем хотелки провайдеров. Их переделки это только следствие всей этой возни с временем и временными зонами. Алсо, в npgsql это решается букавально одной строкой в конфигурировании AppContext-а.
>>889337
>Короче. Хрен знает чего ты пытаешься ЕФ защищать.
Ну наверное, потому что для меня это нормальный инструмент, с которым я работаю далеко не первый год и мне норм. И мне нахуй не уперлось работать с кодом где будут вещи вроде:
>руками вполне изи пишится SQL-запрос, который СУБД поймет и сделает.
Я лучше с экспрешенами "пострадаю".
>потому что для меня это нормальный инструмент
поддержку твоего оппонента. Если для тебя польза от еф перевешивают необходимость уживаться в его парадигме, то тебе конечно нормально.
>Я лучше с экспрешенами "пострадаю".
одно не заменяет другое. Пиши своим LINQ в linq2db или в repodb или в dapper том же. 100% LINQ, просто меньше магии и "а у нас вот так надо" (это я про те дбконтексты с их особенностями работы"). Про потребление памяти вообще помолчу
нисколько, ведь она присутствует. Это ж не говножава с ее "у нас лобок генерит рантайм проверки". В шарпе есть полноценный статический анализ в компильтайм. Ну разве что проблема если нужно поддерживать старые версии дотнета. А зачем это нужно? ВЕРНО, не нужно.
А значит никакие проверки на if(...=null) попросту не нужны.
Но жавадебил этого не поймет. Он же дворник с футболкой и фантазиями "эээх когда нибудь такое (на деле НИКОГДА) будет и в жаве"
Этот ебанат правда не различает статический анализ и нуллобезопасность? Не хотел бы я таким же тупоголовым быть.
нулл безопасность это как раз про проверки в компильтайм, а не рантаймовые проверки. Учи матчасть, дворник )
твоя же. она у тебя молодец. во всем )
шарпа не знает, жавы не знает (как и ты), но вот помогает на двач зайти.
не нравится правда? ну так не заходи в наш тред, жавист.
тем более с такими тупыми аргументами
у шарпа есть стат анализ на нулл, и есть возможность не просто варнинг, а запрещать компил. И приходит тут говноед и начинает вещать "ой как хорошо в жаве - там лобок генерит за нас рантайм проверки". На него смотрят как на дебила, поясняют, но он же дворник с фуболкой и не понимает.
Этот микроцефал продолжает уверять меня, что статический анализ это ТО ЖИ САМАЕ, что и адекватная нуллобезопасность через типы.
Это она самая и есть. Изучи матчасть что ли. Проверки на нулл этим не являются. Этим является различие в языке нулл типов и не-нулл типов и стат анализ этого самого.
Вали в свой тред, неуч
прими 2 факта
1 в шарпе есть стат анализ, который позволяет не писать проверки на нулл (ни самим, ни кодогеном, ни с божьей помощью)
2 в жаве этого нет. там есть лишь лобок, который позволяет написать эти проверки за IDE (хотя иде прекрасно их генерит) и получить РАНТАЙМ проверку
знаешь что такое РАНТАЙМ проверка? а это когда получаешь NRE и.... просто не знаешь что с ним делать ибо его быть не должно в принципе в нормальном языке
>ТОООООООО ЖЖЖИИИИИИИИИИИ САААААААААМАААААААААЕЕЕЕЕЕЕ!!!!!!!
Долбоёб, повтори это ещё громче, и, наверное, это станет правдой.
ты думаешь ты зашел в детсад где такие подходы работают? лол, ты на дваче. ты поел говна и твои попытки перефорса не работают.
Больше на твои аргументы в подобном стиле отвечать не буду (нехрен тупому жависту шарпортред засирать)
Тут нужно писать то, что полезно шарпистам. например то, что ReadOnlySpan<byte> = new {} как поле класса не вызовет аллокаций ибо рослин сделает так.
А не идиотов говном кормить (это приятно, но...надоедает тоже)
Ясно, манюня опять получила говна за шиворот и в харчках убежала плакать. Каково тебе быть слитым по фактам и опущенным в целом в твоём собственном треде?
Смотрю уже харчки отстирал. Ну держи ещё парочку, бегом снова стирать рубашку с брюками.
Если уж и размышлять, какое влияние оказало моё нахождение в этом треде на шарпоблядей, то уж точно не отвергающее джаву. Шарпоскотина это в первую очередь социоблядь, выбор петушарпа у которой произошёл вследствии соответствия антуража петушарпа антуражу их личности (если перейти на конкретику, терпильная быдлосоя выбрала терпильный быдлосоевый язык). Моё явное обоссывание твоего ебала авторитета в глазах соевого быдла тебе не добавляет, а соответственно прибавляет твоему оппоненту, то есть мне, и джаве, которую я защищаю.
Опущенное, не ворочайся.
Выбрал шарп, потому что лет в 12 попалась книжка по Net 3.5, в которой был диск со студией и примеры программ, которые можно было тыкать.
Хуй знает при чем тут соя. Просто на фоне того же паскаля - это было небо и земля. Никаких бесящих begin, end, никаких :=, требований хуячить переменные в начале функции, никаких тупых разбиений на процедуры и функциихотя вот тут, именно сейчас я бы на самом деле прям на уровень языка засунул такое разбиение, и запретил в функции мутировать стейт в принципе, но это мои фантазии, так что похуй. Просто бери и пиши. И при этом в отличии плюсов, про которые тоже позже узнал - у тебя ВСЕ ЕСТЬ для жизни прямо вот, тута. Хочешь сайт - пожалуйста, хочешь графики - да вот они формочки, хочешь на лоулевел - да никто не запрещает.
А потом еще и закрепилось тем, что в вузе был выбор, джава-плюсы-шарп, для того чтобы ООП осваивать, и ессно я выбрал шарп, пока долбоебы-однокурсники ебались с плюсами.
Короче. К чему. К тому что не понял, хули ты до шарпа доебался. Не нравится - ну, так зачем в тред заходишь? Нравится - так не токси, тред невозможно читать из-за того сколько добра ты и прочие джава-неняши высераете.
>Где студия остановится, а где нет - задается в настройках исключений, где есть какой то дефолт.
Ах вот оно что, спасибо!
компилятор говорит не знаю что у тебя там за out такой, unassigned local variable, а инициализировать foo чуть выше хоть и прокатывает но как-то убого смотрится. сейчас у меня вот так:
if(bar?.Dictionary != null && bar.Dictionary.TryGetValue(key, out var foo))
Гений, если читать про всё подряд то хуй что изучишь
Мне нужна книга которая позволит укрепить и систематизировать более продвинутые техники языка
Собственно - все. Мы написали свой каркас для CLI приложения. Далее - надо более правильный парсер аргументов использовать, добавить DI, ну и написать нужные нам обработчики.
А это как? На русском же русский акцент - не слышно. Или я не понимаю чего-то?
Или действительно нихуя не знаю, потому что на местах работы использовал шарп максимально примитивно (ибо не было необходимости выдрачивать что либо еще)
Вот например, как часто вы делегаты используете в работе?
Знакомые на го и жаваскрипте уже по 4-7к$ делают, хотя вроде и не дрочат литкоды ебаные, сидят по вечерам со мной в дискорде и играют в доту
Asp net и react
ПОГОДИТЕ. В ПЕТУШАРПЕ ПРАВДА ЧТО ЛИ ЧТОБЫ СДЕЛАТЬ ПЕРДОЛЬНОЕ ПРИЛОЖЕНИЕ НУЖНО ВОТ ТАК ПЕРДОЛИТЬСЯ?
Петушарп в принципе мёртвая технология.
>Вот например, как часто вы делегаты используете в работе?
Примерно постоянное, лол. Но это я, добрая феечка.
Как "так"?
а как можно не использовать делегаты. они ж везде. это нужно прикладывать усилия чтобы избегать их
Ну. МБ он про хуевые примеры использования с:
Add, Remove, Combine и прочей ересью, которую везде на уровне соглашений запрещают.
То что ты потом заебешься отлаживать код, в котором кто угодно - где угодно нахуевертил. Это как минимум.
Ну срсли.
Вот в коде где-то в дебрях
Task OnRequest(Func<Context, Task> handler){
handler -= handler;
handler += MyLogger;
return next(handler);
}
Как быстро ты найдешь это вот? Да нифига не быстро.
Ты не осилишь. Просто смирись, что придётся тебе до пенсии вызывать методы у объектов.
А половина методов Invoke, On<T>, Start, Stop, Run?
Просто как-то мне кажется, что это нифига не правильно. Но с другой стороны - 90% моего кода - это не бизнес логика, а инфраструктурный код. Но все равно.
Инфраструктурный код и должен иметь такие нейминги.
ты выбрал мертвый стек, братан. Пока молодые шутливые гоферы на втором году выходят на 200к, клепая круды, у шарпера на эту же сумму будут спрашивать глубокие кишочки, знание реакта, знакомство с кубером и настройку CI/CD
Он настолько всратый разве? Я вроде старался жи.
Ты пидор.
>Почему вы не хотите ревьюить мой код?
Чел, я даже на работе на код-ревью хуй кладу. Просто ставлю аппрув и все.
Так что можешь считать, что твой код - норм. Но да - я даже не смотрел его.
>Хорошо рассказываете, уверенно. Прошу указать ссылки на литературу, ведущие к определениям "инкапсуляции" и "чистого ооп", или это лично ваши определения, полученные после реального кодинга?
Или других вспуков, в которых будет ясно даваться понять, что автор, вообще-то, долбоеб и сказал неправду, но как правильно - хуй его знает.
Такое ощущение, что эту ебалу высрали и спрашивают на каждой вакансии специально, чтобы каждый у себя в черепушке придумал личное определение, а потом с ебалом пикрил смотрел на тех, кто выдумал другое определение.
готовлюсь обосраться на собесах
Чтобы траллить лалок на собесах. Если кандидат назовёт абстракцию, то говорим, что нихуя, а если не назовёт, тогда говорим, что он забыл её упомянуть.
Вот этот базанул.
>Да они даже не могут
А эти загадочные 'они' сейчас с тобой в одной комнате находятся? Ты их видишь?
Не, это плоды моего воображения пишут статьи, в которых одни и те же примеры выступают то реализацией абстракции, то полиморфизма, то "лол, у вас че, абстракция это отдельный принцип?))0", то "хех, мда, у них сокрытие это инкапсуляция)))))0".
Я это выдумал, разумеется, а если ты откроешь любую статью или видимокролик, то там, конечно, будет все одинаково объяснено.
А ну как парень поясни чем отличаются прокси, адаптер, фасад, стратегия?
когда в реализации они похожи друг на друга как братья.
>""Binding" невозможно задать в свойстве "DataContext" типа "ObservableResourceTemplates". "Binding" можно задать только в параметре DependencyProperty объекта DependencyObject."
Хотя оба класса, свойства которых связываются, реализуют INotifyPropertyChanged. Почему требуется именно DependencyProperty?
Ну вот такая вот дефолтная реализация. Она реализует паттерн "приспособленец" и как то вот так вот.
DependencyProperty очевидно используется как ключ, поэтому он и задается как статическое поле.
Вообще хз как она под капотом работает
Если ты свяжешь dp <-> dp <-> INPC (по логике 2 канала связи) то хрен ты можешь потом прервать связь между dp <-> INPC. У тебя есть только ClearBinding который разрушает вообще всё.
Почему нет для INPC? ну тогда там не получится использовать "приспособленец", а это будет уже другая реализация для таких случаев. И видимо решили не усложнять себе жизнь.
> лично ваши определения, полученные после реального кодинга?
Лично по моим ощущениям ООП состоит из:
1. У нас есть объектные типы данных, далее просто типы.
2. Для типов существует процедура конструирования экземпляра типа.
3. У типов есть атрибуты ака члены, значения или контекст которых принадлежат сконструированному экземпляру.
Всё. Процедура деконструкции экземпляра уже не входит в этот список, потому что уже опциональна. Наследование уже не входит в этот список, потому что опционально и является не принципом, а паттерном.
Много лет я считаю эти 3 пункта самодостаточным определением ООП, а все остальные инкапсуляции с полиморфизмами - это наносное. Это можно делать не только с объектами, не только в ООП. Например, инкапсуляция (in-capsule) - код отдельного модуля программы самодостаточен и независим внутри модуля. Где тут ООП? или например сокрытие. Права доступа к переменным и функциям. Это могут быть атрибуты объекта, м аогут быть просто функции беООПного языка. Или полиморфизм. Его можно достичь через наследование классов в ООП, а можно через наследование текстовых модулей без ООП. Не вижу непреодолимых причин, чтобы так сделать, и в седые 80 так и делали при помощи инструкций компилятора. #IF FOO INCLUDE bar.inc ELSE INCLUDE baz.inc #ENDIF Чем не полиморфизм?
>>894680
> Если кандидат назовёт абстракцию
Ну и как абстракция может принадлежать ООП если абстракция существовала до ООП, прямо в тот момент, как с перфокарт на ассемблер пересели и появился первый слой абстракции.
Вот я литературно об этом и говорю. Все носятся с каким-то "принципами" и считается, что это такое "общее знание", которое всем доступно и у всех одинаково (примерно как "что такое int"), а на деле каждый придумывает для себя собственную поебень, которая не имеет ничего общего с поебенью в голове другого человека. В итоге люди говорят об абсолютно разных сущностях, по какой-то нелепой причине называя их одинаково.
В чем смысл абстрактных "принципов", если общие у пользователей только названия этих принципов, а то, что под этими названиями понимается, индивидуально. Это как если бы у каждого в голове было свое кардинально иное понимание, что такое "хлеб", один бы говорил, что это пончики, другой говорил, что это батон, а третий был бы уверен, что его в кастрюле нужно отваривать и вилкой жрать. Вроде как что-то общее есть, но нахуя тогда понятие "хлеб" нужно - непонятно.
ИМХО, реально знать и учить следует SOLID и паттерны. Вот они должны быть в наших головах абсолютно идентичны и соответствовать тому, что наизобретали в банде четырёх.
>Вот они должны быть в наших головах абсолютно идентичны и соответствовать тому, что наизобретали в банде четырёх.
но это глупость.
1 паттерны изобретались для си. На других языках они могут быть выражены иначе или не нужны вовсе
2 паттерны НЕ НУЖНО реализовывать дословно. Нужно идти к паттерну и остановиться когда задача решена.
> литературно
Буквально. Literally - это буквально, а не литературно. Литературно - это literaturic.
> паттерны изобретались для си
На си, но не для си.
> На других языках они могут быть выражены иначе или не нужны вовсе
Ложь.
> паттерны НЕ НУЖНО реализовывать дословно
Паттерны это алгоритмы.
> Нужно идти к {алгоритму} и остановиться когда задача решена.
Ну как бы да, но из-за каши в голове ты пишешь чушь.
>>895299
Так стапэ, погоди ругаться. Я тебе так скажу. До изобретения "паттернов" начинающим программистам рекомендовали учить типичные общие алгоритмы. Потом кто-то придумал "дизайн паттерны", а потом "SOLID", и эти понятия подменили алгоритмы как синоним. Суть осталась та же. Общие алгоритмы. Они не зависят от языка. Да, на разных языках они будут синтаксически реализовываться по разному, но вычисляться будет одинаковый результат, решаться будет одинаковая задача. Понимаешь?
>не для си.
ДЛЯ си
посмотри реализации паттернов этих на других языках у увидишь что все иначе
>Ложь.
сколько языков изучал? ) ты темой точно не интересовался
>Паттерны это алгоритмы.
нет. это ОБЩИЕ РЕШЕНИЯ. какие то задачи люди решают и приходят к похожим решениям. Вот эти решения обобщили и выдают как паттерны, чтобы была унификация. Польза от паттернов это коммуникация, а не само решение. Само решение - оно и так приходит.
>но из-за каши в голове ты пишешь чушь.
это не моя мысль. эту мысль задвигает
Джошуа Кериевски: Рефакторинг с использованием шаблонов
и я с ним полностью согласен.
> эту мысль задвигает
> Джошуа Кериевски
Этот зумер не знает основ информатики, а ещё книги пишет. Да пошол он нахуй с моих двачей!
паттерны и SOLID это разные принципы вообще.
первое это КОНКРЕТНЫЕ архитектурные решения, а второе - общие рекомендации на тему чистого кода.
И никогда они не были синонимами.
> общие рекомендации на тему
Алгоритм это и есть общая рекомендация на тему кода. Алгоритм не предписывает, каким словом следует описать например, цикл, алгоритм просто говорит "возьми вот эти данные и в цикле умножай каждый элемент на 2" и всё. А уже в языке сишник сделает так, а фортранщик сделает эдак.
Поэтому я остаюсь при своём.
1. В алгоритмах есть конкретика решения задачи.
2. В алгоритмах нет конкретики языковых инструкций.
3. Принципы SOLID - это алгоритмы.
4. Дизайн паттерны - это алгоритмы.
Мнения зумеров с умными ебалами на этот счёт меня не интересуют.
>Все носятся с каким-то "принципами"
Может быть у тебя в голове носятся, либо насмотрелся роликов с ютуба. Сам миллион раз шел своим путем, пока не упирался в тупик. Возможно есть клоунские паттерны, а возможно ты еще не встретил ситуации, где эти паттерны тебе пригодились бы. И пока тебе это нахрен не нужно, ты смотришь на них как на абстрактное ненужное говно.
Если ты из тех долбоебов, которые сперва учат паттерны, а потом находят для них причину, то тут можно выразить только сочувствие.
Я из тех долбоебов, что хотят на РАБотку устроиться, а так уж получилось, что собесы не обходятся без принципов ооп
Тогда тебе следует сперва сделать какой нибудь пет-проект, чтобы уткнуться носом в несостоятельность собственных убеждений. Иначе никак.
Банально сделай какой нибудь свой проводник, чтобы у тебя на множестве окон синхронизировались данные, чтобы эти данные имели разное визуальное представление, чтобы эти окошки могли как угодно стакаться. Я посмотрю как ты обойдешься без единого паттерна.
>Я из тех долбоебов, что хотят на РАБотку устроиться, а так уж получилось, что собесы не обходятся без принципов ооп
А ты задвигай на собесах еще побольше дичи вроде такой:
>3. Принципы SOLID - это алгоритмы.
>4. Дизайн паттерны - это алгоритмы.
Тогда ты еще долго не сможешь устроится.
Ты похож на долбоеба практиканта, который пришел на завод. Ему говорят "Подай вон те пассатижи", а он начинает выебываться на тему "Это не пассатижи, а плоскогубцы" и задвигает лекцию на полчаса в чем их отличие, вместо того, чтобы сделать то, о чем его просят. Естественно его закономерно считать душнилой и шлют нахуй.
О какой "несостоятельности убеждений" речь? У меня нет никаких убеждений, я просто хочу прочитать про общепринятые понятия, а оказывается, что они нихуя не общепринятые и это какая-то шиза, которую каждый для себя выдумывает. Жопа у меня сгорела не от того, что в моем голове понятия другие, а от того, что гаврики не могут к какому-то консенсусу прийти, чтобы разные штуки одним и тем же словом не называть.
Ты ведь понимаешь, что в этом треде пишут разные люди и, зачастую, в одной и той же ветке диалога?
Похуй. Контекст и позиция одинаковы, значит это один собеседник. Даже если под капотом там действительно разные люди.
Чего спорить со знатоком )
Его ж даже не смущает значение слова "паттерн"
И что солид называют набором принципов
У знатока же ....алгоритм)) золотого молотка
Так не интересно, няша.
Типа блин. Ну, я могу и взять тот же кестрел и использовать его как TCP-сервер, просто добавив туда коннекшон-хендлер. Но так же нефига не интересно. Плюс - в процессе учишься новому, узнаешь нюансы и все это вот.
Типа не знаю. Я все равно, считаю, что есть разница, между тем - ты представляешь в голове как это сделать, и ты на практике делал и все грабли собрал. Короче. Не знаю. Да. Вот. Да.
>Ну, я могу и взять тот же кестрел и использовать его как TCP-сервер, просто добавив туда коннекшон-хендлер
а можешь?
Ну и да. Сверху - не факт, что вот это вот апи - оставят для публичного пользования. Хотя оно еще в 3.0 появилось и пока не убрали, но занаем же майков и что они иногда могут решить, что не нужно.
А бедрок, который на базе кестрелла делали - давно не подает признаков жизни что-то, как был экспериментальным, так и остался. Печаль-беда.
Подскажите, пожалуйста, чем вы пользуетесь в своих asp проектах для авторизации?
Мне нужно уметь создавать пользователей, логины/пароли, и прописывать методам апи в контроллерах разделение по ролям.
Пользовался внутренней системой(был отдельный сервис общий для всех авторизаций и пакет нугета локальный, делающий это в 5 строк), но щас сказали пилить именно независимую от внутренней свою.
Просто придется возиться с тем, чтобы прокинуть ему все его офигенные зависимости. Фактории слушателей, опции, сервисы, лимиты, фактории логгера, и вот это все вот остальное. Дальше - server.StartAsync(MyApplication, cancellationToken).
Веб-хост то что делает. Он всю эту хреноту вместе собирает, потом - берет и из мидлваров и прочего добра билдит IWebApplicatio, потом всем серверам в StartAsync прокидывает этот IWebApplication.
С кестрелом-то ничего не прячут, пока что - все апи, практически, public, и если хочется - можно поиграться.
Я это к чему? К тому что ну, можно без веб хоста, просто придется то же самое, что он делает - делать руками. Это не сложно, просто тогда бы листинг раздулся, хотя суть бы не поменялась.
А, ну и да. Я тут вижу, что вроде как в последних версиях - поменяли вроде апи кестрела слегка. Раньше он вообще без IWebApplication вроде как нормально работал, по крайней мере я так помню, хотя это было давно, я могу уже путать.
Потому что опять - я на нем - делал в свое время свой чатик поверх TCP, но слишком много возни было из-за того что много лишнего для меня было, и решил уже переключиться как человек на сокеты.
Просто потому что сенек спрашивают ровно то же самое. Отличие лишь в том, что у джуна это будет растянуто почти на весь собес, а у сеньки это будет максимум половина. Вторую половину он будет пояснять про свой личный опыт и работу с конкретными технологиями. Ну и у сеньера еще есть читерская опция для ответов на вопросы по теории "я уже давно с этим не работал, не помню".
Ну окей, а на мидла? Хочу уже апнуться до миддла, надо бы к собесам подготовиться
>О какой "несостоятельности убеждений" речь?
вот от этой
>это какая-то шиза
>к какому-то консенсусу прийти
Потому что нельзя одну сову натянуть на десять глобусов. Поэтому возникают интерпретации и вариации.
>разные штуки одним и тем же словом не называть
Еще раз, пока ты не столкнулся с проблемой, тебе все будет казаться одним и тем же, потому что твой моск не обращает внимание на нюансы. Хули тут пиздеть, бывало анон ИТТ употребит одно слово, которое меняет ВООБЩЕ ВСЁ, но пока ты не знаешь что это — для тебя это пустота и ничего не значит.
public string ReadTextFile(string filename){
IAsyncOperation operation = File.ReadAsync(filename);
while(operation.State != complete){
Thread.Sleep(10);
}
return operation.Result;
}
Пиздец.
Дедлок, самое простое. При этом - ты его хуй отловишь.
Второе - неэффективное использование ресурсов процессора. Твой тред - проставивает хуй пойми для чего.
Третье - тима будет считать, что ты долбоеб, и на первом ревью - отправят на мороз.
А так - никаких.
Оборачиваемый метод может что-то запустить внутри себя
И если у тебя есть контекст синхронизации то дедлок
По DDD - уровень домена - может пользоваться интерфейсами инфраструктуры, но не должен знать про детали реализации этой самой инфраструктуры. И соотвтетственно пользоваться этим.
Т.е. ты можешь слинковать сборку MyApplication.Domain с MyApplication.Infrastructure.Abstractions, где лежат интерфейсики сервисов, репозиториев и т.д.. Но уже на уровне приложения - ты пропишешь домену, какие конкретно реализации этих абстракций надо использовать.
Про то, ложить ли интерфейсы рядом с доменом.
А зачем? Что тебе полезного это даст? Если тебе эти интерфейсы нужны где-то еще, хочешь, чтобы потребитель - имел доступ ко всем этим интерфейсам?
Ну, т.е. ты можешь так сделать, и прямо это DDD не нарушит, если у тебя микросервисная архитектура, и сервисы твои разбиты так, что не возникает пересечений - можешь в той же сборке хранить.
К примеру пикрил (на названия свойств не обращайте внимание). Но как бы я не менял порядок, у меня первым делом идет привязка свойств Key, Value, MainViewModel.
Пиздец проиграл с помойного петушарпа. В джаве эта задача выполняется созданием одного Future. Добавлю это в свой список попуска шарподаунов и буду им каждый раз при втрече в ебало тыкать тем, что у них в языке нет возможности подождать выполнение задачи из одного потока в другом. Как вы вообще живёте блядь?
>Шарпаны, что думаете от чистоте крови функции?
Не слушай этих кретинов, которые тебе отвечали.
Во-первых, подели все свои классы на классы данных и сервисы.
Первые должны быть простыми без всякой бизнес логики (можно чуть-чуть в виде рид-онли свойств типа площади прямоугольника). В идеале они должны быть immutable, но в реальности это часто может проводить к большим накладным расходам.
Вторые должны не содержать никакого состояния. Они могут иметь другие сервисы в виде полей, или даже инжектированные неизменяющиеся данные (например, конфигурацию приложения), но не более того.
Таким образом, методы получаются чистые, код становится значительно проще, пропадает всякая неведомая магия, ну и тесты становится писать очень легко.
Ты, вероятно, совсем долбоёб.
Асинхронность в шарпе есть, и она значительнл лучше, чем в джаве. Вообще, в джаве есть только одна фишка, которой не хватает шарпу: анонимные реализации интерфейсов.
Все остальное в шарпе на голову выше.
А код, на который ты ссылаешься, это как раз пример того, как делать не надо.
> Вторые должны не содержать никакого состояния. Они могут иметь другие сервисы в виде полей, или даже инжектированные неизменяющиеся данные (например, конфигурацию приложения), но не более того.
А как же контекст бд?
>асинхронность есть и лучше яскозал!
>чтобы подождать выполнение задачи нужно вставать в бесконечный цикл
)))))))))
Пидорахизм, сэр. Терминальная стадия.
Чел. Там анон на какой-то хуй решил этой хуйней пострадать.
В реальности так никто не пишет.
И да, асинхронность в шарпе таки лучше джавовской.
> В реальности так никто не пишет.
Я пишу, если нужно в конструкторе аснхронный метод вызвать
Нахуя тебе в конструкторе, блядь, асинхронный метод вызывать?
Ну серьезно. Если чтобы проинициализировать объект вот такая хуйня нужна, то лучше факторию или билдер уже мутить, а в конструктор ложить результаты выполнения.
Потому что я так думаю, потому что единственный кейс где я вижу надобность асинхронного выполнения в конструкторе - это если тебе в базу зачем-то лезть надо, с диска читать, вот это вот, а если это надо, то ну рил, ты хуйню придумал, делай нормально, нормально будет.
старайся так не писать.
конструктор должен быть легковесным только для распихивания данных, без логики
Это все? Пора бомжевать?
Ходи на собесы, где ничего про грейд не сказано, а ищут некоего .net-программиста.
Как же я хочу, чтобы конструктор в шарпах так и назывался: constructor.
Почему надо было делать конструктор с именем класса-то? В чем сакральный смысл такого мува-то?
>это если тебе в базу зачем-то лезть надо
Какой дурак лезет в базу при создании нового экземпляра?
Это вредительство какое-то. Время, когда экземпляр создается, редко совпадает со временем, когда этот файл используется.
Вот, банальная ситуация у меня щас. Пилю темы для UI. Каждая тема — это класс с Uri на файл с ресурсами. Но чтение с диска идет ровно тогда, когда я эту тему собираюсь применить или отредактировать.
Потому что этих тем может быть 100500, но не все будут использованы.
Я просто не представляю, чтобы при заполнении коллекции этих 100500 тем, каждое из этих говен незамедлительно читало бы все содержимое файлов.
Единственный вариант — это чтение конфигурации, данные которых по сути и являются данными для инициализации. Но даже это тупость, это должно идти второй строкой.
Вам в капче когда нибудь попадалась задачка с нулем? Например 45 + ... = 45
Когда с бейсика переходил, тож сложно было въехать. Даже сейчас всегда подписываю ctor, иначе хрен найдешь. В бейсике в конструкторе стоит New вместо названия класса и это совпадает с New() при объявлении.
А еще бесило, что тип элемента идет впереди названия, хотя все ищут по имени, а тип — второстепенная информация. К тому же список полей и свойств всегда выглядит как ебаная лесенка из-за разной длины типов.
Но зато каргокультно и уважаемо, как и ";"
Ну. Меня это бесит потому что когда у тебя разрастается количество классов в проекте - IntelliSence с ума сходит. А я по сути без него и не могу уже кодить.
Типа вот у меня есть уже есть класс CalculateMonthSalaryJob, а я добавляю новый CalculateMonthSalaryBonusJob. И автоподсказка - будет настойчиво мне пропихивать первый, а потом красным все выделять, что это же метод, значит надо возвращать значение. А ебанутая автоподстановка в последних версиях - вынуждает меня - после того как хуйню IntelliSence предложил - клацать Backspace и вводить правильно. А был бы просто constructor - такая хрень вообще никогда бы не возникла.
Опять же - более редкие кейсы - я добавляю в базовый класс новый параметр конструктора. Теперь надо пройтись по всем дочерним и проставить его там, хотя у них у всех - одинаковая сигнатурка. Был-бы просто constructor - я бы мог в папке Find-Replace сделать и жить нормально. Но тут я уже наученный опытом этой хуйни - давно сразу базовому классу делаю класс BaseClassSettings и если в нем чет добавляю, потому и говорю, что более редкий сценарий.
Я сниппеты выпилил по той же причине. Ебанутость интелли-сенса, когда я хочу переменную назвать cw - а эта хуйня мне Console.WriteLine пишет. Да и неудобно нихуя.
Но этот снипет работает только на пустой строке... Как ты собрался объявлять переменную не указав тип или не написав var перед названием...
Я просто хочу чтобы студия не подставляла за меня ничего сама. Что такого в этом желании-то?
Типа мне нравится как было в notepad++ в те времена, когда я в нем кодил. Подсказаочки есть, но ты должен явно сделать действие, чтобы оно применялось. А в студии последних версий - подстановка ебанутой стала иногда. Я пишу слово - оно дописывает неправильно, приходится исправлять не себя, а то что оно предложило и зачем-то вставило.
А с конструкторами - ну, я постепенно из-за этих приколов студии - решил что надо искать другие инструменты, даже вим настроить умудрился. И вот с такими вот инструментами как вим, у которых LSP отваливается раз в полчаса - понимаешь, что было бы пиздец как удобно, если бы конструктор везде назывался constructor, сразу бы просто миллион проблем решилось.
Его прекратили нормально поддерживать, шиз.
>Я просто хочу чтобы студия не подставляла за меня ничего сама.
Так она и не подставляет, если ты сам не дашь на это согласие при нажатии Enter или Tab.
На работе - почему-то подставляет. ХЗ. Наверное надо переустановить студию и почистить все настройки. Чи еще что-то. Дома сейчас попробовал - действительно все в принципе - нормально и как должно быть.
А на работе, я думаю это из-за какой-то хуютки безопасника, который следит, там еще периодически - Ctrl+C-Ctrl+V отваливается, нахуй, перевод на новую строку происходит, какие-то символы невидимые вставляются. ХЗ короче.
или альт+инсерт если есть решарпер
>яскозал!!!! скозаааааал!!! СККОООООЗААААААААЛ!
Повтори это ещё громче, и это станет правдой.
Че повторить?
В том коде чел какую-то фигню творит. В шарпе - нормальная асинхронность из коробки, никаких циклов и прочего - ждрать не надо.
И не нужно как в жавовских фучерсах всякие get вызывать, чтобы подождать результата, просто пишешь await, если результат подождать надо. Не надо - не пишешь.
так нет вакансий.
Насколько варик пиздеть про опыт? Насколько вообще парятся на вакансиях, где требуют от 1 года опыта
да забей ты на этого жава имбецила. ему просто скучно
я тоже могу пойти в жава тред и заявить
я написал на жаве
Thread.sleep(10000000000000000000)
и моя программа зависла
говно эта ваша тупая жава
просто я не имбецил и потому нечего мне в жава тредах делать
а вот этому жависту не зазорно показать свою примитивность мышления и отсутствие базовых знаний
>Опять же - более редкие кейсы - я добавляю в базовый класс новый параметр конструктора. Теперь надо пройтись по всем дочерним и проставить его там, хотя у них у всех - одинаковая сигнатурка.
Надо просто не использовать наследование.
>>await
>>вызываемый в async функции
>)))))))))))))))))))
Иди вызови await не в async функции, я на тебя посмотрю.
>так нет вакансий.
>Насколько варик пиздеть про опыт? Насколько вообще парятся на вакансиях, где требуют от 1 года опыта
Вакансии от 1 года - это и есть вакансии для джунов. В нормальном состоянии, в любой шараге за 3...4 года, если ты не еблан, то спокойно к концу обучения наберешь этот самый год опыта на практике или подработках (у преподов, знакомых или на фрилансе). И как раз будешь к этому моменту в стадии личинки-джуна.
Стажировки есть, но на них обычно сами ищут кандидатов и в открытый доступ не выкидывают. И там тоже отбор и н ужно тестовые делать.
Заведи себе близкое знакомство с какой-нибудь опытной херочкой из какого-нибудь аутсорса и тогда у тебя будет самая актуальная информация о вакансиях на рынке.
Спиздеть про опыт ты конечно сможешь, но это тебе максимум поможет пройти hr-фильтр. Дальше на тех. собесе тебя развалят и поставят в базе отметку "нохаир". Вариант так проскочить только куда-нибудь на завод где сдох старый сишарпер и нужен новый, чтобы поддерживать их говно мамонта. Там обычно уровень собеседующих настолько низок, что можно им в уши, что угодно ссать.
int[] arr1 = [1, 2, 3]
vs
int[] arr2 = { 1, 2, 3 }
>Заведи себе близкое знакомство с какой-нибудь опытной херочкой
Добудь рог единорога, слезу русалки и чешуйку дракона
Синтаксис с квадратными скобками - только появился. Даже в 7м нете его нет.
А нужен он буквально из-за другой новой фишки с объединением коллекций.
Типа
[..arr1, 1,2.3, ...arr2];
Вообще. По хорошему - я за единообразие, а потому предпочел бы, чтобы в фигурные впилили поддержку этого. Но видимо чтобы было явно видно, что это только для коллекций хуйня - решили так сделать.
>чтобы было явно видно, что это только для коллекций хуйня
Поверил бы, если бы можно было написать
var data = { lol = "kek" }, но надо обязательно new добавить перед скобками
Другие смогли, получится и у тебя.
видел, но давно и не много, с читабельностью там проблемки конечно
Я понимаю, что для этого есть валидаторы, но меня волнуют не вводимые пользователем данные, а то что я пытаюсь сбиндить. Я не хочу каждый раз лезть в исходный код и смотреть почему не работает конвертер.
Если я верну ArgumentException, то там можно написать сообщение с пояснением что не так, и в режиме дизайна это сообщение удобненько выводится. Но в рантайме это может вызвать критическую ошибку с завершением всего приложения. А я этого говна не хочу. Хотя меня чет напрягает XamlReader, который плюет критическими ошибками, не слишком ли это?
Почему валидные с точки зрения юзера данные не должны сконвертироваться дальше, при этом приложение должно продолжить работу? Это как раз критическая ошибка, потому что у пользователя нет возможности исправить это, ведь это не зависит от его ввода.
Ладно, это было помутнение. Можно просто писать в лог или на крайняк печатать Debug.WriteLine.
>>898208
>Это как раз критическая ошибка
Неа. Запрещено для конвертера выдавать исключения. Возвращается либо DependencyProperty.UnsetValue, либо Binding.DoNothing. В определенных случаях допускается возврат null.
А конкретно пользовательский ввод должен контролировать валидатор, стоящий перед конвертером. Но я не про пользовательский ввод, а про себя как разраба, который открыл конвертер спустя год и не помнит че туда пихать надо.
Речь идет о специфических конвертерах.
>критическая ошибка
Я про ту ошибку, когда выскакивает необработанное исключение. Причем странная штука. Я сделал отлов этих исключений в App (пикрил) по примеру из SO и в результате исключения, вместо одного месседжбокса выскакивает подряд куча, затем приложение фризится и вылетает.
Получается, так, что конвертер привязан как итему списка, и каждый итем списка по сути провоцирует исключения, вызывая шквал окон. Надо какую-то защиту поставить от подобной фигни, хотя я не видел примеров, как будто у других такой проблемы возникнуть не может.
>при этом приложение должно продолжить работу?
Да. Конвертер просто не вносит изменения в свойство, и там остается последнее валидное значение.
>ведь это не зависит от его ввода
Ну я решил подобное писать в лог. А DependencyProperty.UnsetValue подсветит рамку красным, сигнализируя, что что-то не так.
Опять ты
Вечно стреляешь себп по ногам. Ты себя ненавидишь?
Записывай
1 поле ввода не должно позволить вводить бред
2 конвертер просто конвертирует. И НЕ ЗНАЕТ о логике. А раз нельзя ввести бред то и конверт пройдет всегда
3 значение уходит в стейт (вьюмодель например) и вот он ЗНАЕТ что котики лучшие существа на свете валидное значение или нет. А дальше сообщает о своем невалидном состоянии
Каждый делает свою часть работы.
Ты пишешь не прочитав, что я написал? Я написал ровно тоже самое.
Но речь вообще не об этом. Блять, вы как яндекс алиса — ей пишешь одно, а эта дура акцентирует внимание на другом и пишет хуйню, которая меня не интересует (может я невнятно объясняю). Нет, блять, уже второй мне начинает расписывать как чекать ввод от юзера.
Но я тебе распишу пример. Есть мультиковневртер, у которого n биндингов. Какое именно количество — хуй знает. А еще один итем может быть коллекцией, а второй строкой. Как это прочекать когда ты импортнул конвертер спустя год — хуй знает. Именно об этом была речь, но я сам решил уже проблему.
я прекрасно понял о чем ты.
и еще раз повторю
>Какое именно количество — хуй знает. А еще один итем может быть коллекцией, а второй строкой.
и что? дело конвертера - КОНВЕРТИТЬ (и выдавать дефолт если сконвертить не удалось) а не заниматься валидацией.
пусть контрол занимается валидацией левых значений
У меня комбобокс должен отобразить итем списка по его ключу. Поэтому я запилил мультиконвертер, где параметр values[0] - это коллекция с итемами, а values[1] - это итем, в котором хранится ключ. Конвертер проходит по коллекции, ищет нужный итем и пуляет его комбобоксу, который устанавливает его как SelectedItem.
Ты пойми, что я хочу донести. Представь, что я этот конвертер отложил в дальний ящик и спустя долгое время хочу заюзать снова. Я не помню, что надо биндить в values[0], а что в values[1]. Но специфика конвертера такова, что порядок итемов, их количество и тип играют большую роль. И конвертер мне об этом не скажет, и комбобокс не скажет. В комбобокс придет DependencyProperty.UnsetValue, и мне придется лезть в исходник и смотреть как же там устроен этот конвертер.
Вот я о чем. В случае эксепшена я могу подать сообщение, что ты, разработчик, вместо коллекции в values[0] засунул какую-то залупу. Но в конвертерах эксепшены использовать запрещено.
увы впф не идеален
поэтому я так ссу кипиятком от жетпак композе, но приходится впф
он проглотит твое исключение если ты не позаботишься
и я понимаю что тебе хочется идеала, но этого не будет
потому прими факт
конвертеры - конвертят. если что - то в дефолтное значение (которое юзер конечно сразу увидит и поймет что он ввел что то не то)
Да я уже решил кроме DependencyProperty.UnsetValue еще и печатать Debug.WriteLine или logger.Error, так что на этапе дебага я увижу сообщение о неверных данных.
это не тру
в оутпут пишется много чего
и окно это убогое в студии
так что не тру
ну да, весь впф не тру
он мощный - факт
но сам факт что он хмл и отделен от кода - его беда
лучше бы он был кодом.
я не знаю что там мауи придумали но дизайн как код (а не хмл) это годнота, ведь иде просто проверяет что где сама
А без этого....вот решарпер через туеву хучу лет не может вывести тип списка чтобы не ругаться
зато я ругаюсь...
Не ворочайся, слитое.
async был добавлен чтобы как раз не было await в не-асинк функции.
в старом коде может быть await как имя переменной. И все эвристики "отличаем переменную от ключевого слова дешево, без смс и регистрации" не выдержали критику и поэтому был введен async как "его раньше не было, значит легко отличим старый код от нового молодежного"
зы: как по мне эвристика бы справилась, но авторы языка посчитали что оно того не стоит и обошлись простым методом.
Проблемы шарподебилов.
И как ты без бесконечного цикла хочешь что-то в духе:
void Main(){
while(true) {
try{
Application.Tick();
}catch(Exception e) { Console.Error.WriteLine(e); }
}
}
Metanit лучше всяческих книг!
В современном мире - лучше бери MSDN, открывай гитхаб и смотри кишочки дотнета. Книги - хуйня, пока они дойдут до тебя - там 100500 раз поменяется все.
Мы их не ищем. К нам приходят и говорят "Чувак есть один проект, го, я создал".
2.5 года опыта, но по сути это low-code платформа, мелкие сервисы на .NET и немного SQL
Начинать заново искать работу джуном как то не хочется, ибо успели поднять зарплату, а зп джуна уже не хватает
А сейчас везде требуют еще и брокеры сообщений, докеры всякие, CI/CD, еще и жаваскрипт
Я на всем этом работать бы и рад, но без коммерческого опыта на этих технологиях никто всерьез не возьмет, а самому учить-дрочить это... ну не знаю, теорию еще да, ну может мелкий пет-проект чтобы потыкать-посмотреть, но не более
>а самому учить-дрочить это... ну не знаю, теорию еще да, ну может мелкий пет-проект чтобы потыкать-посмотреть, но не более
Конечно, чел. Ни в коем случае не нужно все это 'учить-дрочить', просто сиди на жопе ровно и однажды все эти знания и навыки сами чудесным образом появятся у тебя в голове.
>А если в вузе
Тогда это хуйня из под коня, а не ВУЗ. Узнавай в деканате, корешись с секретаршей или методистами и выясняй у них с какими конторами у ВУЗа есть договор или связи. Ищи по знакомым. Узнавай у других студентов, как они этот вопрос решают.
Если совсем тухло, пробуй опенсорс. Находи какие-нибудь общеизвестные репы по своему стеку и пробуй туда свои пулреквесты пропихнуть, ну или форк сделай. Собирай друзяшек и пишите какое-нибудь приложение, которое решает какую-нибудь конкретную проблему. Вот тебе и практика.
ты главное избавься от синдрома самозванца
и сможешь ногой двери открывать и херочек шокировать, они млеять будут.
У меня идея.
В общем. Я вот что придумал. Приложение, которое должно обеспечивать квази-стабильный канал связи между девайсами.
Суть в чем.
Есть прокси-сервер.
Есть клиент.
Клиент и этот прокси-сервер по своему протоколу общаются.
Есть устройство. Оно шлет свои пакеты через клиента. Клиент - запаковывает в специальный пакет и отдает серверу. Сервер, накапливает пакеты - отдает другим клиентам, которые ждут посылки. Клиент на той стороне - получив от сервера - если физически связь есть - отправляет внутреннюю часть устройству которое подключено к клиенту, если нет - сохраняет до следующего сеанса связи и потом отдает устройству, после того как связь будет установлена.
Собственно такая-то смесь с одной стороны - очередей сообщений, с другой - wireguard. Для систем, где хуевая связь, но возможны долгие сеансы.
Протокол устройств - не важен, любой протокол - будет обернут в обертку, а затем развернут прозрачно для клиента.
Ну. И у меня вопросы.
1. Насколько тупой идеей будет делать это на шарпе?
2. Насколько сама по себе идея тупая?
Просто ИРЛ - я могу представить, когда это надо, допустим какие-то датчики на солнечных батареях, они раз в сутки - могут выйти на связь, пару минут пожить и обратно отрубиться, но было бы хорошо, чтобы им дошло сообщение которое вчера еще отправили, и они данные - так же отправили куда надо, чтобы сервер с этих датчиков данные схоронил.
Но ебаться просто ради себя и проверки концепции - как-то не оч хочется.
>То есть можно годик себе нарисовать, если ты программировал на опенсурсе?
Если ты сможешь пояснить, что ты там делал, какие задачи решал, с какими проблемами столкнулся и как их затащил. Тогда да. Возьми например какой-нибудь ASP.NET проект на .NetCore 2.1 c EF и переведи его на .Net6/7 - ты в процессе как раз сможешь и опыта набрать и на кучу подводных наткнуться, так что сможешь толково рассказать и пояснить.
Правда выдать это именно за "коммерческий" опыт ты вряд ли сможешь если у тебя его действительно не было, но можно на удаче съехать на то, что делал это в команде на каком-нибудь аутсорсе или по заказу. Главное про фриланс не упоминай, во многих конторах это как стоп-слово при рассмотрении резюме.
Ну. Тему что для устройства это должно выглядеть, будто оно просто в свой сетевой интерфейс что-то отправило, что-то получило из него. Знать ни про какие брокеры-очереди не знает.
1280x720, 0:14
Слушай, ну, в принципе прикольно. Надеюсь, сделаешь.
С дивана дам совет небольшой. На случай, когда сообщение большое, то посылай его кусками. То есть реализуй потоковую загрузку от клиента серверу(когда ты 50 мбайт файл или сообщение режешь кусками по 1 кбайту). И будет как бы гуд найс, вэри найс.
Разве пруфов не будут требовать? Название организации, должность, документы какие-нибудь? Раз организация существует, то также попробуют с ними связаться, там тебя попробуют поймать на вранье. А если не существует, то и пошлют тебя куда подальше. Звучит так, будто это такая же попытка пиздежа на софт-скиллычах нарисовать себе года, только с учётом участия на опенсурсе.
>Разве пруфов не будут требовать?
Пруфов чего? Выполненной работы? Ну так покажешь им репозитории со своими наработками. Можешь где-нибудь прикупить дешевую vps-ку и развернуть свой сервис там в открытом доступе. Заодно деплою научишься.
>>903194
>Название организации, должность, документы какие-нибудь?
Скажешь, что в душе не ебешь, т.к. работал по гпх на своего братюню, а он уже непосредственно с заказчиком общался и выдавал тебе задания. Или вообще на общественных началах или в серую.
>Раз организация существует, то также попробуют с ними связаться, там тебя попробуют поймать на вранье.
Там им скажут, что "не охуели ли вы ребята тут вопросы о наших проектах и сотрудниках задавать" и пошлют куда подальше.
Сейчас только совсем отбитые конторы звонят без спроса на предыдущие места работы. А те из нормальных кому это еще интересно, сначала разрешения спрашивают и контакты, где ты всегда можешь съехать, что не можешь выдавать им телефоны, т.к. не было такой договоренности. Я в банк устраивался, в анкете на вопросы, можно ли им позвонить текущему или бывшим работодателям за рекомендацией, написал "нет" и ничего взяли, даже слова не сказали. Сейчас гораздо проще проверить кандидата по разным hr базам в которых напротив твоей фамилии будет написано "пьет на работе и врет об умерших родственниках в оправдании прогула" (реальный случай, знакомая херочка при мне такого кандидата чекала).
Ну и опять же поинт был не в том, чтобы совсем напиздеть о не существующем опыте, а в том, чтобы заиметь реальный опыт хоть каким-то образом. Если у тебя нет возможности пройти практику во время учебы от ВУЗа, то находишь её сам. Один из способов я тебе показал, взять попенсорсный проект и улучшить/переделать его. Ты заимеешь тот самый опыт, у тебя будет результат который можно предъявить и ты можешь слегка приукрасить, что делал его не просто для себя, а с какой-то целью (возможно даже коммерческой). Может у тебя друган или девушка какой-то общественной нагрузкой занимается и попросила замутить портал с каким-нибудь функционалом вроде бронирования или электронной очереди, я х.з. сам придумай. Прояви фантазию короче.
>Разве пруфов не будут требовать?
Пруфов чего? Выполненной работы? Ну так покажешь им репозитории со своими наработками. Можешь где-нибудь прикупить дешевую vps-ку и развернуть свой сервис там в открытом доступе. Заодно деплою научишься.
>>903194
>Название организации, должность, документы какие-нибудь?
Скажешь, что в душе не ебешь, т.к. работал по гпх на своего братюню, а он уже непосредственно с заказчиком общался и выдавал тебе задания. Или вообще на общественных началах или в серую.
>Раз организация существует, то также попробуют с ними связаться, там тебя попробуют поймать на вранье.
Там им скажут, что "не охуели ли вы ребята тут вопросы о наших проектах и сотрудниках задавать" и пошлют куда подальше.
Сейчас только совсем отбитые конторы звонят без спроса на предыдущие места работы. А те из нормальных кому это еще интересно, сначала разрешения спрашивают и контакты, где ты всегда можешь съехать, что не можешь выдавать им телефоны, т.к. не было такой договоренности. Я в банк устраивался, в анкете на вопросы, можно ли им позвонить текущему или бывшим работодателям за рекомендацией, написал "нет" и ничего взяли, даже слова не сказали. Сейчас гораздо проще проверить кандидата по разным hr базам в которых напротив твоей фамилии будет написано "пьет на работе и врет об умерших родственниках в оправдании прогула" (реальный случай, знакомая херочка при мне такого кандидата чекала).
Ну и опять же поинт был не в том, чтобы совсем напиздеть о не существующем опыте, а в том, чтобы заиметь реальный опыт хоть каким-то образом. Если у тебя нет возможности пройти практику во время учебы от ВУЗа, то находишь её сам. Один из способов я тебе показал, взять попенсорсный проект и улучшить/переделать его. Ты заимеешь тот самый опыт, у тебя будет результат который можно предъявить и ты можешь слегка приукрасить, что делал его не просто для себя, а с какой-то целью (возможно даже коммерческой). Может у тебя друган или девушка какой-то общественной нагрузкой занимается и попросила замутить портал с каким-нибудь функционалом вроде бронирования или электронной очереди, я х.з. сам придумай. Прояви фантазию короче.
Спасибо за информацию, но все равно кажется, что с учётом огромной конкуренции среди джунов их будут проверять на пиздеж. Хотя я конечно могу многие отговорки придумать, но у меня вариантов то других и нет.
Обычно же просто подписываешься на события и всё.
>их будут проверять на пиздеж
Ты либо засыпешься и с тобой попрощаются. Либо разберешься в теме настолько, чтобы убедить собеседующего в правдивости своего пиздежа и пройдешь дальше.
Просто чтобы о некоторых вещах убедительно врать, нужно достаточно хорошо разбираться в теме, чего уже может быть достаточно для работы на уровне джуна.
Да тебя будет в большинстве случаев проверять СБ, но их больше интересует насколько ты чист перед законом, свободен от долгов, у тебя нет крупных финансовых проебов и совсем уж явных публичных косяков на предыдущих местах работы (т.е. таких инфа о которых выходит за пределы конторы). Тебе больше стоит беспокоится о том, что тебя не возьмут из-за того, что у тебя паспорт или военник неправильно оформлены или кто-нибудь из близких родственников банкрот или лудоман.
Да тут одни долбоёбы сидят, очень редко что либо путное ответят.
Почему, если ты можешь нормально сформулировать вопрос и ответ на него не выскакивает на первой странице выдачи поисковика, то вполне можешь спрашивать.
так он же древний как говно мамонта. Тогда не было всяких там асинков
>Обычно же просто подписываешься на события и всё.
а какая разница если по существу.
К тому же эти BeginХХХ имеют асинхронную семантику по природе, а события нет.
А что из простого юзать? Мне надо (для тестов) просто сохранять все запросы http и ничего не пропустить, заморачиваться с мощными фреймворками вроде asp.net не охота.
> какая разница если по существу.К тому же эти BeginХХХ имеют асинхронную семантику по природе, а события нет.
Таккая асинхронность как beginInvloke точно поможет? Теоретически же можно пропустить запрос пока работает служебный код по её организации и пусть даже очень быстрой обработке запроса т.к. пока не вызовешь EndGetContext другие запросы не принимаются.
Я дажне не события в смысле event в C# имел ввиду, а типа подписки но что бы гарантированно было оповещение при каждом запросе.
>пока не вызовешь EndGetContext другие запросы не принимаются.
Ты че там за код пишешь
В этом и есть смысл асинхронности "принимать запросы пока первый обрабатывается"
Из простого листенера хватит
Просто всё руками разгребать же
Я пока на примеры кода HttpListener смотрю, там надо самому прокачивать цикл приёма данных, т.е. пришел асинхронный запрос, ты его обрабатываешь, потом сам должен повторно вызвать ожидание следующего запроса. В этот промежуток пока ты разгребал если другой запрос придет ты его не увидишь как я понял.
Нормальная асинхронность это когда записываешь свой коллбэк и он уже вызывается на каждый запрос, пусть даже с наложениями.
Везде нужно прокачивать. Где то явно, где то под капотом
Весь мир построен на очередях. (кроме драйвера sqlite в дотнет, ну они рукожопы).
Так что ничего ты не потеряешь. Просто не задерживай прокачку очереди.
>потом сам должен повторно вызвать ожидание следующего запроса
Какой еще потом.
Получил завпрос, поставил его в обработку, получаешь следующий, а первый продолжает обрабатываться
>кроме драйвера sqlite в дотнет, ну они рукожопы
ну ладно не рукожопы. так то если файл занят, то нужно стать в очередь на эксклюзивную блокировку, но.....это же уже на уровень системы опускаться и можно повиснуть там, а с отменами там хз как
>А что из простого юзать?
> просто сохранять все запросы http и ничего не пропустить
Task RunHTTP(int port){
var listener = new TcpListener(port);
listener.Start();
while(true){
var client= await listener.AcceptTcpClientAsync ();
_ = RunConnection(client);
}
}
Task RunConnection(TcpClient client){
try{
using var ns = connection.GetStream ();
using var sr = new StreamReader(ns);
var request = await ParseRequest(sr);
var headers = await ParesHeaders(sr);
Stream body = null;
if(headers.Contains("Content-Length")){
body = CreateBody(sr, headers.Get<int>("Content-Length"));
}
SaveAll(request, headers, body);
}catch{}
finaly{
client.Dispose();
}
}
>А что из простого юзать?
> просто сохранять все запросы http и ничего не пропустить
Task RunHTTP(int port){
var listener = new TcpListener(port);
listener.Start();
while(true){
var client= await listener.AcceptTcpClientAsync ();
_ = RunConnection(client);
}
}
Task RunConnection(TcpClient client){
try{
using var ns = connection.GetStream ();
using var sr = new StreamReader(ns);
var request = await ParseRequest(sr);
var headers = await ParesHeaders(sr);
Stream body = null;
if(headers.Contains("Content-Length")){
body = CreateBody(sr, headers.Get<int>("Content-Length"));
}
SaveAll(request, headers, body);
}catch{}
finaly{
client.Dispose();
}
}
>заморачиваться с мощными фреймворками вроде asp.net не охота.
Зато сидеть велосипед городить решая кучу уже решенных проблем - охота. Пиздец как продуктивно.
асп.нет так то жрет как....
для ценителей минимальности использования памяти это глазик такой дёрг
Ну. Справедливости ради. Жрет оно дофига, если ты просто используешь дефолтную конфигурацию.
Если чуть посидеть, подзаебаться, оставить только нужное(дефолтный HTTP-хендлер и пару нужных для тестов мидлваров), то там будет все оч скромно.
не будет. он наделает кешей на все случаи жизни, а они нафиг не нужны.
У нас на проекте я протолкнул идею - использовать MD+Mkdocs для того чтобы вести дев-документацию, потому что бегать по свагерам и смотреть че там у кого с апишками - задолбало. Плюс, всякие сервисы вообще свагера не имеют, а через год - вспомнить, че они там делают и зачем нужны - бывает сложновато.
Все вроде были довольны.
Настолько довольны, что решили, что теперь мы и пользовательскую документацию так же вести будем. И в приложении появилось /help который то что Mkdocs генерировал отдавал. Круто. Удобно, легко поддерживать, легко развертывать, еще и гит для доков работает. Отлично корче.
И все было заебись. Пока внезапно кто-то из менеджеров не сказал, что надо PDF'ную версию делать, чтобы на странице с продуктом - можно было загрузить эту PDF'ку.
Понимаю, что вопрос не совсем шарповской тематики, но мне, как разрабу, показалось, что должно же быть что-то на шарпе, чтобы вот то что сгенерировал Mkdocs - загнать в апишку и чтобы она на выходе дала PDF со всеми стилями, отступами и всем таким.
Пока что мой гуглинг показал, что PDF - самый мерзкий формат что существует. Почти все что я нашел, денег просит(что не подходит по ряду причин, о которых лучше в политаче поговорить), либо кривое, либо под старый дотнет.
Да. У Mkdocs - есть плагин, чтобы выгрузить PDF, но он какой-то слишком замудреный и кривоватый, надо лезть в него и руками допиливать, чтобы как надо сделал и вообще.
Что это вообще?
Если это сравнение перформанса, то непонятно, каким фигом С - не в топе. С - буквально ассемблер для людей. А значит в принципе не может быть кейса, в котором хорошо написанный на С код будет медленнее чего угодно.
А тут - если судить, что меньше-лучше, выходит каким-то хуем жава впереди. Это в принципе невозможно ну никак. Так что отвечая на вопрос - потому что сравнение некорректно.
Так реально.
Объясни, каким образом нативный код - может в принципе быть медленнее байткода, который жавамашина переводит в рантайме в машинный?
Понятно, что жит - может лишние проверки убрать, чет переставить, чтобы пооптимальнее было. Но это все еще будет байткод, который в рантайме в машинный переводится. Он в принципе не может быть быстрее ОПТИМАЛЬНОГО кода, написанного нативно.
Жопаскрит - сейчас литерли фронтенд для плюсов. С хуя он должен-то быть медленнее шарпов?
Ты это не у меня спрашивай, а у индусов из копрософта, как они умудрились отсосать жопаскрипту.
Да, будет байткод. Очень сложный и запутанный байткод (чего стоит один только инвокдинамик), который своей сложностью ставит крест на реализацию точной копии этого на сишке (то, что решается на джаве в две строки придётся там расписывать по каждой инструкции на несколько страниц). Именно поэтому раст и обошёл джаву, потому что в нём также происходит раскрытие короткого высокоуровнего кода в пиздец, но быстрый пиздец, но не в рантайме, как у джавы, а в компайл-тайме.
>идентичный код на языках идентичного назначения идентичной структуры с идентичным принципом запуска (на виртуальной машине) с идентичной типизацией
>ррррряя, низя сравнивать!!! и вообще 132 миллисекунды нормально, ваши 5 мс нинужны!
Причём тут электросамокаты и велосипеды, ебанько? Тебя совсем от осознания того, что петушарп в 26 раз медленнен джавы переклинило?
Чел, на каждую из задач, в которой дотнет сосет у джавы, найдется 10 задач, в которой джава сосет у дотнета...
при том сравниваются разные вещи
я не ебу что это сравнение и даже гуглить не буду
Но знаю что при прочих равных жава сожрет больше памяти и я охуею от того как много она жрет
и да - мне придется сидеть и тюнить jvm и быть мастером в этом.
Так что не все упирается в скорость...собственно даже не знаю чего, ибо не гуглил что конкретно этот график измеряет
и да - ведь как бы скала и котлин тоже jvm - а чего ж они так, выходит жава рантайм говно что ли? Ну все понели, а кто не понел - ну пусть жрет говно.
>Чел, на каждую из задач, в которой дотнет сосет у джавы, найдется 10 задач, в которой джава сосет у дотнета...
>яскозал!
)))))))))
Одно конкретно сражение уже ничего не значит. Вы проиграли войну. Смирись, чел...
>при том сравниваются разные вещи
>я не ебу что это сравнение и даже гуглить не буду
>Но знаю что при прочих равных жава сожрет больше памяти и я охуею от того как много она жрет
>и да - мне придется сидеть и тюнить jvm и быть мастером в этом.
>Так что не все упирается в скорость...собственно даже не знаю чего, ибо не гуглил что конкретно этот график измеряет
>яскозал!
)
>и да - ведь как бы скала и котлин тоже jvm - а чего ж они так, выходит жава рантайм говно что ли? Ну все понели, а кто не понел - ну пусть жрет говно.
Петухлин не просто так по три года на каждую новую версию джавы поддержку пилит. Он анально вгрызается в работу jvm, ломая оптимизации + везде добавляет свои ухудшения производительности, как с корутинами, которые код в 10 раз замедляют. Скала просто тупо серет new Object() на каждый пук.
Только вот даже если бы не было адекватного объяснения медленности скалы и петухлина, то это бы не отменяло 5 мс в джаве и урину на ебальник обоссаного шарпопетуха с 132 мс. Это бы просто ставило интересный вопрос, как так удалось испортить производительность. Спорить с этим тестом это как если бы Ньютон после падения ему яблока на бошку заявил "а хули бог мою бошку не защитил? Должен был защитить! Значит яблоко не упало! Шах и мат, аметисты!".
>Одно конкретно сражение уже ничего не значит. Вы проиграли войну. Смирись, чел...
>яскозал!
)
Что-то по делу высрешь, или твой петушарп ещё не успел обработать попадание урины на твой ебальник?
Слив принят, 132-мсный.
просто тут у нас пациент из психбольницы сбежал
отличается особыми признаками
- труслив (поэтому притащил не ссылку, а картирнку, да такую что видео не нагуглишь), ведь иначе ему полон рот напихают
- жрет говно (не жаваговно, а просто говно, просто говноед)
- агрессивное
- тупое
ничего, его в конце концов поймают - и в дурку
Перемешать результатами с видосика на Ютьюбе это сильно, конечно. Причем в котором нет инфы о том, какие где версии софта, с какими флагами собиралось/запускалось и т.д. Более объективные тесты показывают, что шарп, что java суть одна хуйня по скорости. В каких-то задачах Шарп быстрее, в каких-то жаба. Вот пример нормальных тестов. https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/csharp.html
Чел. Блядь. Не тупи. Если это в конечном итоге будет превращено в нативный исполняемый код. То код без прослойки из байтоговна - будет работать быстрее чем код с этой прослойкой, ну хоть ты усрись.
И да. Не существует такого кода, который бы нельзя было написать на сишке, потому что, блядь, еще раз - сишка это ассемблер для людей. Если сишка проигрывает хоть в одном сравнении по перформансу - значит тот кто писал код для теста - НЕ ЗНАЕТ СИ, вот и все. И не нужно тут хуйню придумывать, про хитрый байткод. Байткод - все равно будет интерпритирован в те же самые машинные инструкции.
Короче. Если твой код на си медленнее чем код на джаве - ты просто хуевый программист - иди вон из профессии.
Вы нахуя кормите это животное?
Додик, всё там есть, описание открой и запускай сам, сколько влезет, пока на заебёт плакать от 132 мс.
Коупингом обоссанного удовлетворён.
Что запускать то ебанат? Где указаны входные данные? Где шарповый проект с BenchmarkDotNet, который замеряет реальную производительность, а не колд паф с компиляцией jitом
Я понимаю что ты просто серишь, полоумный
Ебать долбоёб дурачка включил. Он щас будет требовать объяснения, что такое код и как его запускать?
именно
там вот сравниваются LINQ подобные реализации "найти максимум от"
причем от чего?
если поискать то там есть примеры типа
nums = [-2,-1,-1,1,2,3]
https://leetcode.com/problems/maximum-count-of-positive-integer-and-negative-integer/
они на любом языке проходят за наносекунду.
в репе дохера файлов но конкретно как что измерялось и на чем - НЕ НАХОЖУ
>>906426
ну так ПОКАЖИ ГОВНОЕД тестовый набор и как измерялся бенч.
Ну. Ок. Если для тебя сложно - валидный аргумент.
Вот мне - было сложно вспомнить, как там у вас в жаве - словарь называется, чтобы мемоизацию делать.
Давай померяем и сравним код, который одну и ту же задачу решает, и удивимся, насколько же жава медленнее чем шарпы.
Я понимаю, что джавадебилу это тяжело осознать. Но производительность решений не замеряется циферками с сайта. Джавадебил, неужели у вас в джавапараше нет культуры бенчмаркинга? Ну это в целом объясняет ее тормознутость
На жаве реально настолько отбитые пишут, что даже не в состоянии по коду понять, что за пиздец со временем произойдет в случае с жавой?
Так ты сравнишь или убежишь в харчках, будучи неспособным предоставить то, о чём сам заикнулся?
я пройду мимо долбоеба который уверяет что поиск в массиве из нескольких элементов займет 117мс.
или 141мс на питоне
хз что как сравнивалось. Небось миллион запусков (в неизвестном варианте) и взяли общее время
то есть самый дебильный подход.
но мне влом разгребать это дерьмо, поэтому нафиг не нужно.
Вытри рот от говна, джавадебил, и возвращайся с тестами, в которых указаны входные данные и предоставлены два проекта с бенчами на джаве и шарпе. Но лучше не надо, ведь мы оба знаем, что во всех кейсах жаба соснет. Как здесь https://github.com/jinyus/related_post_gen например. Джавадебил, а зачем ты в бессильной злобе срешь в тред? Просто переходи шарп и становись успешным и счастливым.
>бох ни защитил, значит яблоко на бошку не падало!
То есть по делу ничего не высрешь? Это печально.
А тут ещё и просто стопвочом замеряют, то есть если норм замерить оно на уровне плюсов будет.
Да я понял уже, литкод, крупнейшая площадка для хуемерства наносекундами, насрал в штаны шарпоблядям. Ты штаны-то постирай, а то воняет.
Какой-же ты тупой. Пиздец просто.
Первый скрин - время в милисекундах жавы
Второй - сярпа
Вывод шарп в 1808 быстрее жавы.
Можно закрывать дискуссию.
Я тоже так умею.
Java
Hui(50) = 89999
Elapsed time: 4
C#
Hui(50) = 89999
Elapsed time: 1488ryxnym8883E90
Ты может хотя-бы код покажешь, или будешь дальше жаловаться на то, что тебе в штаны насрали?
Где? В твоих фантазиях?
Ты че, даун? Нахуй ты сравнил рекурсивный подход с динамическим программированием?
> На сях сложно писать нормально
> Давай я напишу на шарпе нормально, на жаве - хуево, и это буду использовать как аргумент
> Давай
> Держи
> Нахуя ты так сделал
У жаводебилов стек такой маленький, что они не помнят что было буквально 20 минут назад?
ну так то ты сравнил прямой подход с подходом с мемоизацией
что не очень честно
но, как я уже говорил, жавист жрет говно и не нужно ему в этом мешать. пусть дрочит на свои фантазии, он ведь кроме жавы ничего и не знает.
Манюнь, отсутствие инвокдинамика и тысяч других оптимизаций, что придётся реализовывать заново на сишке и твой дебилизм и незнание структур данных в джаве это разные вещи. Мемоизация легко делается на джаве.
Я будто с чат-гпт говорю, ну серьезно.
Еще раз.
Нативный код - ВСЕГДА БУДЕТ БЫСТРЕЕ ЛЮБОГО КОДА С ПРОСЛОЙКАМИ.
Если твой нативный код медленнее жавы, шарпа, питона - это значит, что у тебя руки не из того места растут. Все. Если в тесте перформанса - ассемблер или шарп проигрывают чему-то, значит тот кто писал код на этом языке - хуевый программист и ему надо идти на завод гайки крутить.
Все. Блядь.
И свой динамик инвок можешь засовывать прямо до гланд.
>>906519
Я просто показал, как хуево звучит тезис про то что чет там сложно делать, если мы хотим сравнить перформанс языков. Типа блин, на ассемблере - тоже можно написать крайне хуево, настолько, что нормальный код на питоне будет быстрее. Только это говорит не о языке, а о проблемах с навыками программиста, который этот код выдал.
Линк с 7 дотнета тоже умеет в векторизацию, как и жава. Так что цифры, при равных условиях, были бы сопоставимые. Ты обосрался, чел...
Повтори это в четвёртый раз, и тогда, это, наверное, станет правдой, идиот.
>бох бошку не защитил, значит яблоко не падало!
Ты можешь сколько угодно пруфов блейзингфастовости петушарпа приводить, только суть в том, что ты так только опровергать их будешь об реальный тест.
Первое с чего стоит хрюкнуть, это с того, что джавдебил думает, что код на каком либо языке может работать МИЛЛИСЕКУНДЫ НАХУЙ над кейсом из 6 чисел. Джавадебил, ты....
Берем первый кейс и писаем на джавадебила. Вот такая вот вечерняя разминка шарпочане. Можно шлифануть SIMD'ом, хотя скорее всего жит это сам сделал на 8 дотнете.
И сново шарподаун доказывает, что ему яблоко на бошку не падало. Необучаемая порода.
Ты и сам видосом с ютуба перемогаешь вместо реальных тестов, чел.
Я свою гипотезу озвучил: в csproj сборки тестов с ютуба стоит максимум 6 дотнет. Переключи на 7 и получишь прирост производительности того же самого кода. Магия SIMD.
>Только это говорит не о языке, а о проблемах с навыками программиста, который этот код выдал.
Мне это пояснять не нужно
я всегда смотрю не скорость, а на баланс "удобство/скорость"
Тот же LINQ никогда скоростью не отличался (и это известный факт) ибо упор в нем на удобство и сильно напирает на абстракцию IEnumerable.
И тут приходит жавадебич и начинает мне показывать " увас LINQ медленнее чем жава стримс (что еще спорно ибо векторизацию сделали)"
А я смотрю на него и думаю....да что я могу думать про дурачка который кроме жавы в глаза ничего не видел
Ну так а хули ты не переключил? Код есть, задача есть (вот выше кинули). Боишься, что не сработает?
Не ворочайся, слитое.
смешно слышать это тот жависта
у которого в жаве лямбды и И ПОДОБИЕ linq ввели чере хуеву тучу лет, а до этого эти дебилы орали "нинужна,энтерпрайз"
долбоебы-с
просто это факт
у меня есть знакомые такие как долбоебы и вечно жава жава
а я спрашивал "а хули у вас нет этого и того"
знаешь что мне орали в ответ? "НИНУЖНА, энтерпрайз, обратная совместимость"
и теперь мамкин жавист обосратыш уверяет меня что это оказывается киллер фича лол
ты сколько языков то изучал неуч. мне просто интересно
понятно что не все такие как я, что могут похвастаться больше десятка, но хотя бы 3 можешь озвучить?
>Сегодня вечер закидывания жависта говном. Забавно ))))
— раздался возглас после 132-миллисекундного ожидания.
ясно. вместо ответа слился. ничего от обосратыша и не ожидалось.
ну пусть тред уходит в бамп лимит
а жавист погружается дальше в говно, откуда он и не вылезал
последний раз говорю
без нормального кода бенчмаркинга и набора данных можешь идти жрать говно дальше
у меня код выпоняется за наносекунды
те кто нашел там 112 мс пусть просто идут изучать матчасть.
а ты ...иди жрать говно
Опять литкод в штаны шарпоблядям насрал! Да что ж такое-то! Самое главное джавистам не насрал, педалистам не насрал, растоблядям не насрал, даже жопаскриптерам не насрал, а шарпоблядям насрал!
Типа прикриплейда.
Просто суть-то в чем. Нужна древовидная структура с одной стороны, с другой - разные типы элементов этого дерева.
Конечно, можно сделать более изъебисто:
Node, NodeType, NodeTypeAttrubute, NodeAttribute и вот так вот того же добиться. И вроде как правильнее будет. Но надо ли?
нет. это жавадебич без внятных пруфов говна поел
все посмотрели вокруг, посмеялись и разошлись )
>нет. это жавадебич без внятных пруфов говна поел
>все посмотрели вокруг, посмеялись и разошлись )
— раздался возглас после 132-миллисекундного ожидания.
Ебанат, ты программировал последний раз в дурке? Из которой ты нам и пишешь
Какие миллисекунды для массива из 6 элементов, джавадебил? Твой литкод несёт хуйню и срет тебе в штаны, маня. Бэк литкода, который эти тесты гоняет, писала такая же обезьяна как и ты.
ожидания ЧЕГО дебил
ты так и не привел факты чего ожидания
у меня код выполняется ЗА НАНОСЕКУНДУ
Но вот че мне не нравится. Индексы по такой таблице будут фиговые, потому что куча значений - Null будут.
Срёт литкод в штаны мне, а 132 миллисекунды имеет петушарп. Весело.
Та я бы мог просто рекорд сделать. Было бы
public record NodeAttribute(int NodeId,
Node Node,
int AttributeId,
Attribute Attribute,
string StringValue,
Boolean BooleanValue,
sbyte SByteValue,
byte ByteValue,
DateTimeOffset DateTimeValue,
UInt16 UInt16Value,
UInt32 UInt32Value,
UInt64 UInt64Value,
Int16 Int16Value,
Int32 Int32Value,
Int64 Int64Value,
Decimal DecimalValue,
Double DoubleValue,
Single SingleValue,
string? JSONValue,
string? XMLValue,
string? PhoneValue,
string? EmailValue,
string? AddressValue,
string? URLValue,
byte[]? BlobValue,
int? LattitudeValue,
int? LongitudeValue,
int? AltitudeValue);
Просто не помню, еф уже научился с рекордами работать чи нет.
Та я бы мог просто рекорд сделать. Было бы
public record NodeAttribute(int NodeId,
Node Node,
int AttributeId,
Attribute Attribute,
string StringValue,
Boolean BooleanValue,
sbyte SByteValue,
byte ByteValue,
DateTimeOffset DateTimeValue,
UInt16 UInt16Value,
UInt32 UInt32Value,
UInt64 UInt64Value,
Int16 Int16Value,
Int32 Int32Value,
Int64 Int64Value,
Decimal DecimalValue,
Double DoubleValue,
Single SingleValue,
string? JSONValue,
string? XMLValue,
string? PhoneValue,
string? EmailValue,
string? AddressValue,
string? URLValue,
byte[]? BlobValue,
int? LattitudeValue,
int? LongitudeValue,
int? AltitudeValue);
Просто не помню, еф уже научился с рекордами работать чи нет.
>еф научился с рекордами работать или нет
Вся суть петушарпа. На джаве когда добавили рекорды сделали так, чтобы они превращались в обычные классы при конпеляции, и что угодно будет работать с рекордами.
Они и так - и есть по сути обычный класс, просто с небольшыми фичами.
Просто ЕФ - идет как отдельный продукт, который своей жизнью живет.
Если что-то его не поддерживает, значит нихуя не обычный класс. Разве что этот еф это альтернативный компилятор.
у меня он на машине 16 (ей уже 7 лет епта) года проходит за НАНОсекунду
так что поешь говна, жавоед
Просто ЕФ - хочет гарантировать, что у тебя только один объект на контекст с тем же ключом существует.
Рекорды - иммутабельны, потому, если ты используешь with - получаешь новый объект. В результате - ЕФу это не нравится по умолчанию.
Они конечно могут либо забить на один объект на контекст, но тогда непонятно, что трекать, если человек все еще хочет чтобы изменения трекались.
В удобстве миграций.
В трекинге изменений.
В том, что у тебя не будет копий одного и того же объекта, если ты явно не захочешь этого.
В том что не нужно писать кучу СКУЛЯ для тривиальных вещей на каждый чих.
В том, что ты можешь тестировать код, без необходимости разворачивать под это дело реальную БД(тут с оговораками, но все равно)
Сверху - тулзы для отладки, вшитые в студию. Тулзы для тестов.
Короче. Много всяких приколюх.
"Он"? И сейчас ты мне выложил пруфы, что ты запустил то же, что запускает литкод.
>Я запускаю код, он выполняется у меня за наносекунду, а на литкоде за 132 миллисекунды. Какой из этого вывод? Нет, не я запускаю не то же, что на литкоде запускается, это яблоко не падало и литкод рандомные цифры выдаёт (или к чему он хочет подвести?)!
Почему вот так никто не делает? Ну, вернее я что-то не видел, чтобы вот так вот делали особо, а если кто-то так делает, то его на хабре ругают.
Какие подводные камни-то, если надо админук, под разные сущности намутить, тупо с отображением таблицы и базовыми круд-операциями?
>>907006
Ну мне просто очень интересно. Вот у меня опердень. В опердени есть проводки - это такие жирнющие транзакции в несколько тысяч строк кода с вызовом кучи хранимок и вручную расставленными хинтами блокировок в каждой строке. Как вы это в EF делаете? Без хинтов блокировок будет ОЧЕ МЕДЛЕННО и миллиарды дедлоков. Или EF прямо хорошо хинты сам расставляет? Это была бы технология круче чатгопоты. А ещё в этих хранимках очень много временных таблиц, мне их разумеется нельзя в память приложения забирать, клиент 100% обосрётся. На этих таблицах временных индексы часто висят, в целом типичная проводка вначале строит 5-6 временных таблиц, а потом начинает писить и какоть направо-налево в персистентные таблицы джойня их с времянками. Как такое сделать? Грузить в память такое это прямо суицид. Кроме того хотелось бы как-то реюзать код, например у меня уже есть какой-то кусок кода, который у меня будет воспроизводиться в хуевой туче похожих хранимок. Насколько я понимаю если я его в шарпе напишу, то я же опять залечу в память клиента?
Хм. ХМ...
В общем. Все еще кажется, что норамльно же решение, для тривиальных операций.
Потом - просто наследуемся и радуемся.
>Жaбадeбилы смачно соснули с проглотом.
— раздался возглас после 132-миллисекундного ожидания.
у нас все выполняется мгновенно, а руками из жопы если скорость измерять, то и не такое будет
Почему литкод измерил "руками из жопы" именно петушарп?
Тебе никто не платит, лул. Ты бесплатная псина.
не поленился сделал бенчи (хотя я с жавой не работаю и как там бенчить пришлось гуглить)
причем код измеряемого метода взял из леткода
данные с потолка, но идентичны + некоторая защита от jit (который может вывести что массив не меняется и тупо захардкодить результат)
Пришлось знатно помучаться с идеа, которая в процессе наглухо умерла с непонятно чего вдруг (пик). ничего не помогло пришлось делать полный реинсталл.
В общем итог
c# - 195мс
говножава - 67 (если я верно понимаю выхлоп)
при этом тест на шарпе проходит очень быстро(мне влом настраивать), а на говножаве несколько минут гоняет и дает потенциальную возможность житу поработать. но не суть.
А теперь к самой конкретике
где же разница в 20 раз, а, говноед?
Почему шарп проиграл? ну LINQ никогда скоростью не отличался. Он расчитан на абстракцию IEnumerable, которая слишком широкая. Тот же Count под капотом честно обходит через foreach каждый элемент и вызывает для него предикат. То есть он не работает с ним как с массивом
В то же время в жава коде используется Arrays.stream(nums), который рождает IntStream и принимает как раз именно массив (а не абстрактный IEnumerable), а значит может применить под капотом кучу техник для оптимизации.
То есть по факту сравнение реализации для общей абстракции "что то перечислимое и у нас есть предикат (вызов которого не бесплатен" с конкретно заточенной реализацией "заранее известно что у нас а) массив б) массив интов в) фиксированного размера"
Как я уже говорил - сравнение теплого с мягким.
все проще. в жава используется очевидное читерство, а говноед радуется )
и даже с читерством никаких "в 20 раз"
А ты жри жри говно, не отвлекайся. Тебя обосрали с пруфами.
ну если ты долбоеб то ты и с пальца смеешься. С обосранного пальца, который ты сосешь.
А теперь по делу, то есть НАПИХИВАЕМ ГОВНОЕДАМ ГОВНО В ИХ РОТЕШНИКИ
Когда я переписал на прямую работу с массивами то получил 16мс, но это уже нечестно.
Тогда я написал свою реализацию Count (пик), то есть простую и банальную. И получил...63мс, то есть выходит ...жава обосралась со своими 67мс
Почему дефолтный Count так плохо работает?
ну когда я в своем Count заменил int[] -> IEnumerable<int> то все сразу стало плохо
Так что факт - жава ЧИТЕРИТ выбирая КОНКРЕТНУЮ ПОД ИНТОВЫЙ МАССИВ реализацию
И когда я в шарпе сделал то же самое (причем примитив - просто заменил IEnumerable на int[]) - то жава ожидаемо отсосала
Ну да, LINQ слишком широко замахнулся на абстракции. в этом его недостаток, что влияет на скорость и память. Да и не для скорости его делали, а для удобства. А оптимизировать можно всегда. В общем то сила LINQ в другом - в том, чего у жавы никогда не будет, а именно LINQ Expressions
Жава же наплодила разных IntStream, DoubleStream принимающих массивы, что тоже разумно создавать оптимизированные версии чего либо, но у них свой путь - в жаве нет структур и жопа с женериками, потому у них всякие IntStream вместо Stream<int>
вернее это не жава читерит
это ребята с леткоде зачитерили выбрав что они там выбрали Arrays.stream
(хотя может у них и выбора другого не было - я не знаю жавастримс вообще, я просто посмотрел реализацию их выбора)
конечно они даже не знают что зачитерили таким образом.
Но это сравнение теплого с мягким, как 100 раз говорилось.
ну да, ребятам из мс нужно бы написать кучу узкозаточенных LINQ методов чтобы выбирался оптимизированный, а не IEnumerable. Может когда нибудь и напишу им иссуйку.
Написал бы в императивном стиле, с обычным for, со статикой - оно бы еще быстрее было. А если бы еще развернул цикл... Ну да ладно.
>LINQ Expressions
Опиши в чем фича. Я прост на шарпе пишу и все хуею с решений. То у них в nested классах this нету, то null можно пропихнуть, если знак восклицания поставить. Делегаты в пайплайны не сделать нормально. Похоже я вообще не выкупаю ваш яп.
Я просто сделал честно
жава работает с int[]
и пусть шарп будет в тех же условиях (с оптимизациями пусть компилятор играется)
в этих равных условиях шарп победил. Мне этого достаточно и разрывом жопы жависта (хоть он этого не показывает) я вполне удовлетворен.
В шарпе, в принципе, можно не делать специальной реализации под каждый тип. Благодаря нормальным дженерикам int Count<TItem>(this TItem[] arr, Func<TItem, bool>() будет работать так же быстро, как и версия, написанная под массив конкретного типа.
А разницу в получающемся ASM-коде для методов с параметром массивом и IEnumerable, можно заценить вот тут https://sharplab.io/#v2:EYLgxg9gTgpgtADwGwBYA0AXEBDAzgWwB8ABAJgEYBYAKGIAYACY8lAbhvoYGUALbKAA4AZbMAB0AJQCuAOwwBLfDHbUOAZibkkTUgwDCDAN40GphibMBtAFLyMAcRgyYUeWAAUGAJ4CYEAGbu8nIAlCEAuhamxBrM2sEY+hCyGAA8ACoAkhgw+AB8njzyuAxZOfiW4Qz8UGhMAKwZ2bl1wBAQADZ5DAKwACZu2DkhUUajZgwAbvwMkCkMALwMdCoTE/7QMNhgPAzu01AMdrlHMtVQUCPUa2bG1zdr8v57vTADYEMwQeVh4w8TczkAGogasHgBfP7RADss2ScjBpkh91MoxsdkczlcHm8vgCQVCEVGMU08TkSRSTXKBQwRRKzDUVNy3VwMAAjnViI0yi0GG1Ot1Xu9PlcJnd/gc4fMlisoQwNrBtrt9jNjvhTgxWWzRQ9xf8zE8Xv1Bjlvrlfij9QD4RgQYi1sj/sRYYCMPbkeCgA===
что значит в чем фича.
Вместо компиляции функции в конректный исполняемый код происходит ее разбор и вшивание в IL дерева выражения.
Ну а дальше ты с ним можешь что то делать - сгенерить SQL например, вытянуть нужные тебе метаданные
Если позволяет навык то менять и делать свои.
Да и просто создавать методы на лету работая с понятным API, а не пердолясь в IL (что сложно ибо там работает стековая модель выполнения и мозг там вообще поплывет).
> Он расчитан на абстракцию IEnumerable, которая слишком широкая. Тот же Count под капотом честно обходит через foreach каждый элемент и вызывает для него предикат
Нет, там есть оптимизация для классов, реализующих ICollection
>>907713
и тем не менее, у меня 7 дотнет и, сам видишь, ничего оно само не нашло и не выбрало и не оптимизировало (хотя буду честным я не смотрел куда оно там шло под капотом, я смотрел на бенч и он хреновый - а судя по тому что цифры дефолтной реализации и моей с IEnumerable<int> примерно равны, то делаю вывод что так оно и работало.)
может добавив какой либо using оно бы подцепило другую реализацию, но
1 я не знаю какой без доп либ
2 я не считаю этот подход правильным. Да, есть либы которые имеют вот такие методы. Их добавляешь в референсы, добавляешь using и вуаля магия. Но кто этим будет заниматься.
>оптимизация ... реализующих ICollection
небось это знание Count и не более.
Есть. Но опять же, ICollection тоже абстракция. С ней все так же никак не избежать виртуальных вызовов, которые катастрофически медленнее, чем прямое обращение к элементу массива по индексу.
>> небось это знание Count и не более.
Знание count + использование индексатора для получения элемента. Но это, опять же, все те же виртуальные вызовы.
>при этом тест на шарпе проходит очень быстро(мне влом настраивать), а на говножаве несколько минут гоняет и дает потенциальную возможность житу поработать. но не суть.
Сделай нормальные тесты. Че это за говно? Массив достаточно большой хуйни, с цифрами рандомными+-, цикл убери, чтобы тестрировалось именно один прогон, а не сотни. И нормально настрой шарповый тест, хули он один раз пробегает, а не сумму среднюю считает.
жава уже проиграла, успокойся. Тебе нужно - ты и переписывай, я жаву трогать лишний раз не хочу.
Даже изначальная разница показала что леткодовцы сделали тесты через жопу раз у них там в 20 раз разница, то есть тупо позволили джиту поработать и выбросить часть кода.
>>907727
ну чет не использует. А может и использует и проблема все равно именно в тех же виртуальных вызовах.
в общем вот
https://pastebin.com/MpAuKqEu
| Method | Mean | Error | StdDev |
|------------ |----------:|---------:|---------:|
| StupidTest | 192.31 ms | 0.640 ms | 0.534 ms |
| StupidTest2 | 64.92 ms | 0.272 ms | 0.227 ms |
>>907731
Технически да. Если для тебя это окажется узким местом (что сильно вряд ли на фоне остального) и захочется оптимизировать то можно подключить конкретные реализации
а так да - имеем не самую оптимизированную реализацию LINQ
>>907736
сам делай что хочешь. мне влом
Я и так сделал больше чем нужно - доказал что шарп побыстрее жавы будет в той же задаче если убрать разницу в подходе
и с рэндомом бенчи сами по себе идиотизм. Бенчи должны быть идентичными.
И нет причин делать массивы большими, это ничего не изменит.
мне некогда всей этой херней заниматься. я и так знаю что жава говно. Мой выбор - шарп и котлин
жава уже проиграла, успокойся. Тебе нужно - ты и переписывай, я жаву трогать лишний раз не хочу.
Даже изначальная разница показала что леткодовцы сделали тесты через жопу раз у них там в 20 раз разница, то есть тупо позволили джиту поработать и выбросить часть кода.
>>907727
ну чет не использует. А может и использует и проблема все равно именно в тех же виртуальных вызовах.
в общем вот
https://pastebin.com/MpAuKqEu
| Method | Mean | Error | StdDev |
|------------ |----------:|---------:|---------:|
| StupidTest | 192.31 ms | 0.640 ms | 0.534 ms |
| StupidTest2 | 64.92 ms | 0.272 ms | 0.227 ms |
>>907731
Технически да. Если для тебя это окажется узким местом (что сильно вряд ли на фоне остального) и захочется оптимизировать то можно подключить конкретные реализации
а так да - имеем не самую оптимизированную реализацию LINQ
>>907736
сам делай что хочешь. мне влом
Я и так сделал больше чем нужно - доказал что шарп побыстрее жавы будет в той же задаче если убрать разницу в подходе
и с рэндомом бенчи сами по себе идиотизм. Бенчи должны быть идентичными.
И нет причин делать массивы большими, это ничего не изменит.
мне некогда всей этой херней заниматься. я и так знаю что жава говно. Мой выбор - шарп и котлин
>жава уже проиграла, успокойся.
— послышалось после 10 минутного ожидания написания шаблонного кода под нужную комбинацию операций над потоком данных
>Я и так сделал больше чем нужно - доказал что шарп побыстрее жавы будет в той же задаче если убрать разницу в подходе
>написал огромный кусок кода, который подходит только для одной комбинации операций над одним типом данных
>сравнил это с двумя строчками на джаве
>НИТ РАЗНИЦЫ В ПАДХОДЕ ЯСКОЗАЛ!
>и с рэндомом бенчи сами по себе идиотизм.
>Бенчи должны быть идентичными.
Кто-то там кукарекал про культуру бенчмаркинга. И ведь опять отработала вторая теорема шарпана, и шарпоблядь оказалась не знакомой со законом больших чисел.
>И нет причин делать массивы большими, это ничего не изменит.
>яскозал!
прошло 10 минут и 132 миллисекунды
>мне некогда всей этой херней заниматься. я и так знаю что жава говно. Мой выбор - шарп и котлин
да никто этим не занимается
разница в несчастные 3 раза из за общего решения, в котором обычные виртуальные вызовы на частной задаче
Да в любом коде таких вызовов миллионы.
Ну родили для массивов в жаве конкретные реализации - ну молодцы. Где то сделали лучше и что? это никак не спасет от убожества жавы и ее рантайма.
Может и майки когда то сделают дефолтные такие для частных случаев. Ну заметит кто то что у него стало работать на пару наносекунд быстрее, а скорее всего не заметит вовсе.
короче
иди нахуй жавадолбоеб.
с тобой в диалог больше вступать не буду
это как в говно вступать. нах надо.
Слив принят, 132-миллисекундный. Иди дальше пиши замену всем операциям своего аналога стримов, а я буду в две строчки получать производительность в 20 раз выше.
Да. Это плата за возможность лёгкого добавления новых типов последовательностей(стримов в джавовской терминологии) и операций над ними.
Достаточно просто сравнить кол-во методов, которые содержатся в джавовском интерфейсе Stream (https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html их 30+), которые нужно реализовать, с одним методом в шарповом IEnumerable ( https://learn.microsoft.com/ru-ru/dotnet/api/system.collections.generic.ienumerable-1?view=net-7.0#methods )
Да, это работает медленнее, так как для каждого типа коллекции нет отдельной, оптимальной, реализации для каждого операции, но зато, при добавлении новой операции над стримом тебе не придется добавлять метод для нее в этот интерфейс, а следовательно а каждую его реализацию. Достаточно просто написать один метод-расширение для IEnumerable.
По итогу, джавовский подход быстрей, а шарповый сильно гибче. Джавистам теперь придется долго жить с этими 30 операциями над стримами, так как добавление новой в интерфейс будет ломать обратную совместимость. Шарпанам же уже из коробки доступно около 200 операций над IEnumerable и нет ничего (кроме здравого смысла), что ограничивало бы добавление новых.
Хуйни написал. Он быстрый над коллекциями не из-за стрима, а из-за https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html
Именно в него нахуярил в какой-то момент кучу методов. Про что говорить, в 21 все ещё добавляют. И совместимость никак не страдает.
Додик, как же ты серешь. Альтернатива АйЕнумерабля в джаве это Iterable. И, внезапно, его можно легко перевести в поток данных, как твой АйГиперкомпенсируюЕнумерабля. Только в джаве, почему-то, никто не платит за это, при этом пользуясь всеми преимуществами абстракции, а в петушарпе почему-то это оправдание его тормознутости. Иди жопу мой.
Ты считаешь, что если в интерфейс, который ты реализуешь, кто-то в новой версии добавит новый метод, то совместимость не пострадает? Или тебе таки придется этот метод реализовать, чтобы все на новой версии собралось? Я про это. Или в Java-мире не принято реализовывать стандартные интерфейсы, чтобы интегрировать свои классы с существующим библиотечным кодом?
А стрим-таки быстрее шарпового ienumerable за счёт того, что в его интерфейсе больше методов-операций над стримом, которые можно сделать более оптимизированными (да хоть тот же метод из Collection в них дернуть). В шарповом интерфейсе же тупо один метод, который должен возвращать итератор. Все. А в итераторе максимум, что можно оптимизировать, так это перебор элементов. Зато благодаря такой простоте интерфейса, его легче реализовывать. И операции легче добавлять. Причем, их легче добавлять не только авторам языка, но и разрабам-пользователям. Я могу спокойно написать метод-расширение, который будет работать с любой реализацией интерфейса, и легко и красиво использовать его в цепочке вызовов для стрима, улучшая читаемость кода.
>Ты считаешь, что если в интерфейс, который ты реализуешь, кто-то в новой версии добавит новый метод, то совместимость не пострадает?
Доброе утро. В джаве так уже лет 20 делают. Дегенерат.
на самом деле майкам просто влом.
Есть же реализации в которые вбиты вот такие "если массив, то работаем с ним", подключаешь либу, вписываешь using и компилятор подключает более конкретную реализацию
Почему этого нет в стандартной библиотеке? видимо считают что и так скорости достаточно. ведь так нужно на каждый тип по реализации, да еще куча операций - вот и не доходят руки, заняты "давайте уберем main"
>>907956
стрим быстрее только для массивов где жава знает что это массив и юзает напрямую, а шарп все равно работает через ICollection. Если же данные не массив,а последовательность то читерить не выйдет, но жавист об этом умалчивает ибо послан нахуй.
>НИИИИИЕЕЕЕТ ТЫ НИ МОЖИШЬ АПТИМИЗИРОВАТЬ ПАТАМУШТО НА ПЕТУШАРПЕ ЭТА НИ АПТИМИЗИРОВАНО ЭТА ЧИТИРСТВА!!!!
Оптимизации, которые с лопаты скормили шарпочмоням — это оптимизации и мы с ними идём в джаватред срать.
Оптимизации, которых в нашем говне нету — это читерство и вообще а что так можно было что ли?
Не нужно кормить посланного нахуй жава-дегенерата (то что он дегенерат - увидели уже даже слепые)
зачем в шарпотреде вообще обсуждать говно продукт под названием жава
Почему на петушарпе нельзя писать короткий и быстрый код?
>НИИИИИЕЕЕЕТ НЕЛЬЗЯ АБСТРАКЦИЯ ХРРЮЮЮУУУУУИИИИ НИВЕРЬЮ ВРРРЁТЕЕЕЕ!!!
>В СМЫСЛИ НА А ДЖАВЕ МОЖНА? ЧИТИРЫ! ПИДАРАСЫ! НИЧЕСНА ИГРАЕТЕ! МАМИ ПАЖАЛУЮСЬ!!
А значит пусть орет в одиночку, незачем ему отвечать
Мань, я на петушарпе не пишу, с петушарпом связан только через тред, на который и не жаловался. Картиночка не подходит.
Боюсь спросить, что на данном изображении символизирует шарпистов...
Там мухи вместо свиней должны быть
Научить пользоваться избранным и тегами в навигаторе. Реально каждый раз скроллишь все треды что ли?
Но перекат всё равно нужен
Тяжеловат тред для мобильных девайсов
Скоро тем более выйдет дотнет 8
Вот как выйдет - перекачу.
Я с телефона через iChan, у меня навигатор как белая простыня выглядит.
Нормальная хуйня. Но я бы подумал над реализацией с участием делегатов и замыканий. Гораздо же прикольнее когда код за тебя компилятор генерит.
Потому что 132 миллисекунды.
Потому что пишут. Просто это все местячковая хуйня.
Ну и плюс - управляемый код - всегда медленнее аналогичного натива. Майки вот пытались полностью управляемую ОС нахуярить. В результате - решили, что нахуй надо.
>среда разработки весит, на минуточку, 60 гигабайт
Ты ёбу дал, жабадебил?
VS Code 600MB
Android Studio 1.75GB
Это при том, что в первой можно для всего подряд код писать, а во второй только для андроида.
А теперь съеби в свой убогий тред.
Да понял я что нинужно, шарпопсине нужно только то, что копрософт с лопаты скормил. Пынято-принято.
Забей, у него всё что на джаве написано медленная и нинужная хуита, его даже разница в скорости джавы с петушарпом в 26 раз не пробила. Необучаемая порода, таких только пуля в лоб вылечит.
Он же сказал, что есть. Просто это как с сусликом.
1280x720, 0:03
>переписал заново функцию из linq под свою конкретную задачу
>сравнил это с двумя строчками джавы, работающими из коробки
>ДЖАВА ОБОСРАЛАСЬ! А ЕЩЁ ДЖАВА ЧЕТИРИТ!
)
>ДЖАВА ВЫЕБАЛА ПЕТУШАРП НЕ НА ШИШКУ, А НА ПОЛШИШЕЧКИ! ПЕРЕМОГА!!!
Я же говорю, его только пуля в лоб исправит.
>Забей, у него всё что на джаве написано медленная и нинужная хуита, его даже разница в скорости джавы с петушарпом в 26 раз не пробила. Необучаемая порода, таких только пуля в лоб вылечит.
Да вы заебали, как попугаи повторяете хуйню про 26 раз.
Это не сравнение джавы и шарпа, а сравнение виртуалок литкода для джавы и для шарпа плюс методов измерения времени выполнения. Нам совершенно неизвестно, что там под капотом, поэтому делать какие-то выводы из этого вообще нельзя.
Бенчмарки должны выполняться в одинаковых условиях, причём не просто на одном железе, а ещё и желательно на одной ОС.
Я знаю, ты мне на это ответишь, что у меня бугурт, и что я порвался, потому что аргументов у тебя нет.
Потому что все есть. Просто так же - нахуй никому не надо.
На шарпе, вон, был охуенный проект для работы с USB-стиками. Попенсорс, все дела. Ну, и чела просто заебало, что он пишет, китайцы - берут его код, тащат себе, закрывают, и только и делают, что срут ишью. А майкам - не уперся проект. Чела заебало за просто так делать - забил.
Была охуеннейшая Нэнси(не околосистемный уровень, но топовая хуйня), которую в эмбеддед даже некоторые тащили, за легкость и удобство. Нахуй никому не упала среди крупных игроков эта Ненси, оно и померло.
БД -так же делатся. Нахуй никому не нужны, по причинам - что это велосипед от хуй пойми кого.
Есть нанофреймворк - куда уж системнее-то? Нахуй никому не нужен, людям проще с ардуино разобраться и им пользоваться. Потому что там считай свой шарп, свой набор стандартных либ и вообще - отъедать половину памяти ПЗУ под рантайм - такое.
Блинб, а я бы тебя обнял. Тяжело же вам с ним...
Он ведь завтра ещё какую хуйню найдёт и будет верещать ещё пол треда.
>Я знаю, ты мне на это ответишь, что у меня бугурт, и что я порвался, потому что аргументов у тебя нет.
Своё поведение проецируешь?
Вон выше шарпоблядун делал бенчмарки. На маленьких массивах, с разным временем прогона, неизвестно ещё, загружал ли он ПК дополнительно в момент тестирования джавы (например, сидением на сосаче), и вместе со всем этим... получил обоссывание джавой ебала петушарпа с разницей в 3 раза, и, ВНЕЗАПНО, объявил это великой перемогой, заявив, что джава слабо ебёт. Достичь уровня джавы удалось ему только через несколько часов пыженья и переписав заново (!) тестируемую функцию linq.
>>прокаченный блокнот
>>по весу как полноценная IDE
>)
Десяток плагинов, и по функционалу vs code начинает превосходить ту же android studio, так что не надо тут про блокнот.
Ты андроид студией не пользовался нормально, потому так и говоришь, да?
У меня ВС 2022 занимает 4.5 гига. 60 - это, наверное, если поставить вообще все пакеты для разработки на всех языках под все платформы.
Я не понимаю, как шарподауны могут на полном серьёзе гордиться, что их выебали всего на полшишечки. Особенно когда эти полшишечки в наиудобнейших для них условиях, а требования провести нормальный тест, хотя бы на больших массивах, они игнорируют.
Опять выебали всего на полшишечки! Да что ж такое-то! У джавы, наверное, импотенция, раз всю шишку вставить в нашу гордую жопу не может!
Ты какой-то странный. Когда vs code меньше весит, чем android studio, ты только выиграл, а когда vs больше, чем idea, ты опять только выиграл.
Так ты может покажешь, где есть, вместо того чтобы рассказывать какие-то охуительные истории про usb и нанофреймворки?
Я разве говорил что-то про перемогу андроид студии своим весом? Ты может свои фантазии при себе оставишь?
А что ты от меня хочешь? Я не знаю, как производительность жабы замерять, я последний раз проект на жабе запускал под виндой 15 лет назад в универе.
Меня это не ебёт. Ты хочешь доказать, что увеличение массива ничивонидастяскозал, ты и проводи тесты, чтобы это доказать.
Примите и успокойтесь
1 леткодовцы обосрались со своими тестами получив разницу в 20 раз ибо тупо дали сожрать jit кусок кода. Разница всего в 3 раза за счет работы с итератором, а не напрямую массивом
2 Да, майки не сделали оптимизацию под массив. Для него "все есть список" (хотя в принципе и могли ибо они столько выкатывают для хайперфа, а про старое забыли) поэтому разница 3 раза на массивах и есть.
Велика ли эта разница? кому велика берет один из фастлинков и прописывает его юсинг (благо теперь есть глобалюсинг). Остальным же насрать - ибо этих виртуальных вызовов через интерфейс в обычном коде миллионы, а заниматься преждевременной оптимизацией зло
в ГОНОВОБОСРАННОЙжаве ура ура сделали оптимизацию для массивов. ну молодцы че. А вот гет сет делается через сторонний проект лобок.
таков путь жавы как говна
Кому парит - запилите иссуйку на этот тред и спросите "доколе в стандартной имплементации не будет оптмизации под массивы" и может появится.
и хватит тред утяжелять.
Я был.
Ты читать учись. Тут претензия к функционалу блокнота, а сравение не с андроид студией, а с идеей.
Это ты хочешь доказать, что там будет больше разница, вот ты и доказывай.
А я утверждаю, что это синтетическая хуйня, потому что в реальной жизни с массивами целых чисел, тем более с огромными, ни в джаве, нив шарпе работать не приходится.
Я не говорю, что будет больше. Я говорю, что тест невалиден, так как в литкоде засовывались большие массивы (это прямо написано в constraits), а шарподебил тестировал на массиве в 10 элементов и даже так умудрился отсосать в 3 раза.
Ну я и говорю, только выиграл. То, что у VS функционала куда больше, чем в IDEA, тебя же не смущает.
И что такого в этом говне есть того, что нет в IDEA (кроме убогого дизайна из 2005, который вот-вот недавно только в бете поправили)?
>VS функционала куда больше
Чел не надо. Ты совершаешь ошибку, не лезь блять на идею. Ни один обсосанный копилот и прочие поделки рядом даже не стояли с ее возможностями.
Какие нахуй возможности? Идея даже собрать проект под ант не в состоянии без пердолинга, даже если все для сборки установлено. Половину GoToDefinition не работают на древних проектах и вообще.
Для сравнения - студия, спокойно обновляет проект с 3,5 до последнего 4,8, тебе остается только то что деприкейтнуло было исправитьна более свежие аналоги.
>Идея даже собрать проект под ант не в состоянии без пердолинга, даже если все для сборки установлено.
Блядь, ты хоть сам-то понял, что высрал?
>Половину GoToDefinition не работают на древних проектах и вообще.
Всё прекрасно работает. Если у тебя что-то не работает то проблема в твоих клешнях, а не в идее.
>Идея даже собрать проект под ант не в состоянии без пердолинга
Это ты тот шиз, что в тред залетал? Пользуйся мавеном, какой ант нахуй? Ты еще скажи, что а чому кобол не робит.
>Половину GoToDefinition не работают
Ты бы хоть показал на каких не робят.
> с 3,5 до последнего 4,8,
Че?
>пик
О, наконец шарписты догадались этот сайт принести. Судя по нему, гц жабы ебет. Также как и строки.
>Пользуйся мавеном, какой ант нахуй?
Тут даже дело не в том, что ант это легаси, а в том, что идея никакого отношения к сборке не имеет и не должна иметь, так как система сборки на то и система сборки, чтобы быть независимой от окружения и сред разработки. Дегенерат похоже даже не знает, что собирать можно и через консольку.
скрины с тестами и их результатами и кодом до сих пор в треде
можешь, облизнув очередную порцию говна в руке, внимательно их изучить
Найдешь недочеты? выслушаю
нет - ты говноед ебучий, иди нахуй
я понятно пояснил? вроде даже такой идиот, как ты, должен понять.
Твои тесты доказали только то, что ты измерял не то же самое, что литкод. Высер про jit это твои маняфантазии. Претензии к качеству теста тоже были выше, будь добр поискать, хотя-бы в своей голове, потому что ты их уже видел, но ответил "ничивонипаминяитсяяскозал!".
> Кому парит - запилите иссуйку на этот тред и спросите "доколе в стандартной имплементации не будет оптмизации под массивы" и может появится.
Я про свой реальный опыт использование идеи говорю.
Вот, древний проект. Начали его еще в 2003м году. В 2016м(или 18м уже не помню) ушел последний чел, что занимался. Последние версии - писались в нетбинсе. Система сборки - ant
Все что надо для сборки - есть на рабочей машине.
Возникла задача по этому проекту. Жавистов нет, но шарп же почти жава. Кто смелый - го.
Идея - просто не хочет собирать, еще и половину внешних зависимостей красным подчеркивает.
Нетбинс - хотя бы собрал.
Короче. Мой опыт - идея хрень, нетбинс - заебумба.
>>909229
Да, это я залетал. И у меня не было времени, чтобы учиться вашим мавеном пользоваться.
> Ты бы хоть показал на каких не робят
Как я покажу закрытый код-то? Все под NDA. Я как-то запостил на дваче сниппет с рабочего проекта - так мне потом безопасник месяц мозги ебал, что я нарушаю NDA, что пиздец, сядешь, и я с тобой, что не углядел. Короче, нахуй и в пизду эту хуйню.
>>909234
Я-то знаю, что собирать можно через консольку. Только меня вот тута убеждали, что ставишь идею, и все само собой, нихуя делать не надо, все скачает и вообще - это прям пиздец какая крутая иде, житбрейнсы какие молодцы. А в результате? А в результате - хрень какая-то, еще и всратая.
литкод вообще не показал что измерял
может он ковырялся пальцем в жопе и потом нюхал и оценивал степень вонючести
как знать.
Для того, чтобы сказать, что виновата идея, ты должен
А) Успешно собрать через консоль
Б) Показать, что этот же загруженный проект в идее с её правильными настройками (т.е. те же данные, что введены были в консоли, должны быть введены и в идею).
Если у тебя через консоль не собирается — виновата точно не идея (либо проект кривой, либо нетбинс как-то анально билдил так, что не понятно, как без него собрать). Если через консоль собирается, но в идею введено не всё из команды, которой собирал — виноваты твои клешни.
Во-первых не отменяет ничего из сказанного мной. Во-вторых в поле constraints прямо сказано то, что ты должен был понюхать, но не понюхал.
Почему я должен этой анальной эквилибристикой заниматься? Я похож на пердоликса? Я шарп-то выбрал в свое время, потому что можно из панельки инструментов было на форму кнопочки перетаскивать и получить графическое приложение с кнопочками, окошками, табличками...
>Почему я должен этой анальной эквилибристикой заниматься?
Потому что ты хочешь доказать, что виновата идея. И это никакого отношения к джаве не имеет, это то, что нужно сделать для строгого доказательства.
И это еще не нормальный замер через бенч либу с прогревом жита, а рабоче крестьянский. Но мне лень заморачиваться потому что система сборки и менеджмент либ в вашем джавадебильном мире это просто пиздец.
Ну а кто тогда виноват, если эксперимент буквально:
Беру и вытягиваю проект из SVN в папочку. Открываю идеей, она говорит - заебумба, я все поняла, сейчас скачаю это-это-это, пожди. Жду. Чет качает. Потом - все красное и не собирается.
Беру и вытягиваю заново проект в другую папочку. Открываю нетбинсом. Он чет думает какое-то время. Потом - все работает.
По мне не надо плодить сущности.
Нет, это не говорит, что виновата идея.
Один из вариантов, почему может быть так:
>либо нетбинс как-то анально билдил так, что не понятно, как без него собрать
Ещё один вариант: в проекте лежит папка настроек нетбинса, и ты сравниваешь ненастроенную идею с настроенным нетбинсом.
Чтобы доказать, что эти варианты невозможны, ты должен провести тест с консолью и показать ввод всех настроек от туда в идею.
Долбоебина, у меня в массиве 2000 упорядоченных чисел, с границами от -2000 до 2000. Это то что пихает в методы твой обоссаный литкод и твой обоссанный дурачок с ютуба с которым ты прибежал.
Я тебя, обезьяна, еще раз спрашиваю, какие могут быть МИЛЛИСЕКУНДЫ на таком объеме?
Ааааа. Сложна. Мне проще думать, что идея - кривая, а нетбинс- заебумба.
Значит что-то другое различается, мань. Например, массив там не один, а 1000 разных, и это запускается 1000 раз.
Нет, там надо вернуть максимум из числа положительных или отрицательных
https://leetcode.com/problems/maximum-count-of-positive-integer-and-negative-integer/description/
То есть если негативных больше - возвращаешь число негативных
У долбаеба в видео, с которым прибежал джавадебил, график построен на основе высера литкода, лол.
Я уже второй день ору, что существуют такие макаки. Причем у него в профиле гитхаба https://github.com/codereport указано что он работает Research Scientist в НВИДИИ.
БЛЯДЬ ХАХХАХАХАХАХХАХАХАХАХАХХА
это пиздец, индустрии пиздец
А твой долбаеб братишка из НВИДИА говорит - https://github.com/codereport/LeetCode/blob/master/Problem%20327P1/0327_Problem_1.cpp - что он выполняется 29 миллисекунд
Сук насколько же это смешная хуйня...
>Значит что-то другое различается, мань. Например, массив там не один, а 1000 разных, и это запускается 1000 раз.
ну то есть леткоде не предоставил как он делает тесты
и может реально ковыряет пальцем в жопе и замеряет время.
>Во-первых не отменяет ничего из сказанного мной.
Может. Ты должен доказать, что ковырялся пальцами в жопе он, а не ты, проведя нормальные тесты. Иначе это высер и яскозал. Почему твои тесты ненормальные уже было сказано, до сих пор не предоставил нормальные сравнения джавы и петушарпа, зато на котлине и плюсах всё сделал, ведь за победу плюсов над петухлином не так страшно, да?
Как бороться с набуханием в штанах, когда я вижу плюсовый код?
Это же не нормально. У меня есть няшный шарпик. Иногда - задачки по JS. Но стоит подумать о плюсах, как в штанах набухает, сразу воспоминание о вузе, и о том, как плюсы - ебали меня жестко без смазки, а на попытки понять что не так - иди нахуй, дебил. Ух. Бля. Самые сильные эмоции от кодинга - это ебля с плюсами. Как же мне этого почему-то не хватает.
>А может там вот так!
>А может там так!
А может пошел ты нахуй, дурачок со своей джавапарашей и со своим литкодом из треда?
Там всего три условия, обмудок. Если твой помойный литкод даже не может показать КАКИЕ данные он прогоняет и СКОЛЬКО РАЗ, то рожала его такая же тупорылая макака, как и тебя.
Все, попущен с четкими и твердыми цифрами, свободен.
еще один все понял.
я доказал. я проверил LINQ и Stream со своими данными (дополнительно защита от jit) и увидел разницу лишь в 3 раза, а не в 20.
И я ни код ни данные ни результат не прятал как леткоде
На картинках все видно
Можешь изменить данные так чтобы разница стала в 20 (и не виноват был jit) - вперед. Иначе ты говноед без пруфоф который может только орать "ви все вретте, жава говно но вкусное"
где они не соответствуют?
пруфы в студию?
впрочем даже если бы там был чистый рэндом - я говорю про ОТНОСИТЕЛЬНОЕ время
итоговое время было бы другое, но отношение сохранилось бы. и оно было не в 20 раз лол.
>ви все вретте, жава говно но вкусное
Так это же буквально ты. Получил результат джавы в 3 раза быстрее, но оправдываешь это какой-то абстракцией (которая и на джаве есть и производительности не мешает, но это тактично проигнорим).
Вот твой последний тест со сравнением джавы и петушарпа. Тут отчётливо виден один массив на 16 элементов.
>и оно было не в 20 раз лол
Так надо было, чтобы джит пробежался и векторные инструкции вставил. Или вообще вырезал все циклы. Че ты как этот. Если в шарпе нет жита, это не повод говорить, аррррря читы
А ещё тут видно, кстати, что я с первого раза не заметил, совершенное незнание шарподауном основ бенчмаркинга и принципа blackhole и лишний += умноженный на миллион. Без него результаты бы совсем неинтересные получились для шарподебила.
>которая и на джаве есть
как понять что жавист пиздит? он открыл рот
НЕТ НЕТУ. в этом примере жава работает именно с int[], без асбтракций
когда я сделал то же самое для шарпа - заставил работать с int[] - жава пук пук
>>909357
откуда мне знать как в вашем говне делается бенч. я же сказал - я просто загуглил. но += ни на что не влияет дядя. он есть и там и там
а консуме просто не позволяет сожрать житу
измени код - я поменяю такое же на шарпе и ты снова обосрешься.
Не надо подменять тезисы. Ты говорил про пользу этой абстракции для разработчиков. Разработчики легко могут пользоваться интерфейсом Iterable и им не мешает какая-то конкретная реализация Arrays.stream().
Тут в принципе только одно оправдание этого было, и оно было через абстракцию. Этого достаточно, но — примечательно — от человека со стилем письма крайне похожим на твой.
мой стиль - там где я жависта поливаю говном (буквально) и там написано в скобочках что майки могли бы сделать оптимизацию для массивов
так если видишь жава - эт не я
если говнообосраннаяжава - эт я
Это ты еще не познал как охуенно писать на шарпе плюсовый код и местами обгонять сами плюсы за счет жита
Вот например продложая обоссывать джавадебила, снова смотрим на решения для плюсов от дурачка из видео - https://github.com/codereport/LeetCode/blob/master/Problem%20327P1/0327_Problem_1.cpp
Это у него самое быстрое решение за 15 миллисекунд
int maximumCount(vector<int>& nums) {
auto [a, b] = std::equal_range(nums.begin(), nums.end(), 0);
return std::max(
std::distance(nums.begin(), a),
std::distance(b, nums.end()));
}
Все верно - действительно самое быстрое - только за 100 НАНОСЕКУНД, ебло тупое
Идем сюда - https://en.cppreference.com/w/cpp/algorithm/equal_range и смотрим, что же такое equal_range - ага, ясно тупа бинарка. Хз кстати почему микрософт не положил тоже самое в коробку
1. Пишем тоже самое на шарпе (для задачи можно на самом деле считерить и юзать на плюсах только lower_bound, о чем дурачок из НВИДИА видимо не знал, ну а хуле ему ученому)
2. Прогоняем бенч
3. Орем с 20 наносекунд и джавадебила
да, мне абсолютно нехуй делать на выходных, шарпаны
Забыл прикрепить плюсовое время
Претензия к блекхолам это просто шутеечка над дауном. Суть в 16 элементах, что ты исправил везде, кроме двух сравниваемых языков.
что тебе не нравится в 16 элементах говножуй?
я могу взять оригинальный массив с леткоде, но он слишком маленький поэтому я его нарастил в 2 раза.
Нет, джавадебил, мне просто легче было держать файлик с числами на рабочем столе. Расслабься, джавадебил, я все равно не смогу замерить джаву, после котлина мне уже больно от вашей уебищной системы сборки и менеджмента пакетов.
Ну раз не сможешь, то ладно. Не больно-то и хотелось.
Кстати, ебать это костыль получается. Чисто виндовый причем.
Уёбищные только твои клешни. Система сборки на джаве лучшая среди всех других языков (если ты конечно решил собирать мавеном, а не дегенерадлом).
меньше пустых слов
выдай массив
выдай код на жаве
я измерю и жаву и шарп на одной машине
и даже не буду в этот момент писать какой ты говножуй.
> Пользуйся только моей любимой системой сборки, тогда все будет классно!
Джавадебил, мне чтобы прогнать собрать любой современный дотнет проект требуется только выполнить dotnet build. А в вашем чудесном джавадебильном мире начинается виляние жопой для миллиарда одинаково уебщиных систем сборки, по итогу нихуя все равно не соберется.
Здесь самое смешное, джавадебил, что ты уже сам срешь бенчмарками шарпа, разобравшись с ними за пару минут ладно за пару часов, ведь ты обезьяна - это очередное доказательство дружелюбности няшного шарпика и инфраструктуры.
Но все равно иди отсюда нахуй.
>А в вашем чудесном джава мире
maven clean install.
>Здесь самое смешное, джавадебил, что ты уже сам срешь бенчмарками шарпа, разобравшись с ними за пару минут ладно за пару часов, ведь ты обезьяна - это очередное доказательство дружелюбности няшного шарпика и инфраструктуры.
Лечись, шиз. Я как-то попытался один раз установить среду разработки для шарпоговна (как раз чтобы написать бенчмарк, но это было не сейчас, а где-то месяц назад), так охуел с 60 гигабайт и больше не притрагивался к этому.
и сколько раз в цикле это повторять? Без цикла оно будет мгновенным. ладно сделаю 1000
хотя я противник использования стат массивов как поле класса.
>60 гигабайт
Клевый пиздеж, джавадебил. Но ведь райдер весит всего пару гигов, а студия гигов 5-6, если ставить только дотнет.
Не говоря уже о том, что можно кодить прямо в VS Code ведь у шарпа есть нормальный LSP.
Короче, шизоид, ты можешь жрать древнюю как говно мамонта джавапарашу сколько тебе влезет, но зачем ты пытаешься убедить нас в том, что это вкусно?
Один раз. JMH позволяет не пользоваться циклами и измерять хоть наносекунды. JMH сам будет это гонять в течении нескольких минут, чтобы имитировать реальную работу.
Я установил вижлу — увидел хуй. Непонятно, как создать проект и куда что писать. На джаве есть жирная кнопка "СОЗДАТЬ ПРОЕКТ" и когда её нажимаешь, то создаётся проект с Hello World и можно поменять код и писать что-то своё. То же самое было когда я пробовал плюсы в плюсовой иде. А на вижле что нашёл это предложение ставить какие-то модули по 5 гигабайт. Я загуглил, сколько вообще надо такого качать и мне выдало 60 гигов в гугле. Ну я и закрыл нахуй это ебаторию.
Согласен, джавадебил?
> Напоминаю что большинство анончиков категорически против регулирования срачей в языковых тредах
Ссылку на опрос можно?
Ты таким макаром только петушарпу дал преимущество в 10 цпу циклов на измерение.
Опрос несколько раз вбрасывался в МВП-тред и висел в шапках языковых тредов. Вроде в шапке МВП тоже висел. Всем поебать. Кому не поебать те против. Не нашлось ни одного человека за.
Братишка, джавадебил, ты хоть напиши какая система сборки и чо куда пихнуть чтобы спейсы идеа увидела.
А то смешной такой, написал в шарповом проекте
<ItemGroup>
<PackageReference Include="BenchmarkDotNet" Version="0.13.10" />
</ItemGroup>
насрал нам в тред и сидит довольный
А мы то твое говно как запустить должны?
Ну как бы для этого есть первый тест. Типа вычесть. Тащемта мне интереснее тестбокс.
Отлично, ты главное не сливайся, джавадебил. А то мне еще разобраться надо как эту хуйню запустить.
Понятно, я там не сижу прост.
когда массив не изменяется, да еще стат поле джит может доказать что массив не изменяется
и тогда вместо реального вычисления захардкодит результат.
в итоге просто битва джитов.
Ну вообще исходя из моего опыта чем ниже тем быстрее. Да и вообще этот пом из какой-то хуйни взят.
Один не может принять очевидную, блять, всем истину, что LINQ медленное говно на итераторах, за использование которого в действительно критичных к производительности участках кода на код-ревью в нормальных командах просто обоссут.
Второй же пришёл в тред просто срать и набрасывать дерьмо на вентилятор. Если бы хотел что-то более-менее конструктивно обсудить, то принёс бы сразу ссылку на репозиторий с исходниками бенчей, чтобы достопочтенные аноны сами всё запустить и во всем убедиться.
P.S. Ещё более комичным этот срач делает то, что о производительности спорят адепты двух языков,
в которых большинство разрабов в своих энтерпрайзных болотцах с проблемой недостаточной производительности кода, скорее всего, никогда не столкнутся, так как их код большую часть времени тупо ждет ответа от БД/других сервисов. А если и столкнутся, то бизнес скажет забить и просто оплатит дополнительные ресурсы, так как новые фичи нужны были ещё вчера.
Братишка, джавадебил, почему твоя крутая идеа и система сборки не может просто скачать зависимости как нюгет?
Чо делать, давай рассказывай
>>909467
>>909469
Опрос говно.
На самом деле все языкосрачи нужно вынести в отдельный закрепленный бесконечный тред (как в свое время сделали в gd с их "юнитидебилы vs все_остальные_дебилы" темой), а в остальных тредах банить за срачи. Причем в первую очередь тех, кто ведется и начинает отвечать на заведомо разжигающие посты.
А циклы-то как улучшат ситуацию? JMH, вроде, контроллирует JIT, чтобы ненужные оптимизации не производил, по крайней мере по моему опыту можно просто в @Setup написать генерацию и пользоваться этим.
дык все равно будет через неделю перекот.
и во втором ты ошибся. я как раз адепт хайперфа и лично меня от многих вещей в шарпе где забыли сделать нормально корежит.
Как вариант сделать поле с массивом public volatile и в начале каждого теста присваивать его локальной переменной. Так jit хуй что докажет.
Еще можешь плагин этот скачать. Чтобы тыркать из иде сразу.
И узнай есть ли атрибут который помечает метод как подготовку, которую он выполнит перед бенчем, как наш шарповый GlobalSetap
Или можно ещё сделать второй тест, в котором сразу будет возвращаться захардкоженное значение, чтобы удостовериться, что jit ничего не переоптимизировал.
Не ну это джексон в зависмоти надо пихать. А нахуй там жсон вообще? Че csv уже усе?
>в @Setup написать генерацию и пользоваться этим.
А вот этим кодом я генерировал массив
Random random = new Random();
List<Integer> list = new ArrayList<>(2000);
int current = -2000;
for (int i = 0; i < 2000; i++) {
current = current + random.nextInt(0, 5);
if (current >= 2000) break;
list.add(current);
}
System.out.printf("new int[] {"+String.join(", ", list.stream().map(int_ -> Integer.toString(int_)).toList())+"}");
Да я таким же шарповым генерил, маня. Вопрос в том что он одинаковый должен быть для жавы и шарпа, поэтому читаем из файла. Ладно жди, почекаю как прочитать регуляркой
> Непонятно, как создать проект и куда что писать
Серьезно? Давайте тредом поможем найти кнопку создать проект.
> На джаве есть жирная кнопка "СОЗДАТЬ ПРОЕКТ"
Действительно, жалко что в студии такой нет. Какая беда...
но я не адепт невнятных заклинаний
в дотнетбенч как настроить показание времени
вот us это что такое? наносекунды? уткосекунды? что это блин.
Микросекунды. Долбоёб, это официальное обозначение СИ (или не СИ, но не менее используемое).
Это дефолтная студия 2022, единственное я решарпер накатил. Я даже настройки не открывал, т.к. на этом компьютере 99% времени в 2012 студии сижу. Для 2022 студии у меня другой компьютер.
Тем не менее у меня ничего не было. Судя по тому, что я из того окна как-то попал в окно загрузки модулей, мне предложило их там скачать.
>неудобными
Вот максимум (для тех, кто всю жизнь в проприетарном notepad++ кодил). Но никак не некрасивыми.
Я чё, шарпоблядь и ебу, как там чё делать?
дотнет не хочет работать долго. он работает 13 секунд и все.
при этом жава долбит 5 минут с разогревами и прочим.
как по мни битва джитов
Там усреднение значения идет. Джит псевдорандомом убрать можно.
Давай дотнет настраивай, тут куча шарпистов.
У вас нет что ли возможности настроить прогревы и итерации?
Ну если ты галочку "Разработка на C#" когда студию ставил, то сорямба, я олигофренопедагогикой бесплатно не занимаюсь, попробуй читать что в окнах написано.
>>909567
К сожалению все IDE после 2008 студии пиздец уродливые. Уже 2010 была блевотной, дальше было только хуже. Идея была рождена хуёвой. Я если что много какими IDE пользуюсь, т.к. халтуры гоняю и на жабе, и на плюсах, и в принципе на чём попросят, и датагрипом пользуюсь когда васянку приходится пилить. Идея просто меньшее из зол, у джавадебилов все IDE даунские. Подписка на все продукты жидбрейнс у меня очень древняя, с 2017 до окончания работы жидбрейнс в России им платил.
>>909572
> Даже с этой парашей?
А смысл? Косячен сам design language жидбрейнсов, там в общем лечить особо нечего, надо выкидывать и заново делать.
>с 2017 до окончания работы жидбрейнс в России им платил
А вообще пользуюсь очень давно, сколько пиратил уже не помню. В 2012 купил первую легальную на распродаже в честь конца света.
Не поставил. У меня слова из головы выпадают к сожалению. Последствия долгого веслания.
есть конечно. только мне некогда долго это гуглить
короче, я заебался разбираться в незнакомой мне теме.
как по мне идентичный код хоть и время выполнения в разы
жава - 1,967 микросекунды после 5 минут страданий
шарп - 6,9 микросекунд после 13 секунд тестов.
исследование выяснило, что основное время жрет предикат (ну то есть вызов через делегат). жава отлично его встроила (если не вовсе выбросила), без делегата время шарпа 2.4 микросекунды
так что тут если я ничего не накосячил (а это легко), жава победила
однако мы помним что любим шарп не за скорость, а уж за что обсираем жаву - напоминать не нужно.
ну и то что это битва джитов, ведь почему не встроился делегат как прямой вызов со временем? хз, может этого времени не хватило, ну сколько там было тех вызовов.
Загружай шарповый проект на гитхаб. Сам проведу тесты. Должна быть разница в 26 раз.
>Я не знаю что это такое даже.
А ты воображение включи. Что выглядит как Word 2010, но в чём можно писать код?
>однако мы помним что любим шарп не за скорость, а уж за что обсираем жаву - напоминать не нужно.
Да вас уже во всём обоссали, осталось последнее "джава зато медленная!", и это обоссано было.
В среднем ультрасовременная джава лоб в лоб у меня на 30% быстрее ультрасовременного шарпа на корректных тестах при одинаковом коде (плюс-минус синтаксис). Хуй знает почему так. Толку от этого особого нет, стоит столкнуться со вводом-выводом как начинается джаваотсос и она делает изо всех сил вид что не тормозит, при этом шарп отлично переживает асинхронную параллельную грязь на шестидесятичетырёхпоточном процессоре.
>>909622
Не охота воображение включать. У меня вообще нет ни одной программы с риббонами кроме офиса. Офис кстати майковский охуенный, очень советую, куда лучше остальной дрисни.
>Да вас уже во всём обоссали
Ты штаны забыл снять когда писил, джава это архаичная тупая дрисня, можно на си писать, тоже очень быстро будут даунские программы в виде laba1 работать. Или на голованге.
Ну обсуждали же пару месяцев назад не по перформансу, а по выразительности, что закончилось полным обоссыванием пятаков шарподебилов.
Он, вероятно, вообще не параллелил джава код, потому что асинк/авейт имеет огромный оверхед (в котлине вон там до x10 от обычного кода код с корутинами выполняется), и выигрывает только в сравнении с вообще нераспаралелленным кодом. Даже не на виртуальных потоках джава бы победила, если бы код был параллельным.
Странно. По мне так шарп быстрее должен быть. Там чуть ли не векторные инструкции и асм вставки можно хуярить.
язык это не только рантайм. это и синтаксис и потребляемая память. В жаве с первым жопа - решает сторонний проект лобок,
(да и не все решает. как он решает вопросы корутин (асинк/авайт))? а никак.
со вторым ПОЛНАЯ жопа в принципе. Продукты на жаве требуют дохуища памяти.
тот же котлин обладает в разы лучшим синтаксимом и работает на том же jvm кстати. И там лобки никакие не нужны и корутины из коробки.
на андроиде жаву задвинул в полную жопу. целую жаву. и никакие лобки не спасли
питон вон вообще медленный но чет вытеснил жаву из многих сфер. подумай почему.
смекаешь?
почему в жаве до сих пор свойства пишут всякие лобки, а не родные средства жавы? разрабы жавы вас ненавидят? видимо да.
Я не пробовал виртуальные треды, но ожидаю что там при реализации "в лоб" будет просто комичный отсос потому что когда тасок больше сотни надо чётко очень им приоритет ставить. Если сделать 10000 тасок, каждой дать виртуальный тред и запустить их на выполнение то там просто пиздец будет. Жду в целом бенчей на реальных задачах. Переходить на джаву в производительных проектах не планирую.
>>909647
Обсуждали пару месяцев назад, предложили литкод изи решить на стрим апи. Джавадебилы не осилили. Какой-то хуесос всю ночь не мог успокоиться и визжал про ломбок, я аж устал его обоссывать. Потом он объявил что победил, никто с ним особо спорить не стал - он и так уже всех заебал. В целом спорить с джавадебилами невозможно даже если сам более или менее пишешь на джаве, т.к. мозг там напрочь атрофирован.
мне влом
держи пастебинку
если ты жавист шарпист ты знаешь что там куда пихается. там немного файлов будет
https://pastebin.com/ch9kythf
>(да и не все решает. как он решает вопросы корутин (асинк/авайт))?
Кому нахуй нужен загрязнитель языка и дублятор методов? Асинк авейт это литералли компромисс за счёт синтаксиса, который шарпобляди за неимением альтернатив возносят из зрады в перемогу.
>потребляемая память
Память стоит дёшево и масштабируется легко. А процессор мощнее мощнейшего не купишь. Тратить процессорное время в угоду памяти это дебилизм.
>надо чётко очень им приоритет ставить.
Ебать проекции. В луме даже такого понятия как приоритет нет.
> асинк/авейт имеет огромный оверхед
Ты конечно же покажешь по этому поводу код который можно посмотреть, или просто опять кукареку?
А че в шарпе каждой таске можно приоритет назначить и шедулер там настолько ебейший, что все это учтет?
В этом и проблема что нет никакого смысла делать поток (даже виртуальный) в котором описана вся логика. Нужно делать целую кучу маленьких тасочек-этапчиков, и у тебя должны тасочки-этапчики вылетать из очереди на выполнение и потом залетать обратно в очередь следующим этапчиком. В этом никак не помогут зелёные треды. Правда от асинк-эвейта тоже толку мало, он в другом месте нужен абсолтно и в моём понимании с зелёными тредами не конкурирует. С зелёными тредами конкурирует тредпул который есть во всех языках со времён палеозоя. И он сосёт.
Кого ты там обоссал? Ты даже не смог ответить, как на петушарпе конструктор по параметрам сделать и не писать этот ебучий бойлерплейт каждый раз для каждого класса. Или как например повесить {get; set} на весь класс.
Даёт обёртку для работы с массивом как со стримом. Выполняется за константное и очень быстрое время.
>В этом и проблема что нет никакого смысла делать поток (даже виртуальный) в котором описана вся логика. Нужно делать целую кучу маленьких тасочек-этапчиков, и у тебя должны тасочки-этапчики вылетать из очереди на выполнение и потом залетать обратно в очередь следующим этапчиком.
Пруфы будут или потому что тыскозал?
Ты нахера выкинул код боксинга? Он как бы пребразовывал массивы так, чтобы использовался Iterable. Чтобы вы не выли про читерство.
>Кому нахуй нужен загрязнитель языка и дублятор методов
хз о чем ты. есть базовые вещи типа того же гет сет. эти вещи элементарно было сделать сахаром, но ХЕР
А так - код должен писать компилятор, а не программист или сторонняя тулза
>Асинк авейт это литералли компромисс за счёт синтаксиса
так то то простая и удачная концепция которая ПОТОМ во многие языки перекочевала. И только жава в отстающих.
>Память стоит дёшево и масштабируется легко
ага. а потом сидишь и тюнишь жвм с ее GC чтобы все это ворочалось ибо нагрузка на гц пиздец. С переменным успехом.
>>909650
потому что асинк/авейт имеет огромный оверхед
имеет, но не огромный поскольку не равен TPL с его тасками, а другая структура
Это не читерство, а оптимизация.
>хз о чем ты. есть базовые вещи типа того же гет сет. эти вещи элементарно было сделать сахаром, но ХЕР
>А так - код должен писать компилятор, а не программист или сторонняя тулза
То есть ты на претензию к дебильности асинк/авейта отвечаешь уже давно решённой проблемой джавы с гетсетами? Умно, умно.
>ага. а потом сидишь и тюнишь жвм с ее GC чтобы все это ворочалось ибо нагрузка на гц пиздец. С переменным успехом.
Проснись, ты серешь. ГЦ в джаве никто не тюнит, его тюнят разработчики самой джавы. Ты просто выбираешь, если у тебя куча меньше 16 гб, то стандартный, если больше, то generational shenandoah, который даже на кучах с 128 гб паузы меньше миллисекунды держит в в целом отъедает очень мало перформанса (конкретные цифры говорить не буду, так как не знаю их).
>имеет, но не огромный поскольку не равен TPL с его тасками, а другая структура
Что ты высрал? Тебе тесты оверхеда дали.
Я честно не вижу тут никакого асинк/эвейт. Дальше не вникал, мне вечером выходного дня лень. Неси тест асинк/эвейт про который ты говорил.
>>909686
Скорее всего тебя и обоссал. Я тебе довольно подробно описал почему нужно этот код писать (нажимая иногда Tab) и чем плоха неявная генерация, и почему ей никто в шарпе не пользуется. Мне сейчас лень с тобой сраться, я на x2 с тех пор ушёл, обустраиваю дунасинг на новых сотыгах и мне не до холиваров.
>>909691
Пруфов не будет, я наоборот заинтересован в том чтобы конкуренты писали дрисню на лум и делали сосамбу, мне платят за то чтобы были высокие конкретные интересные бизнесу метрики, а сравнивают эти метрики с конкурентами. Для моей задачи есть формальное математическое обоснование (которое я никому разумеется не показываю), если хочешь такое же то начни копать планировщики процессов в пакетных системах. Скорее всего чтобы удовлетворить любопытство тебе Таненбаума хватит, но я его читал невероятно давно и не помню там я про них впервые узнал или нет.
>решённой проблемой джавы с гетсетами? Умно, умно.
решенную проблему? а ну покажи мне в спеке жавы что там с гет сетами. Ничего. значит нахуй
СТОРОННИЕ вещи не предлагать.
стороннего может быть чего угодно. стороннего я могу вообще котлин взять и хуять рядом с жавой.
>>909708
>Проснись, ты серешь. ГЦ в джаве никто не тюнит, его тюнят разработчики самой джавы.
да ты мне расскажи ага )))
>>909709
где дали кто дал? пост в студию.
Так ты тесты на котлин привёл. Конечно на JVM это хуёво работает, она не поддерживает потому что такое нативно. Если бы можно было сделать чтобы поддерживала нормально, то давно в жабе были бы асинх/эвэйт и это было бы сверхновой фичей и преимуществом жавы перед всем подряд.
> Я честно не вижу тут никакого асинк/эвейт. Дальше не вникал, мне вечером выходного дня лень. Неси тест асинк/эвейт про который ты говорил.
Это петухлиновский асинк/авейт.
>Скорее всего тебя и обоссал. Я тебе довольно подробно описал почему нужно этот код писать (нажимая иногда Tab) и чем плоха неявная генерация, и почему ей никто в шарпе не пользуется. Мне сейчас лень с тобой сраться, я на x2 с тех пор ушёл, обустраиваю дунасинг на новых сотыгах и мне не до холиваров.
Да, ты рассказал, что сидеть в классах с говном очень хорошо. Только если ты муха. Других аргументов ты не предоставил, просто повторяя раз за разом "ниявная генерация! магия! ниизкаропки!", и ни разу о том, чем это плохо.
>Пруфов не будет
Слив принят. Дальнейшие оправдания, почему слился, не интересуют. Итог: джава выебала петушарп и в асинхронщине, а с виртуальными тредами разрыв стал ещё больше.
>Кому нахуй нужен загрязнитель языка и дублятор методов? Асинк авейт это литералли компромисс за счёт синтаксиса, который шарпобляди за неимением альтернатив возносят из зрады в перемогу.
На который ответа не поступило.
>Аргументы, чем это плохо будут
приписывать жаве заслугу не жавы это тупо идиотизм
я ж говорю - я могу так котлин приписать как заслугу жавы
типа видели котлин на андроиде - так это жава же охуенная)
опять видео. не. в этом раз не хочу
в жопоковырянии леткодовцев разобрались, мне работать нужно
>>909724
> Слив принят
Да ради бога, я даже не пытаюсь с тобой спорить, ты по 10-15 раз в день свою победу в споре объявляешь а потом опять влетаешь и опять споришь, видимо победа была не особо убедительной.
>>909730
Если вкрации, то поддержка кооперативной многозадачности. Асинхронный шарп это химера, в нём многозадачность одновременно работает и кооперативная и вытесняющая. Джава работает за счёт вытесняющей многозадачности. Это пытаются пофиксить лумом. Но это далеко не во всех задачах поможет, если поможет вообще.
>>909747
Чтобы понять почему так, тебе нужно понять как работает внутри асинк/эвейт. Это не недостаток синтаксиса, это требование механизма который лежит под этим механизмом языка.
>Да ради бога, я даже не пытаюсь с тобой спорить
Так зачем ты отвечаешь мне тогда? Просто нравится урину на ебальник принимать?
>ты по 10-15 раз в день свою победу в споре объявляешь а потом опять влетаешь и опять споришь, видимо победа была не особо убедительной.
Насколько я помню свои последние "слив принят", темы спора были разные. А если начинается повторение старой хуйни, как сейчас, я просто цитирую результаты предыдущих споров (по крайней мере, что запомнил от туда).
>Если вкрации, то поддержка кооперативной многозадачности.
И каким образом кооперативная многозадачность фиксит отключённый инлайнинг в раздробленной функции, из-за которого и происходит падение перформанса в 5 раз (ещё в 2 раза из-за непосредственного таскания объектов continuation, как раз которые можно оптимизировать за счёт нативов)? Хуйню не неси.
>требование механизма который лежит под этим механизмом языка.
Ну значит в петушарпе сделали не хуёвый асинк/авейт, а хуёвый механизм добавили, который вынудил добавить асинк/авейт. Лучше стало?
>>требование механизма который лежит под этим механизмом языка.
>Ну значит в петушарпе сделали не хуёвый асинк/авейт, а хуёвый механизм добавили, который вынудил добавить асинк/авейт. Лучше стало?
Раньше было всё на коллбеках как сейчас в жабе. Но потом майки поняли, что коллбеки -- это уёбищно и завернули в сахарок эвейта. А в жабе всё так и осталось на коллбеках.
Да какое откровение, код на коллбеках читать невозможно, спагетти длиннющие образуются. Особенно учитывая, что в большинстве случаев после асинхронной операции ничего не больше не делается, а весь дальнейший код уходит в коллбек.
И тут у тебя либо бойлерплейт с создаваемым объектом, реализующим интерфейс, и методом в нём (и отступом на несколько шагов вглубь), либо вообще продолжение вынесено в другое место, что ещё хуже.
К слову, в шарпе даже коллбеки, где ещё есть, делегатами делаются, а не объектами-обработчиками. Меньше кода, меньше отступов, проще читать.
лол. минимальный синтаксический сахар это говночмо уже выдает за "да это же киллерфича"
Причём здесь киллерфичность ломбока? Ты предъявлял к использованию ломбока в принципе, тебя обоссали по этому.
и предъявляю. это не заслуга жавы, а заслугал ее УБОГОСТИ что появилась необходимость рождения сторонней тулзы
и даже эта тулза просто добавляет НЕКОТОРЫЙ сахар
а не решает фундаментальные проблемы
конечно щас жава наконец то немного взялась за ум, ну так какой год уже. так то и жс (который говно по своей сути) стал получше
и даже пхп обрел зрелость какую никакую.
так что обоссали тебя, дебича, который заслугу СТОРОННЕГО ПЛАГИНА (дающего некоторый сахар, не более) приписывает к фичам самого языка
Ну-ка, напиши мне веб запрос без коллбека.
request.execute(new AsyncHandler<Object>() {
@Override
public State onStatusReceived(HttpResponseStatus responseStatus)
throws Exception {
return null;
}
@Override
public State onHeadersReceived(HttpHeaders headers)
throws Exception {
return null;
}
@Override
public State onBodyPartReceived(HttpResponseBodyPart bodyPart)
throws Exception {
return null;
}
@Override
public void onThrowable(Throwable t) {
}
@Override
public Object onCompleted() throws Exception {
return null;
}
});
Это не коллбеки что ли?
В шарпе это будет просто var result = await request.Execute(), а потом вся дальнейшая обработка ответа.
Заворачиваем в try catch и ловим и обрабатываем ошибки в catch.
Всё идёт подряд, код легко читается и в целом понятен. А в жабе глазами туда-сюда прыгать приходится; а если какой-то умник сделал не анонимный объект обработчик, а целый класс в отдельном файле, то совсем пиздец.
request.execute(new AsyncHandler<Object>() {
@Override
public State onStatusReceived(HttpResponseStatus responseStatus)
throws Exception {
return null;
}
@Override
public State onHeadersReceived(HttpHeaders headers)
throws Exception {
return null;
}
@Override
public State onBodyPartReceived(HttpResponseBodyPart bodyPart)
throws Exception {
return null;
}
@Override
public void onThrowable(Throwable t) {
}
@Override
public Object onCompleted() throws Exception {
return null;
}
});
Это не коллбеки что ли?
В шарпе это будет просто var result = await request.Execute(), а потом вся дальнейшая обработка ответа.
Заворачиваем в try catch и ловим и обрабатываем ошибки в catch.
Всё идёт подряд, код легко читается и в целом понятен. А в жабе глазами туда-сюда прыгать приходится; а если какой-то умник сделал не анонимный объект обработчик, а целый класс в отдельном файле, то совсем пиздец.
Ну что ты братишка джавадебил, как поживаешь? А то я чуть не умер разбираясь с вашим джаваговном. Что братишка, джавадебил, ты думал я не смогу залезть в доку и чекнуть зачем нужна черная дыра твоей мамаши?
Кстати, хорошая либа, братишка. Первый вармап быстрее чем все остальные, хотя должен быть сильно медленнее, как и у шарпа, ведь дам компайл. Ну да ладно, не буду придираться, джавадебил. Либу ведь тоже писал джавадебил.
идеа дает срать в консоль пока в нее срет процесс, бля...
>Даёт обёртку для работы с массивом как со стримом. Выполняется за константное и очень быстрое время.
То есть джавапараша со специальной оберткой (читай спецом написанным кодом небось прямо в джите) работает СТОЛЬКО ЖЕ сколько линк который просто ездит по энумераторам?
Пиздец...
Джавадебил, мне видос записывать?
Ты че блять издеваешься? Консьюм цпу сжигает процессорное время. А все возвращаемое из теста и так попадет в блэкхол. Хуево чекнул.
>То есть джавапараша со специальной оберткой
У тебя бокс. Значит нет спец обертки. Короче вы друг друга стоите. Вам бы поебаться.
Сука, попросил тесты написать, взял и своими культями все испортил.
Ну извини, джавадебил, у меня от вашего говна уже моск потик, перепутал метод. Извини. Вот тебе новый честный прогон.
Разрушительная победа джаваговна правда с помощью в ручную написанного кода, еще небось и с векторизацией над линком, шарписты всем покинуть тред
Благодарочка тебе за то что взял эстафету обсирания жависта (а то мне некогда ведь работать нужно)
Но у меня linq отстал в перфомансе
У него тоже, ну как видишь. Хотя вам бы нормальные бенчи под шарп написать, а то че они несколько секунд-то работают.
Жаваговно
А, еще как варик это потестить. Так-то первая итерация, где не было бокса должна быть самой быстрой. С боксингом наиболее медленная, а это по середине, наверное. Но хз, как на самом деле, конечно.
Ты пидор.
Ток с шапкой обосрался, а моча не реагирует на репорты
Перекатывайтесь или пусть тонет, хз
Моча поправила можно перекатываться
Вы видите копию треда, сохраненную 3 января в 21:08.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.