Binary Options Academy for Beginners - Binary Option ...
Binary Options Academy for Beginners - Binary Option ...
Binary Options Trading for Dummies - The Complete Beginner ...
Top Binary Options Courses Online - Updated [November 2020 ...
Binary Options Day Trading - Tutorial and Best Brokers 2020
Best Binary Options Trading Online Courses, Training with ...
Binary Options Trading Classes: Learn and Earn 4 Free!
Trading Academy - Learn Binary Options lesson by lesson
Top Five Successful Strategies For Trading Binary Options ...
Useful Tools for Binary Options Trading
How to Trade Binary Options Financial Trading School
Mikasa's Character Arc: What, Where, How, When
There's been some discussion on Mikasa in the sub lately, both positive and negative, and it's led me to think a bit more about her character. In particular, I've been thinking about her character flaw, what it is exactly, and whether or not she's developed past it – and if she has, what that means for her in the final arc. Isayama once said that Mikasa is a character who 'expresses herself via actions and facial expressions quite a lot'. I sometimes feel that that's why a lot of her personal story gets overlooked – because she's not loud about it, and nor is anyone else. She's one of the most reticent characters in the manga and, more importantly, deliberately written that way. It's intentional on Isayama's part for Mikasa to mostly 'express herself via actions and facial expressions', and so, as difficult as it might be to follow, that's mostly how her personal journey is told. Because she doesn't say much, talks a lot with her fists, and is the team's natural and aggressive protector, it's easy to assume that there's nothing more happening there. Isayama clearly doesn't mean for readers to overlook her, but some inevitably do because she's not as obvious and outspoken as other characters. She's not like Eren, whose dissatisfaction with the world drives him to continuously push back, or like Armin, whose self-doubt and fear of responsibility constantly battle with his natural intelligence and sense of duty. She doesn't outwardly appear to suffer from the neuroses that afflict a lot of the others in the main cast. As a result, her development as a character isn't easy to track. Where does it start? Where does it end? What even is it? It's fair to ask, in Mikasa's case, whether she even has a character arc to begin with. What changes about her? Does she actually react in any way to her experiences and evolve as a result of them, or does she remain the same from beginning to end?
Fans' opinions on Mikasa's character are often based on her feelings for Eren and the actions she undertakes to protect him. It irks some readers that Eren is Mikasa's priority, and that her life seems to revolve around him. Because they consider this her character flaw, they expect that her character development is going to rectify this flaw; that she'll move away from Eren, whether physically, emotionally, or mentally, and find something else to live for. In a 2016 interview, Isayama said: 'Mikasa's growth probably involves separation from Eren'. People generally stop at that and go from there – they either believe that Mikasa can't grow as a person unless Eren stops being important to her, or that a Mikasa who isn't separated from Eren (emotionally, mentally, or physically) is inherently a flawed character. Isayama's explanation of the 'separation' he means is never usually discussed, even though he actually does go on to clarify it: 'Mikasa's growth probably involves separation from Eren. By separation, I mean she might be able to return to that ordinary girl that she used to be in childhood'. If the all-important 'separation' for her growth is about Mikasa returning to the 'ordinary girl' she used to be, it's worth asking what isn't ordinary about the girl Mikasa became, and when that change happened. And once that 'non-ordinary' quality about Mikasa becomes apparent, it can be identified as Mikasa's flaw; the deficiency in her character that we can expect her to overcome. Mikasa loving someone or wanting to protect them isn't in itself a flaw. It's a fairly ordinary, reasonable thing, and it's something plenty of other characters already display in the story: Franz wants to protect Hanna; Ymir, Historia; Eren, Mikasa; Kenny, Uri; Levi, Erwin, and so on ad infinitum. There's a reason that Mikasa's love for and general protectiveness towards Eren never changes. It's because it's not something she was ever meant to 'grow past' or 'get over'. It was never her flaw. Her flaw is fear. Mikasa's overprotectiveness of Eren is what isn't 'ordinary', because it's connected to her deep, abiding fear of loss. Her desire to constantly stay by him is pitiful because, above all else, it represents her fear and her mistrust of the world. And it's why her 'separation' from him is about more than just 'Mikasa finds something else to do apart from care about Eren'; it's a return to her being 'the ordinary girl of her childhood': a normal girl who isn't constantly fixated on how the people she loves can die at any moment: https://preview.redd.it/gpraaqxt1sq51.jpg?width=750&format=pjpg&auto=webp&s=dbcb1a366ae0b26f287143aa4d7e916d1c7b3c49
When Levi says they'll focus on one objective and that won't include outright killing Annie, Mikasa's one objection is: 'How many of our comrades has she murdered?' Mikasa has no problem being straightforward with Levi. If her first and only consideration was Eren, she'd voice it. She'd even get away with it, because they all need Eren at this point. But instead, she reveals that she has a separate, personal desire: avenging their dead. Mikasa wants to kill Annie for her own reasons.
Levi states that their goal is to retrieve Eren. He gives himself the main role of 'slash[ing] away' at the titan, meaning that he will be the one to actually save Eren, who is in the titan's mouth. And he gives Mikasa the job of distracting Annie. Mikasa accepts asecondary role in a planthat isspecificallyto rescue Eren.
And when she does break from the plan, it's not so she can go and get Eren herself. Mikasa risks the objective of the mission – and Levi, and Eren – by going in for the kill. Mikasa risks the plan to save Eren by acting on her own desire to kill Annie.
Two important shifts take place here for Mikasa. One, she entrusts Eren to someone else, as demonstrated by her action of allowing Levi to take the lead. Two, her focus stops being, even for a short while, Eren – as confirmed by her facial expression when Levi challenges her on it, because she doesn't seem to immediately realise she's even capable of that: The objective was: Forget killing the Titan. Rescue Eren. And Mikasa, for no matter how short a time, lost sight of that. The fearful, overprotective aspect of Mikasa's relationship with Eren is beginning to change, because her relationship with the rest of her world is beginning to change. With his rescue of Eren in the forest, Levi proves to Mikasa that other people are just as capable of protecting Eren as she is. And if she happens to take her mind off Eren for a bit, it doesn't mean he'll die. This is where the 'separation' begins. Mikasa starts to accept distance between herself and Eren; the distance of being able to trust others with him, of not needing to constantly be with him and personally oversee his safety. And it leads to this watershed moment in the Uprising arc: Mikasa. Whilst Eren has been kidnapped. And all they know is that he's inside a coffin with some random undertaker at some random inn. Maybe. In Chapter 4, Mikasa couldn't handle Eren being in a different part of the city from her during a mission because of how afraid she was that he'd die without her. In Chapter 30, she let Levi take the lead on getting Eren back, and was shocked when she realised that, even for an instant, she'd prioritised something else over him. In Chapter 57, Eren's been kidnapped, no one's been certain for two days about where he is or what's happening to him, and Mikasa is, well, as pictured above. The debilitating fear that used to tie Mikasa to Eren is gone for good. She's finally let Eren go, and discovered that it doesn't mean she'll lose him.
Post-timeskip Mikasa is in a good place, and long past the fear with which she faced the world as a young girl. She's with Eren, working with the Volunteers, and she and Armin are excited about the possibilities of the widening world. Then Eren effectively betrays the SC for reasons they can't fully understand, and, once again, Mikasa's world begins to change in alarming, unpredictable ways. https://preview.redd.it/y4f97ksi2sq51.png?width=346&format=png&auto=webp&s=a17a0410c8f25e97ee450b57d9636e5fc147b874 For the first time in a long time, she loses someone she loves. Eren's in jail and Mikasa remains by Sasha's grave, pondering the old words that bind her and Eren together: 'If we don't win, we die. If we win, we live. If we don't fight, we can't win.' Ironically enough, Sasha is the only character in the entire manga to have said those words apart from Eren and Mikasa themselves. And she's now dead as a result of Eren's fight. So what exactly is Eren fighting for, and what does winning that fight entail? This is the first time in the manga that Mikasa begins to doubt Eren, and the first time their bond has ever really been threatened. And not by the world, titans, or murderous kidnappers, but by Eren himself. The idea that there is beauty where cruelty also exists has informed Mikasa's perspective on the world since Eren wrapped his scarf around her. He showed her that it is possible for the two things to co-exist; for there to be human cruelty as well as human kindness, cold as well as warmth, life as well as death. But Eren is now showcasing the exact cruelty that Mikasa used him as a beacon against. What he's done is undoing what she believes in; it's not just that it's shaken her view of Eren – it threatens to undo Mikasa's whole world-view. In that same 2016 interview, Isayama spoke of Eren and Mikasa's eventual separation being ideological: 'If I were to draw the separation of Eren and Mikasa . . . Mikasa would have to endure the strain of being stuck between Eren and Armin. Even though she can sympathise with Armin, who considers things from a ''globalism'' perspective, it’s possible that she can't just let the more self-focused Eren go'. This ideological separation begins the moment Eren defects from the SC. It's from this point onwards that EMA's paths truly begin to diverge, and Mikasa in particular is presented with a choice that she's never had to face before. Of the two people she loves most in the world, does she choose the 'self-focused' Eren or the 'globalist' Armin? The choice she makes will most likely conclude Mikasa's character arc once and for all, and it's a choice that's been building since before the time-skip, represented by her interactions with two characters in particular: 1. Mikasa and Floch At the award ceremony in Chapter 90, Floch points out something interesting about Mikasa in what is otherwise an easily overlooked moment in the manga. Although multiple people were present on the rooftop during Serumbowl, he is the only one to explicitly draw attention to the fact that Mikasalet go. She resigned herself to losing Armin because Hanji convinced her that Erwin was more important to humanity and Mikasa's grief at losing him was something that would pass. https://preview.redd.it/oqjfh2gk2sq51.png?width=584&format=png&auto=webp&s=f13d8f9a80608e4ac8a85c30d3ddc79b751ad1dd Floch sees this as maturity, but the realisation that she was willing to let Armin go for the sake of humanity is something that Mikasa is shocked by. It makes her falter, and let go of Eren. Mikasa has always defined herself as Armin and Eren's protector; she's presented in the story as such, and she styles herself as such. She's the one who keeps Eren and Armin safe. But Floch's words make her realise that, on the rooftop, she was able to step away from that role – because her world has expanded beyond Armin and Eren. It has expanded to include Hanji and Levi and the other Scouts – and humanity. Mikasa is capable of making choices that hurt her deeply for the sake of a greater cause. 2. Louise and Mikasa Louise meets Mikasa on three occasions. The first time, Louise tells Mikasa she likes her because Mikasa saved her, and gave her something to strive for: 'You can't save anyone without power. It's okay for us to fight against unjust violence. That's what I learned' (109). In the same way Eren 'gave' Mikasa a motto to live by, Mikasa gave one to Louise. The second time, Louise tells Mikasa that she's happy to be by her side again, fighting for the same goal. Mikasa is ambivalent towards her. And she leaves her scarf behind, choosing to go and fight the titans without it. In between the second and third meetings, Mikasa talks to Armin. She asks him if he's really going to tell Connie to give up on his mother and let her remain a titan; Armin says yes, he is. When Mikasa asks what should be done about Eren, Armin replies that there's nothing to be done; he's a lost cause. After Armin leaves, Mikasa notices that the scarf is missing, and goes to retrieve it. The third and last time they meet, Louise is dying. She tells Mikasa that Eren wanted her to throw the scarf away, but she thought that she could take it to be close to Mikasa. Though she appears to sympathise with Louise's plight, Mikasa demands the scarf back from her. She walks away from Louise even as Louise tells her that she had no regrets, because she chased after Mikasa, devoting her heart. Each meeting between Louise and Mikasa mirrors, in an abbreviated way, the different stages Eren and Mikasa's relationship has gone through. 1: Louise's initial love and gratitude, and her taking Mikasa as an inspiration; 2: their fighting side by side as equals; and, finally, 3: their literal separation as Mikasa chooses to walk away. Louise reminds Mikasa of what Eren means to her. Mikasa never seeks to stop Louise from talking about her feelings; instead, she listens. She might not reciprocate, but she does understand. And her understanding Louise's love reminds her of her own. She walks away, but she takes the scarf with her. Despite what Armin said, and what Louise told her about Eren and the scarf, Mikasa chooses to keep a hold of it in the way she keeps a hold of the hope that Eren can still be brought back. Mikasa is capable of holding on to the person she loves even when he's gone too far. Mikasa Chooses . . . Mikasa Despite the apparently binary choice, Mikasa doesn't have to choose to side with Eren (allow the Rumbling to go ahead) or with Armin (kill Eren to stop him). She said it herself: there's a third option. Her way. Eren's wandered so far down his path that he's lost sight of Mikasa and of Armin; of what connects him to the world. Mikasa chooses, not to support him or to believe that he's a lost cause, but to remind him that walking away from his humanity doesn't mean that he can't turn around and walk back. Kruger said 'Anyone can become a god or a devil. All it takes is for someone to claim it for it to be true' (88). But if there's someone to challenge that belief, then the possibility remains of breaking the facade and setting the story straight – thereby freeing that person from the role they've either taken on out of necessity, or been assigned. It's something we've already seen happen. All it takes is for one person to question it, and the goddess falls apart to reveal an empty, unloved young girl, or the devil's mask cracks open to show the boy still grieving for the world he's lost. Ymir knows that Historia's faking it; Mikasa knows that Eren is kind. Each of them challenges the story that their loved one is telling in order to keep going: Historia to survive, Eren to achieve his dream. It took Mikasa years to truly overcome the cruelty she had seen as a child. Despite everything, she did, in the end, go back to being that 'ordinary girl'. She came to acknowledge that cruelty exists, as does death – but life must nevertheless be lived, people loved, experiences had, and faith kept. Seeing the beauty in a world that is inherently cruel is, and always has been, Mikasa's greatest strength. It's something she is capable of offering Eren, who no longer seems to believe in that duality, or in his own humanity. She can show him what he showed her; that the world isn't black or white, cruel or beautiful, dark or light. It's both. And it's possible to live with that.
Mikasa is no longer fighting to protect Eren from the world; she's fighting to protect the world from Eren. She's the person best suited to do that not only because she's his family, but because Eren's despair and anger at the world is what she might have ended up with herself. If any character was dealt a crueller hand by the world than Eren, or could have become as bitter about the world as him, it was Mikasa. But he stopped that from happening because his kindness showed her that the world, as bad as it was, had good in it. Little by little, Eren's abandoned that view of the world himself. He no longer sees both its beauty and its cruelty, but has confined himself to seeing - and acting on - only one. When they fought Annie in Stohess, Mikasa had to remind Eren that the world was cruel, because Eren had lost sight of that truth. Now, Eren's lost sight of another, equally valid truth; that the world, as cruel as it is, is also beautiful. That he, as inhuman as he thinks he is, is also kind. If Mikasa manages to 'bring Eren back', she'll have come full circle. She started off as a little girl who was seeking something, anything, to hold on to. She needed a saviour, and she got one in the form of Eren. In this scenario, she'll end as a saviour herself, someone who is now able to pass on the light that she once received. Her fear of the world and of losing her loved ones subsided; she managed to find the warmth she needed to carry on. She doesn't need Eren's scarf anymore – but he might need hers.
My perspective on Mikasa is that she's not a very obvious character when it comes to development, and so she sometimes appears static. And because so much of her drive is Eren, a lot of fans look to her relationship with Eren to change for proof that she's somehow developed. But Mikasa's obstacle, her personal flaw, isn't Eren himself, and never has been. Her flaw has always been her deep and debilitating fear about losing the people she loves – Eren and Armin – and her inability to really trust or love anyone apart from them. Mikasa's separation from Eren = her beginning to trust the rest of the world not to stab him in the chest, almost behead him, or eat him alive whilst she's not there. It's good for her because it means she stops being so terrified that she'll lose Eren, not because it means she'll stop loving him or wanting him to be safe. And she reached that point of separation a long time ago in the manga. It was fully realised the moment she decided to trust Levi during the Uprising arc, despite the fact that Eren was literally gone from her side and she had no way of knowing whether he was dead or alive. The final confrontation is where Eren and Mikasa's ideological separation, the one discussed by Isayama in the interview, will/won't occur. It – and its finer details – can unfold in a number of ways, and each one could mean something different for Mikasa's character. But her choosing to face Eren in this way is a natural culmination of her development until now. I've no concrete theories on what will actually happen once the Alliance reaches Eren, but I'm fairly certain that Mikasa is central to the resolution of this arc. And what with the way she's been written by Isayama so far, that's no bad thing. So, to finally end this ramble, I hope that this post at least offers people a different perspective on Mikasa's character and how it's changed over the course of the story. I look forward to reading any other observations/thoughts on Mikasa's development that people might have. Many thanks for giving mine a read!
You’re probably closer to independence than you realize
Financial Independence, as most spreadsheets frame the idea, is the art of replacing your spending with investment returns. More quietly stated is an implicit promise that after you’ve done it, you’re free. Chasing that freedom is an incredible motivator if you’re anything like me. And you’re probably at least a little like me, if you’re on this subreddit. Except, of course, we all know you’re never completely free. The outside requirements on a human life don’t stop at the financial. You still have to go to the doctors office to make sure your body is running OK. You need to take out the trash. Your desk gets messy and you have to clean it up. You feel guilty if you forget send your mom a card on her birthday. You’re not free, you’re still a human being. Just a human being with a lot of flexibility. And, of course, once most people do the math, it becomes clear that in order to get spending low enough to make it work, your part time job effectively becomes frugality. Being frugal isn’t a terrible part time job. You autonomously set your own schedule, it gives you an opportunity to be creative, you develop skills which have an impact on your life, such as gardening and thrifting. Frugality challenges your comfort levels at times, which in turn allows you appreciate luxury when it’s available. For me, it’s pretty much the checklist for what counts as an incredibly satisfying job. I don’t have a problem with any of this. And as a thoughtful person who’s put some brain time into designing your life, you already implicitly know everything I’m saying. But it’s useful to say explicitly. I sat down this week to write a plan for what I would do if I lost my job tomorrow, and was barred from full time employment for the rest of my life. I was not shocked to discover that even without 100% FI savings, I could design several options for lifestyles where my FI goals of satisfying work, low stress, extreme autonomy, meaningful relationships, and security were accessible. But what I was shocked to discover was that I could also design such a life without relying on any of my considerable savings or investments at all. The savings and investments made it a lot easier, but they really weren’t necessary. It turns out the important part of this thought exercise was forcing myself to give up my current job. With that, I had to get rid of my own internal limiters: the unconscious need to project success to peers, the fear of giving up what I’ve already worked for in my current job, the iron clad spreadsheet and financial plan that I’ve been faithfully following for seven years, the fear of something new. When all that creativity was being pointed towards the actual life goals, as opposed to purely the financial goals that I thought would help with the life goals, a lot of shortcuts became apparent. And I couldn't have done it without having put a tremendous amount of thought into clarifying what, exactly, I want out of life. Of course, I’m not quitting my job immediately. And it’s not like my current lifestyle is too far of a cry from my goal lifestyle. It has a little less autonomy than I’d like, and a little more stress, but we’re in the ballpark. But the lesson that I think is important to remember is that financial goals are easy to measure, easy to track, and easy to let swallow you to the point of distraction. Life is not a binary between FI and failure. Extreme saving is a tool, and only a tool, and it’s worth putting thought into what you need that tool for, and not just how to get your hands on it.
The narrative of Euro Truck Simulator 2 or why Spec Ops: The Line isn’t the only best single-player campaign of 2012
Too long, won’t read: I see stories and moral choices in a game that has neither. Obligatory sorry for my English. For this whole post to make sense (to me at least), I want to preface that I am the kind of casual/hardcore gamer that plays casually only a few games that do not fit any “perceived” genre. Put it simply, the list of games I have played for more than 200 hours each includes League of Legends (mostly with bots nowadays but still), Monster Hunter World, World of Warships, Skyrim, Witcher 3, Spec Ops: The Lines (yes the 2012 depressing single-player game for over 200 hours), Call of Duty 1 and 2 (only the single-player campaign, yes again for more than 200 hours), Civilization 5 and 6, Shogun 2 Total War, Islanders, Cities Skylines, Banished, Valkyria Chronicles 1 and 4, and Guild Wars 2 (MMORPG, I was a raider). From this list, I tend to think of myself as a “young” gamer that wants a lot of stimulation and excitement from gameplays and can perform quick reaction or demanding mechanics. It also shows my interest in storytelling (within games and in general), watching Yatzhee’s Zero Punctuation and Raycevick in addition to, for example, Lessons from the Screenplay (screenplay, duh), Lindsay Ellis (academic theory on films and musicals), and Sideways (academic theory on music). So if you know Euro Truck Simulator 2 (ETS2), you’ll be wondering what the hell am I writing here. For those that don’t know, ETS2 is a purely mechanical game with no narratives or moral choice. The primary gameplay loop is you are a trucker, you pick a job and drive the cargo across Europe. The secondary gameplay loops contain configuring the truck so it can run faster and smoother. And with each job, you earn money to buy garages, hire drivers and expand your fleet of trucks. But the intended value of the game is in the driving and modding the truck. In the word of Yatzhee of ZP, this is a “dad’s game”, games that aim for realism to the point of grindy and boring that reminds “dad” of his boring accountant job before he retired. Yeah, it goes well in my game list. I came to ETS2 completely coincidental. Last week, I was looking for a new game when I see Bus Simulator is free on iOS (yes, I play gacha on mobile too, thankfully never cross the 50 hours mark). After ramming my bus into the first car I see, I remembered “hey there’s this game called ETS2” and Steam was having a discount. So I played the demo, bought the base game, and nearly 24 in-game hours and 3 interesting insights later, here we are. 1/Mechanic I don’t even know how to drive in real life. But I can braindead driving 900km from Poland to France in half an hour and it’s relaxing. 2/Stories This is the main reason why the game captivates me. The first “revelation” when I boarded a ferry to go from France to the UK. I instantly ran into a car as soon as I drove out of port, not realizing that the UK is this backward country that drives on the left side instead of on the right side like every other civilization. Then it made me question how truckers deal with this issue when they have to make frequent delivery across the English Channel. And then the floodgate opened. Perhaps this is more me being nostalgic than the game “having a story”, but the game did well putting me in the shoes of the trucker and reminded me of all of the stories I heard about the trucker life. In my home country, truckers drove from north to south in mere days, driving at night with a co-driver to make sure they deliver on time or stopping quickly at a rest stop for a bite or a nap. The game doesn’t have a co-driver, doesn’t have a “hunger” mechanic, only tells you to stop at a gas station and hit buttons to imagine “sleeping”. But in the routine stops for gas and sleep, I subconsciously roleplayed those stories I heard, imagined the real lives of people having to run at night to avoid traffic or speeding on the highway to make deadline. I remembered the truckers sharing knowledge of which roads to take to avoid toll or take detours, which roads have cameras or polices, or even which rest stop has nice food. I even remembered horror stories of truckers having a family in one city and flirting and impregnating waitresses or innocent local girls. The game doesn’t have any of these. It just has driving. I guess I appreciate how the game doesn’t try to force a story. It just mimics lives to an extent and let me fill in the blank. In a weird way, it plays like a Grand Theft Auto sandbox where following the traffic rules and imagining the complex life of the person whose car I just take is as fun as actually running over that person. 3/Moral choice I hope I am a good in-game person. I pondered my choices while playing the Witcher to make the NPCs happy. I imagined the nonexistent lives of citizens in all the city-builder or empire-building games I play to motivate me to become a benign ruler. I try to do the same in ETS2, following the traffic rules, trying to deliver the cargo in time so a kid will have a computer for a birthday, or a farmer gets the much-needed tractor for work. And then I discover “Option”, which can remove the speed limit and traffic offense. The moment I ram my truck headfirst into a sedan in a roundabout in downtown Amsterdam at 20:32 then laughed maniacally as I drove away onto the highway was when I kissed my Reddit lurker life goodbye. It was a trivial yet paradoxically fantastic moment for me when I realized how I was “making a choice” in a game that doesn’t have this bucket of choice. The car I just rammed into does not have a person inside, does not have a life, isn’t running home for dinner after a long day of work. It was just a game mechanic designed to take 400 Euros away from me. Yet, I kept thinking about that moment for the rest of the drive to Paris. While ramming into the firefighters trying to clean up a traffic accident on the highway. I remembered the discourse on binary choice mechanic back in the day when games force players to choose between “good” and “bad” as if life is as straight forward as that. Or games like Frostpunk or This War is Mine that forces a consequence on your decision, hinting that what you did was morally wrong, even if you agree with it or not. Euro Truck Simulator 2 does not have this mechanic. It isn’t even designed to take part in this discussion. All it has is driving. So either I am deranged enough to be a novelist or Euro Truck Simulator 2 tells a greater horror than a First Person Shooter military shooter does. Thank you for coming to my Ted Talk.
Red Hat OpenShift Container Platform Instruction Manual for Windows Powershell
Introduction to the manual This manual is made to guide you step by step in setting up an OpenShift cloud environment on your own device. It will tell you what needs to be done, when it needs to be done, what you will be doing and why you will be doing it, all in one convenient manual that is made for Windows users. Although if you'd want to try it on Linux or MacOS we did add the commands necesary to get the CodeReady Containers to run on your operating system. Be warned however there are some system requirements that are necessary to run the CodeReady Containers that we will be using. These requirements are specified within chapter Minimum system requirements. This manual is written for everyone with an interest in the Red Hat OpenShift Container Platform and has at least a basic understanding of the command line within PowerShell on Windows. Even though it is possible to use most of the manual for Linux or MacOS we will focus on how to do this within Windows. If you follow this manual you will be able to do the following items by yourself: ● Installing the CodeReady Containers ● Updating OpenShift ● Configuring a CodeReady Container ● Configuring the DNS ● Accessing the OpenShift cluster ● Deploying the Mediawiki application What is the OpenShift Container platform? Red Hat OpenShift is a cloud development Platform as a Service (PaaS). It enables developers to develop and deploy their applications on a cloud infrastructure. It is based on the Kubernetes platform and is widely used by developers and IT operations worldwide. The OpenShift Container platform makes use of CodeReady Containers. CodeReady Containers are pre-configured containers that can be used for developing and testing purposes. There are also CodeReady Workspaces, these workspaces are used to provide any member of the development or IT team with a consistent, secure, and zero-configuration development environment. The OpenShift Container Platform is widely used because it helps the programmers and developers make their application faster because of CodeReady Containers and CodeReady Workspaces and it also allows them to test their application in the same environment. One of the advantages provided by OpenShift is the efficient container orchestration. This allows for faster container provisioning, deploying and management. It does this by streamlining and automating the automation process. What knowledge is required or recommended to proceed with the installation? To be able to follow this manual some knowledge is mandatory, because most of the commands are done within the Command Line interface it is necessary to know how it works and how you can browse through files/folders. If you either don’t have this basic knowledge or have trouble with the basic Command Line Interface commands from PowerShell, then a cheat sheet might offer some help. We recommend the following cheat sheet for windows: ● Https://www.sans.org/security-resources/sec560/windows\_command\_line\_sheet\_v1.pdf Another option is to read through the operating system’s documentation or introduction guides. Though the documentation can be overwhelming by the sheer amount of commands. ● Microsoft:https://docs.microsoft.com/en-us/windows-serveadministration/windows-commands/windows-commands ● MacOS Https://www.makeuseof.com/tag/mac-terminal-commands-cheat-sheet/ ● Linux https://ubuntu.com/tutorials/command-line-for-beginners#2-a-brief-history-lessonhttps://www.guru99.com/linux-commands-cheat-sheet.html http://cc.iiti.ac.in/docs/linuxcommands.pdf Aside from the required knowledge there are also some things that can be helpful to know just to make the use of OpenShift a bit simpler. This consists of some general knowledge on PaaS like Dockers and Kubernetes.
The minimum system requirements for the Red Hat OpenShift CodeReady Containers has the following minimum hardware: Hardware requirements Code Ready Containers requires the following system resources: ● 4 virtual CPU’s ● 9 GB of free random-access memory ● 35 GB of storage space ● Physical CPU with Hyper-V (intel) or SVM mode (AMD) this has to be enabled in the bios Software requirements The minimum system requirements for the Red Hat OpenShift CodeReady Containers has the following minimum operating system requirements: Microsoft Windows On Microsoft Windows, the Red Hat OpenShift CodeReady Containers requires the Windows 10 Pro Fall Creators Update (version 1709) or newer. CodeReady Containers does not work on earlier versions or other editions of Microsoft Windows. Microsoft Windows 10 Home Edition is not supported. macOS On macOS, the Red Hat OpenShift CodeReady Containers requires macOS 10.12 Sierra or newer. Linux On Linux, the Red Hat OpenShift CodeReady Containers is only supported on Red Hat Enterprise Linux/CentOS 7.5 or newer and on the latest two stable Fedora releases. When using Red Hat Enterprise Linux, the machine running CodeReady Containers must be registered with the Red Hat Customer Portal. Ubuntu 18.04 LTS or newer and Debian 10 or newer are not officially supported and may require manual set up of the host machine.
Required additional software packages for Linux
The CodeReady Containers on Linux require the libvirt and Network Manager packages to run. Consult the following table to find the command used to install these packages for your Linux distribution: Table 1.1 Package installation commands by distribution
To install CodeReady Containers a few steps must be undertaken. Because an OpenShift account is necessary to use the application this will be the first step. An account can be made on “https://www.openshift.com/”, where you need to press login and after that select the option “Create one now” After making an account the next step is to download the latest release of CodeReady Containers and the pulled secret on “https://cloud.redhat.com/openshift/install/crc/installer-provisioned”. Make sure to download the version corresponding to your platform and/or operating system. After downloading the right version, the contents have to be extracted from the archive to a location in your $PATH. The pulled secret should be saved because it is needed later. The command line interface has to be opened before we can continue with the installation. For windows we will use PowerShell. All the commands we use during the installation procedure of this guide are going to be done in this command line interface unless stated otherwise. To be able to run the commands within the command line interface, use the command line interface to go to the location in your $PATH where you extracted the CodeReady zip. If you have installed an outdated version and you wish to update, then you can delete the existing CodeReady Containers virtual machine with the $crc deletecommand. After deleting the container, you must replace the old crc binary with a newly downloaded binary of the latest release.
When you have done the previous steps please confirm that the correct and up to date crc binary is in use by checking it with the $crc version command, this should provide you with the version that is currently installed.
To set up the host operating system for the CodeReady Containers virtual machine you have to run the $crc setup command. After running crc setup, crc start will create a minimal OpenShift 4 cluster in the folder where the executable is located.
Setting up CodeReady Containers
Now we need to set up the new CodeReady Containers release with the $crc setup command. This command will perform the operations necessary to run the CodeReady Containers and create the ~/.crc directory if it did not previously exist. In the process you have to supply your pulled secret, once this process is completed you have to reboot your system. When the system has restarted you can start the new CodeReady Containers virtual machine with the $crc start command. The $crc start command starts the CodeReady virtual machine and OpenShift cluster. You cannot change the configuration of an existing CodeReady Containers virtual machine. So if you have a CodeReady Containers virtual machine and you want to make configuration changes you need to delete the virtual machine with the $crc deletecommand and create a new virtual machine and start that one with the configuration changes. Take note that deleting the virtual machine will also delete the data stored in the CodeReady Containers. So, to prevent data loss we recommend you save the data you wish to keep. Also keep in mind that it is not necessary to change the default configuration to start OpenShift.
Before starting the machine, you need to keep in mind that it is not possible to make any changes to the virtual machine. For this tutorial however it is not necessary to change the configuration, if you don’t want to make any changes please continue by starting the machine with the crc start command.
\ it is possible that you will get a Nameserver error later on, if this is the case please start it with* crc start -n 188.8.131.52
It is not is not necessary to change the default configuration and continue with this tutorial, this chapter is here for those that wish to do so and know what they are doing. However, for MacOS and Linux it is necessary to change the dns settings.
Configuring the CodeReady Containers
To start the configuration of the CodeReady Containers use the command crc config. This command allows you to configure the crc binary and the CodeReady virtual machine. The command has some requirements before it’s able to configure. This requirement is a subcommand, the available subcommands for this binary and virtual machine are: ● get, this command allows you to see the values of a configurable property ● set/unset, this command can be used for 2 things. To display the names of, or to set and/or unset values of several options and parameters. These parameters being: ○ Shell options ○ Shell attributes ○ Positional parameters ● view, this command starts the configuration in read-only mode. These commands need to operate on named configurable properties. To list all the available properties, you can run the command $crc config --help. Throughout this manual we will use the $crc config command a few times to change some properties needed for the configuration. There is also the possibility to use the crc config command to configure the behavior of the checks that’s done by the $crc start end $crc setup commands. By default, the startup checks will stop with the process if their conditions are not met. To bypass this potential issue, you can set the value of a property that starts with skip-check or warn-check to true to skip the check or warning instead of ending up with an error.
C:\Users\[username]\$PATH>crc config get C:\Users\[username]\$PATH>crc config set C:\Users\[username]\$PATH>crc config unset C:\Users\[username]\$PATH>crc config view C:\Users\[username]\$PATH>crc config --help
Configuring the Virtual Machine
You can use the CPUs and memory properties to configure the default number of vCPU’s and amount of memory available for the virtual machine. To increase the number of vCPU’s available to the virtual machine use the $crc config set CPUs . Keep in mind that the default number for the CPU’s is 4 and the number of vCPU’s you wish to assign must be equal or greater than the default value. To increase the memory available to the virtual machine, use the $crc config set memory . Keep in mind that the default number for the memory is 9216 Mebibytes and the amount of memory you wish to assign must be equal or greater than the default value.
C:\Users\[username]\$PATH>crc config set CPUs C:\Users\[username]\$PATH>crc config set memory >
Configuring the DNS
Window / General DNS setup
There are two domain names used by the OpenShift cluster that are managed by the CodeReady Containers, these are: ● crc.testing, this is the domain for the core OpenShift services. ● apps-crc.testing, this is the domain used for accessing OpenShift applications that are deployed on the cluster. Configuring the DNS settings in Windows is done by executing the crc setup. This command automatically adjusts the DNS configuration on the system. When executing crc start additional checks to verify the configuration will be executed.
macOS DNS setup
MacOS expects the following DNS configuration for the CodeReady Containers ● The CodeReady Containers creates a file that instructs the macOS to forward all DNS requests for the testing domain to the CodeReady Containers virtual machine. This file is created at /etc/resolvetesting. ● The oc binary requires the following CodeReady Containers entry to function properly, api.crc.testing adds an entry to /etc/hosts pointing at the VM IPaddress.
Linux DNS setup
CodeReady containers expect a slightly different DNS configuration. CodeReady Container expects the NetworkManager to manage networking. On Linux the NetworkManager uses dnsmasq through a configuration file, namely /etc/NetworkManageconf.d/crc-nm-dnsmasq.conf. To set it up properly the dnsmasq instance has to forward the requests for crc.testing and apps-crc.testing domains to “192.168.130.11”. In the /etc/NetworkManageconf.d/crc-nm-dnsmasq.conf this will look like the following: ● Server=/crc. Testing/192.168.130.11 ● Server=/apps-crc. Testing/192.168.130.11
Accessing the Openshift Cluster
Accessing the Openshift web console
To gain access to the OpenShift cluster running in the CodeReady virtual machine you need to make sure that the virtual machine is running before continuing with this chapter. The OpenShift clusters can be accessed through the OpenShift web console or the client binary(oc). First you need to execute the $crc console command, this command will open your web browser and direct a tab to the web console. After that, you need to select the htpasswd_provider option in the OpenShift web console and log in as a developer user with the output provided by the crc start command. It is also possible to view the password for kubeadmin and developer users by running the $crc console --credentials command. While you can access the cluster through the kubeadmin and developer users, it should be noted that the kubeadmin user should only be used for administrative tasks such as user management and the developer user for creating projects or OpenShift applications and the deployment of these applications.
To gain access to the OpenShift cluster with the use of the oc command you need to complete several steps. Step 1. Execute the $crc oc-env command to print the command needed to add the cached oc binary to your PATH:
Step 2. Execute the printed command. The output will look something like the following:
PS C:\Users\OpenShift> crc oc-env $Env:PATH = "CC:\Users\OpenShift\.crc\bin\oc;$Env:PATH" # Run this command to configure your shell: # & crc oc-env | Invoke-Expression
This means we have to execute* the command that the output gives us, in this case that is:
\this has to be executed every time you start; a solution is to move the oc binary to the same path as the crc binary* To test if this step went correctly execute the following command, if it returns without errors oc is set up properly
Step 3 Now you need to login as a developer user, this can be done using the following command: $oc login -u developerhttps://api.crc.testing:6443 Keep in mind that the $crc start will provide you with the password that is needed to login with the developer user.
Step 4 The oc can now be used to interact with your OpenShift cluster. If you for instance want to verify if the OpenShift cluster Operators are available, you can execute the command
$oc get co
Keep in mind that by default the CodeReady Containers disables the functions provided by the commands $machine-config and $monitoringOperators.
C:\Users\[username]\$PATH>oc get co
Now that you are able to access the cluster, we will take you on a tour through some of the possibilities within OpenShift Container Platform. We will start by creating a project. Within this project we will import an image, and with this image we are going to build an application. After building the application we will explain how upscaling and downscaling can be used within the created application. As the next step we will show the user how to make changes in the network route. We also show how monitoring can be used within the platform, however within the current version of CodeReady Containers this has been disabled. Lastly, we will show the user how to use user management within the platform.
In OpenShift there is a feature called autoscaling. There are two types of application scaling, namely vertical scaling, and horizontal scaling. Vertical scaling is adding only more CPU and hard disk and is no longer supported by OpenShift. Horizontal scaling is increasing the number of machines. One of the ways to scale an application is by increasing the number of pods. This can be done by going to a pod within the view as seen in the previous step. By either pressing the up or down arrow more pods of the same application can be added. This is similar to horizontal scaling and can result in better performance when there are a lot of active users at the same time. https://preview.redd.it/s6i1vbcrltv51.png?width=602&format=png&auto=webp&s=e62cbeeed116ba8c55704d61a990fc0d8f3cfaa1 In the picture above we see the number of nodes and pods and how many resources those nodes and pods are using. This is something to keep in mind if you want to scale up your application, the more you scale it up, the more resources it will take up. https://preview.redd.it/quh037wmitv51.png?width=194&format=png&auto=webp&s=5e326647b223f3918c259b1602afa1b5fbbeea94
It is however important to know how to manually reclaim the persistent volumes, since if you delete PV the associated data will not be automatically deleted with it and therefore you cannot reassign the storage to another PV yet. To manually reclaim the PV, you need to follow the following steps: Step 1: Delete the PV, this can be done by executing the following command
Step 2: Now you need to clean up the data on the associated storage asset Step 3: Now you can delete the associated storage asset or if you with to reuse the same storage asset you can now create a PV with the storage asset definition. It is also possible to directly change the reclaim policy within OpenShift, to do this you would need to follow the following steps: Step 1: Get a list of the PVs in your cluster
$oc get pv
This will give you a list of all the PV’s in your cluster and will display their following attributes: Name, Capacity, Accesmodes, Reclaimpolicy, Statusclaim, Storageclass, Reason and Age. Step 2: Now choose the PV you wish to change and execute one of the following command’s, depending on your preferred policy:
According to the documentation of OpenShift is a user, an entity that interacts with the OpenShift Container Platform API. These can be a developer for developing applications or an administrator for managing the cluster. Users can be assigned to groups, which set the permissions applied to all the group’s members. For example, you can give API access to a group, which gives all members of the group API access. There are multiple ways to create a user depending on the configured identity provider. The DenyAll identity provider is the default within OpenShift Container Platform. This default denies access for all the usernames and passwords. First, we’re going to create a new user, the way this is done depends on the identity provider, this depends on the mapping method used as part of the identity provider configuration. for more information on what mapping methods are and how they function: https://docs.openshift.com/enterprise/3.1/install_config/configuring_authentication.html With the default mapping method, the steps will be as following
$oc create user
Next up, we’ll create an OpenShift Container Platform Identity. Use the name of the identity provider and the name that uniquely represents this identity in the scope of the identity provider:
$oc create identity :
The is the name of the identity provider in the master configuration. For example, the following commands create an Identity with identity provider ldap_provider and the identity provider username mediawiki_s.
$oc create identity ldap_provider:mediawiki_s
Create a useidentity mapping for the created user and identity:
$oc create useridentitymapping :
For example, the following command maps the identity to the user:
There is a --clusterrole option that can be used to give the user a specific role, like a cluster user with admin privileges. The cluster admin has access to all files and is able to manage the access level of other users. Below is an example of the admin clusterrole command:
If you followed all the steps within this manual you now should have a functioning Mediawiki Application running on your own CodeReady Containers. During the installation of this application on CodeReady Containers you have learned how to do the following things: ● Installing the CodeReady Containers ● Updating OpenShift ● Configuring a CodeReady Container ● Configuring the DNS ● Accessing the OpenShift cluster ● Deploying an application ● Creating new users With these skills you’ll be able to set up your own Container Platform environment and host applications of your choosing.
Nameserver There is the possibility that your CodeReady container can't connect to the internet due to a Nameserver error. When this is encountered a working fix for us was to stop the machine and then start the CRC machine with the following command:
C:\Users\[username]\$PATH>crc start -n 184.108.40.206
Hyper-V admin Should you run into a problem with Hyper-V it might be because your user is not an admin and therefore can’t access the Hyper-V admin user group.
Click Start > Control Panel > Administration Tools > Computer Management. The Computer Management window opens.
Click System Tools > Local Users and Groups > Groups. The list of groups opens.
Double-click the Hyper-V Administrators group. The Hyper-V Administrators Properties window opens.
Click Add. The Select Users or Groups window opens.
In the Enter the object names to select field, enter the user account name to whom you want to assign permissions, and then click OK.
Click Apply, and then click OK.
Terms and definitions
These terms and definitions will be expanded upon, below you can see an example of how this is going to look like together with a few terms that will require definitions. ● Kubernetes is an open-source system for automating deployment, scaling, and management of containerized applications. Openshift is based on Kubernetes. ● Clusters are a collection of multiple nodes which communicate with each other to perform a set of operations. ● Containers are the basic units of OpenShift applications. These container technologies are lightweight mechanisms for isolating running processes so that they are limited to interacting with only their designated resources. ● CodeReady Container is a minimal, preconfigured cluster that is used for development and testing purposes. ● CodeReady Workspaces uses Kubernetes and containers to provide any member of the development or IT team with a consistent, secure, and zero-configuration development environment.
Ok, so for my first "tutorial", I’m going to teach you how to set up your development environment. I’ll run through the installations of compilers and editors for Linux, macOS and Windows platforms, but first I want to start with my setup as that is what I recommend. I use a Raspberry Pi 4 that I can remote into to compile and develop code on. It is a very capable machine if you ditch Raspberry OS and instead use Ubuntu. If you guys want, I can make another post telling you how to set one up and configure it for remote access. Windows: As sad as it is, windows dominate 80% of the market share when it comes to computer operating systems. It’s actually kind of stupid how such buggy software can be so popular but that’s just my opinion. Setting up your environment on Windows is actually remarkably easy. There is this IDE called Code::Blocks. Simply go to this link: http://sourceforge.net/projects/codeblocks/files/Binaries/20.03/Windows/codeblocks-20.03mingw-setup.exe download the installer and run it. Then you’re done. You can start writing code straight away. For these series I will be working with the Unix command line. So when I compile the code using the command line, you can simply click the “build and run” option from the IDE and it will automatically compile and run your code. Linux: If you’re a Linux user, you probably already know how to set up your environment, but just in case you don’t know I will run through it now. The first thing you want to do is update you repos and upgrade them. So, enter the following two commands: sudo apt-get update sudo apt-get upgrade Please note that the sudo commands is essentially asking the terminal for root privileges. You need to enter your password in order to execute the commands. Now we need to install g++. This is done with: sudo apt-get install g++ when prompted to, press ‘y’ and hit enter. Let the command execute and GCC will be installed. Now, as I mentioned, I will be using the command line. If you want to just copy and past the commands I use to compile and run the code, you will need to be in the same working directory as me. To create this directory, enter the following command: sudo mkdir ~/cpp_code This will create a folder called ‘cpp_code’ is the home directory. This is base folder for out tutorial series and each lesson will have their own folder. Your editor. Simple. Use whatever text editor you want. I know some purists out there will demand that using a command line text editor is the only way to code. Poppycock. Why over complicate matters unnecessarily. Every operating system has a text editor installed and that will suffice when writing C++ code. You just have to make sure that all the files are saved with the extension ‘.cpp’. macOS: Finally, all you Mac users out there. Thankfully, macOS is built upon unix, which means quite a few of the commands are the same as the Linux system. The first thing we have to do, however, is install a package manager. Homebrew is by far the best and is the one I use. To install it, execute the following command: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/masteinstall.sh)" You will be asked to enter your password and then the installation will start. Once this has been completed, you can use the command ‘brew’ to install applications through the command line. So now you can install ‘gcc’ using the following command: sudo brew install gcc And then you’re done. Now use the same commands as the Linux users to set up the development folders. Now, your editor. You can simply use the text editor built into the macOS system to write your code. Just make sure you save all the files with the ‘.cpp’ extension. And we’re done. Your systems should now be able to write, compile and run C++ code. This was my first ever tutorial so I would greatly appreciate any feedback on what I did right and wrong and how I could improve. Also, please ask as many questions as possible. Thank you.
This the newest iteration of my level 50 Mayhem 4 Moze build, "The Blackthorn". “A good fight was about momentum. Don't stop. Don't think. Drive forward and convince your enemies that they're as good as dead already. That way, they'll fight you less as you send them to their pyres.” The philosophy behind this build is to combine the "bottomless mags" playstyle with the "momentum" playstyle of the 1hp or Soldier Axton builds, while allowing the use of as many different guns as possible. We're relying on a couple interactions to crank Moze's damage as consistently high as possible while also being as flexible as we can. Skill Tree https://preview.redd.it/u37lbv95fiq51.jpg?width=1565&format=pjpg&auto=webp&s=cf9aed44cdb27804b8331a081c5043af319b2786 This is really an evolution of my level 60 "Specialist Moze" skill tree, and I've applied just about every lesson I've learned about Moze over the months. If you want my full breakdown for why I invested in which skills, feel free to check out my Specialist Moze build post. Like "Specialist Moze" this build operates on a principle of manufacturer loadouts to maximize magazine size with Matched Set. When combined with mag size rolls on your class mod and artifact, along with the fire rate reduction from Drowning In Brass, 2/1 in Redistribution allows you to get the splash boost from the Blast Master class mod on a wide variety of guns with minimal investment in the green tree. I've gotten comments that Cloud Of Lead is a better investment than Matched Set. I've tested and it doesn't work out that way. The reduced ammo consumption doesn't compensate for the lower ammo regen from Redistribution with smaller magazines. By investing just 9 points in the green tree (we're picking up Stoke The Embers for the boost to incendiary damage), we can go all the way down the Shield of Retribution tree, investing fully in Armored Infantry, Drowning In Brass, Phalanx Doctrine, and Tenacious Defense. While all of Moze's gun damage skills are additive, we are concentrating on weapons with splash damage and Short Fuse to balance the damage equation with a big splash damage number as well. This also allows us a good measure of survivability, even with smaller shields, which only goes up as we fight. Now, let's get into the gear. Class Mods
Blast Master - This is my main class mod with my Maliwan, Torgue, and Dahl loadouts. It's very consistent in damage, and can generate some massive numbers, considering Short Fuse double-dips in splash bonuses. Look for 1 point in Redistribution, Area-of-Effect and Magazine Size rolls.
Mind Sweeper - I primarily use this for bossing when I have access to the boss's crit spot. I also use this with my Hyperion loadouts and occasionally with Vladof. It isn't as consistent as Blast Master and you can absolutely kill yourself with the micro grenades, but the damage payoff can be insane if you're hitting crits.
Victory Rush - My go-to Aritifact with a splash and mag size roll. The Victory Rush is (I believe) V2 damage, so it will multiply your splash, elemental, and gun damage. Likewise, Moze needs all the movement speed help she can get. Prefix is flexible, as Snowdrift, Icebreaker, Atom Balm, and Last Stand are all useful.
Pearl of Ineffable Knowledge - This artifact is always great on Moze, and you're going to want a mag size roll. I prefer the Victory Rush because it can get AOE rolls, but the Pearl is a solid choice as well.
Shields There are a few shields I like based on what map I'm running. The one constant is that you want to form the Action Skill Start anointment. That allows you to use Tenacious Defense any time for a steady 30% gun damage boost, the ability to regen shields whenever you need, and access to shields' red text abilities.
Transformer - Ol' faithful. This is my shield of choice for Takedowns, as I run Pool Party and the constant shock pools help keep my shield full and Topped Off running.
Old God - Damage reduction and elemental damage boost. See if you can get one in every element as they're great all-around shields. Mix and match for the map you're running.
Plus Ultra - Another great shield. Ammo absorb is always handy for Moze, as is getting Iron Bear back ASAP, for more Tenacious Defense.
Nova Berner - The ASS anoint lets you nuke trash mobs, getting instant DIB and Phalanx stacks as you go into Iron Bear
Frozen Heart - An awesome defensive shield that's only going to get better with Iron Cub. Also, freezing everything then hitting them with Iron Bear crits with an Ice Breaker on makes farming a breeze.
Revengenader - Yes, a blue shield. It's probably easiest to farm this from vending machines. It's red text ability throws a grenade on shield break. If you have a 25% On Grenade Throw anointment with a purple Atlas or Hex, you're getting damage from the anoint and Tenacious Defense, as well as shield from TD, health from Vampyre, and free grenades out to crit and proc Redistribution. It's fun interaction that just about everyone is sleeping on.
Grenades For anointments, look for 25% On Grenade Throw. You're going to be tossing a lot of grenades so why not get more damage for it? Also, ASE elements don't matter with Short Fuse. As for individual grenades, we're sticking with the standard "Moze" kit here. The Cloning Maddening Tracker is the best in slot and GBX really needs to just make a legendary version so we can farm it. Finding CMT's are purely RNG-based, so if you don't have one, you can make any purple Atlas with dividing, MIRV, and/or Bouncy rolls work. The other top option is the Recurring Hex, or a Mirvtacular Hex works as well. The general idea is that you want as many explosions as possible to proc Vampyre, Redistribution (through crits), and Means Of Destruction. Guns To make this build work, you need to pick equip 4 guns from the same manufacturer. That maximizes your magazine size and allows you to fire longer without worrying about reloading. Some basic rules: - Get the biggest magazine you can find, even if that means a bit less damage. Short Fuse will more than make up the difference. - Look for lower pellet counts if you can. Both to keep ammo consumption down and also because Short Fuse has a short internal cooldown. Too many pellets firing too quickly essentially wastes ammo since you have pellets landing while SF is on cooldown. - Look for splash damage, consecutive hit, or weapon damage anointments on mobbing guns, 300/90 anointments on launchers. + elemental damage is okay if that's the best you can find, but it doesn't contribute to Short Fuse damage so they don't really matter for Moze. Maliwan
Westergun - Look for a Binary prefix with a 44 mag
Miss Moxxie's Crit - You shouldn't have to worry about dropping it as long as you're careful with your trigger finger. Hitting crits get you insane damage with this gun, and it can roll with the splash anoint for Short Fuse procs. Also, the high crit bonus and fire rate makes it great for the Mind Sweeper as well. Easy to farm too, since all it costs is money.
Ogre - The Ogre's mag is already big enough that an x2 variant is recommended here
Faisor - Using the shotgun mode
Monarch - Go for an x4 variant if you're using Blast Master, x8 if you're using Mindsweeper
Dowsing Rod - Using the grenade launcher
Sandhawk - Use in single fire mode. It gets a damage boost and it's easy to conserve ammo
Breath Of The Dying
Blood Starved Beast
Sawbar - Practice to find the right distance. The explosions will absolutely wreck once you do
Hangin' Chad - Awesome for replenishing ammo after using the Gargoyle and it does decent damage on its own
Yellowcake - If you still have a 300/90 one laying around, it's still viable. Hopefully the Cartels will be coming back sooner rather than later
Love Machine - Yes it's purple. It still wrecks anything flesh.
The Bitch - Similar use case as the Crit with the mindsweeper
The Reflux - Great mobbing gun and the chains seem to be able to proc Short Fuse
The Convergence - Short Fuse procs, as well as lots of pellets to crit and trigger Mind Sweeper grenades
The Facepuncher This one deserves its own section. The Facepuncher doesn't take advantage of Moze's gun damage or splash damage boosts, and it can't crit. So it's useless on her, right? NOPE When paired with a White Elephant artifact, the Facepuncher is absolutely amazing on Moze. While the FP can't crit or take advantage of Moze's skills, the stickies applied by the White Elephant artifact can. In fact, they double-dip into splash damage, giving them a ton of damage when paired with the Blast Master, and the fact that they can crit lets them play well with the Mind Sweeper. Between the stickies double-dipping in Moze's damage boosts, groundbreaker procs, and Mind Sweeper 'nades own damage formula, this combination is capable of some utterly insane damage output. As per usual, Blast Master is safer and more consistent, but Mind sweeper has a higher damage ceiling. I hope my fellow Moze players have fun with this build. Just remember to keep aiming for crit spots and tossing grenades to keep Redistribution active, and with some trigger discipline you can tackle pretty much anything this game can throw at you.
./play.it is a free/libre software that builds native packages for several Linux distributions from DRM-free installers for a collection of commercial games. These packages can then be installed using the standard distribution-provided tools (APT, pacman, emerge, etc.). A more complete description of ./play.it has already been posted in linux_gaming a couple months ago: ./play.it, an easy way to install commercial games on GNU/Linux It's already been one year since version 2.11 was released, in January 2019. We will only briefly review the changelog of version 2.12 and focus on the different points of ./play.it that kept us busy during all this time, and of which coding was only a small part.
What’s new with 2.12?
Though not the focus of this article, it would be a pity not to present all the added features of this brand new version. ;) Compared to the usual updates, 2.12 is a major one, especially since for two years, we slowed down the addition of new features. Some patches took dust since the end of 2018 before finally be integrated in this update! The list of changes for this 2.12 release can be found on our forge. Here is a full copy for convenience:
--output-dir: Set the output directory for generated packages
--overwrite: Replace packages if they already exist
--icons: Allow including icons only if dependencies are present
Drop $XDG_RUNTIME_DIR from the candidates for temporary directories
Prevent scan of unneeded directories
Drop script identification by MD5 hash
Only extract needed files when using unzip
Allow to use renamed installers
Add support for LHA archives extraction
New engine: ResidualVM
New engine: System-provided Mono runtime
DOSBox: Use $PLAYIT_DOSBOX_BINARY in launchers if defined
Add ability to set variables for package-specific postinst and prerm scripts
Arch Linux: Improve consistence of 32-bit packages naming
New helper functions:
version_target_is_older_than: Check if the game script target version is older than a given one
toupper: Convert files name to upper case
New generic dependency keywords:
libglib-2.0.so.0 / libgobject-2.0.so.0
libopenal.so.1 (alias for openal)
libSDL2-2.0.so.0 (alias for sdl2)
libvorbisfile.so.3 (alias for vorbis)
Codebase clean-up and improvements:
Massive rework of all message-related functions
Drop hardcoded paths for icons and .desktop launchers
Use system-specific default installation prefix for generated packages
Forcefully set errexit setting on library initialization
Use dirname/basename instead of built-in shell patterns
As many free/libre projects, ./play.it development started on some random sector of a creaking hard drive, and unsurprisingly, a whole part of its history (everything predating version 1.13.15 released on Mars 30th, 2016) disappeared into the limbs because some unwise operation destroyed the only copy of the repository… Lesson learned, what's not shared don't stay long, and so was born the first public Git repository of the project. The easing of collaborative work was only accidentally achieved by this quest for eternity, but wasn't the original motivation for making the repository publicly available. Following this decision, ./play.it source code has been hosted successively by many shared forge platforms:
GitHub, that we all know of, choosing it was more a short-term fallback than a long-term decision ;
some Gogs instance, which was hosted by debian-fr.xyz, a community the main ./play.it author is close to ;
Framagit, a famous instance of the infamous GitLab forge, hosted by Framasoft.
As development progressed, ./play.it began to increase its need for resources, dividing its code into several repositories to improve the workflow of the different aspects of the projects, adding continuous integration tests and their constraints, etc. A furious desire to understand the nooks and crannies behind a forge platform was the last deciding factor towards hosting a dedicated forge. So it happened, we deployed a forge platform on a dedicated server, hugely benefiting from the tremendous work achieved by the GitLab's package Debian Maintainers team. In return, we tried to contribute our findings in improving this software packaging. That was not expected, but this migration happened just a little time before the announcement “Déframasoftisons Internet !” (French article) about the planned end of Framagit. This dedicated instance used to be hosted on a VPS rented from Digital Ocean until the second half of July 2020, and since then has been moved to another VPS, rented from Hetzner. The specifications are similar, as well as the service, but thanks to this migration our hosting costs have been cut in half. Keeping in mind that this is paid by a single person, so any little donation helps a lot on this front. ;) To the surprise of our system administrator, this last migration took only a couple hours with no service interruption reported by our users.
This new forge can be found at forge.dotslashplay.it. Registrations are open to the public, but we ask you to not abuse this, the main restriction being that we do not wish to host projects unrelated to ./play.it. Of course exceptions are made for our active contributors, who are allowed to host some personal projects there. So, if you wish to use this forge to host your own work, you first need to make some significant contributions to ./play.it.
The collection of supported games growing endlessly, we have started the development of a public API allowing access to lots of information related to ./play.it. This API, which is not yet stabilized, is simply an interface to a versioned database containing all the ./play.it scripts, handled archives, games installable through the project. Relations are, of course, handled between those items, enabling its use for requests like : « What packages are required on my system to install Cæsar Ⅲ ? » or « What are the free (as in beer) games handled via DOSBox ? ». Originally developed as support for the new, in-development, Web site (we'll talk about it later on), this API should facilitate the development of tools around ./play.it. For example, it'll be useful for whomever would like to build a complete video game handling software (downloading, installation, starting, etc.) using ./play.it as one of its building bricks. For those curious about the technical side, it's an API based on Lumeneffectuant that makes requests on a MariaDB database, all self-hosted on a Debian Sid. Not only is the code of the API versioned on our forge, but also the structure and content of the databases, which will allow those who desired it to install a local version easily.
Based on the aforementioned API, a new website is under development and will replace our current website based on DokuWiki. Indeed, if the lack of database and the plain text files structure of DokuWiki seemed at first attractive, as ./play.it supported only a handful of games (link in French), this feature became more inconvenient as the library of ./play.it supported games grew. We shall make an in-depth presentation of this website for the 2.13 release of ./play.it, but a public demo of the development version from our forge is already available. If you feel like providing an helping hand on this task, some priority tasks have been identified to allow opening a new Web site able to replace the current one. And for those interested in technical details, this web Site was developed in PHP using the framework Laravel. The current in-development version is hosted for now on the same Debian Sid than the API.
A regular comment that is done about the project is that, if the purpose is to make installing games accessible to everyone without technical skills, having to run scripts in the terminal remains somewhat intimidating. Our answer until now has been that while the project itself doesn't aim to providing a graphical interface (KISS principle "Keep it simple, stupid"), still and always), but that it would be relatively easy to, later on, develop a graphical front-end to it. Well, it happens that is now reality. Around the time of our latest publication, one of our contributors, using the API we just talked about, developed a small prototype that is usable enough to warrant a little shout out. :-) In practice, it is some small Python 3 code (an HCI completely in POSIX shell is for a later date :-°), using GTK 3 (and still a VTE terminal to display the commands issued, but the user shouldn't have to input anything in it, except perhaps the root password to install some packages). This allowed to verify that, as we used to say, it would be relatively easy, since a script of less than 500 lines of code (written quickly over a week-end) was enough to do the job ! Of course, this graphical interface project stays independent from the main project, and is maintained in a specific repository. It seems interesting to us to promote it in order to ease the use of ./play.it, but this doesn't prevent any other similar projects to be born, for example using a different language or graphical toolkit (we, globally, don't have any particular affinity towards Python or GTK). The use of this HCI needs three steps : first, a list of available games is displayed, coming directly from our API. You just need to select in the list (optionally using the search bar) the game you want to install. Then it switches to a second display, which list the required files. If several alternatives are available, the user can select the one he wants to use. All those files must be in the same directory, the address bar on the top enabling to select which one to use (click on the open button on the top opens a filesystem navigation window). Once all those files available (if they can be downloaded, the software will do it automatically), you can move ahead to the third step, which is just watching ./play.it do its job :-) Once done, a simple click on the button on the bottom will run the game (even if, from this step, the game is fully integrated on your system as usual, you no longer need this tool to run it). To download potentially missing files, the HCI will use, depending on what's available on the system, either wget, curl or aria2c (this last one also handling torrents), of which the output will be displayed in the terminal of the third phase, just before running the scripts. For privilege escalation to install packages, sudo will be used preferentially if available (with the option to use a third-party application for password input, if the corresponding environment variable is set, which is more user-friendly), else su will be used. Of course, any suggestion for an improvement will be received with pleasure.
Of course, such an announcement would not be complete without a list of the games that got added to our collection since the 2.11 release… So here you go:
7 Billion Humans
Agatha Christie: The ABC Murders
Age of Mythology Demo
Among the Sleep
Anomaly: Warzone Earth
Another Lost Phone: Lauraʼs Story
Assault Android Cactus
Baba Is You
Blocks that matter (previously supported by ./play.it 1.x)
Commandos 3: Destination Berlin
Divine Divinity (previously supported by ./play.it 1.x)
Duet (previously supported by ./play.it 1.x)
Edna & Harvey: The Breakout — Anniversary Edition
Factorio — Demo
Full Throttle Remastered
Giana Sisters: Twisted Dreams
Gibbous — A Cthulhu Adventure
Indiana Jones and the Last Crusade
Into the Breach
Kerbal Space Program
LEGO Batman: The Videogame
Lego Harry Potter Years 1-4
Metal Slug 3 (previously supported by ./play.it 1.x)
MIND: Path to thalamus
Monkey Island 4: Escape from Monkey Island
Multiwinia (previously supported by ./play.it 1.x)
Myst: Masterpiece Edition (previously supported by ./play.it 1.x)
Neverwinter Nights: Enhanced Edition
Populous: Promised Lands (previously supported by ./play.it 1.x)
Populous 2 (previously supported by ./play.it 1.x)
Quern — Undying Thoughts
Retro City Rampage (previously supported by ./play.it 1.x)
Satellite Reign (previously supported by ./play.it 1.x)
Star Wars: Knights of the Old Republic (previously supported by ./play.it 1.x)
SteamWorld Quest: Hand of Gilgamech
Ancient Relics Story Pack
Arachnoid Portrait Pack
Distant Stars Story Pack
Humanoids Species Pack
Leviathans Story Pack
Lithoids Species Pack
Plantoids Species Pack
Synthetic Dawn Story Pack
Strike Suit Zero
Cyclopean Owl DLC
Tetrobot and Co.
The Adventures of Shuggy
The Aquatic Adventure of the Last Human
The Count Lucanor
The First Tree
The Pillars of the Earth
The Witcher (previously supported by ./play.it 1.x)
The Witcher 3: Wild Hunt
Tonight We Riot
Touhou Chireiden ~ Subterranean Animism — Demo
Touhou Hifuu Nightmare Diary ~ Violet Detector
Triple Triad Gold
Vambrace: Cold Soul
VVVVVV (previously supported by ./play.it 1.x)
War for the Overworld (the base game was already supported, new expansions have been added):
Heart of Gold
Seasonal Worker Skins
The Under Games
Warcraft: Orcs & Humans
Warhammer 40,000: Dawn of War — Winter Assault Demo
Warhammer 40,000: Gladius — Relics of War
Warlords Battlecry II (previously supported by ./play.it 1.x)
Wing Commander (previously supported by ./play.it 1.x)
Wing Commander II (previously supported by ./play.it 1.x)
Zak McKracken and the Alien Mindbenders
If your favourite game is not supported by ./play.it yet, you should ask for it in the dedicated tracker on our forge. The only requirement to be a valid request is that there exists a version of the game that is not burdened by DRM.
Our team being inexhaustible, work on the future 2.13 version has already begun… A few major objectives of this next version are :
the complete and definitive relegation to the archive bin of ./play.it 1.14, which is still required for about twenty games ;
Composition Challenge #25: September 14, 2020 – Sonata Form, Part 1: Exposition
Greetings, /musictheory! Welcome to our composition challenge. This is a space to put theory into practice by writing your own original music. An archive of all composition challenges, past and present, can be found in the wiki. This challenge thread will be stickied from September 14 through October 5.
The emphasis here is on skill acquisition. In order to build a knowledge base that will enable you to engage with the larger corpus of music theory and analysis, observe the following:
Satisfy all items on the challenge prompt. There is always room to write in excess of the prompt, but you should solve the compositional problems given in the challenge.
Post submissions as replies to this thread.
There is no deadline to submit and we encourage you to explore these prompts whenever you feel like it. However, know that challenge threads will be un-stickied and will receive less attention after the first Monday of the next month.
Compose a two-part sonata form exposition for piano. (The next challenge will involve crafting a development section and recapitulation, so don't worry about the rest of the form just yet.)
Use the formal scheme P TR MC S C. (See theory section for details.)
If P is in the major mode, S should be in the dominant key.
If P is in the minor mode, S should be in the relative major key or the minor dominant key.
Use periods and/or sentences as the basis of your P and S themes.
Use a linear intervallic pattern (LIP) somewhere in your exposition.
This challenge uses terminology and concepts from James Hepokoski and Warren Darcy's landmark treatise, Elements of Sonata Theory: Norms, Types, and Deformations in the Late-Eighteenth-Century Sonata. You will construct a Type-3 sonata, as this is what most sources mean when they say "sonata form." This is your Exposition/Development/Recapitulation model, where a tonal and rhetorical problem is set up in the exposition and eventually worked out by the time the recapitulation rolls around. This is what a two-part exposition looks like. You will be composing one of these. Observe the tonal plan and arrangement of items. And here is a zoomed out vie of a Type-3 Sonata Form. (Both diagrams are from page 17 of Hepokoski & Darcy's book.)
The first theme and the beginning of sonata space; sets the feel for the movement.
Facilitates the modulation from the home key to the new key in the exposition. Recomposed in the recapitulation so that it doesn't modulate. Builds energy.
A cadence followed by a rest that separates TR from S.
Structurally and sometimes rhetorically opposes P.
Essential Expositional Closure
The cadential goal of an exposition. The first cadence after S in the expo.
Essential Structural Closure
The cadential goal of a recapitulation and of the whole movement. The first cadence after S in the recap.
Postcadential material that follows S and concludes a rotation of sonata space. May be as little as a small codetta, may include a genuine closing theme, may have several modules.
Thematic areas may contain more than one "theme," but for this exercise try to focus on producing one really good P theme and one really good S theme. Videos:
Linear intervallic patterns are voice-leading patterns that prolong a harmony and possibly bridge the space between two structural chords. Sequences are built upon LIPs, but not all LIPs are sequences.
The primary theme and transition of Mozart's C major piano sonata, K.545, contains a sequence/LIP. Analysis. Note that P is a sentence ending on a half-cadence (with the continuation prolonged by its merger with TR). These things don't have to be long; the total path from P to the MC only takes 12 measures in this sonata.
Beethoven - Piano Sonata No. 19, Op.49, No.1, I. / Score – P is a modulating period (with a sentential antecedent!), where the consequent also acts as the TR. There is no MC here (rather, it is filled in — called "caesura fill"). The S theme is a parallel period beginning at m.16; the consequent begins at m.21 and goes to m.25, but then consequent repeats (what Janet Schmalfeldt calls the "one more time" technique), so the resolution happens at the downbeat of m.29. The C zone is just 4 measures with a pickup, from mm.30-33 (derived from the beginning of S). Also, if you're following the video, the score is Heinrich Schenker's edition, which inexplicably has the measure numbers at the end of the measure, making it look like the measure numbers are one bar off from where they should be.
Marianne von Martinez – Piano Sonata No. 3 in E Major / Score — Kind of a cool thing going on here. Here is the exposition analyzed. First off, notice that there are two themes in the S group: one is a sentence (S1), the other is a period (S2). S2 elides with the beginning of the Closing Zone, and C itself is basically the material of P and TR transposed into the dominant key. It's a little unusual but not unheard of. This movement is actually a Type-2 Sonata Form (the so-called "binary" sonata form), but since we're only looking at the exposition, that doesn't matter so much for us right now. However, the fact that the C zone is so P/TR-based plays into the rotational nature of the Type-2.
Joseph Haydn – Keyboard Sonata in E minor, Hob.XVI:34/ Score – Here's one in the minor mode. Here is the exposition analyzed. The P theme is a parallel period with a modulation. I'm not really sure what the TR is supposed to be doing here, since it's basically just hanging out in the new key the entire time. It's interesting to note that in the recapitulation, P and TR are chopped up and put back together as the presentation and continuation of a sentence respectively. (And I'm sure there are other interpretations.) I have the theme type for S identified as a "phrase group," which John David White in The Analysis of Music defines as such: "A group of three or more phrases linked together without the two-part feeling of a period can be termed a phrase-group. Phrase-group is also the appropriate label for a pair of consecutive phrases in which the first is a repetition of the second or in which, for whatever reason, the antecedent-consequent relationship is absent (46)." In this case, we are dealing with the last option.
You can find links to a variety of notation programs in the wiki.
Everything You Always Wanted To Know About Swaps* (*But Were Afraid To Ask)
Hello, dummies It's your old pal, Fuzzy. As I'm sure you've all noticed, a lot of the stuff that gets posted here is - to put it delicately - fucking ridiculous. More backwards-ass shit gets posted to wallstreetbets than you'd see on a Westboro Baptist community message board. I mean, I had a look at the daily thread yesterday and..... yeesh. I know, I know. We all make like the divine Laura Dern circa 1992 on the daily and stick our hands deep into this steaming heap of shit to find the nuggets of valuable and/or hilarious information within (thanks for reading, BTW). I agree. I love it just the way it is too. That's what makes WSB great. What I'm getting at is that a lot of the stuff that gets posted here - notwithstanding it being funny or interesting - is just... wrong. Like, fucking your cousin wrong. And to be clear, I mean the fucking your *first* cousin kinda wrong, before my Southerners in the back get all het up (simmer down, Billy Ray - I know Mabel's twice removed on your grand-sister's side). Truly, I try to let it slide. Idomybit to try and put you on the right path. Most of the time, I sleep easy no matter how badly I've seen someone explain what a bank liquidity crisis is. But out of all of those tens of thousands of misguided, autistic attempts at understanding the world of high finance, one thing gets so consistently - so *emphatically* - fucked up and misunderstood by you retards that last night I felt obligated at the end of a long work day to pull together this edition of Finance with Fuzzy just for you. It's so serious I'm not even going to make a u/pokimane gag. Have you guessed what it is yet? Here's a clue. It's in the title of the post. That's right, friends. Today in the neighborhood we're going to talk all about hedging in financial markets - spots, swaps, collars, forwards, CDS, synthetic CDOs, all that fun shit. Don't worry; I'm going to explain what all the scary words mean and how they impact your OTM RH positions along the way. We're going to break it down like this. (1) "What's a hedge, Fuzzy?" (2) Common Hedging Strategies and (3) All About ISDAs and Credit Default Swaps. Before we begin. For the nerds and JV traders in the back (and anyone else who needs to hear this up front) - I am simplifying these descriptions for the purposes of this post. I am also obviously not going to try and cover every exotic form of hedge under the sun or give a detailed summation of what caused the financial crisis. If you are interested in something specific ask a question, but don't try and impress me with your Investopedia skills or technical points I didn't cover; I will just be forced to flex my years of IRL experience on you in the comments and you'll look like a big dummy. TL;DR? Fuck you. There is no TL;DR. You've come this far already. What's a few more paragraphs? Put down the Cheetos and try to concentrate for the next 5-7 minutes. You'll learn something, and I promise I'll be gentle. Ready? Let's get started. 1.The Tao of Risk: Hedging as a Way of Life The simplest way to characterize what a hedge 'is' is to imagine every action having a binary outcome. One is bad, one is good. Red lines, green lines; uppie, downie. With me so far? Good. A 'hedge' is simply the employment of a strategy to mitigate the effect of your action having the wrong binary outcome. You wanted X, but you got Z! Frowny face. A hedge strategy introduces a third outcome. If you hedged against the possibility of Z happening, then you can wind up with Y instead. Not as good as X, but not as bad as Z. The technical definition I like to give my idiot juniors is as follows: Utilization of a defensive strategy to mitigate risk, at a fraction of the cost to capital of the risk itself. Congratulations. You just finished Hedging 101. "But Fuzzy, that's easy! I just sold a naked call against my 95% OTM put! I'm adequately hedged!". Spoiler alert: you're not (although good work on executing a collar, which I describe below). What I'm talking about here is what would be referred to as a 'perfect hedge'; a binary outcome where downside is totally mitigated by a risk management strategy. That's not how it works IRL. Pay attention; this is the tricky part. You can't take a single position and conclude that you're adequately hedged because risks are fluid, not static. So you need to constantly adjust your position in order to maximize the value of the hedge and insure your position. You also need to consider exposure to more than one category of risk. There are micro (specific exposure) risks, and macro (trend exposure) risks, and both need to factor into the hedge calculus. That's why, in the real world, the value of hedging depends entirely on the design of the hedging strategy itself. Here, when we say "value" of the hedge, we're not talking about cash money - we're talking about the intrinsic value of the hedge relative to the the risk profile of your underlying exposure. To achieve this, people hedge dynamically. In wallstreetbets terms, this means that as the value of your position changes, you need to change your hedges too. The idea is to efficiently and continuously distribute and rebalance risk across different states and periods, taking value from states in which the marginal cost of the hedge is low and putting it back into states where marginal cost of the hedge is high, until the shadow value of your underlying exposure is equalized across your positions. The punchline, I guess, is that one static position is a hedge in the same way that the finger paintings you make for your wife's boyfriend are art - it's technically correct, but you're only playing yourself by believing it. Anyway. Obviously doing this as a small potatoes trader is hard but it's worth taking into account. Enough basic shit. So how does this work in markets? 2. A Hedging Taxonomy The best place to start here is a practical question. What does a business need to hedge against? Think about the specific risk that an individual business faces. These are legion, so I'm just going to list a few of the key ones that apply to most corporates. (1) You have commodity risk for the shit you buy or the shit you use. (2) You have currency risk for the money you borrow. (3) You have rate risk on the debt you carry. (4) You have offtake risk for the shit you sell. Complicated, right? To help address the many and varied ways that shit can go wrong in a sophisticated market, smart operators like yours truly have devised a whole bundle of different instruments which can help you manage the risk. I might write about some of the more complicated ones in a later post if people are interested (CDO/CLOs, strip/stack hedges and bond swaps with option toggles come to mind) but let's stick to the basics for now. (i) Swaps A swap is one of the most common forms of hedge instrument, and they're used by pretty much everyone that can afford them. The language is complicated but the concept isn't, so pay attention and you'll be fine. This is the most important part of this section so it'll be the longest one. Swaps are derivative contracts with two counterparties (before you ask, you can't trade 'em on an exchange - they're OTC instruments only). They're used to exchange one cash flow for another cash flow of equal expected value; doing this allows you to take speculative positions on certain financial prices or to alter the cash flows of existing assets or liabilities within a business. "Wait, Fuzz; slow down! What do you mean sets of cash flows?". Fear not, little autist. Ol' Fuzz has you covered. The cash flows I'm talking about are referred to in swap-land as 'legs'. One leg is fixed - a set payment that's the same every time it gets paid - and the other is variable - it fluctuates (typically indexed off the price of the underlying risk that you are speculating on / protecting against). You set it up at the start so that they're notionally equal and the two legs net off; so at open, the swap is a zero NPV instrument. Here's where the fun starts. If the price that you based the variable leg of the swap on changes, the value of the swap will shift; the party on the wrong side of the move ponies up via the variable payment. It's a zero sum game. I'll give you an example using the most vanilla swap around; an interest rate trade. Here's how it works. You borrow money from a bank, and they charge you a rate of interest. You lock the rate up front, because you're smart like that. But then - quelle surprise! - the rate gets better after you borrow. Now you're bagholding to the tune of, I don't know, 5 bps. Doesn't sound like much but on a billion dollar loan that's a lot of money (a classic example of the kind of 'small, deep hole' that's terrible for profits). Now, if you had a swap contract on the rate before you entered the trade, you're set; if the rate goes down, you get a payment under the swap. If it goes up, whatever payment you're making to the bank is netted off by the fact that you're borrowing at a sub-market rate. Win-win! Or, at least, Lose Less / Lose Less. That's the name of the game in hedging. There are many different kinds of swaps, some of which are pretty exotic; but they're all different variations on the same theme. If your business has exposure to something which fluctuates in price, you trade swaps to hedge against the fluctuation. The valuation of swaps is also super interesting but I guarantee you that 99% of you won't understand it so I'm not going to try and explain it here although I encourage you to google it if you're interested. Because they're OTC, none of them are filed publicly. Someeeeeetimes you see an ISDA (dsicussed below) but the confirms themselves (the individual swaps) are not filed. You can usually read about the hedging strategy in a 10-K, though. For what it's worth, most modern credit agreements ban speculative hedging. Top tip: This is occasionally something worth checking in credit agreements when you invest in businesses that are debt issuers - being able to do this increases the risk profile significantly and is particularly important in times of economic volatility (ctrl+f "non-speculative" in the credit agreement to be sure). (ii) Forwards A forward is a contract made today for the future delivery of an asset at a pre-agreed price. That's it. "But Fuzzy! That sounds just like a futures contract!". I know. Confusing, right? Just like a futures trade, forwards are generally used in commodity or forex land to protect against price fluctuations. The differences between forwards and futures are small but significant. I'm not going to go into super boring detail because I don't think many of you are commodities traders but it is still an important thing to understand even if you're just an RH jockey, so stick with me. Just like swaps, forwards are OTC contracts - they're not publicly traded. This is distinct from futures, which are traded on exchanges (see The Ballad Of Big Dick Vick for some more color on this). In a forward, no money changes hands until the maturity date of the contract when delivery and receipt are carried out; price and quantity are locked in from day 1. As you now know having read about BDV, futures are marked to market daily, and normally people close them out with synthetic settlement using an inverse position. They're also liquid, and that makes them easier to unwind or close out in case shit goes sideways. People use forwards when they absolutely have to get rid of the thing they made (or take delivery of the thing they need). If you're a miner, or a farmer, you use this shit to make sure that at the end of the production cycle, you can get rid of the shit you made (and you won't get fucked by someone taking cash settlement over delivery). If you're a buyer, you use them to guarantee that you'll get whatever the shit is that you'll need at a price agreed in advance. Because they're OTC, you can also exactly tailor them to the requirements of your particular circumstances. These contracts are incredibly byzantine (and there are even crazier synthetic forwards you can see in money markets for the true degenerate fund managers). In my experience, only Texan oilfield magnates, commodities traders, and the weirdo forex crowd fuck with them. I (i) do not own a 10 gallon hat or a novelty size belt buckle (ii) do not wake up in the middle of the night freaking out about the price of pork fat and (iii) love greenbacks too much to care about other countries' monopoly money, so I don't fuck with them. (iii) Collars No, not the kind your wife is encouraging you to wear try out to 'spice things up' in the bedroom during quarantine. Collars are actually the hedging strategy most applicable to WSB. Collars deal with options! Hooray! To execute a basic collar (also called a wrapper by tea-drinking Brits and people from the Antipodes), you buy an out of the money put while simultaneously writing a covered call on the same equity. The put protects your position against price drops and writing the call produces income that offsets the put premium. Doing this limits your tendies (you can only profit up to the strike price of the call) but also writes down your risk. If you screen large volume trades with a VOL/OI of more than 3 or 4x (and they're not bullshit biotech stocks), you can sometimes see these being constructed in real time as hedge funds protect themselves on their shorts. (3) All About ISDAs, CDS and Synthetic CDOs You may have heard about the mythical ISDA. Much like an indenture (discussed in my post on $F), it's a magic legal machine that lets you build swaps via trade confirms with a willing counterparty. They are very complicated legal documents and you need to be a true expert to fuck with them. Fortunately, I am, so I do. They're made of two parts; a Master (which is a form agreement that's always the same) and a Schedule (which amends the Master to include your specific terms). They are also the engine behind just about every major credit crunch of the last 10+ years. First - a brief explainer. An ISDA is a not in and of itself a hedge - it's an umbrella contract that governs the terms of your swaps, which you use to construct your hedge position. You can trade commodities, forex, rates, whatever, all under the same ISDA. Let me explain. Remember when we talked about swaps? Right. So. You can trade swaps on just about anything. In the late 90s and early 2000s, people had the smart idea of using other people's debt and or credit ratings as the variable leg of swap documentation. These are called credit default swaps. I was actually starting out at a bank during this time and, I gotta tell you, the only thing I can compare people's enthusiasm for this shit to was that moment in your early teens when you discover jerking off. Except, unlike your bathroom bound shame sessions to Mom's Sears catalogue, every single person you know felt that way too; and they're all doing it at once. It was a fiscal circlejerk of epic proportions, and the financial crisis was the inevitable bukkake finish. WSB autism is absolutely no comparison for the enthusiasm people had during this time for lighting each other's money on fire. Here's how it works. You pick a company. Any company. Maybe even your own! And then you write a swap. In the swap, you define "Credit Event" with respect to that company's debt as the variable leg . And you write in... whatever you want. A ratings downgrade, default under the docs, failure to meet a leverage ratio or FCCR for a certain testing period... whatever. Now, this started out as a hedge position, just like we discussed above. The purest of intentions, of course. But then people realized - if bad shit happens, you make money. And banks... don't like calling in loans or forcing bankruptcies. Can you smell what the moral hazard is cooking? Enter synthetic CDOs. CDOs are basically pools of asset backed securities that invest in debt (loans or bonds). They've been around for a minute but they got famous in the 2000s because a shitload of them containing subprime mortgage debt went belly up in 2008. This got a lot of publicity because a lot of sad looking rednecks got foreclosed on and were interviewed on CNBC. "OH!", the people cried. "Look at those big bad bankers buying up subprime loans! They caused this!". Wrong answer, America. The debt wasn't the problem. What a lot of people don't realize is that the real meat of the problem was not in regular way CDOs investing in bundles of shit mortgage debts in synthetic CDOs investing in CDS predicated on that debt. They're synthetic because they don't have a stake in the actual underlying debt; just the instruments riding on the coattails. The reason these are so popular (and remain so) is that smart structured attorneys and bankers like your faithful correspondent realized that an even more profitable and efficient way of building high yield products with limited downside was investing in instruments that profit from failure of debt and in instruments that rely on that debt and then hedging that exposure with other CDS instruments in paired trades, and on and on up the chain. The problem with doing this was that everyone wound up exposed to everybody else's books as a result, and when one went tits up, everybody did. Hence, recession, Basel III, etc. Thanks, Obama. Heavy investment in CDS can also have a warping effect on the price of debt (something else that happened during the pre-financial crisis years and is starting to happen again now). This happens in three different ways. (1) Investors who previously were long on the debt hedge their position by selling CDS protection on the underlying, putting downward pressure on the debt price. (2) Investors who previously shorted the debt switch to buying CDS protection because the relatively illiquid debt (partic. when its a bond) trades at a discount below par compared to the CDS. The resulting reduction in short selling puts upward pressure on the bond price. (3) The delta in price and actual value of the debt tempts some investors to become NBTs (neg basis traders) who long the debt and purchase CDS protection. If traders can't take leverage, nothing happens to the price of the debt. If basis traders can take leverage (which is nearly always the case because they're holding a hedged position), they can push up or depress the debt price, goosing swap premiums etc. Anyway. Enough technical details. I could keep going. This is a fascinating topic that is very poorly understood and explained, mainly because the people that caused it all still work on the street and use the same tactics today (it's also terribly taught at business schools because none of the teachers were actually around to see how this played out live). But it relates to the topic of today's lesson, so I thought I'd include it here. Work depending, I'll be back next week with a covenant breakdown. Most upvoted ticker gets the post. *EDIT 1\* In a total blowout, $PLAY won. So it's D&B time next week. Post will drop Monday at market open.
Daughters don’t believe in church, one doesn’t believe in God
Ok, I’m struggling with my kids. I have 4 daughters. The 2 oldest are out of the home. Both left the church but still believe in God. My youngest 2 are 15 and 14. Let’s call them E and G respectively. A week or so ago, G broke down to me and said she feels like she is non-binary. She was worried her dad and wouldn’t love her anymore. I reassured her that we would always love her no matter what and that there was nothing in this universe that could make us stop loving her. I’ve known for a while that she’s been struggling with the church and her testimony. But this seemed to come out of left field. She wanted to change her name and her hair color. I told her we wouldn’t legally change her name and she was fine with that. I also told her we would not do any medical hormone therapy and she’s fine with that. She isn’t interested in that. I talked to her about what the leadership manual says about it and I just talked to her from my heart. She seems to be ok, but still feels the same way. We also let her color her hair, which she loves. E came to me today begging to not attend seminary this year. This will be her first year. Our older girls also didn’t attend seminary and I feel like it had a lot to do with them leaving the church. Then E told me she isn’t even sure God is real. I shared my testimony with her and we talked for a while. But she begged me not to make her go to seminary. I asked her to try to have a little faith and pray again about God. She reluctantly agreed. Seminary this year is home study with one zoom meeting a week. E is extremely introverted so I thought home seminary would sound better for her. We live in a small branch that has made things harder for our girls. I have NEVER had a problem with my testimony. It’s so hard for me to understand how they don’t see Gods’ work in the world. I guess I can kinda see it, but I’ve just never had to struggle to see God. So I don’t know what to do. We haven’t been to church since March, and probably won’t be back anytime soon because my husband is high risk. We are struggling to do lessons at home. My husband and I are both disabled and I’m pretty much bedridden so we can’t go out and do things, so we are stuck at home and all they do is play on their devices. That’s all we can do. We don’t have the money to provide them better opportunities or options of things to do. So idk what to do to help them. I feel like they are going down a hole that will be very hard for them to get out of. Any ideas on how to help? Any good church videos I can show them? Good talks?
This post draws on my personal experiences and challenges over the past term at school, which I entered with hardly any knowledge of DSA (data structures and algorithms) and problem-solving strategies. As a self-taught programmer, I was a lot more familiar and comfortable with general programming, such as object-oriented programming, than with the problem-solving skills required in DSA questions. This post reflects my journey throughout the term and the resources I turned to in order to quickly improve for my coding interview. Here're some common questions and answers What's the interview process like at a tech company? Good question. It's actually pretty different from most other companies.
(What It's Like To Interview For A Coding Job
First time interviewing for a tech job? Not sure what to expect? This article is for you.
Here are the usual steps:
First, you’ll do a non-technical phone screen.
Then, you’ll do one or a few technical phone interviews.
Finally, the last step is an onsite interview.
Some companies also throw in a take-home code test—sometimes before the technical phone interviews, sometimes after. Let’s walk through each of these steps.
The non-technical phone screen
This first step is a quick call with a recruiter—usually just 10–20 minutes. It's very casual. Don’t expect technical questions. The recruiter probably won’t be a programmer. The main goal is to gather info about your job search. Stuff like:
Your timeline. Do you need to sign an offer in the next week? Or are you trying to start your new job in three months?
What’s most important to you in your next job. Great team? Flexible hours? Interesting technical challenges? Room to grow into a more senior role?
What stuff you’re most interested in working on. Front end? Back end? Machine learning?
Be honest about all this stuff—that’ll make it easier for the recruiter to get you what you want. One exception to that rule: If the recruiter asks you about your salary expectations on this call, best not to answer. Just say you’d rather talk about compensation after figuring out if you and the company are a good fit. This’ll put you in a better negotiating position later on.
The technical phone interview(s)
The next step is usually one or more hour-long technical phone interviews. Your interviewer will call you on the phone or tell you to join them on Skype or Google Hangouts. Make sure you can take the interview in a quiet place with a great internet connection. Consider grabbing a set of headphones with a good microphone or a bluetooth earpiece. Always test your hardware beforehand! The interviewer will want to watch you code in real time. Usually that means using a web-based code editor like Coderpad or collabedit. Run some practice problems in these tools ahead of time, to get used to them. Some companies will just ask you to share your screen through Google Hangouts or Skype. Turn off notifications on your computer before you get started—especially if you’re sharing your screen! Technical phone interviews usually have three parts:
Beginning chitchat (5–10 minutes)
Technical challenges (30–50 minutes)
Your turn to ask questions (5–10 minutes)
The beginning chitchat is half just to help your relax, and half actually part of the interview. The interviewer might ask some open-ended questions like:
Tell me about yourself.
Tell me about something you’ve built that you’re particularly proud of.
I see this project listed on your resume—tell me more about that.
You should be able to talk at length about the major projects listed on your resume. What went well? What didn’t? How would you do things differently now? Then come the technical challenges—the real meet of the interview. You’ll spend most of the interview on this. You might get one long question, or several shorter ones. What kind of questions can you expect? It depends. Startups tend to ask questions aimed towards building or debugging code. (“Write a function that takes two rectangles and figures out if they overlap.”). They’ll care more about progress than perfection. Larger companies will want to test your general know-how of data structures and algorithms (“Write a function that checks if a binary tree is ‘balanced’ in O(n)O(n) ↴ time.”). They’ll care more about how you solve and optimize a problem. With these types of questions, the most important thing is to be communicating with your interviewer throughout. You'll want to "think out loud" as you work through the problem. For more info, check out our more detailed step-by-step tips for coding interviews. If the role requires specific languages or frameworks, some companies will ask trivia-like questions (“In Python, what’s the ‘global interpreter lock’?”). After the technical questions, your interviewer will open the floor for you to askthemquestions. Take some time before the interview to comb through the company’s website. Think of a few specific questions about the company or the role. This can really make you stand out. When you’re done, they should give you a timeframe on when you’ll hear about next steps. If all went well, you’ll either get asked to do another phone interview, or you’ll be invited to their offices for an onsite.
The onsite interview
An onsite interview happens in person, at the company’s office. If you’re not local, it’s common for companies to pay for a flight and hotel room for you. The onsite usually consists of 2–6 individual, one-on-one technical interviews (usually in a small conference room). Each interview will be about an hour and have the same basic form as a phone screen—technical questions, bookended by some chitchat at the beginning and a chance for you to ask questions at the end. The major difference between onsite technical interviews and phone interviews though: you’ll be coding on a whiteboard. This is awkward at first. No autocomplete, no debugging tools, no delete button…ugh. The good news is, after some practice you get used to it. Before your onsite, practice writing code on a whiteboard (in a pinch, a pencil and paper are fine). Some tips:
Start in the top-most left corner of the whiteboard. This gives you the most room. You’ll need more space than you think.
Leave a blank line between each line as you write your code. Makes it much easier to add things in later.
Take an extra second to decide on your variable names. Don’t rush this part. It might seem like a waste of time, but using more descriptive variable names ultimately saves you time because it makes you less likely to get confused as you write the rest of your code.
If a technical phone interview is a sprint, an onsite is a marathon. The day can get really long. Best to keep it open—don’t make other plans for the afternoon or evening. When things go well, you’ wrap-up by chatting with the CEO or some other director. This is half an interview, half the company trying to impress you. They may invite you to get drinks with the team after hours. All told, a long day of onsite interviews could look something like this:
10am-12pm: two back-to-back technical interviews, each about an hour.
12pm-1pm: one or several engineers will take you to lunch, perhaps in the company’s fancy office cafeteria.
1pm-4pm: three back-to-back technical interviews, each about an hour.
4pm-5pm: interview with the CEO or some sort of director.
Code tests aren’t ubiquitous, but they seem to be gaining in popularity. They’re far more common at startups, or places where your ability to deliver right away is more important than your ability to grow. You’ll receive a description of an app or service, a rough time constraint for writing your code, and a deadline for when to turn it in. The deadline is usually negotiable. Here's an example problem: Write a basic “To-Do” app. Unit test the core functionality. As a bonus, add a “reminders” feature. Try to spend no more than 8 hours on it, and send in what you have by Friday with a small write-up. Take a crack at the “bonus” features if they include any. At the very least, write up how you would implement it. If they’re hiring for people with knowledge of a particular framework, they might tell you what tech to use. Otherwise, it’ll be up to you. Use what you’re most comfortable with. You want this code to show you at your best. Some places will offer to pay you for your time. It's rare, but some places will even invite you to work with them in their office for a few days, as a "trial.") Do I need to know this "big O" stuff? Big O notation is the language we use for talking about the efficiency of data structures and algorithms. Will it come up in your interviews? Well, it depends. There are different types of interviews. There’s the classic algorithmic coding interview, sometimes called the “Google-style whiteboard interview.” It’s focused on data structures and algorithms (queues and stacks, binary search, etc). That’s what our full course prepares you for. It's how the big players interview. Google, Facebook, Amazon, Microsoft, Oracle, LinkedIn, etc. For startups and smaller shops, it’s a mixed bag. Most will ask at least a few algorithmic questions. But they might also include some role-specific stuff, like Java questions or SQL questions for a backend web engineer. They’ll be especially interested in your ability to ship code without much direction. You might end up doing a code test or pair-programming exercise instead of a whiteboarding session. To make sure you study for the right stuff, you should ask your recruiter what to expect. Send an email with a question like, “Is this interview going to cover data structures and algorithms? Or will it be more focused around coding in X language.” They’ll be happy to tell you. If you've never learned about data structures and algorithms, or you're feeling a little rusty, check out our Intuitive Guide to Data Structures and Algorithms. Which programming language should I use? Companies usually let you choose, in which case you should use your most comfortable language. If you know a bunch of languages, prefer one that lets you express more with fewer characters and fewer lines of code, like Python or Ruby. It keeps your whiteboard cleaner. Try to stick with the same language for the whole interview, but sometimes you might want to switch languages for a question. E.g., processing a file line by line will be far easier in Python than in C++. Sometimes, though, your interviewer will do this thing where they have a pet question that’s, for example, C-specific. If you list C on your resume, they’ll ask it. So keep that in mind! If you’re not confident with a language, make that clear on your resume. Put your less-strong languages under a header like ‘Working Knowledge.’ What should I wear? A good rule of thumb is to dress a tiny step above what people normally wear to the office. For most west coast tech companies, the standard digs are just jeans and a t-shirt. Ask your recruiter what the office is like if you’re worried about being too casual. Should I send a thank-you note? Thank-you notes are nice, but they aren’t really expected. Be casual if you send one. No need for a hand-calligraphed note on fancy stationery. Opt for a short email to your recruiter or the hiring manager. Thank them for helping you through the process, and ask them to relay your thanks to your interviewers. 1) Coding Interview Tips How to get better at technical interviews without practicing Chitchat like a pro. Before diving into code, most interviewers like to chitchat about your background. They're looking for:
Metacognition about coding. Do you think about how to code well?
Ownership/leadership. Do you see your work through to completion? Do you fix things that aren't quite right, even if you don't have to?
Communication. Would chatting with you about a technical problem be useful or painful?
You should have at least one:
example of an interesting technical problem you solved
example of an interpersonal conflict you overcame
example of leadership or ownership
story about what you should have done differently in a past project
piece of trivia about your favorite language, and something you do and don't like about said language
question about the company's product/business
question about the company's engineering strategy (testing, Scrum, etc)
Nerd out about stuff. Show you're proud of what you've done, you're amped about what they're doing, and you have opinions about languages and workflows. Communicate. Once you get into the coding questions, communication is key. A candidate who needed some help along the way but communicated clearly can be even better than a candidate who breezed through the question. Understand what kind of problem it is. There are two types of problems:
Coding. The interviewer wants to see you write clean, efficient code for a problem.
"I have to at least look at all of the items, so I can't do better than O(n)O(n)."
"The brute force approach is to test all possibilities, which is O(n^2)O(n2)."
"The answer will contain n^2n2 items, so I must at least spend that amount of time."
Get your thoughts down. It's easy to trip over yourself. Focus on getting your thoughts down first and worry about the details at the end. Call a helper function and keep moving. If you can't immediately think of how to implement some part of your algorithm, big or small, just skip over it. Write a call to a reasonably-named helper function, say "this will do X" and keep going. If the helper function is trivial, you might even get away with never implementing it. Don't worry about syntax. Just breeze through it. Revert to English if you have to. Just say you'll get back to it. Leave yourself plenty of room. You may need to add code or notes in between lines later. Start at the top of the board and leave a blank line between each line. Save off-by-one checking for the end. Don't worry about whether your for loop should have "<<" or "<=<=." Write a checkmark to remind yourself to check it at the end. Just get the general algorithm down. Use descriptive variable names. This will take time, but it will prevent you from losing track of what your code is doing. Use names_to_phone_numbers instead of nums. Imply the type in the name. Functions returning booleans should start with "is_*". Vars that hold a list should end with "s." Choose standards that make sense to you and stick with them. Clean up when you're done. Walk through your solution by hand, out loud, with an example input. Actually write down what values the variables hold as the program is running—you don't win any brownie points for doing it in your head. This'll help you find bugs and clear up confusion your interviewer might have about what you're doing. Look for off-by-one errors. Should your for loop use a "<=<=" instead of a "<<"? Test edge cases. These might include empty sets, single-item sets, or negative numbers. Bonus: mention unit tests! Don't be boring. Some interviewers won't care about these cleanup steps. If you're unsure, say something like, "Then I'd usually check the code against some edge cases—should we do that next?" Practice. In the end, there's no substitute for running practice questions. Actually write code with pen and paper. Be honest with yourself. It'll probably feel awkward at first. Good. You want to get over that awkwardness now so you're not fumbling when it's time for the real interview. 2) Tricks For Getting Unstuck During a Coding Interview Getting stuck during a coding interview is rough. If you weren’t in an interview, you might take a break or ask Google for help. But the clock is ticking, and you don’t have Google. You just have an empty whiteboard, a smelly marker, and an interviewer who’s looking at you expectantly. And all you can think about is how stuck you are. You need a lifeline for these moments—like a little box that says “In Case of Emergency, Break Glass.” Inside that glass box? A list of tricks for getting unstuck. Here’s that list of tricks. When you’re stuck on getting started 1) Write a sample input on the whiteboard and turn it into the correct output "by hand." Notice the process you use. Look for patterns, and think about how to implement your process in code. Trying to reverse a string? Write “hello” on the board. Reverse it “by hand”—draw arrows from each character’s current position to its desired position. Notice the pattern: it looks like we’re swapping pairs of characters, starting from the outside and moving in. Now we’re halfway to an algorithm. 2) Solve a simpler version of the problem. Remove or simplify one of the requirements of the problem. Once you have a solution, see if you can adapt that approach for the original question. Trying to find the k-largest element in a set? Walk through finding the largest element, then the second largest, then the third largest. Generalizing from there to find the k-largest isn’t so bad. 3) Start with an inefficient solution. Even if it feels stupidly inefficient, it’s often helpful to start with something that’ll return the right answer. From there, you just have to optimize your solution. Explain to your interviewer that this is only your first idea, and that you suspect there are faster solutions. Suppose you were given two lists of sorted numbers and asked to find the median of both lists combined. It’s messy, but you could simply:
Concatenate the arrays together into a new array.
Sort the new array.
Return the value at the middle index.
Notice that you could’ve also arrived at this algorithm by using trick (2): Solve a simpler version of the problem. “How would I find the median of one sorted list of numbers? Just grab the item at the middle index. Now, can I adapt that approach for getting the median of two sorted lists?” When you’re stuck on finding optimizations 1) Look for repeat work. If your current solution goes through the same data multiple times, you’re doing unnecessary repeat work. See if you can save time by looking through the data just once. Say that inside one of your loops, there’s a brute-force operation to find an element in an array. You’re repeatedly looking through items that you don’t have to. Instead, you could convert the array to a lookup table to dramatically improve your runtime. 2) Look for hints in the specifics of the problem. Is the input array sorted? Is the binary tree balanced? Details like this can carry huge hints about the solution. If it didn’t matter, your interviewer wouldn’t have brought it up. It’s a strong sign that the best solution to the problem exploits it. Suppose you’re asked to find the first occurrence of a number in a sorted array. The fact that the array is sorted is a strong hint—take advantage of that fact by using a binary search. Sometimes interviewers leave the question deliberately vague because they want you to ask questions to unearth these important tidbits of context. So ask some questions at the beginning of the problem. 3) Throw somedata structuresat the problem. Can you save time by using the fast lookups of a hash table? Can you express the relationships between data points as a graph? Look at the requirements of the problem and ask yourself if there’s a data structure that has those properties. 4) Establish bounds on space and runtime. Think out loud about the parameters of the problem. Try to get a sense for how fast your algorithm could possibly be:
“I have to at least look at all the items, so I can’t do better than O(n)O(n) ↴ time”.
“The brute force approach is to test all possibilities, which is O(n^2)O(n2) time. So the question is whether or not I can beat that time.”
“The answer will contain n^2n2 items, so I must at least spend that amount of time.”
When All Else Fails 1) Make it clear where you are. State what you know, what you’re trying to do, and highlight the gap between the two. The clearer you are in expressing exactly where you’re stuck, the easier it is for your interviewer to help you. 2) Pay attention to your interviewer. If she asks a question about something you just said, there’s probably a hint buried in there. Don’t worry about losing your train of thought—drop what you’re doing and dig into her question. Relax. You’resupposedto get stuck. Interviewers choose hard problems on purpose. They want to see how you poke at a problem you don’t immediately know how to solve. Seriously. If you don’t get stuck and just breeze through the problem, your interviewer’s evaluation might just say “Didn’t get a good read on candidate’s problem-solving process—maybe she’d already seen this interview question before?” On the other hand, if you do get stuck, use one of these tricks to get unstuck, and communicate clearly with your interviewer throughout...that’s how you get an evaluation like, “Great problem-solving skills. Hire.” 3) Fixing Impostor Syndrome in Coding Interviews “It's a fluke that I got this job interview...” “I studied for weeks, but I’m still not prepared...” “I’m not actually good at this. They’re going to see right through me...” If any of these thoughts resonate with you, you're not alone. They are so common they have a name: impostor syndrome. It’s that feeling like you’re on the verge of being exposed for what you really are—an impostor. A fraud. Impostor syndrome is like kryptonite to coding interviews. It makes you give up and go silent. You might stop asking clarifying questions because you’re afraid they’ll sound too basic. Or you might neglect to think out loud at the whiteboard, fearing you’ll say something wrong and sound incompetent. You know you should speak up, but the fear of looking like an impostor makes that really, really hard. Here’s the good news: you’renotan impostor. You just feel like an impostor because of some common cognitive biases about learning and knowledge. Once you understand these cognitive biases—where they come from and how they work—you can slowly fix them. You can quiet your worries about being an impostor and keep those negative thoughts from affecting your interviews.
Everything you could know
Here’s how impostor syndrome works. Software engineering is a massive field. There’s a huge universe of things you could know. Huge. In comparison to the vast world of things you could know, the stuff you actually know is just a tiny sliver: That’s the first problem. It feels like you don’t really know that much, because you only know a tiny sliver of all the stuff there is to know.
The expanding universe
It gets worse: counterintuitively, as you learn more, your sliver of knowledge feels like it'sshrinking. That's because you brush up against more and more things you don’t know yet. Whole disciplines like machine learning, theory of computation, and embedded systems. Things you can't just pick up in an afternoon. Heavy bodies of knowledge that take months to understand. So the universe of things you could know seems to keep expanding faster and faster—much faster than your tiny sliver of knowledge is growing. It feels like you'll never be able to keep up.
What everyone else knows
Here's another common cognitive bias: we assume that because something is easy for us, it must be easy for everyone else. So when we look at our own skills, we assume they're not unique. But when we look at other people's skills, we notice the skills they have that we don't have. The result? We think everyone’s knowledge is a superset of our own: This makes us feel like everyone else is ahead of us. Like we're always a step behind. But the truth is more like this: There's a whole area of stuff you know that neither Aysha nor Bruno knows. An area you're probably blind to, because you're so focused on the stuff you don't know. We’ve all had flashes of realizing this. For me, it was seeing the back end code wizard on my team—the one that always made me feel like an impostor—spend an hour trying to center an image on a webpage.
It's a problem of focus
Focusing on what you don't know causes you to underestimate what you do know. And that's what causes impostor syndrome. By looking at the vast (and expanding) universe of things you could know, you feel like you hardly know anything. And by looking at what Aysha and Bruno know that you don't know, you feel like you're a step behind. And interviews make you really focus on what you don't know. You focus on what could go wrong. The knowledge gaps your interviewers might find. The questions you might not know how to answer. But remember: Just because Aysha and Bruno know some things you don't know, doesn't mean you don't also know things Aysha and Bruno don't know. And more importantly, everyone's body of knowledge is just a teeny-tiny sliver of everything they could learn. We all have gaps in our knowledge. We all have interview questions we won't be able to answer. You're not a step behind. You just have a lot of stuff you don't know yet. Just like everyone else. 4) The 24 Hours Before Your Interview
Feeling anxious? That’s normal. Your body is telling you you’re about to do something that matters.
The twenty-four hours before your onsite are about finding ways to maximize your performance. Ideally, you wanna be having one of those days, where elegant code flows effortlessly from your fingertips, and bugs dare not speak your name for fear you'll squash them. You need to get your mind and body in The Zone™ before you interview, and we've got some simple suggestions to help. 5) Why You're Hitting Dead Ends In Whiteboard Interviews
The coding interview is like a maze
Listening vs. holding your train of thought
Finally! After a while of shooting in the dark and frantically fiddling with sample inputs on the whiteboard, you've came up with an algorithm for solving the coding question your interviewer gave you. Whew. Such a relief to have a clear path forward. To not be flailing anymore. Now you're cruising, getting ready to code up your solution. When suddenly, your interviewer throws you a curve ball. "What if we thought of the problem this way?" You feel a tension we've all felt during the coding interview: "Try to listen to what they're saying...but don't lose your train of thought...ugh, I can't do both!" This is a make-or-break moment in the coding interview. And so many people get it wrong. Most candidates end up only half understanding what their interviewer is saying. Because they're only half listening. Because they're desperately clinging to their train of thought. And it's easy to see why. For many of us, completely losing track of what we're doing is one of our biggest coding interview fears. So we devote half of our mental energy to clinging to our train of thought. To understand why that's so wrong, we need to understand the difference between what we see during the coding interview and what our interviewer sees.
The programming interview maze
Working on a coding interview question is like walking through a giant maze. You don't know anything about the shape of the maze until you start wandering around it. You might know vaguely where the solution is, but you don't know how to get there. As you wander through the maze, you might find a promising path (an approach, a way to break down the problem). You might follow that path for a bit. Suddenly, your interviewer suggests a different path: But from what you can see so far of the maze, your approach has already gotten you halfway there! Losing your place on your current path would mean a huge step backwards. Or so it seems. That's why people hold onto their train of thought instead of listening to their interviewer. Because from what they can see, it looks like they're getting somewhere! But here's the thing: your interviewer knows the whole maze. They've asked this question 100 times. I'm not exaggerating: if you interview candidates for a year, you can easily end up asking the same question over 100 times. So if your interviewer is suggesting a certain path, you can bet it leads to an answer. And your seemingly great path? There's probably a dead end just ahead that you haven't seen yet: Or it could just be a much longer route to a solution than you think it is. That actually happens pretty often—there's an answer there, but it's more complicated than you think.
Hitting a dead end is okay. Failing to listen is not.
Your interviewer probably won't fault you for going down the wrong path at first. They've seen really smart engineers do the same thing. They understand it's because you only have a partial view of the maze. They might have let you go down the wrong path for a bit to see if you could keep your thinking organized without help. But now they want to rush you through the part where you discover the dead end and double back. Not because they don't believe you can manage it yourself. But because they want to make sure you have enough time to finish the question. But here's something they will fault you for: failing to listen to them. Nobody wants to work with an engineer who doesn't listen. So when you find yourself in that crucial coding interview moment, when you're torn between holding your train of thought and considering the idea your interviewer is suggesting...remember this: Listening to your interviewer is themostimportant thing. Take what they're saying and run with it. Think of the next steps that follow from what they're saying. Even if it means completely leaving behind the path you were on. Trust the route your interviewer is pointing you down. Because they can see the whole maze. 6)How To Get The Most Out Of Your Coding Interview Practice Sessions When you start practicing for coding interviews, there’s a lot to cover. You’ll naturally wanna brush up on technical questions. But how you practice those questions will make a big difference in how well you’re prepared. Here’re a few tips to make sure you get the most out of your practice sessions. Track your weak spots One of the hardest parts of practicing is knowing what to practice. Tracking what you struggle with helps answer that question. So grab a fresh notebook. After each question, look back and ask yourself, “What did I get wrong about this problem at first?” Take the time to write down one or two things you got stuck on, and what helped you figure them out. Compare these notes to our tips for getting unstuck. After each full practice session, read through your entire running list. Read it at the beginning of each practice session too. This’ll add a nice layer of rigor to your practice, so you’re really internalizing the lessons you’re learning. Use an actual whiteboard Coding on a whiteboard is awkward at first. You have to write out every single character, and you can’t easily insert or delete blocks of code. Use your practice sessions to iron out that awkwardness. Run a few problems on a piece of paper or, if you can, a real whiteboard. A few helpful tips for handwriting code:
Start in the top-left corner. You want all the room you can get.
Leave blank space between each line of code. This makes it much easier to add things later.
Slow down. Take an extra second to think of descriptive variable names. You might be tempted to move faster by using short variable names, but that actually ends up costing more time. It’ll make your code harder to debug!
Set a timer Get a feel for the time pressure of an actual interview. You should be able to finish a problem in 30–45 minutes, including debugging your code at the end. If you’re just starting out and the timer adds too much stress, put this technique on the shelf. Add it in later as you start to get more comfortable with solving problems. Think out loud Like writing code on a whiteboard, this is an acquired skill. It feels awkward at first. But your interviewer will expect you to think out loud during the interview, so you gotta power through that awkwardness. A good trick to get used to talking out loud: Grab a buddy. Another engineer would be great, but you can also do this with a non-technical friend. Have your buddy sit in while you talk through a problem. Better yet—try loading up one of our questions on an iPad and giving that to your buddy to use as a script! Set aside a specific time of day to practice. Give yourself an hour each day to practice. Commit to practicing around the same time, like after you eat dinner. This helps you form a stickier habit of practicing. Prefer small, daily doses of practice to doing big cram sessions every once in a while. Distributing your practice sessions helps you learn more with less time and effort in the long run. part -2 will be upcoming in another post !
Learn Binary Options today: find your Binary Options online course on Udemy. Skip to content. Categories Search for anything. Development. Web Development Data Science Mobile Development Programming Languages Game Development Database Design & Development Software Testing Software Engineering Development Tools No-Code Development. Business. Entrepreneurship Communications Management Sales ... Since Binary Options are derivatives (rely on underlying assets), the lessons outlined here may overlap with other series. Especially the case with Forex since that is the market that I focus my attention on because I find it easier to use Forex as the underlying asset for Binary Options Trading compared to other markets. Thus, the lessons here will give you the ability to trade Forex Binary ... As I explained in the article on Binary Options Training, learning is fundamental to achieving positive results in binary options trading. In order to help everyone who wants to try out this instrument, I developed Binary Options Trading Classes. 95% of my students have already lost at least one real account trading binary options before contacting me. Here our best experts provide beginners and advanced traders with useful lessons as for how to act on the investment arena. What are binary options? They are both a tool and a special type of trading on options with two possible outcomes: profit or loss. Because of its duality they call it “digital” or “binary”. As trading derivatives they can be used on all types of markets that makes ... Some may offer free trading plans, courses, and lessons. So, find out first if they offer free courses online to enhance your trading performance. Some brokers will also offer free binary trading trials so you can try before you buy. You could also benefit from trading bonuses, tips, the best strategy and trading signals reviews, plus free, practice demo accounts. Not to mention some brokers ... Trading binary options is designed to be easy to do. Your risk is limited to the amount you place on the trade. Your payoff is clearly stated before making the trade. If you win a binary options trade you win a fixed amount of cash. Since there are only two possibilities, that’s the origin of the name “binary options.” Binary options trading is used to earn more profits from the investment and it is a profitable business. People who are searching for the best binary options trading online courses then this is most advantageous site to choose the course. From this binary options trading courses you people will understand the concepts like technical analysis fundamentals, how to maximise Start trading binary options now. The popular strategies to go for are: I – Fundamental Analysis Strategy. This strategy is concerned with the analysis of the behavior of the overall performance or attributes of a company. As an investor or trader in binary options, you are interested in knowing about the health of the balance sheet, income statement and the cashflow statement of the company ... The educated binary options trader does his analysis before he goes into the market. The gambler simply makes his move based on a hunch or bases his bet on luck. In trading, there is no room for luck and a trader must acquire the necessary tools in order to succeed in trading. Here are the tools every binary options trader must have. Charts. Charts are the bedrock of technical analysis and ... Binary Options Academy for Beginners – Binary Option Trading 101 . Education and experience are the main constituents that ensure success in any venture. The same holds true for binary options trading as well, unless you are among the lucky few individuals who can make a considerable amount of profits out of sheer fortune alone. However, don ...
Beginners Binary Options Course: What is binary options ...
This is how I have traded Binary for the past 3 years. Thank you for watching my videos, hit the subscribe button for more content. Check out our members res... Binary options trading Tutorial for the beginners Hey guys! Today I'm gonna show you my binary options trading strategy that I usually use in my binary tra... Trusted spots blog https://trustedspots1.blogspot.com/?m=1 To register a free account on desktop or laptop, click here https://bit.ly/3ghvlt5 To register a f... Binary options fast income. Binary options fast income. Skip navigation Sign in. Search. Lessons of binary options trading; Videos Playlists; Channels; Discussion ... Secret Russian strategy binary options trading system - https://bit.ly/3faoQYT Open VIRTUAL money demo account Binary.com - http://goo.gl/y45Lng Binary Optio... Our second binary options trading lesson explains what binary options are, the types of options and assets available, and the best brokers with which to invest. Binary options is a high risk ... To start our Binary Options 100 Course Sam gives a detailed introduction to binary options. The video answers many questions new binary option traders have, ... Options are a powerful tool used by both stock investors, stock traders and forex traders. This is lesson 1 (Part 1 of 2) of the Professional Options Trading... Hi! This is my binary options video blog. I will show you how I earn money on binary options with simple binary options strategy