• Как отнять в php одно время от другого, если изначально значения времени являются строками?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    print DateTime::createFromFormat('H:i', '15:00')
        ->diff(DateTime::createFromFormat('H:i', '14:30'))
        ->format('%H:%i');
    // 00:30
    Ответ написан
    Комментировать
  • PHP компилятор работает нативно в Visual Studio Code или нужно докачивать что-то?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    PHP работает безо всяких компиляторов, это интерпретируемый язык.
    Ответ написан
    Комментировать
  • Насколько резонно подключать библиотеки для таких вещей как модалка, маски и тд?

    Igor_307
    @Igor_307
    Фрилансер
    Все нужно плясать от того насколько процентов используется функционал этого готового решения. На примере той же модалки, если от нее использовать только показать блок, то можно обойтись и без него.
    В любом случае чем меньше размер вашего js тем более лучшие показатели CWV от сайта можно получить
    Ответ написан
    Комментировать
  • Как создать gitignore файл на маке при выгрузке проекта на gitHub?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Файл .gitignore создают не при отправке готовой работы во внешний репозиторий, а задолго до того. Желательно даже вообще до создания первого локального коммита. Это обычный текстовый файл и он создаётся как и любой другой файл с кодом. Мак тут ничем не отличается от винды или линукса. Разве что Finder не показывает имена начинающиеся с точки. Если нажать command + shift + ., то увидишь скрытые файлы. Но мы всё равно создаём файлы в текстовом редакторе или в IDE, а не в проводнике. И редактор и Git этот файл видят в любом случае.
    Ответ написан
    2 комментария
  • Как сказать процессору "выполни это"?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как сказать процессору «выполни это»?

    Превратить это в бинарник для начала и посмотреть, что там. Это можно (было бы) сделать командой xxd -r dump, но в твоём дампе странный порядок байтов в словах. Можно сначала перевернуть байты, а потом прогнать через xxd:
    sed 's/\([^ ]*\)/\1/;s/ \(..\)\(..\)/ \2\1/g' < dump | xxd -r > bin
    . Прогнав полученный код через дизассемблер можно понять (по переходу к адресу 0x7c05), что это код для бут-сектора:
    $ objdump -b binary -m i8086 -D bin        
    
    bin1:     file format binary
    
    Disassembly of section .data:
    
    00000000 <.data>:
       0:   ea 05 7c 00 00          ljmp   $0x0,$0x7c05
       5:   31 c0                   xor    %ax,%ax
    ...

    Дальше можно записать этот код в образ диска и попытаться загрузиться с него:
    $ head -c 254 /dev/zero >> bin
    $ printf "\x55\xaa" >> bin
    $ qemu-system-i386 -hda bin -d in_asm,exec -D log

    Поискав в созданном логе адрес 7c00 можно увидеть, что код делает при выполнении:
    ----------------
    IN:
    0x00007c00:  ea 05 7c 00 00           ljmpw    $0x0:$0x7c05
    
    Trace 0: 0x7f7a98164f00 [00000000/00007c00/0x40]
    ----------------
    IN:
    0x00007c05:  31 c0                    xorw     %ax, %ax
    0x00007c07:  8e d8                    movw     %ax, %ds
    0x00007c09:  8e d0                    movw     %ax, %ss
    
    Trace 0: 0x7f7a98165040 [00000000/00007c05/0x40]
    ----------------
    IN:
    0x00007c0b:  bc 00 7c                 movw     $0x7c00, %sp
    
    Trace 0: 0x7f7a98165180 [00000000/00007c0b/0x48]
    ----------------
    IN:
    0x00007c0e:  88 16 db 7c              movb     %dl, 0x7cdb
    0x00007c12:  31 c0                    xorw     %ax, %ax
    0x00007c14:  8e c0                    movw     %ax, %es
    0x00007c16:  bb 00 80                 movw     $0x8000, %bx
    0x00007c19:  8a 16 db 7c              movb     0x7cdb, %dl
    0x00007c1d:  b6 00                    movb     $0, %dh
    0x00007c1f:  b1 02                    movb     $2, %cl
    0x00007c21:  b5 00                    movb     $0, %ch
    0x00007c23:  b0 30                    movb     $0x30, %al
    0x00007c25:  e8 53 00                 callw    0x7c7b
    
    Trace 0: 0x7f7a98165280 [00000000/00007c0e/0x40]
    ----------------
    IN:
    0x00007c7b:  b4 02                    movb     $2, %ah
    0x00007c7d:  cd 13                    int      $0x13

    -- он хочет загрузить 48 секторов начиная со второго с текущего диска в память по адресу 0x8000, потом делает какую-то скучную фигню, а потом…
    ----------------
    IN:
    0x00007c2f:  fa                       cli
    0x00007c30:  0f 01 16 f4 7c           lgdtw    0x7cf4
    0x00007c35:  0f 20 c0                 movl     %cr0, %eax
    0x00007c38:  66 83 c8 01              orl      $1, %eax
    0x00007c3c:  0f 22 c0                 movl     %eax, %cr0
    
    Linking TBs 0x7f7a98167580 [00007c2b] index 0 -> 0x7f7a981676c0 [00007c2f]
    Trace 0: 0x7f7a981676c0 [00000000/00007c2f/0x40]
    ----------------
    IN:
    0x00007c3f:  ea 44 7c 08 00           ljmpw    $0x8:$0x7c44
    
    Trace 0: 0x7f7a981678c0 [00000000/00007c3f/0xc0]
    ----------------
    IN:
    0x00007c44:  66 b8 10 00              movw     $0x10, %ax
    0x00007c48:  8e d8                    movl     %eax, %ds
    
    Trace 0: 0x7f7a98167a00 [00000000/00007c44/0x90]
    ----------------
    IN:
    0x00007c4a:  8e c0                    movl     %eax, %es
    
    Trace 0: 0x7f7a98167b40 [00000000/00007c4a/0x90]
    ----------------
    IN:
    0x00007c4c:  8e e0                    movl     %eax, %fs
    0x00007c4e:  8e e8                    movl     %eax, %gs
    0x00007c50:  8e d0                    movl     %eax, %ss
    
    Trace 0: 0x7f7a98167c80 [00000000/00007c4c/0x90]
    ----------------
    IN:
    0x00007c52:  bc 00 c0 07 00           movl     $0x7c000, %esp
    
    Trace 0: 0x7f7a98167dc0 [00000000/00007c52/0xb8]
    ----------------
    IN:
    0x00007c57:  e8 a4 03 00 00           calll    0x8000

    …переключается в защищённый режим и вызывает только что загруженный код.

    как например запихнуть это в exe файл?

    в exe-файл это запихнуть можно, но в таком виде как есть -- это бесполезно, потому что этот код привязан к абсолютным адресам.
    Ответ написан
    Комментировать
  • Как правильно связать php сайт с mysql?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    На частные вопросы ответили в комментариях, поэтому ответим на вопрос из заголовка.

    Чтобы соединить сайт с mysql, в РНР вообще-то есть два API - mysqli и PDO. Несколько лет назад с mysqli вообще невозможно было нормально работать, но на данный момент они выровнялись, хотя PDO все равно удобнее, по трем причинам
    1. Единый интерфейс при работе с различными СУБД (неактуально, если mysql для нас является синонимом слова база данных)
    2. Набор функций-хелперов для получения данных из БД в различных форматах (при желании легко воспроизводится вручную)
    3. Именованные плейсхолдеры (для некоторых это главная причина использовать PDO)

    Но в целом, как я говорил выше, сейчас можно использовать любое API. Главное - не использовать тот древний говнокод, который приведён в вопросе.

    1. Создаём файл`config.sample.php` куда кладем все настройки приложения, в том числе базы данных
    return [
    	'db' => [
    		'host' => '127.0.0.1',
    		'username' => '',
    		'password' => '',
    		'dbname' => '',
    		'port' => 3306,
    		'charset' => 'utf8mb4',
    	],
    ];

    2. В файле, который включается во все скрипты сайта, добавляем код
    if (!file_exists('config.php'))
    {
    	throw new \Exception('Create config.php based on config.sample.php');
    }
    $config = require 'config.php';

    3. И дальше в этом же файле пишем собственно нормальный код подключения к БД
    либо к mysqli
    // включаем режим информирования об ошибках
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    // подключаемся к серверу
    $dbc = $config['db'];
    $db = new \mysqli($dbc['host'], $dbc['username'], $dbc['password'], $dbc['dbname'], $dbc['port']);
    // не забываем установить кодировку, чтобы не было ошибок с кракозябрами
    $db->set_charset($dbc['charset']);

    либо к PDO
    $options = [
        \PDO::ATTR_ERRMODE            => \PDO::ERRMODE_EXCEPTION,
        \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
        \PDO::ATTR_EMULATE_PREPARES   => false,
    ];
    $dbc = $config['db'];
    $dsn = "mysql:host=$dbc[host];dbname=$dbc[dbname];charset=$dbc[charset];port=$dbc[port]";
    $pdo = new \PDO($dsn, $dbc['username'], $dbc['password'], $options);

    После того как будет освоена работа с системой контроля версий (а по-хорошему это надо было сделать уже давно) добавляем config.php в файл .gitignore
    Таким образом на каждом хосте, где исполняется этот код, будет собственный файл с настройками, создаваемый по образцу из config.sample.php

    Да, и Очень Важное Дополнение:
    почему нельзя сделать 1 соединение для сайта и не тратить каждый раз время на коннект к БД?

    Никогда не следует переживать по поводу воображаемых проблем. Вот только когда создание коннекта каждый раз станет реальной проблемой, только тогда и начинать переживать по этому поводу и искать пути решения (спойлер: никогда).
    Ответ написан
    14 комментариев
  • Как правильно клонировать приватный репозиторий github?

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

    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
    //COPY01 EXEC PGM=IEBGENER
    в чем его преимущества

    Ни в чем. Просто модная хайповая тема. Так же как "облака". Поначалу пытались впихнуть как всегда невпихуемое, кто-то поднял бабла, кто-то прогорел, после того как хайп прошел и стала ясна область применения - сидят тихо и не жужжат, потому что область применения оказалась очень узкой и весьма специфичной...
    Ответ написан
    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. кризис и дифицит сделал свое черное дело, с ценами будет пиздец еще несколько лет
    Ответ написан
    Комментировать