TGViewer
Channel Public Channel
Точка входа в программирование

Точка входа в программирование

@prog_point

Фундаментальные знания по основам программирования

Разместить рекламу: @tproger_sales_bot

Правила общения: https://tprg.ru/rules

Другие каналы: @tproger_channels

Сайт: https://tprg.ru/site

Регистрация в перечне РКН: https://tprg.ru/zrgj
Subscribers
18K
Photos
1.8K
Videos
293
Links
3.3K

Showing posts older than #5049 · Back to latest

Older Posts 20 shown
Post #5048 789
Почему 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 #основы
  • ❤ 2
Post #5047 814
Почему length у строки с одним эмодзи возвращает 5

Откройте консоль браузера и проверьте: "🍋‍🟩".length даёт 5, [..."🍋‍🟩"].length даёт 3, а человек видит один значок лайма. Это не баг, это три разных способа считать.

length в JavaScript считает кодовые единицы UTF-16 по 16 бит. Эмодзи лайма это два таких элемента, соединитель ещё один, зелёный квадрат ещё два, итого пять. Spread-оператор идёт по кодовым точкам Unicode, их три: лайм, соединитель, квадрат. А то, что видит человек, называется графемой, и посчитать её умеет только Intl.Segmenter, который знает правила склейки символов.

На этот пример наткнулся разработчик, собиравший текстовый редактор в браузере, и в его разборе видно, где это стреляет: позиция курсора, выделение, лимит символов в поле. Проверьте у себя: если ограничиваете длину ввода через length, пользователь с эмодзи в имени упрётся в лимит раньше, чем вы думали.

#основы #javascript
  • 👍 5
  • 🙉 2
  • ❤ 1
Post #5046 889
Двойное подчёркивание в Python не делает атрибут приватным

Новички часто пишут self.__value и думают, что закрыли поле от внешнего мира. На самом деле Python просто переименовывает его: внутри класса Helper атрибут __value превращается в _Helper__value. Это называется name mangling, и обойти его можно, написав это длинное имя руками.

Ловушка глубже, чем кажется. Переименование зависит только от имени класса, не от модуля. Если два независимых класса в разных файлах называются Helper и оба хранят __value, а кто-то наследуется от обоих, поля сталкиваются в одном и том же _Helper__value: один класс кладёт туда строку, другой число, и код падает с TypeError на сложении. Именно такой пример разбирают сейчас на форуме разработчиков Python, обсуждая, нужна ли языку настоящая приватность.

Что с этим делать сегодня. Одно подчёркивание _value честно говорит «не трогай снаружи» и ничего не переименовывает. А если два класса должны хранить своё состояние независимо, чаще безопаснее не наследоваться от обоих, а держать их объекты внутри как поля.

#python #основы
  • 💔 2
  • 🆒 2
Post #5045 887
Одна настройка — и 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 #основы
  • 🔥 2
  • 😇 2
Post #5044 896
Вставьте команду — explainshell разберёт её по кусочкам

Нашли в туториале команду вроде tar -xzvf archive.tar.gz -C /tmp и не понимаете, что делает каждая буква? Сайт explainshell разбирает команду на части и к каждому флагу подтягивает объяснение прямо из man-страниц — официальной документации утилит Linux.

Понимает пайпы и перенаправления, знает тысячи команд из man-страниц Ubuntu. Полезная привычка: прежде чем запускать чужую команду из интернета, вставить её сюда и посмотреть, что она на самом деле сделает.

explainshell.com

#основы
  • ❤ 6
Post #5043 972
Первый проект на Python: собираем игру из знакомых конструкций

После знакомства с основами синтаксиса можно перейти к небольшой программе, которую получится закончить за один курс. На Real Python собирают с нуля консольную игру «Камень, ножницы, бумага» и объясняют каждый этап.

По ходу работы вы потренируетесь получать ввод от пользователя, повторять действия с помощью циклов и делить программу на функции. В проекте также используются словари и перечисления enum. Все эти элементы складываются в одну работающую игру, поэтому видно, зачем они нужны вместе.

Курс состоит из 8 уроков, примерно 48 минут видео и двух скачиваемых материалов. Кроме видео, в него входят текст, упражнения и тест. Код проверен на Python 3.9, заявлена совместимость с версиями 3.4 и новее.

Часть материалов платная: некоторые уроки и итоговый тест доступны только участникам Real Python.

#основы #python #проект
  • 🆒 1
Post #5042 937
«У меня работает, а на сервере падает» — про это написан свод из двенадцати правил

Первый рабочий проект почти всегда проходит через один и тот же сюжет: на ноутбуке всё запускается, на сервере ломается. Пароль от базы вписан прямо в код, у коллеги другая версия библиотеки, логи пишутся в файл, который никто не читает, а перезапуск сервиса теряет загруженные пользователем картинки.

Адам Уиггинс, сооснователь Heroku, где на глазах команды разворачивались сотни тысяч приложений, собрал причины таких поломок в The Twelve-Factor App — двенадцать правил для веб-приложений на любом языке. Документ в последний раз обновляли в 2017 году, и с тех пор он не устарел; есть перевод на русский.

Самые полезные для начинающего:

— Один репозиторий на приложение, много развёртываний из него. Прод и ваша локальная копия — это один и тот же код в разных окружениях.

— Зависимости объявляются явно. requirements.txt, package.json, go.mod — чтобы «у коллеги другая версия» перестало быть диагнозом.

— Конфигурация живёт в переменных окружения. Всё, что отличается между вашей машиной и сервером — адрес базы, ключи, пароли, — не должно лежать в коде. Проверка простая: можно ли выложить репозиторий в открытый доступ прямо сейчас.

— База, очередь, файловое хранилище — подключаемые ресурсы. Смена адреса базы должна сводиться к правке переменной окружения.

— Приложение не хранит состояние в себе. Всё, что должно пережить перезапуск, кладётся во внешнее хранилище.

— Логи пишутся в стандартный вывод потоком. Собирать и хранить их — задача окружения.

Документ читается за вечер и объясняет, почему привычные к этому моменту практики устроены именно так.

#основы
  • ❤ 4
  • ❤‍🔥 1
Post #5041 959
SQL можно изучать в браузере без установки базы данных

SQL нужен, чтобы получать и изменять данные, которые хранятся в таблицах. В начале легко запутаться в командах и правилах, поэтому SQLBolt предлагает короткие уроки с упражнениями прямо на той же странице. База данных на компьютере для занятий не нужна.

Сначала учебник объясняет устройство таблиц и выбор нужных строк. Затем появляются фильтрация, сортировка, объединение нескольких таблиц и функции для подсчётов. После этого можно перейти к командам INSERT, UPDATE и DELETE, а также к созданию структуры таблиц.

Такой порядок подходит тем, кто впервые знакомится с базами данных и хочет сразу проверять каждую новую команду на практике. Авторы предупреждают, что разные системы поддерживают единый стандарт SQL с отличиями. В учебнике упоминаются SQLite, MySQL, PostgreSQL, Oracle и Microsoft SQL.

В 2021 году обсуждение SQLBolt на Hacker News набрало 324 очка и 84 комментария.

#основы #sql #базыданных
  • ❤ 3
  • 🤷‍♀ 1
  • 🤓 1
Post #5040 983
Python Tutor показывает выполнение программы по одному шагу

Когда программа выдаёт неверный результат, новичку бывает трудно понять, в какой момент всё пошло не так. Python Tutor запускает код в браузере и позволяет двигаться вперёд и назад по отдельным шагам.

На экране видно, какие значения сейчас лежат в переменных, как меняются списки и словари, какие объекты связаны друг с другом. Ещё сервис показывает, какая функция выполняется и из какой функции её вызвали. Так можно найти точный шаг, на котором состояние программы стало неправильным, без множества команд print.

Поддерживаются Python, Java, C, C++ и JavaScript. Устанавливать программу и создавать учётную запись не требуется: код можно вставить прямо на сайте. С 2010 года сервисом воспользовались более 25 млн человек из более чем 180 стран. Он создал свыше 500 млн визуализаций и применяется более чем в 10 000 учебных заведений.

#основы #python #отладка
  • ❤ 4
  • 🫡 1
  • 🗿 1
Post #5039 1.04K
MMO с 23-летней историей переезжает с Python 2 на Python 3 — и вот почему это долго

Вы наверняка слышали, что Python 2 давно не поддерживается. Живой пример того, во что превращается такой переезд, — EVE Online. Прошлый раз версию интерпретатора в игре меняли в 2010 году.

Масштаб: 2,4 млн строк Python примерно в 20 тысячах файлов, поверх 23 лет данных живых игроков — персонажи, навыки, имущество, внутриигровая валюта. Часть кода написана по правилам Python 2.3 и 2.5, которые тройка уже не принимает.

При пробной компиляции обоими интерпретаторами 95,9% файлов собрались сразу. Осталось около 3300 строк явных несовместимостей: примерно 1500 старых print, 800 литералов вида 123L, 600 старых форм except и 50 операторов <>. Это как раз то, что чинит 2to3.

Опаснее другое: около 20 тысяч строк синтаксически корректны в обеих версиях, но работают по-разному. Классический пример, который стоит запомнить: 1 / 2 даёт 0 в Python 2 и 0.5 в Python 3. Такое не найдёт ни компилятор, ни линтер — только тесты и внимательное чтение.

В нашем канале Zen of Python разобрали план миграции подробнее.

#python #основы
  • ❤‍🔥 3
Post #5038 982
GitHub Classroom выключили — что делать, если по нему шла ваша учёба

Если вы учились или вели курс через GitHub Classroom, сервис больше не работает. 28 августа GitHub окончательно выключил сайт, API и связанные службы. К этому шли с 26 мая, когда закрыли регистрацию новых пользователей.

Classroom был надстройкой над GitHub для учебных курсов: преподаватель раздавал задание, каждому студенту автоматически создавался репозиторий из шаблона, а автопроверка гоняла тесты и выставляла баллы.

Что уцелело. Ваши аккаунты, репозитории и организации, созданные для работы с Classroom, не тронуты: код и вся история коммитов на месте. Удаляются данные самого Classroom — названия классов и заданий, тесты, описанные вне репозиториев, и списки студентов, подтянутые через LTI.

Что стоит сделать сейчас. Откройте список репозиториев своего аккаунта и убедитесь, что все учебные проекты там видны, а не только по ссылке из интерфейса Classroom. Если проверка задания жила в настройках Classroom, перенесите её в обычный GitHub Actions: создайте в репозитории файл .github/workflows/tests.yml, который запускает ваши тесты на каждый push. Так проверка становится частью проекта и переживает любой сервис.

Список партнёрских сервисов, которые GitHub предлагает вместо Classroom, лежит в обсуждении для преподавателей.

#основы
  • ❤ 1
Post #5037 939
Карта бесплатных курсов: что учить по порядку, если начинаете с нуля

Материалов для самоучки много, главная проблема в другом: непонятно, в каком порядке их брать. На r/learnprogramming собрали такую карту: только бесплатные курсы, у каждого честная оценка, сколько часов он займёт.

Фундамент — Missing Semester от MIT: командная строка, Git, отладка, то, чему обычно не учат ни на одном курсе. 15–25 часов.

Дальше CS50x от Гарварда, 100–200 часов на общее устройство программирования. Если хочется сразу писать на Python, вместо него берут CS50P — 50–90 часов.

Git по-настоящему — книга Pro Git: на первые три главы автор карты отводит 6–10 часов.

SQL — SQLBolt: 5–8 часов, после каждого урока упражнение прямо в браузере.

Руки набивать — Exercism, 20–60 часов на один язык.

#основы #git #sql
Reddit From the learnprogramming community on Reddit: A goal-based map of free CS self-study courses (2026) — every link checked this… Explore this post and more from the learnprogramming community
  • 🔥 4
  • 🦄 2
  • 🎉 1
Post #5036 972
Rebase создаёт новые коммиты, и в этом его опасность

Разработчица из Гданьска собрала команды Git, которым её когда-то научил тимлид, для тех, у кого add, commit, pull и push уже на автомате. Многие из них переписывают историю, а опасно это, когда историю уже забрали коллеги.

После git rebase main коммиты D и E превращаются в D' и E' с другими хэшами. Пока ветка только ваша, всё безопасно; если на ней сидят другие, у них всё разъедется. Так же работает git commit --amend, отсюда rejected (non-fast-forward) при пуше. Лечить его стоит через --force-with-lease: пуш пройдёт, только если удалённая ветка не менялась с последнего fetch, иначе Git откажет и чужая работа уцелеет.

Три режима reset: --soft держит изменения в индексе, --mixed в рабочей папке, --hard стирает. Стёрли лишнее? Коммит ещё виден в git reflog, и автор советует сначала git branch rescue <хэш>. Разбор всех десяти команд вышел на dev.to. Задание: сделайте git rebase -i HEAD~3 на своей ветке и сравните хэши.

#git
  • ❤ 1
Post #5035 1.1K
BRIN-индекс в 4570 раз меньше B-tree, пока не обновили 5 % строк

Индекс BRIN в PostgreSQL хранит только min и max колонки на диапазон страниц и весит килобайты, что удобно для логов и событий. Инженер, делавший такие же zonemaps в Oracle, измерил на 10 млн строк, что с BRIN делают обычные UPDATE. Ломается он тихо.

Свежий BRIN по created_at весит 48 КБ против 214 МБ у B-tree и отдаёт день за 21,2 мс (1536 страниц). После обновления 5 % строк тот же запрос читает 51 268 страниц и идёт 558,7 мс: 3,8 млн строк достаются и отбрасываются проверкой.

Причина в MVCC: UPDATE кладёт новую версию строки туда, где есть место. Одна январская строка в «мартовском» диапазоне из 128 страниц расширяет его min/max, и он совпадает с любым январским запросом. А pg_stats.correlation ещё показывает 0,921.

Проверьте у себя: в EXPLAIN (ANALYZE, BUFFERS) смотрите на Heap Blocks: lossy, корреляция ничего не покажет. Лечит CLUSTER, но с блокировкой таблицы. Скрипт есть в статье.

#postgresql #sql
  • ❤ 3
  • 🔥 1
Post #5034 1.22K
Тимлид рассказывает, как его команда из трёх человек — сам разработчик, аналитик и продакт, ни разу не открывавшие IDE, — за две недели вывела в прод новый сервис на вайб-кодинге. По пути: мёрдж-конфликты между людьми, которые не знают, что такое git pull, ночные смены с часу до восьми утра, потому что днём общий чат с моделью просто не отвечал, и момент, когда за час до демо ИИ-инструмент ушёл на техобслуживание. Честная история про то, что вайб-кодинг ускоряет сильного разработчика — и оставляет беспомощным того, кто ждёт чуда от нейросети.

Как прошёл этот вайбкодинг-эксперимент в новом материале.
  • ❤ 1
  • 😐 1
Post #5033 1.22K
Есть у нас один знакомый разработчик, который давно не отдыхал.

Последний отпуск — где-то в районе позапрошлого года. Чемодан на антресолях, паспорт неизвестно где, в комнате — бардак.

Сам он не соберётся, нужна ваша помощь → https://tprg.ru/PgIs
  • 🔥 2
  • ❤ 1
  • 👍 1
  • 👎 1
Post #5032 10.1K
void в C меняет смысл в зависимости от места

Вы видите void в объявлении функции, в скобках после её имени и рядом со звёздочкой у указателя. Выглядит одинаково, а ведёт себя каждый раз по-своему, и в чужом коде легко прочитать одно вместо другого.

У нас вышла статья о том, как одно короткое слово набрало столько ролей. Заодно там история появления слова: его предложил Стивен Борн, тот самый автор Bourne Shell, и придумали его совсем не ради читаемости кода.

Если пишете на C, дочитайте хотя бы до места про функции без параметров: многие узнают там, что объявляли их не так, как думали. Разобрали в статье.

#основы
  • ❤ 1
Post #5031 1.38K
Сгенерируйте свой первый звук на C++ без библиотек

Звук в компьютере — это просто список чисел. В статье автор пишет ~60 строк на C++, которые строят синусоиду, упаковывают её в WAV и дают файл, который реально можно включить.

Для новичка это отличный способ увидеть, как математика превращается в работающий результат: частота 440 Гц соответствует ноте A4, амплитуда задаёт громкость, а sample rate показывает, сколько отсчётов в секунде. Не нужно знать аудиодвижки, достаточно цикла и пары формул.

#cpp
  • 👍 3
  • ❤ 2
Post #5030 2.97K
Создаём программу, которая сама умеет выбирать модели в зависимости от задачи

Чем дольше работаешь с ИИ, тем больше убеждаешься, что под разные задачи нужны разные модели. Дя простых задач не нужна дорогая модель, а со сложной дешевая может не справиться. А ещё, используя только одну модель, вы рискуете получить кирпич, если эта модель вдруг станет недоступна.

Выход — разделить запросы по сложности и держать под рукой запасной вариант. Сначала ваш скрипт решает, насколько труден вопрос, потом отправляет простое к дешёвой модели, а сложное — к мощной. При сбое переключается на резервную модель. Туториал разбирает это на Python шаг за шагом.

#python
  • ❤ 1
Post #5029 1.16K

Forwarded from Веб-страница

React не следит за фокусом — useFocus из @reactuses/core делает это за него

В React нет состояния, которое говорит, активно ли сейчас поле ввода. document.activeElement показывает ответ, но не перерендеривает компонент при смене фокуса, а autoFocus стреляет один раз и не даёт вернуть фокус программно. Приходится вешать onFocus и onBlur вручную.

Хук useFocus из @reactuses/core сворачивает это в [isFocused, setFocused]: первая часть отражает реальное состояние элемента, вторая вызывает focus() или blur() по вашей логике. Например, при программном фокусе на поиске.

Для подсветки рамки хватит CSS :focus, но как только фокус начинает управлять JSX через подсказки, плавающие лейблы или паузу тикера, хук убирает шаблонный код.

Я бы сохранил его для форм и модалок, где фокус важен для UX, а не только для стилей. Разобрали в статье.
  • ❤ 3
  • 🤷‍♂ 1
  • 👍 1
Older posts →
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →