• Как дешифровать текст с ключом?

    Lynn
    @Lynn
    nginx, js, css
    $ echo -n 'hello habr' | openssl enc -a -aes-256-ecb -K 4446323738323245364331303639424446323738434435393532324536333130
    GoMz9XzmRJ3m5QKwxuIceA==


    $ echo  'GoMz9XzmRJ3m5QKwxuIceA==' | openssl enc -a -aes-256-ecb -K 4446323738323245364331303639424446323738434435393532324536333130 -d
    hello habr


    У вас ключ хоть и написан как будто это HEX, но на самом деле это обычные буквы и их надо привести в HEX для openssl

    Например вот так:
    $ echo -n DF27822E6C1069BDF278CD59522E6310 | xxd -pu -c 32
    4446323738323245364331303639424446323738434435393532324536333130
    Ответ написан
    3 комментария
  • Сто́ит ли использовать RAID встроенный контроллер материнской платы?

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

    drygdryg
    @drygdryg
    Python-разработчик
    Можно использовать систему инициализации Systemd. Напишите unit-файл такого вида:
    [Unit]
    Description=My Script Service
    After=multi-user.target
    
    [Service]
    User=user  # Имя пользователя, от имени которого будет запускаться команда, указанная в ExecStart
    WorkingDirectory=/home/user/program  # Директория, в которую будет осуществлён переход перед запуском
    ExecStart=/home/user/program/venv/bin/python /home/user/program/webui.py
    Restart=always  # Всегда перезапускать скрипт при его падениях
    
    [Install]
    WantedBy=multi-user.target

    и сохраните его в директории /etc/systemd/system с расширением .service, например, /etc/systemd/system/my_program.service.

    Здесь не используется скрипт activate для активации виртуального окружения, но вместо этого указывается полный путь к интерпретатору Python внутри этого виртуального окружения.
    Также важно указывать абсолютные пути к файлам и директориям, даже несмотря на то, что задана рабочая директория WorkingDirectory.
    Если ваш скрипт опирается на сетевые соединение, в секции Unit в качестве After задайте network-online.target вместо multi-user.target:
    After=network-online.target

    После этого перезагрузите конфигурацию Systemd:
    sudo systemctl daemon-reload
    И запустите сервис с добавлением в автозагрузку:
    sudo systemctl enable --now my_program.service
    Ответ написан
    2 комментария
  • Как отправить сообщение с Linux на windows в локальной сети?

    Adamos
    @Adamos
    Берешь первый попавшийся вирус, переименовываешь его в Тебе_сообщение_лошара.exe и кидаешь в расшаренную папку.
    Дефендер делает стойку на файлик и показывает юзеру его название.
    Никаких сторонних программ ;)
    Ответ написан
    Комментировать
  • Как выбрать архитектуру автономного веб-приложения?

    @tyxeo
    дальний знакомый Мурыча
    здесь это описано: https://habr.com/ru/articles/160477/

    не используй indexedDB - это неудобно
    используй библиотеку localForage https://habr.com/ru/companies/nordavind/articles/2...
    Ответ написан
    Комментировать
  • Как сделать анимацию курсора под текстом?

    MrDecoy
    @MrDecoy Куратор тега CSS
    Верставший фронтендер
    Можно конечно отключать poiner-events, но если включать его для текста, то это всё равно приведёт к той же проблеме. Что под текстом не будет работать.

    Поковырял немного:


    Основное что изменил - отслеживание событий mousemove не на канвасе, а на всей секции и e.offsetX на e.clientX
    Ответ написан
    1 комментарий
  • Как выводить несколько значений подряд при клике?

    neuotq
    @neuotq
    Прокрастинация
    Ваш код грязный конечно, даже стили немного.
    Вот я тоже набросал грязное решение. Вам я бы рекомендовал немного переверстать, но в целом(обратите внимание я добавил pointer-events none на .types-select__option-text в css на кодпене это видно)
    Саму идею я думаю вы поймёте и под себя переделаете. Ниже код и кодпен.

    //Данные по содержанию меню
    const furnTypes = [
      {
        'id' : 1,
        'title' : 'Офисная&nbsp;<span>меб</span>ель'
      },
      {
        'id' : 2,
        'title' : 'Техника / сантехника'
      },
      {
        'id' : 3,
        'title' : 'Сборка кухни'
      },
    ];
    
    //Каждое активно может быть только один раз
    const activeMenuItems =   new Set();
    
    const clickHandler = e => {
      if(activeMenuItems.add(parseInt(e.target.getAttribute("furn-id"))) ) {
        //Если поменялся перестроим меню
        updateActiveMenuItems(activeMenuItems);
      }  
    };
    
    //Строим меню на основе данных items, вставляем в target
    //на элементы вешаем событие clickHandler
    buildSelectMenu = (target, items, clickHandler) => 
    {
      //создаем родителя
      const parentUl = document.createElement("ul");
      parentUl.classList.add('types-select__options');
      //Каждый из пунктов
      items.forEach(
        item => {
          const childLi = document.createElement("li");
          childLi.classList.add('types-select__option');
          childLi.setAttribute('furn-id', item['id']);
          childLi.addEventListener("click",clickHandler);
          const childTextBlock = document.createElement("div");
          childTextBlock.classList.add('types-select__option-text');
          // Лучше потом на setHtml заменить, но пока нет поддержки
          childTextBlock.innerHTML = item['title'];
          childLi.appendChild(childTextBlock);
          parentUl.appendChild(childLi);
        }
      )
      //Запихиваем туда куда нужно
      target.appendChild(parentUl);  
      return parentUl; 
    }
    
    const updateActiveMenuItems = ids => {
      
      const parent = document.querySelector('.types-select__active-items');
      parent.innerHTML = '';
      ids.forEach( id => {
        const curItem = furnTypes.find( el => el['id'] === id)
        const activeMenuItemEl = document.createElement("div");
        const activeMenuItemTitleEl = document.createElement("span");
        activeMenuItemTitleEl.innerHTML = curItem['title'];
        const activeMenuItemdeleteButtonEl = document.createElement("button");
        //Лучше через текстовую ноду
        activeMenuItemdeleteButtonEl.innerHTML = 'x';
        activeMenuItemdeleteButtonEl.setAttribute('active-furn-id', curItem['id']);
        
        activeMenuItemdeleteButtonEl.addEventListener("click", e => {
          //Чтобы кликалась не взирая на клик событие родителя
          if(e && e.stopPropagation) e.stopPropagation();
          
          if(activeMenuItems.delete(parseInt(e.target.getAttribute("active-furn-id"))) ) {
            //Если поменялся перестроим меню
             updateActiveMenuItems(activeMenuItems);
          } 
        }); 
        
        activeMenuItemEl.appendChild(activeMenuItemTitleEl);
        activeMenuItemEl.appendChild(activeMenuItemdeleteButtonEl);
        parent.appendChild(activeMenuItemEl);
        
      })
      
    }
    
    // Строим меню
    const furnitureMenu = buildSelectMenu(
      document.querySelector('#furnitureMenu'), 
      furnTypes, 
      clickHandler
    );
    
    document.querySelector('.types-select__btn')
      .addEventListener("click", e => {
        // Странное имя класса, наверное должн быть types-select__menu_active
        document.querySelector('.types-select__menu').classList.toggle("_active");
    } )


    Ответ написан
    1 комментарий
  • Как скачать документ, книгу с защищенного сайта(только чтение) (Для примера взял книгу с открытым доступом)?

    moonz
    @moonz
    web developer | seo | design
    Я обычно такие задачи решаю на selenium, попроси ChatGPT, написать тебе код. При открытии страницы скорее всего там и скрипты есть, которые подгружать будут страницы налету, по этому тут без эмуляции браузера никак.
    Ответ написан
    Комментировать
  • Как удалить папки в домашней директории Linux?

    jamakasi666
    @jamakasi666 Куратор тега Linux
    Просто IT'шник.
    Вы не пользуетесь, а софт пользовательский вполне пользуется. Как пример директория downloads будет стартовой если программа выведет диалог сохранения файла(брайзер или телеграм например). Если директория не определена то с шансом 50\50 тебя выкинет в корень системы или корень пользовательской директории.
    Аналогично с templates , если ее нет то во всех файловых менеджерах в пункте меню new file будет пусто, если есть то тот же офисный пакет создаст шаблоны текстовых и табличных файлов.
    Documents аналогично downloads только для офисных пакетов и при сохранении файлов.
    В windows абсолютно идентичная система построена и в домашней директории пользователя также есть эти директории.
    Можно изменить их место назначения если они так сильно мешают. Но без них обретете неудобства в самых неожиданных местах.
    Ответ написан
    Комментировать
  • Как удалить папки в домашней директории Linux?

    axifive
    @axifive
    Software Engineer
    Смотрите тут:
    https://freedesktop.org/wiki/Software/xdg-user-dirs/
    https://wiki.archlinux.org/title/XDG_user_directories
    Вот конфиги:
    $HOME/.config/user-dirs.dirs
    /etc/xdg/user-dirs.conf
    Ответ написан
    Комментировать
  • Как перезаписывать кэш пользователя сайта когда он заходит на страницу?

    delphinpro
    @delphinpro Куратор тега PHP
    frontend developer
    На компе можно просто держать консоль открытой (не забыть там включить галочку Disable cache, которая на вкладке Network)
    На телефоне можно открывать страницу в приватной вкладке, правда после изменений вкладку придется переоткрывать.

    А можно каждый раз менять URL загружаемых ресурсов, добавляя рандомный параметр

    <link href="styles.css?random_string">
    В php
    <link href="styles.css?<?=time()?>">

    Можно менять параметр только если файл изменился.
    <link href="styles.css?<?=md5_file(путь_к_файлу/styles.css)?>">
    <link href="styles.css?<?=filemtime(путь_к_файлу/styles.css)?>">
    Ответ написан
    1 комментарий
  • Почему система не грузится после уменьшения диска?

    @nikweter Автор вопроса
    Системный администратор
    А дело вовсе не в efi.
    Просто если разметка gpt, нельзя конец диска взять и выкинуть, там хранятся данные - бэкап таблицы разделов вроде. Решил переносить на диск меньшего размера.
    С gparted и clonezilla у меня не получилось перенести данные, потом система не грузилась. Пришлось по старинке - dd if=/olddisk of=/newdisk И после еще нагуглил восстановление данных таблицы разделов через gdisk /dev/sdX и там x - расширенный режим, и в нем - е.
    Все загрузилось, работает.
    Но, блин, коряво как-то.
    Ответ написан
    Комментировать
  • Как на локальной linux машине с lemp организовать поддомены?

    Acidter
    @Acidter
    Файл hosts не принимает wildcard, такая строчка не будет обработана как вы ожидание. Для работы всех поддоменов их необходимо указывать в hosts в явном виде или использовать свой dns-сервер. Также можно попробовать воспользоваться скриптом из первого ответа https://serverfault.com/questions/118378/in-my-etc...
    Ответ написан
    Комментировать
  • Как сделать полный бэкап системы (Linux) rsync или tar?

    @MaxKozlov
    Не знаю зачем, но можете посмотреть rear
    https://relax-and-recover.org/
    там и tar и rsync и всё что хочешь
    С зералами на btrfs только не дружит, а так - идеальный велосипед
    Ответ написан
    Комментировать
  • Как сделать службой скрипт?

    Lopar
    @Lopar
    системный администратор
    sc.exe create <new_service_name> binPath= "<path_to_the_service_executable>"


    Кавычки и пробел после binPath= обязательны.
    Ответ написан
    Комментировать
  • Как настроить работу с историей команд в Linux?

    @sergiodev
    У меня так настроено в ~/.bashrc:

    # History search with Up/Down keys.
    if [[ $- == *i* ]]; then
        bind '"\eOA": history-search-backward'
        bind '"\e[A": history-search-backward'
        bind '"\eOB": history-search-forward'
        bind '"\e[B": history-search-forward'
    fi
    Ответ написан
    1 комментарий
  • Где хранятся токены passport.js по умолчанию?

    @Quty
    На стороне сервера JWT нигде не хранится. В этом его суть. Конечно, иногда прибегают к хранения JWT в белом/чёрном списке токенов, но это уже детали.

    JWT в себе должен содержать достаточную информацию о пользователе для его аутентификации и авторизации.

    Если коротко, то JWT — это токен, содержащий JSON объект с полями, заложенными в этот объект при выдаче токена, и подписью. Подпись нужна для того, чтобы сервер (issuer, эмитент) мог удостовериться, что указанный при запросе клиента токен был действительно выдан этим (или доверенным) сервером (эмитентом).

    Например, если взять токен
    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.6-NqQiSlSYgbZ-x31JH6g17DkFiTu04VM6CPiptriB0
    то можно заметить, что он состоит из трёх частей, разделенных точкой.
    Первая часть eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 — это заголовок. JSON-объект, закодированный в base64 строку, содержащий информацию о самом токене: тип и алгоритм шифрования, используемый для получения подписи. Если раскодировать строку, то получается {"alg":"HS256","typ":"JWT"}.
    Вторая часть
    eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
    — это полезная нагрузка. JSON-объект, который был сформирован сервером (эмитентом) при создании токена. Точно так же как и заголовок является base64 стрококой. Если раскодировать, то в данном примере получается
    {"sub":"1234567890","name":"John Doe","iat":1516239022}

    Третья часть 6-NqQiSlSYgbZ-x31JH6g17DkFiTu04VM6CPiptriB0 — это подпись. В данном примере подпись сформирована с помощью алгоритма HS256 (что указано в первой части токена) следующим образом:
    HMACSHA256(
      base64UrlEncode(header) + "." +
      base64UrlEncode(payload),
      jwt-secret
    )

    В данном случае секретом для подписания и валидации JWT является строка jwt-secret. Секретный ключ неизвестен клиенту, поэтому он не может сам сформировать JWT с любыми данными. Точнее может, но не может к этим данным сделать валидную подпись, так как не знает секрет. Сервер же секрет знает, поэтому может вычислить подпись из первых двух частей токена и сравнить её с третьей частью.

    Обычно во вторую часть токена (payload) помимо информации о пользователе попадает техническая информация о токене. Например, iat (issued at) — время, когда токен был выдан. Или exp (expiration time) — время, после наступления которого токен станет истёкшим. JWT библиотеки используют exp и при валидации токена выдают ошибку, если указанное время уже прошло.
    Ответ написан
    Комментировать
  • Как сделать дополнительные мониторы по сети?

    @t38c3j Автор вопроса
    Оказалось все просто)
    xrandr --addmode VIRTUAL1 1920x1080
    xrandr --output VIRTUAL1 --mode 1920x1080
    x11vnc -rfbport 25901 -clip 1920x1080+1920+0 -forever

    А дальше уже на второй машине ставим VNC клиент и подключаемся.
    По аналогии команд выше можно еще один дисплей добавить.
    Ответ написан
    1 комментарий
  • Как задать параметр в URL?

    orlov0562
    @orlov0562
    I'm cool!
    гугли window.location.hash

    с его помощью можешь прочитать параметр btn из url вида
    site.com/url#btn

    дальше останется только в момент загрузки страницы проверять, есть такой параметр или нет и делать нужные действия, примерно так
    window.addEventListener('load', function() {
        if (location.hash=='#btn') {
             console.log('Press btn');
        }
    })


    а динамически формировать ссылку можно так
    let url = document.location.href + '#btn';
    Ответ написан
    Комментировать