From 2a5c01d04359b62e4a7eec2f39d08203b6c3047b Mon Sep 17 00:00:00 2001 From: Louis Bailleau Date: Sun, 31 Dec 2023 01:11:07 +0100 Subject: [PATCH] fix: spell checking --- .github/actions/spelling/allow.txt | 4 +- .github/actions/spelling/expect.txt | 6 ++ .github/actions/spelling/patterns.txt | 2 + .github/workflows/check-spells.yaml | 97 ++++++++++--------- .../index.md | 20 ++-- 5 files changed, 68 insertions(+), 61 deletions(-) create mode 100644 .github/actions/spelling/expect.txt create mode 100644 .github/actions/spelling/patterns.txt diff --git a/.github/actions/spelling/allow.txt b/.github/actions/spelling/allow.txt index b07f039..6f35f1d 100644 --- a/.github/actions/spelling/allow.txt +++ b/.github/actions/spelling/allow.txt @@ -1,5 +1,3 @@ -Archipel -Bricklou -D3lta ingame screenshot +ecs diff --git a/.github/actions/spelling/expect.txt b/.github/actions/spelling/expect.txt new file mode 100644 index 0000000..c7e9139 --- /dev/null +++ b/.github/actions/spelling/expect.txt @@ -0,0 +1,6 @@ +Archipel +Bricklou +Modrinth +Microsoft +AOT +modding diff --git a/.github/actions/spelling/patterns.txt b/.github/actions/spelling/patterns.txt new file mode 100644 index 0000000..76de407 --- /dev/null +++ b/.github/actions/spelling/patterns.txt @@ -0,0 +1,2 @@ +\D3lta\b +\[(.*?)\]\((.*?)\) diff --git a/.github/workflows/check-spells.yaml b/.github/workflows/check-spells.yaml index 3e5bd17..0bd1dcf 100644 --- a/.github/workflows/check-spells.yaml +++ b/.github/workflows/check-spells.yaml @@ -36,21 +36,21 @@ name: Check Spelling on: push: branches: - - "**" + - "**" tags-ignore: - - "**" + - "**" pull_request_target: branches: - - "**" + - "**" tags-ignore: - - "**" + - "**" types: - - 'opened' - - 'reopened' - - 'synchronize' + - "opened" + - "reopened" + - "synchronize" issue_comment: types: - - 'created' + - "created" jobs: spelling: @@ -69,24 +69,25 @@ jobs: # note: If you use only_check_changed_files, you do not want cancel-in-progress cancel-in-progress: true steps: - - name: check-spelling - id: spelling - uses: check-spelling/check-spelling@main - with: - suppress_push_for_open_pull_request: 1 - checkout: true - check_file_names: 1 - spell_check_this: check-spelling/spell-check-this@prerelease - post_comment: 0 - use_magic_file: 1 - experimental_apply_changes_via_bot: 1 - use_sarif: 1 - extra_dictionary_limit: 10 - unknown_word_limit: 2 - extra_dictionaries: - cspell:software-terms/src/software-terms.txt - cspell:java/src/java-terms.txt - + - name: check-spelling + id: spelling + uses: check-spelling/check-spelling@main + with: + suppress_push_for_open_pull_request: 1 + checkout: true + check_file_names: 1 + spell_check_this: check-spelling/spell-check-this@prerelease + post_comment: 0 + use_magic_file: 1 + experimental_apply_changes_via_bot: 1 + use_sarif: 1 + extra_dictionary_limit: 10 + unknown_word_limit: 2 + extra_dictionaries: | + cspell:software-terms/src/software-terms.txt + cspell:java/src/java.txt + cspell:markdown/src/markdown.txt + cspell:gaming-terms/dict/gaming-terms.txt comment-push: name: Report (Push) @@ -97,12 +98,12 @@ jobs: contents: write if: (success() || failure()) && needs.spelling.outputs.followup && github.event_name == 'push' steps: - - name: comment - uses: check-spelling/check-spelling@main - with: - checkout: true - spell_check_this: check-spelling/spell-check-this@prerelease - task: ${{ needs.spelling.outputs.followup }} + - name: comment + uses: check-spelling/check-spelling@main + with: + checkout: true + spell_check_this: check-spelling/spell-check-this@prerelease + task: ${{ needs.spelling.outputs.followup }} comment-pr: name: Report (PR) @@ -113,13 +114,13 @@ jobs: pull-requests: write if: (success() || failure()) && needs.spelling.outputs.followup && contains(github.event_name, 'pull_request') steps: - - name: comment - uses: check-spelling/check-spelling@main - with: - checkout: true - spell_check_this: check-spelling/spell-check-this@prerelease - task: ${{ needs.spelling.outputs.followup }} - experimental_apply_changes_via_bot: 1 + - name: comment + uses: check-spelling/check-spelling@main + with: + checkout: true + spell_check_this: check-spelling/spell-check-this@prerelease + task: ${{ needs.spelling.outputs.followup }} + experimental_apply_changes_via_bot: 1 update: name: Update PR @@ -129,17 +130,17 @@ jobs: actions: read runs-on: ubuntu-latest if: ${{ - github.event_name == 'issue_comment' && - github.event.issue.pull_request && - contains(github.event.comment.body, '@check-spelling-bot apply') + github.event_name == 'issue_comment' && + github.event.issue.pull_request && + contains(github.event.comment.body, '@check-spelling-bot apply') }} concurrency: group: spelling-update-${{ github.event.issue.number }} cancel-in-progress: false steps: - - name: apply spelling updates - uses: check-spelling/check-spelling@main - with: - experimental_apply_changes_via_bot: 1 - checkout: true - ssh_key: "${{ secrets.CHECK_SPELLING }}" + - name: apply spelling updates + uses: check-spelling/check-spelling@main + with: + experimental_apply_changes_via_bot: 1 + checkout: true + ssh_key: "${{ secrets.CHECK_SPELLING }}" diff --git a/content/posts/2023/12-31/the-road-to-the-perfect-plug-in-system/index.md b/content/posts/2023/12-31/the-road-to-the-perfect-plug-in-system/index.md index 641703d..be9dd29 100644 --- a/content/posts/2023/12-31/the-road-to-the-perfect-plug-in-system/index.md +++ b/content/posts/2023/12-31/the-road-to-the-perfect-plug-in-system/index.md @@ -1,7 +1,7 @@ +++ title = "The road to the perfect plugin system" author = "D3lta-2-1" -date = "2023-12-29" +date = "2023-12-31" categories = ["dev logs"] tags = ["plugins", "core", "research"] @@ -10,7 +10,7 @@ description = "Exploring Modding possibilities and finding the ideal solution." [banner] image = "plugin.jpg" -caption = "Plugins are like legos, there are modular and allow creativity" +caption = "Plugins are like Lego, there are modular and allow creativity" +++ Minecraft Java Edition became very popular thanks to its modding community, and the ability to create your own server, by customizing with plugins and mods. @@ -60,7 +60,7 @@ Like every other plugin system, we thought about using lua. It's a very popular The 2 mosts popular implementations are [LuaJit](https://luajit.org/) and [Wren](https://wren.io/). Wren is a little slower, but solves many problems from Lua, like the lack of classes or static typings. Both are very lightweight and easy to use, sandbox-able but, they suffer from a big problem: they don't support any kind of multi-threading. Developers are forced to working inside a single thread or -to work with multiples VMs in parallel (Not the smartest idea, right?). This means that this is not an idea solution, since user can always store data on a specific VM, but +to work with multiples VM in parallel (Not the smartest idea, right?). This means that this is not an idea solution, since user can always store data on a specific VM, but will not be able to access it from another. To resume: @@ -74,14 +74,14 @@ To resume: | Stable ABI | Yes | _Nothing to comment_ | | Cross-plugins symbols imports | 3/5 | Interactions would be very tricky to implement, since Lua imports means executing it. Getting a function from another plugin would always result in a core call. | -Why did I look for alternatives? Because Lua/wren are too primitive for our use case, and we can't rely on 25k lines of code written with it just to ensure everything run smootly. +Why did I look for alternatives? Because Lua/wren are too primitive for our use case, and we can't rely on 25k lines of code written with it just to ensure everything run smoothly. Others points like interactions with an ECS are very tricky to implement: a component is basically a static-sized and statically typed structure, and this notion doesn't exists at all in these languages due to their dynamic typing nature. # Seconds though: Rust ABI using dylib Instead of using an external library, we though about just sticking with the current dynamic linking mechanism of Rust/C ABI. -Bevy uses this approach, and is very easy to use. It only requires to add a dependency in your `cargo.yoml` and use it like any other rust libraries. In addition, compiled Rust for native platform +Bevy uses this approach, and is very easy to use. It only requires to add a dependency in your `cargo.yaml` and use it like any other rust libraries. In addition, compiled Rust for native platform is the fastest option in terms of execution speed, while offering multi-threading and many other advanced features from Rust. But, we will lose some key points here: @@ -91,7 +91,7 @@ But, we will lose some key points here: | Fast | 5/5 | [AOT (Ahead of time)](https://en.wikipedia.org/wiki/Ahead-of-time_compilation) is the fastest way to execute code, we are talking about 2x to 10x the speed of any other alternative. | | Sand-boxed | No | A DLL get the same level of permission as the server, it can access any file, it can crash the server, it can do anything the server can do, which is not ideal. | | Easy to use | 4/5 | Rust is not the easiest language to learn, but it's not the hardest either. It's very well documented, and would fit perfectly with the rest of the codebase! | -| Cross-platform | Compile-time | Rust code is cross-platform at compile-tme, and can, accordingly, run on almost any platform. But, binaries need to be recompiled for each platform to ensure the support. | +| Cross-platform | Compile-time | Rust code is cross-platform at compile-time, and can, accordingly, run on almost any platform. But, binaries need to be recompiled for each platform to ensure the support. | | Stable ABI | No | Rust ABI is not stable, changing a flag in the compiler can change the padding of a structure, and break the ABI: plugins would need to be compiled with the exact same compiler configuration. | | Cross-plugins symbols imports | 2/5 | And here start our nightmare: importing symbols from other plugins isn't really a thing, the "host" plugin must expose an array of static void pointers to every desired functions, and "guest" plugins must cast the void pointer to the desired function pointer and call it. This is not ideal at all and would result in a lot of unsafe boilerplate code. | @@ -128,7 +128,7 @@ is highly cross-platform, has a stable ABI, and allows for importing symbols fro From the moment where you want to pass complex objects between the host and the guest, things get a bit more complicated. There is no official way to do this task cleanly. Of course, there are always hacky way to pass a pointer to the guest, and the guest can read/write to this pointer. This would provide a terrible developer experience, and would be very error prone. Passing complex objects requires some serialization, which comes with big performance costs and boilerplate code. It also requires a lot of handmade VM memory management and means, for us, -to reimplemente the whole ECS in WasmTime VM memory, or copying each component to the VM memory during entity query, which also comes with a cost. +to reimplement the whole ECS in WasmTime VM memory, or copying each component to the VM memory during entity query, which also comes with a cost. | Criteria | Note | Summary | | ----------------------------- | :-----: | ----------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -147,7 +147,7 @@ Again, this is a big no for us. # Fourth though: speaking of bytecode, what about Java? -Java (or any alternative running on the JVM like kotlin) is one of the most popular language today, and used to create Minecraft. It provides good speeds, portability, +Java (or any alternative running on the JVM like Kotlin) is one of the most popular language today, and used to create Minecraft. It provides good speeds, portability, and the targeted community already used it | Criteria | Note | Summary | @@ -180,9 +180,9 @@ Like java, C# run a VM: a single binary can be run everywhere as long as .NET is | Cross-plugins symbols imports | 5/5 | Allow symbol resolution at runtime, which means symbols cross-importation out of the box. This is our best solution we have seen so far | C# have "unmanaged struct" (struct with a fixed size, and no reference), which is very good for ECS and cache coherency. -Unfortunatly, C# suffers from the same issue as Java: native function pointer are hard to get, but existent. A function can be declared as `[UnmanagedCallersOnly]` and can be called from a function pointer. This is not very ergonomic, and require a lot of boilerplate code. +Unfortunately, C# suffers from the same issue as Java: native function pointer are hard to get, but existent. A function can be declared as `[UnmanagedCallersOnly]` and can be called from a function pointer. This is not very ergonomic, and require a lot of boilerplate code. -I didn't find any way to use references from `hostfxr`, it might be tricky to iterate over ECS without any copy. +I didn't find any way to use references from HostFXR, it might be tricky to iterate over ECS without any copy. Threading doesn't work out of the box but should be doable with some work! HostFxr is really minimalistic, it exposes at most 10 functions. We also looked at Mono, which is used in the Unity engine, but the project is slowly dying, with an inactive community and