Задать вопрос
  • Как сделать автокоммит текстового файла в git при сохранении в Notepad++?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Можно сделать прямо внутри Notepad++ через плагин PythonScript.

    У PythonScript есть событие NOTIFICATION.FILESAVED, на которое можно повесить git add и git commit. Отдельный watcher или NppExec для этого не нужен.

    Проверил у себя — работает.

    Установка и настройка

    1. Открыть Plugins → Plugins Admin....
    2. Найти PythonScript, отметить его и нажать Install. Notepad++ после установки перезапустится.
    3. Открыть Plugins → PythonScript → Configuration....
    4. Для Initialisation выбрать ATSTARTUP. Заодно полезно включить Automatically open console on error, чтобы ошибки скрипта сразу были видны.
    5. Открыть Plugins → PythonScript → Scripts и startup (User). Если пользовательского startup.py ещё нет — создать через Plugins → PythonScript → New Script файл с именем startup.py.
    6. Вставить в него следующий код и сохранить:


    from Npp import notepad, NOTIFICATION
    import os
    import subprocess
    import datetime
    
    
    def on_save(args):
        filename = notepad.getBufferFilename(args["bufferID"])
        file_dir = os.path.dirname(filename)
    
        try:
            repo = subprocess.check_output([
                "git", "-C", file_dir,
                "rev-parse", "--show-toplevel"
            ]).strip()
        except subprocess.CalledProcessError:
            return
    
        rel_file = os.path.relpath(filename, repo)
    
        subprocess.call([
            "git", "-C", repo,
            "add", "--", rel_file
        ])
    
        changed = subprocess.call([
            "git", "-C", repo,
            "diff", "--cached", "--quiet",
            "--", rel_file
        ])
    
        if changed != 0:
            message = "autosave " + datetime.datetime.now().strftime(
                "%Y-%m-%d %H:%M:%S"
            )
    
            subprocess.call([
                "git", "-C", repo,
                "commit",
                "-m", message,
                "--", rel_file
            ])
    
    
    notepad.callback(on_save, [NOTIFICATION.FILESAVED])


    После перезапуска Notepad++ обработчик будет регистрироваться автоматически.

    При каждом сохранении файла скрипт:

    1. получает путь сохранённого файла;
    2. через git rev-parse --show-toplevel определяет его Git-репозиторий;
    3. добавляет в индекс только этот файл;
    4. создаёт commit, только если содержимое действительно изменилось.


    Если открытый файл находится не в Git-репозитории, ничего не происходит.

    Разумеется, git должен быть установлен и доступен через PATH, а файл должен находиться внутри уже созданного Git-репозитория.

    Есть только один нюанс: стабильная версия PythonScript, устанавливаемая через Plugins Admin, всё ещё использует встроенный Python 2.7. Поэтому скрипт написан без конструкций современных версий Python.

    Если Git нужен только ради истории изменений одного текстового файла, то есть ещё более простой вариант — встроенный в Notepad++:

    Settings → Preferences → Backup → Backup on save → Verbose backup


    Он сохраняет отдельную предыдущую версию файла при каждом сохранении.

    И ещё: локальный Git без push — это история версий, но не полноценный backup. При потере диска вместе с рабочей папкой пропадёт и каталог .git. Если нужна именно резервная копия, репозиторий надо периодически отправлять во внешнее хранилище.
    Ответ написан
    3 комментария
  • Как сделать объект enum, если есть строка-вариант?

    @rPman
    начиная с 8.3 Dynamic class constant fetch
    $var = Dire::{$string};

    upd. для старее версии:
    $var = constant(Dire::class . '::' . $string);

    и само собой вариант с eval (не рекомендую, если $string не проверять на эксплоиты, но заработает в совсем уж любых версиях)
    $var = eval('return Dire::' . $string . ';');
    Ответ написан
    Комментировать
  • Как сделать объект enum, если есть строка-вариант?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Добавлю способы
    enum Dire: string {
        case Left = 'Left';
        case Right = 'Right';
    }
    
    $string = 'Left';
    $const = Dire::class . '::' . $string;
    $var = defined($const) ? constant($const) : null;
    var_dump($var); // enum(Dire::Left)


    enum Dire: string {
        case Left = 'Left';
        case Right = 'Right';
        public static function tryFromName(string $name): ?self
        {
            foreach (self::cases() as $case) {
                if ($case->name === $name) {
                    return $case;
                }
            }
            return null;
        }
    }
    
    $string = 'Left';
    $var = Dire::tryFromName($string);
    var_dump($var); // enum(Dire::Left)

    Ну и через рефлексию
    enum Dire: string {
        case Left = 'Left';
        case Right = 'Right';
    }
    
    $string = 'Left';
    $refEnum = new ReflectionEnum(Dire::class);
    $var = $refEnum->hasCase($string) ? $refEnum->getConstant($string) : null;
    var_dump($var);  // enum(Dire::Left)
    Ответ написан
    Комментировать
  • Какое безопасное напряжение ОЗУ ддр4?

    opium
    @opium
    Просто люблю качественно работать
    1.35В — просто типичное XMP-напряжение, не граница безопасности. JEDEC для DDR4: 1.2В, формально XMP уже разгон сам по себе. Но 1.37-1.38В сверх профильных 1.35 это всего 0.02-0.03В, для большинства чипов без экзотики некритично, хотя гарантии для неизвестной китайской памяти нет. А 4 планки требуют больше напряжения и таймингов ожидаемо: контроллер и разводка платы сильнее нагружены на четырёх слотах, чем на двух.

    Прогони TM5 или MemTest86 без единой ошибки. Если нестабильно, лучше ослабить тайминги или сбросить частоту, чем вслепую поднимать VCCSA/VCCIO (Intel) или SoC voltage (AMD).
    Ответ написан
    2 комментария
  • Каково минимальное количество разделов для чистой установки Kubuntu 26.04?

    @rPman
    Для запуска linux нужно минимум 2 раздела (gpt efi: efi+root или gpt legacy dos: biosboot+root).
    linux efi может храниться в windows efi разделе, нет нужны создавать разные.

    p.s. настоятельно рекомендую держать загрузочный раздел и настройки linux на другом физическом диске (хоть на флешке или интересный вариант networkboot на своем сервере). Сам корень диска храните где угодно (помню был вариант в файле на ntfs диске)

    Причина, майкрософт уже 'по ошибке' (никогда в это не поверю) удаляла и ломала загрузочные записи linux, нет никаких причин не делать так же в будущем.
    Ответ написан
    Комментировать
  • В чем разница между git fetch и git pull? Когда что использовать?

    opium
    @opium
    Просто люблю качественно работать
    fetch тянет данные с сервера и обновляет origin/main, а твою текущую ветку не трогает: можно спокойно глянуть что нового - git log HEAD..origin/main или git diff HEAD..origin/main, и решить самому - мержить или ребейзить. pull это тот же fetch плюс сразу merge (или rebase если настроено), поэтому конфликты вылезают только на этом шаге, сам fetch их вызвать не может. Юзай fetch когда хочешь сначала посмотреть что прилетело, pull когда сразу готов принимать.
    Ответ написан
    Комментировать
  • Какой бренд батарейки CR2032 на данный момент лучше всего для материнской платы?

    @Drno
    они плюс \ минус одинаковые.

    более дорогие батарейки просто дольше могут лежать в коробке ДО начала использования
    Ответ написан
    Комментировать
  • В BIOS исчезла запись Linux (GRUB) в Boot Priority, как её восстановить?

    opium
    @opium
    Просто люблю качественно работать
    файлы grub целы, слетела именно nvram-запись — сброс cmos, апдейт прошивки или fastboot винды сносят её независимо от того что лежит на esp. переустанавливать grub не надо, грузись с любого линукс-live и добавь запись руками:
    sudo efibootmgr --create --disk /dev/sdX --part N --loader /EFI/GRUB/grubx64.efi --label "grub"
    , диск и номер раздела N смотри через lsblk. после этого пункт вернётся и в Boot Priority
    Ответ написан
    2 комментария
  • Почему зависают прерывания клавиатуры (IRQ1) после первого нажатия при переходе на GOP в самописной ОС (x86_64)?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    При старте экран чёрный (так и задумано на этом этапе), но клавиатура реагирует на клавишу ESC — код отрабатывает корректно.

    Это потому, что код крутится вот в этом месте, опрашивая клавиатуру и ожидая нажатия клавиши без участия прерываний.

    Прерывания будто блокируются после первого-второго вызова.

    Это так, но они блокируются не из-за обработчика прерываний клавиатуры, а из-за dummy_handler_asm, который вызывается по таймеру, но не завершается отправкой кода окончания обработки прерывания в PIC.
    Вот такое изменение фиксит эту проблему:
    diff --git a/system/drivers/interrupts.asm b/system/drivers/interrupts.asm
    index 75ea06c4bc2f..17ac87fa6b06 100644
    --- a/system/drivers/interrupts.asm
    +++ b/system/drivers/interrupts.asm
    @@ -98,5 +98,7 @@ dummy_handler_asm:
         push rax
         mov rax, 0xFEE000B0
         mov dword [rax], 0
    +    mov al, 0x20
    +    out 0x20, al
         pop rax
         iretq


    Кроме того
    твой код выделяет память вызовами bs->AllocatePages(2, 4, ...), а 2 -- это AllocateAddress, т.е. запрос на выделение памяти по фиксированному тобой адресу. У меня этот код сразу возвращает ошибку, а вот bs->AllocatePages(0, 4, ...) -- работает:
    diff --git a/boot/bootloader.c b/boot/bootloader.c
    index 377e907c1728..5ae82dca7fc0 100644
    --- a/boot/bootloader.c
    +++ b/boot/bootloader.c
    @@ -59,7 +59,7 @@ EFIAPI long long efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
         // 1. Выделяем память под скрытый буфер экрана (1024 * 768 * 4 байта = 3145728 байт = 768 страниц по 4КБ)
         unsigned long long v_buffer_addr = 0;
         // 2 = EfiAllocateAnyPages, 4 = EfiRuntimeServicesData (чтобы ядро гарантированно видело эту память)
    -    long long status = bs->AllocatePages(2, 4, 768, &v_buffer_addr);
    +    long long status = bs->AllocatePages(0, 4, 768, &v_buffer_addr);
         if (status != 0) {
             while(1) { __asm__ __volatile__("hlt"); }
         }
    @@ -85,7 +85,7 @@ EFIAPI long long efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
     
         unsigned long long map_buffer = 0;
         // Выделяем временную память под саму карту памяти (округлим map_size до страниц)
    -    bs->AllocatePages(2, 4, (map_size / 4096) + 1, &map_buffer);
    +    bs->AllocatePages(0, 4, (map_size / 4096) + 1, &map_buffer);
     
         // Получаем финальную карту памяти и MapKey
         status = bs->GetMemoryMap(&map_size, (void*)map_buffer, &map_key, &desc_size, &desc_ver);
    Ответ написан
    Комментировать
  • Зачем в этой схеме блока питания резистор R4?

    @nehrung
    Не забывайте кликать кнопку "Отметить решением"!
    В вашем вопросе чувствуется сомнение - а нужен ли этот R4? Да, этот резистор необязателен, составной ЭП (который иностранцы называют схемой Дарлингтона) будет работать и без него. Существуют и транзисторы Дарлингтона (как единый электронный компонент):
    %D0%B4%D0%B0%D1%80%D0%BB%D0%B8%D0%BD%D0%B3%D1%82%D0%BE%D0%BD%D0%B0%20%D1%82%D1%80%D0%B0%D0%BD%D0%B7%D0%B8%D1%81%D1%82%D0%BE%D1%80.JPG И даже в многоступенчатых составных ЭП можно обходиться без этих резисторов:
    image-41.png
    Так зачем же он нужен? Ведь без него весь коллекторный ток первого транзистора, не ответвляясь в резистор, идёт в базу второго, коэффициенты усиления перемножаются, и от такого составника можно получить максимально возможное усиление по току. Однако максимум усиления нужен не всегда, а вот повышение стабильности работы схемы, её быстродействия, а также более симметричная обработка положительных и отрицательных полуволн входного сигнала (т.е. фактически снижение его искажений), обеспечиваемые этим резистором, часто бывают важнее.
    Ответ написан
    2 комментария
  • Как сделать скриншот второго монитора на С++?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Можно посмотреть, как это делается тут: https://source.chromium.org/chromium/chromium/src/...

    Кажется, GetDC(nullptr) уже выдает виртуальный дисплей со всеми мониторами. Потом через EnumDisplayDevices можно получить координаты нужного вам дисплея и обрезать по ним: https://source.chromium.org/chromium/chromium/src/...

    Координаты всего виртуального дисплея берутся через SM_CXVIRTUALSCREEN*: https://source.chromium.org/chromium/chromium/src/...
    Ответ написан
    Комментировать
  • Как исправить ошибки шаблона WP?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    - $attributes.=
    + $attributes =
    Ответ написан
    Комментировать
  • Как переместить неразмеченную область ext4?

    @rPman
    Конечно можно (лучше это делать, загрузившись в livecd с usb/cdrom, так как работа с файловой системой /dev/sda1 в примонтированном состоянии не рекомендуется)
    отключить swap sudo swapoff -a
    с помощью gparted удалить /dev/sda2 и /dev/sda5
    и расширить /dev/sda1, оставив место для swap
    создать новый /dev/sda2 для swap и отредактировать /etc/fstab, указав новый путь до swap
    Ответ написан
    4 комментария
  • Как хранить публичный медиа-контент сайта?

    @Drno
    вначале у себя, когда понадобится - сторонний s3. их как минимум есть несколько крупных

    яндекс \ вк \ таймвеб \ makecloud \ сбер итд...

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

    @Refguser
    Решения для бизнеса: корп.сайты, ИМ, боты и пр.
    Кроме новомодного s3 есть обычные шаред-хостинги. Для хранения можно найти за копейки.
    Но для небольшого проекта логично:
    Хранить локально в файловой системе там же, где расположен веб-сервер
    Ответ написан
    Комментировать
  • Поможете собрать компьютер для запуска виртуальных машин и коддинга?

    CityCat4
    @CityCat4
    Жил да был черный кот за углом...
    Если комп чиста под виртуалки - не делай brain fucking, бери бу сервер и ставь ESXi или Proxmox, Нафиг на серверном компе винда?
    Бу сервера можно брать тута. Если 150к - это бюджет чиста на сервак, то можно ничего себе так собрать. Главное - это конечно память и стор. На памяти не экономить, брать не менее 64G. На сторе тоже не экономить - лучше проц взять более раннего поколения, но на стор брать новые диски.
    Ответ написан
    Комментировать
  • Поможете собрать компьютер для запуска виртуальных машин и коддинга?

    @rPman
    Первое, брать процессор не старее 10-15 лет (можно конечно, если это серверные ревизии, вроде бы китайцы завалили рынок дешевыми ксеонами, но они сами по себе медленные), тогда особо не будут заметны накладные расходы на виртуализацию (к примеру в 2013 году они могли доходить до 30%, сейчас это порядка 10% но сравнивать сложно, только синтетика покажет заметные затраты).

    Второе, больше оперативной памяти, причем много это значит как можно больше. Правильно конечно от задачи исходить, но 'будут использоваться для программирования станков' совсем ничего не помогает.
    Поэтому стартовый объем - 64гб,... позволит запускать с десяток windows машин без особого напряга.

    Третье, быстрый ssd диск (рекомендую nvme но выбирать не по pci-e и гигабайтам в секунду а по основному параметру: TBW - сколько записей можно делать на диске, обычно он хорошо корелирует с надежностью модели) и достаточно большой, для хранения образов. Если одновременно будут работать несколько виртуальных машин на windows, они будут активно использовать диск, и это будет очень заметно, особенно при запуске приложений. Одна windows - это порядка 70гб (сначала будет 30гб но уже через неделю обновления доведут до максимума).
    upd. бывает что два диска может быть лучше чем один диск размера их суммарного. Независимая нагрузка на диски например.
    Еще, заранее рассматривайте хорошее охлаждение для nvme, в идеале - активную.

    Остальные комплектующие подбирать под оставшийся бюджет.

    Совершенно не обязательно брать именно серверные платформы. Они не для ваших бюджетов, да и нужны там где высокие скорости сети, требования к шарингу gpu и т.п. Выбирайте дискретную видеокарту, не стоит нагружать основную оперативную память задачами вывода видео, пусть хоть самую дешевую (но осторожно, смотрите наличие поддержки вашей версии windows, а то можно получить нежданчик с драйверами).

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

    Софт - не обязательно серверные версии windows, но обязательно pro/enterprise версии, особенно это актуально для тех кто лицензии покупает. Помним, вам придется покупать лицензию на каждую машину, запускаемую в виртуалке. Серверные ревизии позволят чуть чуть сэкономить, когда количество одновременно запущенных машин машин - десятки, но.. смотрите, а ваш софт умеет работать с серверными ревизиями ОС?
    Я бы все же рекомендовал linux (тот же debian) как хост, нервы будут целее, особенно когда начнете пробрасывать порты и железо внутрь виртуалок (бывает для станков это критично).

    p.s. если деньги компании, то покупать на avito/ozon может быть проблематично
    Ответ написан
    Комментировать
  • Как устранить микрофризы в Supermium (YouTube/чат-боты) на Windows 7 с i5-12400F и RTX 3050?

    CityCat4
    @CityCat4
    Жил да был черный кот за углом...
    Надо сразу указывать, что мать китайская, потому что обычно вопросы "почему у меня что-то не так, как должно быть" в сочетании с "китайская мать" отлетают сразу. Китайцы особо не утруждают себя соблюдением спецификаций, поэтому мать может вести себя буквально как ей вздумается.
    Ну и насчет визуала. Я с этим частично согласен, но проблема в том, что win7 и новые игры в принципе несовместимы. Поэтому если только в визуале дело (в чем я вовсе не уверен) - classic start menu, winaero tweaker - и "будет людям счастье, счастье на века" :)
    Ответ написан
    Комментировать
  • Платный прокси сервер для Телеграмма MTProto или собственный сервер — что сейчас лучше?

    @tstsd
    Пробовал оба варианта.

    Несколько платных MTProto-прокси работали нормально, но периодически возникали проблемы со стабильностью. В какой-то момент решил сравнить их с собственным сервером на VPS.

    Оказалось, что поднять свой MTProto намного проще, чем кажется. Сервер я оплачивал дольше, чем настраивал. Нашел инструкцию, где установка выполняется буквально одной командой, а весь процесс занял около 5 минут:

    Инструкция по установки своего MTProto на арендова...

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

    Если не хочется разбираться с VPS вообще, то платные решения тоже рабочий вариант. Но если сервер уже есть или планируется использовать VPS для других задач, собственный MTProto выглядит более выгодным решением.
    Ответ написан
    5 комментариев
  • Хочу попробовать стать системным аналитиком, с чего лучше начать и во сколько попытаться найти работу?

    opium
    @opium
    Просто люблю качественно работать
    Если ты не умеешь Гугл и смотреть Ютюб ты вчера был уже вне рынка, если сегодня ты не умеешь ии, ты просто никому не нужен на рынке труда
    Ответ написан
    1 комментарий