Binary — TradingView

2.9.3 Stable update!

2.9.3 Stable update!
What is up Depthians!
We are back with another monstrous update as this one incorporates five beta test builds, so we have a lot to cover.
If you want to dive straight into the massive changelog/dissertation Click
We should probably start with the biggest change to From The Depths in this update and that is the change of fuel and ammo storage.
Quoting Nick, our lead developer
The change is quite simple: "remove ammo and fuel as separate resources. Weapons will consume materials directly, fuel engines and CJEs will burn materials directly".
Before I dig into why I think this is the right thing for FtD, I'd like to explain a few details.
Energy, fuel and ammo are still needed for your constructs.
We have changed the "ammo barrels (etc)" and "fuel tanks" so they are just alternative material storage containers, but with the following properties:
--"ammo barrels" now increase the maximum possible rate of usage of materials as "ammo" for reloading guns. They still explode.
--"fuel tanks" increase the maximum possible rate of use of materials as "fuel" for fuel engines and CJEs, with the future stretch goal of fuel tanks being flammable.
--So ammo racking is going to remain a feature of the game- vehicles that need to reload a large amount of materials may need additional ammo barrels
Ammo and oil processors are replaced ship-wide with existing material storage containers of the same size. They'll be made decorative blocks so you can still use them decoratively in future if you want to.
The oil refinery will be repurposed (described later in the patch notes)
There are two main reasons why I think this is the right move. Why it's right for the business and why it's right for the player.
Let's start with why I think it's right for the player:
Ammo and fuel containers are currently purchasable as either "empty or full". This is confusing when considered in the context of the campaign, story missions, custom battles, multiplayer matches...how do empty and full tanks behave in these modes? I'd need an hour to study the code and a small essay to explain it. That's not good game design.
Localised resources, when considering just the moving of material (and energy, if you want), becomes infinitely more manageable. The supply group system and the transit fleet system are not intuitive and for a lot of situations, their usage becomes fiddly and too complicated. We've replaced these systems with a new supply system that is much more intuitive for moving materials and energy around.
The UI is less cluttered now that ammo and fuel bars are not shown. This is not a minor point...it'll reduce the amount of data on screen by about 40% in a lot of the different views. It'll be so much easier to know at a glance if a particular fleet is running low on "materials" or doing fine. Is a transport ready to leave, or does it need to pick up more materials? Will a set of vehicles have enough materials for the next fight...this is so much easier with just one main resource type per vehicle.
When you or an enemy run out of ammo or fuel in a battle it's just frustrating. By combining fuel, ammo and materials for repairing you can guarantee that if someone runs out, the fight is going to be over quickly.
I imagine that deep down the majority of players would rather not have to create, stock and resupply fuel and ammo. I know that personally, the requirement to do this puts me off playing the campaign. By using a single material it still focuses the game on making efficient war machines, maintaining supply lines and growing your economy, but without the extra confusion of mat->ammo and mat-> fuel conversion.
Being able to assess weapons, engines and vehicles in terms of material cost and running cost is elegant.
Most grand strategy games and RTS games don't have localised resources, and many don't have more than 2 resource types to handle. Very few combine localised materials with multiple types.
Why it's right for the business:
The ammo and oil processors were created about 8 years ago. Boring single blocks that don't add much to the game. It's been our intention to add something similar to the oil refinery but for ammo creation. That's a lot of work and adds to the complexity of the logistical part of the game, which we feel is already a burden.
Making the localised resource supply system more user friendly to make it easy/natural/pleasant to move ammo, fuel and material around the map would require a lot of effort and, quite frankly, I'm not sure we'd ever manage it.
The complexity of the UI scares off a lot of our customers. The barriers to getting a gun firing or a boat moving will be lowered if a single material container can theoretically get everything working.
Running out of ammo/fuel in combat is a problem for our players. We want to find a solution to that, but it would take a lot of effort to do so. We also want the strategic AI to always enter a battle with enough ammo and fuel for the fight- that's another massive bunch of work.
The campaign's strategic AI has to work hard to get materials where it wants them. It's a bundle of work and added complexity to get NPC fleets to restock ammo and fuel as well.
We had proposed work to make resource dumps (from dead ships) contain ammo and fuel...again, that's more work, more bugs, more testing.
Certain game modes such as story missions, tournament mode, and multiplayer maps should theoretically allow the player to choose the amount of ammo or fuel stocked into their vehicles before the match begins. That's another bundle of work and added complexity we'd like to avoid.
Currently out of play units on the map can run out of fuel and will still continue to move "for free". It's exploitable and we don't have a solution to that...but if all the different out of play movement calculations are burning material, there will be no avoiding the cost.
The development effort can be much better spent polishing up other features that I actually believe in, rather than flogging the dead horse of logistical complexity in an attempt to make it interesting, approachable and fun for everyone (which I fundamentally don't think it would ever be).
Fundamentally I think that by winding back this feature we tie up a large number of loose ends and it results in a far more finished and enjoyable product.
And what's-more everyone on the development team agrees that we enjoy the game for fighting, looting and creating...not staring blankly at dozens of resource bars trying to figure out who needs to head back for more fuel and how long we need to wait for ammunition to process.
We've also simplified the resource transfer system. "Supply groups" and "Transit Fleets" have been replaced with a simple but comprehensive three-tier system. You can mark a vehicle as a "Creator", a "Cargo" or a "User". Creators fill up Cargos (and Users), Cargos give to Users (up to procurement levels). Users equalise their material with their neighbours, so do Creators, and there are a few handy transfers from Users back to Cargo and Creator to make sure they maintain their procurement levels as well. This system covers 95% of the way people were using the resource system and does it all semi-automatically. This simplification is much more possible now that materials are the only resource, as they invariably just need to flow from the resource zones to the front line, with everyone (Creators and Cargo) keeping what they need and passing the rest on. This new resource system also facilitates the long-range transport of materials from refinery to refinery, which is neat. The system also has an option, for Creator and Cargo types, to set their "supply chain index", so if you want to relay materials from output to output in order to accumulate them at a central location you can set the supply chain index to determine which way along the chain the materials will flow. It's all explained in the game.
After spending a lot of time with this new system from adventure to campaign and designer mode, the gameplay feels a little faster to get going and a little simpler for fleet management. As if you didn’t already know, you can shift+right click (with your supply construct selected) on the target construct / flagship of a fleet to keep supplied, keep holding down shift and right-click where you want to pick the resources up from and once again while not letting go of shift, shift+right click on the target construct/flag ship to finish the loop.
This would be done of course after setting up the settings Creator, Cargo and User.
Creator as an example is the harvesting construct, Cargo which would be the supply ship, User which would be a single target construct that uses the mats.
This will keep the supply ship target waypoint updated and therefore your supply ship will always head to the target construct no matter where it has moved to after setting up the loop.
You still need ammo and fuel boxes on your constructs, as these are governing the transfer rate / the speed that stock your turrets and fuel engine with the materials needed for them to run. You can run a construct without fuel or ammo boxes, however, once your APS clips are empty you will see a drop in your rate of fire as the material is not being transferred fast enough, this is the same for fuel engines and CJE.
Another change that goes hand in hand with resource management is the changes to fuel refineries.
In short:
Refineries on a force with greater than 1 million materials on it will begin refining the material into 'commodities' that are stored centrally. Commodities (AKA centralised materials) can be added by the player to any vehicle in allied territory, at any time.
Resource zones have a new feature too, and that is the ability to deactivate a resource zone on your owned tiles and if you own enough territory as you can see from the UI when double-clicking on the resource zone “Zone Deactivation”.
https://preview.redd.it/284w9khtt9t51.jpg?width=1920&format=pjpg&auto=webp&s=9dd61b06b2b6d0431bbb35c44a4d54563b81fbf0
Custom Jet Engines, have had some additional parts and new features.
We have the new ducted air intakes which as you can see have different attachment points
https://preview.redd.it/qaqeplmwt9t51.jpg?width=1920&format=pjpg&auto=webp&s=2ac2019d4b0c908019bf0ef0d53ad3a718fc4f4d
These ducted intakes allow you to have your CJE enclosed inside your construct enabling you to pass ducting through to access airflow outside.
https://preview.redd.it/pge1x43yt9t51.jpg?width=1920&format=pjpg&auto=webp&s=f2ee0cf35276f45feeb7320b29d844fa54776cdf
https://preview.redd.it/scych37zt9t51.jpg?width=1920&format=pjpg&auto=webp&s=1bf7559bc2379b692b7a318ba8f43708f5bba81e
And as you can see in the pic below they are enclosed and making use of the air duct intakes.
https://preview.redd.it/ucidv351u9t51.jpg?width=1920&format=pjpg&auto=webp&s=7d93e0c08d381fcaea2bcfc315c7b676f4006b51
You can also funnel the exhaust of your CJE's that would be under the waterline by using the two new connector blocks, a 90-degree corner and an extension piece which allows them to work as long as you funnel the exhaust out above the waterline.
https://preview.redd.it/aiofdee2u9t51.jpg?width=1920&format=pjpg&auto=webp&s=72c1dd2023195ef2337704d0547904031ad97e6c
PACs have also had a rework and new additions.
We now have the long-range lens which has a circular 10° field of fire, the close-range lens which has a circular 35° field of fire, the scatter lens which has a circular 30° field of fire, and the vertical lens which has a 10° horizontal / 60° vertical field of fire (good for AA). The other differences between them is the percentage of damage drop off at certain ranges, which is marked in their UI.
https://preview.redd.it/zvg2u0c5u9t51.jpg?width=1920&format=pjpg&auto=webp&s=567a2c4e092ea5fef62e67b051a74151e48b58d4
https://preview.redd.it/mboi63c5u9t51.jpg?width=1920&format=pjpg&auto=webp&s=78690d46df1466844cc38ff6b6623a30d910b726
One other awesome change to the PAC system is that melee lenses do not need to be hooked up to the now called long-range lens. Simply setup your melee head and snakey noodle PAC tubes with a terminator on the end, then link up to your other melee lens via Q in the drop-down menu. The scatter lens also deserves some attention here, as it can double up the number of beams if we increase the charge time max x4 at 30 seconds. The PAC system has had many tweaks which you should check up on in the changelogs.
Shields have also had some love. Projector shields reflect and laser scatter modes are now merged and have also had a slight buff to ricochet chance. Ring shields armour bonus has also increased by 50%.
We also have some new additions to APS in terms of coolers.
From left to right we now have an L shape, 4 way and a 5 way cooler.
https://preview.redd.it/lfi937e7u9t51.jpg?width=1920&format=pjpg&auto=webp&s=4ff99ceae914777137262754baa017300c2f4c1f
We now have some new wide wheel additions too for all you land vehicle lovers.
https://preview.redd.it/1ysi7u68u9t51.jpg?width=1920&format=pjpg&auto=webp&s=0760606aa3aebbde24a44fcb7319477453ee3b99
The next biggest change would be steam engines even though other changes will be implemented in this update. We are once again rehashing the whole system, which will be released in the following updates.
I had asked Weng a number of questions as to why the change was needed, why are the parts expensive, when and why would you use steam over fuel, and this is what he had to say:
Reason why steam changes are needed:
  • Steam was previously totally unbalanced and arbitrary. For example, 9 small boilers with 1 small piston was the optimal steam setup, which was more efficient and denser than almost all other engines; and turbine power generation only depended on its pressure, so compact turbines were always optimal.
  • It lacked many critical info in its UI.
  • It was hard to control the usage of steam

What's good with new steam:
  • A bit more of realism and complexity
  • Larger steam now generally have better efficiency and density than equivalent smaller steam
  • More useful info such as total power production, performance over time
  • Possibility to regulate steam usage with valves

Pros of steam compared to injector fuel:
  • Denser and more efficient
  • Even denser with turbines
  • Easier to fit into irregular space
  • Provides a buffer with flywheels or steam tanks
  • More efficient when used for propellers
  • Doesn't require fuel containers, uses material directly from any type of storage
  • Computationally less intensive
Cons of steam compared to fuel:

  • Still hard to regulate, so it's only useful when the power usage is constant or there's a buffer energy storage
  • Turbines waste energy when batteries are full
  • Crankshafts waste energy when reaching speed limit
  • More susceptible to damage (injector engines can often still run fine even when half of it is gone, steam can stop working when a single pipe is destroyed)
Why cost of parts is hilariously high: Steam engines have better efficiency and density (many players seem to forget that one) than injector engines. So a higher initial costs makes it less overpowered.
(In my opinion, the potential waste of energy is a major drawback of steam and justifies for its high potential power. But iirc Draba said that injector engines would be useless on designs that require a lot of power if steam doesn't have higher initial cost, which also makes sense.)
Problem with new steam that can't be fixed:
  • Many old designs are broken due to low power output
  • More complexity
Problems that can probably be fixed but I don't have a solution:
  • Inefficient steam engines are ridiculously bad (a bad steam engine is like 30 PPM and 50 PPV, while a good one is around 600 PPM and 110 PPV) (I tried to fix this and spent like 40 hours on that, but I only managed to make it easier to build a mediocre engine)
  • Cannot be simulated to calculate a stable power output, like fuel engines do (actually it's easy but would take a lot of time to do and I don't think it's necessary)

Another massive change is the detection rework which I also left a few questions for Ian AKA Blothorn to explain the system and how it works.
Why a change was warranted:
  • Different types of detection weren't well balanced--for instance, visual components had better accuracy than IR and vastly better range.
  • Detection autoadjust used an incorrect formula, so optimizing adjustment was both mechanical and tedious.
  • Trackers having much better detection ranges than search sensors meant that detection was very binary--if you could see something at all you could usually get a precise lock (barring ECM, which was only counterable by large numbers of components).
  • Needing both sensors and munitions warners made reactive missile defence difficult on small vehicles.
  • There were a number of other inconsistencies/imbalances, e.g. some visual/IR sensors working through water, steam engines producing no heat, etc.
Overview of the new system:
On the offensive side, each sensor type now has a role in which it is optimal, and large vehicles are best using a variety to cover their weaknesses. Visual probably remains the default for above-water detection--it remains impossible to reduce visual signature other than reducing size. IR is better against fast vehicles, as they have trouble avoiding high IR signatures from thrust and drag. Both visual and IR are weak in rangefinding (although coincidence rangefinders are adequate for most purposes); radar is correspondingly strong in range and weak in bearing, although it often offers better detection chances against vehicles that don't pay attention to radar stealth.
On the defensive side, there are two approaches. Most obvious is signature reduction--while it is deliberately difficult to avoid detection entirely, reducing signature reduces detection chances and thus degrades opposing accuracy. At short ranges, however, this doesn't work well--detection chances are likely high regardless, and low errors at short range mean even sparse detections can give a good fix. Smoke and chaff can be useful here: they increase detection chance while adding a distance-independent error to opponent's visual and radar sensors, respectively.
ECM, buoys, and radar guidance have also been reworked. Buoys are more powerful, becoming more accurate as they get closer to the target. While their base error is high, at long ranges a buoy at close range can beat the accuracy of any onboard sensor. If you worry about opponents’ buoys, ECM can now intermittently jam them--except if they are connected to their parent vehicle by a harpoon cable, in which case they don't need the vulnerable wireless connection.
Most blueprints should need no modifications under the new system, although a few may want a few more or less GPP cards. The one exception is water interactions--IR cameras, laser rangefinders, and retroreflection sensors can no longer work through water, so submarines that used them underwater or vehicles that used them to detect submarines will need to replace them (likely with buoys). Vehicles that predominantly used visual detection should also consider adding a greater variety of sensors--in particular, visual camera trackers tied to AA mainframes should likely be replaced with IR cameras. Also, radars and cameras can take over missile and projectile detection (radar is required for projectile detection), so munitions warners can be removed/replaced with additional sensors.
Last but not least a sweet little addition to our build menu prefabs.
https://preview.redd.it/iqw1ymabu9t51.png?width=1920&format=png&auto=webp&s=aa1e3cdba6e1d62e07aef83caf0acad2a39249ed
Please do make sure you go through the changelog as a hell of a lot has changed!
submitted by BaconsTV to FromTheDepths [link] [comments]

First Time Going Through Coding Interviews?

This post draws on my personal experiences and challenges over the past term at school, which I entered with hardly any knowledge of DSA (data structures and algorithms) and problem-solving strategies. As a self-taught programmer, I was a lot more familiar and comfortable with general programming, such as object-oriented programming, than with the problem-solving skills required in DSA questions.
This post reflects my journey throughout the term and the resources I turned to in order to quickly improve for my coding interview.
Here're some common questions and answers
What's the interview process like at a tech company?
Good question. It's actually pretty different from most other companies.

(What It's Like To Interview For A Coding Job

First time interviewing for a tech job? Not sure what to expect? This article is for you.

Here are the usual steps:

  1. First, you’ll do a non-technical phone screen.
  2. Then, you’ll do one or a few technical phone interviews.
  3. Finally, the last step is an onsite interview.
Some companies also throw in a take-home code test—sometimes before the technical phone interviews, sometimes after.
Let’s walk through each of these steps.

The non-technical phone screen

This first step is a quick call with a recruiter—usually just 10–20 minutes. It's very casual.
Don’t expect technical questions. The recruiter probably won’t be a programmer.
The main goal is to gather info about your job search. Stuff like:

  1. Your timeline. Do you need to sign an offer in the next week? Or are you trying to start your new job in three months?
  2. What’s most important to you in your next job. Great team? Flexible hours? Interesting technical challenges? Room to grow into a more senior role?
  3. What stuff you’re most interested in working on. Front end? Back end? Machine learning?
Be honest about all this stuff—that’ll make it easier for the recruiter to get you what you want.
One exception to that rule: If the recruiter asks you about your salary expectations on this call, best not to answer. Just say you’d rather talk about compensation after figuring out if you and the company are a good fit. This’ll put you in a better negotiating position later on.

The technical phone interview(s)

The next step is usually one or more hour-long technical phone interviews.
Your interviewer will call you on the phone or tell you to join them on Skype or Google Hangouts. Make sure you can take the interview in a quiet place with a great internet connection. Consider grabbing a set of headphones with a good microphone or a bluetooth earpiece. Always test your hardware beforehand!
The interviewer will want to watch you code in real time. Usually that means using a web-based code editor like Coderpad or collabedit. Run some practice problems in these tools ahead of time, to get used to them. Some companies will just ask you to share your screen through Google Hangouts or Skype.
Turn off notifications on your computer before you get started—especially if you’re sharing your screen!
Technical phone interviews usually have three parts:

  1. Beginning chitchat (5–10 minutes)
  2. Technical challenges (30–50 minutes)
  3. Your turn to ask questions (5–10 minutes)
The beginning chitchat is half just to help your relax, and half actually part of the interview. The interviewer might ask some open-ended questions like:

  1. Tell me about yourself.
  2. Tell me about something you’ve built that you’re particularly proud of.
  3. I see this project listed on your resume—tell me more about that.
You should be able to talk at length about the major projects listed on your resume. What went well? What didn’t? How would you do things differently now?
Then come the technical challenges—the real meet of the interview. You’ll spend most of the interview on this. You might get one long question, or several shorter ones.
What kind of questions can you expect? It depends.
Startups tend to ask questions aimed towards building or debugging code. (“Write a function that takes two rectangles and figures out if they overlap.”). They’ll care more about progress than perfection.
Larger companies will want to test your general know-how of data structures and algorithms (“Write a function that checks if a binary tree is ‘balanced’ in O(n)O(n) ↴ time.”). They’ll care more about how you solve and optimize a problem.
With these types of questions, the most important thing is to be communicating with your interviewer throughout. You'll want to "think out loud" as you work through the problem. For more info, check out our more detailed step-by-step tips for coding interviews.
If the role requires specific languages or frameworks, some companies will ask trivia-like questions (“In Python, what’s the ‘global interpreter lock’?”).
After the technical questions, your interviewer will open the floor for you to ask them questions. Take some time before the interview to comb through the company’s website. Think of a few specific questions about the company or the role. This can really make you stand out.
When you’re done, they should give you a timeframe on when you’ll hear about next steps. If all went well, you’ll either get asked to do another phone interview, or you’ll be invited to their offices for an onsite.

The onsite interview

An onsite interview happens in person, at the company’s office. If you’re not local, it’s common for companies to pay for a flight and hotel room for you.
The onsite usually consists of 2–6 individual, one-on-one technical interviews (usually in a small conference room). Each interview will be about an hour and have the same basic form as a phone screen—technical questions, bookended by some chitchat at the beginning and a chance for you to ask questions at the end.
The major difference between onsite technical interviews and phone interviews though: you’ll be coding on a whiteboard.
This is awkward at first. No autocomplete, no debugging tools, no delete button…ugh. The good news is, after some practice you get used to it. Before your onsite, practice writing code on a whiteboard (in a pinch, a pencil and paper are fine). Some tips:

  1. Start in the top-most left corner of the whiteboard. This gives you the most room. You’ll need more space than you think.
  2. Leave a blank line between each line as you write your code. Makes it much easier to add things in later.
  3. Take an extra second to decide on your variable names. Don’t rush this part. It might seem like a waste of time, but using more descriptive variable names ultimately saves you time because it makes you less likely to get confused as you write the rest of your code.
If a technical phone interview is a sprint, an onsite is a marathon. The day can get really long. Best to keep it open—don’t make other plans for the afternoon or evening.
When things go well, you’ wrap-up by chatting with the CEO or some other director. This is half an interview, half the company trying to impress you. They may invite you to get drinks with the team after hours.
All told, a long day of onsite interviews could look something like this:

If they let you go after just a couple interviews, it’s usually a sign that they’re going to pass on you. That’s okay—it happens!
There are are a lot of easy things you can do the day before and morning of your interview to put yourself in the best possible mindset. Check out our piece on what to do in the 24 hours before your onsite coding interview.

The take-home code test

Code tests aren’t ubiquitous, but they seem to be gaining in popularity. They’re far more common at startups, or places where your ability to deliver right away is more important than your ability to grow.
You’ll receive a description of an app or service, a rough time constraint for writing your code, and a deadline for when to turn it in. The deadline is usually negotiable.
Here's an example problem:
Write a basic “To-Do” app. Unit test the core functionality. As a bonus, add a “reminders” feature. Try to spend no more than 8 hours on it, and send in what you have by Friday with a small write-up.
Take a crack at the “bonus” features if they include any. At the very least, write up how you would implement it.
If they’re hiring for people with knowledge of a particular framework, they might tell you what tech to use. Otherwise, it’ll be up to you. Use what you’re most comfortable with. You want this code to show you at your best.
Some places will offer to pay you for your time. It's rare, but some places will even invite you to work with them in their office for a few days, as a "trial.")
Do I need to know this "big O" stuff?
Big O notation is the language we use for talking about the efficiency of data structures and algorithms.
Will it come up in your interviews? Well, it depends. There are different types of interviews.
There’s the classic algorithmic coding interview, sometimes called the “Google-style whiteboard interview.” It’s focused on data structures and algorithms (queues and stacks, binary search, etc).
That’s what our full course prepares you for. It's how the big players interview. Google, Facebook, Amazon, Microsoft, Oracle, LinkedIn, etc.
For startups and smaller shops, it’s a mixed bag. Most will ask at least a few algorithmic questions. But they might also include some role-specific stuff, like Java questions or SQL questions for a backend web engineer. They’ll be especially interested in your ability to ship code without much direction. You might end up doing a code test or pair-programming exercise instead of a whiteboarding session.
To make sure you study for the right stuff, you should ask your recruiter what to expect. Send an email with a question like, “Is this interview going to cover data structures and algorithms? Or will it be more focused around coding in X language.” They’ll be happy to tell you.
If you've never learned about data structures and algorithms, or you're feeling a little rusty, check out our Intuitive Guide to Data Structures and Algorithms.
Which programming language should I use?
Companies usually let you choose, in which case you should use your most comfortable language. If you know a bunch of languages, prefer one that lets you express more with fewer characters and fewer lines of code, like Python or Ruby. It keeps your whiteboard cleaner.
Try to stick with the same language for the whole interview, but sometimes you might want to switch languages for a question. E.g., processing a file line by line will be far easier in Python than in C++.
Sometimes, though, your interviewer will do this thing where they have a pet question that’s, for example, C-specific. If you list C on your resume, they’ll ask it.
So keep that in mind! If you’re not confident with a language, make that clear on your resume. Put your less-strong languages under a header like ‘Working Knowledge.’
What should I wear?
A good rule of thumb is to dress a tiny step above what people normally wear to the office. For most west coast tech companies, the standard digs are just jeans and a t-shirt. Ask your recruiter what the office is like if you’re worried about being too casual.
Should I send a thank-you note?
Thank-you notes are nice, but they aren’t really expected. Be casual if you send one. No need for a hand-calligraphed note on fancy stationery. Opt for a short email to your recruiter or the hiring manager. Thank them for helping you through the process, and ask them to relay your thanks to your interviewers.
1) Coding Interview Tips
How to get better at technical interviews without practicing
Chitchat like a pro.
Before diving into code, most interviewers like to chitchat about your background. They're looking for:

You should have at least one:

Nerd out about stuff. Show you're proud of what you've done, you're amped about what they're doing, and you have opinions about languages and workflows.
Communicate.
Once you get into the coding questions, communication is key. A candidate who needed some help along the way but communicated clearly can be even better than a candidate who breezed through the question.
Understand what kind of problem it is. There are two types of problems:

  1. Coding. The interviewer wants to see you write clean, efficient code for a problem.
  2. Chitchat. The interviewer just wants you to talk about something. These questions are often either (1) high-level system design ("How would you build a Twitter clone?") or (2) trivia ("What is hoisting in Javascript?"). Sometimes the trivia is a lead-in for a "real" question e.g., "How quickly can we sort a list of integers? Good, now suppose instead of integers we had . . ."
If you start writing code and the interviewer just wanted a quick chitchat answer before moving on to the "real" question, they'll get frustrated. Just ask, "Should we write code for this?"
Make it feel like you're on a team. The interviewer wants to know what it feels like to work through a problem with you, so make the interview feel collaborative. Use "we" instead of "I," as in, "If we did a breadth-first search we'd get an answer in O(n)O(n) time." If you get to choose between coding on paper and coding on a whiteboard, always choose the whiteboard. That way you'll be situated next to the interviewer, facing the problem (rather than across from her at a table).
Think out loud. Seriously. Say, "Let's try doing it this way—not sure yet if it'll work." If you're stuck, just say what you're thinking. Say what might work. Say what you thought could work and why it doesn't work. This also goes for trivial chitchat questions. When asked to explain Javascript closures, "It's something to do with scope and putting stuff in a function" will probably get you 90% credit.
Say you don't know. If you're touching on a fact (e.g., language-specific trivia, a hairy bit of runtime analysis), don't try to appear to know something you don't. Instead, say "I'm not sure, but I'd guess $thing, because...". The because can involve ruling out other options by showing they have nonsensical implications, or pulling examples from other languages or other problems.
Slow the eff down. Don't confidently blurt out an answer right away. If it's right you'll still have to explain it, and if it's wrong you'll seem reckless. You don't win anything for speed and you're more likely to annoy your interviewer by cutting her off or appearing to jump to conclusions.
Get unstuck.
Sometimes you'll get stuck. Relax. It doesn't mean you've failed. Keep in mind that the interviewer usually cares more about your ability to cleverly poke the problem from a few different angles than your ability to stumble into the correct answer. When hope seems lost, keep poking.
Draw pictures. Don't waste time trying to think in your head—think on the board. Draw a couple different test inputs. Draw how you would get the desired output by hand. Then think about translating your approach into code.
Solve a simpler version of the problem. Not sure how to find the 4th largest item in the set? Think about how to find the 1st largest item and see if you can adapt that approach.
Write a naive, inefficient solution and optimize it later. Use brute force. Do whatever it takes to get some kind of answer.
Think out loud more. Say what you know. Say what you thought might work and why it won't work. You might realize it actually does work, or a modified version does. Or you might get a hint.
Wait for a hint. Don't stare at your interviewer expectantly, but do take a brief second to "think"—your interviewer might have already decided to give you a hint and is just waiting to avoid interrupting.
Think about the bounds on space and runtime. If you're not sure if you can optimize your solution, think about it out loud. For example:

Get your thoughts down.
It's easy to trip over yourself. Focus on getting your thoughts down first and worry about the details at the end.
Call a helper function and keep moving. If you can't immediately think of how to implement some part of your algorithm, big or small, just skip over it. Write a call to a reasonably-named helper function, say "this will do X" and keep going. If the helper function is trivial, you might even get away with never implementing it.
Don't worry about syntax. Just breeze through it. Revert to English if you have to. Just say you'll get back to it.
Leave yourself plenty of room. You may need to add code or notes in between lines later. Start at the top of the board and leave a blank line between each line.
Save off-by-one checking for the end. Don't worry about whether your for loop should have "<<" or "<=<=." Write a checkmark to remind yourself to check it at the end. Just get the general algorithm down.
Use descriptive variable names. This will take time, but it will prevent you from losing track of what your code is doing. Use names_to_phone_numbers instead of nums. Imply the type in the name. Functions returning booleans should start with "is_*". Vars that hold a list should end with "s." Choose standards that make sense to you and stick with them.
Clean up when you're done.
Walk through your solution by hand, out loud, with an example input. Actually write down what values the variables hold as the program is running—you don't win any brownie points for doing it in your head. This'll help you find bugs and clear up confusion your interviewer might have about what you're doing.
Look for off-by-one errors. Should your for loop use a "<=<=" instead of a "<<"?
Test edge cases. These might include empty sets, single-item sets, or negative numbers. Bonus: mention unit tests!
Don't be boring. Some interviewers won't care about these cleanup steps. If you're unsure, say something like, "Then I'd usually check the code against some edge cases—should we do that next?"
Practice.
In the end, there's no substitute for running practice questions.
Actually write code with pen and paper. Be honest with yourself. It'll probably feel awkward at first. Good. You want to get over that awkwardness now so you're not fumbling when it's time for the real interview.

2) Tricks For Getting Unstuck During a Coding Interview
Getting stuck during a coding interview is rough.
If you weren’t in an interview, you might take a break or ask Google for help. But the clock is ticking, and you don’t have Google.
You just have an empty whiteboard, a smelly marker, and an interviewer who’s looking at you expectantly. And all you can think about is how stuck you are.
You need a lifeline for these moments—like a little box that says “In Case of Emergency, Break Glass.”
Inside that glass box? A list of tricks for getting unstuck. Here’s that list of tricks.
When you’re stuck on getting started
1) Write a sample input on the whiteboard and turn it into the correct output "by hand." Notice the process you use. Look for patterns, and think about how to implement your process in code.
Trying to reverse a string? Write “hello” on the board. Reverse it “by hand”—draw arrows from each character’s current position to its desired position.
Notice the pattern: it looks like we’re swapping pairs of characters, starting from the outside and moving in. Now we’re halfway to an algorithm.
2) Solve a simpler version of the problem. Remove or simplify one of the requirements of the problem. Once you have a solution, see if you can adapt that approach for the original question.
Trying to find the k-largest element in a set? Walk through finding the largest element, then the second largest, then the third largest. Generalizing from there to find the k-largest isn’t so bad.
3) Start with an inefficient solution. Even if it feels stupidly inefficient, it’s often helpful to start with something that’ll return the right answer. From there, you just have to optimize your solution. Explain to your interviewer that this is only your first idea, and that you suspect there are faster solutions.
Suppose you were given two lists of sorted numbers and asked to find the median of both lists combined. It’s messy, but you could simply:

  1. Concatenate the arrays together into a new array.
  2. Sort the new array.
  3. Return the value at the middle index.
Notice that you could’ve also arrived at this algorithm by using trick (2): Solve a simpler version of the problem. “How would I find the median of one sorted list of numbers? Just grab the item at the middle index. Now, can I adapt that approach for getting the median of two sorted lists?”
When you’re stuck on finding optimizations
1) Look for repeat work. If your current solution goes through the same data multiple times, you’re doing unnecessary repeat work. See if you can save time by looking through the data just once.
Say that inside one of your loops, there’s a brute-force operation to find an element in an array. You’re repeatedly looking through items that you don’t have to. Instead, you could convert the array to a lookup table to dramatically improve your runtime.
2) Look for hints in the specifics of the problem. Is the input array sorted? Is the binary tree balanced? Details like this can carry huge hints about the solution. If it didn’t matter, your interviewer wouldn’t have brought it up. It’s a strong sign that the best solution to the problem exploits it.
Suppose you’re asked to find the first occurrence of a number in a sorted array. The fact that the array is sorted is a strong hint—take advantage of that fact by using a binary search.

Sometimes interviewers leave the question deliberately vague because they want you to ask questions to unearth these important tidbits of context. So ask some questions at the beginning of the problem.
3) Throw some data structures at the problem. Can you save time by using the fast lookups of a hash table? Can you express the relationships between data points as a graph? Look at the requirements of the problem and ask yourself if there’s a data structure that has those properties.
4) Establish bounds on space and runtime. Think out loud about the parameters of the problem. Try to get a sense for how fast your algorithm could possibly be:

When All Else Fails
1) Make it clear where you are. State what you know, what you’re trying to do, and highlight the gap between the two. The clearer you are in expressing exactly where you’re stuck, the easier it is for your interviewer to help you.
2) Pay attention to your interviewer. If she asks a question about something you just said, there’s probably a hint buried in there. Don’t worry about losing your train of thought—drop what you’re doing and dig into her question.
Relax. You’re supposed to get stuck.
Interviewers choose hard problems on purpose. They want to see how you poke at a problem you don’t immediately know how to solve.
Seriously. If you don’t get stuck and just breeze through the problem, your interviewer’s evaluation might just say “Didn’t get a good read on candidate’s problem-solving process—maybe she’d already seen this interview question before?”
On the other hand, if you do get stuck, use one of these tricks to get unstuck, and communicate clearly with your interviewer throughout...that’s how you get an evaluation like, “Great problem-solving skills. Hire.”

3) Fixing Impostor Syndrome in Coding Interviews
“It's a fluke that I got this job interview...”
“I studied for weeks, but I’m still not prepared...”
“I’m not actually good at this. They’re going to see right through me...”
If any of these thoughts resonate with you, you're not alone. They are so common they have a name: impostor syndrome.
It’s that feeling like you’re on the verge of being exposed for what you really are—an impostor. A fraud.
Impostor syndrome is like kryptonite to coding interviews. It makes you give up and go silent.
You might stop asking clarifying questions because you’re afraid they’ll sound too basic. Or you might neglect to think out loud at the whiteboard, fearing you’ll say something wrong and sound incompetent.
You know you should speak up, but the fear of looking like an impostor makes that really, really hard.
Here’s the good news: you’re not an impostor. You just feel like an impostor because of some common cognitive biases about learning and knowledge.
Once you understand these cognitive biases—where they come from and how they work—you can slowly fix them. You can quiet your worries about being an impostor and keep those negative thoughts from affecting your interviews.

Everything you could know

Here’s how impostor syndrome works.
Software engineering is a massive field. There’s a huge universe of things you could know. Huge.
In comparison to the vast world of things you could know, the stuff you actually know is just a tiny sliver:
That’s the first problem. It feels like you don’t really know that much, because you only know a tiny sliver of all the stuff there is to know.

The expanding universe

It gets worse: counterintuitively, as you learn more, your sliver of knowledge feels like it's shrinking.
That's because you brush up against more and more things you don’t know yet. Whole disciplines like machine learning, theory of computation, and embedded systems. Things you can't just pick up in an afternoon. Heavy bodies of knowledge that take months to understand.
So the universe of things you could know seems to keep expanding faster and faster—much faster than your tiny sliver of knowledge is growing. It feels like you'll never be able to keep up.

What everyone else knows

Here's another common cognitive bias: we assume that because something is easy for us, it must be easy for everyone else. So when we look at our own skills, we assume they're not unique. But when we look at other people's skills, we notice the skills they have that we don't have.
The result? We think everyone’s knowledge is a superset of our own:
This makes us feel like everyone else is ahead of us. Like we're always a step behind.
But the truth is more like this:
There's a whole area of stuff you know that neither Aysha nor Bruno knows. An area you're probably blind to, because you're so focused on the stuff you don't know.

We’ve all had flashes of realizing this. For me, it was seeing the back end code wizard on my team—the one that always made me feel like an impostor—spend an hour trying to center an image on a webpage.

It's a problem of focus

Focusing on what you don't know causes you to underestimate what you do know. And that's what causes impostor syndrome.
By looking at the vast (and expanding) universe of things you could know, you feel like you hardly know anything.
And by looking at what Aysha and Bruno know that you don't know, you feel like you're a step behind.
And interviews make you really focus on what you don't know. You focus on what could go wrong. The knowledge gaps your interviewers might find. The questions you might not know how to answer.
But remember:
Just because Aysha and Bruno know some things you don't know, doesn't mean you don't also know things Aysha and Bruno don't know.
And more importantly, everyone's body of knowledge is just a teeny-tiny sliver of everything they could learn. We all have gaps in our knowledge. We all have interview questions we won't be able to answer.
You're not a step behind. You just have a lot of stuff you don't know yet. Just like everyone else.

4) The 24 Hours Before Your Interview

Feeling anxious? That’s normal. Your body is telling you you’re about to do something that matters.

The twenty-four hours before your onsite are about finding ways to maximize your performance. Ideally, you wanna be having one of those days, where elegant code flows effortlessly from your fingertips, and bugs dare not speak your name for fear you'll squash them.
You need to get your mind and body in The Zone™ before you interview, and we've got some simple suggestions to help.
5) Why You're Hitting Dead Ends In Whiteboard Interviews

The coding interview is like a maze

Listening vs. holding your train of thought

Finally! After a while of shooting in the dark and frantically fiddling with sample inputs on the whiteboard, you've came up with an algorithm for solving the coding question your interviewer gave you.
Whew. Such a relief to have a clear path forward. To not be flailing anymore.
Now you're cruising, getting ready to code up your solution.
When suddenly, your interviewer throws you a curve ball.
"What if we thought of the problem this way?"
You feel a tension we've all felt during the coding interview:
"Try to listen to what they're saying...but don't lose your train of thought...ugh, I can't do both!"
This is a make-or-break moment in the coding interview. And so many people get it wrong.
Most candidates end up only half understanding what their interviewer is saying. Because they're only half listening. Because they're desperately clinging to their train of thought.
And it's easy to see why. For many of us, completely losing track of what we're doing is one of our biggest coding interview fears. So we devote half of our mental energy to clinging to our train of thought.
To understand why that's so wrong, we need to understand the difference between what we see during the coding interview and what our interviewer sees.

The programming interview maze

Working on a coding interview question is like walking through a giant maze.
You don't know anything about the shape of the maze until you start wandering around it. You might know vaguely where the solution is, but you don't know how to get there.
As you wander through the maze, you might find a promising path (an approach, a way to break down the problem). You might follow that path for a bit.
Suddenly, your interviewer suggests a different path:
But from what you can see so far of the maze, your approach has already gotten you halfway there! Losing your place on your current path would mean a huge step backwards. Or so it seems.
That's why people hold onto their train of thought instead of listening to their interviewer. Because from what they can see, it looks like they're getting somewhere!
But here's the thing: your interviewer knows the whole maze. They've asked this question 100 times.

I'm not exaggerating: if you interview candidates for a year, you can easily end up asking the same question over 100 times.
So if your interviewer is suggesting a certain path, you can bet it leads to an answer.
And your seemingly great path? There's probably a dead end just ahead that you haven't seen yet:
Or it could just be a much longer route to a solution than you think it is. That actually happens pretty often—there's an answer there, but it's more complicated than you think.

Hitting a dead end is okay. Failing to listen is not.

Your interviewer probably won't fault you for going down the wrong path at first. They've seen really smart engineers do the same thing. They understand it's because you only have a partial view of the maze.
They might have let you go down the wrong path for a bit to see if you could keep your thinking organized without help. But now they want to rush you through the part where you discover the dead end and double back. Not because they don't believe you can manage it yourself. But because they want to make sure you have enough time to finish the question.
But here's something they will fault you for: failing to listen to them. Nobody wants to work with an engineer who doesn't listen.
So when you find yourself in that crucial coding interview moment, when you're torn between holding your train of thought and considering the idea your interviewer is suggesting...remember this:
Listening to your interviewer is the most important thing.
Take what they're saying and run with it. Think of the next steps that follow from what they're saying.
Even if it means completely leaving behind the path you were on. Trust the route your interviewer is pointing you down.
Because they can see the whole maze.
6) How To Get The Most Out Of Your Coding Interview Practice Sessions
When you start practicing for coding interviews, there’s a lot to cover. You’ll naturally wanna brush up on technical questions. But how you practice those questions will make a big difference in how well you’re prepared.
Here’re a few tips to make sure you get the most out of your practice sessions.
Track your weak spots
One of the hardest parts of practicing is knowing what to practice. Tracking what you struggle with helps answer that question.
So grab a fresh notebook. After each question, look back and ask yourself, “What did I get wrong about this problem at first?” Take the time to write down one or two things you got stuck on, and what helped you figure them out. Compare these notes to our tips for getting unstuck.
After each full practice session, read through your entire running list. Read it at the beginning of each practice session too. This’ll add a nice layer of rigor to your practice, so you’re really internalizing the lessons you’re learning.
Use an actual whiteboard
Coding on a whiteboard is awkward at first. You have to write out every single character, and you can’t easily insert or delete blocks of code.
Use your practice sessions to iron out that awkwardness. Run a few problems on a piece of paper or, if you can, a real whiteboard. A few helpful tips for handwriting code:

Set a timer
Get a feel for the time pressure of an actual interview. You should be able to finish a problem in 30–45 minutes, including debugging your code at the end.
If you’re just starting out and the timer adds too much stress, put this technique on the shelf. Add it in later as you start to get more comfortable with solving problems.
Think out loud
Like writing code on a whiteboard, this is an acquired skill. It feels awkward at first. But your interviewer will expect you to think out loud during the interview, so you gotta power through that awkwardness.
A good trick to get used to talking out loud: Grab a buddy. Another engineer would be great, but you can also do this with a non-technical friend.
Have your buddy sit in while you talk through a problem. Better yet—try loading up one of our questions on an iPad and giving that to your buddy to use as a script!
Set aside a specific time of day to practice.
Give yourself an hour each day to practice. Commit to practicing around the same time, like after you eat dinner. This helps you form a stickier habit of practicing.
Prefer small, daily doses of practice to doing big cram sessions every once in a while. Distributing your practice sessions helps you learn more with less time and effort in the long run.
part -2 will be upcoming in another post !
submitted by Cyberrockz to u/Cyberrockz [link] [comments]

Endless suggestions that cause chaos?? (that might seem troll) for this game and can't build it, but Starcraft 2 is too binary/mono gameplay triple CC triple Hatch most of the time.

Reuse Minecraft procedurally generated maps for RTS games. (Looks easy and feasible for me after 10 years of training.)

Would it be nice if you can destroy your own resource within war games?? (Fire to burn down crops but minerals are harder to destroy.)

Paying your SCV garbage wage and overwork them. (Maybe add random element?) -- Frostpunk

Killing civilians (kids optional, but politically incorrect)

Conqueror neutral cities and collect "taxes".

Neutral factions and cities/"Rise of Legends" Imagine "States" fighting while there are other neutral states.
https://en.wikipedia.org/wiki/Three_Kingdoms

Rise of Legends also increases unit price by a little if you build too much of the same unit.

Diplomacy/backstabbing type games are seriously lacking in Starcraft 2.
https://en.wikipedia.org/wiki/Diplomacy_(game))

SIMS mode (EA games ruined it), where you get to play The Day In The Life of a soldier, go to "college", or even learn Cisco CCNA within the game. (Sounds troll.)
https://learningnetwork.cisco.com/s/binary-game
https://forces.ca/en/paid-education/

Have options like "Green Energy Fuel" research to defeat enemy through attrition instead of the current Starcraft 1-1 "outstat and you just die".

Sun Tzu art of war for strategies currently not implementable in Starcraft 2?

Should this game build on pre-existing open source RTS games like 0 A.D. to avoid reinventing the wheel??

Meanwhile: I quit /IronHarvest after 4 hours of gameplay because the characters shout every time and it doesn't feel right. A soldier doesn't shout because chances are they are exhausted from war!! Also the delay before the soldier moves is driving me crazy.

Also watch nobody plays Frost Giant because it is 200 Gigabytes because developers implemented my suggestions!!
submitted by Kick_Minimum to FrostGiant [link] [comments]

The Motte Plays: Nomic

UPDATE: The Game is over.
Unfortunately, this particular game has ended up being something of a failed experiment. Thank you to everyone for playing, and my apologies that I didn't do a better job structuring it.
WHAT IS NOMIC?
Nomic is a game about making up the rules of the game as you go. Like Calvinball, but a little more structured.
WHAT ARE THE RULES?
The game starts with a very basic set of rules, all about how to create or amend new rules, as follows:
RULE 1: To propose a new rule, post it as a top level comment in this thread. Once it has 15 more upvotes than downvotes, it is a rule of the game that everyone must comply with. Rules that were proposed before this comes into effect shall be judged by the previous system.
RULE 2 To amend or repeal an existing or proposed rule, reply to the top level comment with your modification. Once it has 15 more upvotes than downvotes the top-level comment will be read as if your modification applies.
RULE 3 a vacuously satisfied rule (so to be compatible with its uselessness), instead of the current contradiction.
Additional rules have been added to the game, as follows:
Always sort by controversial: Everyday, the proposed rule with the highest "controversial" score gets accepted, regardless of its absolute score.
Lynch mcjunker: The user mcjunker shall be lynched at dawn on Thursday, August 28th 2025
Rules Have Names: Any post proposing a rule or amendment must include a bolded title for the rule.
The Basic Interpretation Rule: Where there are disagreements about how to interpret a rule, a person may post a "Proposed Interpretations for [Rule Name]:" comment.
Any person may reply to this comment with their preferred interpretation of the rule as a separate comment. After the proposed interpretations comment is 24 hours old, the reply that has the highest score becomes the binding interpretation.
Universal Starting Income Rule: Each player has an in-game wallet which begins containing 100 coins.
Conflict Of Rules: In the event that two or more rules (of the same classification, if separate classifications exist) conflict, then the latter adopted rule automatically controls.
Gem Acquisition Rule: When a rule proposal is implemented, the player who proposed it gets one gem.
Physical Locality Rule: The game map is an infinite binary tree. Players can choose their initial location on this map once by replying to this rule proposal with a string made up of a sequence of "L" and "R".
The Anti-Sneakiness Rule: The text of a rule must not have been edited to get accepted.
Adjudication Of Disputes: In the event of a dispute or interpretation that requires adjudication, a panel of three members of TheMotte shall sit as adjudicators.
The adjudicators shall be selected from the following list, which may be amended by later rules: crc128, AshLael, revengeclaus
The process by which the adjudication proceeds shall be determined by the three adjudicators, and need not include community input.
By a majority (>51%) vote of the sitting adjudicators, the adjudication becomes final and unappealable.
Adjudications do not set precedent, and are not mutually binding, unless this is changed by a later rule.
Rule List: All rules must be written down in the main post of the game once they are added.
Sequential Evaluation Of New Rules: When new rules are added, they must meet all currently existing rules, prior to the application of the new rule's text, unless the new rule explicitly states that it is overriding prior rules. Rules which do not meet this bar are not adopted, regardless of the disposition of votes, and shall have no effect.
No Ex Post Facto: Rules do not apply to themselves nor rules older than themselves. Amendment - Self-Referential Ex Facto(r): Rules containing any form of self-reference (however indirect), such as this rule, must abide by themselves.
Rule 1 Clarification: In "After the post is 24 hours old, if it has more upvotes than downvotes, it is a rule of the game that everyone must comply with", the post and it refers to the proposal comment itself, not the top-level thread.
A Rule to Deter Rule Proposal Spam
(1) Anyone for whom the number of his rejected new rule proposals is more than three times the number of his accepted new rule proposals, loses immediately, unless he has made fewer than five new rule proposals.
(2) For the purposes of subsection (1), any new rule proposal deleted by its author more than one hour after its posting shall be considered rejected.
If one's rule proposal is rejected, one shall drink one shot. Individuals consuming shots of alcoholic beverages because of this game shall consume no more than 40g of pure alcohol on each day of the game.Those who avoid alcohol for reasons of faith, addiction, or other moral reasons may substitute a shot of a non-alcoholic beverage of their choice.
Contradiction resolution: Rule 3 should be replaced with a vacuously satisfied rule (so to be compatible with its uselessness), instead of the current contradiction.
No Pay-To-Win Rule: No rule other than this one can make reference to real-world money or any resource (such as reddit gold or cryptocurrency) typically acquired with real-world money.
RULE 0: Have fun!
SKIN IN THE GAME: The user that proposes a rule must follow that rule prior to the rule being accepted. If they do not follow the rule then the rule will be automatically rejected.
RULE BY POPULAR VOTE: Rules proposed within the previous 24 hours are considered all at once but implemented in order of popularity (rather than chronologically).If RULE BY POPULAR VOTE is enacted, then the newly proposed rules will be considered at a specific time each day, called the "Evaluation Time". The initial value of the evaluation time will be determined by the Motte Nomic President, if there is one, or by AshLael if no Mott Nomic President has been selected.
Sort By New Rule: The reddit thread for game conversation is to be sorted by "New".
Parentheses Rule: Only rule text not inside parentheses is binding. Text inside of parenthesis is still recorded on the list, and may be used for interpretation or asides. (So far this seems to go without saying but it's nice to have it in writing.)
Book Review Meta Win Condition: The presumptive winner must submit a book review effort post to TheMotte subsequent to meeting all other win conditions besides this one to officially win the game. The book to be reviewed will be "Twilight", or something equally horrible as agreed on by other TheMotte users. The winner will have to actually read this book, and give it a glowing review. Said book review must be strive to be apophenic and make substantial defensible references to Meditations on Moloch, The Pentateuch, and prominent culture war issues at the time of posting.
The Archipelipatchwork Rule: Should the US Federal government be legally dissolved during this game, due to circumstances including but not limited to the election of Scott Alexander or Curtis Yarvin as President in November 2020, the existing Rules shall form the founding Constitution of at least one (1) successor microstate.
Prosecution System: A player may publicly accuse another player of rule breaking. In making such an accusation, the accused player and the allegedly broken rule must be named.
The accused player must choose how they shall be tried in 24 hours counted from the making of the accusation and start their chosen option during this interval. If they fail to do this, they are convicted. He may choose from the following options:
Trial by Voices - The accused player must state that he is innocent. If his post stating innocence has more upvotes than downvotes after 24 hours, he is acquitted. Otherwise, he is convicted.
Trial by Combat - The accused player may face his accuser in a 1 on 1 contest. If the accuser and the accused can agree on a contest, that will be the contest for the trial by combat. If the accused player wins, he is acquitted. If he loses, he is convicted. The precise nature of the contest is to be determined by amendment to this rule.
Trial by Ordeal - The accused player must complete a challenging task. If the accuser and the accused can agree on a task, that will be the task for the trial by ordeal. If he succeeds, he is acquitted. If he fails, he is convicted. The precise nature of the ordeal is to be determined by amendment to this rule.
A successfully convicted player becomes a thrall of his accuser. A thrall may only win the game if his master also wins.
If a player is accused of rule breaking by another player, no player can accuse the accused player of the same rule-breaking case later (not even the original accuser). However players can accuse the accused player of breaking the same rule later provided that the alleged breaking of the same rule constitutes a different case.
PUBLIC SPIRITED: Rule proposals must apply to everyone equally. No singling out specific users. Amendments to rules can still single out specific users.
The Hemlock Rule: No player shall corrupt the youth of Athens.
Amendments may be Amended: Amendments may themselves be amended by further amendments. Amendments and amendments to amendments don't have to be direct responses to the rule they're amending. (For example, this ought to be valid as an amendment despite the objection by Taleuntum: https://www.reddit.com/TheMotte/comments/fxlufo/the_motte_plays_nomic/fmymmm9/?context=10000 )
Ke2!: All chess matches relating to this game, whether they be a means to settle a dispute or related for some other reason, are to be played on lichess.org, and are especially not to be played on chess.com.
The Game End Rule: A single player winning or losing does not cause the game to end. The game ends when all players have won, lost, or both.
Not Actually A Rule: cjet79 asked us to take off the time-based vote hiding system. I assume this is either an attempt to make the game more interesting, part of a clever strategy, or simply sowing chaos, and in all cases I'm all for it. I've taken off the score filter for now; it'll be put back up when a moderator decides to put it back up.
It is not a coincidence that this is formatted as a rule and I encourage you to upvote/downvote accordingly.
Slavery
Players may transfer ownership of thralls between each other in exchange for in-game currency (such as Gems and Coins, as currently proposed in other rules).
A thrall is a player who has gained a win condition requiring his master to also win the game.
A thrall may purchase his own freedom using this method.
If a situation arises where there is exactly one player who, for every other player, is at the end of a chain of Thrall->Master connections starting from that other player, then that one player wins the game. A "player" for this purpose is defined as "anyone who has posted in the Nomic thread and has not lost the game".
If a closed loop of Thrall -> Master connections arises, then all connections in that loop shall be extinguished.
The General Store Rule: There is a general store that sells items, including three potions: a green potion (10 coins), a red potion (20 coins), and a blue potion (50 coins).
A player may obtain an item from this store by spending a number of coins equal to the label price.
Gems can be sold at the general store for 25 coins.
Robbers' Cove Rule: Locations on the map (of the Physical Locality Rule) with more "L"s than "R"s belong to the blue team. Locations with more "R"s than "L"s belong to the red team. Locations with an equal number of "L"s and "R"s belong to the purple team.
Coin Gifts Rule: Players may give coins as a gift to other players by publicly invoking this rule and naming a number of coins and a target player.
Only positive numbers of coins may be given via the Coin Gift Rule.
When coins are given to a target player via the Coin Gift Rule, the same number of coins is subtracted from the invoking player's number of coins.
If a player who does not have a positive number of coins invokes the Coin Gift Rule, the invocation of the coin gift rule is invalid.
If a gift via the Coin Gift Rule would cause the invoking player to have less than 0 coins, an amount equal to the invoking player's number of coins is given instead.
The Bleen/Grue Rule: The word "wins", if used in rules enacted before the beginning of April 13th 2019 A.D. (in UCT), is defined to mean something different from the standard meaning of wins and people who "win" are to be thought of as lower status.
The Fair Voting Proposition for Democracy: If a rule involves a vote with a single winner, and the voting system is not mentioned, then use approval voting by default.
The Anti-Paradox Rule: No rule may directly or indirectly cause a paradox or infinite logical loop.
Lost in Space Rule: If your location on the map (of the Physical Locality Rule) is longer than 16 characters in length, you can invoke this rule. Other players will propose new locations of no more than 16 characters in length in the replies to your invokation. The proposed location with the most upvotes, if this upvote count is positive, becomes your new location.
The Reddit Rule: Only reddit accounts may win.
submitted by AshLael to TheMotte [link] [comments]

AJ ALMENDINGER

glimpse into the future of Roblox

Our vision to bring the world together through play has never been more relevant than it is now. As our founder and CEO, David Baszucki (a.k.a. Builderman), mentioned in his keynote, more and more people are using Roblox to stay connected with their friends and loved ones. He hinted at a future where, with our automatic machine translation technology, Roblox will one day act as a universal translator, enabling people from different cultures and backgrounds to connect and learn from each other.
During his keynote, Builderman also elaborated upon our vision to build the Metaverse; the future of avatar creation on the platform (infinitely customizable avatars that allow any body, any clothing, and any animation to come together seamlessly); more personalized game discovery; and simulating large social gatherings (like concerts, graduations, conferences, etc.) with tens of thousands of participants all in one server. We’re still very early on in this journey, but if these past five months have shown us anything, it’s clear that there is a growing need for human co-experience platforms like Roblox that allow people to play, create, learn, work, and share experiences together in a safe, civil 3D immersive space.
Up next, our VP of Developer Relations, Matt Curtis (a.k.a. m4rrh3w), shared an update on all the things we’re doing to continue empowering developers to create innovative and exciting content through collaboration, support, and expertise. He also highlighted some of the impressive milestones our creator community has achieved since last year’s RDC. Here are a few key takeaways:
And lastly, our VP of Engineering, Technology, Adam Miller (a.k.a. rbadam), unveiled a myriad of cool and upcoming features developers will someday be able to sink their teeth into. We saw a glimpse of procedural skies, skinned meshes, more high-quality materials, new terrain types, more fonts in Studio, a new asset type for in-game videos, haptic feedback on mobile, real-time CSG operations, and many more awesome tools that will unlock the potential for even bigger, more immersive experiences on Roblox.

Vibin’

Despite the virtual setting, RDC just wouldn’t have been the same without any fun party activities and networking opportunities. So, we invited special guests DJ Hyper Potions and cyber mentalist Colin Cloud for some truly awesome, truly mind-bending entertainment. Yoga instructor Erin Gilmore also swung by to inspire attendees to get out of their chair and get their body moving. And of course, we even had virtual rooms dedicated to karaoke and head-to-head social games, like trivia and Pictionary.
Over on the networking side, Team Adopt Me, Red Manta, StyLiS Studios, and Summit Studios hosted a virtual booth for attendees to ask questions, submit resumes, and more. We also had a networking session where three participants would be randomly grouped together to get to know each other.

What does Roblox mean to you?

We all know how talented the Roblox community is from your creations. We’ve heard plenty of stories over the years about how Roblox has touched your lives, how you’ve made friendships, learned new skills, or simply found a place where you can be yourself. We wanted to hear more. So, we asked attendees: What does Roblox mean to you? How has Roblox connected you? How has Roblox changed your life? Then, over the course of RDC, we incorporated your responses into this awesome mural.
📷
Created by Alece Birnbach at Graphic Recording Studio

Knowledge is power

This year’s breakout sessions included presentations from Roblox developers and staff members on the latest game development strategies, a deep dive into the Roblox engine, learning how to animate with Blender, tools for working together in teams, building performant game worlds, and the new Creator Dashboard. Dr. Michael Rich, Associate Professor at Harvard Medical School and Physician at Boston Children’s Hospital, also led attendees through a discussion on mental health and how to best take care of you and your friends’ emotional well-being, especially now during these challenging times.
📷
Making the Dream Work with Teamwork (presented by Roblox developer Myzta)
In addition to our traditional Q&A panel with top product and engineering leaders at Roblox, we also held a special session with Builderman himself to answer the community’s biggest questions.
📷
Roblox Product and Engineering Q&A Panel

2020 Game Jam

The Game Jam is always one of our favorite events of RDC. It’s a chance for folks to come together, flex their development skills, and come up with wildly inventive game ideas that really push the boundaries of what’s possible on Roblox. We had over 60 submissions this year—a new RDC record.
Once again, teams of up to six people from around the world had less than 24 hours to conceptualize, design, and publish a game based on the theme “2020 Vision,” all while working remotely no less! To achieve such a feat is nothing short of awe-inspiring, but as always, our dev community was more than up for the challenge. I’ve got to say, these were some of the finest creations we’ve seen.
WINNERS
Best in Show: Shapescape Created By: GhettoMilkMan, dayzeedog, maplestick, theloudscream, Brick_man, ilyannna You awaken in a strange laboratory, seemingly with no way out. Using a pair of special glasses, players must solve a series of anamorphic puzzles and optical illusions to make their escape.
Excellence in Visual Art: agn●sia Created By: boatbomber, thisfall, Elttob An obby experience unlike any other, this game is all about seeing the world through a different lens. Reveal platforms by switching between different colored lenses and make your way to the end.
Most Creative Gameplay: Visions of a perspective reality Created By: Noble_Draconian and Spathi Sometimes all it takes is a change in perspective to solve challenges. By switching between 2D and 3D perspectives, players can maneuver around obstacles or find new ways to reach the end of each level.
Outstanding Use of Tech: The Eyes of Providence Created By: Quenty, Arch_Mage, AlgyLacey, xJennyBeanx, Zomebody, Crykee This action/strategy game comes with a unique VR twist. While teams fight to construct the superior monument, two VR players can support their minions by collecting resources and manipulating the map.
Best Use of Theme: Sticker Situation Created By: dragonfrosting and Yozoh Set in a mysterious art gallery, players must solve puzzles by manipulating the environment using a magic camera and stickers. Snap a photograph, place down a sticker, and see how it changes the world.
OTHER TOP PICKS
HONORABLE MENTIONS
For the rest of the 2020 Game Jam submissions, check out the list below:
20-20 Vision | 20/20 Vision | 2020 Vision, A Crazy Perspective | 2020 Vision: Nyon | A Wild Trip! | Acuity | Best Year Ever | Better Half | Bloxlabs | Climb Stairs to 2021 | Double Vision (Team hey apple) | Eyebrawl | Eyeworm Exam | FIRE 2020 | HACKED | Hyperspective | Lucid Scream | Mystery Mansion | New Years at the Museum | New Year’s Bash | Poor Vision | Predict 2020 | RBC News | Retrovertigo | Second Wave | see no evil | Sight Fight | Sight Stealers | Spectacles Struggle | Specter Spectrum | Survive 2020 | The Lost Chicken Leg | The Outbreak | The Spyglass | Time Heist | Tunnel Vision | Virtual RDC – The Story | Vision (Team Freepunk) | Vision (Team VIP People ####) | Vision Developers Conference 2020 | Vision Is Key | Vision Perspective | Vision Racer | Visions | Zepto
And last but not least, we wanted to give a special shout out to Starboard Studios. Though they didn’t quite make it on time for our judges, we just had to include Dave’s Vision for good measure. 📷
Thanks to everyone who participated in the Game Jam, and congrats to all those who took home the dub in each of our categories this year. As the winners of Best in Show, the developers of Shapescape will have their names forever engraved on the RDC Game Jam trophy back at Roblox HQ. Great work!

‘Til next year

And that about wraps up our coverage of the first-ever digital RDC. Thanks to all who attended! Before we go, we wanted to share a special “behind the scenes” video from the 2020 RDC photoshoot.
Check it out:
It was absolutely bonkers. Getting 350 of us all in one server was so much fun and really brought back the feeling of being together with everyone again. That being said, we can’t wait to see you all—for real this time—at RDC next year. It’s going to be well worth the wait. ‘Til we meet again, my friends.
© 2020 Roblox Corporation. All Rights Reserved.

Improving Simulation and Performance with an Advanced Physics Solver

August

05, 2020

by chefdeletat
PRODUCT & TECH
📷In mid-2015, Roblox unveiled a major upgrade to its physics engine: the Projected Gauss-Seidel (PGS) physics solver. For the first year, the new solver was optional and provided improved fidelity and greater performance compared to the previously used spring solver.
In 2016, we added support for a diverse set of new physics constraints, incentivizing developers to migrate to the new solver and extending the creative capabilities of the physics engine. Any new places used the PGS solver by default, with the option of reverting back to the classic solver.
We ironed out some stability issues associated with high mass differences and complex mechanisms by the introduction of the hybrid LDL-PGS solver in mid-2018. This made the old solver obsolete, and it was completely disabled in 2019, automatically migrating all places to the PGS.
In 2019, the performance was further improved using multi-threading that splits the simulation into jobs consisting of connected islands of simulating parts. We still had performance issues related to the LDL that we finally resolved in early 2020.
The physics engine is still being improved and optimized for performance, and we plan on adding new features for the foreseeable future.

Implementing the Laws of Physics

📷
The main objective of a physics engine is to simulate the motion of bodies in a virtual environment. In our physics engine, we care about bodies that are rigid, that collide and have constraints with each other.
A physics engine is organized into two phases: collision detection and solving. Collision detection finds intersections between geometries associated with the rigid bodies, generating appropriate collision information such as collision points, normals and penetration depths. Then a solver updates the motion of rigid bodies under the influence of the collisions that were detected and constraints that were provided by the user.
📷
The motion is the result of the solver interpreting the laws of physics, such as conservation of energy and momentum. But doing this 100% accurately is prohibitively expensive, and the trick to simulating it in real-time is to approximate to increase performance, as long as the result is physically realistic. As long as the basic laws of motion are maintained within a reasonable tolerance, this tradeoff is completely acceptable for a computer game simulation.

Taking Small Steps

The main idea of the physics engine is to discretize the motion using time-stepping. The equations of motion of constrained and unconstrained rigid bodies are very difficult to integrate directly and accurately. The discretization subdivides the motion into small time increments, where the equations are simplified and linearized making it possible to solve them approximately. This means that during each time step the motion of the relevant parts of rigid bodies that are involved in a constraint is linearly approximated.
📷📷
Although a linearized problem is easier to solve, it produces drift in a simulation containing non-linear behaviors, like rotational motion. Later we’ll see mitigation methods that help reduce the drift and make the simulation more plausible.

Solving

📷
Having linearized the equations of motion for a time step, we end up needing to solve a linear system or linear complementarity problem (LCP). These systems can be arbitrarily large and can still be quite expensive to solve exactly. Again the trick is to find an approximate solution using a faster method. A modern method to approximately solve an LCP with good convergence properties is the Projected Gauss-Seidel (PGS). It is an iterative method, meaning that with each iteration the approximate solution is brought closer to the true solution, and its final accuracy depends on the number of iterations.
📷
This animation shows how a PGS solver changes the positions of the bodies at each step of the iteration process, the objective being to find the positions that respect the ball and socket constraints while preserving the center of mass at each step (this is a type of positional solver used by the IK dragger). Although this example has a simple analytical solution, it’s a good demonstration of the idea behind the PGS. At each step, the solver fixes one of the constraints and lets the other be violated. After a few iterations, the bodies are very close to their correct positions. A characteristic of this method is how some rigid bodies seem to vibrate around their final position, especially when coupling interactions with heavier bodies. If we don’t do enough iterations, the yellow part might be left in a visibly invalid state where one of its two constraints is dramatically violated. This is called the high mass ratio problem, and it has been the bane of physics engines as it causes instabilities and explosions. If we do too many iterations, the solver becomes too slow, if we don’t it becomes unstable. Balancing the two sides has been a painful and long process.

Mitigation Strategies

📷A solver has two major sources of inaccuracies: time-stepping and iterative solving (there is also floating point drift but it’s minor compared to the first two). These inaccuracies introduce errors in the simulation causing it to drift from the correct path. Some of this drift is tolerable like slightly different velocities or energy loss, but some are not like instabilities, large energy gains or dislocated constraints.
Therefore a lot of the complexity in the solver comes from the implementation of methods to minimize the impact of computational inaccuracies. Our final implementation uses some traditional and some novel mitigation strategies:
  1. Warm starting: starting with the solution from a previous time-step to increase the convergence rate of the iterative solver
  2. Post-stabilization: reprojecting the system back to the constraint manifold to prevent constraint drift
  3. Regularization: adding compliance to the constraints ensuring a solution exists and is unique
  4. Pre-conditioning: using an exact solution to a linear subsystem, improving the stability of complex mechanisms
Strategies 1, 2 and 3 are pretty traditional, but 3 has been improved and perfected by us. Also, although 4 is not unheard of, we haven’t seen any practical implementation of it. We use an original factorization method for large sparse constraint matrices and a new efficient way of combining it with the PGS. The resulting implementation is only slightly slower compared to pure PGS but ensures that the linear system coming from equality constraints is solved exactly. Consequently, the equality constraints suffer only from drift coming from the time discretization. Details on our methods are contained in my GDC 2020 presentation. Currently, we are investigating direct methods applied to inequality constraints and collisions.

Getting More Details

Traditionally there are two mathematical models for articulated mechanisms: there are reduced coordinate methods spearheaded by Featherstone, that parametrize the degrees of freedom at each joint, and there are full coordinate methods that use a Lagrangian formulation.
We use the second formulation as it is less restrictive and requires much simpler mathematics and implementation.
The Roblox engine uses analytical methods to compute the dynamic response of constraints, as opposed to penalty methods that were used before. Analytics methods were initially introduced in Baraff 1989, where they are used to treat both equality and non-equality constraints in a consistent manner. Baraff observed that the contact model can be formulated using quadratic programming, and he provided a heuristic solution method (which is not the method we use in our solver).
Instead of using force-based formulation, we use an impulse-based formulation in velocity space, originally introduced by Mirtich-Canny 1995 and further improved by Stewart-Trinkle 1996, which unifies the treatment of different contact types and guarantees the existence of a solution for contacts with friction. At each timestep, the constraints and collisions are maintained by applying instantaneous changes in velocities due to constraint impulses. An excellent explanation of why impulse-based simulation is superior is contained in the GDC presentation of Catto 2014.
The frictionless contacts are modeled using a linear complementarity problem (LCP) as described in Baraff 1994. Friction is added as a non-linear projection onto the friction cone, interleaved with the iterations of the Projected Gauss-Seidel.
The numerical drift that introduces positional errors in the constraints is resolved using a post-stabilization technique using pseudo-velocities introduced by Cline-Pai 2003. It involves solving a second LCP in the position space, which projects the system back to the constraint manifold.
The LCPs are solved using a PGS / Impulse Solver popularized by Catto 2005 (also see Catto 2009). This method is iterative and considers each individual constraints in sequence and resolves it independently. Over many iterations, and in ideal conditions, the system converges to a global solution.
Additionally, high mass ratio issues in equality constraints are ironed out by preconditioning the PGS using the sparse LDL decomposition of the constraint matrix of equality constraints. Dense submatrices of the constraint matrix are sparsified using a method we call Body Splitting. This is similar to the LDL decomposition used in Baraff 1996, but allows more general mechanical systems, and solves the system in constraint space. For more information, you can see my GDC 2020 presentation.
The architecture of our solver follows the idea of Guendelman-Bridson-Fedkiw, where the velocity and position stepping are separated by the constraint resolution. Our time sequencing is:
  1. Advance velocities
  2. Constraint resolution in velocity space and position space
  3. Advance positions
This scheme has the advantage of integrating only valid velocities, and limiting latency in external force application but allowing a small amount of perceived constraint violation due to numerical drift.
An excellent reference for rigid body simulation is the book Erleben 2005 that was recently made freely available. You can find online lectures about physics-based animation, a blog by Nilson Souto on building a physics engine, a very good GDC presentation by Erin Catto on modern solver methods, and forums like the Bullet Physics Forum and GameDev which are excellent places to ask questions.

In Conclusion

The field of game physics simulation presents many interesting problems that are both exciting and challenging. There are opportunities to learn a substantial amount of cool mathematics and physics and to use modern optimizations techniques. It’s an area of game development that tightly marries mathematics, physics and software engineering.
Even if Roblox has a good rigid body physics engine, there are areas where it can be improved and optimized. Also, we are working on exciting new projects like fracturing, deformation, softbody, cloth, aerodynamics and water simulation.
Neither Roblox Corporation nor this blog endorses or supports any company or service. Also, no guarantees or promises are made regarding the accuracy, reliability or completeness of the information contained in this blog.
This blog post was originally published on the Roblox Tech Blog.
© 2020 Roblox Corporation. All Rights Reserved.

Using Clang to Minimize Global Variable Use

July

23, 2020

by RandomTruffle
PRODUCT & TECH
Every non-trivial program has at least some amount of global state, but too much can be a bad thing. In C++ (which constitutes close to 100% of Roblox’s engine code) this global state is initialized before main() and destroyed after returning from main(), and this happens in a mostly non-deterministic order. In addition to leading to confusing startup and shutdown semantics that are difficult to reason about (or change), it can also lead to severe instability.
Roblox code also creates a lot of long-running detached threads (threads which are never joined and just run until they decide to stop, which might be never). These two things together have a very serious negative interaction on shutdown, because long-running threads continue accessing the global state that is being destroyed. This can lead to elevated crash rates, test suite flakiness, and just general instability.
The first step to digging yourself out of a mess like this is to understand the extent of the problem, so in this post I’m going to talk about one technique you can use to gain visibility into your global startup flow. I’m also going to discuss how we are using this to improve stability across the entire Roblox game engine platform by decreasing our use of global variables.

Introducing -finstrument-functions

Nothing excites me more than learning about a new obscure compiler option that I’ve never had a use for before, so I was pretty happy when a colleague pointed me to this option in the Clang Command Line Reference. I’d never used it before, but it sounded very cool. The idea being that if we could get the compiler to tell us every time it entered and exited a function, we could filter this information through a symbolizer of some kind and generate a report of functions that a) occur before main(), and b) are the very first function in the call-stack (indicating it’s a global).
Unfortunately, the documentation basically just tells you that the option exists with no mention of how to use it or if it even actually does what it sounds like it does. There’s also two different options that sound similar to each other (-finstrument-functions and -finstrument-functions-after-inlining), and I still wasn’t entirely sure what the difference was. So I decided to throw up a quick sample on godbolt to see what happened, which you can see here. Note there are two assembly outputs for the same source listing. One uses the first option and the other uses the second option, and we can compare the assembly output to understand the differences. We can gather a few takeaways from this sample:
  1. The compiler is injecting calls to __cyg_profile_func_enter and __cyg_profile_func_exit inside of every function, inline or not.
  2. The only difference between the two options occurs at the call-site of an inline function.
  3. With -finstrument-functions, the instrumentation for the inlined function is inserted at the call-site, whereas with -finstrument-functions-after-inlining we only have instrumentation for the outer function. This means that when using-finstrument-functions-after-inlining you won’t be able to determine which functions are inlined and where.
Of course, this sounds exactly like what the documentation said it did, but sometimes you just need to look under the hood to convince yourself.
To put all of this another way, if we want to know about calls to inline functions in this trace we need to use -finstrument-functions because otherwise their instrumentation is silently removed by the compiler. Sadly, I was never able to get -finstrument-functions to work on a real example. I would always end up with linker errors deep in the Standard C++ Library which I was unable to figure out. My best guess is that inlining is often a heuristic, and this can somehow lead to subtle ODR (one-definition rule) violations when the optimizer makes different inlining decisions from different translation units. Luckily global constructors (which is what we care about) cannot possibly be inlined anyway, so this wasn’t a problem.
I suppose I should also mention that I still got tons of linker errors with -finstrument-functions-after-inlining as well, but I did figure those out. As best as I can tell, this option seems to imply –whole-archive linker semantics. Discussion of –whole-archive is outside the scope of this blog post, but suffice it to say that I fixed it by using linker groups (e.g. -Wl,–start-group and -Wl,–end-group) on the compiler command line. I was a bit surprised that we didn’t get these same linker errors without this option and still don’t totally understand why. If you happen to know why this option would change linker semantics, please let me know in the comments!

Implementing the Callback Hooks

If you’re astute, you may be wondering what in the world __cyg_profile_func_enter and __cyg_profile_func_exit are and why the program is even successfully linking in the first without giving undefined symbol reference errors, since the compiler is apparently trying to call some function we’ve never defined. Luckily, there are some options that allow us to see inside the linker’s algorithm so we can find out where it’s getting this symbol from to begin with. Specifically, -y should tell us how the linker is resolving . We’ll try it with a dummy program first and a symbol that we’ve defined ourselves, then we’ll try it with __cyg_profile_func_enter .
[email protected]:~/src/sandbox$ cat instr.cpp int main() {} [email protected]:~/src/sandbox$ clang++-9 -fuse-ld=lld -Wl,-y -Wl,main instr.cpp /usbin/../lib/gcc/x86_64-linux-gnu/crt1.o: reference to main /tmp/instr-5b6c60.o: definition of main
No surprises here. The C Runtime Library references main(), and our object file defines it. Now let’s see what happens with __cyg_profile_func_enter and -finstrument-functions-after-inlining.
[email protected]:~/src/sandbox$ clang++-9 -fuse-ld=lld -finstrument-functions-after-inlining -Wl,-y -Wl,__cyg_profile_func_enter instr.cpp /tmp/instr-8157b3.o: reference to __cyg_profile_func_enter /lib/x86_64-linux-gnu/libc.so.6: shared definition of __cyg_profile_func_enter
Now, we see that libc provides the definition, and our object file references it. Linking works a bit differently on Unix-y platforms than it does on Windows, but basically this means that if we define this function ourselves in our cpp file, the linker will just automatically prefer it over the shared library version. Working godbolt link without runtime output is here. So now you can kind of see where this is going, however there are still a couple of problems left to solve.
  1. We don’t want to do this for a full run of the program. We want to stop as soon as we reach main.
  2. We need a way to symbolize this trace.
The first problem is easy to solve. All we need to do is compare the address of the function being called to the address of main, and set a flag indicating we should stop tracing henceforth. (Note that taking the address of main is undefined behavior[1], but for our purposes it gets the job done, and we aren’t shipping this code, so ¯\_(ツ)_/¯). The second problem probably deserves a little more discussion though.

Symbolizing the Traces

In order to symbolize these traces, we need two things. First, we need to store the trace somewhere on persistent storage. We can’t expect to symbolize in real time with any kind of reasonable performance. You can write some C code to save the trace to some magic filename, or you can do what I did and just write it to stderr (this way you can pipe stderr to some file when you run it).
Second, and perhaps more importantly, for every address we need to write out the full path to the module the address belongs to. Your program loads many shared libraries, and in order to translate an address into a symbol, we have to know which shared library or executable the address actually belongs to. In addition, we have to be careful to write out the address of the symbol in the file on disk. When your program is running, the operating system could have loaded it anywhere in memory. And if we’re going to symbolize it after the fact we need to make sure we can still reference it after the information about where it was loaded in memory is lost. The linux function dladdr() gives us both pieces of information we need. A working godbolt sample with the exact implementation of our instrumentation hooks as they appear in our codebase can be found here.

Putting it All Together

Now that we have a file in this format saved on disk, all we need to do is symbolize the addresses. addr2line is one option, but I went with llvm-symbolizer as I find it more robust. I wrote a Python script to parse the file and symbolize each address, then print it in the same “visual” hierarchical format that the original output file is in. There are various options for filtering the resulting symbol list so that you can clean up the output to include only things that are interesting for your case. For example, I filtered out any globals that have boost:: in their name, because I can’t exactly go rewrite boost to not use global variables.
The script isn’t as simple as you would think, because simply crawling each line and symbolizing it would be unacceptably slow (when I tried this, it took over 2 hours before I finally killed the process). This is because the same address might appear thousands of times, and there’s no reason to run llvm-symbolizer against the same address multiple times. So there’s a lot of smarts in there to pre-process the address list and eliminate duplicates. I won’t discuss the implementation in more detail because it isn’t super interesting. But I’ll do even better and provide the source!
So after all of this, we can run any one of our internal targets to get the call tree, run it through the script, and then get output like this (actual output from a Roblox process, source file information removed):
excluded_symbols = [‘.\boost.*’]* excluded_modules = [‘/usr.\’]* /uslib/x86_64-linux-gnu/libLLVM-9.so.1: 140 unique addresses InterestingRobloxProcess: 38928 unique addresses /uslib/x86_64-linux-gnu/libstdc++.so.6: 1 unique addresses /uslib/x86_64-linux-gnu/libc++.so.1: 3 unique addresses Printing call tree with depth 2 for 29276 global variables. __cxx_global_var_init.5 (InterestingFile1.cpp:418:22) RBX::InterestingRobloxClass2::InterestingRobloxClass2() (InterestingFile2.cpp.:415:0) __cxx_global_var_init.19 (InterestingFile2.cpp:183:34) (anonymous namespace)::InterestingRobloxClass2::InterestingRobloxClass2() (InterestingFile2.cpp:171:0) __cxx_global_var_init.274 (InterestingFile3.cpp:2364:33) RBX::InterestingRobloxClass3::InterestingRobloxClass3()
So there you have it: the first half of the battle is over. I can run this script on every platform, compare results to understand what order our globals are actually initialized in in practice, then slowly migrate this code out of global initializers and into main where it can be deterministic and explicit.

Future Work

It occurred to me sometime after implementing this that we could make a general purpose profiling hook that exposed some public symbols (dllexport’ed if you speak Windows), and allowed a plugin module to hook into this dynamically. This plugin module could filter addresses using whatever arbitrary logic that it was interested in. One interesting use case I came up for this is that it could look up the debug information, check if the current address maps to the constructor of a function local static, and write out the address if so. This effectively allows us to gain a deeper understanding of the order in which our lazy statics are initialized. The possibilities are endless here.

Further Reading

If you’re interested in this kind of thing, I’ve collected a couple of my favorite references for this kind of topic.
  1. Various: The C++ Language Standard
  2. Matt Godbolt: The Bits Between the Bits: How We Get to main()
  3. Ryan O’Neill: Learning Linux Binary Analysis
  4. Linkers and Loaders: John R. Levine
  5. https://eel.is/c++draft/basic.exec#basic.start.main-3
Neither Roblox Corporation nor this blog endorses or supports any company or service. Also, no guarantees or promises are made regarding the accuracy, reliability or completeness of the information contained in this blog.
submitted by jaydenweez to u/jaydenweez [link] [comments]

House Party 6/22/2020 - Part Two

Woodbridge: I hate to say it, but it’s unlikely, Allen. It’s a lot easier to pretend everyone else is wrong, and that you had no other option.
The camera pans to a kitchen. We see Tony the Milkman standing there in his leather jacket accompanied by Jim Baker. The table is adorned with ingredients mixing bowls and other baking supplies.
Tony ”Guys, gals and non-binary pals, I welcome you all to the great bake-off! Mr. Baker and I have decided to put our differences behind us but before we officially align we have decided to have one final friendly competition! Since I beat him in our debut match, I picked a stipulation that I believe will help make the score equal.”
Baker: “Tony, you know I’m not a baker, right? It’s just my name?”
Tony: “I get it, Baker, you’re playing a rib on me so I won’t feel bad for losing. It’s ok! We’re partners now!”
Baker “Tony I’m being se-“
Tony: “As is I was saying, The bake-off! Both of us will be baking something, which will then be shared with the rest of the locker room, unless they’re that piece of shit Joey McCarty, or Joey McCarty’s friends.”
Tony stares directly into the camera: “I know how much the people in the locker room love consuming the labor of others without compensation.”
Baker nods in agreement
Tony: “For my entry, I will be making the favored dessert of bisexuals such as myself… Lemon Bars!”
Baker: “And I’m making… uh… cookies I think”
Tomy: “No need to put yourself down, brother! We all know you’re going to smoke me! Anyways let the games begin!
The to go off in opposite directions and begin preparing their deserts. Tony begins making a crust out of flour cornstarch and other ingredients, carefully slicing butter and mixing, while Jim unsuccessfully attempts to make even balls of store bought cookie dough.
Backstage we see Mark Dutch walking around, peeking around corners and down hallways as if he’s searching for someone.
Dutch: Yo Blackwater! We’re done playing hide and seek! Where are you?
Dutch turns around, staring at each door and peeking into some of them, but to no avail.
Dutch: Where the fuck did he go?
After taking a few more steps he stares to the left of him. The camera turns and he comes across Kyle Scott, looking down onto a large map.
Dutch: Kyle. You got a moment?
Kyle looks up, staring back at the tall Dutchman with a focused look on his face?
Kyle: What do you want? Can’t you see I’m busy?
Dutch frowns for a moment, presumably having a brainfreeze from the shake before he peeks at the map. It’s a detailed map of Ohio that Kyle looks at
Dutch: Have you seen Louis? Louis Blackwater?
Confused, Kyle looks back at Dutch before shrugging.
Dutch: Like.. the B in D&B? Have you seen him?
Kyle: Becca?
Dutch: No. She’s dead. Blackwater.
Kyle: Ooooh! Blackwater. No, I haven’t. Why would I know that?
Dutch: I don’t know.
Kyle: Exactly. Now leave me alone, please.
Dutch: Fine. Thanks anyways.
When Kyle puts his head back down into the map, Dutch continues to walk down the hallway until hearing a loud crash. Immediately, Dutch sprints over to where the sound came from, in the background we see Kyle not even having flinched from it. After a few steps Dutch goes around a corner and immediately is heard yelling.
Dutch: LOUIS!
Louis is found on the ground, holding his head and surrounding him are metal pipes. Dutch gets to Louis and checks him out, staring over him as he tries to get Louis’ attention by shaking him!
Dutch: LOUIS! WAKE THE FUCK UP!
Blackwater: I am awake! Stop shaking me!
Dutch: Why the fuck are you on the ground?!
Blackwater: Fuck, man. A fucking mouthbreather attacked me from behind. Hit me right in the fucking liver. REAL LAME, GUYS! I USE IT TO DRINK!
Blackwater holds his hand on his side, presumably where is black, abused liver is supposed to be before he sticks out his hand, trying to get up. Dutch takes it and pulls him up slowly.
Blackwater: Ah.. fuck.. that hurts..
Dutch: You going to be alright?
Blackwater: Yeah.. Fuck me, I had worse. I should check a doc or something. Then go find the cumstain who did this.
Immediately, Dutch’s eyes light up as if he has a bright idea.
Dutch: I got a bright idea! You go visit the doc, I’ll find who did this. I’ll be like Batman doing detective work!
Blackwater: Of course you’d wear leather. You gonna have bat-nipples on your costume too?
Dutch: Fuck off, mate. Let me help you get to the doc.
Wrapping Louis’ arm around his neck, Blackwater begins to walk down the hallway, helping him as they both disappear around the corner.
Blackwater: Really tho, I won’t judge you if you wear leather.
Dutch: ...I’ll think about it.
We then cut back to the ring, where we see Javier not standing solidly in the middle of the ring, but instead rushing down from backstage to it, seemingly not having been ready for once, as he pulls out a card from his pocket, and begins to read.
Javier: At the request of both competitors in this upcoming bout, we will now be staging an impromptu singles match between Dalidus Nova and Buster Braggadocio!
Crowd: WOOOOOOOOOOOOOOO!
Javier: Clears throat And it is a singles match set for one fall, with a 30 minute time limit! Introducing first-
The Kids are Back hits the speakers, as out from the curtain comes Dalidus Nova, swiftly followed by Miles Alpha.
Javier: From Toronto, Ontario, Canada, standing at 6 feet 3 inches and weighing 225 lbs… DALIDUUUUS! NOOOOOOVA!
Crowd: BOOOOOOOOOOO!
Woodbridge: And the crowd here not a fan of Dalidus or Miles.
Paisner: They’re not the only ones…
Dalidus spits out a grotesque, far-too-large mouthful of Hubba Bubba gum at ringside and enters the ring, Miles staying outside but putting himself in Nova’s corner as Freaky Black Greetings hits the speakers.
Javier: And now, from Atlanta, Georgia, standing at 6 feet and three quarters of an inch and weighing 220 lbs… BUUUUUUSTER! BRAGGADOCIOOOOO!
Buster comes out from the curtain, pick in hair and yelling caucasian-themed insults at the crowd with reckless abandon.
Crowd: BOOOOOOOOOOOO!
Woodbridge: Quite clearly, the audience here doesn’t feel too strongly about Buster either!
Paisner: Seems the crowd and I are finally seeing eye-to-eye!
He slides into the ring, flicking his pick towards Alpha at ringside while he does so. Buster and Dalidus eye eachother up from opposite sides of the ring as the bell signals the start of the bout.
DING DING DING!
The bell rings, and Buster is quick to charge Nova, who slips underneath the bottom rope and out of the ring.
Crowd: Booooooooooo!
Paisner: Dalidus wasting no time going to his sleazy playbook.
Woodbridge: But Buster’s not having it, look out!
Buster immediately follows Dalidus to the outside, giving chase as Nova stumbles into a run, not expecting Buster’s aggression. The two make a circle outside the ring, until Dalidus slides right back in through the bottom rope. Buster is seconds behind him, but as he gets to his feet he sees that Nova has slipped back outside the ring, grabbing Buster by the ankle and pulling him down and out to the floor!
Crowd: Booooooooooo!
Paisner: Ooh! Buster landing hard outside!
Dalidus starts to lay boots into Buster on the outside, as Miles yells a mix of encouragement towards his partner, and insults towards the opponent. After several seconds of the officials count, Nova grabs Buster and wrestles him back into the ring.
Woodbridge: Finally, both men back into the ring, the only place the final fall can take place.
Not relenting, Nova drags Buster up to his feet in the corner, striking him in the chest with a chop!
Crowd: Ooooooooh!
He winds up for a second one, but not before Buster strikes him with a forearm strike, creating the separation necessary to connect square in the chest with a dropkick!
Crowd: OOOOOoooohh!
Paisner: Buster with the retaliation!
Nova is sent flying backwards, quickly rising to his feet in the opposite corner as Buster continues his attack, flying in with a corner clothesline! Still not giving Dalidus a second to breath, Buster shoots Nova back towards the other corner with an Irish Whip…
Woodbridge: These two men, back and forth across the ring!
...Charging in for another clothesline, Buster is suddenly met by the rising boot of Dalidus!
Crowd: Woooahh!
Paisner: Back and forth quite literally, Mark! Neither man’s gotten a concrete advantage thus far!
Taking a second to breathe, Dalidus re-approaches Buster, bending down to pick him off the mat only to get caught in a lightning-fast small package!
1…!
2.. - No!
Woodbridge: Nova damn-near got caught!
Dalidus is swift to fight out, both men twisted away from one-another and back up to their feet, backing towards opposite ropes.
Alpha: C’mon, Dali! Get his ass!
With the verbal from Miles, Dalidus rushes Buster, who ducks underneath a clothesline attempt, grabbing the waist from behind and using Nova’s momentum to run him into the ropes with an O’Connor Rollup!
1…!
2…!
No! Dalidus reverses the roll-up!
1…!
But Buster breaks free, and is quickly up to a knee!
Paisner: Two escapes from both - WOAH!
Still kneeling, Buster is caught in perfect position for the Kneeling Superkick!
Paisner: CHEKHOV’S GUN! Buster falls back to the mat, rolling out of the ring and plopping to the floor outside the ring.
Woodbridge: Buster got caught on bad timing, but makes up for it by getting outside the ring, away from any potential pinfall attempts.
Dalidus, with an annoyed look on his face, walks towards the ropes, crossing them and landing outside the ring beside Buster. As Miles stands beside him, Dalidus again tries to get Buster into the ring. This time, however, Buster slips from Nova’s grip, slamming his opponent's head into the edge of the ring!
Crowd: OOOOOH!
Paisner: Buster was playing possum!
With Nova dazed, Buster turns to Alpha, kicking him in the gut before grabbing the back of the Canadian’s head and swinging him into the ring post!
Crowd: YEEEAAAAAAHHHH!
Woodbridge: Miles hit hard, and the crowd loves it!
With Alpha laid out outside the ring, Buster swings Nova’s legs up and onto the canvas, sliding in after him.
Paisner: These two have fought at a lightning-fast pace thus far, and it looks like Buster is aiming for an equally-fast conclusion to this bout!
Buster sits Nova up in the center of the ring, shooting a quick kick into his back to keep him in place. Breaking into a sprint, Buster hits the rope facing his opponent, running back at Dalidus with intentions to hit a running knee strike…
Woodbridge: Bravado Bust - Nonono!
However, Dalidus lays back and the knee flies right overhead, as he reaches upwards and catches Buster between the legs, pulling him back down to the mat with another roll-up!
1…!
2…!
3.. - NO!
But Buster kicks away, breaking the pinfall! Returning to his feet, Buster is unable to avoid a forearm strike from Dalidus, stunning him long enough for Nova to drive a knee into the gut and snap down with a quick DDT!
Paisner: DDT from Dalidus, and these two just will not slow down!
Woodbridge: Ya may not like them, - God knows I don’t - but they’ve got some mighty gas tanks on ‘em!
Dalidus, now behind Buster, brings his opponent to his feet with a waistlock, before throwing Buster’s arm over his neck and throwing him backwards with an Inverted Exploder Suplex! Buster flies far through the ring, but his boots collide with the skull of the official, sending him falling to the mat like a sack of potatoes!
Crowd: BOOOOOOO!
Paisner: Cord Cutter, but the ref’s down!
Woodbridge: Buster ate all of that!
Dalidus begins to go for a pinfall, but spots the official down on the mat. Looking up towards a less-than-admiring crowd, he gives a shout to his partner.
Dalidus: Miles! Gimme a chair!
Paisner: Oh, sonuva…
Miles, still reeling from the collision with the steel post, grabs a steel chair and slides it into the ring as Buster begins reaching for the ropes in an attempt to get back to a standing base. Meanwhile, Dalidus grabs the chair from the mat and sizes up Buster from behind.
Woodbridge: Buster’s gonna get his brain rattled!
As he turns around, Dalidus charges with the chair raised high, swinging it downwards just as Buster sees, quickly rolling underneath the blow leaving the chair to connect with nothing but air!
Crowd: OOOOOOH!
Quickly up to his feet, Buster reaches into his tights to retrieve his signature black marker! Throwing the cap into the crowd, he immediately strikes Dalidus in the left eye with a jab from the marker!
Crowd: OOOOOOOOOOOOOHHHHH!
Nova falls to the mat, clutching at his face! Buster returns to the official, trying to get him back into the match, when he is struck from behind by a sudden forearm blow, courtesy of Miles Alpha!
Crowd: BOOOOOOOOOOOO!!
Woodbridge: The third man! Miles, getting himself involved once more!
Buster falls to his knees as Miles pulls him away from the ref, before swiftly bringing him up in a Fireman’s Carry and driving his boot into Buster’s skull with a Benadryller!
Paisner: Alpha with the Defeater to Buster!
*Woodbridge: He’s out cold, without a doubt!
Looking behind him to spot the official slowly coming to, Miles rolls Buster onto his back and pulls the blinded Dalidus on top of him, before slipping out of the ring and hiding from the officials view as he begins to slowly make the count!
1…!
2…!
3…!
DING DING DING!
Paisner: Absolute bullshit!
Javier: The winner of this bout via pinfall, at a time of 7:02: DALIDUS! NOVA!
The Kids are Back hits the speakers, as Miles comes back into the ring to assist Dalidus out of it, a shit-eating grin plastered on his face.
Woodbridge: In what was looking like quite the match, Dalidus steals one from Buster with the help from Miles Alpha!
Paisner: It’s bullshit, Mark. Complete bullshit.
The two walk through the curtain as the camera cuts away.
Mark Dutch is walking around the backstage area. He comes across Tony the Milkman, seeming to take a breather from the chaos of the kitchen, wiping off a milk mustache.
Dutch: Milkman! Tell me everything you know about the attack of Louis Blackwater!
The Milkman looks confused.
Tony: I don’t have any information for you, unfortunately. I do have a wonderful lemon cake! Would you like a piece?
Dutch takes a good look at the lemon cake Tony is offering, but he shakes his head.
Dutch: No, I cannot be distracted. I have responsibility!
Tony: Your loss!
As Mark Dutch continues to walk around, he peeks into a room and sees Big Money Maverick on the phone talking to someone. Dutch begins to speak to himself.
Dutch: Mav….maybe it was him….
Big Money Maverick: So yeah, if you're interested in doing business, let's talk about financials…
As Mav talks on the phone, and Dutch watches from outside the room, Dutch is suddenly approached by a backstage crew worker holding a bag of cheetos.
Crew Worker: Looking for the guy who attacked Blackwater? I don't think it was Mav.
Dutch: Why do you say that?
Crew Worker: He's been in this room making phone calls for hours, I should know…
The crew member swings the door open, cracking it behind him so the camera and Dutch can still see inside. We see the crew worker hand the bag of Cheetos to Mav, and Mav sets the bag on a table next to him, alongside many other drinks and snacks that Mav presumably forced the worker to get for him.
Dutch: Hmm...maybe not...but…...I don't know….
Dutch walks away from the room, and immediately is face to face with Stephen Romero, who’s holding an athletic jump rope in his hands and sweat covers his tank top.
Romero. Heard you were looking for who snuck up on Blackwater.
Dutch: Yeah. By the way, thanks for going after Balandran for my hotdog.
Romero looks back at Dutch, scratching the side of his head with a confused look.
Romero: Oh yeah. Uhm. No problem, I guess. Look, we two have been in the business for a while.
Dutch: True.
Romero: Yeah, and I noticed a trend which might work.
Dutch’s eyes are wide open as he looks back at Romero.
Romero: Usually, if you go to the ring and call out who did it.. they often show up and take responsibility. That or someone else shows up who wants to fight. It’s a 50/50 chance.
Dutch: Now that you say it, yeah.. you’re right. Thanks, Stephen.
Mark Dutch pats Romero’s shoulder before he looks at his now sweat covered hand. Immediately, Dutch wipes his hand off on Romero before he quickly walks away. Romero looks down at the sweaty handprint before letting out a sigh.
The camera returns to the kitchen, where we see Milkman back in after his break, and his crust has been pulled out and he’s pouring in a filling into it. Baker is on Twitter instead of watching whatever he has put in the oven. Bakers oven start producing smoke, whole Tony’s produces an absolutely gorgeous looking loaf of pastry
Baker: “Shit!”
Baker runs over the oven and opens it, quickly pulling the cookies out without wearing any form of hand protection
We open our next scene, as we see Stephen Romero backstage once again, clad in his wrestling gear and changed into a cleaner, and very small black tank top. So small the tank top is dangerously close to slipping inward a bit and potentially revealing his nipples. With this phone on hand, as he starts an instagram live stream from his phone, quickly getting up to around 14 unique viewers. As he begins to speak.
Romero: Hello world! I’d just thought i’d give a bit of insight into how I go about preparing for whatever I need to do when i’m at a show! The first thing to bring, always, always have this-
Romero opens one of his bags layed in his locker, inside revealing many bottles of water.
Romero: Stay hydrated, constantly! And you can stay hydrated with….uh….actually I don’t have any sponsors for this yet……..use tap water if it’s safe where you live, get some re-usable bottles if you can! I think when it comes to price points it’s not something you’d regret if you splurged on, but not something you need to splurge on either. I might even recommend not splurging, because with some extra money, you can become a patron for 1 cent a month! We are already at fifty-three patrons, and you can get in on the new hotness, and access to exclusive content! Now, to show y’all some more-
Romero grabs a significantly sized lunch box, as it seems to contain generous servings that make up a large rice bowl. First ingredient is obviously a lot of rice, with sliced pork, green onion, cilantro, mushroom, carrot, and avocado all being found in significant portions.
Romero: Being as large as I am and working in such a physically draining industry, the portions that I need to function would incapactiate a normal human being. Whether I am exaggerating or not is up to your own interpretation. And now, some may wonder how I get mentally prepared for a match? It heavily depends, for ippv matches where there’s more on the line, I tend to psych myself up with intense music, let out energy through running in place, my ippv matches are more about being intense. With lower stakes matches or House Party matches, I tend to moreso leave my training at the gym, I just try to show up in as good and happy of a mood as I can. Easier said than done of course, but with things such as forming alliances recently, I always have some others to lift me up. I think specialist and Rizwan are in the break room, lets go visit them actually!
Romero then walks out of the locker room and into the hallways, and as he just enters the hallways, he bumps into someone right in front of his whole stream!
gayboygayboygayboygayboygayboygayboygayboygayboy: omg king u okay??!!??!!
MarioFantatic37: Nooooooooo don’t get hurt from an unexpected collision your so sexy haha
After a moment of surprise, we see the person Romero collided with as he exited the locker room, GiGi, who now sees that Romero bumped into her, and gains a fury in her eyes.
GiGi: Hey! You! The audacatity to have said the things you have and now this?! Do you want to know the consequences! Well i’ll show you them!
GiGi then whips out her phone herself, a look of anger on her face throughout the process of doing this, as she starts up an instagram live stream of her own…….and instantly changes to a fake wide smile as she starts the stream up, hundreds upon hundreds of viewers quickly pouring in. She glances up at Romero with now a smug smile at the sheer numerical differences in their streams, as she begins to talk to her fans.
GiGi: Hello GiGi Gang! Welcome to an impromptu stream, brought on by more severe aggression against me! And guess who’s the person behind it!
GiGi dramatically swings her phone to reveal Romero in the shot, who’s holding up his phone for his stream as well, as GiGi’s chat goes-
Chad68: BOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO! Feet?: BOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO! LocalLesbian: BOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO! Jouster06: HOW DARE YOU HURT HER YOU MONSTER! I’LL BEAT YOU UP MYSELF! xxxsavannahgranger4523: Looking for hot singles in your area? Visit Datebeast.notavirus.com/132342435353324244het43422 for your hook up today! QuirkyGamer!!!: BOOOOOOOOOOOOOOOOOOOOOOOOOOO!
Upon realizing who they’re seeing, as GiGi continues to speak.
GiGi: Once again I have been put in serious danger by Romero, by him as the much larger person trying to bulldoze over me and hurt me in the process!
Romero: I...literally just accidentally bumped into you.
GiGi: You’re lying! I can’t trust a word you say after your threats towards my livelihood, and now my physical well-being! You know what, this calls for retaliation, Kaitlyn, you’re strong, get him!
As GiGi commands this though, we don’t see anything happen, GiGi, confused as to why Kaitlyn is not doing something for her, turns around, and sees that Kaitlyn has mostly fainted due to the sheer scale of her infatuation with GiGi. Connected to GiGi only by holding on to her foot, where many in chat upon seeing this foot holding simply comment “God I wish that was me”.
Romero: Well, considering the state of Kaitlyn, i’m not sure she’s up for much of a fight in this moment. So unless you are, I think we’ll need another method to settle this, through what has been my goal, a stream battle! Where I handle mine with honesty and openness!
GiGi: Is that all? Easy! You’re on! Kait! Come with!
GiGi then begins to walk away, but is very noticeably slowed by the mostly dead weight of the head over heels Kaitlyn clinging onto her. Due to this GiGi is not able to make nearly as smooth an exit from the scene as she was hoping, but tries to make the best of it by highlighting the struggle she’s going through due to this, pointing the camera down in the process, showing her pastel colored shoes, as we see several “POGGERS” and excited proclamations of “FEET!” in her chat at this.
Romero meanwhile heads his own way, as we see support from the members of his chat-
gayboygayboygayboygayboygayboygayboygayboygayboy: Romeo, u r fuckin sick ur gonna do it
BasedAndGaypilled: STEPHEN ROMERO KREYGASM
Thats_So_Shibe: Bro no homo but I would like to have anal intercourse with you
Romero makes his way quickly over to a break room, where we see Rizwan and Specialist chatting over a cup of tea for Rizwan, and several cups of coffee for each member of Specialist, as Romero mutters to himself for a moment-
Romero: Fuck what do people like...spinning, they like spinning right? HEY RONDEL!
Rondel then stands up, he and Romero making intense eye contact.
Romero: DO ONE OF THEM COOL SPINS!
Rondel then jumps on top of the table, Rizwan able to save his tea, but all of Specialist’s coffee gets spilled. Rondel then not only spins, he balances on one leg to do the spin, mixing in several hops into the spin to add even more onto it, before finishing the spin, and stepping off the table. He then offers to replace everyone’s spilled coffee, as he goes to get more, but not before he and Romero both communicate to each other with a thumbs up. As the chat that has now grown to 25 unique views POPS OFF
We then cut back to GiGi, where we see on her stream her attempts to geti Kaitlyn functioning again. We see GiGi more gently poking her, shaking Kaitlyn, throwing a glass of water on her face, all to no avail! Before she finally switches up the strategy, and slaps Kaitlyn across the face, this action finally making her functionable again, as a wide smile forms on her face, as she springs to her feet. This once again drawing many “damn I wish that was me’s” from the chat. As GiGi then speaks to Kait-
GiGi: So, you’ve been allied with Romero before right? Knowing him from that, and knowing him now from his evil actions, what do you think he could be doing right this moment?
Kaitlyn: Uhm, he could be showing off his wardrobe right now? Yours is just, so much more expansive and prettier than his, I think you can easily take away the few viewers he has by showing off your-
GiGi: Not bad...but I think I got an idea better.
We then cut back to Romero again, where he’s showing off more of his wardrobe, where he is currently clad in a maroon red beret, glasses straight from a sexy secretary halloween costume, a white/maroon striped shirt tucked into tight fit jeans, and a leather jacket over it all. Romero hits several poses in this outfit, but as he’s focusing on himself in the mirror and showing off the outfit and his figure in it to the audience in his chat, we see GiGi and Kaitlyn sneak up in the background. Keeping a low profile, but enough to be noticeable in the lower frames of Romero’s stream, and obviously visible on GiGi’s stream as we switch to her view of her slowly crawling her way towards Romero’s set up. Where we see his set up is organized into different pieces, the tops/bottoms/jackets/hats/accessories all put into different sections. We see GiGi and Kaitlyn coordinate to take one thing of each from all of those while Romero is focused entirely on his posing. Then they go to make their escape and with wonderful timing, because as they start, Romero for the first time fully turns around to show off the outfit from behind! GiGi and Kaitlyn barely dodging out the way with all the stolen clothes. As we then hear Romero say-
Romero: Alright, I hope that was enough for all of you! Now, onto the next outfit…
Romero then goes through each his sections, making most of his next outfit….but cannot find the hat for it!
Romero: Yo what the fuck…..you know what, i’ll skip that one, next outfit!
Romero then goes through his next outfit…..but finds that he is now missing the jacket that goes with it!
Romero: HUH?! Again?!! Well uhhh….third time’s the charm I guess!
Romero then looks through his next outfit…..but cannot find the top to it!
Romero: WHAT THE FUCK?! Hold up, somethings going on here….
Romero then goes to grab his phone, and check insta live chat, where they are spamming “GIGI STOLE YOUR CLOTHES” in the chat, as an anger then manifests in Romero’s face.
Romero: She took my clothes?!........I’ve gotta do something about this man..
We then cut to GiGi and Kaitlyn still streaming, where we now see GiGi attempting a try on an article of clothing she stole from Romero, a denim jacket…..emphasis on *try, as we see that the jacket looks less like a normal jacket, looks less like an oversized jacket, but more like a straight up blanket on GiGi, nearly completely covering her all on it’s own.*
GiGi: What do you say Kait? I think these are so big on me they could really work as a unique shoot, maybe make it available for patrons donating $750 and up, or you could take them for yourself if you want, they’d still be quite large on you but not to the point where you could make your bed with it.
Kaitlyn: Oh, um, no, no thank you, I think i’d like to see more you wearing some of his stuff..
GiGi: Ooohhhh, well I know I already have one patron on board, say, how exactly would you enjoy seeing me wear it?
Kaitlyn: Well...uh….maybe with, nothing….uhhh
GiGi: Nothing what?
Kaitlyn: Uh…..umm…......nevermind…
GiGi: Alright, just if you ever do want some of this stuff let me know, you gotta take advantage of your top patron exclusive reward of receiving one individual piece of clothing from me!
As GiGi says this, we then hear the door into where they are get kicked down, as through the rubble, emerges Stephen Romero, Kaitlyn looks defensive and ready to scrap, as GiGi initially panics.
Romero: Hey! All that is my damn clothes!
In her panic, GiGi grabs the oversized denim jacket, and tosses it at Romero’s face as a distraction! Before GiGi bails out the room before anything can escalate! Kaitlyn still looks primed to defend, but GiGi forcefully grabs her anyway, pulling her away from the scene all the same.As Romero the takes his denim jaket he got thrown back in, he smiles that it still fits, and puts in on, striking a pose to his crowd in his chat.
Romero: Well…..I lost several hundreds of dollars and cool pieces of clothing because of that……...but at least this denim jacket is still sick though!
Romero then strikes more poses for the fans, as we gradually fade out on the scene.
We come back to the ring, where we see Javier standing in the middle of the ring, ready to announce.
Javier: The following is a tag team match, set for one fall, with a 30 minute time limit! Introducing first-
The Fall III by Doping Hornets comes through the speakers, as we see Mercenaire and Marshall Wheeler both come out from behind the curtain. Both disregarding the audience, as they stride to the ring with confidence.
Javier: From Houston, Texas, and A Dark, Dark Place respectively, weighing in at a combined 480 pounds, Marshall Wheeler, Mercenaire, Coup d’Etat!
Crowd: BOOOOOOOOOOOOOOOOOOOO!
Woodbridge: Being announced from Houston and A Dark Place as separate things? Ain’t those the same thing?
Paisner: Mark!
Woodbridge: Sorry, had to take the opportunity when I had it. Digressing from that, we’ve got one hell of a tag match coming up! As we got two men who are talented and angry, one hell of a deadly combination if i’ve ever seen it. Feeling overlooked, they have a chance to channel that anger into their biggest tag challenge yet in SPECIALIST. They’ve proven they can take care of those they should absolutely beat, now lets see how they fare against those where it’s more of a 50/50.
Wheeler and Mercenaire continue to stoically march their way down to the ring, paying to mind to the jeers tossed their way, as they both reach the ring apron, and step through the ropes in sync with one another, before the two take a spot at the end of the ring, looking out to the entranceway, awaiting their opponents.
The Anomoly by Scar Symmetry blasts heavy riffs throughout the venue, as we see Presagio Del Fin and Nelson Butterfly out on the entranceway. Clinging onto one another, a look of determination on their face.
Javier: And introducing next, from Parts Unknown, weighing in at a combined 437 pounds, Presagio Del Fin, Nelson Butterfly, S.P.E.C.I.A.L.I.S.T.!
Crowd: YAYYYYYYYYYYYYYY!
Paisner: Now, two very strange men coming down to the ring, the traditional pair of SPECIALIST representing it tonight, and despite their unorthodox in-ring methods, there’s very few others who have as much chemistry and knowledge of each other inside and out as SPECIALIST do. And that unorthodox style? Might be exploitable, but if you don’t know that exploit, you get torn apart by it. And inexperienced wrestlers like Mercenaire and Wheeler may be prime for not knowing, this could be a huge win for SPECIALIST here tonight!
Butterfly and Presagio make their way down to the ring with their arms linked together, interacting with the fans, handing out hand slaps as they walk down the entranceway. They begin to practice their respective underhooks and pins to make sure they’re warmed up, before finishing their way to the ring, as they step into it. We see both Coup d’Etat and SPECIALIST talk amongst one another, as we see Mercenaire and Presagio step onto the aprons. While Wheeler and Nelson stay in the ring, Undersach signaling to see if they’re all ready, and getting nods from everyone, rings the bell!
DING DING DING
As the match starts, Wheeler and Nelson slowly approach each other, they lock up, as Wheeler then goes to slip behind Nelson right after! Grabbing Nelson’s head, pulling it back, and driving a european uppercut into the back of Nelson’s head! Nelson holding at the back of his head, before Wheeler shoots a forearm shot into the back of Nelson’s head! Sending Nelson stumbling forward, as Wheeler then runs the ropes, and comes back to attempt an enzu lariat to the back of Nelson’s head, but Nelson drops down! Fitting in between Wheeler’s legs, as Wheeler stops himself after a moment, and turns around to Nelson who had gotten back to his feet, who grabs Wheeler in a double underhook! Wheeler tries to struggle out, but Nelson lifts his knee up into Wheeler’s face! Doing it multiple times until he has Wheeler sufficiently harmed, where upon which, Nelson tosses Wheeler back across the ring with a butterfly suplex! Wheeler landing hard on his back, gritting his teeth in pain!
Crowd: WOOOOOOOOOOOOOOOO!
Paisner: Wheeler trying to quickly strike Nelson down, but Nelson dropping down, then quickly into offense through his patented double underhook!
Wheeler then begins to push himself up, sitting up, then getting onto his hands and knees to try and make his way to his feet, but Nelson swoops in quickly, nails an elbow to the top of Wheeler’s head, and hooks Wheeler’s arms to bring Wheeler up on his own terms. Nelson takes Wheeler over to his tag corner, shooting a look at Presagio to cue him to tag himself in. Presagio sets himself up near Nelson, as Nelson tosses Wheeler up into the air with the set up for a double underhook powerbomb, but instead of following through with it himself, Presagio instead comes in as the one to catch and add his own force to slam Wheeler down to the mat with the assisted tiger bomb! Presagio sitting down with it!
Crowd: OHHHHHHHHHHHHHHHHHHH!
Paisner: Nelson combining well his double underhook and tag team mastery! And of course Presagio keeps the sit-out for a pin!
1! No! Kickout from Wheeler!
Wheeler kicks out with a bit of force, rolling onto his stomach as he does, as Presagio gets up, sizes up Wheeler as Wheeler begins to push himself to his feet, and runs towards the ropes! Jumping onto and bouncing up off of them as he reaches them, and launching himself back at the now to his feet Wheeler with a springboard hurricanrana! Keeping it for the rana pin!
Crowd: WOOOOOOOOOOO!
1!
2! No! Kickout right at 2 from Wheeler!
The force from Wheeler’s kickout pushes Presagio off of Wheeler, Presagio flung outwards as the two have their backs to one another. Both of them attempt to rise to their feet, but Presagio as the healthier man is a good deal faster, and with that, hooks Wheeler from behind him, gets back-to-back to him, and goes down into a backslide pin on Wheeler!
1!
2! No! Kickout from Wheeler again!
As we get another kickout from Wheeler, both men go to scramble to their feet, and as Wheeler rises, Presagio responds with a knee to the gut to double him over, and keep him in place! Following up by going to the ropes, and jumping off for another springboard! This time going for a springboard crossbody, as he connects with Wheeler! But suddenly, Wheeler rolls through the momentum of the crossbody! Coming out of it with Presagio in his grasp, holding Presagio in front of him! Wheeler then lifts Presagio, and goes to toss Presagio over his head, but Presagio shifts his momentum in mid-air and lands on his feet!
Crowd: WOOOOOOOOOOOOOOOOOOOOOOAAAAAAAAAHHHHHHHHHHH!
Paisner: Presagio nearly reversed, but he finds his own way of escape! Directly countering the counter!
And as Presagio lands on his feet, he grabs Wheeler from behind and goes to roll him back into an o’connor roll!.....but Wheeler once again moves his own momentum through! Going into his own o’connor roll!....but he still does not stop! Continuing to follow through by going to lift Presagio up in a rolling german suplex! Lifting Presagio up halfway, but Presagio desperately struggles! Kicking his feet and swinging his arms, until he lands enough wild strikes to force Wheeler to let him go! Wheeler backs off a bit, as Presagio takes a moment to catch his breath and recover, before beginning to run towards the ropes!.......but not before Wheeler recovers himself, and comes forward to spin around, and connect with a spinning back elbow to the back of Presagio’s head! The impact and suddenness of the strike knocking Presagio flat to the mat!
Crowd: OHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH!
Paisner: BY GOD! THE SPINNING ELBOW TO THE BACK OF THE CRANIUM! COMPLETELY DEVASTATING PRESAGIO!
Presagio is completely laid out, as Wheeler bends his knees for a moment in order to catch himself, before grabbing the limp body of Presagio, and dragging it over to his tag corner, where upon which he lifts Presagio’s body and tosses it into said corner, and tags in Mercenaire. Wheeler then lifts his leg up high, and presses it up against Presagio’s neck to both keep him in place and choke him out!
Crowd: BOOOOOOOOO!
As he does this, Mercenaire enters the ring, and backs up to about the center of the ring, before rushing towards the corner, and just as Wheeler releases his foot choke and moves out the way, Mercenaire connects with a big boot in the corner to the head of Presagio! Knocking him back down limp to the mat!
Crowd: OHHHHHHHHHHHHHHHHHH!
Presagio is completely out on the mat, as Merc stands over him, leans down to grab him, then tosses him right back in the corner where he begins to lay in body punches to the stomach of Presagio! Doubling Presagio over in the corner, as Merc then lays in pointed elbows to the back of Presagio’s neck! Raining down elbow after elbow on Presagio, forcing him lower and lower down in the corner, until he’s dropped to a seated position. Upon which Merc just puts his boot on Presagio’s face, and rubs it in!
Crowd: BOOOOOOOOOOOOOOOOOO!
Woodbridge: Mercenaire just absolutely relentless right now! No mercy nor respect given!
Undersach begins to count off Mercenaire, and gets all the way to the 4 count before Merc removes his boot and finally relents!
Crowd: BOOOOOOOOOOOOOOOOOOO!
submitted by youto2 to wrestlingisreddit [link] [comments]

Best Binary Options Strategy 2020 - 2 Min Strategy Live ... How I Made $950 In Profits In 1 Hour Trading Binary ... Make 10 usd Every 50 Seconds Trading Binary Options 100% ... 1 Hour Binary Options Strategy Binary options Free strategy that works - from 100 to ... Binary Options 1 Hour Strategy SIMPLE 1 HOUR TRADING TRADING SYSTEM - YouTube Binary options trading strategy  4000$ for 1 hour - YouTube Best Binary Options Strategy For Beginners 2020 🤑 1 Hour ... 60 Seconds binary options strategy 99 - 100% Winning (100% ...

For a more accurate calculation you can use Binary Options Martingale Calculator. 0 - not used martingale. 1 deal. 1 - 1 deal + 1 martingale step, total result with 2 deals. 2 - 1 deal + 2 martingale step, total result with 3 deals, etc. Time_Start - test start hour. Time_End - test end hour. Step_arrow - indentation of arrows from candles. Access free binary options signals with a consistent 72%+ success rate and join over 20,000 members currently profiting from binary options. Get the signals needed to supplement your binary options trading strategy. No software required! Binary Options Signals are provided to traders to notify them when a new trading opportunity is available. My signals are extremely easy to follow and only ... You have binary trading strategy and want to start trading? In this detailed review we examine Cherry Trade(a binary broker) in detail to highlight the good and the bad. Brief Cherry … Read more Binary broker Cherry Trade detail report. Gold Options rock as Gold Prices Soar. May 7, 2016 May 4, 2016 by Fabian R. Gold is usually considered quite a safe commodity to invest in and the new prices ... One Minute Profit Signal Indicator is intended for trading on the M1 timeframe with expiration of 1 minute (60 seconds). Accurate signals - quick profit. The author guarantees ITM 85% with high volatility and the absence of a market sideways time. The next scalping strategy format for electronic options is designed to work with contracts that have the minimum expiration period of 1 minute. Here, trend indicators are also used with subtle settings parameters, allowing for the formation of two types of trading signals for turbo contracts. In this way, we will achieve high cyclicity of our technical signals and increase profit ... GBP/USD showed us a strong bullish candle for the previous hour giving us signs of a Sell opportunity for the next hour. Our plan was to go short and set and forget until expiration time of 8:00am ET. We won and that's all we have been doing all week is win win win! 5. 0. Win #5 Today Binary Options - #nadex #binaryoptions . EURUSD, 60. Long. BinarySignals. EURUSD short term for the given time ... 207# 1 min scalping Binary Options Strategy. 208# Binary Holy Grail Strategy 209# HB Binary Strategy. 210# Forex MTN with Support and Resistance. 211# RSI with MA signal Binary System. 212# Channel Regression with PPO. 213# Guppy MA with Supply and Demand Index. 214# ADX Crossing with BB-alert strategy. 215# Magnum Scalping V.3. 216# Pin Bar ... Binary Options Strategy: 60 min Bollineger Bands and Momentum. 60 min Binary Options Strategy High-low: Bollinger Bands and Momentum. This is a volatility momentum&nbsp; 60 min Binary Options Strategy&nbsp; : this Binary Options Strategy is based on Momentum indicator and Bollinger Bands volatility indicator. “game plan” for executing the strategy. Most of the strategies in this book is divided into three sections: The Game Plan An introduction to Forex. The individual strategy for trading Forex is then thoroughly explained along with illustrations and examples. The Movie Once you have read the chapter, you can view the complete webinar on the strategy. You will gain a better understanding of ... Related Content. Utilizing the Moving Averages with Binary Options 31.01.2018; Options trading strategy for MA and RSI 20.12.2017 "Flip": A Strategy For Quick Trading 12.01.2018; The "Baedeker" effective options trading system 13.02.2018; Binary trading strategy - why do you need it? 29.11.2017 The "Double EMA" trading strategy 26.12.2017; A trading strategy using the MA ALMA 23.03.2018

[index] [8940] [22226] [18690] [22172] [27913] [20656] [26793] [15448] [22646] [27234]

Best Binary Options Strategy 2020 - 2 Min Strategy Live ...

Best Binary Options Brokers for this Strategy: 1. 💲💹IQ Option FREE DEMO: http://www.cryptobinarylivingway.com/IQOption1 2. 💲💹Pocket Option FREE DEMO: http Hello everyone!:)My name is Anastasia, but it's too hard to pronounce, that's why you may call me just ANA. I'm a pro trader for more than 2 years already and t... 60 Seconds binary options strategy 99 - 100% Winning (100% profit guaranteed) 90 - 95% Winning Binary Options Strategy in case of correct prediction - 1 to 5... IMPORTANT UPDATE we have dropped latest stable and working strategy on 4th November 2018 check and watch below https://www.youtube.com/watch?v=DH1vM4Ygt2w&fe... Learn our 1 hour binary options strategy using PSAR breakouts, brought to you by Investoo.com. Join Investoo.com today and learn to trade in more than video lessons and trading courses. 1 hour binary options,30 minutes binary options strategy 76 - 95% Winning (100% profit guaranteed ) - Duration: 37:43. Forex & BinaryOptions Teacha 17,193 views 37:43 All about Trading in Forex and Binary Option Marked. SIMPLE 1 HOUR TRADING TRADING SYSTEM ----- Subscribe! https://YouTube.com/sasanfx1 🔔 Click... Close Option: https://tinyurl.com/closeoption Strategy In Detail Part 2: https://youtu.be/rhoYUOzAmbU Minimum deposit of $5 to start real trading. Free Demo ... https://binaryoptionsbeat.com/ Contact me at: [email protected] Here I try to explain How to grow your deposit fast in few days and earn money from b... 👉 https://happywallet.club/millionaire 👈 Become a Millionaire with Bitcoin. binary option strategy 2020 - 100% winning strategy iq option strategy 2020 ...

http://arab-binary-option.tioflotconcward.cf