uk
Feedback
Сохранёнки программиста

Сохранёнки программиста

Відкрити в Telegram

Заметки и ссылки на будущее, чтобы изучить когда будет время. Разместить рекламу: @tproger_sales_bot Правила общения: https://tprg.ru/rules Другие каналы: @tproger_channels Другие наши проекты: https://tprg.ru/med

Показати більше
6 604
Підписники
-224 години
-77 днів
-2230 день
Залучення підписників
липень '26
липень '26
+13
в 3 каналах
червень '26
+48
в 2 каналах
Get PRO
травень '26
+70
в 0 каналах
Get PRO
квітень '26
+30
в 0 каналах
Get PRO
березень '26
+47
в 5 каналах
Get PRO
лютий '26
+57
в 14 каналах
Get PRO
січень '26
+38
в 2 каналах
Get PRO
грудень '25
+46
в 4 каналах
Get PRO
листопад '25
+45
в 2 каналах
Get PRO
жовтень '25
+40
в 7 каналах
Get PRO
вересень '25
+26
в 3 каналах
Get PRO
серпень '25
+41
в 1 каналах
Get PRO
липень '25
+46
в 0 каналах
Get PRO
червень '25
+38
в 2 каналах
Get PRO
травень '25
+68
в 5 каналах
Get PRO
квітень '25
+49
в 1 каналах
Get PRO
березень '25
+63
в 1 каналах
Get PRO
лютий '25
+69
в 2 каналах
Get PRO
січень '25
+72
в 4 каналах
Get PRO
грудень '24
+46
в 1 каналах
Get PRO
листопад '24
+104
в 6 каналах
Get PRO
жовтень '24
+73
в 4 каналах
Get PRO
вересень '24
+87
в 3 каналах
Get PRO
серпень '24
+204
в 4 каналах
Get PRO
липень '24
+86
в 4 каналах
Get PRO
червень '24
+77
в 4 каналах
Get PRO
травень '24
+75
в 4 каналах
Get PRO
квітень '24
+68
в 3 каналах
Get PRO
березень '24
+65
в 4 каналах
Get PRO
лютий '24
+50
в 0 каналах
Get PRO
січень '24
+64
в 1 каналах
Get PRO
грудень '23
+59
в 2 каналах
Get PRO
листопад '23
+3 534
в 33 каналах
Get PRO
жовтень '23
+55
в 1 каналах
Get PRO
вересень '23
+71
в 0 каналах
Get PRO
серпень '23
+69
в 0 каналах
Get PRO
липень '23
+57
в 0 каналах
Get PRO
червень '23
+180
в 0 каналах
Get PRO
травень '23
+73
в 0 каналах
Get PRO
квітень '23
+93
в 0 каналах
Get PRO
березень '23
+65
в 0 каналах
Get PRO
лютий '23
+113
в 0 каналах
Get PRO
січень '23
+68
в 0 каналах
Get PRO
грудень '22
+86
в 0 каналах
Get PRO
листопад '22
+90
в 0 каналах
Get PRO
жовтень '22
+117
в 0 каналах
Get PRO
вересень '22
+134
в 0 каналах
Get PRO
серпень '22
+787
в 0 каналах
Get PRO
липень '22
+119
в 0 каналах
Get PRO
червень '22
+90
в 0 каналах
Get PRO
травень '22
+157
в 0 каналах
Get PRO
квітень '22
+131
в 0 каналах
Get PRO
березень '22
+117
в 0 каналах
Get PRO
лютий '22
+198
в 0 каналах
Get PRO
січень '22
+149
в 0 каналах
Get PRO
грудень '21
+5 099
в 0 каналах
Get PRO
листопад '21
+927
в 0 каналах
Get PRO
жовтень '21
+1 849
в 0 каналах
Дата
Залучення підписників
Згадування
Канали
16 липня+1
15 липня+1
14 липня0
13 липня0
12 липня+1
11 липня+1
10 липня0
09 липня0
08 липня+1
07 липня+2
06 липня0
05 липня+2
04 липня+1
03 липня+2
02 липня+1
01 липня0
Дописи каналу
Конкурентность в стиле Go, собранная поверх pthreads Автор собрал на C знакомые по Go примитивы: мьютексы, condition variables, атомики, ограниченный пул воркеров и buffered/unbuffered channels. Затем сравнил их стоимость с реализацией Go. 🔘 атомики и свободные мьютексы работают на уровне Go или быстрее благодаря тонкой обёртке; 🔘 парковка потока и системные пробуждения замедляют condition variables в 7–10 раз; 🔘 на крупных задачах worker pool укладывается примерно в 10% от результата Go; 🔘 мелкая передача работы лучше даётся дешёвым goroutines. Преимущество pthreads сохраняется на крупных задачах с редкой синхронизацией. Частые переключения быстро съедают выигрыш и оставляют системные потоки далеко позади runtime scheduler. Полная статья: https://antonz.org/concurrency-in-c/ @prog_stuff

2
Как переписывать историю Git без цепочки интерактивных rebase Автор разобрал экспериментальную команду git history из Git 2.54–2.55. Она меняет старый коммит и сама перестраивает всех его потомков. 🔘 fixup встраивает staged-правку в выбранный коммит; 🔘 reword меняет сообщение, не затрагивая рабочее дерево; 🔘 split делит коммит на части по выбранным hunks. Операции атомарны. При конфликте Git оставляет историю в исходном состоянии. Merge-коммиты пока не поддерживаются, сохранить конфликт для ручного продолжения тоже нельзя. Поэтому область применения уже, чем у интерактивного rebase. Полная статья: https://lalitm.com/post/git-history/ @prog_stuff
271
3
На Tproger вышел обзор онлайн-магистратуры МФТИ «Технологическое предпринимательство» — глазами разработчика, который пошёл туда после 10 лет в коммерческой разработке. О чём: почему он не стал запускать стартап без подготовки и бросал онлайн-курсы на середине; как выглядит учёба изнутри: вебинары по выходным, персональный ментор и 1000 часов работы над собственным проектом; где программа слабая (разные стадии проектов в одной группе, неровный фидбек); во сколько магистратура обойдётся в 2026 году и как проверить формат до оплаты. Полная статья: https://tproger.ru/articles/skolko-stoit-stat-predprinimatelem-obzor-onlajn-magistratury @prog_stuff
304
4
Баг, который 15 лет жил во всех дистрибутивах Linux Команда VEGA разобрала use-after-free на стеке ядра (CVE-2026-43499): дефект пролежал в коде с 2011 года и присутствовал в каждом крупном дистрибутиве. Для срабатывания не нужны ни привилегии, ни специальная конфигурация ядра. Корень — в механике futex с наследованием приоритета. Функция, снимающая поток с ожидания, чистит поле pi_blocked_on у current. На обычном пути это корректно, но на «proxy»-ветке current — уже не тот поток, что спит в ожидании, и у спящего остаётся висячий указатель на фрейм собственного, уже свёрнутого стека. Дальше — образцовая цепочка эксплуатации: контролируемые байты распыляются на освобождённый стек, подделывается структура ожидателя, обходится KASLR. В итоге — эскалация до root и выход из контейнера со стабильностью 97%. За это Google выплатил команде 92 337 долларов по программе kernelCTF. Полная статья: https://nebusec.ai/research/ionstack-part-2/ Сохранять тем, кто хочет увидеть, как одно неверное допущение про «кто сейчас current» превращается в root на пятнадцать лет вперёд. @prog_stuff
332
5
UI-паттерны, которые скоро можно делать без JS Если верстаете интерфейсы каждый день, я бы сохранил этот доклад Уны Кравец с
UI-паттерны, которые скоро можно делать без JS Если верстаете интерфейсы каждый день, я бы сохранил этот доклад Уны Кравец с CSS Day 2026 в закладки. Она разобрала, как новые CSS-возможности убирают типичный скриптовый код: sticky-заголовок прячется через scroll-state(stuck: top), а hover-тултипы собираются на атрибутах interesttarget и popover=hint — почти без JavaScript. Ещё два момента: sibling-index() задаёт staggered-задержки прямо в CSS, а border-shape позволяет рисовать необычные формы границ вместо border-radius. Пока часть фич работает не везде — polyfill для invokers не тянет на мобильные, так что в прод пока не нёс бы. Но следить стоит: платформа берёт на себя то, за что мы раньше тащили библиотеки. Видео доклада на YouTube.
330
6
«Бесполезный» if ускорил цикл в четыре раза Автор блога purplesyringa разобрала горячий цикл своего компрессора: j = next_j[i][j], одна инструкция mov. Казалось бы, предел. На деле это pointer chasing — каждая итерация ждёт, пока из памяти придёт результат предыдущей, и весь цикл сидит на латентности, хотя вычислений почти нет. Трюк: обернуть присваивание в if (j != next_j[i][j]). Предсказатель ветвлений считает тело маловероятным, процессор спекулятивно гонит следующие итерации параллельно, а на редком промахе сам откатывает записи. В бенчмарке 320 мкс превратились в 80. Отдельная линия сюжета — война с компилятором: с его точки зрения такой if бессмысленен, и оптимизатор его выкидывает. Пришлось имитировать независимость условия через volatile; читатели позже нашли, что LLVM достаточно [[unlikely]]. А «правильный» рефакторинг с битовой маской вышел бы медленнее: тест бита на x86 дороже сравнения. Полная статья: https://purplesyringa.moe/blog/quadrupling-code-performance-with-a-useless-if/ @prog_stuff
370
7
На Tproger вышел разбор о том, чем пет-проект отличается от бизнеса. Разговор с Вячеславом Чикиным — серийным предпринимателем и замзавкафедрой технологического предпринимательства МФТИ. О чём: почему бизнес начинается с чужой проблемы, а не с технологии; почему ценность решения нельзя придумать из головы (с историей про AR-очки для сборщиков трамваев, которые отвергли сами рабочие); чем предприниматель отличается от менеджера и почему тимлид — не ступенька к фаундеру; почему продукт с первыми пользователями и выручкой — ещё не бизнес, пока всё держится на одном человеке. https://tproger.ru/articles/pochemu-vaw-pet-proekt-eshhyo-ne-biznes-a-vy-ne-predprinimatel @prog_stuff
356
8
Почему DuckDB обгоняет Spark на одной машине Разбор от endjin объясняет, как встраиваемая база DuckDB превращает ноутбук в ин
Почему DuckDB обгоняет Spark на одной машине Разбор от endjin объясняет, как встраиваемая база DuckDB превращает ноутбук в инструмент для аналитики на миллиардах строк: скорость здесь — не в масштабе, а в бережном использовании железа. Колоночное хранилище читает только нужные столбцы, векторизованное выполнение обрабатывает данные пачками по 1024–2048 значений, умещаясь в кэш процессора, а min-max-индексы пропускают целые группы строк по фильтрам. Всё параллелится на все ядра. В тесте TPC-H DuckDB на одной машине справилась за 1 минуту 16 секунд, Spark на 32 узлах — около 8 минут. Распределённые накладные расходы дороже выигрыша от кластера. Это не замена PostgreSQL или Kafka: один писатель, одна нода, petabyte уйдут в распределённые системы. Статья полезна тем, кто строит ETL и хочет понять, где сидит производительность. Сохраните, если выбираете инструменты для аналитики.
7 185
9
Почему картинка NES дрожит, хотя кадр статичный Если подключить NES по композитному видео, изображение заметно «плывёт» даже на неподвижной сцене. Автор блога Nicole Express разобрала по таймингам, откуда берётся эта дрожь и почему она была спроектирована намеренно. 🔘 в стандарте NTSC частота цветовой поднесущей делится на частоту строк с остатком ровно 0,5 — RCA подобрала это полуцелое число специально, чтобы телевизору было проще отделять цвет от яркости; 🔘 кварц NES на 21,47727 МГц — это ровно шесть частот поднесущей, а видеочип PPU использует оба фронта сигнала, отсюда 12 фазовых оттенков в палитре приставки; 🔘 но строка у NES длиннее стандартной: 341 точка. На строку приходится не 227,5, а 227,33 цикла цвета, поэтому фазовый узор повторяется каждые три строки, а не две — картинка и рябит иначе, чем у Apple II или PC Engine; 🔘 инженеры Ricoh намеренно «портят» одну строку кадра: она чередуется между 341 и 340 точками, из-за чего из трёх возможных фазовых выравниваний экран видит только два, сменяющихся через кадр. Автор называет это самой ленивой версией интерлейсинга; 🔘 в PAL-версии приставки этого трюка нет вовсе — там другой кварц и другие делители; 🔘 по шуму на скриншотах Battletoads виден трёхкадровый повторяющийся узор: игра каждый кадр отключает рендеринг на несколько строк ради записи в видеопамять, и «пропавшая точка» проявляется прямо в помехах. Полная статья: https://nicole.express/2026/phase-altering-by-line.html Сохранять тем, кто любит, когда странности старого железа объясняются до последнего такта. @prog_stuff
381
10
Rust, Go или Zig: как не ошибиться с языком для нагруженного бэкенда Обстоятельный разбор того, как выбирать язык для высокон
Rust, Go или Zig: как не ошибиться с языком для нагруженного бэкенда Обстоятельный разбор того, как выбирать язык для высоконагруженного бэкенда в 2026 году. Не сравнение синтаксиса, а реальные сервисы: API, шлюзы, обработка событий, парсинг под нагрузкой. Автор разбирает три языка: Go (стандарт для микросервисов), Rust (для предельной задержки и контроля памяти, но с borrow checker и долгими сборками), Zig (для узких критичных участков и интеграции с C-кодом). У каждого своя цена, скорость разработки и сценарии, где он выигрывает. Главный вывод — не искать победителя, а смешивать: Go для скорости разработки, Rust или Zig для горячих путей. Мигрировать стоит только после профилирования, иначе оптимизация обойдётся дороже выгоды. Сохранить тем, кто выбирает стек для нового сервиса или думает, почему в их системе растёт задержка.
420
11
Баг, который семь лет видели только левши Читатель пожаловался Теренсу Идену: скроллишь его блог с телефона, и вдруг посреди прокрутки открывается форма ответа на комментарий. Иден скроллит собственный сайт постоянно и ничего такого не встречал. Разгадка в пальцах: он листает правым большим пальцем, а читатель — левым. Ссылка «ответить» стоит у левого края страницы, ровно там, где ложится левый палец при прокрутке. Причина оказалась археологической. В 2017 году в WordPress добавили обработчик touchstart на клики по ссылкам — когда-то так обходили задержку в 300 мс, которую мобильные браузеры выдерживали между тапом и кликом, чтобы отличить его от двойного тапа для зума. Браузеры избавились от этой задержки ещё к 2015-му, то есть код был бесполезен уже в момент добавления. А побочный эффект остался: касание ссылки при скролле срабатывало как клик. Баг зарепортили семь лет назад. В итоге Иден сам закоммитил фикс — удалил пару строк, переживших свою причину на десятилетие. А в WHATWG он в шутку предложил тег meta handed="right", чтобы левши на праведные сайты вообще не заходили. Полная статья: https://shkspr.mobi/blog/2026/07/a-bug-which-only-affected-left-handed-users/ Сохранять тем, кто подозревает, что в их проекте тоже живут обходные пути, чью причину уже никто не помнит. @prog_stuff
413
12
Каждый, кто работал с легаси, знает это чувство: код вроде бы живой, но каждая фича даётся всё тяжелее, а на вопрос «почему так долго?» хочется ответить «потому что там всё сложно». Вот только бизнесу это ничего не объясняет — «плохой код» звучит как внутренняя боль разработчиков, а не как аргумент. Аргументировать необходимость рефакторинга на самом деле можно. Оказывается, надо просто перевести техдолг в деньги: сколько теряется каждый месяц из-за замедлившейся разработки и багов и за какой срок рефакторинг окупится. В новом материале разбираемся, как посчитать ROI рефакторинга и с какими аргументами идти к менеджменту.
411
13
Почему банки теряют клиентов на вводе паспорта В расчётно-кассовом обслуживании паспорт требуется почти для каждой операции:
Почему банки теряют клиентов на вводе паспорта В расчётно-кассовом обслуживании паспорт требуется почти для каждой операции: открытие счёта, обмен валюты, подтверждение личности. Пара минут на ручной перенос данных в масштабе банка превращается в очереди, ошибки операторов к вечеру и рост операционных расходов. Авторы разбирают, как ИИ убирает это узкое место: документ распознаётся, поля заполняются автоматически, без ручного перепечатывания. Итог: быстрее обслуживание, меньше ошибок и предсказуемая нагрузка на отделение. Автоматизация РКО влияет не только на внутреннюю эффективность, но и на лояльность клиентов. Если вы работаете с финтехом, интерфейсами крупных систем или высоконагруженными сервисами, где маленькая операция влияет на метрики, стоит сохранить.
463
14
Майк Боулер, консультант по инженерным командам, измерил уровень CO2 в переговорках портативным датчиком: на улице около 400 ppm, а в закрытой комнате с несколькими людьми показатель за первый час переваливает за 1000. Его личный рекорд на фото в статье — 2143. Дальше цифры из исследований. В эксперименте Лаборатории Беркли при 1000 ppm результаты испытуемых упали на шести из девяти показателей качества принятия решений, при 2500 ppm — на семи, причём часть до уровня, который исследователи назвали дисфункциональным. Гарвардское исследование показало, что сильнее всего страдают стратегия, планирование и работа с информацией под давлением — ровно то, ради чего людей и собирают в переговорку. Изнутри это не ощущается: туман в голове списывают на длину встречи или недосып, и воздух остаётся единственной переменной, которую никто не проверяет. То же относится к домашнему кабинету с закрытой дверью: прежде чем объяснять послеобеденный спад мотивацией, автор предлагает исключить комнату, которая не проветривалась с утра. Датчик CO2 стоит дешевле часа рабочего времени, открыть окно — бесплатно. Полная статья: https://blog.mikebowler.ca/2026/07/03/co2-and-decision-making/ Сохранять тем, кто проводит долгие встречи и планирования в переговорках. @prog_stuff
459
15
Марцин Вихари, автор большого интерактивного эссе про кнопки, разобрал свежий пример того, как одна и та же кнопка поворота фото ведёт себя по-разному. Тапаешь «повернуть на 90°» восемь раз подряд: iPhone буферизует нажатия и честно доводит все повороты до конца, а Nothing Phone даёт вибрацию-подтверждение и молча съедает тап, если анимация предыдущего поворота ещё не закончилась. Отсюда правило: никогда не заставлять пользователя ждать конца анимации. Буферизовать нажатия при этом не единственный выход, можно ускорять или обрывать анимацию по следующему тапу. Вторая мысль, ради которой стоит читать целиком, — «ситуативная продвинутость». Любой казуальный интерфейс при достаточно большой аудитории встретит человека, которому придётся пользоваться им всерьёз: например, поворачивать десятки отсканированных документов подряд. И тогда блокирующая анимация из милой детали превращается в стену. Полная статья: https://unsung.aresluna.org/if-youre-a-button-you-have-one-job/ Сохранять тем, кто делает интерфейсы. @prog_stuff
462
16
Почему ваш пет-проект ещё не бизнес, а вы — не предприниматель У каждого второго разработчика в столе лежит проект, который «
Почему ваш пет-проект ещё не бизнес, а вы — не предприниматель У каждого второго разработчика в столе лежит проект, который «вот-вот станет бизнесом». Осталось дописать пару фич — и дальше всё поедет само. Спойлер: не поедет. Разбираемся, где заканчивается код и начинается бизнес: почему всё стартует не с технологии, а с чужой проблемы, чем фаундер отличается от тимлида и почему рабочий сервис с первыми пользователями и MRR — это не бизнес, а промежуточный результат. Простой тест: уйдите в отпуск на две недели, и если без вас всё встало — поздравляем, у вас пока не бизнес, а вы сами и есть главный «производственный ресурс». Внутри ещё и про AR-очки на трамвайном заводе, которые зарубили сами рабочие: история о том, как ценность решения определяете не вы.
460
17
Rust-компилятор, переписанный в 46 миллионов строк C Rustc — самокомпилирующийся компилятор Rust — переведён в 46 миллионов строк C и собирается обычным GCC и make, без единой строчки cargo или rustc в цепочке сборки. Автор — разработчик бэкенда cilly, который компилирует Rust в C. 🔘это уже 14-я попытка автора скомпилировать Rust в C — до этого были публичные и приватные проекты вроде rustc_codegen_clr; 🔘бэкенд генерирует «witness»-программы, которые прощупывают, что поддерживает целевой C-компилятор и платформа, и подстраивает вывод под них; 🔘получившийся код собирает core, alloc и std и способен пересобрать сам себя; 🔘практической пользы для повседневной разработки в этом немного — это демонстрация переносимости, а не замена rustc. Сохранять тем, кто интересуется внутренностями компиляторов и любит истории про перенос целого тулчейна на неожиданный бэкенд. Полная статья: https://github.com/FractalFir/crustc @prog_stuff
489
18
Как эмулировать inline-ассемблер в Haskell, которого там нет Задача простая на словах: перемножить два Word64 и получить обе половины 128-битного результата через одну машинную инструкцию mulq. В GHC нет inline assembly, и разработчик под ником minoki перебрал все возможные обходные пути, от честного FFI до чёрной магии на уровне calling convention. 🔘 unsafe FFI с указателем через alloca работает, но тянет за собой IO и лишнюю память; 🔘 unsafe FFI в два вызова, отдельно для старшей и младшей половины, укладывает всё в регистры без указателей; 🔘 unsafe FFI через XMM-регистры возвращает обе половины сразу, но требует __m128i на стороне C; 🔘 foreign import prim позволяет написать собственный PrimOp прямо на ассемблере, с ручным учётом регистров STG (%rbx, %r14, jmp *(%rbp)) и макросов LEADING_UNDERSCORE и TABLES_NEXT_TO_CODE; 🔘 отдельная ассемблерная обёртка переводит между C calling convention и GHC calling convention, чтобы дёргать C-функцию, которая возвращает unsigned __int128 структурой по значению. На Zen4 в WSL2 встроенный timesWord2# отработал за 4 нс, foreign import prim на чистом ассемблере уложился в 4,5 нс, а unsafe FFI с указателем скатился до 19 нс. Safe FFI для такого короткого вызова вышел медленнее 60 нс, то есть медленнее чистого Haskell на Integer. Сохранять тем, кто когда-нибудь спорил, действительно ли safe FFI в GHC настолько накладен, как все говорят. @prog_stuff
476
19
Zig вынес пакетный менеджер из компилятора в систему сборки Andrew Kelley описал редизайн Zig: вся логика пакетного менеджера переехала из компилятора в отдельный процесс сборки maker. Раньше компилятор сам тянул зависимости, теперь этим занимается build-система, а компилятор остался компилятором. 🔘 из бинарника zig вынесены fetching пакетов, HTTP-клиент, TLS/crypto, Git-протокол, распаковка xz/gzip/zstd/flate/zip и парсер build.zig.zon; 🔘 сам бинарник похудел на 4%: с 14,1 МиБ до 13,5 МиБ на сборке без LLVM в режиме ReleaseSmall; 🔘 пакетный менеджер теперь собирается в ReleaseSafe, то есть все сетевые операции работают с включёнными проверками безопасности; 🔘 crypto и хеширование файлов могут использовать редкие инструкции конкретного CPU, потому что maker компилируется прямо на машине пользователя, а не распространяется готовым бинарником; 🔘 флаг --maker-opt заменили на переменную окружения ZIG_DEBUG_MAKER, а --zig-lib-dir — на ZIG_LIB_DIR. Это промежуточный шаг к протоколу build server, который нужен языковому серверу ZLS. Сохранять тем, кто интересуется архитектурой компиляторов и тем, как языки постепенно выносят периферийную логику из ядра. @prog_stuff
511
20
Что на самом деле такое database cluster в PostgreSQL В PostgreSQL кластером баз данных называют набор баз, которыми управляет один инстанс сервера. Burak Sen прошёлся по внутренностям этого механизма и записал по шагам, из чего он реально состоит на диске. Каждая база сама является объектом со своим OID. У встроенных баз он захардкожен: 1 у template1, 4 у template0, 5 у postgres. Пользовательские объекты стартуют с 16384. Все объекты и связи между ними хранятся в системных каталогах вроде pg_class и pg_database, устроенных как обычные таблицы. 🔘 tablespace физически реализован через symlink, поэтому файлы базы можно раскидать по разным дискам, не трогая логику выше; 🔘 heap-страница весит ровно 8192 байта, и модуль pageinspect позволяет заглянуть внутрь неё вручную; 🔘 значения длиннее 2 КиБ Postgres выносит во внешнее хранилище TOAST вместо того, чтобы впихивать их в страницу целиком; 🔘 VACUUM FULL переписывает файл и меняет relfilenode, а OID самой таблицы при этом остаётся прежним. Сохранять тем, кто работает с Postgres каждый день и ни разу не заглядывал, что происходит на файловой системе под капотом. Полная статья: https://www.buraksen.dev/articles/internals-of-postgresql-db-cluster-and-tables @prog_stuff
515