• Как сделать выравнивание 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 ещё предлагают много решений этой классической проблемы, ни одно из которых не является идеальным и лучшим для всех ситуаций.
    Ответ написан
    Комментировать
  • "Умение профилировать и отлаживать свой код без использования функции dd/var_dump" - это как?

    karabanov
    @karabanov
    Системный администратор
    Это о xdebug
    Ответ написан
    Комментировать
  • Как узнать версию windows, если в заголовках и системе они разные?

    1. А зачем?
    2. Никак, тк в заголовке может идти буквально что угодно.
    3. Заголовок в этом случае вполне правдив, и говорит, что у тебя NT 6.1 - это и есть win7
    Ответ написан
    2 комментария
  • Как реализовать данную стрелку?

    Ankhena
    @Ankhena Куратор тега CSS
    Нежно люблю верстку
    Взять её в SVG и поставить, например, фоном. Или фоном псевдо.
    Если SVG много, их можно сложить в спрайт.
    Можно писать инлайном прямо в код CSS с помощью url-encoder
    Можно поставить в разметку, если так удобнее, только не забыв задать aria-hidden.
    Ответ написан
    2 комментария
  • Как авторизоваться в git с помощью токена?

    Токен используется в качестве пароля при аутентификации, вместо твоего обычного пароля.
    Но лучше настрой ssh-ключи и используй их.
    https://qna.habr.com/q/964989#answer_1913237
    Ответ написан
    8 комментариев
  • Как получить текст выбранного option'а?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Поскольку в показанном select'е у option'ов отсутствуют атрибуты value, то их значениями будет их текстовое содержимое. Так что в данном конкретном случае текст можно получить с помощью метода val.

    Ну а вообще:

    $('select').change(function() {
      const text = $(':checked', this).text();
      console.log(text);
    });

    Или, к чёрту jquery:

    document.querySelector('select').addEventListener('change', function(e) {
      const select = this;
      // или
      // const select = e.target;
      // const select = e.currentTarget;
    
      const [ option ] = select.selectedOptions;
      // или
      // const option = select[select.selectedIndex];
      // const option = select.querySelector(':checked');
      // const option = [...select.options].find(n => n.selected);
    
      const text = option.text;
      // или
      // const text = option.textContent;
      // const text = option.innerText;
    
      console.log(text);
    });
    Ответ написан
    Комментировать
  • Как исправить ошибки в Git при клонировании репозитория?

    Lynn
    @Lynn
    nginx, js, css
    У вас опечатка в слове auto в файле настроек гита.
    Ответ написан
    1 комментарий
  • PHP обрезает строку, хотя strlen выдаёт правильную длину, как это исправить?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    https://www.php.net/manual/ru/function.strlen.php
    Замечание:
    Функция strlen() возвратит количество байт, а не число символов в строке.
    ...
    mb_strlen() - Получает длину строки
    Ответ написан
    Комментировать