Так себе программист
98 subscribers
185 photos
7 videos
1 file
183 links
Меня зовут Александр Троценко. Разработчик, преподаватель, к.т.н. Пишу о программировании и профессии.

10 лет в разработке desktop на C/С++

Контент: https://taplink.cc/atrotsenko
Download Telegram
dark_theme_fun.gif
11.1 MB
Когда захотелось ну очень тёмную тему 🌘

Отсюда
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰5
Список 1
{1, 2, 3, 4, 5, 6, 7, 8}


Список 2
{3, 5, 4, 1, 2}
Выше даны два списка. Сортировка какого списка займет меньше времени?
Anonymous Quiz
24%
Неизвестно
27%
Списка 1
22%
Списка 2
27%
Время сортировки примерно одинаково
Недооценённые навыки

Если вы не можете ходить и вам приносят молоко вместо апельсинового сока, который вы хотели, то вы скажете: "все нормально", и выпьете его.


1. Это первый навык, который мы обычно недооцениваем: принятие некоторых неудобств и пустяков, если этого требует действительность.
Без этого навыка мы каждый день будем превозмогать, нервничать и опускать руки из-за всякой ерунды.

2. Уважительное отношение к человеку, с которым вы не согласны.
Трюк состоит в том, чтобы найти в таком человеке точку соприкосновения и в конце концов сказать себе: "ок, не такой уж он и сумасшедший". Иначе можно слишком легко его "списать".

3. Способность вести 10-минутную беседу с любым человеком.
В наше время онлайна беседовать с глазу на глаз с незнакомым человеком - тот ещё челендж. Хотя раньше это и не назвали бы каким-то особенным скилом.

4. Кратко и ёмко донести суть.
Все очень заняты. Меньше слов, больше дела.

5. Вежливо сказать "нет".
Люди, которые колеблются сказать "нет", либо медлят, либо говорят "да", откладывая неминуемое "нет". В итоге "нет" становится более разрушительным. Другая крайность - это очень резкое "нет", после которого к нам вообще перестанут обращаться. Нужен баланс.

5-й пункт сильно про меня. Я уже не один раз попадал в "ситуацию" из-за того, что медлил с ответом "нет". Сначала обнадёживаешь почём зря, а потом выглядишь еще большим придурком, чем мог бы 😶

Еще больше навыков и интересных примеров здесь
📍
Morgan Housel - Useful and Overlooked Skills
👍4
Мощь!
Железный подход 💪

Жмите 🔥, если интересна тема реверс-инжиниринга
🔥10😁1
Troubleshooting. Метод деления пополам

Продолжаю серию постов по траблшутингу. Сегодня поговорим про локализацию проблемы методом деления пополам.

Метод деления пополам используется, например, в электротехнике ⚡️ для поиска обрыва в цепи. Для этого участок цепи визуально разбивается пополам и каждая половина проверяется на предмет наличия тока. Та половина, в которой тока нет, считается содержащей обрыв. Она в свою очередь снова разбивается пополам и половинки снова проверяются. Так продолжается до тех пор, пока мы не придём к проблемному месту.
А мы придём к нему в общем случае быстрее, чем если бы последовательно проверяли цепь по маленьким "кусочкам".

Вот такой итерационный метод можно использовать и при отладке программ.

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

1️⃣ Для начала выбираем большой участок программы от ее старта до места проявления ошибки. Мы уверены, что в начале выполнения программы наши данные корректные.

2️⃣ Теперь визуально делим выбранный участок программы пополам и проверяем корректность данных в месте разделения. Если данные корректные, то выбираем следующий по ходу участок программы. Если данные не корректные, то - предыдущий.

3️⃣ Продолжаем пункт 2 до тех пор, пока не "спустимся" к источнику проблемы.

Кстати, таким же методом можно искать ошибки не только по процессу выполнения программы, но и по истории коммитов.

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

#Troubleshooting
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Кот в окошке видеоконфы уже скорее правило, чем исключение 😁

А у вас на созвонах бывают коллеги с котами?
❤3👍1
Zip-бомба и Qt Network

Zip-бомба - это архив, распаковка которого может вызвать нарушения в работе системы🥶
Как правило такой архив выглядит очень маленьким, но распаковывается в нечто огромное, заполняющее все свободное пространство в памяти или на носителе. Создается архив либо многократным архивированием данных, либо однократным, но с применением сильного сжатия.

Давайте проверим, что случится, если такой архив получит QNetworkAccessManager из модуля Qt Network. Есть ли там какая-то защита?

QNetworkAccessManager умеет работать с HTTP-запросами и ответами. И если в HTTP-заголовке ответного сообщения будет установлено поле Content-Encoding: gzip, то QNetworkAccessManager должен автоматически разархивировать полученные данные.

Так в действительности и происходит. Но в случае с zip-бомбой есть и хорошие новости. Многократно запакованный архив QNetworkAccessManager распаковывает только один раз, рекурсивной процедуры там нет. По крайней мере в Qt5. Значит такого типа zip-бомб можно не опасаться.

А вот архив с сильным сжатием ожидаемо будет распакован.

В эксперименте архив размером 1,2Мб, содержащий 1,2Гб данных, был распакован QNetworkAccessManager-ом за несколько минут с потреблением в пике до 2,4Гб оперативки. Как минимум, это может привести к фризам приложения в процессе распаковки, а при определенных условиях и к падению.

Такие пироги. Если Qt Network работает по незащищенному протоколу, то такой тип атаки можно ожидать. С защищенным протоколом (HTTPS) вероятность гораздо ниже.

Если интересно как еще проверить свою систему на прочность, читайте пост про выполнение DOS-атаки.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
foreach ( name in NameList )
{
print "Hello, {name}!";
}
За какое время выполнится код выше? Дайте ответ в О-нотации
Anonymous Quiz
12%
O( 1 )
69%
O( n )
8%
O( lg n )
12%
O( n * n )
Антипаттерны SQL: обязательный столбец ID

У меня отношения с базами данных (БД) примерно такие же как с английским: вроде бы нормально дружим, пока не попадется что-то серьёзнее Шерлока Холмса в оригинале. В теории все понятно, но нет-нет да и выкину что-нибудь эдакое.

И в этот раз при работе со схемой БД я заметил, что по умолчанию добавляю поле "ID" в каждую таблицу 🤔
Просто потому что, без оснований. По традиции что ли...

Так себе, да?
Да. И у этого есть название.

Я пал жертвой антипаттерна "ID required", вляпавшись в два его признака:

1️⃣ Несколько таблиц в моей БД безосновательно получили поле "ID" в качестве первичного ключа, хотя у каждой из этих таблиц уже было поле, которое могло бы им стать. Тем самым появилась избыточность данных.

2️⃣ Имя "ID" очень абстрактное, ни о чем не говорящее само по себе. Гораздо лучше было использовать не "ID", а какой-нибудь условный "ENTITY_ID".

Таким образом, после удаления поля "ID" и назначения первичным ключом другого подходящего поля, замысел созданной мной сущности и ее связей никак не изменился. Что хотел, то и получил.

Из самого описания антипаттерна "ID required" мне понравилась эта фраза:

If your table contains an attribute that’s guaranteed to be unique, is non-null, and can serve to identify the row, don’t feel obligated to add a pseudokey solely for the sake of tradition.


То есть антипаттерн не говорит, что поле "ID" - это плохо, а только лишь указывает, что оно не обязательно.

📍 Karwin B - SQL antipatterns. Avoiding the pitfalls of database (2010)
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2❤1🔥1
Как расшифровывается аббревиатура принципа проектирования KISS?
Anonymous Quiz
7%
Keep intensive system solution
30%
Key interaction system solution
13%
Kind intelligence support system
50%
Keep it simple, stupid!
Как расшифровывается аббревиатура принципа проектирования DRY?
Anonymous Quiz
75%
Don't repeat yourself
4%
Don't read yourself
14%
Don't reply yes
7%
Don't rest yearly
Как расшифровывается аббревиатура принципа проектирования YAGNI?
Anonymous Quiz
14%
You able grant null indicator
21%
You able get null indicator
21%
Your architecture gives nothing interesting
43%
You ain’t gonna need it
В этот раз у нас серия из трех тестов! Аббревиатуры!

Я даже устал придумывать неправильные варианты) Вот здесь бы наверно нейросетка помогла. Или нет?

🔥 - если на все ответили правильно
🤓 - если попали в 1 - 2
🤷‍♂️ - если все мимо
🔥7🤓6🤷‍♂4
❌
Please open Telegram to view this post
VIEW IN TELEGRAM
😁5😱3❤1
Troubleshooting. Логирование

Если коротко: никогда не пренебрегайте логированием. Чем адекватнее логи, тем проще заниматься траблшутингом.

Что значит "адекватные логи"? Вообще термин "адекватность" относится к моделированию и означает совпадение свойств модели и моделируемого объекта. Так вот если принять процесс работы программы за моделируемый объект, а его логи за модель, то все становится понятно.

Как распознать неадекватные логи? Здесь надо исходить из основной функциональности или бизнес-логики программы. Если выполнение основной функциональности не попало в логи, то считаем адекватность логов слабой. Например, в случае с текстовым редактором основной функциональностью может быть открытие документа, и отсутствие записи об этом в логах осложнит восстановление общей картины процесса.

Отдельное внимание стоит уделить логированию ошибок. Здесь часто присутствует скудное описание, недосказанность. И если некоторые технологии обеспечивают нас трассировкой стека, что очень выручает, то в том же C++ о выводе подробностей ошибки надо заботиться самостоятельно. Ну встречали же такое: "File open error". И думай, что за файл, какой такой "error"? Никуда не годится. Хотя вся нужная информация есть, просто нам её не показали.

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

Логи - это "черный ящик", который мы получаем от пользователя в случае "аварии". От их качества нередко зависит успех операции)

Какие еще знаете и используете практики логирования?
Делитесь 👇

#Troubleshooting
🔥3
Изменим тестам и попробуем в угадайку 🫣

Как думаете, чьи логи на картинке?

Ответ под спойлером:
Это кусочек лога веб-сервера Apache. Жмите 🤓, если Apache не угадали, но поняли, что это веб-сервер.

🔥 - угадали
🤓 - угадали только назначение программы
🤷‍♂️ - не угадали
🤓9🤷‍♂4🔥2
Как исследовать exe-файлы с Cutter. Практика обратной разработки

Раз был проявлен интерес к обратной разработке, публикую небольшую статью ⬇️, которая рассказывает на практическом примере как исследуются и патчатся exe-файлы. Подходит для новичков.

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

https://mediocre-developer.ru/kak-issledovat-exe-fajly-s-cutter-praktika-obratnoj-razrabotki
🔥3