3 of The Top 60 Second Binary Option Trading Strategies ...

RESULTS of the State of the Game Survey: September 2020

Hi all,

It’s time for the results!

Thank you to everyone who took the time to respond - we had over 1,750 responses, which is great! These insights wouldn’t be possible without your time and support.

As always, neither myself nor this survey are associated with Intelligent Systems or Nintendo in any way. Please direct feedback about the game itself to the official channels.

Now let’s get into it!
 
Previous Survey Results:
April_2020_State_of_the_Game_Survey

~ Demographics ~

53.8% began playing FE:H in February 2017, with 20.0% more joining during the first year of the game. 12.0% of respondents joined during the second year, 8.7% joined during the third, and 4.0% joined during the fourth year (the last ~7 months).

The age range breakdown of respondents is as follows:

75.8% of respondents identified as Male, 18.4% as Female, and 3.0% as Non-binary.

24.6% of respondents have never missed a daily login, while a further 38.8% have missed less than a month’s worth of logins, 11.7% missed 1-2 months, 9.9% missed 3-6 months, 5.8% missed 7-12 months, and 4.7% missed over a year’s worth.

33.5% report being F2P, while 28.7% have spent less than $100, 18.3% spent between $100 - $499, 7.3% spent between $500 - $999, and 8.7% have spent over $1000.

46.6% last spent money on FE:H during the fourth year of the game (the last 3 months), while 6.6% last spent money during the third year of the game, 5.8% last spent during the second year of the game, and 5.1% last spent money during the first year of the game.

~ Summoning ~

“Which of the following banners have you used orbs on at least once?”
  • (86.8%) A New Future (CYL 4)
  • (60.2%) Overseas Memories (3H Summer)
  • (59.8%) Dark Burdens (Fallen Heroes)
  • (57.9%) Legendary Heroes: Edelgard
  • (55.2%) Legendary Heroes: Corrin
  • (53.1%) Book IV Mid: Mirabilis and More
  • (52.9%) Hero Fest
  • (52.2%) Pirate’s Pride
  • (44.5%) Mythic Heroes: Hel
  • (44.2%) Mythic Heroes: Mila
  • (43.7%) Bridal Beloveds
  • (39.6%) Summer Passing (Sacred Stones Summer (mostly))
  • (37.5%) Legendary Heroes: Seliph
  • (31.1%) Light and Shadow (New Mystery)

“Which of the following banners did you use the most orbs on?”
  • (44.8%) A New Future (CYL 4)
  • (8.6%) Overseas Memories (3H Summer)
  • (5.9%) Legendary Heroes: Corrin
  • (5.8%) Dark Burdens (Fallen Heroes)
  • (5.5%) Pirate’s Pride
  • (4.9%) Legendary Heroes: Edelgard
  • (4.5%) Hero Fest
  • (3.5%) Mythic Heroes: Hel
  • (3.0%) Bridal Beloveds
  • (2.8%) Book IV Mid: Mirabilis and More
  • (2.5%) Summer Passing (Sacred Stones Summer (mostly))
  • (2.5%) Legendary Heroes: Seliph
  • (2.3%) Mythic Heroes: Mila
  • (1.7%) Light and Shadow (New Mystery)

“What was your favorite banner?”
  • (37.4%) A New Future (CYL 4)
  • (10.9%) Dark Burdens (Fallen Heroes)
  • (8.9%) Pirate’s Pride
  • (8.5%) Overseas Memories (3H Summer)
  • (5.7%) Hero Fest
  • (5.4%) Legendary Heroes: Corrin
  • (3.3%) Legendary Heroes: Edelgard
  • (2.9%) Legendary Heroes: Seliph
  • (2.6%) Book IV Mid: Mirabilis and More
  • (2.6%) Bridal Beloveds
  • (2.5%) Summer Passing (Sacred Stones Summer (mostly))
  • (2.3%) Light and Shadow (New Mystery)
  • (1.5%) Mythic Heroes: Hel
  • (1.4%) Mythic Heroes: Mila

“Did you spend money specifically to summon on any of the banners below?”
  • (17.6%) A New Future (CYL 4)
  • (10.3%) Overseas Memories (3H Summer)
  • (8.9%) Legendary Heroes: Corrin
  • (6.8%) Dark Burdens (Fallen Heroes)
  • (6.6%) Pirate’s Pride
  • (6.5%) Legendary Heroes: Edelgard
  • (5.8%) Hero Fest
  • (5.1%) Bridal Beloveds
  • (4.9%) Mythic Heroes: Hel
  • (4.8%) Book IV Mid: Mirabilis and More
  • (4.8%) Mythic Heroes: Mila
  • (4.8%) Summer Passing (Sacred Stones Summer (mostly))
  • (3.4%) Light and Shadow (New Mystery)
  • (3.3%) Legendary Heroes: Seliph

~ Summoning Mechanics ~

33.7% spent orbs on the Hero Fest banner AFTER Intelligent Systems announced how they would be compensating players for the Hero Fest banner glitch, compared to 61.7% who did not.

30.5% say that knowing about the compensation for the Hero Fest banner glitch caused them to spend more orbs on the banner than they would have otherwise, compared to 41.5% who say it did not. 28.0% did not spend orbs on the Hero Fest banner.

34.3% feel positively or very positively about the quality of 4* focuses on regular banners, compared to 26.9% who feel negatively or very negatively.

69.7% feel positively or very positively about the quality of 4* focuses on seasonal banners, compared to 7.8% who feel negatively or very negatively.

53.8% report that the system guaranteeing a free 5* after 40 summons generally makes them summon more, while 5.4% report that it generally makes them summon less and 36.1% report no change in their summoning habits on New Heroes banners.

“If all New Heroes Banners used the permanent 40-summons-for-a-guaranteed-5* system that CYL4 used, how would your orb-spending habits on New Heroes banners change?”
  • (1.8%) I would spend fewer orbs than I did before
  • (22.3%) I would spend the same amount of orbs I usually do
  • (10.3%) I would spend more orbs than I did before
  • (62.2%) My spending would depend more on the Heroes offered

~ Choose Your Legends IV ~

“Which CYL4 Brave Heroes have you summoned, whether from the guaranteed choice banner or the regular banner?”
  • (78.0%) Dimitri
  • (73.4%) Claude
  • (65.7%) Edelgard
  • (56.6%) Lysithea

Of the summoning milestones on the CYL4 banner:
  • (20.2%) did not reach any of these summoning milestones
  • (79.7%) reached 40 summons
  • (41.0%) reached 80 summons
  • (19.8%) reached 120 summons
  • (11.1%) reached 160 summons

45.7% say that the free 5* hero at 40, 80, 120 and 160 summons caused them to spend more on CYL4 than they would have otherwise, while 50.3% say it did not.

22.8% say that the potential use of a new Brave Hero in future F2P Guides for content such as Hero Battles influenced their Brave Heroes summons, compared to 74.0% who say it did not.

“If you could only get ONE of the new Brave Heroes, which one would you choose?”
  • (36.8%) Dimitri
  • (28.9%) Edelgard
  • (22.9%) Claude
  • (7.8%) Lysithea

“Which Brave Hero do you believe is the overall strongest?”
  • (60.7%) Edelgard
  • (21.9%) Dimitri
  • (7.9%) Claude
  • (1.2%) Lysithea

“Which Brave Hero do you believe is the overall weakest?”
  • (61.2%) Lysithea
  • (13.7%) Claude
  • (7.0%) Dimitri
  • (1.7%) Edelgard

“Which Brave Hero do you believe has the best art?”
  • (32.9%) Claude
  • (27.3%) Dimitri
  • (20.1%) Lysithea
  • (13.3%) Edelgard

“Which set of Brave Heroes is your favorite overall?”
  • (24.2%) 1st CYL (Ike, Lucina, Lyn, Roy)
  • (19.4%) 2nd CYL (Ephraim, Celica, Hector, Veronica)
  • (11.2%) 3rd CYL (Alm, Camilla, Eliwood, Micaiah)
  • (39.9%) 4th CYL (Claude, Dimitri, Edelgard, Lysithea)

23.6% feel positively or very positively about the addition of Jorge as the CYL4 GHB hero, compared to 33.0% who feel negatively or very negatively.

86.3% believe CYL5 should add further protections against vote botting, compared to 4.4% who do not.

70.1% believe CYL5 should require Nintendo Account sign-in to vote, compared to 12.6% who do not.

~ Feh Pass and Resplendent Heroes ~

41.2% feel negatively about the addition of the Feh Pass (down 15.8% from the last survey), compared to 11.6% who feel positively (up 1.5% from the last survey). 46.1% are neutral (up 14.3% from the last survey).

40.2% have purchased the Feh Pass, compared to 59.8% who have not. This is a 9.5% increase compared to the last survey, following a 6.7% increase before that.

Of those who have subscribed to Feh Pass, 17.4% have purchased Resplendent Heroes separately (up 12.9% from the last survey), compared to 82.6% who have not.

“Which Resplendent Hero has your favorite art?”
  • (13.4%) Cordelia
  • (12.8%) Eliwood
  • (8.7%) Eirika
  • (8.4%) Olwen
  • (7.5%) Sophia
  • (7.3%) Minerva
  • (6.0%) Azura
  • (5.7%) Lyn
  • (5.2%) Ike
  • (4.1%) Sanaki
  • (4.0%) Roy
  • (3.7%) M!Robin
  • (2.3%) Hector
  • (1.6%) Linde
  • (1.3%) Alm

“Which Resplendent outfit theme is your favorite?”
  • (16.3%) Muspell
  • (15.0%) Askr
  • (14.8%) Nifl
  • (11.5%) Embla
  • (11.5%) Hel
  • (10.3%) Ljosalfheimr

~ Miscellaneous ~

15.8% feel positively about the introduction of Harmonized Heroes, compared to 31.3% who feel negatively.

29.5% have a Harmonized Hero, compared to 70.1% who do not.

14.6% feel positively or very positively about the Resonant Battles game mode, compared to 51.5% who feel negatively or very negatively.

4.6% say that the Resonant Battles game mode influenced them to pull for Harmonized Heroes, compared to 94.5% who say it has not.

34.8% believe the new Arena maps are better than the maps they replaced, while 7.4% believe they are worse, and 36.7% believe they are about the same.

“How often do you use Auto Dispatch in Aether Raids?”
  • (34.3%) All of them, always
  • (0.2%) All of them, in Light Season
  • (3.6%) All of them, in Astra season
  • (24.3%) Only sometimes
  • (37.6%) I never use it

“IV Mango” is the preferred term for Trait Fruit according to 32.2% of respondents, followed by “IVcado” at 28.9%, “Fruit” at 7.6%, and “Dragonfruit” at 6.6%. The remaining 24.7% prefer to just call them Trait Fruit.

39.3% say they will use their first Trait Fruits on a Heroic Grails unit, while 32.9% say they will use them on a Summonable unit, and 1.3% say they will use them on an Askr unit.

58.7% prefer Stat Boosts for Legendary Heroes, compared to 26.3% who prefer Pair-Up.

56.5% generally prefer Regular Duo Heroes, compared to 8.8% who prefer Harmonized Duo Heroes.

1.8% say that the update that raised the minimum hardware/software required to play the game affected their ability to play FE:H, compared to 95.8% who say it did not.

~ Recurring Miscellaneous ~

“Which game do you want a New Heroes banner from the most?”
  • (26.0%) Three Houses (-1.9%)
  • (9.7%) Radiant Dawn (+0.5%)
  • (7.7%) Sacred Stones (+0.2%)
  • (7.5%) Awakening (-3.1%)
  • (6.4%) Genealogy of the Holy War (-1.3%)
  • (6.1%) Path of Radiance (-0.9%)
  • (6.0%) Gaiden / Shadows of Valentia (+2.7%)
  • (5.9%) TMS #FE (+1.9%)
  • (5.4%) Blazing Blade (+1.3%)
  • (5.0%) Fates (+1.0%)
  • (4.2%) Thracia 776 (+0.8%)
  • (2.4%) Binding Blade (+0.6%)
  • (0.8%) Shadow Dragon and the Blade of Light / Shadow Dragon (-1.0%)
  • (0.8%) Mystery of the Emblem / New Mystery of the Emblem (-1.1%)

“How much do you care about your rank in the following modes?”
  • (2.90/5.00 average) Arena
  • (2.82/5.00 average) Aether Raids
  • (2.48/5.00 average) PvE game modes with player ranking boards
  • (1.82/5.00 average) Arena Assault

“How have recent changes to FE:H changed your opinion on the game as a whole?”
  • (39.3%) My opinion was positive and has stayed positive
  • (5.7%) My opinion used to be negative, but has turned positive
  • (40.1%) Neutral
  • (9.9%) My opinion used to be positive, but has turned negative
  • (5.1%) My opinion was negative and has stayed negative

~ Intelligent Systems Approval Ratings ~

The approval ratings are calculated by the proportion of Approve responses compared to the number of both Approve and Disapprove responses.

Percent who approve of the way Intelligent Systems is handling:
  • 74.6% - The addition of new heroes / characters to the game (+11.9)
  • 69.4% - The gacha mechanics and summoning banners (+5.5)
  • 59.2% - The story/plot (+9.4)
  • 85.2% - Unranked PvE game modes (Hero Battles, Forging Bonds, Tactics Drills, Lost Lore, Hall of Forms) (-1.2)
  • 50.7% - Ranked PvE game modes (Voting Gauntlets, Tempest Trials, Grand Conquest, Allegiance Battles, Rokkr Sieges, Mjolnir's Strike) (-2.6)
  • 34.6% - Arena (-6.2)
  • 48.0% - Arena Assault (+6.7)
  • 45.8% - Aether Raids (+12.7)

40.5% believe Intelligent Systems cares about its Free to Play userbase (up 10.1% from the last survey), while 34.7% do not. This continues the upward trend from the previous survey, bringing us to 8.8% down from where we were before the February drop).

42.9% approve of the way Intelligent Systems is handling Fire Emblem: Heroes as a whole (up 14.8% from the last survey), while 16.9% disapprove. This continues the upward trend from the previous survey, bringing us to only 2.5% down from where we were before the February drop).

A NOTE ABOUT METHODOLOGY: The overall approval ratings question above has traditionally been the exact percent of Approve responses, as a proportion with both Neutral and Disapprove responses. Note that this is different than the way approval is calculated for individual modes (the proportion of Approve responses compared to the number of both Approve and Disapprove responses), where Neutral responses are excluded. The difference in calculation has continued this way in order to maintain comparability with previous survey results.
For comparisons sake, the overall approval rating trend going by raw Approval percentage over the last 4 surveys is: 50.6% (Dec) -> 22.9% (Feb) -> 28.1% (Apr) -> 42.9% (Sept)
Whereas the overall approval rating trend going by proportion of Approve/Disapprove with the Neutrals excluded over the last 4 surveys is: 82.2% (Dec) -> 41.0% (Feb) -> 51.3% (Apr) -> 71.7% (Sept).

~ Bonus Questions ~

“Who is your Favorite Hero added since the last survey?”
  • Dimitri (Brave) is the winner, followed by Edelgard (Brave), then Claude (Brave).
  • Full results here: [Graph]

“Who is your Most Wanted Hero added since the last survey?”
  • Tibarn (Pirate) is the winner, followed by Corrin (F, Legendary), then Micaiah (Duo, Bridal).
  • Full results here: [Graph].

“What would be the best Harmonized Hero (a pair of two heroes from different games) and why?”:

Rather than selecting a subset of responses this time, the link below is to a google sheet of almost all unique responses. I cleaned it up a little bit to remove “idk” type answers, duplicates, and partial string duplicates, so don’t worry if you don’t see your exact response in it.

[Full Responses].

~ Feedback ~

As always, I received lots of great feedback, both in your survey responses and in the thread itself. A heartfelt thank you to all participants for your encouragements and criticisms - these surveys wouldn’t be where they are without your feedback. But it’s not all serious; feedback messages also included:

  • #FloofMomGang #GiveLeoAGoodFuckingAltForOnce #NowiRefineWhen #TelliusNewHeroesPlz #ElinciaResplendentWhen #JusticeForDedue #PleaseRemoveLChromInstysIAmBeggingYouICantLiveLikeThisAnymore
  • “There once was a CYL4 banner / That hit my orbs hard like a hammer / The very next day / FloomMom Duo came our way / Now I'm stuck bartering with a loan planner”
  • bonk, go to survey jail”
  • “Am I also allowed to put in "Norne and Azura" for a Harmonized Hero pair? No reason.”
  • “Brace yourself. Winter (armours) are coming!” “Brave Hector's refine has made me so very happy with it's inclusion. Go shove your bow up your butt Legendary Chrom.”
  • “Give me villager alts or give me death”
  • “I expect the next survey to come with +12 to attack, null follow up, and special cooldown reduction.”
  • “The true best Harmonized Hero would be Azura and Roy since it would make me uninstall the game and never want to play a gacha ever again”
  • “My headcanon for the dream storyline is that the evil fairies have the Summoner off picking up pebbles that look like orbs. Fredrickson would be proud.”
  • “Where's the most wanted unit to add to the game question so I can shout my want for Seteth into the void?”
  • “I no longer dab, for Legendary Seliph has finally appeared.”
  • And greetings from Argentina, the Bahamas, Brazil, Chile, Colombia, Finland, Germany, Greece, Hong Kong, Ireland, Russia, South Korea, Sweden, the UK, Vietnam, the Pacific Northwest, Alaska, Toronto, and St. Louis, as well as from many fictional locations!
And some personal/meta comments:
  • “Any chance we end up seeing another Super Serious Survey in the not-so-distant future?” -> I could not believe it’s been over a year since the last one! We’ll have to do one soon!
  • “Feels like the end of an era, not having to count all my five stars” -> I know, right? I may have it return in a side survey for the most hardcore of respondents at some point, since some people are asking about it and it would be good to get data on it every once in a while.
  • “I was looking through your Nornes skills and saw you haven't given her live for bounty yet! It's the best skill for her, what are you doing!?” -> I am a fraud :( I have given her Live for Honor though :P
  • “What do you hope for in FEH?” -> Norne alt, Resplendent Jaffar, and Shamir
  • Multiple people mentioned that they had returned after a long break and were surprised to see Norne instead of Azura! Welcome back!
  • I also missed a bunch of other possible Trait Fruit nicknames, which I knew would inevitably happen. Sorry!

Note: Please don’t ask me to feature your feedback comment; it’s the only guaranteed way to not have your comment added!

Finally, the suggestion to have separate options for serious vs non-serious feedback was a good idea, I’ll try that out on the next survey!

~ Closing Remarks ~

If you missed out on responding to this survey when it was available, consider subscribing to FEHSurveys. This subreddit serves as a place to organize FE:H-related surveys, make new releases more visible, and make it easier for users to see when surveys are active.

Thanks again to everyone who participated! I hope you find the results interesting, and if there’s anything else you think can be discovered from the data, let me know and I’ll do my best to oblige!
 
 
Weekly/Important Megathreads:
Weekly Discussion Megathread
Tempest Trials+: Dancing Affinity Megathread
Forging Bonds: Beyond Blood Rebout Megathread
Limited Hero Battles Megathread
submitted by ShiningSolarSword to FireEmblemHeroes [link] [comments]

How to prevent customer cancellations

Customer retention is a goal every business owner should be obsessed with. At the end of the day it's cheaper to retain an existing customer than it is to acquire a new one.
But how do you ensure that your customers keep using your service?
Are there any simple, yet effective ways to reduce or even prevent churn?
As it turns out there's one simple strategy you can use to keep your customers around even if they're about to leave your platform. Let's explore what it is and why it works.

Why you should obsess over customer retention

As already stated in the introduction it's important to focus on customer retention when building a sustainable business.
Acquiring customers can be an expensive endeavour. If you're not (yet) in a position where your product grows through Word-of-Mouth you're likely spending a good portion of your revenue on paid ads and marketing to drive traffic to your service. Only a few of your thousands of visitors will eventually try your product and convert to become a paying customer.
Optimizing this marketing and sales funnel is a tricky and costly activity. Think about it for a minute. Who finances your learnings and tweakings of such funnel? Correct, your existing customers.
That's why keeping your users happy and around is one of the most important business objectives.

Why customers are churning

If you think about it, there's really only one reason why your customers are leaving your platform:
Your product isn't a crucial part of their life anymore
While this sounds harsh I'd like you to think about all the services you're currently subscribing to. Now imagine that you can only keep one. What would you cancel? Probably everything except the one you can't live without.
Of course, the preferences are different from person to person and they change over time. And that's the exact reason why people cancel their subscription with your service: Their preferences have changed and they might want to take a pause from your service or need something else entirely.

"Churn Baby Churn"

Now that we know why your customers churn, it's time to get into their shoes and think about ways to keep them around.
One of the "industry" standards is to send out a survey once they're about to leave to gather feedback and convince them to stay. Some services offer coupon codes if for example the user has clicked on the "it's too expensive" option in the survey.
Other tactics are more on the "dark patterns" side of things. Hiding buttons, asking double negative questions or using other techniques to make it nearly impossible to leave. Needless to say that customers of businesses practicing such tactics aren't the ones who spread the word on how awesome the product is. Quite the opposite.
But let's take a step back for a minute and ask ourselves why this "should I stay or should I go" question has to be binary in the first place. Isn't there something "right in the middle"? Something where a user can stay but somehow go at the same time?

"Wait a minute... or a month..."

The solution to this dilemma is dead simple and obvious, yet rarely used: Make it possible to pause the subscription.
Yes, it's that simple. Just offer a way to pause a subscription and get back to it once your users current circumstances have changed.
Now you might think that it's a really bad idea to let users pause their subscription. They'll pause and never come back. So essentially it's a "passive churn" as they haven't left the platform yet but might never use it again. The stale user data is sitting in the database and your dashboards are still showing hockey-stick growth. Furthermore it's a huge implementation effort as pausing and resuming subscriptions isn't something considered business critical and hence wasn't implemented just yet.
Those are all valid concerns and some of them might turn out to be true even if you have a "pause- and resume your subscription" system in place. But let's take a seconds to look at the other side of the equation.

Why pausing is a good idea

They very first thing that comes to mind is the COVID-19 pandemic we're currently in. A lot of business scaled back and hence had to cancel subscriptions to their favorite SaaS tools to cut costs. A common "save the customer tactic" used here was to get in touch with the business owner and offer heavy discounted year long subscription plans. That way businesses could reassess if they should really quit and leave the huge discount on the table or just go with it and double down to benefit from the sweet, discounted multi-year subscription deal.
Letting business put their subscription on hold would be another strategy that could be used to help retain and eventually reactivate your users during this pandemic. Put yourself into your customers shoes again for a minute. Wouldn't you want to pay it back in the future if your supplier lent you a helping hand and wasn't "forcing" you out the door?
Even if your customers pause their account you still have their E-Mail address to reach out to them and keep them informed about your product. In fact you should use this opportunity to stay in touch, ask them how they're doing and providing something of value along the way. That way you keep the communication "warm" and your business stays on "their radar". There's a higher likelihood that they think about your service when times have changed and they're about to scale things up again.
Having a way to pause a subscription is an action that's usually taken with some level of consideration. If your customer wants to quit (s)he'll just cancel the subscription anyway. Offering a way to pause for the time-being is another option your users might just not have right now, so they're forced to make a very binary decision and therefore they just quit.
What you should also think about is that pausing a subscription doesn't necessarily mean that you'll lose revenue for sure. There are different and very creative ways in which you can implement the pause. My gym for example simply extends my membership for the amount of months I put my membership on hold. In the summer I make use of this feature since I do my workouts outside anyways. However those 3-4 months I "save" are simply "added" to my contract. I just have a little bit more control about how and where I spend my time with sports. You can get really creative here and invent other ways for this mechanism to work if you really want to ensure that you don't lose revenue.
A last, important point is that you can use this functionality as a competitive advantage and "marketing material". Be sure to add the fact that people can pause their subscription to your list of product benefits. Add it to the copy right next to your "Subscribe Now" button. Addressing objections and concerns right before the call-to-action is about to happen will drastically increase your conversion rates.

Things to keep in mind when going down that path

Now you might be excited and eager to implement this strategy in the near future but before you do so I'd like to call out a couple of things you should keep in mind when implementing it.
First of all: Keep it simple. There's no need to jump right into code and implement this functionality end-to-end. Do it manually in the beginning. Update the database records and the subscription plans for people who want to pause their subscription by hand. Maybe you find out that very few people want to make use of this feature. What you definitely want to put in place is your new copywriting. As discussed above you should ensure that your marketing website is updated and reflects the recent change you just introduced.
Next up you want to have an automated follow-up E-Mail sequence / Drip campaign setup for pausing customers. Keep in touch. Ask for problems they had with your software and help them succeed in whatever they're up to right now. You might want to jump on a quick call to gather some feedback as to why they paused and understand what needs to be in place for them to come back. If you do this, please ensure that you're genuinely interested in the communication. There's nothing worse for a user than composing a reply and shooting the E-Mail into the marketing void.
A very important, yet often overlooked step is to have a tool in place which deals with "passive churn". Such a system ensures that the credit cards on file are up to date and chargeable. There could be an overlap between your users pausing their subscription and their credit cards expiring. You don't want to make them look bad because of that. You could even think about a "concierge service" which onboards them in person once they'll come back. Combine this with a quick update on all the new features / updates they missed and are not yet familiar with.
Lastly you absolutely don't want to make it hard for your users to pause their subscription. As mentioned above, avoid dark patterns at all costs. And more importantly: Don't penalize them for pausing. Messages such as "We'll retain your data for the next 60 days" are inappropriate in the day and age of "Big Data" and access to Petabytes of storage for a nickel and dime.

Your challenge

I'd like to challenge you to think about adding the possibility to pause a subscription. Is it suitable for your business? Would it help you retain and reactive more customers (especially in the current situation we're in)?
If you're about to add it, keep in mind that it doesn't have to be complicated. Start with a simple E-Mail form your users can fill out to let you know for how long they want to pause. Just make sure that you follow the best practices outlined above and that you advertise that it's now possible for your customers to pause their subscriptions.

Conclusion

Customer retention is one of the most important metrics every business owner should focus on. It's the existing customers who finance the Customer Acquisition Costs that are necessary to bring new users into the door.
It's almost always cheaper to keep your existing customers happy than to lose them and acquire brand new ones.
Unfortunately a lot of SaaS services only offer a very binary option for their subscription plans. As a user you're either in or you're out. You stay or you leave. But what if a user wants to take a pause for a few months because of current changes in life circumstances?
Offering a way to pause a subscription is a simple, yet effective way to retain and eventually reactive your existing customers. Remember that a pause is temporary. If you follow-up with them on a continuous basis and help them succeed they'll eventually come back. Maybe even as a raving, more loyal fan of your brand.
I hope that you enjoyed this article and I'd love to invite you to subscribe to my Newsletter if you're interested in more, action-oriented posts like this.
Do you have any questions, feedback or comments? Feel free to reach out via E-Mail or connect with me on Twitter.
This post was originally published on philippmuens.com
submitted by pmuens to indiebiz [link] [comments]

OMR Sheet

OPTICAL MARK READER SHEET (OMR SHEET) is a technically designed sheet which is used in objective type examinations or any other data which has multiple choice options to be filled by the applicant. It is designed with circles/ovals and rectangles. The circles/ovals are generally in Pink/Magenta and Orange Colour. The rectangles are in black colour.
The OMR sheets are scanned through specific OMR Scanners which are provided by various companies like Scantron, DRS, Sekonic, etc. There are some image or OCR scanners which also scan these OMR Sheet with images of the sheet. But the main issue is how to capture data from image scanners? For that there are softwares like eXtractPro which converts OCR data to OMR but the time taken to convert data takes lot of time so it is advisable to scan the OMR Sheets with OMR scanners only. These OMR scanners are designed technically with header to read the responses filled in OMR sheets. The headers can be ink or pencil head with accuracy of OMR Sheets. The ink head has facility to scan responses filled with pencil and pen both whereas, pencil headers have facility to scan responses filled with pencil only. The accuracy is 99.99% on the OMR Scanners.
The picking of response depends on the threshold value i.e. the intensity of filling the responses in OMR Sheet. If a person just put a dot(.) or a tick (a) on the sheet the response may not be picked. The bubbles should be dark and filled so that the circles/ovals in the completely. If a person fills more than two responses in one field the data will be read as * (multiple responses).
Design of OMR Sheet - There are specific dimensions of designing OMR Sheet with 0.05 mm precision on scale. If the dimensions are not up to the precision scale the accuracy of OMR sheet may vary. So it is advisable that the sheet should be designed and printed with perfection and the cutting of the sheet should be perfect .
Software to design OMR Sheet – Architects and builders use Autocad Software for designing designs and architecture, the same software, Autocad is used in designed OMR Sheet which has full and accurate dimensions. Corel Draw is designing software which is used after final designing is done in Autocad to get the better look with colour and print to file features of OMR Sheet.
Types of OMR Sheet
  1. Single Part – Sheets are printed on 105 gsm to 120 gsm paper on A4/Legal sheet.
    1. Double Part (Carbonless) – Two Sheets are printed one 105 gsm paper and one on 60-70 gsm paper on A4 sheet . The bottom of first sheet and the top of second sheet is chemically treated so that the impression of the first sheet should come on the second sheet.
  2. Three Part (Carbonless) – Three Sheets are printed one 105 gsm paper and other two on 60-70 gsm paper on A4 sheet . The bottom of first sheet, the top and bottom of second sheet and the top of third sheet is chemically treated so that the impression of the first sheet should come on the second and third sheets.
Security Features in OMR Sheet
  1. Bar Code – Unique Code is printed on the sheets so that no tampering of sheets can be done
  2. UV Printing – Watermark or any other text or logo printed on the sheet which cannot be seen by the naked eye.
  3. Litho Code - Unique Code is printed on the sheets in the form of binary coding so that no tampering of sheets can be done.
How is Scanning done and how can get the result/output of OMR sheets – Scanning is done by OMR scanners specifically designed for OMR Sheets. The reading of data is done through the header fitted in the OMR scanners to read the marks filled by pen/pencil. Only Blue/Black Ball Pont Pen should be used to get the proper and accurate responses if filled by correct method. The sheets are kept in a bunch of 200-250 in the input hopper of the scanner and then scanned through Scan tools software or any other software with the facility of printing of scan numbers on the sheet to identify the sheet for future reference.
The sheets are scanned in .dat format and then is converted into .dbf format and then through programming further processing, result or output are done.
What measures should to be taken to fill OMR Sheet
a) There are timing marks or skunk marks on the side and four IDs on the top and bottom of OMR Sheet through which data is captured through OMR Scanners. These should not be tampered at any cost otherwise sheet while scanning can be rejected.
b) The barcodes or litho codes should not be tampered at any cost because that may give error while scanning of barcodes and litho codes.
c) The sheets before and after the examination should be packed nicely in tamper proof poly packs or envelopes so that they are not torn or mutilated to get error free result or output.
INSTRUCTIONS TO FILL OMR SHEET
1. Use Black or Blue Ball Point Pen only. Please avoid using gel pens, fountain pens and any other colour pens.
2. Unless specified don’t use pencils and if asked then only use HB Pencil.
3. Darken the bubbles completely. A tick mark, a dot of half filled bubbles will not be read and scanned. As shown below :
4. Never use white fluid or cutting for rectifying errors as they may disrupt the scanning and evaluation process.
5. Do not fold the OMR Sheet.
6. Do not any stay marks on the OMR sheet.
7. Multiple marking are invalid they may result in rejection.
Where are these sheets used.
(a) In Competitive Exams, generally all written examinations whether held for recruitment or for any Entrance Examination.
(b) For taking surveys some organisation used OMR Sheet.
(c) For Application Forms, Attendance Sheets.
(d) University Cover Page are mainly of OMR Sheet which has three to four parts where candidate write their basic details in one part, Paper Checker in other part and remaining parts are attached with the Answer Booklet with security features.
submitted by Potential_Lettuce_18 to u/Potential_Lettuce_18 [link] [comments]

ResultsFileName = 0×0 empty char array Why? Where are my results?

Edit: Turns out I was missing a needed toolbox.
Hello,
I am not getting any errors and I do not understand why I am not getting any output. I am trying to batch process a large number of ecg signals. Below is my code and the two relevant functions. Any help greatly appreciated. I am very new.
d = importSections("Dx_sections.csv"); % set the number of recordings n = height(d); % settings HRVparams = InitializeHRVparams('test_physionet') for ii = 1:n % Import waveform (ECG) [record, signals] = read_edf(strcat(d.PID(ii), '/baseline.edf')); myecg = record.ECG; Ann = []; [HRVout, ResultsFileName] = Main_HRV_Analysis(myecg,'','ECGWaveform',HRVparams) end function [HRVout, ResultsFileName ] = Main_HRV_Analysis(InputSig,t,InputFormat,HRVparams,subID,ann,sqi,varargin) % ====== HRV Toolbox for PhysioNet Cardiovascular Signal Toolbox ========= % % Main_HRV_Analysis(InputSig,t,InputFormat,HRVparams,subID,ann,sqi,varargin) % OVERVIEW: % % INPUT: % InputSig - Vector containing RR intervals data (in seconds) % or ECG/PPG waveform % t - Time indices of the rr interval data (seconds) or % leave empty for ECG/PPG input % InputFormat - String that specifiy if the input vector is: % 'RRIntervals' for RR interval data % 'ECGWaveform' for ECG waveform % 'PPGWaveform' for PPG signal % HRVparams - struct of settings for hrv_toolbox analysis that can % be obtained using InitializeHRVparams.m function % HRVparams = InitializeHRVparams(); % % % OPTIONAL INPUTS: % subID - (optional) string to identify current subject % ann - (optional) annotations of the RR data at each point % indicating the type of the beat % sqi - (optional) Signal Quality Index; Requires a % matrix with at least two columns. Column 1 % should be timestamps of each sqi measure, and % Column 2 should be SQI on a scale from 0 to 1. % Use InputSig, Type pairs for additional signals such as ABP % or PPG signal. The input signal must be a vector containing % signal waveform and the Type: 'ABP' and\or 'PPG'. % % OUTPUS: % results - HRV time and frequency domain metrics as well % as AC and DC, SDANN and SDNNi % ResultsFileName - Name of the file containing the results % % NOTE: before running this script review and modifiy the parameters % in "initialize_HRVparams.m" file accordingly with the specific % of the new project (see the readme.txt file for further details) % EXAMPLES % - rr interval input % Main_HRV_Analysis(RR,t,'RRIntervals',HRVparams) % - ECG wavefrom input % Main_HRV_Analysis(ECGsig,t,'ECGWavefrom',HRVparams,'101') % - ECG waveform and also ABP and PPG waveforms % Main_HRV_Analysis(ECGsig,t,'ECGWaveform',HRVparams,[],[],[], abpSig, % 'ABP', ppgSig, 'PPG') % % DEPENDENCIES & LIBRARIES: % HRV Toolbox for PhysioNet Cardiovascular Signal Toolbox % https://github.com/cliffordlab/PhysioNet-Cardiovascular-Signal-Toolbox % % REFERENCE: % Vest et al. "An Open Source Benchmarked HRV Toolbox for Cardiovascular % Waveform and Interval Analysis" Physiological Measurement (In Press), 2018. % % REPO: % https://github.com/cliffordlab/PhysioNet-Cardiovascular-Signal-Toolbox % ORIGINAL SOURCE AND AUTHORS: % This script written by Giulia Da Poian % Dependent scripts written by various authors % (see functions for details) % COPYRIGHT (C) 2018 % LICENSE: % This software is offered freely and without warranty under % the GNU (v3 or later) public license. See license file for % more information %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% if nargin < 4 error('Wrong number of input arguments') end if nargin < 5 subID = '0000'; end if nargin < 6 ann = []; end if nargin < 7 sqi = []; end if length(varargin) == 1 || length(varargin) == 3 error('Incomplete Signal-Type pair') elseif length(varargin) == 2 extraSigType = varargin(2); extraSig = varargin{1}; elseif length(varargin) == 4 extraSigType = [varargin(2) varargin(4)]; extraSig = [varargin{1} varargin{3}]; end if isa(subID,'cell'); subID = string(subID); end % Control on signal length if (strcmp(InputFormat, 'ECGWaveform') && length(InputSig)/HRVparams.Fs< HRVparams.windowlength) ... || (strcmp(InputFormat, 'PPGWaveform') && length(InputSig)/HRVparams.Fs 300 s VLF = [0.0033 .04]; % Requires at least 300 s window LF = [.04 .15]; % Requires at least 25 s window HF = [0.15 0.4]; % Requires at least 7 s window HRVparams.freq.limits = [ULF; VLF; LF; HF]; HRVparams.freq.zero_mean = 1; % Default: 1, Option for subtracting the mean from the input data HRVparams.freq.method = 'lomb'; % Default: 'lomb' % Options: 'lomb', 'burg', 'fft', 'welch' HRVparams.freq.plot_on = 0; % The following settings are for debugging spectral analysis methods HRVparams.freq.debug_sine = 0; % Default: 0, Adds sine wave to tachogram for debugging HRVparams.freq.debug_freq = 0.15; % Default: 0.15 HRVparams.freq.debug_weight = .03; % Default: 0.03 % Lomb: HRVparams.freq.normalize_lomb = 0; % Default: 0 % 1 = Normalizes Lomb Periodogram, % 0 = Doesn't normalize % Burg: (not recommended) HRVparams.freq.burg_poles = 15; % Default: 15, Number of coefficients % for spectral estimation using the Burg % method (not recommended) % The following settings are only used when the user specifies spectral % estimation methods that use resampling : 'welch','fft', 'burg' HRVparams.freq.resampling_freq = 7; % Default: 7, Hz HRVparams.freq.resample_interp_method = 'cub'; % Default: 'cub' % 'cub' = cublic spline method % 'lin' = linear spline method HRVparams.freq.resampled_burg_poles = 100; % Default: 100 %% 11. SDANN and SDNNI Analysis Settings HRVparams.sd.on = 1; % Default: 1, SD analysis 1=On or 0=Off HRVparams.sd.segmentlength = 300; % Default: 300, windows length in seconds %% 12. PRSA Analysis Settings HRVparams.prsa.on = 1; % Default: 1, PRSA Analysis 1=On or 0=Off HRVparams.prsa.win_length = 30; % Default: 30, The length of the PRSA signal % before and after the anchor points % (the resulting PRSA has length 2*L) HRVparams.prsa.thresh_per = 20; % Default: 20%, Percent difference that one beat can % differ from the next in the prsa code HRVparams.prsa.plot_results = 0; % Default: 0 HRVparams.prsa.scale = 2; % Default: 2, scale parameter for wavelet analysis (to compute AC and DC) %% 13. Peak Detection Settings % The following settings are for jqrs.m HRVparams.PeakDetect.REF_PERIOD = 0.250; % Default: 0.25 (should be 0.15 for FECG), refractory period in sec between two R-peaks HRVparams.PeakDetect.THRES = .6; % Default: 0.6, Energy threshold of the detector HRVparams.PeakDetect.fid_vec = []; % Default: [], If some subsegments should not be used for finding the optimal % threshold of the P&T then input the indices of the corresponding points here HRVparams.PeakDetect.SIGN_FORCE = []; % Default: [], Force sign of peaks (positive value/negative value) HRVparams.PeakDetect.debug = 0; % Default: 0 HRVparams.PeakDetect.ecgType = 'MECG'; % Default : MECG, options (adult MECG) or featl ECG (fECG) HRVparams.PeakDetect.windows = 15; % Befautl: 15,(in seconds) size of the window onto which to perform QRS detection %% 14. Entropy Settings % Multiscale Entropy HRVparams.MSE.on = 1; % Default: 1, MSE Analysis 1=On or 0=Off HRVparams.MSE.windowlength = []; % Default: [], windows size in seconds, default perform MSE on the entire signal HRVparams.MSE.increment = []; % Default: [], window increment HRVparams.MSE.RadiusOfSimilarity = 0.15; % Default: 0.15, Radius of similarity (% of std) HRVparams.MSE.patternLength = 2; % Default: 2, pattern length HRVparams.MSE.maxCoarseGrainings = 20; % Default: 20, Maximum number of coarse-grainings % SampEn an ApEn HRVparams.Entropy.on = 1; % Default: 1, MSE Analysis 1=On or 0=Off HRVparams.Entropy.RadiusOfSimilarity = 0.15; % Default: 0.15, Radius of similarity (% of std) HRVparams.Entropy.patternLength = 2; % Default: 2, pattern length %% 15. DFA Settings HRVparams.DFA.on = 1; % Default: 1, DFA Analysis 1=On or 0=Off HRVparams.DFA.windowlength = []; % Default [], windows size in seconds, default perform DFA on the entair signal HRVparams.DFA.increment = []; % Default: [], window increment HRVparams.DFA.minBoxSize = 4 ; % Default: 4, Smallest box width HRVparams.DFA.maxBoxSize = []; % Largest box width (default in DFA code: signal length/4) HRVparams.DFA.midBoxSize = 16; % Medium time scale box width (default in DFA code: 16) %% 16. Poincaré plot HRVparams.poincare.on = 1; % Default: 1, Poincare Analysis 1=On or 0=Off %% 17. Heart Rate Turbulence (HRT) - Settings HRVparams.HRT.on = 1; % Default: 1, HRT Analysis 1=On or 0=Off HRVparams.HRT.BeatsBefore = 2; % Default: 2, # of beats before PVC HRVparams.HRT.BeatsAfter = 16; % Default: 16, # of beats after PVC and CP HRVparams.HRT.GraphOn = 0; % Default: 0, do not plot HRVparams.HRT.windowlength = 24; % Default 24h, windows size in hours HRVparams.HRT.increment = 24; % Default 24h, sliding window increment in hours HRVparams.HRT.filterMethod = 'mean5before'; % Default mean5before, HRT filtering option %% 18. Output Settings HRVparams.gen_figs = 0; % Generate figures HRVparams.save_figs = 0; % Save generated figures if HRVparams.save_figs == 1 HRVparams.gen_figs = 1; end % Format settings for HRV Outputs HRVparams.output.format = 'csv'; % 'csv' - creates csv file for output % 'mat' - creates .mat file for output HRVparams.output.separate = 0; % Default : 1 = separate files for each subject % 0 = all results in one file HRVparams.output.num_win = []; % Specify number of lowest hr windows returned % leave blank if all windows should be returned % Format settings for annotations generated HRVparams.output.ann_format = 'binary'; % 'binary' = binary annotation file generated % 'csv' = ASCII CSV file generated end 
submitted by MisuzBrisby to matlab [link] [comments]

How to prevent customer cancellations

Customer retention is a goal every business owner should be obsessed with. At the end of the day it's cheaper to retain an existing customer than it is to acquire a new one.
But how do you ensure that your customers keep using your service?
Are there any simple, yet effective ways to reduce or even prevent churn?
As it turns out there's one simple strategy you can use to keep your customers around even if they're about to leave your platform. Let's explore what it is and why it works.

Why you should obsess over customer retention

As already stated in the introduction it's important to focus on customer retention when building a sustainable business.
Acquiring customers can be an expensive endeavour. If you're not (yet) in a position where your product grows through Word-of-Mouth you're likely spending a good portion of your revenue on paid ads and marketing to drive traffic to your service. Only a few of your thousands of visitors will eventually try your product and convert to become a paying customer.
Optimizing this marketing and sales funnel is a tricky and costly activity. Think about it for a minute. Who finances your learnings and tweakings of such funnel? Correct, your existing customers.
That's why keeping your users happy and around is one of the most important business objectives.

Why customers are churning

If you think about it, there's really only one reason why your customers are leaving your platform:
Your product isn't a crucial part of their life anymore
While this sounds harsh I'd like you to think about all the services you're currently subscribing to. Now imagine that you can only keep one. What would you cancel? Probably everything except the one you can't live without.
Of course, the preferences are different from person to person and they change over time. And that's the exact reason why people cancel their subscription with your service: Their preferences have changed and they might want to take a pause from your service or need something else entirely.

"Churn Baby Churn"

Now that we know why your customers churn, it's time to get into their shoes and think about ways to keep them around.
One of the "industry" standards is to send out a survey once they're about to leave to gather feedback and convince them to stay. Some services offer coupon codes if for example the user has clicked on the "it's too expensive" option in the survey.
Other tactics are more on the "dark patterns" side of things. Hiding buttons, asking double negative questions or using other techniques to make it nearly impossible to leave. Needless to say that customers of businesses practicing such tactics aren't the ones who spread the word on how awesome the product is. Quite the opposite.
But let's take a step back for a minute and ask ourselves why this "should I stay or should I go" question has to be binary in the first place. Isn't there something "right in the middle"? Something where a user can stay but somehow go at the same time?

"Wait a minute... or a month..."

The solution to this dilemma is dead simple and obvious, yet rarely used: Make it possible to pause the subscription.
Yes, it's that simple. Just offer a way to pause a subscription and get back to it once your users current circumstances have changed.
Now you might think that it's a really bad idea to let users pause their subscription. They'll pause and never come back. So essentially it's a "passive churn" as they haven't left the platform yet but might never use it again. The stale user data is sitting in the database and your dashboards are still showing hockey-stick growth. Furthermore it's a huge implementation effort as pausing and resuming subscriptions isn't something considered business critical and hence wasn't implemented just yet.
Those are all valid concerns and some of them might turn out to be true even if you have a "pause- and resume your subscription" system in place. But let's take a seconds to look at the other side of the equation.

Why pausing is a good idea

They very first thing that comes to mind is the COVID-19 pandemic we're currently in. A lot of business scaled back and hence had to cancel subscriptions to their favorite SaaS tools to cut costs. A common "save the customer tactic" used here was to get in touch with the business owner and offer heavy discounted year long subscription plans. That way businesses could reassess if they should really quit and leave the huge discount on the table or just go with it and double down to benefit from the sweet, discounted multi-year subscription deal.
Letting business put their subscription on hold would be another strategy that could be used to help retain and eventually reactivate your users during this pandemic. Put yourself into your customers shoes again for a minute. Wouldn't you want to pay it back in the future if your supplier lent you a helping hand and wasn't "forcing" you out the door?
Even if your customers pause their account you still have their E-Mail address to reach out to them and keep them informed about your product. In fact you should use this opportunity to stay in touch, ask them how they're doing and providing something of value along the way. That way you keep the communication "warm" and your business stays on "their radar". There's a higher likelihood that they think about your service when times have changed and they're about to scale things up again.
Having a way to pause a subscription is an action that's usually taken with some level of consideration. If your customer wants to quit (s)he'll just cancel the subscription anyway. Offering a way to pause for the time-being is another option your users might just not have right now, so they're forced to make a very binary decision and therefore they just quit.
What you should also think about is that pausing a subscription doesn't necessarily mean that you'll lose revenue for sure. There are different and very creative ways in which you can implement the pause. My gym for example simply extends my membership for the amount of months I put my membership on hold. In the summer I make use of this feature since I do my workouts outside anyways. However those 3-4 months I "save" are simply "added" to my contract. I just have a little bit more control about how and where I spend my time with sports. You can get really creative here and invent other ways for this mechanism to work if you really want to ensure that you don't lose revenue.
A last, important point is that you can use this functionality as a competitive advantage and "marketing material". Be sure to add the fact that people can pause their subscription to your list of product benefits. Add it to the copy right next to your "Subscribe Now" button. Addressing objections and concerns right before the call-to-action is about to happen will drastically increase your conversion rates.

Things to keep in mind when going down that path

Now you might be excited and eager to implement this strategy in the near future but before you do so I'd like to call out a couple of things you should keep in mind when implementing it.
First of all: Keep it simple. There's no need to jump right into code and implement this functionality end-to-end. Do it manually in the beginning. Update the database records and the subscription plans for people who want to pause their subscription by hand. Maybe you find out that very few people want to make use of this feature. What you definitely want to put in place is your new copywriting. As discussed above you should ensure that your marketing website is updated and reflects the recent change you just introduced.
Next up you want to have an automated follow-up E-Mail sequence / Drip campaign setup for pausing customers. Keep in touch. Ask for problems they had with your software and help them succeed in whatever they're up to right now. You might want to jump on a quick call to gather some feedback as to why they paused and understand what needs to be in place for them to come back. If you do this, please ensure that you're genuinely interested in the communication. There's nothing worse for a user than composing a reply and shooting the E-Mail into the marketing void.
A very important, yet often overlooked step is to have a tool in place which deals with "passive churn". Such a system ensures that the credit cards on file are up to date and chargeable. There could be an overlap between your users pausing their subscription and their credit cards expiring. You don't want to make them look bad because of that. You could even think about a "concierge service" which onboards them in person once they'll come back. Combine this with a quick update on all the new features / updates they missed and are not yet familiar with.
Lastly you absolutely don't want to make it hard for your users to pause their subscription. As mentioned above, avoid dark patterns at all costs. And more importantly: Don't penalize them for pausing. Messages such as "We'll retain your data for the next 60 days" are inappropriate in the day and age of "Big Data" and access to Petabytes of storage for a nickel and dime.

Your challenge

I'd like to challenge you to think about adding the possibility to pause a subscription. Is it suitable for your business? Would it help you retain and reactive more customers (especially in the current situation we're in)?
If you're about to add it, keep in mind that it doesn't have to be complicated. Start with a simple E-Mail form your users can fill out to let you know for how long they want to pause. Just make sure that you follow the best practices outlined above and that you advertise that it's now possible for your customers to pause their subscriptions.

Conclusion

Customer retention is one of the most important metrics every business owner should focus on. It's the existing customers who finance the Customer Acquisition Costs that are necessary to bring new users into the door.
It's almost always cheaper to keep your existing customers happy than to lose them and acquire brand new ones.
Unfortunately a lot of SaaS services only offer a very binary option for their subscription plans. As a user you're either in or you're out. You stay or you leave. But what if a user wants to take a pause for a few months because of current changes in life circumstances?
Offering a way to pause a subscription is a simple, yet effective way to retain and eventually reactive your existing customers. Remember that a pause is temporary. If you follow-up with them on a continuous basis and help them succeed they'll eventually come back. Maybe even as a raving, more loyal fan of your brand.
I hope that you enjoyed this article and I'd love to invite you to subscribe to my Newsletter if you're interested in more, action-oriented posts like this.
Do you have any questions, feedback or comments? Feel free to reach out via E-Mail or connect with me on Twitter.
This post was originally published on philippmuens.com
submitted by pmuens to Entrepreneurship [link] [comments]

MAME 0.222

MAME 0.222

MAME 0.222, the product of our May/June development cycle, is ready today, and it’s a very exciting release. There are lots of bug fixes, including some long-standing issues with classics like Bosconian and Gaplus, and missing pan/zoom effects in games on Seta hardware. Two more Nintendo LCD games are supported: the Panorama Screen version of Popeye, and the two-player Donkey Kong 3 Micro Vs. System. New versions of supported games include a review copy of DonPachi that allows the game to be paused for photography, and a version of the adult Qix game Gals Panic for the Taiwanese market.
Other advancements on the arcade side include audio circuitry emulation for 280-ZZZAP, and protection microcontroller emulation for Kick and Run and Captain Silver.
The GRiD Compass series were possibly the first rugged computers in the clamshell form factor, possibly best known for their use on NASA space shuttle missions in the 1980s. The initial model, the Compass 1101, is now usable in MAME. There are lots of improvements to the Tandy Color Computer drivers in this release, with better cartridge support being a theme. Acorn BBC series drivers now support Solidisk file system ROMs. Writing to IMD floppy images (popular for CP/M computers) is now supported, and a critical bug affecting writes to HFE disk images has been fixed. Software list additions include a collection of CDs for the SGI MIPS workstations.
There are several updates to Apple II emulation this month, including support for several accelerators, a new IWM floppy controller core, and support for using two memory cards simultaneously on the CFFA2. As usual, we’ve added the latest original software dumps and clean cracks to the software lists, including lots of educational titles.
Finally, the memory system has been optimised, yielding performance improvements in all emulated systems, you no longer need to avoid non-ASCII characters in paths when using the chdman tool, and jedutil supports more devices.
There were too many HyperScan RFID cards added to the software list to itemise them all here. You can read about all the updates in the whatsnew.txt file, or get the source and 64-bit Windows binary packages from the download page.

MAME Testers Bugs Fixed

New working machines

New working clones

Machines promoted to working

Clones promoted to working

New machines marked as NOT_WORKING

New clones marked as NOT_WORKING

New working software list additions

Software list items promoted to working

New NOT_WORKING software list additions

submitted by cuavas to emulation [link] [comments]

Games playable on Intel HD4400 (and how to get them running) in 2020

I used to be a "LoFi Gamer".
It wasn't ideal BUT I managed to play thru tonnes of modern games thanks to a bit of research and elbow grease. The obvious choice was to eventually upgrade, which I did and I am relieved to have my new set up. HOWEVER these things take time, and you don' t need to miss out whilst you're saving your pennies up!!
The games listed below are my complete list of titles that I managed to run successfully, between 30 - 60 frames per second and I think it's pretty amazing I was running games released in 2020 from a beat up old Dell laptop that cost me under £300 4 years ago.
Hopefully this guide will help some people out there who, like me, were chomping at the bit to get a powerful setup but didn't want to miss out on some great gaming experiences in the meantime.

My laptop specs were: Intel HD4400 // Intel Core i5 // Win 10 // 8G Ram

Additionally I installed:
- Intel Extreme Tuning Utility (overclocking tool, Google / Youtube for user guides, very easy)
- SpeedFan (fan control application, because your laptop will be as hot as a toaster otherwise)
- NVIDIA 3D Vision Driver 353.62
- NVIDIA Graphics Driver 353.62
- NVIDIA HD Audio Driver 1.3.34.3
- NVIDIA nView 146.33
- NVIDIA PhysX System Software 9.18.0907
- NVIDIA Control Panel

I also recommend:
- Updating DirectX and Intel graphics card drivers
- Setting Windows 10 to "Game Mode"
- Optimising the "Visual Effects Settings" by selecting the "Adjust for Best Performance" option
- Using a "High Performance Power Plan"
- Playing the games with the laptop battery removed, taking power only from the mains
- Tweaking each games, in-game graphic settings individually to find the right balance between looks and performance
If you need help or advice about anything listed above, a quick Google search using the search terms I have provided you with, will give you all the insight you need. It is all available freeware and easy peasy to get hold of, especially as you now know exactly what to search for and download.

For the best results, it's essential you get/do everything on the list and it's probably worth mentioning that the overclocking and fan control software needs to be running before you launch a game (duh).
It also goes without saying that you WILL NOT BE RUNNING ANY GAMES AT MAX SETTINGS. We're prioritising frames per second over everything else here.

And so, without further ado...

THE LIST (A-Z + year of release)
- Alien Isolation (2014)
- American Fugitive (2019)
- Aragami (2016)
- Arrest of a stone Buddah (2020)
- Assassins Creed Black Flag (2014)
- Assassins Creed Chronicles (China, India and Russia) (2015)
- Assasins Creed Rogue (2014)
- Axiom Verge (2015)
- Bayonetta (2009)
- BELOW (2018)
- Bendy and the Ink Machine (2017)
- Betrayer (2014)
- Binary Domain (2012)
- Blasphemous (2019)
- Blazblue: Calamity Trigger (2008)
- Bully: Scholarship Edition (2006)
- Carrion (2020)
- Catherine Classic (2011)
- Cloudpunk (2020)
- Condemned: Criminal Origins (2006)
- Cuphead (2017)
- D4: Dark Dreams Don't Die (2014)
- Darkwood (2017)
- DEADBOLT (2016)
- Dead Cells (2017)
- Deadly Premonition: The Directors Cut (2013)
- Death to Spies (2007)
- Desperados III (2020)
- Deus EX: Human Revolution Directors Cut (2011)
- Deus Ex: Breach (2017)
- Disco Elysium (2019)
- DOOM 3 (2004)
- DOOM (2016)
- Don't Starve (2013)
- Don't Starve Together (2016)
- The Dream Machine (2012)
- Dust: An Elysian Tail (2013)
- Enter the Gungeon (2016)
- The Flame In The Flood (2016)
- The friends of Ringo Ishikawa (2018)
- Furi (2016)
- The Guild 2: renaissance (2010)
- Grand Theft Auto V (2013)
- GRIP: Combat Racing (2016)
- Gunfire Reborn (2020, still in Early Access)
- Hades (2020, still in Early Access)
- High Hell (2017)
- Hob (2017)
- Hollow Knight (2017)
- The Hong Kong Massacre (2019)
- Hotline Miami ( I+II) (2012 // 2015)
- How To Survive 2 (2016)
- Hyper Light Drifter (2016)
- INSIDE (2016)
- Ion Fury (2019)
- Just Cause 2 (+ JC2MP) (2013)
- Just Cause 3 (2015)
- Just Shapes & Beats (2018)
- KATANA KAMI: A Way of the Samurai Story (2020)
- Katana Kata (2020, still in Early Access)
- Katana ZERO (2019)
- Kenshi (2018)
- Killer Is Dead: Nightmare Edition (2014)
- killer7 (2018)
- L.A. Noire (2011)
- Lucius (I+II) (2012 // 2015)
- Lucius Demake (2016)
- Mad Max (2015)
- Mafia II (Classic) (2012)
- Mark of the Ninja (2016)
- MAXIMUM Action (2020, still in Early Access)
- Max Payne 3 (2012)
- The Messenger (2018)
- Metal Gear Rising: Revengeance (2014)
- Metal Gear Solid V: Ground Zeroes (2014)
- Metal Gear Solid V: The Phantom Pain (2015)
- Mother Russia Bleeds (2016)
- Omensight: Definitive Edition (2018)
- Ori and the Blind Forest: Definitive Edition (2016)
- Ori and the Will of the Wisps (2020)
- Pathologic 2 (2019)
- Pathologic Classic HD (2015)
- Persona 4 Golden (2020)
- POSTAL 2 (2003)
- Project Warlock (2018)
- Rain World (2017)
- Redeemer: Enhanced Edition (2017)
- Rim World (2018)
- Risk of Rain (2013)
- Risk of Rain 2 (2020)
- Ryse: Son of Rome (2014)
- Saints Row 2 (2009)
- Saints Row The Third (2011)
- Saints Row IV (2014)
- Saints Row: Gat out of Hell (2015)
- Salt and Sanctuary (2016)
- Samurai Shodown V Special (2019)
- Shadow Tactics: Blades of the Shogun (2016)
- Shadow Warrior (2013)
- Shadow Warrior 2 (?2016)
- Shenmue I & II (2018)
- Sleeping Dogs Definitive Edition (2014)
- State Of Mind (2018)
- Street Fighter 4 (2008)
- Street Fighter X Tekken (2012)
- Streets of Rage 4 (2020)
- Streets of Rogue (2019)
- Strider (2014)
- Subterrain (2016)
- Sunless Sea (2015)
- Sunless Skies (2019)
- SUPERHOT (2016)
- SUPERHOT: MIND CONTROL DELETE (2020)
- SYNTHETIK (2018)
- The Takeover (2019)
- TEKKEN 7 (201
- Thief (2014)
- Thief Deadly Shadows (2004)
- This War of Mine (2014)
- Thumper (2016)
- Transistor (2014)
- Travis Strikes Again: No More Heroes (2019)
- Ultrakill (2020)
- Unforgiving - A Northern Hymn (2017)
- Valfaris (2019)
- Way Of The Samurai 4 (2015)
- West of Dead (2020)
- The Witcher 2 (2011)
- Wonder Boy: The Dragon's Trap (2017)
- XCOM 2 (2016)
- Yakuza 0 (2017)
- Yakuza Kiwami (2019)

Happy gaming!
My advice is to buy these games during a Steam sale, alongside a Logitech F310 controller and enjoy the hours of entertainment ahead of you. With even more trial and error, you could add loads of games to this list too. Don't forget the Steam refund policy works in your favour to see if you can get a game running on your setup :)

*One last (boring) thing\*
This is abusing your laptop and in reality asking it to do something it wasn't built to. Be aware that you could shorten its lifespan through the constant demands of gaming and the potential risk from over-heating caused by regular gaming sessions for hours at a time is a real one.
Your plan should be to upgrade in the future... But until then I'd say treat your laptop like an emulator!!

- Aggressive Chicken
submitted by Aggressive_Chicken_ to u/Aggressive_Chicken_ [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 .
zturner@ubuntu:~/src/sandbox$ cat instr.cpp int main() {} zturner@ubuntu:~/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.
zturner@ubuntu:~/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]

60 Second Binary Options Strategy and Software - How Can ... Binary Options Trading Software - Learn How To Profit In 60 Seconds 60 Second Trading Preview - New Binary Options Software 2014 For 60 Second Trading 60 Second Binary Options Trading Strategy! Awesome Update Trading System 60 Seconds Binary Options Strategy 2016 - Best Binary Options Strategy And Software 2016 60 Second Binary Options Strategy and Software - Make 2,3K ... binary options 60 seconds software - YouTube

ADX EMA 60 Seconds Strategy for Binary Options. By. Comparic Team - tweet; 60 Seconds Strategy – Quick and effective trading . I am well aware that many of you expect the fastest possible results and real profits from transactions on Binary Options. So I prepared a brief description of a strategy, which I find not only very effective, but also simple to use. It is based on the combination of ... 60-second binary options are for traders that want to be very active in the market and see results fast. Since these options expire in one minute you can potentially do hundreds of trades a day. Like traditional binary options, if you believe an asset will be higher than the current price 60 seconds from now you’ll buy a call option. If believe an asset will be lower than the current price ... And you should take 60-second trade. This indicator is a double confirmation setting and this only works on the mt4 platform. You can use any broker trading for binary options, for example, Deriv. We are using this indicator for a 1-minute change and 60-second expiries of each trade. If you like you can also test other time frames. 60 seconds binary options strategy 2014 A losing money which allows developers or what brokers offer binary options with mt4 a little different margin and took a specific things easier to rise. The move down to questions, i would destabilize the mass sale. As bitcoin through mobile using our primary way the trade outcomes. Although it shows ... 60 Seconds Binary Options System Indicator. A very simple to use binary options trading indicator. It’s designed to trade 60 seconds buy CALL/buy PUT binary options with 60 seconds expiry time. Green dots indicate to open a buy CALL option with 60 seconds expiry time. Red dots indicate to open a buy PUT option with 60 seconds expiry time. 60 second binary options strategies I jumped out of my regular pattern of trading 15-minute expiries in the 5-minute graph in favor of “60-second” binary choices.. For starters, I simply felt like breaking up things somewhat for my own pleasure 60 seconds binary option strategy.I understand that lots of dealers are into this fast-paced choice, as it is currently provided by many overseas ... Our team at Trading Strategy Guides is ready to share with our beloved trading community our 60-second binary options strategy. We don’t just hope this strategy will make you money, we're certain it will. The mathematical model behind this binary options trading strategy has a proven market edge. The only tool you need to trade binary options successfully is the RSI indicator. Even the RSI ... This means that 60 second binary option trading is best suited for numerous trend trading strategies. Trends with strong momentum are likely to remain that way in the really short term. Drawbacks of 60 Second trading. Although one can make a lot of money in the short term with 60 second options, they can also lose a lot of money. Binary Options ... Binary Options Trading Signals & Franco Live Trades. While this trading signal service is not specifically for the 60 second options, Franco does indeed trade the fast binary options we all love to hate. The way it works is that you get a live share of his screen and you can see him make the trade. Here is a pretty good youtube video explaining ... 60-Second Binary Options are like standard binary alternatives in addition to the very fact that the selection expires right after sixty seconds. There may be an established capped degree of payout, generally something all-around 70%. The reduction is capped with the volume you paid to buy the option. Some brokers give another early-expiring option at the same time, including the just one that ...

[index] [25161] [15256] [23152] [11173] [16894] [28115] [12891] [26502] [20068] [20876]

60 Second Binary Options Strategy and Software - How Can ...

60 Second Trading Preview Ice9 Technology System Review - Ice 9 Technology Trading System Review Ice9Technology https://www.youtube.com/watch?v=bsswiSMqhno 6... Binary Options Trading Software - Learn How To Profit In 60 Seconds Looking for making profits in a safe and simple way? So do not waste your time and consider having the best auto trading software. CLICK HERE = http://clktr4ck.com/85usbinaryoptions ----- 60 Second Binary Options Strategy and Software - How Can Make $47... ===== CLICK HERE = http://clktr4ck.com/85usbinaryoptions ===== 60 Seconds Binary Options Strategy 2016 - Best Binary Options Strategy And Software 2016 The day has ... -----¬----- CLICK HERE : http://clktr4ck.com/binary-options-systems-mmo -----... Best Binary Options Brokers http://2by.us/best 90% Winning System http://buffettbots.com/ 60 Second Binary Options Strategy! - Version III Software! Awesome Updates ... 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 a...

http://arab-binary-option.pickclubcoona.gq