home.social

#thingumbrella — Public Fediverse posts

Live and recent posts from across the Fediverse tagged #thingumbrella, aggregated by home.social.

  1. #ReleaseThursday Happy to announce that thi.ng/units finally has a little CLI wrapper to perform not only simple unit conversions, but also more advanced calculations, using the existing Lisp-like S-expression based DSL and built-in units and constants.

    docs.thi.ng/umbrella/units/#cl

    The CLI also provides a list command to print out the 172 built-in units, their canonical symbol, any aliases and full names. The output can also be filtered via optional regexp pattern. See attached readme screenshots & more advanced linked example:

    mastodon.thi.ng/@toxi/11604322

    Hope some of you find this as useful as I do! Any questions, please ask!

    #ThingUmbrella #UnitConversion #CLI #Calculator #TypeScript #Lisp #DSL #OpenSource

  2. #ReleaseThursday Happy to announce that thi.ng/units finally has a little CLI wrapper to perform not only simple unit conversions, but also more advanced calculations, using the existing Lisp-like S-expression based DSL and built-in units and constants.

    docs.thi.ng/umbrella/units/#cl

    The CLI also provides a list command to print out the 172 built-in units, their canonical symbol, any aliases and full names. The output can also be filtered via optional regexp pattern. See attached readme screenshots & more advanced linked example:

    mastodon.thi.ng/@toxi/11604322

    Hope some of you find this as useful as I do! Any questions, please ask!

    #ThingUmbrella #UnitConversion #CLI #Calculator #TypeScript #Lisp #DSL #OpenSource

  3. #ReleaseThursday Happy to announce that thi.ng/units finally has a little CLI wrapper to perform not only simple unit conversions, but also more advanced calculations, using the existing Lisp-like S-expression based DSL and built-in units and constants.

    docs.thi.ng/umbrella/units/#cl

    The CLI also provides a list command to print out the 172 built-in units, their canonical symbol, any aliases and full names. The output can also be filtered via optional regexp pattern. See attached readme screenshots & more advanced linked example:

    mastodon.thi.ng/@toxi/11604322

    Hope some of you find this as useful as I do! Any questions, please ask!

    #ThingUmbrella #UnitConversion #CLI #Calculator #TypeScript #Lisp #DSL #OpenSource

  4. #ReleaseThursday Happy to announce that thi.ng/units finally has a little CLI wrapper to perform not only simple unit conversions, but also more advanced calculations, using the existing Lisp-like S-expression based DSL and built-in units and constants.

    docs.thi.ng/umbrella/units/#cl

    The CLI also provides a list command to print out the 172 built-in units, their canonical symbol, any aliases and full names. The output can also be filtered via optional regexp pattern. See attached readme screenshots & more advanced linked example:

    mastodon.thi.ng/@toxi/11604322

    Hope some of you find this as useful as I do! Any questions, please ask!

    #ThingUmbrella #UnitConversion #CLI #Calculator #TypeScript #Lisp #DSL #OpenSource

  5. #ReleaseThursday Happy to announce that thi.ng/units finally has a little CLI wrapper to perform not only simple unit conversions, but also more advanced calculations, using the existing Lisp-like S-expression based DSL and built-in units and constants.

    docs.thi.ng/umbrella/units/#cl

    The CLI also provides a list command to print out the 172 built-in units, their canonical symbol, any aliases and full names. The output can also be filtered via optional regexp pattern. See attached readme screenshots & more advanced linked example:

    mastodon.thi.ng/@toxi/11604322

    Hope some of you find this as useful as I do! Any questions, please ask!

    #ThingUmbrella #UnitConversion #CLI #Calculator #TypeScript #Lisp #DSL #OpenSource

  6. #ReleaseMonday Yesterday, I took the plunge and updated all 215 thi.ng/umbrella packages (plus examples) for TypeScript 6.0, then released new versions just now this morning. After previous preparations and some initial struggles, it thankfully only involved updates to tsconfig.json files (accompanied by a lot of head scratching).

    I'm still confused about the new behavior of TS6 now defaulting to an empty types array[1] in compilerOptions, meaning one has to explicitly state, e.g. "types": ["node"] now, seemingly for any dependent package as well. The latter is the confusing part to me!

    For example, the thi.ng/errors package requires NodeJS type definitions for doing some pre-checks, but because of that, any dependent package has to specify the "types": ["node"] option too now (so it seems...), even if the dependent package itself does not use NodeJS types... If this compiler option isn't given, you'll get errors like Cannot find namespace 'NodeJS' when compiling the downstream package. I find this transitive requirement super weird & nonsense! I also mention it, because it will likely impact your own codebase as well... Please report back, if you could! 🙏

    [1] typescriptlang.org/docs/handbo

    #ThingUmbrella #TypeScript #OpenSource #Maintenance

  7. #ReleaseFriday Triggered by a recent feature proposal[1], I went ahead and polished & published a closely related, already work-in-progress (but still private) feature in thi.ng/rdom to support something I call "bare lists"[2]. I've started working on this for another project last year, but needed to do more testing (which I think have sufficiently done by now).

    These "bare" lists are managed reactive control components which attach items directly to the list's parent DOM element instead of first creating a wrapper/container element for the items and so avoid introducing additional nesting.

    There're many use cases where this additional nesting was a real problem with the earlier approach, e.g. in containers with CSS grid or flex layout, tables, or generally situations where we want to have static & reactive list items as true siblings...

    The new version of thi.ng/rdom is technically a breaking change (sorry!), but the actual changes required (for you) are tiny and purely limited to the $list() and $klist() component function calls, which are now accepting a parameter object instead of positional args for the different possible behaviors. Of course, lists with item wrapper elements can still be created too, just as before (but via new args).

    I've updated & tested all existing examples impacted by this change and also created a new fully commented example project (example #187) to illustrate these "bare" lists in situ (check the DOM inspector to see the shallow structure and how updates are applied):

    Demo:
    demo.thi.ng/umbrella/rdom-bare

    Source code:
    codeberg.org/thi.ng/umbrella/s

    [1] github.com/thi-ng/umbrella/discussions/562
    [2] My use of "list" here is generic, not limited to <ul> or <ol>...

    #ThingUmbrella #Reactive #UI #OpenSource #TypeScript #JavaScript #WebDev

  8. #ReleaseFriday Triggered by a recent feature proposal[1], I went ahead and polished & published a closely related, already work-in-progress (but still private) feature in thi.ng/rdom to support something I call "bare lists"[2]. I've started working on this for another project last year, but needed to do more testing (which I think have sufficiently done by now).

    These "bare" lists are managed reactive control components which attach items directly to the list's parent DOM element instead of first creating a wrapper/container element for the items and so avoid introducing additional nesting.

    There're many use cases where this additional nesting was a real problem with the earlier approach, e.g. in containers with CSS grid or flex layout, tables, or generally situations where we want to have static & reactive list items as true siblings...

    The new version of thi.ng/rdom is technically a breaking change (sorry!), but the actual changes required (for you) are tiny and purely limited to the $list() and $klist() component function calls, which are now accepting a parameter object instead of positional args for the different possible behaviors. Of course, lists with item wrapper elements can still be created too, just as before (but via new args).

    I've updated & tested all existing examples impacted by this change and also created a new fully commented example project (example #187) to illustrate these "bare" lists in situ (check the DOM inspector to see the shallow structure and how updates are applied):

    Demo:
    demo.thi.ng/umbrella/rdom-bare

    Source code:
    codeberg.org/thi.ng/umbrella/s

    [1] github.com/thi-ng/umbrella/discussions/562
    [2] My use of "list" here is generic, not limited to <ul> or <ol>...

    #ThingUmbrella #Reactive #UI #OpenSource #TypeScript #JavaScript #WebDev

  9. #ReleaseFriday Triggered by a recent feature proposal[1], I went ahead and polished & published a closely related, already work-in-progress (but still private) feature in thi.ng/rdom to support something I call "bare lists"[2]. I've started working on this for another project last year, but needed to do more testing (which I think have sufficiently done by now).

    These "bare" lists are managed reactive control components which attach items directly to the list's parent DOM element instead of first creating a wrapper/container element for the items and so avoid introducing additional nesting.

    There're many use cases where this additional nesting was a real problem with the earlier approach, e.g. in containers with CSS grid or flex layout, tables, or generally situations where we want to have static & reactive list items as true siblings...

    The new version of thi.ng/rdom is technically a breaking change (sorry!), but the actual changes required (for you) are tiny and purely limited to the $list() and $klist() component function calls, which are now accepting a parameter object instead of positional args for the different possible behaviors. Of course, lists with item wrapper elements can still be created too, just as before (but via new args).

    I've updated & tested all existing examples impacted by this change and also created a new fully commented example project (example #187) to illustrate these "bare" lists in situ (check the DOM inspector to see the shallow structure and how updates are applied):

    Demo:
    demo.thi.ng/umbrella/rdom-bare

    Source code:
    codeberg.org/thi.ng/umbrella/s

    [1] github.com/thi-ng/umbrella/discussions/562
    [2] My use of "list" here is generic, not limited to <ul> or <ol>...

    #ThingUmbrella #Reactive #UI #OpenSource #TypeScript #JavaScript #WebDev

  10. #ReleaseFriday Triggered by a recent feature proposal[1], I went ahead and polished & published a closely related, already work-in-progress (but still private) feature in thi.ng/rdom to support something I call "bare lists"[2]. I've started working on this for another project last year, but needed to do more testing (which I think have sufficiently done by now).

    These "bare" lists are managed reactive control components which attach items directly to the list's parent DOM element instead of first creating a wrapper/container element for the items and so avoid introducing additional nesting.

    There're many use cases where this additional nesting was a real problem with the earlier approach, e.g. in containers with CSS grid or flex layout, tables, or generally situations where we want to have static & reactive list items as true siblings...

    The new version of thi.ng/rdom is technically a breaking change (sorry!), but the actual changes required (for you) are tiny and purely limited to the $list() and $klist() component function calls, which are now accepting a parameter object instead of positional args for the different possible behaviors. Of course, lists with item wrapper elements can still be created too, just as before (but via new args).

    I've updated & tested all existing examples impacted by this change and also created a new fully commented example project (example #187) to illustrate these "bare" lists in situ (check the DOM inspector to see the shallow structure and how updates are applied):

    Demo:
    demo.thi.ng/umbrella/rdom-bare

    Source code:
    codeberg.org/thi.ng/umbrella/s

    [1] github.com/thi-ng/umbrella/discussions/562
    [2] My use of "list" here is generic, not limited to <ul> or <ol>...

    #ThingUmbrella #Reactive #UI #OpenSource #TypeScript #JavaScript #WebDev

  11. #ReleaseFriday Triggered by a recent feature proposal[1], I went ahead and polished & published a closely related, already work-in-progress (but still private) feature in thi.ng/rdom to support something I call "bare lists"[2]. I've started working on this for another project last year, but needed to do more testing (which I think have sufficiently done by now).

    These "bare" lists are managed reactive control components which attach items directly to the list's parent DOM element instead of first creating a wrapper/container element for the items and so avoid introducing additional nesting.

    There're many use cases where this additional nesting was a real problem with the earlier approach, e.g. in containers with CSS grid or flex layout, tables, or generally situations where we want to have static & reactive list items as true siblings...

    The new version of thi.ng/rdom is technically a breaking change (sorry!), but the actual changes required (for you) are tiny and purely limited to the $list() and $klist() component function calls, which are now accepting a parameter object instead of positional args for the different possible behaviors. Of course, lists with item wrapper elements can still be created too, just as before (but via new args).

    I've updated & tested all existing examples impacted by this change and also created a new fully commented example project (example #187) to illustrate these "bare" lists in situ (check the DOM inspector to see the shallow structure and how updates are applied):

    Demo:
    demo.thi.ng/umbrella/rdom-bare

    Source code:
    codeberg.org/thi.ng/umbrella/s

    [1] github.com/thi-ng/umbrella/discussions/562
    [2] My use of "list" here is generic, not limited to <ul> or <ol>...

    #ThingUmbrella #Reactive #UI #OpenSource #TypeScript #JavaScript #WebDev

  12. #ReleaseSaturday 🚀 — Just pushed the new version of thi.ng/hiccup-carbon-icons (now a much larger collection of 2200+ icons, mentioned yesterday[1]) and some other smaller updates/additions to other packages...

    This is the last release before switching all packages to the recently released TypeScript 6.0, support for which will likely require some restructuring & refactoring and hopefully will be less painful than it might look so far (I'm also waiting for some dependencies to update their TS type definitions, which are currently breaking, e.g. github.com/serialport/node-ser, used for thi.ng/axidraw)

    I also added some new async operators for thi.ng/transducers-async to simplify some stream processing tasks (e.g. collecting and/or consuming stdout/stderr of a child process by rechunking the stream for line-based processing), for example:

    ```
    import { rechunk } from "@thi.ng/transducers-async";
    import { spawn } from "child_process";

    // launch child process
    const child = spawn("ls", ["-l"]);

    // split child's stdout into single lines
    for await(let line of rechunk(/\r?\n/g, child.stdout)) {
    console.log("output", line);
    }
    ```

    [1] mastodon.thi.ng/@toxi/11642201

    #ThingUmbrella #OpenSource #Maintenance #TypeScript #JavaScript #Transducers #Async #Icons

  13. Added, updated & simplified the growing collection of darkroom-related calculators and super happy how elegant and concise the code has turned out, making it super easy to add more of them in the future.

    I think it's also another great, if minimal, example to illustrate how otherwise completely separate thi.ng/umbrella packages can seamlessly compose/combine to enable a reactive dataflow UI, all without the need for any virtual DOMs and/or completely over-the-top frameworks like React & co. It's also doing so via mostly JS-native data structures for declaring the UI (plain objects/arrays/iterables) and various constructs directly managing the reactive value streams, thus providing a lot more finegrained control over UI updates/timing/throttling). Any value changes done by the user only trigger specific, pin-point calculations which then result in equally specific UI updates to show new results. Any user action only ever triggers the minimum amount of work needed to reflect the new state.

    Calculators:
    demo.thi.ng/umbrella/darkroom-

    Source code:
    codeberg.org/thi.ng/umbrella/s

    The attached images show the source code of the entire main app (UI root) and one of the calculators...

    Ps. Please let me know if you'd like to see more of these posts in the future. I'm tempted to launch season 2 of #HowToThing (see link below for 30 previous mini projects/tutorials) — but since this is very time consuming to produce & document these projects/examples, and because there has been _very little feedback_ to these previous projects/posts, I first need to gauge interest... Thank you! 🫶

    codeberg.org/thi.ng/umbrella#h

    #ThingUmbrella #Darkroom #Calculator #Tool #Reactive #UI #WebDev #TypeScript #JavaScript #OpenSource

  14. tl;dr Using thi.ng/column-store to accelerate tag intersection queries by a factor of 880x...

    Working on the static website generator/export plugin for my personal knowledge tool has been one of the main projects this past month. A key part of this setup is tagging, not just simple flat keywords/categories, but actually treating tags as sets. The system doesn't just allow browsing content by a single tag, but also supports adding (or removing) tags to narrow or widen the current topic. E.g. The combination of "3d + geometry + typescript" would select only works which have all of these three tags...

    In the local version of my tool there's no limit to the number of tags (and it also supports tag negation), but for the static site generation I have to limit the set size (due to combinatoric explosion) and pre-compute all possible permutations, then create HTML documents for each these individual combinations which actually produce results.

    So far I'm having ~400 unique tags in use, meaning if I want to aim for a max set size of 3, there're theoretically ~64,000,000 possibilities to check[1]! For the roughly 3500 content items used for testing, a naive JS approach to filter the result array and only retain items matching the entire current permutation is so extremely slow, that I stopped the process after 3.5 minutes just for the first 250k (aka 0.4%) of the 64 million permutations, i.e. at that rate the full process would have taken ~15 hours, pretty slow for a SSG... :)

    Naive approach 🫣:

    ```
    permutation = ["3d", "geometry", "typescript"]
    results.filter(item => permutation.every(tag => item.tags.includes(tag)))
    ```

    But since I'm using thi.ng/column-store as my database, such queries can be optimized by a few magnitudes, since here these intersection queries are applied only to bitfields (explained in the pkg readme). This results in all 64+ million permutations being processed in just 62 seconds (1+ million per second). Quite the difference, i.e. ~880x faster than the above approach!

    Also, of these 64 million initial possibilities, there're fewer unique ones (excluding duplicates and ignoring ordering), and currently only ~24,000 are actually producing a result. Still, that's 24,000 index pages to generate & host and it's, of course, far, far too much!

    So I will have to also spend more effort curating and severely reducing the tag vocabulary, at least the subset used for the website. On the other hand, I think this system will really help with browsing this large body/archive of work much more meaningfully than the boring single-tag/category approach most websites are offering. And it will do so without any backend (other than file hosting)...

    [1] Permutations = 400 + 400^2 + 400^3

    #ThingUmbrella #Tagging #Intersection #Query #Bitfield #WebDev #JavaScript #TypeScript #Optimization

  15. tl;dr Using thi.ng/column-store to accelerate tag intersection queries by a factor of 880x...

    Working on the static website generator/export plugin for my personal knowledge tool has been one of the main projects this past month. A key part of this setup is tagging, not just simple flat keywords/categories, but actually treating tags as sets. The system doesn't just allow browsing content by a single tag, but also supports adding (or removing) tags to narrow or widen the current topic. E.g. The combination of "3d + geometry + typescript" would select only works which have all of these three tags...

    In the local version of my tool there's no limit to the number of tags (and it also supports tag negation), but for the static site generation I have to limit the set size (due to combinatoric explosion) and pre-compute all possible permutations, then create HTML documents for each these individual combinations which actually produce results.

    So far I'm having ~400 unique tags in use, meaning if I want to aim for a max set size of 3, there're theoretically ~64,000,000 possibilities to check[1]! For the roughly 3500 content items used for testing, a naive JS approach to filter the result array and only retain items matching the entire current permutation is so extremely slow, that I stopped the process after 3.5 minutes just for the first 250k (aka 0.4%) of the 64 million permutations, i.e. at that rate the full process would have taken ~15 hours, pretty slow for a SSG... :)

    Naive approach 🫣:

    ```
    permutation = ["3d", "geometry", "typescript"]
    results.filter(item => permutation.every(tag => item.tags.includes(tag)))
    ```

    But since I'm using thi.ng/column-store as my database, such queries can be optimized by a few magnitudes, since here these intersection queries are applied only to bitfields (explained in the pkg readme). This results in all 64+ million permutations being processed in just 62 seconds (1+ million per second). Quite the difference, i.e. ~880x faster than the above approach!

    Also, of these 64 million initial possibilities, there're fewer unique ones (excluding duplicates and ignoring ordering), and currently only ~24,000 are actually producing a result. Still, that's 24,000 index pages to generate & host and it's, of course, far, far too much!

    So I will have to also spend more effort curating and severely reducing the tag vocabulary, at least the subset used for the website. On the other hand, I think this system will really help with browsing this large body/archive of work much more meaningfully than the boring single-tag/category approach most websites are offering. And it will do so without any backend (other than file hosting)...

    [1] Permutations = 400 + 400^2 + 400^3

    #ThingUmbrella #Tagging #Intersection #Query #Bitfield #WebDev #JavaScript #TypeScript #Optimization

  16. tl;dr Using thi.ng/column-store to accelerate tag intersection queries by a factor of 880x...

    Working on the static website generator/export plugin for my personal knowledge tool has been one of the main projects this past month. A key part of this setup is tagging, not just simple flat keywords/categories, but actually treating tags as sets. The system doesn't just allow browsing content by a single tag, but also supports adding (or removing) tags to narrow or widen the current topic. E.g. The combination of "3d + geometry + typescript" would select only works which have all of these three tags...

    In the local version of my tool there's no limit to the number of tags (and it also supports tag negation), but for the static site generation I have to limit the set size (due to combinatoric explosion) and pre-compute all possible permutations, then create HTML documents for each these individual combinations which actually produce results.

    So far I'm having ~400 unique tags in use, meaning if I want to aim for a max set size of 3, there're theoretically ~64,000,000 possibilities to check[1]! For the roughly 3500 content items used for testing, a naive JS approach to filter the result array and only retain items matching the entire current permutation is so extremely slow, that I stopped the process after 3.5 minutes just for the first 250k (aka 0.4%) of the 64 million permutations, i.e. at that rate the full process would have taken ~15 hours, pretty slow for a SSG... :)

    Naive approach 🫣:

    ```
    permutation = ["3d", "geometry", "typescript"]
    results.filter(item => permutation.every(tag => item.tags.includes(tag)))
    ```

    But since I'm using thi.ng/column-store as my database, such queries can be optimized by a few magnitudes, since here these intersection queries are applied only to bitfields (explained in the pkg readme). This results in all 64+ million permutations being processed in just 62 seconds (1+ million per second). Quite the difference, i.e. ~880x faster than the above approach!

    Also, of these 64 million initial possibilities, there're fewer unique ones (excluding duplicates and ignoring ordering), and currently only ~24,000 are actually producing a result. Still, that's 24,000 index pages to generate & host and it's, of course, far, far too much!

    So I will have to also spend more effort curating and severely reducing the tag vocabulary, at least the subset used for the website. On the other hand, I think this system will really help with browsing this large body/archive of work much more meaningfully than the boring single-tag/category approach most websites are offering. And it will do so without any backend (other than file hosting)...

    [1] Permutations = 400 + 400^2 + 400^3

    #ThingUmbrella #Tagging #Intersection #Query #Bitfield #WebDev #JavaScript #TypeScript #Optimization

  17. tl;dr Using thi.ng/column-store to accelerate tag intersection queries by a factor of 880x...

    Working on the static website generator/export plugin for my personal knowledge tool has been one of the main projects this past month. A key part of this setup is tagging, not just simple flat keywords/categories, but actually treating tags as sets. The system doesn't just allow browsing content by a single tag, but also supports adding (or removing) tags to narrow or widen the current topic. E.g. The combination of "3d + geometry + typescript" would select only works which have all of these three tags...

    In the local version of my tool there's no limit to the number of tags (and it also supports tag negation), but for the static site generation I have to limit the set size (due to combinatoric explosion) and pre-compute all possible permutations, then create HTML documents for each these individual combinations which actually produce results.

    So far I'm having ~400 unique tags in use, meaning if I want to aim for a max set size of 3, there're theoretically ~64,000,000 possibilities to check[1]! For the roughly 3500 content items used for testing, a naive JS approach to filter the result array and only retain items matching the entire current permutation is so extremely slow, that I stopped the process after 3.5 minutes just for the first 250k (aka 0.4%) of the 64 million permutations, i.e. at that rate the full process would have taken ~15 hours, pretty slow for a SSG... :)

    Naive approach 🫣:

    ```
    permutation = ["3d", "geometry", "typescript"]
    results.filter(item => permutation.every(tag => item.tags.includes(tag)))
    ```

    But since I'm using thi.ng/column-store as my database, such queries can be optimized by a few magnitudes, since here these intersection queries are applied only to bitfields (explained in the pkg readme). This results in all 64+ million permutations being processed in just 62 seconds (1+ million per second). Quite the difference, i.e. ~880x faster than the above approach!

    Also, of these 64 million initial possibilities, there're fewer unique ones (excluding duplicates and ignoring ordering), and currently only ~24,000 are actually producing a result. Still, that's 24,000 index pages to generate & host and it's, of course, far, far too much!

    So I will have to also spend more effort curating and severely reducing the tag vocabulary, at least the subset used for the website. On the other hand, I think this system will really help with browsing this large body/archive of work much more meaningfully than the boring single-tag/category approach most websites are offering. And it will do so without any backend (other than file hosting)...

    [1] Permutations = 400 + 400^2 + 400^3

    #ThingUmbrella #Tagging #Intersection #Query #Bitfield #WebDev #JavaScript #TypeScript #Optimization

  18. tl;dr Using thi.ng/column-store to accelerate tag intersection queries by a factor of 880x...

    Working on the static website generator/export plugin for my personal knowledge tool has been one of the main projects this past month. A key part of this setup is tagging, not just simple flat keywords/categories, but actually treating tags as sets. The system doesn't just allow browsing content by a single tag, but also supports adding (or removing) tags to narrow or widen the current topic. E.g. The combination of "3d + geometry + typescript" would select only works which have all of these three tags...

    In the local version of my tool there's no limit to the number of tags (and it also supports tag negation), but for the static site generation I have to limit the set size (due to combinatoric explosion) and pre-compute all possible permutations, then create HTML documents for each these individual combinations which actually produce results.

    So far I'm having ~400 unique tags in use, meaning if I want to aim for a max set size of 3, there're theoretically ~64,000,000 possibilities to check[1]! For the roughly 3500 content items used for testing, a naive JS approach to filter the result array and only retain items matching the entire current permutation is so extremely slow, that I stopped the process after 3.5 minutes just for the first 250k (aka 0.4%) of the 64 million permutations, i.e. at that rate the full process would have taken ~15 hours, pretty slow for a SSG... :)

    Naive approach 🫣:

    ```
    permutation = ["3d", "geometry", "typescript"]
    results.filter(item => permutation.every(tag => item.tags.includes(tag)))
    ```

    But since I'm using thi.ng/column-store as my database, such queries can be optimized by a few magnitudes, since here these intersection queries are applied only to bitfields (explained in the pkg readme). This results in all 64+ million permutations being processed in just 62 seconds (1+ million per second). Quite the difference, i.e. ~880x faster than the above approach!

    Also, of these 64 million initial possibilities, there're fewer unique ones (excluding duplicates and ignoring ordering), and currently only ~24,000 are actually producing a result. Still, that's 24,000 index pages to generate & host and it's, of course, far, far too much!

    So I will have to also spend more effort curating and severely reducing the tag vocabulary, at least the subset used for the website. On the other hand, I think this system will really help with browsing this large body/archive of work much more meaningfully than the boring single-tag/category approach most websites are offering. And it will do so without any backend (other than file hosting)...

    [1] Permutations = 400 + 400^2 + 400^3

    #ThingUmbrella #Tagging #Intersection #Query #Bitfield #WebDev #JavaScript #TypeScript #Optimization

  19. Started creating browser-based calculators for quickly computing a bunch of recurring things in darkroom processing, so far:

    Scale amount by area:
    Given reference dimensions and amount, compute scaled amount needed for new target dimensions.
    Example: Compute drops of emulsion needed for a new print size

    Two-part solution ratio:
    For a total volume of a two-part solution with a A:B target mix ratio, compute how many units are needed of both A and B.
    Example: For N drops in total, compute how many drops are needed for A & B using a 1.2:1 target ratio

    Solution addition:
    Compute the amount of solution A (with given concentration) to add to another volume to achieve a certain target concentration (for solution A)
    Example: How many extra drops of a 25% contrast agent solution are needed to achieve a 5% solution with a certain base emulsion volume

    More calculators forthcoming... Feel free to ping me with any other useful formulas you'd like to have added...

    Bookmark this on your phone:
    demo.thi.ng/umbrella/darkroom-

    (The UI is responsive to the system's dark mode setting)

    Source code:
    codeberg.org/thi.ng/umbrella/s

    Btw. This is thi.ng/umbrella example project #186 and relies mostly on these packages:

    - thi.ng/rdom & thi.ng/rstream for reactive UI & computation
    - thi.ng/rdom-forms for reactive form element abstraction/creation

    #ThingUmbrella #AltProcess #Darkroom #DarkroomPrint #AnalogPhotography #Calculator #Reactive #UI #TypeScript

  20. One from the archives for #TextmodeTuesday. The post might be 3 years old, but I'm still using these snippets almost daily to visualize and debug data whilst I'm working in the Node REPL...

    mastodon.thi.ng/@toxi/11094296

    #ThingUmbrella #DataViz #REPL #Terminal

  21. One from the archives for #TextmodeTuesday. The post might be 3 years old, but I'm still using these snippets almost daily to visualize and debug data whilst I'm working in the Node REPL...

    mastodon.thi.ng/@toxi/11094296

    #ThingUmbrella #DataViz #REPL #Terminal

  22. One from the archives for #TextmodeTuesday. The post might be 3 years old, but I'm still using these snippets almost daily to visualize and debug data whilst I'm working in the Node REPL...

    mastodon.thi.ng/@toxi/11094296

    #ThingUmbrella #DataViz #REPL #Terminal

  23. One from the archives for #TextmodeTuesday. The post might be 3 years old, but I'm still using these snippets almost daily to visualize and debug data whilst I'm working in the Node REPL...

    mastodon.thi.ng/@toxi/11094296

    #ThingUmbrella #DataViz #REPL #Terminal

  24. PSA: Migrating the thi.ng/umbrella monorepo to Codeberg, including:

    - updating thousands of links in ~970 files (readme's, media, API docs/snippets in source files, examples, wiki etc.)
    - updated 215 package short links to point to new locations on Codeberg
    - re-configured & re-uploaded hundreds of megabytes of package API docs to docs.thi.ng/ (with new backlinks to Codeberg)

    Re: short links, for example thi.ng/wasm-api is an alias for the more unwieldly package homepage URL in the larger umbrella repo on Codeberg: codeberg.org/thi.ng/umbrella/s

    Along with these changes, Codeberg is also the main/default remote for this project now. I will keep the Github repo (github.com/thi-ng/umbrella) around for a bit longer, but will add a note in some places to say that this is only a passive mirror from now on...

    This exercise has taken up most of my Sunday today, for a body of work which spans close to 10 years of my life... I had migrated this large repo already in 2024, but finally got around to "make the switch". Other thi.ng projects will be migrated over the coming weeks/months...

    As always, a big thank you to all the people who've been supporting this work and its maintenance. Self-promotion is absolutely not my forte and I always have prioritized putting my energy into these projects instead. But if you in any way have benefited from these varied projects and/or want to support their ongoing development, I'd highly appreciate any donations/sponsoring via:

    codeberg.org/thi.ng/umbrella/s

    #ThingUmbrella #Monorepo #OpenSource #Migration #Codeberg #GitHub

  25. PSA: Migrating the thi.ng/umbrella monorepo to Codeberg, including:

    - updating thousands of links in ~970 files (readme's, media, API docs/snippets in source files, examples, wiki etc.)
    - updated 215 package short links to point to new locations on Codeberg
    - re-configured & re-uploaded hundreds of megabytes of package API docs to docs.thi.ng/ (with new backlinks to Codeberg)

    Re: short links, for example thi.ng/wasm-api is an alias for the more unwieldly package homepage URL in the larger umbrella repo on Codeberg: codeberg.org/thi.ng/umbrella/s

    Along with these changes, Codeberg is also the main/default remote for this project now. I will keep the Github repo (github.com/thi-ng/umbrella) around for a bit longer, but will add a note in some places to say that this is only a passive mirror from now on...

    This exercise has taken up most of my Sunday today, for a body of work which spans close to 10 years of my life... I had migrated this large repo already in 2024, but finally got around to "make the switch". Other thi.ng projects will be migrated over the coming weeks/months...

    As always, a big thank you to all the people who've been supporting this work and its maintenance. Self-promotion is absolutely not my forte and I always have prioritized putting my energy into these projects instead. But if you in any way have benefited from these varied projects and/or want to support their ongoing development, I'd highly appreciate any donations/sponsoring via:

    codeberg.org/thi.ng/umbrella/s

    #ThingUmbrella #Monorepo #OpenSource #Migration #Codeberg #GitHub

  26. PSA: Migrating the thi.ng/umbrella monorepo to Codeberg, including:

    - updating thousands of links in ~970 files (readme's, media, API docs/snippets in source files, examples, wiki etc.)
    - updated 215 package short links to point to new locations on Codeberg
    - re-configured & re-uploaded hundreds of megabytes of package API docs to docs.thi.ng/ (with new backlinks to Codeberg)

    Re: short links, for example thi.ng/wasm-api is an alias for the more unwieldly package homepage URL in the larger umbrella repo on Codeberg: codeberg.org/thi.ng/umbrella/s

    Along with these changes, Codeberg is also the main/default remote for this project now. I will keep the Github repo (github.com/thi-ng/umbrella) around for a bit longer, but will add a note in some places to say that this is only a passive mirror from now on...

    This exercise has taken up most of my Sunday today, for a body of work which spans close to 10 years of my life... I had migrated this large repo already in 2024, but finally got around to "make the switch". Other thi.ng projects will be migrated over the coming weeks/months...

    As always, a big thank you to all the people who've been supporting this work and its maintenance. Self-promotion is absolutely not my forte and I always have prioritized putting my energy into these projects instead. But if you in any way have benefited from these varied projects and/or want to support their ongoing development, I'd highly appreciate any donations/sponsoring via:

    codeberg.org/thi.ng/umbrella/s

    #ThingUmbrella #Monorepo #OpenSource #Migration #Codeberg #GitHub

  27. PSA: Migrating the thi.ng/umbrella monorepo to Codeberg, including:

    - updating thousands of links in ~970 files (readme's, media, API docs/snippets in source files, examples, wiki etc.)
    - updated 215 package short links to point to new locations on Codeberg
    - re-configured & re-uploaded hundreds of megabytes of package API docs to docs.thi.ng/ (with new backlinks to Codeberg)

    Re: short links, for example thi.ng/wasm-api is an alias for the more unwieldly package homepage URL in the larger umbrella repo on Codeberg: codeberg.org/thi.ng/umbrella/s

    Along with these changes, Codeberg is also the main/default remote for this project now. I will keep the Github repo (github.com/thi-ng/umbrella) around for a bit longer, but will add a note in some places to say that this is only a passive mirror from now on...

    This exercise has taken up most of my Sunday today, for a body of work which spans close to 10 years of my life... I had migrated this large repo already in 2024, but finally got around to "make the switch". Other thi.ng projects will be migrated over the coming weeks/months...

    As always, a big thank you to all the people who've been supporting this work and its maintenance. Self-promotion is absolutely not my forte and I always have prioritized putting my energy into these projects instead. But if you in any way have benefited from these varied projects and/or want to support their ongoing development, I'd highly appreciate any donations/sponsoring via:

    codeberg.org/thi.ng/umbrella/s

    #ThingUmbrella #Monorepo #OpenSource #Migration #Codeberg #GitHub

  28. PSA: Migrating the thi.ng/umbrella monorepo to Codeberg, including:

    - updating thousands of links in ~970 files (readme's, media, API docs/snippets in source files, examples, wiki etc.)
    - updated 215 package short links to point to new locations on Codeberg
    - re-configured & re-uploaded hundreds of megabytes of package API docs to docs.thi.ng/ (with new backlinks to Codeberg)

    Re: short links, for example thi.ng/wasm-api is an alias for the more unwieldly package homepage URL in the larger umbrella repo on Codeberg: codeberg.org/thi.ng/umbrella/s

    Along with these changes, Codeberg is also the main/default remote for this project now. I will keep the Github repo (github.com/thi-ng/umbrella) around for a bit longer, but will add a note in some places to say that this is only a passive mirror from now on...

    This exercise has taken up most of my Sunday today, for a body of work which spans close to 10 years of my life... I had migrated this large repo already in 2024, but finally got around to "make the switch". Other thi.ng projects will be migrated over the coming weeks/months...

    As always, a big thank you to all the people who've been supporting this work and its maintenance. Self-promotion is absolutely not my forte and I always have prioritized putting my energy into these projects instead. But if you in any way have benefited from these varied projects and/or want to support their ongoing development, I'd highly appreciate any donations/sponsoring via:

    codeberg.org/thi.ng/umbrella/s

    #ThingUmbrella #Monorepo #OpenSource #Migration #Codeberg #GitHub

  29. It's Friday, spring is here (a bit too early) — it feels like a good day to share another minute recording of a variation of my Actiniaria piece which I worked on last spring and think also captures that much needed #BloomScrolling spirit...

    See #Actiniaria for more context...

    (Note: Sadly Firefox still doesn't respect the Rec2020 color profile in the video, please download the video or use Chrome or Safari for full viewing pleasure...)

    #GenerativeArt #AlgorithmicArt #NoAI #ThingUmbrella #GenArtAPI #Boids #Color #Video #Animation #TypeScript #WebGL

  30. It's Friday, spring is here (a bit too early) — it feels like a good day to share another minute recording of a variation of my Actiniaria piece which I worked on last spring and think also captures that much needed #BloomScrolling spirit...

    See #Actiniaria for more context...

    (Note: Sadly Firefox still doesn't respect the Rec2020 color profile in the video, please download the video or use Chrome or Safari for full viewing pleasure...)

    #GenerativeArt #AlgorithmicArt #NoAI #ThingUmbrella #GenArtAPI #Boids #Color #Video #Animation #TypeScript #WebGL

  31. It's Friday, spring is here (a bit too early) — it feels like a good day to share another minute recording of a variation of my Actiniaria piece which I worked on last spring and think also captures that much needed #BloomScrolling spirit...

    See #Actiniaria for more context...

    (Note: Sadly Firefox still doesn't respect the Rec2020 color profile in the video, please download the video or use Chrome or Safari for full viewing pleasure...)

    #GenerativeArt #AlgorithmicArt #NoAI #ThingUmbrella #GenArtAPI #Boids #Color #Video #Animation #TypeScript #WebGL

  32. It's Friday, spring is here (a bit too early) — it feels like a good day to share another minute recording of a variation of my Actiniaria piece which I worked on last spring and think also captures that much needed #BloomScrolling spirit...

    See #Actiniaria for more context...

    (Note: Sadly Firefox still doesn't respect the Rec2020 color profile in the video, please download the video or use Chrome or Safari for full viewing pleasure...)

    #GenerativeArt #AlgorithmicArt #NoAI #ThingUmbrella #GenArtAPI #Boids #Color #Video #Animation #TypeScript #WebGL

  33. It's Friday, spring is here (a bit too early) — it feels like a good day to share another minute recording of a variation of my Actiniaria piece which I worked on last spring and think also captures that much needed #BloomScrolling spirit...

    See #Actiniaria for more context...

    (Note: Sadly Firefox still doesn't respect the Rec2020 color profile in the video, please download the video or use Chrome or Safari for full viewing pleasure...)

    #GenerativeArt #AlgorithmicArt #NoAI #ThingUmbrella #GenArtAPI #Boids #Color #Video #Animation #TypeScript #WebGL

  34. @bit101 @jonathanhogg Exactly! Since it's all so nonintuitive, some years ago I made this visualization to help me make sense of it and map out this funky max chroma boundary based on hue and luminance... The viz is for LCH, but Oklch looks very similar

    Just the other day I also found this amazing color picker at oklch.com which has interactive versions of the same (plus a 3D viz too)...

    #ThingUmbrella #Color #LCH

  35. @bit101 @jonathanhogg Exactly! Since it's all so nonintuitive, some years ago I made this visualization to help me make sense of it and map out this funky max chroma boundary based on hue and luminance... The viz is for LCH, but Oklch looks very similar

    Just the other day I also found this amazing color picker at oklch.com which has interactive versions of the same (plus a 3D viz too)...

    #ThingUmbrella #Color #LCH

  36. @bit101 @jonathanhogg Exactly! Since it's all so nonintuitive, some years ago I made this visualization to help me make sense of it and map out this funky max chroma boundary based on hue and luminance... The viz is for LCH, but Oklch looks very similar

    Just the other day I also found this amazing color picker at oklch.com which has interactive versions of the same (plus a 3D viz too)...

    #ThingUmbrella #Color #LCH

  37. @bit101 @jonathanhogg Exactly! Since it's all so nonintuitive, some years ago I made this visualization to help me make sense of it and map out this funky max chroma boundary based on hue and luminance... The viz is for LCH, but Oklch looks very similar

    Just the other day I also found this amazing color picker at oklch.com which has interactive versions of the same (plus a 3D viz too)...

    #ThingUmbrella #Color #LCH

  38. @bit101 @jonathanhogg Exactly! Since it's all so nonintuitive, some years ago I made this visualization to help me make sense of it and map out this funky max chroma boundary based on hue and luminance... The viz is for LCH, but Oklch looks very similar

    Just the other day I also found this amazing color picker at oklch.com which has interactive versions of the same (plus a 3D viz too)...

    #ThingUmbrella #Color #LCH

  39. Random #ThingUmbrella tip & tidbit about unit conversions: I've been sourcing materials for a larger contact printing setup for my kallitype process, incl. getting a much heavier ultra-clear glass plate than what I've been using so far.

    Using the thi.ng/units converter with its Lisp-like domain specific language, I can easily compute the following, freely mixing compatible units with complete ease. Using the S-expression DSL is optional. There's also a normal TypeScript/JavaScript API...

    ```
    // weight in kilograms of 48cm x 35cm x 8mm plate
    (kg (* 48cm 35cm 8mm glass))
    // 3.36

    // or use a DIN paper size preset
    (kg (* (area din_a3) 8mm glass))
    // 2.4948

    // calculate force
    (newton (* 48cm 35cm 8mm glass earth_gravity))
    32.86191

    // calculate PSI (pounds per square inch) of the plate on a smaller area
    // here for a 6x4" print area example
    (psi (/ (* 48cm 35cm 8mm glass earth_gravity) (* 6in 4in)))
    // 0.30782

    // compare with a simple picture frame
    (psi (/ (* 24cm 30cm 2mm glass earth_gravity) (* 6in 4in)))
    // 0.03298

    // ...the thicker plate causes ~10x more pressure. q.e.d.
    ```

    Maybe someone else finds that useful. The package readme contains a lot more information about possibilities, predefined constants and examples...

    #ThingUmbrella #UnitConversion #Physics #TypeScript #JavaScript #DSL #Lisp

  40. #ReleaseSaturday — This week I've been working on extracting, refactoring & generalizing the minimal column store database I've been using for my personal knowledge/media management toolset, and I'm happy to share it with the world now:

    thi.ng/column-store

    This is an in-memory column store database with:

    - Customizable column storage types with configurable min/max cardinality, support for optional and/or tuple-values, default values
    - Support for custom column type implementations
    - Optional dictionary encoding of column values (memory & filesize saving)
    - Powerful extensible multi-term query engine with built-in OR/AND/NOR/NAND operators and predicate-based matchers (column, row, partial row). Queries can be pre-built and then executed as standard JS iterables
    - Optional bitfield indexing for dramatic query acceleration (esp. for complex multi-term queries)
    - Dynamic adding/removing of columns
    - JSON serialization with optional RLE compression (in my PKM dataset with ~20k items, the RLE compressed version is only 29% of the normal JSON serialization)

    I hope the readme and code examples give a decent overview for now... I've been using the overall system for a couple of years now, but this new packaged version is still marked as _alpha_. Everything's still being worked on.

    Also, for those wondering what's the point of this all and why not using SQLite etc. — I find there're many use cases for a which a pure JSON-based approach is more than sufficient (without requiring extra tools and interfacing layers). The structure/storage model and the bitfield optimizations enable very fast query performance (compared to other JSON db's I've tried in the past)...

    (Including all dependencies [only some other thi.ng packages], the entire DB package is ~6KB brotli'd, 19KB uncompressed...)

    #ThingUmbrella #TypeScript #JavaScript #JSON #Database #QueryEngine #RLE #SmallWeb

  41. Some more variations curated this AM... in love with these shapes & process!

    (See start of this thread for context...)

    #FluidSim #Simulation #Art #GenerativeArt #AbstractArt #NoAI #ThingUmbrella #TypeScript

  42. Simulated Cyanotype Chemigrams...

    Lately I've been revisiting my old fluid sim toolset which started out as part of my toxiclibs Java libraries (2007/8, based on Jos Stam's research, also previously mentioned in this thread[1]), then ported & expanded it for #Houdini in 2016, then ported again to TypeScript/GLSL (via thi.ng/shader-ast in 2019) and been messing around with it on & off ever since... Fluidsims are just so mesmerizing to work/play with and can be taken into so many interesting directions!

    I also always loved the watercolor cover designs by Gabriella Holmström for The Memoir[2] series on Hypnus Records and wanted to create similar abstract structures/constellation, albeit with simulated fluids... Stills/snapshots, but showing traces of their creation process.

    Attached are a few variations of this system (already collected again hundreds which I have to still curate). Each piece is starting with just 4 drops in always the exact same locations (diamond-shaped layout in the center), but each variation is evolving differently due to randomized concentrations and simulation coefficients, therefore resulting in many different diffusion behaviors and outcomes... Some of the pieces which exhibit more viscous fingering[3] almost remind me of Hokusai's Great Wave[4]...

    I will be offering sets of unique prints/cards of these via my shop soon. Also still researching feasibility of integrating interactively created variations in the shop (also for other artworks/collections of mine).

    [1] mastodon.thi.ng/@toxi/11580242
    [2] youtube.com/@Hypnusrecords/vid, for example: youtube.com/watch?v=efdfYJODiuA
    [3] en.wikipedia.org/wiki/Saffman%
    [4] en.wikipedia.org/wiki/The_Grea

    #FluidSim #Simulation #Art #GenerativeArt #AbstractArt #NoAI #ThingUmbrella #TypeScript #ShaderAST

  43. Also new in #ThingUmbrella: The new thi.ng/text-format-image package provides conversion/formatting for bitmap output for CLI/Terminal apps, currently only via the widely supported iTerm2 format (see readme for details). Supports JPG/PNG (possibly others, depending on terminal used) as well as thi.ng/pixel pixel buffers (e.g. for dynamically generated images/visualizations)

    Ps. The above relies on extended ANSI sequences to submit bitmap data to the terminal. If you're after actual text/character-based image conversion, you can alternatively use the functions provided in thi.ng/text-canvas:

    github.com/thi-ng/umbrella/tre

    #ReleaseFriday #TextMode #Image #CLI #TypeScript #OpenSource

  44. Also new in #ThingUmbrella: The new thi.ng/text-format-image package provides conversion/formatting for bitmap output for CLI/Terminal apps, currently only via the widely supported iTerm2 format (see readme for details). Supports JPG/PNG (possibly others, depending on terminal used) as well as thi.ng/pixel pixel buffers (e.g. for dynamically generated images/visualizations)

    Ps. The above relies on extended ANSI sequences to submit bitmap data to the terminal. If you're after actual text/character-based image conversion, you can alternatively use the functions provided in thi.ng/text-canvas:

    github.com/thi-ng/umbrella/tre

    #ReleaseFriday #TextMode #Image #CLI #TypeScript #OpenSource

  45. Also new in #ThingUmbrella: The new thi.ng/text-format-image package provides conversion/formatting for bitmap output for CLI/Terminal apps, currently only via the widely supported iTerm2 format (see readme for details). Supports JPG/PNG (possibly others, depending on terminal used) as well as thi.ng/pixel pixel buffers (e.g. for dynamically generated images/visualizations)

    Ps. The above relies on extended ANSI sequences to submit bitmap data to the terminal. If you're after actual text/character-based image conversion, you can alternatively use the functions provided in thi.ng/text-canvas:

    github.com/thi-ng/umbrella/tre

    #ReleaseFriday #TextMode #Image #CLI #TypeScript #OpenSource

  46. Also new in #ThingUmbrella: The new thi.ng/text-format-image package provides conversion/formatting for bitmap output for CLI/Terminal apps, currently only via the widely supported iTerm2 format (see readme for details). Supports JPG/PNG (possibly others, depending on terminal used) as well as thi.ng/pixel pixel buffers (e.g. for dynamically generated images/visualizations)

    Ps. The above relies on extended ANSI sequences to submit bitmap data to the terminal. If you're after actual text/character-based image conversion, you can alternatively use the functions provided in thi.ng/text-canvas:

    github.com/thi-ng/umbrella/tre

    #ReleaseFriday #TextMode #Image #CLI #TypeScript #OpenSource