Glad to hear these suggestions, @Geoffery.
I also have a question, this product has a clear binary protocol, do you
know how to port it to perl or perl6?
https://ignite.apache.org/docs/latest/binary-client-protocol/binary-client-protocol
I was using their python/ruby clients, but there is not a perl version.

Thanks.
Piper

On Tue, Jan 4, 2022 at 11:15 AM Geoffrey Broadwell <g...@sonic.net> wrote:

> I love doing binary codecs for Raku[1]!  How you approach this really
> depends on what formats and protocols you want to create Raku modules for.
>
> The first thing you need to be able to do is test if your codec is
> correct.  It is notoriously easy to make a tiny mistake in a protocol
> implementation and (especially for binary protocols) miss it entirely
> because it only happens in certain edge cases.
>
> If the format or protocol in question is open and has one or more public
> test suites, you're in good shape.  Raku gives a lot of power for
> refactoring tests to be very clean, and I've had good success doing this
> with several formats.
>
> If there is no public test suite, but you can find RFCs or other detailed
> specs, you can often bootstrap a bespoke test suite from the examples in
> the spec documents.  Failing that, sometimes you can find sites (even
> Wikipedia, for the most common formats) that have known-correct examples to
> start with, or have published reverse engineering of files or captured data.
>
> If the format is truly proprietary, you'll be getting lots of reverse
> engineering practice of your own. 😉
>
> Now that you have some way of testing correctness, you'll want to be able
> to diagnose the incorrect bits.  Make sure you have some way of presenting
> easily-readable text expansions of the binary format, because just
> comparing raw buffer contents can be rather tedious (though I admit to
> having found bugs in a public test suite by spending so much time staring
> at the buffers I could tell they'd messed up a translation in a way that
> made the test always pass).  If the format or protocol has an official text
> translation/diagnostic/debug format -- CBOR, BSON, Protobuf, etc. all have
> these -- so much the better, you should support that format as soon as
> practical.
>
> Once you get down to the nitty-gritty of writing the codec, I find it is
> very important to make it work before making it fast.  There is a lot of
> room for tuning Raku code, but it is WAY easier to get things going in the
> right direction by starting off with idiomatic Raku -- given/when,
> treating the data buffer as if it was a normal Array (Positional really),
> and so on.
>
> Make sure that with every protocol feature that you add, that you make
> tests newly pass, and (I find at least) that you write the coding and
> decoding bits at the same time, so you can check that you can round-trip
> data successfully.  For the love of all that is good, don't implement any
> obtuse features before the core features are rock solid and pass the test
> suite with nary a hiccup.
>
> After that, when you think you're ready to optimize, write performance
> *tests* first.  Make sure you test with data that will both use your
> codec in a typical manner, and also test out all the odd corners.  You're
> looking for things that seem weirdly slow; this usually indicates a thinko
> like copying the entire buffer each time you read a byte from it, or
> somesuch.
>
> Once you've got the obvious performance kinks worked out, come by and ask
> again, and we can give you further advice from there.  Or heck, just come
> visit us on IRC (#raku at Libera.chat), and we'll be happy to help.  (Do
> stick around for a while though, because traffic varies strongly by time of
> day and day of week.)
>
> Best Regards,
>
>
> Geoff (japhb)
>
>
> [1]  I'm a bit of a nut for it, really.  In the distant past, I wrapped C
> libraries to get the job done, but more recently I've done them as plain
> Raku code (and sometimes NQP, the language that Rakudo is written in).
>
> I've written some of the binary format codecs for Raku:
>
>    - https://github.com/japhb/CBOR-Simple
>    - https://github.com/japhb/BSON-Simple
>    - https://github.com/japhb/Terminal-ANSIParser
>    - https://github.com/japhb/TinyFloats
>
> Modified or tuned others:
>
>    - https://github.com/samuraisam/p6-pb/commits?author=japhb
>    - https://github.com/japhb/serializer-perf
>    - (Lots of stuff spread across various Cro
>    <https://github.com/croservices> repositories)
>
> Added a spec extension for an existing standardized format (CBOR):
>
>    - https://github.com/japhb/cbor-specs/blob/main/capture.md
>
> And I think I forgot a few things.  😁
>
>
>

Reply via email to