newsletters:2025-12
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| newsletters:2025-12 [2025/12/29 00:32] – Edit link bullets cwervo | newsletters:2025-12 [2026/01/17 23:48] (current) – [folk2 launch party] osnr | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== December 2025 newsletter | + | ====== December 2025 newsletter ====== |
| + | |||
| + | Our next [[https:// | ||
| ===== What we've been up to ===== | ===== What we've been up to ===== | ||
| Line 5: | Line 7: | ||
| ==== Nonprofit 501(c)3 ==== | ==== Nonprofit 501(c)3 ==== | ||
| - | We are now officially a 501c3 nonprofit. This means we can accept tax-deductible donations and are eligible to apply for grants. | + | [[https:// |
| Folk is a long-term project. Many people want to work on it and even more people want to support its growth and development. When thinking of the possible organizational structures that could sustain this development, | Folk is a long-term project. Many people want to work on it and even more people want to support its growth and development. When thinking of the possible organizational structures that could sustain this development, | ||
| Line 18: | Line 20: | ||
| ==== folk2 merge ==== | ==== folk2 merge ==== | ||
| - | We've merged the new version of folk into the main branch. | + | Omar: We' |
| - | It's a nice feeling that the changes we make are finally going to be visible on the main repo and get used by people. | + | {{newsletters: |
| - | folk2 isn't quite caught up (a lot of features are still not implemented, | + | It's a nice feeling that the work we've been doing is finally going to be visible on the main repo and get used by people out of the box. |
| + | |||
| + | Along with the nonprofit news, I think we want to use this as a trigger to enter a new, more public phase where we do more applications and demos (and work more on fundraising). | ||
| + | |||
| + | folk2 isn't quite caught up to folk1 feature-wise | ||
| + | |||
| + | And folk2 is so much faster | ||
| === Minor improvements === | === Minor improvements === | ||
| + | |||
| + | from the lead-up to merge & party: | ||
| * [[https:// | * [[https:// | ||
| * [[https:// | * [[https:// | ||
| - | * | + | * Scheduler now scales number of Folk worker threads up to roughly the CPU count, to make better use of bigger Folk PC we have (the scheduler probably still needs a lot of work to be robust against a lot of different workloads) |
| + | * Daniel [[https:// | ||
| + | * {{.: | ||
| + | * Improved " | ||
| + | |||
| + | === Vulkan memory allocation === | ||
| + | |||
| + | As we tested the system before the party, we noticed huge amounts of blinking when you had a bunch of camera slices / animation / sprites out. | ||
| + | |||
| + | {{newsletters: | ||
| + | |||
| + | And the blinking got worse and worse over time. I profiled the system and saw that we would be spending milliseconds up to tens of milliseconds on each GPU memory allocation of a new texture for the camera slices / animations / sprites. See how long the gpu/ | ||
| + | |||
| + | {{newsletters: | ||
| + | |||
| + | {{.: | ||
| + | |||
| + | (this is a form of workload that Folk really struggles with; we can cope with a long-running task, and we can do lots of short tasks, but lots of medium-length tasks is really hard for us. The blinking is a symptom of underlying slowdown / bottleneck in the evaluator, where we're missing deadlines to respond to things because we're spending too much compute time elsewhere) | ||
| + | |||
| + | Well, memory allocation shouldn' | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | The best part was that I [[https:// | ||
| + | |||
| + | {{.: | ||
| + | |||
| + | {{newsletters: | ||
| ==== /setup page ==== | ==== /setup page ==== | ||
| - | FIXME: final / | + | Omar: The / |
| - | FIXME: live display/camera selection cool | + | You can see the /setup interface on the left here, and some of its source code on the right (which uses the new HtmlWhen construct): |
| - | FIXME: GPU splitup | + | {{newsletters:img_7052.jpeg? |
| + | Live display and camera selection doesn' | ||
| === JPEG frames === | === JPEG frames === | ||
| - | Decompress | + | We started on using JPEG frames in the system for /setup / live preview last month. This month, we added decompress |
| + | |||
| + | [[https:// | ||
| === HtmlWhen improvements === | === HtmlWhen improvements === | ||
| + | |||
| + | I [[https:// | ||
| + | |||
| + | Made some improvements after initial implementation: | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | == Idiomorph == | ||
| - | ==== Statement reuse bug fix ==== | + | Last month, we mentioned wanting to use a morphing library to preserve HTML elements (including their internal state: focus, selection, details-open, |
| - | Fixes editor nonresponsive | + | This is as long as you put HTML ids on all your elements so they can be reconciled across the update. [[https:// |
| - | Fixes Added pileup | + | Here's the templated Folk-HTML that [[https:// |
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | <link rel=" | ||
| + | < | ||
| + | body { | ||
| + | font-family: | ||
| + | } | ||
| + | summary { | ||
| + | font-family: | ||
| + | font-size: 2em; | ||
| + | } | ||
| + | </ | ||
| + | <script src="/ | ||
| + | <script src="/ | ||
| + | < | ||
| + | const folk = new FolkWS(); | ||
| + | </ | ||
| + | </ | ||
| + | < | ||
| + | [HtmlWhen the collected results for [list / | ||
| + | are /programs/ { | ||
| + | emitHtmlForPrograms $programs | ||
| + | |||
| + | } -beforeAttributeUpdated {(attributeName, | ||
| + | if (attributeName === " | ||
| + | }}] | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ==== Statement reuse bug fix (fixes editor freeze) ==== | ||
| + | |||
| + | Omar: We noticed before and during the folk2 launch party that the editor would often freeze after a minute or so of usage. You'd be typing stuff and suddenly your keystrokes wouldn' | ||
| + | |||
| + | I dug into the problem for a few days. I started by finding that for some reason the [[https:// | ||
| + | |||
| + | {{.: | ||
| + | |||
| + | Whenever I got the editor freeze bug, I'd see that that Hold! block was executing, and most of the statements from the block were in the database, but one was missing & would never show up as a result to any queries (so we'd be lacking a '' | ||
| + | |||
| + | I walked the database trie by hand and confirmed that the '' | ||
| + | |||
| + | {{.: | ||
| + | |||
| + | This made me feel that there was some really bad race in the evaluator (this behavior violates what I would think of as core Folk invariants), | ||
| + | |||
| + | I found that the missing statement (s4409:77 here) //was// actually present in the database and was alive, but was not queryable (didn' | ||
| + | |||
| + | {{.: | ||
| + | |||
| + | {{.: | ||
| + | |||
| + | (whereas the other two child statements of the block, s4408:77 and s4419:77, were properly indexed and queryable) | ||
| + | |||
| + | I added some print statements and found this violation, where we're adding a new statement '' | ||
| + | |||
| + | {{.: | ||
| + | |||
| + | After this point, the statement is in the weird state we saw earlier (alive but not in trie): | ||
| + | |||
| + | {{.: | ||
| + | |||
| + | (Extremely alarming and a clear invariant violation to have two different living statements with an identical clause.) | ||
| + | |||
| + | It turned out the problem was in statement reuse (which makes sense, since these were statements about editor state that are often the same across updates). I had misunderstood what '' | ||
| + | |||
| + | When statement reuse succeeds, we '' | ||
| + | |||
| + | But I assumed that '' | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | {{.: | ||
| + | |||
| + | This one-line fix fixed the editor freeze bug, and it also seemingly fixed [[newsletters/ | ||
| + | |||
| + | ==== Editor refactor ==== | ||
| + | |||
| + | Mason did a big [[https:// | ||
| + | |||
| + | This mostly came out of a bug where the scroll viewport was weirdly small on editor reboot (due to some race in the old way we were doing state). The refactor fixes this bug. | ||
| + | |||
| + | {{newsletters: | ||
| + | |||
| + | Some other funny line number situations we saw (and fixed) while doing the refactor: | ||
| + | |||
| + | {{.: | ||
| + | |||
| + | Now the editor feels pretty solid and comfortable across zooms, restarts, etc. | ||
| + | ==== Folk for DnD ==== | ||
| + | |||
| + | Paul and Naveen discussed building a " | ||
| + | |||
| + | |||
| + | ==== with / | ||
| + | |||
| + | Omar: I've been [[https:// | ||
| + | |||
| + | {{.: | ||
| + | |||
| + | The branch works okay in small tests, but slows down the system a lot when I run the whole thing. | ||
| + | === Richer captures === | ||
| + | |||
| + | Omar and Mason brainstormed some more ways to make Folk's '' | ||
| + | |||
| + | * Optional and default values: We're exploring syntax like ''/ | ||
| + | * Type constraints and filters: There is interest in " | ||
| + | * The " | ||
| + | |||
| + | The main challenge here is tokenization—balancing the ergonomics of the forward-slash ''/ | ||
| + | |||
| + | |||
| + | ==== /quads experiment ==== | ||
| + | |||
| + | Omar: I've felt for a while that we're not doing enough with the full 3D geometry that we have of all quads (program areas) and of the camera and projector. I wanted to do a little 3D visualization of the 3D space that you can pan and zoom. Slapped this together just using CDNed three.js. It shows Folk's perception of the 3D space in front of the camera: | ||
| + | |||
| + | {{newsletters: | ||
| + | |||
| + | I want to clean it up and do some more stuff (maybe texture the quads with the camera slices of each quad). It'd be cool for this to be a livestream UI with these ' | ||
| + | |||
| + | ==== New gadget1 ==== | ||
| + | |||
| + | Omar: I printed a new (pink!) gadget1 to bring to China. This one uses top/bottom threading for the front panel so we don't need space-eating wells to screw the front panel into. | ||
| + | |||
| + | {{.: | ||
| + | |||
| + | It also now has a bottom hole for the trigger button, so we can do trigger button stuff on the gadget1 as well. And it supports dual Pi cameras to mount and to stick through front panel. | ||
| + | |||
| + | {{.: | ||
| + | |||
| + | New (left) and old (right): | ||
| + | |||
| + | {{newsletters: | ||
| + | |||
| + | I've just been doing each one by hand, but it feels like we now have a number of implicit variants: | ||
| + | |||
| + | * Battery (gadget2) vs. no-battery (gadget1) | ||
| + | * Orange Pi (gadget2) vs. Raspberry Pi (gadget1) | ||
| + | * retail AnyBeam (gadget2) vs. Ultimems devkit (gadget1) | ||
| + | * (the retail AnyBeam requires USB-C video in, so needs the Orange Pi) | ||
| + | * (it is somewhat more stable to mount the devkit because it has multiple threaded holes underneath, though) | ||
| + | * ELP stereo camera (gadget2) vs. dual Raspberry Pi cameras (gadget1) | ||
| + | |||
| + | It would be nice to be able to mix and match these attributes. | ||
| + | |||
| + | I haven' | ||
| + | |||
| + | {{.: | ||
| + | |||
| + | See how it changes output when I press the trigger button: | ||
| + | |||
| + | {{.: | ||
| + | |||
| + | |||
| + | ==== Experimental tcl interpreter update ==== | ||
| + | |||
| + | Mason: slowly but surely, the custom interpreter is coming together! The core object APIs are now in place, and the interpreter works, so now it's mainly working on the standard library. | ||
| + | |||
| + | Expression parsing ended up being a lot easier to figure out than I expected—precedence climbing is surprisingly intuitive! There were some infinite recursion and infinite loop bugs that took some time to hunt down, but it's working pretty well now. | ||
| + | |||
| + | I ran into a really nasty reference counting bug the other day, because I've been swapping objects in place whenever they need to be replaced. This created some really scary situations where I accidentally freed an object that was still in use by the caller, so I've opted against swapping in place except for the outermost API. I'm mostly done refactoring it out, but there' | ||
| + | |||
| + | Overall, I'm feeling really good about the design. Having a custom allocator lets me do some really cool stuff, like splitting an existing allocation into individual parts in-place, which lets me do some efficient list shimmering (I store objects directly in the list, so if one of the objects became shared when freeing the list, I need some way to keep the objects in place. I can split the list's allocation into individual objects, and free all the non-shared objects). | ||
| + | |||
| + | I still haven' | ||
| ==== Outreach ==== | ==== Outreach ==== | ||
| + | Our friends [[https:// | ||
| + | |||
| + | {{newsletters: | ||
| === folk2 launch party === | === folk2 launch party === | ||
| + | |||
| + | We had a [[https:// | ||
| + | |||
| + | {{newsletters: | ||
| + | |||
| + | {{newsletters: | ||
| + | |||
| + | Was a good way to bring people in who hadn't seen Folk in a while, announce nonprofit and folk2 updates, and force ourselves to make progress on public-facing niceties in the Folk system. (We probably made a couple months' | ||
| Omar made some programs to do the merge live on stage: | Omar made some programs to do the merge live on stage: | ||
| Line 64: | Line 290: | ||
| {{newsletters: | {{newsletters: | ||
| - | [[https:// | + | Brian made this poster board with various demo programs people could try out on one of the systems downstairs and was a convenient surface to point gadgets at to demonstrate that they can run all the same programs a bigger system can: |
| {{newsletters: | {{newsletters: | ||
| - | Omar and Andrés gave a short talk about their work on folk2 and the hopes they have for the future of the project. Afterward Daniel talked about the non-profit and funding this work: | + | Omar and Andrés gave a short talk about their work on folk2 and the hopes they have for the future of the project. |
| + | |||
| + | {{newsletters: | ||
| + | |||
| + | Afterward Daniel talked about the non-profit and funding this work: | ||
| + | |||
| + | {{newsletters: | ||
| + | |||
| + | === Folk gadgets at SVA === | ||
| + | |||
| + | Andrés presented to a class they were teaching on UX/UI Fundamentals at the SVA Interaction Design masters program about the future of interfaces. It culminated in a live demo of the Folk gadget, which students had a lot of interesting ideas for building prototypes with: | ||
| + | |||
| + | {{newsletters: | ||
| - | {{newsletters: | + | {{newsletters: |
| ===== What we'll be up to in January ===== | ===== What we'll be up to in January ===== | ||
| - | * TODO: Next open house | + | * Our next [[https:// |
| - | * Omar will be in China and mostly working on the gadget | + | * Omar will mostly |
| + | * Omar wants to do some more model/ | ||
| * Andrés will be working on getting dot detection demos working again and exploring dot interaction demos | * Andrés will be working on getting dot detection demos working again and exploring dot interaction demos | ||
| Line 82: | Line 321: | ||
| ==== Omar ==== | ==== Omar ==== | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| ==== Andrés ==== | ==== Andrés ==== | ||
| Line 88: | Line 333: | ||
| * [[https:// | * [[https:// | ||
| * [[https:// | * [[https:// | ||
| + | * [[https:// | ||
newsletters/2025-12.1766968341.txt.gz · Last modified: by cwervo
