Задать вопрос
  • В чем суть такой записи в reset.css?

    nowm
    @nowm
    Это специфичное для blockquote определение, которое Eric Meyer (автор reset.css) позаимствовал у Paul Chaplin. Первая строка content: "" делает так, чтобы у blockquote исчезли кавычки — на случай, если вторая строка content: none не поддерживается браузером, потому что первая строка — это CSS 2, а вторая — это CSS 2.1. В одну строку их записать нельзя, потому что по стандарту для свойства «content» нельзя комбинировать ключевые слова «normal» и «none» с другими значениями.

    Вообще, когда встречается перечисление одного и того же свойства с разными значениями, это делается для того, чтобы обеспечить совместимость с разными браузерами. То есть, если, например, браузер не поддерживает «content: none», он применит «content: ""», а другую запись проигнорирует.

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

    .some-class {
        background: #e66465;
        background: linear-gradient(#e66465, #9198e5);
    }


    В этом коде, если браузер поддерживает градиентный фон, он сначала прочитает, что нужно использовать цвет «#e66465», а потом это перезапишется записью «linear-gradient», и итоговое значение будет «linear-gradient(#e66465, #9198e5);». Если же браузер не поддерживает градиент, он сначала прочитает, что нужно использовать «#e66465», а потом увидит неподдерживаемое определение «linear-gradient», проигнорирует его, и итоговое значение будет «#e66465».
    Ответ написан
    Комментировать
  • Как избежать появления лишних табуляций и пробелов перед выражениями утверждений blade таких как if или foreach?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега Laravel
    В контексте содержимого какой-либо строки не нужно добавлять отступы - приходится жертвовать читаемостью в пользу точности (а ещё бороться с IDE, которая может отступы сама добавлять при автоматическом форматировании). Ну или использовать вместо кастомных директив тернарные операторы:
    Вместо @if($bool) 42 @endif писать {{ $bool ? '42' : '' }}.

    А в контексте html-тегов эти лишние пробелы автоматически удаляются браузером. Например, вот такой код:
    <span>  One  </span>
           <span>
                   Two
    </span>

    будет отрендерен вот так:
    One Two
    Ответ написан
    Комментировать
  • Существует ли уязвимость многократных запросов в Laravel?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Существует, разумеется
    Это называется DOS-атакой и защита от нее делается не средствами фреймворка.

    Поэтому забивать себе голову такими вопросами не следует.
    Ответ написан
    4 комментария
  • Как узнать что метод у класса был вызван?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    1. вызывать в самом методе close();
    2. вызывать в инициаторе, который вызывает метод close();
    3. из close выкидывать событие или window.postMessage() или ...

    Много технических способов, непонятны ваши ограничения.
    Ответ написан
    7 комментариев
  • Перезагрузка страницы с сохранением позиции на ней?

    Stalker_RED
    @Stalker_RED
    Можно js-скриптом слушать событие unload, запоминать скролл, и при загрузке страницы делать scrollTo.

    Ещё лучше - не перезагружать страницу, а подтягивать обновлённые данные через ajax.
    Ответ написан
    Комментировать
  • Есть какие-то поддерживаемые не онлаин карты?

    Stalker_RED
    @Stalker_RED
    Ответ написан
    Комментировать
  • Не могу открыть свой новый сайт - как починить?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    На репликацию изменений в доменных зонах может потребоваться до суток.
    Ответ написан
    Комментировать
  • Как сделать выравнивание img по горизонту, при вращении родителя?

    Gvoz1
    @Gvoz1
    Frontend разработчик
    Ответ написан
    Комментировать
  • Стоит ли тратить время на самописный клиент/sdk для какого то (rest) api?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Основной минус кодогенераторов в том что они за тебя думают. На типовых задачах все хорошо, но "внезапно" MS сменила механизм получения токена, и ты перед разбитым корытом. Из личного опыта.
    Ответ написан
    Комментировать
  • В чем идея и как работают шаблоны?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Идея шаблонов – держать HTML разметку отдельно и удобно.

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

    Простейший пример Twig мало чем отличается от обычного PHP:
    Шаблон hello.html.twig:
    Привет, {{ name }}!,
    и вывод в него типа
    echo $twig->render('hello.html.twig', ['name' => 'Хабр']);
    передаются имя темплейта и данные, которые там нужно подставить.
    В шаблоне обычно никаких вычислений, максимум простые циклы или условия.

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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Вопрос очень хороший.
    А ответ на него очень простой.

    Шаблоны нужны для отделения логики приложения от логики отображения.
    Разделив их, мы получим сразу кучу выгод:
    • Нормальную структуру приложения, когда вывод начинается только после того, как отработала вся логика. То есть у нас никогда не будет проблем с ошибкой headers already sent, с возвратом json-а вместо html, с выводом в page header-е тех данных, которые появляются только в процессе работы скрипта
    • Мобильность - один и тот же движок можно будет использовать на нескольких сайтах, меняя только шаблоны, но весь код оставляя одинаковым. Что поможет, в частности, вносить обновления в движок и исправлять ошибки на всех сайтах разом.
    • Разделение труда - сейчас обычно над отображением работают фронтендеры, то есть, когда бизнес-логика отделена от шаблонов, то любой фронт сможет с ней работать


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

    После этого есть варианты, которые отличаются в основном удобством работы с кодом шаблона.
    Править HTML код записанный в виде РНР строки - это САМЫЙ неудобный .

    Дальше идут всякие наколенные решения, типа
    бизнес-логика
    include header
    ?>
    хтмл конкретной страницы
    <?php include footer ?>

    или чуть более продвинутый, когда шаблоны хранятся отдельно и могут вкладывться друг в друга. Сначала пишем функцию,
    function render_template($filename, array $data = [])
    {
        ob_start();
        extract($data);
        require __DIR__ . '/' . $filename;
        return ob_get_clean();
    }

    а потом в коде страницы пишем
    бизнес-логика
    ...
    $page_html = render_template('page.tpl.php', [
        'data' => $data,
    ]);
    echo render_template('main.tpl.php', [
        'navigaton' => $nav_list,
        'title' => $title,
        'page' => $page_html,
    ];

    где сами шаблоны это
    ...
            <?php foreach ($navigation as $item): ?>
                <li>
                    <a href="<?= e($item['href']); ?>"><?= e($item['title']); ?></a>
                </li>
            <?php endforeach ?>
    Важно! Любой вывод в этих шаблонах должен экранироваться в обязательном порядке (кроме очевидных случаев, когда мы выводим результат рендера).

    Ну и наконец нормальные шаблонизаторы, из которых я горячо рекомендую Twig.
    Главное, что про него надо знать - даже самые зелёные нубы осваивают его без затруднений. И настоятельно рекомендую сразу перейти на него, после того как наиграетесь с решениями на коленке.
    Ответ написан
    9 комментариев
  • Как исправить ошибку 500 в Laravel?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега Laravel
    Вы привели в вопросе весь код, кроме того, который реально нужен - PageController.
    Method App\Http\Controllers\PageController::national-students21 does not exist
    Это ошибка переводится как "метод national-students21 класса App\Http\Controllers\PageController не существует. Собственно, с таким именем он и не может существовать, это синтаксическая ошибка.

    Почитайте документацию: https://laravel.com/docs/8.x/controllers
    Ответ написан
    4 комментария
  • Как я могу посмотреть дефолтные настройки webpack из vue/cli?

    @resibe Автор вопроса
    19-летний пушистик
    В общем можно использовать yarn vue-cli-service inspect Илиvue inspectИли
    //package.json
      "scripts": {
        "inspect": "vue-cli-service inspect > current-webpack-settings.txt"
    }
    и yarn inspect
    Ответ написан
    Комментировать
  • Можно ли сделать такие края блока на css?

    Ankhena
    @Ankhena Куратор тега CSS
    Нежно люблю верстку
    Фоновым градиентом под нужным углом.
    Можно в один псевдо, можно вообще без него.
    Правда, по количеству кода варианты с градиентами не выигрывают перед идеей заинлайнить svg в css
    Ответ написан
    Комментировать
  • Можно ли сделать такие края блока на css?

    Get-Web
    @Get-Web Куратор тега CSS
    Front-End Developer
    Вариант с drop-shadow и clip-path:
    Ответ написан
    Комментировать
  • Дырка ли в межбанковской системе быстрых платежей (СБП)?

    @sanchez1408
    На самом деле 99% дело происходит так.
    Т.к. в Тинькофф форма перевода по номеру телефона общая, то при вводе номера телефона Тинькофф автоматически в фоне делает запросы по СБП в банки, подключенные к СБП, это нужно, чтобы вывести в интерфейсе Тинькоффа банки, в которых у клиента получателя еще есть счета.
    А по требованиям НСПК если в идет попытка перевода в банк, который подключен к СБП, но клиент не дал своего согласия на получение переводов в рамках СБП - банк получатель должен оповестить клиента (не все банки следуют этому требованию - пример Сбер), что ему пытались сделать перевод и ему надо "подключить СБП".
    Поэтому если искать виноватых, то скорее проблема в Тинькофф, что он пытается сделать клиентский сервис, супротив рекомендациям/требованиям НСПК и делает фоновые запросы.
    ВТБ тут всё честно делает.
    Ответ написан
    2 комментария
  • Тэги внутри ссылки это нормально?

    bingumd
    @bingumd
    ...
    Ответ написан
    Комментировать
  • Как поставить интерпретатор php в PhpStorm нужной мне версии?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    Чтобы интерпретатор PHPStorm работал правильно — нужно указать полный путь к интерпретатору. Это можно сделать двумя способами:
    1. Указать путь /usr/bin/php и изменить симлинк ($PATH) на новую версию PHP.
    2. Использовать полный путь к интерпретатору php8. Например /usr/bin/php8.0,/usr/local/Cellar/php@7.4/7.4.16/bin/php и т.д. Ваш путь может быть другим.

    Чтобы узнать путь текущего интерпретатора можно запустить команду :
    $ which php
    : /usr/bin/php
    Ответ написан
    Комментировать
  • Как защититься от двойного списания в многопоточном приложении?

    @rPman
    Блокировку во время траты уже сказали, но бывает что процесс может длиться достаточно долго, чтобы пользователь в соседнем окошке не смог совершить параллельно оплату (у него будет все висеть), поэтому блокировки реализуют программно

    Добавь к аккаунту пользователя поле lockedBalance, в начале транзакции покупки добавляй к этому значению нужную сумму для траты (а по окончанию эту же вычитай как от сюда так и из общего баланса), соответственно итоговый баланс при проверке считай из разницы основного баланса и этого блокированного. Если транзакция сфейлится, это придется отслеживать, заблокированный баланс так же уменьшай на сумму сделки но не трогай общий.

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

    если проверка прошла, то обе выполнятся

    Кто сказал что СУБД позволит выполнить обе транзакции с одними и теми же исходными данными?
    Если обе транзакции начали исполняться параллельно, прочитали одни и те же данные, и пытаются их перезаписать, как СУБД будет себя вести? Позволит ли она вообще отработать обеим транзакциям? Или одна их них подождёт, пока не закончит работу другая? Вопрос гораздо интереснее, чем кажется. И, что самое главное, неглупые люди уже подумали над ним. Очень хорошо подумали.

    В доках постгреса написано ещё лучше.

    Или лучше каждый раз пересчитыапть из истории?

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

    Вот на SO ещё предлагают много решений этой классической проблемы, ни одно из которых не является идеальным и лучшим для всех ситуаций.
    Ответ написан
    Комментировать