I was taught this too growing up in rural america. Did it myself at some land my grandparents had.
Best explanation I’ve heard for why it “works” is that when looking for places to first install pipes the location tends to be obvious or intuitive, so then years later when someone needs to find it again we naturally trend to the same rough area, pull out those stupid rod things and when they randomly cross there’s a pipe there cause we’re already standing in the general right spot. Get a high enough success rate and our brains start to think there is causation to the correlation.
Jesus dude, what brand TV do you have?
My LG issues a few hundred blocked requests throughout the day with heavy usage. I’ve never seen it wake up and phone home (my Nintendo Switch does it every hour for some stupid reason)
Combination of anti large company sentiment + people feeling entitled to get things for free if I had to guess. It also usually feels wrong when a corporation threatens a lawsuit over a single person since the US court system heavily favors the person with more money and it’s probably a true statement to say that Nintendo has more resources than the lead dev.
Modern Vintage Gamer on YouTube had an interesting take in that by stifling emulator development now it will hurt the industry in the long run because Switch exclusives will become increasingly difficult to play once support ends (an argument I myself don’t find all that compelling)
Nerrel on YouTube has a well put together and researched video on emulation where at least in the US it’s been tested in court several times that emulators are legal, but obtaining the code for the emulators to run is almost always not since you usually have to make a copy and that violates the publisher’s right to copy
For graphics, the problem to be solved is that the N64 compiled code is expecting that if it puts value X at memory address Y it will draw a particular pixel in a particular way.
Emulators solve this problem by having a virtual CPU execute the game code (kinda difficult), and then emulator code reads the virtual memory space the game code is interacting with (easy), interprets those values (stupid crazy hard), and replicates the graphical effects using custom code/modern graphics API (kinda difficult).
This program is decompiling the N64 code (easy), searches for known function calls that interact with the N64 GPU (easy), swaps them with known valid modern graphics API calls (easy), then compiles for local machine (easy). Knowing what function signatures to look for and what to replace them with in the general case is basically downright impossible, but because a lot of N64 games used common code, if you go through the laborious process for one game, you get a bunch extra for free or way less effort.
As one of my favorite engineering phrases goes: the devil is in the details
The ham radio thing makes me so sad, it really does seem like a dying hobby. But when I took my test the club sponsoring it had guys there who immediately berated me for using a practice test guide and getting a cheap piece of crap radio. Like yeah, I know it’s a terrible radio, but it was $70 with the practice guide and I’m a poor af college student. That little radio lasted me years and I only bought a new one cause it’s battery died and I couldn’t find a replacement
Whenever I replay OOT I never have a problem with Navi. She rarely hard interrupts, usually just a short tone and flashing C button that goes away after a few seconds. The voice lines only trigger if you press the button to call her, in most cases the hints she gives are genuinely helpful, and stays out of your way for the vast majority of the game.
Fi from skyward sword though… Far worse because she does interrupt gameplay, often repeats what the last dialogue box just fucking told you, and takes several dialogue boxes to tell you what Navi would have taken one to do. I’m glad they significantly overhauled her interactions in the HD release but I’m still going to be hesitant to play that game again
I think part of the “what do I do with this” factor for the iPad was that Apple (and other companies still to this day) were so hell bent on making everything smaller and more compact that releasing a larger product was marketing whiplash. Not to mention that smartphones were being pitched as this “do everything device” so why would you need anything else?
After you get over that marketing sugarcoating, it becomes pretty obvious what you’d use an iPad for. Internet and media consumption at a larger scale than your phone, easier on your eyes than a phone, but retains at least some of the lightweight smaller form factor that separates it from a regular laptop. Sure you didn’t have the stick it in your pocket advantage of a phone or the full keyboard and computational power of a laptop, but there was this in-between that for a modest fee, you could have the conveniences if you can live with/ignore the sacrifices.
I don’t think the MacBook Airs launch is a good comparison.
Sure there was an early adopter tax on being one of the first “thin and light” laptops, but people already know what you can use a MacBook for, there was already a large value proposition in having a MacBook, the extra cost was entirely being more portable than it’s full size counterparts. Everything you can do on a Mac, just way easier to take on the go.
I’ve read a few reviews on it, watched MKBHD’s initial review, and outside of a few demo apps they point to the vision pro having no real point to it. Which if true, then it falls in line with existing VR headsets that are a fraction of it’s cost and in a niche market, being three times the cost of your competitors is not a good position to be
In pure C things are a bit different from what you describe.
Declaration has (annoyingly) multiple definitions depending on the context. The most basic one is when you are creating an instance of a variable, you are telling the compiler that you want a variable with symbol name X, data type Y, and qualifiers A,B and C. During compilation the compiler will read that and start reserving memory for the linker to assign later. These statements are always in the form of “qualifiers data_type symbol;”
Function declaration is a bit different, here you’re telling the compiler “hey you’re going to see this function show up later. Here are the types for arguments and return. I pinky swear promise you’ll get a definition somewhere else”. You can compile without the definition but the linker will get real unhappy if you don’t have the definition when it’s trying to run. Here you’re looking at a statement of “qualifiers return_data_type symbol(arg_1_data_type arg_1_symbol,…);” Technically in function declarations you don’t need argument symbols, just the types, but it’s better to just have them for readability.
Structs are different still. Here you’re telling the compiler that you’re going to have this struct definition somewhere else in the same translation unit, but the data type symbol will show up before the definition. So whenever the compiler sees that data type show up in a variable instance declaration it won’t reserve space right away but it has to have the struct definition before compilation ends. This is pretty straightforward syntax wise, “struct struct_name;” (Typedefs throw a syntax wrench into this that I won’t get into, it’s functionally the same though)
One more thing you can do with variables during declaration is to “extern” them. This is more similar to function declaration, where you’re telling the compiler “hey you’re gonna see this symbol pop up, here’s how you use it, but it actually lives somewhere else k thx bye”. I personally don’t like calling this declaration since it behaves differently than normal declaration. This is the same as a normal variable declaration syntax with “extern” tossed in the front of the qualifiers.
Definitions have two types: Function definitions contain the actual code that gets translated into instructions, Enum, struct, typedef definitions all describe memory requirements when they get used.
Structs and enums will have syntax like “struct struct_name {blah,blah,blah};”, typedefs are just “typedef new_name old_name;”, and function definition “qualifiers return_data_type symbol(arg_1_data_type arg_1_symbol,…) {Blah,blah,blah}” (note that function definitions don’t need a ; at the end and here you do need argument symbols)
Lastly, when you create a variable instance, if you say that you want that symbol to have value X all in one statement, by the standard that’s initialization. So “int foo = 5;” is declaration and initialization. Structs and arrays have special initialization syntax, “struct foo bar = {5, 6, 7};” where the numbers you write out in the list gets applied in order of the element names in the struct definition. You can also use named initialization for structs where it would look like “struct foo bar = {. element_one = 5, .e_two = 6, .e_three = 7};” This style syntax is only available for initialization, you cannot use that syntax for any other assignment. In other words you can’t change elements in bulk, you have to do it one at a time.
C lets you get real wild and combine struct definition, struct instance declaration and initialization all into one! Though if I was your code reviewer I’d reject that for readability.
<\wall-o-text>
Kinda hard to sell ads when everyone blocks them
I had a boss who would send audio messages constantly. I’d be having a conversation with him, he’d get a text message on his phone, stop talking to me to mess with this phone, do a voice recording, mess it up cause he’d whisper it so others wouldn’t hear him (we still totally could), repeat it, rinse and repeat until he got it right, send it, then would ask me what we were talking about.
I’m convinced people who use voice messages have no situational awareness and are potentially psychopaths