Задать вопрос
  • Как в выборке sql обратиться к предыдущей записи?

    @alexalexes
    Устройство | Серийный | Дата получения | Местоположение
    Ноутбук | 12349647 | 21.03.25 | Склад
    Ноутбук | 12349647 | 15.01.25 | Сотрудник_1
    Ноутбук | 12349647 | 30.08.24 | Склад
    Ноутбук | 12349647 | 22.05.24 | Сотрудник_2

    Такой способ записи с опорой на дату для построения исторической цепочки архитектурно не устройчив.
    Чтобы историческая цепочка стала устойчивой, нужно вводить указатель на следующую или предыдущую запись.
    ID | Устройство | Серийный | Дата получения | Местоположение | Следующий ID
    11 | Ноутбук | 12349647 | 21.03.25 | Склад | null
    8 | Ноутбук | 12349647 | 15.01.25 | Сотрудник_1 | 11
    5 | Ноутбук | 12349647 | 30.08.24 | Склад | 8
    1 | Ноутбук | 12349647 | 22.05.24 | Сотрудник_2 | 5

    При всех CRUD операциях работы с историческим списком нужно корректно записывать next_id в предыдущей записи.
    Можно произвольно перезаписывать все не служебные поля (кроме id и next_id), вплоть до серийника, и это не разрушит историческую цепочку.
    Последняя запись в исторической цепочке всегда будет next_id is null.
    Чтобы действительно корректно получать историческую цепочку, нужен рекурсивный запрос, но в простейших случаях достаточно сортировать цепочку по next_id.
    Ответ написан
    Комментировать
  • Как на VPS сервере нажать чтобы файл сохранился?

    @pfg21
    ex-турист
    гугли "как выйти из vi" :)
    Ответ написан
    Комментировать
  • Как протянуть оптический линк между двумя соседними домами?

    @Akina
    Сетевой и системный админ, SQL-программист.
    либо взять готовый патчкорд, что мне более предпочтительно, но тогда вопрос, пролезут ли коннекторы...

    Если нужен ОДИН линк - то это предпочтительное решение.

    Коннекторы FC/SC/ST/etc. без проблем протягиваются через 20-ю гофру, а LC - даже через 16-ю. Одиночный разъём, само собой, если патч дуплексный, разберите его и протягивайте по одному волокну. Но, если возможно, лучше используйте не гофру, а 20-мм трубу для электропроводки.

    Берите патч как минимум с 2 метрами запаса. Лучше большое кольцо на одной из сторон, чем натянутый патч.

    какая оптика с какими коннекторами?

    Смотрите коннекторы на сетевых картах или SFP+ модулях. Если есть возможность выбирать - берите с ферулой 2,5 (обычно это FC). Полировка - предпочтительно UPC.

    Модули SFP+ должны соответствовать как типу волокна патча, включая тип полировки, так и быть совместимы со свичами.

    Я бы рекомендовал SM (одномодовое) волокно и WDM-модули (работающие по одному волокну, покупаются строго комплементарной парой). Но тут уж на вкус и цвет...

    какие могут быть неочевидные ламеру нюансы?

    Хренова гора...
    Ответ написан
    Комментировать
  • Как протянуть оптический линк между двумя соседними домами?

    @66demon666
    Сетевой админ, АТС-админ
    Ко всему прочему, я бы еще подумал над тем, действительно ли нужна именно оптика. Гигабит прокачать и по меди можно, я просто не могу представить сценарии, где трафик между домами достигал бы больших объемов. Если только вы там не хостинг гаражный разворачиваете
    Ответ написан
    5 комментариев
  • Как протянуть оптический линк между двумя соседними домами?

    @Disel0k
    Подойти к монтажникам МТС, Ростелеком и тд, назвать пароль "Мужики, можете мне 50 м оптики кинуть" получить отзыв "Сколько дашь". Предложить х2 от того, что планировал на материалы потратить. В ходе работ ненавязчиво поинтересоваться "Ребят может водички, чаю бутеров?" (!!!Могут согласиться, идя на такой шаг нужно иметь запас водички ,чая и буреров). Трубу закапывать не станут, а вот протянуть ,сварить, просветить-потестить и все остальные вопросы решить с учетом всех нюансов - это они могут.
    Ответ написан
    Комментировать
  • Есть ли простой Task менеджер для малого бизнеса?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    3 комментария
  • Как одновременно сделать две записи в разных таблицах в Laravel?

    Оборачиваем всё в транзакцию, да и всё. И тогда создадутся либо обе записи, либо ни одной. Так мы не расплодим сироток в случае ошибочных данных.

    Модели:

    <?php
    
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Factories\HasFactory;
    use Illuminate\Foundation\Auth\User as Authenticatable;
    use Illuminate\Notifications\Notifiable;
    
    class User extends Authenticatable
    {
        use HasFactory, Notifiable;
    
        /**
         * @var array<int, string>
         */
        protected $fillable = [
            'name',
            'email',
            'password',
        ];
    
        /**
         * Получить данные пользователя, связанные с этим пользователем.
         */
        public function userData()
        {
            return $this->hasOne(UserData::class);
        }
    }


    <?php
    
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Factories\HasFactory;
    use Illuminate\Database\Eloquent\Model;
    
    class UserData extends Model
    {
        use HasFactory;
    
        /**
         * @var array<int, string>
         */
        protected $fillable = [
            'phone_number',
        ];
    
        /**
         * Получить пользователя, которому принадлежат эти данные.
         */
        public function user()
        {
            return $this->belongsTo(User::class);
        }
    }


    Создание записей

    use App\Models\User;
    use App\Models\UserData;
    use Illuminate\Support\Facades\DB;
    use Illuminate\Support\Facades\Hash;
    
    DB::transaction(function () {
        // 1. Создаем пользователя (User)
        $user = User::create([
            'name' => 'Вася Пупкин',
            'email' => 'uasya@fsb.ru',
            'password' => Hash::make('12345'),
        ]);
    
        // 2. Создаем данные пользователя (UserData) и связываем их с пользователем
        $user->userData()->create([
            'phone_number' => '112',
        ]);
    });


    P.S. ИМХО: ненавижу Eloquent и весь паттерн Active Record. Как по мне, вместо него лучше уж просто чистым SQL пользоваться. А вот если нужна мощная ORM, то уж лучше воспользоваться Doctrine. Там вообще такой проблемы нет, и всё делается автоматически.
    Ответ написан
    4 комментария
  • Как в командной строке сохранить полный путь к файлу для вставки его в другом месте при смене директории?

    xotkot
    @xotkot
    хорошо есть и хорошо весьма
    вот простой вариант
    создаём две bash функции cp1 и cp2
    первая сохраняет полный путь к файлу
    вторая копирует файл по сохранённому пути в текущую(.) директорию
    cp1(){ echo "$PWD/$1" > /tmp/cp1;}
    cp2(){ cp "$(cat /tmp/cp1)" .;}

    чтобы каждый раз в новой сессии не прописывать можно закинуть их в конец файла .bashrc(если используете bash)
    использование банальное
    cp1 ФАЙЛ
    cd куда-то/там
    ...
    cp2

    для mv всё будет аналогично
    Ответ написан
    Комментировать
  • Почему переменная не перезаписывается?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    private string $requestUri = '/';
    ...
    if ($this->requestUri !== '/') {

    То есть, при инициализации экземпляра вы записываете в requestUri слэш, а перезаписываете значение только если там не слэш. Соответственно, условие всегда ложно и тело условия не выполняется.
    Ответ написан
    Комментировать
  • Как в командной строке сохранить полный путь к файлу для вставки его в другом месте при смене директории?

    Vindicar
    @Vindicar
    RTFM!
    Если задача всплывает часто, освой Midnight Commander или иной двухпанельный файловый менеджер. Он запускается в терминальном режиме и прекрасно подходит для таких ситуаций.
    Ответ написан
    Комментировать
  • Проблемы с компьютером, в чем может быть неисправность?

    ProgrammerForever
    @ProgrammerForever
    Учитель, автоэлектрик, программист, музыкант
    Обычно такое возникает при полумертвом блоке питания. Возможно вздулись конденсаторы там от нагрева.
    Ответ написан
    5 комментариев
  • Скачивание файла средствами php без ожидания загрузки файла?

    Vamp
    @Vamp
    Скорее всего дело в сессии. Попробуйте вставить вызов session_write_close() непосредственно перед выводом файла:
    header('Pragma: private');
    header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
    header('Content-Length: ' .filesize($file));
    session_write_close(); // <--- вот здесь         
    readfile($file);
    exit();
    Ответ написан
    Комментировать
  • Обновление версии PHP с 7.4.33 до 8.3 насколько необходимо?

    В первую очередь надо смотреть на то, когда заканчивается поддержка у той или иной технологии. И у PHP 7.4 она закончилась ещё в 2022 году.

    Это означает, что дыры в безопасности уже никто чинить не будет. А там их немало. И сайт будет всё проще и проще взломать с каждым новым днём.

    Возможно, ваш хостер имеет возможность внедрять патчи расширенной поддержки от Zend, которые так же закончатся уже в 2026 году.

    Поэтому, обновить стоит. Но перед этим надо убедиться в работоспособности сайта с этой версией.

    1. Полный бэкап файлов и базы. Это даже не обсуждается. Если у хостера бэкап не купили, купите.

    2. Обновите всё, что сможете до последних версий. Разработчики часто добавляют совместимость для новых версий PHP в эти последние версии. Это касается и ядра WordPress, и плагинов, и темы, если она была куплена, а не писалась с нуля. Если тему писали с нуля, то можно связаться с разработчиком, чтобы он дал вам точный ответ, будет ли тема работать, или сделал бы поддержку 8.3

    3. После обновления плагинов и тем проверьте в их документации совместимость этих обновленных версий с PHP 8.3.

    4. Используйте плагин проверки совместимости, чтобы узнать, будет ли ваш сайт работать на 8-х версиях PHP. Он старый, но именно с этой задачей поможет справиться. https://wordpress.org/plugins/php-compatibility-ch...

    5. Самым идеальным вариантом проверки всего этого дела было бы купить у хостера на месяц такой же хостинг и там опробовать сайт на новой версии. Это закроет все галочки в вашем списке сомнений. Если нет возможности этого сделать, то хотя бы на локальной машине запустите сайт на новом PHP. Можно ещё и дебаг-режим включить, чтобы иметь полный расклад в логах.

    6. Если всё это сделали, можно пробовать менять версию PHP на основном хостинге. Делать это лучше когда посетителей меньше всего, но поддержка хостера ещё не спит. Если не сработает, то верните всё из бэкапа.

    7. Далее вам нужно наблюдать за работоспособностью и стараться периодически обновлять ядро и плагины, чтобы следующий апгрейд прошел более гладко. Если вы всё-таки решили купить второй хостинг на 5 шаге, то вы можете его даже и оставить как раз для целей проверки обновлений и каких-то новых фич. Не забудьте его тогда закрыть от роботов на всякий случай, чтобы предотвратить индексирование поисковиками.
    Ответ написан
    1 комментарий
  • Видит ли провайдер то, что я скачал оффлайн страницу сайта в Google chrome на телефоне?

    anthtml
    @anthtml
    Системный администратор программист радиолюбитель
    Что значит оффлайн страницу?
    То что сохранено из кэша браузера, то сохраняется из кэша браузера и официально сайту не видно (псевдо телеметрию гугла в расчет не берем)
    PS: Открою секрет. Страница в большинстве случаев скачивается из интернета в папку %temp% и уже оттуда показывается в браузере.
    Ответ написан
    4 комментария
  • Как общаются микросервисы в реальных проектах?

    @Everything_is_bad
    Как общаются микро-сервисы в реальных проектах?
    вот через упомянутые тобой Rabbit MQ или Kafka и общаются, не понятна проблема.
    Общая рекомендация, поучаствовать сначала хотя бы в создании монолита, а только потом можно будет смотреть в сторону микросервисов.
    Ответ написан
    5 комментариев
  • Есть web-сервер на php или nodejs который поддерживает работу с .htaccess?

    @bodial
    не совсем корректный вопрос как указали выше. Но вот для него решение на докер: контейнер с апачем и пробросом папки под корень сервера. в www создаете index файл и .htaccess
    docker-compose:
    services:
      web:
        build: .docker/web
        volumes:
          - ./www:/var/www/html
        ports:
          - 3000:80


    dockerfile:
    # Use an official PHP runtime
    FROM php:8.2-apache
    
    # Установка необходимых пакетов и PHP-расширений
    RUN apt-get update && apt-get install -y \
        zip \
        unzip \
        libpng-dev \
        libjpeg-dev \
        libfreetype6-dev \
        libzip-dev \
        cron \
        nano \
        && docker-php-ext-install zip gd mysqli pdo pdo_mysql
    
    # Установка Xdebug
    RUN pecl install xdebug && docker-php-ext-enable xdebug
    
    # Установка Composer
    RUN curl -sS https://getcomposer.org/installer | php -- \
        --install-dir=/usr/local/bin --filename=composer
    
    # Копирование конфигов
    COPY php.ini /usr/local/etc/php/conf.d/php.ini
    COPY xdebug.ini /usr/local/etc/php/conf.d/xdebug.ini
    COPY sites.conf /etc/apache2/sites-available/000-default.conf
    
    # Указание рабочей директории
    WORKDIR /var/www/html/
    
    # Изменение прав доступа
    RUN chown -R www-data:www-data /var/www/html

    можете убрать модули которые не нужны

    sites.conf
    <VirtualHost *:80>
        DocumentRoot /var/www/html
        <Directory /var/www/html>
            Options Indexes FollowSymLinks
            AllowOverride All
            Require all granted
        </Directory>
    </VirtualHost>
    Ответ написан
    Комментировать
  • Могу ли я прогнать через password_hash пароли в бд, которые md5, чтобы не сломалась авторизация?

    @alexalexes
    Смену способа хеширования пароля вы можете провернуть только при участии каждого пользователя, в два этапа.
    1 этап.
    Делаете патч в функцию авторизации.
    Когда пользователь авторизуется, проверяете, что заполнено поле по хешу новой функции.
    Если оно заполнено по новой функции, то все проверки верности пароля проводите с ней, поле старой функции игнорируете.

    Если хеш по новой функции не заполнен, то проверяете, что пароль верен с точки зрения хеша старой функции. Если верен пароль, то записываете хеш по новой функции, так как у вас есть исходный пароль.
    Так вы накапливаете базу пользователей, которые часто заходят. И для них вы бесшовно меняете хеши.

    2 этап
    Когда число поменянных хешей примерно будет равно числу активных пользователей за определенный период, то в патче запрещаете пользоваться старым хешем для проверки паролей, отправляете пользователя принудительно восстанавливать пароль по другим учетным данным, например, по эл. почте.
    При восстановлении доступа пароль хешировать новой функцией.
    Все, с этого момента можно избавиться от логики использования старого хеша.
    Ответ написан
    Комментировать
  • Можно ли настроить запросы к php через вебсокет и http одновременно?

    3. Вебсокет и unix сокет - это совершенно разные вещи. Websockets - это протокол обмена информацией по TCP/IP.
    Как работают websockets:
    - Клиент начинает с простого HTTP запроса с просьбой апгрейднуться до websockets.
    - Сервер соглашается, и тогда между Клиентом и Сервером устанавливается постоянное TCP/IP соединение, по которому данные могут ходить туда-обратно по протоколу websockets уже без кучи церемониальных ритуалов, как принято в обычном HTTP.

    1. Изначально PHP совершенно не подходил для постоянного соединения, потому что он создавался как скриптовый язык. Скрипт должен был отработать один раз и почистить все следы своего выполнения. Поэтому создатели особо не заботились об утечках памяти и т.д. В результате было очень обременительно создавать постоянно-живущие процессы, необходимые для websockets. Но в настоящее время PHP очень сильно развивается, разработчики уделяют очень много внимания такому сценарию использования языка. PHP стал производительнее и гораздо надёжнее работает с памятью. Однако, напрямую реализовывать долгоживущий сервис самому всё еще муторно, поэтому лучше всего использовать отличные сторонние фреймворки/библиотеки.

    2. Что можно использовать:
    - Ratchet
    - Swoole / OpenSwoole
    - Workerman

    У каждой из этих асинхронных библиотек/фреймворков есть свои особенности и нюансы. Но это всё очень хорошо описано в их документации, так что просто следуйте тому, что там написано, и не волнуйтесь. Советовать что-то одно не буду, потому что на вкус и цвет все фломастеры разные, и выберете то, что будет отвечать вашим конкретным задачам.
    Ответ написан
  • Как сделать веб-скрейпинг сайта?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Нанять программиста.
    Ответ написан
    Комментировать
  • Как двумерный массив записать в одномерный php?

    Ge1i0N
    @Ge1i0N
    Пройдите по второму массиву в цикле и запишите как вам надо в первый массив. Запишите значения ключа Field как ключ, а info как значение, как вы и описали.

    В чем сложность, что именно не получается?
    Ответ написан
    Комментировать