Серия «Шпаргалки»

9

Shadow DOM - DOM внутри DOM

Дисклеймер. На пикабу до сих пор не завезли редактор кода, поэтому картинки. Кому на нравятся картинки - при желании может почитать статью на GitHub


DOM — это программный интерфейс (API) для кода страницы, который представляет страницу как древовидную структуру объектов.

Каждый HTML-элемент (например, <p>, <div>, <img>), каждый атрибут и каждый фрагмент текста является отдельным «узлом» (node) в этом дереве. С JavaScript, мы можем обращаться к этим узлам, чтобы динамически изменять страницу: менять текст, добавлять стили, создавать новые элементы или удалять существующие. По сути, DOM — это «живая» модель документа, с которой взаимодействует код.

Но у этой открытости есть и обратная сторона. Когда мы создаем сложный, многократно используемый компонент (например, кастомный видеоплеер или виджет календаря), его внутренняя структура и стили становятся уязвимыми. Стили CSS с основной страницы могут случайно «протечь» внутрь компонента и сломать его внешний вид. Аналогично, JavaScript-код страницы может непреднамеренно изменить внутренние элементы компонента, нарушив его логику.

Для решения этой проблемы и существует Shadow DOM (теневой DOM).

По своей сути, Shadow DOM — это «DOM внутри DOM». Это скрытое дерево элементов, которое прикрепляется к обычному элементу на странице (называемому «хостом»), но при этом оно изолировано от основного DOM. Оно позволяет разработчику создать герметичную границу вокруг внутренней структуры компонента, защищая его от внешнего мира.

Теневой DOM позволяет прикреплять скрытые DOM-деревья к элементам в обычном DOM-дереве. Это теневое дерево начинается с теневого корня (shadow root), под который можно прикреплять любые элементы так же, как и в обычном DOM.

Shadow DOM - DOM внутри DOM Гайд, Программирование, IT, Frontend, Javascript, HTML, Веб-разработка, Длиннопост, Dom

https://developer.mozilla.org/

Существует несколько терминов, связанных с теневым DOM, которые следует знать:

  • Теневой хост (Shadow host): Обычный узел DOM, к которому прикреплен теневой DOM.

  • Теневое дерево (Shadow tree): DOM-дерево внутри теневого DOM.

  • Теневая граница (Shadow boundary): Место, где заканчивается теневой DOM и начинается обычный DOM.

  • Теневой корень (Shadow root): Корневой узел теневого дерева.

Вы можете воздействовать на узлы в теневом DOM точно так же, как и на обычные узлы. Разница в том, что никакой код внутри теневого DOM не может повлиять на что-либо за его пределами, что обеспечивает надёжную инкапсуляцию.

До того, как теневой DOM стал доступен веб-разработчикам, браузеры уже использовали его для инкапсуляции внутренней структуры стандартных элементов. Например, элемент <video> с элементами управления. Всё, что вы видите в DOM, — это тег <video>, но он содержит ряд кнопок и других элементов управления внутри своего теневого DOM.

Создание теневого DOM

Создавать теневой DOM можно двумя способами: императивно с помощью JavaScript или декларативно прямо в HTML.

Императивно с помощью JavaScript

Этот способ отлично подходит для приложений, рендерящихся на стороне клиента. Мы выбираем элемент-хост и вызываем на нём метод attachShadow().

Shadow DOM - DOM внутри DOM Гайд, Программирование, IT, Frontend, Javascript, HTML, Веб-разработка, Длиннопост, Dom
Shadow DOM - DOM внутри DOM Гайд, Программирование, IT, Frontend, Javascript, HTML, Веб-разработка, Длиннопост, Dom

Результат на странице будет выглядеть так:

Я нахожусь в теневом DOM Я не в теневом DOM

Декларативно с помощью HTML

Для приложений, где важен рендеринг на стороне сервера, можно определить теневой DOM декларативно, используя элемент <template> с атрибутом shadowrootmode.

Shadow DOM - DOM внутри DOM Гайд, Программирование, IT, Frontend, Javascript, HTML, Веб-разработка, Длиннопост, Dom

Когда браузер обработает этот код, он автоматически создаст теневой корень для <div> и поместит в него содержимое тега <template>. Сам тег <template> при этом исчезнет из основного DOM-дерева.

Инкапсуляция: защита от JavaScript и CSS

Главное преимущество Shadow DOM — это изоляция. Давайте посмотрим, как она работает.

Инкапсуляция от JavaScript

Добавим кнопку, которая будет пытаться изменить все элементы <span> на странице.

Shadow DOM - DOM внутри DOM Гайд, Программирование, IT, Frontend, Javascript, HTML, Веб-разработка, Длиннопост, Dom

При нажатии на кнопку текст изменится только у <span>, который находится в основном документе. Элемент внутри теневого DOM останется нетронутым, потому что document.querySelectorAll() не может "заглянуть" за теневую границу.

Доступ к теневому DOM: свойство shadowRoot и работа с вложенностью

Когда мы вызываем host.attachShadow({ mode: "open" }), мы создаём теневой DOM в "открытом" режиме. Это означает, что мы можем получить доступ к его содержимому извне через свойство host.shadowRoot.

Shadow DOM - DOM внутри DOM Гайд, Программирование, IT, Frontend, Javascript, HTML, Веб-разработка, Длиннопост, Dom

Если же указать mode: "closed", свойство host.shadowRoot вернёт null, и доступ к теневому дереву извне будет закрыт. Это не строгий механизм безопасности, а скорее соглашение для разработчиков о том, что внутренности компонента трогать не следует.

Работа с вложенными теневыми деревьями

В сложных компонентных архитектурах один пользовательский элемент может содержать внутри себя другие пользовательские элементы, каждый из которых имеет свой собственный Shadow DOM. Чтобы добраться до элемента в глубоко вложенном теневом дереве, придётся последовательно "проходить" через каждый shadowRoot.

Представим себе такую структуру:

  • Компонент <nmbrs-form> (основная форма).

  • Внутри него находится <div>, а в нём — компонент <nmbrs-button> (кастомная кнопка).

  • Внутри <nmbrs-button> находится настоящая HTML-кнопка <button>.

Чтобы получить доступ к этой кнопке из глобального контекста, путь будет выглядеть так:

Shadow DOM - DOM внутри DOM Гайд, Программирование, IT, Frontend, Javascript, HTML, Веб-разработка, Длиннопост, Dom

SВ виде одной цепочки вызовов это выглядит так:

Shadow DOM - DOM внутри DOM Гайд, Программирование, IT, Frontend, Javascript, HTML, Веб-разработка, Длиннопост, Dom

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

Инкапсуляция от CSS

Стили, определённые на основной странице, не влияют на элементы внутри теневого DOM.

Shadow DOM - DOM внутри DOM Гайд, Программирование, IT, Frontend, Javascript, HTML, Веб-разработка, Длиннопост, Dom

Элемент <span> внутри теневого дерева не получит эти стили. Это решает огромную проблему случайных пересечений и конфликтов CSS.

Применение стилей внутри теневого DOM

Стили, определённые внутри теневого дерева, в свою очередь, не влияют на основную страницу. Есть два основных способа их добавления.

1. Конструируемые таблицы стилей (Constructable Stylesheets)

Этот метод позволяет создавать объект CSSStyleSheet в JavaScript и применять его к одному или нескольким теневым деревьям. Это эффективно, если у вас есть общие стили для множества компонентов.

Shadow DOM - DOM внутри DOM Гайд, Программирование, IT, Frontend, Javascript, HTML, Веб-разработка, Длиннопост, Dom

2. Добавление элемента <style>

Простой и декларативный способ — поместить тег <style> прямо внутрь теневого дерева (часто внутри <template>).

Shadow DOM - DOM внутри DOM Гайд, Программирование, IT, Frontend, Javascript, HTML, Веб-разработка, Длиннопост, Dom

Теневой DOM и пользовательские элементы: идеальное сочетание

Вся мощь теневого DOM раскрывается при создании пользовательских элементов (Custom Elements). Без инкапсуляции они были бы невероятно хрупкими.

Пользовательский элемент — это класс, наследующий HTMLElement. Как правило, сам элемент выступает в роли теневого хоста, а вся его внутренняя структура создаётся внутри теневого дерева.

Вот пример простого компонента <filled-circle>:

Shadow DOM - DOM внутри DOM Гайд, Программирование, IT, Frontend, Javascript, HTML, Веб-разработка, Длиннопост, Dom

Теперь мы можем использовать его в HTML как обычный тег, не беспокоясь о его внутреннем устройстве:

Shadow DOM - DOM внутри DOM Гайд, Программирование, IT, Frontend, Javascript, HTML, Веб-разработка, Длиннопост, Dom

Каждый из этих компонентов будет полностью инкапсулирован и защищён от влияния внешней страницы.

Полезно? Подпишись.
Удачи 🚀

Показать полностью 13
18

Шпаргалка по использованию diskpart в Windows

diskpart — это встроенная в Windows утилита командной строки, которая позволяет управлять физическими и виртуальными дисками, разделами и томами. В отличие от графического интерфейса "Управление дисками", diskpart предоставляет больше гибкости и подходит для продвинутых операций, особенно при автоматизации, установке системы, работе в среде восстановления или с виртуальными дисками.

⚠️ Внимание: можно потерять данные

diskpart не спрашивает подтверждение. Одна неверная команда — и данные будут потеряны. Прежде чем выполнять какие-либо действия:

  • Сделайте резервную копию.

  • Убедитесь, что работаете с правильным диском.

  • Прочитайте команду до конца.

🏁 Как запустить diskpart

  1. Нажмите Win + S, введите cmd или powershell.

  2. Кликните правой кнопкой по найденной программе и выберите "Запуск от имени администратора".

  3. В командной строке введите:diskpart

Вы увидите приглашение:

DISKPART>

📋 Базовые команды и сценарии использования

🔍 1. Просмотр доступных дисков

list disk

Выводит список всех подключённых физических дисков.

Пример:

Диск 0 476 ГБ
Диск 1 32 ГБ

📌 2. Выбор нужного диска

select disk 1
Все последующие команды будут относиться к выбранному диску.

💣 3. Очистка содержимого диска

clean

Удаляет таблицы разделов. Быстро, но восстановление теоретически возможно.

clean all

Полная очистка с записью нулей во все сектора. Без возможности восстановления.

🧱 4. Создание нового раздела

create partition primary size=10240

Создаёт основной раздел на 10 ГБ.

Для GPT-дисков также можно создать:

create partition efi size=100
create partition msr size=128

🧼 5. Форматирование раздела

После создания раздела выберите его:

select partition 1

И выполните форматирование:

format fs=ntfs quick label="DATA"

Аргументы:

  • fs=: файловая система (ntfs, fat32, exfat)

  • quick: быстрое форматирование

  • label=: имя (метка) тома

🔤 6. Присвоение или удаление буквы диска

assign letter=E

Присваивает букву E: выбранному тому.

remove letter=E

Удаляет букву — том останется, но без точки монтирования.

🟢 7. Установка активного раздела (MBR-диски)

active

Нужно для загрузки Windows с раздела на BIOS/MBR-дисках.

❌ 8. Удаление раздела

delete partition

Удаляет выбранный раздел.

Если это системный/защищённый раздел:

delete partition override

🔁 9. Преобразование таблицы разделов (MBR ↔ GPT)

Работает только на пустом (clean) диске.

convert gpt
convert mbr

📦 10. Работа с виртуальными дисками (VHD/VHDX)

create vdisk file="C:\vhd\test.vhd" maximum=10240 type=expandable
select vdisk file="C:\vhd\test.vhd"
attach vdisk
create partition primary
format fs=ntfs quick
assign letter=V
detach vdisk

Это удобно для тестирования, резервного копирования или шифрования.

🧪 Пример полного сценария: подготовка нового диска

list disk
select disk 1
clean
convert gpt
create partition primary
format fs=ntfs quick label="Storage"
assign letter=E

🧠 Советы

  • 💾 Сначала всегда используйте list disk, чтобы точно знать, с каким диском вы работаете.

  • 🔒 Никогда не запускайте clean без полной уверенности.

  • 📁 Используйте assign и remove для временного монтирования/отключения разделов.

  • 🛠️ Для ручной настройки загрузочной флешки — create partition primary, active, format, assign.

Показать полностью
7

Обновляем форк GitHub через PowerShell — от нуля до автоматизации

Как поддерживать свой форк в актуальном состоянии не тратя на это кучу времени?

В этой статье я покажу, как легко обновить ваш форк на GitHub с помощью PowerShell. В результате вы получите инструмент, который:

  • Работает с любой активной веткой вашего форка.

  • Автоматически подтягивает свежие изменения из upstream репозитория.

  • Выполняет rebase для чистоты истории коммитов.

  • Принудительно отправляет (push --force) обновленную ветку в ваш форк (origin).

  • И даже показывает наглядные уведомления о ходе процесса в Windows!

✅ Подготовка

Перед началом:

  • Убедитесь, что в вашем репозитории добавлен upstream на ОРИГИНАЛЬНЫЙ репозиторий:

Обновляем форк GitHub через PowerShell — от нуля до автоматизации Гайд, Программирование, Git, Powershell, Длиннопост

(Замените URL на актуальный для вашего проекта)

  • Установите модуль уведомлений [BurntToast], чтобы получать уведомления о процессе (полезно при автоматизации):

Обновляем форк GitHub через PowerShell — от нуля до автоматизации Гайд, Программирование, Git, Powershell, Длиннопост

Часть 1: Обновление форка командами в PowerShell (ручной способ)

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

  • Перейти в директорию репозитория (если вы еще не там):

Обновляем форк GitHub через PowerShell — от нуля до автоматизации Гайд, Программирование, Git, Powershell, Длиннопост
  • Определить текущую ветку:

Обновляем форк GitHub через PowerShell — от нуля до автоматизации Гайд, Программирование, Git, Powershell, Длиннопост
  • Получить изменения из upstream:

Обновляем форк GitHub через PowerShell — от нуля до автоматизации Гайд, Программирование, Git, Powershell, Длиннопост
  • Сделать rebase текущей ветки на основе аналогичной ветки из upstream:

Обновляем форк GitHub через PowerShell — от нуля до автоматизации Гайд, Программирование, Git, Powershell, Длиннопост
  • Обработка конфликтов (если возникли): Если git rebase сообщает о конфликтах:Откройте файлы с конфликтами в редакторе и разрешите их.
    Добавьте исправленные файлы: git add .
    Продолжите rebase: git rebase --continue
    (Или пропустить: git rebase --skip, или отменить: git rebase --abort)

  • Принудительно запушить изменения в origin (ваш форк на GitHub):

Обновляем форк GitHub через PowerShell — от нуля до автоматизации Гайд, Программирование, Git, Powershell, Длиннопост

Внимание: git push --force перезаписывает историю в удаленной ветке. Используйте с осторожностью, особенно если над веткой работают другие люди.

  • (Опционально) Показать уведомление:

Обновляем форк GitHub через PowerShell — от нуля до автоматизации Гайд, Программирование, Git, Powershell, Длиннопост

Теперь, когда мы понимаем основные шаги, автоматизируем их с помощью функции.

Часть 2: Создание PowerShell-функции Update-Fork

Соберем все команды в удобную функцию.

🧩 Шаг 1. Функция переходит в нужную директорию и определяет текущую ветку:

Обновляем форк GitHub через PowerShell — от нуля до автоматизации Гайд, Программирование, Git, Powershell, Длиннопост
  • param(...): Позволяет передавать путь к репозиторию или использовать текущий.

  • Import-Module BurntToast: Загружает модуль для уведомлений.

  • Set-Location: Переходит в нужную директорию.

  • git rev-parse --abbrev-ref HEAD: Получает имя текущей ветки.

🔁 Шаг 2: Добавим fetch и rebase

Подтянем изменения и сделаем rebase. Добавьте этот блок внутри функции Update-Fork, после определения $currentBranch:

Обновляем форк GitHub через PowerShell — от нуля до автоматизации Гайд, Программирование, Git, Powershell, Длиннопост
  • git fetch upstream: Загружает изменения из upstream.

  • git rebase "upstream/$currentBranch": Перемещает ваши локальные коммиты поверх последних изменений из upstream.

⚠️ Шаг 3: Обработка конфликтов

Если rebase не проходит чисто, PowerShell поможет разобраться. Добавьте этот блок после git rebase ...:

Обновляем форк GitHub через PowerShell — от нуля до автоматизации Гайд, Программирование, Git, Powershell, Длиннопост
  • Этот блок предлагает варианты действий при возникновении конфликтов во время rebase.

🚀 Шаг 4: Push и уведомление

В конце запушим изменения с --force и покажем результат. Добавьте этот блок в конец функции:

Обновляем форк GitHub через PowerShell — от нуля до автоматизации Гайд, Программирование, Git, Powershell, Длиннопост
  • Перед push проверяем, не остался ли rebase в незавершенном состоянии.

🧩 Финальная версия функции:

полный код функции Update-Fork большая простыня, поэтому ссылка на github

💡 Как запускать функцию

Вы можете использовать Update-Fork несколькими способами:

1. Вручную в текущей сессии PowerShell

Скопируйте весь код функции (из "Финальная версия функции") и вставьте его прямо в окно PowerShell. PowerShell поддерживает многострочную вставку. После этого вы сможете вызвать функцию:

Обновляем форк GitHub через PowerShell — от нуля до автоматизации Гайд, Программирование, Git, Powershell, Длиннопост

Или, если вы находитесь в другой директории, укажите путь к вашему форку:

Обновляем форк GitHub через PowerShell — от нуля до автоматизации Гайд, Программирование, Git, Powershell, Длиннопост

Этот способ подходит для разового использования, так как при закрытии сессии PowerShell функция будет забыта. 😒

2. 🛠️ Добавить функцию Update-Fork в профиль PowerShell

Это самый удобный способ, так как он сделает функцию Update-Fork доступной в любой новой сессии PowerShell без необходимости каждый раз копировать код.

Профиль PowerShell – это специальный скрипт (.ps1 файл), который автоматически выполняется при каждом запуске PowerShell.

📂 Через Notepad

✅ Шаг 1. Откройте PowerShell

  • Нажмите Win + R, введите powershell, нажмите Enter.

  • Или откройте PowerShell через меню Пуск.

📄 Шаг 2. Выполните команду для открытия файла профиля в Блокноте:

Обновляем форк GitHub через PowerShell — от нуля до автоматизации Гайд, Программирование, Git, Powershell, Длиннопост

🔍 Что это за команда?

  • $PROFILE — это специальная переменная PowerShell, которая содержит путь к вашему пользовательскому файлу конфигурации. Обычно это что-то вроде C:\Users\<ВашеИмяПользователя>\Documents\PowerShell\Microsoft.PowerShell_profile.ps1.

  • notepad — команда для запуска Блокнота с указанным файлом.

🧾 Что делать, если файл не существует?

Если вы увидите сообщение вида:

Обновляем форк GitHub через PowerShell — от нуля до автоматизации Гайд, Программирование, Git, Powershell, Длиннопост

— смело нажимайте "Да". PowerShell создаст для вас пустой файл профиля.

✏️ Шаг 3. Вставьте код функции

Скопируйте весь текст финальной версии функции Update-Fork (приведен выше) и вставьте его в открывшийся файл в Блокноте.

💾 Шаг 4. Сохраните и закройте

  • В Блокноте выберите "Файл" -> "Сохранить" (или нажмите Ctrl+S).

  • Закройте Блокнот.

🔄 Шаг 5. Перезапустите PowerShell

  • Закройте текущее окно PowerShell.

  • Откройте новое окно PowerShell.

Теперь функция Update-Fork должна быть доступна. Вы можете проверить это, выполнив:

Обновляем форк GitHub через PowerShell — от нуля до автоматизации Гайд, Программирование, Git, Powershell, Длиннопост

Если команда найдена, вы всё сделали правильно! 🎉 Теперь вы можете вызывать Update-Fork в любом репозитории.

💡 Альтернатива: Редактирование профиля через VS Code

Если вы используете Visual Studio Code (VS Code), редактировать профиль в нем может быть удобнее благодаря подсветке синтаксиса и другим функциям.

✅ Шаг 1. Убедитесь, что установлено расширение PowerShell

  1. Откройте VS Code.

  2. Перейдите на вкладку Extensions (Расширения) — иконка с квадратиками на боковой панели или Ctrl+Shift+X.

  3. В поиске введите PowerShell.

  4. Установите расширение PowerShell от Microsoft, если оно еще не установлено.

📝 Шаг 2. Откройте профиль PowerShell в VS Code

В терминале PowerShell (можно прямо в интегрированном терминале VS Code) выполните команду:

Обновляем форк GitHub через PowerShell — от нуля до автоматизации Гайд, Программирование, Git, Powershell, Длиннопост

🔍 Что происходит?

  • $PROFILE указывает на ваш файл профиля PowerShell.

  • code — это команда для запуска VS Code с указанным файлом.

📌 Если команда code не распознаётся: Это означает, что VS Code не добавлен в системную переменную PATH. Чтобы это исправить:

  1. Откройте VS Code.

  2. Нажмите Ctrl+Shift+P (или F1) чтобы открыть палитру команд.

  3. Начните вводить: Shell Command: Install 'code' command in PATH

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

✏️ Шаг 3. Вставьте код функции

Скопируйте полный текст финальной версии функции Update-Fork и вставьте его в открытый файл profile.ps1 в VS Code.

💾 Шаг 4. Сохраните и закройте

  • Сохраните файл в VS Code (Ctrl+S).

  • Можете закрыть VS Code или оставить открытым.

🔄 Шаг 5. Перезапустите PowerShell

  • Закройте все сессии PowerShell.

  • Откройте новую сессию PowerShell.

Теперь функция Update-Fork будет доступна. Проверьте, вызвав Update-Fork в вашем репозитории.

Если возникнут сложности с поиском профиля, команда $PROFILE в PowerShell всегда покажет точный путь. В зависимости от версии PowerShell и настроек системы, $PROFILE может указывать на разные файлы (например, profile.ps1 для всех хостов или специфичный для консоли).

3. Как отдельный .ps1-файл

  1. Сохраните полный код функции Update-Fork в файл, например, MyUpdateForkScript.ps1.

  2. Чтобы использовать функцию, вам нужно сначала "загрузить" этот файл в текущую сессию PowerShell (это называется "dot-sourcing"), а затем вызвать саму функцию:

Обновляем форк GitHub через PowerShell — от нуля до автоматизации Гайд, Программирование, Git, Powershell, Длиннопост

Или, если вы находитесь в директории со скриптом, а форк в другом месте:

Обновляем форк GitHub через PowerShell — от нуля до автоматизации Гайд, Программирование, Git, Powershell, Длиннопост
  1. Этот метод требует выполнения команды . .\MyUpdateForkScript.ps1 в каждой новой сессии, где вы хотите использовать функцию.

Готово! Теперь вы можете синхронизировать ваш форк с оригиналом одной командой Update-Fork.

Оригинал статьи на GitHub

Показать полностью 18
10

Как обойти ошибку SSLCertVerificationError при использовании requests в Python и работать с сертификатами

Ошибка SSLCertVerificationError часто возникает при попытке установить соединение с HTTPS-сервером. Это происходит, когда Python не может проверить подлинность SSL-сертификата сайта. Причины могут быть разными: отсутствующие корневые сертификаты, проблемы с сертификатом на сервере или неправильная настройка клиента.

В этой статье я рассмотрю способы обхода этой ошибки, и покажу, что такое SSL-сертификаты и как работать с ними, используя различные инструменты.

🔍 Что такое SSL-сертификат и зачем он нужен?

SSL (Secure Sockets Layer) — это протокол безопасности, который обеспечивает защищённую передачу данных между клиентом и сервером. Он используется для шифрования данных и подтверждения подлинности сервера.

💡 Пример: Алиса и Борис

Представьте, что Алиса хочет отправить Борису важное сообщение, но боится, что кто-то может перехватить его. Для того чтобы удостовериться, что сообщение дошло именно до Бориса, она решает использовать шифрование с сертификатами.

  • Алиса: она знает, что только Борис может расшифровать сообщение, потому что у него есть приватный ключ.

  • Борис: он подтверждает свою личность с помощью сертификата, который содержит его публичный ключ. Этот сертификат выдан надёжным центром сертификации, который гарантирует, что Борис действительно является тем, за кого себя выдает.

SSL-сертификат — это как удостоверение личности для веб-сайта, которое помогает избежать MITM-атак (атака «человек посередине») и обеспечивает безопасность передачи данных.

🛠 Способы решения ошибки SSLCertVerificationError

✅ Способ 1: Отключение проверки SSL (не рекомендуется для продакшн-среды)

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

Как обойти ошибку SSLCertVerificationError при использовании requests в Python и работать с сертификатами Гайд, Python, Инструкция, Программирование, Ssl, Длиннопост

⚠️ Важно: Использовать verify=False стоит только для доверенных источников и в локальной разработке. В продакшн-средах лучше избегать этого метода.

✅ Способ 2: Установка корневых сертификатов (перманентное решение для Windows)

Если вы используете Windows и у вас отсутствуют корневые сертификаты, вы можете установить их вручную. Это решение обеспечит, чтобы библиотека requests могла корректно проверять сертификаты на всех веб-сайтах.

Инструкция для Windows:

  1. Перейдите в папку установки Python. Например:C:\Users\<твой_пользователь>\AppData\Local\Programs\Python\Python312\

  2. Запустите файл Install Certificates.command (или install_certificates.bat, в зависимости от версии Python).

Это действие установит необходимые корневые сертификаты для вашего Python.

✅ Способ 3: Использование библиотеки certifi

Для того чтобы гарантировать корректную проверку SSL-сертификатов, можно использовать библиотеку certifi, которая поставляется с актуальными корневыми сертификатами.

Как обойти ошибку SSLCertVerificationError при использовании requests в Python и работать с сертификатами Гайд, Python, Инструкция, Программирование, Ssl, Длиннопост

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

🛠 Как создать SSL-сертификат на Windows?

Для тестирования и локальной разработки можно использовать самоподписанные сертификаты. Мы рассмотрим два способа их создания: через PowerShell и через командную строку (CMD).

🧰 Способ 1: Создание самоподписанного сертификата через PowerShell

PowerShell позволяет быстро создать самоподписанный SSL-сертификат. Вот пример команды:

Как обойти ошибку SSLCertVerificationError при использовании requests в Python и работать с сертификатами Гайд, Python, Инструкция, Программирование, Ssl, Длиннопост

Экспорт сертификата и ключа:

Как обойти ошибку SSLCertVerificationError при использовании requests в Python и работать с сертификатами Гайд, Python, Инструкция, Программирование, Ssl, Длиннопост

Вы можете использовать эти сертификаты для тестирования локальных серверов.

🧰 Способ 2: Создание сертификата через командную строку (CMD) с помощью openssl

Если у вас установлен OpenSSL, вы можете использовать его для создания сертификатов через командную строку.

  1. Создание самоподписанного сертификата:

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout localhost.key -out localhost.crt -subj "/CN=localhost"

  1. Экспорт сертификата в формат PFX:

openssl pkcs12 -export -out localhost.pfx -inkey localhost.key -in localhost.crt -passout pass:P@ssw0rd123

  1. Если у вас нет OpenSSL, можно использовать makecert.exe:

makecert -r -pe -n "CN=localhost" -b 01/01/2023 -e 01/01/2030 -sky exchange -sv localhost.pvk localhost.cer
pvk2pfx -pvk localhost.pvk -spc localhost.cer -pfx localhost.pfx

Статья на github 👉 https://github.com/hypo69/1001-python-ru/blob/master/articles/ssl_sertifiactes_in_python/ssl_sertifiactes_in_python.md

Удачной разработки, лёгкого кодинга и никаких SSLError! 💻✨🐍

Показать полностью 4
8

Создание интеллектуальных агентов с TinyTroupe: Быстрый старт

Что такое TinyTroupe?

TinyTroupe — это экспериментальная Python-библиотека от Microsoft, предназначенная для моделирования людей с определёнными личностными характеристиками, интересами и целями. Эти искусственные агенты, называемые «TinyPerson», могут взаимодействовать между собой и с окружающей средой, имитируя реалистичное поведение.

Что такое TinyPerson?

В основе TinyTroupe лежит класс TinyPerson. TinyPerson - это основной строительный блок для создания сложных, управляемых LLM агентов.
Экспериментируйте с различными промптами, конфигурациями памяти и ментальными способностями, чтобы раскрыть весь потенциал моделирования человеческого поведения.

Представьте его как чертеж для смоделированной личности. Каждая TinyPerson обладает:

  • Имя: Уникальный идентификатор.

  • Когнитивные состояния: Внутренние переменные, представляющие внимание, эмоции, цели и другие ментальные аспекты, влияющие на поведение.

  • Память: Разделенная на episodic_memory (конкретные события) и semantic_memory (общие знания), отражая структуру человеческой памяти.

  • Поведенческие абстракции: Методы listen() и act() имеют решающее значение для взаимодействия, моделируя циклы стимул-реакция.

Установка

  • В папке ваших проектов выполните команды

git clone https://github.com/microsoft/TinyTroupe.git
cd TinyTroupe
python -m venv venv
venv\Scripts\activate
pip install git+https://github.com/microsoft/TinyTroupe.git@main

код 👉 MyTinyTroupe/tiny_troupe.md at master · hypo69/MyTinyTroupe · GitHub

  • Переименуйте файл .env.example в .env и добавьте в него свой ключ OpenAI API.

Примеры использования

1. Создание TinyPerson

Внутри директории examples создайте файл my_person.py и добавьте следующий код:

Создание интеллектуальных агентов с TinyTroupe: Быстрый старт Программирование, Python, Openai, IT, Гайд, Разработка, Длиннопост

код 👉 https://github.com/hypo69/MyTinyTroupe/blob/master/examples/tiny_person.py

Этот пример создаёт агента, задаёт его характеристики, инициирует взаимодействие и показывает историю взаимодействия.

2. Методы взаимодействия

  • act(): Определяет поведение агента, запрашивая у LLM действие на основе памяти и когнитивного состояния.

  • listen(): Моделирует получение сообщения от другого агента или среды, сохраняя информацию в памяти.

  • _observe(): Записывает стимулы (события, ощущения) во внутреннюю память агента.

3. Управление памятью

TinyPerson использует episodic_memory и semantic_memory:

  • episodic_memory: Хранит конкретные события, организует их по времени и ограничивает количество используемых записей.

  • semantic_memory: Хранит общие знания, индексируя текстовые документы с помощью llama_index.

4. Внутреннее состояние и конфигурация

  • _update_cognitive_state(): Изменяет цели, внимание, эмоции и другие внутренние переменные.

  • define(): Устанавливает или обновляет параметры конфигурации агента.

  • reset_prompt(): Пересоздаёт системный промпт для LLM на основе текущей конфигурации и памяти агента.

Управление акторами и средой

5. Создание и управление мирами

В TinyTroupe среда моделируется с помощью TinyWorld, а социальные связи — через TinySocialNetwork.

Создание интеллектуальных агентов с TinyTroupe: Быстрый старт Программирование, Python, Openai, IT, Гайд, Разработка, Длиннопост

Метод make_everyone_accessible() позволяет всем агентам взаимодействовать друг с другом.

6. Управление акторами в комнате

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

Создание интеллектуальных агентов с TinyTroupe: Быстрый старт Программирование, Python, Openai, IT, Гайд, Разработка, Длиннопост

7. Запуск симуляции

Для моделирования взаимодействий используется run():

Создание интеллектуальных агентов с TinyTroupe: Быстрый старт Программирование, Python, Openai, IT, Гайд, Разработка, Длиннопост

8. Управление взаимодействиями

Если вам нужно контролировать диалоги между агентами:

Создание интеллектуальных агентов с TinyTroupe: Быстрый старт Программирование, Python, Openai, IT, Гайд, Разработка, Длиннопост

Этот код инициирует разговор и генерирует ответ агента.

9. Создание социальных сетей

TinySocialNetwork позволяет моделировать социальные связи и группы:

Создание интеллектуальных агентов с TinyTroupe: Быстрый старт Программирование, Python, Openai, IT, Гайд, Разработка, Длиннопост

Пример простого чата с общением на русском языке:

Создание интеллектуальных агентов с TinyTroupe: Быстрый старт Программирование, Python, Openai, IT, Гайд, Разработка, Длиннопост

функция установки языка акторов

Создание интеллектуальных агентов с TinyTroupe: Быстрый старт Программирование, Python, Openai, IT, Гайд, Разработка, Длиннопост


Часть словарей характеристики актора:

Создание интеллектуальных агентов с TinyTroupe: Быстрый старт Программирование, Python, Openai, IT, Гайд, Разработка, Длиннопост

Словари большие. Целиком здесь 👇
MyTinyTroupe/examples/agents/Lila.agent.json at master · hypo69/MyTinyTroupe · GitHub
MyTinyTroupe/examples/agents/Oscar.agent.json at master · hypo69/MyTinyTroupe · GitHub

код чата:

Создание интеллектуальных агентов с TinyTroupe: Быстрый старт Программирование, Python, Openai, IT, Гайд, Разработка, Длиннопост

Этот код создает двух агентов (lila и oscar), загружает их спецификации, переводит их язык общения на русский, помещает их в общий мир (world), делает всех участников доступными друг для друга и запускает взаимодействие между ними.

Разбор кода по шагам:

  1. Загрузка агентов из спецификаций:

Создание интеллектуальных агентов с TinyTroupe: Быстрый старт Программирование, Python, Openai, IT, Гайд, Разработка, Длиннопост
  • Создаются два агента: lila и oscar.

  • Они загружаются из спецификаций lila_spec и oscar_spec, которые, содержат их характеристики (возраст, профессия, интересы и т. д.).

  1. Настройка языка общения:

Создание интеллектуальных агентов с TinyTroupe: Быстрый старт Программирование, Python, Openai, IT, Гайд, Разработка, Длиннопост
  • configure_language устанавливает русский язык для агентов.

  • Это также пересоздает их системный промпт, чтобы они отвечали на русском.

  1. Создание мира и размещение агентов:

Создание интеллектуальных агентов с TinyTroupe: Быстрый старт Программирование, Python, Openai, IT, Гайд, Разработка, Длиннопост
  • Создается виртуальный мир TinyWorld с названием "Chat Room".

  • В этот мир добавляются lila и oscar, что позволяет им взаимодействовать.

  1. Делаем всех доступными друг для друга:

Создание интеллектуальных агентов с TinyTroupe: Быстрый старт Программирование, Python, Openai, IT, Гайд, Разработка, Длиннопост
  • Убеждаемся, что агенты могут "видеть" и "слышать" друг друга.

  • Без этого метода агент мог бы не знать, что другой агент существует в том же мире.

  1. Инициирование общения:

Создание интеллектуальных агентов с TinyTroupe: Быстрый старт Программирование, Python, Openai, IT, Гайд, Разработка, Длиннопост
  • lila получает фразу "Начинает разговор с Оскаром, чтобы узнать о нем больше".

  • Это стимулирует ее к действию (например, задать вопросы Оскару).

  1. Запуск симуляции взаимодействий:

Создание интеллектуальных агентов с TinyTroupe: Быстрый старт Программирование, Python, Openai, IT, Гайд, Разработка, Длиннопост
  • world.run(4) запускает симуляцию на 4 цикла, в течение которых агенты будут:

    • Воспринимать информацию (listen()).

    • Действовать (act()).

    • Обновлять память (что они узнали, какие эмоции испытали).

Ожидаемое поведение

  • lila попытается поговорить с oscar, задавая вопросы на русском.

  • oscar ответит, используя информацию из своей памяти и спецификации.

  • world.run(4) заставит их несколько раз обменяться репликами.

  • После выполнения кода в памяти агентов появятся новые знания о собеседнике.

💡 Совет: Если агенты не разговаривают, попробуйте добавить world.step() после lila.listen(), чтобы проверить их реакцию перед запуском полного цикла run(4).

Пример в Google Colab
код на гитхабе

Тебя может заинтересовать также LangChain и Browser-Use: Создание ИИ-агентов для работы с веб-браузером. Быстрый старт

Удачи!

Показать полностью 16
11

Python. Шпаргалки: Библиотека schedule

Библиотека schedule в Python предназначена для простого и удобного планирования регулярного выполнения задач,
которая позволяет установить, как часто должна выполняться определенная функция (например, каждый час, день, неделю)

Установка

pip install schedule

Использование

Чтобы запланировать задачу, необходимо определить функцию и использовать schedule.every(), чтобы назначить интервал выполнения.

Пример: запуск задачи каждые 10 секунд

Python. Шпаргалки: Библиотека schedule Python, Гайд, Программирование, Инструкция, Длиннопост

Этот скрипт выполняет job() каждые 10 секунд. Цикл while постоянно проверяет наличие запланированных задач и выполняет их в нужное время.

Запуск задач в определенное время

Вы можете запланировать выполнение задач в заданное время, используя .at() и другие параметры интервала:

Python. Шпаргалки: Библиотека schedule Python, Гайд, Программирование, Инструкция, Длиннопост

Управление несколькими задачами

Вы можете запланировать несколько задач, определив отдельные функции и назначив им разные интервалы.

Python. Шпаргалки: Библиотека schedule Python, Гайд, Программирование, Инструкция, Длиннопост

Удаление запланированных задач

Чтобы удалить задачу, используйте schedule.clear(). Вы можете удалить все задачи или указать конкретную, используя теги.

Python. Шпаргалки: Библиотека schedule Python, Гайд, Программирование, Инструкция, Длиннопост

Запуск планировщика в фоновом режиме

Для приложений с графическим интерфейсом или постоянным фоновым выполнением можно запустить планировщик в отдельном потоке.

Python. Шпаргалки: Библиотека schedule Python, Гайд, Программирование, Инструкция, Длиннопост

Пример:
cheatsheets/module_schedule/periodic_tasks_using_schedule.py

Связанная статья:

Планировщик задач Windows

Удачи!

Показать полностью 4
6

Использование array.array в Python: когда и зачем применять

array.array — это специализированный тип данных в Python, предназначенный для хранения последовательностей однотипных чисел. В отличие от list, массивы array.array обеспечивают более эффективное использование памяти и повышенную производительность при работе с числовыми данными.

🔹 В каких случаях полязно использовать array.array

1. Для работы с большими массивами чисел

При обработке больших объёмов числовых данных array.array позволяет значительно экономить память, поскольку хранит элементы в компактном виде. В отличие от list, который использует объекты Python для хранения значений, array.array использует непрерывный блок памяти, в котором числа хранятся в виде простых байтовых последовательностей. Это уменьшает накладные расходы, связанные с управлением объектами Python, и ускоряет доступ к элементам.

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

Пример сравнения памяти между array.array и list:

Использование array.array в Python: когда и зачем применять Гайд, Python, Инструкция, Программирование, Длиннопост

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

Чтение, запись и операции над array.array работают быстрее, чем над list, поскольку массив использует фиксированное представление элементов в памяти.

Использование array.array в Python: когда и зачем применять Гайд, Python, Инструкция, Программирование, Длиннопост

3. Для передачи данных в C-библиотеки

Если требуется передавать массив данных в C или взаимодействовать с ctypes и struct, array.array значительно упрощает задачу. Массив array.array хранит данные в компактном виде, что делает его удобным для передачи в нативные C-функции и API, которые ожидают последовательности чисел в виде непрерывного блока памяти.

Пример использования с ctypes:

Использование array.array в Python: когда и зачем применять Гайд, Python, Инструкция, Программирование, Длиннопост

Использование array.array позволяет избежать дополнительных преобразований типов данных и копирования памяти, что особенно важно при работе с высокопроизводительными вычислениями и библиотеками на C.

Пример использования с struct, который помогает кодировать и декодировать бинарные данные:

Использование array.array в Python: когда и зачем применять Гайд, Python, Инструкция, Программирование, Длиннопост

4. Для обмена бинарными данными

Если необходимо хранить и передавать числовые данные в компактном бинарном формате, array.array предоставляет удобные методы tobytes() и frombytes(). Эти методы позволяют легко конвертировать массив в последовательность байтов и обратно без необходимости дополнительных преобразований, как это требуется для списков.

Пример сохранения и восстановления массива из бинарных данных:

Использование array.array в Python: когда и зачем применять Гайд, Python, Инструкция, Программирование, Длиннопост

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

5. Для работы с фиксированными структурами данных

Если заранее известно, что требуется хранить только один тип данных, использование array.array гарантирует отсутствие ошибок, связанных с разнородными элементами.

Использование array.array в Python: когда и зачем применять Гайд, Python, Инструкция, Программирование, Длиннопост

6. Для хранения данных в бинарных файлах

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

Использование array.array в Python: когда и зачем применять Гайд, Python, Инструкция, Программирование, Длиннопост

🔹 Сравнение array.array и list

Использование array.array в Python: когда и зачем применять Гайд, Python, Инструкция, Программирование, Длиннопост

Удачи!

Показать полностью 8
6

Планировщик задач Windows: Автоматизируем рутину

  • Что такое Планировщик задач?

Планировщик задач (Task Scheduler) - системная служба Windows, которая позволяет создавать и управлять автоматизированными задачами. Задачи могут быть настроены для запуска в определенное время, при определенных событиях (например, при входе пользователя в систему) или при соблюдении определенных условий.

Как открыть Планировщик задач?

Есть несколько способов:

  • Через поиск Windows: Введите "Планировщик задач" в поле поиска на панели задач и выберите соответствующий результат.

  • Через команду "Выполнить": Нажмите Win + R, введите taskschd.msc и нажмите Enter.

Планировщик задач Windows: Автоматизируем рутину Python, Инструкция, Windows, Длиннопост, Планировщик задач
  • Через панель управления: Откройте панель управления, выберите "Система и безопасность", а затем "Администрирование" и "Планировщик заданий".

Создание задачи: пошаговая инструкция

- Открыть Планировщик задач: (см. выше).

Создать задачу:

В левой панели выберите "Библиотека планировщика заданий". В правой панели нажмите "Создать простую задачу..." или "Создать задачу...".

  • Простая задача: Помогает быстро настроить основные параметры задачи, такие как имя, описание, расписание и действие.

  • Создать задачу: Предоставляет больше возможностей для настройки, включая триггеры, действия, условия и параметры.

Планировщик задач Windows: Автоматизируем рутину Python, Инструкция, Windows, Длиннопост, Планировщик задач

Заполнить параметры задачи:

  • Имя и описание: Укажите понятное имя и описание, чтобы легко идентифицировать задачу в будущем.

Планировщик задач Windows: Автоматизируем рутину Python, Инструкция, Windows, Длиннопост, Планировщик задач
Планировщик задач Windows: Автоматизируем рутину Python, Инструкция, Windows, Длиннопост, Планировщик задач
  • Триггеры: Определите, когда задача должна запускаться. Это может быть расписание (ежедневно, еженедельно, ежемесячно), событие (при входе пользователя в систему, при запуске компьютера) или условие (при простое системы).

Планировщик задач Windows: Автоматизируем рутину Python, Инструкция, Windows, Длиннопост, Планировщик задач
  • Действия: Укажите, что должна делать задача. Чаще всего это запуск программы или скрипта, но также можно отправить электронное письмо или отобразить сообщение.

Планировщик задач Windows: Автоматизируем рутину Python, Инструкция, Windows, Длиннопост, Планировщик задач
Планировщик задач Windows: Автоматизируем рутину Python, Инструкция, Windows, Длиннопост, Планировщик задач
Планировщик задач Windows: Автоматизируем рутину Python, Инструкция, Windows, Длиннопост, Планировщик задач
Планировщик задач Windows: Автоматизируем рутину Python, Инструкция, Windows, Длиннопост, Планировщик задач
  • Условия: Укажите дополнительные условия, при которых задача должна запускаться (например, только при питании от сети).

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

    • "Запустить задачу как можно скорее после пропущенного запланированного запуска": Гарантирует, что задача будет выполнена, даже если компьютер был выключен во время запланированного запуска.

    • "Остановить задачу, если она выполняется дольше": Предотвращает зависание задач и перегрузку системы.

Планировщик задач Windows: Автоматизируем рутину Python, Инструкция, Windows, Длиннопост, Планировщик задач
  1. Нажать "ОК": После настройки всех параметров нажмите "ОК", чтобы сохранить задачу.

Полезные примеры использования

Автоматическое резервное копирование файлов

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

python

Планировщик задач Windows: Автоматизируем рутину Python, Инструкция, Windows, Длиннопост, Планировщик задач

powershell

Планировщик задач Windows: Автоматизируем рутину Python, Инструкция, Windows, Длиннопост, Планировщик задач

Удачи!

Показать полностью 13
Отличная работа, все прочитано!