Заметки на салфетке
53 subscribers
60 photos
31 links
Заметки автора канала "код на салфетке".

Вопросы и предложения @proDreams
Основной канал: @press_any_button
Download Telegram
А официальное приложение доступно только для Windows и MacOS. Линукс в пролёте.
Однако, есть неофициальный порт Figma-linux.

После его установки, оказывается, что и он не видит пользовательские шрифты. Линукс был бы не линуксом, еслиб не требовал ко всему дополнительных "плясок с бубном". И эти "пляски" увенчались успехом.

Поддержка пользовательских шрифтов в Figma-linux.
Всё достаточно просто.

1. В менеджере файлов переходим в директорию ~/.local/share/fonts (~ означает домашний каталог пользователя).
2. Копируем в эту директорию нужные шрифты.
3. Открываем терминал и выполняем команду fc-cache -fv. Эта команда обновит кэш шрифтов в системе.
Если возникает ошибка, что команда не найдена, нужно установить пакет fontconfig: sudo apt install fontconfig.
4. Запускаем Figma-linux. Шрифты будут доступны.

Вот так, казалось бы, банальная для винды вещь в виде шрифтов, в линуксе требует "особого" подхода.
👍1🤩1
Всем привет!

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

Такая мысль посетила недавно и меня, когда в работе над одним проектом, мне понадобилось использовать ЮКассу как способ оплаты. Однако, официальная библиотека имеет ряд недостатков, главный из которых заключается в том, что она синхронная.

И я задумался, а почему бы не переписать её на современных технологиях? Подумано - сделано! Я начал работу по переписываю официальной библиотеки.

И так, версия 0.1.1, что сделано на данный момент?
- Написаны модели данных платежа для запроса и ответа.
- Написан класс конфигурации и АПИ клиента
- Начат класс платежа. Написан и работает метод создания платежа.

Работы ещё много... Но, надеюсь, что это всё не зря)

Буду рад, если поставите звёздочку в репозитории проекта.

Ссылки:
- Репозиторий: https://github.com/proDreams/async_yookassa
- PyPi: https://pypi.org/project/async_yookassa/
👍4🔥3🤩1
В Linux долгое время использовалась система X11 для отображения графики. Однако, она устарела и была заменена более современным и эффективным протоколом Wayland. Этот новый протокол не только повышает производительность, но и обеспечивает большую безопасность и лучшую совместимость с современными графическими картами.

В Debian 12 с оболочкой GNOME, Wayland активирован по умолчанию, однако в моем случае система продолжала использовать X11. Это вызывало неудобства — система казалась медленной и иногда случались статтеры.

Выполнив команду echo $XDG_SESSION_TYPE и получив в выводе X11, вместо wayland, как говорится "всё встало на свои места". Но вот странно, драйвера на видеокарту стоят, последний GNOME, а Wayland'а нет.

Перепробовав несколько вариантов из интернета, чуть всё не сломав я собрал из нескольких "рабочий" для Debian 12 и графической оболочки GNOME, вариант.
🤩1
Приступим.
1. Сразу переключаемся на sudo-пользователя, чтобы было проще:
su -


2. Нужно установить необходимые зависимости или доустановить недостающие:
apt install xwayland libxcb1 libnvidia-egl-wayland1 initramfs-tools


3. Открываем для редактирования файл конфигурации загрузчика GRUB:
nano /etc/default/grub


3.1. Находим строку GRUB_CMDLINE_LINUX= и добавляем в неё rd.driver.blacklist=nouveau nvidia-drm.modeset=1. Должно быть примерно так:
GRUB_CMDLINE_LINUX="rd.driver.blacklist=nouveau nvidia-drm.modeset=1"


3.2. Сохраняем изменения CTRL+S и выходим CTRL+X. После чего выполняем команду обновления загрузчика:
update-grub2


4. Открываем для редактирования конфигурационный файл Графического менеджера Gnome (GDM3):
nano /etc/gdm3/daemon.conf


4.1. Находим закомментированную строку #WaylandEnable=false и изменяем её на WaylandEnable=true. Сохраняем изменения CTRL+S и выходим CTRL+X.

5. Открываем для редактирования конфигурационный файл Nvidia:
nano /etc/modprobe.d/nvidia.conf


5.1. В конец добавляем следующую строку: options nvidia-drm modeset=1. Убедитесь, что такой строки больше нет в файле. Сохраняем изменения CTRL+S и выходим CTRL+X.

6. Обновляем initramfs, чтобы применить изменения:
update-initramfs -u


7. Перезагружаемся выполнив команду:
reboot


Готово. Теперь при входе в систему можно выбрать сеанс GNOME, который будет использовать Wayland, а не X11.
Продолжаем ковырять Linux. На этот раз проблема с NTFS-разделами.

У меня несколько SSD-дисков:
- 500Гб NVME с Windows
- 960Гб SATA SSD под файлы
- 240Гб SATA SSD с Debian

И перебравшись почти полностью на Debian, мне стало не хватать этих 240Гб. И тогда я подумал: «а почему бы не использовать второй диск?», но форматировать его я не хотел, слишком уж там много всего.

В файловом менеджере Nautilus NTFS-разделы отображаются, однако для подключения к ним требуется root-пароль. Это вызвало первый вопрос: «нафига?» Зачем нужен пароль администратора для доступа к другим дискам/файловым системам?

Идём дальше. После ввода пароля администратора, доступ к диску появляется, но и тут не всё гладко! Диск доступен только в режиме чтения для текущего пользователя. Открывать его через root-пользователя глупо, так как он мне нужен доступным текущему пользователю и запущенным программам.

В общем, я начал разбираться. Что мне было нужно:
1. Чтобы диск был доступен текущему пользователю для чтения и записи.
2. Чтобы диск был доступен для выполнения с него (это нужно, например, для Steam).
3. Чтобы диск монтировался автоматически при запуске системы.
Что нужно делать?

1. Установить или доустановить необходимые пакеты:

sudo apt install ntfs-3g udisks2


2. Выполняем команду для отображения всех подключенных дисков, их файловой системы и UUID:

lsblk -o NAME,FSTYPE,UUID


Отобразятся диски в виде дерева с разделами. Там будут sda, sdb, sd..., а если есть NVME-диск, то и nvme.... Нужно найти необходимые NTFS-разделы и сохранить их UUID из третьего столбца.

3. Далее открываем для редактирования файл fstab, который отвечает за монтирование дисков:

sudo nano /etc/fstab


Спускаемся в самый низ файла и добавляем строку монтирования:
UUID=uuid_диска /mnt/название_раздела ntfs-3g user,defaults,uid=1000,gid=1000,umask=022 0 0


Что тут прописываем:
- UUID=uuid_диска: Уникальный идентификатор (UUID) раздела диска, который нужно смонтировать.
- /mnt/название_раздела: Путь, куда будет смонтирован раздел. Например, /mnt/sdb2 или /mnt/nvme0n1p2.
- ntfs-3g: Тип файловой системы и драйвер для монтирования. ntfs-3g используется для поддержки NTFS на Linux.
- auto,user,defaults,uid=1000,gid=1000,umask=022:
- user: Пользователи могут самостоятельно монтировать этот раздел без root-прав.
- defaults: Использование набора стандартных опций для монтирования (равносильно rw,suid,dev,exec,auto,nouser,async):
- rw: Раздел будет смонтирован в режиме чтения и записи.
- suid: Скрипты, находящиеся на этом устройстве, могут устанавливать пользовательские права (UID) при запуске.
- dev: Разрешает доступ к блочным устройствам внутри монтируемого раздела.
- exec: Позволяет выполнение исполняемых файлов на смонтированном разделе.
- auto: Раздел будет автоматически монтироваться при загрузке системы и командой mount -a.
- nouser: Запрещает обычным пользователям (не root) самостоятельно монтировать этот раздел без использования sudo. Переопределяется указанным выше параметром user.
- async: Операции ввода/вывода выполняются асинхронно, что может ускорить работу файловой системы.
- uid=1000: Владелец файлов на смонтированном разделе будет иметь UID 1000.
- gid=1000: Группа владельца файлов будет иметь GID 1000.
- umask=022: Маска прав доступа по умолчанию для новых файлов и директорий, равная 022, что означает, что права будут следующими: владелец — чтение и запись (6), группа — только чтение (4), остальные пользователи — только чтение (4).
- 0: Первый параметр в dump. Если установлен в 0, файловая система не будет резервироваться утилитой dump.
- 0: Второй параметр в fsck (файловая система проверяется при запуске). Значение 0 означает, что эта файловая система не будет проверяться при загрузке.

В моём случае два диска выглядят так:
UUID=E0AC4955AC4926FE /mnt/sdb2 ntfs-3g user,defaults,uid=1000,gid=1000,umask=022 0 0
UUID=5E5E57A85E57782B /mnt/nvme0n1p2 ntfs-3g user,defaults,uid=1000,gid=1000,umask=022 0 0


Сохраняем изменения CTRL+S и выходим CTRL+X.

4. Перезагружаем систему:

sudo reboot


Готово. Диски теперь доступны по пути /mnt/... и их можно использовать без root-прав, в том числе и в сторонних приложениях, например, в Steam.

Важно: Использование параметра user может привести к потенциальным рискам безопасности. Убедитесь, что вы понимаете последствия его использования.
🔥3
Всем привет.

Пришлось ради одного поста, открыть старый проект на Flet и... он отказался запускаться)

Скорее всего, проблема в том, что ранее я запускал его на Windows, а теперь запускаю на Linux.

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

1. Нужно обновить версию Flet до последней:
pip install -U flet


2. Установить пакет libmpv:
sudo apt install libmpv-dev libmpv2


3. Прокинуть симлинк (ссылку) из системного хранилища библиотек в локальное хранилище:
sudo ln -s /usr/lib/x86_64-linux-gnu/libmpv.so /usr/lib/libmpv.so.1


После этого проект запускается без проблем.
🔥2
Всем привет!

Вчера вышла "одна долгожданная игра", я думаю вы догадываетесь о какой игре речь😉

Так вот, я конечно же решил посмотреть, "как она?". Скачав 154 гига, добавив её в библиотеку Steam и запустив... Я получил ошибку, что не найден Microsoft Visual C++. Оно и понятно, когда устанавливаешь игру из стима, он устанавливает и все необходимые зависимости, тут же игра "сторонняя" и он не знает, что ей нужно что-то ещё, да ещё и на линуксе.

решение было найдено вот тут: https://www.youtube.com/watch?v=Dez4Z0xlZZU

Может кому-то пригодится, но чтобы не бегать по видосам, да и просто "для себя", напишу небольшую инструкцию к действию, чтоб потом не искать в случае повтора ситуации.
1
1. Скачиваем vc_redist для x86 и x64:
vc_redist_x86: https://aka.ms/vs/17/release/vc_redist.x86.exe
vc_redist_x64: https://aka.ms/vs/17/release/vc_redist.x64.exe

2. Открываем файловый менеджер по пути:
~/.local/share/Steam/steamapps/compatdata


3. Открываем Steam и добавляем оба exe-файла как сторонние приложения.

4. В свойствах каждого, во вкладке "Совместимость", выставляем галочку "... использовать Steam Play" и выбираем "Proton Experemental" или тот, которым вы пользуетесь.

5. Запускаем сперва x86, устанавливаем. Повторяем с x64.

6. Возвращаемся в файловый менеджер. Там появилось две новые директории. Сортируем по дате изменения. Самая свежая это x64, вторая соответственно x86. Дабы они не пропали после удаления из библиотеки Steam, переименовываем их в удобные названия. У меня это vcredist_x64 и vcredist_x86.

7. Открываем в Steam свойства игры, которой требуется Visual C++.
1. На вкладке "Ярлык" отключаем оверлей Steam. С некоторыми играми он вызывает конфликты.
2. Там же в поле "Параметры запуска" вписываем следующую строку, заменив путь до директорий на свой:
STEAM_COMPAT_DATA_PATH=/home/prodream/.local/share/Steam/steamapps/compatdata/vcredist_x86 STEAM_COMPAT_DATA_PATH=/home/prodream/.local/share/Steam/steamapps/compatdata/vcredist_x64 %command%


8. Запускаем игру
Всем привет!

Помимо программирования, я активно изучаю и DevOps направление: Администрирование серверов, контейнеризацию, CI/CD и это только малая часть того, что нужно знать и уметь.

В своих проектах я применяю CI/CD для проверки кода линтером, тестирования (если написаны тесты), сборки и деплоя. На любом из этих этапов может произойти ошибка, и если GitHub уведомляет по почте, то собственный git на базе Gitea так не делает (или я не разобрался), тем не менее, уведомления на почту не очень удобны. Тогда я задался вопросом оповещений в Telegram, что позволит оперативно реагировать на события в пайплайнах.

Было найдено несколько готовых решений с разным уровнем функциональности, однако, только один из них поддерживал отправку в топики супергрупп. Тогда я решил, что неплохо бы написать свой Action.

Но на чём его писать? Можно бы было на Python, но я и так всё пишу на нём, хотелось "чего-то нового" и я стал выбирать между GoLang и Rust. Оба языка набирают популярность и имеют свои сильные и слабые стороны. Уж не знаю почему именно, но я выбрал для решения этой задачи Rust.

Начал "как водится", с чтения официальной книги по Rust. Она хорошо написана, но просто так, читая книгу что-то выучить трудно и я решил параллельно начать писать. В процессе, количество открытых вкладок поисковиков, Stack Overflow и других сайтов росло в геометрической прогрессии, это не считая вопросов, которые я задавал чату GPT, прося его объяснить мне в максимальных подробностях.

Результатом стала программа для выполнения в среде GitHub (и не только) Actions под названием Telegram Notify Action. Программа, при срабатывании триггера (они могут быть разные, например always, как понятно из названия, срабатывает всегда, а failure, только при сбое) получает данные из окружения текущего workflow и формирует текст сообщения, а затем отправляет его в Telegram-бота по API.

Если вам интересно, хотите опробовать или просто поддержать поставив "звёздочку", прошу в репозиторий: https://github.com/proDreams/actions-telegram-notifier

Буду рад вашим комментариям и отзывам!

А я пойду дальше читать учебник, наверняка придётся ещё не раз рефакторить написанный код, а возможно и добавлять новый функционал.
🔥5
Привет всем!

Как у вас проходит предновогодняя суета? Носитесь поди в мыле? Ёлку поставили? Салаты заготовили?
А вот у меня что-то никакого праздника нет, даже гирлянду не повесил)

Перед новым годом нас решил обрадовать хостер сбоями, DDOS'ом и отсутствием быстрого решения. Понадобилось перенести данные с одного сервера на другой, а как водится - бэкапов у нас нет! Сервер с которого надо перенести практически не отвечает, только спустя ~два часа попыток подключиться, удалось на него прорваться и получить данные, но не суть.

Мне подкинули идею сделать sh-скрипт и даже показали пример, по выгрузке бэкапов на S3-хранилище и тут я задумался, что у меня на сервере порядка 10ти сервисов, а есть ещё и другие сервера... Писать для каждого случая свой скрипт, добавлять в cron, управлять ими. Муторно и монотонно, не находите?

Тогда я решил, что это отличная возможность продолжить практику с Rust. И меньше чем за сутки написал альфа версию утилиты для создания бэкапов. Суть вт ом, что в ней зашиты команды для создания бэкапов из локальных БД и их докер версий, а также бэкап указанной директории. Всё, что необходимо, это прописать желаемые бэкапы в конфигурационном файле, там же указать данные для подключения к S3.

Получилось, вроде неплохо, но впереди ещё нужно сделать логику по восстановлению бэкапов.

Репозиторий проекта на GitHub: https://github.com/proDreams/universal-backup-restore

Буду раз отзывам и звёздочкам, спасибо!

Всех с Наступающим Новым Годом!
🔥81🤝1
Всем доброго утра =)

Недавно узнал о новой, "хайпующей", IDE - Zed Editor. Выделяется в первую очередь тем, что делают её авторы весьма популярного редактора Atom, и, что написан он на Rust. О самом редакторе поговорим в другой раз на Салфетке, как освоюсь (или забью).

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

Проблема: редактор "не видел" установленные библиотеки в виртуальном окружении, а также в упор не видел модули/функции/переменные из других файлов проекта. Часы гуглежа и чтения Issue на Github привели только к решению первой проблемы, но не второй. Однако, я таки нашёл решение!

1. pyrightconfig.json
Первое, что необходимо сделать - это добавить pyrightconfig.json в корень проекта со следующим содержимым:
{
"venvPath": ".",
"venv": ".venv"
}


Тут указываем:
- venvPath - путь до директории с виртуальным окружением, либо точку, если оно находится в корне проекта.
- venv - название директории с виртуальным окружением.

2. python-lsp-server
Вторым шагом будет установка в виртуальное окружение сервер pylsp. Именно он отвечает за работу с файлами проекта.

Достаточно выполнить команду:
pip install 'python-lsp-server[all]'


Либо, добавить в dev-зависимости менеджера пакетов poetry или uv:
# poetry
poetry add -D 'python-lsp-server[all]'

# uv
uv add --dev 'python-lsp-server[all]'


Примечание к пунктам 1 и 2
Это необходимо делать в каждом проекте. Также, можно установить pylsp глобально и указывать его, но мне лень тестировать и это.

3. Конфигурация Zed
Открыть редактирование файла настроек, либо через главное меню, либо нажав CTRL+, (если настройки сочетаний клавишь дефолтные).

Там добавить следующий блок:
 "lsp": {
"pyright": {
"settings": {
"python.analysis.diagnosticMode": "workspace",
"python.pythonPath": ".venv/bin/python"
}
}
}


Заменив занчение python.pythonPath на путь к интерпретатору питона в виртуальном окружении, если оно находится не в корне проекта.

4. Перезапуск
Перезапустить Zed.

После этого, всё должно заработать корректно. Если нет, то ну я даже не знаю)

Бонус: Мой конфиг
Это скорее для меня самого, мало ли придётся переустановить.

{
"base_keymap": "VSCode",
"ui_font_size": 18,
"buffer_font_size": 18,
"theme": "JetBrains New Dark",
"icon_theme": {
"mode": "dark",
"light": "JetBrains New UI Icons (Light)",
"dark": "JetBrains New UI Icons (Dark)"
},
"autosave": "on_focus_change",
"languages": {
"Python": {
"language_servers": ["ruff", "pylsp", "pyright"],
"format_on_save": "on",
"formatter": [
{
"code_actions": {
"source.organizeImports.ruff": true,
"source.fixAll.ruff": true
}
},
{
"language_server": {
"name": "ruff"
}
}
]
}
},
"lsp": {
"pyright": {
"settings": {
"python.analysis.diagnosticMode": "workspace",
"python.analysis.typeCheckingMode": "basic",
"python.pythonPath": ".venv/bin/python"
}
},
"ruff": {
"initialization_options": {
"settings": {
"lineLength": 120,
"lint": {
"extendSelect": ["I"]
}
}
}
}
}
}
Всем привет!

Давно меня тут не было, ну да и фиг с ним) Принёс вам немного нейросетевого искусства)

Друг попросил сгенерировать ему изображение по его запросу:
Нарисуй большого старого подбитого робота среди руин в хвойном лесу. Погода светлая, но пасмурная. Есть небольшой туман. У робота на плечах есть орудия, в виде гаубиц. Ствол одного из орудий сломан пополам, и из него идёт дым. Робот находится в сидячем положении. Лицо направлено в небо


И вот результат. Первые два изображения это ChatGPT, третья в бесплатном GensparkAI.

Как вам?)
🔥31
В догонку решили попробовать Sora...

Пока определённо не очень. Либо я не понял, как надо)