Simon Howroyd
Simon Howroyd
  • Видео 96
  • Просмотров 231 395
Do bees react aggressively to Bananas?
When honeybees panic, they release a pheromone on the target to coordinate a colony level attack. This pheromone smells like ripe banana. (To UK viewers it smells exactly like the old sweets you used to get called Pear Drops!)
Someone asked me if an actual banana causes the attack response, just like the pheromone does. Here's the result with my bees!
Просмотров: 85

Видео

My First Beekeeping Stream!
Просмотров 873 месяца назад
www.twitch.tv/drgreengiant Of course, everything broke when I went live. All the prep I did and OBS said nope because it hates my Linux laptop. Thankfully I also recorded the footage so here it is in slightly more watchable quality. Next time I will use my PC to stream to Twitch and do the rendering, and use my laptop just as a webcam bridge and for a live Discord call for you Q&A! Enjoy and fe...
Beeing rebellious
Просмотров 445 месяцев назад
Beeing rebellious
Phasmophobia Performance on Steam Deck Console
Просмотров 17011 месяцев назад
Phasmophobia has the "Steam Deck Verified" badge and status. One of the maps causes the console to hard crash and the rest of the maps are unplayably dark. The TV in this video is doing a slightly better job at boosting the brightness and contrast than the console screen does (i.e. it is even worse on the console screen.) Some screenshots taken directly on the device are below to elide my dodgy...
Memory Management and Race Conditions - Demonstration
Просмотров 370Год назад
Following on from the discussion and speculation of a shared state bug in Phasmophobia (ruclips.net/video/6JrEww0arpc/видео.html), in this video we explore a live demonstration of how a race condition can form and what one might look like.
Memory Management and Race Conditions - Case study
Просмотров 54Год назад
For a practical demonstration of a race condition, I have made a follow-on video ruclips.net/video/nyefIUwo-hU/видео.html Memory management in software is a concern for those writing highly performant code. Typically, in my embedded firmware world, we don't have much memory nor processing power, so we keep only one copy of system state. This state is protected from so called "race conditions", ...
SimonSays Version 2 - How To Guide
Просмотров 340Год назад
Code Repository: github.com/howroyd/simonsays Latest Version: github.com/howroyd/simonsays/releases/latest SimonSays is a TwitchPlays style app for Windows and Linux which converts commands written in Twitch chat to keyboard and mouse inputs on the users computer.
Nightbot How-to Stream | Teaching easy and complex commands
Просмотров 218Год назад
The long promised how to guide for the fun Nighbot commands I have programmed for mine and other friends channels. Looking at the basics of making counters and tagging users then moving on to more complex API calls, conditionals and aliasing. Feel free to ask questions or make suggestions for future content in the comments. Nightbot documentation, check out "Custom Variables": docs.nightbot.tv/...
TwitchPlays Version2 Programming - Build Process with PyInstaller and Github Actions
Просмотров 70Год назад
Almost ready for release! Bugfixing and finalising the build process for creating a Windows executable that gets automatically attached to the release using Github Actions. My name is Simon and I am a senior embedded software engineer. Windows based Python code is a nice challenge for me outside my normal comfort zone! Programming my new open source TwitchPlays v2, based upon v1 which I release...
TwitchPlays Version2 Programming - Improving the CommandAction Flow
Просмотров 19Год назад
My name is Simon and I am a senior embedded software engineer. Windows based Python code is a nice challenge for me outside my normal comfort zone! Programming my new open source TwitchPlays v2, based upon v1 which I released last year, aimed at Phasmophobia streamers on Twitch. Using Github Copilot to help me, running the GPT3 engine, similar to ChatGPT. Contribute and see the code: github.com...
TwitchPlays Version2 Programming - Arguing with GUI alignment
Просмотров 27Год назад
Very short stream showing progress on my tkinter GUI and the challenges I am facing. More details below: My name is Simon and I am a senior embedded software engineer. Windows based Python code is a nice challenge for me outside my normal comfort zone! Programming my new open source TwitchPlays v2, based upon v1 which I released last year, aimed at Phasmophobia streamers on Twitch. Using Github...
TwitchPlays Version2 Programming - My first GUI
Просмотров 34Год назад
Looking at making my first ever GUI! Using tkinter for Python. More details below: My name is Simon and I am a senior embedded software engineer. Windows based Python code is a nice challenge for me outside my normal comfort zone! Programming my new open source TwitchPlays v2, based upon v1 which I released last year, aimed at Phasmophobia streamers on Twitch. Using Github Copilot to help me, r...
New IRC Connection to Twitch for TwitchPlays Version 2 with help from GPT
Просмотров 53Год назад
Looking at the Twitch IRC server connection! More details below: My name is Simon and I am a senior embedded software engineer. Windows based Python code is a nice challenge for me outside my normal comfort zone! Programming my new open source TwitchPlays v2, based upon v1 which I released last year, aimed at Phasmophobia streamers on Twitch. Using Github Copilot to help me, running the GPT3 en...
TwitchPlays Version2 Programming with GPT Github Copilot!
Просмотров 41Год назад
Looking at the new actions that chatters can impose on the streamer! More details below: My name is Simon and I am a senior embedded software engineer. Windows based Python code is a nice challenge for me outside my normal comfort zone! Programming my new open source TwitchPlays v2, based upon v1 which I released last year, aimed at Phasmophobia streamers on Twitch. Using Github Copilot to help...
Embedded C++20: Static Hardware Driver Wrapper
Просмотров 7202 года назад
Embedded C 20: Static Hardware Driver Wrapper
Embedded C++20: UART Driver Interface and Implementation
Просмотров 1 тыс.2 года назад
Embedded C 20: UART Driver Interface and Implementation
Embedded C++20: VSCode Setup for C++ and Useful Extensions
Просмотров 3,2 тыс.2 года назад
Embedded C 20: VSCode Setup for C and Useful Extensions
ESP-IDF in CPP: Series Update
Просмотров 8512 года назад
ESP-IDF in CPP: Series Update
ESP-IDF in CPP 18: RTTI fix, attribute value specialisation and dynamic table GATTS construction
Просмотров 5092 года назад
ESP-IDF in CPP 18: RTTI fix, attribute value specialisation and dynamic table GATTS construction
ESP-IDF in CPP 17v2: Starting work on Bluetooth LE (BLE) Take 2!
Просмотров 1 тыс.2 года назад
ESP-IDF in CPP 17v2: Starting work on Bluetooth LE (BLE) Take 2!
ESP-IDF in CPP 16: We're back! Recap of where we're at
Просмотров 4702 года назад
ESP-IDF in CPP 16: We're back! Recap of where we're at
ESP-IDF in CPP 15: Logging and the future of this project
Просмотров 7763 года назад
ESP-IDF in CPP 15: Logging and the future of this project
ESP-IDF in CPP 14: Inter Task Messaging
Просмотров 1,2 тыс.3 года назад
ESP-IDF in CPP 14: Inter Task Messaging
ESP-IDF in CPP 13: WiFi Smart Config
Просмотров 1,4 тыс.3 года назад
ESP-IDF in CPP 13: WiFi Smart Config
ESP-IDF in CPP 12: Non-volatile Storage Testing
Просмотров 6343 года назад
ESP-IDF in CPP 12: Non-volatile Storage Testing
ESP-IDF in CPP 11.5: Fixing the Build Environment
Просмотров 6033 года назад
ESP-IDF in CPP 11.5: Fixing the Build Environment
ESP-IDF in CPP 11: Non-volatile Storage Continued
Просмотров 5333 года назад
ESP-IDF in CPP 11: Non-volatile Storage Continued
ESP-IDF in CPP 10: Non-volatile Storage and Templates
Просмотров 1,2 тыс.3 года назад
ESP-IDF in CPP 10: Non-volatile Storage and Templates
ESP-IDF in CPP 09: Simple Network Time Protocol (SNTP)
Просмотров 1,5 тыс.3 года назад
ESP-IDF in CPP 09: Simple Network Time Protocol (SNTP)
ESP-IDF in CPP 08: Getting an IP Address
Просмотров 1,1 тыс.3 года назад
ESP-IDF in CPP 08: Getting an IP Address

Комментарии

  • @vektoralexanderman4979
    @vektoralexanderman4979 Месяц назад

    Could we instead use a fixed-size buffer allocated on the stack at compile time, rather than dynamic memory allocation, to handle data in the _verify_buf function? If the data exceeds this buffer size, we could read or write it in chunks. Thanks for the great videos.

    • @DrGreenGiant
      @DrGreenGiant Месяц назад

      You could indeed. That static allocation would then not be able to be used for anything else, and as you say, you would have to chunk it up for bigger buffers. If you _can't_ use heap allocs which allow the memory reuse afterwards then static would be fine. You could possibly consider doing it on the stack with small chunks too, but be wary of the FREERTOS stack size for that task. Thanks for the great comment!

  • @jonathankan8729
    @jonathankan8729 Месяц назад

    Thank you so much for this, I'm a full-stack web and mobile developer who somehow became the sole dev on an embedded project. This series is a life saver for me, really appreciate it.

    • @DrGreenGiant
      @DrGreenGiant Месяц назад

      You're very welcome. Glad it is of some help! This might all be a bit out of date now but it should get you started. I keep meaning to do a new series but finding time is difficult these days! Ask any questions you have!

  • @icarossavvides2641
    @icarossavvides2641 Месяц назад

    Sorry but I found this presentation very slapdash, unstructured, inaccurate and amateurish. Also maybe install a proper video grabber instead of a camera pointing at the screen?

    • @DrGreenGiant
      @DrGreenGiant Месяц назад

      @@icarossavvides2641 I'm not a professional content creator, nor do I claim to be. I don't monetise my videos. This was also my first video. Curious what you thought was "inaccurate" or "amateurish" in terms of the technical detail? I used OBS, not a camera pointing at the screen, obviously.

  • @itsohnoez
    @itsohnoez 2 месяца назад

    I'm not sure what I hate more... your rambling, your mumbling, or your incessant amount of typos. I had to stop watching, it made me want to pluck my eyes out and cut my ears off listening to a muppet.

  • @Амин-т4х
    @Амин-т4х 2 месяца назад

    Finally , i have been wondering about this for years

  • @Girlrandomer69
    @Girlrandomer69 2 месяца назад

    "Science conducted" Love it

  • @BeeDisasters-hz5ok
    @BeeDisasters-hz5ok 3 месяца назад

    Thought I cornered the disaster market.

  • @meermood
    @meermood 3 месяца назад

    bees!! Very cool

  • @abdelrahmanyasser5720
    @abdelrahmanyasser5720 3 месяца назад

    Lol, I also though of going to farming instead of programming XD. Never expected to follow same channels for those thoughts XD

  • @VeekayTV
    @VeekayTV 3 месяца назад

    🐝🐝🐝

  • @eugenedudnyk5242
    @eugenedudnyk5242 4 месяца назад

    Greetings from Odesa! Thanks for supporting my country

  • @Falney
    @Falney 4 месяца назад

    omg your voice is extremely similar to mine. For a moment I was confused because I didn't remember recording a series on ESP32 programming.

  • @ethanbowering9944
    @ethanbowering9944 5 месяцев назад

    Thank you so much for this series, it's really fantastic. I am struggling with how I can create my own tasks though, like I want to be able to have a member function of a class run as a task. Is this the right approach? Do you have any advice?

  • @jcbritobr
    @jcbritobr 6 месяцев назад

    You ate using c instead of c++. Using a .cpp extension means nothing.

    • @DrGreenGiant
      @DrGreenGiant 6 месяцев назад

      This episode is setting up the framework to use a C++ compiler, which I do throughout. In all the episodes following this we use C++ language. File extensions are used to differentiate between C and C++ source files in the toolchain. If you wrote C++ code in a .c extended file then the toolchain would fail to compile the code with the way it's been setup by Espressif.

  • @Chris-ph8ow
    @Chris-ph8ow 7 месяцев назад

    Just stumbled on this video. Hope you are doing well now. Thanks so much for sharing your story. Currently going through tests myself. Just wondering if you are going to put out the 2nd part I would really love to hear about how the surgery was.

    • @DrGreenGiant
      @DrGreenGiant 7 месяцев назад

      I forgot to do a part two! I'll see if I can get some thoughts together to make a video but to quickly give you some thoughts now; the surgery was amazing. I recommend getting a set of ear defenders for after surgeries as myself and others I've read about became very sensitive to noise for about 2 weeks. Ear defenders made this much more comfortable. Other than that, the pain was a bit rough but mostly covered by the oxycodone I was prescribed. I was up on my feet the same day and in hospital for 4 days total. Recovery to being a useful human again was about 3 weeks. But take it easy for another couple of weeks. The change in my mood and energy levels since having the surgery have been dramatic. It made such a huge positive difference. Best of luck, ask me anything you want!

    • @Chris-ph8ow
      @Chris-ph8ow 7 месяцев назад

      @@DrGreenGiantthank you so much for your reply and for sharing your journey. This is comforting to hear. I am personally just being sent to an endocrinologist now as I noticed a protrusion in my brow and had slightly elevated igf although I don’t really seem to have any other symptoms. However I am preparing myself for what may be to come. The most scary part for me I think is the thought of the surgery. Just as another question, so like when you went for the day of the operation did you find your anxiety was manageable? What sort of pain or anxiety did you have when waking up is it like a bad headache? Did you find in the coming days you had a lot of anxiety about potential complications, CSF leak etc? Sorry for all the questions just trying to prepare myself and be as educated as possible. Thank you again so much.

  • @philippedunski989
    @philippedunski989 8 месяцев назад

    Hello, Around 45:00, you"re starting to consider the "good accessibility" in GpioBase for _pin, _cfg and _inverted_logic. IMO, a good encapsulation rule would be to always put data (and possibly function) in private accessibility , and to provide only functions in protected or public accessibility. So, you should, maybe, put those data in private accessibility and provide getter in protected accessibility, because it seems clear that "outside world" would never to have access to them (only derived classes will). I know that those three data are constant, and that compiler will not allow the derived classes -- whose may need to access to them -- to modify them values, but, putting those data in protected accessibility will -- in some way -- break the Low of Demeter, by providing to derived classes a "direct" access to those data. Putting those data in private accessibility and providing only getters on them in protected accessibility could allow you to minimalize refactoring work if you consider to represent those data in a different way in the future. You are -- of course -- completely right on the fact that it looks like unnecessary code bloat, but, as we don't know -- when writing the code now -- how many access to those data will be done in the future, it could enforce the OCP principle, by allowing you to only have to change your getters behavior if you consider "one day" to change the way those variable are represented. More interesting thing being that those getter's behavior can perfectly be inlined. In the same idea, around 1:00:00, you were stroking your mind to deal with the possibility to use inverted logic. You could avoid such "problem" by just definying some protected function to compute the final state to use according to the _inverted_logic's. We could call this function -- will say -- logic_state(bool state) -- or any more interesting name if you will -- and implement this in a way like if (inverted_logic()) // considering we have a protected getter to know what the value is return !state; return state; or, in a way like return inverted_logic() ? ! state : state; if you prefear ;-)

  • @nhanNguyen-wo8fy
    @nhanNguyen-wo8fy 8 месяцев назад

    19:00 39:00 47:00 value attr 50:00 size of type

  • @mynameismole
    @mynameismole 9 месяцев назад

    I'm not quite clear if C++ mutexes and FreeRTOS semaphores can coexist without any problem ?

    • @DrGreenGiant
      @DrGreenGiant 9 месяцев назад

      I've not had issues and last time I looked they used the same implementation. I.e. the "system calls" used by the C++ standard library were calling freertos locks. To be fair, it is a long time since I checked but I've had no reason to doubt it's changed so far.

  • @nhanNguyen-wo8fy
    @nhanNguyen-wo8fy 9 месяцев назад

    31:00 const reference, copy constructor 46:20 constructor inheritance. 54:00 init inheritance.

  • @abdelrahmanyasser5720
    @abdelrahmanyasser5720 9 месяцев назад

    I am using Nodemcu. Facing that error. error: 'time_point_now' function uses 'auto' type specifier without trailing return type [[nodiscard]] static auto time_point_now(void) noexcept note: deduced return type only available with -std=c++14 or -std=gnu++14

    • @DrGreenGiant
      @DrGreenGiant 9 месяцев назад

      Yeah I was using C++17. I presume you are on C++11 which is very old now. You will have to trail the declaration with the return type (or change auto to the actual type expected which is probably easier, or a template.) More info here: en.cppreference.com/w/cpp/language/auto

    • @abdelrahmanyasser5720
      @abdelrahmanyasser5720 9 месяцев назад

      Thx for specifying the problem. To solve it I've added target_compile_options(${COMPONENT_LIB} PUBLIC -std=gnu++17) line in the CMakeLists file in Wifi folder.

  • @abdelrahmanyasser5720
    @abdelrahmanyasser5720 9 месяцев назад

    16:47 N.I.C.E

  • @abdelrahmanyasser5720
    @abdelrahmanyasser5720 9 месяцев назад

    Really great job. Just one question and i would like to hear your opinion. I've read in a book once that it's better to include stuff only in .cpp files rather than the hearder files. So,, in your code it would be better to include in .cpp Is it right or it wouldn't actually matter ?. Thanks for that great job btw

    • @DrGreenGiant
      @DrGreenGiant 9 месяцев назад

      The answer is, it depends :) If there is something in the header that requires the include, then there is no choice. For example, a function takes a std::array as an argument, you will have to include <array> in the header if that's where the function is declared. Anything that is only used in the translation unit (cpp file in this case) can be included in either the header or the cpp and work fine. HOWEVER, if in the header, then any other translation unit that includes that header then also has all this superfluous stuff that the pre-processor has to deal with, which will inflate build times. I am very lax on this particular best practice, I admit. Simply because my build times aren't slow enough for me to care and I'm lazy. I also quite like having all my includes in one place so I can notice dependencies easier, but that preference is only enabled by having quick builds. It's not uncommon in large code bases for builds to take hours, in which case being more disciplined would have a noticeable advantage.

  • @eyk234
    @eyk234 9 месяцев назад

    Great series, just getting started with C++ in embedded. I previously only used MicroPython but C++ seems to give you much more options. Thank you very much for these videos, I was a little bit lost getting started!

  • @abdelrahmanyasser5720
    @abdelrahmanyasser5720 9 месяцев назад

    I am using Nodemcu8266 I spend a day looking for this error I spend a day looking for this error undefined reference to `pthread_cond_init' esp undefined reference to `pthread_cond_broadcast' undefined reference to `pthread_cond_wait' The answer is putting the CMakeLists as this : idf_component_register(SRCS src/main.cpp INCLUDE_DIRS "" REQUIRES freertos spi_flash pthread)

  • @peterwilson69
    @peterwilson69 9 месяцев назад

    I kind of grateful, but after 20 minutes I realized, that this is a 40min video. Does it really take 40mins of configuration to write hello world.

    • @DrGreenGiant
      @DrGreenGiant 9 месяцев назад

      Not really. If you just want to download and run the example project provided by espressif then that would be fastest, but then I'm not adding any depth or value at that point by making a video about it. This is a very old video now and my first one so the quality is poor to be honest. I'm starting a new series soon and am aiming to be much more concise and watchable.

  • @abdelrahmanyasser5720
    @abdelrahmanyasser5720 10 месяцев назад

    Best dude ever. Thank you very much <3. i was watching another series which describing ESP-IDF, and i couldn't focus on the video for 10 min. But your videos are great, your way in explaining the way of OOP is great. Thanks again, you are the best I've seen in embedded systems on youtube.

  • @abdelrahmanyasser5720
    @abdelrahmanyasser5720 10 месяцев назад

    Finally, a guy in embedded systems who really cares about his code to be clean and explains the reasons. Not just blinking a LED. You are the first one i find, please recommend anyone who codes in the same way in Embedded systems if you know any.

    • @abdelrahmanyasser5720
      @abdelrahmanyasser5720 10 месяцев назад

      For a while i felt like i was just repeating my codes and the only difference is the driver module i am writing. But every thing is the same in C, so boring to be honest. No art in it.

    • @DrGreenGiant
      @DrGreenGiant 10 месяцев назад

      @@abdelrahmanyasser5720 Thank you so very much for the kind words. I know it has been a while since recording these very waffly videos so hopefully they still hold the test of time! If not, I am very close to starting a new series using IDF5 and C++20, so keep an eye out for that! Hopefully the production quality will be a little better too. As for others, I know what you mean. I find nothing modern, which is what inspired me to do this in the first place. That's a reflection of the whole industry imo. The only name I know worth watching, and I highly recommend is Michael Caisse. He's done a few embedded talks at CppCon (on youtube),

    • @abdelrahmanyasser5720
      @abdelrahmanyasser5720 9 месяцев назад

      @@DrGreenGiant Wow, waiting for it. I will be the first one watching it XD. Just please keep describing the bad way and the better way of doing things, just like you talked about getters and setters and the way you made it better, doing the bad thing (repeating code) in the video, and how to avoid it. This kind of stuff i don't find in many courses (specially in embedded field). Thanks for your recommendation, i will listen to his talks.

  • @wessamshoman7481
    @wessamshoman7481 10 месяцев назад

    Thank you

  • @Noxoreos
    @Noxoreos 11 месяцев назад

    There is actually a vscode plugin, that places text after the closing curly brackets to tell which line it belongs to and it will not be part of the codefile itself.

    • @DrGreenGiant
      @DrGreenGiant 11 месяцев назад

      Ooh any idea what it's called? That would be helpful, particularly when reviewing legacy code

    • @Noxoreos
      @Noxoreos 11 месяцев назад

      @@DrGreenGiant Sure, I had to look it up. It's called "Bracket Lens" by wraith13. I mainly used it on TypeScript JS and PHP before, but I just opened a C++ / PlatformIO project to make sure it works there, too. And it does.

  • @nhanNguyen-wo8fy
    @nhanNguyen-wo8fy 11 месяцев назад

    11:06 13:24 recursive mutex 15:45 send 20:52 receive 31:15 underlying pointer 34:35 QueueInterface constructor 38:20 convert pointer 40:14 copy constructor 46:40 default constructor 47:35 n_item_waiting 50:15 n_free_space 53:00 clear 54:47 create and destroy queue 1:01:00 create unique ptr to pass to Base Q Message

  • @LEMIZO
    @LEMIZO 11 месяцев назад

    how can i make a !followage command? Because currently averything is broken :(

    • @DrGreenGiant
      @DrGreenGiant 11 месяцев назад

      There's nothing native in Nightbot nor the TwitchAPI afaik to do this. There are some third party tools that can though. StreamElements has this integrated as a default command. Maybe this helps if you wish to do it in Nightbot though: community.nightdev.com/t/new-followage-command/35108

    • @LEMIZO
      @LEMIZO 11 месяцев назад

      @@DrGreenGiant thank you. Sadly i dont really understand anything sayed on this Website :( You may could do a Tutorials it would be the only recent one on youtube for the nightbot and it proberbly will get a good amount of views ^^

    • @DrGreenGiant
      @DrGreenGiant 11 месяцев назад

      @@LEMIZO Sure. What bits are you struggling with, so I have a bit of an idea what to focus on?

    • @LEMIZO
      @LEMIZO 11 месяцев назад

      @@DrGreenGiant in general how to create the command with helf of this website :)

  • @RadimPolasek
    @RadimPolasek 11 месяцев назад

    each your keeypress makes a sound like a drum. why? however I like your lecture.

  • @AlejandroVillalobos-c3p
    @AlejandroVillalobos-c3p Год назад

    u didn't finish smartconfig!!!! -.-

    • @DrGreenGiant
      @DrGreenGiant Год назад

      Iirc, and this was ages ago now, there was a bug in the IDF for SmartConfig which meant I couldn't complete it at the time of recording. I'm intending on starting a new series soon and SmartConfig or something equivalent will be pretty much the first thing I do to get remote development working, so hopefully that will help you! Watch this space

  • @PileOfPiss
    @PileOfPiss Год назад

    excellent project man

  • @wchen2340
    @wchen2340 Год назад

    @60:03 line 31 xor... return gpio_set_level(_pin,state%%_inverted_logic); ... anyway - great series. just what i was looking for.

  • @尹长平
    @尹长平 Год назад

    But is it really necessary to add extern "C" to the main function?

    • @DrGreenGiant
      @DrGreenGiant Год назад

      If you are going to be using C++ then yes. You will get a compile time error if you don't as the entry point of the programme will not be linked. Feel free to Google it for a better explanation of why you need it when you have both C and C++ code.

  • @nhanNguyen-wo8fy
    @nhanNguyen-wo8fy Год назад

    16:45 Cmake

  • @sarimjalil6690
    @sarimjalil6690 Год назад

    Hi, I can't explain how thankful I am to you for creating this series. I have searched a lot on RUclips to find learning stuff on ESP IDF and couldn't find anything satisfactory. Looking forward to the video series on the latest IDF versions and explaining the differences etc. Till than I will be going through this series for my learning.

  • @AlejandroVillalobos-c3p
    @AlejandroVillalobos-c3p Год назад

    great videos, your helping me a lot to egt my degree with this