• Как организовать триггерные рассылки? Посоветуете сервисы?

    @Beatle
    Автор, нашли себе что-то?
    Очень лень руками на API триггерную делать...
    Ответ написан
    Комментировать
  • Приложение для построения, сканирования и мониторинга схемы локальной сети?

    @Zzzz9
    Обратитесь к администратору.
    Ответ написан
    Комментировать
  • Провайдер вставляет рекламу на сайте, как исправить?

    @anton99zel
    29а класс средней школы №7
    https и точка
    spoiler
    Мегафон тут тоже начал подменять 404 страничку для сайтов без сертификатов на свою рекламную
    Ответ написан
    Комментировать
  • Как анонимизировать запись голоса? Как скрыть/удалить шумы?

    fox_12
    @fox_12
    Расставляю биты, управляю заряженными частицами
    Преобразовать голос в текст
    Текст преобразовать в голос любой доступной говорилкой
    Ответ написан
    5 комментариев
  • Где можно разместить статью о своем стартапе?

    @anton99zel
    29а класс средней школы №7
    Странно это всё! ОЧЕНЬ!
    Размещаться надо там, где есть твои потенциальные клиенты или инвесторы!
    Писать о себе на Хабре? Так это вроде скорее для технических специалистов ресурс, откуда там инвесторы сидят или клиенты?
    Вероятно, я бы думал в этом направлении, нежели искал ресурсы вышеназванные.
    Про Пикабу вообще убили - диванные аналитики ждут вас с автоматом, заряженным минусатором)
    Ответ написан
    Комментировать
  • Как выключить проверку орфографии в VS Code?

    А это не проверка орфографии.
    5eadadfc024cf295312957.png
    Ответ написан
    Комментировать
  • Как выводить поочередно 4 картинки по одной в неделю?

    @RuComMarket
    Битрикс FullStack разработчик
    switch (date("W")%4) {
     case "0": {вывод картинки 1};break;
     case "1": {вывод картинки 2};break;
     case "2": {вывод картинки 3};break;
     case "3": {вывод картинки 4};break;
    }
    Ответ написан
    1 комментарий
  • Создание простого PDF через чистый JS?

    Sanasol
    @Sanasol Куратор тега JavaScript
    нельзя просто так взять и загуглить ошибку
    есть ограничение в размере кода - 50КБ

    с такими условиями вам только window.print() сгенерирует пдф.

    Где вы хотите найти реализацию pdf в 50кб?
    Ответ написан
    1 комментарий
  • Как перенести доменное имя с сайта на 1c bitrix на сайт на Word Press?

    lamer350
    @lamer350
    กำลังสูงสุด
    Вам по этому вопросу лучше обратится в техподдержку хостинга, там вам с радостью (или не очень) помогут.
    Ответ написан
    Комментировать
  • Что еще можно добавить или что переделать в формлении сайта?

    Zoominger
    @Zoominger Куратор тега Веб-разработка
    System Integrator
    Открыл сайт.
    Не работает прокрутка.
    Закрыл сайт.
    Ответ написан
    Комментировать
  • Попросили проверить код, на что смотреть нужно?

    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 комментариев
  • Какие существуют "общие" правила по верстке web страниц?

    AleksandrB
    @AleksandrB
    Совсем недавно вывел "Hello world"
    Комментировать
  • Бесплатные шаблоны Blade + Bootstrap 4 уже готовые для Laravel - где взять?

    @Kostik_1993
    Web Developer
    Нигде. Нигде. Нигде
    Это бред. Это вам не WP
    Ответ написан
    Комментировать
  • Как запустить сайт php c Composer?

    samoilenkoevgeniy
    @samoilenkoevgeniy
    Lead Full-Stack Web Developer
    из папки проекта(там же где находится файл composer.json) вполнить команду:
    composer install
    Ответ написан
    7 комментариев
  • Как сделать обтекаемый текст внутри круга?

    LenovoId
    @LenovoId
    svg, css,js
    Тыщу пардонов Сэр - а в каком конкретно браузере не поддерживается SVG ?
    Только Netscape Navigator который подох давно не счёт
    SVG хавает даже IE8
    Ответ написан
    3 комментария
  • Табы на js, как правильно?

    Самое первое - отказаться от неоправданного изменения html. Все эти `data-index` - признак плохого кода. Любой блок должен, по возможности, получаться в JS только один раз, записываться в кеш и работать далее с блоком именно как с JS инстансом.

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

    Третье - изменения html максимально выносим в отдельный метод.

    Ну и вообще - все действия разбить на блоки в виде методов.

    Как разультат:

    const TabItemSelector = '.pageNav__tabItem';
    const ContentItemSelector = '.pageNav__contentItem';
    
    class TabsManager {
      constructor(navNode){
        this.tabs = [];
        this.activeTab = null;
    
        this.initFromHtml(navNode);
        this.activateTab(this.tabs[0]);
      }
    
      initFromHtml (navNode) {
        const headers  = navNode.querySelectorAll(TabItemSelector);
        const contents = navNode.querySelectorAll(ContentItemSelector);
    
        for (var i = 0; i < headers.length; i++) {
            this.registerTab(headers[i], contents[i]);
        }
      }
    
      registerTab (header, content) {
        const tab = new TabItem(header, content);
        tab.onActivate(() => this.activateTab(tab));
        this.tabs.push(tab);
      }
      
      activateTab (tabItem) {
        if (this.activeTab) {
            this.activeTab.setActive(false);
        }
    
        this.activeTab = tabItem;
        this.activeTab.setActive(true);
      }
      
    }
    
    const ActiveTabHeaderClass = 'pageNav__tabItem--active';
    const ActiveTabContentClass = 'pageNav__contentItem--active';
    
    class TabItem {
        constructor (header, content) {
            this.header  = header;
            this.content = content;
        }
        onActivate (action) {
            this.header.addEventListener('click', () => action(this));
        }
        setActive(value) {
            this.header.classList.toggle(ActiveTabHeaderClass, value);
            this.content.classList.toggle(ActiveTabContentClass, value);
        }
    }
    
    document.addEventListener('DOMContentLoaded', ()=>{
      let tabs = new TabsManager(document.querySelector('.pageNav'));
    })


    Самое сомнительное в этом коде - это, конечно, TabsManager.initFromHtml, где создается взаимосвязь между headers и contents (к примеру, что будет если заголовков табов будет больше, чем детей?). Но это получается из-за верстки.
    Ответ написан
  • Какой алгоритм подойдет для описания полета насекомого?

    sergiks
    @sergiks Куратор тега Алгоритмы
    ♬♬
    Можно сделать цепочку преследования: к случайной точке тянется одна, к ней другая, и т.д., а последняя – муха.

    Очередную точку ставить на плоскости случайно, в любом месте внутри допустимой области. Эта точка – цель, к которой стремится следующая, невидимая точка: каждый следующий кадр её координаты изменяются на k * векторИзТекущегоПоложения-в-Цель:
    x = x + k * (xTarget - x);
    y = y + k * (yTarget - y);

    Так «преследователь» замедляется, по мере приближения к цели, никогда её не достигая.

    Эта невидимая точка – не одна. К ней, как к цели, стремится следующая. К той ещё одна. Наконец, сама муха по этому закону стремится к хвосту этой цепи - очередной точке.

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

    Сделал рабочий пример.

    Можно поменять алгоритм и сделать, скажем, линейную скорость постоянной. Или случайно варьировать параметры k и D – от этого поменяется скорость и траектория от плавной ближе к ломаной.
    Ответ написан
    Комментировать
  • Какую панель управления хостом для Raspbian выбрать?

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

    https://d3js.org/
    Логику реализовать при помощи головы и немного рук и жопы.
    Ответ написан
    Комментировать