Python_BE1
9 subscribers
748 photos
252 videos
7 files
672 links
Канал по Python, полезный и интересный контент для всех уровней.
По вопросам сотрудничества @cyberJohnny
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
⭐️ Давным-давно в терминале, в далекой-далекой Галактике…
May the 4th be with you: 4 мая — неофициальный день «Звёздных войн».

ASCII Movie - это проект с открытым исходным кодом, который будет «транслировать» оригинальный фильм «Звёздные войны» (эпизод IV) в виде ASCII-графики прямо в ваш терминал, используя протоколы SSH или Telnet.

Сервис реализован на языке Go и снабжён простым текстовым интерфейсом с поддержкой клавиатуры и мыши, а также доступен в виде Docker-контейнера.

`sudo docker run —rm -it ghcr.io/gabe565/ascii-movie play`

По SSH. #MayThe4th

http://github.com/gabe565/ascii-movie

@python_be1
✍️ novelWriter — минималистичный редактор для писателей с поддержкой Markdown. Проект использует облегченный синтаксис на основе Markdown и сохраняет все данные в виде обычных текстовых файлов, что делает его идеальным для работы с системами контроля версий.

Инструмент делает акцент на простоте и надежности. Вместо проприетарных форматов он использует чистый текст с метаданными в JSON. Редактор написан на Python с использованием Qt6 и доступен для всех основных ОС. При этом проект остается полностью открытым и принимает contributions, особенно в части переводов через Crowdin.

🤖 GitHub (https://github.com/vkbo/novelWriter)

@python_be1
🐳 Как устроен Docker: что происходит «под капотом»

Поговорим немного про базу.

Docker — одно из самых популярных средств контейнеризации. Его простота снаружи скрывает сложную архитектуру. Разберём, как он устроен внутри.

1) Что такое контейнер?

Контейнер — изолированная среда, где запускается приложение со всеми зависимостями.
⚠️ Это не виртуальная машина: контейнер делит ядро ОС с хостом, но видит только свою «песочницу» через изоляцию.

2) Основные компоненты

• Docker Engine
– Docker Daemon (`dockerd`) управляет контейнерами, образами, сетями
– Docker CLI (`docker`) — интерфейс пользователя
– REST API — взаимодействие CLI и Daemon

👉 Пример: `docker run nginx` → CLI отправляет запрос, Daemon находит образ, создаёт контейнер, запускает процесс.

3) Namespaces

Механизм изоляции в Linux, создающий для контейнера:

• свой процессный ID (pid namespace)
• файловую систему (mnt namespace)
• сеть (net namespace)
• hostname (uts namespace)
• IPC (ipc namespace)

👉 Благодаря namespace контейнер видит «свою» мини-ОС, хотя на деле — это лишь виртуальные границы.

4) Cgroups

Ограничивают и учитывают ресурсы (CPU, RAM, I/O, сеть).
Пример: можно задать лимит 512 МБ RAM и 0.5 CPU.
Если приложение превышает лимит — Docker его ограничит или остановит.

5) Union File Systems (OverlayFS)

Docker использует многослойную файловую систему. Каждый шаг `Dockerfile` создаёт новый слой.
При запуске контейнера создаётся верхний writable-слой, остальные read-only.

👉 10 контейнеров на одном образе разделяют слои → экономия места.

6) Container Runtime

Docker использует `runc` для запуска контейнера (соответствует OCI Runtime Spec).
Daemon вызывает `runc`, который через `clone()`, `setns()`, `chroot()` изолирует процесс.

7) Docker Images
Образ — read-only слои, собранные в Union FS.
Каждый слой — изменения относительно предыдущего (например, установка пакета → новый слой).
Хранение: локально (`/var/lib/docker`) или в реестре (Docker Hub, GitLab Container Registry).

8) Docker Networking

Docker создаёт виртуальные сети (bridge, overlay, host).
По умолчанию контейнеры подключаются к bridge и получают IP из внутреннего пула.

👉 Можно пробросить порты через `-p`, создать собственные сети, объединять контейнеры через `docker network connect`.

В Swarm используется Overlay network (сеть между хостами).

9) Безопасность

Docker использует:

• seccomp (ограничение системных вызовов)
• AppArmor / SELinux (контроль привилегий)
• user namespaces (отображение UID контейнера в другой UID хоста)

⚠️ По умолчанию контейнеры имеют широкий доступ (например, `/proc` виден). Для production стоит ограничивать права (например, `--cap-drop`).

10) Что происходит при `docker run nginx`?

1. CLI отправляет запрос через API
2. Daemon ищет образ (локально или в registry)
3. Создаётся read-write слой контейнера
4. Создаются namespace (pid, net, mnt…)
5. Применяются cgroups
6. Вызывается `runc` для изоляции процесса
7. Контейнер подключается к сети
8. Запускается ENTRYPOINT/command

Контейнер живёт, пока жив его процесс.

11) Почему Docker — не магия?

Docker использует стандартные возможности ядра Linux (namespaces, cgroups, chroot, seccomp, overlayfs), оборачивая их в удобный интерфейс.

Контейнер — просто изолированный процесс, а не полноценная VM.
Поэтому Docker лёгкий, быстрый, удобный.

12) Заключение

Под капотом Docker:

• namespaces — изоляция
• cgroups — контроль ресурсов
• runc — запуск
• overlayfs — многослойная ФС
• REST API + Daemon + CLI — взаимодействие

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

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

➡️ Подробнее (https://uproger.com/kak-ustroen-docker-chto-proishodit-pod-kapotom/)

@python_be1
👩‍💻 datasketch (https://github.com/ekzhu/datasketch) — Python-библиотека, содержащая реализации вероятностных структур данных, которые используются для оптимизации работы с большими объемами данных!

🌟 Среди основных возможностей — оценка схожести Jaccard с помощью MinHash и его взвешенной версии, а также оценка кардинальности множества с помощью HyperLogLog и HyperLogLog++. Эти структуры данных позволяют выполнять операции, такие как поиск схожих элементов или подсчет уникальных объектов, быстро и с минимальными затратами памяти.

🔐 Лицензия: MIT

🖥 Github (https://github.com/ekzhu/datasketch)

@python_be1
This media is not supported in your browser
VIEW IN TELEGRAM
🔥 AgenticSeek — мощнейший опенсорс ИИ-агент.

Это лучшая бесплатная альтернатива Manus AI за 200$. Есть всё, что нужно — поиск по интернету, поддержка голосового управления + он хороший помощник по кодингу.

И он умеет почти всё:

• Спланирует тур за границу: подберёт билеты, отели, маршруты
• Проведёт аудит бизнеса и предложит варианты оптимизации
• Возьмёт на себя работу в таблицах, анализ данных и отчётов
• Напишет код под любую задачу
• Прочитает книги, статьи, репозитории, просёрфит сайты и соберёт данные
• А теперь представьте: вы даёте ему сотню таких задач одновременно — это уже не ассистент, а полноценный бизнес-комбайн

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

Управлять можно голосом
Все приватные данные остаются только у вас

На GitHub уже 1800 звезд.

https://github.com/Fosowl/agenticSeek

@python_be1
📜 История SQL — от лабораторной идеи до «языка данных» № 1

Как появился самый известный язык работы с базами, почему он едва не остался «Сиквелом» и какие любопытные факты о нём редко всплывают в учебниках.

1. Всё началось с таблицы на бумаге

- 1970 г. — британский математик Эдгар Ф. Кодд публикует культовую статью *“A Relational Model of Data for Large Shared Data Banks”*.
- В ней впервые прозвучала идея: хранить данные в виде связанных таблиц, а не как запутанные иерархии (IMS) или сетевые графы (Codasyl).
- Коллеги в IBM скептически называли это «бумагой на буквы», но разрешили сделать прототип, чтобы проверить утопию Кодда на практике.

2. SEQUEL — «английский» запрос к таблицам

- 1973–1974 гг. — в лаборатории IBM San José (ныне Almaden) двое молодых исследователей, Дональд Чемберлин и Рэймонд Бойс, берутся за проект System R.
- Чтобы обращаться к реляционным таблицам, они придумывают Structured English QUEry Language — SEQUEL.
- Ключевая фишка — запросы выглядят почти как английские предложения:

SELECT name, salary
FROM employees
WHERE dept = 'R&D';


- В 1974‑м публикуют первую спецификацию; академики критикуют за «слишком поверхностный английский», но программисты в восторге.

3. Почему SEQUEL стал SQL

- Торговая марка “SEQUEL” уже принадлежала авиастроительной компании *Hawker (https://vk.com/id378057) Siddeley*.
- IBM, опасаясь суда, в 1976 г. официально отказывается от «E» и оставляет SQL (Structured Query Language).
- *Небольшая путаница осталась навсегда: кто‑то произносит «эс‑кью‑эл», кто‑то — «сиквел».*

4. Коммерческий взлёт

- 1978 | Первая демонстрация System R внутри IBM | показала, что SQL работает быстрее ожиданий |
- 1979 | Стартап Relational Software (позже Oracle**) выпускает **Oracle V2 — первый коммерческий SQL‑движок | IBM ещё не успела выйти на рынок
- 1981 | IBM выпускает SQL/DS для мейнфреймов | стандарт де‑факто закрепляется
- 1983 | Дебют DB2 — теперь SQL есть почти в каждом крупном банке

5. Стандартизация и эволюция

- ANSI SQL‑86 → SQL‑92 (появился `JOIN ... ON`) → SQL:1999 (рекурсия, триггеры) → SQL:2003 (XML) → … → SQL:2023 (JSON, property graphs).
- Каждые 3–5 лет комитет добавляет «модные» возможности, но 90 % повседневных запросов всё ещё укладываются в синтаксис 1980‑х.

6. Забавные факты, которые украсят small talk 🍸

1. NULL ≠ 0 и NULL ≠ NULL — «неизвестное значение» нарушает законы логики, за что его зовут *“пятой ногой”* реляционной алгебры.
2. `SELECT *` — наследие печати на станке. Звёздочка означала «все колонки», чтобы не писать их руками в 132‑символьных перфокартах.
3. Команда `GO` в MS SQL Server не принадлежит стандарту SQL — это директива из старого клиента isql.
4. В Oracle долго не было `LIMIT`, а в MySQL — `RIGHT JOIN`. Поэтому админы шутили: «истинный межплатформенный SQL — это `SELECT 1;`».
5. Первый SQL‑вирус — червь *Slammer* (2003) — парализовал интернет за 10 минут через уязвимость в SQL Server 2000.
6. SQL — декларативный язык, но внутри СУБД каждый SELECT превращается в процедурный план.
7. `DROP DATABASE` придумали позже, чем `CREATE`. Сначала удалять целую БД казалось слишком опасным.

7. Почему SQL живёт дольше модных NoSQL‑наследников

- Математическая база. Таблицы + операции Кодда образуют алгебру с предсказуемой оптимизацией.
- Стандарты и переносимость. Код двадцатилетней давности можно запустить в современной Postgres или MariaDB.
- Большая экосистема. От Excel‑плагинов до BigQuery — везде так или иначе поддерживается SQL‑диалект.
- Сопротивляемость моде. Каждый «убийца SQL» (MapReduce, GraphQL, документные БД) в итоге добавляет свой адаптер SELECT ….

Итог: SQL родился как эксперимент IBM, пережил смену названий и юридические баталии, но в итоге стал «лентой Мёбиуса» мира данных: можно зайти с любой стороны — и всё равно окажешься в FROM.

@python_be1
🖥 История развития Python (1989 – 2025)

1989-12 — Гвидо ван Россум, работая в CWI (Нидерланды), начинает писать новый язык как «лучший ABC».
1991-02 — Публикация Python 0.9.0 в alt.sources; уже есть классы, исключения и базовые коллекции.
1994-01-26 — Выходит Python 1.0.0: добавлены lambda, map, filter, reduce.
1994-02 — Создана группа новостей comp.lang.python, вокруг которой формируется сообщество.
2000-10-16 — Python 2.0: list-comprehensions, сборщик циклического мусора, первая реализация Unicode.
2003-07-29 — Python 2.3: внедрён сортировщик Timsort.
2008-12-03 — Python 3.0 («Py3k»): переход на новый str`/`bytes, print() как функция, разделённый range.
2010-07-03 — Python 2.7: «долгожитель», поддержка продлена до 2020-01-01.
2015-09-13 — Python 3.5: появляется синтаксис async / await.
2018-07-12 — Гвидо объявляет о выходе с поста BDFL после споров вокруг оператора «морж» :=.
2019-10-14 — Python 3.8: тот самый оператор :=, позиционные-только аргументы / и улучшенный typing.
2020-01-01 — Официальный End-of-Life ветки 2.x.
2021-10-04 — Python 3.10: структурное сопоставление match/case.
2023-10-02 — Python 3.12: заметное ускорение интерпретатора (до +25 %), префиксные f-строки.
2024-10-07 — Python 3.13.0: экспериментальная сборка Free-Threaded CPython без GIL (PEP 703).
2025-04-08 — Python 3.13.3 (текущая стабильная версия).
2025-10 (ожидается) — Python 3.14: дальнейшая стабилизация «без-GIL»-сборки, новый `buffer`-API.

---

### Интересные факты

- Название появилось благодаря юмористическому шоу *Monty (https://vk.com/id911002) Python’s Flying Circus*; отсюда мемы «spam / eggs».
- Команда import this выводит Zen of Python — 19 однострочных принципов языка (PEP 20).
- Пасхалка import antigravity открывает комикс xkcd #353; from __future__ import braces выдаёт SyntaxError: not a chance.
- Timsort, написанный для Python 2.3, позже стал дефолтным алгоритмом сортировки в Java 7, Android, Swift и Rust.
- PEP 703 позволяет собирать CPython без GIL, открывая путь к настоящему многопоточному Python без радикального «Python 4».
- В апреле 2025 Python обновил рекорд индекса TIOBE, превысив 25 % и почти втрое обогнав C++.
- Гвидо носил титул BDFL (Benevolent Dictator For Life) почти 30 лет; c 2023 г. он возвращён как *BDFL-Emeritus*.
- PyPI (Python Package Index) превысил 500 000 пакетов, а pip install скачивается около 40 млрд раз в месяц (апрель 2025).
- import __hello__ просто печатает *Hello (https://vk.com/id630505570) world!* — напоминание, что «явное лучше неявного».

> Итог: за три с лишним десятилетия Python превратился из рождественского хобби-проекта в язык № 1, оставаясь при этом дружелюбным, читаемым и немного шутливым.

https://www.youtube.com/shorts/ZDMz1foKKlM?feature=share

@python_be1
💡 Извлечение ключевых данных из документов

Подписи:

Document Content → Содержание документа

Define Context(Aspect) → Определите контекст (Аспект)

Select your LLM Model → Выберите модель LLM

Extract information → Извлеките информацию

@python_be1
🐧 Задача с подвохом: Странное поведение с `df` и `du`
Условие:

Вы замечаете, что на сервере `/var/log` неожиданно «занялось» много места. Проверяете это так:

```

df -h /var

```

И видите, что диск почти полностью заполнен. Но при этом, когда проверяете размер файлов в `/var/log`:

```

du -sh /var/log

```

— оказывается, что размер логов совсем небольшой, явно не соответствующий тому, что показывает `df`.

Вопрос:
Почему возникает такая ситуация? Что именно занимает место, если файлы почти пустые? Как это исправить, не перезагружая сервер?

🔍 Подсказка:

На сервере активно работают несколько приложений, которые записывают логи. Недавно был произведён `logrotate`, старые логи удалились.

---

Разбор:
[спойлер: 💥Подвох:Многие думают, что после удаления файла место сразу освобождается. Но в Linux есть важный нюанс: еслипроцесс всё ещё держит файл открытым, даже после удаления файла из файловой системы,его содержимое продолжает занимать место на диске.

Вот что происходит:

-]`du`[спойлер: показываетразмер существующих файлов, поэтому он маленький (ведь файлы удалены).
-]`df`[спойлер: показываетреальное использование блочного устройства, и оновключает те данные, которые всё ещё заняты удалёнными, но открытыми файлами.

🚩 Это классическая ситуация после]`logrotate`[спойлер: : старые логи удаляются, но процессы, которые их писали (например,]`nginx`[спойлер: , `mysql`), продолжают держать дескрипторы открытыми.

🔧Как найти виновника:Используем]`lsof`[спойлер: для поиска удалённых, но ещё открытых файлов:

```bash
lsof | grep deleted
```

Вы увидите что-то вроде:

```
nginx 1234 ... /var/log/nginx/access.log (deleted)
```

🛠Как исправить без перезагрузки:1️⃣ Перезапустить приложение, которое держит файл открытым:

```bash
systemctl restart nginx
```

2️⃣ Если нельзя перезапустить, можно попробовать «сбросить» файл, подменив его на новый (подходит не всегда).

---

Вывод:•]`df`[спойлер: и]`du`[спойлер: показывают разное, потому что считают разными методами:
-]`df`[спойлер: : что реально занято на диске (включая удалённые, но ещё открытые файлы)
-]`du`[спойлер: : что физически доступно через файловую систему

• Если место не освобождается после удаления файла — ищите открытые файловые дескрипторы удалённых файлов. Это классика для DevOps!

💡Бонус-вопрос для гуру:Что произойдёт, если в]`lsof`[спойлер: вы видите удалённый файл, но процесс — это]`docker`[спойлер: ? Как поступить в этом случае? 😉]

@python_be1
🖥 Шпаргалка по RegEx в Python

📦 Импорт:

```

import re

```
🔍 Основные функции модуля `re`
```

re.search(pattern, string) # Ищет первое совпадение (где угодно в строке)
re.match(pattern, string) # Ищет совпадение только в начале строки
re.fullmatch(pattern, string) # Проверяет, соответствует ли вся строка шаблону
re.findall(pattern, string) # Возвращает все совпадения в виде списка
re.finditer(pattern, string) # То же, но как итератор Match-объектов
re.sub(pattern, repl, string) # Замена по шаблону
re.split(pattern, string) # Разбиение строки по шаблону

```
# 🧠 Основы синтаксиса шаблонов

| Шаблон | Что значит |
|---------|-------------------------------------|
| `.` | Любой символ, кроме `\n` |
| `^` | Начало строки |
| `$` | Конец строки |
| `*` | 0 или больше повторений |
| `+` | 1 или больше |
| `?` | 0 или 1 повторение |
| `{n}` | ровно n раз |
| `{n,}` | n или больше |
| `{n,m}` | от n до m |
| `[]` | Символьный класс |
| `[^]` | Отрицание символьного класса |
| `|` | Или (`a|b`) |
| `()` | Группа (захват) |
| `\` | Экранирование спецсимвола |

💡 Примеры
```

re.search(r'\d+', 'ID=12345') # Найдёт '12345' (одно или больше цифр)
re.match(r'^\w+$', 'hello_world') # Вся строка — только буквы/цифры/_
re.findall(r'[A-Z][a-z]+', 'Mr. Smith and Dr. Brown') # ['Smith', 'Brown']
re.sub(r'\s+', '-', 'a b c') # 'a-b-c'
re.split(r'[;,\s]\s*', 'one, two;three four') # ['one', 'two', 'three', 'four']

```
🎯 Захват групп
```

text = 'Name: John, Age: 30'
match = re.search(r'Name: (\w+), Age: (\d+)', text)
if match:
print(match.group(1)) # John
print(match.group(2)) # 30

```
Группы можно называть:
```

pattern = r'(?P<name>\w+): (?P<value>\d+)'
match = re.search(pattern, 'score: 42')
match.group('name') # 'score'
match.group('value') # '42'

```
🧱 Комбинированные шаблоны
```

pattern = r'\b(?:https?://)?(www\.)?\w+\.\w+\b'
text = 'Visit https://example.com or www.test.org'
re.findall(pattern, text) # [['www.'], ['www.']]

```
⚠️ Полезные советы

• Всегда используйте `r''` перед шаблоном, чтобы не экранировать `\`
• `re.compile(pattern)` ускоряет повторное использование
• Старайтесь избегать `re.match` — чаще нужен `re.search`
Быстрая проверка шаблонов
📍 Онлайн-проверка:
[regex101.com](https://regex101.com/)
[pythex.org](https://pythex.org/)

Хочешь отдельную шпаргалку по `re.sub` с лямбдами, заменами и функциями внутри, ставь лайк 👍

@python_be1
🖥 systemd-pilot (https://github.com/mfat/systemd-pilot) — это десктопное приложение для управления сервисами systemd на GNU/Linux системах!

🌟 По сути, это графический интерфейс для команд systemctl. Он позволяет просматривать и управлять системными сервисами, быстро развертывать новые сервисы, а также запускать, останавливать и перезапускать их. Приложение легковесное и использует всего один Python-скрипт. Также предусмотрена поддержка поиска сервисов по имени.

🔐 Лицензия: GPL-3.0

🖥 Github (https://github.com/mfat/systemd-pilot)

@python_be1
🧠 Как подготовиться к техническому собеседованию с помощью

Если ты готовишься к собеседованию в IT и не знаешь, с чего начать — обрати внимание на бесплатный курс от freeCodeCamp (https://www.freecodecamp.org/news/prepare-for-technical-interviews-using-neetcode-150/), основанный на знаменитом списке задач NeetCode 150.

⚙️ Что такое NeetCode 150?

🟤 Это отобранные 150 задач с LeetCode, покрывающие всё, что нужно знать:
• массивы
• строки
• хеш-таблицы
• деревья и графы
• динамическое программирование
• стек и очередь
• backtracking и двоичный поиск

🎓 Что предлагает курс freeCodeCamp:
• 38 часов подробного видеоконтента
• Каждая задача разбирается пошагово — с объяснением стратегии и кода
• Языки: Python и JavaScript
• Полностью бесплатно

📈 Почему это эффективно:
• Все задачи — реальный опыт с технических собеседований
• Структура курса позволяет идти от простого к сложному
• Удобно учиться в своем темпе

- Стартуй здесь (https://www.freecodecamp.org/news/prepare-for-technical-interviews-using-neetcode-150)
- Видео с разбором вопросов (https://www.youtube.com/watch?v=T0u5nwSA0w0)
- Решения (https://neetcode.io/practice)

Не упусти шанс систематизировать знания и уверенно пройти собеседование!

@python_be1
🎭 Pykka — акторная модель для Python без лишних сложности. Этот проект позволяет организовывать конкурентные вычисления без традиционных проблем с состоянием и блокировками.

Вдохновлённый знаменитым Akka для JVM, Pykka предлагает минималистичный подход — никаких супервизоров или распределённых акторов, только чистые принципы обмена сообщениями между изолированными процессами.
Инструмент имеет продуманную архитектуру: разработчику достаточно определить поведение акторов, а Pykka возьмет на себя всю работу с очередями и потоками.

🤖 GitHub (https://github.com/jodal/pykka?tab=readme-ov-file)

@python_be1
🐍 Задача уровня Pro: декоратор с внутренним состоянием

📌 Задача:
Напиши декоратор `call_limiter`, который:

- ограничивает функцию `f` максимум до `n` вызовов
- после `n` вызова функция больше не вызывается, а возвращает строку `"LIMIT REACHED"`

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

```

(3)
def greet(name):
return f"Hello, {name}!"

print(greet("Alice")) # Hello, Alice!
print(greet("Bob")) # Hello, Bob!
print(greet("Charlie"))# Hello, Charlie!
print(greet("Dave")) # LIMIT REACHED

```

🎯 Подвохи:
- Нужно создать декоратор-фабрику с аргументом `n`
- Внутри должна быть функция с `nonlocal`, чтобы отслеживать число вызовов
- Часто путаются и используют `mutable default`, что ломает независимость между декорируемыми функциями

Решение:
[спойлер: ```python
def call_limiter(n):
def decorator(func):
count = 0
def wrapper(*args, **kwargs):
nonlocal count
if count >= n:
return "LIMIT REACHED"
count += 1
return func(*args, **kwargs)
return wrapper
return decorator
```

🧪 **Проверка:**

```python][спойлер: ][спойлер: (2)
def ping():
return "pong"

print(ping()) # pong
print(ping()) # pong
print(ping()) # LIMIT REACHED][спойлер: ][спойлер: (1)
def echo(msg):
return msg

print(echo("hi")) # hi
print(echo("bye")) # LIMIT REACHED
```

🧠 **Что проверяет задача:**

• Понимание функций высшего порядка
• Работа с `nonlocal` и областью видимости
• Контроль состояния внутри декоратора
• Умение не "засорить" глобальные или общие области]

@python_be1
Всем привет) Помогите решить задачку, плиз. Я только недавно учиться начала (очные годовые курсы, два раза в неделю занятия), ООП прошли, но обучение, скажу так: "так себе...". Только начинаю что-то понимать, как тут же другая тема, а ещё прошлую тему не закрепили. Причем, все обучение построено на довольно-таки простых примерах, а в реальной работе, по-любому, все гораздо сложнее.
А тут друг-программист мне задачку задал (чисто чтоб проверить мои знания), а я и растерялась совсем. Не знаю как решить. И спрашивать у него не буду: прикалываться начнет. У меня от его приколов аж все желание учиться пропадает.
Так что, буду очень рада, если кто-нибудь из подписчиков группы мне поможет и объяснит эту задачку, а то я уже отчаялась совсем((
Задачку скину в личку тем, кто отзовётся. Надеюсь, что мир не без добрых людей😊

@python_be1
🧠 8 полезных советов по Oracle SQL

Если ты уже «умеешь в SELECT», пора прокачать SQL в Oracle до следующего уровня. Эти советы не для новичков — они для тех, кто работает с продом, сложными запросами и оптимизацией.

1. Используй `PIVOT`/`UNPIVOT` вместо `CASE`
Поворот таблиц через PIVOT делает код чище и легче масштабируется.

SELECT * FROM (
SELECT department_id, gender, salary FROM employees
)
PIVOT (
SUM(salary) FOR gender IN ('M' AS male_salary, 'F' AS female_salary)
);
🧱 2. Вызывай функции как таблицы (`TABLE()` + PL/SQL)
Если функция возвращает коллекцию, её можно SELECT’ить напрямую:

SELECT * FROM TABLE(my_package.get_active_users(SYSDATE));
🚀 3. Генерация чисел без тормозов
CONNECT BY LEVEL — это медленно. Лучше так:

SELECT rownum FROM dual CONNECT BY rownum <= 10000;
🔍 4. Помогай оптимизатору через `CARDINALITY` hint
Oracle может ошибаться в оценке количества строк. Подскажи ему:

SELECT /*+ cardinality(e 100000) */ * FROM employees e ...
🧠 5. Используй `RESULT_CACHE` для повторяемых данных
Снизь нагрузку:

SELECT /*+ RESULT_CACHE */ * FROM country_codes;
📉 6. Никогда не делай `ORDER BY` без `FETCH FIRST` или `ROWNUM`
Не сортируй всё зря:

SELECT * FROM employees ORDER BY salary DESC FETCH FIRST 10 ROWS ONLY;
📦 7. Управляй CTE через `MATERIALIZE` и `INLINE`
Это может влиять на производительность:

WITH /*+ MATERIALIZE */ heavy_part AS (...)
SELECT * FROM heavy_part WHERE rownum = 1;
📊 8. Освой `MODEL` для расчётов как в Excel
Рядовые и прогнозные расчёты в SQL без курсоров:

SELECT * FROM sales
MODEL
PARTITION BY (region)
DIMENSION BY (month)
MEASURES (sales)
RULES (
sales[13] = sales[12] * 1.1
);
💡 Не ограничивайся SELECT — используй весь потенциал Oracle SQL.

👍 Лайк и сохраняй себе, чтобы не потерять

@python_be1
This media is not supported in your browser
VIEW IN TELEGRAM
Ночное-полезное: Oh My <s>God</s> Git — прикольная игра с открытым исходным кодом, которая с помощью карточек поможет понять логику работы GIT и научит с ним работать.

Можно залипнуть на сайте (https://ohmygit.org/) или поставить себе локально с GitHub (https://github.com/git-learning-game/oh-my-git/).

@python_be1