to post messages and comments.

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

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

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

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

попутно делаю декомпозицию задач по второй фазе проекта с сайтом. пока очевидно, что Fay можно немного улучшить, добавив туда немного виртуального состояния и event loop. как это сделано в purescript pux. но для этого надо реализовать ещё одну зависимость. короче, нужен эксперимент на кошках.

если этого не сделать, то голый Fay потом будет классно сопортить.

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

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

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

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

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

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

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

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

дорос до докера. для того, чтобы получить  ~/.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 не было образа, а делать образ спецом уж крайне лениво было. Теперь вот зоопарк конфигураций.

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

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

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

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

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

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

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

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

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

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

Не, так, конечно, бывает. Вместе с компилятором рекомендуется ставить `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

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

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

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

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

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

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

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

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

[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
...

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

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

Столкнулся с замечательной вещью. Есть файл 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') ) — всё ок.

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

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

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

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

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

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

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

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

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