
@mark.piffer has joined the channel

does anyone have any recommendations for sparse bitmap implementation in racket?

Is there a racket implementation of binding arrows like (-<> (foo <> x y) (bar x <> y))
being equivalent to (lambda (a) (foo (bar x a y) x y)
?

Sparse bitmaps?
Maybe https://docs.racket-lang.org/images/flomap_title.html or simply math/array

Where is the -<> notation from?

integer sets more like… (ideally the roaring bitmap datastructure)

I think the original place is here [1] but I have used them in common lisp

The ~> operator supports holes.


Ah nice

I will delete the issue I just opened

:stuck_out_tongue:

thanks a lot

Also see the Qi package

how does one implement python’s enumerate()
?(enumerate(["a","b","c"]) == [(0,"a"),(1,"b"),(2,"c")]
only with iterators)

i mean is there a one-liner for such a thing?

(for ([x xs] [i (in-naturals)]) ...)

would’nt that do a cartesian product?

for*
is the cartesian product, otherwise they step together

aha

I assumed for*
was like let*

These days the * means “variation of” :slightly_smiling_face:

@cperivol There’s also in-indexed
, which is actually more like enumerate
in Python

Well, actually for*
is is like let*
in that it is a “nested” for
, just like let*
is a nested let

@cperivol - this reddit post I put together a while ago might be helpful wrt let
, let*
, and letrec
: https://www.reddit.com/r/Racket/comments/778qkf/let_let_and_letrec/dojzpqs/?context=3. If you already knew this, though, my apologies.
Anyway, like @sorawee stated, the *
adds nesting.

I am getting a weird error from raco install. I managed to narrow it down to the following (maybe) reproducible repl snippet
> (require net/url)
> (define-values (p hs) (get-pure-port/headers (string->url "<https://pkgs.racket-lang.org/pkg/threading-lib?version=8.3>") '() #:redirections 25 #:status? #t))
> (string->number (substring hs 9 12)) ;; network.rkt:67 uses this to come up with the status
#f
> (substring hs 9 12)
"#f)"
> hs
"re-log . #f) (success-log . " [...]
The problem seems to be that get-pure-port/headers
skips a few characters. Does anyone have any idea why this happens?

I get “200” as expected there

Ok, thanks a lot. I will keep looking

Ditto.
> (define-values (p hs) (get-pure-port/headers (string->url "<https://pkgs.racket-lang.org/pkg/threading-lib?version=8.3>") '() #:redirections 25 #:status? #t))
> p
#<input-port:pipe>
> hs
"HTTP/1.1 200 OK\r\nDate: Mon, 31 Jan 2022 17:46:26 GMT\r\nContent-Type: application/octet-stream\r\nContent-Length: 1747\r\nConnection: keep-alive\r\nx-amz-id-2: v/pb4Pq9Fl72c9d4ddPpN3flL9A2tZeanWvxRCK5P5Evp2WAjDHyJvSdLA9EIsAaIR8KVcfUJGE=\r\nx-amz-request-id: RRH4317BFV5HV79W\r\nlast-modified: Mon, 31 Jan 2022 16:46:25 GMT\r\netag: \"33d8d6ff3c02d13e11d5971a7692c4e1\"\r\nCF-Cache-Status: DYNAMIC\r\nExpect-CT: max-age=604800, report-uri=\"<https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct>\"\r\nReport-To: {\"endpoints\":[{\"url\":\"https:\/\/a.nel.cloudflare.com\/report\/v3?s=e8jAzF5OHSwFrMf7k7sy%2FtQEk60B9wGDjveLNdJE2sG%2BwfSY6IiXIYCmjGAcIebqYClp9iVS7P%2B4yGCgBG0XuYQrJ9LjUBFPm9zVtYCBWE2GtsHbqwzPfAio8U7dsQAETCNY2usJTg%3D%3D\"}],\"group\":\"cf-nel\",\"max_age\":604800}\r\nNEL: {\"success_fraction\":0,\"report_to\":\"cf-nel\",\"max_age\":604800}\r\nServer: cloudflare\r\nCF-RAY: 6d64c266ee14725e-HAM\r\nalt-svc: h3=\":443\"; ma=86400, h3-29=\":443\"; ma=86400\r\n\r\n"
> (string->number (substring hs 9 12))
200
> (substring hs 9 12)
"200"

Ah, that looks correct. It looks like in my case get-pure-port/headers
does not get the headers but rather the body

or half-the-body

Fwiw I used 7.5. > (version) “7.5”

8.3 here

> hs
"lure-log . #f) (success-log . \"server/built/install/threading-lib.txt\") (test-failure-log . #f) (test-success-log . \"server/built/test-success/threading-lib.txt\"))) (checksum . \"199c8e240146baf3ef2ef2838d7d9e242b90be4e\") (checksum-error . #f) (collection . (multi)) (conflicts . ()) (dependencies . ((\"base\" #:version \"6.3\"))) (description . \"implementation (no documentation) for "threading"\") (implies . ()) (last-checked . 1643650651) (last-edit . 1497305814) (last-updated . 1641582707) (modules . ((lib \"threading/main.rkt\"))) (name . \"threading-lib\") (ring . 1) (search-terms . #hasheq((:build-success: . #t) (:no-tag: . #t) (author:lexi.lambda@gmail.com . #t) (ring:1 . #t))) (source . \"<git://github.com/lexi-lambda/threading?path=threading-lib>\") (tags . ()) (versions . #hash((default . #hasheq((checksum . \"199c8e240146baf3ef2ef2838d7d9e242b90be4e\") (source . \"<git://github.com/lexi-lambda/threading?path=threading-lib>\") (source_url . \"<http://github.com/lexi-lambda/threading/tree/master?path=threading-lib>\"))) (\"6.2\" . #hasheq((checksum . \"dee85e8d3cffaed85eb27bed8a8c61fc1eea8395\") (source . \"<git://github.com/lexi-lambda/threading?path=threading-lib#compatibility-6.2>\") (source_url . \"<http://github.com/lexi-lambda/threading/tree/master?path=threading-lib#compatibility-6.2>\"))) (\"6.2.1\" . #hasheq((checksum . \"dee85e8d3cffaed85eb27bed8a8c61fc1eea8395\") (source . \"<git://github.com/lexi-lambda/threading?path=threading-lib#compatibility-6.2>\") (source_url . \"<http://github.com/lexi-lambda/threading/tree/master?path=threading-lib#compatibility-6.2>\"))))))HTTP/1.1 200 OK\r\nDate: Mon, 31 Jan 2022 17:57:19 GMT\r\nContent-Type: application/octet-stream\r\nContent-Length: 1747\r\nConnection: keep-alive\r\nx-amz-id-2: YFq193qSFpmuV2JV+s8FOsLMDQplCAwnH2B/+D0m5AF++3eiPEcWr4SJ6S2joKGTqgG76NyqNdQ=\r\nx-amz-request-id: 4F7SC64JGXYCX7BB\r\nlast-modified: Mon, 31 Jan 2022 17:57:14 GMT\r\netag: \"b6a9ee25b06796da6dc5e2792b4575cc\"\r\nCF-Cache-Status: DYNAMIC\r\nExpect-CT: max-age=604800, report-uri=\"<https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct>\"\r\nReport-To: {\"endpoints\":[{\"url\":\"https:\/\/a.nel.cloudflare.com\/report\/v3?s=Si6UiR4Yx%2FRq%2FEJKpT5kSerbmU%2FV4Y8FzCxDD8tjBjkhpfYdsvdtM5w5rextRTUUNsjy8Lrx6rgdp1GAx9QXfNz56fXJXB4zxPJR0IGuPVwis0k4j1zLpIDFFWNb6lXDCdjKZLhbgA%3D%3D\"}],\"group\":\"cf-nel\",\"max_age\":604800}\r\nNEL: {\"success_fraction\":0,\"report_to\":\"cf-nel\",\"max_age\":604800}\r\nServer: cloudflare\r\nCF-RAY: 6d64d25b9a0174c9-LHR\r\nalt-svc: h3=\":443\"; ma=86400, h3-29=\":443\"; ma=86400\r\n\r\n"

it appends the actual header at the end for some reason

I am on macOS if that makes a difference.

I’m on Linux

Is it just the threading package or do you see the same with other packages?

That’s odd I don’t get the HTTP response status line (“HTTP/1.1 200 OK\r\n”) but I get the rest i.e. the actual headers per se: > (define-values (p hs) (get-pure-port/headers (string->url "<https://pkgs.racket>
-<http://lang.org/pkg/threading-lib?version=8.3%22\|lang.org/pkg/threading-lib?version=8.3">)))
> hs
"Date: Mon, 31 Jan 2022 17:58:16 GMT\r\nContent-Type: application/octet-stream\r\nContent-Length: 1747\r\nConnection: keep-alive\r\nx-amz-id-2: 899CN69mw68Vgx3Rzx82IlGlmOTMq2+XXsCQcbPHsj9rvQ2brmCJ/qLn1RHIhxfS/WCJC0aM9pI=\r\nx-amz-request-id: MMZESJSMM3X2ESG7\r\nlast-modified: Mon, 31 Jan 2022 17:57:14 GMT\r\netag: \"b6a9ee25b06796da6dc5e2792b4575cc\"\r\nCF-Cache-Status: DYNAMIC\r\nExpect-CT: max-age=604800, report-uri=\"<https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct>\"\r\nReport-To: {\"endpoints\":[{\"url\":\"https:\/\/a.nel.cloudflare.com\/report\/v3?s=IYKx%2FfyEoExw4aKkLurWA7byhZiKrJfr5XHiCU2QlpQs9qWEw3OpGGmmnFujFdRkggF%2B5CptiRhLbikdEy3X5Z1vp%2FrOc83RNwKTyxdFem5JRBLe%2FzLIiNLRjONmka55x%2B6yj3tI0A%3D%3D\"}],\"group\":\"cf-nel\",\"max_age\":604800}\r\nNEL: {\"success_fraction\":0,\"report_to\":\"cf-nel\",\"max_age\":604800}\r\nServer: cloudflare\r\nCF-RAY: 6d64d3bce84618ea-EWR\r\nalt-svc: h3=\":443\"; ma=86400, h3-29=\":443\"; ma=86400\r\n\r\n"
> (version)
"8.3.0.11"
> (system-type)
'unix

Could it be related to CloudFlare?

I’m not sure why in your examples @christos.perivolaropo it looks like an association list but in ours it looks like the raw string. Do you have some other code involved?

Maybe fetch the same url with curl and compare?

I do not the code I showed is in a fresh repl

Curl returns the assoc list string

$ curl <https://pkgs.racket-lang.org/pkg/threading-lib?version=8.3>
#hasheq((author . "<mailto:lexi.lambda@gmail.com\|lexi.lambda@gmail.com>") (authors . ("<mailto:lexi.lambda@gmail.com\|lexi.lambda@gmail.com>")) (build . #hash((conflicts-log . #f) (dep-failure-log . #f) (docs . ()) (failure-log . #f) (min-failure-log . #f) (success-log . "server/built/install/threading-lib.txt") (test-failure-log . #f) (test-success-log . "server/built/test-success/threading-lib.txt"))) (checksum . "199c8e240146baf3ef2ef2838d7d9e242b90be4e") (checksum-error . #f) (collection . (multi)) (conflicts . ()) (dependencies . (("base" #:version "6.3"))) (description . "implementation (no documentation) for "threading"") (implies . ()) (last-checked . 1643650651) (last-edit . 1497305814) (last-updated . 1641582707) (modules . ((lib "threading/main.rkt"))) (name . "threading-lib") (ring . 1) (search-terms . #hasheq((:build-success: . #t) (:no-tag: . #t) (author:lexi.lambda@gmail.com . #t) (ring:1 . #t))) (source . "<git://github.com/lexi-lambda/threading?path=threading-lib>") (tags . ()) (versions . #hash((default . #hasheq((checksum . "199c8e240146baf3ef2ef2838d7d9e242b90be4e") (source . "<git://github.com/lexi-lambda/threading?path=threading-lib>") (source_url . "<http://github.com/lexi-lambda/threading/tree/master?path=threading-lib>"))) ("6.2" . #hasheq((checksum . "dee85e8d3cffaed85eb27bed8a8c61fc1eea8395") (source . "<git://github.com/lexi-lambda/threading?path=threading-lib#compatibility-6.2>") (source_url . "<http://github.com/lexi-lambda/threading/tree/master?path=threading-lib#compatibility-6.2>"))) ("6.2.1" . #hasheq((checksum . "dee85e8d3cffaed85eb27bed8a8c61fc1eea8395") (source . "<git://github.com/lexi-lambda/threading?path=threading-lib#compatibility-6.2>") (source_url . "<http://github.com/lexi-lambda/threading/tree/master?path=threading-lib#compatibility-6.2>"))))))

> That’s odd I don’t get the HTTP response status line (“HTTP/1.1 200 OK\r\n”) but I get the rest i.e. the actual headers per se Derp that’s because I omitted the #:status?
flag.

> (define-values (p hs) (get-pure-port/headers (string->url "<https://www.example.com>") '() #:redirections 25 #:status? #t))
> hs
"<!doctype html>\r\n<html>\r\n<head>\r\n <title>Example Domain</title>\r\n\r\n"
>


The Racket association list for the response body makes sense.

I’ll try …

> (define-values (p hs) (get-pure-port/headers (string->url "<https://www.example>
.com") '() #:redirections 25 #:status? #t))
> hs
"HTTP/1.1 200 OK\r\nAge: 486522\r\nCache-Control: max-age=604800\r\nContent-Type: text/html; charset=UTF-8\r\nDate: Mon, 31 Jan 2022 18:08:51 GMT\r\nEtag: \"3147526947+ident\"\r\nExpires: Mon, 07 Feb 2022 18:08:51 GMT\r\nLast-Modified: Thu, 17 Oct 2019 07:18:26 GMT\r\nServer: ECS (bsa/EB15)\r\nVary: Accept-Encoding\r\nX-Cache: HIT\r\nContent-Length: 1256\r\n\r\n"
>

ok…

> (require racket/port)
> (port->string p)
"<!doctype html>\n<html>\n<head>\n <title>Example Domain</title>\n\n <meta charset=\"utf-8\" />\n <meta http-equiv=\"Content-type\" content=\"text/html; charset=utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <style type=\"text/css\">\n body {\n background-color: #f0f0f2;\n margin: 0;\n padding: 0;\n font-family: -apple-system, system-ui, BlinkMacSystemFont, \"Segoe UI\", \"Open Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n \n }\n div {\n width: 600px;\n margin: 5em auto;\n padding: 2em;\n background-color: #fdfdff;\n border-radius: 0.5em;\n box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02);\n }\n a:link, a:visited {\n color: #38488f;\n text-decoration: none;\n }\n @media (max-width: 700px) {\n div {\n margin: 0 auto;\n width: auto;\n }\n }\n </style> \n</head>\n\n<body>\n<div>\n <h1>Example Domain</h1>\n <p>This domain is for use in illustrative examples in documents. You may use this\n domain in literature without prior coordination or asking for permission.</p>\n <p><a href=\"<https://www.iana.org/domains/example>\">More information...</a></p>\n</div>\n</body>\n</html>\n"

What if you omit #:redirections 25
?

Or supply #:redirections 0
(same difference).


No difference… I just remembered, I am using a proxy

but I can’t get around it

One of your examples above seems to have the headers … but after the body :eyes: https://racket.slack.com/archives/C06V96CKX/p1643651873897199?thread_ts=1643651087.419999&cid=C06V96CKX

It does

But I can’t tell why…

@christos.perivolaropo Is this in a terminal?

Yes

Which is.. very confusing. :smile:

It’s in a terminal

It’s kind of a non-answer, lateral, work-around, but: Instead of net/url
you could try the newer net/http-client
and see if/how that works. https://docs.racket-lang.org/net/http-client.html

Although, it looks like net/url
was re-implemented in terms of net/http-client
, so, the behavior might be similar unless there is something about get-pure-port/headers
specifically that is causing this (quick glance I don’t see what it could be).

I am trying that now

Actually I am trying to just get the headers via net/http-client

If you’re still stuck, my only other idea would be to use one of the net/http-client
functions that accepts a #:version
argument and supply “1.0”. The idea being, HTTP 1.1 introduces the possibility of wrinkles like reusing connections, chunked transfer encoding, and so on. All of which can be more efficient, but could allow some bug to be having an effect here. e.g. Reusing a connection and a bug with Content-Length could maybe somehow allow the body of one response to be mixed up with the header for the next one… or something like that??

Btw - is it possible to temporarily disable the proxy? Just to see if that’s the cause.

I think Christos said they couldn’t, above.

Ok.

(That is one thing I actually read instead of ignoring like some of my previous comments. :eyes:)

Make an FFI binding to the C version of Roaring Bitmaps? :stuck_out_tongue: (I honestly have no idea how much work that would be)

Oh boy - and I thought the question was about sparse images. Anyways, the Roaring Bitmap project seems to be written with FFI bindings in mind - and there are already a lot of bindings for other languages. So it is probably not too difficult to wrap the C version.

When I load a hash table from disk (using fasl->s-exp
), it’s loaded as immutable. How can I make it mutable (or load it that way)?

Also, is there a better way to save/load a hash table?

|> hash->list |> make-hash

I’d rather not given the size of it (it’s > 1 GB of RAM)

welp

It’s not just a simple bit in the hash table saying “i’m mutable”?

They use totally different data structures

IIUC, one is Patricia tree. Another is HAMT.

well, it was written to disk as a mutable hash. Why isn’t it loaded using the same data structure it was written with?

I’d assume s-exp->fasl
encodes the type, and fasl->s-exp
makes use of that? Maybe there’s a better way to write (other than me doing it by hand)?

TBH, I’d just do it by hand.

:confused:

Wait, actually, looks like I got the details wrong about the data structures

HAMT is used as an implementation for immutable hash table in Racket BC

Patricia trie is used as an implementation for immutable hash table in Racket CS

I have no idea what mutable hash table uses, and whether they are different in each Racket variant.

Does it still use a trie even if the keys aren’t strings?

No idea.

The mutable hash tables in Racket wraps the hash tables of CS. https://github.com/racket/racket/blob/master/racket/src/cs/rumble/hash.ss\|https://github.com/racket/racket/blob/master/racket/src/cs/rumble/hash.ss

Possible for the same reason that mutable hashes print as immutable hashes (so that when read, they are immutable)? Not saying this is correct or why it is the case, just suggesting that the reasons are connected.

I’d hope it’s written as binary for performance reasons and not in a “readable” format. :wink:

Like pickle
in Python

Well, sure, but that binary format might be a compressed version of the read
able format? IIRC fasl doesn’t support cyclic data either, right?

> The _v_ argument must be a value that could be https://docs.racket-lang.org/reference/quote.html#%28form._%28%28quote._~23~25kernel%29._quote%29%29\|quoted as a literal—that is, a value without syntax objects for which (https://docs.racket-lang.org/reference/eval.html#%28def._%28%28quote._~23~25kernel%29._compile%29%29\|compile `’,v) would work and be https://docs.racket-lang.org/reference/Reading.html#%28def._%28%28quote._~23~25kernel%29._read%29%29\|readable after https://docs.racket-lang.org/reference/Writing.html#%28def._%28%28quote._~23~25kernel%29._write%29%29\|write—or it can include <https://docs.racket-lang.org/reference/linklets.html#%28tech._correlated._object%29|correlated objects> mixed with those values. The byte string produced by https://docs.racket-lang.org/reference/fasl.html#%28def._%28%28lib._racket%2Ffasl..rkt%29._s-exp-~3efasl%29%29\|s-exp-fasl> does not use the same format as compiled code, however.

@massung That’s serialization, not write
ing

Was just about to quote: > Like (https://docs.racket-lang.org/reference/eval.html#%28def._%28%28quote._~23~25kernel%29._compile%29%29\|compile `’,v), https://docs.racket-lang.org/reference/fasl.html#%28def._%28%28lib._racket%2Ffasl..rkt%29._s-exp-~3efasl%29%29\|s-exp-fasl> does not preserve graph structure, support cycles, or handle non-https://docs.racket-lang.org/reference/structures.html#%28tech._prefab%29\|prefab structures. Compose https://docs.racket-lang.org/reference/fasl.html#%28def._%28%28lib._racket%2Ffasl..rkt%29._s-exp-~3efasl%29%29\|s-exp-fasl> with https://docs.racket-lang.org/reference/serialization.html#%28def._%28%28lib._racket%2Fprivate%2Fserialize..rkt%29._serialize%29%29\|serialize to preserve graph structure, handle cyclic data, and encode serializable structures. The https://docs.racket-lang.org/reference/fasl.html#%28def._%28%28lib._racket%2Ffasl..rkt%29._s-exp-~3efasl%29%29\|s-exp-fasl> and https://docs.racket-lang.org/reference/fasl.html#%28def._%28%28lib._racket%2Ffasl..rkt%29._fasl-~3es-exp%29%29\|fasl-s-exp> functions consult https://docs.racket-lang.org/reference/Writing.html#%28def._%28%28quote._~23~25kernel%29._current-write-relative-directory%29%29\|current-write-relative-directory and https://docs.racket-lang.org/reference/eval.html#%28def._%28%28quote._~23~25kernel%29._current-load-relative-directory%29%29\|current-load-relative-directory (falling back to https://docs.racket-lang.org/reference/Filesystem.html#%28def._%28%28quote._~23~25kernel%29._current-directory%29%29\|current-directory), respectively, in the same way as bytecode saving and loading to store paths in relative form, and they similarly allow and convert constrained https://docs.racket-lang.org/reference/exns.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._srcloc%29%29\|srcloc values (see <https://docs.racket-lang.org/reference/printing.html#%28part._print-compiled%29|Printing Compiled Code>).

Which mentions serialize

Also > Unless _keep-mutable?_ is provided as true to https://docs.racket-lang.org/reference/fasl.html#%28def._%28%28lib._racket%2Ffasl..rkt%29._s-exp-~3efasl%29%29\|s-exp-fasl>, then mutable values in _v_ are replaced by immutable values when the result is decoded by https://docs.racket-lang.org/reference/fasl.html#%28def._%28%28lib._racket%2Ffasl..rkt%29._fasl-~3es-exp%29%29\|fasl-s-exp>. Unless _datum-intern?_ is provided as #f, then any immutable value produced by https://docs.racket-lang.org/reference/fasl.html#%28def._%28%28lib._racket%2Ffasl..rkt%29._fasl-~3es-exp%29%29\|fasl-s-exp> is filtered by https://docs.racket-lang.org/reference/stxops.html#%28def._%28%28quote._~23~25kernel%29._datum-intern-literal%29%29\|datum-intern-literal. The defaults make the composition of https://docs.racket-lang.org/reference/fasl.html#%28def._%28%28lib._racket%2Ffasl..rkt%29._s-exp-~3efasl%29%29\|s-exp-fasl> and https://docs.racket-lang.org/reference/fasl.html#%28def._%28%28lib._racket%2Ffasl..rkt%29._fasl-~3es-exp%29%29\|fasl-s-exp> behave like the composition of https://docs.racket-lang.org/reference/Writing.html#%28def._%28%28quote._~23~25kernel%29._write%29%29\|write and https://docs.racket-lang.org/reference/Reading.html#%28def._%28%28quote._~23~25kernel%29._read%29%29\|read.

I missed the keep-mutable?
flag! :face_palm:

λ racket -e '(require qi racket/fasl) (~> ((make-hash (list (cons 1 2) (cons 3 4)))) (s-exp->fasl #:keep-mutable? #t) fasl->s-exp immutable?)'
#f

Me too :slightly_smiling_face:

I believe the current implementation of immutable hash tables is HAMT backed by stencil vectors (https://www.cs.utah.edu/plt/publications/dls21-tzf.pdf\|https://www.cs.utah.edu/plt/publications/dls21-tzf.pdf)

@laurent.orseau - I don’t consider fasl files to be “writing” (e.g. make-load-form
in common lisp). And the serialize
/deserialize
functions in Racket are f’ing insane. They blow memory (used > 18 GB of RAM to write a 500 MB data structure before I killed it) and take forever.

On both BC and CS, mutable hash tables are the usual kinds of hash tables you learn about in data structures class, using buckets and chaining

fair enough

(I tried the serialize/deserialize first, then found the s-exp->fasl
functions)

Oh yeah, that makes sense. The tree structure is only needed for persistency.

Wow, I didn’t even know about that paper.

It was published very recently at DLS

Yeah, but months ago

(personal account of @christos.perivolaropo here) It does indeed work fine from my home network :face_palm:

I can’t disable the proxy from my work network unfortunately. I will give it another go tomorrow. Thanks a lot for your time and effort