Warning: Undefined array key 0 in /var/www/tgoop/function.php on line 65

Warning: Trying to access array offset on value of type null in /var/www/tgoop/function.php on line 65
- Telegram Web
Telegram Web
Сьогодні на leetcode.com problem of the day це просто написати якийсь алгоритм сортування, тому ось вам стаття про те як імплементувати найпопулярніші із них із бенчмарками та переліком їх плюсів та мінусів.

Доречі ви знали що саме для Python вигадали новий алгоритм сортування Timsort (отримав назву по імені того хто його вигадав - Тім Пітерс)?
І що на співбесідах його ніхто ніколи не пише, бо для його імплементації спочатку треба написати insertion та merge алгоритми 😁.
Потім цей алгоритм утягнули до себе Swift, V8 та Rust.

Лінки:
- https://realpython.com/sorting-algorithms-python/
- https://en.wikipedia.org/wiki/Timsort
Мені подобається у якому напрямку рухається розвиток Python зараз.
Як на мене, нагальної потреби у додаванні нових фічей у мову зараз немає - вона вже досить давно є зрілою і містить достатню кількість мовних фічей (деякі із котрих можливо треба б було задепрекейтити і видалити)
І те що вже декілька версій у пайтон не додається багато нових можливостей (маю на увазі різний синтаксичний цукор) а навпаки core-розробники сконцентрували свою уваги над поліруванням того що є (покращують REPL, роблять повідомлення про помилки більш інформативними, видалять застарілі частини стдлібу, тощо) та над прискоренням CPython (nogil, JIT, subinterpreters, та звичайні оптимізації) як на мене дуже гарний знак того що у мови буде ще багато років планомірного розвитку.

Ось і новий реліз йде у сторону поліпшення швикодії та покращення developer expirience:

https://www.youtube.com/watch?v=gqqgwyNx52Q
Якось випадково натрапив на відос "Why don't Americans use electric kettles?" (ютуб рекомендації іноді підкидають щось неочікуване) і залип.
Саме так виглядав би ютуб канал гіка з 60х 😁. Автор бере якусь стару технологію і розповідає про неї так нібито це щойно презентований айфон чи макбук "The Antique Toaster that's Better than Yours"

Або ось він досліджував наскільки сильно зовнішні навіси на вікна охолоджують будинок у літню спеку і чому їх більше не використовують, чи про проблеми які зʼявились у інженерів котрі проєктують автомобільні стоп-сигнали із появою електрокарів.
Коротше якщо вам також подобаються гіковскі відоси із акцентом на старі технології - дуже рекомендую

Лінки:
- https://www.youtube.com/@TechnologyConnections
Стаття про фічі нового Python 3.13. Ні, не про noGIL, JIT та інше, а про зміни які ви скоріш за все оминули увагою

https://www.bitecode.dev/p/python-313-what-didnt-make-the-headlines
Мене завжди дивує що у розмовах про дивацтва JavaScript обовʼзково згадують про те що 0.1 + 0.2 != 0.3, хоча насправді ця "проблема" є не лише у JS, це наслідок того як компʼютер представляє числа із плаваючою точкою.

Така ж ситуація із "дивацтвом" Пайтона коли хтось вперше бачить що all([]) is True і, не розуміючи чому так, відносить це до категорії unexpected behaviour.

Але це буквально 2500-річна філософська дискусія. Античні філософи вважали, що твердження 'всі єдинороги блакитні' має бути хибним, бо єдинорогів не існує, але сучасна логіка стверджує, що це істина, оскільки не існує єдинорогів, які не є блакитними. Python просто слідує сучасній предикатній логіці, але інша точка зору (у нашому випадку що all([]) має бути False як і порожній список) також досить поширена і була загальноприйнятою позицією до останніх кількох сотень років.

Але ми не філософи, ми програмісти, тому краще подивитись на більш практичні приклади:


all([]) # True
any([]) # False
math.prod([]) # 1
sum([]) # 0
max([]) # ValueError!


Справа у тому що ці функції реалізують концепцію з теорії категорій - моноїд.

Коли ми працюємо зі списками, нам важливо щоб операції над ними працювали передбачувано. Наприклад, якщо у нас є два списки xs та ys, то:

>>> from math import prod
>>> prod(xs + ys) == prod(xs) * prod(ys)
True
>>> sum(xs + ys) == sum(xs) + sum(ys)
True


А тепер цікавий момент - що буде якщо ys буде порожнім списком? Тоді:

prod(xs) == prod(xs + []) == prod(xs) * prod([])


Це рівняння може бути правдивим тільки якщо math.prod([]) == 1! Тобто одиниця тут виступає як нейтральний елемент для множення. У цього навіть є своє імʼя - порожній добуток (empty product).

Те саме і з іншими функціями:
- sum([]) == 0, бо 0 - нейтральний елемент для додавання
- all([]) == True, бо True - нейтральний елемент для and
- any([]) == False, бо False - нейтральний елемент для or

А от max() такого елемента не має! Не існує такого числа n, для якого max(x, n) == x для будь-якого x. Саме тому max([]) викидає помилку.

Доречі у цього явища є своє імʼя - вакуумна істина (vacuous truth). Це коли вираз вважається істинним, оскільки його умова не має сенсу.

Лінки:
- https://uk.wikipedia.org/wiki/%D0%9C%D0%BE%D0%BD%D0%BE%D1%97%D0%B4
- https://en.wikipedia.org/wiki/Empty_product
- https://en.wikipedia.org/wiki/Vacuous_truth
- https://news.ycombinator.com/item?id=37264149
- https://buttondown.com/hillelwayne/archive/why-any-is-true-prod-is-1-etc
import __hello__
Ну що, івент скінчився, а мене цьогоріч вистачило на вдвічі більший період ніж минулого року 😁 Якщо у минулому році я знудився вже на 12 день, то у цей раз я майже всі завдання зробив, лише з 21 дня не виконував 2 частину бо почались NP-Hard задачі, а я таке…
Ну що, розпочався черговий Advent of Code - гарний спосіб відволіктись від буденного життя і отримати трохи новорічного настрою.

Цей івент також може стати гарною нагодою вивчити\підтягнути нову мову програмування (чи навіть технологію, бачив пости де чуваки боролись із aoc у Excel). Я хотів aoc2024 вирішувати на Go, але розумію що цього року у мене набагато менше вільного часу ніж минулоріч, тому знову озброюсь пайтоном, бо це для мене найшвидший спосіб вирішувати задачки.

Сьогоднішній день досить легкий, навідміну від 2023 року, тому не має одразу відпугнути нових учасників 😁

Доречі не забувайте заходити на reddit, після того як вирішете задачки дня, за мемами ☺️
import __hello__
Ну що, розпочався черговий Advent of Code - гарний спосіб відволіктись від буденного життя і отримати трохи новорічного настрою. Цей івент також може стати гарною нагодою вивчити\підтягнути нову мову програмування (чи навіть технологію, бачив пости де чуваки…
Це перший рік коли я закінчив івент день у день і на всі 50 зірочок. Цього року навіть вдалось підбити декількох знайомих також приймати участь, тому було цікавіше ніж зазвичай.

Мені сподобалось, із плюсів участі у таких івентах можу назвати:
- трохи тримає тебе у "програмерскій формі", якщо немає звички й так протягом року задротити літкод
- дізнаєшся про різні цікаві проблеми і алгоритми із реального життя. Наприклад цьогоріч я дізнався про алгоритм Брона-Кербоша
- а у минулому році дізнався про крутезний блог https://www.redblobgames.com коли шукав інформацію про Дейкстра та A* алгоритми

Із мінусів - коли день не можеш вирішити пазл, а виявляється що у описі не було вказано якоїсь важливої деталі, чи просто текст був по дибільному написан 😄

Коротше прикольний івент, допомагає якось відволіктись та підготуватись до пошуку нової роботи згадати що програмування це не лише перекладання джейсончиків із бази у http-api 😁
З НР!🎄
Якщо ви використовуєте pickledb (сподіваюсь що для прототипів, а не для "продакшену"), то для вас новина: її автор випустив вдосконалену версію - kenobiDB, він каже що це більш пропрацьована тред та процес безпечна документна база даних котру він сам використовує у своїх прототипах (а про pickledb він пише "what I now consider very stupid and useless" 🙃).

І якщо ми вже згадали embeded бази даних для пайтону, то щоб два рази не вставати давайте я залишу перелік тих про котрі знаю і котрими користувався (інколи із них дуже зручно почати MVP а потім перемкнути імплементацію на щось "доросле", якщо у цьому буде потреба)

1. montydb

Embeded база даних "яка виглядає і працює як MongoDB". Із документації - лише рідмі у проєкті 😄


>>> from montydb import MontyClient

>>> col = MontyClient(":memory:").db.test
>>> col.insert_many( [{"stock": "A", "qty": 6}, {"stock": "A", "qty": 2}] )
>>> cur = col.find( {"stock": "A", "qty": {"$gt": 4}} )
>>> next(cur)
{'_id': ObjectId('5ad34e537e8dd45d9c61a456'), 'stock': 'A', 'qty': 6}


2. tinydb

Проєкт яким надихався montydb - теж embeded, теж документоорієнтовна, вміє бути drop-in заміною монги через екстеншен tinymongo. Навідміну від montydb має документацію та більшу кількість підтримки на гітхабі (зірочки, коміти, котрибутори)


>>> from tinydb import TinyDB, Query
>>> db = TinyDB('/path/to/db.json')
>>> db.insert({'int': 1, 'char': 'a'})
>>> db.insert({'int': 1, 'char': 'b'})


3. mongita

Mongita is to MongoDB as SQLite is to SQL. Ще одна ліба котра намагається бути заміною монги, але останній коміт у репі був аж 2 роки тому.


>>> from mongita import MongitaClientDisk
>>> client = MongitaClientDisk()
>>> hello_world_db = client.hello_world_db
>>> mongoose_collection = hello_world_db.mongoose_collection
>>> mongoose_collection.insert_many([{'name': 'Meercat', 'does_not_eat': 'Snakes'},
{'name': 'Yellow mongoose', 'eats': 'Termites'}])


Лінки:
- https://github.com/patx/kenobi
- https://www.reddit.com/r/Python/comments/1hqvrd6/kenobidb_30_made_public_pickledb_replacement/
- https://github.com/davidlatwe/montydb
- https://github.com/msiemens/tinydb
- https://github.com/scottrogowski/mongita
І так всюду і з усім 🙂
Ого, не знаю що сталось, але MongoDB випустили офіційний бекенд для Django. Він поки що Public Preview та рекомендований лише для ознайомлення.
Прям максимально неочікувана новина для мене, бо, принаймні у моїй бульбашці, джанго потихеньку здає позиції і все частіше замість неї обирать FastAPI або ще якийсь із сотні асинхронних мікрофреймворків. До того ж дивно чого саме бекенд для Джанги, а не для SqlAlchemy? Але прикольно - якщо дотягнуть до реліза то популярність Джанги може трошки знову піти вгору 😅

Лінки:
- https://www.mongodb.com/docs/languages/python/django-mongodb/current/
- https://github.com/mongodb/django-mongodb-backend
- https://www.mongodb.com/blog/post/mongodb-django-backend-now-available-public-preview
Останній місяць писав дуже багато документації із Sphinx, у форматі reStructuredText. Це формат придуманий у екосистемі пайтона - на ньому написана уся пайтонівська документація, це основна мова розмітки для описів пакетів у PyPi і т.д.
Головний, як то кажуть, selling point, цієї розмітки у тому що невідрендерений документ, себто у сирому вигляді, має добре парситись оком. Саме тому у ньому заголовки зроблені через підкреслення, тайтл лінки можні відділяти від самої лінки і тд.

Чи то через сам Sphinx, чи то через ергономічність reST, але я прям кайфую коли пишу документацію у цьому форматі, чи то через процес чи через результат. І ось коли писав чергову сторінку і пішов подивитись у Cheat Sheet, зрозумів що хотілось би якоїсь інтерактивної доки для reST, інтерактивної по типу https://pythontutor.com/, або https://mypy-play.net/. Щоб можна було потикати приклади прям у браузері і одразу бачити результат. Але нажаль окрім офф доки нічого більш не знайшов. Та коли це нас стримувало - тож я зафігачив свій туторіал, який працює без бекенда - повністю у браузері, ще й "на решту" зробив плейграунд, із можливістю шерінгу (вийшло щось типу pastebin).

Працювати без бекенду воно може завдяки PyScript - це штука котра через pyodide вміє ранити пайтон у браузері і надає апі для маніпулювання DOM-деревом. Трошки заморочившись можна навіть обійтись без CDN і зробити цю штуку офлайновою (у моєму випадку - не залежити від CDN а роздавати усе що треба для туторіала із свого сервера). Для цього щоправда треба трошки поприсідати, бо всі файли треба витягувати вручну із встановлених npm пакетів, але завдяки докеру це можна зробити досить просто: docker run --rm -it -v $(pwd):/code -w /code node bash.

Тож щоб запускати пайтон скрипти у браузері треба підключити у html файлі бандл пайскріпта (взагалі CDN, але у моєму випадку файлики які я сам роздаю)


<script type="module" src="/pyscript/core.js"></script>
<link rel="stylesheet" href="/pyscript/core.css">

<script type="py" src="./main.py" config="./pyscript.toml"></script>


pyscript.toml виглядає так:


name = "reStructuredText Tutorial"
description = "RST tutorial app"
# так як я хочу роздавати бандл пайскрипту сам - прописую шлях до нього
interpreter = "/pyodide/pyodide.mjs"
# ці пакети PyScript сам витягне із інтернету при старті, але іх можна роздавати
# і самому, щоб взагалі не залежити від зовнішніх ресурсів
packages = ["docutils", "pygments", "lzma"]


У html можна навішувати івенти через атрибути, <textarea py-input="_render_rst_from_input_debounced"></textarea>, де _render_rst_from_input_debounced це назва функції у main.py

Спочатку я зробив кожен урок туторіала окремою сторінкою, на яку мав навігувати браузер сам, але інтерпретатор стартує не миттєво і ця затримка при перемиканні між вправами дуже відчувається.
Тож прийшлось зробити SPA на мінімалках - PyScript разом із Pyodide завантажується один раз, а навігація відбувається вже самою апкою через підміну частин сторінки і відсдідковування івента "popstate".

Із кнопкою "Share" у плейграунді вийшло прикольно - можна ділитись документом, але сам документ мені ніде зберігати не потрібно - текст написаний у полі вводу стискається, пакується у base64 і вставляється у URL, тож посилання збергіє у собі весь текст і навіть якщо цей сервіс раптом буде недоступний - маючи посилання можна із нього дістати текст вручну. Приклад посилання:
https://rst-tutorial.yakimka.me/playground?paste=_Td6WFoAAATm1rRGAgAhARYAAAB0L-Wj4ABNAD5dAB7r_UTECOiaAZNIfAWoaP1gjlgAhbSC1dTSjED1rIQXc6T3aTSyiu8C_wll5dYjrwFJZQEcq5rmMFbwrvwAAAAA5PjAT436nmgAAVpOYmy28R-2830BAAAAAARZWg%3D%3D

Прикольна технологія, звісно для "заміни js у браузері" воно так собі підходить, а от робити якісь штуки яким треба пайтонівська ліба, аналогів якої немає у npm - саме те (цікаво, чи можна запустити веб сервер у браузері? 😁)

Лінки:
- https://rst-tutorial.yakimka.me/
- https://rst-tutorial.yakimka.me/playground
- https://www.sphinx-doc.org/en/master/
- https://docutils.sourceforge.io/docs/index.html
- https://pyscript.net/
- https://docs.pyscript.net/2025.3.1/user-guide/offline/
Microsoft скасувала фінансування проєкта Faster CPython і звільнила частину команди (як я зрозумів, тих кого не звільнили - розподілять по іншим проєтам). Причому лист про звільнення надіслали коли команда була на пів-шляху до PyCon Pittsburg.
🫠😥
Внутрішні інструменти Google та їх альтернативи
В Google є величезна кількість внутрішних технологій та інструментів. Й є чудовий репозиторій з альтернативними інструментами та технологіями для/від колишніх гуглерів. Не для всього є альтернативи, але можна побачити різноманіття того, що застосовується всередені Google. Якщо цікаво ознайомитися, то ось лінк - https://github.com/jhuangtw/xg2xg
Please open Telegram to view this post
VIEW IN TELEGRAM
2025/06/13 19:14:23
Back to Top
HTML Embed Code: