и посмотреть медиа
Entry Point - programming basics
и посмотреть медиа
Basic knowledge on programming fundamentals for beginners.
Basic knowledge on programming fundamentals for beginners.
Course of fundamental concepts: algorithms, data structures, programming languages. Ideal for beginners without experience.
Почему строка после 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 #основы
Открыть канал и посмотреть медиаВставьте команду — explainshell разберёт её по кусочкам Нашли в туториале команду вроде tar -xzvf archive.tar.gz -C /tmp и не понимаете, что делает каждая буква? Сайт explainshell разбирает команду на части и к каждому флагу подтягивает объяснение прямо из man-страниц — официальной документации утилит Linux. Понимает пайпы и перенаправления, знает тысячи команд из man-страниц Ubuntu. Полезная привычка: прежде чем запускать чужую команду из интернета, вставить её сюда и посмотреть, что она на самом деле сделает. explainshell.com #основы
Открыть канал и посмотреть медиаПервый проект на Python: собираем игру из знакомых конструкций После знакомства с основами синтаксиса можно перейти к небольшой программе, которую получится закончить за один курс. На Real Python собирают с нуля консольную игру «Камень, ножницы, бумага» и объясняют каждый этап. По ходу работы вы потренируетесь получать ввод от пользователя, повторять действия с помощью циклов и делить программу на функции. В проекте также используются словари и перечисления enum. Все эти элементы складываются в одну работающую игру, поэтому видно, зачем они нужны вместе. Курс состоит из 8 уроков, примерно 48 минут видео и двух скачиваемых материалов. Кроме видео, в него входят текст, упражнения и тест. Код проверен на Python 3.9, заявлена совместимость с версиями 3.4 и новее. Часть материалов платная: некоторые уроки и итоговый тест доступны только участникам Real Python. #основы #python #проект
Открыть канал и посмотреть медиа«У меня работает, а на сервере падает» — про это написан свод из двенадцати правил Первый рабочий проект почти всегда проходит через один и тот же сюжет: на ноутбуке всё запускается, на сервере ломается. Пароль от базы вписан прямо в код, у коллеги другая версия библиотеки, логи пишутся в файл, который никто не читает, а перезапуск сервиса теряет загруженные пользователем картинки. Адам Уиггинс, сооснователь Heroku, где на глазах команды разворачивались сотни тысяч приложений, собрал причины таких поломок в The Twelve-Factor App — двенадцать правил для веб-приложений на любом языке. Документ в последний раз обновляли в 2017 году, и с тех пор он не устарел; есть перевод на русский. Самые полезные для начинающего: — Один репозиторий на приложение, много развёртываний из него. Прод и ваша локальная копия — это один и тот же код в разных окружениях. — Зависимости объявляются явно. requirements.txt, package.json, go.mod — чтобы «у коллеги другая версия» перестало быть диагнозом. — Конфигурация живёт в переменных окружения. Всё, что отличается между вашей машиной и сервером — адрес базы, ключи, пароли, — не должно лежать в коде. Проверка простая: можно ли выложить репозиторий в открытый доступ прямо сейчас. — База, очередь, файловое хранилище — подключаемые ресурсы. Смена адреса базы должна сводиться к правке переменной окружения. — Приложение не хранит состояние в себе. Всё, что должно пережить перезапуск, кладётся во внешнее хранилище. — Логи пишутся в стандартный вывод потоком. Собирать и хранить их — задача окружения. Документ читается за вечер и объясняет, почему привычные к этому моменту практики устроены именно так. #основы
Открыть канал и посмотреть медиаOnly registered users can share their opinion.
Be the first to share your impression of this resource!