Фото

Unity 6. Камера от третьего лица.


Камера от третьего лица в Unity 6 — это система, которая позволяет управлять камерой так, чтобы она следовала за персонажем, а также могла вращаться и изменять положение относительно него. Здесь рассмотрим как это реализовать с помощью скриптов C#.

Сразу условимся, что камера будет дочерним элементом самого игрока, а также добавим условие, что она не должна выходить за стены, при приближении к ним. Чтобы камера от третьего лица в Unity 6 не проходила сквозь стены, лучше всего использовать Raycast: он «прощупывает» пространство между игроком и желаемой позицией камеры и при обнаружении препятствия подтягивает камеру ближе.

1. В редакторе Unity создадим некое подобие дома, состоящего из пола и стен, и поместим в него нашего игрока (Player).

2. В разделе Hierarhy, необходимо мышкой перетащить Main Camera на нашего персонажа Player, таким образом мы камеру сделаем дочерним элементом нашего персонажа.

3. Создадим слой "Stena". Для этого переходим в меню Edit - Project Settings. Там находим Tags and Layers и в свободном поле пишем "Stena".

4. В Hiearhy необходимо выбрать все стены и в Inspector в поле Layer выбрать из списка слой "Stena"

5. Теперь напишем скрипт (Camera) и перетащим его мышкой на Main Camera. Раз камера обязательно дочерняя к игроку, решением будет динамически менять её localPosition.z через Raycast — «подтягивать» камеру ближе к игроку, когда позади стена.

 

using UnityEngine;

public class Camera : MonoBehaviour
{
    [Header("Ссылки")]
    public Transform player;

    [Header("Настройки дистанции и высоты")]
    public float defaultDistance = 5f;          // Дистанция от игрока (Z)
    public float defaultHeight = 2f;             // Высота камеры над игроком (Y)
    public float minDistance = 1f;              // Минимальная дистанция до игрока
    public float smoothSpeed = 12f;         // Скорость сглаживания

    [Header("Слои и геометрия")]
    public LayerMask collisionMask;         // Слои стен/препятствий
    public float sphereRadius = 0.3f;         // Радиус проверки (чтобы камера не прилипала к стене)

    private float _currentDistance;

    void Start()
    {
        _currentDistance = defaultDistance;
    }

    void LateUpdate()
    {
        if (player == null) return;

        // Желаемая позиция камеры в мировых координатах
        Vector3 origin = player.position;
        
        // Локальное смещение: (0, высота, -дистанция)
        Vector3 desiredLocalPos = new Vector3(0f, defaultHeight, -defaultDistance);
        
        // Переводим в мировые координаты с учётом поворота игрока
        Vector3 desiredWorldDir = player.rotation * desiredLocalPos;
        Vector3 desiredWorldPos = origin + desiredWorldDir;

        Vector3 dirToCamera = desiredWorldPos - origin;
        float maxRayLength = dirToCamera.magnitude;

        float targetDistance = defaultDistance;

        // SphereCast от игрока к желаемой позиции камеры
        if (Physics.SphereCast(
            origin,
            sphereRadius,
            dirToCamera.normalized,
            out RaycastHit hit,
            maxRayLength,
            collisionMask))
        {
            // Нашли стену — уменьшаем дистанцию, чтобы не было пересечения
            float safeDist = hit.distance - sphereRadius;
            targetDistance = Mathf.Max(safeDist, minDistance);
        }

        // Плавно меняем дистанцию
        _currentDistance = Mathf.Lerp(_currentDistance, targetDistance, Time.deltaTime * smoothSpeed);

        // Формируем итоговую локальную позицию: высота не меняется, дистанция меняется
        Vector3 localOffset = new Vector3(0f, defaultHeight, -_currentDistance);

        // Плавно двигаем камеру по localPosition
        transform.localPosition = Vector3.Lerp(
            transform.localPosition,
            localOffset,
            Time.deltaTime * smoothSpeed
        );

        // Камера смотрит на игрока
        transform.rotation = Quaternion.LookRotation(player.position - transform.position, Vector3.up);
    }
}

 

Настройка в редакторе:


- Камера (Main Camera) уже дочерняя к игроку — оставляем как есть.
- Повесьте скрипт на саму камеру.
- В поле Player перетащите игрока.
- Collision Mask — выберите слои, на которых у вас стены, пол, потолок (создайте слой Walls, если его нет, и назначьте стенам).
- Default Distance — то расстояние, на котором камера должна быть в норме (например, 5).
- Sphere Radius — «толщина» камеры, чтобы она не прилипала вплотную к стене (0.2–0.5 обычно достаточно).

 

Как это работает:


Каждый кадр скрипт пускает SphereCast от игрока назад — туда, где камера «хотела бы» быть.
Если луч натыкается на стену, камера подтягивается к игроку ровно настолько, чтобы не пересечь стену.
Если стены нет — камера плавно возвращается на defaultDistance.
Всё это делается через localPosition.z, так что камера остаётся полноценным дочерним объектом игрока и двигается вместе с ним.
Подводные камни
Игрок не должен быть в Collision Mask, иначе Raycast упрётся в коллайдер игрока и камера «схлопнется». Вынесите игрока на отдельный слой и исключите его из маски.
Поворот камеры — в скрипте камера поворачивается, чтобы смотреть на игрока через Quaternion.LookAt. Если вы уже управляете вращением камеры отдельно (например, через Cinemachine или мышкой), уберите последнюю строку с transform.rotation и оставьте только корректировку позиции.
LateUpdate — обязателен, иначе камера будет дёргаться, так как обновляется до перемещения игрока.

Вот и всё, теперь наша камера настроена для игры от третьего лица, при этом избегает выхода за стены.



Фото

Нет звука по HDMI в linux. Решение проблемы.


Звук по HDMI — одна из самых частых проблем в Ubuntu. Причины бывают разные: от банально не выбранного устройства вывода до регрессий в ядре и проблем с драйверами видеокарты.

Сегодня многие дистрибутивы linux внедряют работу аудио через PipeWire и зачастую именно это и становится причиной отсутствия вывода звука по кабелю HDMI.

PipeWire — это современный мультимедийный фреймворк для Linux, который управляет аудио‑ и видеопотоками с минимальной задержкой. Он задумывался как замена PulseAudio и JACK, при этом сохраняя совместимость с их клиентами.

Попробуем устранить эту проблему. Конечно откатываться с PipeWire обратно на PulseAudio мы не будем, но протестируем вывод звука и настроим PipeWire пошагово.

Шаг № 1.

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

pactl list sinks

Мы должны увидеть нечто подобное:

pactl list sinks

В этом списке нам нужно найти и запомнить (записать) следующее:

  • Имя устройства. (В нашем случае это "alsa_output.pci-0000_00_1f.3.hdmi-stereo")
  • alsa.card (В нашем случае - это 0)
  • alsa.device (В нашем случае - это 3)

Шаг №2

Далее мы обойдем PipeWire, чтобы найти формат, поддерживаемый вашим оборудованием. Мы протестируем как 16-битный (`S16_LE`), так и 32-битный (`S32_LE`) форматы, поскольку один из них, скорее всего, будет работать.

Для этого нам необходим пакет speaker-test`, который входит в пакет `alsa-utils. При необходимости его можно установить командой:

sudo apt install alsa-utils

Запустите `speaker-test`, используя номера карты и устройства, которые вы нашли на шаге 1.

 - Тестирование в 16-битном формате:

speaker-test -c 2 -D hw:0,3 -F S16_LE

- Тестирование в 32-битном формате:

speaker-test -c 2 -D hw:0,3 -F S32_LE

Прислушайтесь к звуку из динамиков вашего дисплея. Когда вы услышите звук (шипение), то запомните, какой формат (`S16_LE` или `S32_LE`) сработал.

Шаг №3

 

Теперь мы создадим правило, которое заставит PipeWire использовать тот формат, который сработал.

- Создайте необходимый каталог и новый файл конфигурации:

         mkdir -p ~/.config/wireplumber/wireplumber.conf.d/
         touch ~/.config/wireplumber/wireplumber.conf.d/99-hdmi-format-fix.conf

- Откройте файл (`99-hdmi-format-fix.conf`) в своем любимом редакторе (например nano)

nano ~/.config/wireplumber/wireplumber.conf.d/99-hdmi-format-fix.conf

В открывшемся редакторе введите следующее:

monitor.alsa.rules = [
{
matches = [
{
node.name = "alsa_output.pci-0000_00_1f.3.hdmi-stereo"
}
]
actions = {
update-props = {
audio.format = "S16LE"
audio.channels = 2
audio.position = "FL,FR"
}
}
}
]

Важно !!! 

- В поле node.name необходимо ввести имя устройства, которое мы определили на 1 шаге (в нашем случае - это "alsa_output.pci-0000_00_1f.3.hdmi-stereo").

- Измените `audio.format` на значение, которое сработало для вас на шаге 2.

Шаг №4

Теперь необходимо перезапустить аудиосервисы, чтобы загрузить новое правило. Можно либо перезагрузить компьютер, либо ввести в терминале следующие команды:

- Перезапустите PipeWire и WirePlumber:

systemctl --user restart pipewire pipewire-pulse wireplumber

- Проверьте статус, чтобы убедиться, что перезапуск прошел успешно:

systemctl --user status pipewire pipewire-pulse wireplumber

- Убедитесь, что новое свойство было применено. Замените название устройства своим:

pw-cli list-objects | grep -A 30 "alsa_output.pci-0000_00_1f.3.hdmi-stereo"

В выводе для вашего устройства вы должны увидеть `audio.format = "S16LE"` (или любой другой формат, который вы установили).

Теперь звук через HDMI должен работать во всей системе.

 



Фото

Восстановление GRUB2 через rescue


GRUB — GRand Unified Bootloader. Универсальный загрузчик, который устанавливается вместе с операционной системой Linux. В настоящее время большинство систем Linux используют GRUB2. Что делать если GRUB не запустился?

При сбое загрузки пользователь может увидеть на мониторе одно из следующих сообщений. Оно дает первое представление о том, что может быть причиной сбоя загрузки. Ниже приведены сообщения о сбоях и возможные причины их возникновения.

  • grub>  обозначает, что  GRUB 2 загрузил модули, но не смог найти файл grub.cfg.

  • grub rescue> обозначает, что  GRUB 2 не смог найти папку grub или загрузить модуль normal.

  • grub>: на пустом экране

    • GRUB 2 обнаружил загрузочную информацию, но не смог найти или использовать существующий файл конфигурации GRUB 2 (обычно grub.cfg).

  • grub rescue>: — режим спасения.

    • GRUB 2 не может найти папку grub или ее содержимое отсутствует/повреждено. В папке grub находятся меню GRUB 2, модули и сохраненные данные об окружающей среде.

  • GRUB — одно слово в левом верхнем углу экрана без подсказки и курсора.

    • GRUB не удалось найти даже самую базовую информацию, которая обычно содержится в MBR или загрузочном секторе.
  • Busybox или Initramfs: GRUB 2 начал процесс загрузки, но возникла проблема с передачей управления операционной системе. Возможные причины: неправильный UUID или обозначение root= в строке 'linux' или поврежденное ядро.

  • Застывший заставочный экран, мигающий курсор без grub> или grub rescue подсказки. Возможно, возникли проблемы с видео в ядре. Хотя эти сбои не связаны с GRUB 2, он все же может помочь. GRUB 2 позволяет редактировать меню перед загрузкой, и пользователь может восстановить работоспособность системы, добавив и/или удалив параметры ядра в menuentry перед загрузкой.

В рамках данной статьи рассмотрим способ восстановления загрузчика с помощью командной строки GRUB.

Итак, если на экране вы видите приглашение grub>, либо grub rescue>, то можно предпринять следующее:

1.  Введите команду  ls

grub rescue> ls

Эта команда выведет на экран названия обнаруженных дисков и разделов, вывод будет примерно таким:

(hd0) (hd0,msdos1) (hd0,msdos2) (hd1) (hd1,msdos1)

2.   Далее необходимо просмотреть содержимое каждого раздела и найти нужный нам. Это можно сделать с помощью той же команды ls и указанием в скобках нужного раздела, с последующим знаком слеш. Пример:

grub rescue> ls (hd0,msdos1)/
grub rescue> ls (hd0,msdos2)/

Просмотрев разделы, нужно найти тот, в котором имеется папка   boot/grub. Запомните его.

3. Далее нужно установить переменные с помощью команды set. Допустим, вы определили, что раздел где установлен CRUB это (hd0,msdos2), тогда необходимо ввести:

grub rescue> set root=(hd0,msdos2)
grub rescue> set prefix=(hd0,msdos2)/boot/grub

4. Для работы GRUB, необходимо загрузить некоторые модули, делается это командой insmod:

grub rescue> insmod ext2
grub rescue> insmod normal

Если у вас файловая система ext2 / ext3 / ext4, то подойдет команда insmod ext2, но для файловой системы btrfs необходимо загрузить другой модуль командой:

grub rescue> insmod btrfs

5.  Дальше попробуем запустить загрузчик командой:

grub rescue> normal

Если все нормально, то запустится обычное меню GRUB с выбором операционных систем.

6. Загрузите систему и исправьте проблему. После входа в ОС (от имени root) переустановите GRUB командой в терминале:

# grub-install /dev/sdX         (где sdX - это раздел куда установлена система, например sda)
# update-grub

7. Если  на шаге 5 команда normal не сработала, то можно загрузить систему вручную:

grub rescue> linux /boot/vmlinuz-6.17.0-20-generic root=/dev/sdXY

где sdXY - это корневой раздел системы, например sda2.

вместо vmlinuz-6.17.0-20-generic, необходимо указать нужное ядро, какое именно можно посмотреть в папке boot/ с помощью команды:

grub rescue>  ls (hd0,msdos2)/boot/

на экран выведется список файлов, которые ноходятся в каталоге boot/ и среди них можно найти название файла с необходимым ядром.

8. Далее загружаем initrd:

grub rescue> initrd /boot/initrd.img-6.17.0-20-generic

нужный initrd находим по аналогии с ядром на предыдущем шаге.

9. Вот и всё, остается только запустить систему командой boot:

grub rescue> boot

Если всё прошло удачно, то система запустится, и после загрузки выполните в терминале команды указанные на шаге 6.

----------------------------------------------------------

В общем случае (если подытожить) порядок всех команд будет следующим:

grub rescue> ls

grub rescue> set root=(hd0,msdos2)

grub rescue> set prefix=(hd0,msdos2)/boot/grub

grub rescue> insmod ext2

grub rescue> insmod normal

grub rescue> normal

если меню GRUB не запустилось, то продолжаем:

grub rescue> linux /boot/vmlinuz-6.17.0-20-generic root=/dev/sdXY

grub rescue> initrd /boot/initrd.img-6.17.0-20-generic

grub rescue> boot

После запуска системы в терминале выполняем:

# grub-install /dev/sdX         (где sdX - это раздел куда установлена система, например sda)
# update-grub

----------------------------------------------------------------

Если ничего не помогает, то используйте Live USB:

1. Загрузите Linux с флешки.

2. Определите разделы:

$ sudo fdisk -l

3. Примонтируйте корневой раздел:

$ sudo mount /dev/sdXY /mnt

4. Переустановите GRUB:

$ sudo grub-install --root-directory=/mnt /dev/sdX
$ sudo chroot /mnt
$ update-grub
$ exit
$ sudo reboot

Вот на этом пожалуй и всё, загрузчик должен восстановиться и система загрузиться.

 

 



Фото

Беспроводной дисплей в Linux (Miracast)


Хочется транслировать рабочий стол на экран большого Smart TV, или нужно подключиться к беспроводному монитору? Всё это с легкостью делается нажатием пару кнопок в системах Windows, или, например Android. А как дело обстоит в ОС Linux?

Для подключения, например ноутбука к телевизору по беспроводной сети используют современные технологии. Одна из технологий, которая даёт возможность провести такую трансляцию, называется Miracast («Миракаст»).

Miracast использует технологию Wi-Fi Direct для установления прямого беспроводного соединения между устройствами-источниками и устройствами-приёмниками. Устройство-источник кодирует аудио- и видеоданные и отправляет их по каналу Wi-Fi Direct на устройство-приёмник, которое затем декодирует и отображает контент.

Долгое время в системах семейства Linux, вопрос подключения Smart TV в качестве беспроводного дисплея топтался на месте. Конечно, делались подвижки в этом направлении, но всё это былот не стабильно и сложно в настройках для обычного пользователя. Но сегодня разработан и продолжает развиваться проект Gnome Network Displays, позволяющий применять технологию Miracast в операционных системах linux. GNOME Network Displays — приложение, которое реализует функциональность Wi-Fi Display (Miracast) для передачи контента рабочего стола на совместимые устройства.

Интересно отметить, что хотя данный проект разрабатывается для среды Gnome, он прекрасно работает и в других средах (KDE Plasma, Cinnamon, Mate и др.), а так же поддерживает и различные графические протоколы (X11, Wayland), с небольшой лишь разницей в функционале программы.

Итак, как реализовать это в linux?

Конечно, во многих дистрибутивах использующих Gnome можно установить готовый пакет прямо из репозитория набрав, например, в терминале:

 

sudo apt update

sudo apt install gnome-network-displays

 

Но в других дистрибутивах, в репозиториях нет этого пакета. Как быть?

Предлагаю установить gnome-network-displays из изходников, которые опубликованы на gitlab.gnome.org.

 

Для этого сначала скачаем исходный код с gitlab.gnome.org, набрав в терминале:

 

git clone https://gitlab.gnome.org/GNOME/gnome-network-displays.git

Затем необходимо перейти в директорию с исходниками:

 

cd gnome-network-displays

 

Чтобы собрать утилиту из исходников нам понадобится установить некоторые зависимости:

 

В системах на основе Ubuntu:

 

sudo apt install libgstrtspserver-1.0-dev libgstreamer-plugins-base1.0-dev libavahi-client-dev libavahi-gobject-dev libgtk-3-dev libnm-dev libpulse-dev libprotobuf-c-dev libjson-glib-dev libsoup-3.0-dev libportal-gtk4-dev libgtk-4-dev libadwaita-1-dev

 

В Fedora:

 

sudo dnf build-dep gnome-network-displays

 

Далее, необходимо установить meson.

Meson — кроссплатформенная консольная утилита, автоматизирующая процесс сборки программного обеспечения из исходного кода. 

В системах на основе Ubuntu:

 

sudo apt install meson

 

В Fedora:

 

sudo dnf install meson

 

Далее производим сборку:

 

meson build

 

Переходим в папку сборки:

 

cd build

 

Устанавливаем утилиту:

 

meson install

 

Вот и всё, утилита gnome-network-manager установлена и готова к работе.

Запустить её можно либо через меню приложений, либо в терминале командой:

 

gnome-network-manager

 

После запуска программы мы увидим следующее окно, в зависимости от графического сервера и используемой среды:

 

Plasma X11:

 

Plasma Wayland:

 

 

Gnome:

 

 

Если при трансляции на беспроводной монитор или Smart TV не воспроизводится звук, то необходимо в настройках используемой среды  переключить воспроизведение звука через GNOME Network Displays.

 

 

Вот и всё, ноутбук подключен к беспроводному дисплею.

 

 



Фото

Подсветка ноутбуков Thunderobot в linux


Подсветка клавиатуры — это не только эстетика, но и практичность. Она помогает работать в темноте, играть ночью и просто делает использование устройства комфортнее. 

Обычно у каждого производителя компонентов есть собственное программное обеспечение для управления RGB-подсветкой, а для работы некоторых из них требуется учётная запись в Интернете. Для пользователей Linux даже это не всегда доступно, поскольку большинство таких приложений являются проприетарными и работают только на Windows. В данной статье рассмотрим как подключить и управлять подсветкой клавиатуры в linux дистрибутивах для игровых ноутбуков Thunderobot 911 s и им подобным. Управление подсветкой на данных ноутбуках осуществляется комбинациями клавиш Fn и клавишами на дополнительной цифровой клавиатуре:

 

Fn* - включает/выключает подсветку;

Fn/  - изменяет цвет подсветки;

Fn+ - прибавляет яркость подсветки;

Fn-  - уменьшаеть яркость подсветки:

       В операционных системах семейства Windows необходимо установить драйвера, предварительно скачав их с официального сайта Thunderobot - https://www.thunderobot.com. Но на этом сайте мы не найдем драйвера под линукс. Будем искать альтернативу, и она есть !!!  Драйвер клавиатуры Tuxedo подходит для  ноутбуков Thunderobot, поэтому устанавливаем их из этого репозитория - https://github.com/tuxedocomputers/tuxedo-drivers 

В репозитории находим и нажимаем кнопку <>code

Затем выбираем - download zip и скачиваем архив на ноутбук.

Если репозиторий по каким-либо причинам недоступен, то файл можно скачать с этого сайта - tuxedo-drivers-main.zip

 

Распаковываем архив и переходим в папку  tuxedo-drivers-main.

 

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

Сначала устанавливаем утилиту make.

 

sudo apt install make

 

Для сборки deb-пакета:

 

- devscripts

- debhelper

- dh-dkms

 

Для сборки rpm-пакета:

 

- rpm

 

Далее собираем пакеты с помощью утилиты make:

 

make package-deb    - для сборки deb-пакета

make package-rpm   - для сборки rpm-пакета

 

Затем выходим из папки tuxedo-drivers-main и можем лицезреть собранные пакеты.

Остается только установить эти пакеты в систему и перезагрузить ноутбук.

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

 

Собранные мной пакеты:

 

deb - tuxedo-drivers_4.20.1_all.deb

rpm - tuxedo-drivers-4.20.1-1.fc43.noarch.rpm

 

 

 



Фото

Добавить программу в автозапуск с помощью Python


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

В данной статье мы рассмотрим, как использовать Python для добавления программ в автозапуск на различных операционных системах. Вы узнаете, как можно реализовать автозапуск на Windows и Linux, используя Python-библиотеки и стандартные подходы.

Что такое автозапуск программ?

Автозапуск представляет собой возможность автоматического запуска определенных приложений или скриптов при включении и загрузке операционной системы. Программы, запускаемые таким образом, могут быть самыми разнообразными — от почтовых клиентов до системных утилит. Возможность автоматического старта повышает удобство использования устройства, обеспечивая готовность системы к работе с первой минуты.

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

Существует несколько различных методов добавления приложений в автозапуск в операционных системах Windows и Linux. Способ выбора зависит от специфики ОС и возможностей разработчика. Мы сфокусируемся на подходах, где задействован язык Python, благодаря которому весь процесс станет интуитивно понятным и универсальным.

Установка необходимых библиотек

Python и pip

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

Библиотеки для работы с автозапуском

Мы будем использовать стандартные Python модули os и platform, чтобы обеспечить взаимодействие с файловой системой и определить текущую ОС. Эти модули идут в комплекте с Python, поэтому требуются лишь базовые установки языка.

Код для добавления программы в автозапуск

Добавление в автозапуск на Windows

Код для добавления программы в автозапуск на Windows создаёт символьную ссылку в специальной папке:

import os
import sys

def add_to_startup(program_name: str) -> None:
    """
    Добавляет программу в автозапуск Windows.
    :param program_name: Имя программы для автозапуска
    """
    startup_path = os.path.join(os.getenv('APPDATA'), 'Microsoft', 'Windows', 'Start Menu', 'Programs', 'Startup')
    target_link = os.path.join(startup_path, f'{program_name}.lnk')
    os.symlink(sys.argv[0], target_link)

 

Код выше создает символическую ссылку в каталоге автозапуска Windows, что позволяет программе запускаться автоматически.

Добавление в автозапуск на Linux

Для Linux мы создаем .desktop файл, который будет выполняться при старте:

 

import os

def add_to_startup(command: str) -> None:
    """
    Добавляет команду в автозапуск на Linux.
    :param command: Команда для автозапуска
    """
    autostart_file = f'~/.config/autostart/{command}.desktop'
    with open(os.path.expanduser(autostart_file), 'w') as file:
        file.write(f'[Desktop Entry]\nType=Application\nExec={command}\nHidden=false\nNoDisplay=false\nX-GNOME-Autostart-enabled=true\nName[en_US]={command}\nName={command}\n')

 

Этот фрагмент создает файл конфигурации автозапуска подходящего формата для среды рабочего стола GNOME.

Проверка, добавлена ли программа в автозапуск

 

Проверка на Windows

Для проверки на Windows вы можете убедиться, что созданный файл .lnk действительно находится в папке автозапуска. Это позволит удостовериться, что файл был корректно создан и программа добавлена в автозапуск.

Проверка на Linux

На Linux правильность работы можно проверить, исследовав .desktop файл на наличие ошибок в синтаксисе и правильную настройку прав доступа.

 

Типичные ошибки и их исправление

 

Общие ошибки при добавлении в автозапуск

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

Отладка с помощью логов

Использование модулей логирования поможет вам отследить ошибки на этапе разработки и быстро выявить проблемные места. Консольный вывод и логи могут быть полезны при попытке воспроизвести ошибку.

 

Заключение

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

 
 
Источник:  external.software


Фото

Парсинг сайтов - Regex в Beautiful Soup


В мире веб-скрапинга и анализа данных, эффективный поиск и извлечение информации из HTML/XML документов имеют решающее значение. Beautiful Soup — это мощная библиотека Python, которая значительно упрощает этот процесс.

Однако стандартные методы поиска Beautiful Soup иногда могут быть недостаточными для сложных или изменчивых структур веб-страниц. Именно здесь на помощь приходят регулярные выражения (Regex).

В этом руководстве мы подробно рассмотрим, как интегрировать Regex с Beautiful Soup, чтобы значительно расширить ваши возможности поиска. Мы начнем с основ и перейдем к продвинутым техникам, предоставляя практические примеры для решения реальных задач веб-скрапинга.

Основы Beautiful Soup и регулярных выражений

Beautiful Soup — это библиотека Python для парсинга HTML и XML документов. Она преобразует сложные веб-страницы в легкодоступную структуру данных, позволяя извлекать информацию с помощью интуитивно понятных методов поиска, навигации и модификации.

Регулярные выражения (Regex) — это мощный инструмент для работы со строками, позволяющий описывать и находить текстовые шаблоны. Они становятся незаменимыми, когда стандартные методы поиска Beautiful Soup оказываются недостаточными для обнаружения элементов со сложными или меняющимися характеристиками.

Что такое Beautiful Soup и зачем он нужен

Beautiful Soup – это мощная библиотека Python, разработанная для парсинга HTML и XML документов. Она преобразует сложные веб-страницы в удобные для навигации Python-объекты, формируя синтаксическое дерево. Это позволяет разработчикам легко извлекать данные, находить элементы и манипулировать их содержимым. Beautiful Soup значительно упрощает процесс веб-скрапинга, предоставляя интуитивно понятные методы для навигации по структуре страницы, поиска тегов, атрибутов и текста, делая ее незаменимым инструментом для автоматизированного сбора информации из веба.

Введение в регулярные выражения (Regex) для поиска

Регулярные выражения (Regex) – это мощный инструмент для поиска и манипулирования текстом, основанный на использовании шаблонов. В контексте Beautiful Soup, Regex позволяет находить элементы, соответствующие определенным текстовым паттернам, а не только точным совпадениям.

  • Определение шаблонов: Regex определяет шаблоны, описывающие искомые строки. Например, шаблон r'^[A-Za-z]+$' ищет строки, состоящие только из букв.

  • Модуль re в Python: Для работы с Regex в Python используется встроенный модуль re. Beautiful Soup интегрируется с этим модулем, позволяя применять Regex для поиска по тегам, атрибутам и тексту.

  • Преимущества Regex: Regex обеспечивает гибкий и точный поиск, позволяя игнорировать регистр, находить элементы с определенными префиксами или суффиксами и многое другое. Это особенно полезно при работе с неструктурированными или динамически генерируемыми веб-страницами.

  • Примеры использования: Regex можно использовать для поиска всех ссылок, начинающихся с определенного домена, или для извлечения всех тегов <div> с атрибутом class, содержащим определенное слово.

Поиск элементов с помощью Regex в Beautiful Soup

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

Использование Regex в методах find() и find_all()

Методы find() и find_all() принимают объект Regex в качестве аргумента для поиска по тегам, атрибутам и тексту. Для этого необходимо передать скомпилированный объект регулярного выражения, созданный с помощью re.compile(), или строку, представляющую шаблон регулярного выражения, непосредственно в метод.

  • find(regex): Возвращает первый элемент, соответствующий заданному регулярному выражению.

  • find_all(regex): Возвращает список всех элементов, соответствующих заданному регулярному выражению.

Поиск по имени тега и тексту с использованием Regex

Regex можно использовать для поиска элементов по имени тега и/или тексту внутри тега. Например, можно найти все теги, начинающиеся с определенной буквы или содержащие определенное слово.

Пример:

import re
from bs4 import BeautifulSoup

html_doc = """<a>Link 1</a><b>Bold text</b>
<a>Link 2</a>"""
soup = BeautifulSoup(html_doc, 'html.parser')

links = soup.find_all(re.compile('^a')) # Найти все теги, начинающиеся с 'a'
print(links)

text = soup.find_all(text=re.compile('Link')) # Найти текст, содержащий 'Link'
print(text)

В следующем разделе мы рассмотрим продвинутые техники поиска, включая поиск по атрибутам с использованием Regex и использование функций для сложных запросов.

Использование Regex в методах find() и find_all()

Методы find() и find_all() в Beautiful Soup становятся мощнее с использованием регулярных выражений. Вместо точного совпадения строки, вы можете искать элементы, соответствующие определенному шаблону.

  • find(regex) возвращает первый элемент, соответствующий шаблону.

  • find_all(regex) возвращает все элементы, соответствующие шаблону, в виде списка.

Regex можно использовать для поиска:

  1. По содержимому тега (тексту).

  2. По имени тега.

  3. По атрибутам тега (будет рассмотрено далее).

Пример:

from bs4 import BeautifulSoup
import re

html = '<p class="body">Текст 1</p><p class="body">Текст 2</p>'
soup = BeautifulSoup(html, 'html.parser')

# Найти все элементы <p> с классом, содержащим "body"
body_elements = soup.find_all('p', class_=re.compile('body'))

for element in body_elements:
    print(element.text)

 

В этом примере re.compile('body') создает regex-объект, который ищет в атрибуте class значения, содержащие слово "body".

Поиск по имени тега и тексту с использованием Regex

Beautiful Soup позволяет использовать регулярные выражения не только для поиска по атрибутам, но и непосредственно для фильтрации тегов и их содержимого.

  • Поиск по имени тега: Вместо точного имени тега можно передать regex. Beautiful Soup найдет все теги, имена которых соответствуют этому регулярному выражению. Например, <soup.find_all(re.compile('^b'))> найдет все теги, начинающиеся с буквы ‘b’ (body, b и т.д.).

  • Поиск по тексту: Аргумент string в методах find() и find_all() принимает регулярные выражения. Это позволяет находить элементы, содержащие текст, соответствующий заданному шаблону. Например, <soup.find_all(string=re.compile('hello'))> найдет все элементы, содержащие текст "hello" (регистрозависимо).

При использовании regex для поиска текста важно помнить о следующем:

  • Beautiful Soup вернет объект NavigableString, представляющий найденный текст, а не сам тег.

  • Чтобы получить родительский тег, можно использовать свойство parent объекта NavigableString.

Использование regex в сочетании с именами тегов и текстовым поиском предоставляет мощные инструменты для точного и гибкого извлечения информации из HTML/XML документов.

Продвинутые техники поиска

Теперь, когда мы освоили основы, давайте перейдем к продвинутым техникам. В этом разделе мы рассмотрим, как использовать регулярные выражения для поиска элементов по атрибутам, а также как применять re.compile() для создания сложных и эффективных запросов. Это расширит ваши возможности по извлечению данных из HTML и XML документов, предоставляя большую гибкость и контроль над процессом поиска.

Поиск по атрибутам с использованием Regex

Beautiful Soup позволяет искать элементы HTML не только по тегам и тексту, но и по значениям атрибутов, используя регулярные выражения.

Например, чтобы найти все теги <a> с атрибутом href, содержащим слово "example", можно использовать следующий код:

import re
from bs4 import BeautifulSoup

html = '''
<a href="https://www.example.com">Example Link</a>
<a href="https://www.google.com">Google Link</a>
<a href="https://example.org">Another Example</a>
'''

soup = BeautifulSoup(html, 'html.parser')

links = soup.find_all('a', href=re.compile(r'example'))

for link in links:
    print(link['href'])

 

В этом примере re.compile(r'example') создает объект регулярного выражения, который используется для поиска соответствий в атрибуте href. Этот метод особенно полезен, когда необходимо найти атрибуты, соответствующие определенному шаблону, а не конкретному значению.

Использование функций и re.compile() для сложных запросов

Для повышения эффективности при частом использовании одного и того же сложного шаблона рекомендуется применять re.compile(). Это предварительно компилирует регулярное выражение, оптимизируя процесс поиска. Beautiful Soup также позволяет передавать пользовательские функции в методы find() и find_all() для реализации кастомной логики фильтрации элементов, предоставляя максимальную гибкость.

Практические примеры и лучшие практики

Regex в Beautiful Soup открывает широкие возможности для веб-скрапинга. Рассмотрим несколько примеров:

  1. Извлечение данных по шаблону: Например, извлечение всех ссылок с определенным словом в URL.

  2. Работа с динамическим контентом: Парсинг атрибутов, значения которых генерируются динамически.

  3. Очистка данных: Удаление нежелательных символов или форматирование текста.

Лучшие практики:

  • Компилируйте regex с помощью re.compile() для повышения производительности.

  • Используйте try-except блоки для обработки возможных ошибок, связанных с некорректным HTML.

  • Будьте внимательны к edge cases и тщательно тестируйте свои regex.

Решение типовых задач веб-скрапинга с Regex

Рассмотрим несколько типичных задач веб-скрапинга, где Regex демонстрирует свою мощь в Beautiful Soup:

  1. Извлечение цен с веб-сайта: Если цены представлены в разных форматах (например, $100, 100 USD, 100.00), Regex поможет извлечь их все, приводя к единому формату.

  2. Поиск ссылок, соответствующих определенному шаблону: Например, нужно найти все ссылки на изображения, имена которых начинаются с определенной строки.

  3. Парсинг таблиц с неконсистентными данными: Когда структура таблицы непостоянна, Regex может помочь идентифицировать и извлечь нужные данные, даже если они расположены в разных ячейках.

  4. Извлечение данных из атрибутов тегов: Regex позволяет находить элементы, у которых значения атрибутов соответствуют заданному шаблону, например, id="item-[0-9]+".

Использование Regex в Beautiful Soup позволяет решать широкий спектр задач, связанных с извлечением и обработкой данных из HTML и XML документов, значительно расширяя возможности стандартных методов поиска.

Оптимизация и распространенные ошибки

Для оптимизации поиска с Regex в Beautiful Soup всегда старайтесь сужать область поиска, применяя его к поддеревьям HTML, а не ко всему документу. Это значительно ускоряет обработку. Распространенные ошибки включают использование слишком широких регулярных выражений, что приводит к ложным срабатываниям, и забывание обработки случая, когда find() возвращает None.

Заключение

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

 
 
 
 


Фото

Установка Unity3d в Ubuntu 25.10


Unity3D уже давно занимает лидирующие позиции в индустрии разработки игр, позволяя разработчикам создавать захватывающие 2D- и 3D-игры для широкого спектра платформ. Хотя Windows и macOS традиционно являются основными платформами для разработки на Unity, Linux постепенно набирает популярность как жизнеспособная платформа для разработки игр. В этой статье мы подробно рассмотрим как установить Unity3D в Ubuntu 25.10.

Для начала необходимо убедиться, что ваша система соответствует минимальным требованиям:

- 64-разрядная версия дистрибутива Linux.

- Не менее 4 ГБ оперативной памяти.

- Видеокарта с поддержкой OpenGL 3.2 или более поздней версии.

- Mono (кроссплатформенная реализация.NET Framework), установленная в вашей системе.

Первым шагом установим Mono, если он еще не установленю.

 

              sudo apt update

              sudo apt -y install mono-complete

 

Теперь необходимо установить Unity Hub.

Unity Hub — это отдельное приложение, которое упрощает навигацию, загрузку и управление проектами и установками Unity.

С помощью Hub вы можете:

- Управлять, загружать и устанавливать модули и версии Unity Editor.

- Создавать проекты Unity и управлять ими.

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

- Управлять профилем, настройками и лицензиями Unity.

- Отправлять отзывы и получать помощь от Unity.

 

1. Чтобы установить Unity Hub в дистрибутив Linux Debian или Ubuntu, вам нужно добавить репозиторий Unity Hub Debian вместе с открытым ключом для проверки целостности пакетов.

 

Чтобы добавить открытый ключ подписи, выполните следующую команду:

 

wget -qO - https://hub.unity3d.com/linux/keys/public | gpg --dearmor | sudo tee /usr/share/keyrings/Unity_Technologies_ApS.gpg > /dev/null

 

2. Чтобы добавить репозиторий Unity Hub, вам нужно внести изменения в /etc/apt/sources.list.d. Выполните следующую команду, чтобы добавить репозиторий Unity Hub:

 

sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/Unity_Technologies_ApS.gpg] https://hub.unity3d.com/linux/repos/deb stable main" > /etc/apt/sources.list.d/unityhub.list'


3. Обновите кэш пакета и установите пакет:

 

sudo apt update

sudo apt -y install unityhub

 

Всё теперь запускаем UnityHub командой:      unityhub

и выбираем пункт installs, для установки нужного нам Unity Editor.

 

Выбираем нужную нам версию и нажимаем кнопку install.

 

 

Далее выбираем необходимые компоненты и нажимаем install:

 

Установка занимает продолжительное время, в зависимости от того сколько и какие компоненты для установки были выбраны и скорости интернета.

 

После окончания установки попробуем создать проект, для этого переходим в пункт меню Proects.

 

Далее нажимаем New project.

 

Здесь выбираем нужный нам шаблон, заполняем все поля и нажимаем кнопку Create project.

 

 

Если всё установилось корректно, то запуститься Unity Editor и можно приступать к написанию своего проекта.

Но когда я все установил, то мой проект ни как не мог запуститься, вернее не запускался сам Unity Editor, а кликнув по созданному объекту появлялось сообщение, что проект уже якобы запущен в Unity Editor, хотя сам редактор запущен не был.

 

 

Попробуем решить эту проблему.

Сам Unity Editor в Ubuntu 25.10 по умолчанию устанавливается в домашнюю папку примерно по такому пути:

 ~/Unity/Hub/Editor/2022.3.62f3/Editor/

Теперь отроем терминал и перейдем в этот каталог:

cd /home/maxim/Unity/Hub/Editor/2022.3.62f3/Editor/

Запускаем Unity Editor:

 ./Unity

И получаем вот такую ошибку:

./Unity: error while loading shared libraries: libxml2.so.2: cannot open shared object file: No such file or directory

Здесь мы видим, что у нас якобы нет библиотеки libxml2.so.2.

Проверим так ли это на самом деле. Попробуем её найти у нас в системе:

sudo ldconfig -p | grep libxml2

В итоге видим, что она у нас установлена, но Unity Editor упорно не хочет её находить.

 

Unity Editor требует libxml2.so.2, но у нас в системе установлена libxml2.so.16, которая находиться по пути: /lib/x86_64-linux-gnu/libxml2.so.16

Сделаем символическую ссылку на этот файл:

 

 sudo ln -s /lib/x86_64-linux-gnu/libxml2.so.16 /lib/x86_64-linux-gnu/libxml2.so.2

 

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

Набираем в терминале:

 

sudo ldd ./Unity

В появившемся списке смотрим каких зависимостей не хватает (=> not found). Если всё установлено, то пытаемся еще раз запустить unityhub (если мы не закрыли его после первого запуска, то необходимо его закрыть и только потом перезапустить). Снова создаем проект, запускаем его и вуаля Unity Editor запустился.

 

 

Вот и всё, можем работать в Unity3D в Ubuntu 25.10

 

 

 

 



1 2 3 4 5    Следующая