?

Log in

No account? Create an account
Предупреждение
404
amarao_san

99+. Данное произведение предназначено для читателей старше 99 лет. Если вам нет 99 лет, вы не имеете права читать это произведение согласно Федеральному закону № 139-ФЗ от 28 июля 2012 года "О защите детей от информации, причиняющей вред их здоровью и развитию"


Данный журнал является литературным произведением и освещает вымышленные события в вымышленной стране. Все совпадения имён, фамилий, дат, цифр и прочей информации с реально существующими объектами и людьми являются случайными.

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

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

Предупреждение о возможном оскорблении чувств верующих, чувств сторонников прав животных, чувств животных и прочих. Вас предупредили.

Данное сообщение размещено 15 октября 2008 года. Сообщению присвоена дата 31 декабря 2037 года для технических нужд. Предупреждение действует как для записей, датированных сроком после 15 октября 2008 так и для размещённых ранее. Сообщение обновляется по мере того, как гсударственная дура придумывает новые правила.

Посещаемость данного ресурса составляет 0.042 человека в сутки*

*Согласно методологии измерения института Автономного Ядерного Технологического им. Ролля среди читателей, которые имеют право читать этот ресурс согласно возрастных ограничений

Guestbook
404
amarao_san
Комментарии и вопросы оставлять тут.

git terror
404
amarao_san
Обнаружить, что самый важный каталог исчез, и не помнишь, в каком бранче он был.

Самое злое в рефакторинге
404
amarao_san
Это когда новое, более общее решение, уменьшающее сложность, хуже, чем оригинал. Не силу криворучия, а в силу отсутствия локальных оптимизаций (а вот тут мы таймстемп соберём поближе к эвенту, прям внутри - у нас так точность выше будет).

Если бы оно с самого начала было с такой точностью, было бы ок ("для дополнительной точности нам надо будет порушить всю архитектуру - давайте без этого"). А вот шаг назад - это прям боль ("новое решение хуже старого"). По сути это одно и то же (общее решение - точность X, частное решение - точность Y), но их интерпретация совершенно различается.

И это ошибка в рефакторинге, ингорировать общее решение из-за "ухудшений".

Цель программирования (и рефкторинга) - в уменьшении сложности. Если получившееся пролазит в спецификации, этого достаточно. Не "такое же как было", а "пролазит в допуски". Это важно.

Хочу статическую типизацию в питоне
404
amarao_san
Знаю, что нельзя, но хочу. Начать учить type hints? Кто бы за меня там проверял, где на входе секунды, а где наносекунды...

плоды архитектуры в comfort zone
404
amarao_san
Внезапно обнаружилось, что у меня баг в ТЗ к скрипту - при аплоаде у нас event log общий, а у каждого сервера свой комплект данных. Надо обрабатывать event лог как общий, но данные по серверам обрабатывать раздельно...

Казалось, бы, ужас.

Но...

git diff -- files/upload_to_influx.py|egrep '(^[-\+].+)'|wc -l
12

(Это я продолжаю сам себя хвалить).
-def get_log_name(scenario, event_log_name, type):
+def get_log_name(server, scenario, event_log_name, type):
     dir = os.path.split(event_log_name)[0]
-    return os.path.join(dir, '%s_%s.log' % (scenario, type))
+    return os.path.join(dir, '%s/%s_%s.log' % (server, scenario, type))
 
 
 def process_logs(event_log, event_log_name):
@@ -117,21 +117,21 @@ def process_logs(event_log, event_log_name):
     for observer in get_observers(event_log):
         time_offset = get_observer_time_offset(observer, event_log)
         yield process_log(
-            get_log_name(scenario, event_log_name, 'lat'),
+            get_log_name(observer, scenario, event_log_name, 'lat'),
             'latency',
             observer,
             scenario,
             time_offset
         )
         yield process_log(
-            get_log_name(scenario, event_log_name, 'iops'),
+            get_log_name(observer, scenario, event_log_name, 'iops'),
             'iops',
             observer,
             scenario,
             time_offset
         )
         yield process_log(
-            get_log_name(scenario, event_log_name, 'bw'),
+            get_log_name(observer, scenario, event_log_name, 'bw'),

(без учёта изменения тестов, разумеется)

Сейчас есть ещё один толстый багофич ползёт, оказывается, в fio можно абсолютные timestamps записывать, плюс надо выравнивать данные по заданному start_time. Надеюсь, пара десяток строчек.

пока ещё не buzz-word: polyglot deployment
404
amarao_san
Система CI/CD, одинакового хорошо работающая для нескольких языков, уважающая особенности экосистемы каждого из них. Очевидно, что maven и pip, с примесью старого доброго make, плюс чуть-чуть go вместе дают взрывную комбинацию, у каждой из которых своё видение на то, что происходит. Polyglot deployment пытается обесечивать равные возможности и берёт лучшее от каждой из экосистем.

Готовых инструментов ещё нет, есть только идея.

Конт-примером для PD будет "у нас всё на maven, а для фронт-энда мы тут делаем exec для npm".
Tags:

Из suid бинаря
404
amarao_san
snprintf (new_gecos, sizeof new_gecos, "%s,%s,%s,%s%s%s",
              fullnm, roomno, workph, homeph,
              ('\0' != slop[0]) ? "," : "", slop);


И почему мне страшно?

вызовы в зоне комфорта
404
amarao_san
Вне зоны комфорта есть два простых challenge: суметь освоиться и чтобы получилось. Если оно получилось - выход из зоны комфорта успешен. Если нет, то хотя бы остаётся опыт.

Но при работе в зоне комфорта challenge другой: всё сделать правильно. То есть "получилось" не интересно, заведомо известно, что получится. А вот challenge, чтобы оно было безупречно. То самое, "всё сделал правильно", когда можно защитить каждый элемент, объяснить зачем оно так и почему так лучше, чем не так. Все известные антипаттерны исключены, читаемо, понятно, понятно до уровня "можно скользить глазами". Закончил писать - оно работает, и без багов (я про баги начального периода, когда оно даже success path пройти не может). code coverage за 90 (предпочтительнее 100), тесты покрывают все три случая (good, sad, bad), ошибки обрабатываются унифицированным образом. Нет незаконченных конструкций (тут мы будем наследоваться - и три уровня наследования а на выходе один реальный объект), нет гиперабстракций (настолько обще, насколько можно, но не так, чтобы потерять суть решаемой задачи), нет оверфиттинга (работает ТОЛЬКО в заданном сценарии и никакие другие сценарии неприемлимы). Удобно в работе, удобно в тестировании, удобно в использовании. Готово к разумному расширению и изменению функционала, но не собирается решать все задачи всего мира. Тесты разумно используют моки, но не так, чтобы "мока в моке видит мок".

То самое заветное "чтобы потом не было стыдно". Код, которым не нужно гордиться (там нет know how для неизвестной задачи), но который с лёгкостью можно показывать как образец того, как надо решать задачи такого класса.

... А там есть ещё и challenge второго порядка: сделать всё это с минимальным количеством рефакторинга, в TDD-стиле, и т.д.

(это по мотивам утилиты, которая грузит результаты бенчмарка и лог эвентов во время бенчмарка в инфлюкс).

О разнице в именовании переменных
404
amarao_san
Во, ещё, в догонку. Существует большая разница в именовании переменных в математике и программировании. Почему математики счастливы с a,b,c,x,y,z,i,j с примесью букво-типизации (греческие - угол, abc - грани, xyz - координаты, ijk - индексы), а программисты от такого должны кривиться?

Потому что у математиков переменные выступают в роли данных. Ни один программист не даёт имена собственные для данных (мы будем называть первый байт файла "first_of_the_kind", второй байт - "second" и т.д.). Если называет - то это уже константы (которые именованные и у математиков, и у программистов). Он эти данные обрабатывает, используя именованные конструкции - типы, структуры, переменные, имена функций, etc.

Математик делает то же самое. Его функция - f, но он-то говорит не про 'f', а про, например, "формы", "линейные комбинации", "полином", "квазиполином" и т.д. То есть имена собственные во все поля. Иногда именование становится жутким "кососимметрическое тензорное поле на многообразии", но стремится к точной передаче сути явления. Математики дают имена собственные для сущностей, которые находятся в их фокусе внимания. А весь болейрплейт идёт в самой компактной возможной нотации c = aij. У программистов он тоже идёт, какой-нибудь for k, v in d.items(): yield "%s:%s" % (k, v) отличный пример такой нотации. Оно настолько вне фокуса внимания, что можно однобуквенные переменные.

Но большинство программистов решает не математические задачи. Я бы даже сказал не задачи, а 'make things which do things'. И там фокус внимания очень часто оказывается на том, что и с чем делается, а не решается. И в этом случае самые большие усилия по именованию приходятся именно на переменные и функции (классы), а так же их типы, потому что это как раз и есть описание "как, что и с чем делается". А математическая часть проблематики (алгебраические поля, алгоритмические вопросы структур данных и т.д.) - она как раз вне фокуса. Нужна, но не важна.