Debian, Dojo, Django, Python

Делюсь опытом в описанных технологиях. Блог в первую очередь выполняет роль памяток для меня самого.

DGrid: обработка onDoubleClick на строке

Комментариев нет

Разбор

Наткнулся на StackOverflow на вопрос, который давно мучил и меня самого: как в dgrid обрабатывать двойной клик по строке? Встроенного обработчика события onDblClick в классах библиотеки не было, поэтому я решил посмотреть, можно ли что-то сделать с помощью подручных средств.

Посмотрев код библиотеки, я обнаружил, что у класса Grid есть методы row() и cell(), возвращающие информацию о строке и ячейке соответственно при передаче в качестве параметра события, которое произошло в таблице. Главная сложность была в определении того, на что ставить обработчик. Понятно, что для тысяч строк нельзя вешать onClick() на каждую строку. В этом случае на контейнер вешают один единственный обработчик, который смотрит на то, от кого пришло событие, и уже тогда что-то делает. Всё оказалось не так уж сложно.

Расширение класса
define([
    "dojo/_base/declare",
    "dojo/_base/lang",
    "dgrid/Grid"
], function(declare, lang, Grid){
    return declare(Grid, {
        onDblClick: function(){
            /* Функция-пустышка, которая должна быть заменена на настоящую в классах,
               унаследованных от этого. Тут должна быть какая-то работа с переданным
               объектом, состоящим из трех полей:
               - id      - id записи, если есть
               - data    - полный объект из связанного с таблицей Store
               - element - DOM-элемент, на котором случился двойной клик               */
        },

        _onDblClick: function(event){
            /* Вызываем onDblClick, передав "чистый" объект с параметрами. Обычно тут 
               разработчики Dojo Toolkit рекомендуют дополнительно вызывать on.emit с
               необходимыми параметрами. На случай, если кто-то ещё должен слушать 
               события, происходящие в таблице, и как-то на них реагировать           */
               this.onDblClick(this.row(event));
        }, // _onDblClick

        postCreate: function(){
            // Установка обработчиков на построенную DOM-модель таблицы
            this.inherited(arguments);

            this.on(".dgrid-content .dgrid-row:dblclick", lang.hitch(this, "_onDblClick"));
        } // postCreate
    }); // declare
}); //define

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

Комментариев нет :

Отправить комментарий

Комментарии в исходном коде

1 комментарий

Устал искать, в каком месте удалил лишнюю скобку. Устал определять по отступу, где закончился цикл или if. Поэтому сейчас пишу код примерно так:

Расстановка комментариев
define([
    /*
     * Главное меню приложения.
     * Обработчики событий должны устанавливаться в классе Application.
     */
    "dojo/_base/array", // array.forEach в одном месте
    "dojo/_base/declare",
    "dijit/DropDownMenu",
    "dijit/MenuBar",
    "dijit/MenuBarItem",
    "dijit/MenuItem",
    "dijit/PopupMenuBarItem"
], function(
    array,
    declare,
    DropDownMenu
    MenuBar,
    MenuBarItem,
    MenuItem,
    PopupMenuBarItem
){
    // Создает пункт главного меню с DropDown'ом
    function createMenuBarItem(label){
        return new PopupMenuBarItem({
            label: label,
            popup: new DropDownMenu({})
        });
    } // createMenuBarItem
    
    return declare(MenuBar, {
    	
        buildRendering: function(){
         this.inherited(arguments);
         
         // Какой-то код...
         
         this.fileMenu = createMenuBarItem("Файл");
         this.editMenu = createMenuBarItem("Правка");
         this.dictsMenu = createMenuBarItem("Справочники");
         
         array.forEach([
             this.fileMenu,
             this.editMenu,
             this.dictsMenu
         ], this.addChild, this); // forEach
        } // buildRendering
    }); // declare
}); // define

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

1 комментарий :

Отправить комментарий

Debian Buster, SecureBoot и Nvidia RTX 2070

Комментариев нет

Условия задачи

Дано:

  • Ошибка Xorg в логах: May 7 16:21:42 darktower kernel: [ 5.572986] Lockdown: ioperm is restricted; see https://wiki.debian.org/SecureBoot
  • Debian 10 Booster с подключенными репозиториями non-free и contrib.
  • Права root
  • Видеокарта NVidia RTX 2070
  • Компьютер с включенной в настройках материнской платы опцией SecureBoot (EFI)

Проблема в том, что в ряде случаев видеокарта может не запускаться, потому что драйверы не подписаны. Для подписания драйверов следует выполнить действия, описанные в Wiki Debian / SecureBoot.

В моём случае пришлось выполнить следующую последовательность действий:

Установка драйвера Nvidia, исходных кодов ядра и mokutil

Установка драйвера
apt-get update
apt-get install nvidia-driver nvidia-xconfig linux-headers-amd64 mokutil
Пакет Предназначение
nvidia-driver Проприетарный драйвер Nvidia с поддержкой нужных моделей видеокарт.
nvidia-xconfig Утилита конфигурирования параметров Xorg для поддержки им нужных драйверов.
linux-headers-amd64 Исходные коды установленного ядра.
mokutil Утилита для работы с ключами EFI

Генерация ключа EFI, его установка и подписывание драйверов.

Теперь действуем ровно так, как написано в руководстве Debian'а:

Генерация ключа и подписывание драйверов
# Генерация ключей и импорт в EFI
cd  /root
openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=NVidia RTX 2070 key/"
mokutil --import MOK.der

# Подписывание драйверов Nvidia
cd /lib/modules/4.19.0-8-amd64/updates/dkms/
/usr/lib/linux-kbuild-4.19/scripts/sign-file sha256 /root/MOK.priv /root/MOK.der nvidia-current-drm.ko 
/usr/lib/linux-kbuild-4.19/scripts/sign-file sha256 /root/MOK.priv /root/MOK.der nvidia-current.ko 
/usr/lib/linux-kbuild-4.19/scripts/sign-file sha256 /root/MOK.priv /root/MOK.der nvidia-current-modeset.ko 
/usr/lib/linux-kbuild-4.19/scripts/sign-file sha256 /root/MOK.priv /root/MOK.der nvidia-current-uvm.ko 

# Перенастройка Xorg под nvidia
cd /etc/X11
rm xorg.conf
nvidia-xconfig

Следует обратить внимание на путь, в котором расположены исходные модули ядра nvidia и скрипт для подписывания драйверов - они могут быть другими.

Перезагрузка

При перезагруке EFI выдаст сообщение, что появился запрос на установку собственного ключа цифровой подписи. Принимаем этот ключ и устанавливаем. После этого компьютер должен перезагрузиться и запустить установленный Linux, используя подписанные данным ключом драйверы. После этого запустится Xorg и всё будет нормально работать.

Автоматизация подписывания ключей.

Можно автоматизировать процесс по максимуму, если ручной выбор исходников ядра переключить на работу с результатами команды uname -r и поместить всё в файл скрипта:

/root/sign_nvidia_drivers.sh
#!/bin/sh

SIGN=/usr/lib/linux-kbuild-4.19/scripts/sign-file
MOK=/root/MOK.priv
DER=/root/MOK.der

cd /lib/modules/$(uname -r)/updates/dkms/

$SIGN sha256 $MOK $DER nvidia-current-drm.ko
$SIGN sha256 $MOK $DER nvidia-current.ko
$SIGN sha256 $MOK $DER nvidia-current-modeset.ko
$SIGN sha256 $MOK $DER nvidia-current-uvm.ko

Его нужно запускать всякий раз при обновлении драйвера Nvidia или ядра.

Комментариев нет :

Отправить комментарий