Разгружая загруженное...
А именно, сервер и перенося все на клиента путем использования формата разметки текста markdown. Корме того, такой способ позволяет быстрее публиковать статьи на WEB-сайте, оставляя оформление текста на CSS.
Читать как использовать и отображать markdown на клиентской стороне.
Никогда неявное не приводило к очевидному...
WiFi использует спектр частот 2.4 GHz и 5 GHz не требующих получение разрешения на их использование и отвечает стандарту IEEE 802.11, который имеет несколько вариантов:
- 802.11a – 5 GHz;
- 802.11b – 2.4 GHz;
- 802.11n – 2.4 GHz;
- 802.11g – 2.4 & 5 GHz;
При этом существует проблема одновременного использования всех варинтов IEEE 802.11 точкой доступа, которой устанавливается режим 2Ghz-B/G/N – клиентские устройства более двух-трех не могут связаться с точками доступа или отваливаются, когда их становится три и более. Для решения проблемы рекомендуется использовать вариант 802.11g , режим 2Ghz-Only-G при настройки отдельного канала, порядок настройки которого добавил статью КАК ИСПОЛЬЗОВАТЬ И НАСТРАИВАТЬ CAPSMAN в разделе IPNETWORK
О сколько нам открытий чудных... (c) A.C.Пушкин
Готовят побитывые операции в Python, например, побитовая операция НЕ с числом 0xFF00, возня с которым приводит к следующему неожиданному результату:
>>> x = 0xFF00 >>> y = ~x >>> print ( "x=%5.4x,y=%5.4x" % (x,y) ) x= ff00,y=-ff01 >>> x 65280 >>> y -65281
Для разрешения этой неожиданности, понадобилось найти из них правильное решение из нескольких вариантов манипуляций с целыми числами, что и создает "чудесный мир побитовых операций".
Настраивая, изменяя и сравнивая...
Vim — широко распространяемый и высоко настраиваемый редактор, позволяющий создавать и изменять эффективно любой текст и включенный в состав многих nix подобных систем, а также Apple OS X
Vim является стабильным и непрерывно совершенствуемым, чтобы стать лучше и надежней. Ему присущи следующие функциональные черты:
- устойчивым, с многоуровневым откатом операций;
- расширяемым за счет использования плагинов;
- поддерживаемым тысячи языков программирования и файловых форматов;
- эффективный поиск и замена текста;
- интерграция со многими утилитами.
Кроме того, он позволяет настраивать внешний вид интерфейса для более дружелюбной навигации и производить сопоставление файлов, как показано на рисунке ниже.
Подчищая и исправляя...
C момента стабилизации дистрибутива Debian/Bullseye много воды утекло и было выпущено куча обновлений дистриутива, поэтому при попытке установить VIM выползла следующая ошибка:
$ sudo apt install vim ... dpkg: dependency problems prevent configuration of libappindicator3-1:amd64: libayatana-appindicator3-1 (0.5.5-2+deb11u2) breaks libappindicator3-1 (<< 22.04) and is installed. Version of libappindicator3-1:amd64 to be configured is 0.4.92-8. dpkg: error processing package libappindicator3-1:amd64 (--configure): dependency problems - leaving unconfigured Errors were encountered while processing: libappindicator3-1:amd64 E: Sub-process /usr/bin/dpkg returned an error code (1)
Из которой видно, что эта проблема Ubuntu-пакета libappindicator3-1, который теперь называется в Debian — libayatana-appindicator3-1
Узнать, как решать проблему зависимостей переименованных пакетов
Объединяя в целое...
Точки доступа Mikrotik через централизованное управление на роуторе можно настроить с использованием менеджера системы управления точкой доступа (Controlled Access Point system MANager, CAPsMAN), принцип которого показан на рисунке.
На рисунке показано, что контроллер CAPsMAN позволяет производить централизованное управление беспроводных сетей и если необходимо выполнять обработку данных. Когда используется функция CAPsMAN, предполагается, что сеть состоит из некоторого числа управляемых точек доступа (Controlled Access Points, CAP)...
Обнуляя сделанное...
При попытке сохранения Git-репозитария firmware/linux-firmware.git в локальном хранилище git.server.local:
LANG=C git push --all new-origin Enumerating objects: 15054, done. Counting objects: 100% (15054/15054), done. Delta compression using up to 4 threads Compressing objects: 100% (5201/5201), done. remote: error: object 087fbb748f50af6eac2248a445d25d666cc92c78: zeroPaddedFilemode: contains zero-padded file modes remote: fatal: fsck error in packed object error: remote unpack failed: index-pack abnormal exit To git.server.local:firmware/linux-firmware.git ! [remote rejected] main -> main (unpacker error) error: failed to push some refs to 'git.server.local:firmware/linux-firmware.git'
Был выявлен объект 087fbb748f50af6eac2248a445d25d666cc92c78, содержащий объекты в режиме дополнения файлов нулями (zero-padded file modes), над устранением ошибки c которыми потребовалось немного повозиться — о чем написал в посвященной этому статье.
Выделяя и раскрашивая...
с помощью Code Highlighter исходный код, вставленный в текст документа и редактируемый в программах Writer и Impress офисного набора LibreOffice, как показано на рисунке ниже.
При этом, использовать само расширение Code Highlighter достаточно просто: выделяй и раскрашивай, приукрашивай в нужные цвета синтаксиса применяемого языка программирования. А вот установка потребует немного кропотливости и внимательности: о чем и написал в статье по установке расширения Code Highlighter
Извлекая и получая нужное ...
А именно файлы с данными из отдельно загруженного файла пакета с расширением .deb без установки и использования APT, на примере извлечения файлов пакета версии binutils-2.38:
drwxr-xr-x root/root 0 2022-07-14 13:07 ./ drwxr-xr-x root/root 0 2022-07-14 13:07 ./usr/ drwxr-xr-x root/root 0 2022-07-14 13:07 ./usr/share/ drwxr-xr-x root/root 0 2022-07-14 13:07 ./usr/share/doc/ drwxr-xr-x root/root 0 2022-07-14 13:07 ./usr/share/doc/binutils-doc/ -rw-r--r-- root/root 59379 2022-07-14 13:07 ./usr/share/doc/binutils-doc/changelog.Debian.gz -rw-r--r-- root/root 1970 2022-07-14 13:07 ./usr/share/doc/binutils-doc/copyright drwxr-xr-x root/root 0 2022-07-14 13:07 ./usr/share/info/ -rw-r--r-- root/root 297514 2022-07-14 13:07 ./usr/share/info/as.info.gz -rw-r--r-- root/root 71082 2022-07-14 13:07 ./usr/share/info/binutils.info.gz -rw-r--r-- root/root 21004 2022-07-14 13:07 ./usr/share/info/ctf-spec.info.gz -rw-r--r-- root/root 34234 2022-07-14 13:07 ./usr/share/info/gprof.info.gz -rw-r--r-- root/root 33389 2022-07-14 13:07 ./usr/share/info/gprofng.info.gz -rw-r--r-- root/root 121812 2022-07-14 13:07 ./usr/share/info/ld.info.gz lrwxrwxrwx root/root 0 2022-07-14 13:07 ./usr/share/doc/binutils-doc/bfd -> ../binutils/bfd lrwxrwxrwx root/root 0 2022-07-14 13:07 ./usr/share/doc/binutils-doc/gas -> ../binutils/gas lrwxrwxrwx root/root 0 2022-07-14 13:07 ./usr/share/doc/binutils-doc/gprof -> ../binutils/gprof lrwxrwxrwx root/root 0 2022-07-14 13:07 ./usr/share/doc/binutils-doc/ld -> ../binutils/ld
Узнать какой для этого нужно выполнить ряд незатейлевых манипуляций.
Делая устойчивым неустойчивое...
Как оказалось, что широко рекомендуемые в "сети" настройки на стороне клиента SSH приводят к преждевременному разрыву сессии, несмотря вроде бы все параметры выставлены правильно :
host * ServerAliveInterval 600 TCPKeepAlive yes IPQoS throughput Protocol 2
При этом многие пакеты подтверждения активности (alive message) могут теряться,особенно по моему опыту, в неустойчивых средах передачи данных, к которым относятся, например, использующие транспорт UDP соединения VPN, а также в силу фильтрации пакетов на уровне маршрутизаторов.
Почитать, как выставить настройки SSH соединению в неустойчивых средах передачи данных
Все что невинно на первый взягляд в будущем порождает проблемы...
Что сегодня и происходит с toolsetup, которое порождает пока невинное предупреждение во время выполнения команды python3.8 setup.py install в проекте python-shell-v1.6 и ниже.
$ python3.8 setup.py install ... /home/user/.sources/Python-3.8.13/build/python-setuptools/setuptools/command/easy_install.py:144: EasyInstallDeprecationWarning: easy_install command is deprecated. Use build and pip and other standards-based tools. ...
Это предупреждение стало появляться недавно, которое лечится отказом от дистрибьюции в формате egg, от использования которого отказался в python-shell-v1.7 в пользу использования формата Wheel, вместе с которым рассказываю также почему была запрещена read_configuration из setuptools.config и что использовать вместо неё.
Из внутри внешне...
Именно, так можно реализовать внутрисетевой обмен (Host-only network — обозначена синим на рисунке ниже) и подсети доступом ко всемирной сети Internet (NAT — обозначена красным на этом же рисунке). При этом обе подсети изолированы друг от друга, если конечно не наладить между ними мостик (обозначен фиолетовым показано там же), который реализуется с использованием подсистемы netfilter на уровне ядра за счет использования того же NAT, но только на уровне ядра гостевой ОС "Debian-11"
Узнать как пользоваться внутрисетевой обмен (Host-only network) с доступом к Internet в Qemu/kvm
Своевременно получая...
Так, получение сведений о доменной информации с сервера имен DNS позволяет узнать адрес IP путем анализа записей NS или сколько доменному имени узлe назначено записей А, как показано ниже, в примере использования dig(1).
~$ dig @10.0.2.3 smtp.google.com. A +noadditional +noauthority ; <<>> DiG 9.16.27-Debian <<>> @10.0.2.3 smtp.google.com. A +noadditional +noauthority ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 22039 ;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 4, ADDITIONAL: 4 ;; QUESTION SECTION: ;smtp.google.com. IN A ;; ANSWER SECTION: smtp.google.com. 300 IN A 64.233.165.26 smtp.google.com. 300 IN A 74.125.131.26 smtp.google.com. 300 IN A 64.233.164.26 smtp.google.com. 300 IN A 64.233.164.27 smtp.google.com. 300 IN A 74.125.131.27 ;; Query time: 56 msec ;; SERVER: 10.0.2.3#53(10.0.2.3) ;; WHEN: Sat May 21 09:05:25 MSK 2022 ;; MSG SIZE rcvd: 249
Распространяя и экспортируя...
запускаемые в gnome-boxes образы гостевых ОС, которые находятся в директории $HOME/.local/share/gnome-boxes/images с сохранением копии из директории $HOME/.config/libvirt/qemu/ конфигурационного файла XML, содержащего настройки эмуляции запуска виртуальной машины.
Так же, используя виртуальный канал Spice, как показано на рисунке выше, можно перебрасывать файлы через обеспечивающий совместный доступ гостевой ОС к директориям файловой системы на стороне гипервизора, задействуя для этого дружественнй интерфейс Gnome boxes и менеджера рабочего стола виртуальной машины.
Нет ничего актуальней фактического...
Что и произошло со мной, когда увидел системные требования к окружению разработчика для сборки из исходных кодов демона containerd, которые требуют более свежую версию не ниже 1.17.x для компилятора golang или кратко go, так как в Debian-11 версия пакета golang на момент написания статьи соответствовала go-1.15, как показано ниже.
$ apt search golang-1 Сортировка… Готово Полнотекстовый поиск… Готово golang-1.15/stable,stable 1.15.15-1~deb11u4 all Go programming language compiler - metapackage golang-1.15-doc/stable,stable 1.15.15-1~deb11u4 all Go programming language - documentation golang-1.15-go/stable 1.15.15-1~deb11u4 i386 Go programming language compiler, linker, compiled stdlib golang-1.15-src/stable 1.15.15-1~deb11u4 i386 Go programming language - source files
Динамически и строго применяя...
Виды типизаций — динамическую и строгую типизацию — при объявлении переменных классов объектов в Python, как показано ниже.
pre> >>> number = 1234.567 >>> phrase = "Python is a dynamic language" >>> number = phrase >>> sentence = number + 10 Traceback (most recent call last): File "", line 1, in TypeError: can only concatenate str (not "int") to str >>> print ( number ) Python is a dynamic language
А так же рассказываю, как определять является ли тип класса объекта изменяемым или нет, чем отличается экземпляр объекта от класса типа объекта, зачем и почему используется утиная типизация (duck tyiping) в Python
Устремляясь ввысь, отталкиваясь от базы...
Что и демонстрирует рисунок ниже, полученный в результате реализации в Python сложных вычислений с вложенными рекурсиями, которые порождает рекурсивная формула $f(x) = f(x-1) + 2 \times f(x-2) + 1$
Вложенные рекурсии демонстрируют закономерность, что все вычисления начинаются с базового случая, при котором $f(0) = 1 || f(1) = 1$, идут снизу-вверх с ветвлением на вложенные рекурсии и напоминают перевернутое дерево.
Узнать, как использовать и проверять сложные вычисления с вложенными рекурсиями, а сам реализованный код скачать с GitHub в виде файла cmplxrecursion.py
Принципы неизбежно требуют декорирования и аргументации...
По следам недавнего выхода модуля python-shellenv версии 1.6, раскрыл как:
- обрабатывать и интерпретировать аргументы командной строки модуля Python и назначать им собственные действий с помощью argparse.Action
- использовать декораторы в целях тиражирования и соблюдения принципа DRY(Don't Repeated You)
Пример соблюдения принципа DRY, при назначении собственных действий аргументу командной строки, приведен ниже.
class _CommonAction(argparse.Action): ... @classmethod def catcher(cls, **kwargs ) : raise argparse.ArgumentTypeError( 'direct call CommonAction.catcher() is illegal!' ) ... class _GetenvAllRunAction(_CommonAction): """ Defining Action for option --getenv """ def __init__(self, option_strings, dest, nargs=None, **kwargs ): super(_OutputAllRunAction, self).__init__( catcher=self.catcher, option_strings=option_strings, dest=dest, nargs=nargs ,**kwargs ) @classmethod def catcher(cls, **kwargs ): vkey = cls._kwargs_get(kwargs,'values')[0] ...
Выбирая однозначно и многозначно...
Что нашло свое отражение в очередной версии 1.6 модуля python-shellenv, написанного на языке Python, была реализована обработка аргументов комндной строки, список которых можно получить набив в командной строке следующие буковки:
$ py-shellenv --help usage: shellenv [options] optional arguments: -h, --help show this help message and exit -V, --version returns help page and exit immediate -t, --test tests all methods for functionality checking -O, --output-all output all of shell enviroment variables --getenv GETENV finds and prints all shell variables on its keyword or only one variable when it has matched vkey
Где наряду с печатью всех переменных окружения, которые доступны через os.environ, также релизован поиск нескольких переменных, у которых первые символы имени совпадают с GETENV, пример такого использования показан ниже:
$ py-shellenv --getenv GNOME There was found 4 similar variables that start with an GNOME GNOME_DESKTOP_SESSION_ID=this-is-deprecated GNOME_TERMINAL_SCREEN=/org/gnome/Terminal/screen/cec6211a_987a_4c28_b096_8d46ae123456 GNOME_SETUP_DISPLAY=:1 GNOME_TERMINAL_SERVICE=:1.172
Соответственно, опция --getenv не только решает проблему выполнения команды env | grep "GNOME", которая может вернуть и иные переменные, что и выделено жирным:
$ env | grep "GNOME"
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
XDG_CURRENT_DESKTOP=GNOME
GNOME_TERMINAL_SCREEN=/org/gnome/Terminal/screen/cec6211a_987a_4c28_b096_8d46ae123456
GNOME_SETUP_DISPLAY=:1
GNOME_TERMINAL_SERVICE=:1.172
Кроме того, опция --getenv может также без проблем найти отдельную переменную, например, только что найденную GNOME_SETUP_DISPLAY :
$ py-shellenv --getenv GNOME_SETUP_DISPLAY GNOME_SETUP_DISPLAY=:1
При этом, дерево проекта увеличилось всего лишь на один файл cmdlineargs.py, который выделен жирным:
~/Project/python-shellenv$ exa --tree --sort type
.
├── src
│ └── shellenv
│ ├── __init__.py
│ ├── __main__.py
│ ├── cmdlineargs.py
│ ├── shellenv.py
│ └── testrun.py
├── LICENSE
├── README.md
├── buildout.cfg
├── pyproject.toml
├── setup.cfg
└── setup.py
Всегда найдется метод передачи и извлечения данных даже в условиях переменной среды...
Как говорится было бы желание и такая задачка найдется, с которой неожиданно столкнулся во время реализации доступа к некоторым операциям с переменными системного окружения в модуле python-shellenv для получения их состава и значений. В ходе ее решения выяснилось, что необходимо использовать **kwards, указывающий на переменное число параметров с выборкой по ключевому значению атрибутов функции, метода или конструктора класса.
В силу того, что **kwards относится к встроенному в CPython типу dict(inary) — словарь, который обеспечивает ассоциативную выборку значений по ключевым словам, в ранее опубликованную статью про использование dict был добавлен следующий пример такой выборки:
class _CommonAction(argparse.Action): ... def __init__(self, catcher, **kwargs ) : option_strings=self.__kwargs_get(kwargs,'option_strings') ... @staticmethod def __kwargs_get(kws,key): for k in kws.keys(): if k == key : return kws[k] return None
Свободно собирая, устанавливая и распространяя...
Что нашло отражение в опубликованной версии 1.5 Python-модуля shellenv на GitHub, в которой были исправлены и перенесены в один файл __init__.py именования уровня модуля с двойными и тройными подчеркиваниями (мodule level "dunders"), добавлены метаданные для buildout и setup.py , в том числе в сборку модуля shellenv добавлена генерация дружественного интерфейса вызова в виде одного или нескольких скриптов-оберток, что позволяет вызывать его из командной строки, а не через команду pip -m <module>.
Таким образом, дерево проекта увеличилось на два файла buildout.cfg и setup.py, как показано в дампе ниже.
~/Project/python-shellenv$ exa --tree --sort type . ├── src │ └── shellenv │ ├── __init__.py │ ├── __main__.py │ ├── shellenv.py │ └── testrun.py ├── LICENSE ├── README.md ├── buildout.cfg ├── pyproject.toml ├── setup.cfg └── setup.py
Все сделанные изменения, так или иначе связанные с ними, были описаны в следующих статьях :
Как использовать buildout в python
Как использовать setup.py в python
Кроме того, добавлены сведения о том, как использовать именования с двойными и тройными подчеркиваниями (мodule level “dunders”) в статью о том, как использовать конструкции __main__ & __init__ при конструирования структуры пакета.
Также наконец дошли руки сдать топики 2020 года в архив!
Правильно инициализировано — это как верно сказано...
В опубликованной Python-модуля shellenv версии 1.4 на GitHub был исправлен ипморт и выполнение модуля через команду python3 -m shellenv путем внесения конструкций __main__ и __init__, повлекшие соответствующие изменения в структуре пакета модуля:
. ├── LICENSE ├── pyproject.toml ├── README.md ├── setup.cfg └── src └── shellenv ├── __init__.py ├── __main__.py ├── shellenv.py └── testrun.py
При этом, был сделан задел для реализации этапа тестирования в непрерывном цикле и развертывания новых версий дистрибутива модуля в виде файла-компонента src/shellenv/testrun.py. Также в ходе реализации конструкций __main__ и __init__ были внесены правки в ранее опубликованную статью, которая описывает как собирать, раздавать и устанавливать проект в среде Python
Ассоциативно связывая и оперируя...
со статическими и динамическими словарями, на примере операций с вложенном в него списке, а также определение минимум и максимума по выбранному значению во вложенном списке и объяснение почему нельзя в качестве базового класса использовать встроенный тип dict
Плодотворно творить и размножать...
все написанное на Python не так сложно. Даже несмотря на то, что плод труда программиста не относится к компилируемому или собираемому коду, т.к. выполняется в интерпретаторе бинарного кода CPython и находится в уже относительного виде исполняемых сценариев или подключаемых модулей другими сценариями по ходу выполнения. Поэтому для СPython предусмотрена команда Python Package Index(PIP), с помощью которой мной был собран и установлен пакет python-shellenv, мной же недавно опубликованный и полная структура которого показана ниже.
~/Projects/python-myproj$ exa --tree --ignore-glob="*~|__pycache__|dist|*.egg-info" . ├── LICENSE ├── pyproject.toml ├── README.md ├── setup.cfg ├── shellenv.py └── src └── shellenv_module ├── __init__.py ├── shellenv-run.py └── shellenv.py
Читать о том, как создавать, собирать, раздавать и устанавливать проект в среде Python
Совмещая очевидное...
В раздел Проекты добавлена реализация в Python операций по созданию, изменению и обеспечению совместимости с аналогами функций семейства getenv(3) для работы с переменными окружения системы.
Этот небольшой проект реализует подключаемый модуль shellenv и демонстрирует возможность дистрибьюции проектов в экосистеме Python, например, с использованием локального индексного репозитарий Python и который в будущем поможет мне реализовать все этапы непрерывной интеграции (continuous integration), являющейся неотъемлемой частью безопасной разработки.
Да не оскудеет рука дающего (Книга Притчей Соломоновых, Глава 28, стих 27)
И раздающего, локально индексируемые пакеты Python (Python Package Index, PyPI). Почему приватно? Потому что не стоит, на мой взгляд, пугать Интернет своими шедеврами до того момента, как он будет готов это сделать сам. Поэтому решил поделится рецептами по достижению того, чей видимый результат показан на рисунке, ниже.
Как показано на картинке, первым (слева) показан результат обращения к хранилищу Git-репозитариев, вторым (середина) и третьим (справа) – запуск pypiserver в качестве приложения wsgi с помощью Apache2, поднимая виртуальные узлы на сетевых портах 8080 и 8443, при это, также покзывается конфигурация и запуск простейшего сервера pypiserver вместе с примером использования функции так называемой долговременной службы (user_lingering ), которая позволяет запускать службу до входа пользователя в систему.
Читать о том, как разворачивать индексный репозитарий Python
Монтируя по метке...
Например, внешний жесткий диск в пользовательской директории /home/$USER/yocto-poky, которую можно потом использовать в качестве хранения копий нужных файлов и директорий или локального хранилища Git репозитариев, о которой писал ниже.
Читать о том, как монтировать партиции (носителя) по её метке
Локально сберегая...
Допустим, что вы разработчик и работает над собственными проектами, некоторые из которых находятся в совместной разработке по всему миру и находятся на GitHub, или других крупных системах контроля версий (versioning system). Однако, некоторые проекты могут быть настолько маленькими и закрытыми для публичного доступа, что размещение на публичных репозитари является не желательным, потому что они могут быть пропроетарными или предназначенными только для внутреннего использования.[3.1]. Поэтому рано или поздно возникает вопрос о собственном локальном хранилище Git-репозитариев.
Форкая и запуская...
Рад сообщить, что закончил адаптацию и выложил последние правки на GitHub Gits серверной конфигурации блока Systemd, который позволяет клиенту git(1) создавать соединения с демоном git-daemon на системе debian-11 и совместимых с ней производных дистрибутивов, таких как Ubuntu или AstraLinux. Эта серверная конфигурации блока Systemd была мной форкнута от родительского рецепта, изначально предложенным Джерими Си Фостер (Jeremiah C Foster).
Для получения GitHub Gits серверной конфигурации блока Systemd и запуска, выполните команду и следуйте потом инструкциям в README.md
git clone https://gist.github.com/702b7b79faf34ba3ff2194d0f404760b.git git-daemon && \ cd git-daemon
По сути GitHub Gits — это сервис, который позволяет разработчикам между собой делится мнениями, сделанными на коленке записками, рецептами и фрагментами исходного кода.
Нежданно-негаданно...
Ничто не предвещало неожиданного, когда во время сборки пакета libxcb-native сборочной среды машины Yocto-poky (ветви Warrior) была получена ошибка импорта gcd модуля fractions, написанного на Python:
... File "//home/user/yocto-poky.tmp/work/x86_64-linux/libxcb-native/1.13.1-r0/recipe-sysroot-native/usr/lib/pkgconfig/../../../usr/lib/python3.7/site-packages/xcbgen/align.py", line 5, in| from fractions import gcd | ImportError: cannot import name 'gcd' from 'fractions' (/usr/lib/python3.9/fractions.py) | make[1]: *** [Makefile:1403: xproto.c] Error 1 | make[1]: *** Waiting for unfinished jobs.... | make[1]: *** [Makefile:1403: composite.c] Error 1 | make[1]: *** [Makefile:1403: dri3.c] Error 1 | make[1]: *** [Makefile:1403: bigreq.c] Error 1 | make[1]: *** [Makefile:1403: dpms.c] Error 1 | make[1]: *** [Makefile:1403: xc_misc.c] Error 1 | make[1]: *** [Makefile:1403: dri2.c] Error 1 | make[1]: *** [Makefile:1403: damage.c] Error 1 | make[1]: Leaving directory '/home/user/yocto-poky.tmp/work/x86_64-linux/libxcb-native/1.13.1-r0/build/src' | make: *** [Makefile:787: all-recursive] Error 1 | ERROR: oe_runmake failed | WARNING: exit code 1 from a shell command. | ERROR: Function failed: do_compile (log file is located at /home/user/yocto-poky.tmp/work/x86_64-linux/libxcb-native/1.13.1-r0/temp/log.do_compile.2130121) ERROR: Task (virtual:native:/home/user/Build/yocto-poky/poky/meta/recipes-graphics/xorg-lib/libxcb_1.13.1.bb:do_compile) failed with exit code '1' NOTE: Tasks Summary: Attempted 2206 tasks of which 0 didn't need to be rerun and 1 failed.
В процессе поиска причин возникновения ошибки импорта gcd модуля fractions в модуле python3.7/site-packages/xcbgen/align.py было выявлено отсутствие обратной совместимости Python-3.9 среды функционирования Debian-11 с собираемой версией python-3.7 сборочной машины Yocto/poke
Узнать как исправлять ошибку несовместимости версии Python-3.9 с предыдущими
Нюансы заключаются в методах и их использования!
Прокси-объект позволяет разным процессам ссылаться (иметь доступ) к одному или нескольким объектам, содержащий контейнерный тип данных, с учетом особенностей интегрируемых объектов последовательности данных (list) и ассоциативного массива с выборкой по ключу (dict) определяется каждому из них собственный набор согласно своей реализации, которая показана на рисунке ниже.
Вместе с особенностями применения прокси-объектов привожу некоторые нюансы совместного использования с их встроенными аналогами list() и dict() интерператора бинарного кода CPython
Перенаправляя, контролируя и отслеживая ...
Трафик и соединения, на реальном примере обмена двух узлов гостевых ОС, схема взаимодействия которых показана ниже, объясняю как перенаправлять трафик с помощью трех политик DNAT, SNAT и MASQUARADE. Так же на практическом примере того же обмена рассказываю как отслеживать tcp- и udp- соединения с помощью модуля conntrack, являющегося неотъемлемой частью IPTables/NFTables, и контролировать открытые порты c использованием утилиты nmap
Главное – установить канал связи, а все остальное уже мелочи...
Особенно, если речь идет о путанице между двумя сетевыми интерфейсами на стороне эмулятора Qemu/KVM, конфигурация которой устанавливалась в соответствии с рецептом мультиподдержки сетевых устройств виртуальной машины "ВМ ОС Yocto/poky", которая показана на функциональной схеме организации и движения сетевого трафика с другой виртуальной машиной "ВМ ОС Debian-10", на рисунке ниже.
Вместе с тем, создал новый раздел Network/IPTables, где будут публиковаться подобные статьи, связанные с настройкой и использованию стека TCP/IP в ОС GNU/Linux
И выходит, и входит. Замечательно выходит! (с) м/ф "Винни-Пух и день забот"
Именно, так исходящие и входящие пакеты IP, UDP и TCP циркулируют на сетевых интерфейсах маршрутизатора шлюза, позволяя снять ограничения и сложности, которые связаны с числом маршрутизируемых адресов IP и требований по ограничению внешнего доступа из публичной сети WAN в локальную сеть LAN .
Которые можно решить с помошью политики FORWARD,MASQUERADE и правил NAT, устанавливаемые в iptables, для (ре-)трансляции и перенаправления TCP-,UDP-пакетов по IP-адресу и порту -источника,-приемника между внешней WAN и внутренней сетью LAN
Узнать как использовать FORWARD,MASQUERADE и правила NAT в iptables
От одинарности к множественности...
В статье о мультиподдержки сетевых устройств в эмуляторе QEMU/KVM проекта Yocto/poky рассказывается, как задействовать согласно схеме, показанной ниже, два сетевых устройства в сборочной машине yocto/poky, наследование опциий -net и -nic, а также устранять проблему, связанной IP-Config: Auto-configuration of network failed и возникающей большой задержки по таймауту.
Разрешая и исправляя...
В поддержку мостовой сети Gnome-box добавил исправление ошибки, показанной ниже в дампе, которая заключалась в дополнительной настройки запуска вспомогательного скрипта qemu-bridge-helper, запускаемого во время инициализации гостевой ОС в виртуальной среде эмулятора Qemu гипервизора KVM, на использование которого построены gnome-boxes
... qemu-bridge-helper --br=virbr1 --fd=36: failed to communicate with bridge helper: Transport endpoint is not connected stderr=failed to create tun device: Operation not permitted ...
Читать о том, как исправлять ошибку запуска вспомогательного скрипта qemu-bridge-helper
Галопом по Европам
Только так происходит первое знакомство с тем, что никогда не использовал, а применять надо и очень хочется. Поэтому посвященной RubyGems статье, в темпе вальса предлагаю пробежаться по основам окружения Ruby и коротенко, одним глазком познакомится с архитектурой окружения и структуре пакетов Gem. Также предлагаю узнать, как установить и использовать RubyGems в диструбитиве Debian.
Читать о том, как устанавливать и использовать RubyGems в Debian
Когда меняются привычные и устоявшиеся правила, тогда философия действия сменяет рациональность статики
Именно, такое выяснилось, когда в недавно собранным мной из исходных кодов LibreOffice-7.2 , что вроде бы недавно работающий символ конца строки (\n) регулярного выражения в диалоге "Найти и заменить" вдруг перестал работать, как показано на рисунке ниже.
Цель оправдывает средства тогда и только тогда, когда она подтверждается результатами
Как оказалось, что версия LibreOffice версии 7.0 в Debian/Bullseye (на момент первой публикации) не содержала нужной мне функциональности, а именно инспектор стиля (Style Inspector), который показан на рисунке 1.1
Рисунок 1.1
Поэтому решил произвести установку поддерживающей более менее эту функиональность версию LibreOffice-7.2, которая производилась путем получения и развертывания в отдельную локальную директорию, на основе уже имеющегося опыта в сети [3.1] и с привязкой к реальной системе Debain/Bullseye. Что заставило меня покопаться и затратить на достяжение указанной цели время и некоторых усилий, которые были оправданы и подтверждены результатами, которые не удавалось получить с установленной штатной версией LibreOffice-7.0 в Debian/Bullseye, поэтому в данном случае, утверждение "Це́ль опра́вдывает сре́дства" – верна.
Читать о том, как настроить, установить и проанализирвать зависимости версии LibreOffice-7.2
Неожиданности кроятся в давно забытом...
Что и произошло со мной, так как у меня система с дистрибутивом Debian/Bullseye на момент стабилизации простояла уже два года и притерпела многие итерации смены программного обеспечения через процедуру apt update, поэтому во время попытки установки пакета libgtk-3-dev была выявлена ошибка с "битыми" зависимостями, а именно несоответствие версий, как показано на рисунке 1-1
Рисунок 1-1
Читать о том, как можно исправить "битые" зависимости пакетов напримере libthai-dev и libwayland-dev
Ключ к решению всякого рода проблем не всегда кроется в простом чтении документации, а в чем-то большем
Так и произошло в случае, когда потребовалось решить проблему с большими задержками и подвисаниями NFS соединения, создаваемого гостевой ОС для доступа к дисковому пространству центральной машины и которое заключалось в правильной оптимизации настроек NFS на стороне сервера и клиента, а не колдовству и магии, как многие иногда себе неверно представляют.
Не паролем, так по ключу
Начиная с августа 2021 года GitHub запретил выполнять команды Git, подобные "Git push", т.е. вносящие изменения в репозитарий и/или базу исходного кода проекта, по паролю. Поэтому мне стала актуальна, написанная практически год назад статья как применять ключи SSH, в который исправил некоторые ошибки, допущенные ранее.
Временно поверенный, временем провернный!
На конец руки начали добираться до старого материала, опубликованого давным-давно... а именно до статьи Как использовать файловые системы Tmpfs и DevPts в Debian Squeeze, которая была расчитана на версии Debain, делавшие упор на использовании SysV init и ставшей уже историей. Поэтому, чтобы оставаться в контексте дня, в новую версию статьи добавил метод использования юнитов в Systemd для монтирования временных и временем проверенных директорий, которые используются для оптимизации времени работы приложений и хранения временных объектов файловых систем.
Не все, что выглядит простым, является тривиальным!
Что и случилось вроде бы с простой обработкой CSV файла test_c.csv, сформированного синтаксическим анализатором fawfinder и который потребовал бы в SHELL нетривиальную обработку формата представления табличных данных, имеющий разделитель CSV. А почему?
На суть проблемы и её решение отвечает статья: Как на языке программирования Python читать и писать табличные данные файла CSV
Формат – формату рознь!
О чем и рассказывается в статье, в которой рассматривается фактическое различие между двумя форматами хранения сообщений Mailbox и Maildir, как и использовать их в условиях почтового сервера Postfix
О призрачном и потустороннем...
А именно, поговорим о том, как сделать явью, на первый взгляд, призрачную поддержку мостовой сети и разрешить защищенный доступ к сети хозяйского узла из виртуальной сети и обратно в запущенной в Gnome Boxes гостевой операционной системе, на примере развернутой в виртуальной среде Qemu/KVM операционной системе GNU/Linux дистрибутива Debian-10.
Отслеживая и журналируя...
Не многие, особенно начинающие пользователи GNU/Linux, знают, что в существует возможность производить трассировку последовательности выполнения команд и основных утилит, используемых в оболочке BASH/DASH и ее скриптах, а также какие подводные камни ожидают Вас на этом пути.
Читать о том, как производить подобную трассировку и журналирование
Читая и перенаправляя...
Текстовые операции из файла являются одними из приоритетными после арифметических в жизни программиста. К тому же большинство подобных операций происходят с текстовыми файлами и заключаются в их анализе в виде содержащей некую важную текстовую информацию данных, например, лог сборки или установки программного обеспечения, последовательного перечня выполнения важных системных операций или просто данные реляционной базы данных. Кроме того, в этой статье рассказывается как перенаправлять выдаваемое на Print() в текстовый файл.
Читать о том, как проводить такие операции с файлами на Python
Споставляя не сопостовимое...
Что кажется па первый взгляд верным, что сопоставить несопостовимое нельзя, но только не в случае с Python, который позволяет легко и непренужденно, например, за чашечкой утреннего горячего кофе привести реализацию именованного канала Pipe() к устройству стандартного вывода, известного всем как STDOUT
Снизу звездочки кажутся маленькие-маленькие. Но стоит только нам взять телескоп!...
Именно, такие словами всем известного героя Огурцова из комедии "Карнавальная ночь", мне напомнила возня с паролями в ОС Linux, потому что вооружившись "мы уже видим две звёздочки, три звёздочки, четыре звёздочки… Лучше всего, конечно, пять звёздочек!". Конечно, в нашем случае чем больше количество и инвариантность символов в пароле, тем надежней он становится.
Перехватавыя и интерпертируя...
Раздел "Разработка приложений Gnome" пополнилась статьей, рассказывающей о возможности обработки событий нажатия кнопок на клавиатуре во фреймворке (Py)Gtk. Также в ней объясняется вся последовательность преврашений сканкодов клавиш, получаемых от клавиатуры до фактически реализуемых в Gtk.keymap и почему их значения имеют различия.
Иногда полезно отделять яйца от курицы...
В Статье объясняются общие принципы, подходы и факторы, позволяющие успешно реализовать многозадачное взаимодействие внутри приложений Gtk, функционирующих в среде графического рабочего стола Gnome/Gtk на языке Python (PyGtk). А именно вопросы, связанные с использованием и управлением многозадачностью, блокировки и организации доступа кокурирующих объектов внутри неё и за её пределами к главному циклу событий (Main Event Loop), чтобы избежать факт несанкционированного доступа, который может привести к аварийному завершению или зависанию программы.
Читать о реализации многозадачности в приложениях Gtk на Python
Начинать нужно с главного?!
А именно, с начала премещения всех статей по созданию приложений для окружения графического рабочего стола Gnome в единый раздел, и добавления в него новой статьи, рассказывающей о том как просто и быстро разрабатывать прикладные приложения в этой графической среде под языком программирования Python
В статье "Как начать создавать приложения Gnome на Python" объясняются общие принципы разработки приложений в среде графического рабочего стола Gnome на языке Python, который взаимодействует с фреймвороком (библиотекой) Gtk через так называемые языковые привязки или интроспекцию GObject, и позволяет быстро с минимальными усилиями разрабатывать прикладные приложения и организовывать взаимодействие с пользователем.