
Мне кажется, это очень хорошо!А вы говорите "на русском"?
@bitmap18
Всё, что должен знать настоящий сеньор — короткие, но ёмкие заметки о разработке, инструментах, практиках, бизнесе. Выходят каждый день. Подписывайся!

Мне кажется, это очень хорошо!А вы говорите "на русском"?

hash в python позволяет получить хэш любого неизменяемого объекта, например, int, float, строки или tuple.Скажем, hash('@bitmap18 лучше всех') == -952311228443755449. 🎯 Используется в словарях (dict), чтобы определить, где хранится значение (в каком bucket) для ключа, и множествах (set), чтобы понять, есть ли в нём данный ключ.Также можно определить дандер-метод __hash__ для любого класса.📖 Скажем, у нас есть класс Customer, и хочется создать список пользователей без дубликатов. Для этого отлично подойдёт set():class Customer: def __init__(self, id, email): self.id = id self.email = email def __hash__(self): return self.idcustomers: Iterable[Customer] = get_customers()unique_customers = set(customers)Без заданного Customer.__hash__ получилось бы создать set, только используя идентификаторы напрямую:unique_customers = set(c.id for c in customers)Что, конечно, менее элегантно.🔗 https://www.programiz.com/python-programming/methods/built-in/hash

sort — это утилита в unix-подобных ОС для сортировки строчек в текстовых файлах.🧩 Полезные ключи:• -t, — указать разделитель колонок ,• -k5,5 — сортировка по 5-й колонке• -n — числовая, а не лексикографическая (алфавитная) сортировка• -g — поддержка чисел с плавающей запятой• -r — обратная сортировка📚 Возьмём файл с заказами orders.csv:id,fname,lname,pid,qty,date,addr,price1,Иван,Иванов,101,2,2024-09-01,Ленина 123,40002,Анна,Смирнова,202,1,2024-09-02,Пушкина 45,19993,Борис,Петров,303,3,2024-09-03,Гоголя 78,59984,Ольга,Кузнецова,404,1,2024-09-04,Чехова 90,29995,Алексей,Морозов,505,2,2024-09-05,Толстого 123,5000Отсортируем по цене: sort -t, -k8,8nr orders.csv.По фамилии: LC_ALL=C.UTF-8 sort -t, -k3,3 orders.csv.LC_ALL=C.UTF-8 необходим для поддержки юникода.🌟 Как и другие unix-утилиты, sort удобно объединять с другими командами через |.Например, отсортируем заказы по pid и возьмём только 3 поля: sort -t, -k4,4 orders.csv | cut -d, -f4,3,8🔗 https://ru.wikipedia.org/wiki/Sort_(Unix)

Stack overflow — ошибка, когда программа пытается использовать больше памяти на стеке, чем разрешено операционной системой.📌 Обычно случается при:• слишком большой глубине рекурсивных вызовов• большом количестве локальных переменных📖 Например, на моей MacOS максимальная глубина стека — 8172 Кб (ulimit -s). Если какая-то программа попробует использовать больше, ОС прервёт её выполнение. Скомпилируем простейшую программу:#include <stdio.h>void go(int n) { printf("%d\n", n); go(n + 1);}int main() { go(1); return 0;}без оптимизаций (gcc -o test test.c) и запустим:...261471[1] 78367 segmentation fault ./testПрограмма попыталась занять больше памяти на стеке, чем разрешено ОС, и была завершена.Если увеличить размер стека, например, до 16 Мб (ulimit -s 16384), то ошибка случится позже. А если включить оптимизации через флаг -O2 в gcc, то она сможет работать бесконечно, т.к. комплиятор "развернёт" рекурсию в цикл — cм. комментарии.🔗 https://en.wikipedia.org/wiki/Stack_overflow

Пивот (pivot) — это серьёзное изменение в бизнес-модели или стратегии стартапа.👌 Пивоты совершают стартапы, когда изначальная идея не приносит ожидаемых результатов. Обычно это затрагивает:• продукт и его позиционирование• целевую аудиторию• способ привлечения и удержания клиентовПивоты важно совершать вовремя, пока есть ресурсы, и на основе обратной связи от реальных пользователей.🔑 Ключевая задача разработки: уметь быстро превращать продукт из ужа в ежа и докатывать изменения до пользователей.📚 Например, ваш стартап изначально делал приложение для фитнеса, ориентированное на профессиональных спортсменов. После анализа рынка и обратной связи от пользователей команда решает изменить фокус на более широкую аудиторию любителей фитнеса, добавляя функции, такие как отслеживание активности и персонализированные планы тренировок. Если это изменение позволяет привлечь новых пользователей, а юнит-экономика при этом сходится, его можно считать успешным.🔗 https://ru.wikipedia.org/wiki/Пивот

Суррогатный ключ — сгенерированный уникальный идентификатор строки в реляционной БД.💎 Зачем они нужны?Скажем, в таблице Users натуральным ключом может быть:• email или phone• username• комбинация first_name, last_name, birthday⛔️ Натуральные ключи имеют недостатки:• при обновлении ключа придётся обновлять и связанные таблицы• требования к уникальности меняются: бизнес может разрешить разным клиентам использовать один email или телефон• их опасно использовать в публичных URL, API и т.п.✅ Лучше использовать суррогатные ключи, никак не связанные с данными в таблице:• они гарантированно уникальны• просты в использовании• не меняются вместе с данными• индексы по ним обычно работают быстрее📖 Суррогатный ключ можно сделать из монотонно растущего INTEGER:CREATE TABLE Users ( user_id SERIAL PRIMARY KEY, username VARCHAR(255), email VARCHAR(255) NOT NULL,);Или же взять рандомный или около-рандомный идентификатор, например, UUID.🔗 https://ru.wikipedia.org/wiki/Суррогатный_ключ

Десериализация — воссоздание объекта или структуры данных в памяти из его представления в виде строки байт/символов. Обратный сериализации процесс.В отличие от парсинга, который обычно работает на произвольных входных данных — например, создаёт AST (abstract syntax tree) из исходного кода, десериализация чаще подразумевает использование определённой схемы.Очевидно, что JSON или XML не ограничивают схему — потребуется JSON Schema или подобное решение.🔍 Или можно попробовать взять protobuf, где типы обязательны. Создадим вот такой channel.proto:syntax = "proto3";message Channel { string handle = 1; int32 subscribers = 2;}Скомпилируем его для использования в python: protoc channel.proto --python_out=.А затем десериализуем строку байт в объектное представление этого типа:import channel_pb2channel = channel_pb2.Channel()channel.ParseFromString(b'\n\x07@bitmap\x10\x90N')print(channel)# handle: "@bitmap"# subscribers: 10000🔗 https://ru.wikipedia.org/wiki/Десериализация
🤗 На прошлой неделе мы писали про:- Задача двух генералов- Сериализация- Парное программирование- DFS- Lean-стартап- Same-origin policy- JSON5- SELECT FOR UPDATE- Транзистор❤️🔥 Может, уже что-то пригодилось?

Транзистор — полупроводниковый компонент, который используется для усиления и преобразования аналоговых сигналов (например, звука), а также в качестве переключателя (ключа, switch) для цифровых сигналов.📅 Изобретен в 1947 году в Bell Labs тремя учеными: Джоном Бардином, Уолтером Браттейном и Уильямом Шокли.Транзисторы пришли на замену менее надёжным и более громоздким вакуумным лампам, что позволило создать всю современную электронику — от простейших радио до самых современных миниатюрных процессоров.🥇 Его создатали получили за своё изобретение Нобелевскую премию по физике в 1956 году.Количество транзисторов в процессорах увеличилось от всего 2,250 штук в Intel 4004, выпущенном в 1971 году, до сотен миллиардов в самых современных процессорах.Их размеры за это же время уменьшились до всего лишь десятков атомов: транзистор произведённый по 5-нм техпроцессу имеет размер около 70 атомов в ширину.А вот как выглядит первый в мире транзистор ⬇️🔗 https://www.youtube.com/watch?v=xvrjIJw3OSU

SELECT FOR UPDATE — способ избежать состояния гонки (race condition) и взаимных блокировок в UPDATE, исполняющихся одновременноюПоддерживается в Postgres, MySQL c InnoDB, Oracle. 📚 Например, пользователь покупает товары 1 и 4 в интернет магазине, и нам надо обновить остатки в БД:BEGIN;SELECT * FROM product_qty WHERE product_id IN (1,4) ORDER BY product_id FOR UPDATE;UPDATE product_qty SET qty = qty - 1 WHERE product_id IN (1,4);COMMIT;🎯 Как это работает:1️⃣ начинаем транзакцию2️⃣ делаем SELECT ... FOR UPDATE: обновляем несколько строк, значит нужно использовать ORDER BY3️⃣ дальше обычный UPDATE4️⃣ наконец, COMMIT, чтобы завершить транзакцию и снять блокировкиБез ORDER BY в п.2 одновремено исполняющиеся транзакции могут попытаться взять блокировки в разном порядке, что может привести к дедлоку.⚠️ В зависимости от уровня изоляции транзакций, другие SELECT без FOR UPDATE могут получить устаревшие значения.🔗 https://ru.wikipedia.org/wiki/Select_for_update