← All posts tagged WTF

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

Из seL4: Formal Veri cation of an OS Kernel

As a compromise that blends both views, weadopted an approach [19, 22] based around an in-
termediate target that is readily accessible by both
OS developers and formal methods practitioners. It
uses the functional programming language Haskell to
provide a programming language for OS developers,
while at the same time providing an artefact that can
be automatically translated into the theorem proving
tool and reasoned about

серьёзно что-ли?!

читаю доку про SEXP вижу: RAWSXP
    length, truelength followed by a block of bytes.  читаю исходники: INLINE_FUN SEXP ScalarRaw(Rbyte x)
{
    SEXP ans = allocVector(RAWSXP, (R_xlen_t)1);
    RAW(ans)[0] = x;
    return ans; вот какого черта?

поидее же для PAIR возможно только пара PAIR->PAIR. При этом The zmq_socket_monitor() function shall spawn a PAIR socket that publishes
socket state changes (events) over the inproc:// transport to a given endpoint. При этом zmq_socket_monitor можно подключить к Router (XSUB), это конечно круто, но какого спрашивается черта и где в доках неточность?

я понимаю что код кривой, но почему следующий код приводит к тому, что мне бесконечное число раз приходит единственное посланное сообщение (т.е. zmq_close) асинхронный, но поведение совсем неожиданное:

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

с новомодным автопереписыванием .cabal на hackage у файлов меняется чексумма, а существует ли какие-либо механизмы, для тестирования что файл не подменили.. или хакадж не поломали, это ж нулевая секурность..

в общем вчера пол дня бился со следующей проблемой суть которой я так и не понял. Есть:

в сишной либе:
tyedef foorec { ... } foorec, *foo;
extern *foo F_foo;

в c2hs файле:
data FOOREC = FOOREC
{# pointer *FOOREC as FOO -> FOOPREC #}

foreign import ccall unsafe "&F_foo" fFoo :: Ptr Foo

Значение в коде получается как:

f <- peek fFoo

Тут поидее все правильно, а вот дальше..

В обычном исходнике всё хорошо, а вот в ghci — мистика, если вызывать peek fFoo, то результат отличается, если мы это делаем в top-level сессии и если мы это делаем внутри функции:
т.е.
h = peek Foo (внутри файла)
x1 <- peek Foo (внутри сессии)
x2 <- h
x1 == x2
False

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

а). Почему так? б). Куда копать, чтобы понять почему так получается? в). можно ли написать код в хакцельной либе так, чтобы код для executable и для ghci отличался, т.е. что-то типа

#if _IN_GHCI
p <- readIORef globalHack
#else
p <- peek fFoo
#endif

сижу, смотрю в код и вижу, что он должен неправильно обрабатывать один из случаев, при этом уже минут 15 не могу
сделать тест, доказывающий это, при этом код проходит квиктестовые тесты, а hpc говорит, что проблемное место посещается

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