Python Materials For Beginners
447 subscribers
39 photos
1 video
9 files
150 links
Download Telegram
Forwarded from Ruslan Kiyanchuk
Залежить від того, з якого рівня, і на скільки глибше :)

Для початківців з інтуїтивними поясненнями основ:
- Real World Cryptography by David Wong
- Serious Cryptography, 2nd Edition by JP Aumasson (ця розрахована на розробників, але поверхнева, лише помочити ніжки)

З трохи більшим заглибленням в теорію:
- Cryptography Made Simple by Nigel Smart
(дещо старша книга і чомусь має прогалини, як то взагалі не говорить про автентифіковане шифрування, але доступно пояснює теорію – більш академічно аніж в попередніх двох книгах)
- Joy of Cryptography by Joy Misulek (це undergraduate level книга у вільному доступі)
Forwarded from Vitalii
👍5🔥1
Приблизний час доступу до різних видів пам'яті для порівняння.
👍2🔥2
Що стосовно іноді моїх власних коротких заміток у цьому каналі? Моливо замітки будуть по якимось відео з ютюба.
Anonymous Poll
4%
Ні, тільки матеріали для початківців
86%
Так, можна замітки автора з прикладами коду
64%
Так, можна й замітки по відео з ютюба
🚫 Чому не варто збирати Python-проєкт у exe через PyInstaller

Багато початківців намагаються зібрати свій Python-проєкт у .exe-файл. Але є чимало причин, чому це не завжди гарна ідея.

Насправді цей процес не є компіляцією.
Фактично відбувається лише упаковка Python-інтерпретатора та бібліотек у саморозпакувальний архів [1].
Коли користувач запускає exe, спочатку виконується розпаковка цього архіву у тимчасову теку, і лише потім — запуск скрипта. Це має низку негативних наслідків:

1️⃣ Антивіруси часто сприймають такий .exe як загрозу.
Через використання стиснення файлів антивірусне ПЗ може активно скаржитися на ваш exe. Щоб переконатися в цьому, достатньо завантажити файл на VirusTotal. Якщо користувач зробить таку перевірку й побачить попередження, довіра до вас і вашого ПЗ може бути підірвана.

2️⃣ Проблеми з шляхами
exe запускається з однієї теки, але архів розпаковується та виконується в іншій. Це змушує вносити зміни до коду проєкту, які будуть враховувати зміну шляху.

3️⃣ Несумісність з окремими бібліотеками
Існує ймовірність, що через особливості певної бібліотеки проєкт не збиратиметься у exe. Причому ситуація може змінюватися від версії до версії бібліотеки і python. Найчастіше проблеми виникають із модулями, що використовують код на C/C++.

4️⃣ Складна діагностика помилок
Упаковка, особливо з опцією --windowed, може маскувати помилки: замість виведення повідомлення у консолі користувач просто отримає падіння програми. На одних пристроях програма може запускатися, а на інших — ні. Виявити причину, виправити її або оновити бібліотеки "на місці" просто неможливо.

5️⃣ Довгий старт програми
Очевидно що розпаковка з архіву буде сповільнювати запуск.

Хоча збірка у exe може здаватися зручною для поширення, на практиці вона часто створює більше проблем, ніж вирішує.

#PyInstaller
👍1
Приклад збірки PyQt6 проєкту PyInstaller-ом.

Якщо Ви все-таки наважилися зібрати свій проєкт pyinstaller у exe пропоную розглянути приклад.
Як приклад будемо використовувати мій шаблон для PyQt6
Шаблон дуже простий - показує просте вікно.

Він має файли які задані відносними шляхами:
1️⃣ Одна з переваг Qt - використання файлів "форм" формату *.ui в даному випадку це - main_window.ui
2️⃣ icon.png це іконка у головному вікні, вона задана main_window.ui через дизайнер "форм" QtDesiginer

Напишемо pyinstaller_build.bat скрипт який буде займатись збіркою у exe

SET SCRIPT_NAME=main.py
SET EXE_NAME=prog

.venv\Scripts\pyinstaller.exe ^
--add-data "main_window.ui;." ^
--add-data "icon.png;." ^
--icon "icon.ico" ^
--windowed ^
--onefile ^
--noupx ^
--name %EXE_NAME% ^
%SCRIPT_NAME%

pause


Як бачимо всі файли які використовуються програмою треба додавати опцією --add-data
Також сам exe файл може мати іконку для цього має бути використана опція --icon але треба зауважити що формат іконки має бути саме .ico (png не підходить).

Опція --windowed саме для GUI застосунків щоб сховати вікно консолі.
Опція --onefile саме збірка у exe
Опція --noupx збирати без upx стиснення.

Але цього недостатньо, щоб наш додаток знаходив файли main_window.ui та icon.png при запуску треба змінювати робочу директорію (це треба робити на самому початку скрипта).

try:
import os, sys

os.chdir(sys._MEIPASS)
print(f"{sys._MEIPASS=}")

except AttributeError:
pass


Атрибут _MEIPASS додається динамічно pyinstaller-ом - це тимчасова тека куди розпаковується проєкт

Без цієї вставки коду буде помилка про те, що вказані файли відсутні.
Також я додам скріншот з збіркою без опції --windowed щоб можна було побачити як виглядає sys._MEIPASS

Додаткові файли будуть прикріплені у коментарях.

#PyInstaller #PyQt6
👍43
Схемка по основам git
яка дає уявлення які можуть бути стани репозиторію і які команди відповідають переходам між ними.

https://www.youtube.com/watch?v=G5nhfQ_lfNg
👍2
🔷 Використання SQLite разом з SqlAlchemy

⚠️ Цікавий нюанс: SQLite за замовчуванням не перевіряє зовнішні ключі.
У багатьох СУБД (PostgreSQL, MySQL) зовнішні ключі завжди перевіряються.

🔧 У SQLite за це відповідає прапорець foreign_keys.
За замовчуванням він OFF, і якщо його не виставити в ON, можна отримати неузгоджені дані у зв’язаних таблицях, і довго дивуватись чому так.

👉 Виставити цей прапорець можна таким чином:

async with engine.begin() as connection:
await connection.execute("PRAGMA foreign_keys=ON")


Або одразу оголосити обробник події:

from sqlalchemy import event
from sqlalchemy.engine import Engine

@event.listens_for(Engine, "connect")
def set_sqlite_pragma(dbapi_connection, _):
cursor = dbapi_connection.cursor()
cursor.execute("PRAGMA foreign_keys=ON")
cursor.close()


Так Ви уникнете "тихих" проблем з цілісністю даних.


#sqlite #sqlalchemy
👍2
🔶 Requests. Простий GET-запит.

У Python HTTP-запити можна робити вбудованою бібліотекою urllib.
Але значно зручніше використовувати сторонню бібліотеку requests. Варто також згадати інші бібліотеки зі схожим інтерфейсом — наприклад, httpx та curl_cffi. Вони можуть працювати асинхронно та мають більш наближені до браузерних TLS-відбитки, що зменшує ймовірність бану при скрапінгу.

import requests

response = requests.get("https://example.com/")
response.raise_for_status()

print(response.text)

with open("content.html", "wb") as file:
file.write(response.content)


Це простий приклад GET-запиту для отримання HTML-сторінки.
HTML-код виводиться в консоль як рядок і зберігається у файл у байтовому вигляді.

Для різних HTTP-методів є відповідні методи в requests. Додаткові дані можна передавати через аргументи методів (заголовки, параметри запиту, тіло, проксі тощо).

⚠️ Поширена помилка початківців — забути перевірити код відповіді сервера. Найпростіше це зробити викликом raise_for_status(), який підніме виняток, якщо код відповіді не в межах 200–399.
Але також можна перевіряти атрибут status_code.

#http #requests #GET
👍4
🔷 Requests. GET з параметрами та заголовками.

Для прикладу виконаємо запит до погодного API

https://api.open-meteo.com/v1/forecast?latitude=50.4501&longitude=30.5234&current_weather=True&timezone=Europe/Kyiv

import requests

url = "https://api.open-meteo.com/v1/forecast"

params = {
"latitude": 50.4501,
"longitude": 30.5234,
"current_weather": True,
"timezone": "Europe/Kyiv"
}

headers = {
"User-Agent": "my-script/1.0",
}

response = requests.get(url, params=params, headers=headers)
response.raise_for_status()

json_content = response.json()
current_weather = json_content["current_weather"]
print("Температура в Києві:", current_weather["temperature"])
print("Швидкість вітру:", current_weather["windspeed"])


Основні моменти:

1️⃣ Параметри запиту передаються у вигляді словника у метод, бібліотека кодує їх
2️⃣ Суто для демонстрації змінюємо заголовки запиту (User-Agent)
3️⃣ Об'єкт response має метод json який перетворює json-відповідь у python об'єкт (зазвичай словник)

#http #requests #GET
👍3
Channel name was changed to «Python Materials For Beginners»
🔶 Requests. POST form-urlencoded

POST використовується для створення ресурсів або надсилання даних на сервер. Дані передаються у тілі запиту, а не у URL (як при GET).

Є різні типи POST-запитів:

🔺 application/x-www-form-urlencoded – дані форми кодуються у вигляді param1=value1&param2=value2
🔺 application/json – дані у вигляді json
🔺 multipart/form-data – форми з файлами.

Даний приклад демонструє передачу даних форми (form-urlencoded)
Бібліотека автоматично виставляє заголовок відповідно до типу:

Content-Type: application/x-www-form-urlencoded

Форми часто використовується для авторизації на сайтах: у даних передаються логін і пароль. Але у даному випадку ми передаємо текст і розмір картинки, а сайт повертає нам QR-код картинку.

import requests

url = "https://api.qrserver.com/v1/create-qr-code/"

data = {
"data": "Привіт світ!",
"size": "200x200"
}

response = requests.post(url, data=data)
response.raise_for_status()

with open("qr_code.png", "wb") as file:
file.write(response.content)

#http #requests #POST
👍2