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

    makarovpro
    @makarovpro
    Fullstack Developer
    Используйте лучше CMS хоть Wordpress! Это будет лучше чем конструктор по подписке и без ограничений!
    Вы всегда остаётесь владельцем без ограничений своей CMS и локально и на сервере в отличие от конструктора!
    Ответ написан
    Комментировать
  • Как понять, что конструктор нормально подходит именно под большой сайт?

    @alexalexes
    Все просто, когда неудобства перевешивают достоинства CMS, то CMS сначала обрастает оптимизационными костылями, а потом наступает понимание, что нужна собственная разработка, которая устраняет эти костыли.
    CMS обеспечивают быстрый запуск проекта, но никогда не дает возможности быть полноценной платформой его функционирования. Это инструмент прощупывания рынка, если проект взлетел, то рефакторинга его платформы не избежать.
    Ответ написан
    1 комментарий
  • Как правильно располагать абстрактные классы, имеющие разные ответственности?

    fenrir1121
    @fenrir1121
    Начни с документации
    С точки зрения чистой архитектуры стоило бы переложить интерфейсы туда, где лежат их реализации ( в одну директорию), но добавить в каждый слой, подслой core (т. е. ядро именно для этого слоя), куда бы мы и положили интерфейсы?
    Можно хоть так хоть так. Кто-то кладет все "вертикально" (все слои одного домена), кто-то "горизонтально" (по слоям). У обоих подходов есть плюсы и минусы.

    2) класс, ответственный за конвертацию пользовательского объекта в словарь и обратно
    3) класс, ответственный за то, по какому алгоритму будет формироваться новый id для добавления записи в бд;
    Придумают же тащить джаву в питон... По пункту 2 достаточно описать Protocol и просто реализовывать методы в классе без всей этой ментальной гимнастики. По 3 пункту вообще не понимаю в чем смысл целого класса чтобы формировать id, но как будто достаточно просто создать функцию и при необходимости заменить ее реализацию.
    Все интерфейсы, не имеющие двух реализаций не нужны.
    Все интерфейсы обмазанные Any не нужны.
    Все интерфейсы, которые приходится менять потому что надо поправить параметры реализации не нужны.
    Ответ написан
    Комментировать
  • Какова причина появления чёрных полос на мониторе Samsung?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Исходя из того, что полосы на всю ширину матрицы предполагаю, что проблема где-то в в шлейфе контроллёр->матрица или в каком-то контакте этого шлейфа. Чуть менее вероятно, что проблема в самом контроллёре — может где-то какая-то нога у него отвалилась или что-то внутри сдохло. На дефект самой матрицы не похоже. В любом случае тут прямая дорога в СЦ. В домашних условиях без навыков и специального оборудования такое не починить. Если руки достаточно прямые, то можно снять заднюю крышку и попробовать аккуратно пошевелить шлейф матрицы во время работы монитора — если проблема в нём, то полосы могут как пропасть, так и увеличиться или могут появиться какие-то новые артефакты.
    Ответ написан
    4 комментария
  • Как сделать автокоммит текстового файла в 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. На сторе тоже не экономить - лучше проц взять более раннего поколения, но на стор брать новые диски.
    Ответ написан
    Комментировать