Ответы пользователя по тегу Программирование
  • LINQ или foreach?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Скорость отработки запросов на LINQ существенно (в разы) ниже, чем прямой перебор коллекций, однако мы, разработчики, внедряем всякие умные Parallel LINQ или начинаем заниматься разделением потоков вместо того, чтобы не писать LINQ-запрос, а просто перебрать коллекцию

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

    однако там даже ORM-подхода нет

    Не от лучшей жизни же. Да и сейчас, если дотнет брать, достаточно популярен тот же Dapper. Что так же не мешает совмещать EF с Dapper в одном приложении. Возможно, вам не попадались задачи, где игра стоила бы свеч.

    код на LINQ и прочих “упростителях жизни” проще тестировать

    Напротив, функциональные цепочки вызовов в отладке сложнее императивного кода.

    ЗЫ Разработчику нужно обязательно:
    1. знать, как работают его "улучшайзеры" на уровне имплементации, чтобы прогнозировать сложность алгоритмов;
    2. оценивать требования по производительности для отдельных участков ПО;
    3. грамотно проектировать архитектуру, позволяющую проводить рефакторинг в изоляции;
    4. НЕ заниматься микрооптимизациями и НЕ писать велосипеды без нужды.


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

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    С некоторой периодичностью брать снимок с камеры. Кропать его в известном месте (само "табло"). Пробегая по пикселам искать наиболее яркие участки и классифицировать относительно искомых эталонных цветов (красный, желтый и зеленый) удобным способом (допустим, искать кратчайшее расстояние в трехмерном пространстве RGB). Всё.

    Учитывая, что нам известны все параметры и изображение будет +/- одинаковое, то не нужны тут никакие нейросети, оценка формы и всего такого. Даже оценка в динамике не нужна.
    Ответ написан
    4 комментария
  • Как построчно сравнить код?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Ответ написан
    Комментировать
  • Какой инструмент выбрать чтобы подсчитывать периметр фигур?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Поиск контуров с OpenCV. В сети море информации.
    Ответ написан
    Комментировать
  • Как вы организуете свою работу?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    То, что делается больше 5 раз и занимает больше двух минут должно быть заскриптовано. То есть всякие бэкапы, апдейты, деплои, миграции, поиск самых смешных котиков и прочие важные в работе вещи можно и нужно автоматизировать. Тем более, что в виндах теперь есть нормальный bash

    ЗЫ Перед тем, как хвататься за Evernote, я бы посоветовал посмотреть, как оттуда можно извлекать свои заметки (экспорт, при необходимости уйти в какой-нибудь другой сервис). Это не так просто. Это касается любого SaaS, который вы планируете использовать в качестве базы знаний.
    Ответ написан
    10 комментариев
  • Как должен вести себя нормальный PM?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Один pm целый день у меня расспрашивал за сколько я сделаю ту или иную задачу

    Это нормально, так все и делают. А как иначе-то оценить производительность программиста и о чем вести речь с заказчиком?

    Команда садится за стол, втыкает в ТЗ, задают вопросы заказчику, обсуждают, перерабатывает его в последовательность задач. Потом каждую оценивают в часах (конечно же включая туда изучение ранее незнакомого, возможный багфиксинг). Около дня это и выходит. В результате у ПМа на руках примерная (+/- 20%) оценка времени, необходимого на выполнение. С этим он идет к заказчику и общается.

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

    Вы же не уложились в сроки, поэтому интерес не праздный. Конечно, на выходных - это уже некоторая фаза отчаяния.
    Ответ написан
    Комментировать
  • Java Exceptions. Что делать с большим количеством исключений?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    На разных логических уровнях можно (и нужно) делать re-throw более общих типов исключений (с ссылкой на оригинал внутри), если нет возможности их обработать на месте. Например, TooLongNameException и NegativePriceException где-то выше станут ModelValidationException, т.е. там вам достаточно знать, что модель кривая, вне зависимости от того, по какой причине это произошло.

    Может быть пример не самый удачный, ибо здесь наследование бы подошло. А вообще, большой список исключений - это косвенный признак того, что метод слишком много делает (S - SOLID).
    Ответ написан
    Комментировать
  • Как лучше называть переменные и функции?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Самое главное правило - чтобы в данном контексте сразу было понятно, что означает переменная. Чем ближе к английскому, тем лучше (порядок слов сохранять). Есть всего пару основных правил:
    - главное слово в названии - это существительное или прилагательное
    - булевые могут иметь префикс is_... (но не isnot_...)
    - артикли не использовать

    Не нужно дублировать смысл, который и так понятен из контекста. Если у нас, скажем, метод parse_html(), то внутри него вместо html_nodes можно писать просто nodes.
    Ответ написан
    1 комментарий
  • Как избежать тормозов при срабатывании try catch?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Перед обращением вызывайте IDataRecord.IsDBNull (int) вместо проверки try-catch.
    Ответ написан
    2 комментария
  • C#: Как правильно прочитать и записать объекты в ArrayList?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Не стоит использовать ArrayListбез весомой на то необходимости. Поэтому компилятор не смог вас предупредить, что ArrayListсостоит из ArrayList'ов, в котором строки (двумерный массив строк), а не просто строк.

    Вместо ArrayListнеобходимо использовать типизированный динамический массивList<string>.

    public void Click_OpenFile()
    {
        string fileName = form1.OpenFie();
    
        IList<string[]> aL = ParseFile(fileName);
    
        foreach (var line in aL)
        {
            // Снова собираем токены в строки
            MessageBox.Show(string.Join(" ", line));
        }
    }
    
    // Читаем файл и построчно парсим его
    private IList<string[]> ParseFile(string fileName)
    {
        if (string.IsNullOrEmpty(fileName))
        {
            throw new ArgumentNullException(nameof(fileName));
        }
        if (!File.Exists(fileName))
        {
            throw new ArgumentException($"There is no file {fileName}!");
        }
    
        string[] fileContent = File.ReadAllLines(result);
        var aL = new List<string[]>(fileContent.Length);
        foreach (var line in fileContent)
        {
            aL.Add(ParseString(line));
        }
        return aL;
    }
    
    // Разбиваем строки на токены
    private string[] ParseString(string s)
    {
        const char delimiter = '|';
        return s.Split(delimiter);
    }
    Ответ написан
    Комментировать
  • Как связываются ресурсы с кодом?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    • Статически (включаются в сам компилируемый бинарник самостоятельно или платформозависимыми средствами)
    • подгружаются динамически (из отдельных файлов).
    Ответ написан
    Комментировать
  • На что указывают указатели?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Указатель указывает на базовый адрес (первый байт) экземпляра типа. В вашей структуре там лежит член hp типа int, его адрес совпадает с базовым. Он занимает sizeof(int) байт. То есть color находится по адресу базовый адрес + sizeof(int). Следующий член idCar находится по адресу базовый адрес + sizeof(int) + sizeof(string) и так далее. Но на это полагаться опасно, т.к. существует такое понятие, как выравнивание: часто операционные системы выравнивают данные по границе машинного слова. Т.е. если в нашей архитектуре машинное слово - 4 байта, а член структуры занимает 3 байта (char[3]), то будет добавлено пустое пространство в 1 байт и следующий член разместится по адресу адрес char-массива + sizeof(char[3]) + 1

    Тип указателя определяет, на какое количество байт будет происходить смещение указателя при адресной арифметике. Т.е. char* смещается на 1 байт, int* (при sizeof(int) == 4) на 4 байта, к void* адресную арифметику применять нельзя, потому что его размер нам неизвестен.
    Ответ написан
    Комментировать
  • Можно ли полноценно работать на ноутбуке?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Скажу так: страдания) 17" ноутбук + 24" монитор. Разный размер, разная цветопередача, разная высота и физический размер в конце концов. В принципе, работать можно, но это должно быть оправдано (частые командировки, митинги и т.п.). В моем случае это был одновременно большой, тяжелый, дорогой ноутбук, который заставлял переживать в поездках, и слишком мелкий, перегревающийся для статичной работы в офисе. Сейчас пересел на десктоп с двумя идентичными мониторами и временами ловлю себя на мысли, что третий был бы кстати...
    Ответ написан
    Комментировать
  • Как из списка базового класса сделать список наследуемового класса?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    *Какая-то беда с дизайном.*

    Кастовать вниз по иерархии (downcast) напрямую объекты A в B нельзя, потому что A - это не B. Потому что B содержит какое-то дополнительное состояние (b), которого нет в A и компилятору неизвестно, каким оно должно быть в текущем виде (A конструировался иначе, чем B и как получить валидный B из A - известно лишь программисту).
    Об этом вам пытается рассказать рантайм (Invalid Cast).

    Что касается методов, которые не приводят к желаемому:
    Enumerable.OfType<T>() - фильтрует по типу и законно возвращает пустой список (у вас список A, там действительно нет B)
    Enumerable.Cast<T>() - последовательно делает каст, который невозможен.

    Можно попытаться скопировать объекты в новый список:
    listA.Select(x => new B{ a = x.a }).ToList();

    Но это прокатит лишь в том случае, если мы сможем достать из A необходимые данные для конструирования объекта B. Важно понимать, что это будут именно ДРУГИЕ объекты. Если A некопируем по своей природе, то этот фокус не пройдет.
    Ответ написан
    1 комментарий
  • Какие API существуют в Visual Studio (C#) для работы с проектом?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Ответ написан
    Комментировать
  • В какой универ поступить на программиста после армии в СПб?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Как минимум вуз лучше выбирать технический, лучше - профильный, вроде ИТМО. Крайне желательно поинтересоваться, чтобы в дипломе потом среди прочего написали слово "программист". Хотя, как программа-минимум, подойдет любой технический вуз с любым направлением, где изучают CS как один из основных.
    Бакалавриат не нужен - специалитет или магистратура.

    ЗЫ Не слушай ерунды, если не хочешь ограничиваться сайтиками, работать в хорошем месте и добиться кое-чего по карьере, то вышка обязательна.
    Ответ написан
    2 комментария
  • Где или как можно такое организовать (работа с цветами)?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    1. Взять цвета радуги (как известно - К-О-Ж-З-Г-С-Ф)
    2. по ним рассортировать точки исходного массива (найти декартово расстояние между точкой и чистым базовым цветом), получим достаточно простую двумерную палитру: базовый цвет и расстояние до него,
    3. свести ее к одномерному массиву: выводить группы в естественном порядке, а цвета в каждой группе - по возрастанию расстояния.
    Ответ написан
    Комментировать
  • Стоит ли создавать дополнительные переменные для лучшей читаемости кода?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Здесь не бывает универсальных правил. Посмотрите на код свежим взглядом и подумайте, будут ли очевидны шаги алгоритма при белглом промотре?
    Еще можно опираться на близость алгоритма к естественному языку: "для каждого ценника к общему прибавить ценник определенного типа". То есть дополнительная переменная здесь скорее добавляет многословности - лишнюю сущность, который нужно держать в голове.
    Ответ написан
    Комментировать
  • Что будет, если передать значение больше 255 в unsigned char C++?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Переполнения не контролируются автоматически. Можно делать это самостоятельно, к примеру, с помощью std::numeric_limits.

    §5 черновика Стандарта C++:

    1. [ Note: Clause 5 defines the syntax, order of evaluation, and meaning of expressions.60 An expression is a
    sequence of operators and operands that specifies a computation. An expression can result in a value and
    can cause side effects. — end note ]
    ....
    4. If during the evaluation of an expression, the result is not mathematically defined or not in the range of representable values for its type, the behavior is undefined.
    Ответ написан
    4 комментария
  • В каком типе переменной хранить (м\ж) пол?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    ИМХО, расточительно делать отдельную таблицу под пол. Отлично подойдет (если не уходить в дебри человеческих отклонений):
    enum Sex { 
        Male,
        Female,
        Undefined
    }

    bool? - тоже вариант, но читается хуже.
    Ответ написан
    Комментировать