Thanks for the bugfixes. A few tips when using gf2: - "skip to" (shift+click) does not do what you think it does! You are getting it confused with "run until" (ctrl+click) - You can change the default size of the watch window, see the "User interface" section of the README - The "traffic light" is the coloured box in the bottom left corner of the window :)
Python is always the problem. It's load bearing. I just broke my Linux yet again because it is a Debian and I tried to update libinput because of python, it refused and updated python3 back to match it. (to be fair, I did random pokery with dpkg) Why do we have DLL hell in Linux in 2023. Is that Windows XP ? maybe it's my fault for using Debian, maybe Debian is stable bugs forever. Maybe Linux can't afford having a SxS and becoming a 30GB OS only because I wanted to have 2 versions of libinput. Maybe I should just nuke everything and make my own Linux from scratch instead. Anyway it's my fault for using Linux to begin with, or wanting to use KDE with Wayland. Also, Clang17 needs an Old GCC10 to run. Why, why. Sometimes I think Windows is better because I don't suffer too much trying to change things and I can't see how bad and shit the code is, so I don't try to fix it. It's all Python's fault. Why can Debian have 4 different versions of Python3 at base. Why's every thing hanging on libinput, is like libC of KDE. Why does the thing that loads shite into the D-bus from the server side needs to be the same as the shite from the KDE/QT side, never mind I don't want to know, maybe they're sharing binary data and pointers. Anyway , sorry for the rant. And it's python fault , it's all pythons fault .
@@pookiepats I hate Python too. I have been taught Pascal, C, C++, and all those languages are kinda the same. But Python is so bad with tabs instead of simply using curly brackets {,}. Readability would be skyrocketing.
@@mariuszdziem8203 ashamed to say but when I was only a young ignorant data analyst I would swear by Python’s indentation approach because the vast majority of my work was done in relatively small instances of Jupyter Notebooks. But you’re 100% correct-as soon as I graduated into writing actual programs the indentation became a hindrance and source of major frustration. TL;DR i write Swift everywhere i used to write Python and my blood pressure is down 30 points
Who compiles the compiler? In what text editor the text editor is written? What analyzer is used to analysis the source code of the analyzer? And who's debugging the debugger?
C is written in C and Java is written is Java, and many other languages is written in itself. Eventhough it's understandable, still sounds fascinating 😄
@@ace5331the Java std library is written in Java, but the JVM is in C++. An interpreted language can not be self hosted. You could run the Java JVM in the C++ JVM, but then you would have to maintain 2 versions, so it would be pointless.
WHAT ARE YOU WORKING ON? TRYING TO FIX THE PROBLEMS I CREATED WHEN I TRIED TO FiX THE PROBLEMS I CREATED WHEN I TRIED TO FIX THE PROBLEMS I CREATED WHEN...
I certainly do. It means my IDE _and_ debugger uses the same interface. The seamlessness is amazing. I use RR, GDB seamlessly together in vs code with the Midas extension. It means all my bookmarking, all my navigation of the code works identically. It makes the process of development exponentially a lot faster than having to manage multiple UI:s for what essentially amounts to the same work flow.
I just spent a whole day staring at SQL queries stored as string literals in a python codebase and seeing the exact same thing happen in a C code base with python as string literals just kind of boiled my brain. Loved every second of this video, thank you for doing that.
With all of the recursive meta-debugging going on it's best practice to make sure you're seated and hold onto something when watching a Tsoding video. I'm still dizzy from watching him develop his Dramatic EDitor in his Dramatic EDitor! It's a good thing he didn't need to debug his debugger while editing his editor in his editor!
Have you ever gone through TAOCP? One of the curious things about it is that it tries to teach programming using a bespoke assembly language. Why do this? Because, once you get to the (unwritten) end, you could write a compiler *without* a compile, as the Grace Hopper had to do when she wrote COBOL.
lol, and there's your moment. Actually I think it's because in Python 2, print is a keyword, not a function. So the parentheses that would normally indicate a function call are instead interpreted as a tuple, because it contains comma separated values. Changing it to a single string value just makes the outer parentheses redundant, but that also makes it compatible with both versions.
So for anyone who never programmed in Python 2 like me, print in Python 2 is not a builtin function but a statement, the code is intepreted as printing a tuple ('(array) ', 5) But there's no such thing as a single element tuple, so printing a single string ('(array) 5') doesn't show the *parentheses
@@vuongnh0607l I don't think there are many use cases, as I think it's mostly there for consistency's sake (so you can create any length of tuple). I don't write a lot of python, so I've never run into a situation where I needed to use it, I just thought it was interesting that it does exist
I'm guessing print(*args) in python 3 is variadic, so it just runs __repr__ on each of the things in its args (appends the individual string representations), which drops the quotes for the string. While in python 2 it just prints the string representation of the args tuple, which prints the outer brackets and keeps the string wrapped in quotes.
In python 2, print was a builtin keyword, and in python 3 it became a function. Since it's a keyword in python2, you don't use parens when calling it. However, if you use parens anyhow, the expression on the right becomes a tuple, and the tuple is printed.
I think part of the issue is your GDB is using python 2, but their gf2 expects python 3 cuz in python 2 the print statements dont need (), so theyre treated as a tuple and my gdb (from doing `py import sys; print(sys.version);`) prints python 3.10 and also doesnt have the tuple bug
Damn i subscribed but i never have time to really sit down and watch your videos due to the length. Im sure the content is good from what I've gauged from.the comments
Could you recommend a computer graphics book where they teach the mathematics of 3D rendering, I still don't understand how to obtain the projection matrix?
Hi Tsoding developed a 3D graphics library from scratch, where he goes over the mathematics behind rendering objects in 3D. th-cam.com/play/PLpM-Dvs8t0Va-Gb0Dp4d9t8yvNFHaKH6N.html Maybe some of the episodes in there relating to 3D will be useful for you.
ikr? this has to be one of the w̶o̶r̶s̶t̶ most curseds C++ codebase ive ever seen. i bet this was written by people who thinks C++ is C with classes, i mean, you can clearly see it, they even manage the memory themselves by hand. imagine doing that in 2023.
@@Alsexarensimply use what the standard already offers to you. theres barely any reason to come up with generic containers from scratch, and if you do try to come up with one theres a big chance you will get it wrong
A similar question comes to mind but every programmer knows I think including me. Who is compiling other compilers if we go whether no software exists? A funny question but it's important.
You start with writing machine code by hand to create an assembler to assemble a compiler to compile a better compiler :) It's the compilation centipede.
I'm learning how to code a complier by Porth, but I have a question, why all the tutorials on this topic start doing an algebra compiler, and then start doing the things like functions, variables...? Btw I love your videos! Would be amazing if in a future you do some compiler relationed content.
Maybe it's just because parsing algebraic expressions with the proper order of operations is a natural part of generating an abstract syntax tree. Usually, function calls and control flow take lower precedence than algebraic expressions, so you can just take your expression parser and add those things on the end. Of course you can also use a parser generator like Lex and Yacc to describe your language using pattern matching, kind of like regular expressions.
You're seriously calling an explicitly recreational programming session a waste of time...? Recreational programming that also happens to improve upon a piece of OSS. A piece of OSS he actually likes, at that. Are you just e-peening? Are you simply a bit of a twat? What am I missing?
Either this is a great example of why overloaded operators are bad - they hide effects and they may not do what you expect them to do. Or it's a great example of why you shouldn't pass the address of the first value of an array as the beginning of the array, in C++.
Thanks. Watching this video I was trying to remember what was the name of the graphical frontend I used to use lotta years ago. I never realised it was GNU's own frontend. Gotta love the aesthetics of Motif :).
10:25 is that true? Does C spec guaeantee that &arr[0] is a noop? I'm not convinced I think it is deferenced (using «as if rule» of course) either way. &arr[0] => &(arr[0]) => &(*(arr + 0)) => &*arr. Square brackets have higher precedence, so it's not (&arr)[0] which would be a noop in C indeed
&arr[0] is most likely a LEA instruction on x86. It doesn't try to access the memory of the array, just computes the address of the 0th element. During the compilation process, in an abstract sense, arr[0] is an l-value on its own, which you then take the address of. But the expression as a whole only has to produce an address, not the value at that address, so there's no reason to MOV anything there or use that memory as an operand, unless you do exactly that.
@@alurma Try it on godbolt on an arm or mips cpu. The operator overload is the only reason it would access the array. But if you want to be safe, you can also just pass the array variable itself, which will decay to a pointer in C. In C++ it will also decay to a pointer, unless you're calling a template function that expects a reference to an array of size , but in that case the size will be known and one would hope it wouldn't try to dereference out of bounds elements. Sorry if I'm making it too complicated. Fun fact: in VB6 if you wanted to call a C library (including DirectX) and pass it an array, you had to pass array[0] because it passed everything by reference, so array[0] is how you got the address of the beginning of the array. That was the only way to do it. I'm not sure I ever tried to pass an empty array though.
Thanks for the bugfixes. A few tips when using gf2:
- "skip to" (shift+click) does not do what you think it does! You are getting it confused with "run until" (ctrl+click)
- You can change the default size of the watch window, see the "User interface" section of the README
- The "traffic light" is the coloured box in the bottom left corner of the window :)
Thank you so much! I definitely need to spend some time reading the README. There are so many things I'm missing. :D
Imagine to debug a C application via C debugger via C debugger to find that problem was in Python
Python is always the problem. It's load bearing.
I just broke my Linux yet again because it is a Debian and I tried to update libinput because of python, it refused and updated python3 back to match it. (to be fair, I did random pokery with dpkg)
Why do we have DLL hell in Linux in 2023. Is that Windows XP ?
maybe it's my fault for using Debian, maybe Debian is stable bugs forever.
Maybe Linux can't afford having a SxS and becoming a 30GB OS only because I wanted to have 2 versions of libinput.
Maybe I should just nuke everything and make my own Linux from scratch instead.
Anyway it's my fault for using Linux to begin with, or wanting to use KDE with Wayland.
Also, Clang17 needs an Old GCC10 to run.
Why, why.
Sometimes I think Windows is better because I don't suffer too much trying to change things and I can't see how bad and shit the code is, so I don't try to fix it.
It's all Python's fault.
Why can Debian have 4 different versions of Python3 at base. Why's every thing hanging on libinput, is like libC of KDE.
Why does the thing that loads shite into the D-bus from the server side needs to be the same as the shite from the KDE/QT side, never mind I don't want to know, maybe they're sharing binary data and pointers.
Anyway , sorry for the rant.
And it's python fault , it's all pythons fault .
@@monad_tcpmove to a rolling release distro or a distro based on fedora. You’ll thank me later :P
@@monad_tcp in a rage against python I ran a command to eliminate it globally and it broke Ubuntu(WSL), I hate Python's fat hefty arse
@@pookiepats I hate Python too. I have been taught Pascal, C, C++, and all those languages are kinda the same. But Python is so bad with tabs instead of simply using curly brackets {,}. Readability would be skyrocketing.
@@mariuszdziem8203 ashamed to say but when I was only a young ignorant data analyst I would swear by Python’s indentation approach because the vast majority of my work was done in relatively small instances of Jupyter Notebooks.
But you’re 100% correct-as soon as I graduated into writing actual programs the indentation became a hindrance and source of major frustration.
TL;DR i write Swift everywhere i used to write Python and my blood pressure is down 30 points
13:20 That feeling that all programmers get to feel. "I thought this would be an easy fix, but looks like we have to go deeper"
47:20 "we fixed the debugger, now lets fix my application" XD XD
This is like watching an artist at work
Well you are watching an actual artist.
Who compiles the compiler? In what text editor the text editor is written? What analyzer is used to analysis the source code of the analyzer? And who's debugging the debugger?
Who comments on comments?
As per the LFS installation manual: "To compile a compiler, you will need a compiler."
C is written in C and Java is written is Java, and many other languages is written in itself. Eventhough it's understandable, still sounds fascinating 😄
@@ace5331the Java std library is written in Java, but the JVM is in C++. An interpreted language can not be self hosted.
You could run the Java JVM in the C++ JVM, but then you would have to maintain 2 versions, so it would be pointless.
_tsocrates_
tsodin:
fix bug in debuger: easy
write comment message: *imposible.*
WHAT ARE YOU WORKING ON?
TRYING TO FIX THE PROBLEMS I CREATED WHEN I TRIED TO FiX THE PROBLEMS I CREATED WHEN I TRIED TO FIX THE PROBLEMS I CREATED WHEN...
Cool video. As soon as I saw the L in "5L", I knew it's going to be py2 vs py3 issue.
did i just get spoiled in a "debugging the debugger" video
Imagine using an electron based debugger frontend in 2023! Thank you for this, this is a master class of "how to approach a problem solution" IRL.
I certainly do. It means my IDE _and_ debugger uses the same interface. The seamlessness is amazing. I use RR, GDB seamlessly together in vs code with the Midas extension. It means all my bookmarking, all my navigation of the code works identically. It makes the process of development exponentially a lot faster than having to manage multiple UI:s for what essentially amounts to the same work flow.
excited to watch this one! thank you for all the interesting videos and content!
That was great! It's been 2 years of watching you, and I have learned so much from you.
me: mom can i go to cinema to watch "Inception"
mom: we have "Inception" at home
"Inception" at home 7:20
I was just typing this coment and saw this
it made my brain go smooth
Would love more of fixing-contibuting to OSS ! ❤️
45:30 The celebration dance made it all worth watching 😂🎉
I like your statusbar, especially the part that shows the folder size 😂😂
13:40 “so maybe it won’t be that deep and that dirty” - me looking at the timer, showing the video is 59:53 long: “it will be deep and dirty”
This is such an awesome find, nice video!
I just spent a whole day staring at SQL queries stored as string literals in a python codebase and seeing the exact same thing happen in a C code base with python as string literals just kind of boiled my brain. Loved every second of this video, thank you for doing that.
"Look how quickly it recomputes its layout, can your Electron do that?" Lmao instant sub
You’re like a 40x developer, I couldn’t do in a week what you do in an hour.
Tbh, I got really lucky today. It's def not always like that. :D
Sounds like you're just a 0.2x developer. Skill issue
and who's debugging the debugger that is debugging the debugger!?!
You can't debug a human.
That's quite a journey. Great video and thank you for the pull request.
This is honestly a great unintentional tutorial on how to contribute to open source
This was a fascinating video. Really good
With all of the recursive meta-debugging going on it's best practice to make sure you're seated and hold onto something when watching a Tsoding video. I'm still dizzy from watching him develop his Dramatic EDitor in his Dramatic EDitor! It's a good thing he didn't need to debug his debugger while editing his editor in his editor!
It's like watching Bob Ross. Awesome video!
Who debugs the debugger? The hexdump of memory content and a "real programmer" who speaks machine code fluently.
I get so burnt out with programming these days but I really enjoy watching your programming Tsoding : - )
Have you ever gone through TAOCP? One of the curious things about it is that it tries to teach programming using a bespoke assembly language. Why do this? Because, once you get to the (unwritten) end, you could write a compiler *without* a compile, as the Grace Hopper had to do when she wrote COBOL.
That was a really nice session. Thanks for the video.
It was really nice seeing how to contribute like a REAL PROGRAMERS. thanks tsoding
This was insanely entertaining to watch 😂 lmao
Thanks for sharing the vid
This was fantastic! Also, very smart fix.
2:52 Debugging the debugger running buggy GUI programs LOL
C++ operators, such a great idea ... I might take up Zig just for not allowing that
A GDB debugger with compiled with a clang++ compiler.
I honestly thought ddd was the only graphical frontend for gdb, thanks for showing me gf2, it actually has a nice UI
This question has the same vibes as "what compiles the compiler"
This was a really cool video. Thanks
this was very impressive. great job
this one kinda epic in all means
IT in its pure natural form
You're my hero! :) So interesting episode.
You deserve P70,/P71/P72 thinkpad with Xeon processor with 64/128GB of ram.
look at this MF*, why the f* it even do that - you made my day there
lol, and there's your moment. Actually I think it's because in Python 2, print is a keyword, not a function. So the parentheses that would normally indicate a function call are instead interpreted as a tuple, because it contains comma separated values. Changing it to a single string value just makes the outer parentheses redundant, but that also makes it compatible with both versions.
and that's why you ship your dependencies alongside your program, boys
This was a thing of beauty.
They: Do you have a gf? 👩❤️👨
Me:
So for anyone who never programmed in Python 2 like me, print in Python 2 is not a builtin function but a statement, the code is intepreted as printing a tuple ('(array) ', 5)
But there's no such thing as a single element tuple, so printing a single string ('(array) 5') doesn't show the *parentheses
There is a single-element tuple, but its syntax looks like: (5,)
@@odomobo thanks for correcting me, I'm still learning Python
Out of curiosity, what's the use case for single element tuple?
@@vuongnh0607l I don't think there are many use cases, as I think it's mostly there for consistency's sake (so you can create any length of tuple). I don't write a lot of python, so I've never run into a situation where I needed to use it, I just thought it was interesting that it does exist
Loved this one mate, keep it up :)
Epic zozin zession
alternative title:
FIXING A DEBUGGER WITH ONLY PYTHON?!
Thanks for showcasing gf
I'm guessing print(*args) in python 3 is variadic, so it just runs __repr__ on each of the things in its args (appends the individual string representations), which drops the quotes for the string. While in python 2 it just prints the string representation of the args tuple, which prints the outer brackets and keeps the string wrapped in quotes.
In python 2, print was a builtin keyword, and in python 3 it became a function. Since it's a keyword in python2, you don't use parens when calling it. However, if you use parens anyhow, the expression on the right becomes a tuple, and the tuple is printed.
I think part of the issue is your GDB is using python 2, but their gf2 expects python 3
cuz in python 2 the print statements dont need (), so theyre treated as a tuple
and my gdb (from doing `py import sys; print(sys.version);`) prints python 3.10 and also doesnt have the tuple bug
lol 3 seconds later you figured this python2 vs python3 bug out lmfao
Upon reading the title, I just thought about this.
Wonderful video.
Jajaja. The moment of the true was great
I mean so much can you expect from 155 commits repo
It's recursive debuggers all the way down!!!🤯🤣
Tsoding the type of guy who would debug the debugger (i'd have just moved on to another one).
Damn i subscribed but i never have time to really sit down and watch your videos due to the length. Im sure the content is good from what I've gauged from.the comments
It's nice to be able to just edit your video in two hours
you deserve a medal
you're too nice
Could you recommend a computer graphics book where they teach the mathematics of 3D rendering, I still don't understand how to obtain the projection matrix?
Hi
Tsoding developed a 3D graphics library from scratch, where he goes over the mathematics behind rendering objects in 3D.
th-cam.com/play/PLpM-Dvs8t0Va-Gb0Dp4d9t8yvNFHaKH6N.html
Maybe some of the episodes in there relating to 3D will be useful for you.
Next Episode... "Wait, who compiles the compiler ?!"
for everyone that just want to see the highlight; 45:31
This is why you use standard containers instead of rolling your own
ikr? this has to be one of the w̶o̶r̶s̶t̶ most curseds C++ codebase ive ever seen. i bet this was written by people who thinks C++ is C with classes, i mean, you can clearly see it, they even manage the memory themselves by hand. imagine doing that in 2023.
@@nyyakkowhat do you suggest?
you meant the best C++ codebase
@@Alsexarensimply use what the standard already offers to you. theres barely any reason to come up with generic containers from scratch, and if you do try to come up with one theres a big chance you will get it wrong
@@TsodingDailyKappa
I wanna reach this level of mastery.. You are the best 🎉.
there's a funni @ 28:41
He really debugged the debugger
This video is programming porn. Top level wisdom.
zozin asking the real questions here
A similar question comes to mind but every programmer knows I think including me. Who is compiling other compilers if we go whether no software exists? A funny question but it's important.
You start with writing machine code by hand to create an assembler to assemble a compiler to compile a better compiler :)
It's the compilation centipede.
@@andrejsk6211 ya
I'm learning how to code a complier by Porth, but I have a question, why all the tutorials on this topic start doing an algebra compiler, and then start doing the things like functions, variables...? Btw I love your videos! Would be amazing if in a future you do some compiler relationed content.
Maybe it's just because parsing algebraic expressions with the proper order of operations is a natural part of generating an abstract syntax tree. Usually, function calls and control flow take lower precedence than algebraic expressions, so you can just take your expression parser and add those things on the end. Of course you can also use a parser generator like Lex and Yacc to describe your language using pattern matching, kind of like regular expressions.
Debugging a buged debugger with a buged debugger souds like governments in action
This is why I just use gdb from the command line... you add all that extra complexity for the gui and you get bugs... and then you waste time.
You're seriously calling an explicitly recreational programming session a waste of time...? Recreational programming that also happens to improve upon a piece of OSS. A piece of OSS he actually likes, at that.
Are you just e-peening? Are you simply a bit of a twat? What am I missing?
What was that? I just watched Inception 2, but with art house flavor and budget.
The nest is a lot
Great stream!! (And it is not a Rust one)
who's compiling the compiler
Success!
this is goldpearl
btw, python is the worst languange. You can lose so much time with a dynamic language with strong typing
Insane video
great video!
ok this was epic
Either this is a great example of why overloaded operators are bad - they hide effects and they may not do what you expect them to do.
Or it's a great example of why you shouldn't pass the address of the first value of an array as the beginning of the array, in C++.
Yeah, there is definitely a lesson somewhere there, but we don't know exactly what it is.
what is the app used for zooming in and out?
You should also try using seer, or the classic ddd
Thanks. Watching this video I was trying to remember what was the name of the graphical frontend I used to use lotta years ago. I never realised it was GNU's own frontend. Gotta love the aesthetics of Motif :).
You are so cool, man
Hello,
why you don't explain the Encrypt Algorithme and How BruteForce works
10:25 is that true? Does C spec guaeantee that &arr[0] is a noop? I'm not convinced
I think it is deferenced (using «as if rule» of course) either way. &arr[0] => &(arr[0]) => &(*(arr + 0)) => &*arr. Square brackets have higher precedence, so it's not (&arr)[0] which would be a noop in C indeed
&arr[0] is most likely a LEA instruction on x86. It doesn't try to access the memory of the array, just computes the address of the 0th element. During the compilation process, in an abstract sense, arr[0] is an l-value on its own, which you then take the address of. But the expression as a whole only has to produce an address, not the value at that address, so there's no reason to MOV anything there or use that memory as an operand, unless you do exactly that.
@@DFPercush truly. But this seems not portable 😄
@@alurma Try it on godbolt on an arm or mips cpu. The operator overload is the only reason it would access the array. But if you want to be safe, you can also just pass the array variable itself, which will decay to a pointer in C. In C++ it will also decay to a pointer, unless you're calling a template function that expects a reference to an array of size , but in that case the size will be known and one would hope it wouldn't try to dereference out of bounds elements. Sorry if I'm making it too complicated.
Fun fact: in VB6 if you wanted to call a C library (including DirectX) and pass it an array, you had to pass array[0] because it passed everything by reference, so array[0] is how you got the address of the beginning of the array. That was the only way to do it. I'm not sure I ever tried to pass an empty array though.
@@DFPercush yea, the usual "passing array so it decays to a pointer" seems simpler :) Interesting comment on VB6 :)
FUCKING GREAT
The root cause at 41:28
45:34 first try MF XD
Amazing video just one quest why does it say porn folder in the bottom right
These random german expressions are gold! Are you from germany or have you just caught up some words?
That feeling finding out it's the python that caused it 😂
Really krasava
if is that so, who makes the clown laugh? 😔
Nice session Mr. Tsoding, but where github…