• Когда вписывать технологию в свой стек?

    paran0id
    @paran0id
    Умный, но ленивый
    Когда готов ответить на вопросы по ней на техническом собеседовании.
    Ответ написан
    Комментировать
  • Как проверить что массив из Foo или Bar?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    Для начала, в TS структурная типизация, что значит что типы определяются по содержимому а не по объявлению как в номинальной.
    Под тип пустого интерфейса подходит всё кроме null и undefined. И как правильно отметил WbICHA в комментариях, данные интерфейсы полностью эквивалентны.

    Допустим, что Foo и Bar всё же содержат в своем описании какие-либо поля, и это разные типы. Тогда тип (Foo|Bar)[] позволит передать в себя массив, каждый элемент которого может быть как Foo так и Bar. Проверить тип всех элементов можно лишь пройдя итерацией весь массив.
    Если хотим, чтоб все элементы массива были одного типа, только Foo или только Bar, то нужно принимать такой аргумент Foo[] | Bar[], в этом случае достаточно проверки элемента с индексом 0.
    Ну и наконец любая вариация этих типов допускает пустой массив, из которого тип элементов определить невозможно.
    Ответ написан
    Комментировать
  • Как работать с точными числами в js, decamal?

    VoidVolker
    @VoidVolker Куратор тега JavaScript
    Dark side eye. А у нас печеньки! А у вас?
    по типу как в питоне встроенный тип decimal. ничего толкового не нашел

    Значит плохо искали! Ибо в первых же нескольких строчках гугла есть decimal.js - что конкретно в нем не устроило? Есть еще куча других библиотек с поддержкой типа decimal. Чем они не устроили?
    умножение на 100 и деление. округление все это не подходит

    Что значит "не подходит"? У вас там итоговые суммы выходят за пределы диапазона Number.MIN_SAFE_INTEGER - Number.MAX_SAFE_INTEGER? Работа с финансами в целочисленном формате - вполне нормальная и традиционная практика.
    Ответ написан
    3 комментария
  • Как вычленить из текста ФИО на python, при том что конкретных шаблонов нет?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    В общем случае эта задача не решается на 100% по определению.
    Вы говорите, что вокруг фамилий у вас произвольный текст, а это значит, что среди этого текста попадаются слова, которые чем-то похожи на ФИО, но не ФИО, или имя отчество, без фамилии, или что-то вроде "светкин василёк Игоревич". Можно это считать таким экзотическим ФИО, или отчество тут просто отдельно стоит и искать его не надо?
    В любом случае схема решения примерно такая. Если у вас есть знаки препинания, то можно разбить по ним фрагменты текста, ФИО не разделяется знаками препинания (кроме дефиса), но дефис отличается от тире пробелами по бокам.
    Далее у вас есть цепочки слов. Если в цепочке N слов, то в ней, можно сказать, N-2 кандидата на ФИО.
    Каждая трока-кандидат на ФИО может быть проклассифицирована по ряду признаков, свидетельствующих в пользу того, является ли эта тройка ФИО. Осталось только определить набор признаков и веса этих признаков. Каждый признак определяет два показателя: 1) насколько этот признак добавляет шансов тройке быть ФИО; 2) на сколько несовпадение по этому признаку отнимает шансов быть ФИО. Показатели определяются от нуля до 1 и перемножаются. Подбор признаков и их показателей будет настройкой вашего классификатора.
    Тут дальше можно двигаться разными путями.
    Часть детектов вы сможете надёжно определять по окончанию отчества.
    Часть признаков у вас будут словарными словами, которые, по вашему, не могут быть именем и\или фамилией.
    На этом этапе уже будет довольно хорошая детекция. Вопрос что вам важнее, отсутствие false positive, или отсутствие false negative.
    Так же по-разному может повезти с входными данными. Если у вас много "ловушек" в виде разбросанных по тексту бесхозных отчеств, если у вас много очень странных имён... в общем тут вам никто не выдаст идеальное решение. При отсутствии четкого ТЗ результатом будет расплывчатое ХЗ.
    В целом обычно на настройку таких классификаторов под текст на первое время сажают людей. У нас сейчас есть ChatGPT и ему, думаю, вполне можно скидывать наборы имён, чтобы он вычеркивал те, которые вряд ли именами являются. Если вы приняли, что какое-то слово не может являться именем, или фамилией, то такое решение хорошо бы кэшировать, а затем для консистентности придерживаться аналогичного в других случаях.

    Странная у вас задача, сударь. Выглядит как учебная. В этом случае рассуждений вроде приведенных мной здесь хватило бы для успешного ответа на собеседовании.
    Ответ написан
    2 комментария
  • Какая сфера в IT/яп лучше подходят для работы параллельно с учебой?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Если стоит задача именно зарабатывать, то единственный сейчас для студента выход - это партайм в общепите, торговле или доставке. Работу по специальности найти практически невозможно. Редких счастливчиков с выдающимися качествами возьмут на бесплатную стажировку.
    Ответ написан
    2 комментария
  • Спалят ли HR резюме?

    1. На начальных этапах никто не звонит работодателю для уточнения данных. Не кредит же тебе на миллион одобряют)

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

    PS: ну и ты всегда можешь сказать, что не имеешь право указывать своё место работы или контакты работодателя.
    Ответ написан
    Комментировать
  • Как защитить программу от копирования без интернета?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Никак. Единствнный способ гарантированно защититься от нелицензионного копирования - это вынести ключевую часть функционала на сервер. Любая остальная защита - лишь усложнение реверс инжениринга и взлома. Всегда можно каленым железом вырезать любую проверку ключа из исполняемого кода.

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

    А так, берете какую-нибудь крипто библиотеку, выдаете сертификат, в котором подписываете своим приватным ключем "Лицензия выдана ООО рога и копыта". В программе зашит ваш публичный ключ. Программа проверяет файл лицензии, что он подписан вашим ключем. Но любой "хакер" умнее вас просто вырежет эту проверку из программы.
    Ответ написан
    4 комментария
  • В каких случаях используют useEffect без второго аргумента в виде массива?

    Alexandroppolus
    @Alexandroppolus
    кодир
    использовал для кейса, когда есть реф и у этого рефа current мог меняться во время жизни компонента.

    вкратце:
    const ref = useRef<HTMLDivElement>(null);
    const prevRef = useRef<HTMLDivElement>(null);
    
    useEffect(() => {
        if (ref.current === prevRef.current) { return; }
        prevRef.current = ref.current;
    
        // реф поменялся, что-то делаем
    });


    по факту я здесь делаю то же самое, что происходит в депенденсах, но депенденсы непригодны:
    1) [ref] - бесполезно, будет один и тот же, эффект не перевызовется
    2) [ref.current] - бесполезно, реф меняется после фазы рендера.
    Ответ написан
  • Есть ли необходимость или очевидные плюсы перехода на linux?

    @tarasovc47
    Эникей со стажем))
    ОС - инструмент, а не цель.
    На вопросы почему ответов ясных не нашел
    потому что их нет. Всё очень индивидуально, начиная от вкусовых предпочтений, заканчивая аппаратной конфигурацией. Я сам работаю в линухе, живу на винде (всё в одном компе дуалбутом), но я админ/devops, и мне необходима такая конфигурация, чтобы знать как помочь разрабу и с виндой, и с линухом (иногда даже с маком).
    Если работаешь в команде - спроси тамошнего админа, готов он будет тебе помогать или нет? или может быть по соседству живёт добрый линуксоид, который за пивас с орешками будет помогать советами.
    Если админа/соседа линуксоида нет - то живи на винде, там вполне годно работает WSL (в моей команде это нивелирует разницу в ОС лишь добавляя нюансы).
    И статьи "ТРУЪкодер должен быть линуксоид" - фтопку, по вышеописанным причинам
    Ответ написан
    2 комментария
  • Почему у пересечения функций такой ReturnType?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Ни в чём. Просто ограничение языка. Видимо слишком сложно было сделать и\или обосновать. Возможно в какой-то следующей версии языка пофиксят.

    Вот issue помеченная как "Design Limitation", там есть workaroud(который не стоит юзать в проде, разве что если очень хочется).
    Ответ написан
    5 комментариев
  • О прибыльной карьере в российской технологической индустрии?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Отвечу то же, что и россиянам, желающим переехать: Нужно как минимум быть существенно лучше среднего местного программиста, чтобы компенсировать работодателям проблемы с наймом иностранца. В остальном проблем не вижу, на рынке ИТ страны сильный кадровый голод.
    Ответ написан
    14 комментариев
  • Как правильно выбрать фреймворк и яп для проекта, если ты заказчик?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Никак. Выбор инструмента - это задача тимлида и/или техлида. Т.е. ведущего/главного разработчика, отвечающего за принятие ключевых технических решений. Ваша задача, как заказчика, четко оформить требования, ограничения и сформировать начальное ТЗ и описание, что вам требуется от проекта, прототипы интерфейса, например. Без вникания в технические детали. Т.е., "хочу чтобы были фичи такие-то и работил они так-то, ограничения такие-то, требования такие-то". Далее уже задача найти разработчика/команду с большим или достаточным для данного проекта опытом. Далее из начального ТЗ формируется полноценное техническое задание: описывается весь требуемый функционал, рисуется дизайн, прописываются требования, ограничения и прочие хотелки. И на основе ТЗ, тим/тех лид уже подбирает/подбирают наиболее оптимальные и конкретные инструменты и решения, основываясь на собственном опыте и знаниях для конкретно этой задачи. Например, если человек хорошо знает несколько разных инструментов и есть достаточный опыт их использования - он может реализовать проект используя любой из них как одинаково хорошо, так и одинаково плохо. У разных ЯП и фреймворков свои плюсы и минусы. Далее из ТЗ формируется более детальное ЧТЗ и происходит разработка проекта.

    Вот вы говорите:
    Нужно будет выполнять много запросов к БД

    Важная быстрая скорость работы нашего сайта

    Много/быстро это сколько? 100 запросов в час? 1000 в минуту? 1М в секунду? Загрузка страницы за 30/10/1с или даже 100мс? А к какой именно БД? Какая характеристика самих данных и какого типа запросы? На какое количество соединений? В каком регионе? Есть ли там тяжелые или еще какие-то вычисления? Медиа файлы - картинки, видео? Тут очень много нюансов. В идеале следует определиться с конкретными значениями/параметрами и их описать в ТЗ. Ну или определить примерное, а фактическое значение определить на стадии прототипа/MVP и/или провести какое-то исследование/тестирование. Можно потратить десяток лямов на написание крутого кода на го/расте/С++/ассемблере в течении года и все будет летать на простейшем сервере. А можно купить свой сервер за лям (ну, условно, конечно), нанять питонщика или PHP-ника за 300к и он за пару-тройку недель добьется такого же результата. Большинство веб-задач сегодня достаточно просто или с минимальными усилиями решаются абсолютным большинством решений для веба. Да, у всех решений есть свои плюсы и минусы.

    Безопасность от всяческих XSS и SQL атак.

    Вот с этим проще: использовать популярные OpenSource решения, регулярно проводить тесты, нанять отдельно опытного разработчика, красноглазика и пентестера - и тратить на них деньги, пока деньги не кончатся или не будет достигнут необходимый уровень безопасности. Безопасность противоположна удобству, защита отстает на шаг от атак. Риск есть всегда и надо просто быть готовым к последствиям и иметь запасной плат хотя бы в общих чертах.

    А так - уже правильно посоветовали сразу брать дот-нет, т.к. у вас требование к использованию конкретной библиотеки для дот-нета.
    Ответ написан
    1 комментарий
  • Как пишется ПО для дронов или БПЛА и что почитать чтобы это узнать?

    0. Направление не новое и хорошо изученное.

    1. Зависит от того, какое именно ПО.
    Что-то пишется на Си, что-то на языках высокого уровня, а что-то реализуется на уровне железа (плис/fpga/asic)
    Для моделирования каких-то процессов может использоваться уже упомянутый матлаб, например.

    2. Изучать нужно теорию управления и физику, тк по сути всё управление моторами базируется на ней - а это по сути основная и единственная задача, как удержать дрон в воздухе, не сталкиваться с препятствиями при движении, а в случае отсутствия движения - оставаться на месте.
    По разработке - собственно Си для микроконтроллеров и verilog для железа. По хорошему ещё электронщиком нужно быть.
    Не сильно от обычной embedded разработки отличается, выходит.

    А на высоком уровне - там уже на конкретную задачу нужно смотреть. Где-то может даже ML и компьютерное зрение понадобится.
    Получается тоже не так уж много отличий от обычной разработки.
    Ответ написан
    Комментировать
  • Внешний SSD на 1 тб за 800р на али. В чём подвох?

    VoidVolker
    @VoidVolker Куратор тега Железо
    Dark side eye. А у нас печеньки! А у вас?
    Вот в чем:
    scale_1200
    Ответ написан
    1 комментарий
  • Какую выбрать ОС для веб-разработчика?

    SignFinder
    @SignFinder
    Wintel\Unix Engineer\DevOps
    В Windows есть WSL в том числе и с образами Ubunu
    Ответ написан
    Комментировать
  • Структура для хранения типо в проекте, какие могут быть подводные камни?

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

    Почему в большинстве рекомендаций и статей просто делают папку types и в нее уже все типы складывают?

    Это надо спрашивать у авторов этих статей.
    Ответ написан
    Комментировать
  • Есть ли причина по которой файлы с типами имеют в названии .d?

    Узнал через несколько дней что файлы с типами принято называть с окончанием .d.ts.

    Нет, не принято.
    Расширение d.ts имеют файлы с декларациями. Собственно d - это сокращение от declaration.
    И это не "принято", а является стандартом на уровне языка.

    Использовать декларации нужно только в одном случае - если у тебя есть JavaScript код, который нужно прикрутить к проекту на TypeScript не переписывая. Частный случай - если у тебя есть npm-пакет, к которому нужно добавить типы

    Об этом написано в документации, и страницу с этой документацией гугл выдаёт в первой же строке:
    https://www.typescriptlang.org/docs/handbook/decla...
    Ответ написан
    2 комментария
  • Можно ли быстрее чем за O(N) подсчитать сумму S(N,K,M) = sum i=0..N K*i%M?

    wataru
    @wataru Автор вопроса, куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Совершенно случайно наткнулся вот на это вот равнество: hermite's identity (в твитте с прикольным доказательством. Зацените).

    C помощью него наконец-то вывел способ подсчитать эти суммы за O(log n)! Я знал, что это можно сделать!

    Итак, во-первых, можно переключатся между суммами floor(i*k/m) и (i*k)%m через вот это равенство: floor(i*k/m) = (i*k - (i*k)%m) / m
    Это нам позже поможет. В сумме через floor можно сократить GCD(m, k) в них. В сумме через модуль можно сделать k %= m, если оно больше m, да и сократить полные "обороты" в n.

    Итак, можно допустить, что m > k, m >n, GCD(m, k) = 1, иначе преобразуем сумму к нужной форме и все упростим.

    Дальше, применим равенство hermite's, взяв x = i/m, n = k.

    Потом поменяем местами суммы. Под знаками суммы будет floor(i/m + t/k) (где t - новая переменная суммирования от 0 до k-1). Присмотритесь к этому выражению - там 2 числа меньших 1. Т.е. весь этот floor даст 1, только если t/k >= 1-i/m. Отсюда можно решить это неравнество, сдвинуть нижнюю границу суммирования и получить сумму единиц во внутренней сумме. Заменив ее всю на количество слагаемых там вылезает floor (t*m/k). Т.е. мы выразили сумму i*k/m через сумму t*m/k. Но мы же помним, что можно перейти к сумме модулей и там сократить множитель k в числителе. Таким образом мы вычисляем сумму для (m, k) через сумму для (k, m%k). Это точно такой же переход, как и в GCD, поэтому суммарно будет всего O(log n) итераций. Вообще, выкладки довольно нудные, ибо сумма для t*m/k будет не от 0 до какого-то n', а от n' до k-1. Но можно взять известное значение для суммы полного оборота (от 0 до k-1) и из нее вычесть сумму от 0 до n'-1. Эта сумма известна, потому что при GCD=1, она пройдется по всем остаткам в каком-то порядке.

    Формула примерно такая получается:
    FloorSum(n, k, m) = (m-1)*(k-1)/2 - (n1+1)*n1*(m/k)/2 + (n - m + 1)*(k-n1-1) - FloorSum(n1, m%k, k)
    n' = floor(((m-n)*k-1)/m)


    Вот код. Значения совпадают с тупым решением для всех чисел до 1000 и для миллиардов случайных чисел до миллиона.
    // sum i = 0.. n floor(i * k / m)
    // GCD(k, m) must be 1.
    // n < m
    // k < m
    long long FloorSumInternal(long long n, long long k, long long m) {
    	if (k == 0 || n <= 0) return 0;
    	if (m == 1) return k*n*(n+1)/2;
    	const long long n1 = ((m-n)*k - 1)/m;
    	long long ans = (m-1)*(k-1)/2 - (n1+1)*n1*(m/k)/2 + (n - m + 1)*(k-n1-1);
    	ans -=  FloorSumInternal(n1, m%k, k);
    	return ans;
    }
    
    
    // sum i = 0.. n floor(i * k / m)
    long long FloorSum(long long n, long long k, long long m) {
    	if (k == 0 || n <= 0) return 0;
    	if (m == 1) return k*n*(n+1)/2;
    
    	const long long d = Gcd(m, k);
    	m /= d;
    	k /= d;
    	if (k >= m || n >= m) {
    		// (n*k*(n+1)/2 - ModSum(n, k, m, d))/m;
    
    		const long long nn = (n+1)%m-1;
    		const long long num_full = (n+1) / m;
    		const long long kk = k % m;
    
    		long long ans = 0;
    		ans = (k*n*(n+1) - kk*(nn+1)*nn)/m - num_full * (m-1);
    		ans /= 2;
    		ans +=  FloorSumInternal(nn, kk, m);
    		return ans;
    	}
    	return FloorSumInternal(n, k, m);
    }
    
    
    
    // sum i = 0.. n (i * k) % m;
    long long ModSum(long long n, long long k, long long m)
    {
    	long long d = Gcd(k, m);
    	if (k == 0 || m == 1) return 0;
    	// (i*k) % m = i*k-floor(i*k/m)*m
    	k %= m;
    	long long num_full = (n+1) / m;
    	long long ans = num_full * (m-d) * m/2;
    	n = (n+1)%m-1;
    	if (n > 0) {
    		ans += ((long long) k)*(n+1)*n/2 - m*FloorSum(n, k/d, m/d);
    	}
    	return ans;
    }


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

    Edit: прилизал код немного.
    Ответ написан
    Комментировать
  • Можно ли заменить javascript языком dart/flutter?

    liaFcipE
    @liaFcipE
    Вы написали какую-то ерунду, из которой можно сделать лишь один вывод: вы не знаете JS.
    Изменений в языке, которые ломали бы текущий API - нет (почти), обратная совместимость - основной пункт новых спек языка. Сам язык обновляется, добавляется новый сахар, новые webAPI, etc.

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

    > может ли flutter заменить его

    Он точно так же в контекте браузера собирается в JS, как и например TS. Браузер, сейчас, не умеет исполнять ничего, кроме JS. Только, по моему мнению в вебе flutter никому не нужен, слабое комьюнити, а м.б. и Dart вместе с flutter отправится в https://killedbygoogle.com через какое-то время...
    Ответ написан
    1 комментарий