| Time |
Nick |
Message |
| 01:07 |
|
user333_ joined #luanti |
| 01:27 |
|
gera joined #luanti |
| 01:34 |
|
SwissalpS joined #luanti |
| 01:43 |
|
SFENCE joined #luanti |
| 02:02 |
|
SFENCE joined #luanti |
| 02:05 |
|
Eragon joined #luanti |
| 02:06 |
|
Confines joined #luanti |
| 02:06 |
Confines |
Yo user333_ |
| 02:06 |
Confines |
Finally got back from the work trip, nice attack lmao |
| 02:08 |
Confines |
Finally got around to adding a packet size limiter, I don't have enough ram to serve massive packets |
| 02:18 |
|
SFENCE joined #luanti |
| 02:34 |
user333_ |
oh hi Confines |
| 02:41 |
user333_ |
... |
| 02:45 |
user333_ |
he just timed out |
| 02:49 |
|
SFENCE joined #luanti |
| 03:05 |
|
Confines joined #luanti |
| 03:05 |
Confines |
I'm back |
| 03:08 |
Confines |
Just finished bringing the backend back from the dead and adding some much needed security measures |
| 03:13 |
|
SFENCE joined #luanti |
| 03:14 |
user333_ |
took you long enough, it was offline for almost 24h |
| 03:15 |
Confines |
I was on a work trip out of state |
| 03:19 |
user333_ |
i was setting up my new PC :P |
| 03:19 |
|
SFENCE joined #luanti |
| 03:20 |
user333_ |
anyway, that's twice i crashed your backend |
| 03:23 |
Confines |
Yeah, although both times the actual backend was fine, it just ran out of memory, either way that should be fixed now |
| 03:23 |
user333_ |
time to find more exploits! |
| 03:24 |
Confines |
Please do!@ |
| 03:24 |
user333_ |
also remove the 28,000 accounts a friend registered with a script :> |
| 03:24 |
Confines |
Already did |
| 03:24 |
Confines |
Closer to 34,000 |
| 03:24 |
user333_ |
oh wow |
| 03:24 |
Confines |
Still only took 100 kb |
| 03:25 |
user333_ |
also did you find any buggy ones? i registered a few with newlines/carriage returns/random unicode characters/escapes |
| 03:31 |
user333_ |
yay my new PC can run luanti with (almost) all shaders on |
| 03:31 |
[MatrxMT] |
<Blockhead256> reject shaders, embrace 1000 render distance |
| 03:31 |
user333_ |
nah |
| 03:32 |
user333_ |
i have a (relatively) good PC now, 6 cores/12 threads @3.5ish GHz, 16GB DDR4, 512GB SSD, dualbooting windows 11 23H2 and ubuntu 24.04.3 |
| 03:34 |
user333_ |
and some AMD GPU, lucky it wasn't NVIDIA, i hear their drivers are a pain to install on linux |
| 03:34 |
[MatrxMT] |
<Blockhead256> things have gotten better for nvidia lately, but, yes |
| 03:34 |
[MatrxMT] |
<Blockhead256> you have to have a lot of money lying around to buy their late model GPUs though |
| 03:35 |
user333_ |
this was some mini PC from amazon for like $500, very good price/specs ratio |
| 03:36 |
user333_ |
it's about ~2x larger than my RPi5+it's case |
| 03:38 |
|
Verticen joined #luanti |
| 03:41 |
Confines |
I'm so happy for you! |
| 03:41 |
Confines |
Now you can attack my backend with even more speed! |
| 03:41 |
user333_ |
now the fun part... transferring files from my RPi5 to my new PC |
| 03:41 |
user333_ |
using SFTP is giving me like ~30s of lag here though |
| 03:42 |
Confines |
Do you not have a usb stick |
| 03:42 |
user333_ |
you sound sarcastic :P |
| 03:42 |
Confines |
Nah |
| 03:43 |
user333_ |
i have a 128GB usb drive and a 1TB external hard drive... + some cheap 4GB USB drives that will corrupt if you touch them |
| 03:43 |
user333_ |
lucky the -l option for scp exists |
| 03:44 |
Confines |
Nice |
| 03:45 |
user333_ |
i'm using SFTP bc it's more convenient .-. |
| 03:45 |
user333_ |
il just let it run overnight and suffer the lag while i copy over my important stuff (totally not pirated games) |
| 03:47 |
Confines |
I love pirated games! |
| 03:47 |
user333_ |
so do i! i have (almost) every half-life and portal games, and a few SNES ROMS |
| 03:48 |
user333_ |
*nintendo and valve knock on my door* |
| 03:48 |
Confines |
nintendo can smb |
| 03:49 |
user333_ |
the SNES roms don't require a network connection to work so gl nintendo :P |
| 03:55 |
user333_ |
anyway im still waiting for an IRC channel :P |
| 04:00 |
|
MTDiscord joined #luanti |
| 04:00 |
|
SFENCE joined #luanti |
| 04:02 |
|
SFENCE_ joined #luanti |
| 04:04 |
|
SFENCE_ joined #luanti |
| 04:04 |
|
SFENCE_ joined #luanti |
| 04:14 |
|
SFENCE joined #luanti |
| 04:17 |
|
SFENCE_ joined #luanti |
| 04:20 |
|
SFENCE joined #luanti |
| 04:28 |
|
Confines joined #luanti |
| 04:28 |
Confines |
I'll do that soon, you've been keeping me busy on less fun things lol |
| 04:33 |
user333_ |
happy to help |
| 04:41 |
user333_ |
'Request entity too large\n' looks like you fixed it |
| 04:44 |
user333_ |
now to find an SQL injection vulnerability |
| 04:46 |
|
SFENCE_ joined #luanti |
| 04:48 |
Confines |
SQL injection hasn't been a thing since I made the backend |
| 04:48 |
Confines |
I was awake enough to make sure I had that |
| 04:48 |
Confines |
when I made the backend |
| 04:54 |
user333_ |
oh good lol |
| 04:54 |
user333_ |
i'm no cybersecurity expert but it lgtm (for now :P) |
| 04:58 |
user333_ |
i still have a few ideas to crash it but they are closer to a DDoS than an exploit |
| 05:04 |
Confines |
Please give it all you got |
| 05:22 |
repetitivestrai- |
https://github.com/luanti-org/luanti/issues/16633 |
| 05:22 |
|
repetitivestrain joined #luanti |
| 05:23 |
repetitivestrain |
https://github.com/luanti-org/luanti/issues/16633 since this proposal surfaces every so often and the ergonomics of configuring mineclonia's lua map generator are abysmal as it stands, why can't num_emerge_threads simply be fixed to one for the built-in map generators, which do not support multiple emerge threads, and configured to 0 or some other suitable default on singlenode |
| 05:26 |
repetitivestrain |
e.g.: https://github.com/luanti-org/luanti/issues/10606, https://github.com/luanti-org/luanti/issues/15630 |
| 05:26 |
repetitivestrain |
and i receive the impression that it was 0 by default some years ago |
| 06:17 |
|
YuGiOhJCJ joined #luanti |
| 06:20 |
|
sofar_ joined #luanti |
| 06:21 |
|
fluxionary joined #luanti |
| 06:24 |
|
swee joined #luanti |
| 06:41 |
|
FeXoR joined #luanti |
| 06:47 |
|
YuGiOhJCJ joined #luanti |
| 08:02 |
|
alias joined #luanti |
| 08:43 |
sfan5 |
repetitivestrain: wouldn't just setting this in your game's minetest.conf work? |
| 08:44 |
repetitivestrain |
sfan5: unfortunately not, because we also support the built-in mapgens |
| 08:45 |
repetitivestrain |
and i'm not sure whether modifying the option from lua would be possible, but it's still out of the question as it would overwrite players' minetest.confs on singleplayer |
| 08:46 |
sfan5 |
set_mapgen_setting does not work for this, no |
| 08:47 |
repetitivestrain |
yeah, i've already attempted this, but i was speaking of altering core.settings |
| 10:43 |
|
mrkubax10 joined #luanti |
| 10:50 |
|
mrkubax10 joined #luanti |
| 10:50 |
|
mrkubax10 joined #luanti |
| 10:51 |
|
mrkubax10 joined #luanti |
| 11:16 |
|
repetitivestrai- joined #luanti |
| 11:26 |
|
repetitivestrain joined #luanti |
| 11:39 |
|
mrkubax10 joined #luanti |
| 11:56 |
|
jaca122 joined #luanti |
| 12:11 |
sfan5 |
repetitivestrain: good news https://github.com/luanti-org/luanti/pull/16634 |
| 12:11 |
repetitivestrain |
sfan5: much appreciated, thank you! |
| 12:33 |
repetitivestrain |
sfan: i think the upper limit should be more conservative by default, as each lua environment started must by nature redundantly allocate memory for a great amount of information, voxelmanips, and cid and param2 arrays, which can amount to up to 500-700MB/thread, and defaulting to a maximum of 20 threads might unduly stress the system for memory |
| 12:33 |
repetitivestrain |
particularly on recent laptops with 16+ thread processors but only 16 gigabytes of ram that must be shared with other programs |
| 12:54 |
|
PoochInquisitor joined #luanti |
| 13:03 |
sfan5 |
what do you suggest |
| 13:04 |
repetitivestrain |
8, i think |
| 13:04 |
repetitivestrain |
that's what i use on my server (which has 64 cores) and produces a maximum rss of 6 gigabytes without any loaded blocks and 8 otherwise |
| 13:05 |
repetitivestrain |
otherwise with 1-2 players online* |
| 13:07 |
sfan5 |
6GB for 8 threads sounds like a lot |
| 13:07 |
repetitivestrain |
there's also the main thread and one async environment thread which share the same data |
| 13:08 |
[MatrxMT] |
<Blockhead256> is this the mcla mapgen with redundant data or one of the C++ mapgens? |
| 13:08 |
sfan5 |
hold on |
| 13:09 |
sfan5 |
!c (5*16)**4 * 4 / (1024*1024) |
| 13:09 |
MinetestBot |
156.25 |
| 13:09 |
repetitivestrain |
Blockhead256: with the lua map generator, yes |
| 13:12 |
sfan5 |
wait i calculated wrong |
| 13:12 |
sfan5 |
!c (5*16)**3 * 4 / (1024*1024) |
| 13:12 |
MinetestBot |
1.953125 |
| 13:13 |
repetitivestrain |
well that's not exactly accurate, since lua arrays are composed of 8 byte doubles |
| 13:13 |
sfan5 |
even by a conservative estimate one copy of a chunk is <10MB |
| 13:13 |
sfan5 |
how much do you store that you arrive at 700MB |
| 13:15 |
repetitivestrain |
three arrays of 80x512x80 data that amount to 75 megabytes, a 50 mb biome table, 75 megabytes of loaded schematics, i think, and hundreds of megabytes of jit code cache |
| 13:15 |
sfan5 |
!c 3*75+50+75 |
| 13:15 |
MinetestBot |
350 |
| 13:16 |
repetitivestrain |
you can reduce maxmcode to the default 64k and observe performance decline as you move between areas with different terrain characteristics but also maximum rss decline by a few hundred megabytes per thread |
| 13:16 |
|
silverwolf73827 joined #luanti |
| 13:23 |
repetitivestrain |
right, i also overlooked the generated biome array |
| 13:24 |
repetitivestrain |
which is as large as the mapblock itself and is also serialized and reported to the main thread as a gennotify |
| 13:28 |
repetitivestrain |
hmm, it's actually vmanip:get_data and vmanip:get_param2_data that allocate nearly 128 mb |
| 13:30 |
repetitivestrain |
-> Pre-on_generated.: 29 MB (+ 2) -> on_generated.: 157 MB (+ 128) -> Biome generation.: 158 MB (+ 1) -> Terrain generation.: 197 MB (+ 39) -> Biome encoding.: 197 MB (+ 0) -> Biome data serialization.: 197 MB (+ 0) -> Chunk generation.: 197 MB (+ 0) |
| 13:30 |
repetitivestrain |
and the jit code that continues to inflate rss after these buffers are allocated, because a call to jit.flush always reduces each environment's memory requirements to the initial ~200 MB |
| 13:30 |
repetitivestrain |
possibly as a result of the emerged area being one mapblock around the bounds of the mapchunk, even under singlenode? |
| 13:31 |
sfan5 |
!c ((5+2)*16)**3 * 8 / (1024*1024) |
| 13:31 |
MinetestBot |
10.71875 |
| 13:31 |
sfan5 |
idk how much overhead a lua table has |
| 13:32 |
repetitivestrain |
my mapchunks are 5x32x5 |
| 13:32 |
repetitivestrain |
!c (80*512*80)**3 * 8 / (1024 * 1024) |
| 13:32 |
MinetestBot |
268435456000000.0 |
| 13:32 |
repetitivestrain |
uh no haha |
| 13:32 |
sfan5 |
!c (80*512*80) * 8 / (1024 * 1024) |
| 13:32 |
MinetestBot |
25.0 |
| 13:32 |
repetitivestrain |
!c !c (80*512*80) * 8 / 8 |
| 13:32 |
MinetestBot |
SyntaxError: invalid syntax (<string>, line 1) |
| 13:33 |
sfan5 |
still not 128 mb |
| 13:33 |
repetitivestrain |
!c (80*512*80) * 8 * 3 / 8 |
| 13:33 |
MinetestBot |
9830400.0 |
| 13:33 |
repetitivestrain |
this is literally how i instrumented the code, though: |
| 13:34 |
repetitivestrain |
mcl_levelgen.report_consing ("-> Pre-on_generated"); local emin, emax = vmanip:get_emerged_area (); area = VoxelArea (vector.subtract (emin, minp), vector.subtract (emax, minp)); vmanip:get_data (cids); vmanip:get_param2_data (param2s); local generated = false; mcl_levelgen.report_consing ("-> on_generated") |
| 13:34 |
repetitivestrain |
where report_consing simply runs collectgarbage ("collect") and collectgarbage ("count") before deducting the value from the result recorded during the previous call |
| 13:42 |
|
mrkubax10 joined #luanti |
| 13:50 |
|
kamdard joined #luanti |
| 13:53 |
|
turtleman joined #luanti |
| 13:54 |
repetitivestrain |
sfan5: with no mcode size limit (maxmcode=32 GB), mcode usage (as measured by the reduction in memory consumption incurred by jit.flush) plateaus at 570 MB |
| 13:56 |
sfan5 |
per-thread? |
| 13:56 |
repetitivestrain |
yes |
| 13:58 |
repetitivestrain |
with the 40 mb mcode size limit that is defined in the main lua environment, the jit cache is flushed after several hundred chunks are generated, and after such a cache flush i recall that trace selection for the main terrain sampling loop would proceed much less optimally |
| 13:58 |
repetitivestrain |
but i'm not registering the same performance impact that i did when last i benchmarked this phenomenon |
| 14:00 |
repetitivestrain |
ye gods, i am blind |
| 14:00 |
repetitivestrain |
https://codeberg.org/mineclonia/mineclonia/commit/0cf0b6d36c1957e8ae05b8ef915f04cf7c6fecdc |
| 14:01 |
repetitivestrain |
i fixed the performance issue after trace flushes in august and it shouldn't be necessary to keep mcode unbounded any longer |
| 14:08 |
sfan5 |
https://store.steampowered.com/hwsurvey/cpus/ interesting |
| 14:09 |
sfan5 |
so most people would either get 3, 4 or 2 emerge threads |
| 14:09 |
sfan5 |
sounds ok |
| 14:10 |
repetitivestrain |
i concur, and thanks |
| 15:07 |
|
qqe joined #luanti |
| 15:23 |
|
bgstack15 joined #luanti |
| 15:29 |
erle |
repetitivestrain are you halon? i forgot |
| 15:29 |
repetitivestrain |
I am, yes\ |
| 15:30 |
erle |
repetitivestrain i understand the issues you have with faulty luajit versions. however, since you have a base function that is working and only the optimization fails, i think logging an error and using the normal unoptimized function would be enough for this use case. not every user is able to upgrade their luajit. why do you think the code being slower and a log message is not enough? |
| 15:31 |
repetitivestrain |
erle: it's not only the optimized version that fails, but only the optimized version that is aggressively _tested_ |
| 15:31 |
erle |
repetitivestrain also i used to do a similar tihng for faulty minetest versions, run tests at startup and complain if they failed. however, literally no one appreciated this. |
| 15:31 |
erle |
repetitivestrain if your optimization is not tested well enough, the equivalence of it is at best questionable. |
| 15:32 |
repetitivestrain |
the functions in question are supposed to yield mathematically well defined results, as they do on functioning versions of luajit |
| 15:32 |
erle |
repetitivestrain are you aware of what property testing is? if so: in this case you have a property: f(x) must equal f_optimized(x). a property testing framework can make sure this is true for all x. |
| 15:34 |
repetitivestrain |
erle: the problem is not whether the optimized and unoptimized versions are equivalent, but whether either version is compiled correctly by luajit and yields results equivalent to a completely separate ground truth |
| 15:35 |
repetitivestrain |
there's no telling whether a defective version of luajit will operate correctly, and, on account of luajit's character as a jit and trace compiler, even when these miscompilations will manifest |
| 15:35 |
erle |
repetitivestrain well then why don't you fall back to the base version in that case? |
| 15:35 |
repetitivestrain |
erle: as i said, the base version is equally liable to be miscompiled |
| 15:36 |
repetitivestrain |
the upshot is that the defective luajit cannot be tested and should be upgraded |
| 15:36 |
erle |
repetitivestrain oh i didn't understand that. so you are saying that regardless of code path, defective luajit is unserviceable? |
| 15:36 |
repetitivestrain |
correctly |
| 15:36 |
repetitivestrain |
you understand correctly* |
| 15:36 |
erle |
repetitivestrain and what is the impact of the miscompilation? |
| 15:37 |
erle |
defective PRNG? |
| 15:37 |
MTDiscord |
<luatic> you can turn JIT off for a function, but this risks massive performance hits |
| 15:37 |
repetitivestrain |
the rng will generate non-deterministic random values that are also inconsistent with properly functioning lua installations |
| 15:37 |
repetitivestrain |
because luajit is a trace compiler, not even jit.off is 100% reliable |
| 15:37 |
erle |
repetitivestrain that sounds like something that outside of cryptographic applications and test suites it should be a warning, not a crash. |
| 15:37 |
repetitivestrain |
erle: correct |
| 15:37 |
repetitivestrain |
erle: then the map generator will cease to be deterministic |
| 15:39 |
erle |
repetitivestrain then mention that in the log message? i am pretty sure that most people would prefer “luajit defective, mapgen is not deterministic” as a warning over NOT BEING ABLE TO RUN THE GAME. |
| 15:39 |
repetitivestrain |
That is worse than not being able to run the game |
| 15:39 |
erle |
repetitivestrain unless it outputs 3 3 3 3 3 3 3 |
| 15:39 |
erle |
how? |
| 15:39 |
erle |
i mean you have thought a lot about it, and i haven't |
| 15:39 |
erle |
so what's the worst that could (and inevitably will) happen? |
| 15:39 |
erle |
fucked up schematics? broken biomes? |
| 15:39 |
repetitivestrain |
each emerge environment is completely independent of others, and the result will be that chunks generated by one emerge thread may be discontinuous with chunks generated by others, and seeds will, in difficult to observe manners, not produce the same results after a restart or on different systems |
| 15:40 |
erle |
and this is true for all mapgens? |
| 15:40 |
repetitivestrain |
yes |
| 15:40 |
erle |
was it true in the past as well? |
| 15:40 |
repetitivestrain |
on the built in map generators it'll only impact structures, but the effect is just as catastrophic |
| 15:40 |
repetitivestrain |
no, because RNGs were not implemented in Lua in the past |
| 15:40 |
repetitivestrain |
but there were inexplicable crashes in dripstone.lua produced by the very same luajit package |
| 15:40 |
repetitivestrain |
dripstone's init.lua* |
| 15:40 |
erle |
oh interesting |
| 15:41 |
erle |
now i have a bit of experience doing bit-twiddling in lua. could you point me to the luajit issue regarding that topic so i can make sure i don't run into this? |
| 15:43 |
repetitivestrain |
erle: search for "ARM64: Don't fuse sign extensions into logical operands" in the LuaJIT repository |
| 15:44 |
repetitivestrain |
however, the luajit release at issue is impacted by all arm64 jit compilation issues that have been addressed since 2021 or so |
| 15:45 |
repetitivestrain |
and should not be trusted with _any_ lua code whatever, whether it implements random number generators or merely iterates over a table |
| 15:45 |
erle |
repetitivestrain well i do have an aarch64 laptop, does that mean i can't run it there? |
| 15:45 |
erle |
or is aarch64 different from arm64? |
| 15:45 |
repetitivestrain |
erle: no, it means you must _update luajit_ |
| 15:46 |
repetitivestrain |
the OP's version of luajit was multiple years out of date and is only distributed by distributions who are wedded to tagged releases, which prevents them from accepting luajit's switch to a rolling release schedule |
| 15:46 |
erle |
repetitivestrain do you have any idea which luajit version is the first “good” one and which one is the first “bad” one? |
| 15:47 |
repetitivestrain |
erle: any luajit compiled from source code after 10 Sep 2023 |
| 15:47 |
erle |
repetitivestrain this seems like you *can* pinpoint which commit/release it is. |
| 15:48 |
repetitivestrain |
but i can't disable luajit |
| 15:48 |
repetitivestrain |
obviously |
| 15:48 |
erle |
https://openresty.org/en/changelog-1025003.html |
| 15:48 |
erle |
> ARM64: Fuse rotates into logical operands and don't fuse sign extensions into these operands. |
| 15:48 |
repetitivestrain |
this is openresty's luajit distribution, yes |
| 15:48 |
erle |
so this is the first good or first bad one? Version 1.25.3.1 - 04 Jan 2024 |
| 15:49 |
repetitivestrain |
this is an unofficial luajit fork |
| 15:49 |
erle |
damn |
| 15:49 |
repetitivestrain |
luajit upstream doesn't tag releases at all |
| 15:49 |
MTDiscord |
<a.corp.serot> luajit's versioning scheme is a bit weird |
| 15:49 |
erle |
repetitivestrain great. i guess like irrlicht, at some point people will think it is dead lol |
| 15:49 |
repetitivestrain |
users are always advised to compile luajit from the most recent revision of the repository |
| 15:49 |
erle |
(irrlicht is not dead, it just has a very … rare … release schedule) |
| 15:49 |
repetitivestrain |
https://luajit.org/download.html |
| 15:50 |
repetitivestrain |
> LuaJIT uses rolling releases. There are no release tarballs available for download. Please do not use obsolete versions from older tarballs or zip files. Please remove any outdated links to these downloads — these links will cease to work soon. Do not use pseudo-releases or tarballs created by third parties. Do not use binaries offered for download by third parties. Pre-built packages should only be installed via a trusted |
| 15:50 |
repetitivestrain |
package manager for your operating system (distro). But you should be aware these often carry old versions that miss important fixes. Before reporting an issue, always try the latest version available from the git repository. Distro maintainers for distros that require the fiction of a release should do frequent snapshots of a branch. Do not attempt to cherry-pick or backport individual changes, no matter how self-standing |
| 15:50 |
repetitivestrain |
individual changes look (because they often are not). |
| 15:50 |
MTDiscord |
<a.corp.serot> are there really repos that have not caught up with luajit's rolling release scheme? |
| 15:50 |
erle |
repetitivestrain this seems it actually fucking sucks |
| 15:50 |
repetitivestrain |
a.corp.serot: Alpine, apparently |
| 15:50 |
repetitivestrain |
erle: everyone else has adapted, even debian i believe |
| 15:50 |
erle |
repetitivestrain do you have a standalone test that i can use to see if debian aarch64 code exhibits this? |
| 15:51 |
repetitivestrain |
erle: just run "luajit random.lua" and report whether it aborts |
| 15:51 |
repetitivestrain |
well, "luajit init.lua" |
| 15:51 |
repetitivestrain |
in the mcl_levelgen mod directory |
| 15:51 |
erle |
; luajit random.lua |
| 15:51 |
erle |
luajit: cannot open random.lua: No such file or directory |
| 15:51 |
erle |
# exited 1 |
| 15:52 |
repetitivestrain |
it should have been apparent from context that i meant you to load this file within mineclonia's mods/MAPGEN/mcl_levelgen directory... |
| 15:52 |
erle |
context-free or regular please |
| 15:52 |
erle |
i have an attention deficit, furthermore i can not read minds via TCP/IP |
| 15:53 |
erle |
i asked for a *standalone* test for a reason |
| 15:53 |
erle |
repetitivestrain in return, i will share a standalone test so you can see if your python installation is defective. |
| 15:53 |
repetitivestrain |
erle: i don't have any, sorry |
| 15:53 |
repetitivestrain |
however, i think there is one in the luajit repository |
| 15:54 |
repetitivestrain |
local t = {}; local zero = 0LL; local bit = require("bit"); for i = 1, 60 do t[i] = bit.bor(-i, zero); end; for i = 1, 60 do assert(tonumber(t[i]) == -i); end |
| 15:55 |
erle |
repetitivestrain here is one |
| 15:55 |
erle |
python3 -c 'import base64; print(base64.b64decode("=V=M=0="))' |
| 15:55 |
repetitivestrain |
b'T\xcd' |
| 15:55 |
erle |
if this does not output an error, your python3 installation is defective |
| 15:55 |
repetitivestrain |
Oh yes haha |
| 15:55 |
erle |
because "=V=M=0=" is not a valid base64 string |
| 15:56 |
repetitivestrain |
Emacs passes with flying colors |
| 15:56 |
repetitivestrain |
Debugger entered--Lisp error: (error "Invalid base64 data") base64-decode-string("=V=M=0=") |
| 15:56 |
erle |
however, if you remove one = sign at the end, python will fail |
| 15:56 |
erle |
(correctly) |
| 15:56 |
repetitivestrain |
Task failed successfully |
| 15:57 |
erle |
this error lets you infer that python3 base64 decoder is what LANGSEC people call a “shotgun parser” |
| 15:57 |
erle |
i.e. it does not validate its inputs as the first step, and has validation logic interspersed with processing code |
| 15:57 |
erle |
which is generally a recipe for disaster |
| 15:58 |
erle |
for this reason, *every single time* you handle base64 data in python, you have to make sure it is really actual base64 e.g. using a regular expression (base64 is regular) |
| 15:59 |
|
mrkubax10 joined #luanti |
| 15:59 |
erle |
repetitivestrain for additional amusement, “VM0” is the beginning of the fixed point of base64 |
| 16:00 |
erle |
; printf 'foo' |base64 |base64 |base64 |base64 |base64 |base64 |base64 |base64 |
| 16:00 |
erle |
Vm0weGQxTnRVWGxWV0dSUFZtMW9WMWxzVWxkalJuQllZMFZPVlZKVk5YVlZSbEYzVTNkdlBRbz0K |
| 16:00 |
erle |
; printf 'bar' |base64 |base64 |base64 |base64 |base64 |base64 |base64 |base64 |
| 16:00 |
erle |
Vm0weGQxSXlSblJXYTJSVVYwZDRXRmxyVm5kalJuQllZMFZPVlZKVk5YVlZSbEYzVTNkdlBRbz0K |
| 16:01 |
erle |
amusing, isn't it? |
| 16:01 |
repetitivestrain |
debian trixie's luajit is good |
| 16:01 |
erle |
applying the encoding to itself will always produce the thing |
| 16:01 |
repetitivestrain |
2.1.0+openresty20250117 |
| 16:01 |
erle |
https://www.joshisanerd.com/projects/base64fixpoint/d3ish.html |
| 16:01 |
erle |
repetitivestrain do you think the ENGINE should contain a self-test for luajit breakage? |
| 16:02 |
repetitivestrain |
but debian oldstable's luajit is an outdated release of 2.1.0-beta3 (with backports such as luajit's developer specifically advises against) and oldoldstable's is even more hopelessly out of date |
| 16:02 |
repetitivestrain |
erle: i think there is already some code in the CMakeFile for performing such tests, but it's far too conservative |
| 16:03 |
erle |
repetitivestrain well it's not like the engine developers are actually known for testing things much more than the average dev, despite the former name. you are probably an outlier. |
| 16:05 |
erle |
i used to moderate coding dojos. those are programming teamwork training games where who writes the code changes every 5 minutes or so and among the rules are “if a test fails, make it pass” and “if no test fails, implement a new test, possibly for something unimplemented”. |
| 16:05 |
erle |
what i learned was that people who have held programmer jobs for 10 or 15 years are sometimes unwilling to write a test at all, if the result is supposed to be only like 5 lines of cdoe. |
| 16:06 |
erle |
the tasks are stuff that is useless and of low complexity, like “add two roman numbers” |
| 16:06 |
erle |
so that people can focus entirely on testing and team communication |
| 16:06 |
repetitivestrain |
well we don't engage in such simulations at work, but everyone understands the advantages of aggressive testing |
| 16:06 |
erle |
repetitivestrain well, then are you aware of property testing? |
| 16:07 |
erle |
i happen to have held a lecture about that to a bunch of devs, was my highest-rated internal talk |
| 16:07 |
repetitivestrain |
i am, yes, but that's not the correct form of testing here |
| 16:07 |
erle |
repetitivestrain i understand that. i just wanted to let you know. |
| 16:07 |
repetitivestrain |
where the object is to guarantee that each unit generates results consistent with a precomputed ground truth |
| 16:07 |
erle |
well, in that case, you have your property |
| 16:07 |
erle |
it just needs to be precomputed |
| 16:08 |
erle |
“function output matches oracle” is a very common thing that people rarely test |
| 16:08 |
erle |
but it *is* a property |
| 16:08 |
erle |
like, one of the seven (or eight?) basic properties i told people about |
| 16:08 |
repetitivestrain |
the property in question is purely fortuitously implemented by Microsoft in Java, but that's as maybe |
| 16:08 |
erle |
“purely fortuitously”, what does tat mean? |
| 16:09 |
repetitivestrain |
uh it means it is a circumstance that arose by chance rather than for a purpose |
| 16:09 |
repetitivestrain |
accidentally |
| 16:09 |
repetitivestrain |
coincidentally |
| 16:10 |
repetitivestrain |
and it is proprietary, yes, so i can't incorporate it into mineclonia or even acknowledge its presence, and my knowledge of it was derived not from reading its source code, but public documentation elsewhere, and writing batteries of unit tests linked against unmodified minecraft class files, with the assistance of yarn mappings |
| 16:10 |
repetitivestrain |
acknowledge its existence* |
| 16:11 |
erle |
repetitivestrain oh right i get it |
| 16:12 |
erle |
repetitivestrain the “exactly like minecraft” thing |
| 16:12 |
erle |
hard to test a PRNG without a cross-language property testing framework (and even then) |
| 16:13 |
repetitivestrain |
for example: microsoft's version of java's default prng does not match the implementation in openjdk and the java specification |
| 16:13 |
erle |
repetitivestrain thanks i hate it |
| 16:13 |
repetitivestrain |
https://bugs.mojang.com/browse/MC/issues/MC-239059 |
| 16:13 |
erle |
repetitivestrain so that means if you run M***C***** using openjdk or so it fails? |
| 16:14 |
erle |
i used to browse the mojang bug tracker for funsies when i needed a laugh |
| 16:14 |
erle |
it's *very* funny at times |
| 16:14 |
cheapie |
repetitivestrain: Is this supposed to load eventually? |
| 16:14 |
erle |
best thing i found was an autocloser bot that responded to “i can confirm that this issue is NOT a duplicate of #whatever” with “closed as duplicate of issue #whatever” |
| 16:14 |
repetitivestrain |
no, but now imagine how many weeks i had a slightly defective prng, derived from the openjdk implementation, before inconsistencies with minecraft in the seeding of certain noises on very specific seeds led me independently to diagnose their bug and locate this issue ^ |
| 16:14 |
repetitivestrain |
cheapie: is what? |
| 16:15 |
erle |
repetitivestrain reverse engineering is a pain |
| 16:15 |
cheapie |
repetitivestrain: The page you linked, it just shows a loading spinner and nothing else |
| 16:15 |
erle |
cheapie might be js or adblocker shenanigans |
| 16:15 |
repetitivestrain |
oh, it's microsoft's fault then |
| 16:15 |
cheapie |
I don't have JS blocked and my ad blocker reports not having blocked anything on this page, *shrug* |
| 16:16 |
sfan5 |
doesn't load for me in either firefox or chromium |
| 16:16 |
repetitivestrain |
Hahaha |
| 16:16 |
erle |
well, mojang delivers again |
| 16:16 |
repetitivestrain |
leave it to Microsoft not to be able to keep an issue tracker online |
| 16:16 |
erle |
fun for the whole internet |
| 16:17 |
erle |
repetitivestrain ever since they overtook github it became SLOW in some browsers. i believe safari? |
| 16:17 |
erle |
what a coincidence. right up the alley with youtube being slower in firefox |
| 16:17 |
repetitivestrain |
i don't use github anyway |
| 16:17 |
repetitivestrain |
well, i browse it, but only with noscript on |
| 16:18 |
erle |
yeah me too, it became worse and worse |
| 16:18 |
erle |
i mean forgejo is kinda shitty performance-wise lately |
| 16:18 |
erle |
but github takes the cake |
| 16:18 |
repetitivestrain |
cheapie: anyway, the issue was that the final rshift for truncating the lcg state when the desired number of bits is fewer than 48 was arithmetic in mojang's implementation |
| 16:19 |
repetitivestrain |
while openjdk's was a logical operation |
| 16:29 |
|
mrkubax10 joined #luanti |
| 17:11 |
|
jonadab joined #luanti |
| 18:39 |
|
mrkubax10 joined #luanti |
| 18:41 |
|
mrkubax10 joined #luanti |
| 19:31 |
|
crazylad joined #luanti |
| 19:32 |
|
___nick___ joined #luanti |
| 19:44 |
|
MTDiscord1 joined #luanti |
| 19:45 |
crazylad |
man, #16239 should get merged lol |
| 19:45 |
ShadowBot |
https://github.com/luanti-org/luanti/issues/16239 -- Add new setting to enable/disable dark mode in main menu by ZenonSeth |
| 19:46 |
crazylad |
I even forked this PR to be able to set the top half and bottom half of the menu sky by passing a second parameter to 'core.set_sky_color()' |
| 20:10 |
|
___nick___ joined #luanti |
| 20:11 |
|
___nick___ joined #luanti |
| 20:46 |
|
Talkless joined #luanti |
| 21:16 |
|
stephan48 joined #luanti |
| 23:16 |
|
germ_ joined #luanti |
| 23:33 |
|
panwolfram joined #luanti |