Задать вопрос
  • Какие файлы считаются небезопасными для загрузки на сервер?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Все файлы безопасны. Можно загружать и .php и .apk, главное запретить исполнение и разрешать только скачивание.
    Отдельно конечно вопрос по содержимому, так как зальют вам вирус - за это сайт выкинет гугл или яндекс или попадёте в чёрные списки. Зальют картинку или видео с сомнительным содержимым, уже придёт роскомнадзор или хостер выкинет вас или регистратор заблокирует домен.
    Ответ написан
    Комментировать
  • Какие файлы считаются небезопасными для загрузки на сервер?

    @tukreb
    Все файлы небезопасны. Можно загрузить картинку, в которой будет исполеяемый код.
    Вы должны настроить сервер (nginx/apache) так, чтобы в папке где будут загруженны клиентами файлы, в принципе нельзя было исполнять НИКАКИЕ файлы.
    Ответ написан
    Комментировать
  • Какую легковесную IDE выбрать для C++?

    Wohlstand
    @Wohlstand
    Инженер-программист С++
    Я сам для себя использую Qt Creator. По мне очень удобная и шустрая среда. Однако, хочу предупредить: в последних версиях присутствует модуль clangd (модель кода CLang): штука очень полезная, позволяющая находить различные косяки на лету без необходимости собирать проект, однако, она жрёт оперативку очень знатно. Поэтому, если машина слабая, то лучше отключить эту штуку. Мне лично среда ОЧЕНЬ нравится не только за её легковесность, но и за встроенный функционал по рефактрорингу (умному переименованию элементов кода, например, быстрому созданию тел функций и методов из прототипов сразу в нужном месте, и т.п.). Сравнивал я с Clion: последняя удобная по части быстрых подсказок и некоторой автоматизации по исправлению косяков, но по большей части менее удобная и невероятно тяжеловесная (да "здравствует" Java).
    Ответ написан
    Комментировать
  • Почему переопределение метода без virtual -- это не переопределение?

    @res2001
    Developer, ex-admin
    Переопределить можно в любом случае, хоть с virtual, хоть без.
    Но тут важно что вам надо от переопределенного метода. Если вам нужно использовать полиморфизм, то нужно ставить virttual, если нет - то нет.

    Например дополним ваш пример функцией:
    void func(struct A &a)
    {
      a.fn();
    }
    
    int main() {
      B b;
      b.fn();
      func(b);
    }

    И передадим туда ссылку на b. Будет напечатана А, т.к. методы fn не виртуальные.
    Если были бы виртуальные, то напечатается B - полиморфизм в действии.
    Ответ написан
    Комментировать
  • Нужно выгрузить сайт с битрикса, как это провернуть?

    ZERGeich
    @ZERGeich
    Битрикс - это движок.
    Это не просто таблички и набор html файликов.
    Поэтому простым копированием - вы не перенесёте его на другой движок.
    И CRM в данном случае вообще не к месту. Хоть погуглите - что это такое.
    Ответ написан
    Комментировать
  • Что почитать про программирование под Линукс?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    А под линукс как-то особенно программировать не требуется. Наоборот можно уже писать кроссплатформенно.
    У винды много своей специфики, связанной со странными особенностями файловой системы, с выкрутасами в плане использования кодировок в терминале, в файловой системе, в остальных местах... Когда начинаешь кодить на линукс и под линукс, то аж дышится легче.
    Начинаешь думать, что интерфейсы можно делать не нативно, а в виде веб-интерфейсов, которые отлично смогут работать и в облаке, и прямо на роутере, и локально.
    В линуксе гораздо проще и каноничнее всё с доке-контейнерами, стандартной является вся инфраструктура командной строки, свзанная с механизмами автоматизации: стандартные тулзы, make, системы управления пакетами...
    Поднять на линуксе изолированную повторяемую среду получатся гораздо проще, чем в винде.

    Вообще не понятно, конечно, о каком програмировании речь. Тут и системное программирование упоминалось, и GUI...
    По собственному опыту скажу, что сомнения при переходе на разработку под линукс в основном надуманные и ненужные. Переход происходит естественно и непринужденно.
    Особенно подкупает встроенная в систему хорошая документация и огромное количество структурированной информации в сети. Даже книг каких-то специальных читать не пришлось. Просто по обстоятельствам ищем статьи и мануалы по конкретным темам: особенности и устройство файловой системы, пайпы, потоки, процессы, система прав доступа...
    Ответ написан
    1 комментарий
  • Хотелось бы узнать мнение профессионалов по данному курсу?

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

    ThunderCat
    @ThunderCat Куратор тега Веб-разработка
    {PHP, MySql, HTML, JS, CSS} developer
    Можно я внесу немного конструктивной критики в ваш вопрос, ну и сделаю некоторые выводы, возможно вам они будут полезны...

    Я занимаюсь разработкой интернет проектов. Сейчас вместе с командой специалистов мы готовимся к разработке большого и высоконагруженного проекта.
    Вы же не рекламное письмо фирме пишете, говорите четко - "у нас есть 6 маркетологов, джун верстальщик и эйчар". Ну или " У нас было два пакетика травы, семьдесят пять ампул мескалина, 2 явиста мидла, 2 пхп сеньера, бухгалтерия, наполовину наполненная старушками с калькуляторами, и целое море различных специалистов по яваскрипту, цсс, хтмл и их комбинациям в ассортименте, а так же...".
    Тогда понятно - что вам искать, какие спецы какого уровня у вас уже есть и стоит ли их менять или строить будущую архитектуру под уже имеющийся состав.

    Общая концепция выглядит приблизительно так:
    Будет много разных баз данных, в которых будет храниться информация разного типа, текстовая, . Каждая база будет содержать информацию по разным темам.
    Информация графическая, видео и аудио типов чаще всего не хранится в бд. Если вы не программист/архитектор IT структур - поручите вопросы архитектуры и структурирования данных кому-либо из команды, кто в этом разбирается (если таковые есть).

    Отдельно будет полнотекстовая поисковая система объединяющая информацию из всех источников.
    В принципе не особо зависит от стека, тут больше архитектурно-проектировочная задача.

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

    Посоветуйте пожалуйста какой стек технологий для разработки выбрать, с учётом некоторых условий:
    - Язык(и) программирования современные и содержащие подробную информационно-документальную базу и популярные сообщества поддержки.
    На сегодняшний день есть 4-5 хорошо распространенных языка, используемых в вебе: пхп, ява, жс, питон, в меньшей степени c#, руби, голанг, остальные больше экзотика, нежели мэйнстрим.
    - Высокая производительность и многопоточность.
    Которая в вебе не особо нужна, хотя практически все вышеперечисленные языки в той или иной мере многопоточность поддерживают. Опять же - сразу "видны уши" вашей недостаточной компетентности в вопросах разработки высоконагруженных проектов. Дело в том что в 99% случаев код именно языка программирования особо не нагружен. Больше всего процессорного времени будет съедаться запросами к бд и внешним сервисам. Код просто прослойка между фронтом и бд, чаще всего просто выполняющая задачи CRUD прослойки.

    - Простая масштабируемость.
    - Актуальность на ближайшие 2-3 года.
    Везде подходит

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

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

    На вашем месте я бы не лез в это вообще, если вы не являетесь специалистом айти профиля, а нанять прожект менеджера с опытом больших проектов, который определит уже что и зачем вам нужно.
    Ответ написан
    1 комментарий
  • Вопрос по развитию IT?

    @tukreb
    1. Прочитайте любую основу.
    2. Начните кодить, что угодно и как угодно (хотя бы тот же блог или туду лист), тут главное начать и без чужой помощи, сами гуглите сами ищите и гавнокодите.
    3. Когда кое как закончите с 2 пунктом, можете приниматься за умные книжки, типо ООП и т.д
    4. Берёте проект из 2 пункта и переделываете с теми знаниями, что получили из 3 пункта.
    5. Читаете следующую умную книжку
    6. Переделываете проект из 4 пункта со знаниями полученными в 5 пункте.
    И так до бесконечности. Да именно так, в IT нет конечной точки, вы должны всегда обучаться и практиковаться.
    Ответ написан
    9 комментариев
  • Тип с точностью до 4 знаков C++?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Есть. Называется int. Вам надо хранить количество десятитысячных в числе. Иными словами, вы вместо x храните в int x*10000. При выводе делите на 10000 (и установите выводить 4 знака).

    Такие числа можно просто складывать и вычитать. При умножении надо будет результат поделить нацело на 10000 (или округлить к ближайшему, делящемуся на 10000 и потом отбросить 4 нуля). При делении - наоборот. Надо сначала домножить числитель на 10000, а потом поделить нацело на знаменатель (возможно стоит подумать об округлении к ближайшему целому).

    Upd: И вообще, раз уж разговор о C++, то можно реализовать свой класс. Там можно даже отдельно хранить целую часть и 4 знака после запятой. Если вам встроенной точности int/int64_t не хватает. Все математические операции можно переопределить и работать, как со встроенным типом. Вообще, по-умному, это называется fixed point numbers.
    Ответ написан
    Комментировать
  • Ошибка с перенаправлением: как скачать файл с веб.страницы в формате pdf?

    deepblack
    @deepblack Куратор тега Python
    Дело в том что на этом сайте есть защита от ботов.
    И скачивается не пустой файл как html, а довольно интересный код на JS (внутри этого html файла):

    Посмотреть содержимое

    var utm_set = null;
    
    function setup_utm() {
        if (utm_set == null) return null;
        var i = 0;
        var p = document.createElement("a");
        p.href = document.referrer;
        for (i = 0; i < utm_set.length; i++) {
            if (p.hostname === utm_set[i]["host"] || p.hostname.indexOf(utm_set[i]["host"] + '.') === 0 || p.hostname.indexOf('www.' + utm_set[i]["host"] + '.') === 0) {
                return utm_set[i]["args"];
            }
        }
        return null;
    }
    
    function fixedEncodeURIComponent(str) {
        return encodeURIComponent(str).replace(/[!'()*]/g, function(c) {
            return "%" + c.charCodeAt(0).toString(16);
        });
    }
    
    function get_jhash(b) {
        var x = 123456789;
        var i = 0;
        var k = 0;
        for (i = 0; i < 1677696; i++) {
            x = ((x + b) ^ (x + (x % 3) + (x % 17) + b) ^ i) % 16776960;
            if (x % 117 === 0) {
                k = (k + 1) % 1111;
            }
        }
        return k;
    }
    
    
    function get_param(store, type, id) {
        var o = document.cookie.split(';');
        var p = undefined;
        for (var i = 0; i < o.length; i++) {
            if (o[i].indexOf(store) !== -1) {
                var a = o[i].split('=');
                if (a.length > 1) {
                    var q = a[1].split(',');
                    if (q.length > id) {
                        p = q[id];
                    }
                }
            }
        }
        if (p === undefined) {
            if (type === "int") {
                return 0;
            }
            if (type === "str") {
                return "";
            }
        }
        if (type === "int") {
            return parseInt(p);
        }
        return p + "";
    }
    
    function get_utm_medium() {
        var mediums = {
            "organic": ["yandex", "google", "bing", "search.yahoo", "yahoo"],
            "referral": null
        };
    
        var m, a, v, f = 0;
        var p = document.createElement("a");
        p.href = document.referrer;
        for (m in mediums) {
            a = mediums[m];
            if (a == null) {
                break;
            }
            f = 0;
            for (var i = 0; i < a.length; i++) {
                v = a[i];
                if (p.hostname.indexOf(v + '.') === 0 || p.hostname.indexOf('www.' + v + '.') === 0) {
                    f = 1;
                    break;
                }
            }
            if (f === 1) {
                break;
            }
        }
        return m;
    
    }
    
    function mini_hostname(hostname, medium) {
        if (hostname === undefined || hostname === "") {
            return hostname;
        }
        hostname = hostname.replace("www.", "");
        if (medium === "organic") {
            if (get_param("__js_p_", "int", 3) === 1) {
                hostname = hostname.split(".")[0];
            }
        }
        return hostname;
    }
    
    function construct_utm_uri(disable_utm) {
    
        var p = document.createElement("a");
        p.href = document.referrer;
        if (p.href === "") {
            return window.location.href;
        }
    
        var ref = p.hostname.replace("www.", "");
    
        var loc = window.location.hostname.replace("www.", "");
        if (loc === ref) {
            return window.location.href;
        }
        if (disable_utm === 1) {
            return window.location.href;
        }
        if (window.location.href.indexOf("utm_") !== -1 || window.location.href.indexOf("gclid=") !== -1 || window.location.href.indexOf("yclid=") !== -1) {
            return window.location.href;
        }
        var uri = window.location.href;
        if (uri.indexOf("?") !== -1) {
            uri += "&";
        } else {
            uri += "?";
        }
        var medium = get_utm_medium();
        var hostname = mini_hostname(p.hostname, medium);
        var args = setup_utm();
        if (args != null) {
            uri += args;
        } else {
            uri += "utm_source=" + hostname + "&utm_medium=" + medium + "&utm_campaign=" + hostname + "&utm_referrer=" + hostname;
        }
        return uri;
    }
    
    setTimeout(function() {
        var code = get_param("__js_p_", "int", 0);
        var age = get_param("__js_p_", "int", 1);
        var sec = get_param("__js_p_", "int", 2);
        var disable_utm = get_param("__js_p_", "int", 4);
        var jhash = get_jhash(code);
        document.cookie = "__jhash_=" + jhash + ";max-age=" + age + "; " + (sec ? "SameSite=None;Secure;" : "") + " Path=/";
        document.cookie = "__jua_=" + fixedEncodeURIComponent(navigator.userAgent) + ";max-age=" + age + "; " + (sec ? "SameSite=None;Secure;" : "") + " Path=/";
        window.location.href = construct_utm_uri(disable_utm);
        if (window.location.hash) {
            window.location.reload();
        }
    }, 1000);



    Коротко и с некоторыми неточностями:
    1. Браузер делает запрос, получает куку и тот самый html c js кодом внутри
    2. Код производит некоторые вычисления, ставит еще некоторые куки, после этого происходит повторный запрос к серверу
    3. На сервере куки валидируются и отдается либо нормальное содержимое либо тот самый html файл снова


    Скрины со вкладки Cookies консоли разработчика
    636b53c330230551365215.png
    636b53e570e62600722645.png



    Тут несколько вариантов решения:
    1. Сходить на сайт через браузер, скопировать куки, подставить их в запрос requests (естественно куки протухнут и надо будет повторять операцию)
    2. Разобрать как работает скрипт и эмулировать его работу на Python
    3. Взять что-то наподобие Selenium webdriver и решить задачу с помощью него
    Ответ написан
    2 комментария
  • Сколько ядер процессора хватит для программирования?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Имеет смысл взять слабую конфигурацию. На ней автор быстро почувствует узкие места кода и займется
    оптимизацией. И потом в продуктиве этот код станет быстро работать.

    Хороший мотиватор.
    Ответ написан
    5 комментариев
  • Приделывать Git на сайт это хорошо?

    git - это система контроля версий.
    Это не "локальное хранилище" и не нечто, что можно "приделать" сбоку.

    Предположу, что под словом "приделать" вы имеете в виду использование git для доставки обновлений на продуктивный сервер.
    Моё мнение - так делать не стоит.
    Серверу совершенно не нужно хранить у себя всю историю версий.

    А вот локально да - лучше вести разработку в git.
    Ещё по хорошему следует хранить копию репозитория на каком-нибудь ещё сервере, например в собственном экземпляре gitlab и синхронизировать её с локальной при помощи git pull/push.

    Ну и помни, что не надо все файлы в git запихивать. В git должны храниться только исходные файлы. Всякие картинки - в git-lfs.
    Пароли - в каком-то другом хранилище.
    Артефакты, которые создаёт компилятор или препроцессор - в .gitignore
    Ответ написан
    1 комментарий
  • Как запустить python и php скрипт через .exe?

    AlexNest
    @AlexNest Куратор тега Python
    Работаю с Python/Django
    Код переделывать не нужно.
    Ровно как и "запихивать" все в exe.
    Как минимум потому-что:
    • Большинство доступных хостингов работают на линуксе.
    • Цены на windows-хостинги на порядок выше. Да и случае с хостингами в РФ/РБ вообще непонятно что будет.
    • Сомнительная работоспособность - ни один из указанных языков не подразумевает работу в виде exe-файла и использование сборщиков вполне может привести к разного рода ошибкам.
    Ответ написан
    3 комментария
  • Возможно ли полностью покрыть поле паркетом без пересечений?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Не указаны ограничения, поэтому нельзя точно сказать, что это решение будет самым быстрым, но скорее всего задача решается через паросочетание на двудольном графе.

    Покрасьте поле как шахматную доску. Черные и белые клетки. Каждая доминошка будет лежать на двух соседних белой и черной клетках. Постройте граф. Назначьте каждой клетке вершину, а ребра проведите между соседними клетками, если там нет перегородки. Граф - двудольный, ведь черные клетки окружены белыми, а белые - черными. Любое заполнение поля доминошками будет идентично паросочетанию в этом графе и наоборт. Найдите максимальное паросочетание: если оно не полное, то поле покрыть нельзя. Иначе ребра в паросочетании будут местами, куда надо класть доминошки.

    Вот статья с описанием алгоритма и реализацией.

    Это будет решение за O(n^2m^2).

    Другое решение, которое будет быстрее, если одно из измерений очень маленькое, а второе очень большое - динамическое программирование по профилю. Гуглите эти слова. Это сложнее реализовать, но зато будет работать за O(4^n m)

    Edit:
    Alexandroppolus в коментариях предложил использовать Алгоритм Хопкрофта — Карпа для поиска паросочетания, что для данного графа будет быстрее предложенного мной алгоритма Куна и будет работать за O(nm sqrt(nm)) вместо O(n^2 m^2)
    Ответ написан
    7 комментариев
  • Как правильно выделить память для двумерного массива большого размера?

    Правильно будет использовать std::vector, например так
    std::vector<int> v(N*M);
    Но стоит учитывать, что для большого числа данных памяти может не хватить.
    Ответ написан
    5 комментариев
  • Требования к самописной CRM?

    Jeer
    @Jeer
    уверенный пользователь
    Аж жуть берет от таких заданий ) Покупка готового инструмента обычно дешевле, чем разработка с нуля. Особенно если разработка осуществляется одним человеком. Особенно если опыта мало. Особенно, если на поддержке будет тот же человек, что и на разработке ) безумие :) проект полетит в помойку, но у вас будет строчка в резюме по созданию проекта, можете обкатывать любые технологии за счет глупого работодателя.

    По делу без брюзжания:
    Писать под винду моветон - лицензии дорогие
    Вин формс зачем? - делайте веб апи с фронтом на вью/реакте/ангуляре. Нужна кроссплатформенность, чтобы хоть с телефона можно было зайти и нажать нужную кнопку в системе.
    Апи нужно, потому что будет много интеграций с другими системами, загрузка/выгрузка в 1с, не дай бог будете телефонию подключать
    Внутренняя сеть решается с помощью впн сервера.
    Помимо функциональных требований существуют еще технические, должен быть мониторинг, вы должны всегда знать сколько ресурсов потребляет ваш сервер, сколько данных занимает на дисках, логи и трейсы - гуглится по слову Observability, обычно не закладывается в смету, но к этим вопросам приходят рано или поздно
    Что еще, ну, по функционалу тут проще, открываете презентации в популярных CRMках, смотрите, что они могут, выписываете списком и идете к заказчику, чтобы он указал галочками, что будете делать, что не будете
    потом прикидываете по трудозатратам и озвучиваете сроки из которых можно понять примерную стоимость проекта. Часто одно маленькое предложение, типа того же "выгрузить данные в 1с" грозит несколькими десяткми часов работы, потому что другой отдел, с ними нужно договориться и сделать интеграцию. Или "должен быть отчет такой-то", а там как начнешь разбираться, еще 5 раз посовещаться сначала надо ))
    Ответ написан
    Комментировать
  • Как разграничить хранение данных пользователей?

    ThunderCat
    @ThunderCat
    {PHP, MySql, HTML, JS, CSS} developer
    Каждый имеет свой набор полей. Клиника, например, имеет адрес и дату основания.
    Мне кажется вы как-то не так пользователей определяете, клиника как пользователь не кажется логичным утверждением. Пользователь - сущность имеющая общие атрибуты - логин, пароль, опционально дату регистрации и еще несколько признаков присущим людям/иным разумным. В частности, логинится не здание фирмы и не юридичкское лицо в виде учредительных документов, а конкретный Федор Пупкин из клиники "Веселая челюсть". И связь Федора с клиникой через один ко многим (либо многие ко многим, в зависимости от сложности возможных пересечений) видится более адекватной структурой, как минимум по тому что не только Федор может управлять действиями от лица клиники, а еще например бухгалтер Василиса Андреевна. Проблема в том что у вас юзерами стали объекты, по дефолту к ним не относящиеся. Как только вы отделите мух от котлет, все встанет на свои места, в том числе через роли, так как к клиникам будут иметь доступ только роли работников клиники.
    Ответ написан
    1 комментарий
  • Как открыть сайт находящийся в ВМ из хостовой машины?

    LikeMySoul
    @LikeMySoul
    Сис. Админ
    Ок, исходя из того что это виртуалбокс и ip он получает видимо из своей отдельной NAT подсетки. Варианта реализации 2:
    Первый пробросить еще один интерфейс как бридж и разрешить ему форвардить пакеты из сети 10.0.2.0 в вашу подсеть, после чего прописать маршруты на обеих(двоих?) сторонах и пробовать снова.
    Второй просто удалить стандартный NAT интерфейс в virtualbox и добавить вместо него bridge чтоб ловил адрес в вашей сети. После чего перенастроить nginx и апач на новый ip полученый из вашей сети.
    Есть третий, но это еще больший костыль чем первый вариант: поднять впн и пушить вашу машину по нему.
    Ответ написан
    1 комментарий
  • Как понять что делает данный код php?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Гадость.
    Тут даже смотреть не надо чтобы понять, что код делает гадость

    код ниже после __halt_compiler(); никак не интерпретируется языком PHP, что явно следует из названия этой функции.
    Ответ написан
    1 комментарий