Задать вопрос
  • Каким образом создание новых экземпляров класса тормозит работу браузера на примере слайдера?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    С чем это связано?
    С тем, что рендеринг элементов не бесплатный.

    Как с этим бороться?
    Инициализировать 5, а не 50. Остальные - по явному запросу пользователя, выгружая при этом из памяти старые ненужные.
    Ответ написан
    Комментировать
  • Как удалить первое слово?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    $str = 'Toster классный сайт';
    $final_str = count(explode(' ',$str,2))>1?explode(' ',$str,2)[1]:'';
    var_dump($final_str);
    Ответ написан
    Комментировать
  • Как компилировать только те файлы, которые используются в проекте gulp?

    delphinpro
    @delphinpro Куратор тега Gulp.js
    frontend developer
    на любой случай жизни.

    ну и зачем это?
    Ставьте в проект только нужные пакеты из того же npm и собирайте их.
    Используйте современный javascript чтобы легко импортировать пакеты.
    Используйте babel для сборки.

    npm install jquery

    import $ from 'jquery';
    
    $('.selector');


    gulp.task('js', function () {
        return gulp.src('src/app.js')
            .pipe(babel())
            .pipe(terser()) // uglify устарел давно
            .pipe(gulp.dest('dist/js')),
    });
    Ответ написан
    Комментировать
  • Как понять блокчейн?

    CityCat4
    @CityCat4
    Жил да был черный кот за углом...
    в чем его преимущества

    Ни в чем. Просто модная хайповая тема. Так же как "облака". Поначалу пытались впихнуть как всегда невпихуемое, кто-то поднял бабла, кто-то прогорел, после того как хайп прошел и стала ясна область применения - сидят тихо и не жужжат, потому что область применения оказалась очень узкой и весьма специфичной...
    Ответ написан
    4 комментария
  • Как сохраненить сессии между rest-запросами в spring boot?

    @Akela_wolf
    Extreme Programmer
    Сессии работают следующим образом: при создании сессии сервер отсылает заголовок Set-Cookie браузеру в котором сохраняет значение идентификатора сессии (JSESSIONID). При последующих запросах браузер посылает "печеньку" обратно серверу и тот, получив идентификатор, может восстановить сессию из своего хранилища. Если "печеньки" заблокированы, то возможно передать jsessionid как query param запроса. Но это уже требует дополнительных телодвижений на стороне клиента.

    Так как вы упоминаете REST, то предположу использование XmlHttpRequest в браузере (напрямую или опосредованно через какую-то библиотеку), который не посылает заголовок Cookie по умолчанию.

    Поэтому вариантом решения может быть отправка идентификатора сессии явным образом как query param с именем jsessionid.

    Однако, использование сессии в REST запросах - в целом не очень хорошая практика, так как REST предполагается быть stateless. А в случае сессии у вас появляется состояние на стороне сервера. Если сессия нужна только для аутентификации клиента, то посмотрите на использование токенов, таких как JWT, которые позволяют решить эту проблему без наличия сессии на стороне сервера.
    Ответ написан
    Комментировать
  • Как держать все используемые копии базы данных в актуальном состоянии?

    Не нужно ничего велосипедить.
    У MySQL же есть репликация из коробки:
    https://habr.com/ru/post/56702/
    https://dev.mysql.com/doc/mysql-replication-excerp...
    Настроить можно разное. Постоянное соединение не нужно.
    Ответ написан
    Комментировать
  • Недостатки видеоуроков?

    saboteur_kiev
    @saboteur_kiev Куратор тега IT-образование
    software engineer
    Нужен огромный и продолжительный труд, чтобы написать приличную книжку.
    Чтобы в ней было не 10 страниц, а много хорошего материала, с примерами, с задачами, с изложением. Оформить, вычитать, отредактировать, договориться с издателем, выпустить, получить какую-то отдачу.
    Хорошую книгу ты читаешь долго. Месяц, два, год. Перечитываешь.

    Текст ты читаешь в удобном для себя темпе, легко пересматривая и перечитывая абзацы.
    Остановившись на странице книги, ты можешь просто просмотреть глазом предыдущую страницу и продолжить чтение. С видео так не получается - из головы вылетает все, и надо просматривать как минимум пару минут перед этим, если отлучился на час-два.

    В любой момент можно в тексте что-то найти, что-то подсмотреть в быстром темпе, и даже в бумажном варианте для этого достаточно просто содержания. А в электронном виде оттуда легко копируется текст, команды, код, конфиги.
    Перемотка в видео так не работает. Закладки на видео в виде справочника не работают. Сам себе заметки в виде видео ты не пишешь, не выписываешь, и переписать из книги проще, чем из видео.

    Также видео делать сложнее, чем писать текст. Гораздо дольше. Гораздо дороже.
    Редактирование видео вещь в разы более муторная, поэтому чаще просто переснимают короткие блоки, а это опять таки непросто.
    То есть сделать видео с таким же качеством материала и с такой же плотностью материала - в десятки раз дороже по всем ресурсам - деньги, время, оборудование.
    И при этом никто не будет смотреть месяц видео (160 часов, например). Никто не будет делать поиск внутри видео, закладки на нужные отрывки и использовать видео как справочник.

    Перенести материал из книги перенести в видео - это непомерный труд с одной стороны и совершенно невостребованный с другой стороны.
    А поэтому никто не делал, не делает и не будет делать видео с таким же наполнением материалом, как это можно сделать в тексте.

    Видео - это разок посмотреть на чей-то практический материал, разок посмотреть как это делает кто-то другой.

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

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

    Я бы не говорил, что самое главное - книга.
    Самое главное - документация и усидчивость.
    Но книга - это первый компромисс между сухой документацией и хорошим изложением но таким же глубоким и достаточным, плюс примеры и задачи, плюс систематизация, чего в документации нет.

    P.S. Все вышесказанное касается разработки и администрирования. В "визуальных" профессиях, возможно видео может давать гораздо больше. Например хореография, фехтование, музыка, возможно дизайн. Но там тоже множество книг, которые дают фундаментальную информацию лучше, чем видео.

    P.S. Одним из самых важных минусов видео я считаю то, что ты не можешь получать информацию в комфортном для себя темпе, с возможностью быстро перечитать слово/фразу и обдумать ее. Сам читаю множество лекций, и эта проблема, когда скажешь 2-3 предложения быстрее, чем обычно и половина учеников отваливается с бессмысленным взгядом. Так на живом курсе ты можешь обратить на это внимание и перефразировать, а записанное видео уже не изменишь.
    Ответ написан
    1 комментарий
  • Пользуетесь ли вы кириллицей в Git?

    yarkov
    @yarkov
    Помог ответ? Отметь решением.
    Как в команде договоритесь - так и будет. Для себя пишу на русском. На работе тоже. На прошлой работе писали на английском, хотя компания тоже российская.
    Ответ написан
    Комментировать
  • Стоит ли переплатить за процессор?

    @Akela_wolf
    Extreme Programmer
    Смотрите, главное различие между ними это количество ядер
    У 5600G - 6 ядер/12 потоков
    У 5700G - 8 ядер/16 потоков

    Еще у 5700 более мощная видеокарта встроена.

    Собственно далее вопрос: у вас, в вашей нагрузке будет чем утилизировать эти дополнительные 2 ядра/4 потока? Это либо задачи, которые хорошо параллелятся, либо большое количество процессов (виртуальные машины, например). Я в свое время взял 1700 первого поколения именно из-за этих дополнительных ядер по сравнению с 1600. Собственно никаких проблем с пиковой загрузкой проца не имею. Может быть хватило бы и 6 ядер, может быть и 4. Но, поскольку комп я брал надолго (и мне его более чем хватает на данный момент), то решил брать максимально доступную конфигурацию (был еще Threadripper, но его цена чуть более чем неприличная).

    Занимаюсь разработкой на Java и время от времени играю в не особо требовательные игры.

    Лично я при таких условиях взял бы 5700, но решать разумеется вам.
    Ответ написан
    Комментировать
  • Достаточна ли защита сайта php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Что такое "файл с защитой от sql-инъекций"? Это звучит как "я никогда не заражусь спидом, потому что когда я занимаюсь сексом, то в соседней комнате у меня специальная тумбочка с кучей презервативов". Презерватив надо использовать в процессе, а не держать в отдельной тумбочке. Только тогда он поможет.

    "хотя это можно прописать и в .htaccess" - это совсем какой-то идиотизм, причем заведомо вредный

    "Всё, начиная с php авторизации, защищено от прямого доступа" - это тоже, хотя просто бесполезный

    ".htaccess. На самом деле это очень полезный файл" - полезность файла .htaccess сильно преувеличена. Это скорее костыль для калек, которые не умеют настраивать систему правильно. Не говоря уже о том, что в современных веб-серверах такого файла вообще нет.

    В целом, из того что описано, помимо нескольких бессмысленных телодвижений, проблемы я здесь вижу по трем пунктам
    1. Какая-то странная "защита от инъекций", которая скорее всего ни от чего не защищает, а только портит данные
    2. Большой вопрос, как именно "генерируется" код доступа.
    3. Вообще не упомянута защита от XSS. Ну и CSRF если уж на то пошло

    Плюс вероятные дыры в конкретной реализации, когда на словах вроде правильно, но в коде реализовано криво. Типа location в качестве защиты страниц от доступа. Ну и в целом надо код видеть. Может быть там какое-нибудь гениальное incude $_GET['page'];
    Ответ написан
    3 комментария
  • Может ли не серверное железо перекрыть серверное или как собрать новый сервер?

    hint000
    @hint000
    у админа три руки
    В принципе задача построения оптимальной железяки на базе десктопных комплектующих вполне решаема (на базе серверных комплектующих тоже вполне решаема). Но нужно учесть немало деталей.

    Во-первых, каков бюджет?

    Во-вторых, почему не рассматриваете горизонтальное масштабирование вместо вертикального? Для кучки виртуальных машин было бы очень логично не менять железо, а рядом со старым поставить новое.

    В-третьих, готовы ли пожертвовать IPMI? Это нормально во многих случаях, но всё же это должно быть осознанное решение.

    В-четвёртых, максимальный объём памяти на десктопных материнках. Если захочется больше, чем 128 ГБ, то Socket LGA2066 или TRX4 (но что-то не верю, что TRX4 впишется в бюджет). Если достаточно 128 ГБ, то можно взять AM4 или LGA1700. Есть ровно одна причина, по которой можно выбрать LGA1700 - это возможность в первых рядах героически броситься на амбразуру DDR5 (пока дорогая память и пока небольшой выигрыш в производительности). Если нет склонности к героизму или нет возможности разбрасываться деньгами, то на сегодня оптимально будет AM4.

    В-пятых, количесво ядер. Сейчас у вас два 4-ядерных процессора. На десктопном железе будет один процессор. Он должен превосходить старые не только по частоте, но и хотя бы не уступать по количесву ядер и потоков. Т.е. хотя бы 8C/16T (и даже такой минимальный вариант уже даст выигрыш).

    В-шестых, помните про интегрированный GPU. В серверном решении он был на материнке. Обращайте внимание на наличие или отсутствие графических ядер в десктопных процессорах. Часто при большом количестве ядер встоенная графика отсутствует, в этом случае нужно не забыть поставить дискретную "затычку" (что-нибудь вроде GT710).

    В-седьмых, при апгрейде с использованием серверного корпуса нужно помнить, что блок питания имеет форм-фактор не ATX. Просто убедитесь, что есть подходящий запасной БП. Это ATX можно купить на каждом углу.
    Ответ написан
    Комментировать
  • Какой бы вы посоветовали ПК из этих трех?

    @rPman
    НИКОГДА не покупай готовые сборки у тех, кто заинтересован в сбыте комплектующих. В эту сборку напихают говно, без вариантов, либо за твои хотелки возьмут тройную цену.

    Готовое железо ВСЕГДА дороже самосбора из тех же комплектующих. Если это не так, значит где то как то вас пытаются обмануть, подсунув брак или БУ. Когда ты покупаешь готовую сборку ты даже не можешь проверить, новое железо или БУ подчистили. Особенно это стало актуально с тотальным дифицитом видеокарт. Ты уверен что магазин не майнил на этой видяхе? Телевизоры и ноутбуки они легко крутят включенными на стеллажах, и мало кто скажет об этом покупателю или предложит 30% скидку за это, ибо БУ. Чем компьютер хуже? а денег срубить позволяет больше чем сомнительная реклама.

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

    p.s. кризис и дифицит сделал свое черное дело, с ценами будет пиздец еще несколько лет
    Ответ написан
    Комментировать
  • Какой бы вы посоветовали ПК из этих трех?

    @Drno
    Сборки шлак. И завышены сильно
    Проще, дешевле и надежнее самому собрать. Я думаю у Вас есть знакомый чел, который за 5ру соберет всё по красоте...
    Ответ написан
  • Почему не отправляется POST через Vue Resource?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Мужик, если ты используешь vue-cli, то рандомные файлы которые ты просто куда-то кинул не появятся магическим образом во встроенном сервере. Для публично доступных файлов предназначена папка public.
    Однако, встроенный сервер vue-cli не умеет и не должен уметь исполнять php, это совершенно из другой оперы языки и технологии.
    Для разработки тебе надо поднять отдельный php сервер на отдельном порту и через vue devserver proxy пробросить на него подобные запросы.
    Для прода - тебе надо настроить прод сервер по вкусу.
    Ответ написан
    1 комментарий
  • Как правильно покрыть тестами приведенный в примере код?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    https://github.com/index0h/php-conventions#7-тести...

    Конкретно по коду:
    1. Не стоит упарываться по разбиванию всего на отдельные методы. Фактическую сложность вы не уменьшите, вместо этого заставите инженера, который будет это смотреть бегать по классу что бы связать как-то ваши однострочники. Конкретно в вашем случае стоит сделать всего один метод getValue, а то что вы разбрасали по защищенным - запихнуть в getValue.

    2. Инстансы db и timedate стоит передавать в конструктор явно, а от статики отказываться, на сколько это возможно.
    Ответ написан
    4 комментария
  • Как frontend разработчику тестировать локальный сервер?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    хм а в чем проблема?

    в вашем проекте создаются папки
    sql
    sql\up
    sql\down

    В up складываются миграции по наращиванию
    В down по убыванию
    Формат пусть будет номер тикета (дата) + описание

    Сами файлы делятся на 2 типа модификация схемы и наполнение \удаление данных

    В итоге подтянув изменения вы просто выполняете скрипт(ы) и получаете актуальную базу
    Ответ написан
    Комментировать
  • Как написать bash скрипт, который будет запускать файл, который поддерживает аргументы командной строки?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    #!/bin/bash
    python3 get-movies.py "$@"


    Тут запись "$@" означает передать все аргументы скрипта как они есть, причём с правильным экранированием, то есть "Termninator 2" будет передано как "Terminator 2", а не "Terminator" "2".

    upd: Ещё добавлю, что для такого простого случая может больше подойти другой подход: передача интерпретатора через шебанг. Надо первой строкой файла get-movies.py указать:

    #!/usr/bin/env python3

    В этом случае запуск скрипта будет приводить к вызову /usr/bin/env python3 get-movies.py со всеми остальными параметрами.
    Ответ написан
    Комментировать
  • Редирект с http на https без слэша в конце, как реализовать в nginx?

    fzfx
    @fzfx
    18,5 дм
    редирект на https://test.com/ без слеша на конце никак не сделать, поскольку в URL после имени домена в обязательном порядке идёт слеш.
    Ответ написан
    2 комментария
  • Как добавить данные в БД через HTML-форму?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Сначала учимся правильно соединяться.
    В случае mysqli это
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $link = mysqli_connect($host, $user, $pass, $db_name);
    $link->set_charset("utf8mb4");

    И никаких ужасов с "Соединение не установлено" тут быть не должно.

    После этого выполняем запрос INSERT. Причем запросы мы всегда пишем так, чтобы данные в БД попадали отдельно от самого запроса. Это непреложное правило, которое надо соблюдать всегда.
    Для этого надо
    • Заменить все переменные в запросе на специальные маркеры, которые называются плейсхолдеры или параметры, а по сути - просто знаки вопроса
    • Подготовить запрос к исполнению с помощью функции prepare(). Эта функция принимает строку запроса и возвращает экземпляр специального класса stmt, с которым в дальнейшем и производятся все манипуляции
    • Привязать переменные к запросу.
    • Выполнить подготовленный ранее запрос с помощью с помощью execute()

    В mysqli это будет так
    $sql = "INSERT INTO `events` (`title`, `discription`, `date`, `img`) VALUES (?,?,?,?)";
    $stmt = $link->prepare($sql);
    $stmt->bind_param("sssss", $title, $discription, $date, $path);
    $stmt->execute();

    bind_param() принимает в качестве параметров все переменные, которые должны попасть в запрос, в том же самом порядке, в котором стоят плейсхолдеры в запросе. Но кроме того, сначала в этой функции должны быть указаны типы для всех переменных, в виде строки, где тип переменной обозначается одной буквой. То есть букв в этой строке должно быть ровно столько, сколько дальше будет переменных. К счастью, можно особо не париться с типами и для всех переменных указывать тип "s".

    И тогда никаких ошибок запроса уже никогда не будет. Не говоря уже о том что при любых других вариантах твой сайт поломает любой пятиклассник.

    Весь код, который добавляет запись в БД, должен быть расположен ДО любого вывода.
    После обработки запроса методом POST необходимо перенаправить клиента куда-нибудь методом GET и завершить работу скрипта. Делается это функцией header с заголовком location: . после которой написать exit;
    Соответственно, никаких ужасов с "Запись добавлена".

    Кстати, немного удобнее с БД работать не через mysqli, а чрез PDO, Тем более что там колупаться с bind_param не нужно, а можно сразу отправить все данные в execute

    Подключение
    $host = '127.0.0.1';
    $db   = 'test';
    $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);


    Выполнение запроса
    $sql = "INSERT INTO `events` (`title`, `discription`, `date`, `img`) VALUES (?,?,?,?)";
    $stmt = $link->prepare($sql);
    $stmt->execute([$title, $discription, $date, $path]);
    Ответ написан
    1 комментарий