Задать вопрос
  • Ошибка с перенаправлением: как скачать файл с веб.страницы в формате 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 комментарий
  • Какие видеоуроки/книги/советы посоветуете начинающему программисту?

    hint000
    @hint000
    у админа три руки
    какие-нибудь своеобразные, но полезные советы

    1. Любой конкретный язык программирования - фигня (хотя без него никак), а важнее алгоритмы и структуры данных.
    2. Когда размер ваших програм перевалил за десяток строк, пора осваивать методы отладки (debug). Это 99% практики и 1% теории. Практически невозможно (даже для гения) сразу без ошибок написать программу на тысячу строк. И будут моменты, когда вы готовы биться головой о стену, потому что уже десять раз всё проверили, и весь код правильный, но всё равно выдаёт неправильный результат; и приходят мысли, что это какой-то неизвестный глюк в операционной системе и т.п. Вот это будет ваш личный момент истины. Это будет означать, что нехватает опыта в отладке. Выловить ошибки в программе на тысячу строк (в своей) не слишком просто, но вполне по силам студенту.
    Ответ написан
  • Какие видеоуроки/книги/советы посоветуете начинающему программисту?

    saboteur_kiev
    @saboteur_kiev Куратор тега Книги
    software engineer
    допустим человек, который впервые решил заняться боевыми искусствами пишет вопрос

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

    Просто изучай базу
    Делай простые приложения.
    До того, как писать код на 1000 строк, пиши на 100.
    Разберись с тем, как происходит компиляция.
    Почитай про name convention
    почитай про git
    задавай конкретные вопросы, приводя кусок кода, в котором у тебя что-то не выходит.
    Общих вопросов в интернете полным полно и пользы они никому особой не приносят
    Ответ написан
  • Визуализация ЭЦП в PDF и документах Word?

    hint000
    @hint000
    у админа три руки
    Таким образом вы убиваете смысл ЭЦП.
    Идея ЭЦП в том, что ЭЦП позволяет убедиться (в частности), что документ не был изменён после подписания. Если в документе изменить хоть один байт, то проверка подписи покажет, что подпись недействительна.
    Теперь посмотрим, как вы хотите сделать.
    У вас есть документ. Вы его подписываете. Потом вы добавляете в документ "визуализацию ЭЦП", тем самым изменяя документ и делая подпись недействительной.
    Ответ написан
  • Как можно создать дистрибутив Linux на основе Debian?

    @rPman
    полагаю ты не понимаешь что такое создать дистрибутив linux.

    Дистрибутив это не только набор пакетов но и инфраструктура, обслуживание репозитариев, интегрирование обновлений и т.п. Еще есть юридические моменты, так как в мире linux 'благодаря' производителям железа все полностью открытым быть не может (но да debian старается) то нужно еще следить, чтобы ни чьи интересы не задел, добавляя какой то пакет у себя (например были споры по названию браузера firefox, так как пакетом хотел рулить debian, называть его таковым он не имел права, пришлось переименовать в iceweasel)
    Ответ написан
    Комментировать
  • На какой cms начать верстать магазин лучше всего?

    pLavrenov
    @pLavrenov
    Разработка сайтов
    Можно разобрать на цитаты из интернетов.... Да и опыта у тебя нет - признавайся, в лучшем случае правки делал какие исходя из текста.

    Joomla мертва и никому не нужна.

    Wordpress это более 60% рынка CMS и 30% от всех сайтов на планете. Выбор очевиден. Про костыли выброси эти фразы в мусорку и никому не говори. У него есть свои минусы но к тому времени когда ты их осознаешь уже будет понимание что с этим делать. И если будешь отталкивать от того как малыми силами сделать сайт на плагинах останешься без работы и без денег. Вордпрес это максимальный профит за короткий срок а если не умеешь готовить то это уже другой вопрос.

    Для начала разберись с пониманием что такое "верстать" и что это не связано с CMS. Разделяй процессы. Сначала верстать потом натягивать.
    Ответ написан
    4 комментария
  • Самопроизвольное объявление define'ов в проекта?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Получается, магическим образом, самопроизвольно, между включениями VulkanTexture.h и VulkanglTFModel.h был объявлен define.

    А на самом деле где этот define определяется и как это место относится ко всем этим заголовочным файлам?

    Разве препроцессор не последователен и может включать файлы в том порядке, в каком ему заблагорассудится, а не как я написал?

    Нет, не может, но возможно ты не вполне понимаешь сам, в каком порядке ты написал их подключение. Так, например, Helpers/VulkanTexture.h и VulkanTexture.h -- это один и тот же файл, или разные? Если один и тот же, то из-за #pragma once в нём он не подключается в VulkanglTFModel.h, а если разные -- то подключается.

    Понять, что фактичиски куда подключается можно выполнив вместо шага компиляции только препроцессирование (например, для gcc заменив в команде компиляции ключ -c на -E). В выводе препроцессора не видно дефайнов, но видно когда подключается тот или иной файл и видно весь исходный код не относящийся к препроцессору.
    Ответ написан
    Комментировать
  • Имею базу в формате txt размером 2gb, как отсортировать по количеству символов на строку?

    @rPman
    Для таких операций уже несколько десятилетий в linux существует утилита awk со своим языком программирования (он достаточно простой хоть и странный), так же можно соорудить регулярное выражение и с помощью утилиты sed или grep, несколькими проходами пройти по файлу, и сначала вывести все короткие строки, вторым проходом все длинные.

    так же можно написать приложение на любом языке программирования, построчно читать файл, измерять длину строки или какое тебе нужно условие и записывать в нужный файл, кода строк на 5-6
    Ответ написан
    Комментировать
  • Как реализовать рекурсию в UML (диаграммы классов)?

    Vindicar
    @Vindicar
    RTFM!
    Особенно никак? Диаграмма классов не описывает содержимое методов, а приведённый код бессмысленен даже как пример.
    Можно, конечно, сделать отношение зависимости от Foo к нему же, но будет затруднительно пояснить его природу.
    Ответ написан
    Комментировать
  • Правильно ли написано уравнение на c++?

    Разделителем целой и дробной части должен быть символ "точка" (.)
    Ответ написан
    7 комментариев