voidlizard.online
117 subscribers
160 photos
6 videos
5 files
105 links
Haskell, распределённые системы.

Разработка P2P CAS hbs2 и приложений для него

Распределенный git aka hbs2-git

hbs2.net

Прочее https://t.me/genedrd47r (мото, EUC, скайдайвинг, дайвинг)
Download Telegram
Посоветуйте, что взять для стриминга? мне надо такое - что бы жило на O(1) по памяти точно и было с минимальными зависимостями и не пыталось свою вселенную построить, как кондуиты. взял было list-t - он протёк, на больших файлах крашится. Тупой пример, чего мне надо - который не падает: https://gist.github.com/voidlizard/46d1bac04f67ed0fd92560817b349b9e - хаскель курильщика, но работает за O(1) по памяти
#haskell читал из файла чанки / защитил докторскую
издохло мгновенно. быстрее, чем всё до того. вот так стриминг! #haskell #streaming #специальнаяолимпиада
Forwarded from Dmitry Zuikov
main :: IO ()
main = do
hSetBuffering stdin NoBuffering

let bebe = Handle.read @IO
qq <- Stream.unfold bebe stdin
& Stream.chunksOf (256 * 1024) Fold.toList
& fmap (hashObject . B.pack)
& Stream.toList

print (length qq)
Вообще я не планировал специальную олимпиаду, я чем-то другим хотел сегодня заниматься. Но по итогам хочу сказать, что рассчёт хэшей файла ~10G на streamly - взрывается. на list-t - взрывается. на unsafeMMapFile - хочет взорваться не но успевает, дорабатывает. на streaming - не взрывается. https://github.com/voidlizard/streaming-wtf/blob/master/MerkleStreaming.hs - работает ~ O(1). ну конечно не O(1) , но пропорционально количеству хэшей * размер хэша, фигня, типа мегабайт на 10 гигабайт. я вообще не этим собирался заниматься. очент досадно за list-t - прикольный и сука бесполезный в итоге
Нездоровая активность в плане кода в выходные объясняется просто — со сломанной рукой не так много развлечений доступно. Если не бухать, то мало что остаётся — например вот в стриминг на хаскелле поиграться
ListT починен, интересно, примут ли патч:
diff --git a/library/ListT.hs b/library/ListT.hs
index 4361a4a..70c3673 100644
--- a/library/ListT.hs
+++ b/library/ListT.hs
@@ -407,7 +407,7 @@ splitAt =
-- |
-- Prepend an element.
cons :: Monad m => a -> ListT m a -> ListT m a
-cons h t =
+cons !h t =
ListT $ return (Just (h, t))
Схоластика: когда средневековые учоные обсуждают и пытатся рационализировать потребление памяти хаскельной программой
Одно из определений безумия - это делать одно и то же, ожидая другого результата. Одно из свойств безумия - считать, что безумие можно контролировать. Топик, потому, что про управление проектами
Странное вот дело - казалось бы, нет ничего проще UDP. Но даже из протокола на две команды - получается конструкция на тысячи строк кода, это вспоминаю DNS прокси роутерную. Удивительное дело вообще. После дней пяти мучений с модельным сервером — решил посмотреть, что там как у людей, может хорошо уже сделали. Увиденое заставило всплакнуть - видно, что те же самые проблемы были, и судя по прибитым местами IO и ByteStrings - просто сдались в какой-то момент. А всего-то хочется написать обобщенный воркер с поддержкой сессий, а что бы конкретные типы пакетов и сессий определялись его клиентами. Типа, на случай, если протокол состоит из какого-то небольшого числа подпрототоколов со своими workflow. Если всё это загнать в один тип пакетов, например — то очень быстро становится невозможно отлаживать, т.к. каждый конкретный FSM обрастает каким-то дополнительными типами и таймаутами. Кстати, частое явление в этом нашем х-ле — то ли тупо запихнуть всё в один тип, то ли устроить содомию с тайпклассами и обёртками на экзистенциальных типах. Как говорится, есть два стула.
Твоё лицо, когда не любишь сервант, но пишешь какое-то его подобие для UDP
Потенциально всех хаскеллистов можно привлечь по статье за изнасилование крупного рогатого скота. Если доказать, что хаскелл - это крупный рогатый скот
Forwarded from Dmitry Zuikov
Убрал оптимизацию / скорость выросла
И что мне делать с этим?
сделаешь вот в игрушечном модельном p2p сторейдже мультикаст, что бы локальные пиры находились, т.к. запаривает в конфиги их прописывать. и понеслась сразу же криптография. отсюда вопрос - что, кроме ключа может быть еще каким-то постоянных идентификатором в децентрализованной системе? понятно, что sockaddr не может. с ключом приходится делать несколько допущений, которые мне не особо нравятся. что можно придумать еще
Помнится, писал заметку об убогости типичных конфигов - yaml, toml, json, ini что там еще бывает. бывает еще dhall, но это спасибо-пожалуйста без меня. TL;DR - шумные, негибкие, нет абстракции. Что интересно, когда такое берёшь в проект, что бы особо не думать — то халявы-то всё равно по факту не получается, там +- куча бойлерплейта. Короче, чем ныть, намутил парсер sexp-ов на мегапарсеке, и немного подшаманил, что бы на топлевеле можно было задавать конструкции без скобок - т.е с первого взгляда даже не похоже на секспы, а если еще добавить синтаксического шума в виде всяких равно и двоеточий, то будет выглядеть, как какой-нибудь yaml-json. Прикол в том, что поскольку это на самом деле секспы, то это можно будет расширять. Например, добавлять функции - ну, например, указывать, что если ключ не занят, то взять его из окружения с именем таким-то. Весь парсер и AST, к слову, получились строк 200+, и это уже оно умеет в принципе красиво ошибки выводить, там же мегапарсек внутри (далее в коментах)
Forwarded from voidlizard.online/comments
к вопросу о том, что шумно, что не шумно. конструкция
fixme-prefix FIXME:  bugs issues
делает следующее:

говорит, что есть префикс "FIXME:" который относится к категориям bugs, issues. теперь задаём на условном JSON/YAML:

prefixes = {
"FIXME:" : [ "bugs", "issues" ]
"TODO:" : [ "bugs", "issues"]
}
ахаха, это провал. я не знаю, можно ли там повторяющиеся ключи, поэтому


prefixes = 
[ ["FIXME:", [["bugs", "issues"]]
, ["TODO:", [["bugs", "issues"]]
]
ахаха, а это секспы. покажите, как лучше
Каждый неизбежно в жизни напишет хотя бы одну игру, компилятор/транслятор и распределенный багтрекер.
#offgrid ускоряем протокол, переделываем в сторону упрощения криптографию. делаем для себя, поэтому можем позволить себе сделать как следует