• Какое будущее у тега p в html5?

    @glenean
    Добрый день.
    Тег p ждет светлое будущее. Как вообще могло в голову такое придти?
    Может еще и H1...H6 тоже дивами заменить?
    тег p - paragraph, как может быть текст без параграфов?
    тег div - division, часть, раздел, может ограничивать, разделять, что угодно - таблицы, видео, изображения, колонки сайта.
    Это абсолютно разные теги и выполняют разную функцию в семантическом представлении страницы.
    Покажите, пожалуйста, лучше, где Вы увидели, что тег p - "устаревший тэг"?
    Ответ написан
    1 комментарий
  • Json_decode. Ошибка при добавлении в БД?

    nazarpc
    @nazarpc
    Open Source enthusiast
    Изначально не работало с добавлением текста в дойных кавычках

    Не стреляйте себе в голову, используйте mysqli_real_escape_string() или PDO, они как раз для этого предназначены.
    Ибо подобные регулярки это шоссе для SQL инъекций.
    Ответ написан
    Комментировать
  • В какой момент пора использовать ООП?

    Denormalization
    @Denormalization
    Не забивайте себе голову. Если всё работает и вас всё устраивает, то зачем что-то менять?
    Преимущества ООП проявляются при поддержке проекта.
    Вы поддерживаете свои проекты? Вы развиваете их? В какой момент вам стало сложно поддерживать проект?
    Много ли в проекте абстракций?
    Как вы решаете проблему добавления новых абстракций в проект?

    Если эти вопросы не про вас, то вам не нужно ООП.
    Ответ написан
    Комментировать
  • Создание класса, как он работает?

    | - это операция побитовое ИЛИ
    4 | 5 | 6 == 7 все верно
    4 = 100
    5 = 101
    6 = 110
    ==> 111 = 7

    То есть вы создаете объект "c" класса SomeClass, в который передается результат этой операции.
    Ответ написан
    Комментировать
  • Сеть для домашнего облачного датацентра - инет от нескольких 100Мбит/с -1Гбит/с каналов от разных провайдеров с агрегацией каналов и резервированием?

    sim3x
    @sim3x
    Успешный стартап возьмет в оренду степлер

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

    Не учтены бесперебойники для сервера и для свичей "провайдеров"

    Если проекту нужно больше чем 10мбпс и он не окупается его лучше умертвить

    Также, на хоть сколько-нибудь успешный проект могут зайти на чай маски-шоу, что совсем неприятно когда они также заходят в твой дом
    Ответ написан
    5 комментариев
  • Сложно ли будет расшифровать данные?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    По настоящему надёжными являются только системы с открытым алгоритмом и асимметричными ключами достаточной длины.
    Что касается вашего алгоритма, то в нём ключи не используются вообще, а входная строка всегда однозначно определяет выходную, а значит его надёжность близка к нулю.
    Ответ написан
    2 комментария
  • Как сверить 2 массивы и удалить одинаковые значения?

    @sanex3339
    загуглите фразу "javascript array diff". В первом же результате на StackOverflow будет реализация данной ф-ии.
    Ответ написан
    Комментировать
  • Какой алгоритм работы у консоли, когда в ней пишешь название приложения и команду?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Консоль ничего не знает. В простейшем случае (если набрана одна команда без пайпов и перенаправления потоков):
    Когда вы набираете строку и нажимаете Enter сначала из строки отделяется первая подстрока до пробела (или конца строки, если пробелов нет). Остаток строки будет передан выполняемой команде как аргументы.
    Затем проверяется, не является ли эта подстрока внутренней командой шелла. Если да, то выполняется эта команда.
    Если это не внутренняя команда и не указан полный путь к файлу, то идёт поиск файла с таким именем в каталогах, перечисленных в строке окружения PATH. Если файл найден и у пользователя есть права на его запуск, то он запускается.
    Если указан полный путь (например, /usr/bin/perl), то поиск не производится, идёт только проверка на права запуска.

    PS. Если речь о досовском/виндовом cmd, то он ищет файлы добавляя расширения .bat, .cmd, .exe, если расширение не указано явно. Кроме того, в нём поиск начинается с текущего каталога, а затем уже по переменной PATH.
    Ответ написан
    4 комментария
  • Как сделать shell script достпупным по ip?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    Если вы не знаете как организовать такую простую вещь, то вам пока стоит не про деньги думать, а про свою репутацию, и повышать навыки работы.
    Без сарказма, совершенно серьезно - нарабатывайте опыт работы, а не оставляйте заглушки для тех, кто вам немного денег вдруг недоплатит.
    Ответ написан
    Комментировать
  • Как отслеживать прогресс Promise?

    Прогресс не просто так убрали из Promise, в большинстве случаев это антипаттерн.
    Нужно понимать что Promise A+ спроектированы так, чтобы инкапсулировать внутри себя всю связанную с операцией логику.
    Именно поэтому я не советую вам придумывать код, который требует методов Promise.progress, Promise.cancel или свойств Promise.isFullfilled, Promise.isRejected.

    Т.е. вы все еще можете пользоваться этими свойствами, но только не в контексте A+.
    Берите Q или любую легковесную замену, и реализуйте все что хотите через defer.
    Примером того, что вы получите в итоге может являться ответ @onqu

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

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

    function doSomethingAsync(timeout, cb) {
      var ee = new EventEmitter();
      var state = {
        progress: 0
      };
    
      (function loop() {
        if (state.progress === 22) return cb(null, state);
        if (state.progress === 'canceled') return cb(new Error('Action canceled'));
        if (state.progress * 1000 > timeout) return cb(new Error('Action timed out'));
    
        ee.emit('progress', state);
        setTimeout(loop, 1000);
      })();
    
      return ee;
    }
    
    
    function a20SecAction(actions = {}) {
      var maxActionTime = 20000;
    
      return new Promise((resolve, reject) => {
        var actionWithProgress = doSomethingAsync(maxActionTime, (err, result) =>
          (err ? reject : resolve)(err || result)
        );
    
        actionWithProgress.on('progress', actions.progress);
      });
    }
    
    a20SecAction({
      progress: (state) => console.log('state:', state.progress)
    }).then(
      (res) => console.log('state: ready'),
      (err) => console.log('state:', err)
    );


    Итак, если у вас есть действие, которое в любом случае должно завершиться, но вам нужно отслеживать прогресс (например загрузки файла), то не пытайтесь решить это на уровне промиса (A+) он вам не подойдет.
    В моем примере три этапа:
    1) Некоторая простейшая асинхронная функция оформленная в nodejs стиле, т.е. она принимает набор параметров и каллбек вида function (err, result) {}
    Это ваш минимальный строительный блок
    2) Функция обертка - более высокий уровень, на котором мы начинаем работать с промисом. Как параметры функция принимает обработчики дополнительных событий нашей операции. В данном случае у операции одно дополнительное событие progress, и два основных - fullfilled, rejected.
    3) Задаем обработчики для всех событий, основные обрабатываем в then, дополнительные через заданные параметры.
    В данном случае я оставил возможность влиять на процесс выполнения извне, внутри обработчика progress. Но лишь для демонстрации того, что это в принципе возможно. На практике лучше не допускать ситуации, когда изменение состояния асинхронной операции происходит извне:
    a20SecAction({
      progress: (state) => {
        console.log('state:', state.progress);
        if (state.progress === 7) state.progress = 'canceled';
      }
    }).then(
      (res) => console.log('state: ready'),
      (err) => console.log('state:', err)
    );


    Ну и в заключении, если у вас уже есть внешняя библиотека, которая предоставляет вам обычный промис для действия, которое может длиться 20 сек, а вам нужно иметь возможность наблюдать за прогрессом - меняйте библиотеку.
    Ответ написан
    2 комментария
  • DPI и цветовая гамма для Печати?

    @YuriyIvanov
    Новый документ > размер 303 mm x 426 mm (нужен запас + 3мм с каждой стороны на обрез), разрешение 300 DPI, цветность CMYK.

    Когда готово все - сохраните в TIFF (не будет потери качества) и отдайте на печать.
    Ответ написан
    Комментировать
  • Есть ли у Тостера RSS?

    webxaser
    @webxaser
    На ленту вопросов отдельного тега можно подписаться по ссылке https://toster.ru/rss/tag_questions/###, где решётки - id тега (напр. про Google).
    Ответ написан
    5 комментариев
  • Попросили проверить код, на что смотреть нужно?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Смотря зачем)). Я когда делаю Code Review критерии следующие:

    * Безопасность:
    - Каждый аргумент метода простого типа должен проверяться на тип в случае его проксирования и на граничные значения в случае обработки. Чуть что не так - бросается исключение. Если метод с кучкой аргументов на 80% состоит из поверки из аргументов - это вполне норм))
    - Никаких trigger_error, только исключения.
    - Исключения ДОЛЖНЫ быть человеко-понятны, всякие "Something went wrong" можно отдавать пользователю, но в лог должно попасть исключение со стектрейсом и человеко-понятным описанием, что же там пошло не так.
    - Каждый аргумент (объект) метода должен быть с тайпхинтингом на этот его класс, или интерфейс.
    - За eval как правило шлю на **й.
    - @ допускается только в безвыходных ситуациях, например проверка json_last_error.
    - Перед работой с БД - обязательная проверка данных.
    - Никаких == и !=. Со swtich - единственное исключение, по ситуации.
    - Если метод возвращает не только bool, а еще что-то - жесткая проверка с ===, или !== обязательна.
    - Никаких условий с присваиваниями внутри. while($row = ...) - тоже идет лесом.
    - Магические геттеры/сеттеры разрешаются только в безвыходных ситуациях, в остальном - запрещены.
    - Конкатенации в sql - только в безвыходных ситуациях.
    - Параметры в sql - ТОЛЬКО через плейсхолдеры.
    - Никаких глобальных переменных.
    - Даты в виде строки разрешаются только в шаблонах и в БД, в пхп коде сразу преобразуется в \DateTimeImmutable (в безвыходных ситуациях разрешено \DateTime)
    - Конечно зависит от проекта, но как приавло должно быть всего две точки входа: index.php для web и console(или как-то по другому назваться) - для консоли.

    * Кодстайл PSR-2 + PSR-5 как минимум, + еще куча более жестких требований (для начала все то что в PSR помечено как SHOULD - становится MUST)
    - В PhpStorm ни одна строчка не должна подсвечиваться (исключением является typo ошибки, например словарик не знает какой-то из аббревиатур, принятых в вашем проекте). При этом разрешается использовать /** @noinspection *** */ для безвыходных ситуаций.
    - Если кто-то говорит, что пишет в другом редакторе и у него не подсвечивается, на эти отговорки кладется ВОТ ТАКЕЕЕНЫЙ мужской половой **й и отправляется на доработку)).

    * Организация кода:
    - Никаких глобальных функций.
    - Классы без неймспейса разрешаются только в исключительно безвыходных ситуациях.

    * Тестируемость (в смысле простота тестирования) кода должна быть высокая.
    - Покрытие кода обязательно для всех возможных кейсов использования каждого публичного метода с моками зависимостей.

    * Принципы MVC:
    - Никаких обработок пользовательского ввода в моделях, от слова совсем.
    - Никаких ***ть запросов в БД из шаблонов.
    - Никаких верстки/js/css/sql-ин в контроллерах.
    - В моделях НИКАКОЙ МАГИИ, только приватные свойства + геттеры с сеттерами.
    - В моделях разрешено использовать метод save(при наличии такого разумеется) только в исключительных ситуациях. Во всех остальных - либо insert, либо update.

    * Принципы SOLD:
    - Никаких божественных объектов умеющих во все.
    - Если метод для внутреннего пользования - private, никаких public.
    - Статические методы разрешаются только в случае безвыходности.

    * Принцип DRY разрешено нарушать в случаях:
    - Явного разделения обязанностей
    - В тестах (каждый тест должен быть независимым, на сколько это возможно)

    * Работа с БД:
    - Запрос в цикле должен быть РЕАЛЬНО обоснован.
    - За ORDER BY RAND() - шлю на***й.
    - Поиск не по ключам (конечно если таблица НЕ на 5 строк) запрещен.
    - Поиск без LIMIT (опять же если таблица НЕ на 5 строк) запрещен.
    - SELECT * - запрещен.
    - Денормализация БД должна быть обоснована.
    - MyISAM не используется (так уж)) )
    - Множественные операции обязательно в транзакции, с откатом если чо пошло не так.
    - БД не должна содержать бизнес логики, только данные в целостном виде.
    - Не должно быть нецелесообразного дерганья БД там, где без этого можно обойтись.

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

    * О людях:
    - "Я привык писать так и буду дальше" - не вопрос, ревью пройдешь только когда поменяешь свое мнение.
    - "Я пишу в vim-е и мне так удобно" - здорово, код консолью я тоже в нем пишу)) но есть требования к коду, если в них не сможешь - не пройдешь ревью.
    - "Я скопировал этот страшный метод и поменял 2 строчки" - это конечно замечательно, но по блейму автор всего этого метода ты, так что давай без говняшек, хорошо?
    - "Оно же работает!" - вот эта фраза переводится примерно так: "да, я понимаю, что пишу полную хрень, но не могу писать нормально потому, что руки из жо", я правильно тебя понял?))
    - "У меня все работает!" - рад за тебя, а как на счет продакшна?
    - "Там все просто" - не используй слово "просто", от слова "совсем". Вот тебе кусок кода (первого попавшегося с сложной бизнес логикой), где там ошибка (не важно есть она, или нет)? Ты смотришь его уже 2 минуты, в чем проблема, там же все "просто"))

    * Всякое:
    ActiveRecord (это я вам как в прошлом фанат Yii говорю) - полное говно, примите за исходную. По факту у вас бесконтрольно по проекту гуляют модельки с подключением к БД. Не раз натыкался на то, что в тех же шаблонах вызывают save, или update (за такое надо сжигать).
    То, что используется Laravel - это печально((. Что бы выполнить требования приведенные выше, приходится "воевать" с фреймворком.

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

    UPD

    Формализировал данные критерии по ссылочке: https://github.com/index0h/php-conventions
    Ответ написан
    55 комментариев
  • Как сделать автоматический деплой PHP приложения?

    skobkin
    @skobkin
    Гентушник, разработчик на PHP и Symfony.
    Например, Jenkins + Capistrano (или Rocketeer). Комбинаций - масса.
    Кстати, у последних версий Gitlab должна быть поддержка CI.
    Ответ написан
    Комментировать
  • Где вы храните сессии пользователя, почему?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Что делать если у пользователя отключены cookies и нельзя определить идентификатор сессии?


    Сообщать ему что мол "чувак у тебя куки отключены!"

    https://developer.mozilla.org/en-US/docs/Web/API/N...
    Ответ написан
    Комментировать
  • Что значит node.js разработчик?

    @teslor
    Node.js это не веб-сервер и не CMS, это просто среда исполнения JavaScript, где можно сделать что угодно (в т.ч. написать свой веб-сервер, фреймворк и т.д.). Чтобы называться разработчиком Node.js нужно разбираться в тонкостях асинхронного JS, знать большую часть встроенных функций Node.js, уметь работать с основными модулями и создавать свои.
    В контексте фронтенд-разработки обычно хотят лишь, чтобы человек умел его установить и настроить сборщик. Это не разработчик Node.js.
    Ответ написан
    1 комментарий
  • Как отсортировать в массиве по дате?

    $yourArr = [];
    usort($yourArr, function ($a, $b) {
        return $a[0] < $b[0] ? -1 : 1;
    });
    Ответ написан
    3 комментария
  • Как организовать продажу уникальных пин-кодов софта на лендинге?

    Denormalization
    @Denormalization
    Как организовать продажу уникальных пин-кодов софта на лендинге?

    Когда пользователь оплатил, ему на почту пришло письмо с !УНИКАЛЬНЫМ (одним из тысячи) пином, потом пин удалялся с базы.

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

    Возможно.
    Ответ написан
    4 комментария
  • Как как конвернуть полученый текст в массив из JSON обьектов?

    L0k1
    @L0k1
    то, что вы получаете -и есть массив json объектов
    Ответ написан
    Комментировать