• Nginx: как перенаправлять запросы на другой порт (в пределах одного сервера)?

    BuriK666
    @BuriK666 Куратор тега Nginx
    Компьютерный псих
    server {
        listen 0.0.0.0:8080;
        access_log /path/to/access_log
        location / {
            proxy_pass http://127.0.0.1:8081/;
        }
    }
    Ответ написан
    1 комментарий
  • Как перенести сайт ASP.NET Core 5 на другой хостниг без VisualStudio?

    BasiC2k
    @BasiC2k
    .NET developer (open to job offers)
    Для запуска проекта ASP.NET Core 5 нужно установить также Hosting Bundle.
    Ответ написан
    2 комментария
  • Midnight Commander + ssh + home directory

    barker
    @barker
    Так как заходите в миднайте? Через каталоги с быстрым доступом? Или через соединение для одной панели? Или как? Хотя и там и там работает просто указание в строке соединения нужной папки после сервера, типа blabla@server/home/user
    Ответ написан
    2 комментария
  • Как менять заливку и/или контур svg в CSS при условии, что *.svg в фоне?

    Нужно использовать symbol, вот статьи с описанием методологии:
    https://css-tricks.com/svg-sprites-use-better-icon...
    https://css-tricks.com/svg-symbol-good-choice-icons/

    В кратце, у нас есть один большой SVG со всеми изображениями в виде символов:
    <svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
      
      <symbol id="beaker" viewBox="214.7 0 182.6 792">
        <!-- <path>s and whatever other shapes in here -->  
      </symbol>
      
      <symbol id="shape-icon-2" viewBox="0 26 100 48">
        <!-- <path>s and whatever other shapes in here -->  
      </symbol>
      
    </svg>


    Подключаем картинки на странице:
    <svg class="icon">
      <use xlink:href="#shape-icon-1" />
    </svg>
    
    <svg class="icon">
      <use xlink:href="#shape-icon-2" />
    </svg>


    Всё картинки можно стилизовать через CSS (например задать заливку fill: black и т. д.). Замечу, что атрибут viewBox для символов нужно задавать обязательно, что-бы картинки правильно масштабировались (например если вы будете изменять их размеры).
    Если вы используете grunt, взгляните в сторону grunt-svgstore: https://github.com/FWeinb/grunt-svgstore для автоматизации сборки картинок и обётки оных в один SVG контейнер.
    Ответ написан
    Комментировать
  • Каков план личностного развития JavaScript программиста с нуля?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    1. Выучить русский язык. Узнать, что такое "личностное развитие" и чем оно отличается от профессионального.
    Ответ написан
    2 комментария
  • Как получить текущий путь в BAT файле?

    @res2001
    Developer, ex-admin
    Именно так и узнавать текущий путь: %CD%
    Это не важно где лежит батник, т.к. исполняется не сам батник, а cmd.exe. Т.е. когда вы 2ПКМите на батнике, лежащем на раб.столе запускается команда: cmd.exe /c c:\users\user\Desktop\file.bat
    При этом путь где лежит батник никакого отношения к текущему пути не имеет. cmd.exe обычно запускается с текущим каталогом %SystemRoot%\System32.
    Чтоб перейти в каталог, где лежит батник, используйте команду: cd /d "%~dp0"
    Пути можно получать из параметров батника, указанным способом, то же самое можно делать для переменных цикла, и параметров процедур. Список доступных модификаторов (буквы после %~ доступны в описании команд call и for.
    Ответ написан
    1 комментарий
  • Как в PHP в классе свойствам назначать значения по умолчанию объекты.?

    Всё зависит от того какая цель. Я бы сделал это через обычный enum
    Вариант 1 (enum)

    <?php
    
    enum CurrenciesEnum: string
    {
        case RUB = 'RUB';
        case USD = 'USD';
        case EUR = 'EUR';
        case GBP = 'GBP';
        case JPY = 'JPY';
        case CNY = 'CNY';
    
        private const DATA = [
            'RUB' => ['name' => 'Рублей', 'short' => '₽', 'ratio' => 1, 'default' => 1, 'display' => 1],
            'USD' => ['name' => 'Dollar', 'short' => '$', 'ratio' => 1, 'default' => 1, 'display' => 1],
            'EUR' => ['name' => 'Euro', 'short' => '€', 'ratio' => 1, 'default' => 1, 'display' => 1],
            'GBP' => ['name' => 'Pound', 'short' => '£', 'ratio' => 1, 'default' => 1, 'display' => 1],
            'JPY' => ['name' => '円', 'short' => '¥', 'ratio' => 1, 'default' => 1, 'display' => 1],
            'CNY' => ['name' => '元', 'short' => 'Ұ', 'ratio' => 1, 'default' => 1, 'display' => 1],
        ];
    
        public function code(): string
        {
            return $this->value;
        }
    
        public function name(): string
        {
            $this->insureValue();
            return self::DATA[$this->value]['name'];
        }
    
        public function short(): string
        {
            $this->insureValue();
            return self::DATA[$this->value]['short'];
        }
    
        public function ratio(): string
        {
            $this->insureValue();
            return self::DATA[$this->value]['ratio'];
        }
    
        public function default(): string
        {
            $this->insureValue();
            return self::DATA[$this->value]['default'];
        }
    
        public function display(): string
        {
            $this->insureValue();
            return self::DATA[$this->value]['display'];
        }
    
        private function insureValue(): void
        {
            if (!isset(self::DATA[$this->value])) {
                throw new InvalidArgumentException($this->value);
            }
        }
    }
    
    echo CurrenciesEnum::RUB->code(), PHP_EOL;
    echo CurrenciesEnum::RUB->name(), PHP_EOL;
    echo CurrenciesEnum::RUB->short(), PHP_EOL;


    Вариант 2 (enum)

    <?php
    
    enum CurrenciesEnum
    {
        case RUB;
        case USD;
        case EUR;
        case GBP;
        case JPY;
        case CNY;
    
        public function code(): string
        {
            return $this->name;
        }
    
        public function name(): string
        {
            return self::getField($this->name, 'name');
        }
    
        public function short(): string
        {
            return self::getField($this->name, 'short');
        }
    
        public function ratio(): string
        {
            return self::getField($this->name, 'ratio');
        }
    
        public function default(): string
        {
            return self::getField($this->name, 'default');
        }
    
        public function display(): string
        {
            return self::getField($this->name, 'display');
        }
    
        private static function getField(string $currency, string $field): string
        {
            $data = [
                self::RUB->name => ['name' => 'Рублей', 'short' => '₽', 'ratio' => 1, 'default' => 1, 'display' => 1],
                self::USD->name => ['name' => 'Dollar', 'short' => '$', 'ratio' => 1, 'default' => 1, 'display' => 1],
                self::EUR->name => ['name' => 'Euro', 'short' => '€', 'ratio' => 1, 'default' => 1, 'display' => 1],
                self::GBP->name => ['name' => 'Pound', 'short' => '£', 'ratio' => 1, 'default' => 1, 'display' => 1],
                self::JPY->name => ['name' => '円', 'short' => '¥', 'ratio' => 1, 'default' => 1, 'display' => 1],
                self::CNY->name => ['name' => '元', 'short' => 'Ұ', 'ratio' => 1, 'default' => 1, 'display' => 1],
            ];
    
            if (!isset($data[$currency])) {
                throw new InvalidArgumentException($currency);
            }
    
            return $data[$currency][$field];
        }
    }
    
    echo CurrenciesEnum::RUB->code(), PHP_EOL;
    echo CurrenciesEnum::RUB->name(), PHP_EOL;
    echo CurrenciesEnum::RUB->short(), PHP_EOL;



    Вариант 3 (storage)


    Класс Currency
    final class Currency
    {
        public function __construct(
            readonly string $code,
            readonly string $name,
            readonly string $short,
            readonly int $ratio = 1,
            readonly int $default = 1,
            readonly int $display = 1,
        )
        {
        }
    }


    Класс CurrencyStorage
    final class CurrenciesStorage
    {
        private static self|null $instance = null;
    
        /** @var Currency[] */
        private array $currencies = [];
    
        private function __construct()
        {
        }
    
        public static function getInstance(): self
        {
            if (self::$instance === null) {
                self::$instance = new self();
            }
    
            return self::$instance;
        }
    
        public function add(Currency $currency): void
        {
            $this->currencies[$currency->code] = $currency;
        }
    
        public function has(string $code): bool
        {
            return isset($this->currencies[$code]);
        }
    
        public function get(string $code): Currency|null
        {
            return $this->currencies[$code] ?? null;
        }
    
        public function all(): array
        {
            return $this->currencies;
        }
    }


    Потом при инициализации своего модуля тебе нужно будет создать инстанс сторажда и заполнить его дефолтными значениями:
    $storage = CurrenciesStorage::getInstance();
    $storage->add(new Currency('RUB', 'Рублей', '₽'));
    $storage->add(new Currency('USD', 'Dollar', '$'));
    $storage->add(new Currency('EUR', 'Euro', '€'));


    // Получить данные по одному объекту
    echo $storage->get('RUB')->code, PHP_EOL;
    echo $storage->get('RUB')->name, PHP_EOL;
    echo $storage->get('RUB')->short, PHP_EOL;
    
    // Получить все объекты
    var_dump($storage->all());


    Данный код в объектном стиле, в IDE будут работать подсказки, у стораджа есть тайпхинтинк (соответственно туда ничего кроме currency нельзя буде запихнуть). Плюс работает инкапсуляция, т.к. свойства у currency readonly их нельзя будет изменить в другом коде
    Ответ написан
  • Как в MySQL вывести 1 если нет строки в таблице?

    Fragster
    @Fragster
    помогло? отметь решением!
    select 1 where not exists (SELECT 1
    FROM table
    WHERE id = 123);
    Ответ написан
    5 комментариев
  • Как переписать подключение к базе данных, по принципам ООП?

    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 комментариев
  • Как сортировать запрос по полям left_id, right_id?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Попытайтесь для начала выразить правило для своей сортировки на русском языке. Стандартная сортировка по двум полям звучит как "сортировать по возрастанию первого поля, строки с одинаковым значением первого поля дополнительно сортировать по возрастанию второго поля". А вы что именно хотите получить?
    Ответ написан
    5 комментариев
  • Где и как предложить идею нового свойства CSS?

    Natebash
    @Natebash
    React, Vue, Angular, Navite JS, Python / Node JS
    В каком форуме можно предложить разработчикам эту идею?

    Во первых суровые дядьки не читают хабр. А для того что бы внести что-то в css, нужно очень много иметь авторитета в комьюнити( не в комьюнити хабра), + получить апрув от разработчиков браузеров на внедрение фичи. Т.е для вас: никак, забудьте свои влажные мечты.
    Ответ написан
    2 комментария
  • Как в плагине получить имя текущего шаблона?

    $app = JFactory::getApplication();
    $template = $app->getTemplate(true);
    echo $template->template;
    Ответ написан
    Комментировать
  • Почему get_object_vars() возвращает только НЕ типизированные свойства?

    @galliard
    Потому что типизированное свойство не инициализировано. Оно int и не может принять значение null, как не типизированные. Добавь ему дефолтное значение и все сработает))
    Ответ написан
  • Почему на странице не грузятся шрифты, но ссылки правильные, ПОЛТЕРГЕЙСТ?

    dyuriev
    @dyuriev
    A posteriori
    Ща пальцем в небо ткну, ибо инфы по минимуму и приходится лишь догадываться что именно вы делаете.

    Вы открываете домен https://www.mugyarn.ru/ и там нет шрифта
    А все потому шрифт тянется с домена https://mugyarn.ru/

    Тут возникает "опачки" из-за незнания того, что кроссдоменные запросы запрещены в том числе для шрифтов.

    Cпособ 1, адекватный
    Лечится путем прописывания относительных путей до css/font/js ресурсов без домена + отказ от тега <base ... /> в контейнере <head>

    Способ 2, в вашем случае костыльный - прописывание CORS-заголовков, например, через htaccess:
    <FilesMatch "\.(ttf|woff)$">
    	Header set Access-Control-Allow-Origin "*"
    	Header set Access-Control-Allow-Methods "GET, OPTIONS"
    </FilesMatch>

    Способ 3, опять таки костыльный, но минимум телодвижений
    Воткните редирект с www.mugyarn.ru на mugyarn.ru
    Судя по сайту, качеству верстки и тд - для вас оптимальный вариант
    Ответ написан
    2 комментария
  • Как к HTML элементу добавить функцию?

    Raxen
    @Raxen
    Lead Frontend Developer, Beeline
    Вы видимо из бэкенда к нам, у нас тут немного по другому устроено, вы в коде, можете привязаться к любому элементу, прототипирование тут не нужно.

    // Создаете функцию
    function myFunc() {
      console.log('Функция сработала');
    }
    
    // Добавляете слушателя событий к нужному элементу
    document.querySelector('div').addEventListener('click', myFunc);
    // Клик по первому диву в разметке
    
    // Или ко всем 
    document.querySelectorAll('div').map(item => item.addEventListener('click', myFunc);)
    // Клик по любому диву в разметке


    Что ваша функция должна выполнять и при каких условиях срабатывать?
    Ответ написан
    3 комментария
  • Как узнать с помощью Chrome Dev Tools какой Event в JS меняет свойства элемента?

    Alexious_sh
    @Alexious_sh
    Если меняется непоследственно аттрибут style, или заменяется класс, то можно повесить breakpoint на изменение атрибутов. Просто нажать ПКМ на нужном элементе в дереве, и выбрать Break On/Attributes Modifications. Выполнение скрипта будет останавливаться при любой попытке изменить аттрибуты элемента, и в правой колонке будет виден стек вызовов.
    Ответ написан
    Комментировать
  • Как поставить для SVG вместо fill - gradient?

    RAX7
    @RAX7
    <svg>
      <!-- Градиент -->
      <linearGradient id="linear-gradient">
        <stop offset="0%" stop-color="gold"/>
        <stop offset="100%" stop-color="teal"/>
      </linearGradient>
    
      <!-- Фигура с градиентной заливкой -->
      <rect fill="url(#linear-gradient)"
            width="100%" height="100%"/>
    </svg>

    css.yoksel.ru/svg-gradients
    Ответ написан
    1 комментарий
  • Как на jQuery выполнить функцию после нескольких AJAX запросов?

    twobomb
    @twobomb
    Добавь переменную счетчик равную количеству этих самых ajax запросов.
    Типа
    var _ajaxLoaded = $('ul > li').length;
    создай в функцию типа
    function checkLoaded(){
         if(--_ajaxLoaded <= 0){
             //все аяксы выполнены
         }else{
            //Осталось выполнить _ajaxLoaded аяксов...
          }
    }

    Ну и вызывай эту функцию в каждом done
    ....done(function(data){
    /*...*/
    checkLoaded();
    });
    Ответ написан
    Комментировать