Чтобы добавлять сообщения и комментарии, .

@agr:
agr

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

Сайт:
— делегирование домена успешно осуществлено.
— осталось несколько тэгов из schema.org прикрутить.
— можно деплоить сайт после этого.

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

Новости фронтэнда.
— после устранения боли в стерилизации JSON и прикручивания CORS к серверу процесс качественно ускорился.
— не покидает меня мысль о том, что промежуточный State на клиенте не нужен. N2O.hs себя хорошо показывал, но еще очень сыроват в качестве веб-фреймворка. Думаю после деплоя сайта уделить ему качественно времени.

@agr:
agr

Вроде всё есть, а сериализации-десериализации массивов/списков днём с огнём не сыщешь. Чуть дальше примитивных типов уйдёшь — Generic не шуршит. Nested types — тоже ни в какую. Пошёл в код посмотрел purescript-foreign. А там всё общение через FFI. Ну зашибись, приехали. Причем без посредника — никак. Напрямую — жесть.

instance Decode (Array MyAwesomeType) не указан, вывести не могу.
Заводишь инстанс на Array — сиротка, вай-вай-вай, пошёл вон.

Придётся юзать FFI: github.com

@agr:
agr

целевой ресурс, с которым парсер интегрировался, в очередной раз за 2.5 года изменил дизайн. отвалилась одна бизнес-функция. попутно выяснилось, что там накрутили фич модных, которые не способен выполнить фантомjs без polyfill. решение проблемы засора js-консоли оказалось вообще на поверхности.

page.onError = function(msg,trace){}

@agr:
agr

На самом деле emacs

@agr:
agr

а как вы решаете вопрос с удаленной работой? аренда офиса, отдельный кабинет в квартире/доме, сраные хипстерские местечки/кафешки? или вообще не заморачиваетесь?

@agr:
agr

Почему, даже когда проектируешь виджет в UI, в конечном итоге вырисовывается event-based херня поверх структур-посредников?

@agr:
agr

Пока отхожу от джетлага, взялся за код юая, хочу синхронизирующиеся комбобоксы грамотно воткнуть, чтоб без костыля. События на события можно вешать, но потом также можно упороться в отладке. Иными словами, нужно как-то уметь познакомить два комбобокса. Меняешь значение в одном — меняется у соседа. Чтобы вообще без разницы было, какую из двух форм заполняешь. Короче, спать надо идти, а не маяться дурью на ночь глядя.

@agr:
agr

Не, так, конечно, бывает. Вместе с компилятором рекомендуется ставить `pulp`, а-ля `ghcid`, только покруче.

Делаем 1.
pulp init # OK
pulp build

/usr/bin/env node not found.
ок, сделал симлинку, поехали.

Делаем 2.
pulp build

Error found: in module Control.Monad.Eff
bower_components/purescript-eff/src/Control/Monad/Eff.purs line 36, column 1 — line 36, column 52

reddit.com чувак говорит, ставьте новый purescript, там все починено!

Делаем 3
npm install -g [email protected]

Нода говорит, я старая, не панимат.
искаропки недостаточно хипсторская шла. скачали, перебили, да, симлинка не нужна, поехали.

Делаем 4.
pulp build

psc not found
В том же треде чувак пишет, я тут переименовал утилиту, psc там, и другие старые выкинул на мороз, юзайте пацаны новую, purs. пока чиню поломанное API с pulp, юзайте обертыши из директории scripts, все работает. Ок, пошёл, сделал симлинков, выдал доступ юзеру своему.

Делаем 5.
pulp build

Invalid option `--ffi'

В том же веткой ниже другой чувак говорит, всё тлен, пацаны, в гуглогруппе разрулили.
Ломать не строить. Откатывайтесь обратно на старый, пока, вот вам зависимости, вот вам счастье. Ок, поправил зависимости.

Делаем 6.
bower i
pulp build.

* Build successful

@agr:
agr

Большой прогресс по достижению цели.

Дали тестовое задание из конторы, в которую стучусь уже давно из-за локации, в которой находится один из её офисов. Запилил мокап, отправил тут же. Ща буду генерить JSON и клиента для отображения. Заодно посмотрю, на что способны PureScript/Elm. Fay мне понравился, хоть и он и того, но не им единым. И да поможет мне сила.

@agr:
agr

Навеяно #2861604.
Помню на прошлом рабочем месте был крутой чел. Т.е. мы офигевали от того, что происходит.

— Он приносил в офис бутылку пива, допивал её и выбрасывал в окно, выходящее во двор, где лежал строительный мусор всякий, в аккурат за 30 секунд до входа в комнату начальства.
— Дали ему задачу взять запилить для жыбосса JSP по мотивам прототипа-скрипта на PHP, но задачу формализовали до жути (маршрут, допустимые параметры гет-запроса, логика, где брать данные, что использовать). Тот берет прототип, подмахивает расширение .php на .java, открывает в IDE и заявляет с претензией, что ваш г-код не компилируется.
— Через неделю в коде класса появился метод getPostgreSQL().
И многое-многое другое. Быстро стал мемом в компании. Выгнали его на мороз, короче.

Но выяснилось, что на новом месте он уже был лидом, а ещё через год — менеджером.

@agr:
agr

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

Добрался до гипотез. Реализовал весь подсчет на стороне базейки. Надо протестировать. Потом — монетизация. Пока смотрю в сторону коробочного решения типа яндекс.кассы.

Потому что, сначала надо фичи релизить, да. А потом уже отсекать сущности бритвой Оккама. Долгострой пора выводить в продакшн.

@agr:
agr

achievement unlocked: 1829x times faster code execution.
пользуясь случаем, передаю привет индийским братьям.
и да, печально, что сами ребята не справляются с рефакторингом собственного кода. ведь некогда думать, надо писать код.

@agr:
agr

Когда имеешь дело с эмуляторами, то рано или поздно приходишь к такому.

@agr:
agr

[atom]

A0 = connect.t
Z0 = wait.t
...
A2 = auth_fail.t
A3 = retry_auth.t
A4 = logout.t

[hfsm]

disconnect = *-Z0 # any command, disconnect after timeout defined in wait.t
retry = A2-A3 # wrong username, retry authorize
sequence1 = A0-retry-retry-A4
...

Дамп из головы пока такое выдаёт в качестве синтаксиса для описания иерархических конечных автоматов.

@agr:
agr

Каково это, писать код в публичной библиотеке?

@agr:
agr

Добил отвратительную диаграмму ветвлений, отображающую зависимости между ролями и сессиями пользователей. Днём надо убедиться, что код действительно работает так, как задумано.. Наполнить все точки выхода контентом. В идеале — прикрутить поддержку гипотез для A/B тестирования.

@agr:
agr

Столкнулся с замечательной вещью. Есть файл UTF-8 without BOM, содержащий букву ó, SQL запрос. Слово "Dirección". Набирается в испанской раскладке как "[o" (без кавычек). Прикол в чем. Есть Oracle, в котором тоже кодировка UTF8 выставлена. NLS_CHARACTERSET, все по феншую.

— Пытаешься выполнить запрос в редакторе запросов. Потом о с ударением отображается как надо.
— Пытаешься выполнить запрос через sqlplus под виндой. Отображается хрень типа ó.
— Пытаешься выполнить запрос через sqlplus под линухом, на котором UTF-8 сконфигурирован — та же хрень.
— Изменяешь в INSERT-запросе 'ó' на 'o', а строчкой ниже делаешь UPDATE с replace на compose( 'ó' || unistr('\0301') ) — на отображение работает, но в рантайме не воспринимается как 50099 char.
— Изменяешь в INSERT-запросе 'ó' на compose( 'ó' || unistr('\0301') ) — всё ок.

Почему так — не разобрался до конца..

@agr:
agr

Написал другой эмулятор для другой интеграции. TCP-сервер под капотом, отдающий многострочный текстовый контент и сопуствующий ему IO () по реквесту за предопределенное время, т.е. вычитывающий K-V из ресурсных файлов и сопоставляющий контент запроса с ответом. Продавать его не будут, конечно, т.к. у заказчика уже есть тестовая лаба. Экшн выбираю пока хардкодом. Для тестирования этого достаточно. И это вовсе не rocket science.

Но вот улучшить так, чтобы склеивать реквесты во всевозможные цепочки (привет, конечный автомат) — можно. Сейчас даже простые последовательности не поддерживаются. Проекту это не нужно, но вот продукту может быть полезно....

@agr:
agr

Обход капчи
youtube.com

@agr:
agr

Да, это натуральная история успеха: #2859956
Скорость компиляции, IDE, не осилили акку, го, докер, всё это.

В итоге ниже сами же подчеркивают:
— местами нужно было юзать вообще python,
— местами JVM надежнее (ну мы же не весь код перепилили на го),
— когда чёта сложна, то смещаем сложность на архитектуру, делая больше микросервисов богу микросервисов.

@agr:
agr

А как определить потенциального засранца на сервере, который валит куки в браузере?
Как его отделить от бота, которому дозволено заходить?
Современные боты от гугла, яндекса, яху, комодо и других известных ребят умеют куководить?

@agr:
agr

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

Х1 — А. Х2 — Б. Х3 — В.

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

@agr:
agr

Первый шаг к метамоделям. От теории к практики.
В базе данных появилась K-V таблица для более гибкой конфигурации ресурса.
Следующий проект лучше сразу начать с таблиц объектов, ссылок и пропертей и хранить метамодель там.

@agr:
agr

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

@agr:
agr

Смена макета сайта Yesod — удивительное по глупости занятие.
Прикручиваем стили, а затем выясняем, что всё очень и очень плохо выглядит.

@agr:
agr

По мотивам #2851662.

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

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

Да вот только в процессе из полумиллиона апгрейдных заявок пиковая нагрузка придётся как раз на период остановки того самого сервера. И вот, добрая треть ордеров падает, сервер under maintenance, обновленное оборудование портится. И от этого страдает конечный бизнес заказчиков, они теряют прибыль.

Да, хорошо выкатываться в продакшн в пятницу вечером!

P. S. Все события вымышлены, все совпадения случайны.

@agr:
agr

Извечная проблема.
— С заказчиком нужно согласовать спецификацию до начала фазы build.
— Но она по-любому изменится со временем.

Потом:
— Почему вы мне демонстрируете реализацию копии, отличную от подписанной?
— Потому что с ней вы огребаете следующие три десятка data issues. А в новой — они зафиксированы, смиритесь.

Стоп.
— Почему заказчика не уведомлять об изменениях?
— А потому что он всё равно их не отслеживает.

@agr:
agr

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

1. Сделать мастера умным, а воркеры тупыми.. Если они принимают какую-то задачу, то от других отказываются? Топорно, недальновидно, странно....
2. Сделать мастера умным, а воркерам добавить способность хранить очередь? Тогда надо защищать их от переполнения очереди. И как-то согласовывать, а то в сценариях могут быть расхождения, и со временем гэп станет критичным. Или есть ресурсы ноды исчерпаются. Лимит на выполнение задач. Тупо, но что делать с теми сценариями, которые критически важны? Или с последовательностью сценариев? + затраты на менеджера очередей.
3. Внести перед выполнением сценария задачи расчёт стоимости, исходя из атрибутов (размер файла, свободная память, замер пропускной способности сети.......) какой-то внешней нодой? Или самим воркером?
4. Заложить в мастер-ноду или менеджер-ноду возможность управления очередностью выполнения задач, исходя из полученных в пункте 3 оценок.....
5. .............

Или это всё космические корабли и воздушные замки, а реальные пацаны всё уже продумали до нас и есть что-то простое, интуитивное понятное и ваще?

@agr:
agr

ТМ жжёт, конечно. ТМ без опыта в Т. На ровном месте пытался создать напряг, чтобы в офис вышел уже с семи вечера и до вечера следующего дня проторчал там. А когда услышал "НЕТ", возмутился так, словно я ему лично дорогу перешёл. Хотелось ругаться. Надо проораться под ж/д мостом, чтобы отпустило.

@agr:
agr

bash.im

@agr:
agr

Что достаточно сделать для избегания капчи яндекса в случае необходимости автоматической генерации запросов к его сервисам?

@agr:
agr

destroyallsoftware.com
вдогонку к #2834489
классика

@agr:
agr

Нужна альтернатива `tail`.
tail через 5 минут умирает от натиска софта, пишущего лог хрен знает во сколько потоков.

@agr:
agr

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

@agr:
agr

Как за 3 выходных дня впихнуть в них активности, намеченные на 6.5 дней? — Никак. Deal with it. Иногда надо смириться с тем, что проиграл в битве с самим собой.

@agr:
agr

Пришлось попотеть, но удалось закоммитить Haskell в рабочее время в репу.

@agr:
agr

Вся прелесть командной разработки в том, что ты в любой момент можешь кинуть команду и свалить на больничный: команда всё стерпит!

@agr:
agr

— Так что, вместо того, чтобы опросить оборудование один раз и записать всё в один файл, который передать дальше на split и разбор, мы опрашиваем файл двадцать раз, а потом разбираем двадцать одинаковых файлов?
— Получается, да..
— Херово получается.

@agr:
agr

Показал коллеге вебсокетный чат на Haskell, взятый с гитхаба.
Реакция: "ААА!! Я впервые увидел, что-то реально написанное на нём!! Как это возможно????777 Все, кого ни спросишь, как один отвечают, что учат или смотрят на него, но никто дальше факториала ничего не показывал. АААААА!!11111"

@agr:
agr

До чего прогресс дошёл.
Серверы на Haskell компиляются под Windows.
А вот от Лиспа под виндой такого не добиться..