← All posts tagged programming

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

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

TL;DR: обратной совместимости нет, куча багов, велосипеды и массовые обсёры, о которых замалчивают. И так по кругу.

thehftguy.wordpress.com

А сегодня утренний позитив начинается с лучей поноса сраным уебкам из мейлру, которые вкрутили во все версии API (включая старые) новый обязательный параметр при постинге видео в соц. сети.

Азбука по этому поводу:
Г — мейлру
СХБ — обратная совместимость

Гвида насрал прямо в мои штаны:

In [1]: import datetime
In [2]: dt_str = datetime.datetime.utcnow().strftime('%d.%m.%Y %h:%M:%s') # Случайно обосрался с форматом даты (должно быть %h -> %H, %s -> %S)
In [6]: datetime.datetime.strptime(dt_str, '%d.%m.%Y %h:%M:%s') # Однако, тот же формат и здесь
ValueError: 'h' is a bad directive in format '%d.%m.%Y %h:%M:%s'

И действительно, согласно доке, директив %h и %s не существует:
docs.python.org

Однако, какого-то хуя гвида за меня додумал и интерпретировал %h как %b, а %s как просто int(time.time()).

Таки ещё раз взглянув на пустые заявки в тестеры Boardless и предложения о разных конструкторах настолок в Steam, ко мне пришло озарение, что гоняться с денежными дядями на одном энтузиазме не получится и не очень хочется. Так что поскребав по сусекам и выпилив всякие секретные ключи из репозитория, я запилил на битбакете и гитхабе по репе с открытым кодом (даже лицензию лень приписывать, да и кому оно надо). Вот так спустя хрен знает лет у меня появились открытые репозитории, в которые можно ткнуть при желании на собеседованиях.

Ссылочки на репы, если кому оно надо (гитхаб на момент написания ещё льётся):
bitbucket.org
github.com

Сегодня впервые попробовал подобрать ноты на слух. Впервые, потому что в детстве я был не очень пытливым и совсем неусидчивым музыкантом. Так вот, убил примерно полчаса на попытку воспроизвести и насколько возможно грамотно записать 3-4 такта.
В итоге, достаточно быстро утомился, но думаю, что попытки не оставлю: процесс медитативный и очень медленный, но душевный. Я даже внезапно осознал нехватку знаний муз. грамоты, т.к. сольфеджио успешно прогуливал / симулировал знания.
Но параллельно, думаю, буду искать хороший софтверный синтезатор для упрощения работы, а заодно исследую распознаватели звуков (inb4 опенсорца нет, есть лишь платные примитивные программы, воспринимающие только midi). Может, даже, совмещу полезное с полезным и приятным, и напишу что-нибудь из вспомогательных тулзовин.
В общем, прямо открывается новое поприще для исследований и работы. I'm decently excited!

Начал готовить скриншоты с токенами, наткнулся на старый баг, который долго не воспроизводился и залип в код на два часа.
Зато двоих зайцев одним выстрелом: и бажине конец (даже двум), и скриншоты ждут как всегда на vk.com

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

Long story short, я сделяль (и почти начал раздавать инвайты) бетку околоигрового сервиса про настольные ролёвки. Называется Boardless.

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

Немного больше подробностей о последнем. Мастер раскидывает предметы и npc по полю, рисует хуи^W инвайронмент, раздаёт очки опыта, кидает кубики, рассказывает (в скайп — внутренней коммуникации пока не предвидится) истории. Юзеры тащат предметы со стола, раскидывают очки по скилам, меряют шмотки как последние модницы.

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

vk.com

Идя в ногу со временем, осилил тур по второтегу, но несколько вещей из последнего раздела остались непонятными.

Например:
tour.golang.org
Запустили корутину с fibonacci, и начали итерироваться по каналу. При этом main-то должен отработать раньше. Или любой receive из канала неявно передаёт управлению сендеру? А как мы указываем кто сендер? Нипанятна. Было предположение, что всё дело в том, что канал-то создаётся buffered, поэтому main лочится при ресиве на пустом канале (отсюда — ждём, пока выполнится fibonacci), но в следующем же примере про селекты (https://tour.golang.org/concurrency/5) каналы не buffered, а история похожая, на мой взгляд.

В общем, призываю Go-умельцев (давайте, палитесь, я видел вас в гисте :3), подсказывайте.

Недоумение: with-statement не умеет работать с замыканиями?

Если есть некий obj с obj.foo = function(){ ... }, то вот так он работает
with ({'a': obj}) {a. foo() }
а вот так — уже нет:
f = function() { a.foo() }
with ({'a': obj}) { f() }

(примеры естественно упрощённые)

inb4 with нинужын зачем тебе это надо азаза смотрите перец with использует

Предыстория: стремительный ручеек запросов к серверу превратился в море, и Load average стремительно полетел вверх.
Захожу в htop, вижу, что у нас на этой машине всего 2 ядра. Дай-ка, думаю, подниму какой-нибудь БОЛЬШОЙ инстанс в амазоне (ведь именно там мы хостимся по историческим причинам).
Захожу в консоль амазона и вижу, что, оказывается это уже LARGE-инстанс, при чём CPU-related.

2 vCPU на large cpu-related инстансе... я кончел.

Каждое third-party API радует меня по-своему. В этот раз напомнили о своей ущербности ОК: чтобы получить все группы пользователя, в которых он является модератором/администратором, надо:
1. Запросить ВСЕ группы чанками по 100 штук (у некоторых юзверей их овер 1.5к)
2. На каждую группу в отдельности сделать запрос is_admin.
Итого, только что чтобы вытащить 25 интересующих групп у конкретного юзера, серверу только что понадобилось сделать 1408 запросов.

Эм, а кто-нибудь скажет, с чего бы на запрос
select string_agg(id, ' ') ... ;
Постгря говорит
Kernel error: ERROR: function string_agg(bigint, unknown) does not exist
unknown

А потом оказывается, что ругалась она на самом деле на поле id, которое надо было сделать id::TEXT?

Кто-нибудь встречал описания методик расчёта экономического профита программиста для компании?
Допустим, два кодера сделали большую фичу, которая за год принесла 1 000 000 рублей. И тут бы сказать, что каждый из них по 500 000 отработал, но, во-первых, они приложили не равные усилия (например, это был бэкендер и фронтендер), во-вторых, работал QA отдел, в-третьих, были продажники, без которых вообще никто бы про фичу не узнал.
Понятно, что так я приближаюсь к извечной битве технического персонала vs "манагерки", но всё равно интересно же докопаться до сути.