diff --git a/docs/twitter/1674757854471806977/media/1674757854471806977_1.jpg b/docs/twitter/1674757854471806977/media/1674757854471806977_1.jpg new file mode 100644 index 00000000..08f96e43 Binary files /dev/null and b/docs/twitter/1674757854471806977/media/1674757854471806977_1.jpg differ diff --git a/docs/twitter/1674757854471806977/media/1674776150671781888_1.png b/docs/twitter/1674757854471806977/media/1674776150671781888_1.png new file mode 100644 index 00000000..274d7e23 Binary files /dev/null and b/docs/twitter/1674757854471806977/media/1674776150671781888_1.png differ diff --git a/docs/twitter/1674757854471806977/media/1674962613506297857_1.jpg b/docs/twitter/1674757854471806977/media/1674962613506297857_1.jpg new file mode 100644 index 00000000..41f91420 Binary files /dev/null and b/docs/twitter/1674757854471806977/media/1674962613506297857_1.jpg differ diff --git a/docs/twitter/1674757854471806977/media/1675123653162196992_1.jpg b/docs/twitter/1674757854471806977/media/1675123653162196992_1.jpg new file mode 100644 index 00000000..5b42c30b Binary files /dev/null and b/docs/twitter/1674757854471806977/media/1675123653162196992_1.jpg differ diff --git a/docs/twitter/1674757854471806977/thread.md b/docs/twitter/1674757854471806977/thread.md new file mode 100644 index 00000000..2b1a966b --- /dev/null +++ b/docs/twitter/1674757854471806977/thread.md @@ -0,0 +1,110 @@ +--- +title: ""Nothing Oriented Programming" (NOP). Where the goal is to achieve minimal enlig" +author: "NOTimothyLottes" +handle: "@NOTimothyLottes" +post_url: "https://x.com/NOTimothyLottes/status/1674757854471806977" +post_id: "1674757854471806977" +timestamp: "2023-06-30 12:32:42" +post_count: 19 +reply_count: 15 +repost_count: 41 +like_count: 389 +view_count: 54682 +--- + +# @NOTimothyLottes — "Nothing Oriented Programming" (NOP). Where the goal is to achieve minimal enlig + +## Post 1 (2023-06-30 12:32:42) + +"Nothing Oriented Programming" (NOP). Where the goal is to achieve minimal enlightenment by writing as little possible code: no dynamic memory allocation, no thousand files of glue, no includes, no objects. Write nothing, be happy. Even applied it to the logo, zero effort. + +![Media 1](./media/1674757854471806977_1.jpg) + +## Post 2 (2023-06-30 13:16:02) — reply to Post 1 + +@NOTimothyLottes Would be nice to talk a full presentation about this topic, but people want me to show cool tech and pretty pixels instead. Maybe one day. + +I will save your image for that day (if I get approval to use it), since Twitter search is super bad. + +## Post 3 (2023-06-30 13:26:44) — reply to Post 1 + +@NOTimothyLottes $4e71 +if you know, you know + +## Post 4 (2023-06-30 13:40:22) — reply to Post 3 + +@leonard_coder ${EA, 1A, 3A, 5A, 7A, DA, or FA} + +## Post 5 (2023-06-30 13:45:24) — reply to Post 2 + +@SebAaltonen "Approval", haha, sure it's covered under my favorite license + +![Media 1](./media/1674776150671781888_1.png) + +## Post 6 (2023-06-30 13:50:17) — reply to Post 1 + +@NOTimothyLottes I like this, given I never write code any more. +sadly i am still a grumpy git. + +## Post 7 (2023-06-30 17:57:31) — reply to Post 1 + +@NOTimothyLottes Once in a while people need to be reminded to stop the bloat, understand the machine guts and be self aware about productive process +https://tonsky.me/blog/disenchantment/ + +## Post 8 (2023-06-30 21:04:44) — reply to Post 7 + +@_spolsh That was a fantastic read, thanks + +## Post 9 (2023-07-01 02:06:21) — reply to Post 1 + +@NOTimothyLottes + +![Media 1](./media/1674962613506297857_1.jpg) + +## Post 10 (2023-07-01 02:39:25) — reply to Post 1 + +@NOTimothyLottes NOP is ideal. + +## Post 11 (2023-07-01 04:19:23) — reply to Post 1 + +@NOTimothyLottes Best software is absense of it: + +https://en.wikipedia.org/wiki/The_Mythical_Man-Month + +## Post 12 (2023-07-01 05:57:46) — reply to Post 1 + +@NOTimothyLottes Folks, they're calling it "computer oriented programming". It's where you stop trying to impress peers and just tell the computer the best way to do things + +## Post 13 (2023-07-01 08:12:40) — reply to Post 1 + +@NOTimothyLottes c++ to √c + +## Post 14 (2023-07-01 08:30:57) — reply to Post 1 + +@NOTimothyLottes Many games used to be like that, at least the ones without dynamic content, mods, etc... + +Most of the stuff I worked on on PSX and Dreamcast basically just loads big files with everything pre-allocated and aligned properly at the final location, ready to use. + +## Post 15 (2023-07-01 10:27:31) — reply to Post 1 + +@NOTimothyLottes I was calling it "disoriented programming" just the other day. + +https://x.com/PierreTerdiman/status/1673389650172321813?s=20 + +## Post 16 (2023-07-01 12:46:15) — reply to Post 1 + +@NOTimothyLottes Looks like a koala + +![Media 1](./media/1675123653162196992_1.jpg) + +## Post 17 (2023-07-01 14:30:43) — reply to Post 1 + +@NOTimothyLottes @Jonathan_Blow i designed a language Beads, which uses a graph DB, has no memory allocation, super modular, approaches this minimalism as close as humanly possible, but billable hour / job security seeking programmers refuse to try it + +## Post 18 (2023-07-01 21:01:04) — reply to Post 1 + +@NOTimothyLottes Can teach it in abstinence-only programming classes! + +## Post 19 (2023-07-09 17:04:16) — reply to Post 1 + +@NOTimothyLottes https://github.com/wyattscarpenter/wu diff --git a/docs/twitter/1674757854471806977/thread_data.json b/docs/twitter/1674757854471806977/thread_data.json new file mode 100644 index 00000000..7435588d --- /dev/null +++ b/docs/twitter/1674757854471806977/thread_data.json @@ -0,0 +1,318 @@ +{ + "root_post_id": "1674757854471806977", + "posts": [ + { + "post_id": "1674757854471806977", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "\"Nothing Oriented Programming\" (NOP). Where the goal is to achieve minimal enlightenment by writing as little possible code: no dynamic memory allocation, no thousand files of glue, no includes, no objects. Write nothing, be happy. Even applied it to the logo, zero effort.", + "timestamp": "2023-06-30 12:32:42", + "media_urls": [ + "https://pbs.twimg.com/media/Fz3vY5fXwAgEpzn?format=jpg&name=orig" + ], + "reply_to_id": null, + "quote_of_id": null, + "metrics": { + "reply_count": 15, + "repost_count": 41, + "like_count": 389, + "view_count": 54682 + } + }, + { + "post_id": "1674768757867020289", + "author": "Sebastian Aaltonen", + "handle": "SebAaltonen", + "text": "@NOTimothyLottes Would be nice to talk a full presentation about this topic, but people want me to show cool tech and pretty pixels instead. Maybe one day.\n\nI will save your image for that day (if I get approval to use it), since Twitter search is super bad.", + "timestamp": "2023-06-30 13:16:02", + "media_urls": [], + "reply_to_id": "1674757854471806977", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 19, + "view_count": 2939 + } + }, + { + "post_id": "1674771452799614976", + "author": "Arnaud Carré", + "handle": "leonard_coder", + "text": "@NOTimothyLottes $4e71\nif you know, you know", + "timestamp": "2023-06-30 13:26:44", + "media_urls": [], + "reply_to_id": "1674757854471806977", + "quote_of_id": null, + "metrics": { + "reply_count": 2, + "repost_count": 0, + "like_count": 6, + "view_count": 1556 + } + }, + { + "post_id": "1674774881093689346", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "@leonard_coder ${EA, 1A, 3A, 5A, 7A, DA, or FA}", + "timestamp": "2023-06-30 13:40:22", + "media_urls": [], + "reply_to_id": "1674771452799614976", + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 0, + "like_count": 1, + "view_count": 1319 + } + }, + { + "post_id": "1674776150671781888", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "@SebAaltonen \"Approval\", haha, sure it's covered under my favorite license", + "timestamp": "2023-06-30 13:45:24", + "media_urls": [ + "https://pbs.twimg.com/media/Fz3_kb8WYAMXvcT?format=png&name=orig" + ], + "reply_to_id": "1674768757867020289", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 12, + "view_count": 1957 + } + }, + { + "post_id": "1674777379414179840", + "author": "Colin Riley 🎗", + "handle": "domipheus", + "text": "@NOTimothyLottes I like this, given I never write code any more.\nsadly i am still a grumpy git.", + "timestamp": "2023-06-30 13:50:17", + "media_urls": [], + "reply_to_id": "1674757854471806977", + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 0, + "like_count": 2, + "view_count": 947 + } + }, + { + "post_id": "1674839597853835285", + "author": "Michal Klos", + "handle": "_spolsh", + "text": "@NOTimothyLottes Once in a while people need to be reminded to stop the bloat, understand the machine guts and be self aware about productive process\nhttps://tonsky.me/blog/disenchantment/", + "timestamp": "2023-06-30 17:57:31", + "media_urls": [], + "reply_to_id": "1674757854471806977", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 2, + "like_count": 34, + "view_count": 5025 + } + }, + { + "post_id": "1674886711707418624", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "@_spolsh That was a fantastic read, thanks", + "timestamp": "2023-06-30 21:04:44", + "media_urls": [], + "reply_to_id": "1674839597853835285", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 1, + "view_count": 1410 + } + }, + { + "post_id": "1674962613506297857", + "author": "Mike Acton", + "handle": "mike_acton", + "text": "@NOTimothyLottes", + "timestamp": "2023-07-01 02:06:21", + "media_urls": [ + "https://pbs.twimg.com/media/Fz6pnsBaQAEtMIZ?format=jpg&name=orig" + ], + "reply_to_id": "1674757854471806977", + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 0, + "like_count": 13, + "view_count": 2705 + } + }, + { + "post_id": "1674970938234875907", + "author": "Simon Nordon", + "handle": "SimonNordon", + "text": "@NOTimothyLottes NOP is ideal.", + "timestamp": "2023-07-01 02:39:25", + "media_urls": [], + "reply_to_id": "1674757854471806977", + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 0, + "like_count": 0, + "view_count": 513 + } + }, + { + "post_id": "1674996094265163782", + "author": "azeke", + "handle": "azeke1984", + "text": "@NOTimothyLottes Best software is absense of it:\n\nhttps://en.wikipedia.org/wiki/The_Mythical_Man-Month", + "timestamp": "2023-07-01 04:19:23", + "media_urls": [], + "reply_to_id": "1674757854471806977", + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 0, + "like_count": 1, + "view_count": 103 + } + }, + { + "post_id": "1675020853862359041", + "author": "Total Slack Holocaust", + "handle": "helpful_signage", + "text": "@NOTimothyLottes Folks, they're calling it \"computer oriented programming\". It's where you stop trying to impress peers and just tell the computer the best way to do things", + "timestamp": "2023-07-01 05:57:46", + "media_urls": [], + "reply_to_id": "1674757854471806977", + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 0, + "like_count": 1, + "view_count": 85 + } + }, + { + "post_id": "1675054802265423872", + "author": "ᓇᓄᖅ ❄️", + "handle": "claudiogonzalo", + "text": "@NOTimothyLottes c++ to √c", + "timestamp": "2023-07-01 08:12:40", + "media_urls": [], + "reply_to_id": "1674757854471806977", + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 0, + "like_count": 0, + "view_count": 285 + } + }, + { + "post_id": "1675059402280251395", + "author": "Dbug", + "handle": "DefenceForceOrg", + "text": "@NOTimothyLottes Many games used to be like that, at least the ones without dynamic content, mods, etc...\n\nMost of the stuff I worked on on PSX and Dreamcast basically just loads big files with everything pre-allocated and aligned properly at the final location, ready to use.", + "timestamp": "2023-07-01 08:30:57", + "media_urls": [], + "reply_to_id": "1674757854471806977", + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 0, + "like_count": 4, + "view_count": 485 + } + }, + { + "post_id": "1675088736621559808", + "author": "Pierre Terdiman", + "handle": "PierreTerdiman", + "text": "@NOTimothyLottes I was calling it \"disoriented programming\" just the other day.\n\nhttps://x.com/PierreTerdiman/status/1673389650172321813?s=20", + "timestamp": "2023-07-01 10:27:31", + "media_urls": [], + "reply_to_id": "1674757854471806977", + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 0, + "like_count": 0, + "view_count": 724 + } + }, + { + "post_id": "1675123653162196992", + "author": "Aspar", + "handle": "asparagiii", + "text": "@NOTimothyLottes Looks like a koala", + "timestamp": "2023-07-01 12:46:15", + "media_urls": [ + "https://pbs.twimg.com/media/Fz88Bk0WAAApDzL?format=jpg&name=orig" + ], + "reply_to_id": "1674757854471806977", + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 1, + "like_count": 3, + "view_count": 355 + } + }, + { + "post_id": "1675149939759017987", + "author": "Coding Fiend", + "handle": "CodingFiend", + "text": "@NOTimothyLottes @Jonathan_Blow i designed a language Beads, which uses a graph DB, has no memory allocation, super modular, approaches this minimalism as close as humanly possible, but billable hour / job security seeking programmers refuse to try it", + "timestamp": "2023-07-01 14:30:43", + "media_urls": [], + "reply_to_id": "1674757854471806977", + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 0, + "like_count": 0, + "view_count": 275 + } + }, + { + "post_id": "1675248176498987009", + "author": "Tim Sweeney", + "handle": "TimSweeneyEpic", + "text": "@NOTimothyLottes Can teach it in abstinence-only programming classes!", + "timestamp": "2023-07-01 21:01:04", + "media_urls": [], + "reply_to_id": "1674757854471806977", + "quote_of_id": null, + "metrics": { + "reply_count": 2, + "repost_count": 0, + "like_count": 8, + "view_count": 4462 + } + }, + { + "post_id": "1678087686404595712", + "author": "Wyatt S Carpenter", + "handle": "wyattscarpenter", + "text": "@NOTimothyLottes https://github.com/wyattscarpenter/wu", + "timestamp": "2023-07-09 17:04:16", + "media_urls": [], + "reply_to_id": "1674757854471806977", + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 0, + "like_count": 0, + "view_count": 35 + } + } + ], + "source_url": "https://x.com/NOTimothyLottes/status/1674757854471806977" +} \ No newline at end of file diff --git a/docs/twitter/1990260050485797063/media/1990260050485797063_1.png b/docs/twitter/1990260050485797063/media/1990260050485797063_1.png new file mode 100644 index 00000000..4410c780 Binary files /dev/null and b/docs/twitter/1990260050485797063/media/1990260050485797063_1.png differ diff --git a/docs/twitter/1990260050485797063/thread.md b/docs/twitter/1990260050485797063/thread.md new file mode 100644 index 00000000..c4f03d15 --- /dev/null +++ b/docs/twitter/1990260050485797063/thread.md @@ -0,0 +1,56 @@ +--- +title: "I wish everyone would just adopt "reversed with infinite far" projection matrixe" +author: "NOTimothyLottes" +handle: "@NOTimothyLottes" +post_url: "https://x.com/NOTimothyLottes/status/1990260050485797063" +post_id: "1990260050485797063" +timestamp: "2025-11-17 03:25:47" +post_count: 9 +reply_count: 5 +repost_count: 2 +like_count: 85 +view_count: 6057 +--- + +# @NOTimothyLottes — I wish everyone would just adopt "reversed with infinite far" projection matrixe + +## Post 1 (2025-11-17 03:25:47) + +I wish everyone would just adopt "reversed with infinite far" projection matrixes so I could only optimize for the fastest and highest precision option, but I'm guessing people haven't all migrated over :( + +![Media 1](./media/1990260050485797063_1.png) + +## Post 2 (2025-11-17 03:28:35) — reply to Post 1 + +Reversed is a significant improvement but it still has its limitations when doing planetary-scale rendering that needs good precision up both close and far away. Your options there are either a logarithmic depth buffer to linearize things (albeit losing early z), your own integer-based depth test system in compute shaders, or a stack of multiple frustums layered on top of one another. + +## Post 3 (2025-11-17 03:31:41) — reply to Post 2 + +@AgileJebrim Yes for my non-tri stuff I'm log depth already. This is just for games, not simulation. + +## Post 4 (2025-11-17 03:41:27) — reply to Post 3 + +Simulation can usually localize enough that reverse Z is good enough. Google Earth style geospatial visualization is where things get trickier. + +Another option is to dynamically change the far plane, moving it closer as you get closer to the terrain and further back as you move further back. I don’t think I tried this one but I imagine it requires a lot of tuning. + +## Post 5 (2025-11-17 05:03:02) — reply to Post 1 + +@NOTimothyLottes I've never had real depth precision issues in our game ports but I guess I'd better just adopt and get used to reversed infinite projection cause it's objectively better. Promise to try it for our next project :) + +## Post 6 (2025-11-17 05:06:11) — reply to Post 1 + +@NOTimothyLottes Many are still on OpenGLES and WebGL, which don’t properly support inverse depth due to still using a -1 to 1 clip space. Not really a problem for inverse depth in its own, but does cause problems for infinite far depth. + +## Post 7 (2025-11-18 16:26:49) — reply to Post 1 + +@NOTimothyLottes Infinite far doesn’t apply to ortho, and many of editors/engines need to switch camera viewports. But it’s great for persp. Also too much code handing modeInv for normals, which is wrong and unneeded. + +## Post 8 (2025-11-19 18:56:58) — reply to Post 1 + +@NOTimothyLottes I haven't really done graphics in a while, but I've never heard about infinite far nor reversed z, where can I read up on it more? +Some cursory googling didn't return anything useful on this topic. + +## Post 9 (2025-11-20 03:47:56) — reply to Post 8 + +@stainless_code I put some docs (based on an old blog post) on projection matrix stuff inside STP source: https://github.com/Unity-Technologies/Graphics/blob/master/Packages/com.unity.render-pipelines.core/Runtime/STP/Stp.hlsl - Documents the maths to take depth and 2 projections and get a static reprojection vector for example. diff --git a/docs/twitter/1990260050485797063/thread_data.json b/docs/twitter/1990260050485797063/thread_data.json new file mode 100644 index 00000000..5133bcbf --- /dev/null +++ b/docs/twitter/1990260050485797063/thread_data.json @@ -0,0 +1,152 @@ +{ + "root_post_id": "1990260050485797063", + "posts": [ + { + "post_id": "1990260050485797063", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "I wish everyone would just adopt \"reversed with infinite far\" projection matrixes so I could only optimize for the fastest and highest precision option, but I'm guessing people haven't all migrated over :(", + "timestamp": "2025-11-17 03:25:47", + "media_urls": [ + "https://pbs.twimg.com/media/G57SXPJW8AAvEhh?format=png&name=orig" + ], + "reply_to_id": null, + "quote_of_id": null, + "metrics": { + "reply_count": 5, + "repost_count": 2, + "like_count": 85, + "view_count": 6057 + } + }, + { + "post_id": "1990260754688172298", + "author": "Jebrim", + "handle": "AgileJebrim", + "text": "Reversed is a significant improvement but it still has its limitations when doing planetary-scale rendering that needs good precision up both close and far away. Your options there are either a logarithmic depth buffer to linearize things (albeit losing early z), your own integer-based depth test system in compute shaders, or a stack of multiple frustums layered on top of one another.", + "timestamp": "2025-11-17 03:28:35", + "media_urls": [], + "reply_to_id": "1990260050485797063", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 2, + "view_count": 820 + } + }, + { + "post_id": "1990261535491723691", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "@AgileJebrim Yes for my non-tri stuff I'm log depth already. This is just for games, not simulation.", + "timestamp": "2025-11-17 03:31:41", + "media_urls": [], + "reply_to_id": "1990260754688172298", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 2, + "view_count": 589 + } + }, + { + "post_id": "1990263993236136239", + "author": "Jebrim", + "handle": "AgileJebrim", + "text": "Simulation can usually localize enough that reverse Z is good enough. Google Earth style geospatial visualization is where things get trickier.\n\nAnother option is to dynamically change the far plane, moving it closer as you get closer to the terrain and further back as you move further back. I don’t think I tried this one but I imagine it requires a lot of tuning.", + "timestamp": "2025-11-17 03:41:27", + "media_urls": [], + "reply_to_id": "1990261535491723691", + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 0, + "like_count": 0, + "view_count": 320 + } + }, + { + "post_id": "1990284522508927371", + "author": "Dmitrii Terekhov", + "handle": "terekhov_de", + "text": "@NOTimothyLottes I've never had real depth precision issues in our game ports but I guess I'd better just adopt and get used to reversed infinite projection cause it's objectively better. Promise to try it for our next project :)", + "timestamp": "2025-11-17 05:03:02", + "media_urls": [], + "reply_to_id": "1990260050485797063", + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 0, + "like_count": 2, + "view_count": 344 + } + }, + { + "post_id": "1990285316054503566", + "author": "Ben Golus⚠️⭕", + "handle": "bgolus", + "text": "@NOTimothyLottes Many are still on OpenGLES and WebGL, which don’t properly support inverse depth due to still using a -1 to 1 clip space. Not really a problem for inverse depth in its own, but does cause problems for infinite far depth.", + "timestamp": "2025-11-17 05:06:11", + "media_urls": [], + "reply_to_id": "1990260050485797063", + "quote_of_id": null, + "metrics": { + "reply_count": 2, + "repost_count": 1, + "like_count": 1, + "view_count": 689 + } + }, + { + "post_id": "1990818990059671922", + "author": "Alec Miller", + "handle": "Alecazam123", + "text": "@NOTimothyLottes Infinite far doesn’t apply to ortho, and many of editors/engines need to switch camera viewports. But it’s great for persp. Also too much code handing modeInv for normals, which is wrong and unneeded.", + "timestamp": "2025-11-18 16:26:49", + "media_urls": [], + "reply_to_id": "1990260050485797063", + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 0, + "like_count": 1, + "view_count": 85 + } + }, + { + "post_id": "1991219165978370275", + "author": "Yuriy Stets", + "handle": "stainless_code", + "text": "@NOTimothyLottes I haven't really done graphics in a while, but I've never heard about infinite far nor reversed z, where can I read up on it more?\nSome cursory googling didn't return anything useful on this topic.", + "timestamp": "2025-11-19 18:56:58", + "media_urls": [], + "reply_to_id": "1990260050485797063", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 0, + "view_count": 85 + } + }, + { + "post_id": "1991352784529289269", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "@stainless_code I put some docs (based on an old blog post) on projection matrix stuff inside STP source: https://github.com/Unity-Technologies/Graphics/blob/master/Packages/com.unity.render-pipelines.core/Runtime/STP/Stp.hlsl - Documents the maths to take depth and 2 projections and get a static reprojection vector for example.", + "timestamp": "2025-11-20 03:47:56", + "media_urls": [], + "reply_to_id": "1991219165978370275", + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 0, + "like_count": 1, + "view_count": 133 + } + } + ], + "source_url": "https://x.com/NOTimothyLottes/status/1990260050485797063" +} \ No newline at end of file diff --git a/docs/twitter/2030722033286328426/thread.md b/docs/twitter/2030722033286328426/thread.md new file mode 100644 index 00000000..f15350c2 --- /dev/null +++ b/docs/twitter/2030722033286328426/thread.md @@ -0,0 +1,55 @@ +--- +title: "I'll add one conspiracy theory for everyone listening: After STP's source was ou" +author: "NOTimothyLottes" +handle: "@NOTimothyLottes" +post_url: "https://x.com/NOTimothyLottes/status/2030722033286328426" +post_id: "2030722033286328426" +timestamp: "2026-03-08 19:07:16" +post_count: 10 +reply_count: 3 +repost_count: 3 +like_count: 56 +view_count: 6039 +--- + +# @NOTimothyLottes — I'll add one conspiracy theory for everyone listening: After STP's source was ou + +## Post 1 (2026-03-08 19:07:16) + +I'll add one conspiracy theory for everyone listening: After STP's source was out there, DLSS4 'transformer' magically gained 'sharpness' but I don't believe it was from the ML model change at all, instead I think they just introduced the same error feedback mechanism in STP ... + +## Post 2 (2026-03-08 19:09:05) — reply to Post 1 + +Specifically STP samples feedback at the position of the input pixels, and uses that difference as an error term estimating the amount of blur introduced, one can subtract out some amount of that 'error' to sharpen ... + +## Post 3 (2026-03-08 19:12:21) — reply to Post 2 + +Of course that idea isn't strictly new either, fluid sims with advection use similar logic to sharpen. So I'm just another human building on the masters of the past. One can start to go beyond sharpening with this technique and get into local contrast adaption too ... + +## Post 4 (2026-03-08 19:14:24) — reply to Post 3 + +One of the marketing points of DLSS4 was 'sharpness' but it didn't actually resolve details to a higher frequency than prior, instead it just gets to a higher contrast, and then they con the consumer with that ... + +## Post 5 (2026-03-08 19:19:47) — reply to Post 4 + +Another trick one can employ, and something I used often as a pro photographer, was to deliberately thin or thicken features with sub-pixel precision during enlargement. Meaning you can take a 'feature' and thin it below source nyquist. And people go 'wow' it's detailed ... + +## Post 6 (2026-03-08 19:23:20) — reply to Post 5 + +So for instance one can take a input (lower-resolution) feature and simultaneously increase it's contrast while reducing it's thickness (when enlarged) in an energy preserving way. Can use signal bounds to estimate how much contrast and thus thin-ness one can push the feature ... + +## Post 7 (2026-03-08 19:24:31) — reply to Post 6 + +This gets easier with color signals because you can take the minimum bounds of the three channels, this is actually exactly what CAS does (just applied in a context without enlargement) ... + +## Post 8 (2026-03-08 19:25:46) — reply to Post 7 + +Anyway all this stuff is easy to artistically shape analytically in shader code, and never needed any kind of ML to be implemented (in fact ML would be slow, because it cannot do max/min style logic!!!). + +## Post 9 (2026-03-08 19:55:21) — reply to Post 1 + +@NOTimothyLottes Did they not just use more historical frames to get their samples and have a better model to compensate for the side effects? + +## Post 10 (2026-03-08 20:09:19) — reply to Post 9 + +@gindi4711 Costs went up a lot so maybe. But cannot really add frames of context without getting costly. Secondary option is to store extra data in feedback sideband. diff --git a/docs/twitter/2030722033286328426/thread_data.json b/docs/twitter/2030722033286328426/thread_data.json new file mode 100644 index 00000000..3e4d0913 --- /dev/null +++ b/docs/twitter/2030722033286328426/thread_data.json @@ -0,0 +1,166 @@ +{ + "root_post_id": "2030722033286328426", + "posts": [ + { + "post_id": "2030722033286328426", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "I'll add one conspiracy theory for everyone listening: After STP's source was out there, DLSS4 'transformer' magically gained 'sharpness' but I don't believe it was from the ML model change at all, instead I think they just introduced the same error feedback mechanism in STP ...", + "timestamp": "2026-03-08 19:07:16", + "media_urls": [], + "reply_to_id": null, + "quote_of_id": null, + "metrics": { + "reply_count": 3, + "repost_count": 3, + "like_count": 56, + "view_count": 6039 + } + }, + { + "post_id": "2030722489538543674", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "Specifically STP samples feedback at the position of the input pixels, and uses that difference as an error term estimating the amount of blur introduced, one can subtract out some amount of that 'error' to sharpen ...", + "timestamp": "2026-03-08 19:09:05", + "media_urls": [], + "reply_to_id": "2030722033286328426", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 13, + "view_count": 1175 + } + }, + { + "post_id": "2030723314801357065", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "Of course that idea isn't strictly new either, fluid sims with advection use similar logic to sharpen. So I'm just another human building on the masters of the past. One can start to go beyond sharpening with this technique and get into local contrast adaption too ...", + "timestamp": "2026-03-08 19:12:21", + "media_urls": [], + "reply_to_id": "2030722489538543674", + "quote_of_id": null, + "metrics": { + "reply_count": 2, + "repost_count": 0, + "like_count": 11, + "view_count": 1125 + } + }, + { + "post_id": "2030723826993213805", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "One of the marketing points of DLSS4 was 'sharpness' but it didn't actually resolve details to a higher frequency than prior, instead it just gets to a higher contrast, and then they con the consumer with that ...", + "timestamp": "2026-03-08 19:14:24", + "media_urls": [], + "reply_to_id": "2030723314801357065", + "quote_of_id": null, + "metrics": { + "reply_count": 2, + "repost_count": 0, + "like_count": 8, + "view_count": 820 + } + }, + { + "post_id": "2030725182671798689", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "Another trick one can employ, and something I used often as a pro photographer, was to deliberately thin or thicken features with sub-pixel precision during enlargement. Meaning you can take a 'feature' and thin it below source nyquist. And people go 'wow' it's detailed ...", + "timestamp": "2026-03-08 19:19:47", + "media_urls": [], + "reply_to_id": "2030723826993213805", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 10, + "view_count": 752 + } + }, + { + "post_id": "2030726077312541100", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "So for instance one can take a input (lower-resolution) feature and simultaneously increase it's contrast while reducing it's thickness (when enlarged) in an energy preserving way. Can use signal bounds to estimate how much contrast and thus thin-ness one can push the feature ...", + "timestamp": "2026-03-08 19:23:20", + "media_urls": [], + "reply_to_id": "2030725182671798689", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 6, + "view_count": 712 + } + }, + { + "post_id": "2030726373124317233", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "This gets easier with color signals because you can take the minimum bounds of the three channels, this is actually exactly what CAS does (just applied in a context without enlargement) ...", + "timestamp": "2026-03-08 19:24:31", + "media_urls": [], + "reply_to_id": "2030726077312541100", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 5, + "view_count": 1328 + } + }, + { + "post_id": "2030726690721198381", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "Anyway all this stuff is easy to artistically shape analytically in shader code, and never needed any kind of ML to be implemented (in fact ML would be slow, because it cannot do max/min style logic!!!).", + "timestamp": "2026-03-08 19:25:46", + "media_urls": [], + "reply_to_id": "2030726373124317233", + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 0, + "like_count": 9, + "view_count": 1263 + } + }, + { + "post_id": "2030734135338144038", + "author": "Gindi4711", + "handle": "gindi4711", + "text": "@NOTimothyLottes Did they not just use more historical frames to get their samples and have a better model to compensate for the side effects?", + "timestamp": "2026-03-08 19:55:21", + "media_urls": [], + "reply_to_id": "2030722033286328426", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 0, + "view_count": 506 + } + }, + { + "post_id": "2030737650882113897", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "@gindi4711 Costs went up a lot so maybe. But cannot really add frames of context without getting costly. Secondary option is to store extra data in feedback sideband.", + "timestamp": "2026-03-08 20:09:19", + "media_urls": [], + "reply_to_id": "2030734135338144038", + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 0, + "like_count": 0, + "view_count": 458 + } + } + ], + "source_url": "https://x.com/NOTimothyLottes/status/2030722033286328426" +} \ No newline at end of file diff --git a/docs/twitter/2058166883044516181/thread.md b/docs/twitter/2058166883044516181/thread.md new file mode 100644 index 00000000..bb3fb524 --- /dev/null +++ b/docs/twitter/2058166883044516181/thread.md @@ -0,0 +1,46 @@ +--- +title: "Most crap-o-grammers today in the user-space C++ bloat-ware domain have not real" +author: "NOTimothyLottes" +handle: "@NOTimothyLottes" +post_url: "https://x.com/NOTimothyLottes/status/2058166883044516181" +post_id: "2058166883044516181" +timestamp: "2026-05-23 12:43:18" +post_count: 7 +reply_count: 0 +repost_count: 0 +like_count: 1 +view_count: 640 +--- + +# @NOTimothyLottes — Most crap-o-grammers today in the user-space C++ bloat-ware domain have not real + +## Post 1 (2026-05-23 12:13:57) + +Another memorial weekend thought: for either +(a.) single use code - [majority of slopware] +(b.) cold cache code - [also typical of slopware] +the CPU loading the code is a significant amount of the burned memory bandwidth ... + +## Post 2 (2026-05-23 12:19:37) — reply to Post 1 + +Meaning in C/C++ land where "programmers" (or rather slop-rammers) mostly sniff argument sloshing glue, moving to a scatter instead of gather based language with a single common "call" that just overreads all the register args, would likely be significantly faster ... + +## Post 3 (2026-05-23 12:23:45) — reply to Post 2 + +The analog for the syscall side is to work from a 'tape' pointer read the 7 registers (syscall number in rax, and the 6 max args) always from a linear stream, but advance the read pointer by the number of actual registers used. So the overfetch is just a linear prefetch ... + +## Post 4 (2026-05-23 12:26:06) — reply to Post 3 + +If working with only 32-bit args (see the MAP_32BIT comment), it would be efficient. Add a post-syscall address to call in the common syscall loop, the part that does post-syscall logic like scattering data to future argument read slots (aka the scatter part) ... + +## Post 5 (2026-05-23 12:35:27) — reply to Post 4 + +Now if it was possible to uber-op the post call logic, meaning a fixed logic block that is just data configurable, that call goes away, and it's all probably executing instructions out of the cache (at some level) ... + +## Post 6 (2026-05-23 12:37:42) — reply to Post 5 + +Effectively you'd have an 'initialization language' which is designed to workaround cold execution paths, but with linear CPU prefetch friendly data access for reads, and random scatter for stores (where latency don't matter) ... + +## Post 7 (2026-05-23 12:43:18) — reply to Post 6 + +Most crap-o-grammers today in the user-space C++ bloat-ware domain have not really optimized for performance, rather they optimized for maximum bloat generation. Just add up how much the installed libraries weigh in MiB on a clean OS install. diff --git a/docs/twitter/2058166883044516181/thread_data.json b/docs/twitter/2058166883044516181/thread_data.json new file mode 100644 index 00000000..20d4dbc3 --- /dev/null +++ b/docs/twitter/2058166883044516181/thread_data.json @@ -0,0 +1,118 @@ +{ + "root_post_id": "2058166883044516181", + "posts": [ + { + "post_id": "2058159498716463375", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "Another memorial weekend thought: for either \n(a.) single use code - [majority of slopware]\n(b.) cold cache code - [also typical of slopware]\nthe CPU loading the code is a significant amount of the burned memory bandwidth ...", + "timestamp": "2026-05-23 12:13:57", + "media_urls": [], + "reply_to_id": null, + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 8, + "view_count": 1679 + } + }, + { + "post_id": "2058160921462063183", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "Meaning in C/C++ land where \"programmers\" (or rather slop-rammers) mostly sniff argument sloshing glue, moving to a scatter instead of gather based language with a single common \"call\" that just overreads all the register args, would likely be significantly faster ...", + "timestamp": "2026-05-23 12:19:37", + "media_urls": [], + "reply_to_id": "2058159498716463375", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 2, + "view_count": 413 + } + }, + { + "post_id": "2058161964442866061", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "The analog for the syscall side is to work from a 'tape' pointer read the 7 registers (syscall number in rax, and the 6 max args) always from a linear stream, but advance the read pointer by the number of actual registers used. So the overfetch is just a linear prefetch ...", + "timestamp": "2026-05-23 12:23:45", + "media_urls": [], + "reply_to_id": "2058160921462063183", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 1, + "view_count": 401 + } + }, + { + "post_id": "2058162553541300497", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "If working with only 32-bit args (see the MAP_32BIT comment), it would be efficient. Add a post-syscall address to call in the common syscall loop, the part that does post-syscall logic like scattering data to future argument read slots (aka the scatter part) ...", + "timestamp": "2026-05-23 12:26:06", + "media_urls": [], + "reply_to_id": "2058161964442866061", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 0, + "view_count": 237 + } + }, + { + "post_id": "2058164906659066002", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "Now if it was possible to uber-op the post call logic, meaning a fixed logic block that is just data configurable, that call goes away, and it's all probably executing instructions out of the cache (at some level) ...", + "timestamp": "2026-05-23 12:35:27", + "media_urls": [], + "reply_to_id": "2058162553541300497", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 0, + "view_count": 188 + } + }, + { + "post_id": "2058165475033440643", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "Effectively you'd have an 'initialization language' which is designed to workaround cold execution paths, but with linear CPU prefetch friendly data access for reads, and random scatter for stores (where latency don't matter) ...", + "timestamp": "2026-05-23 12:37:42", + "media_urls": [], + "reply_to_id": "2058164906659066002", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 1, + "view_count": 666 + } + }, + { + "post_id": "2058166883044516181", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "Most crap-o-grammers today in the user-space C++ bloat-ware domain have not really optimized for performance, rather they optimized for maximum bloat generation. Just add up how much the installed libraries weigh in MiB on a clean OS install.", + "timestamp": "2026-05-23 12:43:18", + "media_urls": [], + "reply_to_id": "2058165475033440643", + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 0, + "like_count": 1, + "view_count": 640 + } + } + ], + "source_url": "https://x.com/NOTimothyLottes/status/2058166883044516181" +} \ No newline at end of file diff --git a/docs/twitter/2060191401883619479/thread.md b/docs/twitter/2060191401883619479/thread.md new file mode 100644 index 00000000..6c7031d7 --- /dev/null +++ b/docs/twitter/2060191401883619479/thread.md @@ -0,0 +1,63 @@ +--- +title: "https://trickybitsblog.github.io/2024/02/25/timestamps.html is a nice related re" +author: "NOTimothyLottes" +handle: "@NOTimothyLottes" +post_url: "https://x.com/NOTimothyLottes/status/2060191401883619479" +post_id: "2060191401883619479" +timestamp: "2026-05-29 02:48:01" +post_count: 12 +reply_count: 1 +repost_count: 0 +like_count: 5 +view_count: 242 +--- + +# @NOTimothyLottes — https://trickybitsblog.github.io/2024/02/25/timestamps.html is a nice related re + +## Post 1 (2026-05-29 02:28:17) + +Took perhaps a 5 month vacation from at home programming, but getting back in the grove with 1hr/day. Polishing up my WIN32 and Linux system call interfaces. Perhaps working towards a demo of GPU-side audio and network processing. + +## Post 2 (2026-05-29 02:39:47) — reply to Post 1 + +Today's topic was Sleep [crap] vs NtDelayExecution [good], does seem useful to be able to NtAlertThread while a thread is sleeping (an analog to signaling while nanosleeping on Linux). + +## Post 3 (2026-05-29 02:43:22) — reply to Post 2 + +Futex users, there is the WakeByAddressAll and WaitOnAddress in Windows. But why use those when you can just directly call https://ntdoc.m417z.com/rtlwaitonaddress - but haven't tried that yet, and are the docs correct, why PLARGE_INTEGER for ms, when NtDelayExecution does the 100ns unit thing? + +## Post 4 (2026-05-29 02:48:01) — reply to Post 3 + +https://trickybitsblog.github.io/2024/02/25/timestamps.html is a nice related read, also I'm a little late to the https://ntdoc.m417z.com/system_hypervisor_user_shared_data party, but will have that sorted soon as well + +## Post 5 (2026-05-29 02:52:57) — reply to Post 4 + +Other thought, I typically mmap an extra LOG file, and write via atomic to grab a fixed width line. No stdout. The log wraps around and exists for multiple executions or even parallel processes. It's the way to do it ... BUT ... + +## Post 6 (2026-05-29 02:55:54) — reply to Post 5 + +... I think I'm going to just move the LOG file into the first N KiB of the CART file. So mmap'ed on CPU and GPU, and I can just bank on how "less" doesn't actually load the entire file while printing, so I can still see output on a console if needed for debug. + +## Post 7 (2026-05-29 03:02:52) — reply to Post 6 + +And another random thought, can you force de-power the CPU by abusing the https://www.felixcloutier.com/x86/pause instruction for things that are not spin-loops :) Going to have to try this one at some point. + +## Post 8 (2026-05-29 03:05:57) — reply to Post 7 + +Pushing data to GPU is really a no-brainer (write-combined stores), minus possibility of non-atomic write visibility, so I do simple stuff like always having a ring buffer of packets available where the GPU can validate each entry with a HASH, taking the latest valid one to use + +## Post 9 (2026-05-29 03:09:32) — reply to Post 8 + +Also AMD exports non-cached memory in VK, so it's possible to poll on data the CPU pushes (via write combined stores to VRAM) on AMD a few times per frame even. + +## Post 10 (2026-05-29 03:10:49) — reply to Post 9 + +The workaround for NVIDIA is if one wants to read N times per frame, then the CPU needs to duplicate the packet ring to N separate lines. Then the GPU is free to poll, but using separate cachelines each time. + +## Post 11 (2026-05-29 03:14:46) — reply to Post 10 + +The route back for IO that needs to be routed through the CPU {audio out, network out} is a lot more unfun. AMD again has the nice uncached memory support, so that part is easy. NVIDIA well, would have to take the crappy mid-frame L2 writeback (likely) making CPU-read available + +## Post 12 (2026-05-29 03:19:53) — reply to Post 11 + +Those who have tread here before with driver side logic (DMA transfers/etc) got screwed, Win+Linux driver idiots and their CPU interrupt based scheduling = completely useless. So getting the driver out of the picture is the way to go diff --git a/docs/twitter/2060191401883619479/thread_data.json b/docs/twitter/2060191401883619479/thread_data.json new file mode 100644 index 00000000..730f34e2 --- /dev/null +++ b/docs/twitter/2060191401883619479/thread_data.json @@ -0,0 +1,198 @@ +{ + "root_post_id": "2060191401883619479", + "posts": [ + { + "post_id": "2060186437820010850", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "Took perhaps a 5 month vacation from at home programming, but getting back in the grove with 1hr/day. Polishing up my WIN32 and Linux system call interfaces. Perhaps working towards a demo of GPU-side audio and network processing.", + "timestamp": "2026-05-29 02:28:17", + "media_urls": [], + "reply_to_id": null, + "quote_of_id": null, + "metrics": { + "reply_count": 3, + "repost_count": 1, + "like_count": 49, + "view_count": 3893 + } + }, + { + "post_id": "2060189329801003343", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "Today's topic was Sleep [crap] vs NtDelayExecution [good], does seem useful to be able to NtAlertThread while a thread is sleeping (an analog to signaling while nanosleeping on Linux).", + "timestamp": "2026-05-29 02:39:47", + "media_urls": [], + "reply_to_id": "2060186437820010850", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 11, + "view_count": 707 + } + }, + { + "post_id": "2060190230838223346", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "Futex users, there is the WakeByAddressAll and WaitOnAddress in Windows. But why use those when you can just directly call https://ntdoc.m417z.com/rtlwaitonaddress - but haven't tried that yet, and are the docs correct, why PLARGE_INTEGER for ms, when NtDelayExecution does the 100ns unit thing?", + "timestamp": "2026-05-29 02:43:22", + "media_urls": [], + "reply_to_id": "2060189329801003343", + "quote_of_id": null, + "metrics": { + "reply_count": 2, + "repost_count": 0, + "like_count": 9, + "view_count": 654 + } + }, + { + "post_id": "2060191401883619479", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "https://trickybitsblog.github.io/2024/02/25/timestamps.html is a nice related read, also I'm a little late to the https://ntdoc.m417z.com/system_hypervisor_user_shared_data party, but will have that sorted soon as well", + "timestamp": "2026-05-29 02:48:01", + "media_urls": [], + "reply_to_id": "2060190230838223346", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 5, + "view_count": 242 + } + }, + { + "post_id": "2060192645582905577", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "Other thought, I typically mmap an extra LOG file, and write via atomic to grab a fixed width line. No stdout. The log wraps around and exists for multiple executions or even parallel processes. It's the way to do it ... BUT ...", + "timestamp": "2026-05-29 02:52:57", + "media_urls": [], + "reply_to_id": "2060191401883619479", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 4, + "view_count": 210 + } + }, + { + "post_id": "2060193385411969118", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "... I think I'm going to just move the LOG file into the first N KiB of the CART file. So mmap'ed on CPU and GPU, and I can just bank on how \"less\" doesn't actually load the entire file while printing, so I can still see output on a console if needed for debug.", + "timestamp": "2026-05-29 02:55:54", + "media_urls": [], + "reply_to_id": "2060192645582905577", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 4, + "view_count": 212 + } + }, + { + "post_id": "2060195139696365679", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "And another random thought, can you force de-power the CPU by abusing the https://www.felixcloutier.com/x86/pause instruction for things that are not spin-loops :) Going to have to try this one at some point.", + "timestamp": "2026-05-29 03:02:52", + "media_urls": [], + "reply_to_id": "2060193385411969118", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 4, + "view_count": 183 + } + }, + { + "post_id": "2060195914568851775", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "Pushing data to GPU is really a no-brainer (write-combined stores), minus possibility of non-atomic write visibility, so I do simple stuff like always having a ring buffer of packets available where the GPU can validate each entry with a HASH, taking the latest valid one to use", + "timestamp": "2026-05-29 03:05:57", + "media_urls": [], + "reply_to_id": "2060195139696365679", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 5, + "view_count": 176 + } + }, + { + "post_id": "2060196816574882209", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "Also AMD exports non-cached memory in VK, so it's possible to poll on data the CPU pushes (via write combined stores to VRAM) on AMD a few times per frame even.", + "timestamp": "2026-05-29 03:09:32", + "media_urls": [], + "reply_to_id": "2060195914568851775", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 3, + "view_count": 182 + } + }, + { + "post_id": "2060197138923938169", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "The workaround for NVIDIA is if one wants to read N times per frame, then the CPU needs to duplicate the packet ring to N separate lines. Then the GPU is free to poll, but using separate cachelines each time.", + "timestamp": "2026-05-29 03:10:49", + "media_urls": [], + "reply_to_id": "2060196816574882209", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 4, + "view_count": 239 + } + }, + { + "post_id": "2060198133905199300", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "The route back for IO that needs to be routed through the CPU {audio out, network out} is a lot more unfun. AMD again has the nice uncached memory support, so that part is easy. NVIDIA well, would have to take the crappy mid-frame L2 writeback (likely) making CPU-read available", + "timestamp": "2026-05-29 03:14:46", + "media_urls": [], + "reply_to_id": "2060197138923938169", + "quote_of_id": null, + "metrics": { + "reply_count": 2, + "repost_count": 0, + "like_count": 4, + "view_count": 570 + } + }, + { + "post_id": "2060199422730871174", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "Those who have tread here before with driver side logic (DMA transfers/etc) got screwed, Win+Linux driver idiots and their CPU interrupt based scheduling = completely useless. So getting the driver out of the picture is the way to go", + "timestamp": "2026-05-29 03:19:53", + "media_urls": [], + "reply_to_id": "2060198133905199300", + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 0, + "like_count": 4, + "view_count": 508 + } + } + ], + "source_url": "https://x.com/NOTimothyLottes/status/2060191401883619479" +} \ No newline at end of file diff --git a/docs/twitter/2060730425929080874/media/2060730425929080874_1.png b/docs/twitter/2060730425929080874/media/2060730425929080874_1.png new file mode 100644 index 00000000..1b05ef9c Binary files /dev/null and b/docs/twitter/2060730425929080874/media/2060730425929080874_1.png differ diff --git a/docs/twitter/2060730425929080874/thread.md b/docs/twitter/2060730425929080874/thread.md new file mode 100644 index 00000000..af643822 --- /dev/null +++ b/docs/twitter/2060730425929080874/thread.md @@ -0,0 +1,41 @@ +--- +title: "Renovating CPU clock code. I'm assuming x86-64 TSC is always >= 1 GHz so that co" +author: "NOTimothyLottes" +handle: "@NOTimothyLottes" +post_url: "https://x.com/NOTimothyLottes/status/2060730425929080874" +post_id: "2060730425929080874" +timestamp: "2026-05-30 14:29:54" +post_count: 6 +reply_count: 3 +repost_count: 0 +like_count: 40 +view_count: 4744 +--- + +# @NOTimothyLottes — Renovating CPU clock code. I'm assuming x86-64 TSC is always >= 1 GHz so that co + +## Post 1 (2026-05-30 14:29:54) + +Renovating CPU clock code. I'm assuming x86-64 TSC is always >= 1 GHz so that conversion of clock counter diff to nanoseconds is simply a MUL instruction fetching the RDX high 64-bit result (of the 128-bit computed). But figuring out how to do the inline asm was a pain. + +![Media 1](./media/2060730425929080874_1.png) + +## Post 2 (2026-05-30 15:16:24) — reply to Post 1 + +Looks like NtQuerySystemInformation() with SystemHypervisorSharedPageInformation (aka 0xc5) gives 64-bit scalar for TSC that converts time to units of 10 MHz. So the smart way is to work in units of TSC, then do a subtraction of TSC terms, then MULHI to get {ms, us, or ns} time + +## Post 3 (2026-05-30 15:59:17) — reply to Post 2 + +https://gist.github.com/pmttavara/6f06fc5c7679c07375483b06bb77430c - A great reference for getting TSC scaling multipliers on Linux and Windows + +## Post 4 (2026-05-31 00:46:04) — reply to Post 1 + +@NOTimothyLottes If you do the multiply in uint128_t and then right-shift by 64 places, the compiler should do the right thing. + +## Post 5 (2026-05-31 01:37:00) — reply to Post 4 + +@FUZxxl “Should” is exactly why I prefer the actual instruction instrinsics or just inline asm (which is what I use on C CPU land) + +## Post 6 (2026-05-31 08:23:19) — reply to Post 5 + +@NOTimothyLottes Have fun with a solution that the compiler optimises worse and that is not portable. diff --git a/docs/twitter/2060730425929080874/thread_data.json b/docs/twitter/2060730425929080874/thread_data.json new file mode 100644 index 00000000..27298999 --- /dev/null +++ b/docs/twitter/2060730425929080874/thread_data.json @@ -0,0 +1,104 @@ +{ + "root_post_id": "2060730425929080874", + "posts": [ + { + "post_id": "2060730425929080874", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "Renovating CPU clock code. I'm assuming x86-64 TSC is always >= 1 GHz so that conversion of clock counter diff to nanoseconds is simply a MUL instruction fetching the RDX high 64-bit result (of the 128-bit computed). But figuring out how to do the inline asm was a pain.", + "timestamp": "2026-05-30 14:29:54", + "media_urls": [ + "https://pbs.twimg.com/media/HJku0L4WkAAZk5a?format=png&name=orig" + ], + "reply_to_id": null, + "quote_of_id": null, + "metrics": { + "reply_count": 3, + "repost_count": 0, + "like_count": 40, + "view_count": 4744 + } + }, + { + "post_id": "2060742129190568413", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "Looks like NtQuerySystemInformation() with SystemHypervisorSharedPageInformation (aka 0xc5) gives 64-bit scalar for TSC that converts time to units of 10 MHz. So the smart way is to work in units of TSC, then do a subtraction of TSC terms, then MULHI to get {ms, us, or ns} time", + "timestamp": "2026-05-30 15:16:24", + "media_urls": [], + "reply_to_id": "2060730425929080874", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 6, + "view_count": 1060 + } + }, + { + "post_id": "2060752921092833490", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "https://gist.github.com/pmttavara/6f06fc5c7679c07375483b06bb77430c - A great reference for getting TSC scaling multipliers on Linux and Windows", + "timestamp": "2026-05-30 15:59:17", + "media_urls": [], + "reply_to_id": "2060742129190568413", + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 0, + "like_count": 11, + "view_count": 924 + } + }, + { + "post_id": "2060885487858880689", + "author": "Robert Clausecker", + "handle": "FUZxxl", + "text": "@NOTimothyLottes If you do the multiply in uint128_t and then right-shift by 64 places, the compiler should do the right thing.", + "timestamp": "2026-05-31 00:46:04", + "media_urls": [], + "reply_to_id": "2060730425929080874", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 2, + "view_count": 253 + } + }, + { + "post_id": "2060898306851516562", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "@FUZxxl “Should” is exactly why I prefer the actual instruction instrinsics or just inline asm (which is what I use on C CPU land)", + "timestamp": "2026-05-31 01:37:00", + "media_urls": [], + "reply_to_id": "2060885487858880689", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 0, + "view_count": 125 + } + }, + { + "post_id": "2061000558698197386", + "author": "Robert Clausecker", + "handle": "FUZxxl", + "text": "@NOTimothyLottes Have fun with a solution that the compiler optimises worse and that is not portable.", + "timestamp": "2026-05-31 08:23:19", + "media_urls": [], + "reply_to_id": "2060898306851516562", + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 0, + "like_count": 0, + "view_count": 27 + } + } + ], + "source_url": "https://x.com/NOTimothyLottes/status/2060730425929080874" +} \ No newline at end of file diff --git a/docs/twitter/2061123768429211767/thread.md b/docs/twitter/2061123768429211767/thread.md new file mode 100644 index 00000000..02647a39 --- /dev/null +++ b/docs/twitter/2061123768429211767/thread.md @@ -0,0 +1,35 @@ +--- +title: "no-debugger-debug / console / printf-style - prior evolved to one mmapped fixed-" +author: "NOTimothyLottes" +handle: "@NOTimothyLottes" +post_url: "https://x.com/NOTimothyLottes/status/2061123768429211767" +post_id: "2061123768429211767" +timestamp: "2026-05-31 16:32:54" +post_count: 5 +reply_count: 2 +repost_count: 0 +like_count: 9 +view_count: 2974 +--- + +# @NOTimothyLottes — no-debugger-debug / console / printf-style - prior evolved to one mmapped fixed- + +## Post 1 (2026-05-31 16:32:54) + +no-debugger-debug / console / printf-style - prior evolved to one mmapped fixed-width-height log file with an atomic for multi-thread|process messages - but even that seems too complexy ... + +## Post 2 (2026-05-31 16:35:58) — reply to Post 1 + +moving to this >>> CART file is mmapped on CPU with mapped GPU access (no file IO) - background page walker to ensure OS won't page it out - beginning of CART file is a grid of 32-bit unsigned values - hex dumping that as my 'log file' - either to term or GPU render + +## Post 3 (2026-05-31 16:37:34) — reply to Post 2 + +hits the easy to debug CPU or GPU stuff in the same framework (simply write and it just appears) - it's always a HEX dump, but can show decimal by pretending it's a 4-bit/character terminal with a hex font :) + +## Post 4 (2026-05-31 22:01:24) — reply to Post 1 + +@NOTimothyLottes Here I am still debugging by looking at if a single LED turns on. + +## Post 5 (2026-06-01 01:05:59) — reply to Post 4 + +@retrotink2 That plus an oscilloscope … this is the way diff --git a/docs/twitter/2061123768429211767/thread_data.json b/docs/twitter/2061123768429211767/thread_data.json new file mode 100644 index 00000000..4ec0177f --- /dev/null +++ b/docs/twitter/2061123768429211767/thread_data.json @@ -0,0 +1,86 @@ +{ + "root_post_id": "2061123768429211767", + "posts": [ + { + "post_id": "2061123768429211767", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "no-debugger-debug / console / printf-style - prior evolved to one mmapped fixed-width-height log file with an atomic for multi-thread|process messages - but even that seems too complexy ...", + "timestamp": "2026-05-31 16:32:54", + "media_urls": [], + "reply_to_id": null, + "quote_of_id": null, + "metrics": { + "reply_count": 2, + "repost_count": 0, + "like_count": 9, + "view_count": 2974 + } + }, + { + "post_id": "2061124536729207080", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "moving to this >>> CART file is mmapped on CPU with mapped GPU access (no file IO) - background page walker to ensure OS won't page it out - beginning of CART file is a grid of 32-bit unsigned values - hex dumping that as my 'log file' - either to term or GPU render", + "timestamp": "2026-05-31 16:35:58", + "media_urls": [], + "reply_to_id": "2061123768429211767", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 4, + "view_count": 569 + } + }, + { + "post_id": "2061124942968545433", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "hits the easy to debug CPU or GPU stuff in the same framework (simply write and it just appears) - it's always a HEX dump, but can show decimal by pretending it's a 4-bit/character terminal with a hex font :)", + "timestamp": "2026-05-31 16:37:34", + "media_urls": [], + "reply_to_id": "2061124536729207080", + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 0, + "like_count": 2, + "view_count": 543 + } + }, + { + "post_id": "2061206435942511008", + "author": "Mike Chi", + "handle": "retrotink2", + "text": "@NOTimothyLottes Here I am still debugging by looking at if a single LED turns on.", + "timestamp": "2026-05-31 22:01:24", + "media_urls": [], + "reply_to_id": "2061123768429211767", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 7, + "view_count": 1667 + } + }, + { + "post_id": "2061252886453944549", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "@retrotink2 That plus an oscilloscope … this is the way", + "timestamp": "2026-06-01 01:05:59", + "media_urls": [], + "reply_to_id": "2061206435942511008", + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 0, + "like_count": 1, + "view_count": 107 + } + } + ], + "source_url": "https://x.com/NOTimothyLottes/status/2061123768429211767" +} \ No newline at end of file diff --git a/docs/twitter/2061416116694442141/thread.md b/docs/twitter/2061416116694442141/thread.md new file mode 100644 index 00000000..db61d5c6 --- /dev/null +++ b/docs/twitter/2061416116694442141/thread.md @@ -0,0 +1,31 @@ +--- +title: "Windows thread priority. SeIncreaseBasePriorityPrivilege required to play in the" +author: "NOTimothyLottes" +handle: "@NOTimothyLottes" +post_url: "https://x.com/NOTimothyLottes/status/2061416116694442141" +post_id: "2061416116694442141" +timestamp: "2026-06-01 11:54:36" +post_count: 4 +reply_count: 2 +repost_count: 0 +like_count: 10 +view_count: 1196 +--- + +# @NOTimothyLottes — Windows thread priority. SeIncreaseBasePriorityPrivilege required to play in the + +## Post 1 (2026-06-01 11:54:36) + +Windows thread priority. SeIncreaseBasePriorityPrivilege required to play in the (fake)"Realtime" class -BUT- apparently there is AvSetMmThreadCharacteristics() for "Pro Audio" and AvSetMmThreadPriority() which can bring up priority into realtime. Curious if games using today? + +## Post 2 (2026-06-01 11:56:24) — reply to Post 1 + +Either way NtSetInformationThread() seems to be the way to just set {1-15} (non-realtime class) priority directly without the silly clamp(priorityClassBase+threadPriority,1,15) business + +## Post 3 (2026-06-02 03:59:06) — reply to Post 1 + +@NOTimothyLottes I don’t think your even suppose to change your thread’s priority in general anymore, it just messes with scheduling. + +## Post 4 (2026-06-02 10:32:37) — reply to Post 3 + +@iamwhosiam Try using low latency pro audio tools and disabling the app’s authorization for high priority scheduling diff --git a/docs/twitter/2061416116694442141/thread_data.json b/docs/twitter/2061416116694442141/thread_data.json new file mode 100644 index 00000000..b2d9e834 --- /dev/null +++ b/docs/twitter/2061416116694442141/thread_data.json @@ -0,0 +1,70 @@ +{ + "root_post_id": "2061416116694442141", + "posts": [ + { + "post_id": "2061416116694442141", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "Windows thread priority. SeIncreaseBasePriorityPrivilege required to play in the (fake)\"Realtime\" class -BUT- apparently there is AvSetMmThreadCharacteristics() for \"Pro Audio\" and AvSetMmThreadPriority() which can bring up priority into realtime. Curious if games using today?", + "timestamp": "2026-06-01 11:54:36", + "media_urls": [], + "reply_to_id": null, + "quote_of_id": null, + "metrics": { + "reply_count": 2, + "repost_count": 0, + "like_count": 10, + "view_count": 1196 + } + }, + { + "post_id": "2061416572627886473", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "Either way NtSetInformationThread() seems to be the way to just set {1-15} (non-realtime class) priority directly without the silly clamp(priorityClassBase+threadPriority,1,15) business", + "timestamp": "2026-06-01 11:56:24", + "media_urls": [], + "reply_to_id": "2061416116694442141", + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 0, + "like_count": 3, + "view_count": 455 + } + }, + { + "post_id": "2061658841360589225", + "author": "Ant Toe Knee", + "handle": "iamwhosiam", + "text": "@NOTimothyLottes I don’t think your even suppose to change your thread’s priority in general anymore, it just messes with scheduling.", + "timestamp": "2026-06-02 03:59:06", + "media_urls": [], + "reply_to_id": "2061416116694442141", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 0, + "view_count": 31 + } + }, + { + "post_id": "2061757874297065775", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "@iamwhosiam Try using low latency pro audio tools and disabling the app’s authorization for high priority scheduling", + "timestamp": "2026-06-02 10:32:37", + "media_urls": [], + "reply_to_id": "2061658841360589225", + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 0, + "like_count": 0, + "view_count": 26 + } + } + ], + "source_url": "https://x.com/NOTimothyLottes/status/2061416116694442141" +} \ No newline at end of file diff --git a/docs/twitter/2061933917137932437/thread.md b/docs/twitter/2061933917137932437/thread.md new file mode 100644 index 00000000..5a55b88c --- /dev/null +++ b/docs/twitter/2061933917137932437/thread.md @@ -0,0 +1,19 @@ +--- +title: "It's unfortunate there isn't an easy way to map the page file so that writes don" +author: "NOTimothyLottes" +handle: "@NOTimothyLottes" +post_url: "https://x.com/NOTimothyLottes/status/2061933917137932437" +post_id: "2061933917137932437" +timestamp: "2026-06-02 22:12:09" +post_count: 1 +reply_count: 0 +repost_count: 1 +like_count: 11 +view_count: 1002 +--- + +# @NOTimothyLottes — It's unfortunate there isn't an easy way to map the page file so that writes don + +## Post 1 (2026-06-02 22:12:09) + +It's unfortunate there isn't an easy way to map the page file so that writes don't automagically post to storage, meaning map then turn off flush until a time desired by the programmer. diff --git a/docs/twitter/2061933917137932437/thread_data.json b/docs/twitter/2061933917137932437/thread_data.json new file mode 100644 index 00000000..7115c186 --- /dev/null +++ b/docs/twitter/2061933917137932437/thread_data.json @@ -0,0 +1,22 @@ +{ + "root_post_id": "2061933917137932437", + "posts": [ + { + "post_id": "2061933917137932437", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "It's unfortunate there isn't an easy way to map the page file so that writes don't automagically post to storage, meaning map then turn off flush until a time desired by the programmer.", + "timestamp": "2026-06-02 22:12:09", + "media_urls": [], + "reply_to_id": null, + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 1, + "like_count": 11, + "view_count": 1002 + } + } + ], + "source_url": "https://x.com/NOTimothyLottes/status/2061933917137932437" +} \ No newline at end of file diff --git a/docs/twitter/2061937134756380682/thread.md b/docs/twitter/2061937134756380682/thread.md new file mode 100644 index 00000000..a17a3556 --- /dev/null +++ b/docs/twitter/2061937134756380682/thread.md @@ -0,0 +1,23 @@ +--- +title: "For Windows trying to standardize on HIGHEST_PRIORITY_CLASS, mixed with THREAD_P" +author: "NOTimothyLottes" +handle: "@NOTimothyLottes" +post_url: "https://x.com/NOTimothyLottes/status/2061937134756380682" +post_id: "2061937134756380682" +timestamp: "2026-06-02 22:24:56" +post_count: 2 +reply_count: 1 +repost_count: 0 +like_count: 12 +view_count: 1118 +--- + +# @NOTimothyLottes — For Windows trying to standardize on HIGHEST_PRIORITY_CLASS, mixed with THREAD_P + +## Post 1 (2026-06-02 22:24:56) + +For Windows trying to standardize on HIGHEST_PRIORITY_CLASS, mixed with THREAD_PRIORITY_{IDLE,NORMAL,TIME_CRITICAL}. Which maps to {1, 13, 15} respectively. Then trying "Pro Audio" hack with AVRT to get whatever that gives in the 16-31 fake "realtime" bracket for highest. + +## Post 2 (2026-06-02 22:27:06) — reply to Post 1 + +Linux mapping will be {SCHED_IDLE, SCHED_OTHER with 2 settings of nice} to match. Unfortunately SCHED_FIFO is locked out by default, but if the user blesses the right permissions will get better audio latency. Maybe pause/unpause will trigger auto latency re-adaption. diff --git a/docs/twitter/2061937134756380682/thread_data.json b/docs/twitter/2061937134756380682/thread_data.json new file mode 100644 index 00000000..d0b7587d --- /dev/null +++ b/docs/twitter/2061937134756380682/thread_data.json @@ -0,0 +1,38 @@ +{ + "root_post_id": "2061937134756380682", + "posts": [ + { + "post_id": "2061937134756380682", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "For Windows trying to standardize on HIGHEST_PRIORITY_CLASS, mixed with THREAD_PRIORITY_{IDLE,NORMAL,TIME_CRITICAL}. Which maps to {1, 13, 15} respectively. Then trying \"Pro Audio\" hack with AVRT to get whatever that gives in the 16-31 fake \"realtime\" bracket for highest.", + "timestamp": "2026-06-02 22:24:56", + "media_urls": [], + "reply_to_id": null, + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 12, + "view_count": 1118 + } + }, + { + "post_id": "2061937679575429246", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "Linux mapping will be {SCHED_IDLE, SCHED_OTHER with 2 settings of nice} to match. Unfortunately SCHED_FIFO is locked out by default, but if the user blesses the right permissions will get better audio latency. Maybe pause/unpause will trigger auto latency re-adaption.", + "timestamp": "2026-06-02 22:27:06", + "media_urls": [], + "reply_to_id": "2061937134756380682", + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 0, + "like_count": 5, + "view_count": 595 + } + } + ], + "source_url": "https://x.com/NOTimothyLottes/status/2061937134756380682" +} \ No newline at end of file diff --git a/docs/twitter/2062031187023982879/media/2062031187023982879_1.png b/docs/twitter/2062031187023982879/media/2062031187023982879_1.png new file mode 100644 index 00000000..411da9e5 Binary files /dev/null and b/docs/twitter/2062031187023982879/media/2062031187023982879_1.png differ diff --git a/docs/twitter/2062031187023982879/thread.md b/docs/twitter/2062031187023982879/thread.md new file mode 100644 index 00000000..a8d67a16 --- /dev/null +++ b/docs/twitter/2062031187023982879/thread.md @@ -0,0 +1,21 @@ +--- +title: "Back running 640x480 on my VGA CRTs to prep for workflow that ports down to 480i" +author: "NOTimothyLottes" +handle: "@NOTimothyLottes" +post_url: "https://x.com/NOTimothyLottes/status/2062031187023982879" +post_id: "2062031187023982879" +timestamp: "2026-06-03 04:38:40" +post_count: 1 +reply_count: 0 +repost_count: 0 +like_count: 29 +view_count: 1679 +--- + +# @NOTimothyLottes — Back running 640x480 on my VGA CRTs to prep for workflow that ports down to 480i + +## Post 1 (2026-06-03 04:38:40) + +Back running 640x480 on my VGA CRTs to prep for workflow that ports down to 480i60 for NTSC. Using my 'right' font. Fully decoupling from all system calls for time is working out great. And yes I'm using all the stuff I talked about in my Advanced Aliasing talk too (joy to code). + +![Media 1](./media/2062031187023982879_1.png) diff --git a/docs/twitter/2062031187023982879/thread_data.json b/docs/twitter/2062031187023982879/thread_data.json new file mode 100644 index 00000000..8c780968 --- /dev/null +++ b/docs/twitter/2062031187023982879/thread_data.json @@ -0,0 +1,24 @@ +{ + "root_post_id": "2062031187023982879", + "posts": [ + { + "post_id": "2062031187023982879", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "Back running 640x480 on my VGA CRTs to prep for workflow that ports down to 480i60 for NTSC. Using my 'right' font. Fully decoupling from all system calls for time is working out great. And yes I'm using all the stuff I talked about in my Advanced Aliasing talk too (joy to code).", + "timestamp": "2026-06-03 04:38:40", + "media_urls": [ + "https://pbs.twimg.com/media/HJ3Ny2wX0AAKFFv?format=png&name=orig" + ], + "reply_to_id": null, + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 0, + "like_count": 29, + "view_count": 1679 + } + } + ], + "source_url": "https://x.com/NOTimothyLottes/status/2062031187023982879" +} \ No newline at end of file diff --git a/docs/twitter/2064858927829745887/thread.md b/docs/twitter/2064858927829745887/thread.md new file mode 100644 index 00000000..9db37891 --- /dev/null +++ b/docs/twitter/2064858927829745887/thread.md @@ -0,0 +1,47 @@ +--- +title: "So I'm on Linux now, but obviously I cheated, because this is a SteamOS machine " +author: "NOTimothyLottes" +handle: "@NOTimothyLottes" +post_url: "https://x.com/NOTimothyLottes/status/2064858927829745887" +post_id: "2064858927829745887" +timestamp: "2026-06-10 23:55:06" +post_count: 8 +reply_count: 4 +repost_count: 0 +like_count: 7 +view_count: 2234 +--- + +# @NOTimothyLottes — So I'm on Linux now, but obviously I cheated, because this is a SteamOS machine + +## Post 1 (2026-06-10 23:55:06) + +So I'm on Linux now, but obviously I cheated, because this is a SteamOS machine (pre-installed). Need to re-learn enough to be able to make responsible choices on a new install. First up what init system to do? {openrc, runit, s6, or dinit}. + +## Post 2 (2026-06-11 00:22:20) — reply to Post 1 + +@NOTimothyLottes My patience is this 🤏 thin with win11 right now, but Linux sounds like too much work, Mac is probably easier with more native software + +## Post 3 (2026-06-11 00:36:20) — reply to Post 1 + +'dinit' is out (no C++ for me) - so runit wins by default [also future desire to run busybox, so it's the natural choice] + +## Post 4 (2026-06-11 01:00:16) — reply to Post 1 + +@NOTimothyLottes fascinating to me how this challenge would have captivated me a couple decades ago but now i just wanna run away + +## Post 5 (2026-06-11 01:06:28) — reply to Post 4 + +@mcnabbd Similar feelings. Used to build linux from scratch in the BIOS era, also ran FreeBSD/etc, just for fun. But things had been easier then. Now years of technical debt later, all my tolerance for complexity has been fully exhausted. + +## Post 6 (2026-06-11 01:10:19) — reply to Post 1 + +Going to give artix-lxqt-runit variation a try. Mostly just a stop gap to see if I can actually get a bloated Linux system installed before a more serious effort with BuildRoot. First de-windows victim computer will be an AMD powered APU. + +## Post 7 (2026-06-11 02:47:54) — reply to Post 6 + +Looks like the workaround for my locked UEFI secure boot Enabled on the second machine was to "Set Supervisor Password", afterwords I could disable secure boot and APM, but still no way to enable legacy BIOS "Boot Mode". + +## Post 8 (2026-06-11 04:07:09) — reply to Post 7 + +Somewhat surprised, Artix using the graphical install just worked out of the box (AMD APU). Got confused post install when 'top' shows 'Xorg' instead of 'XLibre' but the package manager says XLibre is installed. diff --git a/docs/twitter/2064858927829745887/thread_data.json b/docs/twitter/2064858927829745887/thread_data.json new file mode 100644 index 00000000..52307806 --- /dev/null +++ b/docs/twitter/2064858927829745887/thread_data.json @@ -0,0 +1,134 @@ +{ + "root_post_id": "2064858927829745887", + "posts": [ + { + "post_id": "2064858927829745887", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "So I'm on Linux now, but obviously I cheated, because this is a SteamOS machine (pre-installed). Need to re-learn enough to be able to make responsible choices on a new install. First up what init system to do? {openrc, runit, s6, or dinit}.", + "timestamp": "2026-06-10 23:55:06", + "media_urls": [], + "reply_to_id": null, + "quote_of_id": null, + "metrics": { + "reply_count": 4, + "repost_count": 0, + "like_count": 7, + "view_count": 2234 + } + }, + { + "post_id": "2064865782870294858", + "author": "🕹️G🅰MESTUFFS🎮", + "handle": "RouaniJihad", + "text": "@NOTimothyLottes My patience is this 🤏 thin with win11 right now, but Linux sounds like too much work, Mac is probably easier with more native software", + "timestamp": "2026-06-11 00:22:20", + "media_urls": [], + "reply_to_id": "2064858927829745887", + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 0, + "like_count": 2, + "view_count": 115 + } + }, + { + "post_id": "2064869304294641903", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "'dinit' is out (no C++ for me) - so runit wins by default [also future desire to run busybox, so it's the natural choice]", + "timestamp": "2026-06-11 00:36:20", + "media_urls": [], + "reply_to_id": "2064858927829745887", + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 0, + "like_count": 0, + "view_count": 337 + } + }, + { + "post_id": "2064875327617396915", + "author": "Doug McNabb", + "handle": "mcnabbd", + "text": "@NOTimothyLottes fascinating to me how this challenge would have captivated me a couple decades ago but now i just wanna run away", + "timestamp": "2026-06-11 01:00:16", + "media_urls": [], + "reply_to_id": "2064858927829745887", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 4, + "view_count": 187 + } + }, + { + "post_id": "2064876889177457052", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "@mcnabbd Similar feelings. Used to build linux from scratch in the BIOS era, also ran FreeBSD/etc, just for fun. But things had been easier then. Now years of technical debt later, all my tolerance for complexity has been fully exhausted.", + "timestamp": "2026-06-11 01:06:28", + "media_urls": [], + "reply_to_id": "2064875327617396915", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 1, + "view_count": 199 + } + }, + { + "post_id": "2064877857252291055", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "Going to give artix-lxqt-runit variation a try. Mostly just a stop gap to see if I can actually get a bloated Linux system installed before a more serious effort with BuildRoot. First de-windows victim computer will be an AMD powered APU.", + "timestamp": "2026-06-11 01:10:19", + "media_urls": [], + "reply_to_id": "2064858927829745887", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 1, + "view_count": 792 + } + }, + { + "post_id": "2064902414243631277", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "Looks like the workaround for my locked UEFI secure boot Enabled on the second machine was to \"Set Supervisor Password\", afterwords I could disable secure boot and APM, but still no way to enable legacy BIOS \"Boot Mode\".", + "timestamp": "2026-06-11 02:47:54", + "media_urls": [], + "reply_to_id": "2064877857252291055", + "quote_of_id": null, + "metrics": { + "reply_count": 3, + "repost_count": 0, + "like_count": 3, + "view_count": 828 + } + }, + { + "post_id": "2064922357186077053", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "Somewhat surprised, Artix using the graphical install just worked out of the box (AMD APU). Got confused post install when 'top' shows 'Xorg' instead of 'XLibre' but the package manager says XLibre is installed.", + "timestamp": "2026-06-11 04:07:09", + "media_urls": [], + "reply_to_id": "2064902414243631277", + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 0, + "like_count": 1, + "view_count": 419 + } + } + ], + "source_url": "https://x.com/NOTimothyLottes/status/2064858927829745887" +} \ No newline at end of file diff --git a/docs/twitter/2065804972378243476/media/2065804972378243476_1.jpg b/docs/twitter/2065804972378243476/media/2065804972378243476_1.jpg new file mode 100644 index 00000000..6a8d4c30 Binary files /dev/null and b/docs/twitter/2065804972378243476/media/2065804972378243476_1.jpg differ diff --git a/docs/twitter/2065804972378243476/media/2065806847634776401_1.jpg b/docs/twitter/2065804972378243476/media/2065806847634776401_1.jpg new file mode 100644 index 00000000..966ef2ec Binary files /dev/null and b/docs/twitter/2065804972378243476/media/2065806847634776401_1.jpg differ diff --git a/docs/twitter/2065804972378243476/media/2065809876488503805_1.jpg b/docs/twitter/2065804972378243476/media/2065809876488503805_1.jpg new file mode 100644 index 00000000..32e2f57f Binary files /dev/null and b/docs/twitter/2065804972378243476/media/2065809876488503805_1.jpg differ diff --git a/docs/twitter/2065804972378243476/thread.md b/docs/twitter/2065804972378243476/thread.md new file mode 100644 index 00000000..cc9cef2c --- /dev/null +++ b/docs/twitter/2065804972378243476/thread.md @@ -0,0 +1,82 @@ +--- +title: "Nanorc done and back to actual programming with the new font. The iPhone cannot " +author: "NOTimothyLottes" +handle: "@NOTimothyLottes" +post_url: "https://x.com/NOTimothyLottes/status/2065804972378243476" +post_id: "2065804972378243476" +timestamp: "2026-06-13 14:34:20" +post_count: 15 +reply_count: 5 +repost_count: 0 +like_count: 23 +view_count: 2435 +--- + +# @NOTimothyLottes — Nanorc done and back to actual programming with the new font. The iPhone cannot + +## Post 1 (2026-06-13 14:34:20) + +Nanorc done and back to actual programming with the new font. The iPhone cannot seem to correctly capture a CRT anymore … and yes my _ is … and my ; is a 5 dot vertical line (prefer that for C/GLSL coding) + +![Media 1](./media/2065804972378243476_1.jpg) + +## Post 2 (2026-06-13 14:41:47) — reply to Post 1 + +Thankfully I can still dedecorate the term window to focus lines for useful content. Practically speaking I almost have a new language implemented in C via typedefs and macros … back to building and testing the native Linux system level interface + +![Media 1](./media/2065806847634776401_1.jpg) + +## Post 3 (2026-06-13 14:53:50) — reply to Post 2 + +Lubbers are invading my screen + +![Media 1](./media/2065809876488503805_1.jpg) + +## Post 4 (2026-06-13 17:26:52) — reply to Post 1 + +@NOTimothyLottes Why are you using CRT + +## Post 5 (2026-06-13 17:33:27) — reply to Post 4 + +@quiveron_x Still the best display technology IMO. Low persistence, analog, variable resolution, smooth continuous blended signal, deep blacks, great contrast, etc. + +## Post 6 (2026-06-13 17:38:55) — reply to Post 5 + +I completely agree, I asked because I was wondering if you were planning on doing something specific. +I think we gave up on them too early, they felt good to use, pleasant to look at, only negative side is they were too heavy. People obsessing over resolution don't realize if image is shit it doesn't matter if it's 4k or 8k + +## Post 7 (2026-06-13 17:50:25) — reply to Post 1 + +@NOTimothyLottes you can use camac (free) to take raw photos on iphone without post-processing shit + +## Post 8 (2026-06-13 19:02:00) — reply to Post 7 + +@eternalclassic_ Will have to try that thanks + +## Post 9 (2026-06-13 19:58:56) — reply to Post 1 + +@NOTimothyLottes Hz sharing? I wonder if CRTs can be changed like 60 -> 59 Hz, and if that would correct it? I do not know whether any is correct, but I'd betcha there's some kinda thing there about that. Why would the iphone has .. no it's not mechanical, so I have no clue but that is a puzzle + +## Post 10 (2026-06-14 08:16:56) — reply to Post 1 + +@NOTimothyLottes ohh what is that? a 2070SB? + +## Post 11 (2026-06-14 15:33:59) — reply to Post 10 + +@mayemayey FP2141SB + +## Post 12 (2026-06-14 16:40:53) — reply to Post 11 + +@NOTimothyLottes yep. that's a rebranded 2070sb haha. there's an hsync/vsync (~152khz, 254hz) overclocking tutorial if you ever feel daring enough to. 😉 + +## Post 13 (2026-06-14 20:44:08) — reply to Post 12 + +@mayemayey Those crazy refresh rates are long past diminishing returns though due to the fixed phosphor decay. Great display, only big flaw is the vertical nonlinearity at the extreme top and bottom. + +## Post 14 (2026-06-15 06:11:27) — reply to Post 13 + +@NOTimothyLottes do you have any blurriness in the corners? + +## Post 15 (2026-06-15 13:06:28) — reply to Post 14 + +@mayemayey It might if I ran it at peak resolutions but I mostly stick to higher refresh rates instead, so wouldn’t notice. diff --git a/docs/twitter/2065804972378243476/thread_data.json b/docs/twitter/2065804972378243476/thread_data.json new file mode 100644 index 00000000..cbea124f --- /dev/null +++ b/docs/twitter/2065804972378243476/thread_data.json @@ -0,0 +1,252 @@ +{ + "root_post_id": "2065804972378243476", + "posts": [ + { + "post_id": "2065804972378243476", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "Nanorc done and back to actual programming with the new font. The iPhone cannot seem to correctly capture a CRT anymore … and yes my _ is … and my ; is a 5 dot vertical line (prefer that for C/GLSL coding)", + "timestamp": "2026-06-13 14:34:20", + "media_urls": [ + "https://pbs.twimg.com/media/HKs2q8RXQAAVsjN?format=jpg&name=orig" + ], + "reply_to_id": null, + "quote_of_id": null, + "metrics": { + "reply_count": 5, + "repost_count": 0, + "like_count": 23, + "view_count": 2435 + } + }, + { + "post_id": "2065806847634776401", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "Thankfully I can still dedecorate the term window to focus lines for useful content. Practically speaking I almost have a new language implemented in C via typedefs and macros … back to building and testing the native Linux system level interface", + "timestamp": "2026-06-13 14:41:47", + "media_urls": [ + "https://pbs.twimg.com/media/HKs4YE5WMAAfe6G?format=jpg&name=orig" + ], + "reply_to_id": "2065804972378243476", + "quote_of_id": null, + "metrics": { + "reply_count": 2, + "repost_count": 1, + "like_count": 7, + "view_count": 929 + } + }, + { + "post_id": "2065809876488503805", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "Lubbers are invading my screen", + "timestamp": "2026-06-13 14:53:50", + "media_urls": [ + "https://pbs.twimg.com/media/HKs7IJHWMAAwzVL?format=jpg&name=orig" + ], + "reply_to_id": "2065806847634776401", + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 0, + "like_count": 3, + "view_count": 692 + } + }, + { + "post_id": "2065848389875458358", + "author": "Quiveron", + "handle": "quiveron_x", + "text": "@NOTimothyLottes Why are you using CRT", + "timestamp": "2026-06-13 17:26:52", + "media_urls": [], + "reply_to_id": "2065804972378243476", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 0, + "view_count": 94 + } + }, + { + "post_id": "2065850045975474547", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "@quiveron_x Still the best display technology IMO. Low persistence, analog, variable resolution, smooth continuous blended signal, deep blacks, great contrast, etc.", + "timestamp": "2026-06-13 17:33:27", + "media_urls": [], + "reply_to_id": "2065848389875458358", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 3, + "view_count": 133 + } + }, + { + "post_id": "2065851423489937868", + "author": "Quiveron", + "handle": "quiveron_x", + "text": "I completely agree, I asked because I was wondering if you were planning on doing something specific.\nI think we gave up on them too early, they felt good to use, pleasant to look at, only negative side is they were too heavy. People obsessing over resolution don't realize if image is shit it doesn't matter if it's 4k or 8k", + "timestamp": "2026-06-13 17:38:55", + "media_urls": [], + "reply_to_id": "2065850045975474547", + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 0, + "like_count": 1, + "view_count": 50 + } + }, + { + "post_id": "2065854318817816626", + "author": "eternal classic", + "handle": "eternalclassic_", + "text": "@NOTimothyLottes you can use camac (free) to take raw photos on iphone without post-processing shit", + "timestamp": "2026-06-13 17:50:25", + "media_urls": [], + "reply_to_id": "2065804972378243476", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 4, + "view_count": 657 + } + }, + { + "post_id": "2065872329402442195", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "@eternalclassic_ Will have to try that thanks", + "timestamp": "2026-06-13 19:02:00", + "media_urls": [], + "reply_to_id": "2065854318817816626", + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 0, + "like_count": 1, + "view_count": 67 + } + }, + { + "post_id": "2065886660747796581", + "author": "OZ", + "handle": "winning_tactic", + "text": "@NOTimothyLottes Hz sharing? I wonder if CRTs can be changed like 60 -> 59 Hz, and if that would correct it? I do not know whether any is correct, but I'd betcha there's some kinda thing there about that. Why would the iphone has .. no it's not mechanical, so I have no clue but that is a puzzle", + "timestamp": "2026-06-13 19:58:56", + "media_urls": [], + "reply_to_id": "2065804972378243476", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 1, + "view_count": 53 + } + }, + { + "post_id": "2066072383954288814", + "author": "Name cannot be blank", + "handle": "mayemayey", + "text": "@NOTimothyLottes ohh what is that? a 2070SB?", + "timestamp": "2026-06-14 08:16:56", + "media_urls": [], + "reply_to_id": "2065804972378243476", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 0, + "view_count": 37 + } + }, + { + "post_id": "2066182371808776318", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "@mayemayey FP2141SB", + "timestamp": "2026-06-14 15:33:59", + "media_urls": [], + "reply_to_id": "2066072383954288814", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 1, + "view_count": 20 + } + }, + { + "post_id": "2066199206457495922", + "author": "Name cannot be blank", + "handle": "mayemayey", + "text": "@NOTimothyLottes yep. that's a rebranded 2070sb haha. there's an hsync/vsync (~152khz, 254hz) overclocking tutorial if you ever feel daring enough to. 😉", + "timestamp": "2026-06-14 16:40:53", + "media_urls": [], + "reply_to_id": "2066182371808776318", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 0, + "view_count": 25 + } + }, + { + "post_id": "2066260423540675020", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "@mayemayey Those crazy refresh rates are long past diminishing returns though due to the fixed phosphor decay. Great display, only big flaw is the vertical nonlinearity at the extreme top and bottom.", + "timestamp": "2026-06-14 20:44:08", + "media_urls": [], + "reply_to_id": "2066199206457495922", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 1, + "view_count": 18 + } + }, + { + "post_id": "2066403191860732086", + "author": "Name cannot be blank", + "handle": "mayemayey", + "text": "@NOTimothyLottes do you have any blurriness in the corners?", + "timestamp": "2026-06-15 06:11:27", + "media_urls": [], + "reply_to_id": "2066260423540675020", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 0, + "view_count": 9 + } + }, + { + "post_id": "2066507632307847327", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "@mayemayey It might if I ran it at peak resolutions but I mostly stick to higher refresh rates instead, so wouldn’t notice.", + "timestamp": "2026-06-15 13:06:28", + "media_urls": [], + "reply_to_id": "2066403191860732086", + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 0, + "like_count": 1, + "view_count": 16 + } + } + ], + "source_url": "https://x.com/NOTimothyLottes/status/2065804972378243476" +} \ No newline at end of file diff --git a/docs/twitter/2065832746757341482/media/2065832746757341482_1.jpg b/docs/twitter/2065832746757341482/media/2065832746757341482_1.jpg new file mode 100644 index 00000000..b098c44a Binary files /dev/null and b/docs/twitter/2065832746757341482/media/2065832746757341482_1.jpg differ diff --git a/docs/twitter/2065832746757341482/media/2065832746757341482_2.jpg b/docs/twitter/2065832746757341482/media/2065832746757341482_2.jpg new file mode 100644 index 00000000..af2d03db Binary files /dev/null and b/docs/twitter/2065832746757341482/media/2065832746757341482_2.jpg differ diff --git a/docs/twitter/2065832746757341482/thread.md b/docs/twitter/2065832746757341482/thread.md new file mode 100644 index 00000000..b0131fec --- /dev/null +++ b/docs/twitter/2065832746757341482/thread.md @@ -0,0 +1,30 @@ +--- +title: "Cross compilation is up. Just like on windows with GCC I have to disable all war" +author: "NOTimothyLottes" +handle: "@NOTimothyLottes" +post_url: "https://x.com/NOTimothyLottes/status/2065832746757341482" +post_id: "2065832746757341482" +timestamp: "2026-06-13 16:24:42" +post_count: 3 +reply_count: 2 +repost_count: 1 +like_count: 10 +view_count: 1842 +--- + +# @NOTimothyLottes — Cross compilation is up. Just like on windows with GCC I have to disable all war + +## Post 1 (2026-06-13 16:24:42) + +Cross compilation is up. Just like on windows with GCC I have to disable all warnings because there is no way to turn off “function called through a non-compatible type”. They obviously should have had warning IDs and an ID based disable. + +![Media 1](./media/2065832746757341482_1.jpg) +![Media 2](./media/2065832746757341482_2.jpg) + +## Post 2 (2026-06-13 16:28:22) — reply to Post 1 + +Found my first of perhaps many Wine “fix me”s looks like they didn’t emulate NtQuerySystemInformation() for use to get the TSC time scalar. Also implies all PC devs do this wrong, else Valve would have had this implemented already. + +## Post 3 (2026-06-13 21:30:40) — reply to Post 1 + +@NOTimothyLottes Interesting font, does it have a name? diff --git a/docs/twitter/2065832746757341482/thread_data.json b/docs/twitter/2065832746757341482/thread_data.json new file mode 100644 index 00000000..fc6dcb97 --- /dev/null +++ b/docs/twitter/2065832746757341482/thread_data.json @@ -0,0 +1,57 @@ +{ + "root_post_id": "2065832746757341482", + "posts": [ + { + "post_id": "2065832746757341482", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "Cross compilation is up. Just like on windows with GCC I have to disable all warnings because there is no way to turn off “function called through a non-compatible type”. They obviously should have had warning IDs and an ID based disable.", + "timestamp": "2026-06-13 16:24:42", + "media_urls": [ + "https://pbs.twimg.com/media/HKtP7aQXsAAtJ5X?format=jpg&name=orig", + "https://pbs.twimg.com/media/HKtP7aTWEAAC_j4?format=jpg&name=orig" + ], + "reply_to_id": null, + "quote_of_id": null, + "metrics": { + "reply_count": 2, + "repost_count": 1, + "like_count": 10, + "view_count": 1842 + } + }, + { + "post_id": "2065833669516816492", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "Found my first of perhaps many Wine “fix me”s looks like they didn’t emulate NtQuerySystemInformation() for use to get the TSC time scalar. Also implies all PC devs do this wrong, else Valve would have had this implemented already.", + "timestamp": "2026-06-13 16:28:22", + "media_urls": [], + "reply_to_id": "2065832746757341482", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 4, + "view_count": 758 + } + }, + { + "post_id": "2065909746536747274", + "author": "Tom Keresztes", + "handle": "tomcr2100", + "text": "@NOTimothyLottes Interesting font, does it have a name?", + "timestamp": "2026-06-13 21:30:40", + "media_urls": [], + "reply_to_id": "2065832746757341482", + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 0, + "like_count": 1, + "view_count": 75 + } + } + ], + "source_url": "https://x.com/NOTimothyLottes/status/2065832746757341482" +} \ No newline at end of file diff --git a/docs/twitter/2065872197147578751/media/2065872197147578751_1.jpg b/docs/twitter/2065872197147578751/media/2065872197147578751_1.jpg new file mode 100644 index 00000000..4ae5c312 Binary files /dev/null and b/docs/twitter/2065872197147578751/media/2065872197147578751_1.jpg differ diff --git a/docs/twitter/2065872197147578751/thread.md b/docs/twitter/2065872197147578751/thread.md new file mode 100644 index 00000000..f8093721 --- /dev/null +++ b/docs/twitter/2065872197147578751/thread.md @@ -0,0 +1,25 @@ +--- +title: "@axelgneiting The glibc implementation would do that. I bypass libc and just do " +author: "NOTimothyLottes" +handle: "@NOTimothyLottes" +post_url: "https://x.com/NOTimothyLottes/status/2065872197147578751" +post_id: "2065872197147578751" +timestamp: "2026-06-13 19:01:28" +post_count: 2 +reply_count: 0 +repost_count: 0 +like_count: 2 +view_count: 198 +--- + +# @NOTimothyLottes — @axelgneiting The glibc implementation would do that. I bypass libc and just do + +## Post 1 (2026-06-13 16:54:17) + +Interesting how on this Linux box, scheduling NOPs like nanosleep of 0 and futex waiting on an already set memory location … both take around 60 microseconds, cannot afford to do many of those per millisecond. Food for thought for high fps targets + +## Post 2 (2026-06-13 19:01:28) + +@axelgneiting The glibc implementation would do that. I bypass libc and just do it manually with perf_event_open syscall and mmap. + +![Media 1](./media/2065872197147578751_1.jpg) diff --git a/docs/twitter/2065872197147578751/thread_data.json b/docs/twitter/2065872197147578751/thread_data.json new file mode 100644 index 00000000..588205c5 --- /dev/null +++ b/docs/twitter/2065872197147578751/thread_data.json @@ -0,0 +1,40 @@ +{ + "root_post_id": "2065872197147578751", + "posts": [ + { + "post_id": "2065840191340707905", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "Interesting how on this Linux box, scheduling NOPs like nanosleep of 0 and futex waiting on an already set memory location … both take around 60 microseconds, cannot afford to do many of those per millisecond. Food for thought for high fps targets", + "timestamp": "2026-06-13 16:54:17", + "media_urls": [], + "reply_to_id": null, + "quote_of_id": null, + "metrics": { + "reply_count": 5, + "repost_count": 0, + "like_count": 14, + "view_count": 3434 + } + }, + { + "post_id": "2065872197147578751", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "@axelgneiting The glibc implementation would do that. I bypass libc and just do it manually with perf_event_open syscall and mmap.", + "timestamp": "2026-06-13 19:01:28", + "media_urls": [ + "https://pbs.twimg.com/media/HKtzz5RXcAA6CIX?format=jpg&name=orig" + ], + "reply_to_id": "2065851939917906296", + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 0, + "like_count": 2, + "view_count": 198 + } + } + ], + "source_url": "https://x.com/NOTimothyLottes/status/2065872197147578751" +} \ No newline at end of file diff --git a/docs/twitter/2066184005632786736/media/2066184005632786736_1.jpg b/docs/twitter/2066184005632786736/media/2066184005632786736_1.jpg new file mode 100644 index 00000000..aec97df6 Binary files /dev/null and b/docs/twitter/2066184005632786736/media/2066184005632786736_1.jpg differ diff --git a/docs/twitter/2066184005632786736/thread.md b/docs/twitter/2066184005632786736/thread.md new file mode 100644 index 00000000..a07e1f56 --- /dev/null +++ b/docs/twitter/2066184005632786736/thread.md @@ -0,0 +1,45 @@ +--- +title: "On Linux I do speculative pinning of CPU memory via mlockall. Learned that later" +author: "NOTimothyLottes" +handle: "@NOTimothyLottes" +post_url: "https://x.com/NOTimothyLottes/status/2066184005632786736" +post_id: "2066184005632786736" +timestamp: "2026-06-14 15:40:29" +post_count: 7 +reply_count: 3 +repost_count: 0 +like_count: 16 +view_count: 1809 +--- + +# @NOTimothyLottes — On Linux I do speculative pinning of CPU memory via mlockall. Learned that later + +## Post 1 (2026-06-14 15:40:29) + +On Linux I do speculative pinning of CPU memory via mlockall. Learned that later Linux actually allows some amount of pinned memory without admin. So this is succeeding on my new Artix box. + +![Media 1](./media/2066184005632786736_1.jpg) + +## Post 2 (2026-06-14 16:07:46) — reply to Post 1 + +@NOTimothyLottes Running in CRT or are you emulating scanlines in your editor? + +## Post 3 (2026-06-15 09:29:47) — reply to Post 1 + +@NOTimothyLottes Also this font is cursed + +## Post 4 (2026-06-15 10:18:32) — reply to Post 1 + +@NOTimothyLottes There is 0 chance you actually use this font. It's for the meme, right? + +## Post 5 (2026-06-15 13:09:27) — reply to Post 4 + +@GrowlerEnjooyer Oh I definitely use this font, was designed to be extremely easy to visually parse for code. + +## Post 6 (2026-06-15 13:19:48) — reply to Post 5 + +@NOTimothyLottes Bravo, well played Mr troll + +## Post 7 (2026-06-15 16:21:24) — reply to Post 6 + +@GrowlerEnjooyer Not trolling, actually do use the font for my terminals on that dev box diff --git a/docs/twitter/2066184005632786736/thread_data.json b/docs/twitter/2066184005632786736/thread_data.json new file mode 100644 index 00000000..ad213d45 --- /dev/null +++ b/docs/twitter/2066184005632786736/thread_data.json @@ -0,0 +1,120 @@ +{ + "root_post_id": "2066184005632786736", + "posts": [ + { + "post_id": "2066184005632786736", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "On Linux I do speculative pinning of CPU memory via mlockall. Learned that later Linux actually allows some amount of pinned memory without admin. So this is succeeding on my new Artix box.", + "timestamp": "2026-06-14 15:40:29", + "media_urls": [ + "https://pbs.twimg.com/media/HKyPZnfWMAAv4qF?format=jpg&name=orig" + ], + "reply_to_id": null, + "quote_of_id": null, + "metrics": { + "reply_count": 3, + "repost_count": 0, + "like_count": 16, + "view_count": 1809 + } + }, + { + "post_id": "2066190873235206299", + "author": "Fleißiges Lieschen", + "handle": "Social_Vulture", + "text": "@NOTimothyLottes Running in CRT or are you emulating scanlines in your editor?", + "timestamp": "2026-06-14 16:07:46", + "media_urls": [], + "reply_to_id": "2066184005632786736", + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 0, + "like_count": 0, + "view_count": 124 + } + }, + { + "post_id": "2066453103344292290", + "author": "sadhu", + "handle": "sadhuIGI", + "text": "@NOTimothyLottes Also this font is cursed", + "timestamp": "2026-06-15 09:29:47", + "media_urls": [], + "reply_to_id": "2066184005632786736", + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 0, + "like_count": 3, + "view_count": 35 + } + }, + { + "post_id": "2066465370689732716", + "author": "EA-18G Growler Enjoyer", + "handle": "GrowlerEnjooyer", + "text": "@NOTimothyLottes There is 0 chance you actually use this font. It's for the meme, right?", + "timestamp": "2026-06-15 10:18:32", + "media_urls": [], + "reply_to_id": "2066184005632786736", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 0, + "view_count": 60 + } + }, + { + "post_id": "2066508385600598172", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "@GrowlerEnjooyer Oh I definitely use this font, was designed to be extremely easy to visually parse for code.", + "timestamp": "2026-06-15 13:09:27", + "media_urls": [], + "reply_to_id": "2066465370689732716", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 1, + "view_count": 28 + } + }, + { + "post_id": "2066510991014432852", + "author": "EA-18G Growler Enjoyer", + "handle": "GrowlerEnjooyer", + "text": "@NOTimothyLottes Bravo, well played Mr troll", + "timestamp": "2026-06-15 13:19:48", + "media_urls": [], + "reply_to_id": "2066508385600598172", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 0, + "view_count": 21 + } + }, + { + "post_id": "2066556689483002354", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "@GrowlerEnjooyer Not trolling, actually do use the font for my terminals on that dev box", + "timestamp": "2026-06-15 16:21:24", + "media_urls": [], + "reply_to_id": "2066510991014432852", + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 0, + "like_count": 0, + "view_count": 13 + } + } + ], + "source_url": "https://x.com/NOTimothyLottes/status/2066184005632786736" +} \ No newline at end of file diff --git a/docs/twitter/2070337342854832468/media/2070337342854832468_1.png b/docs/twitter/2070337342854832468/media/2070337342854832468_1.png new file mode 100644 index 00000000..24739b74 Binary files /dev/null and b/docs/twitter/2070337342854832468/media/2070337342854832468_1.png differ diff --git a/docs/twitter/2070337342854832468/thread.md b/docs/twitter/2070337342854832468/thread.md new file mode 100644 index 00000000..7e53d334 --- /dev/null +++ b/docs/twitter/2070337342854832468/thread.md @@ -0,0 +1,49 @@ +--- +title: "Quick summary of why not {pselect, ppoll, epoll_pwait2} style non-TCP IO [it can" +author: "NOTimothyLottes" +handle: "@NOTimothyLottes" +post_url: "https://x.com/NOTimothyLottes/status/2070337342854832468" +post_id: "2070337342854832468" +timestamp: "2026-06-26 02:44:22" +post_count: 8 +reply_count: 2 +repost_count: 1 +like_count: 16 +view_count: 2149 +--- + +# @NOTimothyLottes — Quick summary of why not {pselect, ppoll, epoll_pwait2} style non-TCP IO [it can + +## Post 1 (2026-06-26 02:44:22) + +Quick summary of why not {pselect, ppoll, epoll_pwait2} style non-TCP IO [it can amplify kernel transitions]. For UDP stuff blocking {sendmmsg,recvmmsg (with timeout)} amortizes out kernel transitions. + +![Media 1](./media/2070337342854832468_1.png) + +## Post 2 (2026-06-26 02:48:15) — reply to Post 1 + +sendmmsg/recvmmsg can only work with 1024 packets at a time unfortunately. You’ve gotta loop them. While they’re surprisingly fairly deterministic in execution times, their throughput isn’t the best. The Linux kernel takes far longer to process sending the packets out than my own code does to process the sim and build the packets in the first place lol. + +## Post 3 (2026-06-26 03:07:37) — reply to Post 2 + +@AgileJebrim Yes 1024 max, so best case 1/1024 the syscall count (well factored). As for overhead, for a co-located server you could always hijack the network card driver and just move your server into it and run kernel side if you really wanted to. + +## Post 4 (2026-06-26 03:08:39) — reply to Post 3 + +@NOTimothyLottes If you want to be locked in to a particular NIC yeah. + +## Post 5 (2026-06-26 07:28:39) — reply to Post 4 + +@AgileJebrim @NOTimothyLottes You can use eBPF as a poor man's kernel bypass. + +## Post 6 (2026-06-26 07:38:00) — reply to Post 1 + +@NOTimothyLottes Take a look at http://lalists.stanford.edu/lad/2001/Nov/0248.html + +## Post 7 (2026-06-26 10:58:14) — reply to Post 5 + +@aepau2 @AgileJebrim Not that any of my source would pass their nanny tester. When I was younger and running my own business, I used to host my business website off of a really old laptop running an in-kernel web server that I wrote. It wasn’t that hard to do long ago. + +## Post 8 (2026-06-26 11:45:37) — reply to Post 7 + +@NOTimothyLottes @aepau2 eBPF doesn’t support SIMD lol diff --git a/docs/twitter/2070337342854832468/thread_data.json b/docs/twitter/2070337342854832468/thread_data.json new file mode 100644 index 00000000..0fa80163 --- /dev/null +++ b/docs/twitter/2070337342854832468/thread_data.json @@ -0,0 +1,136 @@ +{ + "root_post_id": "2070337342854832468", + "posts": [ + { + "post_id": "2070337342854832468", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "Quick summary of why not {pselect, ppoll, epoll_pwait2} style non-TCP IO [it can amplify kernel transitions]. For UDP stuff blocking {sendmmsg,recvmmsg (with timeout)} amortizes out kernel transitions.", + "timestamp": "2026-06-26 02:44:22", + "media_urls": [ + "https://pbs.twimg.com/media/HLtP4RgWgAADbir?format=png&name=orig" + ], + "reply_to_id": null, + "quote_of_id": null, + "metrics": { + "reply_count": 2, + "repost_count": 1, + "like_count": 16, + "view_count": 2149 + } + }, + { + "post_id": "2070338320765165758", + "author": "Jebrim", + "handle": "AgileJebrim", + "text": "sendmmsg/recvmmsg can only work with 1024 packets at a time unfortunately. You’ve gotta loop them. While they’re surprisingly fairly deterministic in execution times, their throughput isn’t the best. The Linux kernel takes far longer to process sending the packets out than my own code does to process the sim and build the packets in the first place lol.", + "timestamp": "2026-06-26 02:48:15", + "media_urls": [], + "reply_to_id": "2070337342854832468", + "quote_of_id": null, + "metrics": { + "reply_count": 4, + "repost_count": 0, + "like_count": 7, + "view_count": 469 + } + }, + { + "post_id": "2070343193963397129", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "@AgileJebrim Yes 1024 max, so best case 1/1024 the syscall count (well factored). As for overhead, for a co-located server you could always hijack the network card driver and just move your server into it and run kernel side if you really wanted to.", + "timestamp": "2026-06-26 03:07:37", + "media_urls": [], + "reply_to_id": "2070338320765165758", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 4, + "view_count": 192 + } + }, + { + "post_id": "2070343454048039360", + "author": "Jebrim", + "handle": "AgileJebrim", + "text": "@NOTimothyLottes If you want to be locked in to a particular NIC yeah.", + "timestamp": "2026-06-26 03:08:39", + "media_urls": [], + "reply_to_id": "2070343193963397129", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 1, + "view_count": 109 + } + }, + { + "post_id": "2070408887455420544", + "author": "aeesz4", + "handle": "aepau2", + "text": "@AgileJebrim @NOTimothyLottes You can use eBPF as a poor man's kernel bypass.", + "timestamp": "2026-06-26 07:28:39", + "media_urls": [], + "reply_to_id": "2070343454048039360", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 1, + "view_count": 51 + } + }, + { + "post_id": "2070411240514420892", + "author": "Lee Revell", + "handle": "BigP4P4Smurf", + "text": "@NOTimothyLottes Take a look at http://lalists.stanford.edu/lad/2001/Nov/0248.html", + "timestamp": "2026-06-26 07:38:00", + "media_urls": [], + "reply_to_id": "2070337342854832468", + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 0, + "like_count": 1, + "view_count": 42 + } + }, + { + "post_id": "2070461630165532941", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "@aepau2 @AgileJebrim Not that any of my source would pass their nanny tester. When I was younger and running my own business, I used to host my business website off of a really old laptop running an in-kernel web server that I wrote. It wasn’t that hard to do long ago.", + "timestamp": "2026-06-26 10:58:14", + "media_urls": [], + "reply_to_id": "2070408887455420544", + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 2, + "view_count": 102 + } + }, + { + "post_id": "2070473555070836962", + "author": "Jebrim", + "handle": "AgileJebrim", + "text": "@NOTimothyLottes @aepau2 eBPF doesn’t support SIMD lol", + "timestamp": "2026-06-26 11:45:37", + "media_urls": [], + "reply_to_id": "2070461630165532941", + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 0, + "like_count": 1, + "view_count": 76 + } + } + ], + "source_url": "https://x.com/NOTimothyLottes/status/2070337342854832468" +} \ No newline at end of file diff --git a/docs/twitter/2070734717825986566/media/2070734717825986566_1.png b/docs/twitter/2070734717825986566/media/2070734717825986566_1.png new file mode 100644 index 00000000..15a38190 Binary files /dev/null and b/docs/twitter/2070734717825986566/media/2070734717825986566_1.png differ diff --git a/docs/twitter/2070734717825986566/media/2070735722043023873_1.png b/docs/twitter/2070734717825986566/media/2070735722043023873_1.png new file mode 100644 index 00000000..15a38190 Binary files /dev/null and b/docs/twitter/2070734717825986566/media/2070735722043023873_1.png differ diff --git a/docs/twitter/2070734717825986566/thread.md b/docs/twitter/2070734717825986566/thread.md new file mode 100644 index 00000000..6ca95ff0 --- /dev/null +++ b/docs/twitter/2070734717825986566/thread.md @@ -0,0 +1,27 @@ +--- +title: "Deterrent to ALSA is just parsing through snd_pcm_open() source. It's death by b" +author: "NOTimothyLottes" +handle: "@NOTimothyLottes" +post_url: "https://x.com/NOTimothyLottes/status/2070734717825986566" +post_id: "2070734717825986566" +timestamp: "2026-06-27 05:03:23" +post_count: 2 +reply_count: 1 +repost_count: 0 +like_count: 11 +view_count: 1624 +--- + +# @NOTimothyLottes — Deterrent to ALSA is just parsing through snd_pcm_open() source. It's death by b + +## Post 1 (2026-06-27 05:03:23) + +Deterrent to ALSA is just parsing through snd_pcm_open() source. It's death by boiler plate and complexity. Tinyalsa isn't much better. Likely easier to think about this from perspective of devices that can be open()ed from /dev/snd. On my machine doesn't seem to hot plug + +![Media 1](./media/2070734717825986566_1.png) + +## Post 2 (2026-06-27 05:07:23) — reply to Post 1 + +Assuming 'p'&'c' are PLAYBACK & CAPTURE, so opening different devices (instead of both in one device). Then just have user provide a device, or have the API war-dial open() constructing possible devices to probe what is available 'pcmC{c}D{d}{p|c}'. Easier than listing files. + +![Media 1](./media/2070735722043023873_1.png) diff --git a/docs/twitter/2070734717825986566/thread_data.json b/docs/twitter/2070734717825986566/thread_data.json new file mode 100644 index 00000000..244388bf --- /dev/null +++ b/docs/twitter/2070734717825986566/thread_data.json @@ -0,0 +1,42 @@ +{ + "root_post_id": "2070734717825986566", + "posts": [ + { + "post_id": "2070734717825986566", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "Deterrent to ALSA is just parsing through snd_pcm_open() source. It's death by boiler plate and complexity. Tinyalsa isn't much better. Likely easier to think about this from perspective of devices that can be open()ed from /dev/snd. On my machine doesn't seem to hot plug", + "timestamp": "2026-06-27 05:03:23", + "media_urls": [ + "https://pbs.twimg.com/media/HLy5-C9XMAAfs_w?format=png&name=orig" + ], + "reply_to_id": null, + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 11, + "view_count": 1624 + } + }, + { + "post_id": "2070735722043023873", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "Assuming 'p'&'c' are PLAYBACK & CAPTURE, so opening different devices (instead of both in one device). Then just have user provide a device, or have the API war-dial open() constructing possible devices to probe what is available 'pcmC{c}D{d}{p|c}'. Easier than listing files.", + "timestamp": "2026-06-27 05:07:23", + "media_urls": [ + "https://pbs.twimg.com/media/HLy6SApX0AApPub?format=png&name=orig" + ], + "reply_to_id": "2070734717825986566", + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 0, + "like_count": 2, + "view_count": 502 + } + } + ], + "source_url": "https://x.com/NOTimothyLottes/status/2070734717825986566" +} \ No newline at end of file diff --git a/docs/twitter/2071415096304193820/media/2071415096304193820_1.png b/docs/twitter/2071415096304193820/media/2071415096304193820_1.png new file mode 100644 index 00000000..db77f70b Binary files /dev/null and b/docs/twitter/2071415096304193820/media/2071415096304193820_1.png differ diff --git a/docs/twitter/2071415096304193820/thread.md b/docs/twitter/2071415096304193820/thread.md new file mode 100644 index 00000000..b94459ad --- /dev/null +++ b/docs/twitter/2071415096304193820/thread.md @@ -0,0 +1,25 @@ +--- +title: "Eventually figure out enough to get aplay to actually play a wave file, had to f" +author: "NOTimothyLottes" +handle: "@NOTimothyLottes" +post_url: "https://x.com/NOTimothyLottes/status/2071415096304193820" +post_id: "2071415096304193820" +timestamp: "2026-06-29 02:06:58" +post_count: 2 +reply_count: 1 +repost_count: 0 +like_count: 4 +view_count: 1152 +--- + +# @NOTimothyLottes — Eventually figure out enough to get aplay to actually play a wave file, had to f + +## Post 1 (2026-06-29 02:06:58) + +Eventually figure out enough to get aplay to actually play a wave file, had to find an explicitly stereo wav else it would refuse to just duplicate the mono channels. Basically the a'tools unfriendlyness mirrors that of ALSA. Still cannot understand 'boundary' ... + +![Media 1](./media/2071415096304193820_1.png) + +## Post 2 (2026-06-29 04:08:45) — reply to Post 1 + +No luck getting ALSA to play anything from my app. State is always 2 SNDRV_PCM_STATE_PREPARED, haven't been able to get it to run. If I try the start ioctl, then it errors with -EPIPE. diff --git a/docs/twitter/2071415096304193820/thread_data.json b/docs/twitter/2071415096304193820/thread_data.json new file mode 100644 index 00000000..d0667959 --- /dev/null +++ b/docs/twitter/2071415096304193820/thread_data.json @@ -0,0 +1,40 @@ +{ + "root_post_id": "2071415096304193820", + "posts": [ + { + "post_id": "2071415096304193820", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "Eventually figure out enough to get aplay to actually play a wave file, had to find an explicitly stereo wav else it would refuse to just duplicate the mono channels. Basically the a'tools unfriendlyness mirrors that of ALSA. Still cannot understand 'boundary' ...", + "timestamp": "2026-06-29 02:06:58", + "media_urls": [ + "https://pbs.twimg.com/media/HL8km6eWsAEq6xb?format=png&name=orig" + ], + "reply_to_id": null, + "quote_of_id": null, + "metrics": { + "reply_count": 1, + "repost_count": 0, + "like_count": 4, + "view_count": 1152 + } + }, + { + "post_id": "2071445744389611593", + "author": "NOTimothyLottes", + "handle": "NOTimothyLottes", + "text": "No luck getting ALSA to play anything from my app. State is always 2 SNDRV_PCM_STATE_PREPARED, haven't been able to get it to run. If I try the start ioctl, then it errors with -EPIPE.", + "timestamp": "2026-06-29 04:08:45", + "media_urls": [], + "reply_to_id": "2071415096304193820", + "quote_of_id": null, + "metrics": { + "reply_count": 0, + "repost_count": 0, + "like_count": 0, + "view_count": 481 + } + } + ], + "source_url": "https://x.com/NOTimothyLottes/status/2071415096304193820" +} \ No newline at end of file diff --git a/docs/twitter/2071706805114216559/media/2071706805114216559_1.png b/docs/twitter/2071706805114216559/media/2071706805114216559_1.png new file mode 100644 index 00000000..c692e500 Binary files /dev/null and b/docs/twitter/2071706805114216559/media/2071706805114216559_1.png differ diff --git a/docs/twitter/2071706805114216559/media/2071710958397898929_1.png b/docs/twitter/2071706805114216559/media/2071710958397898929_1.png new file mode 100644 index 00000000..9a079be8 Binary files /dev/null and b/docs/twitter/2071706805114216559/media/2071710958397898929_1.png differ diff --git a/docs/twitter/2071706805114216559/media/2071714384225681440_1.png b/docs/twitter/2071706805114216559/media/2071714384225681440_1.png new file mode 100644 index 00000000..fca15f5f Binary files /dev/null and b/docs/twitter/2071706805114216559/media/2071714384225681440_1.png differ diff --git a/docs/twitter/2071706805114216559/media/2071715941688258752_1.png b/docs/twitter/2071706805114216559/media/2071715941688258752_1.png new file mode 100644 index 00000000..2f48ecab Binary files /dev/null and b/docs/twitter/2071706805114216559/media/2071715941688258752_1.png differ diff --git a/docs/twitter/2071706805114216559/media/2071717187623030935_1.png b/docs/twitter/2071706805114216559/media/2071717187623030935_1.png new file mode 100644 index 00000000..f2afb74b Binary files /dev/null and b/docs/twitter/2071706805114216559/media/2071717187623030935_1.png differ diff --git a/docs/twitter/2071706805114216559/media/2071725181576319370_1.jpg b/docs/twitter/2071706805114216559/media/2071725181576319370_1.jpg new file mode 100644 index 00000000..89c04fbc Binary files /dev/null and b/docs/twitter/2071706805114216559/media/2071725181576319370_1.jpg differ diff --git a/docs/twitter/2071706805114216559/media/2071759816725311959_1.png b/docs/twitter/2071706805114216559/media/2071759816725311959_1.png new file mode 100644 index 00000000..267ad528 Binary files /dev/null and b/docs/twitter/2071706805114216559/media/2071759816725311959_1.png differ diff --git a/docs/twitter/2071706805114216559/thread.md b/docs/twitter/2071706805114216559/thread.md new file mode 100644 index 00000000..7d0e986b --- /dev/null +++ b/docs/twitter/2071706805114216559/thread.md @@ -0,0 +1,96 @@ +--- +title: "ALSA hell month continues: remember it might be "open source" but it is definite" +author: "NOTimothyLottes" +handle: "@NOTimothyLottes" +post_url: "https://x.com/NOTimothyLottes/status/2071706805114216559" +post_id: "2071706805114216559" +timestamp: "2026-06-29 21:26:07" +post_count: 15 +reply_count: 3 +repost_count: 0 +like_count: 21 +view_count: 1713 +--- + +# @NOTimothyLottes — ALSA hell month continues: remember it might be "open source" but it is definite + +## Post 1 (2026-06-29 21:26:07) + +ALSA hell month continues: remember it might be "open source" but it is definitely "closed documentation" [those docs are securely trapped in the minds of the authors]. Now that I have aplay playing a sound, it's time for garbage sifting through STRACE to see what is going on ... + +![Media 1](./media/2071706805114216559_1.png) + +## Post 2 (2026-06-29 21:42:37) — reply to Post 1 + +For devs working on linux, strace is a good friend, besides reverse engineering undocumented crap, it's useful to run on your own app as a bug test, like look what this idiot [me] did with nanosleep() + +![Media 1](./media/2071710958397898929_1.png) + +## Post 3 (2026-06-29 21:56:14) — reply to Post 2 + +In my ALSA interface I war-dial the possible /dev/snd/pcm devices instead of just listing the directory. It's a lot easier in source code. + +![Media 1](./media/2071714384225681440_1.png) + +## Post 4 (2026-06-29 21:56:48) — reply to Post 1 + +@NOTimothyLottes Have you actually reached out to said developers and offered to start a documentation effort/ask them some questions about things? It seems a little unfair to be rage posting about this all the time when the point is you (and me, and everyone) have the power to make it better. + +## Post 5 (2026-06-29 22:02:25) — reply to Post 3 + +Using 'strace' showed another bug in my setting schedule priority code (I didn't yet validate that code and check for errors). Definitely my ALSA test app shows ZERO errors in ALSA system calls, but doesn't actually play anything. Broken without errors = crappy API. + +![Media 1](./media/2071715941688258752_1.png) + +## Post 6 (2026-06-29 22:04:37) — reply to Post 5 + +In theory a good API, SNDRV_PCM_IOCTL_PREPARE would fail if the next SNDRV_PCM_IOCTL_WRITEI_FRAMES wouldn't accept the write. And that WRITEI should also fail instead of pass and setting .result=0 (of the snd xferi structure). + +## Post 7 (2026-06-29 22:07:22) — reply to Post 6 + +The best I can guess thus far is that the aplay app goes through some HW_REFINE ioctls before setting the HW_PARAMS, and perhaps the "magic missing thing" is in that process. + +![Media 1](./media/2071717187623030935_1.png) + +## Post 8 (2026-06-29 22:12:52) — reply to Post 4 + +@AlexABPerson Haha I could start that with an email: hello godly ALSA dev, as a vintage pee-on programmer from the stone age, I was trying to ignore your advice about using the user-space API and thus needing GPL, and instead using the undocumented IOCTLs of the kernel driver directly ... + +## Post 9 (2026-06-29 22:19:03) — reply to Post 8 + +@AlexABPerson But on a serious note, I mostly shit post for the entertainment, because once in a while I actually learn something from a response. And often documenting the process might help someone else too ... + +## Post 10 (2026-06-29 22:39:08) — reply to Post 7 + +Best docs on REFINE that I've found yet is indirectly through this. Note tinyalsa doesn't seem to use this interface other than through pcm_params_get(), not the interative process seen in aplay strace. Maybe because tinyalsa is for android (different drivers) + +![Media 1](./media/2071725181576319370_1.jpg) + +## Post 11 (2026-06-29 23:44:32) — reply to Post 9 + +@NOTimothyLottes That's fair, thank you for the honest reply! It *is* interesting to see a lot of these sorts of inner workings, and I definitely sympathise with the "I can't believe it works like this" feeling 😂 Stuff does have a tendency to get like that huh + +## Post 12 (2026-06-30 00:56:46) — reply to Post 10 + +SNDRV_PCM_IOCTL_HW_REFINE +If send out a zeroed snd_pcm_hw_params, the ioctl will fail. There is a special magic sauce to the structure that must be initialized correctly before you can even fetch hardware parameters. It's high level skill in Obfuscation. See *_any( in ALSA src + +![Media 1](./media/2071759816725311959_1.png) + +## Post 13 (2026-06-30 00:59:34) — reply to Post 12 + +magiz/ +clear snd_pcm_hw_params +set masks[0 ... 2].bits[0]=~0 +set intervals[0 ... 11].max=~0 +set rmask=~0 +set info=~0 + +## Post 14 (2026-06-30 01:26:54) — reply to Post 13 + +The rmask and cmask use bit indexed by the DEFINE so +1<