← All posts tagged Haskell

agr
дыбр Haskell проектное Не прошло и года. В #2980231 я рассказывал об утекающих сокетах и грешил на сервер warp. Сегодня до меня, наконец, дошло, что это мой говнокод приводил к проблемам. Забивались очереди, по которым выстраивались коммуникации между серверными обработчиками запросов и фоновыми процессами.. Стоило затюнить скорость чтения из очередей и поставить метрики размера очередей на мониторинг — и, кажется, проблема ушла, warp ни при чём. А время покажет.
agr
дыбр Haskell СЯУ, что при определенных пока не поддающихся упрощению обстоятельствах warp перестаёт закрывать сокеты, оставляя их в close-wait до полного исчерпания. пока не понятно, как нужно составить, отправить и рубануть запрос, чтобы сервер вёл себя так.
agr
code Haskell
type family FragmentUnique api :: Constraint where
  FragmentUnique (sa :<|> sb)       = Or (FragmentUnique sa) (FragmentUnique sb)
  FragmentUnique (Fragment a :> sa) = FragmentNotIn sa (Fragment a :> sa)
  FragmentUnique (x :> sa)          = FragmentUnique sa
  FragmentUnique (Fragment a)       = ()
  FragmentUnique x                  = ()

type family FragmentNotIn api orig :: Constraint where
  FragmentNotIn (sa :<|> sb)       orig =
    And (FragmentNotIn sa orig) (FragmentNotIn sb orig)
  FragmentNotIn (Fragment c :> sa) orig = TypeError (NotUniqueFragmentInApi orig)
  FragmentNotIn (x :> sa)          orig = FragmentNotIn sa orig
  FragmentNotIn (Fragment c)       orig = TypeError (NotUniqueFragmentInApi orig)
  FragmentNotIn x                  orig = ()

type NotUniqueFragmentInApi api =
    'Text "Only one Fragment allowed per api ‘"
    ':<>: 'ShowType api
    ':<>: 'Text "’."
agr
Haskell интересно, а есть ли живые примеры серверов на серванте, у которых в индексе свыше 100000 страниц с контентом?
agr
Haskell ETL проектное пандемия с одной стороны дичайше сбила некоторые процессы и ожидания. с другой стороны — вызвала самоизоляцию. самоизоляция сузила пространство выборов. это сказалось на исполнении задач.

запустил ETL проект на сабже. продумываю ядро системы.

— прикрутил sqlite-simple. абстрагировал базу данных от типов данных приложения.
— прикрутил servant, к нему куки.
— прикрутил вебсокеты и front к этому делу. бустанул front тем самым нехило так.
— пишу код с бойлерплейтом. вообще наплевать. со временем будет уменьшаться. а может, и нет.

будет ядро — будут и интеграции. много. очень много.
agr
Haskell рано или поздно, но этот момент приходит, ты начнёшь писать компиляторы.. в моем случае, это патчи в компилятор в JS.
agr
Haskell `IORef Settings` в прилoжении, где Settings — целикoм читаются из пачки dhall файлoв, — лютейший вин!
эдакий hot reloading версия лайт.
не счесть, скoлькo нервoв и времени сэкoнoмленo!
agr
дыбр Haskell погроммирование проектное первую страницу налабал на новом фреймворке:
— 1 тип данных рендерится,
— 10 разных рекордов
— 4 вида элемента
— 5 событий
— рендеринг через blaze-html
— если проводить аналогию с Data.Aeson, то для "Value" ещё не покрыт "Object".
— куча бойлерплейта.
— связь событий с моделью прописывается отдельно, т.е. потенциально: "забыл", и привет баги в рантайме.. надо думать новый констрейнт, чтобы прямо в MarkupM (или обёртке) можно было события назначать, ну чтобы хотя бы как в пурскрипте.

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

под размерностями я понимаю:

1. модель коммуникации
— broadcast/multicast
— выделенная сессия
2. реализации MVC концепта, нужны примеры (список простых примеров уже есть, бери и делай)
3. формат данных:
— текстовый (+)
— бинарный (на следующей странице обкатаю)
4. клиентские (JavaScript) события (условно, тысячи их.. это целый мир джаваскрипта, на который я замахнулся). Пока покрыто лишь 5.
agr
дыбр Haskell stack погроммирование одолел, короче, эту ботву с базой пакетов. есть замечательный пакет ghc-paths. в нём пути к тулам определяются через переменные окружения, например, GHC_PACKAGE_PATH.
cabal-install, ghc и ghc-pkg растут и развиваются. и тут приходит стэк и начинает переписывать переменные окружения, т.к. у него есть минимум 2 базы пакетов (от снапшота, компилятора) в ~/.stack. ещё есть ~/.../.stack-work. там тоже есть, да. по ходу дела во время билда stack делает своё страшное дело и затирает HASKELL_SANDBOX_CONFIG, устанавливая его в базу пакетов снэпшота (!). вот это вообще ни разу не тривиально. я думал, что "песочница" — это база локальная, из .stack-work. а оказалось, что нет. снэпшот — это песочница. таким образом, все extra-deps, которые кладутся в .stack-work, остаются не удел и не видны.

придумал вообще рабочий костыль.
если вижу в пути ".stack", то пускаю "stack exec — ", иначе — оставляю значение из ghc-paths (либо дефолтное).
agr
? дыбр Haskell погроммирование можно ли к типу в линзе в сеттерах частично применить traverse?
т.е. допустим, 80% рекордов — это обёртка над Text, хочу написать меньше кода.
а остальные можно и руками добить.
agr
? дыбр Haskell погроммирование Решил, наконец, поиграться в метамодельки. Веселье заключается в том, что каждому рекорду соответствует ещё его метадата. В связи с чем, возникает хороший вопрос... Допустим, у меня есть тип данных A с именем объекта (aName) и ещё 8 рекордами (aParam1 .. aParam8). Поскольку я помимо данных из базы тяну ещё и метаданные, по которым их идентифицировать, и не люблю ддосить базу, то мне надо вытащить за раз одним селектом 19 полей (имя, идентификатор и тип объекта (3) + параметр и его айдишник x 8 (16)) из базы. Persistent со своим RawSql отваливается на подступах с 8 колонками.

postgresql-query потянет? или что-т другое?
agr
? Haskell stack хочется странного.
1. host=osx.
2. stack docker собираю под линукс
3. в локальной pkg-db, соответствующей ghc-8.4.3-linux, есть пакет, лежит в .stack-work внутри соответственно.
4. в глобальной pkg-db, соответствующей ghc-8.4.3-linux, нету этого пакета.
5. в родительском пакете юзается ghc-paths, в котором явно триггерится ghc-pkg. опытным путём было установлено, что глобальный.

как поместить пакет из local db в global db?

сейчас проект собирается с хаком:

export GHC_PACKAGE_PATH=$(stack path --ghc-package-path)