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

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    #include <stdio.h>
    
    class A
    {
    public:
            virtual ~A()
            {
            }
    };
    
    class B
    {
    public:
            virtual ~B()
            {
            }
    };
    
    class C
    {
    public:
            virtual void dump() = 0;
            virtual ~C()
            {
            }
    };
    
    class D: public A, public C
    {
    public:
            virtual void dump()
            {
                    printf("D: %p\n", this);
            }
    };
    
    class E: public B, public C
    {
    public:
            virtual void dump()
            {
                    printf("E: %p\n", this);
            }
    };
    
    void f(void *p)
    {
            C *pc1 = dynamic_cast<C*>((A*)p);
            C *pc2 = dynamic_cast<C*>((B*)p);
            C *pc3 = dynamic_cast<C*>((C*)p);
    
            if (pc1)
                    pc1->dump();
            else if (pc2)
                    pc2->dump();
            else if (pc3)
                    pc3->dump();
    }
    
    int main()
    {       
            D d;
            E e;
    
            printf("d: %p, e: %p\n", &d, &e);
    
            A *pa = &d;
            f(pa);
    
            B *pb = &e;
            f(pb);
    
            C *pc1 = &d;
            f(pc1);
    
            C *pc2 = &e;
            f(pc2);
    
            D *pd = &d;
            f(pd);
    
            E *pe = &e;
            f(pe);
    
            return 0;
    }
    Ответ написан
    Комментировать
  • Как работать с websocket в php без библиотек?

    @xfg
    Прочитать соответствующий RFC https://tools.ietf.org/html/rfc6455 чтобы понять, как происходит рукопожатие и какие байты в переданном сообщении за что отвечают. После этого будет понятно как написать реализацию. Я досконально уже не помню, но фактически от клиента приходит обычный http запрос с определенными заголовками, сервер разбирает этот запрос и если всё ок, то сохраняет открытое соединение в массив, если нет, то отправляет соответствующий ответ и закрывает соединение. Дальше по открытому соединению начинает сыпаться поток байтов от клиента их нужно разбирать, чтобы понять длину сообщения, сами данные переданные в фрейме, закончился фрейм или еще нет и тому подобное. Обратно также кодировать данные в поток байтов и отправлять по открытому соединению. Каждый байт в переданном фрейме несет определенный смысл. Обо всем этом подробно написано в RFC, но на английском. Вообще это хорошо примерно понимать как работает, но глупо писать такую низкоуровневую реализацию, когда есть готовые. Такие вещи развивают и поддерживают годами. Вы же не пишите HTTP серверы, а берете готовые вроде nginx и тому подобное.

    В каком месте можно полученные данные подготовить к записи в бд.

    Как сделать, что бы на стороне клиента, один websocket отвечал за сообщения, другой за статьи. (Или за эти два действия отвечает один websocket, тогда как мне на сервере это различать).

    Вебсокет это низкоуровневая штука, для передачи потока байтов от клиента на сервер, в отличии например от HTTP, где есть заголовки и тело сообщения. Поверх вебсокета нужно делать еще один протокол или самописный или выбрать один из готовых. Это проще говоря, то как выглядят ваши фреймы (сообщения), которые вы отправляете с клиента на сервер и назад. Например клиент может отправлять такой фрейм:
    ["id", "controller/action", {param1: value1, param2: value2}]

    в ответ получать
    ["id", "OK"]
    если запрос был обработан успешно или
    ["id", "ERR", {error: "action not found"}]
    если произошла ошибка. По переданному id в массиве, можно понимать, к какому запросу относится ответ.
    Для уведомлений (событий) сервер может отправлять клиентам что-то такое
    ["user_added", {user: {...}}]
    и т.д. Этот протокол необходимо придумать самому или выбрать из готовых (популярных пока нет) и написать его реализацию (клиентскую и серверную часть) или опять же взять уже готовую.

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

    Но это уже всё должно быть, просто возьми real-time фреймворк. Там за тебя написали и websocket сервер и протокол поверх него и экшены уже есть. Всё низкоуровневое уже готово. Бери и пиши приложение. В nodejs самый популярный это например https://github.com/socketio/socket.io, а в php я не знаю, но уверен, что тоже есть что-то популярное.

    Своё написать не получится, без опыта и без попыток сделать приложение на чем-то готовом. Нужно как минимум прочитать RFC и посмотреть реализации других разработчиков. Для этого нужно быть кем-то больше, чем "программистом сайтов".
    Ответ написан
    1 комментарий
  • В чем ошибка (работа с памятью, деструкторы)?

    vt4a2h
    @vt4a2h Куратор тега C++
    Senior software engineer (C++/Qt/boost)
    У вас же C++, т.е. можете использовать вектор для хранения элементов без необходимости явного выделения памяти:
    #include <vector>
    
    // double* _coords;
    std::vector<double> _coords;
    
    // _coords = new double[N];
    _coords.resize(N);

    Ну и деструктор можете не писать.
    Ответ написан
    Комментировать
  • Почему иногда делают так?

    Sanasol
    @Sanasol Куратор тега PHP
    нельзя просто так взять и загуглить ошибку
    1 комментарий
  • Что изменить в коде, чтобы перестали спамить боты через форму обратной связи?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Поставить каптчу.

    Это единственный вариант который будет работать по принципу "я тут что-то нашел, и воткнул себе на сайт но понятия не имею что это такое и как работает".
    Ответ написан
    1 комментарий
  • На ноутбуке не печатаются английские буквы, это конец?

    @lega
    у клавиатуры нет раскладки - это фича ОС, а в биос не можете войти потому что не правильно вводите пароль (либо некоторые кнопки перестали работать)

    на крайний случай можете переустановить линух с англ. язвком, а русскую раскладку уже доустановить
    Ответ написан
    Комментировать
  • Обращение к обьекту через указатель?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    objaddr = objects + (sizeof(Object)*n);

    sizeof(Object) * не нужен, это не ассемблер.
    Ответ написан
    Комментировать
  • Имеет ли postgresql свои средства для сжатия, шифрования, архивирования БД, отправки mail, отправку копий на ftp?

    CityCat4
    @CityCat4
    Жил да был черный кот за углом...
    Постгрес этого не умеет.
    Постгрес этого не будет уметь.
    Постгрес этого не должен уметь.

    Он умеет быть БД. Он умеет создать дамп БД, годный для загрузки его в другую инсталляцию. Все остальное прекрасно умеет другой софт - написанный для этого. Это в винде каждый суслик в поле агроном. В линухе БД занимается обработкой данных, а шифрованием, архивированием, передачей по FTP занимаются программы, для этого написанные...
    Ответ написан
    Комментировать
  • Как эффективней отрисовывать много SVG графики?

    Vlad_IT
    @Vlad_IT Куратор тега JavaScript
    Front-end разработчик
    По скорости работы, быстрее будет canvas, но он по скорости разработки будет хуже. У меня никаких тормозов на vue+svg нет, по крайней мере, до 500 объектов на холсте. Для оптимизации могу посоветовать некоторые вещи:
    1) Используйте path вместо нескольких разных других фигур.
    2) Для сетки не создавайте кучу линий или фигур, просто используйте pattern. Вот пример из моего проекта (он на React JSX, но не суть)
    <pattern id={"bg-" + this.props.id} patternUnits="userSpaceOnUse" width="100" height="100">
        <rect width="100" height="100" fill={this.props.canvasColor}></rect>
        <g fill={this.props.canvasGridColor} style={{ fillOpacity: 0.34 }}>
            <rect width="100" height="1" y="20"></rect>
            <rect width="100" height="1" y="40"></rect>
            <rect width="100" height="1" y="60"></rect>
            <rect width="100" height="1" y="80"></rect>
            <rect width="1" height="100" x="20"></rect>
            <rect width="1" height="100" x="40"></rect>
            <rect width="1" height="100" x="60"></rect>
            <rect width="1" height="100" x="80"></rect>
        </g>
        <rect width="100" height="100" fill="none" strokeWidth="2" stroke={this.props.canvasGridColor}></rect>
    </pattern>

    вот так заливаю на холст
    <rect style={{ 'fill': `url(#bg-${this.props.id}) #fff` }} ... />

    3) Задавайте для изменяемых объектов атрибут уникальный атрибут key
    4) Цельные объекты кидайте в группу, и на нее назначайте общие стили и позицию.
    UPD: простой пример на 1000 объектов (можно добавить, поменяв константу COUNT_OBJECTS) с drag&drop
    jsfiddle.net/Vlad_IT/81kegmxf
    UPD2: вот тот же пример, только с сеткой jsfiddle.net/Vlad_IT/qt64rouL/1 если делать сетку не заливкой, а элементами, будут ощутимые тормоза.
    Ответ написан
    1 комментарий
  • Радость дизайнера - боль верстальщика. Межбуквенные отступы - кернинг и трекинг. Как рассчитать их значения для css?

    HamSter007
    @HamSter007
    HTML/CSS верстальщик
    body {
    font-family: 'PT Sans Caption', sans-serif;
    font-size: 11px;
    line-height: 120%;
    font-weight: normal;
    text-decoration: underline;
    letter-spacing: 0px;
    font-style:normal;
    }


    Все остальное дизайнер пусть оставит себе.

    Если же это какая-то единичная каллиграфия (1-2 слова), то возможен вариант вставки картинкой (пожалуй отдельная история).
    Ответ написан
  • Почему в php 7.0 работают модификаторы классов?

    DevMan
    @DevMan
    тащемта их завезли ещё в пхп5.
    в 7.1 прост расширили их действие на константы.
    Ответ написан
    Комментировать
  • Как синхронизировать с 1С самописную CMS?

    Kenigan
    @Kenigan
    Веб-программист
    Да, 1С является инициатором синхронизации. Она в заданные промежутки времени (можно раз в день, раз в минуту) посылает запрос на сайт для авторизации и начинает ему передавать данные и запрашивать заказы с сайта, если это необходимо. Можно еще делать единичную синхронизацию и потом вручную, когда необходимо, выполнять синхронизацию с сайтом. В любом из этих случаев порядок действий примерно такой должен быть:

    1. Создавайте папку в корне сайта, например, 1c, в ней должен лежать файл 1c_exchange.php (будет обрабатывать все запросы от 1С) и папка files (сюда будут приходить xml товаров из 1С)
    2. В 1С создать обмен с сайтом и указать путь к файлу, который будет обрабатывать все запросы с 1С. Например, mysite.ru/1c/1c_exchange.php.
    3. Там же вписать пользователя и пароля, который будет проверяться в файле 1c_exchange.php.

    В файле 1c_exchange.php будут выполняться примерно такие шаги:
    // Тут 1C передает всю информацию о товарах на сайт
    if($_GET["mode"] == "checkauth" && $_GET["type"] == "catalog") {
    	// Тут проверить, верный ли логин и пароль заполнен в настройках 1С обмена
    } elseif ($_GET["mode"]=="init" && $_GET["type"] == "catalog") {
    	// Тут передать информацию о сервере (используется ли архивация и какой максимальный размер файла)
    } elseif ($_GET["mode"] == "file" && $_GET["type"] == "catalog") {
    	// Тут принимаем файлы, приходящие из 1С, сохраняем у себя в папке files. 
    	// Файлы могут быть 5-ти типов (может и больше)
    	// информация о разделах каталога (catalog.xml),
    	// информация о товарах (goods.xml),
    	// информация о характеристиках (торговых предложениях) (offers.xml),
    	// информация о ценах (price.xml),
    	// информация об остатках (rests.xml).
    } elseif ($_GET["mode"] == "import" && $_GET["type"] == "catalog") {
    	// Тут отдать успех или неудачу передачи файлов
    } elseif ($_GET["mode"]=="complete" && $_GET["type"] == "catalog") {
    	// При завершении операции импорта парсим все данные и заносим информацию на сайт
    }
    	
    // Тут 1C запрпшивает заказы с сайта
    if($_GET["mode"] == "checkauth" && $_GET["type"] == "sale") {
    	// Тут проверить, верный ли логин и пароль заполнен в настройках 1С обмена
    } elseif ($_GET["mode"]=="init" && $_GET["type"] == "sale") {
    	// Тут передать информацию о сервере (используется ли архивация и какой максимальный размер файла)
    } elseif ($_GET["mode"]=="query" && $_GET["type"] == "sale") {
    	// Если имеются заказы на сайте, которые еще не отправлялись в 1С, отправляем их тут. Формат такой http://v8.1c.ru/edi/edi_stnd/131/from.xml
    } elseif ($_GET["mode"]=="success" && $_GET["type"] == "sale") {
    	// Сообщаем о результате выполнения операции отправки заказов с сайта
    }


    Мне в своё время очень помогла эта ссылка
    Ответ написан
    1 комментарий
  • Как получить муниципальные деления из ФИАС?

    NeiroNx
    @NeiroNx
    Программист
    Это значит что в новой версии адреса связанны по GUID - берем какойнибудь обьект с AOLEVEL=1 (Республики), берем его myid=AOGUID, находим его дочерние объекты PARENTGUID=myid - получим города(AOLEVEL=4) и районы (AOLEVEL=3), потом так же для районов можно получить населенные пункты в них.
    Смысл в том что кладр база не хранит историю адресов а в новой базе можно построить адрес который был в конкретную дату - до переименования. (поля STARTDATE и ENDDATE)
    В большинстве случаев нужен лишь актуальный адрес - поэтому пришлось писать конвертер(который берет лишь актуальные адреса) - иначе база слишком жирная, а если брать для всей страны то вообще жесть. А потом уже обновлять если есть изменения.

    Вообще в документации вроде все понятно расписано...

    P.S. Пишу синхронизацию с ФИАС в корпоративную базу(Электроэнергетика) - пришлось изучить всю стркутуру.
    Ответ написан
  • Есть ли смысл ставить Linux, если локального админа на Винде легко взломать?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    можно через LiveCD

    Если есть физический доступ - элементарно взламывается всё.
    Например, зачем взламывать вообще, если можно поставить свою систему и скопировать нужные данные. Диск зашифрован? Так если у вас нет пароля - то как вы с системой работали ранее?
    Ответ написан
    Комментировать
  • Как правильно настроить конфиг Nginx?

    @dodo512
    server {
        server_name          www.example.com;
        listen               *:80;
        listen               [::]:80 ipv6only=on;
    
        if ($uri !~* ^/downloads/(.+)$) {
            return 301 https://example.com/downloads/$1;
        }
    
    }

    Тут вместо if лучше использовать location.
    server {
        server_name  example.com  www.example.com;
        listen               *:80;
        listen               [::]:80 ipv6only=on;
    
        location / {
             return 301 https://example.com$request_uri;
        }
        
        location /downloads/ {
            root /var/www/html;
        }
    }
    Ответ написан
    3 комментария
  • Где размещать вспомогательные классы в mvc архитектуре?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    Есть несколько вариантов решения это проблемы.

    1) Некоторые могут пропагандировать сервисный слой (design-pattern.ru/patterns/service-layer.html), как следствие: "App/Services/ServiceName" - набор классов, отвечающих за какое-то абстрактное действие. Например: "UserAvatarUploaderService", который отвечает за загрузку аватарки пользователя.

    2) В качестве альтернативы и способ, который предпочитаю я - это создание директории "src" с набором независимых компонентов, включая собственный composer.json. Тот же сервис загрузки аватарки будет выглядеть следующим образом:
    - src/
        - AvatarUploader/
            - README.md
            - composer.json
            - tests/ ...
            - src/
                - AvatarInterface.php
                - FileSystemInterface.php
                - FileSystemUploader.php
                - UploaderInterface.php


    Для подключения этой библиотеки достаточно будет прописать в корневом:
    {
        "repositories": [
            {
                "type": "path",
                "url": "./src/AvatarUploader"
            }
        ],
        "require": {
            "app/avatar-uploader": "*"
        }
    }


    А выглядеть внутренний (т.е. внутри "src/AvatarUploader") composer будет так:
    {
        "name": "app/avatar-uploader",
        "autoload": {
            "psr-4": {
                "AvatarUploader\\": "src/"
            }
        }
    }


    Таким образом мы запилим совершенно независимый компонент со своими тестами и зависимостями, а внутри основного приложения будем лишь к нему обращаться.
    Ответ написан
    1 комментарий
  • Как автоматизировать обновление данных?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    IMHO, правильный вариант - менеждер вносит запись на сайт, с сайта периодически выгружается xls, если он ещё нужен.
    Ответ написан
    4 комментария