#๐ช -progaming
1 messages ยท Page 53 of 1
i forgot to add self
how do you get your nvim config to 1.38 GB
woohoo good night
i will do the actual fft impl during lab on monday, I just needed the env set up
yay
am i the only elle user
no
who's said that this is the config?
lightweight my ass 3 entire vscodes fit in your config(?) folder
even my vscodium config directory weights less
by adding too much ai bloat
what is wrong with you
do you like
never clean up logs
or is it just too many plugins 
its mason

(and i already replaced clangd and clang-format with their counterparts in my distro's repo)
this shit doesnt count, you'd need these even when using vsc
I used sublime text for a while when i had a computer that couldn't run vscode
vibe coder spotted
accidentally sent to wrong channel
types got so messy...
can't really think of a better solution to split apart perm checking and execution
powershell is going to make me go insane
there's no way to tee binary output
it converts it to a string and wraps it at 80 chars
i still am
but i have a windows laptop
that doesnt support linux
ah
why are you even using tee here
debug why it wasnt working
hi thats not the point, doing curl ... > job.zip works fine
this is the more efficient way to do it
i dont care
thats not the point
whats the piont
that you cant pipe binary data
i am piping into tar to extract elements from the zip file
however, because powershell corrupts the binary data, that just doesnt work
doesnt cat read filenames from stdin, not content?
what
you can pipe to cat and itll output the piped content
just tried, still corrupts the content
horrible
gnu/windows
me using makefiles on windows 
you are a creature
what else do i use
cmake, meson
cmake 
whats wrong with cmake
i might learn meson
nub
cmake is bad but at least works
so does makefile
and you can easily debug a makefile
lot simpler
yeah but makefiles are toolchain specific
it works for me on windows and linux 
if things get very complicated, ill learn meson
>inb4 autistic nitpicking about how did everything
Email me: luke@lukesmith.xyz
Send me donations via PayPal at luke@lukesmith.xyz
See my website: http://lukesmith.xyz
wgat
/run
Here is your sh(5.2.0) output @austere idol
tree_obfuscate/bd77a7bf98cb416384858f76ec911ce1 -> tree_obfuscate/keygen.py
tree_obfuscate/bf0f2f46afca4ac49d0ea40ad558d728 -> tree_obfuscate/obfuscate.py
tree_obfuscate/d40b5bf5d5434d1fbbe0c405095f2392 -> tree_obfuscate/README.md
renamed 'tree_obfuscate/README.md' -> './README.md'
renamed 'tree_obfuscate/keygen.py' -> './keygen.py'
renamed 'tree_obfuscate/obfuscate.py' -> './obfuscate.py'
Traceback (most recent call last):
File "keygen.py", line 1, in <module>
from Crypto.PublicKey import RSA
ModuleNotFoundError: No module named 'Crypto'
Traceback (most recent call last):
File "obfuscate.py", line 9, in <module>
from Crypto.Cipher import AES, PKCS1_OAEP
ModuleNotFoundError: No module named 'Crypto'
experiments with passing https://codeberg.org/cat2623/polygone/src/branch/master/tree_obfuscate into that pseudovm
I'm paying way too much for my non-functional internet. The choices I have are as follows: cut my cord and live without internet at my house or look into and install a Mo-Fi router to use 3G or 4G internet. It's just not worff it to have this expensive and useless internet as is.
WEBSITE: https://lukesmith.xyz ๐โ๐
DONATE: https://lukesm...
what a minimalist
i aspire to be as minimalist as him
exceptions!
woah thats a rare one
its quite interesting to see how much is happening behind this simple program
not even mentioning i have to implement like gazillion native methods
it doesnt even matter if its fast or not, because the sheer amt of boilerplate required to do anything basic will nuke any perf it offers
its fun to have 500 lines long switch statement 
@valid jetty i dont think theres a reason to have both Struct::fn and explicit self
and it causes problems like the arg count underflow from earlier
ie either make an impl block without Struct::fn or make implicit self
What do you mean by Struct::fn? Is this a custom language?
struct Foo;
Foo::bar(Foo *self) {}
is how you declare a method in elle, you have to write both Foo:: and Foo *self
struct Foo;
Foo::bar() {}
obv you could fix this while still requiring both
its 2^64 - 1
๐ค
might as well say 111111111111111111111111111111111111111111111111111111111111111
/run
int main()
{
char dummy[0];
for (int i = 0;;i++) {
dummy[i] = 0xDEADBEEF;
}
}
@austere idol I received c(10.2.0) compile errors
file0.code.c: In function 'main':
file0.code.c:5:20: warning: overflow in conversion from 'unsigned int' to 'char' changes value from '3735928559' to '-17' [-Woverflow]
5 | dummy[i] = 0xDEADBEEF;
| ^~~~~~~~~~
/piston/packages/gcc/10.2.0/run: line 6: 1566494 Segmentation fault (core dumped) ./a.out "$@"
i am too bored
/run
{
unsigned long long dummy[0];
for (int i = 0;;i++) {
dummy[i] = 0xDEADBEEF;
}
}```
@hoary sluice
Unsupported language: None
Request a new language
/run
int main()
{
unsigned long long dummy[0];
for (int i = 0;;i++) {
dummy[i] = 0xDEADBEEF;
}
}```
@hoary sluice I only received c(10.2.0) error output
/piston/packages/gcc/10.2.0/run: line 6: 1566528 Segmentation fault (core dumped) ./a.out "$@"
why are u inf looping
this thing is essentially wiping everything in its memory after the location of 0-sized dummy array
oh
and yeah, you literally can define arrays of size 0 and it will not complain (of course, you cant use them and you will be slapped with segfault if you do so)
/run
#include <stdlib.h>
int main() {
void *p;
while ((p = malloc(1024 * 1024)))
memset(p, 0, 1024 * 1024);
}
@hoary sluice I received c(10.2.0) compile errors
file0.code.c: In function 'main':
file0.code.c:5:9: warning: implicit declaration of function 'memset' [-Wimplicit-function-declaration]
5 | memset(p, 0, 1024 * 1024);
| ^~~~~~
file0.code.c:5:9: warning: incompatible implicit declaration of built-in function 'memset'
file0.code.c:2:1: note: include '<string.h>' or provide a declaration of 'memset'
1 | #include <stdlib.h>
+++ |+#include <string.h>
2 | int main() {
/run
#include <stdlib.h>
#include <string.h>
int main() {
void *p;
while ((p = malloc(1024 * 1024)))
memset(p, 0, 1024 * 1024);
}
@hoary sluice I only received c(10.2.0) error output
/piston/packages/gcc/10.2.0/run: line 6: 1566744 Killed ./a.out "$@"
lol
the nastier you get, the worse outcome you will get
/run
extern void putchar(const char c);
extern void puts(const char* str);
int main()
{
char test[35] = {71, 92, 92, 19, 81, 92, 65, 90, 93, 84, 57, 25,
90, 93, 64, 86, 65, 71, 19, 81, 82, 87, 19, 82,
67, 67, 95, 86, 19, 91, 86, 65, 86, 25, 51};
for (int i = 0; (test[i] ^ 51) != 0; i++)
putchar(test[i] ^ 51);
puts("");
}
@austere idol I received c(10.2.0) compile errors
file0.code.c:1:13: warning: conflicting types for built-in function 'putchar'; expected 'int(int)' [-Wbuiltin-declaration-mismatch]
1 | extern void putchar(const char c);
| ^~~~~~~
file0.code.c:1:1: note: 'putchar' is declared in header '<stdio.h>'
+++ |+#include <stdio.h>
1 | extern void putchar(const char c);
file0.code.c:2:13: warning: conflicting types for built-in function 'puts'; expected 'int(const char *)' [-Wbuiltin-declaration-mismatch]
2 | extern void puts(const char* str);
| ^~~~
file0.code.c:2:13: note: 'puts' is declared in header '<stdio.h>'
too boring
*insert bad apple here*
๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ ๐ญ
https://www.wired.com/story/doge-rebuild-social-security-administration-cobol-benefits/?utm_brand=wired&utm_social-type=owned
its over for the united states
I mean IBM has been looking at it for a while technically
https://newsroom.ibm.com/2023-08-22-IBM-Unveils-watsonx-Generative-AI-Capabilities-to-Accelerate-Mainframe-Application-Modernization
whether it'd actually function correctly afterwards is still up for debate
yeahhh...
no way
you get to go from mega legacy to just still painful legacy
ig at least it's an option if a company just wanted to hire Java devs and not have to scour for a cobol dev
but like still
there are so many better options than java
especial for an absolutely GIANT database
critical financial code in python 
๐ญ
the largest problem is just
that it doesnt need to be replaced
there is no real point
it works and thats already better than everything else doge puts out
would probably be cheaper to just foot the energy bill and/or overwork a contracting firm to modernize some components
but the administration is just looking at short term goals
in fact doge already has amazing experience with databases with their first project (making a simple website) having no database authentication and instantly getting fucked over by people
maybe this is how we can finally get rid of ssns...
maybe lmfao
REWRITE IT IN RUST ๐
Java is safer than Rust
lmao
java isnt safer than rust
Java is safer than Rust
java is just easily debuggable everywhere
lmao
they want the database to run on android
They want a database that runs on standard enterprise infrastructure
Much of which, uses Java
doing it in java when kotlin exists is mentally ill
but thats to be expected from the us government
Now, Kotlin is for web apps
no its not
most of the code ive written in my life is kotlin and ive never written a web frontend in kotlin
?!
android, advent of code, enterprise spring, none of those are web apps
kotlin is extremely well integrated with spring and spring is awesome
Idk bro
theres nothing speaking against kotlin and spring besides performance, and there java wouldnt help
Peak Java v Kotlin performance Java wins
it is but that doesnt mean it can be used exclusively for uis
it didnt start as a ui language
its literally compiles to the same bytecode
Have you, checked?
however kotlin is probably much faster because its much harder to write slow code in kotlin
Have you ever in your life read Kotlin bytecode
this is a quick y/n i don't expect an essay
no but it compiles to the same jvm, which has been getting more and more optimized for almost 30 years, kotlin is made by a huge company and is open source and has been the main language used for android, so even if java somehow makes faster bytecode it would be completely negligible, + kotlin native exists and like i said previously if they are really concerned about performance they would write it in C and not on the jvm
It compiles to the same instruction set, but I would imagine the patterns are different
And there's many ways of turning Java into native just as well.
It is different, and I encourage anyone who says it's "the same" to go see for themselves.
It ABSOLUTELY is not
its still super optimized and kotlin makes it way way easier to write more optimized algorithms
Like what?
what?
Since it runs on the jvm, it uses the jvm's bytecode language
have fun writing this in java without dying or making it extremely slow
which will optimize out most performance differences and the rest are negligible
Pick a file you're confident in then
its like calling an api that takes 2 seconds to respond and then worrying about cloning / passing by reference a uuid string
Object allocations, null check spam, object layout and how async is structured spring to mind as "things Kotlin messes with"
Async in particular is horror
Sure, but on the other hand I wouldn't be surprised if the jit is tuned to optimize patterns generated by certain compilers
Like the JVM doesn't have co-routines
But Kotlin does
I dare someone to fucking decomp and see what code it spits out
lets say java is 15% faster than kotlin, are you happy with that? why would they care enough about a 15% performance boost to not use kotlin and then also use java
Certainly, kotlin compiler will spit out bytecode that no sane java compiler would dream of
i could potentially make self just be taken in as an untyped arg but the difference in Foo::bar with no explicit self is that it acts like a static method, like you do Foo::bar() to call it instead of fooInstance.bar()
i can make that clearer in the compiler when you do it wrong but i do want a distinction
But it's still the same instruction set and all
Which doesn't help at all for decompilation of course
any performance difference between java and kotlin is irrelevant, besides the fact that kotlin is much easier to write and its much easier to write a terrible algo in java because its stdlib doesnt offer any optimized chain functions
When I say "decomp", I should really say like "bytecode viewer"
A disassembler for java should work just fine for kotlin as well
Personally? I can't read Kotlin at all and find it's syntax sugar to cause diabetus.
Though I think kotlin has some extra attributes it adds, for stronger reflection and stuff
Decompilers are way harder than disassemblers
try https://github.com/eagely/adventofcode/blob/main/src/main/kotlin/solutions/y2024/Day5.kt, go compare it against your java impl
Yeah no shit
thats a skill issue
Finding where a certain extension method is defined can be quite hard without an ide
But then again, why wouldn't you use an ide
why are using "there is no good kotlin decompiler" and "you cant write kotlin without an ide" as arguments against it
Not in the coding mood (im here to argue and make people upset)
But in general, I can see you're spamming allocs all over the place
which will make 0 difference
I certainly am not
I'm just saying it's a more complex language than java
I mean, Kotlin does make using {} everywhere easier
Which, anytime you use {}
that's a brand new object
Keep doing that and the JVM will have the tummy ache of a life time
which will again make no difference
Except when it's inlined by kotlin, or jitted out by the jvm
if you are minmaxing this much you cant use the jvm
trusting the jit is how you get morded
true true
My JVM code does segfault from time to time
I can't say much about the readability of the languages, but from what I've seen kotlin isn't as big on the "IAbstractThingyFactorySupplier" thing
Which is a big plus in my book
Wrong
Not trusting the jit is how you get shit code
And of course inspecting the asm for the hot loops
youre social security, your code takes 7 hours to start and 100ms per lookup and youre worried about manually inlining variables
maybe use C
this reminds me of advent of codspeed
same impl in rust https://github.com/alion02/aocopt/blob/master/src/day5.rs
java isnt reliable its just industry tested, 2 very different things
like yeah the industry uses it? so what? Its still on the same archaic design principles of c++, c++ is only very reliable if you know how to make it very reliable, you do not and neither really help you with that
yeah let me just throw this error! hope something up top catches it in my 50 layers of abstraction and inheritance garbage!
I've actually been preached to on the benefits of c++ today
im sold
templates and concepts are rly nice
yeah i know you are sold
you are sold on all the garbage
i mean youve been sold on java since that time your high school teacher introduced it to you
c++ is only ok if youre also using Qt
Templates are extremely powerful
nah, i didnt pay attention in the class
But they have terrible diagnostics and are awful to write
i was sold on java when i read a hypixel tutorial that taught me both how to code and how to make minecraft mods and was unsold on java when i found out about kotlin
i never got sold on java because i never cared about minecraft that much
java in your microwave
cant really not care when you have 6000 hours on skyblock
java on your pregnancy test
real
i had 1000 hours on skyblock
let me break down why i hate Kotlin: I cannot mixin into the legacy Minecraft mods written in Kotlin to add compat for new mdos
simple as
but rust type system is turing complete
idk if i should be glad or not cause it taught me how to program but also 6000 hours
well, i can, and i do, but it's too much effort
I quit mc modding ages ago, more fun to RE other games from scratch
I only made Bukkit plugins in Java and sometimes learned Kotlin for it
you hate it because you have to use java for mixins so you write java for the entire mod because you hate kotlin???
Why would you have to use java for mixins
i feel like this is justified
idk but you have to
no its not
because mc is written in it
true true, i can just use raw ASM
easier sometimes
you use kotlin to not have to use java, so you get upset that you have to use java which you dont like for mixins so you use it everywhere now????
I wrote my own bytecode patcher, worked fine with kotlin
java is everywhere
machine code is everywhere go write machine code
mental ill
ven hates it cuz one would rather hate on other languages and never evolve hiding behind the screen ragebaiting than actually getting into other languages people recommend
sad life
just like vee
yes, i said this?
Like this exact thing, why are you repeating what I said?
or is it for people who need a reddit-tier TL:DR
mega
MEGA
In this video I discuss the tragic death of Bob Lee (cash app founder and former CEO of mobile coin) and why people working in the tech industry need to start considering their physical security more.
Follow Darth.bloat on instagram
https://www.instagram.com/darth.bloat/
โฟ๐ฐ๐ต๐ฒHelp Support the Channel by Donating Crypto๐ฒ๐ต๐ฐโฟ...
@valid jetty
wait this is so cool wtf
type ้ฃในใ = IchidanVerb & { stem: "้ฃใน"; ending: "ใ" };
thats fun
is this zed?
yes
zed includes rust analyzer by default its so based
BLOAT
are you stupid cause youre retarted or are you retarded cause youre stupid
trully
lets kill them
its so fucking insulting
how much world's first i built to get this app running
and people think its just AI slop
yeah
tho the new GPT's image gen is actually goated
like it actually fixed almost all the issues i had with it
aka overtrained/overfitted data, text
like shit, it can generate a full glass of wine
and a watch that's not set to 10:10
how many countries worth of electricity did they burn through to give you that
TRUE
would you
- start nuclear plants that have negative emmissions to power ai slop
- stop creating ai slop and go back to when people made opencv image classification models and were excited about it
start nuclear plants but also outlaw ai
+1
chernobyl incoming
not really possible tho
more mutated mushrooms
nuclear power plants nowadays are extremely safe
i will set a cat loose in there
chernobyl also only happened because of multiple catastrophic errors in a row
back then they were giga safe, russia just cheaped out to the maximum on the materials
because it was getting embezzeled as they built the reactors
love having a potential hazard just to earn some bucks
if they built a containment room it would have been a non issue
if they didnt cheap out on rods it would have been a non issuue
everything is a potential hazard and other types of power plants arent much better
if they didnt cheap out on producing as much power as possible for as little as possible it wouldnt have been an issue
renewable energies require high maintenence cost or very specific conditions
i mean... true
and if they didnt place incompetent people in control it wouldnt have been an issue
fossil fuels can also just explode and its not like that never happened before
beside them also running on fossil fuels
go back to primitive man, living in caves drawing cows on walls and living off of camp fire
yea
fusion energy is really nice in concept but we are still far from having actual fusion reactors
have u tried vibecoding @lavish frigate it makes u more productive
yea i have
kys?
it gives you an illusion of being productive
me when im signed in with lastnamefirstname@gmail.com
already on it
share
๐ญ
being a vencorrd member and not kys? impossible
every vencord memeber is severely depressed
#๐บ-regulars more so
ai is useful for autocompletions, when i'm insanely lazy
i do
/// some code
// binary sort, cut of smaller than 1.45MB, filter out date newer than today
and it for the most part works
it usually auto-completes it after the comment
but if it tell it to write an entire function that does what i want it to, it wont be able to do all the logic correctly, cuz it will fuck up on step 3 of 9 and its gg rest of the way from there
and lord forbid i tell it to write css or html
jesus christ it cant even close divs
i open this when im at work
ai i pretty much useless for me cause i work on arcane ass shit
and i open this when i actually wanna make stuff for myself
anyone casually rrewwriting ffmpeg?
and i have all ai completely disabled on zed
so i can actually focus
its kinda funny when i look at the code i write using cursor and using zed the quality difference is completely insane
there's little to rewrite in ffmpeg, as its simply a collection of 3rd party libraries unfinied under a single interface doe?
i really dislike zed for being such an ai pilled app
i do NOT need first party ai integration that im not gonna use
you can disable those luckily!
even hide the buttons
let me share config
okay lets be specific, anyone casually rewriting libav*
{
"features": {
"edit_prediction_provider": null
},
"collaboration_panel": {
"button": false
},
"chat_panel": {
"button": "never"
},
"assistant": {
"enabled": false,
"version": "1",
"button": false
},
"show_edit_predictions": false,
"edit_predictions": {
"enabled_in_assistant": false,
"disabled_globs": ["**"]
}
}
why not use vscode at that point then?
the only button that still shows up is this one but its also disabled for every file
imo opt out is worse than opt in, although im just being a bitch atp and im happy using nvim
zed looks better and is slightly more performant
keyword: slightly
have you tried gitbutler
i wish my code editor was the source of my perf problems
and so i feel most comfy with it
i would use it but i dont really use a ton of git features (commit to master always anyone?)
oh my sweet summer child you havent seen rust analyzer with a ton of rust macros yet
ts ls is low on the slow lsp list
we have a workflow of
issue -> branch -> MR to dev -> MR to main
you have not seen an entire graphql api generated into typescript tyhpes
very strict
rust analyzer can takee minutes at times lol
the branch must have the issue number in front i.e. 10-fix-something, then commits must all be like "Fix something (#10)"
in fact
(dont question my code, its bad)
the server just outright declines your commits if you dont follow that naming convention
lmao
i just compile my types
so they load quicker
i hate the for loop
im currently looking into https://github.com/jj-vcs/jj tho
rust!!!!
and nix...
well.... i guess tree shaking is more accurate description
ts usually takes about ~2s for me
on dioxus my rust analyzer can take up to like 30s
yeah if its not cached, if often just doesnt load any types for me, just gives me namespace recomendations
which is just variable names
ts really chokes when you do type metaprogramming (i love generating a 20000 byte string from nothing but recursive types)
yeah i have a lib which generates typed responses based on js string graphql queries
But Iโm also basing this off of nuxt where the types are usually optimised
so i can do
const res = gql`query{page{media{id}}}`
some insane human without a life has probably implemented a regex engine purely with types
and it generates types for that
i wish rust generics were as versatile as ts'
but i had to write a script to re-tree-shake the types every time i open the editor, because the ts server load times were so insanely big i wasnt sure if it was working or not
An insane human has made doom in typescript types by reimplementing a whole computer (cpu and ram and stuff) in typescript types
so it just compiles the types down into a single result instead of nesting
and that brings perf back up
waiting for lsp spec to add lsp injections just like tree-sitter injections
i originally had a monorepo, with electron, vite, webpack, capacitor, ionic, svelte and sveltekit
but typescript stopped loading on that one, so i had to split it up
average js project
well yeah
i was compiling the single codebase to windows, linux, mac, android, androidtv, quest and auto
but yeaaaah
typescript is cool sucks that its only being used for evil though
we need another theo t3 api wrapper
js ecosystem will be healed when react and co cease existing
til i can make constructors private
nah, async constructors is where its at
async ctors are not real
i wanted to write a lib for this for quite a while now, because the idea has been sitting in my mind for ages now, but TLDR:
const construct = Symbol('constructor')
function toAsync(cls) {
cls.prototype = cls.prototype[construct]
}
class Example {
async [construct] () {
// do async work
await fetch('uwu')
}
}
const AsyncExample = toAsync(Example)
const asyncres = await new AsyncExample()
async RUST
because in js you can do
class Example {
constructor() {
return new Promise()
}
}
and it will return the promise not class
but idk if that toAsync class would work like that, never had time to test
ts hates when i return from my constructor :p
yeah which is why u make a lib for it
this is just bad code
the
#[tokio::main]
async fn main() {
println!(":3");
}
and the resulting
error[E0752]: `main` function is not allowed to be `async`
--> src/main.rs:2:1
|
2 | async fn main() {
| ^^^^^^^^^^^^^^^ `main` function is not allowed to be `async`
why?
If you need your constructor to be async, make a static constructor
async constructors are great
but await new is prettier
the amt of times i needed an async constructor when working with streams or http is utterly insane
yop
like a static factory method
but why
await Example.create()
i'd rather write async in front of my constructor keyword
and not bother writing the extra boiler plate
just have that shit as a library
and do
import construct from 'async-constructor`
there was a lib that did this, but it did it kinda poorly ngl
and had awful typescript support
import asyncio
from time import time
class MyClass:
async def __new__(cls, *args, **kwargs):
self = super().__new__(cls)
await self._async_init(*args, **kwargs)
return self
async def _async_init(self, *, delay):
await asyncio.sleep(delay)
def now(self):
return time()
async def main():
now = time()
foo = await MyClass(delay=2)
print(foo.now() - now)
asyncio.run(main())
Totally works in python too :) (through different way)
using __new__ is so insane
also use async constructors for threaded classes
i forgot ts class syntax but
class Example {
private constructor() {}
public static async new() {
return new Example();
}
}
const a = await Example.new();
i do not use classes in js/ts
yep
cant use as identifier
whack
now add "use strict"
ok
is this man not running ESM by default?
Dont forget even keywords are allowed as method names in JS classes
For example if () {} works in class
ve ```js
function new() {}
SyntaxError: Unexpected token 'new'
at Object.execute (/home/vee/venbot/src/commands/dev/eval.ts:92:37)
at handleMessage (/home/vee/venbot/src/Client.ts:108:23)
at processTicksAndRejections (node:internal/process/task_queues:95:5)```
ve ```js
const Test = {
new() {
console.log("hi")
}
}
Test.new()
undefined```
'hi'```
lmao
Uncaught SyntaxError: Unexpected strict mode reserved word
you can have it as method but not function
lc.eval ```ts
class Example {
private constructor() {}
public static async new() {
return new Example();
}
public foo(): void {
console.log("test");
}
}
(async () => {
const a = await Example.new();
a.foo();
})()
eval
Evaluate code snippets. Supports codeblocks.
Supported languages: bash, node, js, py2, py, java, lua, ruby, perl, go, kt, rust, php, c, cpp, cs, elixir, swift, bf, scala, haskell
ย -langย <string>ย ย
โ โ โ โ ย default:ย nodeย
lc.eval <code> [-lang <language>]```
lc.eval console.log('hi') -lang js
ve
'use strict'
class uwu {
public static async new (){
}
}
bruh
ve
'use strict'
class uwu {
static async new (){
}
}
'use strict'```
it works
wtf, in V8 i get:
/run ```ts
class Example {
private constructor() {}
public static async new() {
return new Example();
}
public foo(): void {
console.log("test");
}
}
(async () => {
const a = await Example.new();
a.foo();
})()
cause of public
Here is your ts(5.0.3) output @lavish frigate
error TS2468: Cannot find global value 'Promise'.
file0.code.ts(13,2): error TS2705: An async function or method in ES5/ES3 requires the 'Promise' constructor. Make sure you have a declaration for the 'Promise' constructor or include 'ES2015' in your '--lib' option.
reminder pissbot is entirely js
funny that u can name it new
i know
no build people scare me
i looked into pissbot code because i wanted to copy its features 
specifically to port user commands to python when the feature was new and when discord themselves had basically no documentation on it
i know python strictly for discord bots </3
ofc u use python
*only for discord bots
mfw i actually cant write python code
thats why i also only know how to use py-cord and nothing else
dolfies would be proud
i avoided that shit like the plague
i can write assembly code better than python code
(i started in the period when discord.py was abandoned)
ts nerd how do i add a property to an existing interface
type combinedInterface = existingInterface & { newProperty: type }
or something
i want signatures using existingInterface as the type annotation to also recognize the property
not sure if thats possible
what are you trying to do exactly
maybe its possible with declare im not sure tho
declare?
ah
didnt even know you could use it like that tbh
i wouldve suggested
declare module global {
interface existingInterface {
properties: Here
}
}
i dont cuz im not insane
not that insane
what method
interface Track {
selected: boolean
enabled: boolean
id: string
kind: string
label: string
language: string
}
declare global {
interface HTMLMediaElement {
videoTracks?: Track[]
audioTracks?: Track[]
}
interface ScreenOrientation {
lock: (orientation: 'any' | 'natural' | 'landscape' | 'portrait' | 'portrait-primary' | 'portrait-secondary' | 'landscape-primary' | 'landscape-secondary') => Promise<void>
}
}
lord forbid u try to use anything picture in picture related
its pure rng if its typed or not
can someone recommend me a good way to implement locking my vm? they use objects for locks and i was wondering how should i approach this(i use pthreads for multithreading)
like im kinda clueless in multithreading soo...
file descriptor, epoll?
i think java uses mutex like approach whatever it means
yesterday i compiled this game on termux
@placid cape @valid jetty i havent implemented automatic stopping yet but for that i just need to detect silence which isnt too hard
omg why does discord not preview mkv
i just asked claude to clean up my code and it completely removed the CpalRunner workaround that i used for cpal because cpal is !Sync + !Send so i had to spawn it in a separate thread using a separated struct and now it doesnt look ugly and still works
3.7
does it detect japanese
put this into it
itโs relatively clear i think.????
it detects the word ferris
there is nothing in that audio that sounds like ferris lmao
what does that mean lmao
is that all it detects
the wake word is ferris
iโm not recording an audio right now
thatโs what i meant
oop
unfortunate
it only supports english
however adding support for other languages is like 5 minutes of work maybe
whisper (speech to text) has an auto translate feature and a language detection feature so id detect and save the language, translate it to english, process it in english and translate it back
how else would i do it
its trained in english
id have to retrain it for every language
well i will tell you, translating english to japanese usually makes it super polite and awful
you can imagine it like
oh well the translation can be done by an llm
me talking to you like โGreetings, my kind sir. May I kindly and humbly inquire about the available features which were implemented in your speech recognition software? It piques my interest and I would greatly appreciate it.โ
yeah but the llm doesnโt know the tone of the translation
translating from english to japanese is an unsolved computer science problem (unless you use an llm AND specify the politeness of the translation)
@austere anchor can confirm
ใใกใใๆฅๆฌ่ชใธใฎ็ฟป่จณใงใ๏ผ
ๆ้ ๏ผ
ใใใฃใไฝใ๏ผ
-
็ใฒใ่ใ4็ญๅใซๅใใพใใ
-
ใใณใบใใๅฐใๅคงใใใซใ่ปฝใไธธใๆๅฝขใใพใ๏ผ่ชฟ็ไธญใซ็ธฎใใใ๏ผใ
-
ใใใฃใฎไธญๅคฎใซ่ฆชๆใง่ปฝใใใผใฟใไฝใใ็ผใใใจใใซ่จใใพใชใใใใซใใพใใ
-
ไธก้ขใซๅกฉใใใใใงๅณไปใใใพใใ
ๅฟ ่ฆใชใไปใฎ้จๅใ่จณใใฎใงใๆฐ่ปฝใซใฉใใ๏ผ
is this fine
yeah thatโs what i meant, this is in the polite form (or at least the instructions are, the final line is casual which is weird)
translate this to japanese Instructions:
Form the Patties:
Divide the ground beef into 4 equal portions.
Gently shape into patties slightly larger than your buns (theyโll shrink while cooking).
Press a small dent in the center of each patty with your thumb to prevent puffing up.
Season both sides with salt and pepper.
i can use my voice assistant prompt
this is casual ๅฟ ่ฆใชใไปใฎ้จๅใ่จณใใฎใงใๆฐ่ปฝใซใฉใใ๏ผ which is funny
ใใใฃใไฝใใซใฏใใฒใ่ใ4็ญๅใซๅใใพใใ่ปฝใไธธใใฆใใใณใบใใๅฐใๅคงใใใฎใใใฃใซๅฝขใๆดใใพใ๏ผ็ผใใจๅฐใ็ธฎใฟใพใ๏ผใใใใใใฎใใใฃใฎไธญๅฟใซ่ฆชๆใง่ปฝใใใผใฟใไฝใฃใฆใ็ผใใฆ่จใใใฎใ้ฒใใพใใไธก้ขใซๅกฉใจใณใทใงใฆใงๅณไปใใใพใใ
so its able to translate properly
yeah no i didnโt say it translates wrong
its just a google translate issue
but the politeness of the translation is weird
translating to russian also makes it excessively formal
yeah definitely, but gpt can also get it wrong if it doesnโt know the formality of your message
german works fine
because english has a lot of sentences which can be used in both a casual and polite context
so if you donโt specify youโll get the wrong one
but if i make it multilingual im gonna have to make it translate cause its way easier to make an llm translate it in a casual / voice-assistant-ish tone than to train my parser on every language that i want to support
cuz japanese politeness is also pretty confusing...
and whisper supports a whole bunch of languages so id immediately have a lot of support
and complicated-!
however google translate ALWAYS translates to polite form using he/him (japanese is genderless most of the time so ja->english it makes use he/him)
i mean i guess
just make sure to query an llm first asking for the formality of the message as a short single sentence then, when translating back, use that formality in the prompt
why not just say keep the tone
if the user queries the voice assistant angrily that doesnt mean it should return an angry message
uhhhhh i guess
im prob gonna try doing it on like wednesday
cause i need to print the written thesis on tuesday and then wait 1-2 working days for it and submit the whole thing on friday
and i really dont have anything else to improve anymore
except maybe add support for more window managers or something
the google translate curse (i swear iโm gonna use this single short description for every time i want an exemplar)
big difference in the japanese it sends tho
lmaoo
itโs like COMPLETELY different
like yeah it translates to the same thing but the tone is different
i tried it for russian it spit out basically the same thing
actually much more straightforward
https://x.com/lcamtuf/status/1905724222137348284 wtf is that
UB moment
Guys, does anyone know what tf this error might mean?
That you missed a parenthesis somewhere
omg, i was going nuts because it was actually an extra } that was inside there. lol
parenthetical got me confused

yea I wrote a great code that does not add a new button every 1000ms
What was the last time you used vimscript
:wq is technically vimscript
I meant using vimscript on a file
Editing vimscript
Makefile: Lines 41-63
.PHONY: test-file
test-file:
@ellec $(TEST_FILE) -o __ellec_test_tmp $(if $(VERBOSE),,--hush);
-@./__ellec_test_tmp foo bar baz;
@rm -f ./__ellec_test_tmp $(if $(VERBOSE),,> /dev/null);
.PHONY: test-suite-%
test-suite-%:
@for file in $$(ls tests/$*); do \
if [ -n "$(CLEAR)" ]; then clear; fi; \
make $(if $(VERBOSE),VERBOSE=$(VERBOSE),) TEST_FILE=tests/$*/$$file test-file; \
if [ -n "$(DELAY)" ]; then sleep $(DELAY); fi; \
done
.PHONY: test
test:
@make $(if $(VERBOSE),VERBOSE=$(VERBOSE),) TEST_FILE=tests/assert.le test-file
make $(if $(VERBOSE),VERBOSE=$(VERBOSE),) test-suite-auto
@# make $(if $(VERBOSE),VERBOSE=$(VERBOSE),) test-suite-manual
.PHONY: test-manual
test-manual:
@make VERBOSE=1 DELAY=2 CLEAR=1 test-suite-manual
love?
delete
guys, when a page has this in a <script> tag inside <head>:
<script type="text/javascript" charset="utf-8">
(function addHearts(){...})();
</script>
will the js actually execute on page load? or do I need to do something else? I have a setTimeout() inside that should run
when i run it in the console it runs normally as expected
yes that should run
you dont need the metadata tho
you can just put <script></script>
yea, the web store platform adds that. i can try adding just the script html without the metadata. lemme see
because its in the head it will run before the body is rendered unless you put defer or async on it
ye that is accounted for, the settimeout waits for jquery to be loaded
look at the ichigo makefile
all: ใใกใ
ใใกใ: src/main.le
cd src; ellec main.le -o ../ใใกใ --cpfmt
build-%: examples/%.igo ใใกใ
./ใใกใ $<
@mkdir -p build
qbe -o build/$*.s examples/$*.ssa
cc -o build/$* build/$*.s
@rm -f examples/$*.ssa
@rm -f build/$*.s
run-%: build-%
@./build/$*
clean:
rm -f ใใกใ
rm -f build
rm -f examples/*.ssa
``` like you dont need anything more than this @deep mulch
(and im too lazy to make a command abstraction in the elle stdlib)
i have to use fork and execvp and WIFEXITED and stuff.............
will take a while
japanese makefile

SD cooked again
40% gen uplift
that was not running idk why. using domcontentloaded event worked. also made it insert at the bottom of the page for more 'safety'. yay 
I dunno what license I should use for a Discord bot
I worry about people forking it and making it closed source which IMO is bad for the community
(you know because my code is so good people would totally steal it)
well idk about people making open source forks

i have just heard bad things about agpl
and gpl has no real effect
over the network... most foss licenses do not have an effect
no license stops anyone from stealing code
unless youre big corp whos loosing money over stolen code youre most probably arent going to court either
just be rich
after issues i had with people stealing my code, my projects are now all unlicensed
not hard
aka under copyright law
i had to file a dmca strike and take down a project it was a huge hassle and i hated it
im not doing that again
it's not that i don't care about people using code
oh well i guess even if agpl would be good in theory it's hard to enforce
bad, very bad
but still I would rather say carl bot or whatever didn't just take my code which sounds very delusional but that's just the first example i can think of 
well, some are under gpl3, like my compiler
then you just don't want open source
but all unlicensed means is like, you need to ask for permission to use the code
open sourcing means you want people to be able to use the code
do other people contributed to your unlicensed code?
not very often
i don't want somebody to fork and make closed source because then that is worse for community
they don't have to give back upstream
so, now you effectively have to ask their permission too
gpl3 is what you want then
but it doesn't work for discord bots
nobody downlaods the discord bot
it's over the internet
uhhhh yeah i thought about that but its probably fine
is there communist license
cc0
isnt that MIT
that's socialist license
agpl3 then
why does vencord not have hammer and sickle emoji
you can use the code as much as you want but you have to put the license in the code
and here is the thing
its literally just gpl3 with the extension that network use is distribution
i have heard agpl3 is a very weird license which basically prevents anyone from forking despite somehow being considered open source
it is not, you have to change the link referring to the source code
the issue is that apgl3 was created in times when you have sended patches instead of forking and modifying to contribute
404(?)
in the "sending patches" scenario, the modified copy that might violate apgl would not left your pc, so everything is fine
marcan left
wait
why is it not fine if you're not hosting it
you're not hosting the program directly just its source code?
if you have firewall won't it only be accessible to you?
uh
would it not be fine to have a fork hosted with the wrong url
surely the problem would arise when running the code
and therefore making the application accessible over the network
likely yes
it wouldn't be fine?
despite the source code being right there

you don't need the url to find it
you know that you get to pick how you want to enforce the license right
if you think forking is fine then you can just allow it
github terms says you have to anyways
i dont want to care about that so for everything i dont care about i use mit or cc0 (see https://codeberg.org/cat2623/polygone)
i use gpl3 for applications and mit for libraries
i just want to dissuade it from being taken
agpl3 will work for you
i am a gpl guy too
so maybe gpl would be pain for that too
though ... with js you don't have to link?
why
the message doesnt mean anything
it was just a default thing i copied from windows docs
sadanic
wyd
was just a test dll to see if i can inject code into spotify
lmao
i can, but idfk how windows dlls work so i need to get it to be sane
also printing to stdout does nothing
but opening a message box does
fancy
hmmm im not sure how to fix this while keeping the error
if i do a type conversion itll throw an error in the type conversion if it fails to implicitly convert
thats not exactly what i want
but i still want the ability to implicitly convert when passing something to a generic function
i suppose i can do a "can_convert_to_type" which simply returns whether its possible to convert from type X to type Y
https://youtu.be/4LiP39gJuqE?t=126
and this is why
gaming
diy game engine
this isnt the issue tho
because the compiler can implicitly convert between i32 and char
but its just the difference in type between Ts
so forcing you to explicitly convert doesnt make sense if, when its not in a generic context, the compiler can implicitly convert
i fixed it by making a function similar to convert_to_type but just can_convert_to_type
compiler.rs: Lines 3924-3963
fn can_convert_to_type(
&mut self,
first: Type,
second: Type,
explicit: bool,
) -> bool {
if first.is_struct() || second.is_struct() {
let structs_are_the_same = first == second;
let explicit_struct_to_ptr = explicit
&& ((first.is_struct() && second.is_pointer_like())
|| (second.is_struct() && first.is_pointer_like()));
let first_is_ptr_of_second = first.is_pointer() && first.get_pointer_inner().unwrap() == second;
return structs_are_the_same || explicit_struct_to_ptr || first_is_ptr_of_second;
}
if ((first.is_strictly_number() && second.is_string())
|| (second.is_strictly_number() && first.is_string()))
&& !explicit {
return false;
}
if (first.is_pointer()
&& second.is_pointer())
&& (first.get_pointer_inner().unwrap().is_void()
|| second.get_pointer_inner().unwrap().is_void()) {
return true;
}
if ((first.is_pointer() && second.is_pointer())
&& first.get_pointer_inner().unwrap() != second.get_pointer_inner().unwrap())
&& !explicit && self.pedantic {
return false;
}
let weights_match = first.weight() == second.weight();
let both_int_or_float = (first.is_int() && second.is_int()) || (first.is_float() && second.is_float());
return weights_match || both_int_or_float;
}
if the --pedantic flag is set, the compiler will additionally throw an error when trying to convert between any pointer type unless its T* -> void* or void* -> T*
and ofc the runtime is built with --pedantic because it would be weird not to
hello hello :) can anyone help me get the correct regex for the message timestamp, right next to the username?
currently i have this:
patches: [
{
find: "showCommunicationDisabledStyles",
replacement: {
match: /(return\s*\(0,\i\.jsxs?\)\(.+?)(\(0,\i\.jsxs?\)\(.+?\{.+?\}\))(,.+?\))/,
replace: "[$1, $self.Timestamp(arguments[0])]"
}
}
],
the way the regex is now, it is just placing the text next to the already existing timestamp, as you can see in the screenshot. could anyone help me please?
why are you making a plugin for this
i wanna have seconds on the timestamps
is there already an existing plugin or setting that does that?
ah... okay...
i tried looking for it and found nothing to add seconds to the timestamps
when i told my friend i started learning c++ in class he said crystal is better
learning instant legacy code <3 brave
odin looks pretty cool
as does zig
as does c3
as does D
as does rust
as does jai
c3 is what c++ shouldve been imo
C-like syntax but like, improved upon
c++ is that but made by masochists
โค๏ธ
i started with LUA and then learned Java
now my job center put me to learn python and c++
im sorry but c3 syntax absolutely blows
its like someone just mashed together what their idea of rust and c is like holy shit
fn voidyea?? fn void? ????????? why
in c void makes sense because you gotta type the return type of every function void main() {} makes perfect sense, its mandatory and thats why it can instantly be used to identify functions
in rust fn makes sense because the compiler can infer void and so void would be unnecessary, it needs the fn to identify functions
and then c3 comes along throws all that out of the windows wants to jerk off both c and rust developers and does fn void.....................................
the entire language is filled with nonsensical design decisions like this, it does not make sense to me
having a mandatory return type helps with readability
and having the fn keyword makes functions greppable
it is a useful syntax feature and it is very much on purpose like that
it makes sense if you write C code in an editor like vim or emacs and come across issues like this
arguably it doesnt since void blends in more than... nothing at all, when i look at a function and see nothing i instantly know it also returns nothing
and as if main() { isnt greppable
what if you want to grep for functions that return a specific thing but dont know its name, there is a reason a lot of headers for libraries have like a LIB_XYZ prefix for their functions, it makes the name greppable easier
look at raylib
the fact that void is there is just a design choice to be consistent lol
right.
theres no reason to explicitly allow no return type if the function returns void
back to 1970 we go
well you said you dont understand the design decisions and im trying to help you understand, if you want to treat them like the 1970s go ahead but the choices are definitely deliberate
yeah i dont understand the design decisions, the choices do not feel deliberate at all
it very much just feels like your another average "c but """better"""" " language, stuck trying to decide whether to fully commit to actually being said "better" language and keeping all the C garbage
feels like the developers of it just decided to take a bunch of stuff they found cool and mashed it together into a single language
the "fn" still does not make sense to me, there is quite literally no reason to include it, you can tell me about greppling but again as if it was that difficult to grep without the fn!
looking through the documentation you have stuff like contracts which "Note that compilers are not obliged to process pre- and post-conditions at all"????????????????? "validate incoming arguments" do if statements not exist?
you also THREE different types of comments (as if 2 werent enough) for some reason you can also type hint your function in the comments (i guess they took this from jsdoc, makes no sense at all)
defer makes absolutely no sense, the syntax is sometimes just inconsistent (why the hell use $ with $if? Doesnt c literally have its own solution for this? why not use that?) it has C interop but id be genuinely amazed if it didnt considering it works mostly the same
and rn im constantly looking through the docs to find anything that makes it so much better than c (other than having those inconsistencies?)
it adds modules which is cool ofc! but why when there isnt the tooling to actually make it useful? I cant find a c3 package manager or similar other than a github repo... amazing thanks
c3 is trying to tell me its safer than c, sure i guess but like i said before you can type hint your function with comments.. there is an any type... how exactly is it safer? very much feels like this is just a mine field for developers so why not commit to actual said "safety" instead of porting exceptions over to c??
but still, im trying to find an actual use for it. Seems like it doesnt make c that much better now does it? hobby projects i guess? so why would a C developer get out of their comfort zone and use c3, why would a js/py/go dev start with c3? and why should a zig/rust/c++ dev go back and use c3?
LOVE
crystal ๐ค
Just another deeply flawed language that is โtechnically betterโ </3
lc.tldr
awa
$ is c3's macro system, things with $ are comptime statements, it also has switch statements and loops which use $
one of the big improvents is the "vector" system which is really cool, you can do swizzling and stuff like in shaders:
// can be swizzled with xyzw and rgba depending on what you want to do
// because these vector abstractions can be used for colors,
// vectors (like in physics), and various other things
int[<3>] a = { 11, 22, 33 };
int[<4>] b = a.xxzx; // b = { 11, 11, 33, 11 }
int c = b.w; // c = 11;
char[<4>] color = { 0x11, 0x22, 0x33, 0xFF };
char red = color.r; // red = 0x11
b.xy = b.zw;
color.rg += { 1, 2 };
another improvement is the semantic macros which are much more powerful than macros in C and give you syntax similar to rust:
macro @shift(&xs) {
var x = (*xs)[0];
(*xs) = (*xs)[1..];
return x;
}
another improvement is the module system, as you mentioned, this is a huge addition because you can basically split things into file-based namespaces and it fixes a bunch of things like duplicate symbols and include guards that you see in C
defer always makes sense in a low level systems language, it allows you to group together allocation and deallocation with no runtime expense (its a 0 cost abtraction)
safety - optionals (Maybe/Option), slices (which means range/bounds checks), meaningful stack traces instead of just "Segmentation fault"
just to list a few
there are a bunch of other improvements
google gemini (2.5 pro and their deepresearch model) and notebooklm is fucking awesome
just look https://www.youtube.com/watch?v=QKuR6COm7E0 / https://www.youtube.com/watch?v=EKSnPKCDops (second version, first is prob better)
this can be said about any language besides elle so we should all switch to elle and use elle everywhere
elle on the frontend elle on the backend elle on your pregnancy test
elle has horrible design decisions in some places but thats mostly because its just me working on it
they made an autodoxxer???? ๐ญ ๐ญ
did u like collect all ur info or does it figure it out itself
do NOT dox me
It figured out
the second one is pretty cool it sounds a lot more natural
My prompt was just something like "create a deep dive summary about Jozef Steinhรผbl (xhyrom)"
how do you do the podcast thing
NotebookLM
Use the power of AI for quick summarization and note taking, NotebookLM is your powerful virtual research assistant rooted in information you can trust.
this is evil
it wont let me export it as an audio file
watchu making tho
smth like uhhh spicetify ?
acquiswol
Yop
I already have some basics working on Linux but I also want to port to windows
I'm injecting both via a shared object and xpui.spa
a shared object?
The shared object loads native code into the window so I can do things like file system access and stuff
And the xpui.spa just loads the javascript for the mod itself.
I could do everything via the shared object, but I don't want to bother with that right now.
how do you access the api so you can like for example interact with the playback
man what the hell why did my discord just turn this
Right now I'm working on recreating all of vencord's native API in C++ first.
on windows and linux
got it
i got 100% on this test LMAOO
first 100% on a test since the start of the year
every other test was in the high 90s but i lost marks for stupid ambiguity not because i didnt know the answer
i asked more questions to clarify in this test so there was no ambiguity
ayayayayaya
294:482:67:193

@hoary sluice im finally refactoring the codegen mess
im putting each astnode to have its own distinct struct instead of the struct being implicitly part of the AstNode enum
which lets me implement a trait on each struct and just call .compile()
this will take forever but should be sooooo much cleaner when done
macro it
wdym
procmacros my beloved
oh like
a procmacro to automatically do
match x {
X::X => this.compile(self, &ctx),
X::Y => this.compile(self, &ctx),
X::Z => this.compile(self, &ctx),
}
?
#[derive(CompileNodes)]
enum AstNode {
Expression(Expression),
// ...
}
// Macro generated impl
impl /* CompileNodes for */ AstNode {
fn compile(self, ctx: /* ... */) {
use AstNode::*;
match self {
Expression(this) => this.compile(self, &ctx),
// ...
}
}
}
yeah but this is a little more involved
i can do it with a proc macro
but ill take it 1 step at a time
theres a lot to refactor
true
Isn't this what enum-dispatch does?
compiler.rs is down to 4192 loc !!!!!
this is gonna take a while..
i just realized this is technically adding lines of code overall
even though its removing lines from the compiler
you dont wanna do it like this? https://github.com/eagely/icps/blob/main/src/parser/enums.rs
Infix Competitive Programming Script - A language designed for fast writing speed - eagely/icps
i think thats more than my entire diploma thesis
yep 3096 lines including blanks
without this codegen refactoring its 4668 loc lmao
that is kinda what i was doing before
but it makes it hard to cleanly dispatch different functions depending on the variant without passing around a bunch of values
i have this now
then each file implements the Codegen trait for one of those structs
