Это копия, сохраненная 13 февраля в 11:33.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
1. Ресурсы:
— https://dotnet.microsoft.com/learn
— https://github.com/dotnet
— https://ru.stackoverflow.com/a/416585/422180
— https://metanit.com
— https://professorweb.ru
2. С# для веба
— https://docs.microsoft.com/ru-ru/aspnet/core
3. C# для десктопа
— https://docs.microsoft.com/ru-ru/dotnet/desktop
4. С# для игор
— https://dotnet.microsoft.com/en-us/apps/games/engines
5. С# для мобильной разработки
— https://docs.microsoft.com/ru-ru/dotnet/maui]
Шапка: https://pastebin.com/HT7Hi6FD
Предыдущий: >>2910820 (OP) (OP)
ВНИМАНИЕ, в тред повадился срать джавадебил. Шарпочане, игнорируйте, а лучше репортите. Главное - не кормите.
Мне кажется, что у админов это такая стратегия, чтобы поддержать тред на плаву. Не в первом разделе наблюдаю такой эффект, когда тред начинает затихать, и в него врывается свой местный шиз и начинает байтить на споры. Схема везде идентичная.
Может для доступа к методам, к котоырм просто так не добраться. С другой стороны зачем все обмазали интернал методами, чтобы потом городить интерцепторы?
Ну так ты не отвечай. А если отвечает кто-то другой, значит ему нравится.
не для кожаных мешков
Я айчаном пользуюсь, а в нем потёртые сообщения остаются. И судя по нему, модер таки потер испражнения, которыми жавадебил новый тредик испачкать пытался.
Давайте скажем спасибо дяде-модеру
>вот-вот 8 дотнета тред
Все ближе к почившему бейсику. Аж на душе тепло.
Скоро мы все будем путаться в том, что поленились создать ручками.
Но вот от точки запятой я бы без иронии отказался. Жду C# 13.
Что-то, как по мне, не в ту сторону они идут. Мне возможность обрезать ASP .NET Core приложения не сильно, честно говоря, упёрлась. Я ещё не сталкивался с тем, чтобы размер получающихся приложений был проблемой, чтобы так запариваться.
Это нужно дядям в майкрософте из Azure, чел. Го уж больно сильно дышит в спину шарпу (и джаве).
>Го уж больно сильно дышит в спину шарпу (и джаве).
кто сказал? С каких пор на го стало нормально писать что то не мелкое?
Собсно вопрос: а какого хрена, если я не могу в ObservableCollection изменить больше одного итема? Там даже нет метода AddRange, или EditRange. В чем смысл?
Слишком мало времени прошло. https://github.com/dotnet/runtime/issues/18087
Они слишком заняты написанием новых фич
Баги править некогда
Вернее там обсуждение и даже пуллреквест и он даже типа мержед уже несколько лет
Но хз где все это теряется по пути к выпуску фреймворка
Прошу прощения, что прерываю ваши срачи. Но мне нужен совет знающих людей. Я слышал от вас, что все самые крутые программисты пишут на шарпах. Ну вот подскажите пожалуйста.
Есть предприятие. В нём десятки разных рассылок. Большинство из них отбирают получателей всяким хитроумным образом по неким данным о случившихся событиях. Всё это захардкожено в разных местах. Периодически захардкоживается сам получатель или даже только его мейл или номер телефона, куда слать смс.
В итоге есть куча получателей, которые уже давно уволились и куча потенциальных получателей, которые даже не знают, какие рассылки специально для их должности уже сделаны, и служба поддержки, которая затрудняется всё это перенастраивать. Плюс компания на одних только смсках теряет кучу бабла, тогда как у всех сотрудников есть емейлы, есть приложения от нашей же компании, но мы всё равно шлём смс "для надёжности".
А как это у вас сделано и организовано?
Ты че, собрался все это переделывать с нуля или обуздать?
Вероятно должна быть какая-то база данных с сотрудниками и там хранятся контактные данные, и если в этой базе отсутствует сотрудник, либо его статус или данные не соответствуют правилам рассылки, то никакой рассылки для него не будет. Данные это класс сотрудника, в котором есть свойства с телефоном, почтой, днем рождения, должностью, филиалом и т.д.
А вообще на ютубе полно туторов по созданию каталогов условных магазинов товаров, где у товаров есть различные категории. Суть одна и та же. Так же ознакомься с паттернами проектирования.
Ваша компания называется "6-Б класс"? Выглядит так, как будто создатель это системы делал все по наитию, зная только синтаксис шарпа.
https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-8/
Так есть ли шанс что эти старания хоть кто то оценит? Или сразу в касту пониже за подобные приколы определят
достоинства для одного являются недостатками для другого.
лично я противник мапперов за их неявность, то есть предпочитаю маппить явно
а еще в шарп есть operator explicit/implicit о котором почему то все забывают. И раз уж я маплю явно, то навешиваю это дело на него
вот за это на костре сожгут
Есть условный базовый класс-контрол (пикрил 1), у которого есть слайдер и ползунок этого слайдера (UI-Thumb). На входе есть свойство OffsetValue. Если это свойство изменить, то вызовется событие, которое изменит положение ползунка. А если тянуть ползунок, то изменится значение OffsetValue.
А теперь я наследую этот класс (пикрил 2), который на вход принимает GradientStopValue состоящее из двух параметров: Color и Offset. При изменении свойства, Offset идет на OffsetValue базового класса, а Color идет на второй контрол UI-Color для отображения цвета.
Собсно затык в том, что делать, если будет изменен ползунок слайдера UI-Thumb. Как мне изменить свойство Offset значения GradientStopValue?
У меня получается зацикленность. Если я буду отслеживать изменение свойства OffsetValue, а потом измению GradietnStopValue.Offset, то это вызовет событие OnGradietnStopValuePropertyChanged, которое изменит OffsetValue которое ... ну вы поняли.
Одно из решений проблемы — это создавать флаг подавления в хенделере события OnGradientStopValuePropertyChanged, но оно мне кажется каким-то кондовым и грязным. Может есть какой-то иной подход? Конструкция этих двух классов может меняться как угодно, но должно быть два класса.
Интересует решение зацикленности, когда свойство может меняться с двух сторон.
В планах и обуздывать, и частично переделывать.
Про какие именно паттерны идёт речь? Их много.
Категории - понятно. Кто будет эти категории проставлять? Как? По каким правилам? Как заставить работников включить уведомления для нужных рассылок, чтобы они потом не жаловались, что они ничего не знали и ни в чём не виноваты? Они же привыкли к смскам, а работников тысяч
и. Как назначить используя класс работника рассылку "дежурному заместителю старшего монтёра вышестоящего подразделения"?
>>2921956
У меня такое же впечатление, если честно. Делали разные люди, в том числе и знакомые с паттернами. А получилось всё равно дико сложно, запутанно, дорого, неуниверсально и неудобно.
Потому я пришёл спросить, как это сделали умные люди.
Короче такой вариант.
Добавил флаг IsThimbsDragging в базовом классе, который активируется при начале перетягивания ползунка и деактивируется при завершении.
Дальше класс-наследник подписывается на событие перетягивания ползунка ThumbChangedEvent.
Хендлер OnGradientStopValuePropertyChanged проверяет флаг IsThimbsDragging и не делает ничего, если флаг == true.
Но все выглядит как какая-то переусложненная залупа.
>Про какие именно паттерны идёт речь? Их много.
Я не могу подсказать точно. На мой взгляд тут громадный объем работы, если делать с нуля.
По идее у тебя определенно должны быть сервисы, чтобы если что, то можно было бы что-то еще добавить без боли, или чтобы в будущем замена одного не мешала другому. От этого и копай.
>Кто будет эти категории проставлять? Как? По каким правилам?
Тот, кто занимается рассылками. Если все настолько адресно вплоть до одного человека на предприятии, то какой смысл в категориях? С другой стороны, есть ли персонал, который будет поддерживать всю эту категоризацию и следить за актуальностью базы данных? Используется ли эта база данных где-то еще, или придется ее поддерживать онли для рассылок?
Часто в предприятиях есть уровни доступа, чтобы какой нибудь левый Васян не смог взять и удалить сотрудника из базы данных, или разослать всем дикпики. Поэтому на вопрос "кто это будет делать?" я ответить не могу.
Непонятно какого рода сообщения. Т.е. это надо сесть и проанализировать их, в каких ситуациях они возникают и прочее. Найти взаимосвязи на предмет того, что можно сделать универсальным и как облегчит работу с приложением. Составить блок-схему приложения. Я не знаю, есть ли мегамозги, которые вот так просто могут броситься в омут не анализируя ничего и написать приложение. Первое что всегда делается — это сбор данных, чтобы понять куда двигаться дальше.
Я месяц потратил чисто на АНАЛИЗ своего приложения. Собирал данные и структурировал всё, смотрел как сделано у других. Мне никто в общем-то не подсказывал ничего глобального ИТТ. Тут один анон подсказывал какие-то локальные вещи, был достаточно компетентный, но он по ходу съебался. Он мне рассказал про MVVM паттерн, потому что до этого я считай вручную забивал данные в текстбоксы и была целая каша, когда одни и те же данные должны были отображаться в разных окнах, к примеру. Потом мне понадобилось логирование, а в туторах оно разъяснялось через Dependency Injection — так я познакомился с сервисами. А с этими вещами все достаточно легко масштабируется.
>Про какие именно паттерны идёт речь? Их много.
Я не могу подсказать точно. На мой взгляд тут громадный объем работы, если делать с нуля.
По идее у тебя определенно должны быть сервисы, чтобы если что, то можно было бы что-то еще добавить без боли, или чтобы в будущем замена одного не мешала другому. От этого и копай.
>Кто будет эти категории проставлять? Как? По каким правилам?
Тот, кто занимается рассылками. Если все настолько адресно вплоть до одного человека на предприятии, то какой смысл в категориях? С другой стороны, есть ли персонал, который будет поддерживать всю эту категоризацию и следить за актуальностью базы данных? Используется ли эта база данных где-то еще, или придется ее поддерживать онли для рассылок?
Часто в предприятиях есть уровни доступа, чтобы какой нибудь левый Васян не смог взять и удалить сотрудника из базы данных, или разослать всем дикпики. Поэтому на вопрос "кто это будет делать?" я ответить не могу.
Непонятно какого рода сообщения. Т.е. это надо сесть и проанализировать их, в каких ситуациях они возникают и прочее. Найти взаимосвязи на предмет того, что можно сделать универсальным и как облегчит работу с приложением. Составить блок-схему приложения. Я не знаю, есть ли мегамозги, которые вот так просто могут броситься в омут не анализируя ничего и написать приложение. Первое что всегда делается — это сбор данных, чтобы понять куда двигаться дальше.
Я месяц потратил чисто на АНАЛИЗ своего приложения. Собирал данные и структурировал всё, смотрел как сделано у других. Мне никто в общем-то не подсказывал ничего глобального ИТТ. Тут один анон подсказывал какие-то локальные вещи, был достаточно компетентный, но он по ходу съебался. Он мне рассказал про MVVM паттерн, потому что до этого я считай вручную забивал данные в текстбоксы и была целая каша, когда одни и те же данные должны были отображаться в разных окнах, к примеру. Потом мне понадобилось логирование, а в туторах оно разъяснялось через Dependency Injection — так я познакомился с сервисами. А с этими вещами все достаточно легко масштабируется.
>Так есть ли шанс что эти старания хоть кто то оценит?
Ты неправильно ставишь вопрос. Это не должно быть "стараниями". Ты должен достаточно хорошо разбираться в технологии так, чтобы вопрос "прикручивать или не прикручивать" был из области вкусовщины, а не того сколько ты времени затратишь на это дело.
все мутнее и мутнее
новый синтаксис массивов....всего то 20 лет прошло.
ref readonly - че сразу его не сделали
[System.Runtime.CompilerServices.InlineArray(10)]
public struct Buffer
а чем этот буфер отличается от stackalloc?
параметры для лямбд по умолчанию....кому то они были нужны?
примари конструкторы - тут же вам не котлин блин. Хотя и там они тоже спорное решение
(хотя как решение "а давайте принудим людей делать легковесные конструкторы, а логику не пихать в конструкторы" - норм, но в котлине поэтому есть init, а в шарпе что?)
В котлине местами ощущается, что делали неопытные люди. Ну типа этот инит выглядит как быстро фикс кривизны примари конструктора, когда у них есть обычные конструкторы.
Или же они позже добавили обычные конструкторы, но не выкинули инит. Хз, как можно было проигнорить момент, что бывает больше чем один конструктор, это ппц.
Помню они еще убеждали, что приватные сеттеры нам не нужны.
это не фикс кривизны, а разделение присвоения данных и логики
ну а вторичные конструкторы вынужденная мера, ведь иногда нужно больше 1го конструктора
зато в WPF сделали наконец диалог выбора папки. Не ждали? а они взяли и сделали, чтобы шарписты страдали.
>это не фикс кривизны, а разделение присвоения данных и логики
Там можно без инит присвоить полям, инит родили как раз чтобы логику впихнуть от первичного.
Просто если у тебя больше чем присвоить данные поля - вхерачь уже конструктор, какой нахер еще инит.
В общем, сначала идея, потом костыль. lateinit в туже степь
> у тебя больше чем присвоить данные поля
ну котлин вообще пошел по пути "меньше символов"
lateinit получше будет чем шарповское ! (отстань)
в теории, ведь "я присвою значение позже" отличается от "отвали и не проверяй поле"
тогда анализатор может проверить, а не забыли ли про присвоение этого поля в классе и напомнить об этом.
так что латеинит не хватает в шарпе. А ! как раз костыль
Нефига ты анализаторы одухотворяешь. Может там сделано как раз наоборот? Разработчик компилятора даже говорил, что у них нет внутренней доки, ты представляешь какой там бардак?
Просто проблема шарпа в том что на него натягивают, а котлин такой уже родился, но даже тут можно было не использовать 100500 ключевых слов, а сделать что-то типа:
val vr: Type = ?
Или вообще по дефолту следить за всеми не нулл полями без инициализации (самим помечать как lateinit)
>Нефига ты анализаторы одухотворяешь
потому что это ревью кода на стадии разработки этого кода. Иногда могут ошибаться, но обычно точно указывают либо на ошибку, либо на неоднозначность.
Сам наступал на грабли когда посчитал что решарпер ошибается и засупресил его. И потом через время в рантайме выяснилось что ошибся я. И я потратил потом тучу времени чтобы выяснить причину.
>проблема шарпа в том что на него натягивают
никто ничего не натягивает. нулсафети не лезет в комплятор, это всего лишь анализатор не более. Так что нет никакой разницы кто когда родился. А вот то что в шарп принесли не латеинит (с его семантикой "позже"), а ! ( с его семантикой "вообще не смотри на это поле") уже явная недоработка шарпа
И да - в том же шарпе наделали туеву хучу аттрибутов на эту тему типа MayBeNullWhen (и чет их не парит использование 100500 слов), а вот латеинит нет.
Кто вообще тебе сказал что я разделял компилятор на фронтенд и бэкенд. Я сказал компилятор в целом и да, бардак.
Не удивляюсь почему котлин так медленно развивается.
Котлин уже дизайнели с такими костылями (но могли бы лучше), а в шарпе уже был рожден с нуллами и многим синтаксисом, поэтому были подводные и пришлось сделать хотя бы так. Но опять же, те вообще с нуля дизайнили и могли обойтись без lateinit - он выглядит как поздний костыль.
Сейчас бы вообще сидеть и сравнивать прокси язык с полноценной платформой. Хочешь, иди сделай пару сахарков и изобрети какой-нибудь F#
>и чет их не парит использование 100500 слов
Школота даже не понимает разницу между атрибутами и вреде ключевых слов, особенно уже живущего языка.
Написал бы это предложение раньше, я бы отвечать даже не стал.
Платят копейки, везде ебучее легаси и конкуренция с индусами за миску супа.
Индусы пишут на всем, что скажет западный барин. Просто последние годы связка .NET Fullstack + Azure стала востребованной у аутсорсеров и в Индии пооткрывали сертифицированных центров от майков.
а я не знаю почему ты связываешь анализаторы и компилятор.
Компилятор это конечно базовый анализатор правил чтобы код компилировался
Но в общем неважно - мне без разницы кто ВМЕСТО МЕНЯ проверяет код на нулсафети, лишь бы делал это правильно и мне сообщал об этом.
И я бы не сказал что котлин развивается медленно. Даже по сравнению с шарпом он развивается сверхбыстро.
>и могли обойтись без lateinit
критикуешь предлагай. В андроиде в силу его особенностей вообще норма поздняя инициализация. И если не lateinit то что? (как в шарпе не предлагать - это еще хуже)
"Не использовать" не предлагать. Ты против - ну не используй, кто заставляет. А в андроид просто иначе никак нельзя.
> Хочешь, иди сделай пару сахарков
я вообще не знаю что мы обсуждаем. я всего лишь высказал что латеинит лучше через !
>>2923331
>разницу между атрибутами и вреде ключевых слов, особенно уже живущего языка.
ну значит иди нах раз такой умник выискался
для справки - в шарпе предлагался АТТРИБУТ lateinit. Я вообще не ебу че ты завел речь про компиляторы, ключевые слова и прочее. Я говорил лишь про нуллсафети и способы с ней жить. Шарп высрал тонну разных аттрибутов на эту тему, но в итоге просто ставишь ! чем сможешь подобрать "как бля пояснить анализатору что тут не будет нулл потом и пусть заткнется"
Попробовал я ваш дотнет и сказать, что я охуел - ничего не сказать. Написал меньше, чем на джаве, а прочитать это проще. Буквально по-английски читаю без доки и понимаю, что здесь будет происходить.
Вообщем покопаю поглубже, поизучаю. Говорят, что я от entity framework и linq должен охуеть и невыхуеть обратно. На что еще обратить внимание?
Че дебил-то сразу?
Шарп последние годы тяготеет к ФП. Не прям полностью, но заметно.
Из интересностей - генераторы кода потыкать.
А если так. MediatR, Foddy, Automapper, Dapper и в бой. EF - лично мне за годы работы с ним - больше боли принес.
Медитр - это типа диспечера запросов. Просто немного по уебищному обзывают свои методы.
И я не знаю как тебе, но меня в свое время - здолбало руками диспачить запросы.
Ну а про то что может по любым файлам прыгать. Тебя контроллеры не смущают? Вот ты добавил новый контроллер - вот, теперь хуй пойми как, но ты после запросика по нужному роуту оказываешься в своем контроллере. Сылок на этот контроллер - 0 штук. Магия. Нахуй. Чет не смущает.
>вот, теперь хуй пойми как,
нет не хуй пойми как, а по вполне понятным заданным правилам
и да - это вынужденная мера поскольку мы ВЫНУЖДЕНЫ роутить по строковым правилам
С медиатром же не так. Он позволяет определить хендлер который "где-то" и вся система становится слабо связанной. И ты в рантайме даже не знаешь получил ли кто посылку или же из за каких то изменений теперь не получает. Да и вообще - где эти все. Конечно можно ходить по коду, но вся логика размазывается по вот таким хендлерам с неявной связью.
Это крайность, которая нравится не всем.
Че за "где-то"?
+features
|--feature_a
|----controller
|----request
|----response
|----handler
|--feature_b
|----controller
|----request
|----response
|----handler
|--feature_a_controller
|--feature_a_request
|--feature_a_response
|--feature_a_handler
|--feature_b_controller
|--feature_b_request
|--feature_b_response
|--feature_b_handler
...
|--feature_y_controller
|--feature_y_request
|--feature_y_response
|--feature_y_handler
|--feature_z_controller
|--feature_z_request
|--feature_z_response
|--feature_z_handler
У нас обычно фичи осмысленно как-то называются.
Типа: DeviceRead, DeviceControl, DeviceReload, DeviceFirmwareUpdate, etc если все в одной папке будет - будет неудобно.
ну то есть ты пруфанул что у тебя логика размазана по всяким там хендлерам и вообще везде. Вместо явной зависимости которую вызываем (пусть и через интерфейс) мы посылаем "на деревню дедушке", а где этот дедушка - хз вообще то. А как этот дедушка дружит с транзами если мы что то делаем с ними - опять хз
Дедушки лежат по всему проекту и все общаются сообщениями.
мало отличий от классического евентбаса со всеми ему присущими недостатками.
Потому что плюсов - больше чем недостатков, няша.
Ну серьезно.
Начинать можем от того, что мы ХОТИМ снизить связность.
Заканчивать, что в случае рефакторинга, у тебя не меняются те части кода, которые к непосредственному рефакторингу не относятся, и на ревью не прилетает 100500 измененных файлов, через которые ревьюер не будет прбираться и просто завернет такой ПР.
>Потому что плюсов - больше чем недостатков, няша.
все это ОЧЕНЬ СУБЪЕКТИВНО
у тебя оно решает какие то проблемы, другие создает. Просто зло для тебя является допустимым, но так считают далеко не все.
Что для одного достоинство - недостаток для другого.
что рождает статьи подобные "Вероятно вам не нужен MediatR"
та же херня и с автомпперами. и с орм, и евентбасами и вообще всем на свете.
Пришёл на проект. Там 20+ микросервисов. Во всех используется медиатр, причём весьма специфичным образом. В каждый сервис из общей либы подключаются behaviour-ы, которые извлекают и проставляют в реквесты мета-инфу (UserLogin, CorrelationId и т.д.) и логгируют в кафку все действия в системе (требование безопасников такое было). Все реквесты, кстати, наследовали общий базовый класс из этой либы, чтобы были поля, куда эту мета-инфу пихать.
Но самая мякотка была в взаимодействии между сервисами. Для всех HTTP и GRPC клиентов кодогенерацией генерировались хэндлеры, которые хавали запросы из медитора и отправляли их в сооветсвующие методы клиента. То есть, чтобы сходить во соседний сервис, нужно было посылать сообщение в IMediator. Также и с кафкой. Все прочитанные из топика сообщения по одному отправлялись в медиатр. Ну и для записи в топик, конечно, тоже нужно было засылать сообщения в mediatr, где их перехватытвал специальный generic-handler и пересылал в kafka-топик. Ну и приправлено всё это было автомапером, конечно. Ведь при таком подходе кол-во используемых DTO-х возрастало раза в два.
Вся это было сделано для того, чтобы универсальным способом логировать все действия в системе для аудита от безопасников.
Мне нужен.
Я сейчас могу по всему коду приложения гулять через ctrl, find usages и find implementation. У меня явный и логичный граф зависимостей, в коллстеке всегда явно просматриваются слои абстракции.
Мне кажется, что медиатор используют там, где изначально дизайн кода говно, явным образом прокидывать зависимости стыдно, dependency injection будет порождать циклы, вот и маскируют этот ад пересылкой сообщений.
нет
медиатор используют там, где хотят уменьшить связность
и в итоге впадают в другую крайность - слишком слабо связано, все через сообщения через медиатор.
Кто то считает, что "если код нормально разложить, то все там понятно и структурно, да и вообще можно вклиниться".
Другие же считают, что логика слишком размазана по проекту и никакая структуризация тут не поможет.
Нет, сейчас все пишут на MERN стеке и питончике броу... Скажи своим преподам что они скуфы!
Жаба протухла, нужна новая джава, вот и учи язык будущего.
>открой hh и посмотрим, кому нужен
и получишь список того, где программисты не задерживаются
Почему? хороший вопрос.
ваще то да. я именно так себе и нашел. сам не искал, это меня нашли и еще упрашивали. холят и лелеют, чуть какашки за мной не убирают.
Человек спросил, кому нужен сишарп, я ему ответил, где смотреть. Мне похуй, задерживаются там или нет, пусть хоть на один день нанимают. Если ищут сишарп разработчика - значит в компании используют или собираются использовать сишарп
>Он мне рассказал про MVVM паттерн, потому что до этого я считай вручную забивал данные в текстбоксы и была целая каша, когда одни и те же данные должны были отображаться в разных окнах, к примеру.
Ну, у нас эта задача решена на уровне ERP. Там контрол на форме привязывается к полю таблицы БД, и они сами общаются между собой через data source и его data object-ы. Правда, чем отличается контроллер, модель представления и вот этот вот data source я что-то до сих пор никак не пойму.
А вопрос о рассылках был скорее в сторону "как сделать нечто универсальное, подходящее для самых разных задач". Пожар - уведомить соответствующие категории получателей. Датчики дают показания, требующие внимания - уведомить какого-нибудь дежурного специалиста в таком-то подразделении. Кому-то завтра на смену выходить - уведомить его и его начальника, например. Ну и так далее.
Часто нужно уведомить какую-то категорию получателей, отобранную по должности в каком-то подразделении. Проблема в том, что структура предприятия, или, скорее, предприятий, очень запутанная. Структур как бы несколько параллельных. При этом многие ветви одной из структур похожи, но не идентичны. А в другой вообще чёрт ногу сломит. Это просто дерево подчинённых подразделений, да ещё и с неограниченной вложенностью. И всё это можно ещё условно разделить по категориям: склады, производственные подразделения, офисы... И список должностей это целый зоопарк, где каких-нибудь сварщиков может быть четыре вида, хотя все они делают одну и ту же работу. Есть особый справочник, в котором перечисляются ответственные по подразделениям и т.д.
И вот приходят к нам и говорят, например: У нас проблема, к нам каждый день приходит технадзор и штрафует нас, вручая нам акты. А мы должны своевременно устранить косяки, а для этого мы должны автоматически генерировать уведомления начальникам участка и их руководству. И так по каждому участку. Но определить крайнего зачастую не так-то просто. То должность ему не ту поставили, то в график не внесли, то ещё чего-нибудь. То он уволился и вместо него с такого-то числа назначен другой. При чём иногда должность одна, а работу человек выполняет другую.
И ещё одна проблема - мы не можем предсказать, что от нас захотят завтра. Вот такой опыт может быть у кого-то есть?
>Он мне рассказал про MVVM паттерн, потому что до этого я считай вручную забивал данные в текстбоксы и была целая каша, когда одни и те же данные должны были отображаться в разных окнах, к примеру.
Ну, у нас эта задача решена на уровне ERP. Там контрол на форме привязывается к полю таблицы БД, и они сами общаются между собой через data source и его data object-ы. Правда, чем отличается контроллер, модель представления и вот этот вот data source я что-то до сих пор никак не пойму.
А вопрос о рассылках был скорее в сторону "как сделать нечто универсальное, подходящее для самых разных задач". Пожар - уведомить соответствующие категории получателей. Датчики дают показания, требующие внимания - уведомить какого-нибудь дежурного специалиста в таком-то подразделении. Кому-то завтра на смену выходить - уведомить его и его начальника, например. Ну и так далее.
Часто нужно уведомить какую-то категорию получателей, отобранную по должности в каком-то подразделении. Проблема в том, что структура предприятия, или, скорее, предприятий, очень запутанная. Структур как бы несколько параллельных. При этом многие ветви одной из структур похожи, но не идентичны. А в другой вообще чёрт ногу сломит. Это просто дерево подчинённых подразделений, да ещё и с неограниченной вложенностью. И всё это можно ещё условно разделить по категориям: склады, производственные подразделения, офисы... И список должностей это целый зоопарк, где каких-нибудь сварщиков может быть четыре вида, хотя все они делают одну и ту же работу. Есть особый справочник, в котором перечисляются ответственные по подразделениям и т.д.
И вот приходят к нам и говорят, например: У нас проблема, к нам каждый день приходит технадзор и штрафует нас, вручая нам акты. А мы должны своевременно устранить косяки, а для этого мы должны автоматически генерировать уведомления начальникам участка и их руководству. И так по каждому участку. Но определить крайнего зачастую не так-то просто. То должность ему не ту поставили, то в график не внесли, то ещё чего-нибудь. То он уволился и вместо него с такого-то числа назначен другой. При чём иногда должность одна, а работу человек выполняет другую.
И ещё одна проблема - мы не можем предсказать, что от нас захотят завтра. Вот такой опыт может быть у кого-то есть?
>Микросервисы - java/go
жава...микросервисы...ооокай
го язык на любителя.
>десктоп - qt/gkt
это вообще не языки программирования если че
> мобилки - java/kotlin
и вот тебе нужно знать целый зоопарк технологий вместо чего то одного.
>это вообще не языки программирования если че
И чего? Используется там в основном C++/C.
>жава...микросервисы...ооокай
Что не так? Спрашивал в другом треде, сказали на Java Spring пишут спокойно
>там в основном C++/C.
которые тоже внезапно нужно знать. и языки это так себе
и да - кутю можно использовать даже из шарпа, просто "а зачем"
>сказали на Java Spring пишут спокойно
у жавистов свое понятие минимализма. софт жрет 100000 гигов оперативы - ну нормально, докупи еще, память дешевая (с)
Хорошо. А по поводу того того, на каких серверах исполняется? На линуксе он хорошо себя чувствует? Слышал .net core якобы поддержку имеет.
я ж тебе не гугл на детские вопросы отвечать
отлично он чувствовал себя на линуксе уже несколько лет назад.
На линуксах уже нормально работает лет так 5. Сейчас MS вообще активно затачивает рантайм на работу в Linux-контейнерах. Есть даже офф. docker-образы https://hub.docker.com/_/microsoft-dotnet-runtime/ на базе различных дистрибутивов. Пользуемся имя для деплоя своих микросервисов в K8s. Зависимость есть. Брат жив.
ну у меня брат умер когда нужно было использовать netvips (биндинги для потоковой обработки имаджей) и на линуксах стабильно утекала память (а на винде нет)
Понятно что это проблемы линуксов и с сишными либами ниже, но все же это доставило много много проблем, которые не решились.
Помимо перманентной долбежки в бэкенд на всех языках, у шарпа есть просто неоспоримое преимущество - геймдев.
Ты знал, что игра раст написана не на расте, а на юнити? А то что геншин на юнити?
еще и вменяемый десктоп из всего зоопарка альтернатив, если не учитывать полпроцента десктоп-линуксоидов
С учетом того что шарп второй язык интернета, можно было ротешник не открывать.
Хуже, чем джава.
Если смотреть по миллионикам, то там пхп уже сосули
Опять обиженный прибежал показывать как сокетные квази-веб-сервера всех побеждают.
По делу что нибудь скажешь?
Они написаны на C# просто потому что M$ проплатили юнити. Там необязательно мог быть юнити. Более того, я часто видел как юнити ругают именно за это, за то, что там C#.
Обосрался со скрина. Буквально погрешность
Можно плакать и рыдать, но юнити это шарп, кроме шарпа там костылено, даже годот прикрутил как основной из поддерживаемых - шарп.
Шарп это уже игровая индустрия. А джава это кобол.
Ну одно дело фулл вебфреймворк, другое сокетная перделка без поддержки фулл http, которые никто в проде не юзает.
Я уже кидал сравнение флагманов, срыг спринг победил джангу, чем не радость
История про рапидоид, который зависал при 404 ошибке, в цикле обработки запроса.
Два года эта залупа была в топе жабьих тестов.
Причем автор на ишью ответил спустя только 1-2 месяца, настолько это было демонстративным костылем сам ищи в гитхламе эту ишью, у меня кончилась моча вас поливать
Слив принят.
Слив принят.
Мокрый, но непоколебимый.
> Микросервисы - java/go
Просто нет.
Если микросервисы, то это либо питон, когда надо быстро наговнякать, либо раст, когда хотим перформанса, либо шарп, когда у нас штат шарпистов.
> десктоп - qt/gkt
Это кто что-то сложное на этом пишет-то, лол? Буквально весь сложный десктоп завязан на шарпе + какой-нибудь Devexpress я конечно преувеличиваю, некоторые штуки всякие немцы на Qt пишут и там сложное, но это пишут штатом из 200 С++ кодеров, нахуй, в то время как на шарпе сложный десктоп делает тетя Маша, которая умеет перетягивать из конструктора контроллы и настраивать в визуальном редакторе, как оно должно себя вести, именно потому - так больно переходить было на кор и потому - фреймворк классический до сих пор поддерживают и парралельно в него впиливают всякое. Потому что считай ВЕСЬ, мать его, десктоп на этом держится.
> мобилки - java/kotlin
Тут спорить не буду, потому что это действительно так. Замарин и его переименование - кал говна.
> Какая область применения C#?
Именно что любая. Мать его, я видел как на заводах GSM-модули управляются шарпом в устройствах, потому что все буквально есть на все случаи жизни С КАРОБКИ. Хуяк-хуяк и погнали, 2 недели - MVP выпустили.
Было бы что обсуждать... Хотя блейзер сервер научили автоматически отсылать клиентам компоненты завернутые в васм. Теперь хоть какой-то фронт появился. Толстый клиент, хуе-мое. Надо будет попробовать, как оно на вкус...
Плевать что там у "абсолютного большинства". Есть эталон для гуя и это Qt. Если пишешь программу не на Qt, то она просто не нужна. Особенно если эта программа будет платной и бесполезной.
Именно потому, те кому таки нужен таки кроссплатформенный гуй - пишут его на всяких флаттерах, реакт-нейтивах, електронах и прочем, но не на Qt.
Ну срсли. Ну чел. Qt - нормально, если ты попенсорс для линукса делаешь. Или ты сименс, нокла, но в остальных случаях - Qt - нахуй не упал, тем более в 2023
если ты питонист то кутя твой выбор ибо любое другое хуже.
но если ты шарпист, то ты уже не жавист, что великолепно
>пук
Правду про вас, шарпомушек, молвили "злые" языки, чуть что сразу рвонькаетесь и оскорбляете анона, нехуй с вами дел иметь, вечно догоняющими.
Это ты долбаеб, мать твою ебал. Авалония и Уно это дерьмище основанное на WPF/UWP, худших высерах M$.
Аррря, ты че они уже обогнали. Пока в джаве давным давно существуют нормальные прокси классы, шарпушкам барен разрешил использовать их и без интерфейса. Вот это да, ух как по жабе ударили! Победно. Так глядишь и гуй на линукс переедет, а то у них там брат живой, но без гуя.
>Ну, у нас эта задача решена на уровне ERP Там контрол на форме привязывается к полю таблицы БД, и они сами общаются между собой через data source и его data object-ы.
А говоришь данные захардкожены. А если у тебя данные о сотруднике находятся за пределами, то это плохая база данных.
Или речь идет о хардкодинге свойств условной модели? Данные могут быть как ключ\значение в словаре, а дальше через дата-темплейты подбирается вывод данных в нужный контрол или страницу. Вот как это сделано к примеру в окне Properties вижуал студии (пикрил). Там ведь данные выводятся автоматически в зависимости от DataTemplate. Для значений типа HorizontalAlignment свой контрол, для Thickness другой, для Brush третий.
Мне к примеру приходилось выводить словарь ресурсов, где может быть все что угодно, и я не создавал какую-то специальную модель для этого, где вбиты заранее заготовленные свойства.
Я не понимаю с чем именно у тебя проблемы.
>А вопрос о рассылках был скорее в сторону "как сделать нечто универсальное, подходящее для самых разных задач".
Каких? Программа должна принимать решения, когда на предприятии непонятно кто заступил на смену, а кто уволился? Даже если ты разошлешь сообщение потенциальным исполнителям, то зная Петровичей, они будут скидывать ответственность друг на друга.
а цену этому не подскажешь? ах да - стирание типов. ну такая мелочь ага. Говна поели и радуются
в шарпе всегда генерь хоть обгенерься, но поскольку типы не стираются то сложнее сделать как в жаве.
и тут возникает вопрос - что нужнее. типы или прокси без интерфейса
подумай об этом на досуге, говноед.
>а цену этому не подскажешь? ах да - стирание типов. ну такая мелочь ага. Говна поели и радуются
Что-то тебя конкретно понесло. Причем тут стирание типов? Как будто мартышка что-то однажды услышала и начинает повторять где не попадя.
>На уровне CLR такая информация есть. И динамически в рантайме ты ее не подменишь
Как это мешает написать аналог bytebuddy? Ну есть информация о типах и есть, дальше что?
если метод Foo(Bar b) принимает этот Bar, то если ты туда что то передашь не этот типа у тебя рантайм рухнет. То есть если ты буквально влезешь в IL после генерации и подменишь - у тебя все упадет с ошибкой CLR
то есть рантайм защищается от всякой неведомой херни
Если опускаться до уровня unsafe то там все сложно. Я лично писал иссуйку на гитхаб когда вот так все падало с критической CLR ошибкой (не исключение, а тотальное падение) ибо "так низзя" (они пофиксили это дело)
то есть рантайм CLR старается быть безопасным по возможности
поэтому и LinqExpressions сгенеренный метод работает медленней чем через IL ибо всякие там проверки безопасности. Но даже в чистом IL с типами лучше не играться. Все нестабильно. Я игрался - в моих методах я опустил il инструкции и просто молюсь ктулху что все будет ок (ибо если бы это была не моя личная либа - меня бы сожгли, а потом....снова сожгли, но сначала сожгли)
то есть IL от дотнета более безопасный от вмешательств, чем такое же для жавы
вот сколько ковырял и менял smali - так там куда более лояльно относится ко всяким хакам, чем в MSIL
от небезопасности smali тоже ничего хорошего. все работает после вмешательств - а везде ли? а вот хз
а в шарпе кодогенерация в рантайме обычное дело, так что там проверки наверное больше нужны.
даже тот же Span чем знаменит? не только унификацией работы с буферами, а и безопасностью работы с ними (работает в паре с GC)
вот тут я не могу утверждать, но я думаю не столько в проверках дело, сколько в рантайме, то есть рантайм знает про тип владельца метода, а не просто "кто-то вызывает метод" чтобы искать метод по своим таблицам или хз. Я так глубоко не лез. Я в smali и в MSIL лез лишь когда было нужно,а это редко
ведь я шарпист (вот тут не каждый поймет)
Ну. Я не знаю про что тут говорится.
Но я делал на работе хуйню, которая делала примерно следующее:
Если класс - удовлетворяет интерфейсу, но не реализует его - генерируем в рантайме класс обертку, которая этот интерфейс таки реализует и просто передаем эту обертку туда где нужен интерфейс.
Никаких ансейфов, обычная генерация типов в рантайме.
Но я делал это правда явно. Надо было сделать duck.As<IBird>(); Потому что - тут я все же считал, что явное - лучше неявного. НО думаю, что если закопаться вглубь - можно и неявно как-нибудь делать.
сгенерить класс адаптер/прокси легко. Просто если у класса нет интерфейса/базового класса/или он сам закрыт для переопределения
то мы не можем передать наш объект прокси куда то, где ждут сам оригинал
поэтому если не интерфейс, то всякие там либы требуют делать методы virtual чтобы можно было их переопределить.
Памахите советом и своим важным мнением.
С# или Java? А может сразу Go?
Вкатился в это ваше айти пару лет назад тестировщиком. Без релевантного образования и без опыта ваще. Было тогда 35+
Душа просила и просит стать девелоппером, а душный склад ума с уклоном в научпоп, вроде позволит это сделать.
В тестировании не нравятся три вещи:
-быть замыкающим звеном. Это когда уже все, блять, аналитики, лиды, разрабы разобрались, обсосали требования и уже деплоится, а тебе говорят, ну чё там всё просто на 0,5sp, смотреть нехуя, за обед управишься авотхуй, минимум 3 мажора + правки требований Т.е. я всегда в прошлом.
-тыкать приложение как черный ящик. Хочется понимания, как там под капотом логика работает. А времени разбираться нету надо за обед успеть
-постоянные переключения контекста. То это посмотри, то вот там смоук сделай, то саппорту помоги если баг - заведи, то в джире порядок наведи передвинь статусы за разработчиков и лейблы расставь нужные, а то им некогда и вообще забыли, а у ПМ метрики хуйово собираются когда джира непричесанная И это все, блядь, фоном помимо основной фичи, в которую надо погрузиться и протестировать
Смотрю в сторону C# или JAVA. Ну т.е. что выбрать, чтобы попердолить полгодика, чтобы устроиться девелопером?
Java пробовал немного до устройства тестером. охуевал расшифровывать Cat cat = new Cat();
C# - текущий стек на проекте, но учить меня никто не будет и джунов не берут.
Далее мой пузырь стереотипов.
Плюсы окунуться в Java вижу такие:
-самый главный для меня - подкинули курс dmDev https://www.youtube.com/@dmdev/playlists где за ручку всё последовательно с примерами и домашками прокачает меня до возможности трудоустройства
-нет синтаксического сахара, все концепции через руки дойдут
-не привязана к вендору, нельзя будет russkim запретить использовать что-то, не останешься без работы
-почти не изменяется от выпуска к выпуску. Выучив однажды, знания практически не устареют
-со временем можно "устроиться в банк и пердеть от корпоратива до корпоратива"
-вакансий на hh.ru >6000шт.
Минусы:
-говорят, что 99% у тебя будут тонны легаси, где ты на три шага в любую сторону уже не будешь понимать что происходит. И никто никогда не понимал.
-очень много велосипедов от разных производителей, бардак с документацией
-линуксы ни разу не настраивал
Плюсы за C#:
-живой, развивающийся проект на работе но она и так настоебывает за день, что ничего уже не хочется смотреть
-коллеги, конечно няши, где надо пояснят, если что. Но за ручку никто водить не будет. У всех нет времени.
-всё в одном месте и от одного производителя, IDE, сервер IIS, документация/справочная, туториалы, CLR, база данных, гитхаб
-синтаксический сахар везде, типа проще жить будет
-пробовал писать автотесты, кликалки UI, но оч мало
-винду 3.11 ещё с дискет устанавливал уверенный пользователь, скажем так, но админить не умею
Минусы:
-главный для меня - нет пошагового пути как в случае с джавой. Даже не очень шарю чем .NET отличается от ASP.NET. Какие-то там Azure и прочие ништяки, которые то ли надо, то ли не надо знать? Смотрел ulearn.me, но там показалось, чёт перегружено лишним академическим, отдалённым от обычного ремесла. Рассчитайте координаты узлов механического манипулятора, блять. А я ХОЧУ, чтобы на первую работу по короткой проверенной дороге провели, без воды.
-всё от одного производителя из недружественной страны, который завтра выключит русский язык в хэлпах, послезавтра запретит использовать IIS, MSSQL, потом студию и гитхаб...
-вакансий меньше ~3000, лол
-синТОКСИЧЕСКИЙ сахар, который скрывает от тебя базовые концепции
-существенно меняется от версии к версии. Что работало на .NET3 не скомпилируется в .NET6
-легаси 10+ лет, а не 15+
А может сразу Go?.. если уж как бэ лунапарк с нуля
Памахите советом и своим важным мнением.
С# или Java? А может сразу Go?
Вкатился в это ваше айти пару лет назад тестировщиком. Без релевантного образования и без опыта ваще. Было тогда 35+
Душа просила и просит стать девелоппером, а душный склад ума с уклоном в научпоп, вроде позволит это сделать.
В тестировании не нравятся три вещи:
-быть замыкающим звеном. Это когда уже все, блять, аналитики, лиды, разрабы разобрались, обсосали требования и уже деплоится, а тебе говорят, ну чё там всё просто на 0,5sp, смотреть нехуя, за обед управишься авотхуй, минимум 3 мажора + правки требований Т.е. я всегда в прошлом.
-тыкать приложение как черный ящик. Хочется понимания, как там под капотом логика работает. А времени разбираться нету надо за обед успеть
-постоянные переключения контекста. То это посмотри, то вот там смоук сделай, то саппорту помоги если баг - заведи, то в джире порядок наведи передвинь статусы за разработчиков и лейблы расставь нужные, а то им некогда и вообще забыли, а у ПМ метрики хуйово собираются когда джира непричесанная И это все, блядь, фоном помимо основной фичи, в которую надо погрузиться и протестировать
Смотрю в сторону C# или JAVA. Ну т.е. что выбрать, чтобы попердолить полгодика, чтобы устроиться девелопером?
Java пробовал немного до устройства тестером. охуевал расшифровывать Cat cat = new Cat();
C# - текущий стек на проекте, но учить меня никто не будет и джунов не берут.
Далее мой пузырь стереотипов.
Плюсы окунуться в Java вижу такие:
-самый главный для меня - подкинули курс dmDev https://www.youtube.com/@dmdev/playlists где за ручку всё последовательно с примерами и домашками прокачает меня до возможности трудоустройства
-нет синтаксического сахара, все концепции через руки дойдут
-не привязана к вендору, нельзя будет russkim запретить использовать что-то, не останешься без работы
-почти не изменяется от выпуска к выпуску. Выучив однажды, знания практически не устареют
-со временем можно "устроиться в банк и пердеть от корпоратива до корпоратива"
-вакансий на hh.ru >6000шт.
Минусы:
-говорят, что 99% у тебя будут тонны легаси, где ты на три шага в любую сторону уже не будешь понимать что происходит. И никто никогда не понимал.
-очень много велосипедов от разных производителей, бардак с документацией
-линуксы ни разу не настраивал
Плюсы за C#:
-живой, развивающийся проект на работе но она и так настоебывает за день, что ничего уже не хочется смотреть
-коллеги, конечно няши, где надо пояснят, если что. Но за ручку никто водить не будет. У всех нет времени.
-всё в одном месте и от одного производителя, IDE, сервер IIS, документация/справочная, туториалы, CLR, база данных, гитхаб
-синтаксический сахар везде, типа проще жить будет
-пробовал писать автотесты, кликалки UI, но оч мало
-винду 3.11 ещё с дискет устанавливал уверенный пользователь, скажем так, но админить не умею
Минусы:
-главный для меня - нет пошагового пути как в случае с джавой. Даже не очень шарю чем .NET отличается от ASP.NET. Какие-то там Azure и прочие ништяки, которые то ли надо, то ли не надо знать? Смотрел ulearn.me, но там показалось, чёт перегружено лишним академическим, отдалённым от обычного ремесла. Рассчитайте координаты узлов механического манипулятора, блять. А я ХОЧУ, чтобы на первую работу по короткой проверенной дороге провели, без воды.
-всё от одного производителя из недружественной страны, который завтра выключит русский язык в хэлпах, послезавтра запретит использовать IIS, MSSQL, потом студию и гитхаб...
-вакансий меньше ~3000, лол
-синТОКСИЧЕСКИЙ сахар, который скрывает от тебя базовые концепции
-существенно меняется от версии к версии. Что работало на .NET3 не скомпилируется в .NET6
-легаси 10+ лет, а не 15+
А может сразу Go?.. если уж как бэ лунапарк с нуля
пойти в школу и выучить базовые арифметические операции
(ну или как я тыкать капчу пока не будет простое выражение ибо влом считать в уме)
все просто. поступаешь в 1 класс и там за 11 классов тебя научат считать
а потом идешь куда то и учишь шарп
действуй
Купи пасскод. На что-то же ты должен тратить миллионы, заработанные программированием на шарпе.
Неправильно ссышь на шарподебилов. Не "как это подложило вам говна в штаны", а "мне похуй на причины вашего говна в штанах".
жаваговнсит копротивляется
забавно
у стирания типов как есть плюсы
так и минусы
но шарпговножую этого не понять.
>А говоришь данные захардкожены.
Некоторые захардкожены. Прямо почтовые ящики в исходном коде указывают. А иногда по коду сотрудника вычисляют, но код сотрудника также может быть зашит в исходный текст какого-нибудь метода, и потом поди его найди, чтобы поменять.
>>2924688
>Или речь идет о хардкодинге свойств условной модели?
Речь о том, что получателей иногда прямо в коде указывают. Кроме того, даже если они прямо и не указаны, то отбор событий для уведомления всё равно зачастую построен на жёстких правилах, которые нельзя настроить, не влезая в код. А требования к рассылке уведомлений периодически меняются. Типа "давайте по такой-то фигне уведомлять будем не сегодняшнего дежурного, а того, кто завтра дежурит". А у нас написан метод, которому на вход вообще дата не подаётся. Или "а давайте по таким-то поломкам уведомления будем слать не начальникам подразделений, а замам начальников". А у нас написан метод, который умеет одного сотрудника возвращать, но не список сотрудников, а замов много. И не всегда возможно настройками из какой-либо формы перенастроить логику отбора сотрудников и событий для оповещений.
>продолжается тяница
Няш, мне вообще не нравица, то что ты столько бухаешь. Это типа такая профилактика после пользования шарпа? Прекращай как бы, а то оскуфеешь и кто ж тебя в мужья-то возьмет?
это значит что у меня достаточно бабла для этого
шарп тут не причем. шарп лишь дает денежку
ну да нужно прекратить, но блин легче сказать
а в деньгах проблемы нет
> С# или Java?
Джава конечно.
+асинхронность без загрязнения кода через async/await
+скорость выше в 3-26 раз
+огромное количество либ, выбирай не хочу
+много разных GC
+обратная совместимость и как следствие возможность всегда использовать самую последнюю версию джавы
+кроссплатформенность (настоящая, в том числе для либ для гуёв и сред разработки и вообще для всей экосистемы)
+подход к разработке, когда буквально каждая фича, которая присутствует, сделана лучше, чем у пародий на джаву (как пример интерполяция строк, но это не единственный пример, практически каждый класс в стдлибе джавы является примером)
+поддержка композиции без перепечатывания методов (@Delegate)
+поддержка изменения неизменяемых объектов через копирование через @With и @WithBy
+улучшенная генерация геттеров — не надо хуярить на каждое поле {get;}, можно просто повесить на весь класс @Getter, а также можно сделать их в fluent-style без убого префикса Get через @Accessors(fluent = true)
+мавен (лучшая система сборки ever)
+не пидорашье комьюнити, которое, в отличии от петушарпа, занимается написанием кода, а не запрещениями, наказаниями и тасканиями за уши
+-стирание типов (кто-то считает стирание очень хорошим, кто-то очень плохим, по факту это небольшая проблема, которая мешает создавать два метода с одинаковой сигнатурой после стирания, и всё)
Шарподебилы тут же щас начнут копротивляться и пытаться что-то контрвспукнуть, но обрати внимание, ничего они даже пытаться опровергать не будут, только скажут "нинужно" и "ничестно", либо вообще начнёт какую-то несвязную ересь нести, еле-еле касающуюся темы.
Да-да, денег много, я понял. Вложи это в свое здоровье лучше, а не вот это вот все. Консультации там, обследования можно провести, зубки проверить, лазерную эпиляцию бахнуть, а может пластику небольшую совсем провести. Столько возможностей, ех.
Очевидно у тебя уже шарп на работе и есть шанс. Ибо сомневаюсь что где-то имеет вес джун 35+. Так что без вариантов.
Пошаговых курсов полно, на тех же инетах есть качественный курсы (в том числе слитые) где за ручку водят как дебила. Но ценности это не имеет, так как профессия заставляет уметь собирать инфу самому, то что ты за 3 месяца просмотра узнаешь, что мог бы узнать за неделю на каком-нибудь metanit или доках мс, делает все эти видео разводом для лохов (как местный жабёнок).
>+скорость выше в 3-26 раз
Да. чем у питона.
>+асинхронность без загрязнения кода через async/await
Зеленые треды хороши только когда у тебя фулл язык на них как го, в остальном это такие костыли что ппц. Асинки это наилучшие решение если язык изначально был "синхронным".
К сожалению после убийства жабы в андройде, жаба стала больше никому не нужна, кроме кабанчика с накопившимся кобол-кодом, поэтому 21 жабы ты на проде никогда уже не увидишь.
>+обратная совместимость
Такая что половина еще на 8 сидит, лол.
Дальше мне стало чет лень кормить жабёнка, развлекай лучше ты нас.и да, мы со злости не пойдем бамбать тонуший жабий тред
Как сделать чтобы оно применялось не на весь проект, а только на конкретное окно?
А то понравилось как оформляет - но по инструкции с документации оно это делает глобально на весь проект.
А если мне надо чтобы только одно окно было оформленно этой либой? Писать везде Style=none тот еще долбоебизм
>Зеленые треды хороши только когда у тебя фулл язык на них как го, в остальном это такие костыли что ппц. Асинки это наилучшие решение если язык изначально был "синхронным".
Вот это шарпушиный копиум, конечно. Индусы из майкрософта не осилили и сделали дешевый костыль с асинками, значит не нужно. В то время как белые люди из оракла посидели, подумали и не спеша выкатили абсолютно бесшовно работающее решение. Ей богу, у вас секта, а не язык.
Например
string s = "10.54";
double d = Convert.ToDouble(s);
Крашнится, потому что надо "10,54"
Можно конечно добавить IFormatProvider provider = new CultureInfo("ru-RU");
Но откуда я знаю откуда текст и какой там регион? Текст может с базы данных, а может с таблички из интернета
Есть нормальная функция которая правильно работает?
Нет ни единой в мире либы которая нормально работает с конвертацией из строки в дабл.
>на тех же инетах есть качественный курсы (в том числе слитые) где за ручку водят как дебила.
вот-вот. В инете тонны всего. И в отсутствии опыта не поймёшь, что из этого говно, а что норм. Скиллфактори всякие этим и пользуются, что вкатуны не знают, что от них на самом деле потребуется на работе и рубят бабло на них на нас.
В QA вкатывался сам, не заплатив денег вообще. Но я тыкался как слепой котенок 8-10 мес, ночами прослушивал гигабайты всякой чепухи, которая мне вообще никогда не пригодится. Знал бы путь, за 2 месяца вкатился бы.
Метанит пробовал грызть по С#, да сухо и по делу. Дошел до делегатов/событий и чёт приуныл https://metanit.com/sharp/tutorial/3.28.php Изучать подобное в отрыве от реального применения демотивирует.
Может, ты, опытный - ткнёшь пальцем в годный курс по С# на Youtube/Udemy ? Пускай даже и не слитый, платный После которого на работе ждут.
Вчера покрасноглазил, от безысходности вот это пока выбрал https://www.youtube.com/watch?v=E3rCQDXwOpA&list=PLEtg-LdqEKXbpq4RtUp1hxZ6ByGjnvQs4&index=3
> сомневаюсь что где-то имеет вес джун 35+.
вот здесь немного больно стало
> Да. чем у питона.
Не надоело урину на ебальник принимать? -> >>2924412
> Зеленые треды хороши только когда у тебя фулл язык на них как го, в остальном это такие костыли что ппц. Асинки это наилучшие решение если язык изначально был "синхронным".
Аргументация будет?
> К сожалению после убийства жабы в андройде, жаба стала больше никому не нужна, кроме кабанчика с накопившимся кобол-кодом, поэтому 21 жабы ты на проде никогда уже не увидишь.
Ну что я и говорил, > либо вообще начнёт какую-то несвязную ересь нести, еле-еле касающуюся темы.<
> Такая что половина еще на 8 сидит, лол.
Один хуй её больше, чем в шарпоговне, в котором вместо "добрый день" — "апинейм удалено".
Да, и какой план у шарповиков, если MS запретит использование своих продуктов в рфии?
Понятно, что вряд ли кто-то с двача вообще хоть раз покупал лицензионную винду. Если только не с ноутом впридачу.
Однако пиратство и офицальный запрет всё же немного разное. Скорей всего разработка на C# будет скукоживаться.
>если MS запретит использование своих продуктов в рфии
Как запретит? Скажет "не пишите на C#" и ножкой громко топать будет?
ну я хз, как именно можно запрещать и ножкой топать и как поведет себя работодатель. и я не знаю девелоперских зависимостей от продуктов MS
У меня есть пример из QA. В прошлом году пришлось отказаться от slack и testrail с многолетней историей, тысячами сущностей, перекрестных ссылок между ними и техдолгом!
Были возможности и обходные пути, как остаться на них, но компания решила, что мы переезжаем. Это было очень больно и до сих пор аффектит.
Весь дотнет уже давно опенсурсный (компилятор, рантайм, оф. либо). Так что я хз, как MS сможет это запретить. Максимум могут перестать лицензии на студию отпускать. Но и это не проблема. К примеру, те же жидбрейнс уже полтора года как ушли из России, а у нас в компании лицензии на их продукты до сих пор как-то продлятся/покупаются.
>ну я хз, как именно можно запрещать
во первых сама платформа оно опенсурс.
во-вторых есть клоны как языка, так и платформы, в том числе от линуксоидов, надо будет, опять откопают
в-третьих C# это просто стандарт. надо будет, напишут свой компилятор
>Может, ты, опытный - ткнёшь пальцем в годный курс по С#
Я вкатился уже давно, но люди хвалят ITVDN на торрентах как отдельно, так и 300гиговая раздача была, но я не помню точно, меня просвещали джуны
Жабёнок, обоссы себя сам, не интересно одно и тоже, старайся лучше, приелся уже.
Кустарное подделие с тормозами и тонной подводных неточностей, но для хеллоуворда норм.
Найс. Спасибо.
Нашел раздачу на 301гиг
Може(те) сказать вкратце, чем отличаются эти три вида разрабов с пикрила? Чтобы для себя понять и примерно сопоставить, кем являются наши разрабы, например.
был дотнет фрейворк и кор, последний опенсорсный, позже в 5 версии дотнета их объединили, убрав пропретарную версию
Пробовал регаться с зарубежных сервисов по отправке СМС. Зарегался, но подключение потом к самому чату нестабильно. Периодически отваливается.
был дотнет фрейворк (старый) и кор (опенсорсный), позже в 5 версии дотнета их объединили, кор стал основным.
Там тебе в курсах объяснят
ну если оно делает путем подключения словаря ресурсов то просто подключай его только в нужном окне
>>2925016
дык s.Replace(",", ".") и потом парси
ну или разберись в намберформат вроде. забыл
>>2925031
опять что то непонятное меряют тут >>2924412
опять реализации, а не сам язык
вот взять первый скрин - жсоны там
лол, да даже в том же шарпе если взять не дефолтный жсон, а хотя бы SpanJson, то он прилично быстрее
А еще я говорил что важно не только скорость, а и фичи.
трактор едет медленно, но пашет лучше чем гоночный болид.
>Один хуй её больше, чем в шарпоговне
а как же тогда виртуальные треды лол. ведь ты так хвалился.
а выходит - устраиваешься на работу, а там их просто нет
ну разве что унылый лобок для сахара
>>2925265
кстати да. впрочем и оригинальная жава поделие
вон не может сама себя обновить на винде (как всегда делала)
причины хз, просто факт
>>2925348
не объединили, а кор стал 5 версией, а старый дотнет умирает.
ну если оно делает путем подключения словаря ресурсов то просто подключай его только в нужном окне
>>2925016
дык s.Replace(",", ".") и потом парси
ну или разберись в намберформат вроде. забыл
>>2925031
опять что то непонятное меряют тут >>2924412
опять реализации, а не сам язык
вот взять первый скрин - жсоны там
лол, да даже в том же шарпе если взять не дефолтный жсон, а хотя бы SpanJson, то он прилично быстрее
А еще я говорил что важно не только скорость, а и фичи.
трактор едет медленно, но пашет лучше чем гоночный болид.
>Один хуй её больше, чем в шарпоговне
а как же тогда виртуальные треды лол. ведь ты так хвалился.
а выходит - устраиваешься на работу, а там их просто нет
ну разве что унылый лобок для сахара
>>2925265
кстати да. впрочем и оригинальная жава поделие
вон не может сама себя обновить на винде (как всегда делала)
причины хз, просто факт
>>2925348
не объединили, а кор стал 5 версией, а старый дотнет умирает.
правильно ли я тебя понял, что сейчас, после релиза NET6, 7, 8
ASP.NET Core + ASP.NET = C#.NET разработчик ?
Или тут я навру
Нет. Ты можешь быть .net разрабом и никогда в жизни не притронуться к ASP.NET-у. Например в десктопе или геймдеве.
ASP.NET(Core) это отдельный фреймворк для разработки сервисов и веб-приложений.
>как поведет себя работодатель.
>У меня есть пример из QA.
То что ты привел как пример, это всего лишь замена одного набора инструментов на другой. Да это может быть больно и неудобно, но в основном для рядовых исполнителей. Т.к. по факту персонал остается тот же, его нужно просто переучить и дать привыкнуть. Все. Даже зарплаты поднимать не нужно. Я такие перемены переживал не раз. Замена с редмайна на джиру+конфлюенс. Переход с битбакета на гитлаб, и т.д. Одних мессенджеров корпоративных уже 3 штуки только за этот год поменялось. И т.д.
А теперь представь, что работодателю ударила моча в голову и он "надо менять все с шарпа на джаву, а то санкции-хуянкции, все запретят". Ему придется весь штат разрабов поменять, т.к. почти никто из них не будет переучиваться на другой стек. А это значит найти в короткий срок дохуя очень хороших дорогих разрабов (середнячки тут не подойдут, т.к. это не просто разработка с нуля). Причем и старых всех уволить не получится, т.к. текущее поддерживать нужно. Это на пару порядков больше бабла придется угрохать, чем просто слаку с тестрейлом поменять.
>>2925137
>девелоперских зависимостей от продуктов MS
Да сейчас вообще похуй. Хочешь винда, хочешь линукс. Половина вообще на маках на шарпе разрабатывает и в хуй не дует.
Запускается на чем угодно, базы любые используешь и т.д.
Ну может какие-нибудь azure сервисы недоступны, но я хуй знает - никогда ими не пользовался.
Я тебе еще пример приведу. Существенная часть банковской инфраструктуры в РФ работает на ibm-овских мейнфреймах. А те кто с ними хоть раз сталкивался знают какой там дичайший вендорлок. И они до сих пор используются и будут еще долго использоваться. Несмотря на то, что ibm уже давно ушел с нашего рынка, несмотря на санкции и то, что разработка на них стоит охуенно дорого и разрабов хер найдешь. Просто потому что переход с них на что-то другое будет стоить настолько неебических денег, что даже топ банки не хотят в это ввязываться.
Так что расслабь булки.
>Насколько кал?
Чел 2018-й год... Там про .net framework рассказывается и приводятся скрины из 2015-й студии. Сам то как думаешь?
Оно на момент выпуска может и норм было, но уже 5 лет прошло, тут тебе не джава, у нас все что старше двух...трех лет, уже устарело (ну может кроме Рихтера, это чтиво на все времена, но не для всех и к обучению оно не имеет отношения)
>>2925415
>кал посоветуйте других русских
Русских нет. А вот в переводе можешь вот это взять:
"C# 10 и NET 6 Современная кроссплатформенная разработка [2023] Марк Прайс". Судя по тому, что переводила та же команда, которая до этого переводила Эндрю Лока с "Aps.Net в действии", перевод должен быть нормальным.
Книга/10
https://learn.microsoft.com/ru-ru/dotnet/csharp/tour-of-csharp/
Просто берешь и проходишь.
Ппц какие вы привередливые, вы не вкатитесь в айти с такими запросами. Жри Троелсона, новое нагуглишь
>Прямо почтовые ящики в исходном коде указывают.
Такого быть не должно. Такие данные должны быть за пределом кода. Либо в какой-то доп базе данных, если редактирование основной недоступна. Но все проблемы таких систем в поддержании актуальности данных. Именно поэтому ERP это не дешевая шутка.
> А у нас написан метод, который умеет одного сотрудника возвращать
Что мешает добавить метод, возвращающий несколько сотрудников? Я когда пишу свое, даже миллипусечное приложение, то знаю, что так оно по итогу и будет, что придется иметь дело со списком. Даже INotifyCollectionChanged возвращает массив, даже если изменен всего один итем.
>давайте по такой-то фигне уведомлять будем не сегодняшнего дежурного, а того, кто завтра дежурит
Что мешает написать фильтр? Ты же в курсе про ICollectionView? Там можно писать фильтры, сортировщики и все это не руинит основной список. Делай хоть сколько фильтров. Сначала список фильтруешь по дежурным, потом по дате дежурства, а потом по длине их члена.
Или делайте нодами, лол, если уж там совсем специфические сценарии. Вон в Houdini или в Unreal Blueprints можно без проблем цвет привязать к дате, например. Там просто модули, отвечающие за определенный параметр, либо обрабатыващие данные определенным образом. Поэтому там можно из цвета RGB достать канал R, который по сути число и связать со свойством Data.Day, который тоже является числом, а между ними вставить ноду Clamp или ноду какого нибудь множителя и получить изменение цвета по дате. И такой сценарий никак не предусмотрен изначально.
Я шучу, а может и нет. Но мне кажется, что большая часть проблем решается обычными методами, типа дописывания еще одной функции, если приложение остаточно модульное, либо фильтрации данных. Некоторые проблемы решается с опытом.
>если метод Foo(Bar b) принимает этот Bar, то если ты туда что то передашь не этот типа у тебя рантайм рухнет
Ну ок, допустим в джаве есть метод foo(Object b), где в этом методе вызывается какое-нибудь свойство типа b.getBarProperty(). И точно так же все рухнет, только на несколько этапов позже.
И я при этом не понимаю, как такие ограничения мешают написать аналог bytebuddy. Ну да, байткод другой и может быть CLR чуть строже его прогоняет через себя, но разве это является фундаментальной причиной по которой такую либу нельзя написать?
питонист
Изменение байткода, это как педерастия, порядочные джависты такое в проекты не тащят кроме тестов, которые в проде будут выкинуты.
Понятно, что местный ребенок никогда не работал в тырпрайзе и просто радуется очередной магической динамикодрисне, но не стоит опускаться до таких уровней.
бамп вопросу
сегодня не только лишь все в этом треде голосуют за путина сидят на chat GPT, разве не?
вариант без шизофазии: ну вы же все используете GPT. Расскажите, как это делать стабильным образом?
Про CoPilot тоже интересно - как? Но в первую очередь про GPT.
Так кто говорил, что срыг не эталонное магическое говно?
Хуже был только проект play или как там его, которые вдохновлялись рельсами от рубей. Где-то был доклад, как стильные и молодежные дебажили это магическое чудо.
Будешь общаться с нейросетью — дурачком станешь.
Копилот устанавливается из расширений. Заходишь в управление расширениями, ищешь в поиске GitHub Copilot и устанавливаешь. После перезагрузки вводишь код привязки устройства, который либо автоматом копируется в буфер обмена, либо указан в окне вывода вижуал студии. Соглашаешься на сбор данных и юзаешь свое копро. Можешь заодно на рейтинг посмотреть.
Было 5990 --> стало 1500. Спешите! Такая цена только 12 часов!
Пока я был в нерешительности, пробовал такое же на ютубе или сливах поискать, чекнул ещё раз сегодня, а цена уже 650р!
Видимо, это сам архангел Гавриил хочет, чтобы я закончил уже ныть и, таки навернул C#
справедливости ради, надо сказать, на все остальные Java, Golang и т.д. тоже 650р
Жалоба успешно отправлена. Ошибок нет.
Ну кто на этой хуйне курсы ищет, я вот знаю где 5990 0 и к оплате приниматся карты виза, мастеркард, пиковые тузы, пятёрочка выручает
https://rutracker.org/forum/tracker.php?nm=udemy%20C%23
Буквально нет ни одной причины что-то покупать у любых инфоцыган
Смотрел рутреккер тоже. И там всё старое. По твоей ссылке буквально пара раздач НЕ по юнити. К тому же, всё на английском. Я не против английского как такового, читать там комменты в коде или гитхаб. Но слушать новый технический материал на неродном языке, вот просто не готов ещё этим переусложнять себе жизнь.
А 650р, ну это буквально цена двух бокс-мастеров теперь без хашбраунов внутри
Впрочем, спасибо.
>что-то непонятное меряют
Ты совсем еблан? Это буквально тот же тест, на который я отвечал, только не обрезанный по удобному для шарподебилов, а полный.
Тебе же сказал для вката в сторону ITVDN смотреть. Нет начинают дальше зарываться в канализацию.
Все курсы устаревшие, даже новые, они там штампуют по одному и тому же как издания в книгах. В любом случае видео полезно только чтобы получить базовые представления, если уж совсем туго, всех этих видосов как if писать, и как переменную создавать просто тонна, даже метанит плейлист когда-то делал.
Реально сложные вещи там никто не разбирает, так как, видимо, боятся вкатунов спугнуть.
> В прошлом году пришлось отказаться от slack и testrail с многолетней историей, тысячами сущностей, перекрестных ссылок между ними и техдолгом!
Куда по итогу перекатились?
>ITVDN
Да, качнул пару вводных видосов, чтобы сориентироваться в этих Automation Script Pages
А с udemy что-то я обосрался. В качестве пробы купил за два боксмастера какой-то "охуенно-хороший" курс, по паттернам проектирования до которого наверное миримум год на коммерческой разработке надо расти, блять и все цены вернулись на 5990р
Чистил куки, перезагружал, заходил инкогнито, с другого компа, аккаунта, всё равно. Во всех случаях нету больше цены 650р.
Как они это делают? Можно как-то обойти?
Мне уже не купить, а просто интересно понять, как они меня детектят и ставят другую цену?
>>2926421
Вместо слака - ебучая отечественная "Пачка". У которой регулярно проёбываются уведомления пользователям при меншинах. Т.е. по сути, главная функция корпоративного мессенджера - тегнуть кого-то, чтобы он пришёл или внимание обратил - проёбывается.
Вместо ебучего тестрейла, который нам постоянно md- разметку ломал, пересели на гуглдоки
Что-то с джирой пытаются намутить, может зефир там или что-то другте будет.
>Ты совсем еблан?
я 1000^5000 раз говорил что скорость без учета фич можете засунуть себе в жопу
в скорости если захотеть может порвать всех даже синклербейсик
а толку
>Вместо ебучего тестрейла, который нам постоянно md- разметку ломал, пересели на гуглдоки
Ебать, импортозаместились.
Взяли и на похуй - поменяли 80 порт на 8080 по дефолту.
Мне теперь как еблану - лезть nginx. Допиливать композ ебучий.
Вот просто реально. Как жа это бесит. Неделя до сдачи на прод, тимлид - особенный: давайте накатим .NET8. Теперь вместо того чтобы чуть больше потестить и чет причесвать - бегай порты меняй, проверяй, что ниче там не сломалось в плане доступности.
11/10 короче. Обожай мелкомягких.
Причем здесь Майкрософт? Твой тимлид не особенный, а просто долбоеб, который за неделю до дедлайна решил вкатить новую версию
даже студенты в вузах так не делают
Продакшн
@
Без тестирования накатили обнову перед выходными
@
Не сконфигурирован явно порт в приложении
@
Доярка пролила молоко на сервер
Лол, а говорили копрософт не ломает обратную совместимость с 4 петушарпа! Опять напиздели что-ли? И самое главное это даже задокументировано не было в графе breaking changes, пиздец, ахаха!
Сейчас пилю проект на шарпе, десктопное приложение, планирую его монетизировать путем продажи ключей доступа с повременной оплатой. Для проверки лицензии планирую подключаться к собственному серверу авторизации по TCP, с некоторой периодичностью буду посылать hearbeat пакет где буду проверять не наебывает ли юзер мой клиент разреверсив алгоритм проверки авторизации и подняв свой сервер, помимо этого через TCP буду гонять туда сюда разные данные. Понятное дело, что приложение будет обфусцировано и всё сделано по максимуму, для того, чтобы взлом был нецелесообразен по временным затратам.
Как работает авторизация:
При подключении к серверу клиент посылает login пакет с определенным пейлоадом (публичный ключ, версия клиента и т.д.) и после чего ждет ответа от сервера. Сервер через делает запрос к БД, проверяет есть ли такой ключ в базе и сколько рабочего времени осталось у ключа, далее, соответственно, отвечает успешна ли авторизация или нет, в случае успешной авторизации создает отдельную сессию, помещает её в БД (время создания сессии, версия клиента, время последнего успешного heartbeat пакета и т.д.)
В отдельном бэкграунд потоке обрабатываются активные сессии всех пользователей, где с периодичностью отнимается время у всех используемых этими сессиями лицензионных ключей. Если время закончилось, сервер посылает определенный пакет и клиент прекращает работу.
Вебморду планирую запилить на блейзоре, где юзер после регистрации получает доступ к панели управления где может пополнять счет, продлевать время лицензии, видеть свои активные сессии и т.д.
Общее количество concurrent юзеров будет в районе 500, максимум 1000. Всё будет работать на одном VPS сервере.
Есть какие-либо замечания?
Это не ломающее изменение, просто пидорасы - решили что теперь в контейнерах по дефолту прописана переменная окружения с портом не 80 а 8080. Дескать УЛУЧШАЕМ ЭКСПИРИЕНС ТЕХ КТО НЕ ПОД РУТОМ, ну охуеть, блядь, а те кто под рутом - пусть страдают получается. Пиздец нахуй.
Но из-за этого теперь - надо допиливать docker-compose, надо nginx перенастраивать, интеграционные тесты - заново прогонять, чтобы проверить - что все доступно. Это такой гемор, когда по плану было на след неделе уже на прод выкатить.
НА ТИМЛИДА НЕЛЬЗЯ ВЫЁБЫВАТЬСЯ
@
ЗНАЧИТ, ВИНОВАТ МАЙКРОСОФТ
>>2926645
Уже задокументировали
https://learn.microsoft.com/en-us/dotnet/core/compatibility/8.0
> Default ASP.NET Core port changed to 8080
Ох ты ж пиздец сколько там поломок... Когда я в первый раз смотрел, там буквально одна поломка была написана, какой-то апи выпилили.
>ррррря кроссплатформенность кококо!
>ой а почему мой код работающий на шинде не работает на юниксе
Всегда считал, что ломающими можно считать только когда ломается либо синтаксис, либо поведение либ. А окружение. Ну, на самом деле - мы бы могли свои контейнеры делать и сами прописать нужный нам порт, просто мы - ленивые для этого + не хотим тратиться на поддержку этого дела. Короче, не знаю, реально ли считать это ломающим измененеием или нет, даже если майки так считают.
>>2926659
Та можно и повыебываться. Просто не называть же его просто долбоебом. Это неконструктивно.
А назвать майков пидорасами - сам бог велел. Типа ну срсли. У меня с этим обновлением еще и HTTP клиент сломался, если пытаюсь с 65000+ портами соединяться(всегда их ставил для тестов, но теперь - почему-то кидает исключение, дескать закрыто, хотя сервер на который обращаюсь, даже не получил соединение, и тем же постаманом - все еще нормально можно кидать запросики, короче, шляпа).
Хуже то, что такие точечные поломки на линуксе будут ещё лет 10. Был бы язык кроссплатформенным с самого начала - не пришлось бы это переделывать.
Ты может перестанешь копротивляться? Даже твой барин сам признал, что это брейкинг чендж.
new PriorityQueue<MyObject, double>(Comparer<double>.Create((a, b) => a - b))
вызывает ошибку компилятора о том, что он не может double в int преобразовать? Вроде конструктор принимает компаратор на дженерике, не выкупаю почему ожидается int
>интеграционные тесты - заново прогонять, чтобы проверить - что все доступно.
Т.е., обычно при обновлении сред вы этого не делаете? Ну охуенно, успехов вам тогда.
>Был бы язык кроссплатформенным с самого начала - не пришлось бы это переделывать.
Там дело не в языке, а в том, что майки тупо хуй забили на написание нормальной кроссплатформенной IO библиотеки. Типа вот есть базовый функционал, он работает, что-то больше - ебитесь сами. Или mono.posix юзайте или свое делайте.
Честно говоря, поработав с файлами в линухе, я их поинмаю. Линукс то еще говнище в этом плане.
Почему когда двачеры выпердывают в интернет мнение по какой-то технологии, то они забылвают добавить пример в качестве пруфа.
Каких тебе пруфов нужно чудила?
Попробуй просто через стандартный System.IO хотя бы линуксовые пермишены на файл прочитать/раздать, а когда не получится погугли и увидишь, что из нормальных вариантов только моно.юникс, который хрен знает уже сколько в пререлизной версии находится (но справедливости ради, работает вроде бы четко)
>Честно говоря, поработав с файлами в линухе, я их поинмаю. Линукс то еще говнище в этом плане.
В UNIX идеальная концепция файлов и иерархии.
Рихтера начитались.
И правильно делают, я не для макак свои классы пишу, которые думают, что что-то могу там исправить. Если че-то не устраивает - можно всегда своё написать с нуля.
Что смотрите.
У меня в приложениях - чет дохуя словарей статичных которые нужны просто чтобы читать какие-то штуки по имени.
И вот че я подумал.
А что если заменить их всех - массивами-то?
Типа чем это:
var dic = new Dictionarty<string, something>()
{
["a"] = new Somthing(1),
["b"] = new Somthing(2),
}
Но ведь все мы знаем, что словари - это медленно.
И вот че меня заинтересовало. А может ли шарп - такую оптимизацию проводить: смотрит, что словарь - неизменяемый - и заменяет его массивом?
По мне - была бы отличная хуйня, если словарь используется чисто как хранилище.
> Вместо слака - ебучая отечественная "Пачка". У которой регулярно проёбываются уведомления пользователям при меншинах. Т.е. по сути, главная функция корпоративного мессенджера - тегнуть кого-то, чтобы он пришёл или внимание обратил - проёбывается.
Печально. Еще и платный. А есть свободный зулип.
> Вместо ебучего тестрейла, который нам постоянно md- разметку ломал, пересели на гуглдоки
Для доков - аскидок, но там синтаксис чуть отличается от md
А искать ты в этом массиве как собрался? А если тебе не нужен поиск, тогда нахуя тебе вообще словари?
Зачем такая оптимизация в языке, если самому сделать с массивами легко? Заводишь константы с индексами, инициализируешь массив, дальше в коде везде обращаешься с использованием констант. И что это у тебя за немыслимо тяжёлые вычисления, где "словари слишком медленные"?
Есть бд в ней модель собранной html страницы, и есть просто папка с этими хтмл страницами.
Дак вот, получение страницы через Where(n = n.Name ="zalupka").FirstOrDefault()
Гораздо дольше че получение страницы из файла по его имени File.ReadAllLines("zalupka.html")
Вангую потому что поиск идет а файл я беру сразу.
Стоит ли мне еще протестировать модель в которой праймери кей будет string и иметь то самое название как у файла а именно zalupka ?
Можете примерно почувствовать будет ли скорость выше чем если бы я брал данные из файла?
Понял принял спасибо, добавлю индексы.
Приближусь ли я к такой же скорости как и с файлами?
Пикрил выборка 1к записей по 1 шт за раз.
пришел с /b треда, может тут подробнее ситуацию смогут объяснить. (мне сейчас некогда за Б смотреть, спать надо)
30 лет. неудавшийся проектант по ТеплоГазВода. затошнило от специальности, плюс везде надо общаться или по блату.
подумал что то другое, чтобы вылезти с Мухосрани.
матан был норм. но все забыл, так как нигде не пригодилось. буквально.
из прогерства БЕЙСИК был в школе, да эксель в универе/работах в офисах. мда. насчет этого не заморачивался и нужные формулы тупо искал в нете, разбирался и делал. а потом забывал. потому что зачем запоминать такое?
>C#
пал выбор на РЕШЕТКУ
мечтал всегда игори делать. или около того.
здесь сгодится, чтобы потом забугор свалить?
согласен просто програмули делать пока.
>Заходишь на сайты компаний со стажировками и смотришь че нужно от стажера, записываешь наиболее востребованные навыки
с усоловий того же Озона я приохуел.
я уже ковыряю месяц в сумме, мало чего понятно.
начинаю в себе сомневаться.
> Пару месяцев ебошить
делаю перерывы. т.к. еще не отошел от выгорания и депры. но щас чувствую можно темп прибавить. а то это растянулось на 4 месяца и я выучил с гулькин хуй.
>Смотришь видосы на ютубе "собес языкнейм на джуниора", читаешь статьи о вопросах на собеседовании, разбираешься в темах для нормального ответа на эти вопросы
да. смотрел. насохранял кучу полезного в плейлист.
>Подавать заявки на СТАЖИРОВКИ
смотрел до этого стажировки в своем районном городе
их 0.
рядом миллионник не смотрел.
а вот МИДЛОВ дохуя хотят. в магазы в основном.
>Если не выходит, то записываешься на курсы от команий
ну я паралелльно еще на заочку поступил в Московский филиал универа по ИТ. поспрашиваю там, может чего какую работу могут предлагать
но я хз какой проект придумать, чтобы и в будущей игре сгодилось и никто не заподозрил, что это будет ФУРРИ игра. я чувствую себя человеком, но люблю заверотянок очень, типа акул, оборотней, волчиц. такие дела.
вкратце: от 1 лица, за человека-неудачника в сайфай вселенной короче, где он полетит на планету отрабатывать долги, иначе его пихнут в биореактор, а биомусор с плохими генными данными как он, не в почете на Земле. но лучше в 2д наверн вначале будет оптимально.
или какую то прогу просто лучше сваять потихоньку для диплома?
пришел с /b треда, может тут подробнее ситуацию смогут объяснить. (мне сейчас некогда за Б смотреть, спать надо)
30 лет. неудавшийся проектант по ТеплоГазВода. затошнило от специальности, плюс везде надо общаться или по блату.
подумал что то другое, чтобы вылезти с Мухосрани.
матан был норм. но все забыл, так как нигде не пригодилось. буквально.
из прогерства БЕЙСИК был в школе, да эксель в универе/работах в офисах. мда. насчет этого не заморачивался и нужные формулы тупо искал в нете, разбирался и делал. а потом забывал. потому что зачем запоминать такое?
>C#
пал выбор на РЕШЕТКУ
мечтал всегда игори делать. или около того.
здесь сгодится, чтобы потом забугор свалить?
согласен просто програмули делать пока.
>Заходишь на сайты компаний со стажировками и смотришь че нужно от стажера, записываешь наиболее востребованные навыки
с усоловий того же Озона я приохуел.
я уже ковыряю месяц в сумме, мало чего понятно.
начинаю в себе сомневаться.
> Пару месяцев ебошить
делаю перерывы. т.к. еще не отошел от выгорания и депры. но щас чувствую можно темп прибавить. а то это растянулось на 4 месяца и я выучил с гулькин хуй.
>Смотришь видосы на ютубе "собес языкнейм на джуниора", читаешь статьи о вопросах на собеседовании, разбираешься в темах для нормального ответа на эти вопросы
да. смотрел. насохранял кучу полезного в плейлист.
>Подавать заявки на СТАЖИРОВКИ
смотрел до этого стажировки в своем районном городе
их 0.
рядом миллионник не смотрел.
а вот МИДЛОВ дохуя хотят. в магазы в основном.
>Если не выходит, то записываешься на курсы от команий
ну я паралелльно еще на заочку поступил в Московский филиал универа по ИТ. поспрашиваю там, может чего какую работу могут предлагать
но я хз какой проект придумать, чтобы и в будущей игре сгодилось и никто не заподозрил, что это будет ФУРРИ игра. я чувствую себя человеком, но люблю заверотянок очень, типа акул, оборотней, волчиц. такие дела.
вкратце: от 1 лица, за человека-неудачника в сайфай вселенной короче, где он полетит на планету отрабатывать долги, иначе его пихнут в биореактор, а биомусор с плохими генными данными как он, не в почете на Земле. но лучше в 2д наверн вначале будет оптимально.
или какую то прогу просто лучше сваять потихоньку для диплома?
Я понимаю что можно ускорится с помощью Dappera или напрямую писать SQL запросы но через EF удобнее, да и есть еще места где можно оптимизировать.
Но вот если у меня все файлы будут лежать в БД то записей будет реально дохуя, и выборка будет уже по 2м полям так как надо будет определить какому сайту принадлежит страница. Я так понимаю что можно будет сделать составные индексы.
Сейчас файлы у меня лежат так
/site1.com/.html
/site2.com/.html
/site3.com/*.html
Если это всё в бд хранить то будет примерно так:
Основная БД в которой хранится контент 300к, приоритет чтения этого контента, скорость добавления нового контента не критичная так как будет происходить редко, на ночь поставил и забыл.
А вот если все сайты добавлять в 1 буду то она просто будет ебаническая, считай 1 сайт это копия главной бд просто с перемешанным контентом.
Конечно в бд можно хранить только порядковый номер контента(предложений) типо [1] [3] [2] [4] [5] Ну тогда каждый раз придется после получения порядка вывода контента лезть в главную бд брать контент полностью и каждый раз собирать его. Место на диске занимать будет меньше, но страницу собирать дольше.
Вообще можно на на лету в рабочей программе создавать новую бд и dbcontext?
Например в панельке админа я добавил новый сайт, бд то я создам, а как потом использовать тот контекст который мне нужен?
ты хоть пробовал игры то делать? Не советую геймдев. Если хочешь вкатиться туда, где ещё есть места, советую бэкенд, на шарпе можно в бэк. Только там надо ещё базы данных знать и скорее всего докеры хуекеры всякие. Учи язык, учи проектирование на языке, асинхронное программирование, дрочи задачи алгоритмические, чтоб собес на джуна/стажера пройти. Курсы хорошие есть от Окуловского на ulearn, бесплатно, основы программирование 1,2 и проектирование на c#
Ясно, слив принят.
> Изменение байткода
Иногда необходимо (манки патчинг). Ясен хуй к срыгу это не относится, так как там с самого начала всё построено на волшебстве.
верно. несу хуйню. я на IL не пишу, я всего лишь иногда правил IL по простому и smali по сложному.
я лишь смотрю что всякие там фейки,молы,субституты могут обернуть класс (без интерфейса - раз, причем публичный - два) в проксю, но запроксирует только виртуальные методы.
Почему? хз.
Все. Кроме того, фреймворки, которые делают то, чем ты хочешь заниматься.
Х/з. Может особо перестали на всякие хх вакансии выкладывать. Мне в телегу хрюни с предложениями регулярно долбятся, хотя я уже полтора года резюме не открывал. Причем частенько хрюни из достаточно крупных компаний (Озон, Яндекс, Тинькофф и т.д.) или кипрские галеры. Так что работа на .net есть. Другое дело, что июни сейчас особо никому не нужны.
Хочу сытые сотыгы, они только в асп
Ну, у тебя два варианта.
Либо ты дальше сидишь-пердишь на WPF на прежнем месте ещё лет 5, и в случае увольнения охуеваешь, что вакансий на WPF особо и нет, а те что есть - кудлатое легаси за копейки. По итогу, так как иначе, придёшь к мысли, что надо учить ASP .Net и выкатываться на бэк.
Либо берешь яйца в руки и начинаешь учить ASP .Net прямо сейчас. Причем жсопарашу можно и не учить. Есть вакансии на ASP .Net, где ты будешь чистым бэкенд разрабом. (Я к примеру сейчас даже к HTTP почти не прикасаюсь. У нас все взаимодействие между сервисами через GRPC и кафку. HTTP только на apigw, чтобы с фронтом общаться).
В принципе, если подучишь ASP Net, SQL и архитектуру, то сможешь попытаться и на Мидлла скатиться, особенно если с софтами все хорошо. Я в свое время вообще с UWP-ждуна перекатится на ASP-мидла. (Правда у меня был опыт в веб-разработке, но не на C#).
Только самые хорошие...
Из прям известных - Stackoverflow и его побратимы (Server Fault, Super User)
Врети
Посмотрел кстати, у них html-ка на сервере рендерится. И кто после такого говорит, что SSR плох? На сайте-то не 2 человека сидят.
Ты прикинь какой ебичкой мощности сервера нужны, чтобы это работало. А обычным кабанам нужно чтобы девшего и сердито было...
>А обычным кабанам нужно чтобы девшего и сердито было...
И C# сюда не подходит сразу же, удивительно да? Легче ведь пыховода нанять, чтобы он наговнял быстренько.
Чел...
а путь от Михаила Флёнова норм?
нет... не пробовал.
но знаю как это трудно. ведь уметь надо все. либо на аутсорсе собирать по фрагментам, платя кому то денежку.
> мечтал всегда игори делать
А чо не дела-то? Хотя бы ту же змейку.
> я хз какой проект придумать, чтобы и в будущей игре сгодилось и никто не заподозрил, что это будет ФУРРИ игра
Делай свою систему для менеджмента проектами с историей версий, изменениями, правами доступа и т.д.
Такая-то джира+гит для ассетов и доков в одном флаконе. Это реально полезная хуйня в геймдеве была бы, потому что те же модельки-текстурки художник проебал, и хуй как восстановишь, а если в гит лить - то в контексте не кода - нихуя не понятно, а что изменили, как найти ту версию, что нужна и прочее. Вот если бы кто-то сделал аналог гитовских инструментов для вот этой всей хуйни - это был бы реально полезный проект, а вся хуйня с менеджментом - до кучи, чтобы все с каробки.
интересно. записал в блокнот.
На реальных задач редко есть пространство для перформанса.
Это только на мелком пет проекте или там, где ты хотя бы половину всего кода контроллируешь, возможно.
В основном стараюсь делать упор на удобство будущей поддержки кода.
В перформанс очень редко. Только если с НТ приходит весть, что возможны выходы за SLA, тогда разбираюсь с ними где узкие места и там правлю.
Обычно я пытаюсь в перформанс, который дёшево стоит и не сильно влияет на читаемость кода. Типа использования правильных типов коллекций, минимизация походов в базу/внешние сервисы и т.д. Ну и на планы SQL-запросов просматриваю, когда код, работающий с базой пишу.
Специально улучшением производительности кода редко заниматься приходится. Да и опять же, обычно все в оптимизацию запросов к базе упирается. Но иногда все же приходится, особенно если инфраструктурные штуки пилишь. У нас есть парочка таких (своя обёртка над Confluent Kafka и люто оптимизированный по памяти парсер экселей).
Мой алгоритм такой:
Сделать фичу
Потестировать труками
Покрыть тестами сверху
Если были ошибки - исправить
Отрефакторить чтобы менее говняно смотрелось
Отправить на ревью
Перформансом я буду заниматься, только если придет фидбек, что что-то там медленно.
Почему я так делаю? Потому что на самом деле - оказывается вот так, что 95% кода - перформанса с тупым решением в лоб достататочно. И если я буду тратить время, чтобы оптимизировать все и вся - я фичи, которые нужны заказчику - сделать не успею, либо хуево потещу, либо я хуево напишу, что через год - не пойму, что эта хуйня вообще делает. В результате - на выигрышь в перформансе - всем буквально будет насрать. В результате - мне будут ебать мозги, лишат премии, и прочая хуйня. Вот и на кой оно мне надо?
Саааааси хуууй, сааааси. Соси соси соси. Ты тупой тупой, долбоееееб.
Ну как изучить, хотя бы понять на любительском уровне.
Посоветуйте книжку/pdf/сайт, чтобы примерно понять основы.
До этого в основном верстал-дристал фронтенд.
Как-то не так вначале прочиталось...
Metanit - норм сайт? Вроде висит в шапке.
Может быть потом.
С начала просто выучи синтаксис, Рихрет тот пиздец нудный.
Но ты начни читать и посмотри как пойдет. Главное научится учится.
Я мимо, надо было дописать. У меня есть опыт на сях и других языках эзотерических, так что с синтаксисом проблем не будет, кишочки интересны.
Я пробовал. 100-200 стр прочитал кажись. Вроде оно понятно, о чем пишет, последовательно. Потом какая-то useless материя началась. Запоминать это бесполезно, без того, чтобы применять. А применять ты не можешь, т.к. не можешь даже одну минуту писать код без подглядывания в туториал или ютуб-курс.
В итоге, щитаю, что Рихтера стоит читать после года практики. В лучшем случае 6 мес.
мимо вкатывальщик
Окей, спасибо. Да уж лучше читать, чем смотреть.
Если у меня на сайте нет страницы и моё asp net core выдает 404 ошибку то это хуево? Должна быть страница 404 а код от Nginx ОК?
Согласен, только шарп тут при чём?
Он просто древний, тогда SPA ещё не вошли в моду.
Нет, это бред.
ДВУХСОТКА-ДОДИК ЗАКАЗАЛ СЕБЕ ДОДОПИЦЦУ
@
ПИЦЦУ ПРИНЕСЛИ, НА КОРОБКЕ ФИРМЕННАЯ НАКЛЕЙКА "Я ПРОВЕРИЛ, ВСЁ ХОРОШО"
@
ДВУХСОТКАДОДИК ОТКРЫЛ КОРОБКУ, А ТАМ ГОВНО
@
В ГОВНЕ ТОРЧИТ ЗАПИСОЧКА "409 MESYA4NII BALANS NE SWEDEN"
@
ОХУЕВШИЙ ЗВОНИТ В ПОДДЕРЖКУ
@
НУ ВЫ ЖЕ ПОНИМАЕТЕ, ЧТО НАКЛЕЙКА ОТНОСИТСЯ ТОЛЬКО К ВНЕШНЕМУ ВИДУ КОРОБКИ
@
МЫ ЖЕ НЕ МОЖЕМ СМЕШИВАТЬ КУЛИНАРНЫЙ, УПАКОВОЧНЫЙ И ДОСТАВОЧНЫЙ ПРОТОКОЛЫ
@
ГОВНО В КОРОБКЕ ЗАКЕШИРОВАЛОСЬ
@
ТЕПЕРЬ ДАЖЕ ПРИ ОТДАЧЕ ПИЦЦЫ В ПИЦЦЕРИИ ДВУХСОТКА-ДОДИКУ БУДЕТ ПРИЕЗЖАТЬ ГОВНО В КОРОБКЕ БЛИЖАЙШИЕ 4 ЧАСА
> у них html-ка на сервере рендерится. И кто после такого говорит, что SSR плох?
Забавно это слышать на форуме со статичным рендером html-ек.
Эм нет, тут JSON'ы гоняются. По крайней мере 1 раз да, ответ от сервера с готовой страничкой, потом - нет.
Почему тогда лайки в ньюсаче обновляются только после появления новых постов на странице?
поэтому при ошибке не нужно слать 200 (вроде бы ты как бы хттп протокол за это и ратует - не просто так там есть огромный пул ошибок)
но это не значит что нужно героически все коды натягивать на хттп
послал не 200 - а внутри суть. И никакого кеширования не будет
и где теперь твоя пицца с говном?
а 404 это "нет пиццы" или "пиццерии нет нахуй"? как отличишь?
Не ебу. Ты можешь зайти сам в запросы и понажимать на кнопку обновить, увидишь JSON'чики с постами.
Вдовесок. Вообще странное впечатление возникло, что под шиндовс нет нормального докменеджера, открытого, как в вижле. Задача в проде (так что тут смотрят на лицензию).
Задача сама по себе всратая -- нужны панели эти для графиков. Количество графиков -- ограничено памятью пк. Из возможных приглянулся ScottPlot с поддержкой ускорения. Эмпирически выбрал его по результатам.
Ну значит просто обезьяна тупорылая сделала хуйню. В любом случае такая проблема тем более была бы и на статических хтмлках, в этом случае даже и без тупости обезьяны.
Ну тем не менее благодаря этой "хуйне" существуют кастомные клиенты двача. Отдавалась бы статика - хуй пососали бы.
>"пиццерии нет нахуй"?
Это уже на 500 (ну или 503) тянет.
А вообще нехуй угадайкой заниматься в стиле "у нас тут свой REST. А у нас свой". Нужно спеки на апи нормальные составлять, со всеми вариантами ответов и разрешением неоднозначностей, тогда и похуй будет, что там 'классика' или 'always 200'.
вот только эти жсоны - такая же статика. Никакой там динамики нет.
что полный хтмл, что полный жсон - перегенеривается при посте. А дальше уже сам сервер отдает статику всем желающим с экономией на трафике путем хидеров хттп на тему If-Modified-Since
>>2930050
каких 500
500 это если пиццерия жива и у нее проблемы. Пиццерия сгорела, запрос никуда не сроутился и отдал 404
А клиент думает что это пиццерия ответила.
А я вот посчитал, что id низя отдавать клиентам, мол это сделает его натуральным ключом... И ввел в кортежах столбец name/number. Насколько я еблан?
>404 — это нет искомой сущности.
ты мне тут лекции не читай, а на вопрос отвечай
нет искомой сущности - 404
что то временно случилось (косячный апдейт или жавист код писал) и запрос вообще не нашел адресата - 404
давай отличай одно отдругого
Вообще вот вам база
200 – запрос выполнен вот данные или ничего
500 – пизда иди нахуй вот тебе текст ошибки или "ошибка на стороне сервера пишите в ТП"
Все остальное пришлётся само тебе не надо.
Долбоёб, "хуйня" здесь не попытка в адекватный принцип работы сайта здорового человека, а обкуренное раковое обновление лайков при изменении содержания страницы.
Как мне переопределить папку wwwroot для каждого сайта.
Поясню.
Моё asp net core приложение обслуживаетили как правильно сказать? N сайтов.
Логику сильно расписывать не буду в вкратце вот так:
Nginx пересылает абсолютно все запросы server_name _; на proxy_pass http://localhost:5000;
В зависимости на какой домен пришел запрос приложение уже рулит.
А именно берет страничку немного её модифицирует и отдает.
Дело в том что сайты висят каждый на своём html шаблоне. Шаблоны и сайты могут добавлятся.
И сейчас все статичные файлы лежат просто в wwwroot. Проблема в том что на шаблонах есть файлы с одинаковыми именами. Например style.css, можно переименовать файлы, можно создавать папку на каждый сайт типо
wwwroot/site1/ и брать файлы от туда. Но тогда в исходном коде страницы будет видно что файлы берутся не из корня типо вот так <link href="/static/css/default.css?cache=7" title="makaba" type="text/css" rel="stylesheet">
а Как то так
<link href="/nameSite/static/css/default.css?cache=7" title="makaba" type="text/css" rel="stylesheet">
Хотелось бы этого избежать.
В какую сторону попать?
Вот пока писал мб в Nginx сделать еще один роут который бы все статичные файлы отдавал с
/var/www/coreapp/wwwroot/$host/
Но тоже хз
Подсабите плэз
ps это не mvc так как там html шаблон вшит и я не могу его на лету менять и редактировать.
ну я глянул на чела который имеет уже счетчик уникальных номеров (и при этом у него ж вряд ли firebird, где его нужно отдельно заводить), а он сам считает, небось и сам за уникальностью следит
и вроде бы у него не как на ютубе - то есть псевдослучайные айди которые мешают парсинг перебором
и не нужны ему глобальные айди типа гуидников.
и думаю...нууу чел просто пиздец
а дальше все просто
пи - это 3.14 * взял числа от букв 'з' 'д' 'е' 'ц', далее бухнул и там сложная формула не помню уже, главное что результат успел записать
и тебе сообщил.
Так, только бить не начинай, для уникальности я завел по табличке и sequential для каждого id там. Таким образом генерация будет на стороне бд и связь one-to-one с столбцом name/number.
вот что бывает когда мультисайт делаешь не на пхп, который хоть и говно, но все же для мультисайтов уровня "на коленке" подходит лучше
ну а что ты сделаешь
ну разве что рерайт на уровне nginx чтобы он знал какой файл ему нужен. Может по рефереру (ненадежно), а может по ключу что ты после ? пишешь.
ему советы дают (и даже не посылают), а он недоволен
смотри так жавистом станешь и не заметишь. Берегись
>смотри так жавистом станешь
Ты не поверишь...
>и даже не посылают
Я же няша, за что меня посылать?
>Может по рефереру (ненадежно), а может по ключу что ты после ? пишешь.
Это как? По какому ключу?
Вобще с файлами не проблема, просто не удобство.
> что то временно случилось (косячный апдейт или жавист код писал) и запрос вообще не нашел адресата - 404
Я на любую схему api могу придумать баг, который будет выглядеть как какой-то ожидаемый ответ, а означать совсем другое, так что твой аргумент инвалид.
Кстати, в том же ASP.NET, если у тебя несуществующий url, то тебе не веб-сервер 404 возвращает, а фреймворк. Это кошерно или уже нет? Ладно, в IIS можно настроить хендлер, который эти 404 в 200 преобразует и напишет route not found в боди. А если это Kestrel?
>>2930102
> Все остальное пришлётся само тебе не надо.
Not authorized мне тоже веб-сервер пришлёт? Там это в лучшем случае на статику можно настроить.
А если у меня SSR, и надо редирект после пост-запроса делать, мне тоже это надо на ajax переписывать и руками редиректить?
Вообще существующие веб-серверы хорошо если треть имеющихся кодов умеют присылать. А остальные коды, что, не нужны?
Сделал в общем так:
org.Project.csproj
Program.cs
Module1
--Modile1Installer.cs
--Endpoints
----Endpoint1.cs
----Endpoint2.cs
--Models
----Model1.cs
----Model2.cs
--...
Module1
Ну. Собственно. Выглядело на бумаге - ок.
Но оказывается - MinimalApi - не умеет в XML. Вот просто охуеть. И вся эта охуитительная структура - теперь идет нахуй.
Как так-то? Почему так?
Коуда писать?
Кому звонить?
Не хочу в эндпоитны HTTP-совать и XML'ки доставать из тела руками.
>Not authorized мне тоже веб-сервер пришлёт? Там это в лучшем случае на статику можно настроить
Пришлет дотНЕТ и без твоего участия. В продуктовой сборке он ещё и любые исключения вернет как 500.
Я про то что руками прям обычно 200 и 500 кидают, все остальное в дотНЕТ за тебя вышлет сам фреймворк, что кошэрно и удобно и шлёт он довольно точные коды.
Мне вообще нравится писать бэк на С# только из-за фреймворка который позволяет не ебаться и просто довериться ему сосредочив свои мысли не на кодах ответа, а на написании бизнес кода.
Ну так добавь подобный флаг
А вообще КОМУ НЕ НАСРАТЬ на путь к css
Находишь проблему на ровном месте
Но ведь фреймворк не веб-сервер, он не должен коды возвращать.
Ну и ты ещё половину моего поста проигнорировал.
Мб гугл боту не насрать и он просечет что все мои сайты на одном приложении крутятся. Ну он по любому рано или поздно просечет, но я старюсь их делать максимально не похожими.
Ну и если флаг добавлять то я тогда ваще хуй знает как сделать, как назвать файл что бы по флагу его взяло)
Если тебе нужен редирект верни в ответ Redirect()
Ты никогда на С# не писал или че за тупые вопросы как писать банальные вещи?
Я знаю как всё писать, спасибо. Я и NoFound() могу вернуть, только вот NotFound по-твоему почему-то нельзя, а Redirect можно, и [Authorize] можно, и даже свой фильтр прикрутить можно, хотя во всех этих случаях код ответа будет возвращать не веб сервер, что по твоей идеологии является табу.
делать ему больше нехер. его больше волнует что они на одном айпи и похожи по сути.
Ну ип прячется за cloudflare а шаблоны нужны что бы они хоть как то отличались)
тогда похапэ тебе поможет
а на деле просто заведи флаги хоть рэндомный набор букв. какая разница
Ваша задача - настроить ASP.NET Core приложение так, чтобы оно обслуживало несколько сайтов, каждый из которых имеет свою папку `wwwroot`. Для решения этой задачи есть несколько подходов:
### 1. Использование Middleware для Переопределения `wwwroot`
Вы можете использовать middleware в ASP.NET Core для динамического определения папки `wwwroot` в зависимости от запрашиваемого домена. Примерно так:
1. Создайте middleware, который анализирует запрашиваемый домен и на основе этого устанавливает нужный путь к статическим файлам.
2. В middleware используйте `IWebHostEnvironment` для установки нового пути к `wwwroot`.
3. Убедитесь, что этот middleware добавлен в начале конвейера обработки запросов, чтобы он выполнялся перед обработкой статических файлов.
### 2. Настройка Nginx
Вы также можете настроить Nginx для обработки статических файлов, используя разные пути к `wwwroot` в зависимости от запрашиваемого домена. Примерно так:
1. Настройте блок сервера в Nginx для каждого домена.
2. В каждом блоке укажите разные корневые папки для статических файлов.
3. Убедитесь, что запросы на статические файлы не перенаправляются на ваше ASP.NET Core приложение.
### 3. Использование Поддоменов
Еще один вариант - использование поддоменов для каждого сайта. Это может упростить маршрутизацию и организацию статических файлов, так как каждый поддомен может иметь свой собственный набор статических файлов.
### 4. Использование Virtual File Providers
ASP.NET Core поддерживает Virtual File Providers, которые позволяют вам определять виртуальные пути к файлам. Вы можете настроить отдельные виртуальные пути для каждого сайта и использовать их для обслуживания статических файлов.
### Важные Моменты:
- Производительность: Если вы решите обрабатывать статические файлы через ваше ASP.NET Core приложение, это может повлиять на производительность. Обычно лучше, чтобы Nginx обрабатывал статические файлы.
- Безопасность: Убедитесь, что ваше решение не создает уязвимостей в безопасности, особенно если оно включает динамическое формирование путей к файлам.
- Тестирование: Тщательно протестируйте вашу конфигурацию в разных сценариях, чтобы убедиться, что все работает корректно.
Выбор метода зависит от вашего конкретного случая, ваших требований к производительности, безопасности и легкости поддержки.
Ваша задача - настроить ASP.NET Core приложение так, чтобы оно обслуживало несколько сайтов, каждый из которых имеет свою папку `wwwroot`. Для решения этой задачи есть несколько подходов:
### 1. Использование Middleware для Переопределения `wwwroot`
Вы можете использовать middleware в ASP.NET Core для динамического определения папки `wwwroot` в зависимости от запрашиваемого домена. Примерно так:
1. Создайте middleware, который анализирует запрашиваемый домен и на основе этого устанавливает нужный путь к статическим файлам.
2. В middleware используйте `IWebHostEnvironment` для установки нового пути к `wwwroot`.
3. Убедитесь, что этот middleware добавлен в начале конвейера обработки запросов, чтобы он выполнялся перед обработкой статических файлов.
### 2. Настройка Nginx
Вы также можете настроить Nginx для обработки статических файлов, используя разные пути к `wwwroot` в зависимости от запрашиваемого домена. Примерно так:
1. Настройте блок сервера в Nginx для каждого домена.
2. В каждом блоке укажите разные корневые папки для статических файлов.
3. Убедитесь, что запросы на статические файлы не перенаправляются на ваше ASP.NET Core приложение.
### 3. Использование Поддоменов
Еще один вариант - использование поддоменов для каждого сайта. Это может упростить маршрутизацию и организацию статических файлов, так как каждый поддомен может иметь свой собственный набор статических файлов.
### 4. Использование Virtual File Providers
ASP.NET Core поддерживает Virtual File Providers, которые позволяют вам определять виртуальные пути к файлам. Вы можете настроить отдельные виртуальные пути для каждого сайта и использовать их для обслуживания статических файлов.
### Важные Моменты:
- Производительность: Если вы решите обрабатывать статические файлы через ваше ASP.NET Core приложение, это может повлиять на производительность. Обычно лучше, чтобы Nginx обрабатывал статические файлы.
- Безопасность: Убедитесь, что ваше решение не создает уязвимостей в безопасности, особенно если оно включает динамическое формирование путей к файлам.
- Тестирование: Тщательно протестируйте вашу конфигурацию в разных сценариях, чтобы убедиться, что все работает корректно.
Выбор метода зависит от вашего конкретного случая, ваших требований к производительности, безопасности и легкости поддержки.
>
>
Спасибо на чат жпт не может в задачи сложнее чем hello world.
Ответ типо ну сделай хорошо и будет хорошо.
У меня доменов несколько сотен и каждый день какие то удаляются а какие то прибавляются.
И что. Заведи кота.
Или найди способ не ребутать асп, питон, руби....
Или возьми похапэ где такой проблемы нет и страдай
ну а что ты хотел. Сам все нагадил и у нас ответы просишь
я на тебя целый вопрос потратил, а у гпт лимит 50 на 3 часа
когда тебя и так тут могут послать куда хочешь?
Гпт не пошлет, а максимально будет пытаться помочь. Покат лимит не закончится
Мы пошлем. Без регистрации и смс. И даже куда не хочешь
А вообще это деградация. Молодежь не умеет гуглить,ей нужен чат
жпт норм когда нужно накидать что то мелкое.
А для сложного кода нужно его пиздец как четко описать. Но если я его четко опишу то я сам по такому описанию смогу написать и нахуй тот жпт.
Пример.
Даем жпт код и просим написать подробное описание кода, описать каждую строку все подробно.
Он пишет портянку.
Эту портянку вставляем в новый чат и просим написать код по этому описанию
Он пишет практический такой же код
Кажется нихуя себе какой умный. Но бля по такому описанию я сам смогу написать код. А что бы составить такое описание нужен сам код.
>Он пишет практический такой же код
>практический такой же
Вот в этом "почти" и кроется, кстати, основная анальная жопа взаимодействия с ИИ. Сначала это чуть-чуть "практически" то же самое, потом какие-то вариации, а потом на похуях что-нибудь вроде "define true = false" (утрирую) и еще и будет уверен в правильности своего решения. И хуй ты разберешь его галлюцинации среди тысяч строк кода.
>что это будет ФУРРИ игра. я чувствую себя человеком, но люблю заверотянок очень, типа акул,
Так, убирайся обратно в b или оставайся
Ты на хуй, мудозвон, ссылки в спойлер прячешь? Чтобы я, кликая по ним, выкатился из треда?
Топ.
>>2925024
возраст особого значения не имеет. Лишь бы склад ума подходил. Тогда все в этот склад заваливаться будет нормально.
Вообще даже голубя можно научить писать скрипты и формочки лепить.
А вот мыслить абстракциями, метафорами, оопшно, многопоточно и всякие такие алгоритмы - особый навык, ведь элементы не имеют аналогов в реальном мире и это другой стиль мышления, чем тебе привычный.
никак
Хм.
Все же.
Не знаете че надо сделать, чтобы MinimalApi научить работать с XML в контексте получения в теле запроса документа определенного формата?
Типа чтобы контроллеры так умели - просто делаю: AddXmlSerializerFormatters(). А вот че делать в MinimalApi - не знаю.
ДТО и энтити вышли из чата.
Просто напомню, что интерфейсы - не нужны в нормальных языках, и это просто костыль.
Ну хочешь писать классы из одних методов пиши.
Ты какие альтернативы видишь разделения наследования поведения и реализации? Множественное наследование классов?
Где он на панике рассказывает, что у программирования осталось в лучшем случае 3-5 лет.
Предположения и рассуждения имхо вполне логичны. Выглядит так, что вкатываться поздно. Верней, вкатываться не получится в принципе.
Просто ИИ отрегулирует рынок так, что количество программеров уже близко к насыщению и дальше программистами будут становиться только самые талантливые и трудолюбивые люди. Т.е. условно 2% от всех вкатунов. Просто потому, что они с помощью ИИ смогут выполнять весь объем работ, на который нужны были все эти 98%.
Никто же не говорит сейчас "пойду вкачусь в железнодорожники" или "свитчую из фотографа в пожарные". И тех и других на рынке столько, сколько требуется. Если уж тебе вправду нравятся паровозики, то можешь стать железнодорожником. Но никто тебе там сотыги и смузи на обед не сулит. Не понравилось, трудно, можешь уёбывать с жд, другого найдут.
https://www.youtube.com/watch?v=p9wBNOJH59Q&ab_channel=%D0%90%D0%B9%D0%A2%D0%B8%D0%91%D0%BE%D1%80%D0%BE%D0%B4%D0%B0
или обсуждали уже?
Да. На жопоголизме тоже можно заработать.
Чушь собачья. Чел вообще не разбирается в вопросе
Да это фпшник. У них нет внедрения зависимостей, поэтому в каждую функцию приходится в виде параметров передавать либо другие функции на вызов, либо результат их вычисления.
Но так как в фп мокать функции сложно, поэтому функции передавать нельзя, значит их надо вызывать на уровень выше. А так как уровнем выше такая же функция, то всё приходится пропихивать до самого верхнего уровня.
В итоге никаких слоёв абстракций нет, а функция-точка входа, видимо, выглядит как портянка из вызова всего подряд.
Зато нет костылей-интерфейсов.
>Профессионалы, а что думаете о последнем видосе Бороды?
Жалко мужика, че тут думать еще
https://www.youtube.com/watch?v=sONRkfctgT0
Я даже смотреть не хочу, это просто полная хуйня.
Я, когда код пишу, у меня подавляющая часть времени уходит на проектирование структуры классов, методов ит.д. Писать работающий код - это минимальная необходимая квалификация для джуна, и даже с этим ИИ не справляется. А ведь код ещё должен быть читаемый, поддерживаемый и тестируемый.
Я пару раз пытался попросить написать ИИ маленький участок, чтобы не тратить время на поиск нужных функций и их сигнатур в доках, и то он написал не то, что мне нужно. Мне проще загуглить, попасть на стековерфлоу, посмотреть несколько решений, комменты к ним, и выбрать наиболее оптимальное.
С написанием текстов у ИИ тоже плохо: попроси ИИ написать рассказ, он тебе выдаст текст без вменяемого последовательного сюжета. Не умеет ещё пока ИИ в нужный уровень абстракции.
Альтернативой вижу - то как сделано в TS. Опитсывается тип, во время компилятции - проверяется, что переданная хуйня - удовлетворят типу. Все.
На кой хуй нужно какой-то там интерфейс имелементировать, какую-то хуйню городить, потом сверху адептеры делать, адаптеры для адаптеров, потом - поняв что выглядит как говно - шлифануть фассадом.
Короче. Нахуй костыли.
>на поиск нужных функций и их сигнатур в доках
Бедняжки, а ведь нормальные иде это делают по дефолту...
Ты ведь никогда в фп не прогал?
Причём тут вообще ООП? Тип ахуеть не встать, я на С++ тоже могу такое написать и мне даже не нужен для этого отдельный тип я в качестве параметра укажу указатель на функцию.
Этот чел них не понимает
>Я просто напомнил, что интерфейсы - ненужный костыль
поэтому скинул фп код? ну заебись че молодец, как это относится к ООП и системам классов?
>Я даже смотреть не хочу, это просто полная хуйня.
Дык время тичот. Я помню в 2005-07 в компьютерном классе в говно-шараге стояли говнокомпы. Пентиум 3, 667MHz. И это когда уже третий дум вышел и сталкер. Даж не помню для чего они там были, какой предмет по ним изучали. Наверное просто стояли на балансе, лол
От нехуй делать, кто-то притащил "Искуственный интеллект" на дискете! Оно даже со встроенным обучением было. Типа сам даешь ответ "оло-ло-ло" на вопрос "сколько ног у осьминога?" и он этот ответ потом подсовывает. Можно было даже вменяемый минидиалог получить на четыре-пять вопрос-ответов. Но в общем, это просто полная хуйня.
Прошло время, да целых 17 лет. Но производительность растет экспоненциально. И вот сейчас же никто особо не угарает над общением с чатом GPT, его всерьёз опасаются, с его помощью даже учатся (тем самым ставя себя в младшую роль) или зарабатывают реальные деньги.
И я тут соглашусь, что через 3-5 лет такого интенсива, GPT или что на их основе вырастет, это уже будет реально конкуренты. И в том числе на выдумывание абстракций, структур и т.д.
5 лет это очень мало. На хату возможно успеешь заработать, если на барбершопах экономить. А вот выйти программистом на пенсию уже не получится скорей всего.
>>2931778
Динамик - не проверит тип того что я туда не единичку просто передал, няша.
А в командной разработке, к сожалению - часто нужно чтобы проверил, ведь если я - бог программирования, то вокруг меня много всяких странных челов, которые хотят попортить мое божественное творение, пихая всякую мерзость. Так что типы таки нужны. Но вот интерфейсы - нихуя.
>>2931782
Каким местом ты там ФП код увидел-то?
Чистейшее ООП, лул. Просто без всяких уродств с интерфейсами.
Так ты на JS тоже самое мог написать. Причём класс Printer тут вообще лишний и без него будет все работать.
Нужна проверка того что переданный объект имеет нужный метод с корректной сигнатурой. Потому и ТС.
JS - проглотит если я туда что угодно пихну.
>Динамик - не проверит тип того что я туда не единичку просто передал, няша
Так в твоём коде тоже не будет проверок. TS проверяет это чисто линтером, можно убрать это поведение и будет как в обычном JS передавай че хочешь.
Ты изначально вообще понимаешь что в том же шарпе сущ типы данных во время выполнения кода? И почему вообще работает переопределение методов в ООП, ну чисто на уровне памяти компьютера?
Ты блять принёс функциональный код я принёс его же. Ты мне принеси пожалуйста ООП код.
он тебя не поймет.
он думает что если сигнатура подходит то все ок
и ему не пояснить что не ок - метод может быть переопределен, могут быть 2 интерфейса с одним именем метода и что в общем то нужно иметь возможность описать контракт чтобы классы знали чего от них ожидают - а это и есть собственно интерфейсы
> Ты блять принёс функциональный код я принёс его же
Надеюсь так ты доволен.
> Ты изначально вообще понимаешь что в том же шарпе сущ типы данных во время выполнения кода?
И толку?
> И почему вообще работает переопределение методов в ООП, ну чисто на уровне памяти компьютера?
Я не понимаю к чему ты это спрашиваешь? В контексте того, что интерфейсы - просто костыль. Ну, допустим - знаю. И чо?
>>2931841
Ну. А теперь ты приведи мне реальный кейс, когда у тебя класс - должен реализовывать 2-3 одинаковых интерфейса, иметь разное поведение, и при этом это должен быть один и тот же класс.
Типа чел. Ну срсли.
Давай разберем. Вот код
class MySupperMegaDupperOneToRuleThemAllPrinter : IConsolePrinter, IFilePrinter, ILogPrinter {
public virtual void Print(string text){...}
public virtual void IConsolePrinter.Print(string text){...}
public virtual void IFilePrinter.Print(string text){...}
public virtual void ILogPrinter.Print(string text){...}
}
Приведи хоть один реальный кейс, где это не говнокод и вообще хорошо.
Все эти истории про контракты это конечно на бумаге - весело и прикрасно. Но тогда давай, объясняй мне, на кой хуй при том что интерфейсы - не костыль, в любом коде через пару итераций - появляется адаптер, адаптер адаптера, прокси, хуекси и прочая залупа. Ведь КОНТРАКТ. Че эт такое-то? КЛАСС ЕМУ НЕ УДОВЛЕТВОРЯЕТ. И потому - мы делаем поверх одного костыля - еще несколько, чтобы как-то оно ехало. Отличная идея. Просто 11/10. Чтобы не нужно было обфускатор гонять, а просто в коде из-за кучи ненужного говна - никто и так не разобрался.
>2-3 одинаковых интерфейса
не одинаковых. интерфейсы разные. но у них может совпасть один метод.
и такое не редкость.
но придумывать примеры с потолка не хочу.
>где это не говнокод и вообще хорошо
ты сам придумал говно и хочешь чтобы я оправдал почему не говно. Впрочем ФАСАДНЫЙ класс может быть вполне и таким и не быть говном ибо он фасад.
>Ведь КОНТРАКТ. Че эт такое-то? КЛАСС ЕМУ НЕ УДОВЛЕТВОРЯЕТ
ну так удовлетвори. тебе ДАЛИ КОНТРАКТ и это твои проблемы кто его удовлетворит. Тебя никто не ограничивает в выборе кто же реализует контракт.
>А вот че делать в MinimalApi - не знаю.
Ничего. Минимал-апи - это хуйня для быстрого прототипирования, чтобы, когда нужно, по фасту накидать говнокода, проверить концепцию и пойти делать нормально.
> но у них может совпасть один метод.
В типах TS - нужно чтобы не только один метод совпадал. Если у тебя совпадает только один метод - а в остальном типы разные, то это разные типы и TS - пошлет нахуй. А если твой объект - полностью подходит под этот тип - то с фига он контракту-то не соответствует?
> Впрочем ФАСАДНЫЙ класс может быть вполне и таким и не быть говном ибо он фасад
Фассад, который каким-то интерфейсам удовлетворяет - это 99% говнокод.
Фассад - нужен только в случаях, если мы хотим скрыть сложность. Если ты делаешь фассад под интерфейсы - это говно какое-то.
> ну так удовлетвори. тебе ДАЛИ КОНТРАКТ и это твои проблемы кто его удовлетворит. Тебя никто не ограничивает в выборе кто же реализует контракт.
Так и в чем тогда смысл-то, лол?
Ну вот:
// лежит в чужой библиотеке
class A { public void print(string str) { Console.WriteLine(str); }}
// лежит в нашей библиотеке
Interface B { public void print(string str); }
class MyClass { void DoSome(string str, B b) { b.print(b); }
// теперь я просто с какого-то хуя должен делдать вот эту залупу
// хотя она нахуй не нужна, но я буду это делать, потому что - ну, надо
// проигрывая в скорости, проигрывая в памяти, зато интерфейс реализовал
public class AtoB : B {
private A _a;
public(A a) => _a = a;
public void print(string str) { _a.print(str); }
}
В тс - такой проблемы в принципе не возникнет никогда.
Ну да ладно. Видимо магический интерфейс - это что-то, что вам прям душу греет. Чувствуете себя в безопасности. Если для вас - костыли - это заебись. Ну, хули. Мне спорить не оч хочется.
> но у них может совпасть один метод.
В типах TS - нужно чтобы не только один метод совпадал. Если у тебя совпадает только один метод - а в остальном типы разные, то это разные типы и TS - пошлет нахуй. А если твой объект - полностью подходит под этот тип - то с фига он контракту-то не соответствует?
> Впрочем ФАСАДНЫЙ класс может быть вполне и таким и не быть говном ибо он фасад
Фассад, который каким-то интерфейсам удовлетворяет - это 99% говнокод.
Фассад - нужен только в случаях, если мы хотим скрыть сложность. Если ты делаешь фассад под интерфейсы - это говно какое-то.
> ну так удовлетвори. тебе ДАЛИ КОНТРАКТ и это твои проблемы кто его удовлетворит. Тебя никто не ограничивает в выборе кто же реализует контракт.
Так и в чем тогда смысл-то, лол?
Ну вот:
// лежит в чужой библиотеке
class A { public void print(string str) { Console.WriteLine(str); }}
// лежит в нашей библиотеке
Interface B { public void print(string str); }
class MyClass { void DoSome(string str, B b) { b.print(b); }
// теперь я просто с какого-то хуя должен делдать вот эту залупу
// хотя она нахуй не нужна, но я буду это делать, потому что - ну, надо
// проигрывая в скорости, проигрывая в памяти, зато интерфейс реализовал
public class AtoB : B {
private A _a;
public(A a) => _a = a;
public void print(string str) { _a.print(str); }
}
В тс - такой проблемы в принципе не возникнет никогда.
Ну да ладно. Видимо магический интерфейс - это что-то, что вам прям душу греет. Чувствуете себя в безопасности. Если для вас - костыли - это заебись. Ну, хули. Мне спорить не оч хочется.
Зачем тебе в этом примере вообще TS? Потому что он обеспечивает чисто проверку типов аля синтаксис кода?
Перепиши это на JS и у тебя не будет ошибок.
TS не имеет никакой системы типов, это просто синтаксисический сахар
причем тут блин типы
у 2х интерфейсов может быть один совпадающий по сигнатуре метод. и в классе он конечно имеет 2 реализации, но ОДИНАКОВЫЕ по сигнатуре
какой из них будет выбирать твой тс блин
и вообще что ты пришел с тс - это транслятор в жс, где совсем другая жизнь
>Фассад, который каким-то интерфейсам удовлетворяет - это 99% говнокод.
ничего подобного. ибо это ФАСАД. в этом его суть чтобы спрятать распределенную сложность иерархии за чем то одним простым, пусть даже с нарушением SRP ибо это ФАСАД
И КОНЕЧНО ЖЕ все интерфейсы которые были размазаны по каким то классам ПЕРЕЕЗЖАЮТ в фасад.
>Так и в чем тогда смысл-то, лол?
в том что интерфейс это контракт, который описывает ИСКЛЮЧИТЕЛЬНО нужный функционал
если мне нужно сварить борщ, то мой контракт описывает "сварить борщ" и мне знать не нужно будет ли это жена, соседка или проститутка (а может даже я сам или волшебник в голубом вертолете прилетит). Меня эти подробности не интересуют
ты же хочешь чтобы я приглашал целую бабу (причем с функцией варки борща) мне борщ варить. А волшебника уже никак или мне и это прописывать заранее? и себя любимого не забыть?
Мне эти лишние знания не нужны. Я выставил МИНИМАЛЬНЫЕ УСЛОВИЯ - и входящий тип меня вообще не волнует. Ну да, я получу виртуальный вызов - но в этом и есть суть, что я не буду знать кого вызываю ибо мне это НЕ НУЖНО ЗНАТЬ
>Ну да ладно. Видимо магический интерфейс - это что-то, что вам прям душу греет. Чувствуете себя в безопасности. Если для вас - костыли - это заебись. Ну, хули. Мне спорить не оч хочется
Ты понимаешь что в С#, С++, Java типы данных реально существуют во время выполнения? Каждый класс это реально отдельная вещь. В С++ вообще на этапе компиляции даже шаблоны создаются как отдельные типы данных по одному на каждый типизированый шаблон.
Интерфейс это синтаксисический сахар над абстрактным классом где есть только лишь методы. По сути это просто таблица виртуальных функций которая как есть записывается в любой дочерний тип.
Также интерфейс требует реализации его метдов.
В ЖС И ТС нет никаких классов вообще. Это просто утиная типизация и хуйня аля можно вызвать что угодно у чего угодно. Твой Printer это и есть интерфейс по сути.
да. интерфейс позволяет описать НЕОБХОДИМЫЙ МИНИМУМ который требуется, и не требовать знания типов
Даже есть принцип разделения интерфейсов. Это когда один общий интерфейс, допустим IЖена, дробится на "варитборщ", "прибирается", "сосет" и так далее.
и если тебя интересует какая то одна часть этого, то ты вполне можешь вызвать не жену и получить реализацию конкретного аспекта. Зачем ради одного действия жениться то.
так что да- интерфейсы это сила, главное не делать их перегруженными иначе смысл теряется.
Приперся в тред про С# и пишет а вот в ТС работа с классами лучше. Ну естественно наверное потому что там вообще нет классов
> у 2х интерфейсов может быть один совпадающий по сигнатуре метод. и в классе он конечно имеет 2 реализации, но ОДИНАКОВЫЕ по сигнатуре
Зачем твоему классу реализовывать два интерфейса?
> ты же хочешь чтобы я приглашал целую бабу
Нет. Я просто хочу утиную типизацию. Все. Если это выглядит как утка, пахнет как утка, крякает как утка - то мы можем предположить - что это утка. Все чего я хочу.
> Я выставил МИНИМАЛЬНЫЕ УСЛОВИЯ
Ты создал целый интерфейс и засталвяешь строить монструозную хуйню вокруг этого. Хотя тебе, как ты сказал - нужен только борщ.
Так почему не сделать так:
foo(borschProvider: { doBorsch(): void, setBorschColor(color: "green"| "red" )} )
Зачем ты меня заставляешь сверху нахуевертить всякого говна с адаптерами, хуяптерами и прочим? Чтобы что? Чтобы где? Чтобы вместо того чтобы 1 строчку кода написать - я написал 100500?
> Я выставил МИНИМАЛЬНЫЕ УСЛОВИЯ - и входящий тип меня вообще не волнует
Ну и чем в таком случае тебе тип из TS и его утиная типизация не подходит? Интерфейсы шарпа - тяжелее, они вынуждают как раз всю муру тащить с наследованием, вынуждают делать всякую срань с адаптерами и раздувать кодовую базу мусором всяким, который не относится к решаемой задаче.
>>2931976
> Ты понимаешь что в С#, С++, Java типы данных реально существуют во время выполнения?
> C++
Можешь не продолжать. В вопросе ты не разбираешься от слова совсем.
>>2931968
> Зачем тебе в этом примере вообще TS? Потому что он обеспечивает чисто проверку типов аля синтаксис кода?
Именно потому.
> Перепиши это на JS и у тебя не будет ошибок.
Ну. Перепиши свой код на ассемблер - у тебя тоже никаких проблем с интерфейсами и типами не будет, потому что процессору - до пизды че там придумали мясные мешки, говорят остановить выполнение - остановим, не говорят - погнали дальше. Дальше что? Че дальше-то, блядь?
> у 2х интерфейсов может быть один совпадающий по сигнатуре метод. и в классе он конечно имеет 2 реализации, но ОДИНАКОВЫЕ по сигнатуре
Зачем твоему классу реализовывать два интерфейса?
> ты же хочешь чтобы я приглашал целую бабу
Нет. Я просто хочу утиную типизацию. Все. Если это выглядит как утка, пахнет как утка, крякает как утка - то мы можем предположить - что это утка. Все чего я хочу.
> Я выставил МИНИМАЛЬНЫЕ УСЛОВИЯ
Ты создал целый интерфейс и засталвяешь строить монструозную хуйню вокруг этого. Хотя тебе, как ты сказал - нужен только борщ.
Так почему не сделать так:
foo(borschProvider: { doBorsch(): void, setBorschColor(color: "green"| "red" )} )
Зачем ты меня заставляешь сверху нахуевертить всякого говна с адаптерами, хуяптерами и прочим? Чтобы что? Чтобы где? Чтобы вместо того чтобы 1 строчку кода написать - я написал 100500?
> Я выставил МИНИМАЛЬНЫЕ УСЛОВИЯ - и входящий тип меня вообще не волнует
Ну и чем в таком случае тебе тип из TS и его утиная типизация не подходит? Интерфейсы шарпа - тяжелее, они вынуждают как раз всю муру тащить с наследованием, вынуждают делать всякую срань с адаптерами и раздувать кодовую базу мусором всяким, который не относится к решаемой задаче.
>>2931976
> Ты понимаешь что в С#, С++, Java типы данных реально существуют во время выполнения?
> C++
Можешь не продолжать. В вопросе ты не разбираешься от слова совсем.
>>2931968
> Зачем тебе в этом примере вообще TS? Потому что он обеспечивает чисто проверку типов аля синтаксис кода?
Именно потому.
> Перепиши это на JS и у тебя не будет ошибок.
Ну. Перепиши свой код на ассемблер - у тебя тоже никаких проблем с интерфейсами и типами не будет, потому что процессору - до пизды че там придумали мясные мешки, говорят остановить выполнение - остановим, не говорят - погнали дальше. Дальше что? Че дальше-то, блядь?
>говорят остановить выполнение - остановим
Процессоры так не умеют же. Будут nop жечь. Или я не прав?
>Зачем твоему классу реализовывать два интерфейса?
да хоть 10 или даже 100 и это норма. я показал тебе что интерфейс жена можно раздробить и класс жена будет все это реализовывать
>Я просто хочу утиную типизацию.
тогда крякай как утка. только шарп тут причем. в языках с такой типизацией свои правила.
>Ты создал целый интерфейс
да. я описал НУЖНЫЙ МНЕ контракт "сваритьборщ"
>засталвяешь строить монструозную хуйню
ничего тебя я не заставляю. я прошу предоставить КОГО УГОДНО кто сваритборщ и мне НЕ ХОЧЕТСЯ знать остальные детали кто это и откуда ты его взял.
> меня заставляешь сверху нахуевертить всякого
не заставляю ничего хуевертить. я прошу дать мне того кто выполнит МОЙ контракт (то есть сварит мне мой борщ)
а как там у тебя устроено - это твои личные проблемы. У меня вот адаптер крайне крайне редкий гость.
> случае тебе тип из TS и его утиная типизация не подходит?
1 это медленная херь
2 это не проверить толком на этапе компиляции. нужный класс может быть доступен далеко потом в рантайме из хуй знает какой сборки и точно так же получен через 10 слоев через которые проходит варщикборща
3 я уже говорил что может быть совпадение сигнатуры. И вместо того чтобы просто реализовать конкретный интерфейс - ты заставляешь меня писать адаптер из за 1 совпадающего метода.
>Интерфейсы шарпа - тяжелее, они вынуждают как раз всю муру тащить с наследованием
пункт 2 выше. мне совсем не улыбается потом в рантайме узнаь что оказывается сигнатура то не проходит. И вручную делать рефакторинг где IDE не может толком подсказать где менять методы не улыбается.
даже вот в питоне придумали протоколы (тот же интерфейс, но не нужно реализовывать), а ты со своим убогим тс все возишься
Да не умеют. Процессор всегда работает и гонит конвееер. Причём если процесс нормально не уведомит что он остановился то процессор никогда не переключится на другой процесс ведь ожидает когда процесс закончит дела. На одноядерном камне это буквально приводит к ступору всей системы наглухо, если смочь можно и на 2 ядерном также сделать.
Помнишь раньше зависание означало не что какая-то программа не отвечает, а что у тебя буквально компьютер перестал работать.
Ну на фронте реально непонятно зачем нужны все эти интерфейсы. Я посмотрю как он будет в игровом движке вызывать метод Update() у всех объектов сцены без интерфейса IGameObject
если ты пишешь на динам языке то тебе да -непонятно
но ты и пишешь там по другому
и платишь за это "рефакторинг жопный"
иначе ты пишешь на языке со стат типизацией и "рефакторинг кул, не нужно тесты писать ахуенно братан", но платишь за это если тебе нужно что то сильно переделать то у тебя просто не компилится них и 100 ошибок
тут 2 стула. лично я выбрал второй. и даже в питоне по максимуму записываю тайпхинты
а на жс я не пишу - я ж не говноед.
А теперь хочешь пушку? В Typescript вообще-то есть interface и он служит ровно тому что должен.
1) заставляет тебя реализовать его.
2) можно указать как параметр или поле где-то чтобы обозначить что вот тут требуется такое вот.
По сути тебе даётся гарантия что объект который ты получишь через параметр с типом интерфейса содержит поля и методы из него.
На этапе транспиляции в js все упоминания интерфейса будут удалены это чистый сахар.
и в чем пушка то
у тебя это опциональный инструмент для тех кто любит строгость (лично я ушел с руби (с его то выразительной мощью) на питон сменив лагерь на лагерь "строгие типы рулят" и помощь IDE лучше динамики)
в шарпе и прочих стат языках это БАЗА, а не костыль как ты там высказал. Они абсолютно необходимы чтобы все можно было доказать на этапе компиляции ( ну и рефакторинг видит все)
У нас начиная с 95 винды вытесняющая многозадачность.
Комп не виснет, когда виснет программа. Комп виснет, когда сдох супервайзор, который процессы переключает.
Премия за самое уродство отдаётся перегрузке методов, которые на самом деле один и тот же метод, а разработчик имеет анальный зоопарк аргументов непонятных типов и содержаний.
А процесс ОС у тебя наверное выполняется на каком-то другом месте, да? Не будет работать супервизор если все ядра процессора будут залочены зависшими процессами.
>Типизация тайпскрипта вообще убогая
Там её вообще нет. Просто статическая проверка, можно даже банально подавить эти ошибки и все.
Просто для примера в жебе - это вечный цикл.
Так я по поводу шарпа как бы спрашиваю. Тем более ты на котлине сам пишешь. Хули ебало корчишь?
так на котлине же. уже не жавист. смекаешь?
котлинисты в треде тут не срали
а вот жависты набегали и показывали свой "уровень развития"
откуда мне знать зачем ты спрашиваешь
можешь ты один из набегавших и просто ищешь очередной идиотский повод (ну у тех поводы были идиотскими)
>уже не жавист
Вот если б там была не жава виртуальная машина, я б еще понял. А так, по моему ты коупишь.
>откуда мне знать зачем ты спрашиваешь
Хочу понять в чем разница семантик.
>ищешь очередной идиотский повод
Не ищу.. Обещаю.
public class Rectangle {
static String x="10.54";
static double y = Double.parseDouble(x);
public static void main(String[] args) {
System.out.println(y);
}
}
//Мимо 45 летний дебил изучающий джаву.
>не жава виртуальная машина
жвм конечно говно, но речь шла про сахар. жавист со своим волосатым лобком всех достал.
>Хочу понять в чем разница семантик.
да кто ж ее знает тонкости рантаймов. тем более они меняются.
твой пример не зависнет.
вот тебе другой пример из инета
в 4.8 зависнет
в 8.0 не зависнет
Пасиба, значет я прав был, что гарантий на видимость нет.
>Разве изменения переменной bool visible для всех тредов
У тебя статическая переменная общая для всех объектов данного типа. Она глобальна в отношение всех потоков и объектов.
>volatile
это абсолютно логичное поведение. Статик поля общие для всего объявления типа с чего бы треды имели разные варианты типов? в С++ точно также, еще скажи "вау глобальные переменные доступны из любого места"
Нифига не логичное. Вот гарантии volatile из спеки жабы. По ней есть глобальная очередь синхронизации. Это как бы накладно по перфомансу, зачем просто бай дефолт это делать? И можно ссылочку на вашу спеку с гарантиями на static?
о жавист лобковый нарисовался
сколько уже сказано про стирание типов и отстуствие структур, а он все строит из себя....да долбоеба он строит.
а зачем нужны структуры? ну для удобства и GC не напрягать
а что такое удобство?
дам пример. допустим, у нас имадж и мы с ним работаем напрямую с буфером (что в общем то всегда нужно ибо это самый быстрый способ).
что мы имеем в шарпе? смотрим пик 1. удобно обходим буфер и без копирования получаем удобную работу с пикселями
что мы имеем в жаве. Структур нет и мы не можем получить пиксель и работать с ним типа pixel.A
а как нам быть? а по старинке? как деды в плюсах делали - достаем инт и распаковываем вручную чтобы получить 3 цвета (пик 2). И потом таскаемся с этими переменными отдельно ибо мы НЕ МОЖЕМ запихать их в 1 объект - он даст аллокацию.
и это самый простой пример
>>2932488
ты думаешь я не проверял. проверял. я хз че там у тебя не виснет. может ты вообще в дебаге проверяешь.
>>2932514
там написана не совсем правда. компилятор поставит барьеры и будет стараться чтобы не кешировалось. Но гарантии не будет. (так уж устроены процессоры)
Я даже не особо хочу пилить базу данных для этого микросервиса (он просто служит как интегратор с парой разных внешних эндпоинтов и под капотом делает немного логики).
Есть варианты простой проверки токена, или пилить JWT? Можно ли запилить JWT без SQL, с какой-нибудь нереляционной легкой БД?
Ну вот тебе поведение. Если хуйнуть туда sync, то появяца барьеры. Жеба их так просто не убирает конечно, но теоретически и х снести может легко. По идее шарп делает ровно тоже самое. В каком месте это хуйня не совсем ясно, это база как бы.
Что рисовать ебанутый? Ты реально думаешь я сидел в фотошопе редактировал чтобы на двач залить?
Ей богу проще хуйню придумать чем поверить что в интернете пишут хуету?
У меня разрешение как бы есть.
Бамп вопросу.
>это искусственный пример
да. простой искусственный пример для того чтобы показать эффект.
искусственность кода никак не отрицает наличие показываемого эффекта
Эффект показан? дело сделано.
так что твой довод смыт в унитаз.
>>2932582
ты человек без юмора вижу. все, больше с тобой не говорю. Я потратил на тебя время, а у тебя жавизм в крови
>Эффект показан? дело сделано.
Какой эффект? Что если писать говнокод с пустыми циклами тебя может не понять компилятор?
что именно он там не поймет? выбросит цикл? нет не выбросит
эффект того что изменение переменной в другом потоке МОЖЕТ БЫТЬ проигнорировано
этот код показывает это? да
унитаз там
Мы ебём что ли какой тебе уровень конфигурируемости аутентификации нужен?
Самый простой способ: пропиши ключ в web.config и заставь клиента слать его на каждый запрос в виде параметра в url. Типа /somemethod?param1=val1&key=yoba_secret_key
ну и пока был открыт редактор
>Добавь в while любое действие и не будет висеть даже в 4.8.
добавил. и даже сделал его не локальным чтобы никакой оптимизатор не смог его выбросить
висит аж бегом
зачем? я ж не имбецил
у класса есть четкая задача - посчитать количество итераций что он пройдет и сообщить мне
добавив вывод в консоль - я нахер сломаю саму сущность класса.
Там же в реализации лока... Мне почему-то кажеца, что ты тролль
Допустим я устроюсь на работу дотнет девелопером, и при этом упомяну что игры разрабатываю в свободное время - меня ссаными тряпками не забросают?
Что за тупые вопросы
>ЗП: 80к
ну само знание это одно, а вот что делать нужно - другое
у меня такая зарплата на подработке, но там я работаю 3 часа в неделю.
https://sharplab.io/#v2:EYLgHgbALANALiAhgZwLYB8ACBmABJgJlwGEBYAKAG8LdbcAHAJwEsA3ROAU12AHteANrgD6AMwGIA5gG4adJmw7dmAOzgiAxrwCuazo1nk6uObQXsu+KLgCyACgCUp3NSPG6AdwAWzAdzsAhGISkk5u7i7OEbTCWrpcjADUiYbRuAC+zpnk2UA=
Разный кодеген на разных .NET:
x64 (.NET 7) - считывает _flag только перед циклом, цикл - бесконечный
FW x86 (4.8) - считывает _flag каждый раз
FW x64 (4.8) - считывает _flag только перед циклом, и в цикле каждый раз проверяет считанное (т.е. неизменённое) значение, т.е. цикл всё равно бесконечный
Вообще код должен считать и проверить _flag только перед циклом и больше его не проверять (т.е. сделать бесконечный цикл), т.к. "побочных эффектов" внутри цикла нет.
https://sharplab.io/#v2:EYLgxg9gTgpgtADwGwBYA0AXEBDAzgWwB8ABABgAJiBGAOgCUBXAOwwEt8YaBhCfAB1YAbGFADKIgG6swMXAG4AsAChlxAMyUATOS7KA3svJHyfKKwnYMMcsAgRB5APoAzQdgDmipcfKHjp80trYhRyAFkqAAoASj8jA28fYwB3AAsha0iAQhc3d1jEpPIEoqMAXzjyCsLfGoCLK0pQsM0YypLSgBMIBmBhcmxyAF5yUi9S8jSM8mzcjwKJjomjQYBqEeoaMMtUmlFWJkjsaPHS6p9z40r6oKbwtTaapaTu3v7BkbHKnyn+2dd5t9jM8JmsRgA5CB8I4nIHlSqXIyVADaYRgGFSEE6AEl+IJImiMVjcXxBAB5PhsCBMXA0SHYpiCA4HfIAXWuZga1lefWskOhPPeC2BcMoAHZRqd4UpqkA==
Но почему здесь (в M1()) он загружает _flag каждый раз - я хз. Может, код такой, потому что у него размер меньше. Ну и JIT, даже в .NET 8, неидеален.
А вообще, не поставил volatile или не используешь барьеры - сам себе злобный буратино.
>
>Как часто ASP.NET Core девелоперы в своей рабочей биографии пересечены с разработкой игр?
>Допустим я устроюсь на работу дотнет девелопером, и при этом упомяну что игры разрабатываю в свободное время - меня ссаными тряпками не забросают?
Я никогда не позволю в моей команде работать моральному уроду, который писал что-то на Unity3d. Это для меня красный флаг.
смотря что писал. может он писал шедевры вроде "русы против ящеров"
пик 2 .NET 4.8 но в while есть Console.WriteLine();
пик 3 .NET 6 просто while
Мне лень, можете изучать
.NET 8 имеет другой IL код вот и все. Банально в ранних версиях нет защиты от говно кода типо пик2
сделаю предположение, что там требуется знания технологий да, но на уровне джуна конечно
а ты и де факто и будешь на старте изучения.
Конечно это нихера не секьюрно, но если у тебя сервис и клиент глубоко внутри анально огороженной зоны, то этого вполне достаточно.
>Думал о бэке, но все вакансии на бэк шарп это портал в ад. Требования: 20 десятка технологий (даже не преувеличение), знание петухона, пыха, среакт, уверенное знание древнегреческого. ЗП: 80к
Всю жизнь работаю бэк/фуллстек asp.net
Ни разу не требовали других бэк языков.
Никуда перекатываться не собираюсь.
Объект может не использоваться какое то время но он критический важен.
ну он утрировал конечно
но факт есть факт - лучше быть бэком чем фуллстеком. Еб...сь сами со своим фронтендом.
>Всю жизнь работаю бэк/фуллстек asp.net
А что ещё знать нужно, кроме asp.net? Попробую поковырять что ли месяцок, может зайдёт
>>2932721
>сделаю предположение, что там требуется знания технологий да, но на уровне джуна конечно
Не, это всё на мидла типа. Я не знаю, может в ДС вакансии на бэк адекватные, но в провинции это вот такой пиздец.
его будет удерживать контейнер, а контейнер тоже будет удерживаться кем то.
так что не удалит.
Ну это совсем мало. Я после чтения справки на сайте майкрософта пошел на собес, там обосрал джаву и сразу предложили 350к с авансом. Вопросов по си хэштегу даже не задавали.
но работаешь ты в итоге....на заводе? )
зы: зачем двач капчует сложные примеры если все равно влом считать в уме и кликаешь до простого
так то времена были другие. ковиды всякие, удаленки.
мне работа не нужна, но зашел в гугл глянул вакансии - и печально как то если ты не москва или спб
ну да, можно из дома щас у некоторых, но сложно оценить сколько получит именно джун.
Не очень понятно, почему она вообще должна быть. Это оптимизация и она работает.
>>2932723
Я, короче, вижу два варианта.
Basic Authentication (креды передаются в хедерах запроса, можно зашифровать, но я всё равно оставил только https).
Как здесь: https://dotnettutorials.net/lesson/web-api-basic-authentication/
JWT, как здесь https://www.youtube.com/watch?app=desktop&v=mgeuh8k3I4g&ab_channel=NickChapsas
Для моей задачи за глаза хватит Basic Authentication, но JWT написать будет поинтереснее лично для себя.
MyApp.Application
MyApp.Bootstrap
MyApp.Domain
MyApp.Infrastructure
Типа кроме Bootstrap - все библиотеки. Bootstrap - WebApi - проект.
Типа я думаю - в Infrastructure. Ведь это же инфраструктурная логика, приложению же вроде как должно быть пофиг - через HTTP запрос получили, чи через шину или GRPC.
Но.
1. Чтобы контроллеры нормально работали - приходится явно загружать сборку через Assembly.Load
2. Сваггер - настраивается сложнее(потому что сваггер - таки в Bootstrap)
3. Если сваггер и всю эту настройку перенасить в Infrastructure - смысл вроде теряется совсем.
А почему?
Лично мне вот не оч нравится, что WebApi - собирает все необходимое. И приходится - всю инфраструктуру делать public. Сразу возникает мысль - а нафига я тогда это все делаю, если могу напрямую из Application дергать нужное мне и не придумывать какие-то там абстракции и прочее.
Ну да ладно.
Интерфейс - это слой сам по себе. Ты не можешь переиспользовать контроллеры в другом виде интерфейса: консольке, десктоп гуе, очереди сообщений и даже в сервер-сайд рендеринг веб-сайте, значит они являются интегральной частью твоего веб апи интерфейса, а значит им место в веб апи проекте.
Потому что контроллер это ВЕБ АПИ не АПИ а именно прям конкретно веб. Это конечная точка, там даже базовые классы из дотНЕТ реализуют HTTP протокол и все что надо.
Если ты хочешь чтобы у тебя были доступны какие другие виды взаимодействия то ты должен написать интерфейс, не IZalupa а взаимодействия, с тем чем хочешь.
По идее у тебя должен быть слой абстракции тогда в виде интерфейсов через которые ты запускаешь бизнес логику. Просто инжектим где надо и пользуемся.
>Как часто ASP.NET Core девелоперы в своей рабочей биографии пересечены с разработкой игр?
Практически никогда.
У майкрософта в коде зоопарк на самом деле.
Всю впфную жизнь.
Используете множественное число или единственное?
Добавляете ли глаголы или действие определяете исключительно из типа запроса?
Пример на пике.
Какой вариант предпочтительнее?
>>2933706
Решил сказать почему.
В v1 Get, Delete и Patch имеют одинаковые сигнатуры, ну то есть если ты на клиенте случайно забыл сменить метод то можешь очень весело сосать.
Прикинь ахуено было бы вместо get(userId) был бы вызван delete(userId) прям на проде. Прям для абсолютно всех пользователей исходя из логики работы любой системы.
АПИ должно быть таким чтобы нельзя было случайно проебаться и получить 200 код в ответ.
V2 но имена сущностей во множественном числе.
>>2933481
Для души лучше годот или какой-нибудь еще немейнстримный движок или самому что-нибудь навелосипедить.
В геймдеве интересно только в трех случаях:
1) когда разбираешься в реализации каких-либо механик
2) когда разбираешься в каких-либо инструментах (тот же движок или как он устроен)
3) когда делаешь первые 30% какой-либо игры
Все остальное скучнейшая залупа. Для первых двух пунктов - юнити и UE слишком унылы, а для третьего вообще похуй на чем.
И не надо. Эти абсолютно всегда антипаттерн. Я никогда не видел реальные микросервисы. Зато много раз видел как есть 20+ микрозалуп которые имеют бешеную связанность между собой и по сути это монолит, в 100% случаев есть сервис оркестрации который для внешних пользователей и будет АПИ.
Плюс я лучше нормально напишу хороший монолит чем буду через HTTP или какие-то сервисы очередей передавать данные между частями системы.
Ну.
Смотри. Примерно так это выглядит. https://github.com/dotnet/eShop
Из почитать - куча книг есть. Можешь майковские статьи почитать.
На деле - проблема в том, что крутанские крутаны - не особо делятся внутренностями, в результате - у каждого свой зоопарк. А мелочь всякую на это подсаживают, чтобы продавать ажуру и AWS.
>>2934189
И как ты будешь монолит масштабировать, няша?
Вот у вас затык в одном конкретном месте. Допустим - из-за возросшего количества вообщений - воркер не успевает нормально обрабатывать очередь.
Что ты делаешь в микросервесной архитектуре - ты запускаешь второго, третьего, десятого воркера, разносишь из географически и живешь нормально.
Что ты делаешь в монолите - ты либо лезешь в залупу, либо бибу сосешь и страдаешь с тем, что тебе надо ВЕСЬ МОНОЛИТ разворачивать, либо - ищешь магов каких-то, которые тебе оптимизацию прям нихуевую сделают(а потом - все равно сосешь бибу, либо режешь на микросервисы).
А если упадет что-то. Че у тебя будет в микросервисном случае? Да ничего особого, все остальные куски приложения работают, после того как хелсчек не получишь - перезапустишь, если не перезапустится через какое-то время - отправим девопсу страшное письмо, пусть разбирается. Но все остальные части системы - продолжают работать.
С монолитом - у тебя упал монолит - у тебя все приложение нахуй недоступно, беги, нахуй, пондимать резервные сервера, беги трубить тревогу, все пропало, спасайся кто может. Ну и куча сложностей вокруг резервных серверов, которые надо всегда держать про запас.
Не. Я конечно понимаю, что если просто хуячить микросервисы, потому что модно-молодежно, не стоит. Если у вас - 100 пользователей, и в среднем система обрабатывает 200 запросов в сутки - то нахуй вам эти микросервисы не всрались. Просто как-бы. У кого-то так, а у кого-то час простоя - стоит довольно охуительных денег и
ебанутый
ну и зачем ты интерфейс написал?
>Решил сказать почему.
>В v1 Get, Delete и Patch имеют одинаковые сигнатуры, ну то есть если ты на клиенте случайно забыл сменить метод то можешь очень весело сосать.
>Прикинь ахуено было бы вместо get(userId) был бы вызван delete(userId) прям на проде. Прям для абсолютно всех пользователей исходя из логики работы любой системы.
>АПИ должно быть таким чтобы нельзя было случайно проебаться и получить 200 код в ответ.
Ну что это за цирк ёбаный, метод забыл сменить? Так можно и url забыть сменить.
И что за хуйня про продакшен? Такие баги ловятся при тестировании. Ты без тестирования релизить собираешься?
Плюс, если ссышься, напиши тесты.
>Ну что это за цирк ёбаный, метод забыл сменить? Так можно и url забыть сменить.
>И что за хуйня про продакшен?
Берешь копипаст делаешь и забываешь отредачить, особенно когда раз 40 это делаешь.
Часто пишешь тесты на вызов АПИ? Как данные мокаешь для этого?
Если ты забыл сменить урл то у тебя происходит ошибка потому что DELETE /item/id не существует 404.
Да спокойно на прод че угодно даже с тестами уходит, никто не запускает полный набор тестов перед каждым релизом, у нас их может по 2 в день быть если задачи быстро делаются. Полный регресс раз в месяц происходит.
Лучше на уровне архитектуры устранять возможность что-то неправильно сделать чем с умным ебалом рассуждать что вот надо было лучше ревью провести или тесты полные прогнать. Закон Мерфи нахуй, если у тебя одинаковые урлы для GET и DELETE то обязательно будет космический проеб и упаси тебя бог чтобы ваши админы делали бэкапы базы или у вас было мягкое удаление.
Ну. Пока я постил всякую хуйню которая легко гуглится и не требует RFC читать - я тоже немного припустил.
А потом - прикриплейд.
Да эта хуйня тупо тебе выжимку из интернета делает причём первых трех ссылок гугла.
Я пытался найти редкие запросы не осилив гугл и копилот маек мне выдал буквально цитаты из того что я читал и пояснения к ним.
Спасибо нахуй я наверное уже заебался гулить если решил спросить сетку.
{
int i = 0;
i++;
return i;
}
Всегда ли будет возвращено 1 если метод используют много потоков? Не будет ли такова что один поток сделает +1 а другой поток в это время сделает var i = 0; и первый поток вернет 0?
Ну. Давай думать.
Поток - имеет свой стек и контекст.
Поток - встречает метод который надо выполнить
Поток - сохраняет локальные переменные, всякую остальную залупу и текущее положение в свой стек
Поток - берет указатель на метод
Поток - прыгает в метод на который указывает указатель
Поток - заходит в метод
Поток - сохраняет в стек или что-то эмулирующее регистры значение i
Поток - увеличивает значение i
Поток - кладет в регистр или что-то их в .NET эмулирует значение которое возвращается
Поток - очищает стек от того что накидал в процессе прохода по методу
Поток - прыгает по адресу на вершине стека в то место с которого заходил в метод
Поток - выходит
В какой момент - может измениться значение i из другого потока?
А можно пояснить для маслят неопытных? Можно без особых подробностей.
На пикрилейтед - полная хуита? Или что?
На прикриплейд - буквально что-то в духе
я спросил бы анона: "Как познакомиться с девочкой", а он мне: "Просто берешь и без задней мысли - знакомишься"
Типа. Ну охуеть. Ответил. Спасибо. Пойду с этими знаниями пикапмастером становиться.
Алиса - лучше ответила кста. Но тоже хуевато.
>я спросил бы анона: "Как познакомиться с девочкой"
"Чтобы познакомиться с девочкой нужно говорить" вот так примерно.
Он дал абсолютно верный ответ как кодируется имя метода, но абсолютно бесполезный.
Запусти приложение пару раз с 3 потокам которые выводят результаты в консоли. Все на этом как бы эксперимент завершен.
Вообще в статик методах которые можно использовать в многопотоке принято делать синхронизацию потоков.
Снова принесли говнокод с вопросами.
> Вообще в статик методах которые можно использовать в многопотоке принято делать синхронизацию потоков.
Но тут она не нужна.
Если бы он обращался к разделяемым ресурсам - да. А тут - нахуя?
А бля она локальная, спать хочу уже надо идти.
В любом случае я собеседование прерываю обычно на таких вопросах. Давайте обсудим какие-то реальные вещи, а не залупу конскую. Может у вас есть какие-то примеры из работы? Ах бля у вас вообще нет работы с потоками акромя вызывать чтения файла? Так зачем вы мне мозги ебете.
Ну это скорее не вопрос а проверка моих знаний. Часто задаю вопросы на которые уже знаю ответ но что бы подтвердить его нужно другое мнение.
И как именно ты бы объяснил почему же результат гарантировано будет 1?
вообще можно что-то интереснее придумать. Вот на пике гарантировано будет усе ок. Почему?
Ну здесь же не статик метод, в конструкторе передаем 1 и всегда в многопотоке будет 1
В чем проблема экземпляр разнести по нескольким потокам. Че вы так к этому стейтик прицепились? Буквально практически нихуя не значит для многопоточки.
В душе не ебу что такое стейтик.
Я пишу код по наитию.
Наитие мне подсказывает что на 1 экземпляре запустить 10000 раз метод в многопотоке результат будет один и тот же.
Или я его неправильно использую?
Вообще есть список этой всей сладкой ебалы которая медленнее простыхне простых решений ? Я бы прочитал и никогда их не использовал.
Вообще общпя реализация рэндом гетитемс должна выдавать элементы без повторений. Вот реализуй такой "олд стиль" в нативе и сравнивай.
>На пикрилейтед - полная хуита? Или что?
Все эти нейросети-помощники тренируются на ПРИМЕРАХ, и чем их больше, тем точнее ответ.
Совершенно очевидно, что на платиновые вопросы, ответы на которые содержатся прям в первой ссылке гугла, у нейронки тоже есть ответ.
Но если тебя интересует какой-то редкий случай и не хочется перелопачивать весь интернет ради одной статьи, то тебе не по адресу т.к. нейросеть в таких случаях будет нести хуйню, либо что-то обобщенное.
всегда
локальные переменные всегда локальные для потока
так что хоть триллион потоков - результат будет один
/
многострочный
коммент
/
вместо
//многострочный
//коммент
Зачем студия ведет себя, словно c# это бейсик, не поддерживающий комментирование блоком?
Звездочки проебались
Ctrl+Shift+/
Нахуй не нужо. Джава мертвый язык, я не знаю проектов где кто-то начал его с 0 на ней, кроме двух говно компаний где после ебли заказчик пришёл к нам с просьбой переписать проект.
Да мы все и так давно знали что шарпомухам подходы к разработке белых людей нинужны. Ты на вопрос ответь.
Нафиг ты ему отвечаешь
У жавадебила обострение и галлюцинации что кто к нему в тред забегает
Ни одного шарписта в мире не волнует оверхед асинка
Начинал полгода назад. Казалось - так и надо.
Сейчас решил вернуться, ведь скоро отпуск - надо чего-нибудь намутить. И смотрю и кажется говном каким-то.
Хранить имплементации в одной куче с интерфейсами как-то по гейски. Ну а пихать туда же контракты, вообще по пидорски.
ну все. очередная стадия. спасет только завод.
А как вам моя структура?
Делал по наитию, пытался максимально все по файлам разбить, но как обычно, в конце понял что есть вещи которые можно было сделать лучше.
3 раз переписывать не буду.
Нууууу.
Я вот со своей расстроился потому что у меня возникла какая фигня в голове: А зачем я собственно разбиваю по: Сервис, модель вот это вот. Почему не разбивать по фичам? Типа: Уаправление пользователями - все что с ними связано - там. Авторизация - все эти JWT и прочее - там. Ну и в таком духе. Чтобы если надо - можно было выдрать кусок и копипастой сразу фичу впихнуть куда надо. Проблема только с "общими" штуками, которые не специфичны для фичи, но фича за них цепляется. Единственное что вижу - делать для фичи "порты", в которые сверху кто-то эти обще вещи будет пробрасывать, а фича на основе вот этой внешней логики - типа расширяться.
Ну а у тебя на вид - классическая структура с разделением по слоям. Только контексты - непонятно чому в модели лежат, их бы в DAL положить.
Я теряю в своей стоимости на рынке или не?
Просто ангуляр - мне нравился больше чем Vue. MSSQL - тоже больше чем PGSql нравился. Вот реббит - да, прикольная фигня, но я до этого и с gRPC нормально обходился, да и удобнее было с ним, ведь клиент и сервер генерировались по протобафу, а тут приходится как додик - свой велосипед использовать, чтобы контракты сообщений соблюдались.
В общем. Поясните - надо ли мне рыпаться и пытаться в свободное время утраченные знания восстанавливать, или то что сейчас использую - тоже оплачивается нормально на рынку?
>Я теряю в своей стоимости на рынке или не?
На каком рынке?
>Просто ангуляр - мне нравился больше чем Vue.
Что то, что это хуйня. Вот если бы ты на реакт перешел, то тогда чуть-чуть бы выйграл. А так, ты уже проиграл в том, что тебе приходится фулстеком быть.
>MSSQL - тоже больше чем PGSql нравился.
см пик. Плюс знание двух СУБД всегда лучше чем одной.
>Поясните - надо ли мне рыпаться и пытаться в свободное время утраченные знания восстанавливать, или то что сейчас использую - тоже оплачивается нормально на рынку?
Нормально, оплачивается. А еще больше оплачивается опыт по переводу сервисов с одного стека на другой.
В РФ, например, сейчас кейсы пересадки "Win -> Linux+Docker", "MSSQL -> PGSql", "Файлы -> Очереди" один из самых распространенных на дотнете.
Вот только я не понял, какого хуя у вас RabbitMq и GRPC противопоставляются. Они как бы для разных вещей. Rabbit - для асинхронного взаимодействия между сервисами, GRPC для синхронного, и они вполне могут в одном сервисе уживаться.
В проекте не видно экстеншенов для IServiceCollection, соответственно у тебя все сервисы собираются в Program.cs, соответственнно там срач. Нехорошо.
>как в гайде
В "гайдах" обычно показывают сам принцип того как это работает, но не обясняют как сделать хорошо.
Вот эти вот все AddSinglton, AddScoped и всю прочую дребедень с помощью которой ты добавляешь сервисы в контейнер и конфигурируешь приложение, принято выносить в отдельные расширения. Чтобы стартовый класс не был засран, плюс чтобы можно было все это разнести по слоям и/или подпроектам.
Как это красиво сделать? Пока думаю добавить в интерфейс IGraphicObject метод, который будет возвращаться IGraphicObjectFactory, где и будет происходить промежуточная отрисовка. Но это как по мне будет лишнее переусложнение.
Заведи кота же
ХЗ чего тебе надо, но я бы сделал так. Лол.
Ебать, это прям god object.
>>2940918
Помню на жабе подобное делал https://pastebin.com/deGpeBtY
Думаю сможешь на шарп перевести... А мне лееень. Но тут проблемы есть какие-то, но какие тоже не помню, давно делал
Впервые вижу такую инициализацию словаря
В постгре значения енамов записаны с нижним регистром, но в asp.net указаны по-обычному.
Сопоставление указал, написал контроллеры, вроде всё ок.
И в итоге это говно просто не выводилось. Сначала выдавало сообщение, что сопоставить значения не может, потом что такого значения enum в бд нет. Написал ебанутый конвертер с которым даже что-то заработало, но тут другая проблема вылезла - создать новую запись не получалось.
Я и с атрибутами игрался, EnumMember указывал, разные сопоставления пробовал (и даже без него лол), но сука нихуя не работает.
В интернете из похожего нашёл только то, что люди изменяли значения енамов в самой базе данных на верхний регистр.
Но блять, должно же быть решение, что бы по-человечески связывать енамы из entity framework со значениями из бд. Как это сделать? В чём я проебался?
> В чём я проебался?
В том что решил хранить в БД енамы
Делай как человек:
class MyDictionray
{
public int Id { get; set; }
public string text { get; set; }
}
Заполняй - из своего enum'а,
Почему так лучше? Потому что так ты снизишь вероятность рассинхрона базы и своего enum'а. ЕФ - ну никак не будет следить за тем, что ты решил пару элементов в енуме поменять, передвинуть местами, добавить, удалить. В результате - ты такой спокойно себе в приложении чет добавил, а потом - не вдупляешь, что за залупа тебе из базы лезет.
Если не хочется на каждый енум создавать таблицу - можешь поэкономить и сделать всего 2 таблицы: тип и собственно запись.
Да ты ебанулся. Это какой-то феерический манки кодинг, когда ты не запускаешь код, который поменял, и манки тестинг, когда никто не тестирует даже в общем виде создание/изменение/удаление сущности нового/изменённого функционала.
Я сменил 6-7 рабочих мест, и нигде такой пиздец не допускался.
Удивительно, что у вас вообще хоть что-то работает с таким подходом.
>Все, кто хранят значения enum в виде чисел, должны гореть в аду.
все кто хранят енум как строки, должны гореть в аду
переименуешь енум и все сломается
> Все, кто хранят значения enum в виде чисел, должны гореть в аду.
Это вообще тут при чем?
enum обычно используется там, где в домене определен какой-то набор константных значений.
Ну так вот. Хряня хоть в числе, хоть в строке - ты получаешь ситуацию, что у тебя рассинхрон БД и приложения. Начиная от того что ты опечатку сделал, заканчивая тем, что что-то добавилось в домен, что-то убавилось.
И что ты получишь, даже если ты в строке хранил? Ты получишь ситуацию, когда у тебя в таблице значения, которые теперь приложение обработать не в состоянии, потому что - ты поменял на уровне приложения что-то, миграцию забыл сделать, все, пиздарики, страдай.
Когда у тебя значения енумов - в таблице отдельной - ты автоматом получаешь и синхронизацию с приложением(ты же как нормальный человек - засеиваешь БД при запуске, проверяшь, что бд не корапченая и т.д.), ты получаешь проставление нужных значений, если у тебя домен поменялся, ты получаешь автоматически - корректировку енума, если ты опечатался или теперь в домене решили изменить название для того же элемента перечисления, оставив всю остальную логику.
Короче. Нормальный подход - то что должно быть енумом - должно быть отдельной таблицей. Если жмемся на отдельную таблицу для каждого енума - делаем одну супер-таблицу, в которой все значения енумов лежат(тогда правда ебатория с тем, чтобы таблицы, которые пользуют эти значения - не отражали доменную область, потому что из-за такого вот жмотства - ты вынужден городить либо триггеры, либо на уровне приложения следить постоянно, а это будет проблематично, если базой пользуются разные приложения)
Во-первых, у тебя такой же рассинхрон может быть по любому чиху. Добавил поле, убрал поле, сменил тип с дабла на инт.
Если ты каждый раз при апгрейде засидливаешь все енамы в бд заново, то можешь легко точно так же получить семантический рассинхрон. Меняешь местами два названия енамов, и всё, у тебя данные в БД некорректны.
Только это ещё хуже будет: если я в коде значение енама переименовал, то при попытке получения несуществующих данных будет ошибка, то есть есть шанс поймать это на этапе тестирования, а в твоём случае ты перестановку никак не поймаешь.
Если прям хочется иметь гарантию существующих значений енама в таблице данных, так, ладно, заведи свою таблицу енамов, только сделай ключом не инт/гуид, а строку. Можно её единственным столбцом и сделать.
А претензия к числовым значениям в БД у меня в том, что когда ты хочешь посмотреть, что у тебя за данные хранятся, надо либо смотреть в шпаргалку, либо каждый раз писать джойны.
>>2943249
>переименуешь енум и все сломается
А ты переставишь два значения местами и кирдык, см. выше сценарий.
> А претензия к числовым значениям в БД у меня в том, что когда ты хочешь посмотреть, что у тебя за данные хранятся, надо либо смотреть в шпаргалку, либо каждый раз писать джойны.
Ты из какого года капчуешь? Даже хейдискуль - умеет отображать что там за внешним ключем лежит, не говоря уже про всякие навикаты и прочие просмотрщики содержимого.
Чи ты как дед - ручками пишешь: Select Zalupa ftom Hui?
Если кому-то не было похуй на енумы, то я вроде их решил.
HasPostgresEnum не поддерживает передачу массива поэтому пришлось использовать атрибут PgName в коде свойств самого енама, что бы явно сопоставить значения из ef со значениями из бд. В коде Program.cs сопоставление через NpgsqlDataSource.
Выводится всё теперь корректно, а от всякого конвертирования вовсе удалось избавиться.
Непонятно правда, какого хулео в документации вообще про все эти нюансы не указано https://www.npgsql.org/efcore/mapping/enum.html?tabs=with-datasource
Пик1 - Енам в EF
Пик2 - Указываю его в контексте данных
Пик3 - У модели с енамом не использую никакого конвертирования, только указываю свойства
Пик4 - Маппинг в Program.cs
В классе TestControl, наследуемом от UserControl, я создаю RoutedCommand и привязываю ее к методу OnExecuteMyCommand:
MyCommand = new RoutedCommand(
. . . . . . . . "MyCommand",
. . . . . . . . typeof(TestControl),
. . . . . . . . new InputGestureCollection() { new KeyGesture(Key.F, ModifierKeys.Control) });
CommandBindings.Add(new CommandBinding(MyCommand, OnExecuteMyCommand));
Но хоткей Ctrl + F не запускает команду. Если я наследую какой нибудь Button, то все срабатывает. Сначала я думал что дело в отсутствии реализации интерфейса ICommandSource, но дело как будто бы в отсутствии фокуса. Если я опять же буду наследоваться от UserControl, но кнопку добавлю в качестве контента этого контрола, то хоткей срабатывает. Пытался поставить свойство Focused = true, но не помогло.
В чем дело?
Короче захуярил такую архитектуру. Рейт
Не понял сути проблемы. У тебя объект уже хранит в себе данные о точках. Что мешает добавить методы AddPoints? RemovePoints, InsertPoints, UpdatePoints как это делается во всех остальных рисовальщиках?
Я делал именно так.
Суть в том, анон, что если хранить только точки, то линию нужно будет перерисовывать при каждом их добавлении. Поэтому объект во время рисования должен хранить внутри себя битмап, на котором будет дорисовывать линию по мере появления точек. И уже этот битмап будет отрисовываться на холсте, видимом пользователям. А после окончания рисования и отрисовки финальной версии на постоянном холсте, он должен этот внутренний битмап очистить, чтобы память не занимал.
>то линию нужно будет перерисовывать при каждом их добавлении
Нет, ты ДОрисовываешь линию от предыдущего сегмента.
Но я не знаю как устроена технология отрисовки. Если это вектор, то рисуется только редактируемый сегмент, остальные сегменты остаются нетронутыми. Если это растр, то там вроде вообще нет как таковых данных о точках, кроме записи в историю действий.
Это первое.
А второе — то, что при масштабировании и скроллинге холста тебе полюбасу все видимое добро перерисовывать. В этом собсно вся и загвоздка всех этих редакторов, которые при 30 слоях формата 30 000 пикселей начинают лагать.
> Нет, ты ДОрисовываешь линию от предыдущего сегмента.
Нет, анон, если делать так, то линия будет с острыми углами, я рисую используя сплайн, для получения гладкой кривой. С ним я сначала дорисовываю линию, потом как появится новая точка стираю ее и перерисовываю с интерполированной.
Но это все не суть важно, главное тут то, что в процессе рисования холст будет постоянно изменяться, например если я рисую прямую линию или квадрат, то при каждом движении мыши нужно будет очищать холст и заново отрисовывать фигуру. И чтобы это не прописывать в коде я и хочу всю логику инкапсулировать в IGraphicObjectBuilder
> то линия будет с острыми углами, я рисую используя сплайн
Чел ... ну я подзабыл, что перерисовываются соседние сплайны, но у тебя никогда не будет перерисовываться что-то дальше соседних. Даже в режиме редактирования одной ноды, по факту должно активироваться указанная нода + две соседние.
А ты смотрел как устроен Canvas в WPF?
> Чел ... ну я подзабыл, что перерисовываются соседние сплайны, но у тебя никогда не будет перерисовываться что-то дальше соседних
Как я уже сказал, рисование линиями не ограничивается. Сплайны к слову тоже есть разные, для кубического нужно перерисовывать всю линию.
>для кубического нужно перерисовывать всю линию
Все что изменяется должно перерисовываться.
>всю логику инкапсулировать в IGraphicObjectBuilder
А что если один графический элемент идет поверх другого? Как твой IGraphicObjectBuilder будет знать о других объектах?
Я возможно ошибаюсь, но холст занимается отрисовкой, а не контент холста.
>Я возможно ошибаюсь, но холст занимается отрисовкой, а не контент холста.
Хотя я тут поразмыслил. Допустим холст отвечает за перерисовку. При добавлении контента в холст, он подписывается на изменение геометрии добавляемого контента (к примеру это будет VectorFigure).
В этом VectorFigure есть метод AddPoint. Далее этот метод вызывает событие изменения OnGeometryChanged, на которое реагирует холст.
Тут возникает вопрос, "а шо, холст должен хранить в себе все возможные методы отрисовки различных элементов?". Хороший вопрос.
Возможно ты прав. Надо смотреть как устроен Canvas в WPF.
Я только не понимаю, почему в WPF несколько контролов не могут одновременно держать один и тот же экземпляр графического элемента.
А зачем ему об этом знать? Объектами управляет сам холст, и он отрисовывает IGraphicObjectBuilder поверх предыдущего рисунка. Единственное, если нужно будет реализовать размытие или пиксилизацию или штамп, или ещё что-то, пиздец, то да, что-то нужно будет придумывать. Но это, имхо, уже больше к кистям относится, нежели к графическим объектам. Можно при начале рисования передавать контекст холста кистям, но если кисти он не нужен, то получается избыточность, да и откровенно сложно будет управляться с таким количеством перекрестных ссылок
как работает порядок исполнения кода в сишарпе? если я сначала опишу функцию, а только потом её инициализирую, компилер пошлёт меня нахуй, отделается варнингом или скажет малаца?
Привет, анончики.
Кто-нибудь использует мак для программирования на дотнете? Поделитесь опытом
Объясни толком, что конкретно ты хочешь сделать. В шарпе нельзя ни объявить функцию, ни инициализировать. Да и функций в привычном понимании в шарпе нет.
"Ты пытаешься втереть мне какую-то дичь"
>Да и функций в привычном понимании в шарпе нет
Тащем-та есть. Локальные.
Но инициализации и у них нет.
пропаганду запретили давно уже. а теперь и движение
а значит его членам не стоит говорить о том, что они члены этого движения
а разработка шарпа на маке - именно такое.
Ну ты конечно пчел.
https://github.com/BakaVaka/SampleClietnServer
Ты уже третий итт, кто пишет свой сервер с клиентом. Это на каких-то курсах нынче изучают?
Всмысле третий? Это все был я скорее всего. Мне почему-то прям нравится эта фигня с тем что приходят байтики, они парсятся, потом еще диспечеризацию какую-нибудь динамическую на основе аттрибутов навесить.
Единственное. Я не могу вот что придумать. Как эффективно сделать хуйню которую я в свое время видел в мине. Типа что на одном порту - несколько протоколов могут висеть, и типа логика такая, что ты можешь с одной стороны - миддлварь и по нему гонять байтики для парсинга, а потом - добавить отдельный обработчик - и к нему приходит копия того что натекло с сокета, и он уже может по своему пайплайну погонять.
Типа да. Можно просто копировать перед тем как отправить в какой-то пайплайн и каждому пайплайну копию. Но в моей голове - это какая-то фигня получается неэффективная. Вот.
Шарпоговнокод момент. Зато за геттеромакакинг покопротивляться успели, видите ли, то, что копрософт им с лопаты не скормил это всё нинужно и только код портит. Лол.
Ты реально это говно 50-строчное сюда притащил? У тебя проблемы с самооценкой? Почему ты просишь это оценивать? Я бы понял ты бы какой-нибудь мессенджер написал, или ещё что-то клиент-серверное, но это даже кидать стыдно.
У них там контекст контекстом погоняет и фичи туда-сюда сует. Сложно для восприятия.
Потому что по моему опыту реальных ревью, никто даже 1000 строк кода не будет смотреть. А если что-то среднее, тысяч на 60 строк кода, так вообще - будет два вопроса: 1) Где тесты? 2) Оно работает?
А я ревьюшечку хотел. Потому что меня уже задолбало, что на работе - никто мой код не ревьюит, всегда пишут: LGTM... А ревью хочу!
>Потому что по моему опыту реальных ревью, никто даже 1000 строк кода не будет смотреть.
Потому код-ревью в виде "проверять и искать ошбики в коде" - это хуйня из под коня и придумана инфоцыганами для вкатышей с курсов. Чтобы у них было ложное ощущение, что их никто не бросит и всегда будет им попку подтирать. Никто на реальной работе (кроме самых упоротых) этим не занимается. Аппрув на код-ревью в большинстве случаев означает, что ты не хуй с горы и мерджишь свой код легитимно, согласно какой-то запланированной задаче, а не по желанию левой пятки.
Т.к. подразумевается, что все профессионалы и умеют рабоать свою работу (это не считая всяких анализаторов в IDE, стайлкопов и т.д.)
Ну. Блин.
Я вот когда ревью провожу - как минимум пытаюсь вникнуть, что код должен был делать в контексте задачи. И доебываюсь, если вижу что-то в духе:
void Cancel(bool flag) => _canceled = flag;
Или когда код совсем какой-то непонятный - прошу либо комментарии написать, либо порефакторить, чтобы было понятно без необходимости лезть в таску или идти к разработчику, чтобы узнать, что это вообще такое и зачем оно так сделано.
Какие же шарподебилы токсики, пиздец просто.
https://github.com/BakaVaka/SampleClientServer/blob/master/src/Shared/Connection.cs
>var socket = new Socket(host.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
> try {
> await socket.ConnectAsync(host);
> return new Connection(socket);
> } catch(SocketException) {
> socket.Dispose();
> throw;
> }
using же блять есть
https://github.com/BakaVaka/SampleClientServer/blob/master/src/Shared/Connection.cs
> Func<Stream, CancellationToken, Task<T>> decoder
Функция должна глаголом называться. decode.
https://github.com/BakaVaka/SampleClientServer/blob/master/src/Server/Listener.cs
> var temp = new Socket(_listenerEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
Имя переменной должно описывать, что в ней содержится.
> // do nothing, this is server call stop
> catch( OperationCanceledException ) {}
Это какая-то хуйня. Корректное поведение не должно вызывать исключения. Попробуй остановку не через CancellationToken делать. Сделай просто метод Stop().
> // если нам нужен "рестарт" и мы хотим переиспользовать объект слушаетля
Не надо переиспользовать объект listener для других хэндлеров, это не какой-то карьерный самосвал. Просто делай новый. Засунь хэндлер запросов конструктор. Можно сделать Listener<T>, где T будет хэндлер запросов и инжектить его через DI.
Алсо, преждевременная генерализация это примерно так же плохо, как преждевременная оптимизация. Обычно, если у тебя есть сервер, обрабатывающий запросы, он одним и тем же способом их обрабатывает до посинения.
Это вот на таких картинках основано убеждение шарподебилов в том, что макакить гетсеты не так уж и плохо? По теме — больше года назад попробую, когда вышла 19 джава.
> Это какая-то хуйня. Корректное поведение не должно вызывать исключения. Попробуй остановку не через CancellationToken делать. Сделай просто метод Stop().
Я с этим полностью согласен, но майки это считают единственно верным способом остановки чего-нибудь в контексте асинхронщины.
>>2947692
Если я задиспозю сокет через юзинг в этом методе, то коннекшн при попытке что-то делать с ним - будет кидать ObjectDisposedException каждый раз, когда чет пытаюсь читать-писать в сокет. Потому сокет диспозится только если не удалось соединиться с удаленным хостом.
Метод стоп, который вызовет свой внутренний CancellationToken
То есть код цикла не изменится
Изменится лишь семантика остановки
Хотя в данном случае семантика стоп получше будет
Я правильно понимаю, что изучив C# я могу писать и бэкенд, и под андроид, и под айос, и даже игры? И всё это тут хорошо работает и за это даже можно получать кровавые доллары?
В целом - да.
Но как всегда с оговорками.
MAUI - для андроида и иос - говнина.
Бекенд - отлично.
Десктоп - для винды - отлично, кроссплатформенный - с оговорками.
Игры - если про юнити, я бы после всей хуйни- не стал. Плюс - везде где шарп для игр используется, там оч много отличается на самом деле и знание большого шарпа не совсем кладутся туда и наоборот.
Я бы по попе шлепал лучше...
Ну знаете, туториалы там https://docs.oracle.com/javase/tutorial/
Или спеки https://docs.oracle.com/javase/specs/
Даже про интегер не почитаешь https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html
Ну ничего, барену-то виднее!
Так если это не доки по спидгетсетингу и не гайд по пвп со сборщиком, какое это отношение к теме имеет?
Откуда я знаю? Сам какую-то поеботу выдумал, сам же возмутился. Мелкомягкие-то свои доки не блочили, все еще можно свободно взять и посмотреть, хотя из рф они якобы ушли. Думаем.
Я? Это же ты доки какие-то вкинул.
У меня в приложении есть 2 List<string> в которых может быть в общем 200к url адресов. Но бля это же не 2 гига же?
Собственно метод который я запускаю на скрине и то как я его запускаю семафор на 140 потоков.
Хотя в дебаге тоже есть утечка памяти но происходит она медленнее релиза
Вот думаю что это всё объекты HtmlAgilityPack, почему они не удаляются? Метод отработал, экземпляр класса уже нигде не используется же.
А тебе прям обязательно эти 200к строк держать в памяти разом? Что мешает выгрузить их в файл/бд, а потом по необходимости доставать?
Плюс. Про свой агилити-пак. Посмотри, мож там что-то диспосабл, а ты не диспозишь.
Про утечку. В классическом смысле она в шарпе - сложно реализуема. Ищи объекты, которые долго живут и при этом держат ссылки на что-то.
Да. Нахрен убери тредпул.
Делай как человек:
var tasks = Enumerable.Range(0, conceurrentWorkersAmount)
.Select( async x=> {
while(!cancellation.IsCancellationRequested){
await MyTask();
}
})
В памяти их держу для проверки ходил ли я по этой ссылке или нет.
Захожу на страницу, добавляю её в список пройденных ссылок, паршу все ссылки которые есть на странице, далее проверяю их в списке ходил ли я по ними или нет, если не ходил то в очередь на парсинг их добавляю. Если держать ссылки в бд то будет очень долго проверку делать. Ведь на странице может быть 20 ссылок, 140 потоков это дохуя запросов к бд.
У HtmlDocument нет Dispose.
Если я правильно понимаю то в памяти хранятся всё что спарсил HtmlAgilityPack и не удаляются.
Хм. ХММММ.
Смотрю И вижу что зеленым подчеркнуто в методе что ты в тредпуле вызываешь.
Предполагаю - это асинхронный метод.
Ты его не ждешь и сразу отжимаешь семафор.
Вангую, что падает из-за этого.
Вот так надо было?
Я просто думал что после await год не пойдет дальше и будет запуск по 1 задаче.
Вообще все эти авейт асинки магия для меня, пишу по наитию.
Надо было либо как в примере с линку.
Либо, если так уж хочется тредпула -
ThreadPool.QueueUserWorkItem( async (_) => {
var crawl = new Crawl();
await crawl.GoAsync();
semaphore.Release();
})
Я просто хочу в бесконечном цикле что бы запускались
var crawl = new Crawl();
await crawl.GoAsync();
И одновременно работало 140 копий, по завершению работы какой либо копии что бы подгружалась еще одна но максимум 140)
А трейд пул это жпт чат мне посоветывал)
Ну и что тебе мешает сделать так, если линку не хочется:
List<Task> tasks = new();
for(int i = 0; i < maxTasks; i++){
var t = Task.Run( async () => {
while(true){
try{
var crawl = new Crawl();
await crawl.GoAsync();
catch(Exception){}
}
});
tasks.Add(t);
}
await Task.WhenAll(tasks)
Это будет работать как раз через тредпул. И парралельно сколько надо твоих задач запускать.
дурачку пояснили уже что свойства в шарпе ОТДЕЛЬНАЯ ОСОБАЯ ШТУКА, а не тупо указание компилятору "сгенерь за меня геттеры и сеттеры"
но дурачок не понимает
Если ты по профиллировщику смотришь - то он не реальный размер памяти показывает.
Смотри в диспечере задач.
Ну да там и смотрю.
уже 1.6гб(
Может быть когда делается
while(true){
try{
var crawl = new Crawl();
await crawl.GoAsync();
catch(Exception){}
}
После выполнения объект crawl и всё что с ним связанно остается в памяти?
остается пока не будет скушано сборкой мусора.
Очередное напоминание, что в джаве нет свойств, и надо писать ажно по методу на каждый гет и сет, да ещё и поле заводить. Это куда больше бойлерплейта, чем в свойствах шарпа.
И да, есть ломбок, который может это сгенерировать, но
а) при добавлении логики придётся писать всё ручками
б) в джаве это было насколько убого, что аж пришлось делать целый тул кодогенерации
Для шарпа тоже мог бы существовать такой тул, который сам гет-сеты везде пропишет, но его никто не сделал. Знаешь почему? Потому что написать {get; set;} гораздо проще, чем
string m_fuckingField;
string getFuckingField(){return m_fuckingField;}
void setFuckingField(string value){m_fuckingField = value;},
и это никого не напрягает.
Я тут мимо пробегал.
По мне - свойства было лишним. Решил на днях на плюсах пописать ради восстановления знаний. И в принципе не возникло ситуации, в которой я по свойствам скучал особо.
Как и события и делегаты в том виде в котором их сделали(когда кто угодно откуда угодно может добавить свой обработчик, а ты ебись потом ищи, еще и по какой-то причине ссылку студия где добавляют обработчик не показывает, такой-то треш)
А вот рекорды - оч поздно завезли. Их надо было чуть ли не с самого начала вводить.
Где-то видел инфу, что в дотнете запилили что-то вроде контейнеров, как я понял заменяющих докер. Сразу не прочитал, а теперь не могу найти. Кто-нибудь в курсе?
Нагуглил. Если кому интересно - https://devblogs.microsoft.com/dotnet/announcing-builtin-container-support-for-the-dotnet-sdk/
Ну. Типа. Вот структуры в классических компилируемых языках имеют вид в духе:
struict {
int a;
int b;
char c[4];
};
И в памяти это будет выглядеть примерно так(упрощенно, ессно, про выравнивания и прочее не думаем):
[00,00,00,00,00,00,00,00,00,00,00,00] - пустая
[00,00,00,01,00,00,00,01,00,00,00,00] - с 1 первых двух полях структуры
А как в шарпе-то оно хранится? Что вообще в объекте класса-то имеется?
Ну, подозреваю, должна быть какая-то ссылка на тип который у объекта.
Должны быть поля класса.
У типа - должна быть какая-то таблица методов, методы должны еще наверное о сигнатуре сообщать как-то. Но это не точно.
В общем. Кто тут шаристый. Поделитесь знаниями.
>А как в памяти-то объекты хранятся?
В куче (heap)
https://endjin.com/blog/2022/07/understanding-the-stack-and-heap-in-csharp-dotnet
Просвещайся
https://devblogs.microsoft.com/premier-developer/managed-object-internals-part-1-layout/
https://devblogs.microsoft.com/premier-developer/managed-object-internals-part-2-object-header-layout-and-the-cost-of-locking/
https://devblogs.microsoft.com/premier-developer/managed-object-internals-part-3-the-layout-of-a-managed-array-3/
https://devblogs.microsoft.com/premier-developer/managed-object-internals-part-4-fields-layout/
>System.InvalidOperationException: The value of 'EntrepreneurInfo.Id' is unknown when attempting to save changes. This is because the property is also part of a foreign key for which the principal entity in the relationship is not known
спасибо я совсем забыл про dynamic
Зачем у тебя связи один к одному на этапе прототипа?
Типа если у тебя что-то привязано к какой-то там таблице, один к одному, то нихай и будет частью этой таблицы.
Я только начинаю. Пробую решать задачки (например на LeetCode). Завёл себе отдельный проект в Visual Studio для задачек. Посоветуйте, как правильно его организовать, чтобы каждая задачка была обособлена (в папке там или в файле). И когда наживаешь F5 - то запускается именно та задача, над которой сейчас работаю.
Плаваю в понятиях "решение", "пакет", "неймспейс". Пока не очень понимаю, как они друг сдругом соотносятся.
Чат GPT посоветовал сделать такую структуру
LeetCodeSolutions
│
├── Task001
│ └── Task001.cs
├── Task002
│ └── Task002.cs
└── ...
у меня в каждом файле TaskXXX.cs содержится метод Main(), поэтому не запускается.
Наверняка такой велосипед уже сто раз изобретали. Помогите плес
Пкм по решению, добавить проект, консольное приложение. Пкм по проекту, назначить запускаемым или как-то так. Новая задачка - новый проект.
Нахуй этим заниматься, если литкод все задачки сохраняет?
Кстати, шарпаны, а ваша студия умеет историю файлов сохранять? Вот пик. Или нинужна ибо гит?
при отсутствии множественного наследования (и слава богу) использование абстрактного класса должно иметь обоснование.
> при отсутствии множественного наследования
> (и слава богу)
Стокгольмский синдром как он есть
Плюс в возможности унаследоваться от двух классов, очевидно. Например от базовой вью модели и модели какой-либо сущности.
>Например от базовой вью модели и модели какой-либо сущности.
Какое же говно. Пиздец, надеюсь никогда в жизни не столкнусь с подобным кодом.
Почему же? Мне вот сейчас приходится передавать модель в конструктор вью модели которая унаследована в свою очередь от абстрактной вью модели с параметром - UserViewMode: AbstractEntityViewModel<User>, где абстрактная модель в качестве аргумента конструктора принимает модель заданного типа. При множественном наследовании я бы просто создавал сразу вьюшки и использовал в том числе как модели
Абстракный класс используется, если есть логика которую надо наследникам дать.
Если нужен только контракт - используется интерфейс.
Сущность это, хующность или еще что-то не важно.
когда в этом классе полно собственной логики что делает невыгодным имплементировать ее в каждом классе.
интерфейс же - не более чем контракт. И если тебе нужен только контракт, то зачем тебе абстрактный класс для описания контракта, если для этого придуман интерфейс.
>>2957021
проблемы весомее пользы, поэтому такого наследования много где нет.
любители наху...ить пусть идут в языки со множественным наследованием и там отрываются от души. чего они в шарп то пришли.
Вакансий на нём мало, но всё же они уже есть, значит, достаточно заматерел.
> себе сделать
В проектах для себя можно юзать хоть ноунейм васянские поделки.
Блазор заебись сделали. При серверной модели хостинга он теперь умеет комбинировать подходы к отрисовке страничек. Хочешь полный интерактив, хочешь mvc вьюху отравляй, хочешь сборочку с васм клиентом.
WTF успел выйти из моды, всех пытались заставить писать на UWP. Он мало кому понравился, все остались на WTF, а UWP типа легаси. Потом взяли Xamarin, выкинули оттуда поддержку линукса, назвали это MAUI и теперь заставляют писать на нём. Ещё есть сторонние Avalonia, Uno platform и Eto.Forms, они хотя бы поддерживают линупс. Как будто всё это говнище может сравниться с божественными винформами.
Веб
А вообще, MS такого высокого мнения о своих либах для гуя, что Visual Studio Code написали на электроне.
Впф сдох, а формочки на коне. А вообще встраиваешь в окно, которое тебе нравиться, webview2 и верстаешь на разоре.
Спасибо! То, что надо!
>>2956528
если литкод все задачки сохраняет?
Ну для себя же. Чтобы когда-нибудь вернуться к решению, может отрефакторить его.
А ещё вопрос. Много где слышал, что для того чтобы перестать страдать и начать нормально программировать, нужно как-то особым образом мозги повернуть. Особенно касается программирования в ООП стиле.
Можете пояснить, что это значит? Как у вас поворачивались мозги? Что лучше делать для этого?
Вот смотрю туторы всякие, пошагово переписываю их в IDE, вроде бы всё понятно и не суперсложно. Но как самому такое написать, сидишь тупишь, как обезьяна в мозгу Гомера.
В моде сейчас CLI
Писать код в блокнотах и онлайн редакторах удел челов без нормальной ide, у которой есть нативная поддержка твоего ЯП.
Допустим. Я бы хотел чтобы после сборки было что-то в духе
-app.exe
-appsettings.json
--packages
----Newtonsoft.Json.dll
----Npgsql.dll
Т.е. я все еще не собираю это в один огромный экзешник, а dll лежат отдельно, просто лежат они не в той же папке, где exe, а в отдельной папочке рядышком и не превращают каталог выходной в ебучее непонятное нечто.
Вот как мне такое сделать?
Делаешь post build event в котором перемещаешь, все dll-ки в нужный тебе каталог. Добавляешь в app.config приложения путь где оно должно их искать. Вроде как-то так. Раньше это работало, но не знаю будет ли работать в современном .Net-е
Только я бы не советовал так делать, т.к. можно поиметь кучу непредвиденных сайдэффектов.
Просто привыкни, что тебе должно быть насрать, что там в выходном каталоге находится. Учись работать с CI/CD механизмами.
Ну. Я немного приврал, что это меня бесит. Мне-то как раз пофиг всегда было.
А вот люди, которым доставляешь сборку - негодуют постоянно.
Типа они хотят типа чтобы было вот так:
app.exe
uninstall.exe
--doc
-----README
-----PatchNote
-----Instruction.pdf
----libs
-------lib1.dll
-------lib2.dll
--scripts
-----create.service.bat
-----start.service.bat
-----stop.service.bat
-----clean.bat
Я им говорю, что нахуй оно надо-то? Типа это же серверное приложение. Запустили, оно работает. Нех лазить в папки.
Мне говорят, что А ВДРУГ НАДО БУДЕТ, А НИХУЯ НЕПОНЯТНО.
Тогда просто засовываешь все что билдится в один из подкаталогов сборки, и прокидываешь ярлыки. Типа вот так:
app.lnk <- ярлык на основной экзешник
uninstall.lnk
--doc
-----README
-----PatchNote
-----Instruction.pdf
--bin <- вот тут будет вся сборка проекта
--scripts
-----create.service.bat
-----start.service.bat
-----stop.service.bat
-----clean.bat
>>2958405
>Мне говорят, что А ВДРУГ НАДО БУДЕТ, А НИХУЯ НЕПОНЯТНО.
А ты им скажи, что нехуй лазить туда тем кому НЕПОНЯТНО, пусть квалифицированные люди это делают.
В описании задания файлы эти нужно хранить в памяти, но потом там же есть условие что сервис должен быть стабильным, т.е. если после того как клиент отправил файл на конвертацию на сервер и сервер был перезагружен, то он должен иметь возможность вернуть сконвертированный файл обратно клиенту, но как это сделать если все хранится в памяти? Нихуя не понятно
Другой вопрос, в условии сказано что html файлы могут быть большими и конвертация одного файла может занять 3-4 минуты, но так как все методы асинхронные то оптимизировать больше нечего?
Ну то есть вот контроллер, вот асинхронный метод в репозитории, а вот и сам асинхронный метод библиотеки которая и конвертирует, насколько я понял добавить/улучшить больше нечего?
Я думал может при вызове библиотечного метода конвертации отправлять его выполняться в другой поток через await Task.Run, но потом нашел вот что:
>Async and await on ASP.NET are all about I/O. They really excel at reading and writing files, database records, and REST APIs. However, they’re not good for CPU-bound tasks. You can kick off some background work by awaiting Task.Run, but there’s no point in doing so. In fact, that will actually hurt your scalability by interfering with the ASP.NET thread pool heuristics. If you have CPU-bound work to do on ASP.NET, your best bet is to just execute it directly on the request thread. As a general rule, don’t queue work to the thread pool on ASP.NET.
Хотя вот в других туториалах вполне себе пихают CPU-bound таски в await Task.Run, но мне кажется слушать белого человека с 15+ годами опыта в асинхронности лучше чем блогпост Раджеша из Индии, но все же
И еще вопрос, есть ли необходимость использовать Concurrent коллекцию? Ведь может случиться так что два разных файла сконвертируются одновременно и возможно появится проблема с добавлением их в обычную коллекцию
Цитата говорит что не нужно планировать работу в потоке пула из запроса ведь ты и так находишься в потоке пула и можно работу просто выполнить.
А конвертить у тебя должен фоновый сервис который будет делать это в потоках вне пула (а то и в отдельных процессах)
Про хранение в памяти бред. Там должно быть про устойчивую к ребуту очередь конвертации.
>Есть тестовое задание написать сервис по конвертированию html в pdf
Это на какой грейд? И сколько времени дается?
> если после того как клиент отправил файл на конвертацию на сервер и сервер был перезагружен, то он должен иметь возможность вернуть сконвертированный файл обратно клиенту
Если прям так и написано, значит ты должен результат хранить где-то еще. Либо в базе, либо на диске, либо в редисе, либо еще где-то.
> в условии сказано что html файлы могут быть большими и конвертация одного файла может занять 3-4 минуты
Значит, что ты не должен как целиком загружать все это себе, а конвертировать "на лету" не дожидаясь полной загрузки.
Асинхронность - это не про оптимизацию, а про эффективное использование ресурсов железяки.
> добавить/улучшить больше нечего
Если спеки PDF ные знаешь, то скорее всего - есть че. Если берешь готовую либу и просто дергаешь оттуда метод - да, ниче уже не придумаешь.
> И еще вопрос, есть ли необходимость использовать Concurrent коллекцию? Ведь может случиться так что два разных файла сконвертируются одновременно и возможно появится проблема с добавлением их в обычную коллекцию
В базу пиши. Не выебывайся.
Теперь про код.
Я бы уже завернул сразу.
1. В контроллере у тебя ниче быть не должно связанное с логикой приложения. Получай через DI сервис, отдавай ему стрим, результат - заворачивай в свой JSON/XML/HTML что еще тебе там надо. А вот эти вот размазывания логики между контроллером и остальной логикой приложения - не нужны.
2. Никаких Console.WriteLine - используй логгер нормальный.
3. using - убери скобки, отвратительно смотрится.
4. Убери уродство с Request.Form.Files, по взгляду на сигнатуру контроллера - нихуя не понятно, чего апи ждет, сваггером не подергаешь и вообще хуйня какая-то
5. Для контроллеров - надо XML доки писать, чтобы в сваггере - было понятно что за хуйня и зачем.
6. IActionResult - сразу нахуй.
7. BadRequest на все эксепшины - сразу нахуй, это не ошибка клиента, если у тебя место закончилось
8. Не вижу тестов.
9. Если уж и хранишь результат в какой-то коллекции в памяти - храни в словаре, чтобы по ключу делать TryRemove(resultId, out var pdf).
10. Зачем тебе копировать стрим? Достал из запроса - передал этот же стрим дальше.
>3. using - убери скобки, отвратительно смотрится.
ФЛОМАСТЕРЫ.
не каждый сахар шарпа удобен
и вот это одно из них.
> Зачем тебе копировать стрим? Достал из запроса - передал этот же стрим дальше.
Копирование стрима это база базовая, ведь никогда не знаешь, что с этим стримом может сделаться, пока ты его сношаешь.поэтому бывает один и тот же стрим копируется чуть ли не десяток раз, хотя в действительности не изменяется
но ты ЗНАЕШЬ
ты знаешь что стрим тебе не нужен, а значит можешь его дальше передать. И если там кому то нужно сто раз его читать - то это его уже забота.
>4. Убери уродство с Request.Form.Files, по взгляду на сигнатуру контроллера - нихуя не понятно, чего апи ждет, сваггером не подергаешь и вообще хуйня какая-то
Разве можно получать сразу стрим с клиента? Или ты иммешь ввиду получить файл через скажем List<IFormFile> files и уже в репозитории его в стрим?
>>2960071
>6. IActionResult - сразу нахуй.
Почему? И какая альтернатива?
> Или ты иммешь ввиду получить файл через скажем List<IFormFile> files и уже в репозитории его в стрим?
Можно и просто через IFormFile. Без листа. Но да.
Почему? Потому что тогда сваггер - тебе красивенько нарисует кнопку с выбором файла и ты сможешь проверить свое апи без лишних телодвижений.
А сверху - тебе ASP провалидирует это дело и до обработчика даже дело не дойдет, если пришла какая-то лажа.
> Почему? И какая альтернатива?
Потому что непонятно что в результате вернется в случае успеха. Допустим, если у тебя какая-то легкая операция, которая ничего не мутирует - ты нормально можешь дернуть это апи, чтобы проверить. А если это вот такая тажелая фигня, или что-то мутирующее(например удаление/изменение), это просто неудобно(взял, нафиг, и удалил всю тестовую базу, теперь иди и заново засеивай ее)
Альтернатива:
ActionResult<Что ты там возвращаешь>
Или просто Что ты там возвращаешь.
Исключения, когда это что-то прям низкоуровневое что приходится прямо в Response писать. Но это редкость и не этот случай.
В коде что изначально был - только один файл берется. Предполагал, что это обговорено в описании задачи.
А так - да. Согласен, что в реальном использовании - лучше коллекцию использовать.
Пользуюсь cefsharp, голову уже сломал, но отправить этот mousedown на кнопку я не знаю.
Никто не подскажет ?
Вроде как додумался, брать относительные позиции xy и посылать евент туда
Не знаю насчет конкретно юнити, но вкатывание в геймдев в принципе такое себе.
Как мне с этим жить?
А главное, как мне его рефакторить?
Суть класса-то операция импорта данных из файла в приложение. Разбить на более-мелкие - можно, но это же бред, сам класс нужен ровно для одной фичи, и вот эти микроклассы которые получатся - будут просто фигней, которая расфосована по файликам, но нужна все для той же одной фичи.
Пожалейте меня. Пожалуйста.
>Разбить на более-мелкие - можно, но это же бред, сам класс нужен ровно для одной фичи, и вот эти микроклассы которые получатся - будут просто фигней, которая расфосована по файликам, но нужна все для той же одной фичи.
Можешь не разбивать, а оставить как есть. Подождать месяца 2 и потом вернуться к классу с целью что-нибудь там изменить/исправить/добавить.
Вот тогда ты себя уже не жалеть будешь, а материть и проклинать.
>>2962521
>А главное, как мне его рефакторить?
Начни сначала с выноса всякой повторяющейся мелочи в экстеншены и обертки/дто
Операция импорта из файла обычно делится на несколько этапов, которые достаточно независимы. Ну типа, парсинг файла, валидация спаршенных сущностей, мапинги, сохранение загруженных данных куда бы то ни было и т.д. Всё это можно в отдельные классы выделить. Смысл - меньше когнитивная нагрузка на читающего.
Шарпаны, какие неймспейсы предпочитаете: block_scoped или file_scoped ?
Везде го жаба и так далее, я понимаю что нг скоро и найма мало но все таки
Уже впечатление что надо в го перекат делать
мимо 2 года шарпов
или шарпы в рф нужны чтобы получить опыт и пиздовать горбатиться на западного барина?
Те что без скобочек.
Моя коричневая мечта - что и для классов сделают как для неймспейсов, учитывая, что 99% времени у тебя один файл - один класс. Так на кой хуй тратить место под эти отсутпы?
Почитал про go в очередной раз. Минусы, которые вынес для себя:
ждуну будут платить 50-80k (не больше, чем на любом другом языке)
вакансий столько же, сколько на C#
не получится устроиться чистым go-разрабом. Даже у Яндекс.Практикума на курсах в дополнение идёт второй "неочаровательный" язык (питон, php, js)
вывод - в 90% случаев будешь не гофером, а переводчиком с php на go
ещё один знакомый (ждун на go) моего знакомого поделился болью, что вынужден писать на Go монолит, вместо божественных микросервисов. Он привёл аналогию - это как на феррари ездить по московским 9-ти балльным пробкам.
энивэй, я всего лишь вкатывальщик на C#
> не получится устроиться чистым go-разрабом. Даже у Яндекс.Практикума на курсах в дополнение идёт второй "неочаровательный" язык (питон, php, js)
То же самое относится к шарпу
>То же самое относится к шарпу
Да нихуя. С приходом б-жественного .Core/.Net, как раз таки намного легче получается быть чистым бекендером. Я уже полтора года как никакого фронта не касался и реакт уже забывать начал.
Получается что стэк метода-обработчика структуры как бы внутри стэка метода-создателя и поэтому ничего не копируется и оба могут адресовать структуру пока исполнение не вышло за пределы метода-создателя?
Я правильно понял?
*само-апд
Вот пикча. за джс извени
Получается что пока с методом one() не распрощались, то его локальные переменные всё ещё висят в стэке?
(И теоретически доступны для two() и three(), ну и объясните если локальные переменные в one() изолируются two() и three() то примерно каким образом?)
Все так. С хвостовыми вызовами не совсем так. Параметры передаются в метод, их значения копируются ниже по стеку. Это могут быть значения, а могут быть ссылки-знаения. Например если ты вызовешь несколько методов, один из другого, углубляя стек, и будет передавать одно и тоже int значение (структуру) (например 5), то это значение скопируется в стеке столько же раз.
>Как будто всё это говнище может сравниться с божественными винформами.
Твое отношение поменяется, когда задача будет чуть сложнее создания кнопочки и текстбоксика. А если смотреть с позиции "оно и нафиг нам нинужно", то можно сидеть на vba 7.
Но перечисленные новиночки и в правду говно. Возможно только у авалонии есть шанс.
Application.Current.Dispatcher.Invoke(new Action(() => AddToColletion(item);
и оно работает, НО ТОЛЬКО НЕСКОЛЬКО РАЗ. Несколько раз отрабатывает и падает с
>Данный тип CollectionView не поддерживает изменения в своем SourceCollection из потока, отличного от потока Dispatcher
Как-будто поток просто перестаёт переключаться на главный
Пофиксил. Рефрешил коллекцию вручную вот таким способом раньше и забыл убрать, когда уже не нужно стало.
CollectionViewSource.GetDefaultView(MainCollection).Refresh();
Когда убрал, то почему-то начало работать нормально. Почему - хуй знает.
Так ты задачу-то не решил. Обновление все равно идет из диспатчера. Давай думай дальше.
>есть ли какой-нибудь онлайн компилятор
Дохуя их по запросу "C# online"
>или можно что-то в этом случае придумать
Скачай portable версию Visual Studio Code.
Это только к хвостовым относится?
И где ещё прочитать про работу замыканий в C# на низком уровне?
>>2968377
>Скачай portable версию Visual Studio Code.
И что ему с ним делать? По дефолту с виндой идут только .Net Framework (и те скорее просто рантаймы без SDK, ну или SDK максимум четвёртой версии).
https://learn.microsoft.com/en-us/archive/blogs/astebner/mailbag-what-version-of-the-net-framework-is-included-in-what-version-of-the-os
Kjk, это же самое тестовое только вчера закончил делать и отправил, а сегодня зашел в тред и тут такое
Нет, там речь шла про обычные вызовы, при которых стек углубляется. При неосторожной рекурсии можно получить переполнение стека.
При хвостовом вызове весь байт код выполняется в рамках одной записи активации, стек не растет. Обновляются локальные переменные. Каждый новый хвостовой вызов имеет дело с обновленными значениями переменных, при этом инструкции остаются те же. Переполнение стека исключено, можно "углубляется" в рекурсию сколько душе угодно.
Почитай Сидиристого dotnet book.
Про лямбды вот есть пост >>2729162
Крупные это яндекс-мыло-банки-озон-авито?
Чем тебе тот же додо не угодил? 2гис? Да много на самом деле вакансий.
А если взять то же производство - то на крупных просто дохуища вакансий(другое дело, что там опыт специфичный).
Просто многие крупные компании, которые шарпы используют - не айтишные, а это накладывает некоторые особенности. Это да.
Можно хоть в Program.cs все приложение сейчас писать.
А про лучше. Ну, вот тебе понадобится эта логика еще в каком-нибудь месте. Простой пример - в твоем приложении нужен будет шлюз чтобы через JSONRPC авторизоваться. Так сто лучше - вынести. Не понадобится, ну, и хорошо. А понадобится - потом может не быть время на рефакторинг.
Регистрация обычно делается через контроллеры, слишком уж она специфичная. Но аутентификация/авторизация предполагает некую миддлварь, которая пишется отдельно от контроллеров и срабатывает до передачи им управления.
Ну и клиент будет только веб.
Щито там специфичного, что в контроллерх делать надо и нельзя сделать какой-нибудь IIdentityService?
>>2968759
Ну. Как хочешь.
Просто кейс, когда надо будет потом делать какую-нибудь точку входя для OAuth, или наоборот для регистрации OpenID или еще чего-нибудь, не гори, что придется кучу копипасты хреначить и страдать.
Мы как раз уже месяц C#-backend-мидло-петушка ищем в команду. Только вот беда, что одни нихуя не знающие вкатунцы на собесы приходят. На столько вкатунцы, что я аж выхуеть не могу (типо девочки-тимлида, которая как aaync-await работает не знает, не говоря же об архитектуре). Хз чем анон ноет, если действительно шарит.
Мимо-озоноблядь
Ну это вряд ли придётся делать. Задача просто наваять сайт, куда наша компания будет загружать запрос на логистику и на него другие компании будут отвечать. Можно вообще не заморачиваться и ебануть два поля в бд: email, password и всё, но я хочу чтобы было хоть как-то по правильному. Вот решил asp.net Identity использовать и jwt токены, чтобы в react прокидывать
А почему не хочу в сервис выделять - лень + проект разрастётся. Щас у меня компакный проект, где минимум папок и т.д. Папка с сервисами всю малину попортит.
Хрюшу меняйте на мужика, желательно не пидора.
У нас такая же шляпа началась, как кун ХР съебал. Как только пизду выкинули на мороз и снова куна поставили - сразу нашли несколько нормальных человек.
Если честно, то хз. Я обычный разраб, мне такая инфа не доступна. У нас инфу по вилке только лид и вышестоящее начальство видят.
Почитал я про OAuth2, но так и не понял зачем мне он нужен. Мне же нужна простенькая авторизация по email/password. К тому же я уже использую jwt токены. Мб я что-то не понял, опыта то в этом вообще нуль
В общем.
Какая ситуевина.
Работал я над программулиной. На шарпе. Программулина - сервер.
Собственно. Разработал.
Все вроде как заебись.
НО. Возникла проблема.
1. Клиенты не хотят докер ставить(типа сервера на которые ставится моя хрень - не подключены к внешнему интернету, так что просто стянуть контейнер не получится)
2. Есть клиенты и с линуксом и с виндой.
При этом - качать сами по инструкции зависимости - тоже не хотят.
Говорят - хотим инсталлятор, чтобы далее-далее-далее-ок и все само.
Ну. Для винды - я взял и запихнул все с помощью InnoSetup. Вроде для винды решение ок.
Но для линукса - все еще остается проблема. Приходится писать шелл-инсталляторы, а там - такой, блядь, зоопрак. У кого-то деба, у кого-то редхат, кто-то на убунте, там учти что надо добавить PPA репки нужные, тут - скачай что-то.
При этом клиентам - весь этот юникс вей - до пизды на самом деле, им хочется чтобы поставил и работало.
В общем. Я, наверное тупой. Но разве нет какого-то инструмента, чтобы просто наклацал: дотнет, постгрес, нгинкс и вот этот вот архивчик поставь, из архивчика переложи в ~/server/www то что лежит в папке www, остальное - переложи в папку ~/server/back, создай демонов для постгреса и нгинкса.
Да. Проблема же еще в том, что программулина доступна на сайте, ее по идее кто хош должен иметь возможность скачать и поставить. Опять же с виндой - все ок. А как делать правильно в линуксе, чтобы не ебаться с зоопарком этих всех дистрибутивов - я так и не понял.
Докер сам никто ставить не хочет, няш.
Ну. Хм.
Вот давай подумаем. Можно ли это сделать с помощью стандартных инструментов.
Представим, что мы - синфьюжн и у нас еще нет этого навороченного листвью. Учитывая, что мы знаем, что в будущем сделаем - наверное способы есть.
Допустим, тебе нужна фильтрация. Ее нет из коробки.
Что бы мы могли сделать, имея некоторый опыт работы с интерфейсом других программ?
Ну. Например - сделать кнопку: фильтр, при клике на которую - будет попап, в котором бы можно было настроить фильтры. Настраиваем фильтры, жмакаем применить, фильтр применяется на вью-модельевскую коллекцию.
Далее - мы хотим еще поиск какой-то. Как это можно реализовать? Берем инпут в который можно вводить текст. Делаем кнопку с лупой. Если нажали кнопку с лупой и текст инпута не пустой - применяем какое-нибудь contains на коллекцию вью модели.
Для курсача - этого более чем достаточно.
Бывает ли такое, что за условные 5тыр в месяц человек доводит тебя с нуля (ну или с хеллоуворлдщика) до скиллов, позволяющих начать искать работу?
Имею ввиду, конечно, реальные скиллы программирования, а не как жёстко наябывать в резюме
Гугл выдает сайты getmentor, solvery и т.д. Интересует, есть ли итт люди, которые этим пользовались и пришли к успеху? Или успешные ASP.NET господа, практикующие менторство?
Не учился и не верю что кто-то с нормальными скиллами будет тратить свое время, чтобы реальные скиллы дать, если это не вуз.
По своему опыту - теория + много практики дают самый ощутимый буст.
Могу краткий гайд для фуллстека дать.
Теория
- Основы(системы счисления, структуры данных, алгоритмы, терминология, сети, и т.д.)
- SQL на уровне - создать БД с таблицами, базовые операции чтения-записи-удаления-изменения, разные виды JOIN'ов, нормальные формы(хотя бы до 3й), базовое администрирование(создать пользователя, настроить ему разрешения для ограниченного списка операций)
- Сам шарп + .NET(понимать, что это вообще за зверь, что такое CLR, общие вещи для .NET'а типа модулей, сборок и вот этого всего)
- ASP.NET Core - что такое, зачем
- Любой фреймворк для фронта из тройки(Angular, React, Vue), на уровне того, что ты можешь туду лист сделать и отправить запросики на сервер, получить жсончики в ответ и отрисовать этот самый ТуДу лист
- Докер
- Линукс на уровне - можешь подключиться по SSH, посмотреть логи grep'ом, посмотреть сколько там места на сервере, поправить конфиги через vim, создать сервис, положить куда надо сертификаты, обновить пакеты, настроить сеть
- Архитектура и паттерны(базово, можешь MVC назвать, MVVM, месседж бас)
Очереди(на уровне - можешь в докере подрубить ребит и 2 сервиса через очередь заставить общаться)
Практика - берешь и выбираешь любой проект который тебе интересно, если ниче не интересно - CMS/Интернет магазин/Автоматизация какой-нибудь библиотеки/IOT хуйня для умного дома.
Собственно, делаешь проект. Пока не сделаешь на том уровне, что сам бы пользовался хотя бы иногда. В процессе - набиваешь шишки, понимаешь, нахуя вся хуйня вообще нужна.
>что за условные 5тыр в месяц
За 50К в месяц я был бы готов уделить тебе максимум по 4 часа в неделю (разово или разбитыми на 2 части). Сам подумай сколько нихуя ты получишь за 5К.
Скилы позволяющие начать искать работу (именно 'начать искать', а не 'найти') набрать в таком режиме можно где-то за полгода-год. При условии, что ты не тупой, имеешь хоть какую-то базу в программировании и готов сам ебашить все свободное время, чтобы научиться.
Мимо, успешный ASP.NET господин.
Чёт слишком дохуя ты свое время оцениваешь. Тебя на работе меньше ценят, уёба. 3к в час блять. Соси хуй и отвечай бесплатно в треде, инцел.
Я не он, но оценка более-менее справедливая. Нормальный разраб с опытом получает около 250к в месяц. Это, при 23 рабочих днях в месяц и 8 часовом рабочем дне даёт где-то 1.35к в час. Учитывая, что менторить вкатунца придется после работы, то это должно идти по сверхурочной ставке, тобишь x2. Вот и выходит 2.7к ч в час.
Но будем честны, вкатунец даже косарь в час скорее всего не потянет.
Чел. Время после работы - это личное время, и задешево его проебывать - никто, имеющий нормальные скиллы - не будет.
Тем более, что для нормального менторинга надо:
Оценить уровень
Составить программу в зависимости от уровня долбоеба
Составить задания
Следить за выполнением
Выяснять че долбоебу не понятно
Подсказывать
Разбираться в его говнокоде
Плюс - это требует от того кто менторит - желание именно учить.
Лично я бы дешевле чем 100к в месяц, по 5 часов в неделю(по часу в день, либо 2.5 в выходные вечером). И то, только если бы увидел, что чел реально мотивированный и будет то что я ему даю - делать по 6-8 часов в день сам, а я - только проверять и корректировать, отвечать на вопросы.
Ну а если бы я просто хотел заработать - мне проще связаться со знакомыми и взять на выходные халтурку. Там не нужно объяснять, готовить что-то, просто взял, сел и сделал, получил денежки и пошел по делам.
>Там не нужно объяснять, готовить что-то, просто взял, сел и сделал, получил денежки и пошел по делам.
У меня проще взять дежурство на выходной во время накатки релиза. Из обязанностей только быть на связи (я на удаленке) и отвечать ребятам с прода на вопросы по установке сервисов. Иногда подкинуть им пару конфигов или скриптов для базы если они забыли. Все остальное время сидишь и занимаешься своими делами, хоть в игры играй, хоть сериалы смотри. Можно вообще куда-нибудь из дома свалить, главное ноут с собой взять.
8 часов практически нихуя не деланья = +20К
>>2970250
Да мне похуй, когда он там будет жопу свою поднимать. Че блять если вы на подработку устраивайтесь в такую же позу встаете, хуе мое, личное время, давай х2. Нахуй вас пошлют.
Тут тоже работа, пошел бы он нахуй с такими расценками, проще стажером пойти, и вообще нихуя не платить, а этот уеба будет забесплатно слушать мое нытье и терпеть.
> если вы на подработку устраивайтесь в такую же позу встаете, хуе мое, личное время, давай х2
Ну как бы да. Обычно, когда всякие халтурки беру, то делаю по более высокой ставке, чем если бы просто работал. В большинстве случаев люди это понимают и относятся нормально.
> проще стажером пойти, и вообще нихуя не платить
Так нихуя не умеющего вкатунца даже стажёром не возьмут. Нахрена на него свое время тратить, если он самых базовых вещей не умеет
Если хочется дешевле, то welcom на всякие курсы от всяких скиллбоксов и гикбрейнсов. Там тебя поменторят.
>Да мне похуй, когда он там будет жопу свою поднимать.
Тебе похуй, ему тоже похуй. Все при своих остаются.
>Че блять если вы на подработку устраивайтесь в такую же позу встаете, хуе мое, личное время, давай х2.
Так а смысл брать вторую работу за такие же или меньшие бабки, если их можно и на основной работе получить, просто за переработки или доп. задачи? Подработку как раз и берут, когда нужно срубить денег побольше и побыстрее.
>проще стажером пойти
В 2023-м? Ну удачи, чо. Расскажешь потом.
О, спасибо, няш!
А что из этого можно опустить или наоборот, минимум, который нужно оставить, если только на БЭКА учиться?
>если только на БЭКА учиться?
Лол, это по сути и есть минимальны стек на бэкендера. Из того, что я вижу можно выкинуть разве что MVVM, ну и из js фреймворков оставить только один, реакт например.
.NET Developer
ASP.NET MVC Developer,
ASP.NET Core Developer
чем они, блять, отличаются? Особенно последние два
встречается ADO.NET. Это что-то устаревшее?
>встречается ADO.NET. Это что-то устаревшее?
Это база на которой по сути работают и EF и даппер и прочие ормки.
Знать хотя бы поверхностно её лишним не будет, просто хотя бы для понимания, что там под капотом происходит. Но если тебя на собесе будут на полном серьезе про то как она работает спрашивать, с прицелом на то, что "у нас все на чистом ADO.NET работает", то съебывай оттуда нахуй, без оглядки.
Почему нельзя? В кейклок условно это все делается установкой пары галочек. Кстати, а нахуя вы сами велосипедите сервера авторизации?
А есть готовые? Я просто хз, впервые делаю проект коммерческий, поэтому не хочется проблем с оплатой лицензий и т.д. Знаю, что есть IdentityServer4, но по-моему он больше не поддерживается, а последующие версии платные.
Э. А я хочу на шарпе всё. Тем более я уже сделал регистрацию/авторизацию/смену пароля/аллаха на Identity ASP.NET Core. Просто хочу прикрутить OAuth2. Там мне выше кто-то написал, что это всё (Identity ASP.NET Core) хуйня и надо OAuth заделать. Вот сижу и думаю, как это правильно сделать
>А я хочу на шарпе всё.
Ну сделают на шарпе сервер авторизации такого уровня, тогда и приходи. А так, вроде он не сложно интегрируется https://nikiforovall.github.io/aspnetcore/dotnet/2022/08/24/dotnet-keycloak-auth.html
Но я хочу сам сделать. Я уже в курсе, что есть готовое решение в виде кейклока
Собственно. Проект с Api - нужен чтобы внешнему консьюмеру давать данные. Проект QueueWorker - нужен чтобы отделить запись и чтобы если сервис не лег если много кто-то и часто писать будет.
Стоит ли делать третий проект для внутренних апишек, типа это могут быть и запись и чтение, но в специальном формате, который не идет наружу, а нужен для какой-то специальной логики внутренним сервисам?
Или это все я хуйней страдаю и переусложняю, а достаточно было один проект сделать и в нем все хуярить?
Чел, ну ёмана. Из тех кто здесь сидит (да и вообще тех кого я знаю) онлайн компиляторы нужны примерно никому, поэтому для того чтобы дать тебе совет, это нужно лезть в интернет, пробовать каждый, изучать и т.д. Кому это нахрен нужно.
Ты сам давно уже мог ввести в поиске "C# online compiler" и пробовать их изучать и работать.
Со своей стороны могу посоветовать, если есть планшет на андроиде, то можешь попробовать вот это:
https://4pda.to/forum/index.php?showtopic=1009215
Там нормальная IDE с автодополнением. Можно ставить нюгеты, поддерживает даже ASP.NET и можно там же компилить и собирать, есть куча примеров и уроков.
Сможешь внятно объяснить, чем эти горутины/виртуальные треды лучше TPL?
Аргументы?
Извините, я только учусь и очень туго соображаю. Я вот прочитал и вроде как можно сделать портабл вариант Visual Studio (флешку к ноуту подрубить можно). Это рабочий вариант?
using System;
public class A
{
public int t;
}
public class B : A
{
}
class Program
{
static void Main()
{
A a = new A()
{
t = 3
};
B b = a as B;
Console.WriteLine(b == null);
}
}
Потому что a ссылается на объект типа A, а не B, и as не может привести тип к B, поэтому возвращает null.
Привести что угодно к какому угодно типу нельзя, здесь не джаваскрипт и не питон. Можно привести к реальному типу объекта или его предку, но не к потомку, и не важно, что в потомке нет новых полей.
>B b = a as B;
Рискну предположить, что b == null, т.к. ты создал переменную b, но не проинициализировал её. Т.е. наверн надо написать B b = new a as B
Потому что нельзя родительский тип привести к наследуемому типу.
Теперь давай думать, а почему.
Можно метафору представить. Вот представь, что у тебя есть некий абстрактный транспорт, который может ехать. Вот, ты создал этот транспорт. А теперь идешь и говоришь всем, что это вертолет. Люди смотрят, видят, что ехать-то может, а винтов не видят, кабины не видят.
А можно не метафору а попробовать подумать, как это примерно должно работать для компуктера в упрощенном виде(это не совсем то как оно работает в реале, но для наглядности).
Вот допустим, у тебя есть некая структура данных в памяти вида:
struct A{
int t;
void⋆ ctor1;
void⋆ destructor;
void⋆ methodsTable;
void⋆ virtualMethodsTable;
}
struct B{
A⋆ parentGuts;
void⋆ parentCtor1;
void⋆ ctor1;
void⋆ destructor;
void⋆ parentMethodsTable;
void⋆ methodsTable;
void⋆ virtualMethodsTable;
}
Ну так вот. Как видишь, структура B - знает что она наследник A. А что это значит? А это значит, что в принципе - никакой сложности с тем, чтобы использовать B как A - не возникает и мы легко приводим тип к родительскому.
Но вот структура A - ничего о наследниках своих не знает. Даже если они пустые и нихуя в них нет. Как компуктер догадается, где что должно лежать для струткуры A если мы хотим представить ее как B? Никак не догадается в обычном случае, если мы хитрые колдунства совершать не будем.
Потому что нельзя родительский тип привести к наследуемому типу.
Теперь давай думать, а почему.
Можно метафору представить. Вот представь, что у тебя есть некий абстрактный транспорт, который может ехать. Вот, ты создал этот транспорт. А теперь идешь и говоришь всем, что это вертолет. Люди смотрят, видят, что ехать-то может, а винтов не видят, кабины не видят.
А можно не метафору а попробовать подумать, как это примерно должно работать для компуктера в упрощенном виде(это не совсем то как оно работает в реале, но для наглядности).
Вот допустим, у тебя есть некая структура данных в памяти вида:
struct A{
int t;
void⋆ ctor1;
void⋆ destructor;
void⋆ methodsTable;
void⋆ virtualMethodsTable;
}
struct B{
A⋆ parentGuts;
void⋆ parentCtor1;
void⋆ ctor1;
void⋆ destructor;
void⋆ parentMethodsTable;
void⋆ methodsTable;
void⋆ virtualMethodsTable;
}
Ну так вот. Как видишь, структура B - знает что она наследник A. А что это значит? А это значит, что в принципе - никакой сложности с тем, чтобы использовать B как A - не возникает и мы легко приводим тип к родительскому.
Но вот структура A - ничего о наследниках своих не знает. Даже если они пустые и нихуя в них нет. Как компуктер догадается, где что должно лежать для струткуры A если мы хотим представить ее как B? Никак не догадается в обычном случае, если мы хитрые колдунства совершать не будем.
Ты должен понимать, что А : B это не какой-то единый организм. А может существовать как отдельный независимый класс и у него может быть очень много наследников. Но вот у B наследник конкретный.
Когда ты инициализируешь B, то он инициализирует сперва родителя A, потом сам себя. В итоге ты можешь обращаться как к B, так и А. Ты можешь сам это проверить, добавив вывод в консоль в обеих конструкторах A и B какой-то текст, затем посмотреть что происходит.
public class A
{
public A()
{
Console.WriteLine("Constructor A");
}
}
public class B : A
{
public B()
{
Console.WriteLine("Constructor B");
}
}
Если ты создашь новый экземпляр A, то в консоли будет это
Console.WriteLine("Constructor A");
Если ты создашь новый экземпляр B, то в консоли будет это
Console.WriteLine("Constructor A");
Console.WriteLine("Constructor B");
А если сделать наоборот? Ну предположим, что при инициализации A, инициализируется наследник B. Почему бы так не сделать? Теоретически все норм, но что если у тебя сотни наследников разных типов: C, D, R, F, J и т.д. ? Какой из них инициализировать? Все сразу? Ерунда какая-то.
Или представь, что ты создаешь еще один класс-наследник, работа которого зависит от параметров в его конструкторе.
public class Zalupa : A
{
public Zalupa(string lastName, string firstName){. . .}
}
Мы видим, что невозможно создать новый экземпляр Zalupa без ввода параметров lastName и firstName. Но ты берешь и инициализируешь класс A, а потом пытаешься при помощи него добраться до класса Zalupa, у которой нет информации о lastName и firstName.
A a = new A()
Zalupa z = a as Zalupa;
Тут как минимум нужна машина времени или хз что.
Ты должен понимать, что А : B это не какой-то единый организм. А может существовать как отдельный независимый класс и у него может быть очень много наследников. Но вот у B наследник конкретный.
Когда ты инициализируешь B, то он инициализирует сперва родителя A, потом сам себя. В итоге ты можешь обращаться как к B, так и А. Ты можешь сам это проверить, добавив вывод в консоль в обеих конструкторах A и B какой-то текст, затем посмотреть что происходит.
public class A
{
public A()
{
Console.WriteLine("Constructor A");
}
}
public class B : A
{
public B()
{
Console.WriteLine("Constructor B");
}
}
Если ты создашь новый экземпляр A, то в консоли будет это
Console.WriteLine("Constructor A");
Если ты создашь новый экземпляр B, то в консоли будет это
Console.WriteLine("Constructor A");
Console.WriteLine("Constructor B");
А если сделать наоборот? Ну предположим, что при инициализации A, инициализируется наследник B. Почему бы так не сделать? Теоретически все норм, но что если у тебя сотни наследников разных типов: C, D, R, F, J и т.д. ? Какой из них инициализировать? Все сразу? Ерунда какая-то.
Или представь, что ты создаешь еще один класс-наследник, работа которого зависит от параметров в его конструкторе.
public class Zalupa : A
{
public Zalupa(string lastName, string firstName){. . .}
}
Мы видим, что невозможно создать новый экземпляр Zalupa без ввода параметров lastName и firstName. Но ты берешь и инициализируешь класс A, а потом пытаешься при помощи него добраться до класса Zalupa, у которой нет информации о lastName и firstName.
A a = new A()
Zalupa z = a as Zalupa;
Тут как минимум нужна машина времени или хз что.
Э. Стой. сервак авторизации, который я пытаюсь запилить - это вообще отдельное приложение, которое запускается отдельно. Основное приложение, где планируются круды по слоистой архитектуре сделано и на него будет переадресация после авторизации на сервере авторизации. А вообще всё можно в одном проекте захуярить, меня никто не контролирует в этом плане да и некому, я тут единственный (на работе), кто может хоть что-то написать, помимо 1C программистов
Вернее переадресация будет на фронт, который планирую на реакте написать. А вот уже с фронта круд запросы будут на бекенд поступать
Курс называется "ASP.NET Базовый".
И, что-то чувствую, подвох. Скажите, пожалуйста, вот эти все aspx на скрине - это тоже всё устаревшее?
Ясен хуй не заработает, если методы библиотеки не являются асинхронными. Да и в целом асинхронность существует для того, чтобы не стопорить параллельные задачи, типа работы UI.
Нужна многопоточность, но я ни разу не работал с Ghostscript.NET.Processor, так что не помогу.
>Ясен хуй не заработает, если методы библиотеки не являются асинхронными
Как же хороша многопоточка в сишорпе. Не то что в джаве. Виртуальные треды не нужны, кстати) Асинк/эвейты - интуитивно понятное решение)
Судя по виду это скорее всего ASP.NET WebForms, которое только на .NetFramework и это древнее говно мамонта. Бросай нахуй смело, если только не рассчитываешь работать с какой-нибудь совсем легаси парашей.
Не, ну ты можешь создать таску и выполнить асинхронно неасинхронный метод, но в целом данное решение не всегда может дать положительный эффект.
Если ты имеешь ввиду просто сделать
Task DoAsync(){
DoSync();
return Task.CompletedTask;
}
То этот код выполнится синхронно.
Если
await Task.Run(DoSync);
То это тоже выполнится синхронно, но в тредпуле.
Если хочется параллельности без лишних изъебств, то надо использовать ParallelQuery. Ну или через тредпул как деды, а тасками или прямо дергать тредпул - уже самому решать.
Я не знаю зачем ты мне ответил. Но раз никто не ответил, давай я к тебе долюблюсь, потому что ты либо странно выражаешься, либо что-то не так делаешь. А мне - скучно.
Так вот. В чем проблема того механизма авторизации, который ты указал. Проблема простая. Твой сервер авторизации с какого-то фига знает либо про основное приложение, либо про веб-сервер с фронтом, который у тебя ХЗ на чем будет, не суть.
Как по хорошему должно быть?
У тебя должен быть гейтвей, который проверяет, какую апишку хотят дергать. Это такая-то единая точка доступа ко всем апишкам. Так вот, этот гейтвей - таки знает, что если апишка требует авторизации, а никакого токен валидного не передано - он должен либо 401 отдать, либо редеректнуть на сервер авторизации(зависит от того какая у тебя там схема, с токенами, куками или еще что-то ты там придумал).
Дальше.
Получили токен авторизации. Все, теперь гейтвей пропустит запрос к нужной апишке.
Это максимально простой и понятный флоу, который подходит для маленьких и средних проектов.
Для гейтвея - можешь использовать что удобно. Можешь еще один Nginx настроить, можешь - взять Traefik, можешь - Ocelot. Самописное - лучше не брать, потому что заебешься, хотя иногда - и это норм.
Теперь. На всякий случай уточняем. Данные пользователя - ты не хранишь в открытом виде. Никакие. Потому что если это РФ, твое ПО завернут на ФЗ о персональных данных, и тогда придется плясать вокруг пидорасов, которые 100500 денег за услуги по безопасности вокруг требуют. Оно тебе надо? Не надо. Все шифруем-хешируем. Пароли - солим и тоже хешируем.
Далее. Через пару месяцев после ввода в эксплуатацию, тебе скажут: У нас есть корпоративные учетки/гугловские учетки/учетки госуслуг, потому - сразу надо продумать механизм авторизации-регистрации через других поставщиков. Как минимум - на бумаге и в модели заложить, чтобы было куда потом расти.
Далее. С вероятностью 99% двухфакторная аутентификация потребуется. Сейчас в принципе уже почти везде ее требуют, если себя уважают. Потому - хотя бы СМС придется уметь отправлять.
Далее. РФ, а значит ЭЦП. Вход по ЭЦП наше все. Особенно если это завод, как ты сказал, ведь через полгодика-год, вашу приблуду захотят сертифицировать в ФСБ, а там без ЭЦП - тебя сразу нахуй пошлют.
То что забывают чаще всего при первой версии ПО для авторизации-аутентификации. Восстановление пароля. Даже если одмен руками пользователей заводит - механизм сброса пароля /восстановления доступа должен присутствовать.
В общем. Вроде ниче не забыл.
Как же пиздец мне скучно. Вы бы знали. Еще и прямо в отпуске - компуктер сдох с игрульками, которые собирался пройти. Жду, когда привезут новый. Обидно - пиздец.
Я не знаю зачем ты мне ответил. Но раз никто не ответил, давай я к тебе долюблюсь, потому что ты либо странно выражаешься, либо что-то не так делаешь. А мне - скучно.
Так вот. В чем проблема того механизма авторизации, который ты указал. Проблема простая. Твой сервер авторизации с какого-то фига знает либо про основное приложение, либо про веб-сервер с фронтом, который у тебя ХЗ на чем будет, не суть.
Как по хорошему должно быть?
У тебя должен быть гейтвей, который проверяет, какую апишку хотят дергать. Это такая-то единая точка доступа ко всем апишкам. Так вот, этот гейтвей - таки знает, что если апишка требует авторизации, а никакого токен валидного не передано - он должен либо 401 отдать, либо редеректнуть на сервер авторизации(зависит от того какая у тебя там схема, с токенами, куками или еще что-то ты там придумал).
Дальше.
Получили токен авторизации. Все, теперь гейтвей пропустит запрос к нужной апишке.
Это максимально простой и понятный флоу, который подходит для маленьких и средних проектов.
Для гейтвея - можешь использовать что удобно. Можешь еще один Nginx настроить, можешь - взять Traefik, можешь - Ocelot. Самописное - лучше не брать, потому что заебешься, хотя иногда - и это норм.
Теперь. На всякий случай уточняем. Данные пользователя - ты не хранишь в открытом виде. Никакие. Потому что если это РФ, твое ПО завернут на ФЗ о персональных данных, и тогда придется плясать вокруг пидорасов, которые 100500 денег за услуги по безопасности вокруг требуют. Оно тебе надо? Не надо. Все шифруем-хешируем. Пароли - солим и тоже хешируем.
Далее. Через пару месяцев после ввода в эксплуатацию, тебе скажут: У нас есть корпоративные учетки/гугловские учетки/учетки госуслуг, потому - сразу надо продумать механизм авторизации-регистрации через других поставщиков. Как минимум - на бумаге и в модели заложить, чтобы было куда потом расти.
Далее. С вероятностью 99% двухфакторная аутентификация потребуется. Сейчас в принципе уже почти везде ее требуют, если себя уважают. Потому - хотя бы СМС придется уметь отправлять.
Далее. РФ, а значит ЭЦП. Вход по ЭЦП наше все. Особенно если это завод, как ты сказал, ведь через полгодика-год, вашу приблуду захотят сертифицировать в ФСБ, а там без ЭЦП - тебя сразу нахуй пошлют.
То что забывают чаще всего при первой версии ПО для авторизации-аутентификации. Восстановление пароля. Даже если одмен руками пользователей заводит - механизм сброса пароля /восстановления доступа должен присутствовать.
В общем. Вроде ниче не забыл.
Как же пиздец мне скучно. Вы бы знали. Еще и прямо в отпуске - компуктер сдох с игрульками, которые собирался пройти. Жду, когда привезут новый. Обидно - пиздец.
Ничёсе ты выдал. Спасибо большое. Восстановление пароля уже есть, двухфакторку щас делаю, но пока только по email'у. Данные само собой в открытом виде не хранятся. А вот авторизация через другие учётки - это как раз OAuth 2, который я пытаюсь реализовать. А вот про гетвей вообще не знал, буду делать
А ещё такой вопрос. Во у меня есть таблицы от Identity ASP.NET Core с ролями, пользователями и т.д. Как мне связывать, допустим, написанные пользователем новости в бд? Правильно понимаю, что нужно сделать две бд: identity и news. А связывать это всё, допустим, Guid айдишником пользователя. Или можно вообще всё в одну бд спихнуть и сделать связи от identity user -> news
Все от архитектуры зависит.
Если разные приложения с отдельными базами, то ты в приложении где news - делаешь таблицу
Условно.
Subscribers(TopicId, UserId).
Для реализации фичи - этого обычно достаточно.
Минус - консистентность системы. Если пользователя удаляют из Identity - тебе нужно либо забить в остальных частях системы, либо придумывать механизм как чистить(через очередь, каким-то воркером по крону и т.д.).
Конечно - удобнее было бы это все в одной БД держать. Но тогда при росте приложения - начинается боль. Чем больше база, тем сложнее ее поддерживать, тем больше соблазна - переложить часть логики в нее и вообще. А если логика а БД - это значит тесты уже не такие дешевые. Да.
Короче. Ответ на вопрос - зависит.
Я бы делал во втором приложении явную таблицу ПользователиПриложения(условно), в которой столбец - IdentityUserId. Вот на основе этой таблицы бы уже вся хурма с подписками и прочим в этом приложении. Чтобы не придумывать всякое разное, когда окажется, что надо всякие настройки хранить помимо подписок. Типа реально же - потом надо будет по регионам разбить твои новости, языкам, заблоченым/пользователям. Все это в Identity - не хочется пихать все. Опять же - это дает возможность, если надо, войти, попользоваться приложением в каком-то ознакомительном режиме, потом сохраниться и привязать IdentityUserId и не потерять что ты там настроил.
Понял, пасиб
Если нажать по F12, то мне выдает поверхностную информацию "из метаданных", в гугле выдает какой-то бред.
К примеру, мне нужен класс
System.Windows.Media.TranslateTransform
Вот "типа" исходники
https://github.com/microsoft/CodeContracts/blob/master/Microsoft.Research/Contracts/PresentationCore/Sources/System.Windows.Media.RotateTransform.cs
Но если посмотреть, там метод public RotateTransform(double angle) абсолютно пуст.
Чел, чел, спасибо!
А вот это актуалочка?
MVC - на слуху. Entity Framework - тоже.
Смущает Web API. Razor-страницы
Темы курса такие:
Урок 1: Вступление. Установка. Ознакомление
Урок 2: Структура базового проекта. Что такое Middleware
Урок 3: Конфигурация. Основы конфигурации.
Урок 4: Понятие маршрутизации
Урок 5: MVC. Основные значения
Урок 6: Модели
Урок 7: Представления
Урок 8: Контроллеры
Урок 9: Web API. Razor-страницы
Урок 10: Entity Framework Core
Урок 11: Публикация приложения. Доступные сервера
>Смущает Web API. Razor-страницы
Web API норм. Насчет razor pages я х.з. вроде старый, но говорят, что зная их, можно легко въехать в тот же Blazor.
Я бы тебе советовал вот это для начала прочесть:
https://metanit.com/sharp/aspnet6/
Разобрать каждую тему, тогда уже хоть какое-то понимание появится.
А потом уже лезть во всякие MVC и т.д.
Студия криво работает с некоторыми библиотеками и вместо декомпиляции показывает метаданные.
Исходники можно почекать на https://source.dot.net/
Конкретно для RotateTransform класс состоит из двух частей
1.
https://source.dot.net/#PresentationCore/System/Windows/Media/Generated/RotateTransform.cs
2.
https://source.dot.net/#PresentationCore/System/Windows/Media/RotateTransform.cs
Можно установить расширение
https://marketplace.visualstudio.com/items?itemName=EfreyKong.Ref12-VS2022
Оно по сути, по нажатию F12 будет запускать в браузере ссылку на тот же https://source.dot.net/
что-то типа:
public int Hueta
{
get => hueta;
set => hueta = this.SetHueta(value);
}
Интерфейса? Он же абстрактный, там нет сеттеров.
И зачем тебе пилить дополнительный статический класс, чтобы работать с другим экземпляром?
Какова конечная цель?
Допустим в одной библиотеке у меня есть класс partial static MyLibrary.Math
И в другой библиотеке partial static MyLibrary.Math
Вторая библиотека импортирует первую и я ожидаю, что в классе Math мне будут доступны методы из первой библиотеки. Но я получаю конфликт имен. Разве partial не для этого создан?
В общем. Смотрите. Есть у меня класс билдер приложения. Делал по принципу миддлваров.
Т.e. Use(Func<Context, CancellationToken, Task> handler, Func<Context, CancellationToken, Task> next, CancellationToken ct);
Собственно.
У меня есть миддлварь вида:
(ctx, ct) => {
try{
if(next!=null) await next(ctx, ct);
}
catch(Exception e){
_logger.LogError(e);
}
}
Думаю понятно, что должен идти первым и задуман чтобы обрабатывать все ошибки которые не обработаны ранее.
И вот какая фигня. Ниже - идет загрузка dll, та dll загружает уже другую dll и там где-то кидается исключение, которое вот этот вот обработчик не ловит, и никто тоже не ловит; но при этом - ASP'шный обработчик ошибок как-то таки это все ловит, лул.
Чего делать - я не знаю. И что происходит - тоже не понимаю. Типа я ожидаю что исключение обработается. Оно не обрабатывается. Ну ок. Не обрабатывается, я ожидаю что тогда программа упадет. Но она тоже не падает.
Как искать-то причину и что вообще происходит - я хз.
Какие-нибудь зацепки?
async void?
у меня иерархия наследования вышла такой ебанутой и базовый класс вышел настолько толстым, что я решил лучше все переписать. пытаюсь обобщить и убрать из базового класса как можно больше функционала, но понял уже что так насиловать интерфейсы нельзя
В reactive ui так сделано
Есть у кого-то инфографика того, что придется изучать?
Правильно ли я понимаю, что есть несколько языков - C#, F#, VB. Всем им доступна среда исполнения .NET Core, которая упаковывает и запускает программы, конфигурирует библиотеки? Слово Core вроде бы убрали? Все верно?
Достаточно ли для понимания того, что как и у Java, у сисярпа есть виртуальная машина, которая исходный код на нем превращает в CIL (или IL), и потом исполняет, + кроссплатформенно?
Спасибо!
.NET и .NET Core это сейм щит.
.NET Core был, когда .NetFramework, но последнее говно мамонта иссохло, и .NET Core стал просто .NET
>Правильно ли я понимаю, что есть несколько языков - C#, F#, VB. Всем им доступна среда исполнения .NET Core, которая упаковывает и запускает программы, конфигурирует библиотеки? Слово Core вроде бы убрали?
.Net - это семейство программных продуктов, включающих в себя языки программирования, библиотеки, инструменты и другие компоненты, необходимые для создания приложений.
Код C#, F# и VB переводится в промежуточный язык CIL.
Ты даже можешь создать один проект на VB, а другой на C# и оба проекта будут прекрасно взаимодействовать (за исключением пары нюансов).
Так как ты хочешь - никак.
Partial - это сахар, который позволяет разделить исходный код по разным файлам в пределах одного проекта.
Под капотом, после компиляции, это все равно будет один класс в пределах одной сборки.
>Ты даже можешь создать один проект на VB, а другой на C# и оба проекта будут прекрасно взаимодействовать (за исключением пары нюансов).
Для любителей извращенного, при желании можно даже код на Java выполнять в среде .Net.
Для особых ценителей, обратное (С# на JVM), вроде как, тоже возможно.
>Для любителей извращенного
Ну мне эта возможность очень помогла с переходом с VB на C#. Я не стал доделывать программу до конца на VB, а просто добавил новый проект на C# и продолжил писать программу. До сих пор использую либы на бейсике.
И еще, интерфейс это штука, которая по сути может объединить несколько классов ,которые реализуют этот интерфейс? Типо говорю функция void sheet(inter a, inter b), где а и б - разные классы, реализующие один интерфейс?
Плюс еще вопрос, нахуй нужны свойства? Понимаю про методы и поля, а свойства где используются и зачем?
>интерфейс это штука, которая по сути может объединить несколько классов
Интерфейс не может объединять классы. А вот класс может реализовать несколько интерфейсов.
Интерфейс, образно говоря, это свод правил, например для будущих классов, которые возможно пока еще не существуют. Он как бы описывает что "в твоем классе должны быть такие-то методы с такой-то сигнатурой и такие-то свойства". Класс, который реализовывает эти правила, должен иметь соответствующие свойства и методы, заявленные в интерфейсе.
К примеру, ты создаешь некую коллекцию, которая обращается к свойству Value каждого итема. Далее ты создаешь интерфейс со свойством Value, и тот, кто будет реализовывать этот интерфейс в своем классе, будет обязан создать свойство Value у себя, иначе будет висеть предупреждение.
Таким образом, твоя коллекция не зная что за неизвестный класс в нее пихают, благодаря реализованному интерфейсу в этом классе будет уверенна, что свойство Value там точно присутствует. Без интерфейса коллекция просто бы не приняла какой-то неизвестный ей тип данных, либо пришлось бы более дорогостоящими способами (типа рефлексии) проверять есть ли в этом классе свойство Value.
Ну это один из вариантов применения интерфейса.
Абстрактный класс это примерно тоже самое за исключением того, что наследовать ты можешь только один класс, а вот реализовывать интерфейсов можешь множество. Соответственно каждый из этих интерфейсов будет требовать что-то свое, и твой класс это все должен реализовать.
А вот где применять абстрактный класс - надо еще понять. Интерфейс на мой взгляд более универсален, к тому же в современных версиях шарпа он может так же иметь внутри себя какую-то логику, а не просто шаблоны, чем обесценивает все качества абстрактного класса. Хотя пихать логику в интерфейсы на мой взгляд - пиздец. Это развращает.
Спасибо!
>Плюс еще вопрос, нахуй нужны свойства? Понимаю про методы и поля, а свойства где используются и зачем?
Это нужно для инкапсуляции. Поля должны быть приватными, они используются внутри класса, либо его наследников. А свойствами ты можешь контролировать какие поля передать наружу.
Насколько я знаю, в плюсах ведь тоже есть геттер и сеттер, которые пердают данные полей наружу класса. Собсно в шарпе свойство это и есть два метода Get и Set, обмазанных сахаром для удобства. Ты посмотри как выглядят расширенные свойства.
Из-за этого, например, нельзя свойство внутри класса передать напрямую в параметр метода этого класса, как если бы это было обычное поле.
Соответственно, так как это методы, то это дает один весомый плюс. В эти свойства ты можешь помещать логику, а не просто сохранять значение. Например очень часто можно встретить, как свойство помимо передачи значения приватному полю, вызывает событие о том, что свойство изменено, чтобы все привязки обновили данные. Или к примеру передается строковое значение, которое парсится в свойстве и передается приватному полю уже как численное значение. На самом деле роль свойств велика и одними полями некоторые вещи реализовать невозможно. Но даже если можно обойтись публичными полями, то все же стоит использовать свойства - это даст понимание пользователю.
Единственная рекомендация - не использовать по возможности тяжелую логику в свойствах. Для этого все же нужно использовать обычные методы. Ну и самому быть начеку при работе с неизвестными тебе классами и не дрочить одно свойство несколько раз в пределах одного метода. А то бывает в цикле обращаешься к свойству Width, а оно на самом деле запускает тяжелые расчеты в геттере. Ну я имею ввиду, что на будущее (пока это тебе наверно не надо) неплохо бы чекать исходники и понимать как это свойство там работает. Мне вот лично с этой неопределенности пригорает и похоже эта проблема мало кого волнует.
Мил человек, спасибо большое за развернутые ответы.
В плюсах возможно тоже есть, но просто энивей можно обойтись обычными методами же. Поэтому и я задал этот вопрос.
мне нужно только до 1.40
double q, y, y1, x;
int n;
n = 1;
y = 1.2;
Console.WriteLine("║y |x |");
while (y < 1.41)
while (n <= 12)
{
if (n > 5)
{
q = Math.Cos(n);
y1 = y y y;
x = (y / 2 n - 1) + q;
n += 1;
y1 = y;
}
else
{
y1 = y y y;
q = 1;
x = (y / 2 n - 1) + q;
n += 1;
y1 = y;
}
Console.WriteLine($"║{y,5:f2}║{x,5:f2}║");
y += 0.02;
}
мне нужно только до 1.40
double q, y, y1, x;
int n;
n = 1;
y = 1.2;
Console.WriteLine("║y |x |");
while (y < 1.41)
while (n <= 12)
{
if (n > 5)
{
q = Math.Cos(n);
y1 = y y y;
x = (y / 2 n - 1) + q;
n += 1;
y1 = y;
}
else
{
y1 = y y y;
q = 1;
x = (y / 2 n - 1) + q;
n += 1;
y1 = y;
}
Console.WriteLine($"║{y,5:f2}║{x,5:f2}║");
y += 0.02;
}
>В плюсах возможно тоже есть, но просто энивей можно обойтись обычными методами же.
Ну в шарпе ты тоже можешь обойтись обычными методами. Ты можешь даже поле сделать публичным. Но вопрос не в том, что ты можешь, а в том чтобы дать понять другим, что ты имеешь ввиду. Нужен определенный стандарт. Даже ItelliSence зная, что у тебя есть свойство, выдаст немного больше информации.
Ну представь себя на месте обычного пользователя каким-то там классом. Как обычный метод этого класса даст понимание, что он не просто что-то там делает, но еще меняет внутренние поля класса? Ну да, ты должен назвать что-то вроде SetValue и GetValue, что это не просто какие-то там методы, а специальные методы с которыми надо быть аккуратнее, что приблизит тебя к концепции свойств.
К тому же есть куча автоматических взаимодействий кода со свойствами. К примеру привязки. Если ты будешь изучать MVVM-паттерн, то познакомишься с тем, как условный GUI-текстбокс привязывается к свойству и автоматически обновляется или обновляет данные этого свойства. Это возможно благодаря стандартизации таких вещей, как геттер и сеттер.
Ньюфаг штоле? Разметка макабы пидорасит. Звездочка это аналог открывающего тэга <i/>, который делает текст наклонным.
Поэтому код либо кидай скриншотом, если он короткий, либо оформляй через pastebin, а сюда кидай ссылку. Подсветку синтаксиса не забудь врубить.
хуй пизда джигурда
> почему он в выводе выводит от 1.20 до 1.42
Может быть потому, что проверка while происходит в начале блока, соответственно блок выполняется до конца, значение y инкрементируется до 1.42 (а что ему мешает?), затем начинается новая итерация, вайл видит, что значение y не удовлетворяет условию и выходит из цикла.
Или ты думал, что вайл будет отслеживать состояние y на протяжении всего блока? Нет, проверка производится в начале каждой итерации цикла.
Т.е. тебе надо сделать бесконечный цикл, что-то вроде while (true)
А саму проверку (y < 1.41) делать в конце блока до того как начнется изменение y
И если условие не удовлетворяет, то делать break; из цикла
>Т.е. тебе надо сделать бесконечный цикл, что-то вроде while (true)
В шарпе есть do...while цикл для этих целей.
Один хрен у него переменная y уже присвоит значение.
Это не поможет.
Ему надо записывать значение в локальную переменную, проверять не вышла ли она за границы диапазона, и в зависимости от результата либо присваивать значение переменной y и идти дальше, либо прерывать цикл.
Ну или присваивать значение y в начале блока.
Как-то так
Пока
Я, как лютый нуб пишу всякое такое, типа:
`DateTime currentDate = new DateTime.Now;`
и оно, ясен пень, не компилируется. Иду в документацию MS и просто тону там. Объясните, как она устроена? В каком разделе например есть описание всех методов в алфавитном порядке (или как-то по другому сгруппированные)?
Видел где-то, что можно из даты вытащить текущий год, типа такого
`someDate.ToString("yyyy");`
Вот как посмотреть методы, которые можно у даты вызвать?
Или синтаксис и параметры ToString();
https://learn.microsoft.com/ru-ru/dotnet/api/system.datetime.tostring?view=net-8.0#system-datetime-tostring
>Вот как посмотреть методы, которые можно у даты вызвать?
Для этого и существуют нормальные IDE и IntelliSence
Щас скажет что это решарпер. В 99% случаев, когда происходит какая-то магия, то это решарпер.
Почему значения типа байт, хранящиеся в переменных типа object выдают false при сравнении?
Смотрите. Есть свойство ICollection ParentCollection, в него помещается коллекция
Collection<byte> MyBytes { get; set; } = new() { 15, 3, 100, 148, 96 };
Есть параметр object value, через него передается переменная byte MyByte = 148;
Явно в коллекции MyBytes есть значение равное 148, но результат сравнения выдает False (пикрил 2 - вывод каждой итерации из цикла)
хз че ты там мутишь, но не забываем про боксинг, где для равных по значению значимых типов создаются обертки с разными ссылками
byte a = 1;
byte b = 1;
Console.WriteLine(a==b);
Console.WriteLine((object)a==(object)b);
True
False
Разве при сравнении на втором пике не должен использоваться оператор, определенный в bool? Переопределение же
Хуйню выдал.
Какие ссылки? Это ж структуры, я ожидал передачу значения.
>>2978265
>не забываем про боксинг, где для равных по значению значимых типов создаются обертки с разными ссылками
Ах вот оно что
>хз че ты там мутишь
Вообще, изначально была проблема в том, что мне надо в лист боксе отобразить итемы, у которых нет свойства Name или ID.
Поэтому создал конвертер, который выводит тип объекта и его индекс в списке. А так как хочу сделать универсальный конвертер, то сравниваю обджекты. В общем, использую "object.Equals(a, b)" вместо "a == b".
Угу. Там даже ни одного мата не было. Х.з. чего доска так возбудилась.
нет. это StringSyntaxAttribute, который позволяет сделать подсказки по формату для визуал студии. То есть он подсказывает студии что тут строка, но не просто строка, а формат даты или регулярка (вот все допустимые значения https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.codeanalysis.stringsyntaxattribute)
вот бы найти еще нормальный мануал как самому создавать. но как обычно все интернал.
если прописываю как положено:
DoThing(bar, null)
...то все нормально выглядит
а если как по идее для чего опциональные параметры и нужны:
DoThing(bar)
...то начинается какая-то хуита.
вот я поставил два метода рядочком:
DoThing(bar);
DoThing(bar);
так компилятор по мнению ILSpy два раза сука объявляет это Foo как null и передает отдельно в каждый метод, а еще и блядь такая bar копирует:
Foo foo = null;
DoThing(bar, foo);
Foo foo2 = null;
Bar bar2 = this.bar;
DoThing(bar2, foo2);
это хуйню как вообще понимать, 🥗ач?
Видимо ILSpy хреново IL назад в 🥗овый код переводит. В IL лишних локальных переменных нет, null сразу на Новогодний Репертуар грузится. Если в релизной конфигурации собрать, то вообще даже локальная переменная под bar заводится не будет, все операции чисто на Новогодний Репертуаре будут.
https://sharplab.io/#v2:C4LglgNgPgAgTARgLAChXwMyoN6oAQF7xz6G4qGV4BuAhgE54BGDeAvHgHYCmA7ngCEGACgQAGMQEoA3KSp45VACIB7ACoALMJwDmwlvRnyCiyqs3a9BmYoC+ixQAd6YOsG5EEANiIAWPOZausJCjAYANHgAYioqeABmsexcAK4QEJKK5MaeAJz6DDYUxjAI+YkqRZT2KDXoGHj03ADGKvQAJtGxwtrAeABqtBAp3EUwDU2tHYIivQNDIzJAA===
лол
Мне нравится, как в библиотеке Bukkit для 🍊 работает система событий. Для прослушивания событий есть интерфейс Listener, с которым можно создать метод, который будет вызываться при инициализации события. Тип события указывается в параметрах метода.
Как такое можно реализовать в 🥗? Мне совсем не нравится, что события здесь функционально-ориентированные.
Да просто реализуй. Какая проблема то
Чем класс листенер отличается от любого другого класса с методами кроме семантики (ну и она же в названии)?
Ничем не отличается
Никто не заставляет юзать нативные события.
Если у тебя в хендлере нужно 2+ метода - ну и делай листенеры
Просто они по семантике будут не универсальные подптсчики, а "конекретно тутовые хендлеры"
Но все это метафоры. Реализация то одинаковая
Если не хочется использовать стандартные event-ы, то стоит посмотреть в сторону реализации интерфейса IObservable.
https://learn.microsoft.com/en-us/dotnet/api/system.iobservable-1?view=net-8.0
https://learn.microsoft.com/ru-ru/dotnet/standard/events/observer-design-pattern
А там, если захочется, то и реактивщиной обмазаться можно будет https://github.com/dotnet/reactive
Я создаю новое WPF-приложение, Net7.0, пытаюсь забиндить double в текстбокс, и в качестве разделителя у меня стоит точка. При этом у меня нет никаких кастомных конвертеров и валидаторов. Смотрю в настройках винды формат числа — там стоит запятая (пикрил).
У меня переклин. Я недавно переустанавливал винду и мне кажется, что должна по дефолту быть запятая. А если нет, то почему Застолье игнорирует настройки винды?
При этом если через конвертер тупо конвертировать занчение в стринг, то выводится запятая. Че за нах?
Попробовал в конвертере проверить, что приходит в параметр culture и почему-то там указано "en-US". Почему? В настройках российский регион.
Ну типа при инициализации App могу написать
FrameworkElement.LanguageProperty.OverrideMetadata(
typeof(FrameworkElement),
new FrameworkPropertyMetadata(
XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));
Но вопрос, какого хуя я этого никогда не делал раньше? Может есть где-то глобальная настройка в Застолье? Может какой-то плагин поменял?
Дефолтный DataGrid и не дефолтный TreeDataGrid не умеют в выделение отдельной ячейки по дефолту. Неужели надо самому SelectionModel писать? Или есть готовые решения которые я не нашел? Так влом самому писать просто
Я могу судить по впф. Для этих целей пришлось бы перелопачивать весь стиль.
Дата грид это такая залупень, шо я ебал ее в рот. Я все делал через ListView из которого можно при помощи стилей сделать что угодно. Окно свойств вижуал cтудии — это все ListView на самом деле.
Это делается так - CultureInfo.CurrentCulture = CultureInfo.CreateSpecificCultute("ru-Ru");
CultureInfo.CurrentUICulture = CultureInfo.CreateSpecificCultute("ru-Ru");
1. Где делается?
2. А жесткое указание ру-региона вместо той, что задана в операционной системе
3. Почему я не делал так раньше и все работало
Поток заходит в Первый лов в ToCheck(string ip) а потом срабатывает метод Update() а там тоже лок с тем же объектом. Вот смотрю на код и как бы по смыслу он не должен работать, даже в 1 поток, но он отрабатывает нормально.
Почему так?
Смысл зайти и проверить дату редактирования файла, если файл младше то перезагрузить его, лок нужен что бы в файл не вцепились сразу 2 потока.
>Почему так?
Так совпало. Можешь 100 проверок локов сделать да еще с каким нибудь таймером ожидания и тогда шансы будут еще выше. Но рано или поздно два потока под таким таймингом зайдут, что не спасет.
Вроде же есть всякие очереди, которые и решают эту проблему. Разве не?
https://metanit.com/sharp/tutorial/4.7.🎄
Поток создает запрос в очередь и этот запрос будет обработан только после того как будут обработаны запросы от других потоков. Тогда у тебя будет гарантия, что несколько потоков не сядут жопой на один сральник.
>>🎄
Рака яиц тому, что для программача настроил Новогоднее Настроение.
Гугли "Очередь Queue".
блять я испугался
А зачем мне очередь?
Я просто сделаю 2 lockObject и когда поток зайдет ToCheck(string ip) он залочит первый лок и другие уже не войдут в него, а потом залочит в Update().
Хотя я сейчас непонимаю я нахуя я делал lock в Update() так как в него по идее не может ни кто попасть так как вызов этого метода есть только в ToCheck(string ip) и он под локом.
Наверное ночью писал и не понимал что пишу, бывает такая хуйня что находит вдохновение и 15 часов могу писать код, только вот последние часы не помню что и нахуя писал.
Какие профиты я получу используя докер? Ну или какие не получу?
через докер ты получишь "оно просто работает но докер"
без него тебе ВОЗМОЖНО придется ставить рантайм и прочее чтобы у тебя это работало, а это не так просто
у меня были траблы opencv + ffmpeg + vip для имаджей
не Прочиталось никак. вошло в конфликт на реальной системе
впрочем не Прочиталось из за випа что стала память утекать
>Почему так?
lock разворачивается в Monitor.Enter+Exit, а там
https://learn.microsoft.com/en-us/dotnet/api/system.threading.monitor.enter
>It is legal for the same thread to invoke Enter more than once without it blocking; however, an equal number of Exit calls must be invoked before other threads waiting on the object will unblock.
>блять я испугался
Я бы тоже, потому предупредил.
>А зачем мне очередь?
При многопоточности, обращения потоков к свойству не происходят последовательно. Один поток меняет статус lock на true, а второй в это время его уже проверил и думает что там false и лезет читать файл. Они могут полезть одновременно.
С булевыми переменными это уловить сложно, но вот с другими более сложными типами переменных получить конфликт легко.
Но я не совсем понимаю есть ли у меня многопоточность)
Метод контролера public IActionResult Index() работает ли он сразу в многопотоке? Пока 1 выполнение идет, а второй юзер зашёл на страницу его в очередь поставит или будет создал второй HomeController и в нем сработает метод?*
займет поток из пула, а значит пул исчерпается и остальные буду ждать.
К примеру мне нужно много бд, каждая бд для своего сайта.
Я делаю как то так
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlite("Data Source=db.Where(d => d.Domain ==Request.Host.Host).First()"); //ну типо по какому домены пришёл запрос ту бд и берем
}
Не будет ли конфликтов каких кто?
Идея в том что сайты разные и контент совершенно разный. Выиграю ли я в скорости запросов?
С докером ты получишь удобство разворачивания, обновления всего этого дела.
Без докера, тебе надо обновить свой сайт - ты ручками по ССШ заливаешь новую версию. Ты обновил .NET - ручками иди обновляй на хосте зависимости. Да, удаляешь - иди руками чисть что там насрал.
Если что-то упадет - ты можешь в докере изи настроить автоподнятие.
Сверху - нахуевертить всяких писек, чтобы если что-то идет странно(память резко потреблять больше стало, место скоро кончится и т.д) - тебе прилетели уведомления, метрики куда надо.
Короче. Минимально - удобство.
Дальше, если у тебя какая-то микросервисная шляпа начнется - ты просто берешь и делаешь нужное кол-во инстансов, сколько хост потянет - и все, так тебе придется искать как твою службу размножить, настраивать это все и т.д.
for (int i = 0; i < MyCollection.Count(); i++)
{ }
Отвечу с опозданием: выяснил что TreeDataGrid все таки позволяет одиночное выделение ячейки, но документации к нему по многим другим моментам не хватает.
Норм аналогов для WPF-ного ListView в Avalonia нет(
Теперь мучаюсь с тем как сделать переключение режимов в контроле TreeDataGrid между "только чтение" и "изменение", тупо документации не хватает. Придется смотреть код
Каждый раз.
Так нельзя делать. У тебя каждый раз IEnumerable будет перевычисляться. В лучшем случае это потеря производительности, в худшем это может всё распидорасить, если у тебя хтонь в конструкции.
И ElementAt нельзя использовать в цикле For? Нужно foreach?
Где-то я видел, что ElementAt это что-то вроде foreach который обходит коллекцию до нужного индекса.
А как тогда к примеру сравнивать итемы двух IEnumerable? С For все просто:
for (int i = 0; i < 100; i++)
{
If (MyCollectionA.ElementAt(i) == MyCollectionB.ElementAt(i)){ }
}
> Где-то я видел, что ElementAt это что-то вроде foreach который обходит коллекцию до нужного индекса.
Как хуево, что сорсы либ закрыты, и нельзя самому посмотреть, как оно реализовано...
Сначала идет попытка проверить что за зверь, и если он не IList, то тогда действительно будет в цикле перебираться.
А зачем тогда нужен IEnumerable? На пикрил пишут, что он подходит для перебора итемов, но он не очень-то хорош в этом.
как он может не быть хорошо в том для чего он исключительно и предназначен....
Для перебора. А не для определения размера.
>Так что лучше запрашивать IList вместо IEnumerable, если это возможно,
Зачем. Если тебе под IEnumerable придет List (или даже Array) то они вполне себе определятся как IList и все отработает как надо.
Все, что вызывает энумератор для перечисления. Например, foreach, да.
Ну вот тебе синтетический пример:
IEnumerable<int> GetSquares(){ return Enumerable.Range(1, 100).Select(x=>x*x); }
...
Console.WriteLine(string.Join(", ", GetSquares().Take(5)));
Так в итоге посчитаются только пять квадратов.
Если возврат метода заменить на List или [], то посчитается сто, хотя выведется только пять.
Суть IEnumerable в том, что ты наслаиваешь трансформации, а считает он в итоге только то, что тебе нужно в конце. В некоторых случаях это позволяет оптимизировать вычисления. А если у тебя результат такой конструкции не используется, то он не будет ничего считать вообще. Правда это говнокодом попахивает.
Ещё есть IQueryable который вообще по возможности превращается в запрос к БД. Тоже нахерачиваешь проекций, фильтров и группировок, а запрос выполняется только когда ты начинаешь данные реально использовать.
Ну и да, если тебе надо данные из IEnumerable использовать несколько раз, то надо сделать ToList() или ToArray(), и читать уже из них, иначе оно будет пересчитываться несколько раз (ещё и разные результаты могут получиться, если у тебя исходные данные изменятся, например).
Перeкат будет через 65 поcтов.
Джавадебил, тебе невтерпеж?
Бля, да это же охуительный язык! Аноны, а есть что-нибудь на подобии A Byte Of Python, где кратко описан синтаксис и основные плюшки C#?
Блазор покури. Там верстать еще приятнее. Особенно если использовать интерактив сервер, с кодбихайнд блоком.
Парни, там это, Никлаус Вирт умер 1-го января.
Почтим память.
Без него (хоть и опосредованно), вряд ли бы наш любимый C# был бы таким крутым и замечательным.
Press F5 to respect.
Деды уходят... F5
Я скорее его на хуй перекачу ибо не умею
>Или как лучше сделать?
Любой вариант, который подходит под твои требования и бизнес-логику.
Плюс можешь еще сделать Request как свойство каждой из отдельных сучностей, тогда проще нормализовать будет.
У меня опыта разработки 0. Поэтому и спрашиваю. Сейчас я запихнул всё в интерфейс.
>Плюс можешь еще сделать Request как свойство каждой из отдельных сучностей
Наверное так лучше...Я щас на гитхабе посидел, там челы также делают
>RequestFOB и RequestFCA.
В соответствии с гайдланами стоит использовать только очень известные сокращения типа URL, HTTP, TCP. Всё остальное стоит писать полностью.
Плюс к этому даже сокращения надо писать паскаль/кэмел кейсом: RequestFob, RequestFca.
Я сам не знаю что такое FOB и FCA это в отделе логистики какие-то термины. В понедельник на работу пойду спрошу. А про соглашение как писать сокращение спасибо
Шарперы слушаю ваши оправдания.
Сколько при запуске занимает памяти нет.кор фреймворк?
>тяжко грузить столько прстов
У тебя ондроед второй? Или ты из подвала? У меня все нормально грузит.
мимо джавабоярин
Самослив?
Ты на дату статьи посмотри, год назад это уже все обсосали иди в архивач и там ищи.
Хуйню написал про переполнение. Переполнение - это "общий" ексепшн, который обрабатывает, по идее, на рис.1. Fluent Validation его никак не должна обрабатывать
Это шизик.
Но по хорошему:
try{
...
}catch(SocketException sex){
Log(sex)
FreeSocketAndCompleteConnection(connection);
}
catch(DbUpdateException due){
Log(db);
RetryAfterDelay(1000);
}
То есть от более частного исключения к более общему, я правильно понял? Это хорошо, а вот как согнать все исключения в один обработчик я не понимаю. Вот например: я делаю запрос через postman и специально не задаю одному полю значения. Я ожидаю, что исключение попадёт в мой глобальный обработчик и я смогу там подкорректировать вывод ошибки, чтобы не было в какой строке ошибка произошла и т.д. Но получается так, что это исключения даже не доходит до глобального обработчика, оно ещё раньше где-то обрабатывается...Или я чего-то не понимаю
Такая проблема. Допустим в WPF у меня есть группа трансформаций, состоящая всего из одной трансформации — вращения на 90° вокруг центральной точки в относительном пространстве:
<TransformGroup>
<RotateTransform Angle="90" CenterX="0.5" CenterY="0.5"/>
</TransformGroup>
Я могу при помощи свойства Value из этой группы получить матрицу:
[0 1 -1 0 1 0]
И вопрос: а как получить центр вращения? Те самые
>CenterX="0.5" CenterY="0.5"
Я могу сделать декомпозицию матрицы и получить
Angle: 90;
OffsetX: 1;
OffsetY: 0;
Но это не даст мне никакой информации о центре вращения.
Все оказалось банальным. Можно же применять трансформации к точке. Главное знать изначальные габариты трансформируемого объекта.
Если в TransformGroup будет куча трансформаций, то уже никак не узнать.
Почему
byte b = 1 + 1;
работает, а
int a = 1;
byte b = a + 1;
нет?
Типа компилятор видит угрозу в математическом выражении, результат которого может не поместиться в byte?
Ты присваиваешь не константу в виде единицы, а переменную, в которой может в теории содержаться число выше 255 или ниже 0, потому что эта переменная типа int.
Компилятор не смотрит на фактическое значение int, ведь в рамках работы программы оно может поменяться на что угодно. Как итог, ты можешь получишь StackOverflowException, и компилятор на это обращает твое внимание.
Если ты уверен, что в "a" никогда не будет нежелательных чисел, то ты приводишь явно к байту, либо изначально объявляешь переменную как байт. Если ты не уверен, то либо проверяй значение, либо сразу обрезай: byte.Clamp(a, 0, 255);
Казалось, что выдавал исключение. На деле просто возвращается к началу и прибавляет остаток
int a = 257;
byte b = (byte)a;
Выдаст результат b: 1
Он просто урезает биты. И да, стековерфлоу это другое, про переполнение стека вызовов функций.
Потому что засунуть byte в int это как если бы осел выебал дракониху. Странно, но никому не повредит.
А вот попытка запихнуть int в byte - это уже как дракону выебать ослицу. Компилятор это видит и предупреждает тебя, что что-то тут не так. Поэтому в твоем случае ты должен явно приводить переменную: byte(a) + 1, как бы говоря компилятору: "Да, да я полностью уверен, пусть бедную ослицу разорвет нахрен."
Как бы не относится к экстримцоде, но это объяснение у них годно получилось.
Чем тебя спека не устраивает? https://docs.oracle.com/javase/specs/jls/se21/html/jls-5.html#jls-5.5
Пошëл нахуй.
Были мысли насчет какого-то флага в классе B, который становится true после выполнения функции, а потом вызов TrueForAll с предикатом. Может есть что-то получше?
Чего бы и нет. Просто берешь и используешь.
В какой-то момент ты сам себе начнешь его создавать в виде всяких экстеншенов, перегрузок и т.д.
Устраивает, но хотелось именно через события. В задании есть требование, чтобы я где-то события впихнул.
ну впихни после Task.WhenAll событие ЧтоТоТамКомплетед.
Автомаппер - наебка для гоев. Из коробки он только с простейшими круд-моделями работает. А в большинстве случаев там явно все правила прописывать нужно и по хорошему еще и тестами посильно этот мапинг покрывать.
Предположим у меня есть список разношерстных элементов, у которых нужно отредактировать свойство цвета, но имена этих свойств не являются едиными. К примеру:
- Path.Fill
- Button.Background
или
- Path.Stroke
- Button.BorderBrush
У элементов нет общего предка:
Shape -> Path
Control -> ... -> Button
Panel -> Grid
Я не могу использовать рефлексию, обращаясь грубо говоря по имени, да и затратно это.
Предположим, что я создам какой-то метод, который пройдется по списку элементов и извлечет из нужного свойства кисть, а потом составит новый список IList<Brush>.
Но на этапе редактирования может случиться например то, что какие-то кисти имеют статус Frozen == true, и такие кисти редактировать нельзя, их нужно клонировать в новый экземпляр. Но что я смогу сделать с этим экземпляром? Заменив итем IList<Brush> новым экземпляром, я не отредактирую свойство элемента, который содержит экземпляр старой кисти.
И что в таких случаях делать? Может есть какие-то хитрые списки, которые по паттерну обращаются к нужному свойству элемента? Ну вот есть же DataTemplate, к примеру, который на основе типа данных подбирает нужный экземпляр контрола.
Или может есть хитрые биндинги по шаблону?
Ъ-путь это не изобретать велосипедов, а реализовать интерфейс с методом SetColor.
Если это не совсем твои классы, ты можешь нахерачить им extention methods, то есть добавить каждому SetColor как расширение.
А то, что ты хочешь - это чистое и незамутнённое зло, не надо этого хотеть.
Это по первой части.
По второй - я вообще не понял, чего ты хочешь и как она связана с первой. Ты хочешь изменить цвет кисти, если она заблокирована? Зачем? В чём смысл этого действия?
Давай поясню. Я хочу сделать редактор кистей, подобный тому, что есть в окне свойств вижуал студии. Универсальный. Но у майкрософт целый зоопарк элементов, опять же:
Shape -> Path
Control -> ... -> Button
Panel -> Grid
... и я не хочу для каждой категории делать отдельный редактор кистей. Мне нужна универсальная информация, которую бы мой редактор мог обработать.
Сейчас я склоняюсь к ObservableCollection<Brush> с подпиской на изменение итемов. Просто я этот вариант оставил как запасной.
>реализовать интерфейс с методом SetColor
Во-первых, классы не мои, а некоторые запечатаны.
Во-вторых, какое именно свойство будет менять SetColor? Потому что часто есть несколько свойств, которые в какой-то момент нужно задействовать, а какой именно — зависит от внешних факторов о которых редактор кистей знать не обязан. Менять ли фон или контур, редактору цвета должно быть наплевать.
>SetColor как расширение
Та же проблема. Расширение не должно решать что делать.
>А то, что ты хочешь - это чистое и незамутнённое зло, не надо этого хотеть.
Таковы обстоятельства. Есть условный канвас, в котором могут находиться как производные от Panel, так производные от Shape, так и от Control. Я не виноват, что майкрософт родили такой зоопарк. Они может тоже не виноваты, но раз никто не виноват, то должно быть популярное решение данной проблемы.
>Ты хочешь изменить цвет кисти, если она заблокирована? Зачем?
Согласен, спорно. Но если тебя смущает такой пример, вот еще один: в свойстве может быть SolidColorBrush, а пользователь в окне редактора кистей выберет RadialGradientBrush. Это так же потребует создания нового экземпляра.
Как же хорошо, что я не занимаюсь десктопом или фронтом и мне не приходится решать проблемы вроде "как надевать штаны через голову"
> какое именно свойство будет менять SetColor?
Вот у каждого элемента будет свой сетколор, и он будет знать, что делать. И ты всегда будешь знать, что ты делаешь - ты устанавливаешь цвет. Твой код не вызывает Ктулху, не превращает тебя в гибрид Синдзи и Харухи, а устанавливает цвет у элементов.
Ты пишешь каждому классу extension method, который знает, что делать в конкретном классе. Если там нет чёрной магии, и всё что надо сделать, доступно публично. Запечатан он, не запечатан - тебя не волнует.
А про новые экземпляры я всё равно не понял. Ты пытаешься сделать что-то, чего сделать нельзя? А зачем ты пытаешься это сделать, если этого нельзя?
Алсо, я в графике ничего не понимаю, не мог бы ты объяснить свою задачу простыми словами? Ну там панели, кнопки, это понятно. Это такие визуальные элементы на форме, я когда-то очень давно писал на дельфях Button1Click(), я что-то помню. Так. А зачем их одновременно красить? А кисти тут при чём? Кисть, как я помню, это способ нанесения рисунка на канву. Какое отношение они имеют к элементам формы?
Потому что сегодня ты захотел поменять цвет у десятка несвязанных друг с другом элементов (и что такое "поменять цвет" у них ты придумал сам). А завтра ты захочешь поменять у них запах, текстуру, вкус, гендер - и на каждый чих тебе придётся писать набор расширений. Ты делаешь что-то странное, кмк.
>Вот у каждого элемента будет свой сетколор, и он будет знать, что делать.
Это как? В одном случае пользователь хочет поменять цвет фона — это одно свойство, а в другом случае он меняет цвет контура — это другое свойство. Вот запустил я метод SetColor и че? Куда он полезет? В первое или второе?
Экстеншен не поможет, либо у него будет слишком много полномочий, либо дальнейшая поддержка подобной системы будет деструктивной, потому что вариаций откуда брать данные — масса.
Не это хуета. Я лучше буду использовать обозреваемую коллекцию, а по каким принципам будут извлекаться данные и откуда — это не важно.
>Ты пытаешься сделать что-то, чего сделать нельзя?
Почему нельзя? Можно. Например свойство Background может содержать класс, реализующий абстрактный класс Brush. Классов таких великое множество.
Вот тебе кнопочка со сплошным однородным цветом
MyButton.Background = new SolidColorBrush();
А вот кнопочка с градиентом
MyButton.Background = new LinearGradientBrush();
Вот так и создается новый экземпляр, совершенно легально.
А если ты по поводу freezable-классов, так frozen state активируется в случаях, когда кисть инициализируется в xaml, и такой подход нужен, чтобы биндиться прямо из ресурсов (к примеру). В моем случае это не нужно, поэтому мне нужна возможность перезаписать кисть. Вот и всё.
>Это такие визуальные элементы на форме
Аааа, ясно. Это WPF, не знаю насколько он похож на подход в делфи. Но от винформсов отличается достаточно сильно.
>А кисти тут при чём? Кисть, как я помню, это способ нанесения рисунка на канву.
Алгоритм отрисовки. Одна кисть заливает сплошным однородным цветом, другая рисует линейный градиент, третья рисует радиальный градиент, четвертая рисует битмап. Пикрил - вариации.
Каждый контрол (это то, что ты называешь формой) содержит в себе набор кистей, отвечающих за визуал определенного элемента. Например у кнопки это может быть задний фон, стиль рамки, передний план (иконка\текст). Пикрил 2 - кисти кнопки.
>А зачем их одновременно красить?
Я строю универсальный класс. Для одних случаев достаточно редактирования одного объекта, для других нужно менять коллекцию. Поэтому мне проще сразу обрабатывать коллекцию.
>А завтра ты захочешь поменять у них запах, текстуру, вкус, гендер
Вот за это кисти и отвечают. Ты можешь реализовать абстрактный класс Brush и создать что-то свое. При этом ты можешь настроить тему приложения так, что у тебя во всех элементах интерфейса это перерисуется автоматом.
Я как раз занимаюсь универсальной системой скинов и тем для своих приложений. Она есть дефолтная, но это говнище куцее.
>Кисть, как я помню, это способ нанесения рисунка на канву. Какое отношение они имеют к элементам формы?
В WPF суть контрола в том, что это конструктор.
Есть набор простейших элементов, которые комбинируются между собой, формируя сложный UI-элемент. Ты можешь внутрь кнопки поместить еще одну кнопку, и все это будет элементом комбобокса.
Вот к примеру на видеорил мой собственный контрол, который редактирует свойства радиальной кисти, а на втором показан контрол для изменения линейного градиента. Это такие же UI-элементы как кнопка или комбобокс. В дальнейшем им можно изменить стили, и например сделать стиль аля windows 11 или mac, чтобы ползунки были другой формы или цвета. При этом внутрь контрла лезть уже не надо.
Алсо, на видосах эффект двойного курсора — это проблемы с записью. Видимо фэпасов мало поставил.
как тут может быть разыменование если есть проверка на null?
мамой поклянись что ToString() не вернет null
Интересная идея. Тоже была мысль через экшоны попытаться сделать.
Анон, это ты что такое пилишь? Для себя или работа? Выглядит интересно.
> 1 вебм
Сам придумал или подсмотрел где идею? Выглядит здорово, я бы до такого не додумался.
Просто представил, что это обычная фигура в графическом редакторе, к тому же система трансформаций такая же. Я в свое время задрался настраивать градиенты что в иллюстраторе, что в кореле.
Только я начал гуглить и выдает какието уебищные видосы на ютубе с нерабочим кодом и какието странные книги за 2014й год.
Наверное я чтото не то ищу.
Подскажите что курить и куда двигаться? хочу научиться писать сетевые предложения.
Как мне в нём в Хабе перехватить параметр http://example.com/?userId=123
А именно в телеге хочу сделать небольшое web apps с передачей параметра в виде User ID и так определять какой ТГ юзер зашёл в приложение. Да не безопасно, но это потом, я так демку делаю.
ГПТ сказал типо так
var userId = Context.GetHttpContext().Request.Query["userId"];
Но там пусто.
Как сделать так как мне надо?
Даже получить 1 раз это значение пока в хабе открыто соединение
>хочу начать писать сетевой код на шарп
Цель?
>чат ну и так далее
Blazor - лучший выбор. Ну или Bolero (Blazor под капотом), если хочешь писать на F#.
Делай. Тебя ждали.
Не совсем понимаю, что тебе нужно. Но скорее всего и не пойму, т.к. если какая-то библиотека требует какого-то хитрого пердолинга в csproj, то очень вряд ли стоит ей пользоваться.
Это mapster для маппинга моделей. А нужно изменить место создания папки Mappers. Я предполагаю, что создаётся она командами, что заключены в <Target Name="Mapster">. А вот что там менять надо - я не очень понимаю.
Это копия, сохраненная 13 февраля в 11:33.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.