и посмотреть медиа
Точка входа - основы программирования
и посмотреть медиа
Базовые знания по основам программирования для новичков.
Базовые знания по основам программирования для новичков.
Курс фундаментальных понятий: алгоритмы, структуры данных, языки программирования. Идеально для начинающих без опыта.
В документации 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 #основы
Открыть канал и посмотреть медиаOnly registered users can share their opinion.
Be the first to share your impression of this resource!
Makeup ideas, lessons and beauty trends. Photos, videos and tips for creating stylish images in Telegram.
A channel with examples of investment analysis and access to a trading bot. Useful strategies and tools for beginner investors.
Notifications about new CVEs in Telegram. Fresh vulnerabilities, alerts and analysis for security professionals. Operational monitoring bot.