• Как можно рефакторить код?

    anton_lazarev
    @anton_lazarev
    Я бы поменял class ZayavkaList на class ZayavkaSpisok
    Ответ написан
    2 комментария
  • Что за стрелочная функция?

    evgeniy8705
    @evgeniy8705
    Повелитель вселенной
    Если аргумент один, то скобки можно опустить.
    // ES6+
    nameFunction(array, (item) => console.log(item)); // тоже самое


    // ES5
    nameFunction(array, function(item) {
      return concole.log(item);
    });
    Ответ написан
    Комментировать
  • Какая хорошая книга для начинающего программиста на С/C++ с уклном в сети?

    TrueBers
    @TrueBers
    Гуглю за еду
    Сети — это сети. А C++ — это C++. Не бывает такого, чтобы была книга сразу по двум громадным направлениям.

    Сначала учите C++, а потом сети.
    К тому же, под C++ нет сетевых API. Они все всё равно написаны изначально на чистом Cи и никак не пересекаются.

    Изучив понятие сетей, можно писать на любом языке.
    Ответ написан
    9 комментариев
  • Как преобразовать Uint8Array?

    Ni55aN
    @Ni55aN
    В общем случае для преобразования Uint8Array в Float32Array можно выполнить в 2 строки

    var uint8array = ...
    var point1 = new Float32Array(uint8array.buffer);


    где,к примеру, из 40 элементов (байтов) получится 10 элементов float (так как Float32 - занимает 32 бита == 4 байта)

    for(var i=0;i<uint8array.length;i+=32){  // перебираем элементы каждой записи (строки из последней табл.)
    
    var p1bytes = uint8array.subarray(i,i+12); // получаем данные для первой точки, 12 байт
    var p1 = new Float32Array(p1bytes.buffer); // получили 3 элемента float
    var p2bytes = uint8array.subarray(i+12,i+20);  // теперь следующие 8 байт
    var p2 = new Float32Array(p2bytes.buffer);  // 2 элемента
    
    // дальше идут массивы из элементов по 2 байта (short)
    
    var p3bytes =  uint8array.subarray(i+20,i+24);  
    var p3 = new Uint16Array(p1bytes.buffer);
    
    // и т.д.
    }
    Ответ написан
    Комментировать
  • Можно ли скомпилировать программу на go для запуска на машине без установленного go?

    @gaxetasok
    1. На разных операционных системах - свои правила.
    2. Когда ты компилируешь, не указывая где будешь использовать - тебе компилирует под ту операционную систему, на которой ты и запускаешь компилятор.
    3. В такой ситуации как у тебя нужно явно указывать на какой операционной системе ты собираешься запускать программу.
    4. Это называется кросс-компиляция. Ищи в интернете по этому слову.
    5. Тебе здорово повезло, что ты имеешь дело с Go, в противном случае пришлось бы иметь дело со специальными dev-истралляциями и/или тулчейнами.
    6. Тебе нужно выставить 2 переменные среды окружения - GOOS=linux и GOARCH=amd64, то есть указать формат создаваемого файла. А затем запускать компилятор.
    Ответ написан
    1 комментарий
  • Opencv. Как определить ядро розмытия имея оригинал и размытую картинку?

    Ni55aN
    @Ni55aN
    64d3c8bc241f417b8e2869268f1fdddd.jpeg
    Кажется, поможет решение системы уравнений с 9 элементами, в случае матрицы 3х3.

    Есть библиотека Eigen для этого
    Ответ написан
    Комментировать
  • Как запустить коллбек после асинхронных функций?

    someart
    @someart
    Fullstack Laravel Developer
    Вот это ваше называется callback hell'ом. Поэтому все таки стоить выделить время и почитать о промисах. Вот тут очень годно расписано все.
    Ответ написан
    6 комментариев
  • Си: Почему не выходит ошибка Segmentation fault при выполнении этого кода?

    terrier
    @terrier
    Обращение по адресу памяти, который не был выделен - это Undefined behaviour. Частным случаем такого поведения является Segmentation Fault или вывод значения 1 или все что угодно другое. Вы не можете ожидать какого-то определенного поведения от всей програмы, если в ней есть undefined behaviour.
    Ответ написан
    1 комментарий
  • Как писать много кода, оставляя его простым, как в начале?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Ну в общем-то ответов много. Могу кое-что добавить от себя.

    Во-первых, голова не бесконечна во всех смыслах. Запихнуть в неё больше чем 10 объектов одновременно вряд ли получится, у многих начинаются огромные проблемы уже с 5. Лично я испытываю ДИКУЮ больше если собственный код становится больше чем большой. Для меня это где-то 15~20 сущностей, причём чем сильнее они связаны, тем сложнее они даются, так как становится сложно абстрагироваться. Что примечательно, при работе с чужим кодом таких проблем практически нет, ну у меня по крайне менее. Всё дело в том, что чужой код изначально воспринимается чёрным ящиком, поэтому если он не представляет из себя дикую лапшу, аккуратная работа с ним с минимальным вмешательством в проект получается легко.

    Во-вторых, не стоит делать код пушистым. Однообразность воспринимается лучше. Массивы некоторых объектов надо называть $названием_объекта + 's'. Классы с большой буквы, любой объект стоит называть так же, как класс, но с маленькой буквы. Конечно, если семантически прям просится по другому, то стоит правило нарушить, но в общем случае никаких выдумок не надо. Временная строка - str, временное число - tmp, временный объект - obj. И пробелов не жалей, внутри файла разделяй разные структуры двумя-тремя пробелами, стоит обособлять регионы, например, "глобальные" функции наверху, по середине структуры, потом классы. В C# есть #region.

    В-третьих, объём тоже воспринимать сложнее. Делай плоско. В том смысле, что меньше наследований, больше включений. Очень тяжело воспринимать архитектурную лапшу. Суть микросервисов - единственная, максимум две точки связи. То есть контроллер де должен склеивать всё и вся, это задача "простейшего" диспетчера событий, который крутится в своём цикле и распихивает поступившие сообщения. Микросервису надо думать чем меньше, тем лучше. Вообще, микросервисы не всегда хорошо подходят, они очень удобны в сверхраспределённых командах с высокой степенью самодисциплины, когда привычка смотреть в доки сильнее привычки звонить тимлидеру на каждый чих. В случае с самостоятельной разработкой они скорее зло, хотя в web поначалу довольно приятно, заливать чрезвычайно низкую производительность ресурсами, забивая каналы связи под завязку, не лучшая идея. Порой намного лучше сделать монолитно, но аккуратно, особенно когда вся жизнь продукта под ответственностью одного человека.

    В-четвёртых, внутри монолита также надо делать максимально растянуто, никаких супер-синглетонов бдящие за всем и вся. Равно как и с микросервисами, внутренние объекты должны иметь минимум точек входа. Они должны быть просты и понятны. Если какой-то класс выполняет слишком много задач, часть из них надо делегировать другим классам, возможно новым. Это по сути цикломатическая сложность, о которой упомянул Ivan Sokolov, но мне не нравится эта формальность. Да и некоторые вещи сложно формализовать ребром на графе.

    В-пятых, иерархия должна быть логически правильной, наивной, без выпендрёжа. Тоже самое, что и в третьем, плоское лучше объёмного.
    Плохо:
    3dbadffb7d954b2d93a5dfec863289be.png
    Лучше:
    1238e5c4d83340239a250116d4d2fa3a.png
    Пример немного утрирован, но суть, навроде, ясна. Не надо наследовать всё и вся от чего угодно, если есть возможность включить внутрь - включай. Всё остальное от лукавого и только в крайних случаях.

    В-шестых, используй UML, mind maps, блокнот и таск менеджеры. Эти инструменты словно манна небесная спасают дедлайны от полного уничтожения. Хотя UML спорен, им очень удобно следить за структурой проекта, представлять картину с высока, рисовать его стоит самому, учитывая неявные связи и убирая рудиментарные. Mind maps помогут собрать мысли в кучу. Блокнот банально запишит то, что постоянно забывается. Таск менеджеры сформируют привычный график, отобразят прогресс, помогут фокусироваться на текущих задачах, не растекаясь по проекту.

    В-седьмых, изучи декларативное программирование. Шикарная вещь, которая позволяет сконцентрироваться на задаче, а не на решении. Из коробки в функциональных (erlang) и логических (prolog) языках, однако многие элементы существуют и в монстрах вроде C#/Java, Python, особенно JavaScript. Насчёт Go не знаю, но на первый взгляд весьма декларативный.

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

    Ещё пара абзацев. Ну про вредные советы: методы надо делать ровно такими, какие они должны быть. 20 строк - это что-то вроде лакмусовой бумажки, однако это лишь один из параметров. Очень часто требуется сделать громадную функцию для работы со сложным API или подробить много разных чисел в циклах. Поэтому ориентироваться на это плохая идея. Равно как и папки-подпапки-подпапками погоняемы, максимум - два уровня в чрезвычайно сложных проектах. Иначе будет очень сложно ориентироваться. Ещё происходит странный возврат к комментариям. На мой взгляд, если это не продаваемая за большие деньги библиотека - нах*й надо. Документация в комментариях - рудимент кода, он нигде не используется, зато требует поддержки, на что приходится распылять внимание. Если нет условного рефлекса править комментарий после кода - выбрасывайте и не жалейте. Везде! Без исключений. Ещё есть много "архитектурных" паттернов. Снова вред, если вы не работаете в Google, где вашу зарплату надо оправдать умными словами. Самый эффективный способ - программировать наивно. Чем проще для вас сейчас, тем лучше для вас потом. Если думаете больше десяти минут - плохо думаете... Но об этом позже. Паттерны это некая систематизация неких знаний, причём совершенно не понимаю, зачем её вообще сделали. Да, архитектура в некотором роде нужна, но постоянно искать какой паттерн здесь надо использовать, если это не проект на 100500 лет вперёд - нельзя. Почти всегда будет дешевле в случае неуспеха отрефакторить всё и вся, чем переписывать с нуля или тратить месяцы на продумывание архитектуры... В которой также могут быть ошибки.

    И последнее. Отдыхайте. Если чувствуете, что задыхайтесь - пройдитесь, подышите. Если чувствуете, что мозги плывут - отвлекитесь, подумайте о другом. 8 часов в день для программиста - это дикость, но это реальность. Для разных людей наибольшая эффективность поддерживается где-то 3~6 часов, причём некоторым требуются перерывы каждые пол часа, другому хватит обеденного перерыва, а третьему вообще нельзя сегодня никаких отвлекающих факторов, ибо "волна". На самом деле, человек существо динамичное, так что будут разные дни. Но если не получается сейчас - не бесите самого себя. Отдохните, перекусите, пробежитесь, покурите, проверьте почту, послушайте музыку, почитайте статью. Не тратьте время бездарно и, что интересно, проблемы будут решаться, усилия будут прикладываться аналогичные, но вот ощущения от работы станут совершенно другими.
    Ответ написан
    7 комментариев
  • Существует ли очередность вызовов self-executing функций в JS?

    Будет полезно почитать про EventLoop в JS. (можно посмотреть часть подкаста кантора про nodeJS, там очень хорошо рассказано)
    Асинхронные функции помещаются в очередь, где выполняются, когда интерпретатор освободится.
    Но в вашем случае функции синхронные, так что выполниться должно
    Ответ написан
    Комментировать
  • Если чёрный в CMYK это C=75 M=68 Y=67 K=90 а не C=0 M=0 Y=0 K=100 то какой тогда 100% белый C=0 M=0 Y=0 K=0?

    15432
    @15432
    Системный программист ^_^
    CMYK строится на палитре поглощения. Значение указывает, сколько краски принтера этого цвета будет перенесено на бумагу. Подразумевается, что печать производится на белой бумаге, поэтому да, белый цвет будет соответствовать всем нулям (никакая краска не будет перенесена на бумагу в этой точке).
    Если выкрутить K на максимум, принтер поставит в этом месте точку черной краской, и это будет действительно черный цвет. Но это не будет наиболее черный, который можно достигнуть при помощи вашего принтера, ведь у него есть еще три цвета красок, которые тоже можно перенести на бумагу. Их использование не обязательно, но добавление этих цветов в указанном количестве "усилит" черный, забрав ещё больше падающего на бумагу света.
    Ответ написан
    3 комментария
  • ES6 и почему не работает видимость переменных?

    Ivanq
    @Ivanq
    Знаю php, js, html, css
    Давайте разберем сначала var:
    var a = 1;
    (function() {
      var a = 2;
      console.log(a); // 2
    })();
    console.log(a); // 1
    
    var a = 1;
    do {
      var a = 2;
      console.log(a); // 2
    } while(false);
    console.log(a); // 2

    Что происходит:
    1. var a = 1; объявляет a видимым для себя и дочерних блоков. a будет = 1 если внутри будет for или function. И снаружи, но только если не в function. Например var a = 2 исполнилось, но пропало, так как вызвано в функции (лямбде).
    2. var a = 2 (который в do...while) переобъявляет первый a = 1, так как do..while - не function.

    Теперь let:
    let a = 1;
    (function() {
      let a = 2;
      console.log(a); // 2
    })();
    console.log(a); // 1
    
    let a = 1;
    do {
      let a = 2;
      console.log(a); // 2
    } while(false);
    console.log(a); // 1

    Что происходит:
    1. Здесь как в var
    2. let a = 2 (который в do...while) объявляет a в своей области видимости, первый a = 1 остается.
    Ответ написан
    Комментировать
  • ES6 и почему не работает видимость переменных?

    @hedint
    Web разработчик
    Областью видимости переменных, объявленных ключевым словом let, является блок, в котором они объявлены, и все его подблоки.
    Ответ написан
    Комментировать
  • Вопрос: «Что означают, что представляют идентификаторы в алгоритмических языках»?

    gbg
    @gbg Куратор тега Программирование
    Любые ответы на любые вопросы
    Идентификатор - это имя сущности - переменной, функции, метки, шаблона, макроса и так далее.

    А вы про какие-то типы/классы пишите, вот они отражают как раз семантику.
    Ответ написан
    Комментировать
  • Почему крупные ресурсы не хешировали пароли?

    Jump
    @Jump
    Системный администратор со стажем.
    А почему вы считаете что они не хэшировали пароли?

    Итак нам например надо взломать почту mail.ru, какие могут быть варианты -
    1)Регистрируем домен mall.ru размещаем на нем страничку визуально похожую на главную страницу mail.ru, подсовываем пользователям, и ждем когда пользователи сами накидают пароли.
    2)Ломаем форум игроков в танки, который склепал школьник - выдергиваем логины и пароли. Идем на почту и пытаемся залогиниться в почту под этим логином и паролем.
    3)Ставим пользователю троян который пишет нажатия клавиатуры. Потом просто сортируем и проверяем рядом стоящие слова как логин и пароль.
    4)Если нам достались хэши паролей - устраиваем на них словарную атаку, т.е хэшируем и солим все популярные варианты паролей и проверяем на совпадение. Это гораздо эффективнее брутафорса.
    6)Ну и еще куча вариантов.

    Если в сети появилась база пользователей и паролей крупной площадки - это не значит что площадку взломали и получили доступ к хэшам.
    Ответ написан
    5 комментариев
  • Какая ассимптотическая сложность "доступ по произвольному индексу в двусвязном списке"?

    GavriKos
    @GavriKos
    O(n/2) - вам в любом случае надо идти от элемента к элементу, но если индекс больше половины длины - можете начать с конца, и таким образом пройти максимум половину списка.
    Ответ написан
    3 комментария
  • Куда выкладывать свои работы?

    gordon_shamway
    @gordon_shamway
    Github
    Ответ написан
    Комментировать