и посмотреть медиа
Точка входа - основы программирования
и посмотреть медиа
Базовые знания по основам программирования для новичков.
Базовые знания по основам программирования для новичков.
Курс фундаментальных понятий: алгоритмы, структуры данных, языки программирования. Идеально для начинающих без опыта.
В документации Python появилась таблица, сколько стоит каждая операция со списком и словарём Почему l.pop() дешёвый, а l.pop(0) нет, и чем x in set отличается от x in list: раньше за этим ходили в вики или исходники CPython. В документации 3.16 появилась отдельная страница со сложностью операций для list, tuple, dict, set, str и range в нотации O-большое. Половина вопросов «почему тормозит» на собеседованиях закрывается этой таблицей. В нашем канале Zen of Python разобрали подробнее. #python #основы
Открыть канал и посмотреть медиаЧем интерпретатор отличается от JIT и почему интерпретаторы всё ещё нужны Два самых распространённых способа исполнять программу. Интерпретатор читает инструкции по одной и выполняет каждую сам, как переводчик на переговорах. JIT-компилятор сначала переводит горячий участок в машинный код процессора, а потом запускает его напрямую, и это в разы быстрее. Браузерные движки сочетают оба: начинают с интерпретатора и переводят в машинный код только горячие участки, это называют tiered execution. Зачем тогда интерпретаторы? JIT нужно право записывать в память исполняемый код, а на iOS и в некоторых защищённых средах это запрещено. Ему нужна память под скомпилированный код, которой нет на микроконтроллере. И его результат зависит от машины, а смарт-контрактам и песочницам нужен одинаковый результат везде. Хороший пример того, как далеко можно разогнать интерпретатор, вышел на этой неделе: Wasmi 2.0, интерпретатор WebAssembly на Rust, стал в 2,2 раза быстрее предыдущей версии за счёт того, как устроен цикл выбора инструкций и как хранятся промежуточные значения. Что такое dispatch и аккумуляторные регистры простыми словами, разобрали на сайте. #основы
Открыть канал и посмотреть медиаЧто делать, если ключ от сервиса уехал в публичный репозиторий Поздний вечер, код наконец заработал, git add ., коммит, пуш. Через несколько минут расход по API растёт, появляются запросы, которых вы не делали, а счёт больше ожидаемого. Первый порыв, стереть строчку и закоммитить заново, не спасает: старый коммит остаётся в истории репозитория, и ключ достают оттуда. Поэтому чистка истории идёт не первым шагом, а после того, как ключ отозван и выпущен новый. Разбор проходит порядок действий целиком, включая удаление секрета из уже опубликованных коммитов. А чтобы не возвращаться к этому, заведите привычку: перед первым пушем нового проекта убедитесь, что .env лежит в .gitignore. #основы
Открыть канал и посмотреть медиаПочему строка после await печатается раньше, чем вы ожидали Вы поставили await перед загрузкой постов, а строка, которая идёт ниже по коду, напечаталась первой. Выглядит как сломанный await, хотя это ровно его штатная работа. В Python time.sleep() блокирует всё, и следующая строка честно ждёт. В JavaScript await ставит на паузу только ту функцию, внутри которой стоит, а остальной код бежит дальше. Разбор написал дата-сайентист, который учит JavaScript и объясняет промисы через привычный ему Python: промис здесь объект, который обещает вернуть значение позже. Скопируйте пример себе и предскажите порядок вывода до запуска, а потом сверьтесь. Ошиблись — значит, нашли своё главное заблуждение о промисах. Пример целиком. #javascript
Открыть канал и посмотреть медиаКак CI получает доступ к облаку без пароля в настройках Классическая схема: в переменных CI лежит ключ от облака, сборка его читает и загружает артефакты. Ключ живёт годами, его копируют в новые проекты, и утечка одного ключа открывает всё. Именно так в августе через непропатченный TeamCity вынесли облачные учётки самой JetBrains, мы разбирали этот инцидент. Альтернатива называется OIDC, и её теперь поддерживает и TeamCity. Идея простая. Сервер CI получает пару ключей: приватным подписывает, публичный выкладывает по известному адресу. Каждой сборке он выдаёт короткий подписанный документ, JWT, где написано, какой это проект и для какого облака. Сборка показывает документ облаку, облако скачивает публичный ключ, проверяет подпись и выдаёт временный доступ. У TeamCity документ, запрошенный сборкой по HTTP, живёт 5 минут; выданный при старте сборки действует до её таймаута плюс 10 минут. В конфигурации при этом нет ни одного секрета, только правило «сборкам проекта X можно роль Y». Так же работают GitHub Actions и GitLab CI. Если хотите понять механизм на схеме и увидеть, что внутри JWT, разобрали на сайте. #основы
Открыть канал и посмотреть медиаПочему WHERE active OR NOT active не возвращает все строки В обычной логике это утверждение верно всегда. В SQL есть третье значение: NULL означает «неизвестно», и NULL OR NOT NULL тоже неизвестно, а WHERE оставляет только строки, где условие истинно. Строка с active = NULL молча выпадает. Кристофер Уинслетт из Crunchy Data собрал все места, где так происходит. Запомнить стоит три вещи. NULL = NULL даёт не true, а NULL, поэтому существует IS NULL, а для сравнения «с учётом неизвестного» есть IS NOT DISTINCT FROM. Любая арифметика с NULL даёт NULL: quantity * unit_price обнулит колонку в UPDATE, если хотя бы одно поле пустое, лечится COALESCE. И самое коварное: x NOT IN (1, 2, NULL) не вернёт ни одной строки, потому что раскрывается в цепочку AND с неизвестным внутри. Автор советует самое простое: где значение обязано быть, ставить NOT NULL в схеме. #sql #postgresql #основы
Открыть канал и посмотреть медиаПочему length у строки с одним эмодзи возвращает 5 Откройте консоль браузера и проверьте: "🍋🟩".length даёт 5, [..."🍋🟩"].length даёт 3, а человек видит один значок лайма. Это не баг, это три разных способа считать. length в JavaScript считает кодовые единицы UTF-16 по 16 бит. Эмодзи лайма это два таких элемента, соединитель ещё один, зелёный квадрат ещё два, итого пять. Spread-оператор идёт по кодовым точкам Unicode, их три: лайм, соединитель, квадрат. А то, что видит человек, называется графемой, и посчитать её умеет только Intl.Segmenter, который знает правила склейки символов. На этот пример наткнулся разработчик, собиравший текстовый редактор в браузере, и в его разборе видно, где это стреляет: позиция курсора, выделение, лимит символов в поле. Проверьте у себя: если ограничиваете длину ввода через length, пользователь с эмодзи в имени упрётся в лимит раньше, чем вы думали. #основы #javascript
Открыть канал и посмотреть медиаДвойное подчёркивание в Python не делает атрибут приватным Новички часто пишут self.__value и думают, что закрыли поле от внешнего мира. На самом деле Python просто переименовывает его: внутри класса Helper атрибут __value превращается в _Helper__value. Это называется name mangling, и обойти его можно, написав это длинное имя руками. Ловушка глубже, чем кажется. Переименование зависит только от имени класса, не от модуля. Если два независимых класса в разных файлах называются Helper и оба хранят __value, а кто-то наследуется от обоих, поля сталкиваются в одном и том же _Helper__value: один класс кладёт туда строку, другой число, и код падает с TypeError на сложении. Именно такой пример разбирают сейчас на форуме разработчиков Python, обсуждая, нужна ли языку настоящая приватность. Что с этим делать сегодня. Одно подчёркивание _value честно говорит «не трогай снаружи» и ничего не переименовывает. А если два класса должны хранить своё состояние независимо, чаще безопаснее не наследоваться от обоих, а держать их объекты внутри как поля. #python #основы
Открыть канал и посмотреть медиаОдна настройка — и git branch показывает ветки от самой свежей Ветки в проекте копятся быстро: своя текущая, пара недоделанных, чужие после ревью, старые с прошлого месяца. По умолчанию git branch выводит их по алфавиту, поэтому нужная теряется где-то в середине списка, и вспомнить, какая из них свежая, невозможно. Обычно с этим борются самописным скриптом: пробегают по всем веткам, для каждой запрашивают дату последнего коммита и сортируют вывод. Райан Гринберг так и делал несколько лет, пока не выяснил, что современному git это не нужно. Достаточно один раз выполнить: git config --global branch.sort committerdate После этого git branch во всех ваших репозиториях сортирует ветки по дате последнего коммита, свежие оказываются внизу списка. Без --global настройка ляжет только в текущий репозиторий. Для одного запуска есть параметр: git branch --sort committerdate. Минус перед ключом переворачивает порядок, и самая свежая ветка встаёт первой: git branch --sort=-committerdate. Ключи сортировки берутся из справки git for-each-ref, и там их много. Из полезного: authordate — дата автора коммита вместо даты коммитера, refname — имя ветки, то самое поведение по умолчанию, upstream — имя ветки, за которой следит каждая из выведенных. #git #основы
Открыть канал и посмотреть медиаТолько зарегистрированные пользователи могут делиться своим мнением.
Станьте первым, кто поделится своим впечатлением об этом ресурсе!
Анализ рынка, торговые идеи и сигналы для активных трейдеров.
Актуальные ежедневные комбо для Hamster Kombat. Полезные коды и советы для фарма в Telegram-боте игры.