to post messages and comments.

@agr:

в мире OSS всегда надо иметь возможность взаимодействовать с миром упоротых систем, написанных кем-то другим.. зачастую эти системы общаются с внешним миром через стандартные интерфейсы и по стандартным протоколам, но иногда встречается всякое.. но главное в этом мире говнокода — это то, как внешний мир данных отображается на внутренний мир данных. и вот эти маппинги.. они повсюду.. и эксель юзать для их обработки — ну зло. а что если маппинги надо куда-то замаппить? это ж ужас. а что если маппинги маппингов надо куда-то замаппить? а что если, we need to go deeper? а ведь так оно и должно работать..

@agr:

yet another haskell project goes live.

@agr:

Сайт — это жесть, релиз ещё на неделю может отложиться. Ещё 4 замечания зафиксировано по адаптивной верстке. Ещё +10 мелких поступило сегодня.
Ну хорошо, что эта мелочь тривиально решилась правками стилей.
Верстальщик сделал лого текстом вместо картинки. CSS magic.
Жду пятой итерации замечаний.

@agr:

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

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

@agr:

заюзал dehydrated и в три щелчка прикрутил https.
верстальщик верстает, дизайнер рисует картинки.
как эти ребята закончат — можно будет деплоиться.

@agr:

разобрались. верстальщик впервые увидел шаблоны Yesod, охренел. минорное изменение в меню. короче, живём пока. пора задуматься об https.

@agr:

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

@agr:

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

@agr:

по сайту осталась одна задача, началась война правок.
— восемь уровней div плохо для SEO, давай меньше.
— на четыре.
— четыре много.
— давай один.
— все разьедется.
— покажи..

@agr:

а это вообще нормально, что компиляция yesod формы для POST запроса из 12 полей вызывает OOM? такое поведение уходит, если дать виртуалке 6 гб. На 5.5 гб падает. при этом компиляция под нативную ось тянет и не жрет столько памяти..

@agr:

По сайту осталась 1 основная доработка, блокирующая релиз, и 3 минорные проблемы.

@agr:

Студентка решила повторяющуюся мегазадачу.
20 часов превратилось в 0.25 часа.

Другая тоже подтягивается: решила 3 типовые задачи.

Хорошо-то как. По сайту осталось 7 основных доработок, блокирующих релиз. и 3 минорных, которые надо бы тоже решить..

@agr:

дорос до докера. для того, чтобы получить  ~/.stack/programs/x86_64-linux на OSX, пришлось в stack.yaml добавить следующее:

system-ghc: false
docker:
image: fpco/stack-build:lts-8.0
enable: true
run-args:
— --ulimit=nofile=60000
set-user: true

GHC для сборки нужно порядка 30000 открытых файлов. системные значения — около 15 тысяч. Да, забыл сказать, что сначала надо было сделать upgrade проекта с 7.10.2 на 8.0.2. До этого в системе действовал какой-то другой лимит, уже успел забыть, мешавший компилятору делать своё дело. Потом с lts-3.22 уходить на lts-8.21. Теперь — делать небольшой downgrade до 8.0, т.к. для 8.21 не было образа, а делать образ спецом уж крайне лениво было. Теперь вот зоопарк конфигураций.

@agr:

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

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

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

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

@agr:

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

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

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

@agr:

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

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

@agr:

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

@agr:

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

@agr:

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

@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:

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

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

@agr:

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

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

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

@agr:

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

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

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

@agr:

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

@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:

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

@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:

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

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

@agr:

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

@agr:

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

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

@agr:

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

@agr:

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

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

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

@agr:

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

@agr:

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

@agr:

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

@agr:

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

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

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

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

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

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

@agr:

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

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

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