24 декабря Архивач восстановлен после серьёзной аварии. К сожалению, значительная часть сохранённых изображений и видео была потеряна. Подробности случившегося. Мы призываем всех неравнодушных помочь нам с восстановлением утраченного контента!
>>2582351 (OP) Анон, щас будет вот вообще пиздец нубский вопрос: Если я захостю сайт через Apache по инструкции с MSDN и при этом у меня динамический IP, при переходе по этому адресу с других устройств, скажем на 228.359.1.69/Home/Index будет сайт работать?
>>2582362 Проблема в первую очередь не в динамическом IP, а в NAT. Если другое устройство находится в той же сети, что и твой сервер, страница откроется, например, если компьютер и мобилка подключены к одному роутеру, то с мобилки ты можешь подключаться с серверу, запущенному на компьютере. Но с мобильного интернета или с компьютера в другой сети доступа не будет. Ну и сервер надо запускать не на локалхосте, а по адресу 0.0.0.0, иначе сайт будет работать только локально.
Объясните нубику: шарпа достаточно для написания ботов для ммо-шек? Или нужен дополнительно C/C++? Да, хочу нырнуть в это для себя, интересно, но пока не пониманию многообразия сишек.
>>2582445 Смотря насколько низкоуровневых ботов ты хочешь сделать. Если достаточно кликать мышкой и нажимать клаву, то шарпа хватит, а если надо ломать сетевой протокол клиента и подсовывать ему фейкоту, то очевидно нет.
Часто стал видеть в десктопных приложениях, что бэкэнд написан на нормально языке го, си, кресты, а фронт на электроне. Почему так? Почему они не выбирают авалонию?
А каким образом хранятся импортированные библиотеки? Тут недавно всплывала тема про удаление папки obj. Так вот, я очистил все obj и bin в каждом проекте решения, и у меня отвалились импортируемые с локального диска библиотеки.
Библиотеки лежали на другом диске и линковал прямо оттуда, а их местоположение не изменилось. Т.е. не было такого случая, что копировал ручками dll в папку с решением и как-то там случайно его удалил. При этом студия отказывалась видеть, пока я заново не прошелся по всем проектам и не перелинковал библиотеки заново.
Поискал, где эта библиотека находится в проетах и в 100% случаев она находится в папке bin (которые я тоже чикнул). При этом Nuget библиотеки вроде как восстановились.
>>2582840 Короч упоминание библиотеки есть в двух файлах собстно в проекте <project_name>.vbproj и в папке \obj\Debug\net6.0-windows\, в файле <project_name>.vbproj.FileListAbsolute.txt
В первом файле указан абсолютный адрес к библиотеке и ее расположение не поменялось. Во втором уже относительный. Сранно.
>>2582896 Моя личная библиотека, написанная еще на NetFramework. Лежит себе на диске типа D:\Code\Libraries\MyLibrary.dll
Добавляю в проект на net6.0 через "добавить ссылку". Собственно в файле .vbproj отображается полный путь к библиотеке.
Причем когда у меня возникла ошибка и посыпалось все решение, мне пришлось сперва удалить из ссылок мою библиотеку и только потом снова добавить. Иначе пишет, что библиотека не поддерживается.
>>2582940 >на net6.0 через "добавить ссылку". Собственно в файле .vbproj А разве VB под .net6 есть? Я думал его еще на .NetFramework 4.8 стопорнули. Во вторых сама идея подключать .NetFramework библиотеку к .Net6 проекту такое себе. Хотя бы под .NetStandart пересобери ее. В третьих такой способ подключения библиотек сам по себе туфтовый. Создай свой локальный нюгет, помести туда свои библиотеки и подключай их как белый человек.
>>2582963 >А разве VB под .net6 есть? Я думал его еще на .NetFramework 4.8 стопорнули. А как еще добавлять? Зависимости -> Добавить ссылку. в .vbproj пикрил. Ничем не отличается от добавления текстового файла.
>>2582966 >>2582963 >то намного проще ее подключить в виде исходников к проекту. Да как-то не проще. Я не собирался ее редактировать, нах мне куча мозолящих глаза папок?
>Создай свой локальный нюгет, помести туда свои библиотеки и подключай их как белый человек. Бля, было же просто. Не, ну давайте простые вещи делать через жопу, давайте погрузим данные в ракету, предварительно зарегистрировавшись в аккаунте NASA, отправим все это на Марс, шоб просто поковыряться в жопе. Ну хоть есть возможность локально подключить и на том спасибо.
У меня два вопроса. 1. Почему в райдере нельзя добавить к нет кор проекту ссылку на COM библиотеку. 2. И почему мне выдает такую ошибку при регистрации dll.
А в чем отличие подписок от передачи делегата? Вот если я подписался на событие, то мне нужно реализовывать Dispose, чтобы не забыть отписаться. Меня этот подход немного давит.
А что если я передам ссылку на метод, который будет запускаться изнутри класса? Все равно надо потом это все подчищать?
>>2583191 Че тут непонятного? Твой запрос должен быть очевиден пользователю. Если у тебя много свойств с именем ID в классе, то приписываешь уточнение. Если это единственный ID, то можно не надо. Просто пирписав User к ID, как снежный ком придется приписывать User ко всем остальным свойствам.
>>2583191 Первый вариант хорош для создания Entity с одним свойством Id. Тогда можно будет создать репозиторий который будет принимать только наследников этого класса.
>>2582840 >я очистил все obj и bin в каждом проекте решения, и у меня отвалились импортируемые с локального диска библиотеки. Это ненормально. При ребилде все библиотеки указаные в файле проекта должны быть скопированы обратно в /bin/ и там нормально увидиться. Если у тебя не так, то надо чекнуть рефренсы у проекта.
>>2583160 > Все равно надо потом это все подчищать? Ды-а! Подписка на эвент создает делегат который держит ссылку на объект, и явное создание дегата с его передачей объекту-потребителю тоже держит туже самую ссылку. От событий надо отписываться, а делегаты занулять.
>>2583401 Просто появляется желтый треугольник над проблемной либой. Причем если я чищу obj из одного проекта, то как бы норм, а если чищу obj всех проектов решения, то выскакивает проблема.
Может где-то перекрестные связи между проектами. Одно требует от другого, когда то не готово. Технически не создаю рекурсию — студия не ругается, но через третье колено боюсь что вероятность есть. Я думаю, что проблема в этом.
а поясните за MethodImplOptions.AggressiveInlining насколько он вообще рулит? в интернетах очень противоречивая информация, кто-то говорит мамой клянусь работает как часы, кто-то говорит что компилятору похуй вообще он лучше тебя знает а я просто не знаю пытаюсь сбэкпортить одну вещь на говно мамонта где его еще не было
>>2583707 Ну навесить же его можно на что угодно, так что это не более чем указание "я бы хотел чтобы оно всегда инлайнилось". А результат не гарантируется, ведь 100500 причин которые могут не дать его инлайнить.
>>2583707 >насколько он вообще рулит? Вроде это опциональный атрибут. Конпелятор его игнорит если заинлайненый метод больше определенного размера(32 инструкции IL) и в нем есть вызовы других объектов(т.е. не к своим данным обращаешься).
Хочу кодить на c# пиздец как! Но проблема в том что вакансий норм нету. На удалёнку говноджуна не возьмут, с текущей работы 100% придётся увольняться, ибо c# на проектах не задейстаован вообще никак. Печаль...
Мини-вопрос насчёт нейминга. Есть такой enum: SignInStatus { Success, Failure, Cancel }
Увидел в другой коде похожий enum, но там Cancel написан в прошедшем времени Cancelled. Какой вариант правильнее - мой или их? Мне кажется, если ты пишешь Cancelled, то другие значения должны быть Succeed и Failed тогда.
>>2584471 Я бы все отдал за вызов расширений из класса, для которого они не были написаны.
>>2584462 У нас в бейсике добавляется аргумент <Extension> перед функцией-расширением, но параметры пишутся стандартно. В шарпе тоже должен быть какой-то идентификатор, который бы отличал обычную функцию от функции-расширения. Это касается не только ReactiveUi, а вообще всех расширений. https://metanit.com/sharp/tutorial/3.18.php
Не пытайся играть в колдунство, запоминая заклинания — загуглил бы про расширения и не ебался бы джва часа.
>>2584525 >Увидел в другой коде Похоже на меня. С инглишем дубово и могу одно написать в прошедшем, другое в настоящем, перепутать selection с selected. Вообще, эти игры в склонения боком выходят, когда одно дург с другом переплетается, и у тебя уже целый зоопарк: одной свойство так, другое свойство сяк, метод вообще эдак. И уже визуально начинаешь путаться.
Я думаю, что лучше как у тебя. Наверно надо относиться к этому как ключевым словам — они неизменны и потому легко читаемы.
>>2584525 >Какой вариант правильнее Все правильные. В нете есть соглашение, что окончание -ed пишут когда что-то уже строго произошло, -ing пишут когда вот прямо сейчас произойдет, и без окончаний когда время неважно.
>>2584756 >Попробуй писать is Nothing и в конце строки не ставить ";" Даже если мои ноги сгниют от крокодила, а мать продам в рабство, даже тогда я буду выше этого.
Ребят, я в ярости. Кому-нибудь приходилось делать фид для яшики.недвижимость на шарпах? Согласно документации корневым элементом должно быть: <realty-feed xmlns="http://webmaster.yandex.ru/schemas/feed/realty/2010-06"> ... </realty-feed> И ёп жежь как оказывается не проблемно получить именно такой элемент с именно таким неймспейсом на шарпах. во-первых по умолчанию туда пихаются неймспейсы по умолчанию xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema". Ладно их можно прибрать:
var s = new XmlSerializer(typeof(Feed); XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add("", ""); s.Serialize(SomeStrem, new Feed(), ns);
Приводят к отсутствию неймспейса вообще, пока действую приведением опосля в нужный вид уже сериализованногго текста, но это же хуйня, какого хуя сериализация не может проходить по моим правилам, шо за бред? Есть тут кто имел дело с яшей.недвижимостью, памахите
>>2584837 >Даст результат >xmlns:xmlns Нутк да, ты же добавляешь неймспес с названием "xmlns". Получается такое дублирование. Походу это у хуяндекса какое-то ебанутое представление о немспейсах(они пытаются дефолтный переопредлить на свой).
Кто нибудь итт использует авалонию? В ней можно как-то кастомизировать заголовок, не отключая его полностью? А то не хочется самому писать обработчики перетаскивания, группировки и тд.
Где в ASP.NET Core выполнять логику с кастомной инициализацией (например, сходить в бд, прочитать какие-то файлы, установить расписание на основе этих данных)? В WPF был метод OnStartup и события Initialized/Loaded. Эту подготовку надо выполнить непосредственно перед запуском самого приложения. Какие в ASP (webapi) есть для этого средства?
наткнулся в коде на вот такой блок: #if DEBUG_CHECKS //.... #endif вроде можно #define там же c этим впилить и будет компилиться но как его врубить для всего проекта?
>>2585102 Попробуй сделать сервис наследованный от IHostedService. Там есть методы StartAsync и StopAsync, которые работают при запуске/завершении приложения.
Насчёт ЛОГОВ. Во время работы приложения собираю различную информацию, в том числе различные ID'шники связанные с пользователем. Если происходит сбой, то вся эта информация отправляется на сервер.
Тут подумал, а ведь нельзя так открыто собирать ID'шники, ибо по ним можно установить пользователя, например? Хочу обрезать все ID'шники до 8 символов с конца, потому что мне не нужен полный ID для отладки на сервере. Правильная мысль? И как бы лучше это в коде запилить? Может добавить метод StringUtils.EscapeId(...);
>>2585092 А писать постоянные ConfigureAwait так выразительно аж пипец.
>>2585102 IHostedService и следи чтобы он выполнялся первым. И на конец StartAsync он свою работу сделал. Вообще нигде не написано что сервисы стартуют последовательно, но иначе без вариантов.
Народ, вы знаете какой-нибудь сервис для локализации приложений вроде Lokalise? То есть где мы могли бы получить перевод файлов ресурсов для .net приложения на другой язык?
>>2585408 >А писать постоянные ConfigureAwait так выразительно аж пипец. ну да, гораздо лучше этой ^!@$^&&=>(xyipizda) ведь мы для людей пишем а не для таукитян или какой-то там машины ебучей
>>2585663 >ведь мы для людей пишем Ты не поверишь, но людям не нужны бесполезные new, ;, излишние скобочки Попробуй какой нибуь Parallel.Foreach сделать, так запутаешься в скобочках Выразительность - не значит магические символы.
Попробуй банальное "хочу foreach но с индексом" и сам все поймешь
и да, как раз этот ConfigureAwait настолько "выразителен", что люди предпочитают его не писать даже если это стоит некоторого оверхеда.
Все-таки херовый в нете ResourceManager. Сто лет его не использовал и забыл, что он вкомпиливает ресурсы из папок через точку. Типо путь "Folder/Res1.resx" превращается "Assembly.Folder.Res1". Сидел джва часа дебажил почему же ресы не видно. Блед что мешало дать явную настройку по какому нику их искать в бинаре.
Шарпаны, мы в шараге учим алгоритмы с сисярпом, у меня ноут 2015го и на нем вижуал студио скрипит пердит, да и винда тоже попердывает. Думаю поставить линукс, только мне нужна среда и компилятор сишарпа. В гугле пишут моно и тут два вопроса - во первых он еще развивается? Когда я искал моно для юнити то вроде мне писали что они давно прекратили его обновлять. Во вторых какие есть альтернативы без особого пердолинга в плане что написал код и исполнил без танцев с бубнами как в студии или близко у этому?
>>2585733 Это... Поставь студию 2008-2015 под неты 3.5-4.6 Для шараги должно хватить за глаза. Все проекты сделаные в них в джва клика портируются на современные поделки микрософта.
Алсо студия 2008 сейчас воспринимается как фитоняшка. Она даже быстрее вс-кода, а ведь когда вышла была жирным тормозным чудовищем на фоне делфей, лол.
>>2585687 >Попробуй банальное "хочу foreach но с индексом" и сам все поймешь "хочу foreach но с индексом" - это фиаско. Foreach, ты как раз и используешь, когда тебе похуй на индексы. Если тебе не похуй, то ты не исползуешь foreach. И да, в шарпе даже такую хуйню можно делать очень просто (см. пик)
>>2585795 ну да. это ж шарп ))) выразительность такая выразительность )
>>2585797 дело не в сложности, а в читабельности наслоение семантического шума просто потому что "а иначе и нельзя, это ж шарп"
Какой нибудь foreach(... in items.WithIndex())? ну можно запилить такой метод типа да, но это будет велосипед. И каждый пилит такой свой велосипед со своим поведением. Ай красота (сарказм).
>>2585791 >Выразительность этой портянки никакая. Какая тебе нахер выразительность? Ты о чем вообще? Ты в любом другом языке, если задашся целью получить индекс в foreach, будешь примерно такой же хуйней пользоваться (кортежем или его подобием). Если тебя смущает linq, то сделай экстеншен в который его спрячешь и все у тебя будет красиво и "выразительно". Понавыдумывают себе какой-то хуйни, а потом носятся с ней.
>>2585801 Мне самому шарп в последнее время не очень нравится. Хотел с бейсика слезть, недавно открыл проект на шарпе, а там студия в очередной раз порекомендовала поставить ":", чтобы сократить хуйнюнейм. Как-то даже не смешно уже.
>>2585808 >Какая тебе нахер выразительность? Ты о чем вообще? О выражении вещей короче, без лишнего семантического шума и при этом не скатываясь в магию а-ля "пишем на перле"
>то сделай экстеншен в который его спрячешь и все у тебя будет красиво и "выразительно". это и есть проблема. я сделаю свой,другой чел сделает свой, а еще один вообще не сделает ибо любой велик это велик
кроме шарпа я активно пишу на питоне и на котлин. те же вещи выражаются короче и чище. По сравнению с ними код на шарпе выглядит как "жава какая то". Очень много семантического шума, то есть то, что в другом языке можно выразить чище и короче и НЕ потерять в понятливости
ты же понимаешь что 1442 и "тысяча четыреста сорок два" означают одно и то же, но как бы есть нюанс.
А если и тут не понимаешь, то посмотри на визуал бейсик и попробуй его прочитать. Шарписту сложно читать визуал бейсик, хотя там ведь как бы тот же код написан, просто другим способом.
>>2586387 Зачем авалония, когда есть winui? Да кривой, да багованный, зато нативный и красивый! А я сейчас пишу тестовое на uwp, такая срань, хоспаде, окон нормальных нет, навигация путем вызова глобальных объектов, это же надо было придумать
>>2586387 Тут дело не в сглаживании, а в привязке к пикселям при прорисовке векторных шейпов букв. Почему "l" вместо палочки в один пиксель, рисуется три: желтая, черная, и синяя? Вероятно, идет не по центру пикслей. В WPF тоже не все волшебно — нужно подобрать подходящий размер шрифта, чтобы не блюрилось. Может быть так, что одни буквы норм, а другие в блюре.
Так что, на первом месте важно точное попадание в матрицу пикселей. А уж если это никак невозможно, то тогда в ход идет сглаживание. Решать все проблемы сглаживанием — дебилизм.
>>2586411 >В WPF тоже не все волшебно в WPF есть кроме выбора сглаживания клиртайп еще TextFormattingMode там Display/Ideal, которые дают крутой результат - неотличимо от GDI и напрочь решают проблему "мыльности шрифтов WPF"
А вот у авалонии такой настройки есть. То есть субпиксельное сглаживание вроде есть, но такое себе.
>>2586424 > в чем он нативный? принцип схож с WPF и при этом работает медленнее чем WPF В том, что использует системные контролы, написанные на плюсах.
>>2586420 >TextFormattingMode там Display/Ideal Hueta, даже VS им не пользуется. Если, конечно, речь идет про связку TextOptions.TextFormattingMode="Display" TextOptions.TextRenderingMode="ClearType"
Да, каждая буква чистенькая, но при этом каждая буква сдвигается до оптимального для рендера места, из-за чего образуются конские щели между буквами. И весь текст выглядит словно дешевка.
Почему uwp не поддерживает net core старше третьей версии? Ещё и ссылаться на не-uwp библиотеки нельзя. Чтобы сделать миграцию бд в этом говне нужно создавать отдельный консольный проект.
Думаю как переделать интерфейс. Как бы это грамотно сделать?
Есть простой UserStorage, который сохраняет/загружает различные данные по ключу, на мобилках (пик 1)
Мне нужно добавить возможность сохранять персональные данные, чтобы они были доступны только конкретному пользователю по его ID. Так как в игре игрок может сменить аккаунт, загрузив другой через Facebook или Google.
То есть есть общие данные для всех: настройки графики, управления, например. Есть персональные связанные с конкретным аккаунтом: список новых предметов, которые игрок ещё не посмотрел, инфа о логине и т.п.
Пока набросал вариант (пик 2). Передавать alias(он же ID аккаунта) каждый раз при get/set не хотелось бы. Лучше его задать один раз в самом Storage.
Аноны, нужна либа для конвертации пдф в картинки. Не ток изображения из пдф, но даже если они текст содержат, то страницы надо в картинки переводить. Желательно без потери качества
Как фотошоп умудряется держать 30МБ оперативки? Или вот телеграм - 20МБ. Понятно, что если я переключусь, то там подскочит, но как они это делают в режиме простоя? У меня на старте 80МБ и так висит.
Зато наш православный яндекс диск, у которого нет ни интерфейса, ничего, жрет под 500МБ.
Обещал держать в курсе - держу. Прислали ответ, что тот собес с тестом на w3schools прошел, но оффер не дали, а ответили что будут искать подходящий проект. Прошла неделя, я чет скис, пошел искать вакансии в ебларуси на хх и оказалось, что их 2.5 на дотнет. Приуныл еще больше, но резюме свое разослал.
>>2587036 У шиндоса есть рабочий набор и выделеная виртуальная память. Они сильно не совпадают. Приложуха может думать, что она себе дохуя памяти выделила, но до тех пор пока она реально не начнет ей пользоваться у нее ничего нет.
Алсо, в нете память занимает рантайм сразу с запасом. Реально твое приложение может ей не пользоваться, но уже на старте она зарезервирована как рабочий набор и готова выделиться по первому new в коде.
>>2587118 >3rd technical interview Ебануться. Я бы и на второе техническое не пошел бы. А тут третье и все для того, чтобы "Мы посмотрим, можно ли тебя куда-нибудь приткнуть"
>>2587139 Там пунктуация неправильная. "Третье, техническое интервью". Первым был скрининг с эйчаром, вторым звонок с хз кем просто поболтали о том как красиво писать код, а как некрасиво, а третьим было именно это техническое собеседование.
А как паттерн пайплайн делается с disposable объектами? Вот есть у меня пдф файл, нужно его разрезать на страницы и я хочу параллельно каждую страницу дальше обрабатывать, как мне из одного метода в другой передать stream, чтобы память не утекала?
>>2587244 вариантов куча от заброшенного TPL DataFlow или же PLINQ через "заводим несколько очередей и перекладываем по готовности" до "тупо семафоры навешиваем и радуемся"
>>2587383 да можешь хоть Parallel.For все зависит от твоей задачи, желания "не занимать потоки больше необходимого" (или плевать на это) и личных предпочтений "люблю вот такую абстракцию".
>>2587386 Билдер должен возвращать объект, который нетривиально создавать и заполнять самому. Через какие языкозависимые конструкции он работает - похуй, паттерны от языков не зависят.
Аноны, есть задача такая, под которую я никак не могу подходящий паттерн подобрать. Есть базовый класс, который содержит поля и метод, который используется всеми наследниками. Есть текст, в зависимости от того, содержит ли текст все ключевые слова я хочу создать экземпляр наследника. Норм будет хранить тип и связанные с ними ключевые слова в каком-нибудь текстовом файле и сделать фабрику, которая будет использовать Activator.CreateInstance() и в зависимости от ключевых слов создавать экземпляр класса.
>>2587428 Ну и да, хочу, чтобы если находило один класс, то другие уже не проверяло. Эт думаю сделать через if с условием. Наскок это конченный подход?
>>2587428 Подход как подход. я такой подход даже в одной книжке видел Но сам по себе подход говно Хранить тип где то снаружи и любой рефакторинг грозит сломать этот тип... понятно что в общем то двигать никто не будет, ведь это как плагины. но лучше все таки сделать сопоставление
Представь у тебя примитивная система плагинов на уровне палеолита. и делаешь ты ее так 1 заводишь аттрибут PluginKeyAttribute 2 используешь на классах плагина это аттрибут так [PluginKey("foo")] class MyClass 3 на старте ищешь все это и заводишь словарик key=>type 4 используешь в текстов файле уже жесткое что то типа (да как угодно хоть жсон) foo|param=value 5 по foo ты знаешь тип
>>2587428 ну и делать через Activator.CreateInstance() тоже бяка. Можно, просто грязновато. в случае какой то ошибки получишь невразумительное исключение вместо нормального если бы делал нормальные фабрики.
>>2587433 >в случае какой то ошибки получишь невразумительное исключение вместо нормального если бы делал нормальные фабрики. Фабрики? Типа абстрактную фабрику сделать или как?
>>2587474 ну никто не запрещает кроме класса который ты собираешься инстанцировать также иметь и фабрику для инстанцирования хоть даже статический метод в том же классе с указанием имени метода в аттрибуте, или по конвенции, или еще как.
Тут же все "зависит". Если у тебя тупой файлик вида foo|param=value¶m2=5 то активатору ты будешь кормить стринги, а значит конструктор класса должен получать обжектс, потом как то кастить. В общем неявность плата за универсальность.
С фабриками кода больше, но и нет неожиданностей. да и проверить файл с параметрами можно не инстанцируя все на свете.
>>2587587 >Как за этим следить? регистрируй его в контейнере в первую очередь и жирный такой комент напиши что он обязан быть первым
ну и конечно в StarAsync дождаться все await. никаких "запустил и забыл авось успеет"
но вообще это нужно если у тебя остальные сервисы зависят от работы первого
>через метод расширения для IHost. покажи о чем ты. Но вообще проблема стоит " у меня асинк инициализация как мне быть и принципиально не хочу GetAwaiter().GetResult() (хоть и знаю что ничего страшного не будет ибо нет контекста синхронизации)"
попутно же IHostedService может получить зависимости, а также есть команда стоп, которая асинковая по сравнению с подиской на завершене приложения.
> регистрируй его в контейнере в первую очередь и жирный такой комент напиши что он обязан быть первым Разве порядок вызовов зависит от порядка регистрации?
Нужно ли в wpf создавать отдельный слой бизнес-логики, который будет работать с базой данных, или можно дёргать контекст базы данных прямо во вьюмодели?
>>2587515 Хм, окей, а как это сделать с фабрикой? Ну примерно, я сейчас не особо осознаю это. В файлике я могу хранить ключевые слова в виде массива и само название класса наверное или что-нибудь, чтобы указать связь, что если текст содержит эти кейворды, то нужно вызывать либо эту фабрику, либо инстанцировать этот класс
>>2588083 DAL слой не такой уж и сложный в реализации и даже если тот кто ревьюит код против, то максимум, что он сможет тебе предъявить, это "я не люблю такой подход" или "у нас так не принято". А вот за то, что ты запихнешь работу с данными во вьюхи, вероятность того что тебя опустят на-а-амного больше.
>>2588338 Спасибо за ответ. Тогда еще вопрос - я для удобства оборачиваю все команды и свойства во вьюмодели в регионы, а затем группирую эти регионы по типу (собственно команды, свойства, поля), как к такому относятся? Слышал, что советуют не использовать регионы.
>>2588424 По моему опыту 50/50. Просто те кто пользуется регионами обычно делают это молча, а те кто нет - постоянно высказывются, как они их не любят.
Хотя я раньше тоже любил все поделить на регионы, чтобы было красиво и понятно. А сейчас научился писать код так, что не вижу в них необходимости, за исключеием редких случаев. Все и так понятно.
>>2588457 Я часть кода временно заворачиваю в регион, чтобы глаза не мозолило и не утомляло постоянным скроллингом. А потом логически группирую, но чтобы в классе не было больше трех регионов. Шиза, это когда в каждом регионе по 1-2 функции или свойства.
А есть обратная шиза — делать зоопарк классов и раскидывать на миллиард папок, что сорт оф регионы. Все хорошо в меру.
>>2588424 >я для удобства оборачиваю все команды и свойства во вьюмодели в регионы А почему везде пихают команды прямо в тело вьюмодели? Почему не сделать специальный класс-сборщик всех команд? У меня на пикрил есть отдельное свойство Commands, в котором и лежат все экземпляры команд.
>>2588502 Чудес не бывает. Вместо 30 функций в одном классе у тебя 10 классов по 3 функции. Ну кроме случаев оверинжениринга, когда ты пишешь "в лоб". Но говно где-то держать придется — не в регионах, так в папках; не в папках, так в проектах; не в проектах так в библиотеках.
>>2588509 Ну отделять поля от классов это действительно абсурд, а вот когда у тебя куча расширенных свойств или свойств зависимостей, то в регион окутываю.
А я питонист вообще-то. Как думаете меня выпрут если отказаться? Так-то проблема не только в языке. Этот сервис написали 10 лет назад с тех пор делали по 3 коммита в код на 10 строчек. Просто чтобы он продолжал работать. Сервис тупа создаёт вмки в облаке и конектит несколько вмок к одной локальной сети. Чтобы уже потом внутри этих вмок можно было кластер из наших сервисов накатить. Это для тестов. По факту я sdet, который тулзы для тестов пишет. Какого хуя мне нужно этот сервис пердолить? Они хотят чтобы я добавил фичу чтобы сервис дополнительные приватные сети на этив вмки накатывал. И обязательно делал это через 1 сетевой интервейс. Просто две сети накатать это пулреквест на 10 строчек. А вот настроить это через один интерфейс это ебать как пердолить надо. Сначала написать опёртку над консольным клиентом, который этими сетями управляет. Сейчас она кастрированая. Потом написать алгоритм выбора сетей из тех, что в облаке заранее созданы. Но нельзя просто спросить что за сети в облаке. Их нужно вручную положить в бд. В майкрасофт cql server. С их ебанутым синтаксисом. Вручную. Потом нужно орм для новой таблицы подключить. Толкьо потом можно алгоритм выбора свободных и подходязих сетей написать. Дальше как сервис создаст недокластер нужно ещё какие-то скрипты написать, которые будут интерфейсы настраивать внутри каждой вмки. И это на сищарпе. Нужно ещё что-то придумать с выбором мак адрессов. И под конец клинап поправить чтобы сначала допсети детачились, интерфейсы помечались свободными в бд и только потом удалялись вмки. Пиздец. На сишарпе это делать. В коде, который 10 лет никто не трогал. И ещё этот сервис гоняется на виндовой вмке в облаке. Без возможности автодиплоя. И без тестов. То есть мне нужно всё это без ошибок написать, собрать проект, скопировать все дллки на тот сервер подменив старые версии и там перезапустить этот сервис. Про ci не слышали когда его делали. Пиздец. Апгрейд с даунтаймом. Без тестов. Вручную. А я питонист вообще-то.
>>2586099 У райдера много свистоперделок для рефакторинга и удобства говнокодинга, типа автоскрытия using директив. Плюс юай отзывчивый. Ну и статический анализ достаточно бодрый. Студия более деревянная и олдфажная, зато имеет ебовейшую интеграцию с докером, позволяющую дебажить 50 микросервисов как обычный хелловорлд. Просто нажимаешь кнопку и поехали прыгать по брекпоинтам. Для статического анализа там есть решарпер, но он делает юай тупить еще сильнее.
Собственно интеграция с докером однозначно делает студию лучшей в моих глазах. А на работе заставляют использовать райдер, блядь
>>2588585 Ты какую-то хуйню написал. Тебе нужно просто написать 2 скрипта на баше. Дергать их шарпом. Все. Нахуя ты вот так вот усложняешь? Ты джун чи шо?
>>2588110 А ещё, можно ли полностью отвязать клиент от фабрики? Чтобы при добавлении нового класса не нужно было менять клиент или уже существующую фабрику?
А чем это тличается от WPF? Там можно биндить сочетания клавиш к командам. <ListView.InputBindings> <KeyBinding Key="Enter" Command="{Binding btnUpdate}" /> </ListView.InputBindings>
или самое тупое - подписка на событие по KeyDown, где ты запускаешь команду из DataContext.
>>2588636 В wpf то можно, там вообще много чего можно... А вот в uwp не все так просто. Там нет inputbindings, есть только бехавиоры срабатывающие при нажатии клавиши, но они не работают, по крайне мере у меня.
>>2588636 > или самое тупое - подписка на событие по KeyDown, где ты запускаешь команду из DataContext. Пока так и сделал только previewkeydown, обычный опять же не работает, пришлось добавить в команду проверку клавиши, что по моему нарушает принцип mvvm.
>>2588650 Мне говорили, что не нарушает. Там главное правило, чтобы view не переплеталось с modelView. А в загоне view ты можешь делать что угодно, но ты не можешь к примеру пердать экземпляр своего ListView вьюмодели. Собсно смысл в том, чтобы одна часть могла работать без другой и могла быть взаимозаменяемой.
Я тоже делал проверку без InputBindings. Не помню по какой причине. Но как я уже писал, я создал класс Commands — хранилище всех команд вьюмодели, который был сорт оф словарь ресурсов, поэтому я мог спокойно пройтись циклом по всему списку доступных команд.
А каждой команде хранил сочетание клавиш keyGesture. Сопсно при событии KeyDown, получал тот же keyGesture из keyEventArgs и просто проходил по списку и сравнивал. Т.е. у меня не было лесенки из else.
>>2588657 >из codebehind, никакого mvvm Так метод же находится не во вьюмодели. Че не так? Это может быть написано в partial class твоего view. Ну есть же всякие конвертеры данных. Они тоже частично на шарпе пишутся и успешно применяются в MVVM.
>>2588083 В общем случае держать тонкими контроллеры или вьюмодели нужно. вьюмодели и так слишком жирные обычно.
>>2588424 >Слышал, что советуют не использовать регионы. А это те которым "если тебе нужны регионы значит ты что то делаешь неправильно, делегируй". Но по факту вьюмодели по своей сути "god objects" и дербанить это не очень удобно (рождаются всякие MVVMC), но обычно это велосипеды же.
А еще есть такой же момент вида "вьюмодели в папке viemodels, контролллеры в controllers, виды в views" что конечно верно. Но feature папки удобнее не только в модели, а и в этом деле.
>>2588650 >что по моему нарушает принцип mvvm. принцип MVVM гласит что вьюмодели не должны знать явно про вид. То есть вьюмодель предоставляет данные, а как и кто их рисует или не рисует, а там вообще тесты - личное дело буковки V Так что вид может использовать биндинги, может не использовать, может совпадать по структуре с вьюмоделями, может не совпадать - его личное дело и ничего не нарушает.
>>2588110 Да ну все просто 1 имя класса в файле хранить плохо. Причина простая - а вдруг ты захочешь его переименовать или еще чего, а если обфусцирую. И даже если ты "мамой клянусь этого делать не буду тут на века", то все равно ИМХО лучше отделить имя инстанцируемого класса от имени в файле. Я не любитель "авось тут у нас все будет хорошо", вон в шарпе некоторая работа с ресурсами, некоторые конфиги используют прямое указание класса с нейспейсами и любой рефакторинг все ломает. Раздражает.
2 Инстанцирование этого класса. Если у тебя параметры к этому классу всегда одинаковые (набор кеев), то конечно ты можешь их распарсить, проверить этот список и засунуть в конструктор.
А если параметры разные? разное количество и типы? И тут появляется зависимость от порядка значений в файле (минное поле) или твой конечный класс должен иметь конструктор который принимает какой нибудь IDictionary<object, object> и оттуда все сам достает.
Можно ли так? Ну конечно можно. Вернее оно будет работать. Но если ты привык все делать чисто, то у тебя будет глаз дергаться что класс вместо прямого принятия параметров принимает objects и сам парсит. Нормальный класс должен иметь нормальный типизированный конструктор, а грязь "инстанцирования" прячется в какой нибудь фабрике, которую ассоциируешь с классом. файлику незачем знать про фабрику. Это код интерпретации этого файла должен знать "ага существует фабрика, вот ее и вызовем вместо Activator"
>>2587428 Делаешь базовый класс MySupperDupperFactory. В нем метод IMySupperDupperClass Create(); Делаешь класс FileKeywordsFactoryResolver с методом GetFactory(string path). Фабрики получаешь через интерфейс, четко указав список тех что тебе нужны(для понимания будет лучше, можно ) В нем - получаешь фабрики и по твоей логике - выбираешь нужную фабрику.
Помогите с дилеммой. Вот допустим я делаю команды с записью в историю (свою собственную). Допустим одна команда создает папку и делает запись в историю, а другая команда перемещает файлы и делает запись в историю.
А теперь у меня новая команда — переместить файлы обернутые в новую папку. Т.е. команда последовательно выполняет две команды выше, каждая из которых сохраняет точку истории.
Тут напрашивается некая группа точек истории, чтобы юзер нажал всего один раз Ctrl+Z, но отменился сразу целый ряд действий. Такое я видел в vba скриптах, когда ставился некий маркер в начале и в конце операции. Типа:
ActiveDocument.BeginCommandGroup "My Command" ... тут ряд команд ... ActiveDocument.EndCommandGroup
Но вот что меня смущает. А что если мне надо перенести тысячу файлов, каждый в свою папку? Этож как история засрется. Ведь в каждой точке истории хранится попутная инфа, которая в данном случае будет тупо дублирующимся мусором.
Как такое решается или решается ли вообще? Усложняется команда? Т.е. у меня команда по умолчанию должна иметь возможность создавать N папок? А команда по перемещению файлов иметь возможность по умолчанию перемещать в N разных директорий? Так у меня в некоторых случаях и так команды перегруженные. Ну к примеру когда ты помещаешь папку с похожим именем в директории, то ее бы следовало переименовать — это тоже должна быть отдельная команда со своей историей. Или после того как переместил, ты должен итемы визуально выделить — это еще одна команда. Но у меня пока все это дерьмо хранится в одной команде.
Хз что делать: eсложнять команды (хотя мне хочется их еще сильнее дробить) или засирать память.
>>2589105 >ActiveDocument.BeginCommandGroup "My Command" Сорт оф транзакция да. В винформах что-то похожее есть для любой нетривиальной операции с визульным компонентом. Например написал команду которая свапает два цвета у контролов - установка нового цвета записывается в историю, и получается там две операции при свапе, но команда логически одна. Поэтому появились транзакции - т.е. группы команд которые можно отменить или повторить по требованию. В предельном случае транзакция состоит всего из одной команды, но их может быть сколько угодно.
Звонили из какой-то компании, куда откликался на хх. Сказали офис за городром, но у них есть корпоративный транспорт, курирующий с конечной станции метро. Спросили ожидания по вилке. Сказал 1.6к долларов. Ответили, что "мы в поиске более джуниора для этой позиции и потолок зп для нее 1.2к". После чего со мной попрощались и бросили трубку. Хз, наверное надо было соглашаться на то, что дают.
>>2589787 >Хз, наверное надо было соглашаться на то, что дают. Если есть где жить. Если есть хоть какая финансовая поддержка (родители, жена). То для самого-самого старта вполне неплохая сумма.
>>2589788 >Я видел где функции почему-то возвращают булевый статус, а объекты результата возвращают через референсный параметр метода. К чему такие сложности? Это микрооптимизация чтобы не вычислять хеши два раза или не бросать дорогие исключения на тривиальные ошибки парсинга.
Как пример со словарем - тут хеш ключа вычисляется два раза: if (Dict.ContainsKey(Кey)) { Result = Dict[Key]; // что-то дальше делаем с Result } Превращается в: if (Dict.TryGetValue(Кey, out Result)) { // что-то дальше делаем с Result }
>Что эффективнее: возврат Null или False для случаев, когда нужно к примеру найти какой-то итем? Без разницы на самом деле. Главное чтобы пользователи методов были готовы поймать null или обработать False. В некоторых случаях хороший вариант возвращать - дефолтный объект-заглушку нужного типа. Тогда даже проверять ничего не надо, ведь с этим объектом алгоритмы идущие дальше не поломаются.
>>2589788 Метод find возвращает ienumerable<t>, если ничего не найдено то пустой. Get возвращает объект, или выбрасывает исключение. TryGet возвращает результат в виде bool, и значение как out параметр. Пидарасы возвращают null.
>>2588695 > И тут появляется зависимость от порядка значений в файле (минное поле) Да, я тоже об этом думал, причем один класс может отвечать на несколько кейвордов. > файлику незачем знать про фабрику Но фабрике нужно как-то знать о том, как именно эти кейворды ассоциировать с именно этим классом. А еще как-то нужно собрать все фабрики, в идеале бы не нарушать open closed principle
>>2589921 >Но фабрике нужно как-то знать о том Ну конечно нужно. Это ведь сама причина создания этой фабрики
А фабрику можно или в реестре фабрик хранить как чел выше предложил (подходит если весь код твой и в рантайме типы не добавляются) или прямо в конечном класса статический метод Create который "я типа тут такой перегруженный конструктор, имею право" или а том же аттрибуте где указываешь PluginKey можно и фабрику указать и тогда фабрика будет найдена автоматом.
>>2590326 > реестре фабрик Я, если честно, не понял, как оно должно работать. Есть где-нибудь пример кода, который это реализует, чтобы вас не заебывать вопросами.
>>2590333 Кто-то должен уметь конструировать конкретный объект. Значит это в минимуме метод. Куда то этот метод нужно приткнуть.
А значит это в минимуме хоть тупой словарик вида Dictionary<string|Type, Func<paramobject, object>> где можно "дай мне фабрику по ключу/типу" или класс обертка над подобным словариком чтобы можно было красиво так запросить .GetFactory<TResult>();/.GetFactory(resultType);
Но так как ты работаешь на уровне рефлексии и тебе дженерики не нужны, то у тебя может быть даже одна большая фабрика которая умеет создавать все типы где ты просишь "сделай мне объект" банальное factory.Create(resultType);
и если забудешь написать, то он при кодировании упадет "я не умею конструировать такие объекты"
Не усложняй простые вещи. В этой задаче сложность на уровне "куда положить? да пусть тут лежит, как то пох", то есть вопрос стоит так - если я добавлю еще один класс, то где мне придется дописывать код, удобно ли это делать и что будет если я забуду написать фабрику для нового типа - на деле ничего не будет, ведь если кодер не имбецил то он хоть раз запустит проверить "как работает код что я написал" и получит ошибку в рантайме и допишет.
>>2590467 Зачем? Одна из сутей метода расширения — подхватить экземпляр в качестве одного из параметров. В случае со статическими методами в этом нет смысла. Что мешает просто обратиться к методу напрямую?
>>2590358 >Какие вопросы могут задать на эту вакансию-мультитул? "Вы готовы разгребать все это говно?" Это единственный вопрос который они имеют моральное право задать. Правильный ответ, если что: "Нет".
>>2590334 > А значит это в минимуме хоть тупой словарик вида Dictionary<string|Type, Func<paramobject, object>> где можно "дай мне фабрику по ключу/типу" О, я это уже видел, значит, хитростей тут каких-то нет.
>>2591072 хитрость в том что писать тип как строку можно только в некоторых случаях - некоторая работа с ресурсами (плохо, но такой уж дотнет), конфигурация (а это уже плохой подход, но опять же дотнет это) и в логировании (ну тут хотя бы выбора может не быть, ок)
>>2590958 Кек. Я даже знаю над чем придется работать по этой вакансии. В моем банке примерно на такой же куче говна вся эта механика крутилась, но сейчас уже все это на .Net6 переписано и другую БД. Плюс очереди на подходе. Правда от XML-к никуда не деться, но тут уже проблема, что это формат ЦБ и от него никак не уйти.
>>2591173 >Правда от XML-к никуда не деться, но тут уже проблема, что это формат ЦБ и от него никак не уйти. Я не понимаю этого, схуяли ваще? Кем это установлено? Почему бы не перейти на нормальный жсон или прото?
Как в wpf увеличить частоту рендеринга, чтобы при растягивании окна не появлялось пустых полей и мерцания, как например на гифке? Хотя такая проблема не только в впф, я бы даже сказал только в винформах окна растягиваются плавно интересно почему.
>>2591247 Я к херам избавлялся от стандартной рамки окна и делал прозрачным задник.
Это точно впф? Как будто открыл редактор VBA 6. Даже меню похожее. И нахера тебе фпв на шиндовс 7? Ты бы еще на ХР запустил. Если у тебя так лагает с пустым практически окном, то земля тебе пухом.
>>2591279 > Это точно впф? Как будто открыл редактор VBA 6. Даже меню похожее. На гифке просто пример мерцания. > И нахера тебе фпв на шиндовс 7? Ты бы еще на ХР запустил. Если у тебя так лагает с пустым практически окном, то земля тебе пухом. Это не у меня лагает, это у всех лагает, ты бы хоть материал по ссылке прочел. Буквально открываешь большинство приложений и будет такая хрень.
>>2591284 >На гифке просто пример мерцания. Это не просто пример, это ответ почему мерцает.
>Это не у меня лагает, это у всех лагает У меня не лагает.
>большинство приложений и будет такая хрень. Если не долбоебы делали, то устанавливали фон прозрачным или в цвет окна. Да, контент подтягивается за окном, но вместо черноты прозрачный фон.
На видеорил самый простой вариант, можно еще лучше.
>>2591284 >>2591289 ... единственный геморный вариант черного фона — при загрузке окна, который возникает даже с опцией AllowTransperency. Тут надо оптимизировать так, чтобы все тяжелое говно разом не подгружалось.
И вообще, я какого-то единого подхода для себя не нашел, вот чернотой при старте я мучаюсь.
Меня наконец позвали на первое очное собеседование, если возьмут, то предстоит заниматься десктопной разработкой wpf, uwp, win app sdk. Можете накидать тем, которые у меня могут спросить?
Хм, подход засунуть кучу тасков в list, потом делая while(list.Any()) и внутри этого цикла await Task.WhenAny(list) и удалять этот таск из списка нормальный? Потенциально запуская добавляя в еще один список таск и вызывая новый метод через Task.Run() нормальный? Вроде как выигрывает мне время.
Шарпаны-шарпаны. Вчера делал HTTP-сервер. Заняло это 3 часа, включая гуглеж, проверку и общение с анончиками в /b/. Цель была сделать максимально примитивный сервер, который может отдать html-файл из папочки www. В общем. В /b/ анон сказал что лютый говнокод и меня не возьмут на работу.
>>2582351 (OP) Слушайте, посоветуйте пожалуйста книг/ресурсов по написанию хорошего кода. Я так-то шарп знаю, но вот максимально редко пользуюсь всякими интерфейсами делегатами и прочей хуйней. А я хочу писать качественный код, который быстрый, удобочитаемый и модифицируемый. Помогите мне!
>>2591627 Нет никакой проверки на то, что всё было задиспожено, методы имеют ебанутые названия, отсутствует кодстайл, где-то запятые проёбаны и имеют неодинаковый вид тоже самое с фигурными скобками, нет в названии асинхронных методов слова "Async". Поля раскиданы хуй пойми где и инициализируешь их на месте, а не в конструкторе. Во многих местах - публичные set. В методе Main вообще отстутствует await оператор для метода Process (28 строка).
Во флюент-билдере не стоит пихать прямо внутрь метода другие методы, поскольку это нечитабельно - метод в методе, лучше выносить в переменную. Вообще возьми за привычку всё выносить в переменные.
Отсутствуют модификаторы доступа для полей (некоторые помечены, некоторые нет). Бест-практис говорит нам всегда добавлять private, хоть он и по умолчанию такой (код читабельнее).
В HttpRequest - pipe не readonly, почему?
Ну а вообще в том треде я тебе сказал, у тебя неплохие познания есть, иди устраиваться на работу.
>>2591680 > В методе Main вообще отстутствует await оператор для метода Process (28 строка). Так и должно быть для обработки нескольких запросов одновременно
А еще такая фигня, как алгосы изучать лучше? Я просто такой человек который если что то не использует на практике то очень быстро это забывает. А алгоритмы я вообще нахуй нигде не использую... На литкоде решать их?
>>2591762 Гугли "Александр Куликов алгоритмы" на ютубе и смотри, совместно читай Кормена 1 издание. Ну если у тебя прям совсем нулёвые знания - то начинай с Грокаем Алгоритмы, а дальше переходи к вышеперечисленному. Совместно с этим решай задачки тут https://projecteuler.net/archives, потом как нарешаешься - переходи к литкоду.
>>2591440 >А (T) при этом компилируется. Потому что такой формат каста вообще не думает. Но вообще, если тебе приходится кстить струтктуру, то что-то ты делаешь не так.
Структуры нужны для краткосрочных, часто локальных операций, где собсно тип уже известен. Их не передают в другие функции через object какой нибудь. Особенно если структура сложная, то вся эта мандула будет передаваться по значению, а не по ссылке.
Все функции, принимающие структуры, принимают самые простейшие явные типы. К примеру какой нибудь расчет площади прямоугольника логически может принимать один параметр в виде структуры Size с двумя свойствами Width и Height, но принимает он два параметра типа double: Width и Height.
А какой нибудь прямоуголник не принимает два параметра Size и Position. Он принимает ЧЕТЫРЕ параметра: Width, Height, X, Y.
А уж принимать структуры неизвестного типа — это лютый бред. Это как унитаз прикручивать к потолку.
Графы: - способы представления графа (матрицы смежности, инцидентности, список рёбер и т.д.) - обход в ширину, глубину - проверка графа на ацикличность и поиск произовольного цилка - топ. сортировка, поиск компонент связности и сильной связности - проверка графа на эйлеровость, поиск эйлерового пути/цикла
- алгортимы поиска кратчайших путей (дейкстра, форд-белман, флойд-уоршол)
- минимальные остовные деревья (алгоритмы прима и крускала)
- сети и потоки в сетях (эдмондс-карп, min cost max flow, в общём, всё, что есть в Кормене, нужно на этот счёт прочитать и понять).
Жадные алгоритмы и динамичексое программирование: Ну собственно прочитать про одно и про другое, почитать примеры задач, решающиеся одним и другим способом, и самому нарешивать тонны задач, чтоб набить руку и наметать глаз. (всякую хуйню про жадные матроиды и алгоритмы радо-эдмондса можешь не читать, по крайней мере на первых порах).
Структуры данных: - Куча, стек, очередь (возможные реализации их трейдофы). - Бинарные деревья поиска, самобалансирующиеся бинарные деревья поиска (красно-чёрное, avl, декартово) - Система непересекающихся множеств - Дерево отрезков и задача RMQ - Хэш-таблицы; методы разрешения коллизий
Строки: - Z-функция и префикс-функция. Их эффективное вычисление - Алогоритмы поиска подстроки в строке (как минимум КМП, но вообще их дофига и желательно в них немного покопаться, чтоб хотя бы примерно представлять ,какие там идеи используются и что вообще бывает) - Бор. Ахо-Корасик - Суффиксные деревья. Укконен - Суффиксные автоматы
Комбинаторика: Умение генерировать комбинаторные объекты типа перестановок, размещений, сочетаний, деревьев и т.п. (есть например в искусстве программирования Кнута).
Немного вычислительной геометрии (кмк, не обязательноl; просто чтоб потрогать область) - Ориентированная площадь треугольника - Проверка отрезков на пересечение и поиск точки пересечения (то же для прымых и окружностей) - Поиск выпуклой оболочки: Джарвис, Грэхем-Эндрю
Параллельно с этим идёшь на какой-нибудь codeforces/informatics/topcoder или любую другую твою любимую площадку с олимпиадными задачи и решаешь-решаешь-решьаешь. В процессе всплывёт ещё куча неупомянутых мной более мелких алгоритмов (например, я вообще ничего не писал про всякую теория чисел типа решета эратосфена, поиска нод-а и тому подобных вещей). Всё это доботываешь по ходу дела. Хороший ориентир - способность стабильно решать на кодфорсесе задачи под номерами 3-4 из div2. Это уровень при котором ты будешь железно проходить алгоритмические секции вообще не парясь (я бы даже сказал, что это оверкилл, потому что на алго. секциях обычно дают задачи по типу литкода, а они всё же несколько проще, чем олимпиадные в большинстве своём).
>>2591776 >(то же для прымых и окружностей) Смотрел стрим Tsoding-а про анти-алиазинг геометрических фигур. У меня вопрос: почему все начинают дрочить на кружки и прямоугольнички, вместо изучения того же самого для кривых безье, которые могут быть и кружком, и треугольничком, и небом, и Аллахом?
Я смотрю на этого Цзодинга, как он сперва голову ломает над алгоритмом сглаживания для кружка, потом как голову ломает над алгоритмом сглаживания для треугольничка и у меня кровь течет из глаз. Ну напиши ты алгоритм для безье один раз и он будет работать везде. Не хочу, хочу жрать говно, хочу чтобы у меня появился ромб и я сидел бы час и переписывал бы все заново.
>>2591774 > А уж принимать структуры неизвестного типа — это лютый бред. Это как унитаз прикручивать к потолку. Подскажи тогда, как тогда лучше реализовать пикрелейтед?
Get - по ключу выдаёт либо загруженные данные, либо сначала их загружает из json файла и после возвращает. Данные кэшируются внутри. Set - задает и помечает данные, что они изменены (IsChanged=true) Save - сохраняет все изменённые данные обратно в json файлы по ключам
Создавать каждый раз объекты при вызове Get не вариант, ибо это мобилки и лучше не дёргать лишний раз GC.
>>2591807 Ты при реализации интерфейса указываешь конеретный тип или так и оставляешь структурой?
Если твои структуры — примитивные типы, типа bool, int, float то и хрен с ним, у тебя особо выбора нет, да тебе это и не нужно.
Если бы ты в Value пихал структуру из 100500 свойств, то GC ты бы не изнасиловал, но зато изнасиловал бы что-то другое, причем куда более варварскими методами.
Можно сделать перегрузки, если у тебя не зоопарк структур.
Шарпаны, я пришел к вам с двумя вещами. Во первых - в шарпе нет динамических массивов? Чет гугл по запросу динамик аррэй выдает только си и плюсы. Во вторых - я сейчас читаю книгу каких то ебаных болгаров полупидоров и мне уже неистово подгорает. Они бросают тебе задачу и в подсказках пишут "пиздуй в интернет". Короч задача реализовать вот эту хуйню https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes до десяти миллионов. КАК БЛЯДЬ? Мне че массив на 10 миллионов ячеек создавать чтоб у меня комп утонул нахуй? Те решения что я находил в интернете довольно элементарны но мне они нихуя не помогают потому что они идут до N Где N не больше тысячи. А мне надо 10 блядь миллионов лимит. То есть заносить в массив каждый результат умножения на простое число. А потом смотреть каких чисел нет в массиве те и простые. Я не могу подсчитать сколько простых чисел чтобы сделать массив, я конечно же не буду делать массив на 10 миллионов ячеек, и я не знаю как в си шарпе сделать динамический массив а задать длинну массива заранее я не могу ибо не знаю сколько членов в нем будет.
>>2592214 > динамических массивов Вместо них используют коллекции, всякие List, Dictionary, HashSet и т.д. Размер заранее неизвестен, добавляй туда сколько угодно элементов, коллекция будет автоматически изменять размер.
>>2592214 Ехал дебич через дебич, видит дебич в реке дебич.
У тебя даже на примере показывается от 2 до 131. Что мешает вот так же твои 10млн поделить на диапазоны чисел и последовательно применять свое ссаное сито к каждому диапазону?
Что мешает загуглить сперва какие коллекции и массивы бывают в шарпе?
>>2592283 Я и есть профан, чел, первый семетр шараги. >>2592278 >>2592263 >>2592257 Понял, буду гуглить >>2592271 >Что мешает вот так же твои 10млн поделить на диапазоны чисел и последовательно применять свое ссаное сито к каждому диапазону?
Вот этого не слушай >>2592360 твой матан и алгоритмы никому нахуй не нужны. Ах да, через пару лет всех кодеров заменит ии, так что лучше учись на токарном станке работать, щегол.
>>2592393 >в большинстве задач Поражало, что люди сперва ориентируются на большинство, а потом скулят от конкуренции. В любой области болшинство хуи пинают и нажимают одну кнопочку. Хочешь плыть в эту сторону — флаг тебе в жопу.
>>2592393 >единственное Был почти в десятке проектов с совершенно разными стаками, и у всех была единственная проблема - разваливающийся под собственным весом говнокод, который невозможно поддерживать. Вместо мудреного алгоритма ты можешь захардкодить какой-нибудь массив на миллион значений, и оно будет работающим и поддерживаемым. Но если ты систематически делаешь даже мелкие косяки в архитектуре, проекту пизда. Через N лет в него просто невозможно будет вносить изменения.
> IStringLocalizer. Нахуя? Просто пишешь расширение строки, например LocaliseThis(), которое считывает локаль, находит нужную строку в жсоне и возвращает ее.
>>2592984 Потому что для программиста фраза "хочу подождать, пока хотя бы один из них выполнится и запустить следующий" переводится как "хочу выполнить много тасков но с лимитом одновременного выполнения"
>>2591520 Можно кстати не как анон говорит с семафорами а так. У тебя есть ConcurrentQueue<Func<CancellationToken, Task>> в нее пишешь то что надо выполнить У тебя есть метод Task ProcessQueue(CancellationToken ct), в котором - из очереди достается очередная задача, выполняется. Собственно все. Ограничение одновременно выполняемых тасок будет строится на количестве одновременно запущенных тасок ProcessQueue.
ProcessQueue примерно так выглядит:
while(ct.IsCancellationRequered is false) { var t = _queue.TryDequeue(out var task) ? task(ct), Task.Delay(100, ct); await t; }
>>2592989 > "хочу выполнить много тасков но с лимитом одновременного выполнения" А причем тут лимит одновременного выполнения? Я не отсылаю десятки тысяч реквестов к API, чтобы это не было необходимо. В лучшем случае всего 16 реквестов
>>2593046 называй как хочешь, суть это не меняет если ты ждешь окончания задачи чтобы начать новую - значит ты лимитируешь выполнение. Например, тредпул - он заканчивает одну из тасок, удаляет ее из своей внутренней очереди и начинает новую.
Разницу видишь с твоим описанием? А разница не суслик - ее нет
>>2593048 >если ты ждешь окончания задачи чтобы начать новую - значит ты лимитируешь выполнение. Не, мне просто нужно дождаться, пока апишка вернет значение, чтобы я мог это значение в другой асинхронный метод передать.
>>2593061 Ну просто это разными методами можно сделать, я хочу по мере поступления, а так можно все таски дождаться и запустить батч из следующих тасков
И тот код что ты изначально намутил тоже нормальный - вот в питоне твой подход встроен в стандартную библиотеку
сам я такое не юзаю ибо ссылки выше, да и хотелки побольше (лимит выполнения и лимит очереди (ну не люблю я подход когда миллион задач сразу становится в очередь и другим не советую))
>>2593015 И чому же? Нормальная практика. Допустим, у тебя есть задачи, которые надо в фоне обработать. Ты их в очередь пишешь. Ограничиваешь число обработчиков, в зависимости от ресурсов сервиса. У очереди - делаешь лимиты, чтобы не было переполнения, либо выталкиваешь старые задачи, которые уже "протухли". Собственно, все, обработчики - по мере сил - берут в обработку задачу, обрабатывают, потом идут за следующей. Так много где делается.
>>2593058 > просто нужно дождаться, пока апишка вернет значение, чтобы я мог это значение в другой асинхронный метод Почему нельзя просто: var resA = await fooA(); await FooB(resA); ?
Если хочешь их В одну задачу зарихнуть: await Task.Run(async () => { var resA = await fooA(); await FooB(resA); });
Если тебе нужно много таких. То в цикле просто запускаешь задачи. Добавляешь в список. Потом Task.WhenAll(tasks);
>>2593599 > просто нужно дождаться, пока апишка вернет значение, чтобы я мог это значение в другой асинхронный метод Можно без есть чо. Делаешь у очереди семафорчик. Какой-нибудь SemaphoreSlim. При добавлении - релизишь. При взятии задачи в обработку - входишь. Обработчик - делает: while(true){ var task = await _queue.GetTask(cancellationToken); try{ await task(cancellationToken); } catch(Excetpion e) {_logger.Error(e); } }
>>2593687 > очередной высер майков Подозреваю что это. Веры нет в их начинания учитывая что они уже в шестой раз переделываю гуй и скачут по версиям как хоромоги.
>>2593587 Так даже решают проблемы многопоточной записи в файл или другой ресурс. Делаем очередь куда пишут потоки, запускаем параллельно таску в которой пишем в файл получая данные из очереди по одному. Можно писать и многопоточно, главная фишка отсутствие кода синхронизации в рабочих потоках и следовательно ОЧЕНЬ дорогих остановок и запусков потока на ядре. Зато на задержки потоков вывода нам насрать пусть подтармаживают
Пацы, что скажите про Azure Functions? Стоит ли вообще использовать эту штуку? Кое-как через друга из другой страны создал аккаунт и смог на бесплатном тарифе запустить демо. Функционал очень скудный. Но зато всё просто.
С другой стороны, можно создать свой asp.net core проект и запустить на Amazon AWS. Только придётся самом разворачивать сервер на винде.
Мне нужно обрабатывать около 20 млн API запросов в день. На Азуре это выйдет мне примерно в 350 баксов в месяц. На своём amazon сервере без понятия во сколько это обойдётся и не будет ли дрочки с превышением трафика.
>>2593938 >asp.net core Ты же в курсе, что можешь вообще на любом серваке такие приложения развернуть. Т.е. ты тупо выбираешь сначала тот который потянет твои 20 млн в деньЕсли не секрет, то что?, и деплоишь туда.
>>2593609 > await _queue.GetTask(cancellationToken); Это что-то, что я сам должен написать или есть готовое? Кста, видел этот код, это же хуйня какая-то, если что-то действительно выкинет ошибку, то семафор никогда не релизнется. Надо ли в таких случаях semaphor.Release() помещать в catch?
Зачем нужно вызывать WaitForPendingFinalizers после вызова сборщика мусора? У Троелсена указано, мол это для гарантии, что к освобождаемым ресурсам никто не обратится, но ведь к ним и так никто не сможет обратиться, потому что собираются только те ресурсы, на которые нет ссылок.
Кто-нибудь имел дело с библиотеками devexpress и foxit? Интересует работа с документами, преобразование в pdf и т.д. Расскажите о своём опыте, какую из них лучше выбрать?
MVVM. Ситуация - пикрилейтед: дан некий список с тремя итемами, у каждого итема есть чекбокс. Состояние чекбокса должно быть связано со свойством модели.
Собственно с биндингом проблем нет, НО у меня теперь возникла задача регистрировать изменения состояний чекбоксов в истории действий. Обычно запись в историю делают команды, но тут нет никакой команды, тут просто меняется свойство.
Даже если я захочу по событию клика чекбокса применять команду, то внутри итема нет доступа ко вью-модели. Как быть-то? У модели тоже нет доступа.
Как такое дерьмо разруливается в MVVM? Как выполнить действие если изменилось свойство?
>>2594574 >>2594577 >В шаблоне итема биндиш чекбокс к команде и передаешь ей номер элемента. >Переопределяешь datacontext для элемента. Не могу. Итем соурс шаблона - модель, а не вью-модель. А команды находятся во вью-модели.
>>2594604 В смысле фиксить, если так по инструкции?
- Window имеет дата контекст вью-модели, - ListView имеет дата контекс списка вьюмодели, - Шаблон ListItem имеет дата контекст элемента списка.
>>2594607 >Для любого элемента можно определить любой контекст данных. Ну да, и он у меня как контекст итема списка вьюмодели. Он не видит все что выше по условной иерархии. Это надо что-то типа RelativeSource до уровня Window.
>>2594703 Ну и варианты где вьюмодель списка подписана на события вьюмодели итема через обычное событие или INPC также абсолютно нормальные (главное не забывать про отписку, если она нужна).
>>2594762 >на события вьюмодели итема через обычное событие Хотел так, но подумал, что гемора будет больше — не только из-за подписки, но и из-за потери контроля над расстановкой чекбоксов сразу для нескольких итемов. По сути начнется спам командой, которая по одному чекбоксику будет сохранять в историю. Я просто не знаю как это адекватно обработать в одно действие.
А вот если ловить событие со стороны представления, то физически пользователь может кликнуть только по одному чекбоксу, следовательно будет всего одно событие, а дальше мне надо обработать выбранные итемы и сохранить в историю как одно действие.
К тому же в WPF подписка автоматом подчищается, правда ведь?
Оки-доки. Есть БД. Есть табличка Users. У User'а, есть: Id - то что бд дает InnerId - Id пользователя в системе вцелом, нужно чтобы значения этого столбца, шли друг за другом, без дырок, потому что другой сервис имеет следующую логику: Начиная с 1 и пока не получит 404 - запрашивает нужное ему от пользоватля, при 404 - начинает с самого начала, считая, что весь список прошел. IntegrationId - то же что и InnerId , но для сторонних систем, используется хитрый JSONrpc-протокол, запрашивается другое, но логика такая же.
Собственно, эти два InnerId и IntegrationId - все подсирают. Потому что вставка нового пользователя, по этим правилам - это проверка на дырки и сдвигание всех пользователей, чтобы дырки не было. Удаление в системе должно быть, потому решить проблему просто помечанием как "удаленный" - нельзя. Менять логику для InnerId еще бы можно было, т.к. внутренняя хуяня, в принципе можно убедить как-то нормально сделать, но вот IntegrationId - это стороннее ПО, которое охуевшим стандартом придумано, и его обязательно поддерживать, а хуи оттуда - покладут болт на мои визги, что медленно выходит. Я в душе не ебу, как сделать вот это вот требование с одной стороны - правильно, с другой, чтобы оно не тормазило все остальное. Локать всю таблицу при каждой вставке-удалении, ну как-то такое. Сначала, чтобы чуть ускориться - я решил отказаться от EF. Помогло, но не как-то сильно. Потом - я решил, что добавлю триггеры и хранимки. Уже чуть лучше помогло, но тоже хуяня на самом деле. Пока что единственное что я придумал, это вообще в базу не лазить лишний раз, держать все это в памяти, а раз в условную минуту - отправлять состояние. Но пиздец же какой-то. Кажется, что я какую-то хуйню делаю. Да. Так оно - более-менее нормально работает, но чет хуйня же какая-то.
Предложите мне нормально решение-то. Я заебался уже. Месяц ебусь. Начинаю чувствовать себя профнепригодным.
>>2594905 InnerId используется как индекс, можно вкорячить логику отдачи пользователей отсортированных по возрастанию, а сам айди удалить нахой. IntegrationId использовать как обычный айди, обычный айди удалить.
>>2594905 А вообще я бы мамкиным архитекторам, которые придумывают такую ересь, покупал билет домой в индию. Хотя у меня в тиме ребята, в целом адекватные, тоже часто норовят плдобную хуйню куда-нибудь вкорячить.
Что потенциально может быть не так с пдф файлом, что гугл драйв отказывается его через запрос принимать? Программы его открывают, попробовал из него картинку вытащить и сохранить ее как пдф и все норм, гугл ее принимает
Это опять я с вопросами про вопросы на собес. Какие advanced level вопросы задают по шарпам и дотнету? Завтра собес, я весь метанит и мсдн перечитал, но жутко нервую.
А студия может что-то кешировать и не собирать проект полностью?
Я заметил такую странную вещь иногда, что вроде бы вношу изменения в код, а реакции никакой. Я начинаю судорожно искать ошибку где я накосячил, начинаю выводить в консоль некоторые переменные ... и код начинает работать.
Я конечно видел кнопку "перестроить решение", но я думал, что студии хватит ума перестроить тот проект, в котором я внес изменения.
>>2595218 У меня сегодня был собес. Спрашивали про дженерики, я не смог толком ответить сказал, мол, это классы, которые помимо аргументов конструктора принимают также аргументы типа и работают с этими типами, ещё спросили про await, я переволновался и сказал, что это просто ожидание выполнения функции, про возвращение управления не сказал. Ещё не смог толком объяснить суть внедрения зависимостей хотя использовал его в тестовом, также спросили устройство листа, и тут я завалил. Впрочем меня все равно пригласили на тестовую неделю и даже предложили больше, чем я просил изначально
Разморозил профиль на линкедине. За 2 недели написали всего 4 человека. Из них 3 это какой-то скам от индусов. И одно предложение фуллстаком в Европе (удаленно ясен хер) за 3к евро пиздец охуевшие собаки.
Ладно бы просматривали, видели красные флажки и уходили, сука, даже просмотров мало. 1-2 в день.
>>2595218 > advanced level Ну. Если бы я проводил такое собеседование, то вопросы были бы в духе: Каков размер строки "12345"?
Имеем следующий код: ' void Foo1() { IEnumerable<int> data = new int[] {1,2,3,4,5}; Print(data); } void Foo2() { IEnumerable<int> data = new List<int>{1,2,3,4,5}; Print(data); } void Print(IEnumberable<int> data) { foreach(var it in data) Console.WriteLine(it); } ' Чем будет отличаться выполнение Foo1 от Foo2?
Имеем следующий код: public static class A { public static int a = 0; public static void Run() { for(int i = 0; i < 100; i++) i++ } } ... (new Thread((_)=>A.Run())).Run(); (new Thread((_)=>A.Run())).Run(); Thread.Yield(); Console.WriteLine(A.a);
Что выведется в конcоль? Почему?
Какие принципы SOLID нарушает Stream?
Как сделать свой класс, который можно await'ить?
Сервер в огне, запросы выполняются дюже долго, периодически все падает, нужно выяснить в чем причина. Что вы сделаете, для того, чтобы найти причину и как будете исправлять?
Какой-то еблан включил trace в конфиге для прода. Место на сервере заканчивается. Какие действия предпримите и какие меры будут приняты, чтобы подобного не повторилось?
Нужно производить локализацию ответов бекенда, на основе геолокации запроса. Как будете это делать?
>>2596034 >Какие действия предпримите и какие меры будут приняты, чтобы подобного не повторилось? И каков правильный ответ? Роллинг логов не решение этой проблемы, а уволить еблана или закупить дисков мы не имеем полномочий. А настучать по кумполу поучительно, но тупиковый путь
>>2596147 Вопрос же на то чтобы посмотреть как будет рассуждать кандидат. Имеет ли он вообще опыт в таких задачах. Какой уровень инфраструктуры был у него не прошлых местах работы и че он там делал. Потому что может быть он там 5 лет жсоны гонял, а грейды ему давали за "лояльность", а не потому что как специалист рос. Из того как решать, по очевидным подходам: поднять запасной сервер, в котором такой хуйни нет, и перенаправить трафик туда, пока чиним тот что засран. Из мер, тоже очевидных - пайплайн переработать, репы разделить, чтобы конфиги лежали отдельно от основного кода, политики пересмотреть, чтобы кто угодно не мог лазить и править конфиги. Хороший мидл - уже сталкивался с этим, и как минимум проговорить то что дядьки вокруг делали - может. >>2596157 Обычные вопросы для мидла+, стремящегося к сеньеру. Если чел на вопросе про строки, потоки посыпался - уже можно скипать, это джун-самозванец. Дальше - оцениваем какие проблемы решал в реальной жизни, как рассуждает, какие решения предлагает и либо повышаем планку начального грейда, либо понижаем.
>>2596034 >Каков размер строки "12345"? Зависит от кодировки 5-10байт, но вроде для энтихбуков также само.
>Чем будет отличаться выполнение Foo1 от Foo2? Скоростью? Я у себя в методе сохранения истории действия требую массив, чтобы был доступ к length и чтобы компактнее было.
>>2595179 Понял, что не так. Гугл не хочет запросом принимать пдф файл версии 1.3. Кто знает, есть ли способ обновить до 1.4 хотя бы И нет, изменить заголовок не сработает
>>2582351 (OP) Антончик, подскажи по ключам для вижлы. Например у меня на офисном компе стоит Visual Studio Enterprise. Я например знаю ключ продукта и это единый ключ для всех установок в офисе.
Что в теории произойдет если я дома на своем компе установлю такую же и попытаюсь активировать её этим ключом? Смогу ли я вообще её так активировать? Запалит ли меня работодатель? (по количеству установок например или еще как сможет посмотреть) Сможет ли он обрубить ее, так что вижла в тыкву превратится?
>>2596438 Ну наверно по количеству установок, когда очередному сотруднику будут выдавать ключ. Но тут вообще вопрос к подходу твоей компании. Обычно никто ключи не раздает офисному быдлу направо и налево, для этого есть специальная должность, идет учет кому выдали ключ, кому нет — именно по той причине, что есть такие гниды навроде тебя, которые пользуются чужим доверием. Т.е. здесь речь идет о какой-то микроконторке, которая купила ключ на авито и ей вообще похуй на последствия. В таких микроконторках можно пойти к боссу и попросить для работы.
Чел ... скачай с торрента, в чем отличие? Ты же ведь типа все равно нарушаешь закон, пользуешься втихушную пока никто не спалил — это ровно то, чем является торрент версия. Или ты думаешь купленный интерпрайз золотом помазан?
Если у тебя ключ установлен неофициально, то отличий нет от спизженной.
>>2596528 Но блять, я так не люблю ебаться с гостшарпом и остальной хуйней, это надо будет дополнительно к приложению устанавливать его, нужно сохранять файл, читать из файла, удалять файл, эх.
>>2596548 >есть специальная должность, идет учет кому выдали ключ, кому нет Классическая история, когда новенький добродушный системный администратор по дружбе дает офисному сотруднику ключ, а тот раздает его бабушке, теще, жене, собаке. Через неделю (в зависимости от размера компании) всё вскрывается, и сисадминчигу дают пизды старшие - так он с кочергой в жопе проходит обряд посвящения, приходя к единственно верной мысли, что среди офисного отребья друзей и товарищей быть не может.
Ну а если сиадминчек раздает ключи вообще всем, не установив, так сказать, эмоциональную связь с каким-то конкретным индивидом-крысой, то такого сисадминчега надо увольнять вовсе. Если только в компании все эти ключи - пыль в глаза.
>>2596688 Ну тогда от этого ключа тебе ни тепло не холодно. Можешь так же за копейки купить ключик на авито. Проеб заметят когда захотят зарегистрировоать нового юзера, а свободных не окажется или будет меньше предполагаемого.
Могут ли превратить в тыкву? Хз как в вижуал студи, но вероятно сбрасывается для всех и регистрируется заново, но уже по уму сисадмин собственноручно регистрирует и ведет отчетность.
Если какой-то цикл 100500 раз подряд меняет значение переменной типа int, но по факту уникальное значение меняется всего несколько раз или вообще не меняется, то уместно ли делать проверку переменной по типу "если текущее значение переменной != новому значению, то присвоить новое, иначе пропустить", или нет ничего зазорного в спаме переменной?
>>2597217 Нет это херь, братиш. Одно присвоение буквально одна реальная инструкция проца, а проверка условия и присовение это целых три инструкции из-за чего станет немного тормознее.
Тут правило орков во все поля: красное едет быстрее чем меньше код тем быстрее он работает.
Привет всем! Решил я углубится в изучение программирования, а именно в С# для начала. Посоветовали мне канал Simple Code, а также руководство от Metanit. Возможно, Вы можете дать годные советы начинающим, а именно какие руководства, книги или каналы лучше всего глянуть для полного понимания той или иной темы? И ещё такой вопрос: Не поздно ли я начал изучать в 17 лет? А то вечно этот вопрос гуляет в голове и не даёт покоя. Всех благодарю за ответы
Назрел сложный вопрос. Чем на шарпе можно тестировать контракты апи? Я уже заебался. Привыкли, блядь, люди делать монолиты, что если что-то сломаешь, то везде пиздец. Потому, если у них собирается - ну и похуй, я же свою работу сделал))) Собственно. Я, могу поступить как крыса, начать стучать управленцам, но понимая как думают управленцы - они забюрократизируют все это дело и, скорее всего назначат меня следить, чтобы апи чужое не ломалось. Очевидный заеб и я ебал это в сраку. Потому, первое что хочу попробовать - это протолкнуть идею с тестами апида, блядь, я с трудом юнит-тесты протолкнул, пиздец сколько воевать пришлось, но теперь полегче жить стало, когда детские ошибки сразу фиксятся, и можно джунов посадить реально что-то полезное для других делать, а не придумывать им работу, чтобы УЧИЛИСЬ. Но очевидно же, что если их нужно будет вручную постоянно делать - все забьют. Потому - жду предложений чего-то в духе Spring Cloud Contract, но для шарпов. Можно конечно надрочить постманом и проганять так. Но ХЗ, не думаю что те кто забывают сами проверить, что их изменения ничего не сломали - будут постманом тестировать это.
С удивлением заметил, что индусософт продолжает тянуть поддержку очень старого .Net 3.5 и там с ним рядышком четвертый притаился. Это означает, что уютный десктоп можно пилить вполне комфортно на древнейших версиях .Net'a и не скакать бесконечно по версиям Net Core/Net Standard каждые пару лет, порожденных исключительно больной фантазией маркетологов. С - стабильность. Стал еще более убежденным старовером.
Единственно что не радует - неразумные писатели библиотек зачем-то завышают требования к своим поделиям. Нахуя они это делают и главное зачем непонятно.
>>2597822 >поддерживать устаревшее Мне почему-то кажется, что бесконечная гонка за новым куда более изматывающее занятие чем фиксация версии либы на разумном пределе и оставление ее в покое.
Вокруг того же .Net 3.5 давно нет толпы хипстеров с шилом в жопе и тягой бесконечно улучшать все и вся, и знаешь, жить как-то спокойне. Если ты нашел на гитхабе что-то что под него работает, то это будет просто работать годами, а не ебать мозг обновлениями, сломаными апи, апдейтами безопасности, сетевыми холиварами призывающими перейти на что-то другое, вбросами маркетологов/евангелистов нахваливающих всю эту парашу и прочим суетливым булшитом. Просто работает и все! Охуенчик же. Есть конечно обратная сторона в виде 150 незакрытых багов которые не починят никогда. С ними можно жить ведь они тоже навсегда, а не каждый раз новые с каждым релизом.
>>2597870 >Новые фичи дают возможность переписать проще и оптимизировать. Но по факту ты тратишь столько же времени, потому что частота переписывания увеличивается.
Насчет оптимизации тоже спорно, ибо оптимизируют в одном месте, но в то же время пытаются сделать некоторые вещи проще или гибче в использовании, что наоборот ухудшает производительность. Тот же WPF никак не проще винформсов, даже из коробки — из-за попытки быть гибким и универсальным одновременно. Там одними только словарями ресурсов можно похерить все сбереженные миллисекундочки.
>>2597679 >Стал еще более убежденным старовером. Это возраст чел. Но я порой с грустью вспоминаю эти "бесполезные" метания с молодой горящей жопой, когда время казалось бесконечным. А с попытками все рационализировать приходит застой и эффективной деятельности становится не больше, чем раньше.
>>2597939 >Но по факту ты тратишь столько же времени, потому что частота переписывания увеличивается Не увеличивается, никто ведь не заставляет переписывать. >>2597939 >Тот же WPF никак не проще винформсов, даже из коробки — из-за попытки быть гибким и универсальным одновременно. Он гораздо проще. Просто попробуй сделать интерфейс со всплывающими меню, переключением страниц и анимациями и там и там, а потом сравни затраченное время.
>>2597863 >Есть конечно обратная сторона в виде 150 незакрытых багов которые не починят никогда. Ты забываешь еще один ньюанс - отсутствие поддержки для современных решений. Возникнет у тебя например необходимость сделать интеграцию с каким-нибудь сервисом по grpc, и соснешь ты со своим 3.5 с проглотом.
>>2597969 >потом сравни затраченное время Затраченное время для кого? Для машины? Еще раз перечитай мой текст, там написано, что в новых обновлениях ради удобства пользователя создают создают универсальный и гибкий инструмент, который своей массивностью перекрывает все оптимизации, поэтому оптимизации не стоит воспринимать всерьез.
Что касается затраченного времени пользователя, то на старых версиях просто не делают то, что геморно.
>>2598021 >Затраченное время для кого? для программиста. На WPF элементарно делают вещи, которые на формсах ты будешь неделю пилить и то получится хрень. ну да, формсы работают быстрее, но я к этому времени уже получу деньги и уеду в закат, а ты будешь продолжать пердолиться с OnPaint
>>2597995 >Подскажи в каких случаях будет копирование стуктуры. Ну когда ты просто обращаешься к свойству структуры, то ты получаешь значение этого свойства. Но вот если ты захочешь передавать методу структуру целиком, или же целиком возвращать, то вот тут уже начинаются вопросики, ибо будут передаваться все N значений структуры.
Если ты передашь методу структуру с десятью свойствами, а ПО ФАКТУ метод будет юзать от силы 2 свойства — вот это хуета какая-то. Эффективнее передавать только эти два свойства. А если ты используешь 100% переданного, то вроде это не пробелма.
А так бывают структуры из двух свойств, к примеру Size, и даже есть совсем сложные типа Rect, где есть как минимум четыре свойства. Но все они используются чтобы избавиться от так называемых "телескопических" эффектов при инициализации. Их никто не передает взад-вперед. Вот надо построить прямоугольник, ты передаешь структуру Rect (из ширины, высоты, x, y) и все 4 свойства будут задействованы.
Короче, если ты уверен что данные всей твоей структуры будут использованы на 100%, то проблем нет.
>>2598277 Формат — это отличительный знак по сути, потому что имя может быть каким угодно. Как по твоему программа будет искать файл и вообще распознавать каким образом его читать?
>>2597863 >апдейтами безопасности А потом тебе нужно пройти аудит в СБ ИТ для релиза приложения. И ты сосешь хуи.
>Мне почему-то кажется, что бесконечная гонка за новым куда более изматывающее занятие чем фиксация версии либы на разумном пределе и оставление ее в покое Пиздец сложно раз в год обновить конфиг, специально все делают что переход максимально простой.
Мне хватило один раз пол года обновлять приложение и руками переписывать старые либы под новые версии чтобы перестать быть старовером. Приключение называется "прохождение аудита безопасности приложения" где тебя индус, мексиканец и китаец ебут за кучу уязвимостей
А как при MVVM реализовать глобальные данные? К примеру если я хочу реализовать галочку "Больше не показывать это окно". А это окно всплывает в десятках экземпляров вьюмоделей, внутри которых есть свои вьюмодели.
Через биндинг получается очень уж геморройный мицелий привязок. Событием тоже срать как-то не комильфо.
>>2598758 Запихнул в базовую модель. У каждой дочерней вьюмодели пришлось таки реализовать свойство Parent и по этим парентам добираюсь до базы и меняю оригинал.
Более простого подхода без гемора я не нашел. Еще бы автоматом родитель назначался.
>>2598891 ну у тебя же пет проект. там свобода и можно перешагнуть через каноны
Делать все по науке слишком много гемора. Потому если наука не требуется, то можно мудрить.
у меня вот в таких вещах везде ходит context где помимо очевидного шарится словарик шаред вьюмоделей ака контроллеры. Типичная проблема - вьюмодель это god object и хочется разделить собственно данные для вида и команды. Особенно если одна команда и где то в меню и на статусбаре она же. И биндить такое жесть. А так везде доступен этот словарик и можно прямо биндить на него. Набор этих "контроллеров" существует в рамках какого то рутового Workspace, коих может быть сколько угодно ибо определяют регион, а не являются одним на весь проект.
сложно сказать удобно ли, ведь теперь после того как такой контроллер что то поменял он должен всех уведомить, что добавляет уже другого гемора.
>>2598758 Называется настройки приложения, ты можешь сохранять в выделеном хранилище любые данные приложения и получать к ним доступ путем инъекции зависимости. При внедрении тебе соберет объект настроек и выдаст его.
>>2598758 > К примеру если я хочу реализовать галочку "Больше не показывать это окно". Делаешь статичный класс GlobalApplicationSettings В нем: public Dictionary<string, bool> ShowWindow { get; } = new();
При первом появлении окна - ставишь смотришь в словаре, если нет - ставишь тру. При пометке галочкой - ставишь false. Сохраняешь на диск или в реестр. Все.
Не еби мозги не себе не людям. Делай максимально просто. Ты в любом случае не будешь свои окошки переиспользовать.
Вообще. Я чет стал за 10 лет коммерческой разработки - каким-то хуйлом, если честно. Все чаще ловлю себя на мысли, что большая часть "правил", это какой-то карго-культ. Типа блин. Камон. Хороший код, это простой-понятный код, который решает задачу здесь и сейчас и который можно выкинуть нахуй, как только задача поменяется. Такие вот дела. Да. А делая сложную хуйню с внедрением зависимостей, хуе-мое, регистрацией всего этого дела, выделяя классы под опции к твоей хуйн, ты потом неделю говно выгребать будешь, когда тот код что был нужен станет неактуальным.
>>2599515 Да я то в Android-разработку иду - а там говорят что работы нет, то во фронтенд - и там тоже с работой вроде туго. Решил на C# игры делать, а заодно и .net выучить - но вдруг надо Java Spring зубрить или еще куда перекатываться? перекатывайся в сантехники
>>2599516 > Да я то в Android-разработку иду - а там говорят что работы нет Работы мало, да и то говно. > фронтенд - и там тоже с работой вроде туго. Там норм, но большая конкуренция. > Решил на C# игры делать Примерно как с андроидом. > заодно и .net выучить Учи ASP.NET Core. Бэкенд - самое нормальное направление. > вдруг надо Java Spring зубрить или еще куда перекатываться Если мало времени, советую поскорее выбрать что-то одно, а не скакать по десяткам сфер, а то рили вкатишься в сантехники. Если времени овердохуя, можешь посмотреть всё, повыбирать, вдруг в итоге вообще вкатишься в нейронки.
>>2599523 Сложность DI во много вокруг того что на него накручивают: регистрация дочерних зависимостей, детект отказов и логика восстановления, подмены зависимостей по условиям - вот это вот все знатно выносит моск. А так есть патерн еще проще чем DI, а именно сервис локатор. Но его сейчас предали анафеме за то он принципы солид нарушает.
>>2599523 При чем тут сложность DI как концепции? Сложность ретуалов вокруг него. Раньше я делал как: class A<B> where B : IB, new() И норм, жил как-то. Получал зависимость снаружи, но при этом мне не нужно было ебаться с тем, чтобы прописать его куда надо, не нужно было в рантайме ловить хуйню, что зависимость не прокинулась, покрывать тестами как раз внедрение нужных зависимостей и прочей хуйней заниматься.
Крочое, удобно было. Сейчас - модный дорч, что мы вообще нигде new сами не используем - бесит, больше карго риуталов делать приходится. При этом, по факту, ты все равно НИКОГДА, не будешь подкитывать другую реализацию, делаешь интерфейс, только чтобы мокнуть его в тестах. Все. Короче. Я только проснулся. Хуй знает понятно ли мое негодование. Но суть такая. Не DI сложен, а пайплайн работы вокруг него.
>>2599547 раньше ты писал фабричный код создания объектов вручную теперь DI пишет его за тебя в чем сложность? а нет ее.
ну да бывают моменты когда хочется подменить реализацию или враппер какой, а контейнер мелких слишком примитивен для этого. но это ж проблема конкретной реализации.
>>2599600 > в чем сложность? В том что я как ебанат, делая новый класс, должен пиздовать в файлик Startup.cs/Program.cs и вписывать каждый раз: services.AddScoped, services.AddSingleton, дополнительно - пиздовать в файлик appsettings.json и добавлять там секию с настроичками, делать MyClassOptions и т.д. Просто потому что УУУУУ, ТАК НАДА. Кому надо - непонятно.
Вот допустим. Мне надо было недавно добавить поле которое должно браться из конкретного файла, который должен лежать в конкретной папочки к ответу определенному. Как я должен ПО НАУКЕ СДЕЛАТЬ: interface IMyFiledProvider { puiblic string FileContent { get; } }
public class FiledProviderOptions { public string Path { get; set; } }
public class FiledProvider : IMyFiledProvider { public FiledProvider(FiledProviderOptions options) { FileContent = File.ReadAllText(options.Path); } public string FileContent { get; } }
Пойти, зарегистрировать эту хуйню. Потом не забыть добавить в конструктор того класса, который генерирует ответ IMyFiledProvider и только потом добавить поле. Охуенно? Охуенно! Подумай, почему я не стал так делать.
>>2599631 >делая новый класс, должен пиздовать в файлик Startup.cs/Program.cs далеко не каждый класс так то, а только те, которые нужны чтобы их где то резолвили
>дополнительно - пиздовать в файлик appsettings.json Вообще не относится к DI, а относится к "здравый смысл говорит что не нужно все в кучу скидывать, а разделить где что лежит чтобы потом быстро находить" . Да и изменять потом конфиг путем перекомпиляции - после первого же раза тебе это надоест
> ПО НАУКЕ СДЕЛАТЬ: по науке ты должен сделать интефрейс IВотЭтоПровайдер и уже в имени реализации будет указано откуда чего как.
и да, сходить зарегестрировать где это нужно. Потому что без регистрации ты будешь сам писать new Реализация(options), а потом выделишь все это в фабричные методы, то есть просто будешь делать то, что за тебя генерит контейнер.
сначала приходит понимание что СТОИТ потратить время на структуру где чего лежит чтобы все было чистенько и не было DRY
А потом и понимание что не стоит писать фабрики ручками.
>Подумай, почему я не стал так делать. молодость и неопытность, еще не поел говна "и так сойдет все равно менять ничего больше не буду", а потом пришлось менять. А как поешь, то даже в мелких проектах будет у тебя сразу подобие порядка.
>>2599671 > и да, сходить зарегестрировать где это нужно. Потому что без регистрации ты будешь сам писать new Реализация(options), а потом выделишь все это в фабричные методы, то есть просто будешь делать то, что за тебя генерит контейнер Эх. Вот я про это говно и говорю.
И да. Я, как нормальный человек, на самом деле давно сделал: ServiceAttribute, и метод расширения RegisterServicesFromAssembly. Но все равно буду гореть. Потому что ебатория какая-то по дефолту. Вот когда сделают нормально, чтобы не нужно было свой атрибут и метод расширения делать - тогда и успокоюсь.
> молодость и неопытность 10 лет коммерческой разработки, чел.
ну сделал и сделал, что тут такого многие либы у себя точно так же позволяют сделать "найди все сам в сборках и зарегай". суть от этого не меняется же.
>>2599693 >10 лет коммерческой разработки, чел. я ж о том и говорю. "давай давай, некогда думать как лучше". не искусство, а ремесло.
>>2599699 Так нифига ж не лучше. Лучше, это когда я могу - просто выкинуть не нужный класс, и нихуя не сломается. Тут - я выкинул один класс, пиздуй разрегистрировать, пиздуй ту хуйню остальную удаляй. Куча ебучих ритуалов, из-за тупой реализации DI. При этом, сделать самому нормальный DI - намного проще, но ебучие джуны же увидев свою реализацию контейнеров - обосрутся и приходится уже на уровне выше меньше выебываться, чтобы остальная команда - не страдала.
Эх. Вот раньше как было охуенно. Берем ADO, делаем папочку sql, свой DI нормальный, три слоя и погнали. Не. Теперь делаем говно, потому что майки учат говно, а джуны - по урокам майков учатся. Грустно короче. Да.
>>2599547 >При этом, по факту, ты все равно НИКОГДА, не будешь подкитывать другую реализацию, делаешь интерфейс Схуя ли? Банальный пример - паттерн Стратегия. Запихиваешь в контейнер все реализации одного интерфейса, а потом в контексте резолвишь нужную.
>>2599711 >Ну просовывай их прямо в контексте. А нахуя роутеру стратегии знать что там и как нужно самой стратегии? Тебе хороший пример скинули а ты все копротивляешься
Раньше я думал, что лютый сечас тренд "СЛОЖНА СЛОЖНА ХАЧУ прОЩе ЛАПШУ ТЯНУТЬ" идет от джунов, но теперь вижу, что тут еще второй фронт пожилых шлеп, которые повторяют за умными дядями, но не понимают зачем и им пришло "озарение" - "не я тупой, а они"
Почему C# в РФ не ценится? Вижу кучу вакансий на го с знанием языка за 250к и вакансии на сишарпе с ебейшим пулом навыков+охуенным знанием дотнета за 100к.
>>2599547 Причём тут дженерик и DI. Как ты собрался условно настройки приложения таким образом передавать или реализации интерфейса? В каждом месте руками указывать класс реализации и потом руками же менять?
Есть ощущение что ты 10 лет писал говнокод и вообще не понимаешь термины которые используются
>>2599631 >В том что я как ебанат, делая новый класс, должен пиздовать в файлик Startup.cs/Program.cs и вписывать каждый раз: services.AddScoped, services.AddSingleton Сделай нормальные суффиксы и резолвер по именам, не?
>>2600167 Я хочу получать сообщение из которого надо скопировать текст и отправить в sql запрос, однако бот не дожидается второго сообщения и копирует пустое поле
>>2599803 С хера не любят? Оч даже любят. Просто у шарпа была оооооочень долгая проблема с тем, что он был привязан к винде. Собственно, очень много где - это не подходило. Допустим, в нефтянке, на заводах всяких и прочих местах, где АйТи - не совсем свое - шарп нормально так укоренился, пока майки не решили убить классический фреймворк. Блядь, половина того что удаленно снимает показание с твоих приборов учета, в РФ либо на плюсах(тех что C++/CLI), либо на шарпе, иногда еще дельфи, да. На заводах - аналогично, половина автоматизации заводов - это шарпы, дельфи, и плюсы. Есть часть легаси веба на ASP.Net, который еще старый, до того как там появились эти ваши вебапи и прочее. Тырпрайз, у нас тут исторически на жаве писался. Банки - тоже. А когда майки таки отпустили поводья и сделали .netcore - уже как-бы рынок остального АйТи - поделен у нас. Стеки устоялись. Шарповоду, который не хочет на завод, по большей части дорога только в ДоДо, 2гис или банки, которые появились позже. Ну или в гейдев с юнькой.
А почему так сложилось? Потому что винда - всегда была проблемой для шарпа. Язык-то охуенный, но когда начинается реальное IT, никто не хочет с ней связываться. Вот и жил себе долго шарп сбоку, в областях автоматизации всякой.
>>2599243 А потом такие смотрят с приоткрытым ртом, когда в код, сделанный по заветам "карго-культа" новые фичи добавляются просто дописыванием новых имплементаций и парой строчек в di, а не разъебывая половину проекта, как они привыкли. Но он же умный, он получил год опыта 10 раз.
>>2600243 Ну ок. Ты зашел на опасную территорию. Давай. Вот тебе кейс. Система опроса с очередями. Логика была простой: устройство - воркер, воркер пытается опросить устройство, сохраняет результат опроса в базу. Все изначально просто - по TCP общаемся без особых проблем. Ок. Все норм. 10к потоков спокойно опрашивают че там надо. Теперь - у нас есть COM-порты, через один COM-порт подключено 2к устройств. Давай, объясняй, как твой DI поможет решить проблему того, что нельзя пытаться открыть из разных потоков один и тот же COM-порт.
>>2600295 > новые фичи добавляются просто дописыванием новых имплементаций и парой строчек Так каким образом новая фича в опросе через COM-порт будет реализована-то? Нужно же просто по заветам карго-культа чет там дописать.
>>2600298 очень просто твой воркер не работает ни с какими устройствами напрямую. Он принимает какой нибудь IDevice и с ним работает.
Вот когда ты захочешь заменить device с tcp реализацией еще com реализацией, то ты сможешь просто переконфигруривать все в DI и твой воркер получит другой девайс
а твоя проблема - тупо решается средствами синхронизации потоков.
Ты же понимаешь (видимо нет) что не все пихается в DI? Если тебе нужен семфор, ты же не принимаешь его в конструктор (кроме случаев если тебе нужен общий семафор, что бывает нужно менее чем 1/1000000 случаев ибо это грязно), а рождаешь его на месте.
Где прочитать про то, как неткор асинхронщину обрабатывает и параллельность? Недавно услышал, что теперь synchronisation context выпилили и с дедлоками все лучше
>>2600298 Если ты не понимаешь пользы, так я приведу пример.
Вот захочу я переписать уродскую модель виджетов в асп.нет на няшную модель компонентов - так я в итоге просто зарегистрирую в контейнере свой чето там движок и все заработает
А все почему? А потому что майки открыли точку расширения фреймворка и у меня есть возможность в ней заменять нужные части на свои. И для этого мне не нужно делать форк, чего то патчить в рантайме и так далее.
>>2600298 Начнем с того, что твой воркер нарушает принцип единой ответственности. Я бы инжектил в него список комманд, реализующих простой интерфейс с методом doasynk, и выполняющих одну итерацию бизнес логики. Отдельные команды, чтобы выгребать из портов данные и писать их в конкаррент очереди в памяти. Отдельные комманды, чтобы выгребать данные из очередей и держать коннект на ком порту. Отдельные комманды, чтобы забирать данные из очередей и писать их в базу.
Понадобится lpt порт прикрутить - добавляешь комманду в енумерабле, воркер ее крутит.
Заранее извиняюсь за почерк, бахнул пива и пишу с телефона.
>>2600331 > Начнем с того, что твой воркер нарушает принцип единой ответственности Каким образом-то? Он буквально делает вот что: while(stopToken.IsCancellationRequired is false) { var task = await _reader.ReadAsync(stopToken); var interface = task.Interface; if(interface.IsOpen is false) interface.Open(); for(int i = 0; i < _retrys; i++){ var protocol = task.Protocol; var request = protocol.CreateRequest(task.Mapper.ToProtocol(protocol)); var response = await interface.SendRequestAsync(request, stopToken); if(responce.IsSuccess) { await _dataArchive.SaveData(task.Mapper.FromProtocolToData(typeof(protocol), respose.Payload)); break; } } if(task.CloseInterfaceOnComplete is true) interface.Close(); }
Что делать, если есть 2 метода, каждый из 10 строк, но их различие только в одной отсутствующей строке?Причем эта строка находится в цикле и не хочется писать доп условие.
И что быстрее If bool, или delegate метода внутри цикла?
>>2595218 Меня дрочили теорией по бд и устройством v8 собесился на фулстека. По шарпу было два вопроса, по которым я спорил с интервьюером - как работает IDisposable и деструктор, и про структуры. В первом он мне пытался доказать, что Dispose удаляет объект из памяти, а я говорил, что не удалет, а убивает неуправляемые ресурсы. По второму говорил, что GC чистит структуры, что очевидно не так. Я же прав?? В конце правда по чесноку сразу сказал, что я не подхожу, и признался, что у них жуткое легаси на вебформах, так что я не расстроился.
>>2600600 мда. тяжко на мобиле писать. добрался до компа и поясню шире
В общем Dispose - настойчивая!!! рекомендация вызвать этот метод когда объект уже не нужен чтобы он корректно очистил свое состояние. Но это не значит что это неуправляемые ресурсы. Я могу использовать (и активно использую) using(IDisposable) как альтернативу try_finally и где тут неуправляемые ресурсы? А нигде. Так что у Dispose семантика Close и это может быть что угодно вообще. В том числе и ничего - не все, что есть IDisposable, требует этого вызова - в районе HttpClient такое есть.
Другое дело что просить вызвать Dispose не значит что его удобно вызывать, но это уже совсем другая тема.
Так что это просто паттерн "очень!!! прошу вызови этот метод чтобы я корректно освободил ресурсы/ сделал нужное дело" без конкретики что именно будет происходить
Структуры живут на стеке. GC не заведует стеком, но вот при боксинге структуры попадают в кучу и тогда GC знает про обертку и трекает ее.
>жуткое легаси на вебформах эээх. а ведь они ищут того кто им перепишет на новое, а ты их подвел )
>>2600600 >что GC чистит структуры Может и чистит. Если у структуры есть поле ссылочного типа его содержимое находится в куче. GC очевидно занимается отслеживанием живых структур которые держат на ссылку.
>>2600522 >что быстрее If bool, или delegate метода внутри цикла? Делегат намного тормознее. Для вызов каждой функции нужно сохранять контекст предыдущей, выделять память под локальные переменные, потом это все очищать.
Мой мир разбит и все представления о нем. Оказывается, что есть единая история, типа как в проводнике, когда не важно в каком окне идут изменения — все это часть одной истории.
А есть отдельная история для каждого документа, как это делается в фотошопе или в той же вижуал студии. Это конечно удобно, до тех пор, пока ты не решишь реализовать для файлов функцию Cut/Paste.
Эта срань делает зависимой одну историю от другой. Я раньше ругался на программы типа 3д макса, считая их древним говном мамонта, а разрабов ленивыми уебанами, не могущими сделать "так как в обычном проводнике". Оказывается вот оно че. В фотошопе, к примеру, нельзя переместить слой из одного проекта в другой — только дублировать.
И ладно бы студия, у которой просто текст, где перемещение текста это по сути копирование с уничтожением оригинала. В этом случае Ctrl+Z в источнике просто оставит копию. Но ведь есть тяжеловесные объекты типа как 3д-модель со своим уникальным ID, и по сути, перемещение из одного документа в другой — это перемещение ссылки на этот объект. А время физического перемещения там может занять до минуты.
Конечно есть решение, но оно неоднозначное и пока не представляю как это может аукнуться в будущем. Напрягает, что так не реализовано нигде.
Если мне нужно тупо выучить к примеру Ангуляр для резюме и интервью, не легче ли будет тупо пройтись по вопросам интервью, а не задрачивать документацию или собирать пет проект?
Просто скажите, как мне из одного threadпередать в другой thread объект, чтобы мне не выдавало ошибку, что объект создан в другом потоке? Я не понимаю, почему в калошарпе это так сложно и почему я не могу нагуглить ничего адекватного
Т.к. связей в айти у меня нет, то хочу спросить у здешних гуру.
Учась на 3м курсе в неплохом вузе в столице решил, что пора искать первую работу в ит, именно на бэк на C#. Очевидно, что резюме на hh +/- пустое т.к. опыт официальной работы был ток в фастфуде, но, думаю, что вставлять это на hh себе дороже. Сначала пытался надыбать стажировки на шарпах, но их вообще по пальцам пересчитать, потом решил биться на джуна, но, честно говоря, уже складывается ощущение, что бьюсь головой о стены. Я в своих пет-проектах (a.k.a курсачи/лабы в ВУЗе/хакатоны) юзал стек из Jquery, ASP Net Mvc, Core, EF Core, голые SQL запросы, PostgreSQL, Mssql и т.д.. Даже есть пару сертификатов, что я прошёл отбор на группу повышения квалификации в вузе, причём успешно закончил. Но вот уже откликнулся на 34 вакансии, где-то с сопроводительным письмом, где-то без, где-то решал тестовые, где-то нет и на данный момент стата из 34 вакансий: 21 отказ и 13 игноров.
В общем, однокурсник, который устроился на 1С хотя шёл на джависта говорит, мол, жди апреля, там финансовый год начнётся, поэтому я остыл и пока решил подождать до апреля, а теперь собственно вопрос: "Правильно ли я делаю вещи клипая ненужные никому pet-проекты, решая литкод и читая книги, может быть лучше просто как-то офигительно наврать на hh про несуществующий опыт работы? Или может ходить на всякие C# встречи, что люто хайпятся в рекламе вк/hh? Или может купить курсы с "100% трудоустройство после окончания" (хотя этот вариант нереальный т.к. я бомжара 100 уровня, даже учиться в вузе начинал в кредит, благо смог на бюджет перейти)?"
>>2601067 Спасибо, значит я на верном пути, но mindbox мне, кстати, уже отказал, буквально пару недель назад, что меня удивило т.к. я тестовое решил прям как надо, конечно, по моему неджуновскому мнению. А что такое "сисдиз"?
>>2601067 Судя по всему это сокращение от "системный дизайн", а что подразумевается под этим словосочетанием? - Умение использвоать системы контроля версий с веточками и girflow? - Паттерны проектирования вроде строитель, одиночка и т.п.? - Принципы программирования типо Solid, Kiss, Dry? - Принципы ООП? Просто это я тоже изучаю (хотя, думаю, могу сказать, что изучил)
>>2601071 А вот и ответ, хорошо, спасибо попробую, про контур вообще до э того не слышал. Наверное, действительно на джуна мне рановато без опыта пытаться, попробую добиться какой-нибудь стажировки за еду.
>>2600994 Сами потоки тут не причем Это сам объект (или то что он использует) запоминает поток создания ибо ему это важно, ну и проверяет что его вызовы в том же потоке
>>2601048 Попробуй в озон на стажировку поступаться. https://tech.ozon.ru/routestart У меня знакомый qa-мануальщиком на нее попал. Неделю назад закончил стажировку и теперь там джуном работает.
>>2600283 Бляяяя чел. Пусть твои 2000 устройств пишут в очередь, а другие потоки это читают и делают что надо.
Передашь IDataWriter для адаптера твоих вокреров. Они не зная что там находится внутри пишут в него данные. Пишем хоть вообще отдельное приложение или фабрику ридеров которые читают из IDataRider. в качестве реализации используем потокобезопастные коллекции или вообще отдельный сервер очередей.
Получаем архитектуру где 1000 устройств пишет куда данные и не знает что с ними происходит, может в текстовый документ пишут или в Пентагон данные шлют, а возможно там вообще 10 разных вариантов одновременно. Ридеры читают данные откуда-то, им неизвестно откуда они берутся. Сами ридеры это возможно вообще разные физ машины или набор потоков.
У меня ощущение что у тебя проблемы с пониманием концепции интерфейсов и сокрытия деталей реализации. Твои все эти штуки не должны вообще знать о природе хранения данных, это не их дело
>>2601048 >Правильно ли я делаю вещи клипая ненужные никому pet-проекты, решая литкод и читая книги, может быть лучше просто как-то офигительно наврать на hh про несуществующий опыт работы Хуйней занят. Литкод это бесполезная хуета, твои проекты нахер никому не интересны и их никогда никто не будет смотреть.
Поцоны, кто нибудь смотрел ITVDN? Купил на рутрекере чтобы восполнить пробелы в базе, а там духота такая ояебу - какие-то окна уязвимости, дрочево на области видимости переменных, дрочево на const/простые переменные, правильное сравнение переменных - вначале константы потом переменные. Кто-нибуть итт ирл видел такую хуиту или это я нетру прогромизд?
>>2601162 > Передашь IDataWriter для адаптера твоих вокреров. Они не зная что там находится внутри пишут в него данные. Пишем хоть вообще отдельное приложение или фабрику ридеров которые читают из IDataRider. Угу. Получаем. Пришло время почитать у 1000 устройств, которые висят на одном COM-порте. Все обработчики обосрались, они ретраят. В результате - сбор пошел по пизде. ЗАТО АРХИТЕКТУРА, да.
>>2601452 С чего он обосрались дебис? С того что ты хочешь через 1 порт опросить 1000 устройств? Извините блять кодом нельзя решать проблемы того что ебанутый. Ты ещё спроси а че ваша архитектура не умеет решать проблемы хардвера
>>2605217 Чел. Я не ебанутый. Это обычная практика. Так вот. Независимо от архитектуры, мы должны учитывать, что вот для COM-порта надо еще на уровне поставления задачи разруливать, иначе пизда. Если мы так же хотим, чтобы через ПэЭлКа какой-нибудь хреновенький можно было опрашивать - мы так же должны учитывать че там за ПэЭлКа и в ряде случаев - не создавать задачи чтения, пока сеанс связи через ПэЭлКа с другим устройством не завершится. И все это вот. Ну, че поделать. Да. Но мне выше говорят, что все можно сделать абстрактно и потом просто строчку дописать, все будет заебись. Не будет, блядь.
>>2607931 При чем тут модбас, чел? Обычные пртоколы Bisync-лайк.
>>2607934 > Период опроса говна в полях сколько лет, если говн несколько тысяч? На скорости 9600 за сутки несколько тысяч можно опросить с одного модема. Чай не жсоны гоняем.
>>2600945 В целом, подход может сработать, потому что спрашивают, обычно, документацию + некоторые практические моменты (популярно встречающиеся, но в доке описаны скудно), таким образом, просто задрочить документацию профита не даст, а если времени пилить пет-проект нет, то и подавно. Хотя я бы советовал совмещать документацию и вопросы к собесам - чувствовать будешь себя уверенней, да и в работе пригодится.
— https://dotnet.microsoft.com/learn
— https://ru.stackoverflow.com/a/416585/422180
— https://metanit.com
— https://professorweb.ru
2. С# для веб
— https://docs.microsoft.com/ru-ru/aspnet/core
3. C# для десктопа
— https://docs.microsoft.com/ru-ru/dotnet/desktop
4. С# для игр
— https://ru.stackoverflow.com/a/609901/422180
5. С# для мобильной разработки
— https://docs.microsoft.com/ru-ru/dotnet/maui
6. Годные ютуб-каналы
— https://www.youtube.com/c/CODEBLOG
— https://www.youtube.com/c/AndreyShyrokoriadov
— https://www.youtube.com/c/DevJungles
— https://www.youtube.com/user/Shmachilin
Шапка: https://pastebin.com/HT7Hi6FD
Прошлый тред: