Задать вопрос
  • Надо ли все детали дизайна сайта заключать в автолэйауты?

    SeaInside
    @SeaInside
    16 лет пилю все эти штуки
    В идеале - да, по факту - оно того чаще всего не стоит, ниже объясню почему.
    * Вообще, если у вас такой вопрос возникает, то вам оно, скорее всего, не нужно.

    Основных целей две:
    1. Автоматическое перестраивание макета в случае использования компонентов
      Вот есть у вас традиционная, любимая дизайнерская сущность "карточка".
      Она вынесена в компонент и используется на N страницах примерно N * 50 раз.
      Приходит клиент и говорит: хочу в карточку добавить внизу большую красную кнопку.
      Вы добавляете кнопку в компонент.
      Если и сам компонент, и все родители, где он используется, сделаны с помощью автолейаутов - на этом ваша работа заканчивается, все страницы выглядят как надо.

      Если автолейаутов нет, добро пожаловать либо в "руками передвинуть все экземпляры на всех страницах" (что нудно, скучно, а если клиент завтра передумает, то вообще лол), либо в "ну я вот тут на странице "Карточка v2" показал, как должно быть", что спустя какое-то время ведёт к бардаку на проекте, в котором невозможно найти концов.
    2. Больше уверенности в том, что всё стоит ровненько
      Что выливается в то, что верстальщику над макетом работать приятнее - он видит автолейаут и он сразу уверен, что отступ между всеми элементами одинаковый.
      Скорее всего, получится сделать `pixel-perfect`, если заказчику это будет важно. А без автолейаутов у вас может быть ситуация, когда между одинаковыми элементами разный отступ.
      * Необязательно будет - можно быть внимательным, но дополнительная уверенность - это хорошо для всех. Технология страхует от ошибок.

    Теперь о том, почему не стоит.
    • Для того, чтобы автолейауты помогали процессу, а не мешали - у вас ещё до начала работы должно быть полное представление о том, что вы хотите в итоге получить.
      Если вы находитесь в процессе творческого поиска - рисуйте как рисуется. Как только кажется, что всё выглядит хорошо - подумайте над лейаутами.
    • Когда нужно задизайнить сложный, составной компонент с разными вариантами - его реально нужно проектировать, по субъективным ощущениям это гораздо ближе к вёрстке, чем к дизайну - а это вообще другая профессия, и думать там надо по-другому.
      У меня, когда доводится рисовать, компоненты структурно получаются практически такие же, как они и на вёрстке потом будут - и это замечательно в долгосрочной перспективе - бардака меньше.
      Но я - в первую очередь технический специалист, а дизайнер не думает (и не должен думать) как верстальщик, и сделает немного не то и немного не так. Со стороны будет выглядеть чаще всего как "создал себе проблем на ровном месте".
      Кроме того, у этого есть минусы: компонент становится сложнее (порой - прям ощутимо), чем если просто внутри фрейма мышкой расставлять элементы. Это влияет на то, насколько легко другому человеку разобраться, что происходит и внести свои изменения.
    • В фигме нет (пока нет) абсолютного позиционирования. Пока в ходу хак с фреймом ширины/высоты 0/0 - но это именно что хак, это увеличивает сложность и разработки, и поддержки. Сложные компоненты без этого не заворачиваются в автолейауты никак.
    • Не очень опытных дизайнеров автолейауты серьёзно ограничивают в творчестве - дизайн получается... Ну, квадратный, что ли.
    • Не все вещи возможно реализовать на автолейаутах


    Во всём нужна мера. Должно быть удобно, быстро, надёжно и понятно команде.
    А где эта мера - ну каждый ведь для себя решит, верно? :)
    Ответ написан
    3 комментария
  • В чем ошибка моего кода?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Самое время познакомиться с темной стороной программирования.
    Начинающие вайтишники искренне думают, что программист - это типа такой художник. Берет мольберт, поллитру, кисти и начинает ВАЯТЬ. Потом отходит на шаг, любуется делом рук своих, и снова. Ваять. А потом сразу заказчику, за большие деньги.

    Так вот, в реальности это всё не так.
    Большую часть времени программист не пишет код.
    А пытается разобраться, почему он не работает.

    Так что мы будем сейчас учиться это делать.
    Тем более, что это в принципе несложно.
    Главное не думать, что чем-то поможет сидеть и тупить в свой кодик. И приглашать других людей потупить в него тоже бессмысленно. Потому что причина может быть совсем не в нем. но даже если проблема и в коде, то искать её всё равно надо по-другому.
    В код не надо тупить. Его надо ЗАПУСКАТЬ.
    И выводить промежуточные результаты. Проверять его работу.
    Заранее выяснить, какие должны быть значения у переменных, и проверять их на каждом этапе.
    Где не совпадут - там и проблема.
    В идеале IDE сама покажет содержание всех переменных при трассировке, но если пишешь код в блокнотике, то даже тупо писать var_dump($bar1,$var2,$var3...); и смотреть что там лежит.
    Условия проверять еще проще, тупо echo 'зашли в условие if (!empty($user))';
    И если лежит не то, или эхо не выводится - вот тогда уже смотреть в код и думать, почему так получилось.

    В частности, при авторизации надо проверить две вещи:
    1. Находится ли юзер по логину
    2. если находится, то проверить корректность хэша. Для этого при регистрации надо вывести полученный через password_hash пароль и записать на бумажке
    потом запросить сохраненный из БД и сравнить

    Кроме того
    Разумеется, отладка невозможна без сообщений об ошибках.
    В половине случаев РНР человеческим голосом сообщает в чем проблема.
    Поэтому всегда, в любом окружении должно стоять error_reporting(E_ALL);
    плюс на домашнем компике полезно прописать ini_set('display_errors', 1); чтобы сразу видеть ошибки на экране.
    На боевом сервере разумеется поставить 0 вместо 1, и добавить ini_set('log_errors', 1);

    У меня только один вопрос.
    Какой смысл вообще делать парольную защиту, если любой придурок сможет спокойно авторизоваться через SQL инъекцию?
    Ответ написан
    9 комментариев
  • Как словить и прочитать http запрос?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Приветствую.
    Каждый сайт во всемирной сети вэвэвэ делает то же самое.
    Каждый.
    Это одна из самых часто встречающихся задач в веб-разработке.
    В интернете есть миллионы примеров, как это сделать.

    Попробуйте раз в жизни воспользоваться поиском.
    Ответ написан
    2 комментария
  • Почему значение даты на php записывается задом на перёд, какие исторический предпосылки обусловили этот феномен?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Записывать дату в РНР можно практически в любом формате. Хоть 12/12/12
    А вот сравнивать значения можно только тогда, когда старшие разряды идут впереди младших. В частности, строки, содержащие дату, можно сравнивать и сортировать только в формате "задом наперёд". Что делает её очень удобной. Например при именовании папочек с фоточками на домашнем компе

    Ну и как правильно отмечено выше, здесь ничего не записывается, а просто выводится. То есть вопрос к тому, кто выводит.
    Ответ написан
    Комментировать
  • Как переписать подключение к базе данных, по принципам ООП?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Никак.
    Это не стёб и не троллинг. Это единственный возможный ответ на этот хороший, в сущности, вопрос.

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

    в данном случае перед ООП надо выучить куда более базовые вещи.
    Например научиться применять готовые классы, такие как mysqli
    узнать почему за использование @ программистам в аду льют кипяток на самые нежные части тела
    выучить что exit('Ошибка подключения'); - это говнокод
    ну и открыть для себя разделение логики работы с данными и логики отображения. То есть сначала получить все данные, а потом только выводить.

    Эту страницу можно переписать в соответствии с принципами аккуратного кода

    Сначала сделать файл config.php.
    Этот файл можно будет исключить из системы контроля версий и таким образом иметь на каждом сервере свой

    <?php
    return [
        'db' => [
            'host' => '127.0.0.1',
            'port' => 3306,
            'db'   => 'pizza',
            'user' => 'root',
            'pass' => '',
            'charset' => 'utf8mb4',
        ]
    ];

    потом сделать файл mysqli.php
    Этот файл можно будет включать во все скрипты, которым нужно соединение с БД
    <?php
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $db = new mysqli(
        $config['db']['host'], 
        $config['db']['user'], 
        $config['db']['pass'], 
        $config['db']['db'], 
        $config['db']['port']
    );
    $db->set_charset($config['db']['charset']);
    $db->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1);


    Потом сделать страницу pizza.tpl.php в которую поместить весь HTML
    .
                <select id="single" class="form-control" name = '1234' >
                    <option value="" disabled selected style='display:none;'>выберите тип</option>
                    <?php foreach($types as $object): ?>
                        <option value ="<?=$object['id']?>"><?=$object['name']?></option>
                     <?php endforeach ?>
                </select>


    И потом сделать страницу pizza.php на которой собрать это всё вместе
    <?php
    $config = require 'config.php';
    require 'mysqli.php';
    
    $sql="SELECT * FROM pizza";
    $types=$db->query($sql)->fetch_all(MYSQLI_ASSOC);
    
    include 'pizza.tpl.php';


    После этого можно будет потихоньку приглядываться к ООП.
    Например сделать класс pizzaModel
    Но делать его будет иметь смысл только тогда, когда мы будем знать, какие еще действия с пиццей будет производить этот код
    Ответ написан
    5 комментариев
  • Пагинация через Rest API?

    AlexNest
    @AlexNest
    Работаю с Python/Django
    Пробовал писать подобные функции, но url никак не меняется.

    А как они поменяются, если они захардкожены (т.е. 'https://reqres.in/api/users?page=1' всегда будет отправлять на первую страницу. Нужно формировать ссылку динамически: например
    function fetch_data(page) { // Номер страницы
    	const getProducts = async () => {
    		const obj = await fetch('https://reqres.in/api/users?page=' + page); //
    		const result = await obj.json();
    
    	}
    }
    fetch_data(1);
    fetch_data(2);
    fetch_data(315);
    Ответ написан
    Комментировать
  • Как на PHP по формату даты 00.00.0000 вывести текстом, типа "second saturday of february"?

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

    Это же все смехотворные задачи, каждая из которых решается за 30 секунд

    Ох, я забыл про last. Может быть, это и является арифметическим камнем преткновения? ;-)
    Ответ написан
    Комментировать
  • Нужно ли изучать PUG и насколько он эффективен?

    DevMan
    @DevMan
    нет ничего НУЖНОГО.
    есть только то, что РЕШАЕТ поставленные задачи.

    он тебе помогает? нужен!
    я спокойно обхожусь без него.

    сейчас мало кто обходится голой вёрсткой: или spa, или server-side.
    и там и там есть свои шаблонизаторы. корячить туда паг конечно можно, но, имхо, не уперлось.

    хотя может дать незначительный профит для прототипов. хотя и для них уже есть куча инструментов.
    Ответ написан
    1 комментарий
  • Почему WHERE не работает с диапазоном дат php?

    roswell
    @roswell
    и швец, и жнец, и на дуде игрец
    Следовало бы представить в запросе отметки дат как строковые данные, а не как литералы: 1))=>'2022-01-07', иначе они выродятся в целое число.
    Ответ написан
    4 комментария
  • Стоит ли использовать Blazor?

    profesor08
    @profesor08
    Неужели единственный плюс Blazor это c#?

    В точку.

    Далее по старой информации(если не ошибаюсь технология Wasm тогда толко развивалось) производительность blazor может быть лучше чем в React.js только в Firefox.

    Срочным делом надо разобраться и понять что такое WebAssembly и какие там ограничения. Приготовься в большому огорчению.
    Ответ написан
    Комментировать
  • Как переносятся базы данных Postgresql и Mysql?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    дамп
    Ответ написан
    Комментировать
  • Почему вычисления происходят именно так?

    Stalker_RED
    @Stalker_RED
    JS тут не при чем, это особенности вычислений с плавающей запятой, и они описаны в стандарте IEEE 754, и именно так работает большинство процессоров.
    Если вы хотите чтобы работало "согласно ожиданиям", то есть варианты:
    1. подкорректировать свои ожидания, и работать как все.
    2. использовать библиотеки для всяких длинных арифметик и прочих повышенных точностей, платя за эту точность скоростью вычислений.
    3. использовать языки, которые будут маскировать проблему, округляя числа втихаря (и рисковать нарваться на неточности уже из-за этих округлений, ага).

    https://0.30000000000000004.com/ -- тут подробно, с примерами на разных языках.
    Ответ написан
    3 комментария
  • Разница в стримах коллекций и массива?

    @Akela_wolf
    Extreme Programmer
    Потому что в Java массивы и коллекции - это совершенно разные вещи (хоть и похожие по своему назначению). Массив, находится максимально близко к сишному массиву (разве что на джаве встроена проверка выхода за пределы, а в остальном - практически также). Соответственно, массив не может иметь своих методов, т.к. не является объектом (аналогично примитивным типам данных, по сути массив - это примитивный тип данных в Java). Коллекция же, наоборот, суть объект. Что и обуславливает разницу между ними. Эту разницу можно было бы сгладить на уровне языка, но во времена разработки Java не было понимания как удобнее сделать. А затем - бремя обратной совместимости пришлось нести через годы (аналогичная история приключилась с type erasure). Причем это настолько фундаментальная разница, существующая на уровне JVM, поэтому даже современные языки, например Kotlin, не в состоянии уйти от этой нее (так в Kotlin, класс Array не реализует интерфейс Iterable именно по этой причине).
    Ответ написан
    Комментировать
  • Как выходить из ситуации, когда 2 действия возвращают один результат?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    В первом случае должен быть код 400, а не 404.
    Ну и код будет красивее (на мой взгляд) выглядеть, если эту проверку вынести в начало, избавившись от else-спагеттин c помощью концепта "early return":

    // Валидируем 
    if (count($path) !== 3) {
        http_response_code(400); //  вот тут 400, потому что это корявый запрос, мы даже ничего и не искали
        die();    
    }
    
    // Получаем данные 
    $result  = getGesult();
    
    // Валидируем данные 
    if ($result !== true) { 
        http_response_code(404);
        die();    
    }
    
    // Дальше код, который выведет данные
    Ответ написан
    Комментировать
  • Не отправляются данные из формы в базу данных, что не так?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    ошибок и не будет
    потому что ПДО не настроен показывать ошибки
    чтобы настроить, вместо того говнокода который сейчас, должно быть примерно так (не забыть подставить свои значения)
    $host = '127.0.0.1';
    $db   = 'weekly_journal';
    $user = 'root';
    $pass = '';
    $port = "3306";
    $charset = 'utf8mb4';
    $options = [
        \PDO::ATTR_ERRMODE            => \PDO::ERRMODE_EXCEPTION,
        \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
        \PDO::ATTR_EMULATE_PREPARES   => false,
    ];
    $dsn = "mysql:host=$host;dbname=$db;charset=$charset;port=$port";
    $pdo = new \PDO($dsn, $user, $pass, $options);

    после этого если не получится записать, то БД сама скажет - почему.
    Ответ написан
    Комментировать
  • Удаление данных с жесткого диска для продажи?

    gbg
    @gbg
    Любые ответы на любые вопросы
    Если поставить Linux или BSD несколько раз на диски. Поставить и удалить, и заново поставить, то будет же уже другая файловая система, и возможности вытащить файлы даже программами (старые, которые были под Windows) не будет?

    Смысла большого нет, информация о старой ФС - это несколько байт в начале диска.

    Есть маленькая консольная программа sdelete которая умеет многократно затирать диски, ей и воспользуйтесь.
    Ответ написан
    1 комментарий
  • Как правильно отправлять почту через PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    И снова в который раз я поражаюсь той вакханалии безнаказанности, с которой роскомнадзор блокирует интернет для отдельных граждан страны.
    Казалось бы - взял теги и заголовок вопроса, PHP ЭЛЕКТРОННАЯ ПОЧТА ПОЧТОВЫЙ СЕРВЕР Как правильно отправлять почту через PHP?
    и скопипастил в адресную строку своего браузера - что может быть проще?
    Но коварное полицейское государство не дремлет, и вместо результатов поиска показывает только товарища майора, грозно покачивающего пальцем.
    Ответ написан
    1 комментарий
  • Как прикреплять пользователей к проектам?

    BorLaze
    @BorLaze
    Java developer
    users <---> projects

    у одного пользователя один проект? one-to-one
    у одного пользователя больше одного проекта? one-to-many
    много пользователей на один проект? many-to-one
    каждый пользователь может иметь больше одного проекта, и на одном проекте может быть больше одного пользователя? many-to-many
    Ответ написан
  • Возможно ли прочитать с помощью php файл который находится на удаленном сервере?

    @rPman
    это basic http auth
    скачать можно простым file_get_contents а логин и пароль указать в самой ссылке в формате:
    https://login:password@site.com/...
    Ответ написан
    Комментировать