• Как можно создавать таблицу на инициализации Docker Postgres Image?

    @q2digger
    никого не трогаю, починяю примус
    Все очень просто. Идете в документацию контейнера, вот адрес https://hub.docker.com/_/postgres
    там ищите пункт Initialization scripts , там все расписано
    Вкратце (без деталей, прримеры в доке посмотрите), вы пишите скрипт, например на bash, описываете в скрипте что надо сделать при первом запуске контейнера и помещаете его в определенное место контейнера (монтируете как volume), стартуете контейнера, там создается база, после контейнер запускает ваш скрипт - создает пользователей, таблицы, права, заливает данные и т.п.
    Ответ написан
    Комментировать
  • Можно-ли улучшить этот код?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    1. выкинуть все локейшены с ошибками. это дикость, ни один нормальный сайт так не делает. ошибки надо показывать либо сразу, либо через сессию. локейшены с ошибками встречаются только у дебилов, которые делают видео на ютубе для других дебилов. не надо так палиться сразу.
    2. выкинуть домен из ссылок. ты серьёзно собираешься переписывать все ссылки, когда у тебя сайт с временного домена переедет на постоянный? а потом обратно - когда надо будет потестить локально? header('Location: /AUTH-2/Sign_In/'); достаточно для единственного локейшена, который нужен в этом коде
    3. убрать всю эту лестницу иф-ов, делать все проверки на одном уровне. ошибки собирать в массив. перед вставкой в БД проверить массив на пустоту.
    4. if ($row->Email != $email) - масло масляное. ты УЖЕ проверил емейл в базе, зачем еще раз проверять?
    5. else if($row->Email == $email) { - это уже какой-то совсем адок. Ты УЖЕ проверил, что емейл не совпадает. причем два раза. В else мы попадём, если емейлы совпдают. Ещё раз проверять не надо. Два алкоголика садятся на трамвай, один спрашивает водителя - я этом номере до вокзала доеду? Водитель - нет. Второй алкаш - а я?
    6. внизу у тебя ссылка на password_verify, но хэшируешь ты все равно кривым алгоритмом. Не осилил?
    7. все эти куличики в песочнице с $client_Code $server_Code - это какой-то адок с точки зрения безопасности. Любой школьник, который не тупее дауна, поломает все твои "сессии" за 5 минут.
    8. setcookie("PHPSESSID", $_COOKIE['PHPSESSID'], 0, '/', '.tsecret.net'); - опять совершенно бессмысленная строчка. К чему она? Зачем? Что ты хотел тут сказать? И кому?
    9. Разбей это простыню хотя бы на функции. Никакой солид у тебя конечно не получится, как и у Георгий Котов который сам не понимает что это значит. Но хотя бы разделить проверки, запись в бд, и отправку емейла можно.

    В целом - из плюсов только нормальная работа с БД, в остальном на троечку, и местами - кол (за дыры в безопасности и отсутствие логики)
    Ответ написан
    5 комментариев
  • Как сделать это при помощи grid?

    JamesHatfield
    @JamesHatfield
    Front-end developer
    Выровнял блоки как на примере, бэкграунды сами определите.
    <div class="main">
              <div class="main-gourmet"></div>
              <div class="main-carhartt"></div>
              <div class="main-adidas"></div>
              <div class="main-deep"></div>
              <div class="main-palace"></div>
              <div class="main-nike"></div>
          </div>


    .main {
    	height: 100vh;
      display: grid;
      grid-template-areas: 
          "gourmet gourmet carhartt" 
          "gourmet gourmet adidas"
          "deep palace nike";
      grid-template-columns: 3fr 3fr 3fr;
      grid-template-rows: 3fr 3fr 4fr;
      grid-gap: 15px;
      background-color: green;
    }
    .main-gourmet {
      grid-area: gourmet;
      opacity: 0.9;
      background-color: red;
    }
    .main-carhartt {
      grid-area: carhartt;
      opacity: 0.9;
        background-color: gray;
    }
    .main-adidas {
      grid-area: adidas;
      background-blend-mode: multiply, ;
      background-color: black;
    }
    .main-deep {
      grid-area: deep;
      opacity: 0.9;
        background-color: white;
    }
    .main-palace {
      grid-area: palace;
      opacity: 0.9;
        background-color: black;
    }
    .main-nike {
      grid-area: nike;
      opacity: 0.9;
      background-color: red;
    }
    Ответ написан
    1 комментарий
  • Как заставить MutationObserver адекватно срабатывать?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Именно из-за таких как ты отказались от удобного слушателя событий изменения элементов, и придумали наблюдатель.
    Разница? Наблюдатель наблюдает и изредка, когда это не повлияет на скорость работы страницы, сбрасывает весь список изменений. В отличии от слушателя, который слушает каждое событие изменения.

    Так делать нельзя, категорически. Это бессмысленная тяжёлая нагрузка. Ты вызываешь изменения стиля своей функцией, вот из этой функции и производи иные изменения. Тебе не нужны наблюдатели и события для этого.
    Ответ написан
    2 комментария
  • Как разбить массив на части PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    в цикле
    все операции над массивами производятся в цикле
    для перебора массивов в РНР используется оператор foreach
    Ответ написан
    Комментировать
  • Как выравнять img по вертикали в grid?

    Ankhena
    @Ankhena Куратор тега HTML
    Нежно люблю верстку
    Уберите у картинок display grid, у них нет содержимого, не из чего строить сетку.
    А родителю задайте display flex.

    p.s. id это идентификатор, его нельзя применять к разным элементам.
    id="border-grid" вы используете много раз, а можно только 1.
    Используйте для этого классы.
    id для стилизации лучше вообще не использовать.
    Ответ написан
    Комментировать
  • Почему во Vue.js не отображается разметка Schema.org?

    Kozack
    @Kozack Куратор тега Vue.js
    Thinking about a11y
    Потому, что сервер возвращает пустую страницу (то что видят боты) а интерфейс регенируется уже на клиенте средствами JavaScript. Чтобы боты видели интерфейс, его желательно сгенерировать на сервере и уже после отправлять в браузер.
    Читайте про Server Side Rendering Vue
    Ответ написан
    3 комментария
  • Зачем требуются различные СУБД, если можно использовать структуры данных языка, например словари и списки в питоне?

    @zexer
    1. Ядро СУБД работает с данными в иной структуре, нежели вы работаете со списками и всякими кортежами.
    СУБД может обрабатывать сильно больше данных и сильно быстрее, чем вы делаете это в питоне, как минимум благодаря индексам (почитайте про индексы).
    2. Кроме того, ваши множества и кортежи надо где-то хранить, где? В виде .txt или .json файлика на компе? Не кажется ли вам, что это немного не надежно?
    3. В БД можно выставить множество ограничений и проверок, например на уникальность данных (чтобы у каждого человека был свой id), на то, чтобы поступающие данные соответствовали нужным типам, проверки на NULL значения, как вы все это будете делать через файлики .txt?
    4. В БД есть понятие транзакции, чего ваши файлики вам разумеется тоже не дадут.
    5. Данные с помощью СУБД легко читать, так как они представлены в табличной форме, к ним удобно применять фильтрации, сортировки, различные соединения таблиц между собой.
    6. И еще десяток различных преимуществ, о которых даже нет смысла рассказывать.
    Ответ написан
    Комментировать
  • Как правильно подключить свой класс через конструкцию use?

    @PetrPo
    // здесь я думаю не правильно указано имя класса ORM с которым работает DayorderHelper в методе GetElement

    Правильно думаешь))
    5f6c89996a4d8519558914.jpeg
    Ответ написан
    Комментировать
  • Как защитить форму отправки писем от ботов и XSS?

    Не изобретайте велосипед , поставьте invisible recaptcha ...

    Если все таки аж распирает от велосипедостроения вшейте пиксель в css или js который будет являться тем кто запишет в сессию пользователя флаг бот это или нет

    Ваш js модуль песполезен, такие фильтрации надо делать на бекенде
    Ответ написан
    2 комментария
  • Почему не удаляется событие?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    проблем с удалением событий не было
    Разве?
    В обоих вариантах обработчики не будут удаляться.
    В removeEventListener нужно передавать тот же самый listener, что и был передан в addEventListener.
    Обратите внимание, что именно не такой же, а тот же самый.
    ТО есть вот так удалится:
    const listener = event => console.log(event);
    element.addEventListener('click', listener);
    element.removeEventListener('click', listener);

    А так уже нет:
    element.addEventListener('click', event => console.log(event));
    element.removeEventListener('click', event => console.log(event));
    ибо это 2 разные функции, не смотря на то, что делают одно и то же, и одинаковы до каждого символа.

    P.S.
    когда программировал в функциональном стиле
    то что в обоих Ваших примерах - это процедурный стиль. От того что Вы завернули код в класс - он не становится ООП, как и то что написали набор функции - не ФП.
    Ответ написан
    6 комментариев
  • Где найти дорожную карту по изучению Линукса?

    Zoominger
    @Zoominger Куратор тега Системное администрирование
    System Integrator
    Идёте в фирму, где используется Linux.
    Устраиваетесь админом.
    Решаете поставленные задачи.
    Всё. Никакие роадмапы не предусмотрят весь тот стек, с которым вы, возможно, будете работать.
    Ответ написан
    Комментировать
  • Как на javascript замерить время выполнения функции (в наносекундах)?

    Robur
    @Robur
    Знаю больше чем это необходимо
    точное время выполнения одного вызова функции получить довольно сложно.

    во первых - performance.now возвращает дробное число, поэтому там в принципе может быть наносекундная точность. однако стандарт определяет что точность должна быть 5 микросекунд. Плюс браузеры могут специально занижать точность чтобы бороться с некоторыми атаками.

    поэтому правильно вызывать функцию много раз и считать среднее.
    так же в ноде есть process.hrtime которая дает наносекунды.

    оба этих метода "в лоб" не дадут нормального результата. Почему? потому что в реальности происходит много всего интересного при выполнении кода.

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

    Переключение происходит на лету и в общем виде вы не знаете когда это происходит.

    поэтому само по себе замерение скорости "функции" имеет мало смысла, так как там их несколько внутри. Если интересны детали - погуглите JIT, AOT и v8 optimizations.
    Сейчас важно то что есть "холодные" функции которые работают медленее но надеждее и как правило используются сразу и есть "горячие" варианты, которые компилятор начинает использовать когда видит что код вызван много раз, и условия не меняются. "Горячие" работают быстрее.

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

    зная это, код можно сначала разогреть а потом померять скорость. скорее всего на разогретом коде будет работать один и тот же вариант.

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

    И тут самый главный момент - даже если вы замерите эту скорость, что вы будете делать с этим знанием? В реальной программе при выполнении этого кода скорость может быть совсем не такая как вы намеряли. Эти тесты годятся только для своего общего развития

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

    Для практических задач в браузере есть профайлер, если нужно выяснить что же тормозит в конкретном коде, правильнее всего начать с него.
    Ответ написан
    5 комментариев
  • Как установить kali linux второй системой на андроид телефон?

    CityCat4
    @CityCat4
    //COPY01 EXEC PGM=IEBGENER
    Никак. Если кто-то спрашивает "как поставить kali" - она ему не только не нужна, она ему категорически противопоказана.

    Доспехи не делают пейзанина рыцарем.
    Kali не делает нуба "хакиром"
    Ответ написан
    Комментировать
  • Данные списка показать снова в детальном виде?

    @VegasChickiChicki
    Использовать vuex или передавать на другую страницу через props.
    Ответ написан
    Комментировать
  • Кто на моём ПК сливает информацию о моём железе - БРАУЗЕРУ?

    DevMan
    @DevMan
    и где узрета инфа о железе?

    разрешение экрана, очевидно, вполне доступно браузеру, и, соответственно, жс. остальное железо/параметры никак не пострадало.
    Ответ написан
    9 комментариев
  • Почему при выполнении скрипта node.js увеличивается занятая RAM?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Давайте посмотрим, что Вы тут накодили... Я уберу Ваши комментарии из кода и добавлю свои:
    const setup = {port:8000}
    const express = require ('express');
    const puppeteer = require('puppeteer');
    
    const app = express ();
    
    app.get('/', (req, res) => {
        const url = req.query.url;
    
        // вот тут Вы на каждый запрос создаете весьма тяжелую функцию
        // в ней 203 AST ноды
        // и она жрет в среднем 220КБ оперативы
        // (node: 14.4.0; v8: 8.1.307.31-node.33, мерил через process.memoryUsage().heapUsed)
        let scrape = async () => {
    
            // а еще на каждый запрос запускам новый браузер
            // у ноды это особо памяти не отнимет, а вот у системы - прилично
            const browser = await puppeteer.launch({args: ['--no-sandbox']});
            const page = await browser.newPage();
    
            // еще и разрешаем запросу из браузера жить вечно
            // если конечно сервак не оборвет коннект
            await page.setDefaultNavigationTimeout(0);
    
            await page.setUserAgent('Mozilla/5.0 (Linux; Android 7.0; NEM-L51) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.81 Mobile Safari/537.36');
            await page.setViewport({width: 375, height: 812});
    
            // куда мы отправляем браузер?
            // переменная url у нас из req.query.url - а следовательно начинается с /
            // то есть без хоста и протокола...
            await page.goto(url);
    
            // что-то мне подсказывает, что это работает не совсем так
            // как Вы ожидаете
            // https://github.com/puppeteer/puppeteer/blob/main/docs/api.md#pageevaluatepagefunction-args
            // читаем: If the function passed to the page.evaluate returns a non-Serializable value, then page.evaluate resolves to undefined
            const bottomSheet = await page.evaluate(() => {
                return document.querySelector('div[data-marker="bottom-sheet"]');
            });
    
            // так как undefined !== null данное условие всегда истинно
            if (bottomSheet !== null) {
                // здесь по идее придет Promise.reject который мы не ловим (об этом ниже)
                await page.click('div[data-marker="bottom-sheet"] button');
            }
    
            // и еще раз... ловите доку на нужный метод:
            // https://github.com/puppeteer/puppeteer/blob/main/docs/api.md#pageselector
            const phoneButton = await page.evaluate(() => {
                return document.querySelector('a[data-marker="item-contact-bar/call"]');
            });
    
            // всегда ложное условие...
            if (phoneButton === null) {
                await browser.close();
                return false; // ...с return внутри...
            }
    
            // еще 1 способ зависнуть (дефолтный таймаут 30 сек)
            await page.waitForSelector('a[data-marker="item-contact-bar/call"]');
    
            await page.click('a[data-marker="item-contact-bar/call"]');
    
            try {
                await page.waitForSelector('span[data-marker="phone-popup/phone-number"]');
            } catch (e) {
                await browser.close();
                return false;
            }
    
    
            const result = await page.evaluate(() => {
                console.log('phone', document.querySelector('span[data-marker="phone-popup/phone-number"]'));
                return document.querySelector('span[data-marker="phone-popup/phone-number"]').innerHTML;
    
            });
    
            await browser.close();
            return result;
    
        };
    
        // не ловим reject промиса
        // и в случае reject не завершаем запрос
        // и он тоже висит в памяти
        scrape().then((value) => {
            console.log(value);
            if (value === false)
                res.send(500);
            // при value === false будет запись в закрытый поток... (или у express есть защита от дурака?)
            res.send(value);
            // абсолютно бесполезное действие...
            scrape = null;
        });
    });
    
    
    app.get('/test', (req, res) => {
        res.send('Тест');
    });
    
    app.listen(setup.port, () => {
        console.log('Сервер: порт %s - старт!', setup.port);
    });
    Ответ написан
    1 комментарий
  • Как запретить доступ для юзеров с VPN?

    ky0
    @ky0
    Миллиардер, филантроп, патологический лгун
    От накручивания не баны впнов помогают, а верификация. Например, по номеру телефона.
    Ответ написан
    2 комментария
  • Как сделать автоматический парсер?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    1. Как спарсить не последнюю новость, а любую (например, предпоследнюю)

    Логично, что нужно найти все новости, и выбрать предпоследнюю

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

    А как вы понимаете, что новость новая? Скорее всего вы помните название последней новости, и при обновлении страницы опять находите последнюю статью, и сравниваете название с тем, которое помните? Неожидано, но для бота все точно так же. Находите последнюю на текущий момент статью -> сохраняете ее название в переменной -> через Х времени заново находите последнюю новость, и сравниваете названия.

    Ещё я обнаружил, что при таймере парсится одна и та же новость. То есть программа запущена, новость спарсилась и через указанный интервал времени, даже если на сайте появились новые новости будет парсится эта же новость, пока не перезапущу программу.

    Все правильно, вы один раз получили код страницы, и больше его не обновляли
    html = requests.get("https://www.rbc.ru/short_news")
    Ответ написан
    Комментировать
  • Как передать значние input и изменить его в модальном окне?

    0xD34F
    @0xD34F Куратор тега Vue.js
    editTask (task, index) {

    v-model="editidTask.title"

    task.title = this.editTask.title

    Вижу, имена свойств/методов подобраны грамотно - перепутать невозможно.

    this.tasks.map((task, index) => {
      if (index === this.editidTask.id) {

    Во-первых - зачем перебирать массив, если вам известен индекс элемента? Кстати, очень умно - хранить индекс в свойстве с именем "id".

    Во-вторых - не боитесь обновить что-то не то? Работаете с массивом tasks, используя индекс, полученный при работе с tasksFiltered.
    Ответ написан