C# 8 дотнета тред #54 /csharp/ # OP 3002293 В конец треда | Веб
Постновогодний тред лучшего языка на планете.

1. Ресурсы:
https://dotnet.microsoft.com/learn
https://ru.stackoverflow.com/a/416585/422180
https://github.com/dotnet
https://github.com/quozd/awesome-dotnet
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://dotnet.microsoft.com/en-us/apps/games/engines

5. С# для мобильной разработки
https://docs.microsoft.com/ru-ru/dotnet/maui]

Шапка: https://pastebin.com/HT7Hi6FD
Предыдущий: >>2920885 (OP)

ВНИМАНИЕ, в тред повадился срать джавадебил. Шарпочане, игнорируйте, а лучше репортите. Главное - не кормите.
2 3002344
Джавадебилы смачно соснули с проглотом.
3 3002354
>>02344
Как там дела с работой на сишарпе? Когда уже продадите кабанчикам новый кросплатформенный c# 3000 который конечно же лучше джавы?
4 3002503
>>02354
отлично с работой. пишем на последнем шарпе, а на старой жава которую "нельзя обновлять у нас тут все ыньтырпрайз и все сломаица"
5 3002798
>>02354

>новый кросплатформенный c#


Да как нехуй делать. Пришел в середине 22-го года работать в контору. Был комплекс работающий на виндовых серверах, МССКЛ-е и на Core2.1.
Кабан сказал: "Ебать-ебать, надо импортозамещаться. Линукс-хуинукс, другая БД, очереди и вот это все".
Мы: "Ок, но надо поднимать до .net6, обновлять все фреймворки и т.д. Ну и на тайпскрипт до кучи. Иначе не заработает"
По итогу спокойно все перепилили и кайфуем. В этом году думаю и до .net8 очередь дойдет.
6 3002865
Я вот тоже захотел игру сделать.
На подобии кликера. Ну там грабить корованы, но только в 2д.
Хорошая ли идея использовать Blazor? Я не совсем понимаю как это все должно работать на фронте.
Представляю себе так: blazor webassembly. На экране у юзера происходят действия, проигрывается анимация, юзер что то нажимает что то делает. При действиях кторые происходят редко например покупка чего то отправляются http запросы на сервер. А вот при нажатиях, например при игровых кликах, сборе чего либо, на клиенте происходит сбор этой информации и отправка её пачками например раз в 10 секунд. Так как мне кажется держать открытым подключения например в SignalR очень затратно и обрабатывать сервером ебищем кликов, хуй с ним 1 человек, а если 100 человек и каждый кликает.
И вот у меня вопрос, стоит ли ебатся с blazor webassembly ? Или взять например pixijs и на нем сделать клиент а серверную сторону уже на C#?
Я просто хз эти javascripты.
изображение.png75 Кб, 640x677
7 3002908
Пытаюсь реализовать чистую архитектуру + cqrs. Такой вопрос: можно ли в слой Application добавлять сторонние библиотеки, например: FluentValidation, мапперы там всякие? Я читал, что туда лучше не лепить всякие зависимости и т.д. Щас полистал githab и там кто как реализует. Кто-то ставит библиотеки в Aplication слой, кто-то нет я уже успел туда FluentValidation поставить. В общем я запутался...
8 3002923
>>02798

>импортозамещаться. Линукс-хуинукс, .net6


Обосрался.
9 3002933
>>02865

>А вот при нажатиях, например при игровых кликах, сборе чего либо, на клиенте происходит сбор этой информации и отправка её пачками например раз в 10 секунд.


Практически всё надо проводить через сервер, иначе у тебя моментально заведутся читеры.
Не надо заниматься преждевременной оптимизацией, дотнет может спокойно десятки, если не сотни, тысяч запросов в секунду обрабатывать. Пиши всё как есть, оптимизировать будешь, когда поймут проблемы.
10 3002940
>>02933
Но с этим то ладно, а что с выбором blazor webassembly ?
Нахуй его и на pixijs сделать?
11 3002945
>>02940
Я не компетентен в этом вопросе. Жди, пока кто-то другой ответит.
12 3002958
>>02908
По чистой архитектуре - у тебя вообще в Application не должно быть внешних зависимостей. Только логика и интерфейсы какие-то, которые будут на инфраструктурном слое реализованы(всякие там IZalupaRepository и прочее).
Единственная нормальная зависимость - это доменный слой, который уже точно ни от чего не зависит.

Логика-то всей этой херни в чем. Твой слой приложения - не должен зависить ни от фреймворка, ни от библиотек, ни от слоя доступа к данным. Ты должен иметь возможность - без лишних телодвижений взять и заменить всё, что не относится к логике. Если у тебя начинают появляться зависимости - тебе, если ты решишь сменить какую-то либу, придется изменять и Application.

Другое дело - иногда чисто следовать всем заветам чистой архитектуры - сложно. А иногда - не нужно, в контексте того, что проект не настолько здоровый, чтобы в случае надобности - переписать нужные куски.
13 3002961
>>02908

>можно ли в слой Application добавлять сторонние библиотеки


Как архитектор скажет, так и будет.

>я уже успел туда FluentValidation поставить


Ну ты там и так уже насрал засунув контракты в Application, так что одним говном больше, одним меньше.
14 3002966
>>02958
>>02961
Спасибо. Завтра переделаю. Проект крохатный.
15 3003173
Кто шарит за WPF

Как в DataGrid сделать по простому триггер чтобы при изменеии текста в какой-то ячейки в последнем столбце вставлялся текст?

То есть что я хочу - есть три столбца. пользователь меняет текст в ячейке и теперь в последнем столбце должен проставится чекбокс чтобы визуально было видно что вот в этой строке было изменение.
Хочу по умному через триггеры, а не говнокодом.
16 3003208
джава лучше сисясарпа
/тхеад
2024-01-1512-59-14.png45 Кб, 745x760
17 3003473
>>03173

>сделать по простому


По простому — вещь относительная. Если у тебя подготовлена инфраструктура, то будет просто, а если нет, то делай через события.

Если ты делал все по MVVM-паттерну, то ты можешь в своей модели, являющейся строкой таблицы, реализовать интерфейс IChangeTracking.
Он по сути заставит твою модель реализовать булевое свойство IsChanged, к которому и будет привязываться твой чекбокс, сигнализирующий об изменении.

А дальше ты в нужных свойствах модели в блоке set указываешь
IsChanged = true;

Далее, как я понял встанет вопрос о сбросе флага, если к примеру база данных будет сохранена. Поэтому интерфейс помимо IsChanged требует реализовать метод AcceptChanges(), который сбрасывает флаг IsChanged до дефолта т.е.
public void AcceptChanges() => IsChanged = false;

Аналогичный вопрос на so:
https://stackoverflow.com/questions/2363801/what-would-be-the-best-way-to-implement-change-tracking-on-an-object

Как я понял, чтобы все флаги резетнуть при сохранении базы данных, нужно будет пройтись по всем экземплярам и запустить AcceptChanges(). Я не эксперт, но выглядит как хуйня.
1. А что если у меня каждое свойство должно иметь свой собственный идентификатор? Т.е. я должен выводить каждое такое свойство в отдельный класс, реализующий IChangeTracking.
2. Мне не нравится, что надо каждый раз обходить все данные, чтобы сбросить флаг.
3. Что если возникнет такая ситуация:
- В базе данных число 356
- Пользователь вводит число 128, и флаг IsChanged меняется на true
- Пользователь снова вводит число 356
В таких случаях маркер изменения должен сброситься т.к. оно равно исходному значению.

Почему к примеру не создавать временную точку при изменении данных ячейки? И создать точку сохранения базы данных. Далее какой нибудь мультибиндинг сравнивает обе временные точки и выдает булевый вердикт — являются ли данные новыми или нет.
Мне кажется, что такой вариант экономичнее, но у меня нет практики, чтобы утверждать подобное.
2024-01-1512-59-14.png45 Кб, 745x760
17 3003473
>>03173

>сделать по простому


По простому — вещь относительная. Если у тебя подготовлена инфраструктура, то будет просто, а если нет, то делай через события.

Если ты делал все по MVVM-паттерну, то ты можешь в своей модели, являющейся строкой таблицы, реализовать интерфейс IChangeTracking.
Он по сути заставит твою модель реализовать булевое свойство IsChanged, к которому и будет привязываться твой чекбокс, сигнализирующий об изменении.

А дальше ты в нужных свойствах модели в блоке set указываешь
IsChanged = true;

Далее, как я понял встанет вопрос о сбросе флага, если к примеру база данных будет сохранена. Поэтому интерфейс помимо IsChanged требует реализовать метод AcceptChanges(), который сбрасывает флаг IsChanged до дефолта т.е.
public void AcceptChanges() => IsChanged = false;

Аналогичный вопрос на so:
https://stackoverflow.com/questions/2363801/what-would-be-the-best-way-to-implement-change-tracking-on-an-object

Как я понял, чтобы все флаги резетнуть при сохранении базы данных, нужно будет пройтись по всем экземплярам и запустить AcceptChanges(). Я не эксперт, но выглядит как хуйня.
1. А что если у меня каждое свойство должно иметь свой собственный идентификатор? Т.е. я должен выводить каждое такое свойство в отдельный класс, реализующий IChangeTracking.
2. Мне не нравится, что надо каждый раз обходить все данные, чтобы сбросить флаг.
3. Что если возникнет такая ситуация:
- В базе данных число 356
- Пользователь вводит число 128, и флаг IsChanged меняется на true
- Пользователь снова вводит число 356
В таких случаях маркер изменения должен сброситься т.к. оно равно исходному значению.

Почему к примеру не создавать временную точку при изменении данных ячейки? И создать точку сохранения базы данных. Далее какой нибудь мультибиндинг сравнивает обе временные точки и выдает булевый вердикт — являются ли данные новыми или нет.
Мне кажется, что такой вариант экономичнее, но у меня нет практики, чтобы утверждать подобное.
18 3003493
>>03173
Ты занимаешься какой-то хуйней. Твоя строка таблицы биндится к какому-то объекту. При изменении текста изменится проперти этого объекта, вот там в сеттере и поменяй другое проперти, к которому ты забиндил чекбокс.
изображение.png16 Кб, 455x153
19 3003591
Почему при onklick="FetchData" все работает, а при простом вызове FetchData() вылезает ошибка?
20 3003788
>>03591
дык потому что
21 3003947
>>03591
Какая ошибка?
22 3003960
>>03947
Что за глупые вопросы
2024-01-1521-33-32.png441 Кб, 618x339
23 3004050
>>03788
>>03960
Рядовой "Шутник"?
24 3004315
>>04050
ну автор первоначального вопроса не посчитал нужным указать что там за ошибка, значит ему и решение ошибки не нужно. Так что глупо спрашивать его об ошибке
25 3004612
Используете вы операторы верхнего уровня?
Я вообще не могу воспринимать код с ними. у меня какая-то агрессия и зубы скрипят
26 3004617
>>04612
Нахуя и ваще придумали и кому это надо?
Ну мб всем надо а я просто не выкупил прикола?
27 3004647
>>04617
Эту хуйню придумали, чтобы код был похож на нодежс. Я не шучу. Когда дотнет стал терять популярность, какому-то менеджеру пришла в голову охуительная идея: давайте будем писать как на ноде, тогда все бросят ноду и перекатятся в дотнет. Ведь на ноде пишут только потому, что там нет void Main, в этом вся причина.
28 3004651
>>04612
>>04617
Ну типа, чтобы было легко для начинающих, но на самом деле запутывает и дезориентирует. Все равно приходится знать то, что скрыто. Уже миллион раз на это дерьмо попадался, когда не понимаешь почему не работает, пока тебе не расскажут как это работает под капотом.
29 3004773
>>03591
Потому что петушарп.
30 3004807
>>04612

>Используете вы операторы верхнего уровня?


Нет. В IDE по умолчанию стоит "Do not use..."
31 3004887
>>02798
Импортозмещение с дотнетом? Перешли на продукт российского офиса майкрософт?
32 3004944
>>04887
Импортозаместились опенсорсом как и все вокруг. Откуда столько вони?
33 3005056
У меня опять вопрос про архитектуру. Вот в этом видосе https://youtu.be/tZ8gGqiq_IU?list=PLzYkqgWkHPKC-n4ehnzcgkHJxd7bC-8gW&t=1194 чел пихает в доменный слой библиотеку ErrorOr. Библиотека написана на базовых классах .net, то есть её можно самому написать при желании. Можно ли в таком случае пихать библиотеку в доменный слой?
34 3005059
>>04887

>Импортозмещение с дотнетом?


Проект и так на дотнете был, просто на Core2.1, что по меркам шарпа уже легаси. Просто подняли версию до самой свежей LTS на тот момент.
Импортозамещать нужно было все остальное, что требует лицензий.
35 3005066
>>05056

>Можно ли в таком случае пихать библиотеку в доменный слой?


Хуй знает, такое себе. Я классы с ошибками в слой контрактов запихиваю всегда. Почему чел на видео так же не сделал - хуй знает, тем более что у него есть в проекте Contracts, плюс ошибки не связаны с сущностями. Может какие-нибудь DDD заморочки мешают это сделать.
Алсо, слегка обзмеился с библиотеки. Кто-то явно решил выебнуться и вместо общепринятого Result и его производных, обозвать свой тип ErrorOr. Хотя может это и я отстал от тенденций.
36 3005071
>>05066
Этот ютубер и есть автор ErrorOr. А вот библиотеку в домен я класть не буду, выглядит странно, особенно когда прочитал, что в доменный слой вообще зависимости класть хуёво.
37 3005999
Вас не заебало из раза в раз приходить в джава тред и уходить в урине?
38 3006116
>>05999
У говноеда жабоида галлюцинации
39 3007610
Есть свойство А, при изменении которого меняется свойство B. При этом при изменении свойства B должно меняться свойство A.

Как такое разруливается?
40 3007625
>>07610
Меняй приватные поля которые стоят за свойствами
изображение.png45 Кб, 698x186
41 3008381
Пожалуйста помогите, где здесь я допускаю ошибку?

Я пытаюсь сформировать ссылку с параметрами, и получить данные из этого запроса.

Если я просто указываю
("https://api.battlemetrics.com/servers/6803740")
все работает. Но последние цифры идут от пользователя, т.е. это переменная.

С нижеприведенными параметрами httpClient.GetFromJsonAsync код становится не рабочим.

("https://api.battlemetrics.com/servers/" + nums)
($"https://api.battlemetrics.com/servers/{nums}" )
42 3008413
>>08381
Сука, какое нахуй может быть желание помогать если в проблемах "пук среньк не работаит", а не исключение с стэктрейсом
43 3008574
Да как в этом ебаном wpf реализовать нормальную mvvm навигацию...
44 3008739
>>08574
Нужно во-первых разобраться какого рода у тебя контент.

У тебя может быть модель для каждой страницы. Соответственно, каждая страница имеет свой уникальный тип.
К примеру у тебя страницы настроек приложения: CommonSettings, AppearanceSettings, KeyboardSettings.
Все эти страницы могут иметь общий интерфейс, к примеру IMySettings.

Далее, у тебя во вьюмодели есть свойство текущей страницы
IMySettings CurrentPage, куда ты и кидаешь экземпляр нужной страницы. Как ты это будешь делать на стороне вьюмодели — твое дело. К примеру это можно сделать при помощи команды, которая извлекает из словаря страниц нужную по строковому названию. Это название передается кнопкой команде при помощи CommandParameter.

Еще раз. Кнопка во вью вызывает команду ChangePageCommand с параметром CommandParameter="AppearanceSettings". Команда ищет в словаре страниц экземпляр модели IMySettings по ключу "AppearanceSettings" и пихает в свойство CurrentPage энтот экземпляр.

А что дальше? А дальше ты создаешь во вью ContentPresenter, к которому к свойству Content привязываешь свойство CurrentPage из вьюмодели. Но ничего не произойдет (максимум отобразит тип текущего экземпляра в CurrentPage), потому что ContentPresenter не понимает каким образом эти данные отображать.

И тут в игру вступают шаблоны данных, или DataTemplate.Эти шаблоны ты настраиваешь в своем ContentPresenter, каждое каждое вью соответствует определенному типу модели.
К примеру ты создаешь CommonSettingsPage : UserControl, который будет соответствовать типу CommonSettings.

<DataTemplate DataType="{x:Type models:CommonSettings}">
<views:CommonSettingsPage />
</DataTemplate>

И так далее для всех страниц. С этого момента ContentPresenter уже автоматом подбирает соответствующую вью под текущий экземпляр модели в CurrentPage.

Собсно вот, это простой пример.
2024-01-1820-04-48.png14 Кб, 529x537
45 3008752
>>08739

>ContentPresenter


Точнее ContentControl. Я их вечно путаю.

Его обычно используют, когда речь заходит о шаблонах данных. Он может отобразить элемент в единственном экземпляре.

Есть еще ItemsControl, который позволяет вывести список разношерстных данных. К примеру так устроено окно свойств в вижуал студии. Посмотри на прикрил. Окно не знает что в него впихнут и в каком порядке. Тут настроен шаблон данных не для всей страницы, а для каждого типа: double, string, Brush, Thickness, CornerRadius и т.д.

Далее список просто отображается в соответствии с шаблоном каждого итема. Там же можно настроить группировку, сортировку, поиск и т.д.
46 3009729
Почему конвертер Point отказывается использовать культуру при парсинге строки?

Скрин 1. Я создал вьюмодель с тестовыми свойствами разного типа: Double, Thickness, Point
чтобы показать, что проблема только с Point
Скрин 2. Я создал вью и привязал данные вью модели. Тут два блока. В первом я привязал данные как есть, без редактирования культуры. Во втором блоке я привязывался к тем же значениям, но с указанием конкретной культуры: ru-RU.
Собсно на превью окна слева можно заметить, как разделители поменялись. Т.е. конвертация всех значений в string отрабатывает нормально.

Далее я запускаю приложение и пытаюсь изменять значения в каждом текстбоксе. Первый блок (тот, что без изменения культуры) по всем трем значениям отрабатывает хорошо. Во втором блоке без проблем обратно конвертируют Double и Thickness. А вот Point выдает исключение (в окне указал красным проблемный элемент):

System.Windows.Data Error: 7 : ConvertBack cannot convert value '36,6;48,7' (type 'String'). BindingExpression:Path=TestPointValue; DataItem='MainViewModel' (HashCode=48832851); target element is 'TextBox' (Name=''); target property is 'Text' (type 'String') FormatException:'System.FormatException: The input string '6;48' was not in a correct format.
at System.Number.ThrowOverflowOrFormatException(ParsingStatus status, ReadOnlySpan`1 value, TypeCode type)
at System.Convert.ToDouble(String value, IFormatProvider provider)
at System.Windows.Point.Parse(String source)
at System.Windows.PointConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, Object value)
at MS.Internal.Data.DefaultValueConverter.ConvertHelper(Object o, Type destinationType, DependencyObject targetElement, CultureInfo culture, Boolean isForward)
at MS.Internal.Data.SourceDefaultValueConverter.ConvertBack(Object o, Type type, Object parameter, CultureInfo culture)
at System.Windows.Data.BindingExpression.ConvertBackHelper(IValueConverter converter, Object value, Type sourceType, Object parameter, CultureInfo culture)'
46 3009729
Почему конвертер Point отказывается использовать культуру при парсинге строки?

Скрин 1. Я создал вьюмодель с тестовыми свойствами разного типа: Double, Thickness, Point
чтобы показать, что проблема только с Point
Скрин 2. Я создал вью и привязал данные вью модели. Тут два блока. В первом я привязал данные как есть, без редактирования культуры. Во втором блоке я привязывался к тем же значениям, но с указанием конкретной культуры: ru-RU.
Собсно на превью окна слева можно заметить, как разделители поменялись. Т.е. конвертация всех значений в string отрабатывает нормально.

Далее я запускаю приложение и пытаюсь изменять значения в каждом текстбоксе. Первый блок (тот, что без изменения культуры) по всем трем значениям отрабатывает хорошо. Во втором блоке без проблем обратно конвертируют Double и Thickness. А вот Point выдает исключение (в окне указал красным проблемный элемент):

System.Windows.Data Error: 7 : ConvertBack cannot convert value '36,6;48,7' (type 'String'). BindingExpression:Path=TestPointValue; DataItem='MainViewModel' (HashCode=48832851); target element is 'TextBox' (Name=''); target property is 'Text' (type 'String') FormatException:'System.FormatException: The input string '6;48' was not in a correct format.
at System.Number.ThrowOverflowOrFormatException(ParsingStatus status, ReadOnlySpan`1 value, TypeCode type)
at System.Convert.ToDouble(String value, IFormatProvider provider)
at System.Windows.Point.Parse(String source)
at System.Windows.PointConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, Object value)
at MS.Internal.Data.DefaultValueConverter.ConvertHelper(Object o, Type destinationType, DependencyObject targetElement, CultureInfo culture, Boolean isForward)
at MS.Internal.Data.SourceDefaultValueConverter.ConvertBack(Object o, Type type, Object parameter, CultureInfo culture)
at System.Windows.Data.BindingExpression.ConvertBackHelper(IValueConverter converter, Object value, Type sourceType, Object parameter, CultureInfo culture)'
47 3009733
>>09729
Ах да, если я в последний текстбокс буду вносить данные как если бы там не была указана культура, то ошибки обратной конвертации не возникнет.

Т.е. вместо '35,6;48,7' я буду писать '35.6,48.7' то будет все норм.
2024-01-1913-25-10.png48 Кб, 902x428
48 3009809
>>09733
Ну и в чем я не прав?
49 3010005
>>09733

>Т.е. вместо '35,6;48,7' я буду писать '35.6,48.7' то будет все норм.


Попробуй 35.6;48.7 ради эксперимента
50 3010056
>>08381
не пробовал просто строку в отдельной переменной конкатнуть затем кинуть в запрос?
2024-01-1918-17-13.png22 Кб, 816x401
51 3010213
>>10005
Не работает. Нужны символы InvariantCulture.

При этом в Thickness принцип тот же и все распознается.
Основная проблема в том, как распознается разделитель данных на основе культуры. Пытался посмотреть исходник, но там что-то мудреное из internal классов.
изображение.png71 Кб, 570x430
52 3010248
>>10056
Пробовал, та же картина.
53 3010255
>>10213
Зачем используется какой-то там TokenizerHelper, если сепаратор списка можно получить так:
cultureInfo.TextInfo.ListSeparator
.png19 Кб, 551x239
54 3010609
>>08381
УМВР
55 3011633
Подскажите либу распознавания речи для нет кора. Главное чтобы была мультиязычность. Гуглю и то ли гугл стал особенно плохо релевантное выводить либо этих либ нет, поэтому спрашиваю у анона
56 3011640
>>11633
Машин лёрнинг модели, тысячи их ёпта.
https://huggingface.co/models?pipeline_tag=automatic-speech-recognition&sort=trending
Парсинг сайта 57 3012768
Объясните нубу, пожалуйста, почему у меня вывод не как на пикче 1 получился, а как на пикче 2?

static void Main()
{
//

Dictionary<string, List<List<string>>> result = Parsing(url: "https://www.readfootball.com/tables.html");
if(result != null)
{
foreach(var item in result)
{
Console.WriteLine(item.Key);
Console.WriteLine("___________________________");
item.Value.ForEach(r=> Console.WriteLine(string.Join("\t", r)));
Console.WriteLine(item.Value);
}
}

}

private static Dictionary<string, List<List<string>>> Parsing(string url)
{
try
{
Dictionary<string, List<List<string>>> result = new Dictionary<string, List<List<string>>>();
using (HttpClientHandler hdl = new HttpClientHandler {AllowAutoRedirect = false, AutomaticDecompression = System.Net.DecompressionMethods.Deflate | System.Net.DecompressionMethods.GZip | System.Net.DecompressionMethods.None })
{
using (var clnt = new HttpClient(hdl))
{
using (HttpResponseMessage resp = clnt.GetAsync(url).Result)
{
if (resp.IsSuccessStatusCode)
{
var html = resp.Content.ReadAsStringAsync().Result;
if (!string.IsNullOrEmpty(html))
{
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);

var tables = doc.DocumentNode.SelectNodes(".//div[@class='block_content']//div[@class = 'two-table-row']//div[@class]");
if(tables != null && tables.Count > 0)
{
foreach(var table in tables)
{
var titelN = table.SelectSingleNode(".//div[@class = 'head_tb']"); //Заголовок таблицы на сайте
if (titelN != null)
{
var tbl = table.SelectSingleNode(".//div[@class = 'tab_champ']//table");
if (tbl != null) //Тут уже берём строки
{
var rows = tbl.SelectNodes(".//tr");
if (rows != null)
{
var res = new List<List<string>>();

foreach (var row in rows)
{
var cells = row.SelectNodes(".//tr");
if (cells != null)
{
res.Add(new List<string>(cells.Select(c => c.InnerText)));
//Console.WriteLine(e);
}
}
result[titelN.InnerText] = res;
}
}
}
}
return result;
}
else
{
Console.WriteLine("Нет таблиц");
}
}
}
}
//Console.WriteLine("Hello, World!");
}
}
}

catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return null;

}
}

Код один в один же написан, что не так?
Парсинг сайта 57 3012768
Объясните нубу, пожалуйста, почему у меня вывод не как на пикче 1 получился, а как на пикче 2?

static void Main()
{
//

Dictionary<string, List<List<string>>> result = Parsing(url: "https://www.readfootball.com/tables.html");
if(result != null)
{
foreach(var item in result)
{
Console.WriteLine(item.Key);
Console.WriteLine("___________________________");
item.Value.ForEach(r=> Console.WriteLine(string.Join("\t", r)));
Console.WriteLine(item.Value);
}
}

}

private static Dictionary<string, List<List<string>>> Parsing(string url)
{
try
{
Dictionary<string, List<List<string>>> result = new Dictionary<string, List<List<string>>>();
using (HttpClientHandler hdl = new HttpClientHandler {AllowAutoRedirect = false, AutomaticDecompression = System.Net.DecompressionMethods.Deflate | System.Net.DecompressionMethods.GZip | System.Net.DecompressionMethods.None })
{
using (var clnt = new HttpClient(hdl))
{
using (HttpResponseMessage resp = clnt.GetAsync(url).Result)
{
if (resp.IsSuccessStatusCode)
{
var html = resp.Content.ReadAsStringAsync().Result;
if (!string.IsNullOrEmpty(html))
{
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);

var tables = doc.DocumentNode.SelectNodes(".//div[@class='block_content']//div[@class = 'two-table-row']//div[@class]");
if(tables != null && tables.Count > 0)
{
foreach(var table in tables)
{
var titelN = table.SelectSingleNode(".//div[@class = 'head_tb']"); //Заголовок таблицы на сайте
if (titelN != null)
{
var tbl = table.SelectSingleNode(".//div[@class = 'tab_champ']//table");
if (tbl != null) //Тут уже берём строки
{
var rows = tbl.SelectNodes(".//tr");
if (rows != null)
{
var res = new List<List<string>>();

foreach (var row in rows)
{
var cells = row.SelectNodes(".//tr");
if (cells != null)
{
res.Add(new List<string>(cells.Select(c => c.InnerText)));
//Console.WriteLine(e);
}
}
result[titelN.InnerText] = res;
}
}
}
}
return result;
}
else
{
Console.WriteLine("Нет таблиц");
}
}
}
}
//Console.WriteLine("Hello, World!");
}
}
}

catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return null;

}
}

Код один в один же написан, что не так?
Двач3.png55 Кб, 1197x918
58 3012776
>>12768
Блять. Вот код в тектовом
60 3012803
>>12776
Хребет бы за такой код ломал
61 3012807
>>12777
>>12776
>>12768
Нашёл проблему. Там было в конце td, а не tr
62 3012813
>>12776
Это троллинг?
63 3012815
>>12803
Что не так, чел не насрал вместо одного метода десяток классов с однострочными методами как дядя хуйло в клин коде завещал?
64 3012821
>>12815
Он насрал миллион скобок.
65 3012823
>>12815
Вот сука первое на что падает глаз это диспоуз хттпКлиента и куча лишней вложенности которая нахуй не нужна
.png139 Кб, 1362x880
66 3012844
>>12768
Я бы как-то так переписал...
67 3012847
>>12844
Все эти continue не нужны, их можно заменить на ?. с финальной проверкой на null. Кроме последнего, его надо просто выкинуть, инвертировав if обратно.
68 3012848
>>12844
блок с tbl можно выкинуть
форич по строкам на линку
69 3012849
>>12847
Точнее последний цикл, где res, надо через Linq переписать.
70 3012850
Если коротко то ты >>12776 учись писать лучше (на старте писать хуёво не зазорно), а ты >>12815 не защищай хуйню
71 3012857
>>12815
много уровней - не знает про инвертирование if
Async().Result - сразу кастрировать
высрал портянку где код делает все - и запрос в сеть и парсинг
грязный метод - срет в консоль вместо кидания ошибки
возращает нулл при ошибке
создает хттпклиент на месте
уебищный шрифт
72 3012858
Бля падаю на самом простом нахой.
Че мне прописать что бы на сайте были категории?
Пример
zlypa.com/bmv/kek.html
zlypa.com/lada/4ebyrec.html
Категории хранятся в бд.
Что поменять или добавить что бы один контролёр отвечал за категории?
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
74 3012866
>>12864
Пишу фронт на блейзере че таково то епт
75 3012871
>>12864
Да я читал это всё, я не могу додуматься как это всё применить.
Собственно по этому тут и спрашиваю
76 3012876
>>12871
а зачем усложнять себе жизнь магическими URI и попыткой их роутинга?
image.png104 Кб, 1116x414
77 3012877
>>12866
Это конечно имхо но фронт спа на чём угодно а бэк уже на шарпах.

>>12871
Могу только в разрезе применения апи написать пример, но я очень сомневаюсь что там есть отличия
78 3012890
>>12876
Ну хочу что бы было так.
Дефолтная же структура сайта site.com/cat/article.html
79 3012896
>>12866

> Пишу фронт на блейзере че таково то епт


То что КАЖДАЯ, блядь, попытка делать фронт на шарпах заканчивается тем, что тебе теперь надо ОХУЕТЬ как изучить как это у майков работает и вникнуть как сделать то что на обычном жс за 2 минуты.

Ну серьезно. Если выходим за круды, а начинаются всякие вебсокеты, какие-то графики динамические, прочее-прочее, ты просто страдаешь, страдаешь. А если приложение еще и раздрастается - тебе приходится кучу хуйни сверху допиливать.

Ну и в результате - каждый раз - проще было писать клиент сразу на чем угодно, но не на шарпе.
80 3012898
>>12890
ну и зря
ты можешь сделать кастом роутинг
но останешься без урлбилдера
81 3012907
>>12898
Да действительно хуйня получится, я тогда не смогу нормально сделать /admin/ , придётся чета снова выдумывать.
Ну сделаю тогда просто контроллер Category
82 3012914
>>12896
Даже не знаю, сейчас после обновы много положительных отзывов слышал о блейзере.
Думаешь стоит учить джава скрипт + фреймоврк тупо для пет проджекта?
83 3013925
Как устроен ссаный биндинг? Кто нибудь пояснит мне?
Вот я привязываю свойство. По каким критериям происходит обновление, если я к примеру в это свойство кидаю новый экземпляр объекта?

И почему в некоторых случаях обновление происходит даже если я меняю свойство внутри объекта, а не объект в привязываемом свойстве?
84 3014111
>>13925
INPC и dp же
85 3014230
>>14111
Вот смотри, у меня есть dp-свойство MyBrush. Туда я помещаю экземпляр GradientBrush.

Потом я беру и в этом экземпляре меняю цвет градиента:
MyBrush.GradientStops[0].Color = Colors.Red;

После чего срабатывает событие изменения MyBrush. Почему?
Я не менял сам MyBrush, я менял свойства находящегося там экземпляра. Я понимаю, если бы я привязался к MyBrush.GradietnStops[0].Color (невозможно, но представим). Тогда была бы хоть какая-то логика: меняется свойство -> вызывается событие связанное с изменением конкретно этого свойства -> обновляются привязки.

И вот твой ответ про INPC и dp становится не таким-то и очевидным. Есть что-то еще, что вызывает события, и самое главное почему привязка на них подписывается?

В классе GradientBrush есть событие Changed, которое и срабатывает при любом внутреннем изменении чего либо, но почему оно влияет на вызов события изменения свойства MyBrush?
86 3014361
>>14230
Тебе бы основы подтянуть, анон. Почитать про то, чем классы отличаются от структур, о передаче по ссылке и по значению
88 3014593
>>02293 (OP)

>https://docs.microsoft.com/ru-ru/dotnet/maui]


даже шапку сделать не можете куда вам с великой джавой тягаться?
89 3014879
>>14593

>>https://docs.microsoft.com/ru-ru/dotnet/maui]


>даже шапку сделать не можете куда вам с великой джавой тягаться?


Жабоёб прям даже не знает до чего ещё доебаться.
90 3016426
>>14386
Прочитал, интересная статья. Там описано, что Freezable переопределяет событие OnPropertyChanged. Теперь я понял почему возникает событие Changed, если я что-то внутри изменил и почему у этого события нет пояснения что конкретно было изменено.

Но я все еще не понимаю кто в биндинге привязывается к событию Changed. Вернемся к моему примеру, я тут подробнее расписал класс:

public class MyClass : INotifyPropertyChanged
{

. . private Brush myBrush;

. . public Brush MyBrush
. . {
. . . . get {
. . . . . . . . return myBrush;
. . . . . }
. . . . . set {
. . . . . . . myBrush = value;
. . . . . . . PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(MyBrush)));
. . . . . }
. . }

. . public event PropertyChangedEventHandler? PropertyChanged;

}

Когда я привязываюсь к MyClass.MyBrush, привязка отслеживает событие MyClass.PropertyChanged, она не отслеживает MyBrush.Changed. Ей должно быть вообще плевать что в MyBrush хранится и что с ним происходит.
Почему, когда я делаю это:
MyBrush.GradientStops[0].Color = Colors.Red;
Срабатывает не только событие MyBrush.Changed, но и MyClass.PropertyChanged?

Надо, короче, запруфать это безобразие.
90 3016426
>>14386
Прочитал, интересная статья. Там описано, что Freezable переопределяет событие OnPropertyChanged. Теперь я понял почему возникает событие Changed, если я что-то внутри изменил и почему у этого события нет пояснения что конкретно было изменено.

Но я все еще не понимаю кто в биндинге привязывается к событию Changed. Вернемся к моему примеру, я тут подробнее расписал класс:

public class MyClass : INotifyPropertyChanged
{

. . private Brush myBrush;

. . public Brush MyBrush
. . {
. . . . get {
. . . . . . . . return myBrush;
. . . . . }
. . . . . set {
. . . . . . . myBrush = value;
. . . . . . . PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(MyBrush)));
. . . . . }
. . }

. . public event PropertyChangedEventHandler? PropertyChanged;

}

Когда я привязываюсь к MyClass.MyBrush, привязка отслеживает событие MyClass.PropertyChanged, она не отслеживает MyBrush.Changed. Ей должно быть вообще плевать что в MyBrush хранится и что с ним происходит.
Почему, когда я делаю это:
MyBrush.GradientStops[0].Color = Colors.Red;
Срабатывает не только событие MyBrush.Changed, но и MyClass.PropertyChanged?

Надо, короче, запруфать это безобразие.
91 3016447
>>16426

>Срабатывает не только событие MyBrush.Changed, но и MyClass.PropertyChanged


не подтверждаю такое поведение.
перечитывется {Binding MyClass.MyBrush - да, но INPC для MyClass не дергается
92 3016852
Сап, уважаемые. Вытянул волчий билет, как думаете ИБ во многих конторах есть?

Мимо опыт есть
93 3016875
>>16447
Зато срабатывает конвертер
Пикрил 1 - мой конвертер, который просто извлекает цвет из второй точки градиента. В методе конвертации и обратной конвертации я печатаю сообщение, сигнализирующее о срабатывании метода.

Пикрил 2 - привязываю градиент из MyBrush к бэкграундам двух прямоугольников. К одному из них привязка осуществляется через конвертер из пикрил 1

Далее видеорил, где я нажатием кнопки меняю вторую точку градиента. Как видно, каждое изменение точки градиента почему-то запускает метод Convert. Разве конвертер не запускается при событии MyClass.PropertyChanged?
94 3016882
>>16447

>перечитывется {Binding MyClass.MyBrush


А как ты это определил?
95 3016887
>>16875
В конвертере опечатка. Там действительно меняется вторая точка градиента, просто скрин взял неактуальный:
return ((LinearGradientBrush)value).GradientStops[1].Color;
96 3017036
>>02293 (OP)
Что делать если мне нравится платформа .NET, но все говорят что он никому не нужен и лучше учить PHP для быстрого вката в индустрию чтобы потом перейти на современный Go?

Решил продублировать тут чтобы узнать мнение у работающих уже на сишарпе.
97 3017083
>>16852
Тебе в МВП
98 3017102
>>16882
Твой Convert пишет потому что Binding MyBrush это бинлинг к фризабле и конечно при любом изменении внутри фризаблы он перечитывается.

INPC у MyClass при этом нерушим - некому его вызывать
99 3017108
>>17036
Ты определись что ты хочешь "работать с тем что тебе нравиться" или "быстро вкатиться". Это немного разные задачи.
>>17036

>но все говорят что он никому не нужен


Кто эти 'все'? Они с тобой сейчас в одной комнате?
100 3017155
>>17102

>Binding MyBrush это бинлинг к фризабле


А какого черта конвертер прилип к содержимому свойства MyBrush, а не к событию MyClass? Ничего не понимаю.

В моем понимании конвертер должен отработать только когда сработает обновление привязки, а оно сработает только если вызовется событие MyClass.PropertyChanged.

Ерунда какая-то.
101 3017199
>>17108
Мне хочется писать на том что нравится, дотнет почти все мои хотелки закрывает. Но и слезть с маминой шеи хочется быстрее.

>Кто эти 'все'? Они с тобой сейчас в одной комнате?


В дискорде)
102 3017226
>>17155

>А какого черта конвертер прилип к содержимому свойства MyBrush, а не к событию MyClass


Смотри же свой биндинг
{Binding MyBrush, Converter={StaticResouce GradientStopCnv}
то есть ты создал биндинг к MyBrush да с конвертером.

>В моем понимании конвертер должен отработать только когда сработает обновление привязки


ты плохо читал статью.

MyBrush будет вызывать INPC и обновление если ты сделаешь MyClass.MyBrush=new(...), потому что сработает INPC у MyClass - то есть классический подход к нотификации

Но MyBrush является Freezable и биндинг подписывается дополнительно на ченжед. И когда ты меняешь что-то внутри MyBrush, то биндинг ловит события ченджед и ПЕРЕЧИТЫВАЕТ свойство MyBrush попутно дергая конвертер, который находится в том же биндинге. А механизм INPC вообще никак не затрагивается.
103 3017233
>>17155
ну и не забывай - кистей не должно быть во вьюмоделях если у тебя они из MVVM
104 3017445
>>17233

>ну и не забывай - кистей не должно быть во вьюмоделях если у тебя они из MVVM


А как же мне хранить настройки, темы и прочее? Почему нельзя хранить?

>>17226

>MyBrush будет вызывать INPC и обновление


INPC это интерфейс, а вызывать будет PropertyChanged, на которое биндинг и подписан. Когда событие вызывается, биндинг смотрит на аргументы события и если там значится имя ожидаемого свойства, то тогда привязка обновляется.

> если ты сделаешь MyClass.MyBrush=new(...), потому что сработает INPC


Вот именно, любое говно, проходящее через сеттер просто вызовет событие. Все еще непонятно про чем тут статус Freezable.

>Но MyBrush является Freezable и биндинг подписывается дополнительно на ченжед.


Вот это я и пытаюсь выяснить. В статье этого факта не увидел. Оказывается идет дополнительная подписка, что вроде как похоже на правду. Но для чего? Все, кто получил экземпляр кисти и так подписан на Changed, а в данном случае в MyBrush интересует только изменение экземпляра.

И еще одна странная особенность. Почему то это не работает с ConverterBack.
Ради эксперимента я связал два свойства через конвертер. В первое свойство помещается экземпляр кисти, далее конвертер получает этот экземпляр в методе Convert, клонирует его и отправляет во второе свойство. Я ожидаю, что если во втором свойстве вызвать событие Changed, то это вызовет метод ConverterBack. Но нет.
105 3017470
>>17445

>Почему нельзя хранить?


потому что вьюмодель ничего не знает о виде. Пиши их держа в уме установку - вьюмодели можно безопасно вынести в сборку, где нет ссылки на System.Windows и другие WPF штуки. Ну и можно в любой момент выбросить WPF и сделать консольный гуи без переделок вьюмоделей

>А как же мне хранить настройки, темы и прочее


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

> проходящее через сеттер просто вызовет событие. Все еще непонятно про чем тут статус Freezable.


вот только ты НЕ вызываешь сеттер, поэтому механизм INPC бездействует. А работает дополнительный механизм подписки на ченджед, который присущ Freezable. Таким образом, биндинг перечитывает MyBrush, но сеттер с его INPC вообще не причем

>В статье этого факта не увидел


в статье прямо говорится что фризабле используют другой механизм уведомлений. Это ты почему то лепишь им INPC и пытаешься связать с INPC в MyClass, хотя они никак не связаны.

>а в данном случае в MyBrush интересует только изменение экземпляра


хз о чем ты. но суть проста
вызовешь сеттер - биндинг увидит INPC нотификацию и перечитает
изменишь внутри кисти что то - биндинг увидит ченжед и перечитает

>отправляет во второе свойство


это сеттер, то есть INPC

>вызовет метод ConverterBack


хз как у тебя сеттер вообще должен вызывать ConverterBack
ConverterBack вызается в виде из контролов при двустороннем биндинге
105 3017470
>>17445

>Почему нельзя хранить?


потому что вьюмодель ничего не знает о виде. Пиши их держа в уме установку - вьюмодели можно безопасно вынести в сборку, где нет ссылки на System.Windows и другие WPF штуки. Ну и можно в любой момент выбросить WPF и сделать консольный гуи без переделок вьюмоделей

>А как же мне хранить настройки, темы и прочее


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

> проходящее через сеттер просто вызовет событие. Все еще непонятно про чем тут статус Freezable.


вот только ты НЕ вызываешь сеттер, поэтому механизм INPC бездействует. А работает дополнительный механизм подписки на ченджед, который присущ Freezable. Таким образом, биндинг перечитывает MyBrush, но сеттер с его INPC вообще не причем

>В статье этого факта не увидел


в статье прямо говорится что фризабле используют другой механизм уведомлений. Это ты почему то лепишь им INPC и пытаешься связать с INPC в MyClass, хотя они никак не связаны.

>а в данном случае в MyBrush интересует только изменение экземпляра


хз о чем ты. но суть проста
вызовешь сеттер - биндинг увидит INPC нотификацию и перечитает
изменишь внутри кисти что то - биндинг увидит ченжед и перечитает

>отправляет во второе свойство


это сеттер, то есть INPC

>вызовет метод ConverterBack


хз как у тебя сеттер вообще должен вызывать ConverterBack
ConverterBack вызается в виде из контролов при двустороннем биндинге
2024-01-2420-11-29.png41 Кб, 1225x626
106 3017616
>>17470

>хз как у тебя сеттер вообще должен вызывать ConverterBack


пикрил — то что я имею ввиду

>в статье прямо говорится что фризабле используют другой механизм уведомлений.


И что? Это не должно ебать привязку, которая слушает событие контейнера, а не событие содержимого контейнера. Это вообще выходит за рамки компетенции привязки. Какого хуя вообще?

Привязка это доставщик. Я ему дал коробку и сообщил эту коробку отнести, его не должно волновать что там внутри коробки. Вскрывается только на таможне и в конце пути.

>System.Windows


Ну это жестко. Слишком жестко. Это мне че, переписывать все библиотеки? У меня жизни не хватит. Но суть понял.

>настройки приложения


Настройки внешнего вида. Цветовая схема хранится как файл настроек, дальше загружается во вьюмодель настроек в виде словаря кистей.

Конечно, на каком-то этапе ты можешь хранить RGB данные, но там куча всего нужно: трансформации, градиенты, текстуры. По сути нужно переизобретать свою собственную кисть и потом ее конвертировать в оригинал. А сколько таких данных? Кошмарное количество.

Идея понятна, но такой подход для богатеньких.
107 3017619
>>17470

>в статье прямо говорится что фризабле используют другой механизм уведомлений.


Вот как только я подпишусь на изменение свойства фризабле класса, вот тогда пусть этот способ и использует. А пока что я подписался на изменение свойства в котором этот класс хранится.

Я не знаю как мне еще донести свою мысль.
108 3017725
>>17616

>пикрил — то что я имею ввиду


ну значит ты не понимаешь как ты подписался. Потому что ConverterBack вызывает биндинг, а для этого этот биндинг должен быть,причем биндинги требуют dp, то есть твой MyBrushB должно быть минимум dp, а вот MyBrushA уже просто свойством

>обытие контейнера, а не событие содержимого контейнера.


она слушает все. что поменяешь, то и услышит. Результат будет одинаковый в твоем случае

>переписывать все библиотеки


вьюмодели обычно в приложении, а не в либах.
Сам я использую feature namespace, то есть у меня вьюмодели и вид лежат вместе, а не в тупых папках Views/ViewModels
Но я знаю что никогда не буду переписывать вид на другой
И даже в этом случае я пишу вьюмодели как будто WPF не существует.

>Идея понятна, но такой подход для богатеньких


Какой такой. У тебя будет тот же код, просто он будет в слое вида, а не во вьюмоделях.

>>17616

> А пока что я подписался на изменение свойства в котором этот класс хранится.


ну может где то и подписался, но в твоем посте с картинками и видео - этого нет. Там просто биндинг на свойство.
109 3017826
>>17725

>MyBrushB должно быть минимум dp, а вот MyBrushA уже просто свойством


Оба свойства - dp

>она слушает все.


Пиздеж, ща проверю. Вряд ли обновится привязка если я вызову кастомное событие внутри кастомного класса.

>Результат будет одинаковый в твоем случае


Результат вообще не одинаковый. Это вызывает ненужные события, которые приходится подавлять в конвертере. В них нет смысла. Всем, кому надо перерисовать кисть, и итак подписаны на Changed кисти. Я просто боюсь представить сколько перерисовок это вызывает, если бы я не вскрыл сей факт это в ковертере. Тупейшая хрень.
Воспринимаю это как побочку от каких-то других решений, о которых я пока не знаю.

>И даже в этом случае я пишу вьюмодели как будто WPF не существует.


Возможно тебе не приходилось, учитывая что многие ИТТ избегают фронтенд. У меня шейпы, кисти, да даже банальный Point это все систем виндовс.

> А пока что я подписался на изменение свойства в котором этот класс хранится.


Это продолжение темы почему привязка не должна подписываться на события экземпляра свойства. Это превышение ее полномочий.
Короче, я устал писать одно и то же. Мы похоже не понимаем друг друга.
110 3017904
>>17826

>Оба свойства - dp


я обычно никогда биндинги вручную не пишу, но вообще там же еще есть триггеры "обновления назад" типа смена фокуса вызывает обновление привязки, не забывай об этом.
может в биндинге из кода нужно вручную вызвать обновление ибо никакой смены фокуса нет.

>если я вызову кастомное событие внутри кастомного класса.


ты о чем вообще
биндинг слушает INPC и в случаее фризабле еще слушает фризабловый ченджед

>Результат вообще не одинаковый


одинаковый - в обоих случаях кисть будет полностью перечитана
ну да, необдуманное использование вызывает много перерисовок. Ну на то они и фризабле что подразумевается иммутабельность с которой жить проще - какой смысл знать тебе в привязке что на 3 слоя ниже поменялось свойство Foo? Что тебе делать с этим знанием? Это вообще интернал объект и все, что ты можешь - перечитать всё заново.
Не меняй ты внутренности кисти, а меняй ты всю кисть - никогда бы и не знал про фризабле тонкости.

>Возможно тебе не приходилось


мне как приходилось. WPF это мой основной доход

>У меня шейпы, кисти, да даже банальный Point это все систем виндовс.


верно. но это знает вид, а вьюмоделям до этого дела нет.
вьюмодель хранит данные, допустим список имен "вася, петя, коля" то есть "ЧТО отображать", но ей плевать какой там будет шрифт, фон, цвет шрифта, размер итема в списке, выравнивание, отступ и так далее - этим занимается ВИД с его ответом на вопрос "КАК отображать"
А потому если класс имеет суффикс ViewModel, то в нем ничего этого быть не должно

>Это превышение ее полномочий


полномочия биндинга - подписаться на INPC + ченджед для фризабле. Не нравится? пиши свой биндинг или не меняй фризабле изнутри и будет тебе счастье и покой.

в конце концов ты можешь выставить свойство с нужными тебе кишками во вьюмоели (ну на самом деле не во вьюмоделе, а в стейте), можешь сделать конвертер который выдерет тебе из MyClass нужное. Или же смириться с природой фризабле

ты сам выбираешь стул
ты уже выбрал один стул - WPF, теперь выбирай где присесть
110 3017904
>>17826

>Оба свойства - dp


я обычно никогда биндинги вручную не пишу, но вообще там же еще есть триггеры "обновления назад" типа смена фокуса вызывает обновление привязки, не забывай об этом.
может в биндинге из кода нужно вручную вызвать обновление ибо никакой смены фокуса нет.

>если я вызову кастомное событие внутри кастомного класса.


ты о чем вообще
биндинг слушает INPC и в случаее фризабле еще слушает фризабловый ченджед

>Результат вообще не одинаковый


одинаковый - в обоих случаях кисть будет полностью перечитана
ну да, необдуманное использование вызывает много перерисовок. Ну на то они и фризабле что подразумевается иммутабельность с которой жить проще - какой смысл знать тебе в привязке что на 3 слоя ниже поменялось свойство Foo? Что тебе делать с этим знанием? Это вообще интернал объект и все, что ты можешь - перечитать всё заново.
Не меняй ты внутренности кисти, а меняй ты всю кисть - никогда бы и не знал про фризабле тонкости.

>Возможно тебе не приходилось


мне как приходилось. WPF это мой основной доход

>У меня шейпы, кисти, да даже банальный Point это все систем виндовс.


верно. но это знает вид, а вьюмоделям до этого дела нет.
вьюмодель хранит данные, допустим список имен "вася, петя, коля" то есть "ЧТО отображать", но ей плевать какой там будет шрифт, фон, цвет шрифта, размер итема в списке, выравнивание, отступ и так далее - этим занимается ВИД с его ответом на вопрос "КАК отображать"
А потому если класс имеет суффикс ViewModel, то в нем ничего этого быть не должно

>Это превышение ее полномочий


полномочия биндинга - подписаться на INPC + ченджед для фризабле. Не нравится? пиши свой биндинг или не меняй фризабле изнутри и будет тебе счастье и покой.

в конце концов ты можешь выставить свойство с нужными тебе кишками во вьюмоели (ну на самом деле не во вьюмоделе, а в стейте), можешь сделать конвертер который выдерет тебе из MyClass нужное. Или же смириться с природой фризабле

ты сам выбираешь стул
ты уже выбрал один стул - WPF, теперь выбирай где присесть
111 3018065
>>17904

>я обычно никогда биндинги вручную не пишу, но вообще там же еще есть триггеры "обновления назад"


Я биндил через xaml. По умолчанию "Two Sided", но я пробовал ставить явно. Не хочет работать. В обратную сторону работает только INPC, т.е. когда я меняю экземпляр кисти, но вот на события Changed не реагирует.
Короче, для меня вот эта магия остается непонятной.
Т.е. с одной стороны отслеживается оба события INPC + ченджед для фризабле, а с другой стороны только одно INPC.

>одинаковый - в обоих случаях кисть будет полностью перечитана


Выглядит так, как будто будет пересчитана дважды. Когда ты помещаешь кисть к примеру в свойство бэкграунда кнопки, то там идет подписка на Changed.
Если ты привязываешь кисть, что привязка тоже подписывается на Changed.
Получается двойное обновление.

>но это знает вид, а вьюмоделям до этого дела нет.


Но как-то информацию в вьюмодели надо хранить. Где хранить к примеру координаты чего либо? Или вот есть задача сделать векторный редактор. Нужно хранить список выделенных объектов. Где эти кривые хранить?
История действий, слои, корзина и прочее — все должно относиться ко вьюмодели, но при этом должно хранить информацию о кривой, которая относится к неймспейсу System.Windows

>но ей плевать какой там будет шрифт, фон, цвет шрифта


Если это не приколоченный гвоздями интерфейс, то в любом более или менее нормальном приложении, "Appearance" это один из разделов настроек, в котором хранятся и кисти, и размер шрифта и название шрифта. Хотя я не видел, чтобы эти данные были сложными, в основном это простейшие типы, максимум Color.
112 3018130
>>18065

>но вот на события Changed не реагирует


ну технически это верно. что он может поменять в иммутабле объекте? ничего же
А INPC - там обычное свойство с сеттерами.

>Получается двойное обновление.


как и везде. каждая подписка работает независимо

>Нужно хранить список выделенных объектов. Где эти кривые хранить?


в стейте. то есть внутри контрола как угодно храни.
все контролы хранят внутри себя и наружу только некоторые свойства выставляют.

>хранить информацию о кривой


ага, информацию. но не саму кривую. И то не факт.
вьюмодели - не вид и не должны знать о рисовании.
А контролы не обязаны требовать вьюмодель для хранения чего то.
А если у тебя вьюмодель ВНУТРИ контрола, то это уже не вьюмодель из MVVM (где по правилам нужно отделять мух от котлет), а стейт - где нет никаких ограничений ибо это все относится к виду (и то что это INPC - не делают его не видом)
Потому я упомянул вьюмодели в разрезе MVVM - вот им про вид знать нельзя, а стейтам можно конечно.

>"Appearance" это один из разделов настроек, в котором хранятся и кисти, и размер шрифта и название шрифта.


да какая разница. главное что вьюмодель не содержит в себе части вида.
то есть в настройках у тебя будет AppearanceViewModel где у тебя будет свойство цвет #fafafa и конвертер, а не объект Brush
название шрифта и конвертер, а не сам шрифт
113 3018143
Можно в винформах делать формы под линукс (дебиан, если важно)?
Если нет, то где можно, чтоб, как в винформах, программировать мышкой и изображения легко получать через copyfromscren?
114 3018445
>>18143
Можно было компилировать WinForms приложения под Linux. Чем проще приложение, тем лучше оно работало. Нынче Майкрософт похоронила Mono. Т.ч. ты ещё заебёшся искать старый Monodevelop и библиотеки.

И в Monodevelop не было редактора форм. Создавать и редактировать формы придётся в Visual Studio.
2024-01-2512-42-33.png283 Кб, 837x921
115 3018529
>>18130

>ага, информацию. но не саму кривую.


Да понятно, но вот за это я MVVM и не люблю. Казалось бы у тебя уже есть объект кривой с данными: имя, трансформации, стиль контура, стиль заливки. Но ты должен создать модели с аналогичными свойствами по суди дублируя всю библиотеку. А там только для одного стиля контура кривой ебнешься сколько параметров: контур сплошной или пунктирный, какой формы будет наконечник кривой, каким образом будут стыковаться сегменты, какая толщина кривой, какая у нее кисть. Десятки параметров. Сами кисти тоже имеют кучу свойств. Вроде уже есть готовые структуры Matrix, Point, но ты должен написать свои аналоги.

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

Это пиздец. Это натурально перелопачивать всю систем виндовс.

>И то не факт.


Если мы говорим о графическом редакторе, то там интерфейс пронизан данными о кривых (пикрил). Это не может не проходить через вьюмродель.
bandicam 2024-01-25 13-33-36-749.mp47 Мб, mp4,
1920x1080, 1:14
116 3018588
>>18143
MAUI, Avalonia. Первый от майкрософт, второй сторонний.
По идее на всех можно мышкой сверстать интерфейс.
Сам я ими не пользовался, но если они как WPF, то там тоже есть список UI-элементов, которые ты можешь перетаскивать на окно мышкой и компоновать, есть окно свойств. Собсно я когда с формсов переходил на WPF, первый месяц так и делал.

Вроде как тут обычно топят за Avalonia, но она не идет из коробки.
117 3018780
Сап ребятки-котятки. Есть ли какой-то материал, который объясняет операторы и операции с ними? Интересуют числовые. Прочитал в книге материал и не понял немного (пытаюсь мыслить логикой обычной математики). Хз, может надо передохнуть с мыслью и сесть заново перечитать мб так понятнее будет
118 3018787
>>18529

>но вот за это я MVVM и не люблю


это не проблема MVVM. Это ты пытаешься впихнуть все в MVVM зачем то и использовать их как хранилище состояния.
MVVM он служит для того чтобы быть отделенным от вида, а если он у тебя привязан к нему, то это стейт в виде.

>Это не может не проходить через вьюмродель.


может. весь твой редактор может быть выполнен как угодно и наружу выставлять мизер.
отделяй мух от котлет.
у тебя не вьюмодели из MVVM, а стейт твоего редактора.
119 3018885
https://github.com/dotnet/runtimelab/issues/2398
Почему так? Зачем шарпухи насрали себе в шаровары своими асинк/эвейтами, что теперь невозможно как-либо выйти из ситуации, потому что кодовая база любого проекта засрана ими? Почему белые разрабы джавы оказались умнее индусов майкрософта и просто элегантно ввели гринтреды без каких-либо поломок и изменений в коде?
120 3019191
>>18885
Написано же, что таски с эвейтами быстрее, чем грин треды.
121 3019217
>>18780
Ты лучше конкретно напиши действие какого оператора или что конкретно ты не понял. Т.к. с логики любого кто уже разбирается в коде там все элементарно и трудно будет посоветовать какой-то конкретный источник.
122 3019328
Почему методы-обработчики событий несмотря на то, что получают в качестве параметра sender обычно не является статическими? И можно ли их делать таковыми, если метод никак не обращается к данным экземпляра?
123 3019347
>>18787

>то это стейт


Это какой-то термин?
124 3019575
>>19347
угу, это метафора - хранящееся состояние.

Вот делаешь ты сложный контрол и можешь хранить состояние в code-behind, но это может быть сложно или лапша и вообще у тебя там много вложенных контролов. И ты начинаешь делать классы для хранения состояния. И в итоге (но не факт, просто тебе может быть так привычно) у тебя получается иерархия которая похожа кодом на вьюмодели из MVVM как близнецы (и даже имеет окончания VIewModel и навигацию и т.д.).
Только семантика другая - хранить состояние, а поэтому можно завязываться на вид, а также не являются прослойкой между видом и моделью.
вьюмодели тоже стейт же.

Вон в мобилах ты повернул экран и вид пересоздался, а вьюмодель осталась прежняя и сохранила стейт.

Не нужно все пихать во вьюмодели приложения. Не все дружелюбно ко вьюмоделям. И потому вьюмодель приложения из MVVM не должна хранить кишки. Она хранит свой стейт
берем, допустим, AvalonEdit как сложный редактор. Вьюмодель будет содержать string Text {get; set;}, разные команды, высокоуровневые абстракции. А все хранение текста на низком уровне и работа с ним - будет в AvalonEdit. И при смене состояния AvalonEdit через code-behind будет изменено состояние вьюмодели.

Вот пилишь ты свой редактор. Он не кросс. Ты сделал то, что ты вьюмоделями называешь с кистями и линиями. А потом тебе задача - дополнительно на линуксах пусть рисует через GTK (а на винде WPF). И весь твой код хранящий линии тебе придется дублировать. И получается что хранить тебе нужно не линии и кисти, а данные и прослойка которая отделяет тебя от движка рисования.
ну да лишняя работа, но тут 2 стула - либо ты сидишь на одном и "ничего лишнего не нужно будет" или же ты абстрагируешься как то.

Так что внутри контрола у тебя может быть "свой MVVM", но из-за нарушений правил я предпочитаю называть его стейтом. Ну а если правила не нарушать (не хранить кисти например), то тогда да - оно MVVM внутри контрола.

Так что может ты и делаешь этот MVVM внутри контрола, но я то откуда знаю. Я пишу приложения, а в контролах мне такого не требуется. Контрол это вообще низкоуровневый код может быть но и его достаточно.
124 3019575
>>19347
угу, это метафора - хранящееся состояние.

Вот делаешь ты сложный контрол и можешь хранить состояние в code-behind, но это может быть сложно или лапша и вообще у тебя там много вложенных контролов. И ты начинаешь делать классы для хранения состояния. И в итоге (но не факт, просто тебе может быть так привычно) у тебя получается иерархия которая похожа кодом на вьюмодели из MVVM как близнецы (и даже имеет окончания VIewModel и навигацию и т.д.).
Только семантика другая - хранить состояние, а поэтому можно завязываться на вид, а также не являются прослойкой между видом и моделью.
вьюмодели тоже стейт же.

Вон в мобилах ты повернул экран и вид пересоздался, а вьюмодель осталась прежняя и сохранила стейт.

Не нужно все пихать во вьюмодели приложения. Не все дружелюбно ко вьюмоделям. И потому вьюмодель приложения из MVVM не должна хранить кишки. Она хранит свой стейт
берем, допустим, AvalonEdit как сложный редактор. Вьюмодель будет содержать string Text {get; set;}, разные команды, высокоуровневые абстракции. А все хранение текста на низком уровне и работа с ним - будет в AvalonEdit. И при смене состояния AvalonEdit через code-behind будет изменено состояние вьюмодели.

Вот пилишь ты свой редактор. Он не кросс. Ты сделал то, что ты вьюмоделями называешь с кистями и линиями. А потом тебе задача - дополнительно на линуксах пусть рисует через GTK (а на винде WPF). И весь твой код хранящий линии тебе придется дублировать. И получается что хранить тебе нужно не линии и кисти, а данные и прослойка которая отделяет тебя от движка рисования.
ну да лишняя работа, но тут 2 стула - либо ты сидишь на одном и "ничего лишнего не нужно будет" или же ты абстрагируешься как то.

Так что внутри контрола у тебя может быть "свой MVVM", но из-за нарушений правил я предпочитаю называть его стейтом. Ну а если правила не нарушать (не хранить кисти например), то тогда да - оно MVVM внутри контрола.

Так что может ты и делаешь этот MVVM внутри контрола, но я то откуда знаю. Я пишу приложения, а в контролах мне такого не требуется. Контрол это вообще низкоуровневый код может быть но и его достаточно.
125 3019579
>>18529
MMVM, конечно, кривое говно из жопы индуса, но тут ты не прав. Бизнес-логика - это одно, presentation layer - совсем другое. Ок, сегодня у тебя вью повторяет все свойства структуры Point, завтра понадобится показать новое свойство и ты соснешь.
Рассматривай MVVM как классическую MVC, в которой дебилы из микрософт объединили модель и контроллер в одну неведомую хуйню. Ты пишешь контроллер, который не возвращает джейсон, а устанавливает сам себе свойства.
126 3020307
Как работать с БД в WPF/Avalonia? Конкретнее как получать id? Раньше при написании приложений на питоновском tkinter просто делал невидимый столбец с айдишником (речь ест-но о табличном контроле). Подумал также сделать в Avalonia но теперь думаю, не является ли это костылем. Видел на просторах SO про некий способ с адаптером и привязкой к классу, но ест-но писавший о нем не дал примера к коду. Зря ли я загоняюсь или есть момент когда все эти невидимые столбцы могут выстрелить?
image.png125 Кб, 848x1094
127 3020309
>>02293 (OP)
индусища...
128 3020313
>>18885
Для вас говноедов уже отдельный загончик завели: https://2ch.hk/pr/res/2973076.html (М) . Так что не засирай тред, съеби в загончик и варитесь там в говне с такими же любителями со всех сторон барикад. Мешаешь уважаемым людям WPF обсуждать.
129 3020369
>>20307
Я не совсем понимаю зачем делать столбцы невидимыми. Контрол только отображает данные, либо их редактирует. Скрыв столбец, ты избавляешься от первого и второго. Так зачем этот столбец учитывать в таблице?

Если твоя таблица строит столбцы автоматом и столбец id появляется сам собой, то ты можешь для своего датагрида сделать DataTemplate и указать те столбцы, которые тебе нужны.
Там на самом деле куча темплейтов и под заголовки и под группы.

Если ты контрол со столбцом id используешь для привязки другого контрола, то так тоже не делают. Обычно привязываются напрямую к дата контексту. Если эти данные надо как-то интерпретировать или объединить с другими данными, то используют ValueConverter (может это называли адаптером?)
130 3020373
>>20307
>>20369
Или в БД в принципе отсутствует свойство id? А для чего оно нужно, если ты его по итогу скрываешь?
131 3020385
>>18885
всего то через 13 лет как первопроходец шарп задал эту тему (которую потом стащили куча языков к себе)

Умные разрабы жавы ЛОООЛ. 13 лет думали умные
и бесконечное число лет будут делать гетсет искаропки

уйди говноед.
изображение.png23 Кб, 816x271
132 3020614
Всем привет. Кто-нибудь в курсе как или где изменить сообщение при ошибки Json конвертации? На данный момент имею то, что на скрине. Вот этот ответ на stackoverflow не помог https://stackoverflow.com/questions/75473675/is-there-a-way-to-override-the-serialization-error-message. Проект на .net8
133 3020661
>>20614
что значит не помог? И вообще зачем тебе трогать её?
134 3020673
>>20373
У меня есть кнопки для редактирования строк таблицы.
Заранее говорю что смотрю по Авалонии.
Почему раздумаю: в SO пишется что обработчики (Events) гораздо лучше чем команды (Commands) т.к. меньше бойлерплейта.
Но в отличие от команд я не понимаю как в обработчиках передать id без его скрытия в таблице в условно невидимом столбце, видимо EventHandler перегружать надо, и тогда только смогу напрямую прокинуть в DeleteHint сам ID, без мудрения с родительскими контролами и невидимостью.
Есть первый вариант для кнопок изменения/удаления (команды):
Использовать команды для этих кнопок (сами столбцы в TreeDataGrid в XAML нормально не сделать, в примерах только через создание FlatTreeDataGridSource)

Source = new FlatTreeDataGridSource<Hint>(Hints)
{

Columns =
{
new TextColumn<Hint, string>("Text", x => x.HintText, (r, v) => r.HintText = v, options: EditOptions),
new TextColumn<Hint, string>("Comment", x => x.Comment, (r, v) => r.Comment = v, options: EditOptions),
new TemplateColumn<Hint>("", new FuncDataTemplate<Hint>((a, e) => DeleteButtonInit(a.Id), supportsRecycling: true)) //тут перекидываем id в кнопку, DeleteButtonInit создает кнопку
},
};

public Button DeleteButtonInit(int id) //создание кнопки с командой для удаления
{
Button btn = new Button();
btn.Content = "Delete";
btn.Command = DeleteHintCommand;
btn.CommandParameter = id;
return btn;
}

public void DeleteHint(int id) //само удаление
{
var removed = new Hint(id);
using (var DataSource = new HelpContext())
{
DataSource.Hints.Attach(removed);
DataSource.Hints.Remove(removed);
DataSource.SaveChanges();
}
Hints.Remove(removed);
}

Второй вариант - event

будет создаваться столбец с небольшим отличием от кода первого варианта

new TemplateColumn<Hint>("", new FuncDataTemplate<Hint>((a, e) => DeleteButtonInit(), supportsRecycling: true))

public Button DeleteButtonInit() //создание кнопки с обработчиком для удаления
{
Button btn = new Button();
btn.Content = "Delete";
btn.Click += DeleteHint;
}
private void DeleteHint(object sender, RoutedEventArgs e) //сам обработчик
{
Button btn = (Button)sender;
var id = btn.Parent.Parent[0]; //тут еще не до конца разобрался как невидимый столбец подцепить, но вкратце его можно выцепить через родителоьский контрол (для этого и невидимость)
var removed = new Hint(id);
using (var DataSource = new HelpContext())
{
DataSource.Hints.Attach(removed);
DataSource.Hints.Remove(removed);
DataSource.SaveChanges();
}
Hints.Remove(removed);
}
134 3020673
>>20373
У меня есть кнопки для редактирования строк таблицы.
Заранее говорю что смотрю по Авалонии.
Почему раздумаю: в SO пишется что обработчики (Events) гораздо лучше чем команды (Commands) т.к. меньше бойлерплейта.
Но в отличие от команд я не понимаю как в обработчиках передать id без его скрытия в таблице в условно невидимом столбце, видимо EventHandler перегружать надо, и тогда только смогу напрямую прокинуть в DeleteHint сам ID, без мудрения с родительскими контролами и невидимостью.
Есть первый вариант для кнопок изменения/удаления (команды):
Использовать команды для этих кнопок (сами столбцы в TreeDataGrid в XAML нормально не сделать, в примерах только через создание FlatTreeDataGridSource)

Source = new FlatTreeDataGridSource<Hint>(Hints)
{

Columns =
{
new TextColumn<Hint, string>("Text", x => x.HintText, (r, v) => r.HintText = v, options: EditOptions),
new TextColumn<Hint, string>("Comment", x => x.Comment, (r, v) => r.Comment = v, options: EditOptions),
new TemplateColumn<Hint>("", new FuncDataTemplate<Hint>((a, e) => DeleteButtonInit(a.Id), supportsRecycling: true)) //тут перекидываем id в кнопку, DeleteButtonInit создает кнопку
},
};

public Button DeleteButtonInit(int id) //создание кнопки с командой для удаления
{
Button btn = new Button();
btn.Content = "Delete";
btn.Command = DeleteHintCommand;
btn.CommandParameter = id;
return btn;
}

public void DeleteHint(int id) //само удаление
{
var removed = new Hint(id);
using (var DataSource = new HelpContext())
{
DataSource.Hints.Attach(removed);
DataSource.Hints.Remove(removed);
DataSource.SaveChanges();
}
Hints.Remove(removed);
}

Второй вариант - event

будет создаваться столбец с небольшим отличием от кода первого варианта

new TemplateColumn<Hint>("", new FuncDataTemplate<Hint>((a, e) => DeleteButtonInit(), supportsRecycling: true))

public Button DeleteButtonInit() //создание кнопки с обработчиком для удаления
{
Button btn = new Button();
btn.Content = "Delete";
btn.Click += DeleteHint;
}
private void DeleteHint(object sender, RoutedEventArgs e) //сам обработчик
{
Button btn = (Button)sender;
var id = btn.Parent.Parent[0]; //тут еще не до конца разобрался как невидимый столбец подцепить, но вкратце его можно выцепить через родителоьский контрол (для этого и невидимость)
var removed = new Hint(id);
using (var DataSource = new HelpContext())
{
DataSource.Hints.Attach(removed);
DataSource.Hints.Remove(removed);
DataSource.SaveChanges();
}
Hints.Remove(removed);
}
135 3020692
>>20661
Значит, что я попробовал варианты ответов и ничего существенно не поменялось. Ответ такой же, разве что builder.Services.AddControllers().AddJsonOptions(options =>
options.AllowInputFormatterExceptionMessages = false);
немного меняет вывод "$.Id". Потрогать хочу, чтобы изменить вывод ошибки. Типо "Вы не ввели такое-то значение" и т.д.
136 3020813
>>20692
1. проблема формата, если так нужно самому какую то логику делать то и мапь сам из string? с какими угодно ошибками
2. на фронте должны быть все ошибки заранее выкинуты и запрос даже отправлен не должен быть
javacs.png48 Кб, 1201x225
137 3021091
>>18885
Уноси свое проприетарное говно.
image.png165 Кб, 1191x999
138 3021140
139 3021259
>>20813
Это понятно, я когда фронт буду делать все проверки реализую. Но что если кто-нибудь захочет с постмана отправить, так сказать во вред или чисто из интереса посмотреть, что будет
140 3021271
>>21259
То и будет. Ошибка абсолютно понятная которую только именно что васян подпивас не поймёт
141 3021334
>>21271
Хмм. Понял, тогда так и оставлю. Просто я думал, что выносить наружу такие ошибки не очень, поэтому и хотел переписать вывод ошибки
142 3021426
>>21091
Есть же OpenJDK
143 3021434
>>21426
Но качают и ставят все оракловую.
Кто-то когда-то говорил еще про мелкие подводные.
144 3021467
>>21434
Никто не качает оракловую ждк. Подводные высосаны из пальца теоретиками, которые дрочат спеки вместо написания кода.
145 3021480
>>21467
Ну я качаю оракловскую жабу, опенждк ставлю только на линь т.к. она в репах лежит
146 3021511
>>21140
Это один из самых бесполезных бенчмарков из всех существующих, потому что в реальном мире никто никогда так код не пишет, потому что это совершенно невозможно поддерживать.
147 3021563
>>21480
А какое отношение твой долбоебизм имеет к теме?
148 3021647
>>02293 (OP)
Подскажите быструю и простую key-value базу на шарпе, с открытым кодом.
149 3021785
Кто-нибудь шарит за бибу для Unity - Mirror?
150 3022079
>>21467
Я больше чем уверен, ты только сегодня узнал, что вообще есть коммерческая ждк и есть где-то какая-то попенсорсная.
151 3022082
>>21511
Что не так то?
152 3022240
Господа, как у вас принято писать приватные свойства, через подчеркивание или это моветон?
private int privateData;
или
private int _privateData;
153 3022242
>>22240
Через подчеркивание конечно. Это официальный кодстайл от майков.
154 3022252
>>22240
Пишу так как сами майки пишут аспнет кор, да и большинство вокруг кроме отбитышей так пишут
155 3022254
>>22242
Спб, а можно ссылку на кодстайл, меня чет гугл унизил.
image.png8 Кб, 476x86
156 3022265
Еще вопрос, для приватный методов нужно использовать нижний регистр для первой буквы или это просто особенность winform?
157 3022279
>>22265
Просто так повелось в винформах
158 3022281
>>22265
Ну и в целом иногда обработчики событий так неймят
159 3022299
>>22082
Ты видел, какой там код? Это пиздец, там такие лоулевел микрооптимизации, что страшно становится.
Ну и это изначально конкурс жабадебильных олимпиадников, кто задрочится сильнее, а не сравнение производительности платформ.

Чтобы сравнить джаву и дотнет, надо написать сначала наивные реализации с построчным чтением, складыванием в обычные словари/хэшмэпы и вычислением результата. Оно, конечно, будет очень медленно работать, но зато будет видно, как платформы справляются с обычным кодом.
Потом можно попробовать очевидные оптимизации типа буферного чтения по мегабайту и вычисления среднего/мин/макс на ходу без загрузки всего в память.
На этом, в принципе, можно и закончить.
Все остальные оптимизации надо просто писать на С.
160 3022302
>>22242
а потом пришли primary конструкторы и послали в жопу кодстайлы )
161 3022396
>>22265
Винформы просто генерируют имена обработчиков по имени объекта на форме, который эмитит это событие.

Нормальная конвенция по именам:

с префиксом _ - все приватные поля.
все методы - в PascalCase
переменные - в camelCase
162 3022407
>>22265
Это особенность вижуалстудии. Винформы сами по себе ничего не генерируют, обработчик события можно назвать хоть капсом.
163 3022688
>>22396
>>22240
>>22242
По умолчанию студия не делает поле с подчеркиванием. Не городите чушь.
.png76 Кб, 1212x880
164 3022747
>>22688

> По умолчанию студия


При чем тут вообще студия? Речь о кодстайле.
165 3022766
Аноны, пробовали ли вы уже деплоить что-либо с восьмым дотнетом? Решил перевести пет-проект на него, заранее поменял в докерфайле и компоузе 80 порт на 8080, контейнеры все поднялись, но у контейнера с приложением с какого-то хера проброшены порты, указанные в launchsettings вместо тех, что в докерных файлах или тех, что можно насильно указать в appsettings для Kestrel.

Это я рукожоп, баг в докере или теперь при конфигурации учитывается launchsettings, который всегда раньше нужен был для IDEшек?
166 3022780
>>20673

>Но в отличие от команд я не понимаю как в обработчиках передать id без его скрытия в таблице в


id должен находиться в модели. Целевая модель должна находиться в списке выбранного во вьюмодели.

Событие\команда обращаются к дата контексту, где лежит твоя вьюмодель, обращается к выбранным элементам и получает их id. В идеале так. И не важно событие у тебя или команда в этом случае.

Еще я бегло посмотрел, а выглядит так, что ты кнопки создаешь не в xaml. Жуть какая. Ты создаешь кнопку при помощи xaml, привязываешь к ней соответствующую команду, а ее Visibility или IsEnabled при помощи ValueConverters определяешь по состоянию того или иного свойства вьюмодели.

Если тебе нужно отображать какой-то блок контролов, то делается это через контент презентер. Все упирается в данные вьюмодели.
167 3022784
>>22766
Ты рукожоп. Работают сервисы на 8 корке в кубах без проблем с дефолтным 8080 и рутлесс правами
168 3022794
>>22766
А вообще не понял как ты приплёл проброшенные порты.
Определись в начале где у тебя проблема, в том что кетрел слушает не тот порт или что докер не прокидывает нужный.
docker compose config и docker inspect тебе в руки
169 3022825
>>22794
Докер прокидывает левый порт, но по идее конфиг приложения определяет какие прокидывать, не?

Приложение поднимается, в логах 8080 в режиме продакшна, в compose 8080:8080, но достучаться до него невозможно. Когда делаю curl до этого порта, то connection refused by peer. При попытке чекнуть порты у контейнера видно, что там прокинут 80 порт на тот, что указан в launchsettings из диапазона 5000-5300. Ощущение, что с докером чёт не так, удалять всё и делать docker builder prune --all пробовал, но результат не даёт. Чекал ещё ASPNETCORE_HTTP_PORTS в переменных контейнера, там тоже 8080, нихуя не понимаю вообще
170 3022840
>>22825
Блять, запустил на другой тачке в докере всё то же самое, заработало. Хуйня ебаная.
171 3022870
>>22825
Ты всё свливаешь в одну кучу, учись траблшутить.
В твоём случе путь должен быть примерно таков:
1. чек что внутри контейнера софт слушает порт и отвечает (тем же курлом ВНУТРИ контейнера)
2. чек docker compose config что порты правильно прокинуты
3. запуск docker compose down && docker compose up, чек docker container inspect что всё правильно
4. чек iptables-save, рестарт докер демона
5. рестарт хоста
172 3022900
>>22870
Здраво звучит, спасибо, анон. Про curl внутри контейнера и docker compose config знаю, по последнему как раз видел, что в compose оказывались порты, которых быть не должно. Решилось в итоге рестартом хоста
173 3022977
>>22825

> но по идее конфиг приложения определяет какие прокидывать, не?


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

Дальше - у тебя есть приложение, которое слушает определённый порт внутри своего контейнера. Есть контейнер, который хуй знает как реализован в твоём сетапе. И есть какая-то машинерия проброса портов, которая опять же на всех операционках реализована и работает по разному (и шансы что-то раздебажить у тебя есть только на линуксе). Так что если хочешь подсказку куда смотреть, скажи операционку и в чём ты запускаешь докер, и мб тебе помогут.
174 3022980
>>22977
Ну вариантов то не много. Бсд сразу нахуй т.к. там докер через пизду прибит, макось туда же, в винде на сколько знаю то что называется докер десктоп работает внутри всл2, ну и база в виде лини.
Всё сводится к тому что кроме лини вариантов то и нет
175 3022982
>>22980

> в винде на сколько знаю то что называется докер десктоп работает внутри всл2


С линуксовыми контейнерами. Для виндовых контейнеров никакие вслы, конечно же, не нужны.
176 3022983
>>22982
Виндовые контейнеры, уж извините, это совсем мазохизм в чистом виде
177 3022987
>>22983
Чего это вдруг? Там урезанная довольно быстрая винда.
WSL2 тоже довольно быстрый, кстати. В некоторых тестах даже обгоняет соответствующий линукс. В большинстве, конечно, отстаёт, но в большинстве из этого большинства всего в пределах 10%.
178 3022988
>>22987
Просто нет причины заниматься извращенствами когда весь прод с ног до головы на лини а в винде для разрабов завезли всл.
Единственные причины держать винду в проде как вижу это лдап/ад и дикие вендор локи
179 3022993
>>22988
Ну запусти .Net Framework 4.8 на линуксе, лол.
180 3022994
>>22993
4.7.2 под моно нормально ворочался, а вообще ретрограды должны страдать.
Всего то прошло 6 лет с 2.1 лтсного кора, продолжим насиловать труп фреймворка!
181 3023024
>>22994

> 4.7.2 под моно нормально ворочался


Я не верю, что он работал хотя бы с 80% скорости дотнета. Плюс какие были гарантии, что он вообще правильно код выполнял?

> Всего то прошло 6 лет с 2.1 лтсного кора


Использовать кор в то время для энтерпрайза было безумием. Там в каждой версии всё менялось, баги, проблемы с производительностью.
Стартап сайта даже в 6 дотнете выглядит не так, как в 7, взяли и перехерачили классы. Это трата времени на апгрейд.
Поэтому никто особо старые проекты с фреймворка не переводит, и хостить их гораздо проще на винде.

Я, собственно, сам новый дотнет только несколько месяцев назад начал использовать, и, конечно, хочу сказать, что стало гораздо лучше, и как хорошо, что громоздкий IIS с проблемами в настройке нахер больше не нужен.
Новые проекты надо делать исключительно на новом дотнете, но легаси-то никуда не девается.
182 3023067
>>22988
Под виндой часто работают хосты на проде, где нужна какая-нибудь работа с криптографией по госту: в новых дотнетах относительно хуй на расширяемость клали в плане криптографических провайдеров. На гитхабе ишью шесть лет лежит: https://github.com/dotnet/runtime/issues/26053
183 3023127
>>23024

>Я, собственно, сам новый дотнет только несколько месяцев назад начал использовать


Сочувствую. Я уже года 3 не касался .net framework-a.
Последние полтора года вообще исключительно .net6 и под linux только работаю.
Красота.
184 3023155
>>22980
Замечание анона выше про упоминание оси справедливое, т.к. запустить контейнер пытался под макосью, потом сдался и с первого раза всё на линуксе запустилось
185 3023833
>>23155
Я себе плохо представляю, как у дотнет девелопера вообще может появиться задача запустить контейнер докера под макосью.
186 3023873
>>23833
Ну хер знает, у меня примерно пятая часть знакомых .net разрабов работают на маках. Но честно говоря, не интересовался ни разу была ли у них необходимость возиться с докером.
187 3023912
>>23873
Но ведь vs под винду только? В чём они пишут, vs code? Оно же гораздо менее функциональное.
188 3023944
>>23912
Джетовская идешка жи ест. Но мне она не по душе, хоть и вебшторм топчик и в студии стоит решарпер
189 3023947
>>23944

>Джетовская идешка жи ест.


Ах, да, там райдер какой-то. Вечно в энтерпрайзе от всего остаёшь.
190 3023954
>>23912

>В чём они пишут


В основном в райдере. VS под мак вроде как бы и существует, но майрософт сказали, что 24 августа 2024 забьют хер на неё.
191 3023991
>>23954
VS под мак - это MonoDevelop.

И MonoDevelop - была вполне нормальной ИДЕ для тех задач, под которые оно пилилось.

Весь вуз сидел на ней и горя не знал.
192 3023996
>>23991
У тебя в вузе маки стояли? Вот это проёб бюджетных денег.
193 3024003
>>23996
Нет. В вузе я был нетакусиком, и на линуксе сидел, чтобы выебываться перед однокурсниками. А в то время - еще core не было и vscode тоже. Так что делал лабы на Mono и соответственно в MonoDevelop.
194 3024201
>>23991

>Весь вуз сидел на ней и горя не знал.


Почему тогда к нам на работу не устраивались?
195 3024225
>>24003
Ха, ты мне напомнил, как у нас линуксоиды делали лабы по ТБД на MySQL, а потом они у них в универе не запускались.
196 3024648
>>22240
Как же меня корёжит с этих подчёркиваний
197 3024650
>>24648
Не смотри
198 3024669
>>24648
Меня тоже корёжит. Изначально девы в мс тоже не использовали их в пику конвенциям, ну и я привык просто с маленькой буквы поля называть.
А потом им, видимо, вставили за это, поэтому пришлось делать по конвенциям.
Алсо, вот вам референс.
https://learn.microsoft.com/en-us/dotnet/csharp/fundamentals/coding-style/identifier-names
199 3024694
>>24648
Меня гораздо сильнее корёжит когда код засран кучей this.
image.png153 Кб, 1411x803
200 3024747
Памахите - как правильно сделать?
image.png44 Кб, 874x450
201 3024752
Вот упростил... то есть проблема в передаче ссылки (в с++ такое работает, а как тут надо?)

и нужно именно так сеттер написать, чтобы не копипасть кучу строк кода которые делаются в Set вьювмодели

Как исправить ошибку?
202 3024776
>>24752

>Вот упростил... то есть проблема в передаче ссылки (в с++ такое работает, а как тут надо?)


Тебе же писали уже - выкидывай нахрен эти плюсовые приколы, в шарпе не пишут так.

>Как исправить ошибку?


Забыть плюсы и прочитать учебник/справочник по шарпам.
image.png26 Кб, 523x231
203 3024791
>>24752
Что мешает сделать просто вот так?
204 3024796
>>24791
то что это мне надо сообщить что поле изменилось вызвав OnPropertyChanged
205 3024805
>>24776
А как мне переписать Set из >>24747
чтобы оно работало?

В модели DataModel не должно быть функционала вьювмодели.

Не копипастить же поля из модели DataModel в вьювмодель DataVM - говнокод же, когда одно и тоже в разных местах

Поэтому сделал что DataVM хранит весь DataModel

Но теперь надо написать поля которые будут доступны вьюву.
Конечно же можно написать как тут предложили >>24791

Но в таком случае не будет обработки события и вьюв не будет знать что где-то что-то поменялось. Тоже хуита

В таком случае опять приходим к копипасту - когда нужно вот эти 4 строки из Set писать в сеттеры - это же пиздец копипаста сколько, если полей 10, то это 40 строк говна сверху.

так что логично что нужно вызвать из сеттера метод который изменит поле DataModel
206 3024810
>>24805

>Не копипастить же поля из модели DataModel в вьювмодель DataVM - говнокод же, когда одно и тоже в разных местах


>


>Поэтому сделал что DataVM хранит весь DataModel


Ну т.е. ты пытаешься заменить говнокод с простым дублированием, на говнокод с хер пойми какой логикой. Такое себе.
207 3024816
>>24810
ну у меня сейчас получилось что модели наследуются от вьювмодели - это же неправильно.

начал искать как другие делают - а они копипастят
public string Id {
get => _model.Id;
set {
if (Equals(_model.Id, value)) return;
_model.Id = value;
OnPropertyChanged(nameof(_model.Id));
} }

Хотел избавится от этого говна с помощью такой функции - это же логично что копипаст надо скрывать. Да и ошибок меньше - тут надо же три места изменить после копипаста - а если не изменю (обычное явление при копипасте)?
208 3025012
>>24805
>>24816
Как же я рад, что в свое время не пошел в десктоп.
209 3025489
>>24747

>Памахите - как правильно сделать?


Fody PropertyChanged

>>25012
ага, небось пошел во фронтенд )
210 3025498
>>25489
Фронт в миллион раз современней и интереснее разработки под дескоп
211 3025517
Есть ли смысл вкатываться в c# в 2024, ведь он нигодился ни для чего, кроме unity, а unity вроде как подыхает. (Хочу быть разработчиком инди-игр)
212 3025529
>>25498
Ага. 10000005000000 фреймворков и жаваскрипт)
213 3025629
>>25529
Всего 3 основных фреймворка. То ли дело майки с wpf, uwp, winui, maui, xamarin и тд. А жс прекрасный язык для ui. Постоянно совершенствуется. Когда там xaml обновлялся? Точно, в 2006 году. Хотели еще в 2009 новый стандарт выпустить, но так и не разродились, ресурсов не хватило, лол. Маленькая бедная компания, хуле, не смогли даже завести поддержку дженериков в xaml.
214 3025642
>>25489

>ага, небось пошел во фронтенд )


Не, чистый бекенд.
В начале карьеры немного замазался об реакт, но сейчас только бэк и ни шагу дальше API.
215 3025708
>>25629
хамарин вообще не десктоп
мауи это десктоп для хамаринистов
UWP не нужен

>жс прекрасный язык для ui


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

>Когда там xaml обновлялся


есть такое. Я бы хотел подобие jetpack compose, но шарп не котлин и можно лишь подобие combine ui
однако jetpack desktop показывает что не все так радужно
так что пока что хамл

>даже завести поддержку дженериков в xaml


не знаю как вы пишете. ни разу это не понадобилось.
вот со словарями они говно сделали да.

>>25642
у каждого свои радости. в десктоп софте не нужно заморачиваться над многими вещами типа безопасности и скалируемости.
216 3026122
>>25498

>интереснее разработки под дескоп


что там интереснее - очередной говносайт для семь топоров клепать?
2024-01-3001-55-37.png3 Кб, 352x100
217 3026139
А можно ли добавить платформу в существующий проект? Вот к примеру мне понадобилась библиотека WPF, для этого мне нужна платформа Microsoft.WindowsDesktop.App.WPF, но при создании проекта я выбрал шаблон не содержащий её.

Можно ли исправить не пересоздавая проект?
218 3026141
>>26139
Меняешь тип проекта в первой строчке цспроджа
или
Добавляешь платформу в референсы
image.png16 Кб, 429x298
219 3026161
220 3026162
Слушайте, вот я посмотрел шарп вроде охуенный. На нём можно делать вообще всё и по скорости он ебет джаву и го в ноль. Собственно вопрос, почему компании не пишут чисто на шарпе, а берут богомерзкие джавы и го? В чём подвох не пойму.
221 3026163
>>26141

>Меняешь тип проекта в первой строчке цспроджа


Одно и то же. Разница только в строке
<UseWPF>true</UseWPF>
Но она ничего не решает.

>Добавляешь платформу в референсы


Где? Я ничего не вижу. Платформа это целая группа библиотек.
222 3026164
>>26161
Молодец.
223 3026165
>>26141
>>26163
лан, один хрен проекты почему-то несовместимы.
В одном проекте платформа
Microsoft.NETCore.App

А в другом две
Microsoft.NETCore.App
Microsoft.WindowsDesktop.App.WPF

Так вот первый ругается, если в качестве референса указать второй проект. Я же не какой-то НетФреймворк подключаю, или пониженную версию.
224 3026191
Попытался в вижуал хрюдио переименовать проект и проиграл.
В проекте, который используется переименованный, выдаёт ошибку
Не удаётся преобразовать из "{namespace}.{class}" в {class}
225 3026262
>>26191
Название проекта - дело важное. Незазорно просидеть пару часов, придумывая правильное название, прежде чем нажать "создать" в IDE. Если у тебя возникает необходимость его переименовывать после создания - значит плох ты как программист.
226 3026595
Я вообще перестаю понимать, что происходит. Создаю объект, заполняю его поля значениями, смотрю внутрь - там заполнены те поля, которые я НЕ ЗАПОЛНЯЛ. Причём заполнены правильно, на основе объекта, из которого я выдрал значения для нового объекта, но который лежит в листе в другой части программы и вообще никак не связан с новым объектом. КАК?!!!!!! Я не создаю его на основе какого-то объекта, я делаю совершенно новый объект, он никоим образом не должен иметь возможность получить что-то там по ссылке. Я в ахуе, я впервые с таким сталкиваюсь.
227 3026612
>>26595
Забейте, оказалось, что кто-то не я выставил заполнение некоторых полей прямо в сеттерах у этого объекта. Я уже думал, что у меня крыша едет.
228 3026638
Что интересного можно написать на авалонии? Что-то ничего придумать не получается.
229 3027100
>>26262
Майкрософт, залогинься
230 3027454
Хм.
Смотрите какую хуйю придумал чтобы наебать EFCore

Собственно. У меня была проблема. Есть сущность:

public class User{
public int Id { get; set; }
public int AppIdentificator { get;set; }
...
}

Собственно. Этот AppIdentificator по бизнес-логике, надо при удалении пользователя - переиспользовать. Типа - было 4 пользователя. Второго удалили. При добавлении нового - надо дать ему освободившийся.

И я долго ломал голову. КАК, блядь, сделать, чтобы оно работало с нормальной скоростью.

И в общем. Че я сегодня придумал.
ДОБАВИТЬ КЛАСС.

publc class AppIdentificator{
public int Id {get; set;}
public int? UserId {get; set;}
public User? User {get; set;}
}

И тогда - проблема решается оче просто.
Я просто беру, и ищу в этой таблице - первый незанятый. Если не нахожу - создаю новый.

Работает, судя по тестам - быстрее, чем ебанутый код, который был для поиска дырок.

Но теперь меня мучают сомнения. Ну не может же все быть так хорошо. Я 100% чет не учел. Может раскритикуете решение?

Нативные запросы - все еще быстрее, даже с учетом старой структуры, но мне на работе не разрешают писать нативные запросы, говорят, что не по понятиям это все дело, и надо с EF ебаться.
230 3027454
Хм.
Смотрите какую хуйю придумал чтобы наебать EFCore

Собственно. У меня была проблема. Есть сущность:

public class User{
public int Id { get; set; }
public int AppIdentificator { get;set; }
...
}

Собственно. Этот AppIdentificator по бизнес-логике, надо при удалении пользователя - переиспользовать. Типа - было 4 пользователя. Второго удалили. При добавлении нового - надо дать ему освободившийся.

И я долго ломал голову. КАК, блядь, сделать, чтобы оно работало с нормальной скоростью.

И в общем. Че я сегодня придумал.
ДОБАВИТЬ КЛАСС.

publc class AppIdentificator{
public int Id {get; set;}
public int? UserId {get; set;}
public User? User {get; set;}
}

И тогда - проблема решается оче просто.
Я просто беру, и ищу в этой таблице - первый незанятый. Если не нахожу - создаю новый.

Работает, судя по тестам - быстрее, чем ебанутый код, который был для поиска дырок.

Но теперь меня мучают сомнения. Ну не может же все быть так хорошо. Я 100% чет не учел. Может раскритикуете решение?

Нативные запросы - все еще быстрее, даже с учетом старой структуры, но мне на работе не разрешают писать нативные запросы, говорят, что не по понятиям это все дело, и надо с EF ебаться.
image.png104 Кб, 719x514
231 3027482
>>27454
Я бы сказал что ты вывернул наизнанку.
Моё решение такое т.к. удалять юзеров из бд не принято (из опыта)
232 3027518
>>27454

>int?


Не затрахивает потом каждый раз на налл проверять или писать "?." где вместо падения происходит заглушение и игнорирования проблемы?
233 3027535
>>27518
Я правда не понимаю эту победу над null, ведь когда пишем чуть больше кода чем скрипт, это дико становиться неудобным.
234 3027549
>>27535
А когда пишем СИЛЬНО БОЛЬШЕ кода чем скрипт это становится удобным
235 3027555
>>27518
Не понимаю претензию. Наллабл типы имеют свои фичи и ясен пень их не нужно тащить туда где они не нужны и предполагается что весь спектр значений валиден. Это с условынм DateTimeOffset почти всегда можно сравнение делать с default. И в целом Nullable<> это прямое указание что "тут может быть налл"
236 3027575
>>27549
>>27555
Речь не о проблеме, был налл или нет, это вопрос динамической среды, меня конкретно напрягают нуллабл поля в классах. Как только ты ставишь вопросик, так начинается ебля с этим полем по всему коду, хотя где-то там в коде он был уже проверен.
237 3027582
>>27575
Ну если ты уверен, что код проверен, то ставишь ! и всего делов.
Где проверен, так может быть распроверен. Как бы не иммутабельное.
В итоге количество "заткнись!" сильно меньше проблем NRE в рантайме.
238 3027584
>>27582
Поддвачну

>>27575
Наллабл струтуры это одно, ты же видимо больше воняешь про наллабл референс тайпс
239 3027587
А как при помощи regex получить текст справа от искомого символа не включая этот символ?

>[сообщение внутри скобок] сообщение справа от скобок



К примеру выражение '\](.*)' вернет такой кусок:
'] сообщение справа от скобок'
А мне нужно
'сообщение справа от скобок'
240 3027589
>>27587
Ты должен брать не заматченый текст целиком а первую группу то бишь то что внутри первого (). Кури доку
241 3027596
>>27587
(?<=\]\s)(.*)
242 3027599
>>27589

>Ты должен брать не заматченый текст целиком а первую группу то бишь то что внутри первого ()


Ничего не понял.
2024-01-3102-05-02.png14 Кб, 667x317
243 3027602
>>27587
https://habr.com/ru/articles/545150/

Позитивный просмотр назад '(?<=шаблон)'. Сдвигается вперед на указанный шаблон. Т.е. '(?<=\])' вернет результат:

>' сообщение справа от скобок'


Остается пробел, поэтому '(?<=\]\s)'
244 3027603
>>27599
https://learn.microsoft.com/en-us/dotnet/api/system.text.regularexpressions.match.groups?view=net-8.0
Не представляешь как я хотел хуями обложить
2024-01-3102-17-16.png24 Кб, 824x624
245 3027607
>>27603
Ты про это? Я тестировал на онлайн площадках и не знал, что так можно. Спасибо.
246 3027647
Заглядывание назад и вперёд это тормозное говнище. Используй группы, как тебе уже написали.
Алсо, полезно знать, что фичи регулярок практически одинаковые во всех языках, и те же группы есть везде. Особенно это полезно при find & replace.
Используется так, например (развернуть присваивание):
Find: ([^=]+)\s☆=\s☆(.+?)$
Replace: $2 = $1
Всего групп может быть 9, $0 - это вся заматченная строка.
Звёздочку заменить на
247 3027655
>>27582

>Ну если ты уверен, что код проверен, то ставишь ! и всего делов.


Лол я думал не стали завозить синтаксис "!.", но тоже такое себе по красоте.
248 3027659
По-любому тут есть те кто в андроид долбиться, скажите, где удобнее асинхронность - в котлине или шарпах?
249 3027668
>>27575

> Как только ты ставишь вопросик, так начинается ебля с этим полем по всему коду, хотя где-то там в коде он был уже проверен.


Так ты не прокидывай один класс через разные слои абстракций, а на каждое взаимодействие между слоями пиши свой класс. Да, они будут на 90% одинаковые, и время тоже на это уходит, зато потом нет вопросов типа "почему половина полей приходят пустые?" или "почему это поле из тела пост-запроса не сохраняется в базу?"
250 3027670
>>27668
Это просто будет гига-зоопарк одних и тех же сущностей. Тут наверное проще ! пописать.
251 3027671
>>27670
Хотя ладно, я тупо отключил нуллабельность. Логи покажут где я насрал.
252 3027687
>>27670

> Это просто будет гига-зоопарк одних и тех же сущностей.


Они как правило не одни и те же, а чуть-чуть разные. Тебе, чтобы использовать не до конца подходящую сущность, придётся писать костыли. Конечно очень легко в самом начале разработки, когда ты просто достал сущность из базы и переслал её на фронтенд, но с каждым таском что-то будет меняться, и этих костылей будет всё больше и больше.
Вон, там в php-треде у кого-то был специальный метод RemoveUnnecessaryFields. Могу ещё легко представить флаг в объекте типа AlreadyProcessedByPriceTransformer.
Это будет сплошным источником багов и неправильного понимания контрактов, и придётся постоянно весь код перечитывать, чтобы было ясно, как оно работает, и что где лежит.

Надо через не хочу сразу клепать эти классы, потому что потом всё равно придётся это делать, только это займёт куда больше времени и сама замена породит ещё баги.
253 3027716
>>27687
Помню в далеком 2006 кодил под Invision Power Board и офигивал, что они там прокидывали один и тот же мега-ассоциативный массив с тонной вложений.
Зато было удобно кодить, выводишь этот массив и тебе все состояния и данные. Добавляешь данные и они у тебя из всех щелей доступно. Приходилось, конечно, isset'ом проверять, но никогда это не вываливалось проблем.
254 3027718
>>27687

>но с каждым таском что-то будет меняться, и этих костылей будет всё больше и больше.


Кодинг и так напоминает бесконечное перекладывание данных туда сюда, а ты еще хочешь помножить этот ад.
255 3027779
>>27670
Для этого придумали мапперы.
256 3027845
>>27518

> где вместо падения происходит заглушение и игнорирования проблемы?


Не мои проблемы, пусть разбираются те, кто допустил попадание на мой участок null. А если будет падать, то виноват уже я буду
257 3028145
Поясните за Regex MatchCollection. Эта коллекция ридонли и не имеет конструктора. Она возвращается методом Regex.Matches, который обрабатывает string.

А что если я хочу распарсить файл целиком? Размер строки позволяет загрузить 2Gb, но не лучше ли файл читать построчно? Тогда нужен метод Regex.Match и в этом случае не смогу все это собрать в MatchCollection.
258 3028156
>>27647

>Алсо, полезно знать, что фичи регулярок практически одинаковые во всех языках, и те же группы есть везде.


Ну я ради тестов открыл сайт, типа https://regextester.github.io, чтобы сразу получать ответ без компиляции программы, но на подобных сайтах не распознаются группы и именования групп, типа '?<myGroup>'.
259 3028158
>>28145
Регулярки работают с целой строкой.
260 3028180
>>28156
Потому что ты парашу какую то нашёл. regex101 это база
261 3028185
>>28180
Круто! Есть подсветка синтаксиса и даже развернутое объяснение что и в каком порядке делается.
262 3028217
>>26162
Golang is a web scale language.
263 3028268
>>26162
По скорости разработки самый быстрый тупескрипт, поэтому он дико популярный в штатах. По скорости перекладывания джейсона все эти языки одинаковы.
Джава - это легаси в банках. Голанг форсит гугл, хотя сам язык говно. Шарп как язык заебись, но есть нюанс. Микрософт так сильно форсили шарп как язык для домохозяек, что теперь большой бизнес думает, что на нем только домохозяйки и пишут. Типа, несерьезная технология для мусорных стартапов, которые проще слепить на нодежс. Скажи спасибо дебилам менеджерам, загнали дотнет на парашу.
264 3028282
>>27655
не буду спорить.
А вместо laterinit набор кучи аттрибутов вида MayBeNullWhen и #nullable disable ebable

>>27659
это асинхронности разного вида. Лично для меконцепция тасков интуитивно сильно проще нежели концепция скоупов.

>>28145
больно нужна тебе эта MatchCollection. Хуже списка матчей
265 3028447
Кто какими библиотеками для работы с Excel'ем пользуется? Щас попробовал closedxml, и что-то не очень зашёл. Как-то там топорно всё. Например: создал таблицу, а изменить ширину отдельного столбца в таблице не получается. Можно только прямым указанием номера ячейки или вообще глобально задать для всего документа. А мне надо по контенту, что находится в столбце менять.
266 3028787
Как протестировать нормально сетевое серверное приложение?

Ну. Типа допустим, мне не лень взять и написать клиент.

Но возникает проблема. 99% проблем - это проблемы связанные со стабильностью сети. Допустим - оператор чудит, а чужие клиенты про это не думают. Да и самому непонятно как мутить приколдесы типа - разрыва и восстановления соединения. Допустим, тут решили. Как тестировать проблемы связанные с особенностями TCP, типа то что тебе может прилетать из-за nodelay - частями. А может - наоборот из-за охуевшей скорости того как чужой клиент серит - прилететь здоровенный TCP-пакет, в котором сразу несколько сообщений и их надо правильно обработать.
А самая непонятная часть, это то что некоторые вещи начинают происходить в проде - через какое-то время + количество обрабатываемых подключений. Вот типа, ставишь на дев - там для тестов висят постоянно 100 клиентов, и годы идут, все как часы. Ставишь клиенту. Он хуярит 100к клиентов в первый же день, у него все ок, через полгода - уже млн клиентов разом, и чет у него ломается, а объяснить не может, типа - жалуются эксплуататоры, те жалуются - что чет медленно. Смотришь, 25% проца всего загружено и 30 гигов оперативки, что не так много для такой нагрузки. Тестишь своим клиентом - да все ок. Подключается чужой клиент - там видишь уже проблемы, но причина - да хуй его знает где она, потому что логи несутся со скоростью что пиздец, и просто понять что где - невозможно.

В общем. Я не знаю. Наверное тупо спрашивать это в шарпотреде, Большая часть-то тырпрайз или десктоп. Но я всю эту хуйню на .NET делаю. И вот просто хочется - прикрутить тестики, чтобы можно было на них погонять сценарии разные, чтобы не ждать отзывов от рассерженных пользователей. Просто как всю эту хуйню таки потестить - я не представляю.
267 3028840
>>28787
Ты просишь тебе рассказать что такое нагрузочное тестирование в шарпотреде?
268 3028845
>>28840
По большей части я хочу поныть.

А в контексте нагрузочное. Ну, я делаю своих клиентов 100к. Все ОК работает. Миллион на своей машине я не могу поднять. Не работать оно начинает с реальными клиентами, которые по 2g через операторов, которые зачем-то рубят канал рандомно при большой нагрузке, а вопросы - ко мне.

А от шарпотреда я хотел наверное каких-то советов, как делать тестирование нормально, чтобы оно приносило пользу. Потому что, ну наделаю я юнит-тестов, наделаю каких-то интеграционных. А через год аптайма на миллион+ клиентов, чет сломается и хуй знает почему.
269 3028870
>>27718
Я ещё раз повторяю, что это меньшее зло. Это не добро, птички, любовь, это просто не так плохо, как альтернатива.
270 3028897
>>28845
Если к тебе претензии что оно не работает на Х нагрузке и тебе не дают железо что бы сделать хотя бы Хх1.5 то нихуя тут не сделаешь. Я бы послал нахуй
271 3028976
>>28845
Во первых на такие случаи у тебя в ТЗ должно быть прописано четкое SLA. Чтобы не было с нихуя ситуаций вроде "у бизнеса неожиданно пришел лям клиентов и все легло". Вернее ситуации, то такие будут, только если у тебя изначально договор был на "100К запросов в день и плюс 5% в месяц", а бизнесу вдруг выше прогнозов привалило, то это проблемы бизнеса.
Во вторых нормальное нагрузочное тестирование - это отдельная статья расходов и этим занимаются отдельные люди. Т.е. это даже не обычные тестеры, а специальные по нагрузке. У них для этого есть необходимые навыки, чтобы поднимать нужные стенды, вешать на них нормальный мониторинг, писать утилиты, пускать зонды и т.д. Это немалые такие бабки.
У нас к примеру на команду из 5-х разрабов и 2-х обычных тестеров, есть отдельные два тестера по нагрузке (с з.п. не меньше сеньорных разрабов) у которых свой отдельный кластер (уровня прода), на котором они постоянно гоняют разные профили нагрузки.

В соло ты такое не потянешь, это не то же самое как юнит тесты на сервис накидать, это по сути тебе новую профессию освоить нужно.
Поэтому всегда договаривайся с заказчиком на определенный уровень SLA в котором ты на 150% уверен, что твои разработки его потянут, если ему хочется выше, то пусть закладывает в бюджет расходы на нормальное НТ (это где-то от 50% до 100%) и нанимает (ну или ты сам нанимай) нагрузочников.
Ну и еще учись писать масштабируемые сервисы, чтобы в случае чего, можно просто было докупить железа и ебануть больше инстансов.
272 3029084
>>28845
Разработка масштабируемой отказоустойчивой системы стоит много денег, это задача уровня гугл. Требуй от кабана стенд для нагрузочного тестирования, где будет крутится лям пользователей, а не сто инвалидов на виртуалке. Заниматся тестированием должен отдельный чел, а не ты. Хайперфоманс - это вообще сложная тема, а не просто пукнул микросервисом в докер и дальше оно как-то само.
273 3029095
>>28787
Для этого есть специальные средства для анализа логов. Есть datadog https://www.datadoghq.com/product/log-management/ есть coralogix https://coralogix.com/ Есть logz.io https://logz.io/, SumoLogic, Splunk. Инструменты для трейсинга там хорошие, можно видеть какой конкретно сервис и url тормозит, все вызовы с таймингами. Можно с помощью машинного обучения детектить атаки.

Насчёт тестов - есть так называемый chaos engineering, где можно тестировать разные сценарии https://github.com/Polly-Contrib/Simmy

В целом, большинство твоих проблем из-за низкого уровня автоматизации. Если у тебя всё ручками управляется, а не скриптами, приходится коннектиться и вручную проверять - то это пиздец. Как бороться с проблемами сети? Да никак нахуй! Тебя вообще не должна ебать сеть. Стабильностью сети должен заниматься cloud provider, который предоставляет услуги. Это его задача защищать от ddos-атак, от всяких syn-flood'ов, ping-flood'ов, udp-flood'ов и прочего.

Ты не можешь купить готовый, managed service? Который будет автоматически масштабироваться под нагрузку. Ну и ебись тогда с сетью. Сделай свой собственный дата-центр ёпт.

Программист вообще не должен этим заниматься. Нахуй вы тогда платите хостинг-провайдеру, скажи мне? Если тебе приходится настолько мелкую хуйню как "клиенты с 2G-интернетом" исправлять, то у меня для тебя плохие новости. Либо твой хостер - мудак, либо ты.
изображение.png55 Кб, 569x430
274 3029421
Всем привет. Как можно улучшить этот код? Проверки на null для каждой подчеркнутой строки ставить или можно как-то покрасивее это всё организовать. Код вытаскивает значение атрибута и значение поля.
275 3029439
>>29421
Я знаю, но тебе нихуя не скажу)
276 3029471
Из новостей:
Microsoft намерена переписать с использованием языка Rust ключевые сервисы Microsoft 365, изначально написанные на языке C#

Что не так с сишарпом?
277 3029489
>>29471
Он медленный, даже медленнее джавы. То что там кто-то бенчмарки дрочит, так это не сишарп а вставки с указателями на си или плюсах. Вот и получается, что быстрый код - это код на плюсах. А раст лучше плюсов.
278 3029493
>>29471

>Что не так с сишарпом?


Всё так. Пляшем дальше.
279 3029497
>>29489

>А раст лучше плюсов.


Да ну? Раст это как токарный станок. А плюсы это как 3D принтер.
17067820713170.jpg147 Кб, 578x600
280 3029519
периодически использую метод индийского мастера, когда надо переназначить пачку переменных в зависимости от значений другой пачки переменных, а как можно по другому сделать?
281 3029540
>>29519

>а как можно по другому сделать?


Оператор switch для этого придумали
282 3029704
>>29471
Ну так вперед на раст
Узнаешь
283 3029764
>>29704

>на раст


А вот тут было смешно. Ты предлагаешь с японского байка на самокат пересесть? Причём даже не на электросамокат, а на тот, на котором ты ногой от асфальта отталкиваешься и катишься до момента, покуда ещё раз ногой оттолнёшься.

Какой нахуй Rust?
284 3029774
>>29764
нет. я предлагаю узнать ответ что не так с си шарпом и так с растом
ответ прост - НИЧЕГО.
обычная оптимизация горячих частей на более быстром, но менее удобном языке. Используется в мире повсеместно и поэтому тупые вопросы "что не так с <язык>" понимающие люди не задают
285 3030015
>>29421
У тебя надо каждую вторую строчку менять. Например, если добавить какой-то другой атрибут, получишь исключение.
286 3030051
>>29471
Деврелы раста увидели вакансию на сайте и побежали покупать статью для линковки. Но что-то пошло не так.
287 3030066
>>29471
Почаны еще макросов не нюхали, наиграются на деньги кабана и дропнут этот легкочитаемый и любимый всеми язык.
самое забавное, на картинках простые функции, что будет когда начнут писать тырпрайз-монстров?
image.png119 Кб, 315x344
288 3030073
>>29489
Займись уже делом, зачем прозябаешь на двачах свою юность.
289 3030150
>>26638
напиши клиент яндекс музыки под линух, сам такой хуйней маюсь
290 3030163
>>30066
Какой отборный кал на скриншотах.
Мерзость же.
291 3030167
>>26638

>Что интересного можно написать на авалонии?


Судя то тому, что я вижу у некоторых разработчиков, на Авалонии можно написать всё. Реально кроссплатформенны GUI. Но всё же интерфейс на ней чуть менее отзывчивый, чем на WinForms.
.png33 Кб, 888x381
292 3030277
>>29421
Не особо вникая, не меняя логики
.png17 Кб, 455x345
293 3030307
>>29519
Можно так, если свич не хочется
294 3030378
>>30307
Так вот кто украл гигабайты и мегагерцы.
295 3030519
К слову, про маппинги значений, как нормально сделать двусторонний маппинг?
Вот, например, есть у меня enum с n значений, и каждому значению биективно сопоставлена строка.
Мне надо написать метод, который конвертирует одно в другое, и метод, который конвертирует обратно.
Если писать через свитчи, это дублирование. Если заводить словарь, то его придётся разворачивать, а это убого.
296 3030524
>>30519

> Если заводить словарь, то его придётся разворачивать,


Если значений много, то быстре словаря ничего нет. И два словаря это решение.
Если значений немного, то вообще похую на реализацию.
.png50 Кб, 654x739
297 3030568
>>30519
Если на перформанс похуй - можно такое намутить)
298 3030588
Я ждал, когда кто-нибудь наконец не предложит рефлексию.
299 3030625
>>30524
Я хочу, чтобы код нормально выглядел, был читаемым и поддерживаемым. Значений около 10, производительность вообще роли не играет, тут любой способ будет достаточно быстрым.

>>30568
Мне это не нравится, потому что строковый код - это не свойство енама.
Я немного конкретизирую задачу, если интересно.
У меня есть две базы данных, в которых хранятся показания счётчиков. Формат хранения в базах разный, и даже имя одного и того же счётчика записаны по-разному.
У меня есть код, который берет название счётчика и трансформирует его в набор атрибутов, которые этот счётчик единственным образом идентифицируют. Один из атрибутов - это как раз перечисление.
Весь результат едет на фронт, где с ним что-то делается.
Соответственно, на фронте есть фильтрация, и поэтому мне надо обратно собирать идентификатор счётчика для каждой базы из этих атрибутов, и соответственно, это перечисление является частью идентификатора, только в закодированном виде.
Я сейчас написал просто 4 свитча, но мне не нравится дублирование сопоставлений.
Заводить словарь dic, а потом из него делать второй dic2 = dic.ToDictionary(x=> x.Value, x => x.Key) я не хочу, потому что это некрасиво.
300 3030628
>>22780
Крч понял что кнопки прям в гриде будут ужасно выглядеть, тем более их планируются делать больше одной, поэтому решил запилить их в контекстном меню. Но оказалось что TreeDataGrid умеет только при RowSelection доступно свойство SelectedItem, а при CellSelection нет. А выделять в TreeDataGrid целую строку меганеудобно. Теперь хз что делать, гайдов по созданию собственной selection model не нашел, придется ждать когда эту фичу в либу добавят. Бугурт
301 3030644
>>30628

>Но оказалось что TreeDataGrid только при selection-модели RowSelection может получить свойство SelectedItem, а при CellSelection нет.



Слоуфикс
302 3030668
>>30625

var myKey = types.FirstOrDefault(x => x.Value == "one").Key;

Вот это тебе не поможет?
Можно отделаться одним словарём, вместо двух.
.png83 Кб, 707x956
303 3030715
>>30625

> Я немного конкретизирую задачу.


))) Ха, диванон

Могу только вот такое предложить тогда)))
304 3030726
>>30715
Наверное надо пояснить за решение.
1. Производительность роли не играет, так что мы на нее забиваем.
2. Чтобы код был поддерживаемым - мы выносим всю эту муру с картами - в конфигурационные файлики. Если не хочешь, чтобы засиралась папка с проектом и не лазили всякие "ПРОДВИНУТЫЕ ПОЛЬЗОВАТЕЛИ" - делаешь файлик embedded.

Ну а далее. У тебя просто карта лежит в файлике. При надобности - ты ее расширяешь. Хочешь - можешь в одном файлике все эти карты хранить. Код при этом - тебе не надо будет менять больше никогда. И маппер такой ты можешь вызвать из любого места своей программулины. Единственное в плане поддержки - это при добавлении необходимости чет еще маппить таким макаром - ты будешь должен регистрировать это дело. Но это не так сложно.

Я бы оставил свич. Свич поймет и джун, и стажер, и вообще кто угодно.
305 3030729
>>30726
Минус решения - тебе надо при расширении своего enum'а лезть в этот файлик. Но это решаемо.
306 3030734
>>30715
Да. Это можно оптимизировать, загружая файл один раз и храня словарь этот. В идеале - сделать ленивую загрузку.
307 3030827
>>30668
Это ничем не лучше разворота словаря.

>>30715
>>30726
Это жесть какой оверкилл. Вероятность изменения енама и кодов у меня на самом деле близка к нулю, поэтому такой код при всей его мощности очень проигрывает в читаемости.

Ладно, всем большое спасибо за советы и потраченное время.

Я просто думал, может это я дурак, каждый раз, когда приходится делать такой двунаправленный матчинг, пишу говнокод, а есть нормальный способ.
2024-02-0214-08-06.png51 Кб, 749x618
308 3031438
>>30628

>TreeDataGrid


У авалонии есть TreeDataGrid. Вот прямо щас надо запилить такое на WPF, это какой-то пиздец.

Хочу себе лог вьювер запилить с поддержкой вложения. Миллиард этих вьюверов и все какой-то кал.
309 3031953
>>31438

> лог вьювер запилить


Вот только логи обычно в кибане ковыряются
310 3032484
Реально не смог загуглить.
Может ли VS сделать две (и более) вкладки (окна редактирования) на один файл??
311 3032487
>>32484
Window > New Window
image.png132 Кб, 600x600
312 3032489
>>32487
Жесть, спасибо анонче.
313 3032679
>>31438

>У авалонии есть TreeDataGrid



Так я о нем и писал. моя проблема - неясно как кастомный Selection Model пилить. В целом у меня нет прям супер претензий к держателям репы, в одном из issue ЕМНИП заявлено что это контрол де-факто в альфа стадии
314 3033413
>>32679
Я вопрос поставить забыл. Я удивлен. В WPF такого нет. Нашел вариант на CodeProject, где используется обычный DataGrid, но там итем представляется как еще один DataGrid.
1706984514419.jpg269 Кб, 768x1024
315 3033431
>>02293 (OP)

> 14.01



Почему тред такой дохлый? Ваш язык совсем некому не нужен что-ли?
316 3033489
>>33431
Все так, пилим десктопы, учим джаву чтобы перейти в нормальную современную разработку...
317 3033502
>>33489
Я вот о перекате в раст подумываю. Уже даже чулки заказал...
318 3033560
>>33431
Язык не вызывает вопросов. Что обсуждать?
319 3033581
>>33560
У меня есть вопросы. Но в треде не смогут объяснить, че за беда.
320 3033588
>>33581
Спрашивай. Гарантии решения нет, но чем сможем - поможем.
321 3033598
>>33588
Ну окей.

Есть tcp-сервер на шарпе.

Есть железки, которые этот сервер обслуживает. Общение через GPRS(2G/3G)

Есть ОПСОС.

С железками, у которых связь 2G - происходит странная магия. После 25к подключенных железок - с ними начинает рандомно пропадать связь.

ОПСОС говорит - все передаю, сервер не отвечает.
На сервере - я вижу, что через какое-то время, от той стороны не приходят данные, и сервер рубит соединение.
В таком вот режиме - где-то 10% железок - рандомно отваливаются.
При этом, если перезагрузить сервер - все подключаются и какое-то время все ок.

И самая страшная магия начинается вот в чем. Я включаю на уровне сокетов KeepAlive, и начинается сущий пиздец - 90% железок отваливаются. При этом, я вижу WireShark'ом, что кипэлайвы отправляются, но никто не отвечает на них.

Собственно. Вопросы-то в том, почему это началось после вот такой красивой цифры: 25к. До 25к - хоть 2g, хоть 4g, хоть что - стабильно все(ну, разрывы бывали, но в районе погрешности, типа 2-3 устройства отваливаюлись, но после 25к - резкий скачек до 10%)?
Почему - это именно с 2g? 3g и выше - нормально работают. Через Ethernet - тоже все ОК, хоть 100к подключений делай.
Почему KeepAlive, только хуже сделал? Причем значительно. Вроде как опсос говорит, что да, мы рубим, если канал неактивен, вот, кипэлайвом немного нагружаем канал, чтобы был активен, но после его включения - тотальный пиздец начался.

И может ли пиздеть опсос? Потому что на другом объекте - заменили симки - и проблемы исчезли.

И я понимаю, что это вопросы не касающиеся шарпов непосредственно. Потому и не хотел их задавать.
322 3033607
>>33598
Провайдер может пиздеть - это аксиома.

На первой линии поддержки никогда ничем не помогут, на второй линии поддержки - как повезёт.
И вот когда твоё обращение попадёт к инженеру, который шарит, то он или решит проблему, или объяснит в чём дело.

Исходя из из твоего рассказа вероятность ИСТОЧНИКА проблемы на стороне провайдера на порядок-другой выше, чем проблема с твоей стороны.

Но это не означает что с твоей стороны нет проблем - бывает какая-то сущая мелочь, которую не замечаешь, а она всё решает.

Ах да, несколько раз бывало что проблема на моей стороне, но инженер с той стороны настолько крут, что давал подсказку как исправить.

Ах да, keep alive. Так мобильныйровайдер специально может душить, чтобы не резервировал слот в GSM.
323 3033617
>>33598
На 2g может просто слотов не хватает. Там временное разделение. Погугли gsm timeslot. Тем более на медленном старинном 2g.
324 3033635
>>33617
Хм. Погуглю. Вот за это спасибо.
Интересно - можно ли как-то на моей стороне с этим бороться.
325 3033641
>>33607
Тоже спасибо. Наверное, придется выходить на связь с инженерами опсоса.
326 3033689
>>33641
дамп пакетов сними и найди косяки что бы с голой жопой не идти в саппорт
327 3033744
>>33502
Хоть язык и цепляет возможностью дропнуть сборку мусора, но яп несет тонну проблем.
-плохая читаемость кода.
-это чтение на максимум усугубляют макросы.
-множество брошенных васянских либ, ибо язык на живет на хайпе.
-макросная магия нередко не дает даже изучить эти васянские либы, все постижение идет чуть ли не через ишью
-проблемы с асинками.
-в целом если с хеллоувордами все ок, то дальше может столкнуться с косяками дизайна раста, это лафтаймы, это rc (местная сборка мусора) и прочие костыли.
-какое-то неадекватное комьюнити.
-непонятна ниша языка, для ембеддед нужны костылить чтобы писать, для прикладного нужно страдать и медленно разрабатывать, а системное слишком низкая ниша, да из-за наличие готовых либ, си или плюсы выглядят лучше.
-не забываем что языку уже не мало лет, эта стагнация тоже не приносит бонусов, а успешные менеджеры фонда, как-будто больше заинтересованы политикой и хайпом на продукт, чем на самим продуктом.

В общем, я предлагаю не вестись на хайп, а ждать что-то лучшее или хотя бы зрелости от этого самого раста. К примеру, тот же зиг сделал многие вещи из раста намного проще, поэтому варинт что могут высрать более удобный язык под большим финансированием гигантов, все же остается
328 3033745
>>33431
Я наоборот люблю, когда медленно двигается, к вечеру не нужно портянку бессмысленного флуда читать.
329 3033769
>>33744
Двачую, раст не нужен. Я прямо сейчас пишу на нем такой себе curl на минималках и это пиздец. Язык максимально душный, документации нихуя, примеры кода устаревшие, после сишарпа будто вернулся во времена перфокарт. Каждый мудак обязательно использует макросы, в итоге ты просто копипастишь куски кода и даже не понимаешь, как это работает. Ваш Result не Result, пришло время написать unwrap, напиши его снова. А вот тут вы передали владение ололо засрите весь код mut ссылками на вашу переменную.
Автор сишарпа и тайпскрипта просто гениальный гений, блять, на фоне этих долбоебов в чулках.
330 3033770
>>33635
Используй шардинг на несколько симок, чтобы по каждой не превышать лимит в 25к. Разным клиентам выдай разные номера.
331 3033846
>>33769

>Автор сишарпа и тайпскрипта просто гениальный гений


А то. Особенно если вспомнить, что он еще и создатель Turbo Pascal'я и Delphi. Хейлсберг наше всё.
332 3033882
>>33846

>тайпскрипта


Оверсложные типы, отсутствие совместимости с дотнет. Сомнительное решение без будущего. Заменяется одним javadoc который не портит читабельность и не требует сопровождение двух языков.

Вообще, в ИТ многое идет не туда. Например отсутствие прокси языка у С++, нет прокси языка у кривого го.
Котлин, который пошел по пути бредовой мультиплатформы, вместо того чтобы стать языком универсалом, который мог бы собираться под рантайм го или рантайм дотнета.
333 3033885
>>33882

> собираться под рантайм го или рантайм дотнета.


Поясню, чтобы не казалось бредом.
Они реально это обсуждали и допускали на уровне желаний.
Если с го были какие-то проблемы, до дотнет был достижим.
334 3033887
>>33885
Так все люди изначально создававшие котлин ушли из жб. Я вообще хз зачем он нужен, тот же свифт гораздо любопытнее выглядит, но там ситуация как с шарпом - ряяя эпл вердерлок.
335 3033894
>>33744
Ты случайно не тот шизик, который все растотреды засрал? Про маркетинг и фанбоев забыл
336 3033955
>>33846
TurboPascal создал Филипп Кан, а парень, о котором ты говоришь, создал протоип Blue Label Pascal, который перекупил Филипп.
337 3034617
>>33887

>тот же свифт гораздо любопытнее выглядит


кому любопытнее?
338 3034780
123
339 3034813
>>34780
Ну чë, разбанили? Опять умирающий котофей, да?
.png85 Кб, 933x305
340 3034816
Анончик, анончик. Объясни мне за наследование. Не в плане че это. А в плане - когда оно нужно-то.

Типа. Допустим. Есть код как на прикриплейд.

Вроде кажется логичным. У нас есть некий базовый абстрактный класс, в котором общая логика. Есть какой-то кусок, который должен отличаться. Делаем метод абстрактным или виртуальным. Потом наследуемся, получаем ништяки базового класса, а остальную часть реализум.

Но вот оказывается, что что-то надо поменять в базовом классе. Мы меняем базовый класс. И потомки, теперь могут сломаться, придется лезть - чинить.

С другой стороны. Даже если мы не меняем базовый класс. Если мы сильно много кишков базового даем наследникам, они могут как угодно с ними играться, в результате - у тебя почти рандомно может выскочить ошибка в ходе обработки какого-нибудь списка объектов, исключение вылетит в базовом классе, и тебе придется по иерархии наследников пройтись, чтобы найти, кто там в кишках лазил неправильно.

Я с этим вот сталкивался - постоянно. И сколько не пытался придумать А КАК? Так и не смог. Потому - сейчас, я кроме интерфейсов не использую концепцию наследования. Ну, иногда еще когда типа "красиво сделать" - делаю базовый класс абстакнтым, а нужные мне имплементации - приватными вложенными, и через статический метод - создаю.

Можете показать примеры, когда наследование - хорошо и правильно работает. И где почитать о том, как его готовить? А то я почему-то смотрю чужой код и в большинстве вижу, что такие же как я челы, по сути отказываются от наследования, и предпочитают интерфейсы.
341 3034856
>>34816

>Мы меняем базовый класс. И потомки, теперь могут сломаться, придется лезть - чинить.


Ну так это и есть основная проблема наследования.

>Потому - сейчас, я кроме интерфейсов не использую концепцию наследования. Ну, иногда еще когда типа "красиво сделать" - делаю базовый класс абстакнтым, а нужные мне имплементации - приватными вложенными, и через статический метод - создаю.


Ну так правильно все делаешь. Не совсем понятно, что ты имеешь в виду под "приватными вложенными" и каким именно образом ты статику используешь. Но направление мысли верное - чем меньше бесконтрольного наследования - тем лучше.

Это хорошо еще, что в шарпе множественного наследования нет. Представь сколько хуйни было бы с ним.
342 3034868
>>34813
Что за котофей? Сорян, не там затестил, у меня в /b бан
.png55 Кб, 671x360
343 3034885
>>34856

> Не совсем понятно, что ты имеешь в виду под "приватными вложенными"


Я имею ввиду что-то типа прикриплейд.

Типа. Ну, типа, когда я не хочу наружу всю вот эту иерархию вытаскивать. Другие примеры: какие-нибудь валидаторы, типа я хочу сделать абстактный валидатор, а внутри прячу типа StringLengthValidator, StringPatternValidator и прочее, наруже будет просто Validator. Но опять, эту фигню я подсмотрел когда лазил в Functional Extensions for C#, и с тех пор иногда применяю.
344 3035427
>>34816
На любое гуи посмотри.
Там стоэтажное наследование, но иначе будет жесть

Предпочитать делеширование != всегда лучше делегировать
345 3035437
Почему жыэс может забить хуй на пропущенные точки с запятой, а сисярп нет?
346 3035449
>>35437
Потому что есть спеки
347 3035457
>>34816
Понимание таких вещей приходит с опытом. Пиши как умеешь и не парься, со временем научишься. Или уйдешь в менеджеры, весь епам так делает.
348 3035461
>>35427
В том и дело, что я смотрел на гуи. И там наследование часто используется ВЕСЬМА СПЕЦИФИЧНО. Т.е. те элементы, которые вроде как казалось бы должны быть в одной иерархии - не в одной, а те что как-бы должны отличатся - в одной. В результате - приходится всячески извращаться, чтобы от поведения родителя избавиться, либо добавить нужное поведение которое уже реализовано в параллельной иерархии.

И на фоне этого есть ЖСовские фреймворки, где композитный подход многие используют, в котором нужное поведение своему компоненту ты делаешь как-то так:

<validator v-model="valid">
<presenter :data-source="page.data">
<template #top>
<my-top-bar :actions="page.actions"/>
</template>
<template #bottom>
<paginator v-model="page.meta"/>
</template>
</presenter>
</validator>
349 3035475
>>35461
Ты занимаешься какой-то хуйней ради хуйни. Просто пиши код, который решает задачу.
350 3035477
>>35461
не путай разметку (то есть читай описание структуры в текстовом виде, которую можно транслировать во что угодно) со своим вопросом по ООП

это вещи вообще из разных миров.
351 3035483
>>35477
Та можно было бы и без разметки.

const validator = useValidator();
const paginator = usePaginator();
const topBar = useTopBar();
...

Суть в том, что я поведение компонента могу очень просто под задачу подстроить без наследования.

Я это все пишу на фоне опыта того как, допустим, я делал TreeList для Xamarin, которого нет из коробки. Это была сущая боль. Это были страдания. Литры пролитых слез и бессоных ночей.
А потом - такой же TreeList на Vue - за полчасика хуяк-хуяк и закрыл таску.
352 3035495
>>35483
А потом ты бы пописал на jetpack compose и вообще ссал бы кипятком от возможности создания франкенштейнов без разметки вообще.
и что с того
мы подходы к гуи обсуждаем или вопрос был по ооп? ты как то определись.

я тебе говорю про конкретные вещи
возьми контролы КНОПКА, КОМБОБОКС, КАРТИНКА и так далее
хоть в своем любимом браузере блин. Они не элементы хмл, они контролы в объектной модели

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

Конечно жс в общем то не имеет наследования (там прототипная шняга), но мы же про стандартный ООП говорим.

Вообще делегирующий подход есть - jetpack compose использует как раз делегирование, а не наследование. Но шарп на это не способен. И вообще это не делегирование ради делегирования, а DSL
353 3035498
>>35483
вернее не то чтобы не способен.
в шарпе тоже можно сделать как в том же swift combine
и даже сделали же что то ( я видел видосы) в мауи
правда где оно в итоге вместо хамла - я хз.

Но это не то делегирование что "замена наследованию"
это через ектеншены, что немного не то
хотя семантически можно сказать что делегирование.
354 3035626
>>02293 (OP)
Шарпаны, дайте совет по ASP.NET core. Мне нужно, чтобы после UseEndpoints выполнился другой MiddleWare, который обрабатывает 404 и при этом возвращает тип IApplicationBuilder. Как такое сделать?
355 3035628
>>35626
Фильтры загугли
356 3035630
>>35628
Спасибо за наводку, анонче!
image.png50 Кб, 1000x1000
357 3035645
Положняк по пикрилу?
358 3035648
Вкатываться в .net видимо не имеет смысла. Джунских вакансий вообще нет
image.png146 Кб, 750x1000
359 3035717
Я пишу код для себя.
360 3035761
>>35717
Ну и норм. Я тоже когда-то писал код для себя. Потом в какой-то момент подумал, а какого фига, я это делаю просто так, если за это можно еще и деньги получать.
361 3035889
>>35648
Их уже даже в 1с нет. Вкат полностью умер.
362 3035892
>>35645
Только по приколу для пет проекта
363 3035893
>>35717
>>35761
Счастливые времена.
364 3035910
>>35893
Да и сейчас можно пойти на завод набраться опыта, но вам же веб подавай со смузи.
365 3035968
Сап гайз. Такой вопрос возник туповатый, хочу поучить с# ради юнити никаких планов особо не строю, попался на видос https://www.youtube.com/watch?v=w8rRhAup4kg
но возник вопрос. Препод в видосе создает консольное приложение (.NET Framework) на платформе .net 4.7.2 и на основе его учит, когда есть уже net 8. Стоит ли повторять 1 в 1 или создать на net 8?
366 3035994
>>35968

>Стоит ли повторять 1 в 1


Пожалуй, стоит.
Не спрашивай почему - чуствую так.
367 3036068
>>34816
Зачекай букву l из солида
Предпочитай композицию
Наследование реализуй в каких нибудь банальных ситуациях типа налседования от класса Person и когда тебе реально нужны реализации в базовом классе.
Также с помощью наследования можно ебонуть мощную поддержку дженериков, переопределяя по сути одним дженериком метод базового класса и при этом сохраняя инвариант.
Также мощь наследования можно понять с помощью гоф паттернов, там какие то поведенческие паттерны выдают приколы через наследования. К примеру с помощью visitor можно ахуенно избавиться от ветвлений для однородных объектов и абстрагировать логику
368 3036082
Ребят, есть у кого ссылка сливов на курсы ITVDN ASP.NET Core? Их бля почистили с трекеров
369 3036230
>>35648
в итоге олды уйдут на покой, а джунов не будет
и твое место займет бомж из соседней мусорки, что книжку по шарпу бородатых годов нашел и прочитал.
370 3036240
>>36068
Визитор - это антипаттерн, его не надо использовать.
371 3036245
>>36240
кто тебя покусал и внушил тебе такую чушь?
372 3036262
>>36240
Почему?
Как я и сказал это один из способов избавиться от ветвлений и абстрагировать логику
Если бы об этом знали разрабы киберпанка то их бы не поливали гавной
373 3036270
>>36262
А еще это классическое решение проблемы двойной диспетчеризации

ну да, вместо решения этой проблемы можно пойти...на завод грузчиком
374 3036279
>>35910
Ты о чём? Счастливые те времена потому что можно свои проекты пердолить и переписывать десятки раз.
Когда прогаешь на дядю всё же энтузиазма на свои проекты порой не хватает
375 3036296
>>36262
Когда ты используешь визитор и медиатор, твой код оказывается разорван на мелкие кусочки. Особенно медиатор в обработчиках ивентов на микросервисах, это полный ебаный пиздец. Потом тебе надо обойти все 100500 мест кода и сложить этот пазл обратно чтобы понять, как эта хуйня вообще работает.
Логику не надо никуда абстрагировать. Такой хуйней занимались во времена GOF, когда пердолили абстрактные фабрики абстрактных фабрик, чтобы посчитать сумму в массиве. В 2024 пишут простой и понятный код.
376 3036303
>>36296
а ну покажи решение двойной диспетчеризации не через визитор и без хрени типа dynamic и рантаймовых исключений

а мы посмотрим
377 3036312
>>36303
Покажи бизнес-задачу, где это надо.
378 3036336
>>36312
А вот и пришли сразу к ТЕЬЕ ЛИЧНО НЕ НУЖНО
а как дышал, как дышал)
379 3036341
>>36336
Покажи, где нужно. Ты же у мамы умненький.
380 3036345
>>36341
тебе нигде. ты же калькуляторы пишешь - и те с помощью chatgpt

тут вот чел выше граф редактор делает - вот ему вполне можно применить визитор если он не хочет в рантайме исключения типов ловить.
381 3036371
>>36345
Каждый школьник-вкатунец пишет то свой редактор, то свою субд. Судя по багажу знаний, ты пишешь целую операционку с нескучными обоями.
382 3036378
>>36371
ну пишет и пишет. имеет право
ты спросил куда применить - я тебе показал реальный пример
а то что ты там сидишь в своем формшлепском мирке - твои проблемы
жаль тебя....ну или нет.
384 3036540
>>36449
удивительно что нужно пояснять очевидные вещи
385 3036582
>>35968

>Препод


Препод из Ромки, как из говна пуля.

>Стоит ли повторять 1 в 1 или создать на net 8?


Если ты хочешь учить шарп конкретно для Юнити, то стоит. Потому, что там под капотом mono по факту, а он по сути и есть попенсорсный .NetFramework
Если ты хотел юзать в геймдеве фишечки из современного шарпа - забудь. И вообще привыкай писать все просто и прямо как топор. За использование того же linq тебе к примеру сразу огурец в жопу вставят.
386 3036733
>>36582

>За использование того же linq тебе к примеру сразу огурец в жопу вставят.


Почему?
387 3036887
>>36733
А ты возьми и забенчмаркай и сравни хотя бы обычный foreach против .foreach() или поиск в обычном цикле или .Where() (ессно не на последнем .Net-е, а на том самом который к юнити прикручен)
Если ты хочешь, чтобы твоя игра была не дергающимся говном, а выдавала стабильные, хотя бы 60FPS, то все современные "бестпрактис" по написанию понятного и поддерживаемого кода идут строго нахрен. В геймдеве в почете скорость.
388 3036895
>>36887
Лол, форич как метод это не из линку, а от лист<т>
389 3036914
>>36895
По смыслу он прав.
390 3036947
>>36582
Спасибо
391 3037177
>>36947
Никогда не спрашивай и не слушай на двочах
Тут модер жаба-даун, перебанил половину комьюнити /pr, от чего сидит срёт сам и шизиков развлекает.

Просто открой официальные доки, пришлось потратить 3 секунды гугла, какое нахрен моно и фремйворк 4.
https://docs.unity3d.com/2023.3/Documentation/Manual/CSharpCompiler.html
392 3037178
>>36887
Я как-то смотрел видосик, там чел сравнивал производительность в задаче посчитать сумму массива. Петушиный linq выдал 40 единиц (миллисекунд, кажется, я точно не помню), а simd - 0.6 единиц, лол. Я вообще не понимаю, нахуй кому в 2024 нужен тот linq. Его в свое время сделали, чтобы впарить мартышкам новую версию вижуал студии, а для разработки это говно без задач.
393 3037220
>>37178
Что блять?
Ты сравнил ассемблерную векторную команду с LINQ на полном серьёзе?
Ты совсем поехал?

Ну то есть ты сейчас жалуешься, что микроскопом гвозди плохо забиваются.
394 3037233
>>37220
Поридж, если ты собираешься делать игры, тебе придется думать о таких вещах. Вплоть до того, где какие байты лежат и сколько раз проц ходит в память. Если ты напердолишь абстрактных фабрик и прочих бест практик из книжек, твоя поделка выдаст 5 фпс и обмякнет. Добро пожаловать в программирование.
395 3037261
>>37178
Как там в 2015, дурачок? На последнем дотнете линк считающий сумму массива точно так же развернется в векторизованный код.

Только кто юзает линк в хай перформанс местах? Ты?
image.png1,2 Мб, 1280x722
396 3037278
>>37233

>Поридж, если ты собираешься делать игры, тебе придется думать о таких вещах. Вплоть до того, где какие байты лежат и сколько раз проц ходит в память. Если ты напердолишь абстрактных фабрик и прочих бест практик из книжек, твоя поделка выдаст 5 фпс и обмякнет. Добро пожаловать в программирование.

397 3037311
>>37177

>Просто открой официальные доки, пришлось потратить 3 секунды гугла, какое нахрен моно и фремйворк 4


Угу. У джавы вон тоже вроде как 21-я версия последняя, а сидят все на 8-й (утрирую конечно) Вот и в юнити так же. Вроде как можно и новое, но по факту, чтобы твоё игроподелие нормально работало везде - хер ты из пределов .Net standarta и frameworkа вылезешь.
398 3037690
>>37261
Не развернется
399 3038082
>>37233

> делать игры


> на языке с гарбедж коллектором


Ты там ебобо? Мож РТОС на шарпе еще хочешь?

Давай теперь ты покажешь мне как ты на ассемблере напишешь что-то в духе:

users.Where(x=>x.Role == Roles.Admin)
.Join(posts, x=>x.AuthorId, y=>y.Id, (z, z1) => new {z.Namy, z.Email, z.BirthDate, z1.PostText, PostDate = z1.Date})
.GroupBy(x=> x.BirthDate.Year)
.OrderBy(x=>x.Key)

И потом вернись сюда и сравни количество кода и простоту внесения изменений.
400 3038096
>>37233

>Поридж, если ты собираешься делать игры, тебе придется думать о таких вещах. Вплоть до того, где какие байты лежат и сколько раз проц ходит в память. Если ты напердолишь абстрактных фабрик и прочих бест практик из книжек, твоя поделка выдаст 5 фпс и обмякнет. Добро пожаловать в программирование.


Я не собираюсь игры писать, я пишу b2b ентерпрайз приложения. В моей сфере фичи гораздо важнее, чем байтоебля, у нас нет времени тратить годы на написание быстрого, но неподдерживаемого кода.

Мне тогда непонятно, на кой хер юнити нужен сишарп, если там из сишарпа ничего не используется?
401 3038211
>>38096

> если там из сишарпа ничего не используется?


Как и в анриле - просто язык, а не платформа. В юнити и реализация тасок своя на базе корутин.
Жс тоже порой как ембеддед яп юзается и там тоже нет никаких привычных стандартных объектов, повезёт если реализация стандарта полная
402 3038272
Господа шарписты, а расскажите, пожалуйста о мобильной разработке на C#.
Какое место на рынке мобильной разработки занимает шарп?
Почему какой-либо организации может прийти в голову делать приложение на Xamarin, а не на каком-нибудь Flutter?
В чём могут быть преимущества такого выбора?
403 3038281
>>38272
Я низнаю я не праграмист. Спраси у шляпки
404 3038284
>>38272

>Господа шарписты, а расскажите, пожалуйста о мобильной разработке на C#.


Есть мнение, что Xamarin сам не компилит, а транслирует код в Java. Но это неточно.

>Какое место на рынке мобильной разработки занимает шарп?


На уровне статпогрешности.

>Почему какой-либо организации может прийти в голову делать приложение на Xamarin, а не на каком-нибудь Flutter?


>В чём могут быть преимущества такого выбора?


При переносе десктопного продукта (а скорее только лишь какого-то компонента этого продукта) на мобильную платформу.
Если бизнес-логика сложная, то есть ситуации когда проще и дешевле портануть продукт на Андроид C# код, чем переписывать его на другом языке. Это когда надо быстро, это когда надо это сделать "ещё вчера".
405 3038286
>>38281
Ну какого хуя ты тут трёшся тогда, приживал?
406 3038289
>>38272

>Какое место на рынке мобильной разработки занимает шарп?


Если не учитывать геймдев со всякими юнити, годотом и т.д., то практически никакое.
407 3038291
>>38286
Я хачю стать начальникам праграмистав им ни нада знать язык дастатачна бить плёткой
408 3038306
>>38272

> Какое место на рынке мобильной разработки занимает шарп?


На самом деле не так мало. Сильно меньше чем другие, но немало.

> Почему какой-либо организации может прийти в голову делать приложение на Xamarin, а не на каком-нибудь Flutter?


Потому что штат шарпистов, и искать еще кого-то в хуй не уперлось.

> В чём могут быть преимущества такого выбора?


У тебя дохуя уже всего может быть написано на шарпе. Те же всякие хуйни для рассчетов, анализов и прочего, которые по тем или иным причинам должны выполняться на клиентской машине. Лезть, искать документацию (которой никогда нет), искать людей которые знают как проводить эти расчеты(которые уволились 10 лет назад), залазить в исходники неродного языка, это долго дорого и тяжко.
Плюс - экосистема майков. Она буквально лучшее что есть в мире программирования.
Плюс - до недавних времен - поддержка от майков, которая тебе возьмет, какие-то там штуки подкрутит - и у тебя летает приложение, что пиздец.
Плюс, иногда требуется как раз не чтобы нативно выглядело, а наоборот, чтобы на всех платформах одинаково+-. Особенно часто эта хуйня начинается, когда у компании торкает за корпаративный стиль, чтобы все продукты в одной стилистике, с одним набором иконок и прочего говна.
Короче, причин может быть много.
409 3038316
>>38291
аххахаха
410 3038354
>>38284

>Есть мнение, что Xamarin сам не компилит, а транслирует код в Java. Но это неточно


абсолютно неправильное мнение. все исполняется на clr рантайме, поэтому пустое приложение и весит так много
и стартует так долго

потому лучше выучить котлин
ну это если не нужно кроссплатформа
но срать на яблочников. они это любят.
411 3038374
Почаны. Как быть с тем, что я хочу с одной стороны - типы в своем коде.
С другой - плагины с хотрелодом?

Типа делать какую-то общую сборку Core с интерфейсами и заставлять плагины их использовать?
Вообще, где почитать про реальные примеры с плагинной архитектурой, не на детских примеров, а допустим - какой-то плеер или там игрулька, в которой я хочу иметь возможность подкрутить что-то в dll и не пересобирать все полностью, а чтобы НА ЛЕТУ прилетели изменения.
412 3038379
>>38374
AssemblyLoadContext?
413 3038380
>>38354

>абсолютно неправильное мнение. все исполняется на clr рантайме, поэтому пустое приложение и весит так много


>и стартует так долго


>


Не, мнение не из за скорости. Я имею в виду что есть мнение, что C# на этапе компиляции транслируется в Java на уровне исходного, а дальше всё как обычно.

Откуда такое мнение? Есть две причины.

1. Написать компилятор уровня C# не по силам "стартапам" уровня Xamarin. Какой бы Мигель не был гений, но это пиздецовски сложная задача.

2. Если распаковать APK и заглянуть внутрь...
414 3038387

> Есть мнение


Такое ощущение, будто внутри Xamarin происходит какая-то магия, и никто точно не знает, как он работает.
415 3038394
>>38380

>но это пиздецовски сложная задача.


Что там Котлин? Обозвали препроцессор языком и довольные.
А как щёки надували - "мы компилятор напишем". Написали? Сдулись.
416 3038459
>>38380

>Я имею в виду что есть мнение, что C# на этапе компиляции транслируется в Java на уровне исходного


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

>Какой бы Мигель не был гений, но это пиздецовски сложная задача.


есть моно рантайм. почему то его достаточно для написания игр, а тут не по силам
про блазор вообще вспоминать не буду - еще скажи что он в жс транслирует.

>>38394
котлин няшный вышел. но он не транслирует себя в жаву
как и на рантайме дотнета тоже не один язык - но все они транслируют в IL
417 3038465
>>38459
Ну хуй знает. Может быть ты прав, может быть нет.
Углубляться лениво.
418 3038478
>>38465
Уходи в лес. Есть мнение что 5g вышки облучают
Ты не выживешь
419 3038557
>>38478

>Уходи в лес.


А я по-твоему где? Уже давно там.
420 3038633
>>38374
https://metanit.com/sharp/tutorial/14.3.php
https://metanit.com/sharp/tutorial/18.3.php
Это если вкратце, а за более подробным на МСДН
изображение.png126 Кб, 1230x507
421 3039398
Здравствуйте. Есть код, который вытаскивает значение атрибута поля и его месторасположение на листе в Excel. Как мне получить значение поля с типом данных поля или как скастить? А то при использовании GetValue() возвращается объект, который я могу преобразовать только в string. А нужно, чтобы был тип данных поля, иначе в Excel всё будет строкой, а там формулы...
422 3039432
Нужна ваша помощь с впф. Есть некая рамка и изображение в ней. Суть в том, что изображение в несколько раз больше рамки и пользователь должен иметь возможность это изображение перетаскивать внутри неё, чтобы выбрать тот кусочек, который хочет. И звучит то вроде просто, но у меня никак не получается это реализовать. Если просто прописать размеры больше рамки рендерится все равно будет только видимая часть и при перемещении через translate transform все остальное будет прозрачным. Есть идеи как такое можно реализовать?
423 3039513
>>39398
Там по моему для ячейки можно достать атрибут, который укажет какой excel-тип данных у неё. Тебе надо написать свой резолвер который будет преобразовывать значение в зависимости от него. Простым кастом тут не получится.
2024-02-0802-56-22.png2 Кб, 410x91
424 3040079
>>39432
Зависит от контейнера в котором находится изображение. Некоторые обрезают по габаритам, а некоторые нет.

Какие контролы не обрезают: Canvas. Но у него есть существенный минус — его локальное пространство бесконечно. Контент не видит границ родителя, как у Grid к примеру. Ты можешь сколько угодно менять размер Canvas, но содержимое под эти размеры никак не сможет адаптироваться, если ты этому контенту сам не передашь информацию.

Все остальные контролы обрезают. Причем может сложиться ощущение, что Border или Grid не обрезают, если размер контента не больше габаритов родителя. К примеру Grid имеет габариты 100х100, а изображение внутри 30х30. Так вот если ты при помощи RenderTransform сместишь изображение за пределы грида, то изображение не обрежется. Но если ты поставишь размер изображения 300х300, то оно обрежется оставив до габаритов родителя т.е. 100х100. При этом изображение все так же может выходить за пределы грида, только вот в уже обрезанном состоянии. А все потому, что RenderTransform в отличии от LayoutTransform пересчитывается постфактум на этапе рендера, когда грид УЖЕ обрезал твое изображение.

Какие уловки можно в этом случае провернуть? Самый тупой это картинке установить Margin в минус. Чем меньше значение (относительно нуля), тем больше ход твоего изображения. Но это ебень, лучше использовать канвас. В твоем случае уж точно.
Можно попробовать тыкнуть палкой LayoutTransform, но я тебе ничего не смогу сказать по этому поводу.

Еще я заметил, что может обрезаться если один контейнер положить в другой. Обычно такое замечаю в сложных вложениях, когда какие нибудь десять гридов упакованы в юзер контрол, который упакован еще в десять гридов. Ты можешь сделать работающий контрол, но потом вложить его куда нибудь и все пойдет по пизде. Этот факт надо учитывать.

Еще информация для справки. Если ты собираешься что-то тягать, то конечно же ты можешь использовать любой контрол и даже заставить двигаться Image. Уж не знаю какой ты способ выбрал: то ли отслеживать MouseMove рамки, то ли картинки, но есть еще один вариант. Если ты в качестве перетягиваемого элемента будешь использовать Thumb, то у него в событиях есть лютая годнота в виде DragDelta — это относительное смешение мыши при перетягивании. Все что остается, это данное значение запихнуть в Matrix.Move, который тоже смещает на относительную величину.
Но есть нюанс. Нюанс с вращением. Если Thumb повернут трансформациями, то дельта будет рассчитываться относительно повернутого объекта. Это может быть как гемором так и фичей. Например, если ты делаешь какой нибудь слайдер, то ты можешь сделать логику для перемещения Thumb по оси X, а если тебе нужен вертикальный вариант слайдера, то ты просто устанавливаешь контролу трансформацию с поворотом на 90 градусов, при этом визуально ползунок будет двигаться по оси Y, но внутри он все так же работает по оси X. Очень удобно.

В этот Thumb ты помещаешь ImageBrush, в котором и будет находиться твое изображение. Причем возможности ImageBrush гораздо шире того же Image. Там можно контролировать масштаб, положение и тайлинг изображения. В свойствах есть же есть так называемый ViewBox, это виртуальная область визуализации и все что выходит за его пределы — обрезается. Такой ViewBox много где используется, например в SVG.
Не знаю, нужно тебе или нет, просто информирую.

А еще погугли что такое Adorner. Возможно рамка, которая показывает область обрезки изображения (как и сами манипуляторы масштабирования/премещения) лучше делать через адорнер-слой.
2024-02-0802-56-22.png2 Кб, 410x91
424 3040079
>>39432
Зависит от контейнера в котором находится изображение. Некоторые обрезают по габаритам, а некоторые нет.

Какие контролы не обрезают: Canvas. Но у него есть существенный минус — его локальное пространство бесконечно. Контент не видит границ родителя, как у Grid к примеру. Ты можешь сколько угодно менять размер Canvas, но содержимое под эти размеры никак не сможет адаптироваться, если ты этому контенту сам не передашь информацию.

Все остальные контролы обрезают. Причем может сложиться ощущение, что Border или Grid не обрезают, если размер контента не больше габаритов родителя. К примеру Grid имеет габариты 100х100, а изображение внутри 30х30. Так вот если ты при помощи RenderTransform сместишь изображение за пределы грида, то изображение не обрежется. Но если ты поставишь размер изображения 300х300, то оно обрежется оставив до габаритов родителя т.е. 100х100. При этом изображение все так же может выходить за пределы грида, только вот в уже обрезанном состоянии. А все потому, что RenderTransform в отличии от LayoutTransform пересчитывается постфактум на этапе рендера, когда грид УЖЕ обрезал твое изображение.

Какие уловки можно в этом случае провернуть? Самый тупой это картинке установить Margin в минус. Чем меньше значение (относительно нуля), тем больше ход твоего изображения. Но это ебень, лучше использовать канвас. В твоем случае уж точно.
Можно попробовать тыкнуть палкой LayoutTransform, но я тебе ничего не смогу сказать по этому поводу.

Еще я заметил, что может обрезаться если один контейнер положить в другой. Обычно такое замечаю в сложных вложениях, когда какие нибудь десять гридов упакованы в юзер контрол, который упакован еще в десять гридов. Ты можешь сделать работающий контрол, но потом вложить его куда нибудь и все пойдет по пизде. Этот факт надо учитывать.

Еще информация для справки. Если ты собираешься что-то тягать, то конечно же ты можешь использовать любой контрол и даже заставить двигаться Image. Уж не знаю какой ты способ выбрал: то ли отслеживать MouseMove рамки, то ли картинки, но есть еще один вариант. Если ты в качестве перетягиваемого элемента будешь использовать Thumb, то у него в событиях есть лютая годнота в виде DragDelta — это относительное смешение мыши при перетягивании. Все что остается, это данное значение запихнуть в Matrix.Move, который тоже смещает на относительную величину.
Но есть нюанс. Нюанс с вращением. Если Thumb повернут трансформациями, то дельта будет рассчитываться относительно повернутого объекта. Это может быть как гемором так и фичей. Например, если ты делаешь какой нибудь слайдер, то ты можешь сделать логику для перемещения Thumb по оси X, а если тебе нужен вертикальный вариант слайдера, то ты просто устанавливаешь контролу трансформацию с поворотом на 90 градусов, при этом визуально ползунок будет двигаться по оси Y, но внутри он все так же работает по оси X. Очень удобно.

В этот Thumb ты помещаешь ImageBrush, в котором и будет находиться твое изображение. Причем возможности ImageBrush гораздо шире того же Image. Там можно контролировать масштаб, положение и тайлинг изображения. В свойствах есть же есть так называемый ViewBox, это виртуальная область визуализации и все что выходит за его пределы — обрезается. Такой ViewBox много где используется, например в SVG.
Не знаю, нужно тебе или нет, просто информирую.

А еще погугли что такое Adorner. Возможно рамка, которая показывает область обрезки изображения (как и сами манипуляторы масштабирования/премещения) лучше делать через адорнер-слой.
425 3040080
>>40079

>это относительное смешение мыши при перетягивании


смеЩение* мыши
426 3040081
>>40079
Вот пример инструмента масштабирования при помощи адорнеров.
https://youtu.be/ddVXKMpWGME
427 3040082
>>40079
Ах да, я прикрепил картинку, а текст удалил.
На пикрилейтед рамка со скругленными углами обрезает по контуру прямоугольник внутри. Именно что обрезает. Делается это с включенной опцией ClipToBounds.
428 3040661
>>40079

> Но есть нюанс. Нюанс с вращением. Если Thumb повернут трансформациями, то дельта будет рассчитываться относительно повернутого объекта.


MouseMove также будет относительно рассчитываться
429 3040733
>>40079
Спасибо за такой подробный ответ, много нового для себя открыл. Про thumb впервые услышал, а ведь куча костылей была мной написана. Удивительное дело конечно, столько пользоваться технологией и все равно натыкаться на вроде бы базовые вещи, которые тем не менее ты не знал.
Вообще, решение я в итоге нашел, костыльное до жути, но тем не менее - засунул картинку в scrollviewer и прокрутил на середину.
1.jpg29 Кб, 1000x613
430 3040882
>>40661

>MouseMove также будет относительно рассчитываться


Ты имеешь ввиду метод GetPosition()? Но он рассчитывается относительно указанного контрола.

Смотри пикрил. Левый вариант — это GetPosition(). Когда ты перетягиваешь курсор из точки А в точку B. Ты получаешь смещение относительно нуля габаритов рамки. Тебе нужно произвести дополнительные вычисления, чтобы определить путь A-B. Я уже молчу про то, что MouseMove работает всегда, и тебе надо как-то детектить не просто перемещение мыши, а именно что перетягивание. Тебе придется добавлять собите MouseClick, добавлять переменную последней позиции мыши и кучу всего.

Правый вариант — это как работает DragDelta. В аргументах события тебе УЖЕ передаются координаты смещения относительно точки A.
Кроме того, там есть события DragStarted и DragCompleted для детектинга начала и конца перетаскивания. Есть DragEnter это когда откуда-то еще в твой контрол что-то перетягивают. Так реализуют функционал Dtag n Drop.
431 3040929
>>12850
Это код из видео просто
.png4 Кб, 707x62
432 3041113
Хм. Решил прикола ради 10к коннектов погонять на своем самописном сервере.

И прикриплейд смущает. После остановки клиентов - висит в оперативке вот это вот.

НО. После того как ради прикола запустил еще раз клиенты, но с 10 клиентами - память начала уменьшаться. Полчаса до этого - диспечер задач показывал, такое потребление.

Почему так? Почему оно не освобождается сразу? Если в студии запускать с инструментами дебага - там сразу график вниз падает.
433 3041117
>>41113

>Почему оно не освобождается сразу?


никому другому в системе память не нужна
434 3041138
А. В дополнение >>41113
Еще смущает вот что. 14 гигов. Типа на этом сервере гоняю XMLки. До этого гонял бинарный протокол типа модбаса, но проще, 10к меньше 2 гигов потребляли.
Это все из-за XML'ок и сериализаторов? Чи как? Чи шо?
435 3041142
>>41138
ну дык тебе зачем профайлер даден?
ПОСМОТРИ
436 3041154
>>41113
в общем читай познавай только голову перевяжи
https://habr.com/ru/articles/754248/
.png37 Кб, 919x344
437 3041175
>>41142
Я не понимаю, куда смотреть
Ну. Типа. Я просто взял NetworkStream и скормил его XmlSerializer.

С модбас-подобным правда я использовал MemoryPool и обычные сокеты, без этого самого NetworkStream
438 3041181
>>41175
ну это надо смотреть кто удерживает все эти byte[]
439 3041185
>>41181
Ну. Если клацнуть на эту строчку - сокеты больше всего.
Больше не скажу, потому что упала студия.
Потому и не смотрю этот профилировщик. На работе есть dotTrace, там хоть не падает от каждого чиха. А вот в студии - сколько не пробовал - каждые второй сеанс - все пиздец, и падает студия(
440 3041186
>>41185
ты так говоришь будто я тебя заставлял смотреть именно в ЭТОТ профайлер )
я заставлял лишь голову повязать чтобы она не лопнула от ума когда статью на хабре прочтешь.
441 3041188
>>41186
Я уже прочитал. Меня все же смущает разница между другим сервером который без стрима и с бинарным протоколом. Разница в разы по потреблению.
442 3041724
>>41154
Интересное чтиво, оптимизация которая тупо затрудняет мониторинг памяти. Вроде в го или жабе с таким же боролись и добились освобождению сразу, жалко в статье не раскрыта идея как победить "это" в шарпах.
443 3041848
>>41724
AppDomain вроде как освобождает всю память.
444 3042286
Кто пробовал несколько микросервисов соединить в рамках одного процесса?
Какие подводные?
Какие альтернативы, если клиент не хочет докера, но при этом - хочет чтобы ОДНОЙ КНОПКОЙ, КАК ДЕСКТОП...
445 3042307
>>42286
Это как? Типа нескольких сборок, которые загружаются одним общим экзешником, но взаимодействуют не через вызов методов, а через сокеты?
446 3042312
>>42307
В ближайшем приближении - ды.
Понимаю, что в общем целом - такое себе решение. Но если уже есть пачка микросервисов, и никто не думал о том что должны будут частью монолита - это видится самым простым решением, если времени не так много на спринт.
447 3042457
>>42312
Вы там совсем ебанулись.
448 3042461
>>42286
Не выебывайтесь и если так приперло напишите мастер процесс который будет запускать/обновлять/гасить весь зоопарк
449 3042479
>>42286
Батник напиши, который их запускать будет
450 3042512
Господа-аноны девелоперы, есть вопрос для тех, кто шарит за фриланс. Ввиду некоторыхпсихучет обстоятельств, работа в офисе для меня закрыта.
Долго и много учил C#. Хорошо знаю основу языка, умею работать с базами данных (реляционными и нереляционными), разбираюсь в WPF, а также ASP.NET Core (а еще разбираюсь в разных подходах вроде MVVM, MVC, MVP). Могу как в CodeFirst так и в DBFirst. Знаю как завернуть приложение в контейнер с помощью Docker'а и запустить на каком-нибудь облаке. На Indeed видел вакансию - Angular, .NET, подумал, но пока JS не учил, пользовался только готовыми вещами с bootstrap для своих мелких демопроектов. Еще в дизайне я говно.
Так вот первый вопрос, с текущим набором навыков можно ли начать фрилансить? Если нет, то что нужно доучить?
Если вы пользуетесь зарубежными фриланс биржами или другими сервисами по поиску удаленной работы, то какими? Как вы выводите доход со счета сервиса на российскую карту?
Спасибо что дочитали до конца. Заранее спасибо за ответы.
451 3042594
>>42512
С такими навыками - иди джуном, попробуй как-то год продержаться. Потом пытайся перепрыгнуть на мидла, и ищи удаленку.
452 3042757
>>42286

>Какие альтернативы


Искать новую работу и постараться в следующий раз не вляпаться в такое дерьмо, где просят переделать всю архитектуру в последний момент потому, то "клиент не хочет...". Такие вещи как бы перед началом работ, а не после согласовываются.
453 3043007
>>42757
У нас гибкая разработка, вы нам не подходите.
454 3043013
>>42757
Смотри, няша.
Вот ты продуктовая компания. Вы собрали с разных бизнесов хотелки, продумали архитектуру. Все отлично. Разрабатываете.
Вот вы выпустили первую версию. Вторую версию. Третью версию... Большинству клиентов нравится то что есть. Вы развернулись в облаке каком-то, они подрубаются и пользуются. Отлично все.

Тут приходит кто-то из маркетинга, говорит: "Там короче клиент, хочет наш продукт, НО У НЕГО ТРЕБОВАНИЕ, чтобы запускалось без докеров и одной кнопкой, КАК ДЕСКТОПНОЕ. На его мощностях. Оч важный клиент. Оч много денег платит. В общем, я ему уже пообещал, что мы через 2 недели покажем ему на его мощностях развернем, сделайте че-нибудь быстрое"
Твои действия?
455 3043049
>>43013

>ты продуктовая компания


>У НЕГО ТРЕБОВАНИЕ, чтобы запускалось без докеров и одной кнопкой, КАК ДЕСКТОПНОЕ. На его мощностях.


Сказочная ситуация. Кабан бы послал нахуй менеджера с одним таким клиентом. Не по техническим требованиям, а по тому что к хуям ломаяется схема получения денег с клиента за услугу. Можно вообразить такую ситуацию в мелкой компании вообще без клиентов.
456 3043056
>>43049
Если клиент крупный, и при этом - старый и лояльный, никуда кабан его не пошлет. Проще попросить поднажать, придумать решение, и вообще.
Как-бы бизнес это еще и про отношения. Особенно всякий B2B.
457 3043060
>>43056
Если клиент крупный, то проще клонировать ему всю инфраструктуру, чем преписывать непонятно на что.
458 3043068
>>43013
В таких местах где продакт и тимлид такое пропускают в бэклог с дедлайном вчера либо должны платить сильно выше рынка, либо нахуй там работать
459 3043108
>>43013

>Вот ты продуктовая компания.


Спасибо нахуй. Наелся подобного.

>>43013

>Оч много денег платит. В общем, я ему уже пообещал, что мы через 2 недели покажем ему на его мощностях развернем, сделайте че-нибудь быстрое"


>>43056

>Если клиент крупный, и при этом - старый и лояльный, никуда кабан его не пошлет. Проще попросить поднажать, придумать решение, и вообще.


Когда бизнес позволяет своим продажникам принимать такие охуительные решения (без согласования с разработкой) или еще хуже владелец сам принимает такие решения, то можно с большой уверенностью сказать, что конторе пиздец. По крайней мере в её обычном виде. Это просто сигнализирует о том, что кабан потерял берега и вместо спокойного и методичного зарабатывания бабла и продвижения на рынке, решил погнаться за длинным рублем и катит свой же бизнес в яму.
460 3043124
>>43108

>за длинным рублем


за быстрым рублем
461 3043126
>>43013

> НО У НЕГО ТРЕБОВАНИЕ, чтобы запускалось без докеров и одной кнопкой, КАК ДЕСКТОПНОЕ


А такое и правда бывает? Я с таким встречался только на первой работе. Как раз было десктопное приложение, которое должно было быть БЕЗ БД И БЕЗ ИНСТАЛЛЯТОРОВ, УСТАНОВКА ПРОСТЫМ КОПИРОВАНИЕМ. С тех пор за 20 с лишним лет больше такого не видел.
462 3043151
>>43126
Ну. Вот недавно прилетело как раз. Типа, ну хочет клиент, чтобы можно было просто далее-далее-далее, появился ярлычок на рабочем столе, клацнул, запустил. Надо придумать, как сделать. Я думал-думал, и учитывая, что на все про все - две недели разработки - ниче лучше, кроме как слинковать все это в один проект я пока не придумал.
463 3043160
>>43151
Написать заявление и уйти на больничный?
464 3043187
>>43151

>Типа, ну хочет клиент, чтобы можно было просто далее-далее-далее, появился ярлычок на рабочем столе, клацнул, запустил.


Смотри, если ты упорешься и все таки это сделаешь, то крайнем останешься все равно ты. Просто потому, что у клиента все равно будут проблемы и придет он к вам, а их переадресуют тебе и с каждой итерацией ты будешь все больше и больше виноватым. И не тот маркетолог, который пообщещал такие сроки, а именно ты, т.к. взялся за работу и не сделал или сделал плохо. Тебя просто сольют в итоге, как того, кто "завалил проект". Реально сам видел, когда зав.глав.кабана увольнял джуна с такой формулировкой, когда он не смог за пару недель переписать проект с одной библиотеки на другуй (обе которых он до этого не трогал даже.)
А вот если сразу отмазаться от такого задания, ну хуй с ним, побудешь плохим пару дней, зато потом переключаться на другого лоха который взялся и не смог.
465 3043217
>>43187
Как же ты прав, анон. Сам в такую ситуацию попадал из-за омежности и страха сказать нет. Сейчас понимаю, что лучше сразу пересилить себя, чем потом оправдываться и быть крайним.
466 3044101
шарпаны, а есть ли способ затащить в объект поля, которые будут компилироваться с определенным компиляционным символом типа атрибута Conditional("DEBUG"), но для полей, проперти и т.д.?
сейчас я делаю вот это:
#if DEBUG
int _debugValue = 5;
#endif
препроцессорные куски неистово бесят.
467 3044132
>>44101
Раковая хуйня, осуждаю
468 3044167
>>44101
Для какого кейса тебе это нужно?
А вообще моё мнение такое - если нужно активно использовать код, который работает только в Debug сборке, то нужно выделить для него абстракцию (сигнатура метода, интерфейс, абстрактный класс), сделать две реализации этой абстракции (одну денежную, другую релизную), и только в одном месте с помощью директив препроцессора указать, какую из них для какой конфигурации нужно использовать. Так у тебя весь код не будет увешан директивами препроцессора.
469 3044202
>>44132
>>44167
вот я задал вопрос, посидел, подумал и понял что это действительно раковая хуйня, спасибо.
470 3044214
Как в HttpClient выбрать IP адрес через который делать запросы?
Вот к примеру у меня vps ubuntu с 2мя ip, как мне выбрать через какой ип делать запрос?
471 3044228
>>44214
Погугли хттп протокол. Если коротко то хост передаётся в хедерах после установки коннекта с ипом. Дальше думаю сам раскуришь, один фиг тебе с этими знаниями всю жизнь работать
472 3044242
>>44214
Добавить SocketsHttpHandler и в нём забиндить сокет к нужному локальному IP.
См. https://stackoverflow.com/questions/65930192/
473 3045924
Стоит ли отказаться от лямбд на высоконагруженных участках кода?
Просто я вижу, как у меня весь GC засран акшонами. Они появляются, сразу исчезают, их GC пытается вилкой чистить.
Но блин, как же с ними удобно-то.
474 3046088
>>45924
лямбды что ничего не захватывают - они создаются как методы класса
те что что то захватывают - хз не помню

а вот как раз методы постоянно создают делегаты
475 3046155
>>46088
У меня примерно такой код на одном участке, который из одной апишки в другую гоняет
И в профилировщике - я вижу примерно картину как на прикриплейд со сборками мусора постоянными.
Если смотреть, то создаются и постоянно исчезают Action. Что странно, ведь моя лямбда должна быть Func<Task>, а ее вообще там не видно.

Перепроверил переписав без лямбд. В общем, дохрена этих Action'ов создает HttpClient. Значит не в моем коде дело. Теперь вопрос - нахуя он это делает и че мне с этим делать? Да, оно чистится, но меня смущает, что постоянно дергается GC.

Или я тупой и вообще не понимаю что происходит и так и надо.
476 3046209
>>46155
ничего ты с этим не сделаешь. ну в этом и суть рантайма - чистить мусор и не заморачиваться ручным управлением

ну да, мелкие сделали херь с делегатами методов.
477 3046668
Сап, шарпач, кто-нибудь пробовал генерировать клиенты по OpenAPI-спекам из Сваггера? Имеется:
- Апи №1; общая либа с модельками запросов и ответов; апи №2, пользующееся апи №1
- Огромная лень писать клиент самому

Попробовал сгенерить клиент через Kiota (github.com/microsoft/kiota), столкнулся с тем, что второе апи пользуется в контроллере моделькой запроса из общей либы, но в сгенеренном клиенте все модели создаются заново с теми же названиями, и получается херня какая-то.

Собственно, вопрос: есть ли генераторы клиентов, которые могут использовать существующие модели или хотя бы наследоваться от них?
478 3046681
>>46668

>получается херня какая-то.


Не похуй ли? Как раз весь смысл генерации в том, чтобы кнопку нажать и пользоваться.
Если у тебя есть потребность лезть руками в генереный код, то ты очень не прав, прям пиздец как не прав.

>есть ли генераторы клиентов, которые могут использовать существующие модели или хотя бы наследоваться от них?


Даже если и есть, то все равно они накрутят поверх свои обертки и ты не сможешь ими пользоваться.
479 3046721
Наваял вот такое. Функция получает название типа поля в строковом виде, значение поля в строковом виде, а потом парсит. Сделал так потому что property.GetValue() возвращает объект. Как можно улучшить этот код? Щас напрягает то, что куча предупреждений об возможном null. Или код вообще говно и лучше ещё подумать...
480 3046812
>>46721
Нормальный код. Чтобы студия не заебывала про null, напиши перед свичем проверку if null throw ArgumentNullException. Сравнивать лучше через InvarianCultureIgnoreCase. Можно, конечно, заменить на Dictionary, но он занимает место в памяти, так что чисто вкусовщина. Мне больше нравится свитч, так ты сразу видишь все варианты, а со словарем хуй поймешь что там лежит.
481 3046981
>>02293 (OP)
Посоветуйте книжек или уроков С# через разработку игорей или для создания чего либо по Информационным Системам

Так то нужно написать программу для диплома по Информационным Системам. Вот и думаю как можно совместить эти направления, ведь у меня времени только год с лишним.
Появилось время и надо заняться, иначе опять пустая РАБота все силы сожрёт и не до уроков и мечты свалить в другой город.
482 3047030
>>46721
В реальности я бы написал как пик 1, но если хочется выебонов то пик 2
483 3047040
>>46721
property.GetCustomAttributes(true).Where(a=>a is LocationAttribute).Cast<LocationAttribute>();
484 3047095
>>46812
>>46981
Спасибо за ответы!
Переписал на первый вариант. Более цивильней выглядит + предупреждение о null ушло на хуй
485 3047111
>>47040
Хуя тут. Спасибо. Теперь ещё компактнее код можно сделать.
486 3047419
>>47030

>В реальности я бы написал как пик 1


>>47095

>Переписал на первый вариант.


Вы, блять, серьезно?
487 3047435
>>47419
Ну а что не так, анон? Свитч не позволяет использовать typeof, и за счет решение с ифом менее подвержено ошибкам.
image.png68 Кб, 442x333
488 3047502
>>47435

>подвержено


Хуевержено.
Не благодари:
(enum в неймспейсе System находится)
489 3047542
>>47502
А чем такое решение лучше, яем первый вариант другого анона?
490 3047566
>>47542
Читаемость, удобство обслуживания, меньше вероятность проебаться, возможность заинкапсулировать какую-то доп. логику в экстеншене для enum.
Это не говоря уже о том, что портянка из if...else..if...else ни одного нормального код ревью не пройдет.

Плюс, при необходимости, все это очень легко преобразовать в что-нибудь вроде Dictionary+Resolver, а содержимое словаря потом вообще в конфиги вынести.
.png74 Кб, 1266x260
491 3047575
>>46721
Я бы так сделал, лул.
Хотя не делал бы. Я вообще не понимаю, нахуя это делать. Ну да ладно, раз ты делаешь - значит надо.
.png160 Кб, 1100x659
492 3047587
>>47575
Чуть допиленная версия.
493 3047697
>>47566

>портянка из if...else


Наркоман, ты написал точно такую же портянку из матчей.

>содержимое словаря потом вообще в конфиги вынести


А потом сидишь и два часа пытаешься понять, какого хуя простейший код не работает. Или работает у тебя, а на проде падает, это самая веселуха. С ифами все было просто и понятно, с конфигами джун-долбоеб насрал абстрактными фабриками и хуй проссышь, откуда данные берутся.
изображение.png6 Кб, 366x61
494 3048183
Всем привет. Имеются вот такие магические числа. Знаю, что это плохо и надо от них избавляться, но как? По идее надо это в enum сложить, но я не ебу как всё это обзывать. Те цифры, что на картинке - смещение на одну строку вниз и на две соответственно. Так и писать?
495 3048185
>>48183
всё. ты выгорел. на завод.
496 3048209
>>48185
Я уже на заводе
497 3048228
>>48183
Может быть расширение для report написать с осмысленным названием. Типа .report.NextRow...()
изображение.png126 Кб, 1307x553
498 3048239
>>48228
А если у меня название метода CreateReportBody, то может так и оставить? Думаю, что будет понятно, что там смещение на сколько-то. Хотя я хуй знает. А что за расширение?
499 3048274
Есть публичный абстрактный класс System.Windows.Media.PathSegment

Но за каким-то хреном конструктор у него Internal, в итоге я не могу реализовать этот класс, потому что возникает ошибку:
CS1729 "PathSegment" не содержит конструктор, который принимает аргументы 0.

Это что за извращениие?
500 3048488
>>48274
Реализуют интерфейсы, а не классы. Классы наследуют.

Потом, написано же в доках:

>Although this class is abstract, it is not publicly extensible.

readonly.JPG30 Кб, 968x366
501 3048707
посоны, будет ли компилятор считать дженерик ридонли структуру типа пикрелейтеда безопасной и не срать защитными копиями, если констрейнтом тоже структура и все они будут тоже ридонли?
image.png56 Кб, 1627x368
502 3048724
>>48707
Да, jit все ненужные проверки выкинет
503 3048888
>>48724
охуенчик, спасибо
504 3048927
>>48488
А как вообще бороться с подобным? Я хоту создать свой собственный сегмент.
505 3048930
>>48927
Никак, код овнер так сказал, значит так надо
Либо через рефлексию, но за такое нужно битой по хребту пиздить
506 3048931
>>48927
Форкнуть WTF.
image.png108 Кб, 500x375
507 3049089
Есть кто реально на линуксах работает, есть какие-то подводные?
В rider работает hotreload?
508 3049129
>>48927
Я думаю, там какой-то код есть, который умеет работать только с существующими сегментами, а если ты сделаешь свой, то всё наебнётся.
Это говнокод, конечно, но его везде можно найти.
509 3049133
>>48930
>>48931
>>49129
Какие же они изверги.

Может сделать свой контейнер, который будут содержать как готовые классы сегментов, так и мои собственные. Только хз как их объединить. Может сделать коллекцию DependencyObject.

И этот контейнер будет посредником, куда пользователь кидает что хочет. Потом контейнер все это дело обрабатывает и конвертирует в новый список существующих сегментов.

Непонятно как это потом обновлять. Одно дело, когда пользователь кидает весь список, а другое дело, когда меняет точку в каком-то сегменте.
510 3049135
>>49133

> Одно дело, когда пользователь кидает весь список, а другое дело, когда меняет точку в каком-то сегменте.


У меня только вариант - подписываться на изменение коллекции точек моего кастомного сегмента и модифицировать точки связанного элемента.

Да, наверно так и поступлю.
511 3049137
>>49089

>hotreload


А кто-то им вообще пользуется?
Просто по моему это хуйня почти без задач, годная разве что когда что-нибудь мелко-консольное пишешь. Более-менее объемный сервис хер ты на горячую изменения сможешь применить и быть уверенным, что оно не пойдет по пизде и все равно потребует полного перезапуска.
512 3049138
>>49135
>>49133
Не, не будет работать. Эти сегменты по любому должны принадлежать только одному родителю. Не считая того, что там целый зоопарк иерархии, типа сегменты должны находиться в PathSegmentCollection, а те в PathFigureCollection, а та в Shape.

Какая же хрень ... как же задрали все эти велосипеды. Хочешь МVVM - сделай свою библиотеку Windows. Хочешь шейпы — сделай свою библиотеку Media. Удобно, пиздец.
513 3049154
>>49137
я пользуюсь - есть заметная разница один микрочеликовый плагин перезагрузить или все приложение+плагины.
хз что бы без хотрелоада делал, вскрылся бы наверное
514 3049383
>>49137
Есть задачи, с сильным вложением действий и каждый раз ждать 10 минут чтобы дойти до нужной точки, это вымораживает.
515 3049589
Всем привет. Я тут делаю пагинацию и у меня возникла одна проблема. Я хочу сделать keyset пагинацию или что-то типо того, почитал вот это: https://learn.microsoft.com/ru-ru/ef/core/querying/pagination#keyset-pagination. Но проблема в том, что id у меня типа Guid. Что делать в таком случае? Добавлять ещё одно поле в бд как по мне полная хуйня? Или в с Guid в принципе невозможно сделать пагинацию такого типа
516 3049633
>>49589
keyset пагинация по факту и предназначена для работы со структурированными данными. Либо упорядочивай по guid-u (при генерации ключей например), либо по другому признаку. Если его нет, то вводи.
Вообще, в принципе, получать неупорядоченные данные из БД такое себе,

Но сразу говорю, что генерировать упорядоченные guid-ы такой себе способ. Спорно и не очень распространено. Просто по тому, что если тебе нужна упорядоченность по ключу, то проще взять какой-нибудь long и быстрее и эффект тот же.
Но упорядочивать по Id тоже плохая идея, он не для этого нужен.
Проще для этого (упорядочивания) временную метку использовать.
517 3049652
>>49633
Насколько я понял надо добавить какое-то поле long типа и по нему упорядочивать, правильно? Я ещё видел реализацию через DateTime
518 3049678
>>49652
Это зависит от того, как у тебя данные в БД вставляются. Если строго по одному, то DateTime норм способ. Не надо дополнительный sequence вводить, просто юзаешь DateTime.(Utc)Now при создании записи и все. Если же предполагается вставка пачками, тогда лучше использовать что-то отдельное с последовательностью.
519 3049694
>>49678
Понятно, спасибо.
520 3049932
>>49633

>Но упорядочивать по Id тоже плохая идея


Почему? Всегда так делал подводных не встречал.
521 3050149
>>49154
Попизди мне про перезагрузку плагинов средствами студийного релоада.
А с в контексте сервисов - там во-первых сразу x2 с какого-то хуя оно берет и разваливается к хуям.
522 3050153
>>49383
Про юнит и интеграционные тесты я так понимаю тебе не рассказывали...
Ну да. Ведь лучше хуевый хотрелоад, чем за 0,0000000000001 секунды оказаться в нужном месте с помощью тестов.
523 3050167
>>49589
Берешь, и как нормальный человек добавляешь: Created, который генерируется при вставке, по нему сортируешь, а дальше паггинируешь как хочешь.

Да. Как нормальный человек делаешь:
public abstract class BaseDbEntity {
public Guid Id { get; set; }
public DateTime Created {get; set;}
public DateTime Updated {get; set;}
public DateTime? Deleted {get; set;}
public bool IsDeleted {get;set;}
}
524 3050200
>>50153
Ой, ребенок, ты даже близко не представляешь что это. Я понимаю, что в рамках круда это не нужно, но просто не умничай, а то веет тупостью.
Как вы ламеры уже достали, про юнит тесты он рассказал, ну просто гений же.
525 3050247
си шарп плохой язык
526 3050249
>>50167
IsDeleted не нужон
DateTime тоже раковая хуйня, в бд только с Offset
527 3050272
>>50249
Прочитал, что офсет медленный. Поэтому и пошёл что-то другое искать
528 3050295
>>50247
А какой лучше?
529 3050298
>>50295
Си решетка
530 3050359
Сися-шарп - звучит гордо!
531 3050445
>>50295
ну великая Джава допустим
532 3050453
>>50445
Два кобола.
533 3050489
>>50445
Чем?
534 3050491
>>50489
Чем шарп.
535 3050621
Один метод, статический, принимает переменную через параметры.
Второй метод, не статический, обращается к свойству родительского класса.

В чем их различия с точки зрения аллокаций? Или аллокиции вызывает сам факт использования переменной и разницы нет никакой?
536 3050623
>>50621
Посмотри в байткод
lyKfI9W9-1g.jpg59 Кб, 600x483
537 3050628
Какая же залупень, господи ...
Казалось бы, недавно ИТТ выяснили, что Freezable классы пукают событием Changed по любому поводу, и биндинги за каким-то хреном на этот Changed подписываются, хотя их никто не просил.

И что бы вы думали? Пытаюсь я, значит, забиндить класс PointCollection к ItemsControl.ItemsSource и хуюшки. Никакой реакции на изменение итемов коллекции. Событие Changed происходит, а обновление биндингов - нет.

Просто ссаный бардак. И вроде бы ты уже разобрался с ситуацией, вроде бы даже смирился с ней, и вот тебе на. Мне кажется, что мысли женщины последовательнее, чем ссаная впф отрыжка майкрософт.
538 3051132
>>50628
какого изменения ты вообще ждешь?
ItemsSource следит за событиями обсервабле коллекции, а твой PointCollection их не производит не будучи этой самой обсервабле. Зачем тут то биндингу следить за фризабле - никому непостижимо.

это у тубя в голове (твой череп на фото???) чет не то, раз для тебя вообще норма фризабле коллекцию изнутри менять.
539 3051591
>>51132

>их не производит не будучи этой самой обсервабле


Запускает событие Changed. И биндинг на этот Changed подписывается, это мы уже обсуждали.

>Зачем тут то биндингу следить за фризабле - никому непостижимо.


Вот я тоже самое писал, но тут сидел чел и доказывал обратное.

Заходишь ИТТ и получаешь примерно такой диалог:
— Нахера биндинги подписываются на событие Changed содержимого в свойстве?
— Ну это же фризабле, ты что дурак?

Через неделю:
— Почему биндинги не подписываются на событие Changed?
— А нахера им подписываться, ты что дурак?

>раз для тебя вообще норма фризабле коллекцию изнутри менять.


Мне надо добавить/убрать точки кривой. Как по твоему это еще делается?
540 3051640
>>51591
Сеттер фризибле свойства разве возможно вызвать? Ну типа чтобы событие сработало, поток должен провалиться внутрь сетера и дернуть делегат. Если этого в происходит, то и хендлеры никто и никогда не вызывает.

Если я правильно понимаю о чем идет речь.
541 3051669
Вопрос с подвохой.

Есть код:
// SomeClass.cs
while(true){
Thread.Sleep(1000);
MyEvent(this, EventArgs.Empty);
}

// SomeOtherClass.cs

for(int i = 0; i < 1000; i++){
new Thread((_) => someClass.MyEvent+= (_, _) => Console.WriteLine(Thread.CurrentThread.Name)).Start();
}

Что будет выведено в консоль?
542 3051685
>>51640
Ты путаешь Freezable класс с режимом IsFrozen. Если IsFrozen == true, то менять содержимое не сможешь, но если false, то можешь. Первое устанавливается, если ты инициализируешь класс в xaml, к примеру.

>Если этого в происходит, то и хендлеры никто и никогда не вызывает.


Я повторяюсь. Событие Changed происходит.
Раньше, когда я демонстрировал случай с ValueConverters, биндинги реагировали на это событие, вопреки логике т.к. биндингам нет дела до содержимого свойства, их интересует событие PropertyChanged INPC класса, в котором это свойство находится.

Короче происходит какая-то аномальная дичь, объяснение которой у меня нет, а хотелось бы.
543 3051751
>>51685
биндингам нет дела. а вот контролам есть
1 ты меняешь внутри фризабле что то и получается событие Changed
Опустим глупость подхода менять иммутабельные по семантике коллекции и оставим их психиатрам будущего
2 биндингу плевать на то, что ссылка осталась прежней, он вызывает подписку в контролах "значениетамченжед"
3 itemsControl вызывает мфк view = CollectionViewSource.GetDefaultCollectionView для нового source
Который, как известно, вернет одну и ту же ссылку для одной и той же коллекции
4 и далее делается проверка
if (_collectionView == view)
return;
5 занавес.
544 3051759
>>51669
Братиш, зачем тебе это знать?
545 3051795
>>51751

>Опустим глупость подхода менять иммутабельные по семантике коллекции


А как? Как менять цвет кисти, к примеру? Как менять трансформации? Да любой контрол наследует фризабле.

>2 биндингу плевать на то, что ссылка осталась прежней, он вызывает подписку в контролах "значениетамченжед"


И что? Мой пример с биндингом показал, что конвертер срабатывает даже если ссылка на объект не изменилась. Причем это тоже была коллекция, только она называлась GradientStopCollection. Для понимания ситуации, есть свойство:

public GradientStopCollection MyGradientStops
{
. . .get => _gradientStops;
. . .set {
. . . . . . _gradientStops = value;
. . . . . .OnPropertyChanged(nameof(MyGradientStops));
}
}

Я привязываюсь к этому свойству и туда же цепляю ValueConverter.
GradientStopCollection содержит итемы GradientStop, а те имеют свойства Offset и Color.
Так вот, я меняю свойство Offset одного из итемов GradientStopCollection, и срабатывает метод Convert(). Почему? Экземпляр в MyGradientStops не изменился, а значит не было вызвано событие OnPropertyChanged, но конвертер отработал.

Вероятно конвертер или контрол подписались на событие GradientStopCollection.Changed. Зачем-то. Но на PointCollection.Changed подписываться не хотят.
546 3051808
>>51795

>И что? Мой пример с биндингом показал, что конвертер


Да епрст. Конвертер срабатывает потому что
1 биндинг видит твое Changed и орет об этом
2 значение вычитывается потому что собственно биндинг его и вычитывает чтобы передать в ЗначениеТамЧенжед в контроле
3 контрол видит что ссылка на новое значение равна старой и ничего не делает
547 3051809
>>51808
2 и поэтому срабатывает конвертер
548 3052125
Посоны, дайте пример задачи или реализации или какой-то хуйни, где можно попрактиковать многопоточность (но не просто асинками)
549 3052409
>>51808
Ах вот оно че. Понял.
550 3052439
>>52125
Напиши какой нибудь 3д-рендер с трассировкой лучей, или распарси книгу. В общем любая задача, где есть куча независимых друг от друга данных.

Но ты попрактикуешь и забудешь. Проблема всех студенческих работ в том, что задача выдумывается под решение, а не наоборот. Из-за этого, условия задачи слишком идеальны и далеки от реальности, они избегают острых углов.

Даже туториалы этим страдают — там всегда описывается идеальный случай в вакууме.
изображение.png51 Кб, 926x253
551 3052574
Где можно почитать поподробнее про код с dockerfile'а? Почему нельзя сразу же скопировать все файлы в папку? И почему используется build и restore, если publish по сути выполняет те же функции?
Вообще стоит влезать в подробности, если ты знаешь, как работает env и композник?
552 3052584
>>52574
В доке докера как ни странно. А всё что ты перечислил относится к кэшированию. Если начиная с первого шага контекст и команды совпадают то шаги будут взяты из кэша до первого расхождения. Потому делается всё что бы пакеты и зависимости переиспользовались.
В целом тот докерфайл что у тебя на скрине вроде и работает как должен но очень сомнительный
553 3053369
реально ли на шарпаче написать что-то типа сервиса, которое будет дергать удаленное апи яндекса, а потом трансформировать данные и сливать допустим в какие-нибудь гуглдоки?
если да, то где про такое почитать можно?
554 3053374
>>53369
Нереально, конечно, ведь шарп не полон по Тьюрингу.
Чë за странные вопросы?
555 3053390
>>53369
Ну гуглишь готовые либы на шарпе для гугла и яндекса, если их нет или не нравятся пишешь свои, склеиваешь костылями.
Тупой вопрос уровня "а как какоть"
556 3053395
>>53369

>как написать веб сервис на C#


>как вызвать веб апи на C#


>ооп С#


>google docs C#


https://www.google.com
557 3053427
К меня есть пачка wsdl.
Как мне сгенерировать на их основе веб-приложение?

На жаве просто при создании проекта: генерейт веб-сервис фром WSDL

Да, не ради любопытства или чтобы доебаться спрашиваю. Ну, вот клиент предоставил WSDL дохуища, говорит - это апи которое от вас требуется, чтобы интегрироваться. И я начал руками это говно реализовывать, понял что дохлый номер, не предназначена эта говнина чтобы руками это делать.
Но хуйнуть сервис на жаве - наш техлид не позволяет, кричит, что надо все на .NET делать, а то разведем так зоопарк и вообще.
558 3053449
>>52574

> Почему нельзя сразу же скопировать все файлы в папку?


Можно. Пизды получишь от админов билд-сервера только через пару дней и справку о профнепригодности.
2024-02-1814-02-24.png12 Кб, 601x219
559 3053540
Смотрю на исходники ArgumentOutOfRangeException, там дохрена методов публичных статичных методов:
https://source.dot.net/#System.Private.CoreLib/src/libraries/System.Private.CoreLib/src/System/ArgumentOutOfRangeException.cs,2975f0aa875d4a32

Но когда я использую класс System.ArgumentOutOfRangeException на практике, то мне выдает очень скромный список доступных методов (пикрил).
560 3053547
>>53540

>.NET 8,9


Ясно
561 3053946
Как теперь во феншую делать фоновые нитки с какой нибудь долгой операцией? Или всё по старому - просто запускаешь тред или лонг ран таск?
562 3053979
>>53946
Просто таска как повсеместно в аспе
563 3053980
>>53946

>с какой нибудь долгой операцией


Зависит от того насколько требовательная операция.

Можно запустить асинк метод с токеном отмены. Гугли CancellationToken. Принцип которого в том, что как только метод завершает свою работу, он дергает токен и у тебя вызывается событие, что работа метода завершена.
Еще есть CompletionToken, например для создания диалоговых окон в асинхронном режиме. Метод будет ожидать завершения таска до тех пор, пока в токене не установится соответствующий флаг завершения или отмены.
У меня на нем же ожидается завершение приложения.


Если операции слишком требовательные, чтобы работать вместе с другими, то в этом случае используется Thread.
564 3053981
>>53980
Не понял, асинк же это про другое, когда нужно линейное выполнение асинхронных операций без блокировки UI нити. Мне же надо что бы крутился постоянный фоновый процесс, грубо говоря сервис.
565 3053982
>>53981
Таски это абстракция над тредами, да они могут в одном треде исполнятся, но могут и в разных
566 3053992
>>53946
Если таких операций немного - тред лучшее решение. Особенно, если там никаких доступов к разделяемым ресурсам.
567 3053999
>>53992
Тред это же совсем каменный век. Обычно рекомендуют Task.Run(... LongrRunTask)
.png70 Кб, 873x407
568 3054009
Допустим, есть код типа прикриплейд.
Большую часть времени - все вроде ок работает.
НО. Бывают случаи, когда возросла нагрузка, и написали дохуя всего. Запустилось дохуя этих вот тасок. Тредпул - сразу в небеса. Процессор - тоже охуевате. Там еще эксепшины в части тасок понлетели - и все страшно вообще стало.

Вот как это контролировать? Как сделать так, чтобы это было управляемо и предсказуемо, а не вот такой рандомный бред.

Я вот ради интереса заглянул в DotNetty и там какой-то свой эвент-луп, какой-то свой тред экзекутер. И поведение как раз то что нужно мне. Но там оно так страшно и по жававским канонам написано, что я с трудом понимаю, что там за что отвечает и как оно вообще работает. Может быть где-то есть другие примеры как сделать управляемой обработку каких-то потоковых задач, которые еще и асинхронные, а надо чтобы они все как-бы конкурентно обрабатывались нормально.
569 3054118
>>54009

>Запустилось дохуя этих вот тасок


ну запустилось и уперлось в тредпул. Ну да для И/О задач там свои настройки

но чем тредпул отличается от своего екзекутора то

свой нужен для других задач когда ты хочешь точно контролить выполнение чего то этакого чего пулу не доверить. Что то долгое или альтернатива контексту синхронизации.
570 3054943
Я сегодня совершил страшный грех, шарпаны.
В общем. Надо было срочно сделать хуевину, для дебага и диагностики работы.
И я СДЕЛАЛ СТАТИЧЕСКИЙ КЛАСС, и в нужных мне местах - просто дергаю нужные мне методы, которые наполняют диагностической информацией всю мою хуйню.
Как мне дальше жить с этим?
571 3054957
>>54943
И чë? Я по дефолту пишу статические классы. Нестатические пишу только тогда, когда без них вообще никак не обойтись.
572 3054965
>>54957
>>54943
А мог потратить пару минут и ебнуть синглтон, выглядит не так всрато
573 3054970
>>54965
Статическое классы выглядят всрато только потому, что все себя в этом убедили.
574 3054974
>>54965
Мне сказали: СРОЧНА, НАДО ДИАГНОСТИКУ.
Если делать синглтон классический - разницы особой не было бы.
А если делать то что на DI я бы все еще прокидывал бы в конструкторы этот самый синглтон, там 5 лет разработки шизом, который все через конструкторы передает.
575 3054982
>>54974

> Если делать синглтон классический - разницы особой не было бы.


Ну так и сделал бы.
У нас впф апа, так там никаких новомодных di. Только папочка с полутора сотней синглтонов половина дублирует функционал, потому что проще написать с нуля, чем разбираться в уже написанном
577 3055023
>>54982

>У нас впф апа, так там никаких новомодных di.


и правильно
имею фреймворк с тотальными нарушениями принципов
1 мультиоконность, (в жопу однооконные приложения по типу телеграм - кстати даже они сдались и дали возможность вынести чат в окно ))))
2 при этом диалоговые окна принадлежат к конкретно окну кто родитель, а не блочит все окна
3 DI использую от майков, но использую его на уровне вьюмоделей как сервислокатор (или фабрику)
4 везде лайфтаймы. никаких weak, только !!!СТРОНГ!!!.Вплетено в основу всего. Все, что куда то подписывается, обязано разобраться в каком лайфтаме оно живет.
окна и контролы тоже завязаны на лайфтаймы (хотя WPF в этом отношении брррр со своими "а тут у нас Unloaded не вызывается ха ха")
5 Везде протаскивается Context (как в андроиде) который определяет контекст вьюмодели и потому нет никакой проблемы вызвать диалоговое окно без бубна "а как найти окно родителя". При этом оно конечно не завязано на сборку вьюх ибо MVVM не должна иметь этой зависимости.

и точно такой же фреймворк где я пытался делать по правилам - aggregation root, не использовать di как сервис локатор, вьюмодель живет без контекста

Угадайте какой используется для реальной работы, а какой заброшен нахрен
А потому что пока там в виларибо всякие там чистый код мудрят, в вилабаджо уже на заработанные деньги устроили оргию
578 3055036
>>55009
Диагностика нужна такая, чтобы ее мог проанализировать не только я или другой программист, а условный Петрович и принял решение.
В духе:
- Петрович, тут пришел плохой пакет, это не сервер сломался, а кто-то бяку шлет.
- Петрович, там у тебя место на диске заканчивается, ты это, сделай чего-нибудь, а то все наебнется
- Петрович, кто-то в БД полез кривыми руками и поломал справочники, запусти-ка восстановление справочников
579 3055388
Тут есть настройка для студии чтобы она по умолчанию file-scoped неймспейсы делала?
580 3055390
>>55388
С решарпером дефолтное поведение
581 3055615
>>55388
в .editorconfig пропиши в секции [*.cs] строку:

dotnet_sort_system_directives_first = true
582 3055617
>>55388
>>55615
Сорян, перепутал. Строку:

csharp_style_namespace_declarations = file_scoped
583 3055871
>>55617
Спасибо.
584 3056257
>>53981

>Не понял, асинк же это про другое


Знал бы я про что ты ведешь речь, ведь задача не описана.

>без блокировки UI нити


Любой нити, в которой запущен асинхронный метод. Иногда нет смысла создавать отдельный тред, если операция не особо требовательная, просто она имеет множество итераций, ожидание которых и тормозит работу. Ну или операция слишком часто возникает и недолго живет, что создание треда не очень уместно.

Если у тебя сервис, тогда вероятно уместнее использовать треды.
Screenshot 2024-02-17 155311.png92 Кб, 240x243
585 3056275
Имею 2 года опыта на шарпах и хочу уже устраиваться в биг компанию на пару лет чтобы иметь хорошую строчку в резюме + интересно поработать в большой компании а из больших компаний на выбор только озон по сути
Везде гошка нужна либо быть помидором на шарпах
586 3056313
>>56275
Я с годом опыта на шарпах смог устроиться в большой банк писать всякий бэкэнд на шарпах на мидлплюсплюс позицию. Правда у меня до этого было лет 10 всякого байтоебства на низкоуровневой дрисне.
587 3056320
>>56313
С таким бэкграундом ты и на го и на питон смог бы устроиться без проблем имхо

А какой цвет банка если не секрет?
588 3056384
>>56320

>А какой цвет банка если не секрет?


Секрет. Топ-6 РФ, не зеленый.
589 3056418
>>56384
Мда, моя галера только в топ 15
.png92 Кб, 879x744
590 3056589
591 3056593
Объясните, как майки кодят тот же ASP, если студия с ума сходит, если открыть в ней такого размера проект?
592 3056639
>>56593
Просто у них нормальные пакарни, а не нищенские ноуты за 50к, как у тебя.
593 3056645
У меня один вопрос. Он исходит из необходимости использования OpenGL. И вот, на Си, понятное дело - все летает, На Яве более менее, но...

Почему OpenTK такое кривое тормозное говнище?
.png64 Кб, 961x690
594 3056659
>>56639
Какого рода пекарня нужна-то?
Что не презентация майков - у них макбуки позапрошлого поколения.
595 3056662
>>56645
Попробуй ансейф.
597 3058000
Новичок в треде. Скиньте покурить чего-нибудь по теме замерке производительности участков кода.
598 3058019
>>58000
Benchmarkdotnet
Opentelemetry
Две разных штуки но подходят под твои слова
599 3058339
Посоны, как разгрузить сбор статистики?

Вот сейчас у меня вот так:

Task<IActionResult> OnSendMessage(Message msg)
{
await _messageHub.Broadcast(HttpContext.User, msg);
await _statistcQueue.Enque(HttpContext.User, msg);
return Ok();
}

И с этим как-бы проблемы.
Во-первых. Даже не смотря на то что статистика сама обрабатывается в фоне - все равно какое-то время надо подождать, пока в очередь можно записать.
Во-вторых. Если много статистики - у меня под капотом - пулл обработчиков начинает раздуваться, и в определенный момент - NpgSql - начинает матом ругаться, что больше нельзя выделить подключения.
В-третьих. Судя по профилированию - 20% всего времени приложения - занимается обработкой этой статистики, и если я симулирую активную хуйню с рассылкой сообщений - видно что тормозит все это дело, и эти 20% были бы не лишними.
600 3058360
Как в Avalonia по координатам нажатия мыши получить сам контрол?
Есть кастомный составной контрол и надо получить контрол как параметр при нажатии на него. Такое чувство что фреймворк ппц сырой.
601 3058515
>>58339
1. зачем рассылка в хаб?
2. запускай заливку статы в бд максимум в 2 потока раз в 30сек или когда будет минимум 1к записей в очереди/баге
3. вставляй батчами по 1-2к записей

Я если чество вообще не представляю как ты статой смог выбрать весь пул коннектов. Для твоей задачи нужно бэкграйнд воркер сделать который будет заниматься разбором очереди
602 3058549
>>58515

> Я если чество вообще не представляю как ты статой смог выбрать весь пул коннектов


Ну. Смотри.
Вот мой тест:

HttpCleint http = new HttpClient();

var tasks = Enumerable.Range(0, 10000)
.Select(async (x) =>
{
await Login(http, x);
while(true){
await SendMessage(http, x, new Message{ body= $"Hello from {x}"});
}
});

await Task.WhenAll();

Вот код который обрабатывает очередь:

async Task Run(CancellationToken stopToken)
{

while(stopToken.IsCancellationRequired)
{

// ждем пока в очереди что-то появится
var workItem = await _queue.Dequeue();

// берем из пула ворекра (в случае если пул пустой - создаем нового)
var worker = _workerPool.GetWorker();
try
{
// тут будет создан контекст для подключения к pgSql
// выполнена вставка и сохранение
// освобожден контекст
await worker.ProcessWokrItem(workItem);
}
// возвращаем воркера
finaly{ _workerPool.Return(worker)}

}
}
602 3058549
>>58515

> Я если чество вообще не представляю как ты статой смог выбрать весь пул коннектов


Ну. Смотри.
Вот мой тест:

HttpCleint http = new HttpClient();

var tasks = Enumerable.Range(0, 10000)
.Select(async (x) =>
{
await Login(http, x);
while(true){
await SendMessage(http, x, new Message{ body= $"Hello from {x}"});
}
});

await Task.WhenAll();

Вот код который обрабатывает очередь:

async Task Run(CancellationToken stopToken)
{

while(stopToken.IsCancellationRequired)
{

// ждем пока в очереди что-то появится
var workItem = await _queue.Dequeue();

// берем из пула ворекра (в случае если пул пустой - создаем нового)
var worker = _workerPool.GetWorker();
try
{
// тут будет создан контекст для подключения к pgSql
// выполнена вставка и сохранение
// освобожден контекст
await worker.ProcessWokrItem(workItem);
}
// возвращаем воркера
finaly{ _workerPool.Return(worker)}

}
}
603 3058566
>>58360
по каким еще координатам?
лови клик на контроле и всего делов
роутедевент для чего придумали.
.png31 Кб, 641x662
604 3058569
>>58549
Балин. Неправильно написал код который обрабатывает очередь.
Вот правильный.
605 3058572
>>58569
и это неправильный. где await у GetWorker()
606 3058575
>>58569
Я специально не жду, чтобы очередь не забивалась... Типа при большой нагрузке - там она разбухает и оператива в небо улетает...
607 3058576
>>58569
Зачем тебе пул воркеров? Тебе одного хватит который будет здоровыми батчами инсертить. Если потом будет переезд на кликхаус то всё к этому и сведётся т.к. кх ненавидит инсерты по 1 записи.
И не захватывай ctx.User полностью, бери из него только то что нужно, что бы гц мог собрать всё а в памяти оставались только записи статы которые можно хоть десятками тысяч хранить в памяти без распухания кучи
Оверинжинеринг.
608 3058577
>>58576

> Зачем тебе пул воркеров


Чтобы если динамически нагрузка возрастала - больше обработать можно было... И при этом не тратить время на создание нового воркера каждый раз.
609 3058579
>>58577
Ну удачи. Я по крайней мере свой подход не с потолка взял
610 3058584
>>58579
Ну. Я пробовал батчить кстати.
И вот с батчами - сложность в том, что непонятно, а какой размер-то должен быть, чтобы мы решили: ПОРА таки в БД это отправлять.
Плюс, а если у нас наоборот - нагрузка медленная - эта статистика не наберется на батч. Делать хитрую логику: ну, если прошло 5 минут с последней вставки - то так и быть - вставляем что есть, а если не прошло, то вставляем при достижении лимита - мне как-то не нравится.
611 3058589
>>58584
Чел, у тебя буквально один цикл в котором

если с прошлой вставки больше 120сек или в очереди больше 5000к сообщний
то пишем
спим 1 сек

И скажи эта логика сложнее всей той ненадёжной жрущей ебалы которую ты защищаешь?
612 3058594
>>58589
Я не защищаю же. Я ж потому и спросил, что возникают проблемы если нагрузка дюже большая.
Просто отвечал на вопрос: "Зачем тебе пул воркеров"
Ладно. МБ правда, сделаю вот так вот. И заменю каналы на обычную конкурентную очередь.
613 3058882
Посоны, 5 лет пишу на шарпе. Делаю всякие микросервисы, допилисывал СРМ-ки, интеграцию, погружался в юнити. Короче, мне с дот нетом удобно.

Хочу в мышинное обучение. Знаю, что самым распространённым является богомерзкий змей, но есть ещё прекрасный, как я слышал, ML.Net. Т.е. я не хочу уходить из инфраструктуры и синтаксиса дотнета, но понимаю, что для питона много всего, а для МЛ Нет нет нихуя.

Что делать?
614 3058886
>>58882
В питон идти, расширять кругозор. Моё имхо.
615 3058940
У меня обратная ситуация. 3 года пердолинга на питоне, пришел архитектор, решили всё под один стек привести, мою часть с питона на шарп переписать. Стоит переквалифицироваться или искать другой проект/работу?
616 3059325
>>58940
Какие у тебя претензии к шарпу?
617 3059443
ML на питоне пишут, потому что на других языках не умеют. Это же не программисты, а дата саентисты, они не умеют программировать.
Ну теперь там инфраструктура, конечно. Это с положительной обратной связью система.
618 3059669
>>56593
>>56659
А что за проблема?? Только вкатываться начал. не пугайте.
619 3059866
>>59325
К языку претензий нет, просто не хочется с 0 начинать.
620 3059887
>>58940
Выкинуть архитектора.
Переписуны это зло и мракобесие.
621 3059965
>>58882
Норм, я на неделе пощупал мл.нет без особых знаний по мл. Гайды на мсдн нормальные. Собрал модель мультиклассификатора, обучал на рабочих данных. Показал начальству и объяснил, те кипятком ссали.
Сказали выделять рабочее время и допиливать.
Заебумба.
.png126 Кб, 1118x435
622 3060058
>>59669
Проблем - куча.
Вот самый простой пример. Студия не может понять, че же за типы такие. Хотя у меня включен анализ всех проектов в решении.
Перестает работать переход к определению и реализации.
Не дай бог ты решишь переименовать какое-то свойство, все, потом бегай по всему коду и руками переименовывай.

Но да. Надо уточнить, что это вот в таких больших солюшинах. На работе всего 100 проектов в солюшине и пекарня с i5 и 16 гигами вроде пока справляется.
Если ты только вкатываешься, проблемы у тебя не скоро возникнут.
Вообще, по интервью бывших разрабов с гугла - у них там еще хуже, и потому какие-то ебанутые решения придумывают, но чтобы не врать - не буду пытаться вспомнить, че они там напридумывали, чтобы на макбуках-хромбуках с этим работать.
623 3060200
>>60058
Тебе же дали ответ как майки со своими репами работают что бы разом всё не прогружать
624 3060207
>>60200
Ну, мне ответ-то дали.
А я уже отвечаю на вопрос - какие собственно проблемы.
Ну и да. Все равно. А как мне, если я не разраб из майков-то понять вообще, че мне надо выгрузить, че мне не надо? Надо не вот эти вот обходные пути придумывать, а какую-то ленивую подгрузку делать. Типа вот я открыл кестрелл, оно видит, что кестрелл - ссылается на вот это. Это подгрузил. Пока я не полез туда - не подгружать остальное. Как полез - подгружать. Было бы намного лучше я думаю. А как это реализовать - пусть разрабы студии придумывают.
625 3060218
>>60207
Чел, там и так ленивая загрузка есть.
1. В репе везде разложены пресеты что нужно грузить а что не нужно
2. Есть волшебная кнопочка загрузить зависимости проекта
.png164 Кб, 1238x572
626 3060221
>>60218
Вот, я даже твой slnf нашел для кестрела. И жмакнул на это "загрузить зависимости проекта"
Не работает.
Че дальше?
.png4 Кб, 598x378
627 3060313
Хм. Хмммм.
Я тут думаю вот над чем.
А как скейлить монолит со стейтфулл протоколом? Не http.

Пока что я вот что придумал только.

Выделить некий Хост. Этот хост - должен быть тем местом, куда подключаются клиенты.
Выделить серверы. Это те кто на самом деле логикой занимаются, обрабатывают этот протокол.
При старте - серверы - говорят хосту: Я существую, вот мой ip-порт, если что, я на связи.
При очередном пакете от клиента, хост проверяет, знает ли он к какому серверу привязан клиент. Если знает - просто передает все что передано - этому серверу, то что придет от сервера - передает обратно. Если не знает - увеличивает значение счетчика, и просит сервер принять, если сервер готов принять новую сессию - привязывает это соединение к этому серверу и начинает передачу.
Если сервер упал - хост должен узнать об этом, и убрать из списка активных хостов упавший. Все соединения, которые были привязаны к этому серверу - закрываются. При попытке восстановить соединение - они будут перенаправлены на новый сервер.

Но я тут вижу проблему. А если хост - упадет? Как его скейлить?
image.png246 Кб, 1899x733
628 3060339
>>60221
Хуй знает в чём твои проблемы. Просто прошёлся по мдшке с инфой как начать разработку и всё работает (кроме решарпера который увидел фантомные ошибки, но оставим это на его совести)
629 3060551
>>60058

>На работе всего 100 проектов в солюшине


Монорепы - зло.
630 3060577
>>60551
Ты не представляешь, насколько я согласен с этим.
Но тут чисто организационный момент. Руководство сеет шизу, что надо для каждого репозитория - писать отдельное письмо султану и просить доступы. к конкретному репозиторию, поясняя откуда ты узнал про этот репозиторий, зачем тебе доступ и т.д.. Соответственно, уже разрабы - не хотят в этой хуйне участвовать и начинают делать в духе: "Otdel1Repo" внутри которого все проекты, а в проектах уже суперсолюшины.
631 3060626
>>60577

>Руководство


Согласен - шиза (вангую, что какая-то продуктовая контора, где владелец считает свой продукт самым-самым и трясется, что конкуренты украдут его "уникальные" разработки). Но разрабы тоже лопухи, что повелись и решили это таким способом. Можно ж было либо по группам проекты/права раскидывать, ну или напридумывать шаблонов для запросов.
632 3061615
Есть интерфейс, есть два класса - враппера, которые этот интерфейс должны реализовывать. Проблема в том, что у внутренних классов два метода, которые должны быть обернуты в один и тот же метод интерфейса, принимают разные аргументы. Как быть с этим?
633 3061618
>>61615
Нихуя не понял, но есть перегрузки и явная реализация
634 3061851
>>61615

>принимают разные аргументы


Перегрузка, не?
635 3062060
Почему вывод не "1 2 3"?
636 3062064
Смотрите. Есть код вида:

static object _syncRoot = new object();

void OnEvent(Context ctx)
{

lock(_syncRoot){
if(!_globaContext.HasAnyOtherUser(ctx.BoundResource)){
_globalContext.BindResourceToContext(ctx, ctx.BoundResource);
}
}
}

void OnApplicationComplete(Context ctx){
lock(_syncRoot){
if(_globacContext.HasAnyOtherUser(ctx, ctx.BoundResource)){

_globalContext.FreeResource(ctx);

}
}
}

Ну. Т.е. есть некий ресурс, который шарится между объектами. Когда он никому не нужен - его нужно освободить. Проблема в том, что ресурс - из нативного кода, т.к. GC его может не собрать.
Проблема кода выше - если OnApplicationComplete наступает сразу много где, случается пиздосики. Все потоки начинают пытаться войти в критическую секцию, чтобы попробовать освободить ресурс, а часть потоков - пытается получить его или создать.

В общем. Из-за этого начинается ужас страшный.
И я не знаю как решить эту проблему на самом деле потокобезопасно.
Единственный костыль, что я придумал - вынести это вот выделение ресурса - в собственный поток обработки, который в бесконечном цикле бегает по объектам, если остались объекты, которым какие-то неуправляемые ресурсы нужны - то не удаляем, если не остались - удаляем. А если есть те, кому не дали еще этот ресурс - создадим и дадим. Но это какая-то шляпа если честно. А как иначе - я ХЗ.
636 3062064
Смотрите. Есть код вида:

static object _syncRoot = new object();

void OnEvent(Context ctx)
{

lock(_syncRoot){
if(!_globaContext.HasAnyOtherUser(ctx.BoundResource)){
_globalContext.BindResourceToContext(ctx, ctx.BoundResource);
}
}
}

void OnApplicationComplete(Context ctx){
lock(_syncRoot){
if(_globacContext.HasAnyOtherUser(ctx, ctx.BoundResource)){

_globalContext.FreeResource(ctx);

}
}
}

Ну. Т.е. есть некий ресурс, который шарится между объектами. Когда он никому не нужен - его нужно освободить. Проблема в том, что ресурс - из нативного кода, т.к. GC его может не собрать.
Проблема кода выше - если OnApplicationComplete наступает сразу много где, случается пиздосики. Все потоки начинают пытаться войти в критическую секцию, чтобы попробовать освободить ресурс, а часть потоков - пытается получить его или создать.

В общем. Из-за этого начинается ужас страшный.
И я не знаю как решить эту проблему на самом деле потокобезопасно.
Единственный костыль, что я придумал - вынести это вот выделение ресурса - в собственный поток обработки, который в бесконечном цикле бегает по объектам, если остались объекты, которым какие-то неуправляемые ресурсы нужны - то не удаляем, если не остались - удаляем. А если есть те, кому не дали еще этот ресурс - создадим и дадим. Но это какая-то шляпа если честно. А как иначе - я ХЗ.
637 3062067
>>62060
Точнее, 0 1 2
638 3062071
>>62060
Захват переменной. Решарпер/идея тебе бы сразу по рукам надавали за такое
639 3062083
>>62060
Потому что майки - пидорасы и не додумались дать возможность явно указать - хочешь захыватывать ты по ссылки или по значению. Нет. Надо спрятать, надо чтобы было неявно, надо, чтобы ты как ебан - делал фактории лямбд.
.png204 Кб, 907x857
640 3062162
>>62064
В общем. Для наглядности накидал пример в студии.
641 3063273
А как тогда проверить 0.1 + 0.2 == 0.3?
Округлить сначала?
642 3063277
>>63273
Другое тип чисел юзай который работает в 10чной системе
643 3063279
Почему на мои вопросики не отвечают? Вроде раньше отвечали, а тут - чет прям не отвечают(
>>62162
644 3063284
>>63273
Перевести до целых чисел (умножив на ту точно которая нужна,
в данном случае на 10), это проблема IEEE 754 для всех языков.
645 3063292
>>63273
Самый лучший способ - не использовать в принципе числа с плавающей точкой.
Либо целые, либо свой тип с фиксированной точкой.
646 3063300
>>63273

>А как тогда


1) Сравнивать всегда по диапазону с нужной точностью (больше-меньше)
2) Округлять до нужной точности с переводом в целый тип
3) Не использовать float . Очень часто те же бабки, если не подразумевается всяких рассчетов с ними кроме суммирования, просто хранятся в формате int*100.
647 3063307
>>63273

> А как тогда проверить


У тебя во второй пикче ответ написан.
Взять некое минимальное число, которое будет символизировать предел точности, назвать его греческой буквой Эпсилон.
Или взять искаропки предоставляемый средой https://learn.microsoft.com/ru-ru/dotnet/api/system.double.epsilon?view=net-8.0

Вместо сравнения двух даблов, ты вычитаешь один из другого, берешь абсолютное значение (отбрасываешь минус если есть) и проверяешь больше ли это чем эпсилон? Если это больше эпсилона, то два дабла не равны, иначе равны.
648 3063452
>>63273
Если тебе надо, чтобы 0.1 + 0.2 было равно 0.3, используй decimal.
649 3063599
>>63277
>>63284
>>63292
>>63300
>>63307
>>63452
Спасибо

>>63292
А фиксированная точка это у каких типов?
>>63277

> тип чисел юзай который работает в 10чной системе


Это какая?

Я нуб просто, даже не джун пока
650 3064177
>>63599

> А фиксированная точка это у каких типов?


Раньше были типы типа денег, с фиксированными двумя разрядами после точки, но в шарпе денежный тип decimal тоже с плавающей. Не знаю, что там имелось ввиду, о чём тот анон говорит.
мимоджун
651 3064213
>>64177
>>63599
Сорт оф структура внутри которой два целочисленных типа. Один для дробной, другой для целой.
Чем то похоже на бигинт по концепции кастомного числового типа

мимо
652 3064218
>>64177
Просто берешь без задней мысли умножаешь количество денег на 100 и кастишь в int64, имея всегда в уме, что последние две цифры это копейки/центы/пенсы и т.д. В тех редких кейсах когда точность роляет или нужны хитрые бухгалтерские округления, кастишь к decimal, делишь на 100, вычисляешь и потом обратно.
Главное int32 не бери - точно не хватит.
1708943870023.png25 Кб, 826x159
653 3064241
>>63307

> Или взять искаропки


Искаробочный ЕПС слишком мал. Лучше делать свой, под свои задачи. Пикрелейтед.
654 3064328

>>3001731


> Там XAML, если от него не тошнит, то норм.


Меня тоже от хамла тошнит. Посоветуйте кроссплатформенный UI фреймворк для дотнет фреймворка, чтобы я мог делать фронт пока делаю бэк?
1570832994416.png21 Кб, 815x398
655 3064497
>>64241

>как даблы правильно сравнивать.


Ты проиграл еще здесь: x2 - x1
656 3064575
>>64497
Не я проиграл, а например вот они: https://it.wikireading.ru/29415
А чо? А в смысле?
657 3064663
>>64575
Не знаю где доступно это объясняют. Возможно тут https://en.wikipedia.org/wiki/Round-off_error
Если упрощенно сказать, то при вычитании из большого флоата малого, младшие биты улетят в трубу.
Ну и упрощенно говоря, в пример, Float.Max - 1 миллион == Float.Max. Подумаешь лям туда, лям сюда.
658 3064797
>>64663
Но у нас же тут даблы, а не синглы (флоат).
659 3064820
>>64797
И че?
660 3064870
>>64820
У них должно быть два ляма туда - два ляма сюда.
661 3064873
>>64870
Двойное "подумаешь".
662 3065416
Делаю систему команд. Заметил, что в логике исполнения команд у меня перед самим исполнением идёт множество проверок (наличие прав, например), если не проходит проверку - то отправляется сообщение об ошибке. Во многих командах часто идут одни и те же проверки.
Попытался решить эту проблему так: создал класс CommandCondition, который содержит в себе условие и метод при невыполнении условия; и при создании команды отправляю список этих условий. Если же проходит, то вызывается метод Execute у команды.
Код: https://pastebin.com/d7tnkcVq

Проблема в том, что мне в некоторых командах нужно отсылать параметры, которых нет в CommandContext. Пока что лучше, чем хранить в condition и action массивы object[], ничего не придумал. Что можете посоветовать, чтобы передавать динамические параметры?
663 3065477
>>65416
Нет ли в этом вопросе проблемы X/Y? Ящитаю, выполнение проверок - это не зона ответственности команд. Ты впихуиваешь невпихуемое. Думой над архитектурой. Тебе нужен синглтон менеджер проверки прав.
664 3065893
Чем C# лучше Java
665 3065920
>>65893
Ничем. Мы просто дураки, не нужно с нами водиться, а то и сам отупеешь
666 3065969
Тут есть любители поковыряться в исходниках ASP.NET? Где там искать реализацию TSL?
667 3065985
>>65969
Дальше F12 не ухожу, обычно на 2-3 класса вглубь хватает
668 3066151
>>65893
Современной удобной инфраструктурой. Майки вовремя опомнились и перестали поддерживать легаси.
669 3066691
>>26638
Шустрый клиент для XMPP но в стиле телеги.
670 3066746
Есть для c# нормальная незабагованная библиотека для работы с com портами? SerialPort не предлагать, я вообще не понимаю как такой кал могли написать в составе стандартной библиотеки.
671 3066789
>>66746
бамп
672 3066828
>>66151
После ухода авалонии из фонда, я чет сомневаюсь что мягкие хотят честно играть в попенсорс.
673 3066876
>>66828

> ухода авалонии из фонда


Кто все эти люди?
Давай в подробностях.
674 3066917
>>66876
Поди те же долбоёбы что написали SerialPort
675 3067367
>>66876
Кроссплатформенный GUI
676 3067411
Подскажите, как переконвертировать коллекцию<T> в коллекцию<U> ? Например, у меня из файла подгружается коллекция общих элементов, а из них формируется в одном месте коллекция лист-айтемов, а в другом коллекция меню-айтемов. Сейчас делаю по старинке через форыч, но вроде где-то видел, что можно линком в одну строку пакрасате сделать?
677 3067429
>>67411
x.select(x=> new y).tolist()
Тупые вопросы, лучше в доку с таким
678 3067433
>>67429
Не нашёл в доке. Да я тупой, будьте толерантны. Спасибо!
.png8 Кб, 392x171
679 3067457
Пацаны.
Вот как мне сделать что-то типа такого с тем что собирается?

Типа, чтобы была папка с экзешниками типа "корень". Подпапка bin в которой лежат всякие dll и прочие штуки.
Ну и data - для всяких ресурсов приложения(звуки там, картиночки, шрифты, ну вы поняли).

Типа да. Я знаю, что я могу сделать app.exe типа просто неким хостом, собрать дотнетом в единый исполняемый файл, а потом лезть в папку bin и data.
Но я бы хотел, чтобы типа мне не нужно было ебаться со всем этим поздним связыванием и прочим, а просто чтобы запустил, оно собралось, я кайфую. А все это позднее связывание - заставляет так изъебываться на самом деле с тем как проект собирать, копировать куда-то выходные dll и прочее-прочее.
680 3067472
>>67457
Пишешь таргет в мсбилде на перенос дллок, в поиск путей с дллками добавляешь свой путь
681 3067478
>>66876
Без честного развития опенсорса, и заигрывание в ЕЕЕ, дотнету будет шляпа.
682 3067495
Авалония закрывает исходные коды и вводит новую модель монетизации

Чë, испугались?
1709148248815.png12 Кб, 437x318
683 3067510
>>67367
А это та самая авалония? Говнище полное. До сих пор на Ето.Формсах гуи ебошу и кайфую. Никакого тебе хмл-говна. Взял и описал форму прямо в конструкторе, красивым декларативным способом, в который шарп нынче научился.
684 3067625
>>67510
Удваиваю это.формы.
К слову, синтаксис инициализаторов в шарпе был давно, чуть ли не с 4.0.
685 3067674
>>67367
Ничего не имею против авалонии кроме шрифтов под виндой
Какое отношение они имеют к мелкософту? (ну кроме того что мс решили родить мауи, а не взять авалонию под крыло - что лично я осуждаю, но что подчеркивает что мс до авалонии дела нет. Дело есть у джетбраинс, но они не мелкософт)
686 3067675
>>67510

>красивым декларативным способом


Это то что раньше в дедовские времена студия сама генерила от вкидывания контролов
Что тут красивого
Красиво это jetpack compose
687 3067772
>>67478
Ну майки вроде как заценили как бустанулся дотнет при переходе на попенсурс модель, но это не отменяет вероятности прихода очередного эффективного который решит, что нужно возвращаться к корням.
Ну и опять же у майрософта столько бабок, что они вполне могут начать косплеить гугол и однажды сказать что, "ребяна, нахуй все, нам надоело, в жопу ваш дотнет" и слить его куда-нибудь, а то и вовсе закрыть.
688 3067833
>>67772
Там же вроде MIT, то есть последняя версия все равно останется у комьюнити, не? Понятно что потом могут создавать всякие трудности типа у нас названия API закопирайчены, но с высокой вероятностью пойдут нахуй или просто будет переименовано.
689 3068863
Как сделать файловый ввод в переменную типа int? Любая попытка преобразовать данные из файла приводит к неработающей программе.
690 3068867
>>67833
Они уже начали EEE, там у линуксоидов что-то с хотрелоадом. Ой, ну такая же мелочь, казалось бы? Ну наверное надо идти на винду, на правильную IDE, где все работает правильно.
Какие еще подводные там есть, хз.

Начал некоторые проекты, почитал нытье на эту тему и решил переписать. Сами шарпы, конечно, не виноваты, продукт годный, но не хотелось бы играть в квази-опенсорс
691 3068875
>>68867

> Какие еще подводные там есть, хз.


Есть один, который никто почему-то не замечает. Дебаггер дотнета проприетарный и работает только в студии и вскоде (хоть и на линуксе).
692 3068886
>>68875
Спасибо за инфу.
693 3068930
Тема: Invoke против CancellationToken

Есть задача, которая асинхронно ждет какое-то время, а потом проверяет состояние булевой переменной, которое меняется извне. Зачем мне использовать токен отмены, который к тому же и диспозить надо, когда я могу использовать инвок к булевому свойству?

Или же токен отмены используют в случаях, когда запросы состояния возникают очень часто?
694 3068932
>>68863
Можешь подробнее описать проблему? Ничего не понятно.
Тебе надо распарсить строкове значение в int?
Опиши какие данные поступают из файла и что в итоге ты ожидаешь. Опиши какое исключение возникает.
695 3068934
>>67510
Это пока тебе не понадобилось сделать сложный интерфейс.

>Взял и описал форму прямо в конструкторе


В wpf тоже самое. Может перетягивать контролы и менять их свойства в окошке свойств.

Ну а на скрине говнище ебаное, прибитое гвоздями. Любая задача чуть сложнее интерфейса калькулятора и ты закопался, либо просто не стал делать.
696 3068945
>>68930
А ты попробуй в 10 методах, да по уровням использовать свою переменную - вот тогда и узнаешь.
697 3069052
>>68867

>Они уже начали EEE, там у линуксоидов что-то с хотрелоадом.


Это как раз таки не ЕЕЕ, а то самое "нам надоело - ебитесь сами". Они по той же причине выпилили и на маках свою IDE.
Там на самом деле много такого в духе "мы вам итак кросплатформенность завезли, но мы не подписывались совсем все дорабатывать". Та же System.IO крайне ограничена при работе с файловой системой линукса, а официального ничего особо и не предвидится. Есть только mono.posix, который х.з. уже сколько лет в состоянии rc и не собирается из него выходить.

Проблема в том, что даже несмотря на то, что там все под MIT, если майки реально забьют на шарп, то если его не возьмет под крыло какой-нибудь "фоундэйшен", то он просто загнется (собственно как и любая другая платформа)
698 3069171
Что лучше: Vosk, Picovoice, MS.Speech, System.Speech? Из требований возможность работы полностью офлайн и возможность бескостыльной работы вне Windows. Пока лидирует Vosk т.к. Picovoice требует акк хотя бы для первоначальной настройки, с MS.Speech и System.Speech непонятно как это будет работать вне Windows, в частности неясно как языковые пакеты ставить вне винды т.к. на сайте Майкрософт я вижу только MSI
699 3069252
>>68934

> Любая задача чуть сложнее интерфейса калькулятора и ты закопался, либо просто не стал делать.


Этот фреймворк делался как интерфейс для специфичного дизайнерского софта, которым пользуются в основном ювелиры. (Rhinoceros 3D - 3D computer graphics and computer-aided design (CAD) application) И до сих пор тот софт на ето.формсах работает.

И никто там не закапывается.
700 3069355
>>69052
Сначала охватили аудиторию, а потом начали закручивать все везде, кроме винды. Ну да, устали они.
Заработать репутацию очень сложно, потерять очень легко.
701 3069381
>>69355
А начали они вообще с анально вендорлокнутого виндой нетФреймворка
702 3069442
>>68867
Я ещё не видел ни одного языка, где хотя бы на одной системе хот релоад работал как надо.
Всегда отключаю по возможности, потому что нет никаких гарантий, что код после хот релоада ведёт себя так же, как после колд.
703 3069451
>>69252
Не показатель вообще ничего
704 3069455
>>69451

> врёти! оволонея лутше!


Кекекс плез.
705 3069464
>>69455
вообще то да. Как захочешь сделать кастомный контрол так сразу поймешь

Но вообще тупо показывать "вон это написано на этом значит это хорошо". Потому что при должном усердии на всем можно написать гуи.

а ето фомс описание выше - ну это же реально древность. так в QT описывают или дизайнер винформс сам пишет.
Хамл не особо лучше, но все же он изначально задуман как lookless
А тут просто кроссплатформенный винформс да еще с описанием ручками

новомодно это jetpack compose
там тоже кодом. но есть НЮАНСИЩЕ
706 3069468
>>69464
Для зумеров туда завезли хамл и мввм с обсервабле коллекшонами. А мне и дидовский метод пойдёт, я дед.

> захочешь сделать кастомный контрол так сразу


dotnet new etofile -p
707 3069469
>>69468

>Для зумеров туда


когда возникла технология зумеры еще под столк пешком ходили

>dotnet new etofile -p


и че дальше? магическим образом возникнет магический контрол? ню ню

> дидовский метод пойдёт, я дед


каждому свое. у каждого свои радости. Я вот не использую EF и гит (а божественный меркуриал) и мне норм.
708 3069511
>>67510
В авалонии тоже можно описывать форму прям кодом, XAML продвигается для аналитиков и дизайнеров, чтобы не тыкали программистов цвет кнопки поменять

Говорилось что фишка XAML в том чтобы мимокроки могли делать чисто косметические изменения в форме без программистов, хз где есть такое
709 3069593
Ебать мой хуй, как же я люблю писать энтерпрайсный код!
710 3069686
>>69593
Я тоже!
Но меня заставляют писать системный на заваоде(
711 3069727
>>69469

>а божественный меркуриал


Как же я грустил когда пришлось окончательно поменять меркуриал на гит. Хотя я уже и привык, но все равно иногда так хочется.
712 3069730
>>69686
А я в банке пишу системный (ну почти) софт. Я доволен.
713 3070128
>>69252

>которым пользуются в основном ювелиры


Там диапазон от ювелирки до архитектуры. Я знаю про рино. Я в нем работал долгое время, собсно я так в шарп вкатился.
Основная претензия к этой программе в том, что у нее внезапно устаревший интерфейс. Я много кого хотел пересадить на рино, ибо в России он не очень популярен, но все смотрели на скриношоты UI, говорили фу какой кал и скачивали фьюжин (несмотря на то, что это кал по функционалу). А после выхода пластисити можно рино закапывать. На ней мамоны по типу меня еще посидят какое-то время, потому что привыкли, но притока новых пользователей не будет.

>И никто там не закапывается.


Когда я слышу о винформсах, то обычно речь идеть об эгоизме самих разработчиков, которым лень чет там пилить, и естественно под эту лень они выдумывают массу причин. В итоге разработчики "не закапываются", потому что при возникновении проблемы они эту проблему шлют нахуй, а пользователю это просто не интересно и он идет искать что-то еще.
714 3070219
>>70128

> устаревший интерфейс


Интерфейс устаревший у рино, и в самом етоформсе по умолчанию не включены темы, но они есть. Авторы сами любители нативного лука, поэтому темы не включены искаропки.

> Когда я слышу о винформсах


Там платформонезависимые окна, когда ты их описываешь, у них свой набор виджетов, без визуализации. Визуализацией занимаются отдельные пакеты-адаптеры, имеющие префикс eto.platform, таким образом, винформсы и WPF в рамках етоформс - это отдельные платформы. Ты можешь сделать приложение, которое на выходе будет отрисовано WPF, причём при создании шаблона по умолчанию именно адаптер WPF создаётся для винды. Так же авторами фреймворка учитывается, что у разных платформ есть свои отдельные виджеты и свойства, и для этого есть возможность пробросить через платформенный адаптер нативные колбэки и хэндлеры изнутри наружу и наоборот.

Да, название фремворка запутывающее, как будто ты поверх винформс должен работать, но это не так.
715 3070293
>>70219
Точно так же работает и хамарин и мауи, но всё не описывается кодом
Причем разве это код вообще. Он не императивный
716 3070297
>>70293

> разве это код вообще. Он не императивный


Хорошо-хорошо, это не код. Успокойся. Опусти нож.
717 3070303
>>70297
Просто точно такой же код может написать дизайнер идешки
Он не императивный

В MVU(I) подходах он императивный. Но это не про шарп
1709368519117.png21 Кб, 353x310
718 3070311
>>70303
Я не понимаю, что ты хочешь донести. Обесни по русски.
719 3070323
>>70311
я хочу донести что показанное "смотрите как можно описывать уи в ето.формс" по факту просто является обычным кодом (с упором на некоторые фичи шарпа) описания как деды описывали, только за них дизайнер писал.
И что как бы на смену этому и пришел хамл (ну чтобы кодом не описывать)
так что это не будущее. это прошлое.

далее работают что етоформс, что замарин по одному принципу, но первый описывает кодом, а второй хамлом. Что лучше? да 2 стороны одного говна

А вот реально другое - MVU подход. там уи описывается кодом, но, в зависимости от возможностей языка, делается это с некоторой долей императивности
То есть сам код является не только описанием "что во что вложенно + аттрибуты), а именно выполняемым
Для понимания задача - по флагу показать кнопку или картинку. В WPF это решается через ContentControl
а императивно буквально так
if (showImage){
Image
}else{
Button
}
ну то есть самый обычный код.

я не говорю что это лучше. Это просто по другому. Но это хотя бы не из древности
720 3070348
>>70323
Я тебе скинул скрин 5 секунд в гугле по слову "императивность", ознакомься.

То что у тебя своё определение императивности - делает твои посты нечитаемыми.

> на смену этому и пришел хамл


В етоформс есть хамл.

> А вот реально другое


> задача - по флагу показать кнопку или картинку


> а императивно буквально так


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

Но я всё ещё не понимаю, причем тут императивность? Почему ты так оббазвордился императивностью? В шарп завезли декларативность, может ты всё это время путал императивность с декларативностью?
хамл, жсон и т.п. - это декларативные языки описания структур данных. В шарп завезли инициализаторы, которые по сути именно делают декларативное описание создаваемого инстанса. Делаешь несколько вложенных инициализаторов и получаешь функционально те же яйца, что и хамл, только в профиль.
721 3070372
>>70323
И вообще, в этом коде у тебя смешана логика и данные, что в современных гайдах не приветствуется.

> if (showImage){


> Image


> }else{


> Button


> }


Правильно по зумерски ебануть во вьюшку оба элемента и прибиндить их видимость к чекед-свойству вьюмодели которое прибиндить к чекед свойству чек-элемента. Не?
722 3070374
>>70348

>То что у тебя своё определение императивности


это у тебя какое то свое. я тебе описал ИМЕННО ТО ЧТО В ГУГЛЕ и вообще во всем мире
то есть инструкции описывающие UI ВЫПОЛНЯЮТСЯ буквально построчно сверху вниз
А НЕ ПРОСТО ОПИСЫВАЕТСЯ иерархическая структура контролов и их аттрибутов

>причем тут императивность? Почему ты так оббазвордился императивностью?


не причем вовсе. просто упомянул что то, что вы принесли - старое говно мамонта в плане описания UI, даже старее хамла и "вот если бы что то новое типа.." а там и речь зашла о новых подходах.

>Таким образом можно на лету менять кнопку и картинку по нажатию чекбокса.


Везде можно. В любом подходе описания уи. ето.формс не уникален, а один из...да всех в общем то.

>хамл, жсон и т.п. - это декларативные языки описания структур данных


Да кто ж спорит. хамл это то же самое описание кода в другом виде. Вот только хамл описание позволяет визуальный дизайнер запилить. Даже винформс позволяет запилить дизайн из кода. А что там с ето.формс? хамл я пишу руками, но вот на райдер не перехожу из за того что там дизайнера нет. Да и в хамл я могу руками писать гуи - никто ж не запрещает. и дизайнер будет.

Ну и основная претензия к этому всему - крайняя ограниченность кастомизации в угоду кроссплатформе и нативности гуи на конечной платформе.

>>70372

>у тебя смешана логика и данные


нет не смешана. не путай логику модели (или даже вьюмоделей) и логику UI
723 3070375
>>70374

> инструкции описывающие UI ВЫПОЛНЯЮТСЯ буквально построчно


Ложь.
724 3070376
>>70375
ты явно потерял нить беседы. перечитай.
725 3070378
>>70374

> и логику UI


В юи нет логики, в нем есть только дерево элементов.
726 3070380
>>70376
Нахуя перечитывать чушь?
727 3070389
>>70378

>В юи нет логики


это утебя в голове нет логики
банальный триггер OnMouseOver = изменить фон кнопки является логикой UI - и ТЫ НЕ ПОВЕРИШЬ, но в реальности это выполняется код который меняет фон кнопки

>>70380
ну так и запишем. читает жопой и слился.
728 3070417
>>70372

>прибиндить их видимость к чекед-свойству вьюмодели которое прибиндить к чекед свойству чек-элемента. Не?


закат солнца вручную. Логика элемента то обрабатывается хоть он и не виден (только логику связанную с рисованием движок может скипнуть, а все что наворотил пользователь - нет)
.jpg144 Кб, 700x778
729 3070459
>>67472
Попробовал.
Эта срань работает криво. Если путь для поиска пути задавать относительный, то в случае запуска в виде демона/сервиса - приложуха не стартует(
Эх.
Мдя...
730 3070631
>>70459
Использую абсолютные пути. Узнать из какого места произошел запуск нет никаких проблем
731 3070641
>>70631

> Использую абсолютные пути


Так а как я узнаю абсолютные пути, если приложуху пользователь куда хочешь может положить по желанию?
А без этого - хостовый процесс - не сможет запустить уже мой проект, чтобы я там что-то подгружать начал и разрулил если надо пути.
732 3070650
>>70641
Ты дурак? Так и гугли c# get startup path
.png34 Кб, 932x286
733 3070681
>>70650
Давай. Показывай как надо сделать. А то я чет не понимаю.
На пальцах. Шаг за шагом.
image.png74 Кб, 851x362
734 3070711
735 3070953
>>70711
Чел. Я же говорю о случае, если ты запускаешь свой проект из другого места.
Вот допустим, если я захочу свою хуйню запускать как виндовый сервис, она будет дергаться из system32. И тогда вся эта срань по пизде пойдет, если путь до папки с dll'ками полностью не прописать.
А прописывать полностью - бред, потому что пользователь, который скачал и себе хочет установить - не .NET-хуй, и ему разбираться, куда там че прописать не всралось, а положить скачанное он может в любую папку.
Ну да ладно.
736 3070962
>>70953
Ещё раз повторяю, код никак не привязан к месту из которого вызывается всё что ему нужно это что бы дира dlls была в дире где лежит основная дллка, всё, не важно больше ничего
image.png21 Кб, 888x148
737 3070963
>>70953
Хуй знает что тебе ещё нужно
738 3070970
>>70962
Для хостового процесса .NET, который ищет откуда брать сборки - важно.
Если указан относительный путь где искать сборки - оно не разруливается.
Вот ишью с этим https://github.com/dotnet/runtime/issues/72571

Если не так, показывай по шагам, че делаешь.

>>70963
И ты показывай. А то просто постишь скриншот, хуй знает чего с каким-то выводом в консоль.
739 3070990
>>70970
Не хочешь верить значит иди нахуй. Я даже заебался и как сервис в винду запульнул этот экзешник.

У всех эта хуйня работает с тем же цефом для выбора x32|x64 либ, а у тебя не работает, во дела то!
740 3070992
>>70990
Покажи содержимое runtimeconfig, чел.
image.png25 Кб, 770x289
741 3070994
742 3070995
>>70994
Ничего не понимаю тогда.
Ты либо троллишь, либо чего-то не договариваешь.
image.png190 Кб, 1176x907
743 3070997
>>70995
Заебал ты меня, я всё надеялся что ты в гугл пойдёшь и первой ссылкой увидишь AppDomain.CurrentDomain.AssemblyResolve в связке с Assembly.GetExecutingAssembly().Location
Но видимо ты решил не гуглить совсем
744 3071000
>>70997
Чел. Это позднее связывание. Я про него еще в первом посте написал.

> . Я знаю, что я могу сделать app.exe типа просто неким хостом, собрать дотнетом в единый исполняемый файл, а потом лезть в папку bin и data.



И я написал, что не хочу этого делать. Я хочу чтобы у меня все dll - были во время разработки - как обычно через референсы указаны, чтобы я мог просто дергать их как человек. Но после разработки - переложить их в папочку bin/libs/dlls, чтобы более чистый вид был. Можно конечно для этих целей собирать все в один экзешник, но опять же по памяти - там начинается хуерга что как сервис оно стартует хуево(оч долго, и на том же линуксе систимде - начинал вонять по этому поводу).
Короче. Ты мне напиздел получается.
745 3071002
>>71000
Так и работает, дурачина. Я руками сейчас беру и перекладываю дллки в dlls после билда, до этого они беруться из рута.
Никаких отличий в использовании вообще нет, просто добавляется хук на поиск.

В проекте нет абсолютно никаких отличий от стока кроме ручного переноса дллок если нужно и доп резолвера
image.png35 Кб, 941x480
746 3071004
>>71000
В доке прямо написано что вызывается когда не удалось найти дллку в стандатрных местах
747 3071007
Хуй знает, может в твоём представлении перенос файлов после сборки меняет сорсы или что то в этом духе. Или я какой то не такой как ты думаешь код написал
748 3071008
>>71007
И я заебался на середине затирать юзернейм, так что можешь в телегу написать если подгорело
749 3071011
>>71007
>>71004
>>70997
Хм. Ладно.
Признаю. Был не прав. Косо пробежался по первому куску кода и не заметил, что тут какой-то обработчик события накидывается. Подумал, что просто загружаются сборки из папки.

В свое оправдание - в нормальном .Net Framework - такой ебельди делать не надо было. Просто в config дописываешь <probing privatePath="bin"/> и как человек радуешься.
750 3071012
>>71011

> в нормальном .Net Framework


У тебя две части противоречат друг другу
751 3071014
>>71012
Ой, да не надо. Единственный минус фреймворка, это то, что из-за его раздутости - были дублирующие штуки и приходилось догадываться, из какого пространства имен нужное тебе.
В остальном - это было лучшее в плане девелоперского экспириенса, что вообще возможно. Я только из-за него этим программированием и занялся.
752 3071015
>>71012
Опять же. Вот пример как оно делалось в те времена.
Все. Никаких там ресолверов и прочего. Просто указал подпапку и радуешься.
753 3071058
>>70953

>Вот допустим, если я захочу свою хуйню запускать как виндовый сервис


Тогда тебе должно быть лихо похуй, что там у тебя внутри каталога с приложением твориться, максимум конфиги в отдельный каталог положить, если ты не сподобился вынести их в консул или еще куда-нибудь наружу.
754 3071090
>>71058
Мне и было похуй, пока пользователи не начали ругаться, дескать, ря, много дллок, хуй найдешь нужный экзешник, говно сделал, пидорас, уууу, уууу, уууууу
755 3071103
>>71090
Извини, а нахуй юзеры лезут в папку с софтом? Всё что они должны видеть это инсталлер и ярлыки на рабочем столе
756 3071128
Есть строка

>Ехал Грека через реку, видит Грека в реке рак, сунул Грека руку в реку, рак за руку Греку цап.



Есть набор ключевых слов

>Грека, рак



Грубо говоря мне нужно подсветить ключевые слова. Я должен разбить строку по этим ключевым словам и каждому отрезку присвоить соответствующий стиль текста. Но я не понимаю как разбить строку так, чтобы я знал что и где находится. Для примера несколько способов:

1. Если я воспользуюсь методом string.Split, то я разобью строку на массив нонейм отрезков, при этом я не знаю в каких элементах содержится слово "Грека" или "рак".

2. Или взять Regex

>(?:Грека|рак)


Я получу ключевые слова, но потеряю отрезки текста, не являющимися ключевыми словами. А мне надо разбить предложение, а затем снова собрать.

3. Самый контролируемый вариант получается при использовании метода string.IndexOf, когда я узнаю индекс вхождения искомой строки. Но у меня чувство, что при таком способе каждый раз я изобретаю велосипед.
757 3071139
>>71128
Начнём с того что в результатах регулярки есть индексы символов в строке по которым попадание
758 3071172
>>71139
Ааааа, спасибо. Точно, что-то такое видел.
759 3071408
>>71103
Ну, опять же, мне вот лень было делать хуевину чтобы задавать настройки, все настройки - лежат в appsettings.json. Отдельно задачу - сделать возможность настраивать все это из UI тоже никто не ставил.
Так что периодически - надо лазить.
Я оправдываю свою лень - тем что в линуксе вон никто не выебывается, идут в /etc/conf и всем ок, так что и тут потерпят)
760 3071417
>>71408
так то линукс. там народ привык к мучениям и пердолингу
А тут пока найдешь где оно в профиле в этих роаминг локал хрен разберешь в чем разница и куда вообще идти. Умные люди делают менюшку в софтине которая откроет блокнот с настройками.

но ты мучай людей, мучай.
761 3071422
>>71090
Делай как все, dll-ки во внутренней папке, снаружи папки Run.exe
762 3071426
>>71422
Ну, я примерно такое и собирался сделать.
В первом посте скриншотик того как хотелось бы >>67457

>>71417

> Умные люди делают менюшку в софтине которая откроет блокнот с настройками.


Нууууу. У меня таки софтина - это скорее сервисная хуйня для работы с большим спектром железяк. Обычно работает как демон. И обычно, когда у клиента новые железяки появляются, с которыми с первого раза что-то не получилось - ему надо залезть в папку и поставить нужный флажок, посмотреть, помогло ли, если помогло - радоваться, если не помогло - крыть меня хуями, чтобы я выяснил в чем дело, добавил новый флажок (потому что вся эта хурма у меня за флажками, чтобы в случае если оно только хуже сделает - можно было тупо отключить), и потом он новый флажок поставит и все заработает. Такие вот дела. Переработать это все чтобы было по человечески - никто времени не дает. Я уже, если честно, сам не помню за что там все флажки и настройки отвечают, лул.
763 3071429
>>71426
Забавно. Можно флажками сжечь устройство?
764 3071432
>>71429
В теории - да. На практике - ни разу вот прям чтобы сжечь не было, самый хуевый случай это как раз бесконечный ребут.
765 3071456
>>70389

> ну так и запишем. читает жопой и слился.


Ето-господин не мог слиться, слилась авалония-шавка.

Вот как делается UI без логики. Учитесь, зумерки.
>>70417

> Логика элемента то обрабатывается хоть он и не виден


Нет логики в элементе. Учись проигрывать.
766 3071468
>>71456

>Ето-господин не мог слиться


однако он слился ибо читает ЖОПОЙ
и ЖОПОЙ же думает
я не говорил что авалония императивная

я сказал что есть И императивные подходы к выражению UI, а не только декларативные
и императивный подход НЕ ОТМЕНЯЕТ биндинги, шавка ты етовформовская бестолковая и там тоже можно вот так через визибилити сделать.
Разница декларативного UI и императивного в том что в императивном случае ТАМ ВЫПОЛНЯЕТСЯ КОД при построении UI. И если в декларативном твой код спрятан в контролы, биндинги, code-behind, то в императивном стиле он прямо описывает UI ВЫПОЛНЯЯСЬ!!!!
То есть код не является описанием структурности, использую которую потом движок построит UI, а код является самим кодом построения UI. Пошло выполнение if по ветке фалсе - и элемент просто не появился в визуальном дереве. Ключевое слово - пошло выполнение.

ты жопой прочитал. не разобрался о чем речь, но жопа твоя запылала

и ты притащил решение...ТАКОЕ ЖЕ как оно делается в авалонии, в впф и даже в винформс с биндингами лол. Что нового ты показал? ты показал СТАНДАРТНОЕ решение и кичишься этим.

>Нет логики в элементе


Кто сказал? А если это мой контрол где в code-behind может быть сколь угодно сложная логика, подписки там всякие и тому подобное. Я могу спокойно подписаться на INPC соурса (и конечно реагировать на события) и меня совсем не радует разбираться виден ли мой контрол или нет.
767 3071486
>>71456
хоть это и оффтоп ибо про императивность я просто упомянул, но все же покажу что такое MVU подход

смотрим (там правда котлин, но не суть)
https://pastebin.com/UNkWhr83
смотри описание структуры - оно очень похоже на описание твоего ето.формс и вообще просто описание кодом
но по факту - все это МЕТОДЫ, которые буквально вызываются и выполняются

и там второй пример табконтрол
никакого биндинга типа ItemSource (хотя конечно делается как 2 пальца в кастомных контролах)
поскольку код выполняется, то вкладки создаются
tabs.forEachIndexed
потому что в общем то это не табконтрол, а просто колонка, где ты сам рисуешь
и ты можешь конечно обернуть все это в функцию и и назвать ее TabControl

и все это не отменяет биндинги вьюмодели и так далее. Просто другой подход - при изменении вьюмодели не идет обновление по биндингам, а идет тотальное "изменилось там где вы читаете, перевыполните себя".

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

В других же языках приходится делать контролы классы и тогда код уплывает в метод этого класса, но принцип остается тот же - следим за местами обновления стейта и просим контролы себя обновить.
пример swift combine https://pastebin.com/Xcqv8Rj2
там тоже есть if

Шарп тоже так может как свифт, что то даже в MAUI делали такое. https://github.com/dotnet/maui/discussions/12820
И даже дебильное шарповское new можно убрать через static using

И вот это реально другой подход со своими плюшками и недостатками. А ты показываешь древность и радости полные штаны.
767 3071486
>>71456
хоть это и оффтоп ибо про императивность я просто упомянул, но все же покажу что такое MVU подход

смотрим (там правда котлин, но не суть)
https://pastebin.com/UNkWhr83
смотри описание структуры - оно очень похоже на описание твоего ето.формс и вообще просто описание кодом
но по факту - все это МЕТОДЫ, которые буквально вызываются и выполняются

и там второй пример табконтрол
никакого биндинга типа ItemSource (хотя конечно делается как 2 пальца в кастомных контролах)
поскольку код выполняется, то вкладки создаются
tabs.forEachIndexed
потому что в общем то это не табконтрол, а просто колонка, где ты сам рисуешь
и ты можешь конечно обернуть все это в функцию и и назвать ее TabControl

и все это не отменяет биндинги вьюмодели и так далее. Просто другой подход - при изменении вьюмодели не идет обновление по биндингам, а идет тотальное "изменилось там где вы читаете, перевыполните себя".

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

В других же языках приходится делать контролы классы и тогда код уплывает в метод этого класса, но принцип остается тот же - следим за местами обновления стейта и просим контролы себя обновить.
пример swift combine https://pastebin.com/Xcqv8Rj2
там тоже есть if

Шарп тоже так может как свифт, что то даже в MAUI делали такое. https://github.com/dotnet/maui/discussions/12820
И даже дебильное шарповское new можно убрать через static using

И вот это реально другой подход со своими плюшками и недостатками. А ты показываешь древность и радости полные штаны.
768 3071517
>>71417

>так то линукс. там народ привык к мучениям и пердолингу


Хуйню не неси. Регулярно лезу в конфиги графических программ на шиндовс. А в играх так вообще норма менять настройки через конфиг, потому что некоторые недоступны через графический интерфейс.
769 3071656
>>71517

>Регулярно лезу в конфиги графических программ на шиндовс


твои личные страдания. обычно виндософт таким не страдает
игры вообще исключение
770 3071682
>>71456
даже вот оно вроде живо
https://github.com/adospace/reactorui-maui
поверх мауи, который суть хамарин, который по той же фигне делает что и ето.формс

но где такое в ето.формс?
771 3071786
Поясните за бардак в культуре. Вот я ставлю в серилоге (пикрил 1)

>formatProvider: CultureInfo.InvariantCulture


И создаю тестовые логи данных различных типов (пикрил 2). И получаю результат (пикрил 3). Часть действительно в InvariantCulture, всем остальным записям насрать.

Еще хуже, когда выставляю CurrentCulture (пикрил 4), тут даже не соблюдаются правила культуры. Например разделитель дробной части через запятую, но итемы почему-то тоже через запятую, хотя там должна стоять точка с запятой.

Что происходит?
772 3071793
>>71656

>обычно


С чего ты вязл, что обычно? Может это твой случай уникальный. Любой более или менее сложный софт требует правки конфигов из файлов. К примеру вижуал студия.

опять на дваче капчу ушатали, как будто тут народу по сотне тысяч человек в день.
773 3071797
>>71468

> Кто сказал? А если это мой контрол где в code-behind может быть сколь угодно сложная логика, подписки там всякие и тому подобное.


Если там такое будет, мы тебе не перезвоним.
>>71486

> дебильное шарповское


> котлин


> котлин


Долго жаваблядок держался, но всё таки мы его вытащили на чистую воду. Репортим.
774 3071802
>>71682

> но где такое в ето.формс?


Мне это не нужно.
У меня паттерн MV, в нём отброшено всё лишнее. Есть только модель и только вьюшка. Модель ничего не знает о вьюшке, вьюшка знает о модели. Всё работает идеально, как швейцарские часы, даже объяснять лень.
775 3071838
>>71793

>К примеру вижуал студия.


ни разу не лазил в текстовые конфиги студии. Не знаю зачем это делать в принципе.

>>71797

>Если там такое будет, мы тебе не перезвоним.


так будет в любом контроле. Даже листобокс реагирует на изменения, просто дело до отрисовки не доходит ибо контрол не виден. Но подписки отлично работают пожирая процессорное время и оперативу.
В кастомных контролах заморачиваться о "а вдруг я collapsed заморачиваться просто нет смысла"

>Долго жаваблядок держался


ты вельми ДУРАЧОК. я тыщу раз говорил что пишу на шарпе (основной доход), но под андроид пишу на котлине в силу нативности подхода. И котлин обладает огромной выразительной мощью, что в шарпе и не снилась, но отвратительным рантаймом.

>>71802

>Мне это не нужно.


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

>У меня паттерн MV


а те кто пишут хамлом у них не так? что ты бред несешь ленивец
нихрена нового ты не притащил.
плюсы ето.формс - кроссплатформа
минусы - ограниченность нативными контролами + как ты сам показал, убогое выражение кодом "как деды писали"
776 3071870
>>71786
Итак, у моего приложения текущая культура вот такая:

>CultureInfo.CurrentCulture: "ru-RU"



Если я глобально, для приложения ставлю "en-US":

>CultureInfo.CurrentCulture = new CultureInfo("en-US");


то конвертация во всех случаях выглядит хотя бы адекватно,

>Test of 'Point' data: "100.8,5"


>Test of 'Array' data: [90.3, 70.8, 5, 34]


>Test of 'PointCollection' data: ["10.4,30.5", "25.5,17.9", "9.3,100.7"]


но тогда я сру себе в приложение, я не могу с этим дальше работать.

Если же я в конфигурации логгера устанавливаю

>formatProvider: CultureInfo.CurrentCulture


то при конвертации массивов, элементы по прежнему перечисляются через запятую как будто бы все еще стоит "en-US", хотя сами числа используют формат "ru-RU". Получается бредик:

>[90,3, 70,8, 5, 34]



Серилог виноват? Как это пофиксить?
777 3071871
>>71838

>ни разу не лазил в текстовые конфиги студии.


Сниппеты, к примеру.
778 3071877
>>71871
Есть решарпер/supercharger для такого
779 3071886
>>71877
Я тебе для примера написал. Не для всех софтов есть подобные решения.
780 3071903
>>71426
Ну так ты хотя бы просто конфиги в отдельный каталог Config вынеси, тогд пользователю не придется их искать среди кучи dll-ок. Он будет заходить в каталог приложухи и сразу видеть куда ему дальше лезть нужно.
781 3071918
>>71903
Конфиги в директории с приложением должны быть в состоянии ридонли.
А вот пользовательские редактируемые конфиги должны быть в AppData. И если пользователь случайно повредил их, либо нажал кнопочку "Reset to Default", то оригинальные файлы из папки приложением копируются в AppData.

Если "все яйца хранить в одной корзине" тобишь хранить редактируемые конфиги в папке с приложением, то их поломка приведет к поломке приложения, пока пользователь не переустановит его заново.
782 3071922
>>71870
Бамп вопросом
783 3071955
>>71870
ну видимо он числам делает ToString(), а уж те по текущей культуре форматятся
784 3071978
>>71918

>А вот пользовательские редактируемые конфиги должны быть в AppData.


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

Чел же прямо сказал, что ресурсов на рефакторинг у него нет, а править конфиги пользователям надо, поэтому они и лезут. Я и посоветовал, чтобы хоть немного упростить им жизнь - вынести конфиги в отдельный каталог, т.к. это делается буквально несколькими строчками кода.

>>71918

>пока пользователь не переустановит его заново.


Во вторых если программа предполагает модель работы как фоновый сервис, то она в принципе должна подчиняться принципу, что её можно в любой момент снести и накатить заново.
785 3071984
>>71955
Это я приблизительно понял.
Для сложных типов использует ToString(), который зависит от текущей культуры приложения. Но вот примитивные типы он конвертирует используя культуру, установленную в конфиге.

Проблема в том, что символ разделители элементов списка как будто захардкожен и всегда через запятую.

>[90,3, 70,8, 5, 34]



Я не знаю как это пофиксить. Я не могу использовать InvarantCulture в конфиге, потмуо что не будет работать адекватно ToString(), и не могу использовать CurrentCulture, потому что разделители итемов списка "сливаются" с разделителями дробной части чисел.
786 3072009
>>71984
Конечно, я могу различить разделитель дробной части "," от разделителя итемов ", " по наличию пробела, но это какая-то дичь.
787 3072020
>>71984
ну что он там использует для сериализации структур? жсон же (сам я любитель нлог)
ну а что у нас там в стандарте жсон?
788 3072031
>>71984
>>71922
Позырь вот тут:
https://blog.revolution.com.br/2023/07/17/log-formatters-in-c/
Конкретно раздел:
Creating a custom formatter
789 3072088
>>72020
Не, я вывожу стандартным способом, в строку.

>>72031
Я щас это изучаю, но боюсь, что это имеет отношение как раз к форматированию элементов, а влиять на формат вывода списков я не смогу.
790 3072097
>>72088

>Я щас это изучаю, но боюсь, что это имеет отношение как раз к форматированию элементов, а влиять на формат вывода списков я не смогу.


Там просто как раз кастомный форматтер делается, плюс мелькает параметр ListSeparator, так что я думаю если даже это не то, то близко.
791 3072124
Кто где хостит свои ASPNETы? Именно с самой самой последней версией фреймворка.
792 3072138
>>72124
На локалхосте.
793 3072163
>>72124
Свои в докере под кроватью
На работе в кубах
794 3072240
>>72097
Да там ссаный джисон конфигуратор, а я его не люблю.

Можно перед идентификатором параметра поставить символ собаки

>if (_log.IsDebug()) { _log.Debug("Test of 'Point' data: {@p}", new Point(100.8, 5)); }



Тогда элемент разбивается вот на такое:

>Test of 'Point' data: Point { X: 100.8, Y: 5 }



Т.е. сериализуется элемент. И если это какой нибудь Rect, то мы получаем вот это:

>Test of 'Rect' data: Rect { IsEmpty: False, Location: Point { X: 0, Y: 0 }, Size: Size { IsEmpty: False, Width: 30, Height: 49 }, X: 0, Y: 0, Width: 30, Height: 49, Left: 0, Top: 0, Right: 30, Bottom: 49, TopLeft: Point { X: 0, Y: 0 }, TopRight: Point { X: 30, Y: 0 }, BottomLeft: Point { X: 0, Y: 49 }, BottomRight: Point { X: 30, Y: 49 } }



Вместо этого:

>Test of 'Rect' data: "0;0;30;49"



Смотрел IFormatProvider, но он конвертирует конкретно итем.
ITextFormater отвечает за сборку строки лога целиком.
795 3072241
>>72124
Если про конкретно где - то ни скажу.

Если про тех часть - контейнеры на альпайн, без рантайма. Сравнение показало, что self contained с обрезкой неиспользуемого выходит экономнее, а это таки оказалось важно, когда контейнеров куча.
796 3072853
Куда вкатываться?
В Golang, в Java или в C#?
Где вероятность найти работу выше для джуна?
797 3072884
Поцоны, заранее извиняюсь за поток сознания.
Платиновый вопрос - как совладать с шифрованием в бэкенде?
В тырнетах советуют архитектурно это вынести это на уровень репозитория, но как мне вынести это в репозиторий если он работает с моделью в которой у меня шифрованные байт массивы. Ладно, это можно вынести на уровень сервиса, ок.
Вопрос два - что там с производительностью? Мне нужно сделать поиск, сортировку и фильтрацию. Если без шифрования я мог сделать это на уровне бд (энтити запросом), то сейчас мне получается нужно доставать все эти данные, разшифровать и уже делать то что я хочу, но мне интуитивно (да, замеры я никакие не делал) кажется это будет явно более накладно делать на уровне приложения чем на уровне базы.
Как вообще происходит вот эта сортировка/фильтрация в больших интернет магазинах к примеру? У них дохулион товаров, и допустим юзер юзает какие-то фильтра на них, я не верю что фильтра в этот момент применяются к абсолютно всем товарам в базе на каждый запрос каждого юзера. Сервер делает какую-то индексацию во временные таблицы раз в сутки ночью и потом на запросы берет данные оттуда?
Где-то можно почитать как это считается правильно реализовать роботу с шифрованными данными + большими объемами?
798 3072934
>>72853

> Где вероятность найти работу выше


На кассе в пятёрочке.
799 3073231
>>72884

>как совладать с шифрованием в бэкенде?


Нахуй не нужно. Просто прячешь все за межсетевой экран и дальше уже не твоя забота. Максимум хэшированием и соленьем сенситив инфы заморачиваешься и все.
800 3073446
>>72853
Раз ты спросил в шарпотреде, значит, уже всё решил.
801 3073488
Посоветуйте, как сделать дропдаун с кастомным попапом (таймпикер со своими свистоперделочными кнобами). 15 лет назад я легко делал такое в дельфи, а нынче вышел из криосна и нихуя непони.
802 3073536
>>73231
Почему не нужно?
А если у меня такой проект/такое требование?
А если внезапный слив данных?
И что ты имел ввиду здесь под сетевым экраном? Локальную сеть для бд и сервера?
803 3073570
>>72884

> Мне нужно сделать поиск, сортировку и фильтрацию


Вводи сурогаты, по которым можно произвести этот самый поиск-соритровку-фильтрацию, либо не шифруй то, по чему искать-фильтровать-сортировать собрался.
Как-бы шифровать надо чувствительные данные: пароли, эмейлы, логины, телебоны, номера карт и т.д., что и так не должно палиться по хорошему.
Про производительность. Если ты не собираешься базу на 100500 миллионов записей доставать и дефишвровать-шифровать, то разницы значительной ты не заметишь.

> Как вообще происходит вот эта сортировка/фильтрация в больших интернет магазинах к примеру


В кеш скдадывают и отдают из кеша. Чего нет в кеше - лезут в БД и кладут потом в кеш. Максимум - делается индекс. Потому что все уже наелись этих ебанутых БД с 100500 миллионами таблиц и гигатоннами логики в триггерах и хранимках. БД - просто хранилище. Если надо быстрее - выкидываем и берем ту что быстрее.

Опять - никто не шифрует в интернет магазине товары, нахуй. Это не то что представляет ценность. Все равно, что шифровать блоги в БД, нахуй. ЗАЧЕМ, блядь? Вот зачем? Чтобы хвастаться, что у тебя все зашифровано?
804 3073661
>>73446
Скорее всего он спросил это во всех тематических тредах. Щас ждет в каком треде ему наиболее любезно ответят.
805 3073825
>>72853
Ты опоздал лет на 10
806 3073858
>>71786

> Поясните за бардак в культуре. Вот я ставлю в серилоге (пикрил 1)


> Что происходит?


Серивлог происходит.

Серивлог лютый кал. Возьми лучше Nlog, хватит срать себе в логи.

Nlog гибок в настройке, на 3 головы выше и точно так же умеет в структурное логирование.
807 3073927
Кстати, еще вопрос - насколько всрато с точки зрения производительности хранить медиафайлы в байт массиве в связке entity-mssql? Или если перефразировать - нормально ли в принципе хранить медиафайлы в байт массивном поле или есть для этого какие-то специальные хранилища в котором выше производительность?

>>73570

>Вводи сурогаты, по которым можно произвести этот самый поиск-соритровку-фильтрацию.


Можно поподробнее примеры как это делать?

>Как-бы шифровать надо чувствительные данные: пароли, эмейлы, логины, телебоны, номера карт и т.д., что и так не должно палиться по хорошему.


Уже само собой есть.

>Опять - никто не шифрует в интернет магазине товары, нахуй. Это не то что представляет ценность. Все равно, что шифровать блоги в БД, нахуй. ЗАЧЕМ, блядь? Вот зачем? Чтобы хвастаться, что у тебя все зашифровано?


Понятное дело что если данные логически открыты для пользователей, то нахуя их шифровать в базе. Вот только у меня проект такой что в нем есть доступ только для авторизованных пользователей и у стороннего мимокрока вообще никакого доступа быть не должно как и в принципе открытых данных.
808 3074154
>>73927

> или есть для этого какие-то специальные хранилища в котором выше производительность?


Да, есть, файловая система называется
809 3074454
>>73927

> Можно поподробнее примеры как это делать?


Вот у тебя есть колонка: Любимый дилдак.
Там значения: Dragon Super XXXL, Horse Master XL, AssCracker 9000
Эти данные ты хочешь зашифровать.
Тогда, ты берешь и добавляешь сурогат FavItemFilterValue, FavItemSortValue и т.д., для которых сохраняется порядок, возможность отфильртовать и прочее.
И свои операции - ты производишь уже по этому сурогату.
Вся задача сводится к тому, чтобы написать функцию, которая будет оригинальное значение в некий хеш с нужными свойствами переводить.
Пример такого подхода есть в реализации опенвики.
810 3074559
>>74454

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


Как то так?
811 3074804
>>02293 (OP)
Шарпаны, а вызывать асинхронные методы в конструкторе (через Task.Run например, с последующим ожиданием выполнения) - это сильно зашквар?
812 3074830
Как понять что мне отвечает клопус а не редиректит на сойнет на распутной прокси?
813 3074831
>>74830
Не туда.
814 3074975
>>74804
Это даже не асинхронный метод, ты просто гадишь в тредпул. И да, в конструкторах так делать не надо, потому что пользователь не ожидаем там такой хуйни. Чисто технически все будет норм работать, но тебе нассут на ебало.
815 3074987
>>74975
Это одноразовая акция, делается только на старте приложения и пока конструктор у этого класса не отработает ни один другой сервис не сможет построиться.
Мне лень просто прописывать в классе какой-либо инициализатор, а потом заставлять все хостед сервисы сидеть и ждать когда он пробздиться. А так за меня все DI сделает.
816 3075083
>>74804
Да. Один раз сделаешь и не отмоешься
akhuyu-9.jpg46 Кб, 600x337
817 3075320
>>73858
То же говно с Newtonsoft.Json
В JsonSerializerSettings есть свойство культуры, но сериализатору и десериализатору ПОХУЮ.

>var settings = new JsonSerializerSettings() { Culture = CultureInfo.CurrentCulture };



>var myArray = new double[] { 10.4, 17.9, 100.7 };


>string jsonString = JsonConvert.SerializeObject(myArray, settings);


>Debug.WriteLine(jsonString);


результат:

>[10.4,17.9,100.7]

818 3075372
>>75320
И еще непонятно в чем отличие
CultureInfo.CurrentUICulture от CultureInfo.CurrentCulture

Если думаете, что первое как-то влияет на отображение данных в GUI, то хуй там плавал.
819 3075441
>>75320
и правильно что пох. ради тебя он не будет создавать невалидный жсон

хочешь как надо - напиши свой конвертер
820 3075447
>>75372
>>75320
Пришел к такому варианту. Если установить культуру для текущего треда, то можно отдельно для интерфейса установить текущую культура, а для всего остального инвариантную.

>Thread.CurrentThread.CurrentUICulture = CultureInfo.CurrentCulture;


>Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;


Тогда в лог будет записываться с инвариантной, ну и парситься нормально.

Еще бы сделать так, чтобы это вручную не писать в каждом проекте, чтобы это было по умолчанию.

>>75441
Да всем похуй на культуру, конечно. Логеру похуй, десериализатору похуй, а пользователю надо показывать данные в текущей культуре. Какие-то плагины вовсе отказываются работать, если у операционной системы не EN-культура.
2024-03-0616-37-49.png17 Кб, 1393x203
821 3075459
>>75447

>Thread.CurrentThread.CurrentUICulture = CultureInfo.CurrentCulture;


Не работает... Это говно не работает.
Работает пикрил.

Кто нибудь знает стандарт как надо делать правильно?
822 3075466
>>75441
А для чего CultureInfo придумали, чтобы все клали хуй?
823 3075476
В 2к25 должна быть только одна локаль.
824 3075486
>>75447
>>75459
>>75466

Короче прочитал я про CurrentUICulture, которая якобы должна влиять на пользовательский интерфейс, но по факту в WPF никак не влияет. И еще непонятно почему одни меняют так

>Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;


а другие так:

>CultureInfo.CurrentCulture = CultureInfo.InvariantCulture;

825 3075512
>>75320
Ты поехал что ли? Представление чисел в джейсоне не зависит от культуры, оно всегда одинаковое.
826 3075527
>>75512
Я им не особо пользовался.
.png89 Кб, 1232x689
827 3075716
Ситуевина.
Есть сервис(всмысле демон, винсервис), написанный на .NET. Он там своей работой занимается, выполняет ее. Примерная архитектура - прикриплейд.
В общем. Все было заебись.
Возникла охуительная идея - приделать к нему веб-морду.
И вот тут уже стало не забись.
Собственно, в чем проблема. Проблема в том, что сервис писался без всех этих ДИ и прочего. Там своя логика инициализации, самописный DI, свои логи. В общем, все самописное.

И теперь надо это как-то с ASP.Net сдружить.
И я реально не знаю как сделать правильно. Типа можно хуйнуть наружу какую-нибудь статику и через нее общаться. Но это выглядит как залупа жи с точки зрения АРХИТЕКТУРЫ.
828 3075721
Шашарпы, вы так и не ответили, почему на голом шарпе с опенгл не может получиться майнкрафта лучше того, который на яве.
1709749417543.png92 Кб, 1232x689
829 3075790
>>75716
Дизайн-паттерн "адаптер" загугли. Вдруг подойдёт?
830 3075794
>>75790
Я тоже думал об этом.
Но хотелось бы, чтобы оно было все в одной сборке и одним процессом, и постепенно как раз таким хреном отказаться от клиента.
831 3075808
>>75794
Адаптер может быть встроен и в сборку.
832 3076797
Как сделать цикл, который бы двигался в заданном направлении по триггеру?

Для примера цикл от 0 до 10

>for (int i = 0; i < 11; i++) {}



Обратный цикл от 10 до 0

>for (int i = 10; i >= 0; i--) {}



Нужен гибрид этих двух циклов
Если флаг IsReversed = false, то цикл движется от 0 до 10
Если флаг IsReversed = true, то цикл движется от 10 до 0

Что-то более элегантное чем это:

>int start = 0, end = 11;


>if(IsReversed) (start, end) = (end, start);


>int incr = IsReversed ? -1 : 1;



>for (int j = start; j != end; j+=incr) {}



Например условие 'j != end' можно перескочить и цикл станет бесконечным.
833 3076799
>>76797

>for (int i = 11; i >= 0; i--) {}


фикс
.png33 Кб, 718x495
834 3076822
>>76797
Написать иф с двумя циклами. Либо через Linq.
.png73 Кб, 808x419
835 3076844
>>76797
Я БЫ СДЕЛАЛ ТАК!
836 3076872
Можете мне объяснить вот такую ситуевину.
Почему код с первой картинки - работает медленнее и начинает кидать исключения если выполняется часто, а после - делает приложение недоступным в течении минут 10-20.
А второй, ебанутый код - работает отлично и никаких исключений не кидает и при этом эти нагрузку выдерживает.
Контекст - pgSQL,

Мне как-бы понятно, что дело в том, что насоздавались подключения, все такое. Но почему даже после того как все исключения обработались - минут 5 ни один новый запрос к базе не удается выполнить-то в первом примере кода? И как быть в таком случае?
Второй код - работает, но его проблемы очевидны, например, если какой-то люто долгий запрос к базе будет, все должны будут ждать, плюс, сам по себе - костыль и страшно смотрится.
Да, я знаю, что могу увеличить число подключений к БД, поднастроить как к базе подключаться и настройки все эти, проблема в том, что второй код - работает и работает просто неприлично хорошо.
837 3077390
хамарины адб андроид студии хуюдии.
Поясните, я просто хочу на своём ПК эмулировать андройд устройство и управлять и в C# как в селениуме.
Что мне устанавливать то нахой?
838 3077715
Можете на примере моего кода объяснить про буковку O из SOLID

Вот у меня была библиотечка простая, чтобы с TCP работать. Был класс TCPServer (https://github.com/BakaVaka/NetLib/blob/master/src/BakaVaka.TcpServerLib/TcpServer.cs)

И меня все устраивало. Сверху я там нахуевертил уже прикладной слой, все заебись, работало, никто в хуй не дул.
Внезапно, нужно оказалось поддержать UDP, и так, чтобы все что сверху нахуевертил - не сломалось.

И единственное удобное решение для меня оказалось - переписать класс TCPServer в некий NetServer который будет и UDP и TCP принимать. А для прикладного уровня все так и остается, только на уровне конфигурирования - заменить класс TCPServer на NetServer
Но ведь это прямо против того что озвучивает OCP. Но если бы я пытался наследоваться там, и делать какой-то UdpAndTcpServer : TcpServer - это же было бы просто пиздец какой говной.
А задачи изначально и не стояло, что будет какой-то там UDP. Задача стояла: вот тебе 2 дня, по TCP прими пакетик, распарсь, обработай и отдай ответ правильный.
В общем. Я прошу пояснить, как я должен был проектировать, не зная о том, что будет через год, чтобы не обосраться с буковкой O.
839 3077748
>>76872
Сто лет уже не работал с EF, но я подозреваю, что у тебя подключения не разрываются после использования, а так и висят, пока таймаут не наступит.
Вероятно в настройке DI надо более ручками прописать цикл жизни dbContext. Хотя, как я уже говорил, ничего уже не помню.
840 3077750
>>77715
Забей хуй
841 3077760
>>77748
Если про те что к БД - оно понятно что не разрываются. Как-бы суть в том, что они в обоих случаях не разрываются.
Непонятно какого хрена они не переиспользуются, даже после того как контексты задиспозились. И это какая-то специфичная проблема Postgres, потому что раньше с MSSql работал и там вообще ниче делать не надо было, все само как-то разруливалось.

Ну и да. Можно настроить автоматическое закрытие после диспоза, но это ПИИИИИИЗДЕЦ как убивает производительность. Не. ПИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИИЗДЕЦ как. Плоюс, полностью проблему не решает при высокой нагрузке, просто меньше время недоступности базы будет.
842 3078244
>>77760
Попробуй на монгу перейти.
изображение.png42 Кб, 616x261
843 3078512
Вопрос про MVVM в GUI (Avalonia) приложениях.
Ситуация такая: при запуске проги она должна создавать новую SQLite БД с таблицами, если уже существующей не найдено. Сам код для SQLite находится на уровне Model. Чтобы реализовывать такой функционал, приходится дергать код из model в пределах App.axaml.cs.
Насколько сильно такой подход противоречит сути MVVM?
844 3078519
>>78512
Авалония не может в корректную работу с СУБД. Переходи на Ето.формс. Там всё прекрасно с МВВМ.
845 3078528
>>78519
И как там сделать такой функционал не ломая MVVM?
.png50 Кб, 461x203
846 3078588
>>78512

> при запуске проги она должна создавать новую SQLite БД с таблицами


Так и дергай при запуске проги, лул.

Обычный подход это что-то в духе прикриплейд. Прям в мейне, инициализируешь, радуешься.
847 3078895
>>78512

> Чтобы реализовывать такой функционал, приходится дергать код из model в пределах App.axaml.cs.


> Насколько сильно такой подход противоречит сути MVVM?


Приложуха по своей природе является точкой входа, она в любом случае видит всех. Не понимаю, в чем у тебя проблема? Ну дёргаешь ты модель из точки входа. И чо? Как это нарушает остальную работу объектов? Они-то друг друга уже не видят, после того как точка входа отработала.
848 3078927
>>78519

>Авалония не может в корректную работу с СУБД. Переходи на Ето.формс. Там всё прекрасно с МВВМ.


Лопата плохо варит кофе - в этом выражении столько же смысла, сколько и в твоем.
849 3078937
>>78588
Охуенная тема, братан
850 3079467
Все наверное слышали за защекоинноткоин
Я за фот эти фронтенд штуки ваще не шарю.
Как делают приложения такова типа? ну что бы без перехода по страницам, в одном окне кнопочки, менюшки, всплывающие окошки.
React + что то на бекенде?
В самом этом защекоине просто отсылаются post запросы в эвентах
Хочу такое же сделать.
Что учить?
Ну простую страничку я то сделал SignalR со счётчиком, кляцаешь и +1. А как вот эти выебоны с менюшками то делать?
Блять ненавижу фронт но что делать то(
На парсерах, регерах далеко не уедешь(
851 3079469
>>78895
>>78588

Да, я позже это понял, видно слишком умными акронимами обнюхался и соображать перестал. Спасибо что подтвердили беспочвенность моих шизоопасений
852 3079484
>>79467
Или вот пример.
Я говорю в том что приложение максимально быстро работает.
Жмём кнопку мгновенно переходит по кнопке, адрес меняется, но контент сменяется очень быстро, так же как и при нажатии кнопки назад.
Метанит например грузит всю пагу долго в сравнении.
Корочи как такое делать то?
853 3079486
>>79467
Ты крайне криво выражаешь что ты хочешь.

Ну да ладно.

Если про обычный подход к SPA, то делают вот так:

У тебя веб-сервер(похуй что, хоть nginx, хоть .NET'овский какой, хоть, аппач). Его цель - отдать статичный контент
Точкой входа является index.html
В этом index.html что-то в духе:

<body>
<div id="app">loading...</div>
<script src="/js/app.js"/>
</body>

Т.е. один html документ, остальная логика по работе с фронтендом лежит в app.js, который может быть хоть ванильным JS, хоть фреймворком каким-то. Этот app.js после загрузки - подсунет в #app - содержимое приложения, все эти менюшки, карточки и прочее. Ну, собственно, будет с домом работать, делать всплывающие менюшки, плюс - наебывать браузер играясь с путем, чтобы можно было ссылки шарить и вело себя +- как классическое статичное веб-приложение.

Бек, при этом - обычно ничего про представление не знает, он работает только с апишками, принимает запросы - отдает json'ы, может быть сверху чет с веб-сокетами.

Собственно. Так и делается.
Простейший путь для .NET'чика - взять ангуляр + .NET и сделать по гайду.
854 3079489
>>79486

>Ты крайне криво выражаешь что ты хочешь.


Ну да я не шарю вот за эти штуки
До недавнего времени я генерил тоннами html страницы и засирал ими просторы интернета, но видимо пришло время изучать фронтенд ебучий
855 3079566
Ребята, вот тут без шуток очень интимный вопрос.
Где вы исполняете код во время разработки? Я имею ввиду, нужно проверить работоспособность какого-то участка кода и при этом не срать в Program.cs.
856 3079568
>>79566
Отдельный проект из пары файлов.
857 3079570
>>79568
Можно сделать как-то чтобы на него ссылка в решении не добавлялась?
.png29 Кб, 529x246
858 3079709
859 3079760
>>79486

>Простейший путь для .NET'чика - взять ангуляр + .NET и сделать по гайду.


Еще как вариант - блазор
860 3079766
>>79566

>Я имею ввиду, нужно проверить работоспособность какого-то участка кода и при этом не срать в Program.cs.


Приведи пример
861 3079822
>>79766
Ну вот мне надо прототип фичи какой-то реализовать используя уже написанные классы и ресурсы остального проекта, или проверить как дотнет себя в той или иной ситуации ведёт.

>>79568
Я так уже делаю, но хотелось бы без пустого проекта в решении.
862 3079839
>>79822
ТЕСТЫ, МАТЬ ТВОЮ, ДЛЯ КОГО ПРИДУМАЛИ?
Я вот срсли не понимаю, какого хуя все так тесты не хотят писать. Ты его написал. Зафиксировал поведение. Кайф. Если начнешь рефакторить и чет наебнешь - хуяк, тесты красные, пиздец, сразу идешь и чинишь.
Опять же - у тебя под боком все лежит, кайфуй, пользуйся.
При этом - тесты ты можешь встроить в CI. Какой-то хуйлан прислал ПР на 500к строк, тесты упали, ты даже не смотря эту хуйню шлешь хуйлана переделывать.
Короче. Единственно верный ответ - нормальный проект с тестами. Бери. Пользуйся.

А прототип своей фичи сразу делаешь там где он должен будет быть, и проверяешь его как раз своими тестами. Можешь тесты писать до написания фичи, можешь после.
863 3079908
>>79839
Нихуя, спасибо)
864 3079938
>>79839

>Я вот срсли не понимаю, какого хуя все так тесты не хотят писать.


Потому, что на написание нормальных тестов тоже нужно время, а его обычно никто не выделяет (как и на написание документации)
865 3079940
>>79822

>Ну вот мне надо прототип фичи какой-то реализовать используя уже написанные классы и ресурсы остального проекта, или проверить как дотнет себя в той или иной ситуации ведёт.


Так а в чем проблема? Создаешь отдельный класс(ы) в отдельном файле(ах), фигачишь туда нужную тебе логику и используешь. Потом удаляешь когда надоест.
866 3080152
>>79938
1. Ты в любом случае отлаживаешь. Вот часть этого времени - можешь на тесты переложить. В долгосрочной перспективе - это окупится в любом случае.
2. Чел все равно хочет тестировать, но сейчас для тестов пользуется костылями, так пусть пользуется инструментами, которые лучше для этого подходят.

Опять же, мой личный опыт показывает, что если нормально аргументировать, руководство таки согласно выделять время на тесты, но почему-то уже разработчики - не хотят их писать.
867 3080665
Почему в wpf у списков есть событие selectionchanged, но нет события selectionchanging, где можно было бы например отменить выбор.
868 3080763
>>80665
ну вот удаляешь ты элемент текущий (а то и вообще список чистишь) и selected автоматически меняется, а ты бац и отменяешь....и где теперь твой бог?
869 3080799
>>80763
Бог сделает так, чтобы в итоге не было выбрано ни одного элемента.
image.png59 Кб, 631x342
жидкуери и ажакс в представлении asp.net core 870 3081103
Приветики, столкнулся с проблемой: необходимо отправлять значение из PartialView в HttpPost метод в контроллере и делать это без обновления всего представления. Кое-как написал скрипт jQuery ajax для отправки id продукта и количества продукта в метод(работаю со всем этим впервые).
Проблема в том, что данные в метод не отправляются. Описал свою проблему на stackoverflow, там скинули код, который у них работает, но у меня все также – метод не принимает никаких значений. Вообщем хз че делать, есть подозрения что с библиотеками что-то не так(хотя для тестирования скрипта, предоставленного в SO, подключал уже ссылку на ajax). Может кто-то знает, как это решить, буду благодарен)
871 3081152
>>79566
Прототипы очень удобно писать в linqpad. Единственный минус — надо премиум версию, чтобы работал автокомплит и нугет.
872 3081166
>>81103
upd: решил проблему
873 3081213
>>81103
А как вы, в ваших асп.нетах используете компоненты?
просто создаете свой view component и прокидываете ему параметры из контроллера среди прочих данных?
874 3082437
>>79566
>>81152
Сосачую линкпад.
Пробей себе лицензию, потому что в бесплатной версии нет интеллисенса.
875 3082444
>>81213
Это просто View называется.
В контроллерах есть специальный метод View() с кучей перегрузок, в большинстве он принимает объект, который называется модель. Соответственно в методе-обработчике запроса в конце ты просто пишешь View(myOxuennbI
С другой стороны, в соответствующем шаблоне *.cshtml вверху пишется @Model <тип модели>, чтобы движок мог давать подсказки и помечать ошибки.
Дополнительно к этому есть словарь (хэшмэп, но не настоящий, не бросает исключения если ключ не найден, например) ViewData и динамический объект ViewBag (второй появился позже и, видимо, для выпендрёжа), их тоже можно заполнить в контроллере, а потом использовать в представлении.
876 3082494
>>82444
нет. я именно про View components, которые этакие виджеты/контролы в асп.нет, чуть мощнее partial view

В пхп есть замечательный фреймворк Nette, который отходит от принципов навязанных MVC и вводит компонентную модель - то есть ты заводишь компоненты, в контроллерах их достаешь, изменяешь их состояние, а потом в виде компонент с текущим состоянием сам себя рисует.
Более того, компоненты там вклиниваются в процесс запроса, то есть компонент сам может доставать и прокидывать через запрос нужные ему persistent параметры
Также есть сигналы - сделать запрос компоненту только, а не всему пайплайну контроллеров
Также может рисовать себя частично

В асп.нет же, как я вижу, View components - просто partial views со своим code-behind и все. В запросе не учавствует, параметры ему в контроллере собирай (и сам их считай) и дотаскивай вместе со всеми. Ну примитив какой то.

Ну ладно пользуясь тем, что там DI и скоуп рождается на запрос...можно навернуть костыль чтобы к компоненту можно было обратиться из контроллера и изменить его состояние, а он себя отрисует.
Но все равно как то уныло.
877 3082511
>>75721
Может конечно. Слишком много денег и времени на это нужно чтоб его с ссаной явы переписать
878 3083079
Как создавать иерархию вью моделей для обычных моделей? Вот есть у нас модель книги, она содержит модель страницы, а страница в свою очередь модели абзацев. Как это перенести во вью модели сохранив иерархию и добавив возможность все это дело редактировать?
879 3083221
>>83079
да как хочешь
никто не ограничивает никак.
можешь какую угодно иерархию - раз
можешь оборачивать модели - два
а можешь не оборачивать, а копировать во вьюмодели данные, а потом обратно - три
но не можешь разгадать гребанную новую капчу с двача - ноль
.png38 Кб, 784x548
880 3083655
Помогите придумать как сделать нормально.

Собственно. Ситуация.
Есть сущность, к которой надо биндить объект. Условно, сессия.
Объект, который биндится, после диспоза - должен освободить эту условную сессию.
НО, в системе может возникнуть другой объект, к которому надо прибиндить эту сессию. Тогда я насильно диспозю первый объект и перебиндиваю.
Проблема. Если в это время шла работа какая-то через эту сессию с тем объектом, все может внезапно накрыться пиздой.

Как хотелось бы? Хотелось бы, чтобы если перебиндили - как-то подменялся объект на новый. Но как это сделать по человечески - я не могу придумать.
881 3083700
>>83655
Ознакомься с референсными объектами, на основе подсчёта ссылок.
https://learn.microsoft.com/en-us/windows/win32/com/managing-object-lifetimes-through-reference-counting
882 3083733
>>83655
Ты хочешь диспозить объект в рэндомный момент.
Не делай этого. Чудес не бывает. Меняй подход

Например, у жетбраинс с их лайфтаймах эту проблему решают возможностью запретить терминацию лайфтайма на время какой то операции.

С просто диспосабле тебе нужно токен занятости и при вызове диспоз просто планировать его. Когда его все отпустят токе тогда и делать запланированный диспоз
883 3083803
>>83733
>>83700
Окей. Надо наверное немного контекста.

Сессия - не просто так.
Есть клиенты на хреновом канале связи, который периодически может отваливаться. На моей стороне - я не могу задетектить отвал мгновенно(потому что закрывается он с большой задержкой, которая не от меня зависит). Но клиенты - долбят часто и таким образом - сами переподключаются.
Собственно, с этими клиентами хочет связываться уже другое ПО. И для него - все должно быть как-бы прозрачно, будто НЕ ЕДИНОГО РАЗРЫВА.
И вот для этого - придумал вот такой класс как "сессия", которая держит текущее подключение. Если клиент переподключится - я хочу просто заменить соединение на актуальное чтобы со стороны выглядело, будто разрыва не было, просто была задержка. Задержки - ок.
884 3084099
Как в блейзоре веб асембле запустить асинхронный цикл?
Ну например что бы он что то проверял в цикле и если шо отправлял запррос на сервер.
886 3086555
Можете как-то это объяснить?
887 3086560
>>86555
Проследуй в загончик. https://2ch.hk/pr/res/2973076.html (М) Там тебе пояснят
image.png527 Кб, 3840x2282
888 3086574
>>86555
Хз. У меня вполне бодро работает. Профилировщик в студии только сразу на 20% срезает производительность.
889 3086629
>>86555

>.net 6.0


>>86574

>.net 8.0

890 3086816
>>86629
И хули ты ебало скрючил?
891 3086822
>>86816
- дедушка, а правду говорят, что жависты ебобо?
- правда, внучек, правда
892 3087123
>>86629
Я проверял на 8.0, там точно такая же ситуация, как приду домой могу скриншот кинуть.
2024-03-1515-52-58.png34 Кб, 900x525
893 3087148
Кто нибудь делал vsct расширения для студии? Как сделать вот такой выпадающий итем? У меня получаются только обычные кнопки.
894 3087542
Корочи шарпачи смотрите.
Сделал я Blazor WebAssembly приложение.
Просто для теста. Так же в приложение добавил телеграм бота который просто в ответ на сообщение отвечает ссылку на моё приложение.
Дак вот как я думал оно будет работать:
Само приложение будет крутится в запущённом виде на сервере. Ну собственно как оно крутится в дебаге.
Сама страничка приложения будет обрабатывается на клиенте и не трогать сервер. Пользователь будет жать на кнопки и будет рад.
А на сервере будет крутится Bot.StartAsync(); для работы бота.
Но оно мне скомпилила все в ВАСМ и теперь бот хостится на клиенте. То есть если кто то зашёл в приложение то бот начинает работать.

А мне надо что бы бот работал на сервере а пользователь работал только с ВАСМ приложением, приложения изредка отправляет запросы на сервер для синхронизации. И то когда я в кода приложения определю когда отправлять запрос.
Это мне получается Блейзер Гибрид нужен? Точно не Сервер так как мне не надо держать всегда подключение открытым через СигналР.
896 3087616
>>87615
Блин. Второй тест - проебался с выводом, но там через рекурсию.
897 3087617
>>87615
Тебе нужно жениться
.jpg673 Кб, 1628x1712
898 3087630
>>87617
Я знаю...
binarytreeincomplete[1].png207 Кб, 2138x1968
899 3087647
>>87615
Блин, чем ты занят?
Одно дело повторить дебильный код, который тестирует производительность вызова методов.
Совсем другое просто так писать ещё один дебильный код который тестирует непонятно что.

Бинарное дерево хранится в виде массива значений. Время генерации — время создания массива. Наносекунды.
900 3087652
>>87542
Hybrid — это про то, что у тебя до того, как скачался wasm, оно работает в режиме Server, а потом в режимe Client.
К твоей задаче это никакого отношения не имеет.
901 3087657
>>87652
Hybrid это для запуска вне браузера, то о чём идёт речь это дефолтное приложение с режимом рендеринга Auto.

https://learn.microsoft.com/en-us/aspnet/core/blazor/components/render-modes?view=aspnetcore-8.0

Это то что ему как раз надо, можно всё приложение сделать как WASM компонент и оно будет крутится в браузере автономно.
902 3087667
>>87647
Ну. Смотри. На мои вопросы не отвечают. На работе - главный затрахал. Коллеги - постоянно ругают мой код, дескать он непонятный.
Че мне делать остается, кроме как в пятницу вечером фигней страдать на бордах?


А тестирует тот код мою память по вузовской программе, :p.
903 3087669
>>87657
>>87657
Но мне ведь не всё приложение надо что бы работало на клиенте.
А только часть, и при необходимости подгружала и загружала данные с сервера.
904 3087675
>>87669
Если ты про то чтобы апи крутилось на сервере, а фронтенд в WASM то тут всё так и будет, создай дефолтный проект Blazor и заметишь что у тебя в решении два проекта, один из них это Client.
905 3087681
>>87675
Бля точно, пздц они перемудрили с названиями
906 3087686
>>87681
Ну это в традициях майков, если чё по блазору надо то спрашивай.
907 3087700
>>87686
Спасибо и сразу спрошу)
Какая логика у таких приложений?
Вот мне нужно при запуске приложения / запросить данные с сервера.
В WASM я бы запросил из через апи обратившись к контролеру.
А как тут это сделать?
Создать компонент в серверной части с нужным мне кодом? Ну там с обращением в бд и всё такое и встроить его в приложение?
image.png24 Кб, 662x101
908 3087705
>>87700
Твой первый проект это серверное приложение, тот что с .Client это ассембли которое собирается в WASM и запускается в браузере в зависимости от рендермода компонентов(смотри документацию).

Если для тебя допускается подождать пока загрузится и закэшируется рантайм дотнета в браузере то можешь сделать что-то типо такого в App.razor(пик1). Это явно разделит твой клиентский и серверный код на два рантайма, в ином случае смотри документацию по Interactive Auto рендермоду.

Данные передаешь по HttpClient.PostAsJsonAsync в апишные контроллеры или по SignalR.

Могу тебе посоветовать годный канал по этой теме, в ютубе "IAmTimCorey Blazor Auto"
909 3087711
>>87705

>Данные передаешь по HttpClient.PostAsJsonAsync в апишные контроллеры или по SignalR


Тогда зачем это всё? В чём разница этого приложения и простого WASM блейзор +webapi приложения?

Мне по сути нужно изредка отправлять запросы. Большая часть данных на странице рендерится у клиента и только некоторые данные на ней получаются с сервера.
При использовании SignalR вообще весь смысл теряется, так как WASM нужен был для экономии ресурсов сервера и что бы не держать подключения открытыми.
910 3087722
>>87711

>Тогда зачем это всё? В чём разница этого приложения и простого WASM блейзор +webapi приложения?



Смысл в разных рендермодах, в частности Auto который делает для клиента бесшовное переключение с серверного рендера на WASM когда рантайм передан. Ну а ещё удобно то что по дефолту в одном решении. Универсального транспорта, который бы абстрагировался от текущего рантайма, пока что не завезли.
911 3087743
>>87722
>в частности Auto который делает для клиента бесшовное переключение с серверного рендера на WASM когда рантайм передан
Это в каком смысле?
Типо клиент первый раз зашёл на сайт и пока ему передается WASM сайт работает с сервера а когда передался то переключается на WASM ? Ну дак это же только 1 раз то будет.

Я думал будет как то так: Заходит клиент на сайт грузит всё приложение с логикой. Потом к примеру находит на /game там WASM приложение делает запрос к апи получает инфу и строит страницу.
То есть при посещении страницы WASM клиент получает инфу и уже на ней строит страницу.
Только что будет когда я поменяю логику в WASM ? Её перезагрузит сразу?
912 3087758
>>87647

> Одно дело повторить дебильный код, который тестирует производительность вызова методов.


Почему на одном языке дебильный код, тестирующий производительность вызова методов, выполняется в 10 раз дольше, чем на другом — нормальном — языке?
913 3087779
Вот снова про Блейзор
Приложение на хостинге.
Запрашиваю своё ип со сторонего сайта.
@rendermode RenderMode.InteractiveWebAssembly -- получаю свой ПИ адрес
@rendermode RenderMode.InteractiveServer -- получаю ИП адрес сервера.

@rendermode RenderMode.InteractiveAuto -- получаю ИП адрес сервера. И вот тут как то не логично. Правильно ли я понял если связь сервером нарушится то я получу ип адрес клиента? Или как это работает?

Далее вот еще у меня есть эндпоинт
app.MapGet("/time", () => DateTime.Now.ToShortTimeString());

Я делаю запрос на него.
@rendermode RenderMode.InteractiveWebAssembly - в браузере виден запрос на https://localhost:7039/time всё ок.
@rendermode RenderMode.InteractiveServer - Вылетает эксепшен.System.NullReferenceException: "Object reference not set to an instance of an object." Я так понял что он не знает по какому адресу обращатmся. Но как по мне тоже не логично, он ведь должен знать что есть локальный эндпоинт /time

Также вот еще
builder.Services.AddScoped(sp =>
new HttpClient
{
BaseAddress = new Uri("https://localhost:7039/")
});
Тут для разработки локалхост. А можно как то установить текущий адрес моего сайта? ну к примеру сайт на домене zalypa.com и что бы атвоматом ставило? Мне и ручками не в падлу прописать но всё же
914 3087780
>>87779
>>87779
@rendermode RenderMode.InteractiveAuto -- получаю ИП адрес сервера

НО иногда я получаю ип адрес клиента.
915 3087783
>>87780
Отчего это зависит то?
916 3087883
>>87780
>>87779

При рендере страницы проверяется наличие рантайма, если тот есть то компонент рендерится в режиме WASM. Новые компоненты проверяют, в каком режиме работают уже существующие компоненты на странице и по ним выбирают себе рендермод. Для того чтобы гарантированно переключился рендермод страницу следует полностью перезагрузить.

По дефолту включен пререндер. С ним у тебя при рендере компонента он сначала рендерится на сервере.
https://learn.microsoft.com/en-us/aspnet/core/blazor/components/prerender?view=aspnetcore-8.0

@rendermode @(new InteractiveAutoRenderMode(prerender: false))
Чтобы выключить.

Инжекти NavigationManager для того чтобы работать с адресами.
https://learn.microsoft.com/en-us/aspnet/core/blazor/fundamentals/routing?view=aspnetcore-8.0
917 3087923
Xunit. Нужно сохранить имя тесткейсов. Сделал класс обёртку, чтобы не потерять имя, так как в доке написано, что Xunit смотрит на ToString().
Но по итогу, в обозревателе они остались слипшиеся (Test3), но в логе имена прекрасно отображаются.
Как сделать, чтобы тесткейсы разделялись в обозрвевателе тестов? (как на пике 1)

https://pastebin.com/Tm1iyiL2
918 3088502
Хм.

Не прошу решения. Но прошу направить мысль.
Допустим. У меня есть 100к подключений. Долгоживущих, все дела.
Я хочу подключиться к 10к из них и "пообщаться".

Наивная реализация дает крайне хуевую производительность.
Т.е. как я сделал:
Тот кто хочет общаться - говорит, мне кому отправить сообщение. Я беру, проверяю в словаре, если есть такой - передаю ему, если прилетит ответ - отправляю первому. И так в цикле.
И на большом кол-ве это чет хеувастенько работает.

Я правда не пойму что хуевастенько работает. Типа если верить профилировщику, 89% времени работы приложения выполняется некий GetNext() и какие-то вуду-штуки с AsyncMethodBuilder'ами.
919 3088531
>>88502
Объясню сразу в чем хуевастенькость.

Такое ощущение, что часть из вот тех общателей 10к вообще не обрабатываются.
Я вижу какую картину. Вот 100к подключений я с помощью докера и прочих изъебств намутил к своему серверу. Они стам сидят-пердят, ниче полезного не делают.
Вот, я беру, хуячу 10к других челов. Выбираю рандомно из 100к 10к тех с кем общаться и кто не занят.
Ок.
И где-то процнтов 30 +- нормально начинают обмениваться пакетами. А остальные - висят и будто до них вообще не доходит очередь.Ну. Т.е. они подключились, ок-да. Отправили пакет. Даже первый ответ получили. Отправили следующий и ждут. Ждут. Ждут.

Думаю о том, что надо имплементировать свой эвент-луп и свой тредпул, и обходить самому тех кто подключился.
.png98 Кб, 574x664
920 3088787
C++ тред похоже мертв. Спрошу тут.

В общем. Я нубан.
Работаю шарпером на заводе.
Вот, недавно подпустили к проекту, на котором матерые C++'еры работали, но на шарпе.

Увидел там нечто похожее на прикриплейд.
Можете объяснить, нахуя и зачем так делать?
921 3088880
>>88787

> C++ тред похоже мертв. Спрошу тут.


Ты конечно молодец, спросил в предыдущем плюсотреде, из которого все перекатились в новый ещё два месяца назад.
922 3088884
>>88880
Та как узнать-то?
Вот на доброчане, царствие ему небесное, ссылку всегда оставляли на новый тред.
923 3088906
>>88884
ОП хуй неправильно перекатил, не вставил тему в название треда
924 3088960
>>88787

>Можете объяснить, нахуя и зачем так делать?


1 вариант - там что-то критичное, что без этого не работает никак или работает в разы хуже. Возможно дергают какую-то нативную библиотеку, которая очень древняя и никто уже не может/хочет её переписать и т.д. В моей практике такое было при работе с ЭЦП и криптопровайдерами, там без вариантов.
2 вариант - ретроградные байтоебы, привыкшие на всем экономить и считающие, что позволять компилятору и CLR самой заниматься менеджментом памяти - не тру.
925 3089456
Можно ли в шарпе "заинклудить" библиотеку внутрь библиотеки?
Что я имею ввиду.
Вот у меня есть библоитека myLib.dll. Она использует Newtonsoft.Json. Я хочу чтобы Newtonsoft.Json.dll была включена ВНУТРЬ библиотеки myLib.dll, в идеале, чтобы при использовании моей библиотеки - никто даже не знал про этот Newtonsoft.Json.dll
Можно ли такое намутить?
926 3089460
>>89456
Наверное криво объяснил.
Короче. После билда библиотеки - я получаю 2 файлика в выходной папке: myLib.dll и Newtonsoft.Json.dll. Я хочу чтобы на выходе - был один файлик. myLib.dll
927 3089476
>>89456

>Newtonsoft.Json.dll


Не по теме, но зачем?
928 3089505
>>89476
Им удобно пользоваться и он выдает более предсказуемый результат и реже надо свои обработчики писать.
929 3089541
930 3089561
>>89456
Клонируешь себе исходники ньютонсфта и вкорячиваешь их в проект с myLib с правкой неймспейсов.
Вопрос только нахуя так делать (скрывать наличие библиотеки) ?
931 3089575
>>89561

> Вопрос только нахуя так делать



Ну. Я вот начитался гайдов. И решил сделать себе ПЛАГИННУЮ АРХИТЕКТУРУ с горячей перезагрузкой.
Собственно. И мне не нравится, что если у плагина - зависимости, то надо их руками подгружать руками постоянно. Я хотел бы, чтобы плагин был максимально самостоятельным. Одна dll положенная в нужную папочку и все. А сейчас - приходится при "установке" плагина - еще и разруливать все его зависимости, либо складывать их к основному приложению, что сам подход с: просто закинть одну dll в нужную папочку - делает ебаным и тогда уже можно забить на эти плагины и делать как обычно.

В случае если плагин без зависимостей - там на самом деле круто выходит. Чет дописал в плагине, собрал только плагин, оно перезагрузило плагин и все ок работает без необходимости останавливать и пересобирать все это дело. Но вот если пара зависимостей - уже ебано.
932 3089685
>>89575
1. Ты похоже пытаешься сделать слишком комплексные плагины.
2. Если ты изначально подразумеваешь, что тебе нужен будет функционал ньютонсофта, то подключи его в основной проект и не парься.
3. В большинстве продакшена от ньютонсофта стараются отказываться в пользу System.Text. Да он может быть не так удобен, в нем может не быть некоторых фишек из ньютона, но он потихоньку становится новым стандартом и через несколько лет ты ньютон мало где уже встретишь.
933 3089724
В связи с последними санкциями, майки не ебнут про простым русским программистам? Не пидорнут с нугета, не начнут болочить апдейты вижлы? Или это только для компаний? пока
934 3089735
>>89685

> Ты похоже пытаешься сделать слишком комплексные плагины


Ну. Да. А так нельзя делать разве?
У меня как-бы основное приложение это демон. Сидит в системе и не особо заметно, работает в фоне.
А все остальное - я хотел делать через плагины.
Пару плагинов тестовых - таки написал, но они как раз были маленькие, чтобы просто проверить как это работает. Сбор статистики работы там, вот это вот.
Собирался сделать плагин для "визуализации", который бы позволял при желании - еще окошко рисовать и в трее иконку и какое-то управление. Плюс - плагин, для работы со всем этим делом через веб-апи, чтобы опять же, при желании - можно было через браузер поуправлять демоном и посмотреть че там происходит.
И я даже сделал первый крупный. Но мне не нравится, что приходится руками зависимости все эти рулить. Плюс, я в этом деле новичок и боюсь, что вдруг там какие-то конфликты будут, чи шо. Вот как .NET будет вести себя. если я загружу две Assembly разных версий? Он это поймет или нет?
935 3089820
>>89724
Уходи.
936 3089861
>>89820
Из рф? На жаву? Давай более развернуто
937 3090031
>>89861
на завод уходи
какая тебе жава. там IDEA которую делает жетбраинсы, которые русских послали.
так что на завод. будешь там дворником
938 3090092
>>90031
сторожем
939 3090169
>>88531
во-первых, а как ты тестируешь 100к подключений? как ты подключаешь?
во-вторых, 100к на докере - не дохуя ли? Не так давно была проблема 10к на целых серверах, а ты уже 100к на каком-то докере
в-третьих, эти 100к не сидят-пердят, ядро вообще-то ебенит не в себя, обрабатывая пакеты
в-четвертых, возможно у ядра есть ограничения на создание соединений
в-пятых, очень мало данных: может у тебя цп не успевает, может памяти не хватает и в своп уходит?
940 3090260
Всем сап!
Понадобилась помощь антонов двач выручай.
Я сам по себе далёк от программирования, тем более на сишарп, но по работе потребовалось выполнить передачу данных на прибор по UDP-протоколу. Китайские друзья предоставили код на сишарпе для выполнения этого действия, но я совершенно не понимаю, как мне запускать этот код и как им пользоваться.
Реквестирую подробный гайд как создать проект, добавить туда файл с этим кодом и запустить его используя Visual Studio Code.
941 3090267
>>90260
Ютуб завален видосиками по созданию проектов на шарпе в vscode, посмотри любой из них и дописывай в Program.cs что угодно.
942 3090294
>>89735

>Плюс - плагин, для работы со всем этим делом через веб-апи, чтобы опять же, при желании - можно было через браузер поуправлять демоном и посмотреть че там происходит.


Я х.з. как с этим сейчас, но в Core3.1 точно были проблемы с созданием новых API из подгружаемых сборок.

>Собирался сделать плагин для "визуализации", который бы позволял при желании - еще окошко рисовать и в трее иконку и какое-то управление.


Я не десктопщик, но вот есть у меня подозрение, что с этим ты прям соснешь-соснешь. Как минимум будет ебля с контекстом синхронизации и UI-потоком. Под это дело проще какой-то дополнительный клиент запускать, чем плагинами мутить.
943 3090300
>>89724
Ты лучше бойся, что все это заблочат с этой стороны ебанутые РКН-щики. Это как раз более вероятно.
vopross.png8 Кб, 397x207
944 3091362
>>02293 (OP)
Ребята, у меня вопрос.
Не смейтесь, я литерали даун, нужна помощь в элементарной математической программе. Надо чтобы в консоль бесконечно и последовательно печатались числа фиббоначи. Сижу уже час, мой код не делает то что нужно и я где-то на подсознательном уровне понимаю что мой код и не должен работать, но я слишком тупой чтобы написать правильный. Что я должен в нём изменить чтобы всё работало?
.png30 Кб, 434x224
945 3091474
>>91362
С тебя сто тыщ миллионов денег.
946 3091677
>>91474
Что это блять за цикл?
947 3091711
Пипец. WPF не умеет в скрытие приложения в notification area — то, что у нас называют треем. Чертовы майкрософт.

Везде предлагают использовать библиотеку Widows.Forms, но как ее юзать, если у меня .NET, который Core?
948 3091774
>>91711
Во первых винформс тыщу лет работает на core
Во вторых ты где то не там гуглишь. Решению для wpf миллион лет и оно переехало на core
949 3091823
>>91711

>WPF не умеет в скрытие приложения в notification area


Always has been
950 3091824
>>91474
в iter зачем?
951 3092165
>>91824
убери и увидишь
952 3092216
>>92165
Ты меня на слабо что-ли взять пытаешься? Думаешь я не уберу?
953 3092224
>>92216
Убери, чё как чушпан? Убирай, давай!
954 3092231
>>91474
Это был хороший цикл, может быть даже лучший, который у меня был.
1710850940580.png22 Кб, 661x182
955 3092250
>>91474
Охуенный код в стиле "наеби соседа", от себя я бы добавил, чисто для удобства дебага перед сборкой бинарника и отправкой соседу, пикрелейтед:
956 3092253
>>91677

> Что это блять за цикл?


Это:
>>91362

> нужна помощь в элементарной математической программе. Надо чтобы в консоль бесконечно и последовательно печатались числа фиббоначи

1710851687585.png26 Кб, 589x233
957 3092274
>>92250
... но если всё таки, вдруг, код нужен не соседу, а преподу в вузеке, то надо добавить что-то типа этого:
958 3092419
Шарпачи, вопрос по Блейзор и ЖС
Жпт чат говорит что бы мне взаимодействовать с ЖС библиотекой её нужно загрузить.
Мне нужно взаимодействовать с библиотекой
https://telegram.org/js/telegram-web-app.js
Её вроде как нельзя грузить себе, она должна загружаться с ТГ сервера.
Например хочу выполнить функцию close() что бы закрыть мини апку. В самом ЖС я бы сделал вроде как вот так window.Telegram.WebApp.close() и моё приложение закрылось бы, а как мне это всё скрестить с Блазером?
Помогите плиз с 1 примером.
image.png39 Кб, 791x374
959 3092422
960 3092449
>>92274
Так у тебя в переменных обычный int будет и ты очень быстро получишь переполнение.
962 3092506
>>92449

> и ты очень быстро получишь переполнение


Учитывая, что каждое следующее число после чтения инпута, то не очень быстро. Даже если положить книжку на клавиатуру.

...Но это не важно, ведь в условии задачи, сформулированной аноном, не говорится ничего о том, что в решении задачи нужно что-то предпринимать против переполнения.
963 3092509
>>92506

> не очень быстро. Даже если положить книжку на клавиатуру.


Ладно, я проверил и я спиздел. Всё равно быстро.
964 3092523
Как бороться с этой штукой? Достала.
В какой-то момент перестает видеть связь между xaml и кодбихайндом. Подсвечивает ошибку InitializeComponent и любые попытки обратиться к компоненту xaml по имени.

Пытался чистить .vc, не помогало. Только после чистки obj сработало.
965 3092539
>>91774

>Во первых винформс тыщу лет работает на core


У меня конфликт с моим проектом. Пикрил. Мой проект на net 8, а либа Windows.Forms подписана как Framework.

>>91823
Встроенного решения не нашел. Предлагают сторонние библиотеки, но я не хочу ради этой мелочи добавлять.
966 3092544
>>92523

> Как бороться с этой штукой


> Только после чистки obj сработало.


Сам же ответил. Чистить обдж, чистить вилкой. Для удобства можешь через dotnet clear
967 3092559
>>92539

> Встроенного решения не нашел. Предлагают сторонние библиотеки, но я не хочу ради этой мелочи добавлять.


Вот же пишут по первой же ссылке из гугла

>NotifyIcon is not implemented in WPF as it is in Forms, but you can still use the Windows Form NotifyIcon, it resides in the System.Windows.Forms namspace.


Ты можешь использовать иконку из формсов в ВПФ-приложении. И это не стороннее решение. Всё встроено в дотнет искаропки.
968 3092566
>>92559

>Always has been


@

>NotifyIcon is not implemented in WPF



>Ты можешь использовать иконку из формсов в ВПФ-приложении.


Не могу, я прикрепил скриншот. У меня NET8, а библиотека Windows.Forms на Framework.
969 3092582
>>92566

> а библиотека Windows.Forms на Framework.


Значит у тебя что-то недоустановлено.
Попробуй в отдельной папке создать новое приложение винформс, увидишь, оно у тебя создастся как нет8.
970 3092594
>>92566
Вот пожалуйста, всё создаётся и запускается на восьмёрке.
2024-03-1918-15-35.png6 Кб, 371x258
971 3092598
>>92582
Да, вижу. Но как объединять платформы?
Через добавление референсов доступна библиотека только на Framework, а она не совместима.

Платформы объединять я не знаю как.
972 3092612
>>92598
Щас погодь, я попробую воспроизвести у себя. Если я правильно понял, мне нужно:
1. Создать ВПФ приложение.
2. Попытаться подключить класс NotifyIcon из формсов.
3. Выскочит ошибка и ничего не получится.

Всё верно?
973 3092619
>>92598
>>92594
Нашел как
https://stackoverflow.com/questions/72058558/how-can-i-add-system-windows-forms-to-wpf-application-when-adding-via-reference

- Removed reference/dependancy entirely
- Right-click project, Unload
- Right-click project, Edit project file
- Add the following:
<PropertyGroup>
<TargetFramework>net6.0-windows</TargetFramework>
<UseWPF>true</UseWPF>
<UseWindowsForms>true</UseWindowsForms>
</PropertyGroup>
- Reload project file
- Add "using system.windows.forms" to the top.
974 3092636
>>92612
Да, я нашел как >>92619
Короче надо выгрузить проект, добавить в свойства проекта

> <UseWindowsForms>true</UseWindowsForms>



Потом снова загрузить проект, и тогда будет доступна библиотека

> using System.Windows.Forms;



Единственное, что выскочит неоднозначность некоторых элементов, типа Application. Пришлось писать так

> public partial class App : System.Windows.Application{}



Библиотека System.Windows.Forms загружается по умолчанию во все документы.
1710862436381.png75 Кб, 679x616
975 3092642
>>92619
Лол, я литералли сделал то же самое и уже собирался показывать результаты. Единственный нюанс. Блять, и это уже опередили.
2024-03-1918-34-27.png18 Кб, 513x204
976 3092650
>>92642
А есть вариант как глобал юзинги отредактировать? Я знаю про отключение полностью, но мне кажется, что тут надо просто исключить строку с винформсами.
977 3092655
>>92636
Чтобы не ебаться с неоднозначностью сделай солюшен из двух проектов, один - либа нет8(!) на винформсах, в которой всё подключено и реализован твой трей, а второй проект - твоя приложуха на ВПФ, в csproj запихиваешь ссылку на либу и всё будет собираться одним заходом.
978 3092656
>>92650
Есть, но сейчас тебе это не нужно.
Никакие отключения тебе не помогут. просто логически раздели решение на два проекта: >>92655
979 3092657
>>92642
>>92650
Нашел.

<ItemGroup>
<Using Remove="System.Windows.Forms"/>
</ItemGroup>

>>92655
Хорошая идея.
980 3092661
>>92657

> Нашел.


> Using Remove


Опасная хуйня, нирикаминдую.
981 3092667
>>92612
2 взять готовую либу типа
https://github.com/hardcodet/wpf-notifyicon
или эту не пробовал
https://github.com/nullsoftware/TrayIcon

а не заниматься херней
982 3092681
>>92667
Да не хочу я для такой мелочи либу качать. Мне не нужны какие-то сложные нотификации со вплывающими сообщениями или динамическими иконками.
983 3092688
>>92681
Двачую.
984 3092691
>>92667

> а не заниматься херней


Это не херня.
Анон вручную напишет реализацию простой иконки и разберётся, как это работает. И прокачает скилл.
985 3092714
>>92691
зачем? вот я не знаю и не вижу смысла знать как она делается в этих формсах, когда формсы давно забыты мной и нахрен не нужны.
986 3092763
>>92714

> формсы давно забыты мной


Но они не забыты майками и регулярно обновляются, допиливаются, обогащаются фичами. Почему-то у майков они не легаси и не депрекатед. Например, туда завезли МВВМ. Так что, это всё твоё субъективное мнение.

> и нахрен не нужны


Тебе. Не забывай добавлять это слово, манипулятор мамкин. Они не нужны тебе. Говори за себя, а не за всех.
987 3092767
>>91474
>>92250
>>92274
Пасиба за помощь пацаны, как стану миллионером, сто тыщ денег каждому занесу
988 3092774
>>92767
Тебе спасибо. Благодаря тебе, вот этот анон >>91474 напомнил мне, насколько гибок сишный for. Там такие циклы можно пилить, что охуеть просто!
989 3092784
>>92763
так они и винапи допиливают. пиши на голом винами, чего уж там.
тот, кто озаботился вопросом иконки в трее пишет на WPF, так что ему от поддержковости винформсов ни холодно ни жарко.

да они многим не нужны. зачем писать на том, что тебя ограничивает. MVVM целый ух ты ж. А в остальном все так же переопределять OnPaint?
990 3092993
>>92784

> пиши на голом винами, чего уж там


И напишу.
И ты никак мне не помешаешь.

> А в остальном все так же переопределять OnPaint?


Может быть и переопределять. Я мокрописечки не писал, мне это никогда не требовалось. Поэтому я даже не знаю, надо ли это делать сейчас.

> зачем писать на том, что тебя ограничивает


Во-первых, любой язык ограничивает. Любая среда/платформа ограничивает. Мы просто выбираем то, в чём ограничений меньше лично для нас. И поэтому наш спор - спор о вкусах, и он принципиально неразрешим. Все останутся при своём всё равно.
Во-вторых, развитие рождается из преодоления ограничений. Когда нет ограничений - нет и развития. Эта истина доказана не только в кодинге, и не столько в кодинге, сколько в куче других областей человеческого знания.
991 3093009
>>92993

>Любая среда/платформа ограничивает


но мы не выбираем другой язык. мы внутри одного языка и плафтормы. просто выбираем гуи фреймворк. И винформс МЕНЕЕ ГИБКИЙ
992 3093013
>>93009
Говори за себя, одноязычник, не мычи.
993 3093014
>>93013
померяемся количеством языков? сбежишь в ужасе

впрочем причем тут языки если мы говорим про один язык. тебе просто хотелось сманеврировать, но вышло уныло
994 3093022
>>93014

> тебе просто хотелось сманеврировать


НЕТ ТЫ
995 3093026
>>93022
для зумеров - WPF потеснил винфорс именно благодаря своей концепции lookless контролов. То есть позволял простыми средствами сделать прогрессбар в кнопке в комбобоксе круглый без смс сиськи
а не пердолится в онпаинт или же покупать платные контролы.

винформс чисто по природе никогда не сможет в это. вот просто никогда.
996 3093030
>>93026

> для зумеров - WPF потеснил винфорс именно благодаря своей концепции lookless контролов. То есть позволял простыми средствами сделать прогрессбар в кнопке в комбобоксе круглый


Еще раз:
>>92993

> Я мокрописечки не писал, мне это никогда не требовалось. Поэтому я даже не знаю, надо ли это делать сейчас.

997 3093031
>>93026
Ты уверен, что зумер здесь я, а не ты?
998 3093034
Откуда берутся проекты, в которых 5+ уровней наследования? Как люди это делают?
Я сколько не пытался, даже в ебанутых случаях, когда решаю сделать: MyObject от которого все наследоваться будут - не выходит больше 3х.
Можете рассказать о своем опыте написания систем, с 5+ уровнями наследования?
999 3093039
>>93030

> мне это никогда не требовалось


твоя личная ситуация.

>>93031
абсолютли. количество активных языков что я использую более 5
количество которых изучал и зарабатывал на них деньги - более 10
так что прячь свой зумерский ...цензура... и смирись

>>93034
в гуи это норма
1000 3093166
Как вкатились в шарп?

>Ограничится доступ к среде разработки программ Visual Studio, а также к Visual C++, Visual Studio Code.


https://tass.ru/ekonomika/20287331
1001 3093169
>>93166
Community версию никто трогать не будет, а облачные сервисы и так хуй оплатишь.
1002 3093170
>>93166
Не понял, они же уже всё приостановили, отменили, запретили и ограничили ещё в 2022.
1003 3093242
>>93166
Для разработки на шарпе достаточно dotnet sdk + vim
SDK лежит на гитхабе под MIT, бери. Если такой шизик и боишься, что закроют - качай, собирай и пользуйся.

А вообще, если так уж боишься - бери русский-православный ДРАКОН и ищи вакансии)))
1004 3093428
>>93034

>Можете рассказать о своем опыте написания систем, с 5+ уровнями наследования?


Пример из EF

ListConcreteRepository
наследуется от:

EfListProjectionRepositoryBase<TDbContext, TItem, TItemId, TParameters>
наследуется от:

EfListProjectionReaderRepositoryBase<TDbContext, TItem, TParameters>
наследуется от:

EfListProjectionReaderRepositoryBase<TDbContext, TSourceItem, TTargetItem, TParameters>
наследуется от:

EfRepositoryBase<TDbContext, TItem>
1005 3093538
>>93242

> бери русский-православный ДРАКОН и


ДРАКОН не самостоятелен. Я же написал об этом в клаус-треде. Он по факту сам ни во что не компилируется, он из нарисованных схем генерирует текст на си.
1006 3094490
И снова Блазор.
Как принять строку параметров в которой есть /#tgWebAppData=query_id
# - решётка руинит все, я даже не могу попасть по адресу /zalupa#WebAppData
Этот параметр выставляет телеграм при передаче параметра WebAppData

Если без этой модной хуйни а просто разобрать вот так param = Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery(uri.Query);
Там тупо пусто в uri.Query нихуя нету, # - решетка все отсекает.

Можно конечно через ЖС достать, но бля неужели как то полегче нельзя то?
1007 3094803
>>94490
Для чего тебе нужен этот адрес?
1008 3094915
>>94490
Может быть, надо экранировать решетку?
1009 3094986
Посоветуйте книжку c# для продвинутого уровня
1010 3095123
>>94986
Насколько продвинутого?
1011 3095209
>>94986
CLR via C#
1012 3095248
>>94986
Зачем тебе книги?
1013 3095496
>>95248
На пути от джуна к мидлу
>>95123
На ютубе не так последовательно рассказывается
>>95209
Спасибо
1014 3095542
>>94803
>>94915
Веб асембли просто не сразу подхватывает адрес через ParseQuery(uri.Query) и загружает его через некоторое время. Что мне кажется не очень логично. Страница отобразилась, данных нет, и через 1-2 сек они подгружаются.
1015 3095688
Анон шарящий в Blazor помоги плиз.
Вот я хочу создать проект в котором у меня WebAssembly клиент и сервер к нему.
Все страницы полностью WebAssembly и загружаются на клиент. Юзер будет работать в клиенте изредка клиент будет делать запросы к WebApi и обновлять данные.
Дак вот я создаю проект Auto Создаётся клиент и сервер. Я чет пытаюсь перенести всё в клиент но не получается. Ошибка 2 эндпоинта "/" у меня, нихуя не понимаю что менять что убирать.
2 проекта в одном решении как ты говорил легче в разработке, 1 кнопкой можно запускать.
Можно сделать так. Простой WebAssembly проект отдельный, его разрабатываем, и отдельный Web Api проект на который приходят запросы. Но как мне кажется не сильно удобно.
Вот сейчас у меня тестовый Auto проект я захожу на страницу с WebAssembly но соединение с сервером у меня есть хз почему. Я предполагаю что App.razor грузится с сервера а тело страницы с WA. Как перенести я хз.
Подскажи плиз как сделать что бы было по красоте то.
У меня всё упирается в то что бы снизить максимально нагрузку на сервер. Мини игра будет играться на клиенте а результаты отправлять на сервер. Если играть на сервере то уж очень дохуя нужно будет делать расчётов и держать подключения не резонно так как нет денег на дорогой сервер а я рассчитываю что будет дохуя людей.
Подсоби плиз.

И я не совсем понимаю во что Auto проект компилируется. Предполагаю что BlazorWebASPS.dll отдаёт BlazorWebASPS.Client.dll клиенту. Сложна вкатываться в новую технологию то(
1016 3095867
>>95542
Можешь показать что у тебя в App.razor?

>>95688
Контроллеры ты можешь и в свой серверный проект добавить, да и вообще что угодно из ASP.NET, создай проект с шаблоном Web API и глянь че там в builder и app добавляется в Program.cs, можешь потом Swagger для удобства подключить.

Соединение у тебя есть по двум возможным причинам:
1. У тебя в браузере не был закэширован рантайм и приложение в режиме Auto запустилось на серверном рендере, если сильно нужно и клиент готов подождать можешь настроить приложение для режима WebAssembly.
2. При дебаге через студию поддерживается как минимум одно подключение для непосредственно дебага, попробуй через Publish собрать проект и посмотреть что там будет.
1017 3095943
>>95867
Бля ну я тупень, на релизе подключений нет. А я уже отдельно вебАпи начал пилить(
Ладно всё равно всё надо перенести в чистый проект.
Просто пиздец как всё не понятно и не логично.
Проект веб асембли компилится в одно, Ауто вроде как и веб асембли и сервер компилится в другое, сервер в третье, небось гибрид еще в четвёртое.

>Можешь показать что у тебя в App.razor?


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

Думаю всё таки отдельно проект с WebApi и отдельно под него клиент на WebAse,bly буду делать что бы когда что то я не так сделал в проекте то пришлось бы переписывать половину.
1018 3095973
>>95943
Зато ты получил ценный опыт о том, как важно держать данные отдельно от кода, и как важно делать код, который ничего не знает о соседних участках кода.
1019 3096028
>>95943
Да ещё чтоб код не проёбывать можешь что такое Git глянуть.
изображение.png81 Кб, 995x421
1020 3096054
Всем привет. Пытаюсь реализовать восстановление пароля, а конкретно хочу сделать ссылку, которая будет выслана на почту, чтобы потом при переходе по ней открывалась страница с формой восстановления пароля. Использую cqrs. Вопрос: как генерировать url вне контроллера ручками прописывать? А если поменяется порт и т.д? Вся логика перенесена в handler. На переполнении стека вычитал про new UrlHelper(HttpContext.Current.Request.RequestContext), но оно не работает вне контроллера.
1021 3096062
>>96028
но только после меркуриала.
1022 3096149
>>96054

>Использую cqrs


зочем
1023 3096155
Кто нибудь тут баловался с YooMoney API? Там что, для регистрации приложения реально работающий сайт нужон? И что делать если нету...
1024 3096165
>>96054
Так aspnet когда поднимает сервер берет порт и доменное имя из конфигов, конкретно из launchSettings.json. Создавай конфигуратор на этом файле и пропихивай в хендлер/сервис.
1025 3096292
АЖ ТРЕСЕТ НАХОЙ
Вот есть нжинкс конфиг

В нём локации
location / - работает нормально
location /api/ - нихуя не работает, приложение по site.com/api/test/ не открывается. Когда вешаю это приложение на / то site.com/api/test/ открывается.
Я уже блять по разному /api /api/ api/ api пробывал нихуя.
Как пофиксить эту поебенить?
Смысл в том что по / и остальным адресам где нет /api/ открывается одно приложение а с /api/ другое
1026 3096363
Существует ли паттерн, похожий на билдер, но при этом подразумевающий возможность возвращать промежуточный результат при необходимости?
1027 3096445
>>96149
Приколная структура получается
1028 3096447
>>96165
Бля, точно. Спасибо. Я что-то вообще забыл про это
1029 3096462
>>96363
Паттерн Сеттер.
1030 3096465
>>96363
Типа такого?

> builder.build(out buildresult br).configure(out configresult cr).connect(out connectionresult cnr);


> if (!cr.isConfigured()) { rebuild(); }

1031 3096670
Есть десктопное приложение, в котором пользователь может создавать проекты. Сейчас проект представляет собой просто папку с файлами и джсонкой. Хочу теперь эту папку архивировать и зашифровать, чтобы только моя апа могла смотреть файлы. Как этого добиться? Архивирование то не проблема, а вот шифрование уже вызывает трудности
ASP NET core 1032 3096819
При выполнении кода пишет Подключение не защищено
Как эту хуету отключить?
1033 3096894
Как в Web API контроллере принять файл с хтмл формы?
1034 3096924
>>96894
IFormFileCollection files = Request.Form.Files;
1035 3097019
Поясните по хардкору
MAUI это замена всем хамаринам\wpf\winform\UWP и прочему и теперь это "всё в одном"? А то формально то winforms в 2006 еще приуныл, wpf в 2012, UWP как в 2015 вышла так и не взлетела. MAUI 2022 поэтому считается актуальной или всё еще нужно духов wpf всяких призывать?
1036 3097024
>>97019
Даже винформы бывает нужно
Прдожди года 4, MS высрет еще́ один фреймворк для гуя, а MAUI станет легаси.
1037 3097053
>>97019
Maui это абстракция над нативными гуями, в случае винды это winui. Так как winui кривая тормозящая поделка, то и maui будет ничем не лучше. Wpf в целом неплохой выбор, его даже обновляют временами. добавили диалог выбора папки в net 8. Также и uwp, хоть и забросили, но это все еще самый производительный и стабильный фреймворк для винды. Впрочем и то и другое нахуй не нужно, когда есть Avalonia UI.
1038 3097275
Насколько хорошая идея писать себе сахар в Extensions? Или лучше в Utils классах, просто думаю может получиться ситуация где оттестированные методы из какой-либо либы от джуновских надстроек потом не разберёшь.
1039 3097290
>>97053

> и другое нахуй не нужно, когда есть Avalonia UI


Вопрос закрыт последним постом в ищье:
https://github.com/AvaloniaUI/Avalonia/issues/3023
1040 3097293
>>97290
Собственно что такого? Авалония кроссплатформенна, поэтому имеет свой дизайн контролов, а не подстраивается под системный. Но на том же гитхабе есть набор fluent стилей.
1041 3097299
>>97293

> имеет свой дизайн контролов, а не подстраивается под системный


Темы - это системная задача, это задача ОС. Я хочу в ОС выставить серобуромалиновую тему и ожидаю, что все приложения станут серобуромалиновыми, но тут я открываю мокропиську наговняканную на говнолонии, а у неё вендовый срюент, хотя я сижу на линухе.
1042 3097309
>>97299
Нет, внешний вид приложения это задача приложения. Задача ОС отобразить окно, все остальное ее не касается.
1043 3097333
>>97309
Пошёл нахуй, зумер.
1044 3097335
Вместе со своей говнолонией.
1045 3097338
>>97333
>>97335
Нихуя себе разрыв.
>>97333

> , зумер.


Довольно иронично, учитывая, что сама идея того, что приложения должны подстраиваться под ос, сугубо зумерская.
1046 3097343
>>97338

> сама идея того, что приложения должны подстраиваться под ос, сугубо зумерская


> зумер аппелирует к невежеству


Забавный зумер.
1047 3097349
>>97343
А, так ты шизик, тогда вопросов нет
1048 3097362
>>97349

> зумер натужно пытается хотя бы загазлайтить


Глупый зумер.
1049 3097412
Вы бы вместо срача ради срача лучше по MAUI ответ нормальный дали а не "ну порой всё нужно бывает" это новая мета или никто нахуй не пользуется, на работе нужна или там шаманы духов легаси wpf вызывают еще? Какой стек вообще сейчас по шарпу
1050 3097433
>>97412

> MAUI ответ нормальный дали


> никто нахуй не пользуется


ЗЫС.

> Какой стек вообще сейчас по шарпу


99% посетителей пилят бэк.
Фронт весь в вебе на жс.
1051 3097437
Как Blazor WebAssembly узнаёт что надо перекачать клиент?
Вот к примеру юзер зашёл на сайт, клиент закачался, начал пользоваться сайтом. Потом закрыл сайт. Есть ли время жизни у клиента? Если юзер через минуту зайдет то что будет? Клиент снова будет закачан либо будет использован старый? Как я могу подать сигнал что нужно перекачать клиент? У меня только Blazor WebAssembly приложение + web api
1052 3097438
>>97437
Клиент умирает вместе с закрытием вкладки браузера. Сборка хешируется на клиенте. Узнает от обновлении по хешам, которыми браузер обменивается с сервером во время загрузки странички.
1053 3097439
>>97438
Чётко, спасибо.
1054 3097443
>>97439
Уточню, что я про 8 блазор говорю, там все именно так. Но первое утверждение для любого васма верное.
1055 3097454
>>97443
А как можно передавать инфу о юзере из страницы в страницу?
Вот есть у меня класс User. В нём хранятся данные пользователя, ну там счёт очки деньги и тд и тп, как только юзер зашёл на главную его профиль загрузился. Потом он к примеру переходит в страницу shop, в параметре компонента передать User ? Далее он в shop что то купит, будет отправлен post запрос на сервер, там будет списание проверка и в ответе придёт новый User в замен старого. А если юзер нажмёт кнопку назад? Как передать в прошлый компонент параметр?
1056 3097485
>>97454
Через параметр нормально. Можно через синглтон вью модель - на васме все сингл тон, так что можешь не париться за лайф тайм сервисов.

Создай евент, подпиши на него все компоненты, которые как-то взаимодействуют со стейтом юзера. В хендлере этого евента вызывай StateHasChanged(). Дергай эвент, когда модель юзера меняется. Таким образом, любой компонент, который тронул юзера, сообщит всем остальным компонентам, что им нужно перерисоваться.
1057 3097507
>>97454
Вот у тебя сервис UserService:
User User {get; set;} = null!;
Action UserHasChanged {get; set;} = null!;

В OnInitializedAsync() индекса ты делаешь:
var response = await httpClient.GetAsync("/getUser");
UserService.User = await response.Content.ReadAsJsonAsync<User>();
if (UserService.User is null) { //приложухой пользоваться не даешь - показываешь оверлей, что у тебя что-то сломалось, приходите позднее }

Компонент, который что-то делает с юзером инициализируется OnInitialized(), там у тебя:
UserService.UserHasChanged += () => {
CurrentUser = UserService.User;
StateHasChanged();
};

[Inject] UserService UserService {get; set;} = null!;
ComponentName.User CurrentUser {get; set;} = null!; // к этому проперти у тебя привязаны контролы в этом компоненте. (можно привязаться к UserService.User, но тогда new для юзера делать нельзя)

Пользователь внес изменения и нажал Ок:
<Button Text="Ok" @onclick=@(OnOkClicked)>
ComponentName.OnOkClicked()
{
UserService.UserHasChanged?.Invoke(); //все инициализированные компоненты, подписанные на этот делегат обновят ссылку на юзера и стейт своих контролов
// опционально закрываешь текущий оверлей, который ответственный за показ компонента ComponentName
}

Правда, если используешь NavigationManager() и прыгаешь по пейджам, то у тебя не SPA и этот подход тебе не подходит. Переделывай на SPA или пользуйся квери параметрами или на каждой страничке переспрашивай юзера у сервера и в кнопке Ок пости юзера обратно.
1057 3097507
>>97454
Вот у тебя сервис UserService:
User User {get; set;} = null!;
Action UserHasChanged {get; set;} = null!;

В OnInitializedAsync() индекса ты делаешь:
var response = await httpClient.GetAsync("/getUser");
UserService.User = await response.Content.ReadAsJsonAsync<User>();
if (UserService.User is null) { //приложухой пользоваться не даешь - показываешь оверлей, что у тебя что-то сломалось, приходите позднее }

Компонент, который что-то делает с юзером инициализируется OnInitialized(), там у тебя:
UserService.UserHasChanged += () => {
CurrentUser = UserService.User;
StateHasChanged();
};

[Inject] UserService UserService {get; set;} = null!;
ComponentName.User CurrentUser {get; set;} = null!; // к этому проперти у тебя привязаны контролы в этом компоненте. (можно привязаться к UserService.User, но тогда new для юзера делать нельзя)

Пользователь внес изменения и нажал Ок:
<Button Text="Ok" @onclick=@(OnOkClicked)>
ComponentName.OnOkClicked()
{
UserService.UserHasChanged?.Invoke(); //все инициализированные компоненты, подписанные на этот делегат обновят ссылку на юзера и стейт своих контролов
// опционально закрываешь текущий оверлей, который ответственный за показ компонента ComponentName
}

Правда, если используешь NavigationManager() и прыгаешь по пейджам, то у тебя не SPA и этот подход тебе не подходит. Переделывай на SPA или пользуйся квери параметрами или на каждой страничке переспрашивай юзера у сервера и в кнопке Ок пости юзера обратно.
1058 3097511

>если используешь NavigationManager() и прыгаешь по пейджам, то этот подход тебе не подходит


Уточню, что для васма это может быть не точно - там скойпед сервисов нет, а синглтону плевать на NavigateTo(). Так что, лучше затести этот момент сам.
1059 3097514
>>97485

>на васме все сингл тон


Наверное вопрошающий не воспользуется этой информацией в рамках своей задачи, но Transient там работает как и должен.
1060 3097539
>>97507
SPA в смысле у меня одна страница "/" и на ней только компоненты меняются? Вроде как нет, у меня будут разные страницы.

Я вот сейчас подумал можно попробовать сделать типо сервис AddSingleton с хранилищем User как ты писал выше. А потом все действия проходят через методы этого User. Например покупка чего лобо User.buy("zalupa"), делаю запрос на апи, покупаю возвращаю обновлённого юзера, обновляю юзера и после делаю StateHasChanged(), на странице все должно поменятся, и если юзер переходит на другую страницу то снова дёргаю с AddSingleton.

Я еще плохо понимаю как относится к этому веб ассембли, вроде похоже на обычное приложение а вроде и нет.
Спасибо за советы.
1062 3097547
>>97539
Бля и я забываю что можно создавать свои классы, и ебеню все в @code{}
1063 3097550
>>97539
Ну в общем в рамках васма - у тебя в любом случае spa и NavigationManager погоды не сделает. Стейты сбрасываться не будут и ты можешь без проблем пользоваться статическими классами. Но это лучше затестить.

Поправите, если я хуйню пишу.
1064 3097630
Продолжаем сидеть тут. Даун-перекатчик >>97540 не только проебал шапку, но и тег не поставил.
1065 3097655
>>97275
Если работаешь один над проектом, то нормально. Если не один, то никто кроме тебя пользоваться не будет и получится, что все в разнобой.
1066 3097668
>>97655
Жиза, меня это очень обижает. Будто коллеги мне доверяют моему коду...
1067 3097674
>>97630
Давайте правильно перекатим, пожалуйста, у меня тред тормозит. Сжальтесь!
1068 3097677
Есть ли какой то паттерн или названия для моего случая?

Есть данные которые отправляются на Апи. Клиент может с разным RPS отправлять данные. К примеру клиент отправляет 1 RPS, но сервер тормозит и не принимает так быстро, запросы падают в очередь, очередь продвигается по мере ответов сервера.
Так то в голове я примерно представляю как это сделать но мб уже готовое есть.
1069 3097723
>>97677
Да. Kafka.

А называется по умному это очередью сообщений. Довольно необычно, да. я понимаю.
.jpg181 Кб, 630x840
1070 3097761
Обновить тред
« /pr/В начало тредаВеб-версияНастройки
/a//b//mu//s//vg/Все доски

Скачать тред только с превьюс превью и прикрепленными файлами

Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах.Подробнее