?

Log in

No account? Create an account

Заповедник репрессивной психиатрии

Entries by category: it

Уведомления для CI задом наперед
metaclass
Столкнулся тут с очередным порождением сумеречного хипстерского гения - CI сервер drone.io.
Сам сервер живет внутри докер-образа, собирает и тестирует софт тоже внутри докера - т.е. к одной хипсторятине добавляется еще и вторая - докер.
Далее, если я правильно понял из просмотра документации краем глаза - чтобы узнавать про изменения в репозиториях, этой софтине нужно зарегистрировать "приложение" в гитхабе, которому надо дать доступ к репозиториям и оно на них настроит хуки, которые будут дергать оный сервер за торчащий в интернет http-endpoint. Т.е. запустить его внутри локалки - это надо заниматься пробросом портов, а еще надо бы выяснить какими средствами аутентификации оно прикрыто (вроде OAuth, но с ходу во всей это конструкции из гитхаба, докеров, приложения и хипстософта непонятно, кто есть кто).

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

Типы данных для телеметрии
metaclass
В процессе пиления датчика co2 столкнулся с такой фигней: если датчик сам не передает тип данных - то каждая доработка софта на контроллере датчика вынуждает дорабатывать и парсер его сообщений, чего делать совершенно нет желания.

Поначалу данные в udp-пакетах с датчика выглядели так: 2016-10-29T21:26:40.990599,ff8601e440402eb92e
Потом вот так, чтобы сразу видеть концентрацию: 2016-10-29T23:48:35.310594,ff86027840042e305e,632

А потом я решил это дело засунуть сразу в эластик с кибаной, чтобы рисовать графики, причем у нас туда данные (мониторинг нашего софта) идут в виде json-объектов в сообщениях через mq-сервер. Наиболее прямой путь такое делать - это поля от датчика разложить в виде полей json-объекта, тогда эластик автодетектит типы полей и все становится сразу доступным для запросов и графиков.
Но прога, которая транслирует udp-пакеты в mq сообщения - вообще говоря, тестовый/отладочный клиент от моей mq-либы и впихивать в нее прибитые гвоздями имена полей от одного конкретного датчика - лютый грех, такой код должен быть универсальным, очевидно.
Поэтому формат пакета превратился в: "utc=2016-10-30T12:04:08.740605,hex=ff8602db40402e30bf,co2=731", а программа просто конвертирует это в json и добивает служебными полями от себя (уникальный идентификатор ноды, тип сообщения, и прочее такое). В таком варианте я смогу, например, добавить еще пакетов от других датчиков - давления, освещенности, влажности, радиации и температуры, не переделывая транслятор.

Фактически, это структурный тип данных - смысл данных определяется тем, какие в нем есть поля. Это очень удобно для обобщенной обработки.

При этом, когда я работаю с чужими железками, там почти всегда типы данных прибиты гвоздями - начиная от просто упакованных бинарных структур, заканчивая csv с позиционным назначением полей или бинарным массивом из кучи бинарных пакетов с CRC и прочим.
Понятно, что так сильно экономится GPRS-трафик для телеметрии и байтики в прошивке, но почему бы этим устройствам сразу после подключения по TCP не передавать метаданные протокола, которые можно было бы грузить в парсер и он автоматом бы становился совместимым с тем, что устройство будет передавать после этого.
Т.е. хотя бы передавать csv заголовок для csv-форматов, или массив "тип, имя, длина" для бинарных структур или еще что-нибудь в том же духе.

Сказочный мир поней
metaclass
http://ru-sysadmins.livejournal.com/2560263.html?thread=47788807&style=mine#t47788807
"На месяц труда более-менее квалифицированного специалиста, понимающего, что происходит на уровне СУБД, можно взять гигов 128 оперативки. Если не больше - я несколько не в курсе текущих цен."

Покажите мне, где такое бывает, а? Пока все что я вижу - это 1-2 месяца на согласование с заказчиками "нужно докинуть памяти/дисков/процессоров", а потом еще 1-2 месяца на то, чтобы это дошло до одминов, а потом еще и истерики с их стороны "почему у вас память на 100% не используется и почему у вас бэкапы на СТРАШНО ДОРОГОМ И БЫСТРОМ диске, а не на внешнем говносторадже". И это у тех заказчиков, где есть деньги на "докинуть еще памяти", а то у большинства белорусских госконтор истерика начинается уже на этапе "надо купить нормальный сервер".

PS: Расходимся, нас наебали: "Серьезно - вы знаете, проблемы SMB мне не интересны. Пусть идут в SAAS".

"Асинхронный" http api
metaclass
Вчера был на тусовке junolab, где их главные гуру рассказывали, как у них бекенд устроен.
В частности, на входе у них стоят гейтвеи с обычным http протоколом и минимальным набором фич - валидация, проверка авторизации по токенам и прочее такое, которые перекидывают запрос в MQ (nats.io).

При этом, насколько я понял, асинхронность там реализована поверх обычного http, без всяких http2, веб-сокетов и прочих не везде работающих протоколов - т.е. клиент api сначала делает запрос к гейтвею, ему сразу говорят - 200 ок, а потом он должен, по идее, дальше опрашивать гейтвей, пока для него из MQ придет ответ от микросервисов. Или у них там ответы от сервера бесконечно идут, я сходу не понял (т.е. ответ без content-length и соединение просто ждет пока придет что-нибудь, не помню, как эта техника называется).

В принципе, если keep-alive и соединение не обрывается - то реализация дуплексного протокола поверх синхронного http вроде приемлемая. Единственное, что в случае бесконечного ответа - если сервер и клиент долго ничего друг другу не говорят - промежуточные NAT и прочая сетевая муть могут соединение забыть, причем пока TCP keep-alive не проснется (а это два часа по умолчанию, вроде) - это обнаружено той стороной, которая молчит и ждет, не будет. Но теоретически это какие-то heart-beat слать можно со стороны сервера и запросы со стороны клиента.

Postgresql в убере
metaclass
https://eng.uber.com/mysql-migration/
http://postgresql.nabble.com/Why-we-lost-Uber-as-a-user-td5913417.html

Занятное чтиво про заморочки MVCC и реализации индексов в postgresql.
Все бы это хорошо, но я не понимаю один момент - почему они сравнивают только физическую репликацию (передачу изменений в страницах БД) и репликацию передачей исполняемых запросов?
Есть же вариант "передавать логические изменения в во всех измененных записях в порядке их коммита". Т.е. в таком варианте проблемы с недетерминированным выполнением запросов отсутствуют, но размер передаваемых данных заметно меньше, чем в случае "передавать весь WAL".

Праздник SQL запросов
metaclass
Если по-хорошему, то деноминация должна проводиться по велению задней левой пятки руководителя государства и заключаться в вызове SQL консоли и вводе запроса: "все поля с типом "сумма денег" поделить на коэффициент который сегодня пришел в голову". Конечно же, все базы данных должны быть с нормальной типизацией, а не так, что в поле numeric(18,4) хранится все, что в придет в голову, начиная от суммы, заканчивая координатами и размерами сисек.

И при этом должны меняться сразу все ценники (электронные) в магазинах, все 1С, SAP R/3 и прочие поделия адептов 4 действий арифметики.
И стоить это должно сугубо == стоимости электроэнергии потраченной на преобразование :)

Вендекапец, наконец-то?
metaclass
https://www.facebook.com/sloneus/posts/636050909879742?comment_id=636074829877350&reply_comment_id=636385283179638&comment_tracking=%7B%22tn%22%3A%22R%22%7D

Слушайте, а чо слонеус и лапшин утверждают что винды в госсекторе больше нет и не будет?
Как по мне - так скорее бы это произошло (проще обслуживать, меньше тупизны вроде антивирусов на серверах БД, опять же - лучше бы бабло которое у клиентов идет на виндолицензии себе в карман положить, на доработки и обслуживание всякое), но по моим наблюдениям в РБ даже если где линукс в госконторах и есть - то там его все равно готовить не умеют, потому что доморощенные линуксоиды из БГУИР и прочих институтов инженеров заборостроения, которых не забрали в аутсорс и эмиграцию - это админы локалхостов в основном.

PS: соседний псто http://ru-sysadmins.livejournal.com/2524542.html: "Из минусов - Всё крутится на 2003 и 2008 виндах. Полувоенная организация со всеми вытекающими".
Ну и кому верить?

UX-пидарасы на службе у клоунов
metaclass
https://bugs.chromium.org/p/chromium/issues/detail?id=477424
В хроме нет API, которое позволило бы сделать расширение с вертикальными табами (не в отдельном окне, не в попапе, а в основном, рядом с контентом).
Попытку обсудить его реализацию закрыли WontFix с резолюцией "In the end we decided that the WontFix resolution was more in keeping with Chrome's core value of simplicity"

Т.е. мнение пользователей - по сараю полностью, главное чтобы как можно меньше фич и кода было. Жрите что дают.

ἀνάθεμα ἀνάθεμα ἀνάθεμα
metaclass
А те, кто пишет в фейсбук про программирование - прокляты будут во веки веков и адские гиены огненные будут лизать их исходный код своими смердящими языками.

И про голанг
metaclass
https://www.facebook.com/alexclear/posts/10206939303546236 (извините за говно-фейсбук)

>"Go это новый PHP. Сделаем дизайн языка говно потому что ничего не умеем, оправдания придумаем постфактум (мы уважаемые чуваки, стояли рядом когда Си разрабатывали, поэтому слушайте нас мы знаем как правильно). Авторы PHP вон честно писали в рассылке, что "дизайн языка такой, потому что мы в процессе учились писать парсеры и вообще не настоящие сварщики")."

>"типов нормальных нет (потому что не умеем) потому что это слишком сложно, исключений-продолжений нет (потому что не умеем) потому что они там что-то стоят в рантайме, синтаксис с припиздью (потому что дебилы?) потому что ???"

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

golang
metaclass
Вы тащемта, как хотите, но golang - это современный Delphi, настолько же простой и пригодный для промышленной разработки.
Надеюсь, гугл не проебет все полимеры, как борланд, а всякие олдфаги со своими C, C++ и жабой будут задвинуты на задворки истории и всех нас нахрен уволят на мороз за то что overqualified и заменят выпускниками БГУИР, которые будут клепать на go микросервисы в докерах.

Обсессивно-компульсивное расстройство, как необходимое свойство программиста
metaclass
По моему, программистов надо набирать исключительно среди людей с OCD и прочими расстройствами психики, вызывающими чрезмерное внимание к деталям.

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

Попривыкали, блядь, к "читай код и маны и git reflog" и прочему подковыванию блох, а потом ни один кусок кода или либу в продакшен втащить без переделки наполовину невозможно, потому что вместо обработки ошибок - стектрейсы, коредампы и подземный стук в SO.

Решение этой проблемы всегда упирается в людей, которые считают что говно и палки, из которых построено все ИТ - это "нормально, всегда так делали и будем делать". То что там внутри черви кишат - хрен с ним, оно исправимо, а вот когда этих червей считают нормой жизни - это уже неисправимо.

Репликация таблицы БД с помощью очередей
metaclass
Я тут, как обычно, подумываю, как бы заменить прямое обращение к БД из сервисов на хождение мессаг по очередям и посетила меня такая мысль: можно ли с помощью очереди, гарантирующей доставку "один раз или больше" реплицировать одну таблицу в БД, если у нее есть естественный ключ?

Мне что-то мерещится, что такая таблица является вариантом CRDT (если я воще правильно понимаю, что это такое) и можно гарантировать, что изменения с одной стороны, попавшие в очередь, дойдут до второй стороны и содержимое таблиц в конце-концов сойдется.

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

Для случая нескольких таблиц со связями/FK уже так просто не получается - нужно чтобы таблицы, между которыми есть связи, реплицировались в правильном порядке - невозможно создать запись, в которой есть ссылки на другие, раньше их и удалить запись, на которую есть ссылки из других, до них невозможно.

Обычно я делаю распределенную транзакцию с двухфазной фиксацией с двумя БД и передаю данные лога транзакций и изменений между БД, пока оно работает как положено, за исключением того, что это прибивает гвоздями решение к протоколу Firebird, в котором эти распределенные транзакции предусмотрены и, например, убрать прямое обращение к БД и гонять данные по http(s) между сервисами не получается. Было бы интересно, опять же, рассмотреть вариант репликации данных между разными СУБД.

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

Это вообще как? Без write barrier вроде же такое никак не вылечить (ну, не считая вуду механизмов в стиле "считаем диск одной из нод распределенной системы, наворачиваем консенсусы и безнадежно воюем с CAP теоремой")

Я просто вообще с трудом понимаю, что можно сделать, если файловая система не представляет хоть каких-нибудь гарантий целостности.

Снова про прогресс.

Python back
metaclass
Я уж думал, один я такими постановками задач в стиле "окружению доверять нельзя, приложение ставится у клиентов где только можно в ужасных условиях" страдаю.
Правда, я до сих пор пытаюсь придумать - на каком компилируемом языке со статик типамисделать удобный для мозга сервер приложений для таких же целей. C#+F#, конечно, почти идеально, но это же микрософт, с них станется завтра закрыть дотнет, дон сайма выгнать на мороз, F# выкинуть из студии, а C#/CLR превратить в подобие ада COM, которое они пытались изначально сделать, из чего получился дотнет.

Originally posted by levgem at Python back
В 2006 я без сожаления променял питон на рельсы, потому что это было реально круто. Так до 2011, когда я эти ваши рельсы бросил.

Сейчас мы встали перед дилемой: на чем писать приложение, которое отгружается пользователям. Тут есть важный момент: это ставится пользователям, а следовательно мы не можем раздувать инструкции по установке и доверять окружению. Все что нужно (кроме глибц) мы пакуем с собой.


Факторов при выборе поатформы много: удобство написания бизнес-логики и работы с бд, размер инсталяции, потребление ресурсов.

Эрланг в этом месте выбросили из-за необходимости много работать с бд, а эта задача эрлангом решается плохо.

Джава не рассматривалась потому что лютый ад и бешеный размер пакета.

Read more...Collapse )

Религиозные предрассудки
metaclass
Сижу потиху втыкаю в stm32 микроконтроллеры и одна из неприятных особенностей - большое количество IDE разной степени невменяемости и платности.
Собственно, платку с контроллером я уже запустил и проверил с помощью serial bootloader, пока под руками st-link не было, а сейчас вкуриваю весь этот сатанизм в виде мейкфайлов, линкер-скриптов, ассемблерных вставок, CMSIS и прочего StdPeriph_Driver
И таки заставить себя сделать обычным образом - скачать первую попавшуюся условно-бесплатную IDE с жабоэклипсом внутри, создать проект визардом и тупить в него, я не могу - бесит, когда ради 128 кб прожки надо скачивать 50 мб непонятно чего, с гуями, визардами и прочей хренью, запускать инсталляторы, изучать куда оно это все ставит и как запускает.
А уж тем более бесит, когда для скачивания демо-версии IDE нужно заполнить форму на N экранов, где указать размер обуви, фотографию жопы и унитаза, девичью фамилию матери и воинское звание.
Скачать и распаковать gcc-arm-embedded под винду и воткнуть stm32flash на линукс иди там openocd какой гораздо гуманнее для мозга, чем все это bloatware.

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

Firebird vs Postgres vs Oracle, MVCC и очереди
metaclass
Кто руками трогал Postgres или Oracle (или прочие MVCC СУБД)?

Как они реагируют на такое: в таблице ~1 млн записей, в нее долбятся 2-3-5-10 клиентов, каждый над своим подмножеством записей делает что-то вроде "3/4 записей делаем update, 1/4 удаляем, добавляем еще столько же" и повторять это 24/7. Т.е. антипаттерн "очередь поверх MVCC БД, да еще сделанная через пень-колоду".

Firebird с его реализацией MVCC на такое реагирует нехорошо - накапливается мусор в БД и если, не дай бог, рядом будет длинная транзакция (например бэкап) - то мусора будет охрененно много, после чего какая-то из рабочих транзакций станет собирать мусор, и тоже станет длинной, в результате чего есть шансы поиметь бесконечное накопление мусора и нужно будет отключать рабочие процессы и собирать мусор или же базе будет проще сделать backup-restore (с ключиком -g - отключенной сборкой мусора), чем ждать.

Т.е. при определенном проценте версий записей, сборка мусора в Firebird становится настолько тяжелой по i/o, что прочитать базу целиком один раз без сборки мусора для бэкапа и потом восстановить намного быстрее, чем ждать сборки мусора стандартными механизмами.

Что больше всего смущает в этом - то что сборка мусора на ходу читает базу по кругу какое-то неимоверное количество раз (судя по i/o), т.е. для 100 мб базы может быть прочитано-записано 10-100 гб.

Каждый раз это вызывает желание залезть в кишки сервера и поискать там какой-нибудь неявно окопавшийся алгоритм маляра шлемиеля, потому что оно имеет явно нелинейную зависимость от количества записей в целевой таблице. Или же там что-то вроде нелокальности данных - там не кластерный индекс, соответственно версии записей могут лежать по всему файлу БД как попало, а оно их пытается сканировать линейно.

Еще меня посещает мысль сымитировать MVCC руками, загнать поверх такую же нагрузку и посмотреть, не является ли она принципиально несовместимой с MVCC без втаскивания туда какого-нибудь окасаки или LSM.

PS: Вот собственно описание аналогичной проблемы и ответы на нее http://osdir.com/ml/firebird-db/2013-01
/msg00003.html

Ад локалей и дней недели
metaclass
Белорусско-украинские линуксоиды познакомили меня с кромешным адом - номера дней недели в локалях линукса это пиздец живородящий.
https://github.com/GNOME/gnome-shell/blob/master/js/ui/calendar.js#L599
https://git.gnome.org/browse/gnome-shell/tree/src/shell-util.c#n181
https://bugzilla.gnome.org/show_bug.cgi?id=747346#c5
https://sourceware.org/glibc/wiki/Locales

Дни недели существуют в следующих вариантах:
ISO8601 - 1..7 начиная с понедельника
жабаскриптовый Date.getDay - 0..6 начиная с воскресенья.
Человекочитабельный номер 1..7, зависит от локали.

В локалях линукса есть такие параметры:
week DAYSINWEEK;WEEKSTARTDATE;MINWEEKLEN
first_weekday N - number of day in the week to be shown in the first column of a calendar. Defaults to 1.

Первый параметр состоит из 3 чисед.
DAYSINWEEK is usually 7;
MINWEEKLEN is the minimal length of the first week in year (usually 4).

WEEKSTARTDATE is most confusing - it should be some date that corresponds to the beginning of a week. It is typically either 19971130 (Sunday) or 19971201 (Monday), the former being used almost by all glibc locales (see below). Это параметр NL_TIME_WEEK_1STDAY/week-1stday.

Единственная локаль, в которой я нашел 19971201 (неделя начинается с понедельника) - это ru_UA. Все остальные либо по умолчанию, либо явно указанный 19971130 (неделя начинается с воскресенья)
Причем эти два числа - они захардкожены в gnome-shell/tree/src/shell-util.c для расчета нумерации дней недели.

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

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

Теперь еще вопрос: если в программе-органайзере записано событие "каждое воскресенье" - какой из типов данных там будет использован и не сломается ли оно все в прах, если заменить в локали начало дней недели?

Феминистический язык программирования
metaclass
Все-таки задавать гуглу нетривиальные вопросы чревато схождением с ума.
Встречаем очередное: феминистический язык программирования на феминистической логике:

http://www.hastac.org/blogs/ari-schlesinger/2013/11/26/feminism-and-programming-languages
http://therightstuff.biz/2013/12/14/the-hillarity-of-postmodernism-feminist-programming-languages/

Если попытаться осилить, что пишут по первой ссылке, мозг взрывается на этапе "понять, это они всерьез или стебутся".

Как правильно ебнуться
metaclass
http://utro-vecher.livejournal.com/1860438.html
http://www.sorokoumoff.com/o-polze-negativnogo-myishleniya/
Две противоположных по смыслу статьи на тему "как начать тревожится и перестать жить".

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

Ненависть к systemd как психическая эпидемия
metaclass
Напомните мне или дайте ссылку - я уже спрашивал, чего все на systemd так ополчились?
Выглядит, как средневековая эпидемия одержимости дьяволом, все псят, чего псят - непонятно.
Ну, не считая вот этого: http://metaclass.livejournal.com/889197.html?thread=20959341#t20959341 тут, несмотря на теорию заговора, хоть какое-то обоснование имеется.

С++ EH и логика на исключениях
metaclass
Хорошо ли в C++ программе делать логику на исключениях?
Я ща втыкаю в одну опенсорсную СУБД в продакшене отладчиком и вижу что там на каждый запрос валится стопицот крестиковых исключений, и не понимаю, это нормально или нет.

Rust
metaclass
Прочел http://rustbyexample.com/
Вообще, неплохой язык, с виду, хотя некоторые моменты типа времен жизни объектов и передачи ресурсов между ними с ходу непонятны.

Пользователи винды должны страдать.
metaclass
Задолбал alt-tab в 8 винде.
Эти вот отрисованные окошечьки - они мне ни о чем не говорят - у меня там десятки cmd.exe с кложурью/ssh/питонами/жабами/дотнетами внутри. Иконок не видно, потому что они на фоне этих окошек, пока не присмотришься - ничего не увидишь.
И еще список сделан в стиле MRU, но это всегда было.

Как бы это так переключаться, чтобы понимать, куда ты вообще переключаешься?

Ubuntu 14.04, Redmine, Bundler, содомиты
metaclass
Опять улучшайзеры-содомиты сломали инсталляцию редмайна из репозитория в убунте.
В 12.04 все работало (после стандартных действий по доустановке mod-passenger и его конфигурированию), в 14.04 - пишет "cannot load such file -- bundler/setup". При этом из rails s все работает.
Лечится, само собой, вуду заклинаниями:
apt-get install bundler
touch /usr/share/redmine/Gemfile.lock
chown www-data:www-data /usr/share/redmine/Gemfile.lock