• Что значит поддержка проекта?

    opium
    @opium
    Просто люблю качественно работать
    Ну например есть клиент который платить мне 123 тысячи рублей в месяц, что я поддерживаю.
    Сервер и его аптайм
    Дев среду для разработчиков
    Бекапы
    Обновление по , секьюрити фиксы, всякие похапе мускул и прочее, минорные постоянно, мажорные раз в один два года
    Правки сайта если что то отвалилось само или при апдейте.
    Оптимизация кода и запросов в базу.
    Нагрузочное тестирование по расписанию и подготовка масштабирования к сезону.

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

    Другой пример клиент платит двести баксов в месяц за поддержку
    Бекап
    Правки если что то поломалось
    Автоапдейты софта.

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

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    PEP8
    Ответ написан
    Комментировать
  • Чем PHPMailer отличается от обычной mail() функций??

    TemaSM
    @TemaSM
    Fullstack, DevOps, InfSec
    Функция mail() в PHP по сути вызывает встроенную в систему почтовую программу - стандартно, это sendmail в linux (также, возможно использовать qmail, postfix, но для этого надо сначала сконфигурировать PHP через .ini файл).
    Подробнее про Mail в PHP: https://www.php.net/manual/ru/book.mail.php
    И про основную проблему кроссплатформенного использования: https://habr.com/ru/post/26518/

    PHPMailer - это мощная библиотека, реализующая почтовые транспорты, а не использующая sendmail как стандартная mail() функция. Имеет из коробки большое количество возможностей, таких как (в списке представлена лишь малая часть):
    • полная поддержка SMTP, Qmail, POP3, IDN, DKIM;
    • поддержка SSL и TLS;
    • работает на любой win32 и *nix платформе;
    • гибкость отладки;
    • определяемые вручную заголовки писем;
    • совмещение нескольких сообщений и вложений;
    • встроенная поддержка изображений;
    • умеет посылать письма с множественными: адресатами (TO), копиями (CC), BCC и REPLY-TO;
    • многослойные/альтернативные сообщения для клиентов, которые не могут читать HTML письма;
    • поддержка 8 бит, base64, бинарного режима, и пригодного для печати формата;
    • перенос слов (word wrap);
    • сообщения в виде HTML (шаблоны);
    • библиотека проверена на множестве SMTP серверах: Sendmail, qmail, Postfix, Imail, Exchange, Mercury, Courier;
    • библиотека используется под капотом таких гигантов: WordPress, Drupal, 1CRM, SugarCRM, Yii, Joomla;

    Подробнее можно прочитать тут:
    https://jino.ru/journal/articles/pochta-phpmailer/
    https://www.sesmikcms.ru/pages/read/ischerpyvajusc...

    Помимо PHPMailer существуют и другие крутые библиотеки, оставляю список для интересующихся:
    Swiftmailer
    (Symfony) Mailer

    Если вы активно пользуетесь функцией mail() при разработке на PHP и до сих пор ещё не сталкивались с проблемами при её использовании на хостингах или на своих собственных серверах без соответствующего правильно настроенного окружения, то mail() вам идеально подходит. А когда столкнётесь с проблемами или захотите иметь больше возможностей из коробки, станут очевидными плюсы PHPMailer и других специализированных библиотек.
    Ответ написан
    1 комментарий
  • Чем отличаются DOMNode и DOMElement?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Возьмём простейший HTML
    <body>
      <p>Привет!</p>
    </body>

    Теперь построим дерево узлов (node)
    BODY
      #text "\n  "
      P
        #text "Привет!"
      #text "\n"

    Получился узел BODY с тремя дочерними узлами, #text, P и снова #text. При этом, узлы BODY и P соответствуют тэгам HTML. Именно они и являются элементами. Узлы типа #text были добавлены браузером автоматически при построении дерева DOM и элементами не являются, так как не имеют соответствующих им тэгов в HTML-коде.
    Ответ написан
    1 комментарий
  • Как найти минимальную длину подмассива содержащего все уникальные элементы массива?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Оптимальнее не делать полный перебор, а работать с двумя указателями.
    Пусть в массиве N уникальных чисел.
    1. Ставим первый указатель на первый элемент массива, второй на N-й элемент.
    2. Проверяем подмассив от первого до второго указателя.
    3. Если он не содержит всех чисел, то передвигаем второй указатель на один элемент. Если вышли за пределы массива, то возвращаем найденный минимум, иначе переходим к 2.
    4. Обновляем минимум длины.
    5. Если минимум равен N, то завершаем работу функции.
    6. Передвигаем первый указатель на один элемент.
    7. Переходим к 2.

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

    Вариант на JS

    function minUniqueSubarrayLength(arr) {
      const N = arr.filter((v, i, a) => i === a.indexOf(v)).length;
      let begin = 0;
      let end = -1;
      let uniques = {};
      let uniqCount = 0;
      let subLength = arr.length;
      let len = 0;
      while (true) {
        if (uniqCount < N) {
          end += 1;
          len += 1;
          if (end === arr.length) {
            return subLength;
          }
          uniques[arr[end]] = (uniques[arr[end]] ?? 0) + 1;
          if (uniques[arr[end]] === 1) {
            uniqCount += 1;
          }
          continue;
        }
        if (subLength > len) {
          subLength = len;
          if (subLength === N) {
            return subLength;
          }
        }
        uniques[arr[begin]] -= 1;
        if (uniques[arr[begin]] === 0) {
          uniqCount -= 1;
        }
        begin += 1;
        len -= 1;
      }
    }
    
    console.log(minUniqueSubarrayLength([1,1,1,3,2,1,3,2,2,2,1])); // 3
    console.log(minUniqueSubarrayLength([1,2,2,2,3,4,2,2,2])); // 6
    console.log(minUniqueSubarrayLength([1,1,1,2,3,3,4,1,1,1,1,1,1,4,3,3,3,2,1,1,1,2])); // 5
    Ответ написан
    3 комментария
  • Регулярка php нужна помощь?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Тысяча и одна ошибка.
    Во-первых, посмотрите, что функция возвращает: https://www.php.net/manual/ru/function.preg-match.php
    Во-вторых, возвращает она у вас false, потому что регулярное выражение содержит ошибку - в нём нет ограничителей.
    В-третьих, у вас на конце лишний дефис.

    "~^(?:[A-Z]{4}-){3}[A-Z]{4}$~"
    https://regex101.com/r/nB2P5E/1
    Ответ написан
    2 комментария
  • Есть ли встроенные механизмы для развертывания массива?

    Fernus
    @Fernus
    Техник - Механик :)
    <?php
    
    $samples = [
        123,
        [1, 2, 3],
        321
    ];
    
    $samples_modified = [];
    array_walk_recursive($samples, function ($item, $key) use (&$samples_modified) {
        $samples_modified[] = $item;    
    });
    
    print_r($samples_modified);


    UPD:

    Вариант с foreach:
    <?php
    
    $samples = [
        123,
        [1, 2, 3],
        321
    ];
    
    $samples_modified = [];
    
    function recursive_func($array){
        
        global $samples_modified; 
        
        if(is_array($array)){
            foreach($array as $below){
                $res = recursive_func($below); 
    
            }
        }else{
            $samples_modified[] = $array; 
        }
        return $samples_modified; 
    }
    
    recursive_func($samples);
    
    print_r($samples_modified);


    P.S.: За global помидорами не кидайте...чисто для примера...
    Ответ написан
  • Как в масиве найти значение и изменить его?

    @ivashjke
    Vue JS, React, React Native
    const index = arr.findIndex((el) => el.name === name)
    if (-1 !== index) {
      arr[index].offset = value
    }
    Ответ написан
    7 комментариев
  • Есть ли расширения для сохранения отредактированного в Devtools кода?

    mukhindev
    @mukhindev
    Если код лежит локально, в Chrome можно зайти в Devtools/Sources, слева на вкладке Filesystem, нажать + (Add folder to workspace) и выбрать корневую папку.
    После этого манипуляции в Devtools будут вноситься в исходники.
    Ответ написан
    Комментировать
  • Двойной ip при определении ip пользователя?

    @stimu
    Настоящий IP находится только в REMOTE_ADDR, все остальное может содержать все что захотел написать отправляющий эти заголовки, хоть буквы.
    Ответ написан
    1 комментарий
  • Объединить 2 таблицы БД?

    rozhnev
    @rozhnev Куратор тега MySQL
    Fullstack programmer, DBA, медленно, дорого
    В принципе вы можете воспользоваться аггрегатными функциями базы данных.
    Например так:
    SELECT 
      JSON_ARRAYAGG(
        JSON_OBJECT(
          'image_src', images.image_src, 
          'image_alt', images.image_alt
        )
      ) image, 
      product.* 
    FROM product 
    LEFT JOIN images ON images.prod_id = product.id 
    GROUP BY 
      product.id, 
      product.name;


    Проверить SQL запрос
    Ответ написан
    1 комментарий
  • Есть и разница между разделителями | и +?

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

    Так что лучше используйте надежный |
    Ответ написан
    Комментировать
  • Есть и разница между разделителями | и +?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    1 + 2 == 3
    1 | 2 == 3

    но
    1 + 3 == 4
    1 | 3 == 3

    ибо 1 | 3 - это поразрядное ИЛИ, то есть берём в двоичной 01 и 11, и в результате ставим те разряды в 1, для которых у хотя бы одного аргумента на том же месте стоит 1, и получается снова 11 (т.е. 3 в десятичной).
    ваш пример
    Можете проверить значение константы как-то так: echo(XHPROF_FLAGS_CPU);
    Обычно флаги задаются степенями двойки: 1, 2, 4, 8, 16 и т.д., поэтому их можно складывать через + и обычно это не является ошибкой, но по-хорошему правильнее использовать | для флагов.
    Ответ написан
    2 комментария
  • Чем заменить ReadBeanPHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Надо понимать что полноценной замены не существует.
    Данная программа - это два тупые молодца, одинаковые с лица, из мультика про Вовку в тридевятом царстве.
    Которые честно пытаются делать то что хозяин им велит, но в силу врожденного слабоумия всё делают не так.
    А всё от того что она хочет быть нянькой для программиста.
    Но если программисту нужна нянька, то такого "специалиста" надо гнать из профессии поганой метлой.
    А если хочет остаться - то да, надо учиться что-то делать самому. руками.
    ЗАРАНЕЕ продумывать и создавать схему БД. И менять только в случае осознанной необходимости, а не потому что вдруг передал в БД не тот параметр, который хотел.
    ЗАРАНЕЕ продумывать и писать SQL запросы. А не ждать что все их за тебя напишет тупая нянька.
    Понимать то как работает пхп с базой данных.

    Поэтому в качестве прививки от говнокода я порекомендую сначала
    - учить устройство БД. Создавать все свои схемы руками
    - учить SQL. Писать все свои запросы руками
    - освоить работу с БД из РНР на базовом уровне, через нативный ПДО.

    После того как это все будет от зубов отскакивать, и после пары выполненных проектов будет очевидно видна некоторая избыточность и повторяемость кода - ничинать писать свой первый Table Gateway. Ну, или если совсем нипалусяися - то осваивать что-нибудь хайповое, но хотя бы не такое маргинальное, например Елоквент.
    Ответ написан
  • Безопасно ли так производить запись пользовательского текста в базу?

    @neol
    $sth = $dbpdo->prepare("INSERT INTO `blogs` SET `text` = ?");

    Этого достаточно для защиты от sql injection.

    В приведённом коде нет проверки авторизации и защиты от CSRF.

    $post_text = addslashes($_POST['post_text']);

    Зачем это тут?

    if(strlen($post_text) > 15) {

    К безопасности это не относится, но лучше всё же mb_strlen.
    Ответ написан
    3 комментария
  • Почему двухфакторная аутентификация не ухудшает безопасность?

    SagePtr
    @SagePtr
    Еда - это святое
    Во-первых, украсть телефон на порядок сложнее, чем логин-пароль, для этого нужно физически находиться рядом с владельцем.
    Во-вторых, пропажа телефона обнаружится практически сразу, тогда как украденным логином и паролем могут пользоваться долгие годы, не вызывая подозрений.
    В-третьих, телефон может быть запаролен, в таком случае злоумышленнику потребуется сперва обойти этот пароль, что требует дополнительного времени, за которое владелец заметит пропажу и примёт меры.
    В-четвёртых, не обязательно использовать один и тот же телефон. Никто не мешает установить приложение для генерации кодов на отдельный телефон, в который даже не вставлять сим-карту и не подключать к сети, с собой его не носить. Тогда для кражи понадобится уже как минимум проникновение в жилище.
    А некоторые сервисы позволяют использовать USB-брелок наподобие yubikey, с датчиком отпечатка, в таком случае придётся физически заставить владельца приложить к нему палец.

    А касательно восстановления, многие сервисы позволяют генерировать для 2FA резервные коды, которые можно распечатать/переписать на бумаге и положить в шкаф. Или в несгораемый сейф.
    Ответ написан
    Комментировать
  • Почему двухфакторная аутентификация не ухудшает безопасность?

    saboteur_kiev
    @saboteur_kiev Куратор тега Информационная безопасность
    software engineer
    То есть, зная пароль, но лишившись номера телефона, должно быть можно восстановить номер. А имея номер телефона, должно быть можно восстановить пароль.

    Но в чем тогда выгода?

    В том, что вы привели пример НЕПРАВИЛЬНОЙ настройки двухфакторной авторизации.
    Восстановление доступа должно идти через службу безопасности, возможно даже с личным присутствием.
    А то, как двухфакторная авторизация сделана в общих мобильных сервисах - это так, для галочки и небольшого усложнения.
    Ответ написан
    1 комментарий
  • Как перебрать объекты с вложенностью?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const createNestedListHTML = data => (
      data = data instanceof Object ? Object.entries(data) : [],
      data.length
        ? `<ul>${data.map(n => `
             <li>
               ${n[0]}
               ${createNestedListHTML(n[1])}
             </li>`).join('')}
           </ul>`
        : ''
    );
    Ответ написан
    Комментировать