Sunday, February 23, 2020

Pre-Oblivion Wild Speculation For My Factions!

Unless you've been living under a rock, if you're a Warmachine player you know the entire game is about to get shaken up by the Oblivion theme remixes plus a Dynamic Update addressing faction balance is dropping in about a week or so.

We've had a whole ton of spoilers the last two weeks and I've been on a forced break from the game for some time due to work and family life, but I should be clear to start playing again coincidentally around when Oblivion will be dropping.

Since I've got a lot more time to think and listen to podcasts about the game than I have time to get out and play, I figure I'd put my thoughts down to help others pass the time as we all wait for the big release.



My Factions

I've been playing this game since around 2004 or 2005, waaaaay back in MK1. I've played a lot of factions over the years, but right now I have the following: Legion, Trolls, and Convergence.  I'm not 100% sure what I'm going to play post-Oblivion, though currently I'm leaning heavily towards Convergence as that's what I've been playing the last few months as I can squeeze games in here and there.

I will talk about how each one is shaping up with the spoilers we've got thus far and my feelings about how each is shaping up.

Legion

We've actually got all four themes for Legion spoiled and the development team has stated that they spent the most amount of time fixing Legion's highly segregated themes.  I'm of the opinion that most of Warmachine and Hordes power disparity is a function of how much time the very talented dev team gets to spend on any given faction, so Legion getting a lot of the focus for this re-balance is probably going to help them a ton.

They were on the top of the meta for a while when they got a load of attention for Primal Terrors about 1.5 years ago, but they've slowly whittled down. I never played many Ogrun beyond Warspears in MK2 and I played one game of Anamag and while fun it wasn't going to last given how much I'd end up wanting to buy (2x Chosen, 2x Rotwings, and a whole lot of Incubi).  Primal Terrors was great because it allowed Hellmouths and the new Ogrun stuff was solid. Oracles used to be the dominant theme, but it has waned somewhat. It at least allowed all beast options, the amazing Battle Engine, but was limited in units.  Often you'd see Children of the Dragon played with Thagrosh1 since you could end up with the Legion Super Friends of Character beasts (Typhon, Zurel, and Azreal) and basically no other Nephilim beasts since Nephilim beasts are kinda bad. At least there you could take other Nyss units which were somewhat decent (Raptors).  Finally there was Ravens of War which allowed Hellmouths but restricted you to only flying warbeasts which was just rough.

Now all themes allow all non-Character beasts and the otherwise awesome characters are available in other places. With the requisition system you can now play Legion as beast heavy again and still get your free solos, enabling the kind of lists I liked playing in MK2 when I primarily played the faction.

Legion Pro's: Most of what I have is painted and I love the way they look. Themes are wide open and Hellmouths are really insane to play with. Given what I own there does seem to be a good amount of variety in what I could play without requiring a lot of purchases to get there.

Legion Con's: I still will need to buy some new models to play the themes I'd want. While things are certainly better, playing old beast heavy lists appears like it's going to be kind of rough in the current meta since Legion non-Character beasts are still kind of pillow fisted and are still REALLY expensive.  Carniveans are awesome beasts, but at 18 points it's hard to justify vs. what you see in warjacks getting played (13-15 point heavies) or in Grymkin (again 13-15 point heavies) that will trade up into Legion beasts.  You're also stuck wanting a lot of support beasts to make your other expensive heavies really shine: Naga's and Seraphs aren't that cheap.

What I'm Excited About In Legion:  I'd want to play Ravens of War with Hellmouths and put Strider Deathstalkers on the table again, probably with some Raptors. Oracles looks great to use my nicely painted up Throne of Everblight and while I don't like many of the Legion units, I can take as many of the Minions units I want to screen my beasts and do work. I can even see some fun times with Vayl1 in Children of the Dragon sort of like what was played in MK2.  There is definitely stuff to explore here, and if I make purchases (Neraphs, Grotesques) there are some really crazy value lists that can be done with casters that may push the trading game in my favor.

Trolls

I played Trolls for a most of my time in MK3, though I was much bigger into them in MK2. We only have spoilers for Kriel Company and Power of Dhunia so far, and community reaction to them has been fairly underwhelming, especially compared to how great Legion has been on their themes.

Personally, I love what was done in Kriel Company, allowing all beasts to be taken means you can play with Maulers to make your shooting beasts into melee threats again. That's a big deal IMO as many of my MK3 lists were based around a Bomber + Mauler battlegroup and it always performed very well for me.

The downside in Kriel Company is that it doesn't appear the Dynamic Update is fixing much of anything with the Troll shooting units, which are all just underwhelming for their points. Highwaymen are a beautiful unit, but at Range 8 on their guns, for a shooting-only unit, is just...sad. Grim2 could do some work with them, maybe Gunny or a few other casters but from what I found out is that other factions can shoot you before you get to shoot them and Troll shooting units are at best DEF 13 ARM 16 under the stone. That's not very hard to kill with guns.

The biggest winners in Kriel Company are the Battle Engines. The War Wagon is bonkers and the Hooch Hauler may have some synergies to help unlock some lists. I can certainly see playing with Battlegroup heavy lists and Battle Engines in Kriel Company going forward, with maybe a few casters supporting some ranged units to do some other work. The theme also grants Marked Target to solos, which can really be interesting given how many sprays we can take in theme and how many Whelps can be fit into lists.

Power of Dhunia looks the same as it was frankly. but now with 8 point Runeshaper units and Dhunia Archons can be taken in theme which can really help with fury management with Shepherds Call (remove 1 fury point from each beast within 3").

Currently I'm hoping that the next round of Dynamic Updates hits the Troll ranged units, and we have some hope for really cool Riot Quest solos in the Pyg Tanks and Boomhowler2.  Heck with Boomhowler1's unit becoming Partisan Trolls, they may show up in more lists if they see a points drop and/or a RAT buff.

Storm in the North and Band of Heroes haven't been spoiled yet, though we do know that Rok is in Storm in the North, which means Doomshaper2 can play in that theme and get access to PacMan'ing Rok and not have to worry about meeting free points quotas with the new system.

Troll Pro's: Personally, I own a crap ton of Trolls, nearly the entire faction due to picking up bits for cheap as other players left the faction. Currently Trolls aren't seeing much play, but I think they have a lot more going for them than people are currently letting on. With the potential RAT buffs from Marked Target in Kriel Company, plus what can be done with Dhunia Archon's, I can see possibly playing Ragnor with an army of gun based lights that can be made to hit like heavies with Rage and Pulverizer. You can get Ice Trolls thrown weapons upwards of PS19 or 20 and fit the fury management to really go all out.

Troll Con's: Unfortunately Trolls suffer from having to play a Mauler and our best ranged beast, the Bomber, is 19 points. Things are just kind of expensive in the faction and we lack native or easy access to Pathfinder on our beasts, and in general Troll lists need a lot of support.  On a personal note, while I have a lot of Trolls, not nearly as much of it is painted and what I was painting I was trying to get up to a high standard. The models don't lend themselves to painting up quickly either which hurts my motivation. It's just not clear Trolls will be particularly strong after the update AND if I swapped to playing them again it'd be a lot of hobby time to get them painted.

What I'm Excited About In Trolls: I am weirdly drawn to a bunch of casters in the faction that are considered just bad: Grissel1 with War Wagons look like it can be just insane. Horgle2 can finally take the mix of beasts and infantry to play the kind of list he'd want. I already mentioned Ragnor1 and using lights to shoot things and then trade up massively due to stacking strength buffs. Grim2 could possibly do the same thing and even support infantry, ditto for Gunny.  None of it may end up being particularly meta defining, but it sure looks fun as hell.

Convergence

With only two themes in faction and one of them spoiled already, it's odd that I'm left looking at CoC as the faction poised to come out of this update possibly the strongest of what I own.

Destruction Initiative's changes were reacted to fairly negatively by the community, though I don't share their opinion. We lost 2" of extra deployment and the Requisition changes mean that we will not be casually getting 4 sets of 3 servitors easily for free. Nearly every DI list I've run has had 12 shield guards and I'd be lying if I said that Attunement and Elimination servitors haven't won me games via flare on a caster or doing that last point of damage to a heavy in a zone.

That said, being able to take 3x ADO's for a requisition slot and taking an Optifex Directive unit for another slot is also great. I can pay the equivalent points for more servitors if I want, or I can downgrade "useful" servitors to Accretion servitors, where I can spend 6 points to get 9 shield guards that can also do repair. As it is, I'm ambivalent about the changes, mostly because the requisition changes mean that unless I'm playing casters who want to run TEP's, I may not want to be playing in DI as much anymore.


My hopes and dreams are riding on Clockwork Legion. Being able to play battlegroup heavy lists with a small screen of possibly recurring infantry seems strong. At a minimum, if I'm not running TEP's and can live without the shield guards, being able to take Frustrum Locus's dispel guns to supplement our usual jack based lists appears to be a great option. Given that what I think could be the biggest factor for us has yet to be spoiled, there is a massive amount of potential or let down here.

Privateer Press has said that the Dynamic Update was mainly to look at factions that didn't go through CID in MK3, and Convergence is one of those factions that didn't really get a proper CID. As such we may finally see fixes to our units, and points drops on our heavy vectors, and at least we'll most certainly see points drops on our Colossal's which will really help out.

The main thing that scares me is that since PP also announced that CoC was going to be the next big set of new releases once all of Oblivion's massive amount of new models gets out, it may mean that they're saving working on the faction when that CID comes around in upwards of 4 months. Conversely, some of the worst performing units in the game are in Convergence, so there is some hope we get tweaks to help out.

There are worries and potential for the theme to be big. We're almost certainly losing advanced move, and one of the theme benefits they have to keep is making Enigma Foundries FA: 4 so that the list can actually function.  Keeping vengeance on our medium based units can be a big deal, especially if they fix said units. They're so close to possibly being good in a few builds.  If we get a new release that hands out pathfinder, the theme will REALLY open up to infantry being usable besides just Aurora and Axis, with maybe Lucant.

CoC Pro's: All of the potential changes mentioned above is probably too much to hope for in this update cycle, but any combination of those changes could really make the faction strong and if recurring infantry is able to make it to the table and work - things really would look up for CoC. The Void Archon will also really help the list in terms of hitting power and infantry clearing.  I also own basically the entire faction thanks to trading away the last vestiges of my GW mini's from almost over a decade ago and since they paint up so fast, I have about 85% of the faction fully painted already. That's a huge boon for wanting to keep going with the faction I'm currently most excited to put on the table as is.

CoC Con's: If Clockwork Legions gets minimal updates and next to no points drops on our heavies, the faction is probably going to continue to struggle. I've played into Circle and Skorne at a recent Steamroller and...it is not pretty. Both factions seem to oddly be getting buffs in some of their spoiled themes, so if not enough changes Convergence could be stuck having uphill battles into a lot of the current meta.

What I'm Excited About In CoC: The Void Archon alone opens up the faction a lot in either theme, bringing Dark Shroud to the faction and a really strong spray. Conservators can possibly really shine here bringing shield guards for Enigma Foundries and with a Void Archon to buff damage we could be looking at 12 Point high MAT PS19 heavies to trade up with. Aurora may actually end up playable with some of these changes. Lucant certainly will like having them around, and Axis will love having a persistent damage buff to go out when necessary.  I have this weird desire to play Syntherion and the requisition options for him only make his list better (he wants ADO's real bad), and points drops on the Axiom or Conflux will help those lists as well.  At worst in a few months CoC is getting a whole new slew of releases and that will be amazing!

Closing Thoughts

Regardless of which way I go with what to play, I love what PP is doing with the game. It's been hard enough not being able to play in the current meta, and I'm really lucky that my schedule opens up in August and September to get games again with this incredible set of changes.  Each day at work it's always fun to hit refresh at random breaks throughout the day to see what new things have been spoiled. Now I'm just stuck waiting around for the Clockwork Legions Insider we were told is coming to drop...

Thursday, February 20, 2020

Tech Book Face Off: How To Design Programs Vs. Structure And Interpretation Of Computer Programs

After reading and reviewing dozens of books on programming, software development, and computer science, I've finally come to a couple of books that I should have read a long time ago. I'm not quite sure why I didn't read these two books earlier. Distractions abound, and I always had something else I wanted to read first. I still wanted to see what they had to offer, so here I am reading How to Design Programs by Matthias Felleisen, Robert Bruce Findler, Matthew Flatt, and Shriram Krishnamurthi and Structure and Interpretation of Computer Programs by Harold Abelson, Gerald Jay Sussman, and Julie Sussman. As I understand it, these books are meant to introduce new students to programming so not reading them until now will probably make it difficult to accurately critique them from the perspective of the target audience. I'm still going to give it a try.

How to Design Programs front coverVS.Structure and Interpretation of Computer Programs front cover

How to Design Programs

While I have read many programming books as ebooks on my Kindle, this is the first book I've read as an online book. It's available in print version, but the online version looked nicely formatted and was heavily cross-linked, which was quite helpful. Also, since the book was right alongside my code editor, I could easily try out the problems and copy-paste code into the editor to run it.

The programming language used in this book as the vehicle for learning was a variation on Scheme called BSL (Beginning Student Language) that had heavy restrictions on the language features available for use. For example, lists could not be constructed with (list <list of elements>) or '(<list of elements>), instead needing to be built up from (cons <element> <list>). These and other features were added with BSL+, ISL (Intermediate Student Language), and ISL+ as the reader progressed through the book.

I was not a big fan of this approach, since it was tedious to learn the wrong way first (or at least the way nobody actually writes code) and then learn the right way that also makes more sense. Starting with the reduced forms of the language didn't add anything to the explanations, and it mostly served as a point of frustration as the reader was forced through unnecessary tedium until the nicer language features were introduced. It was also not clear by the end that ISL+ was equivalent to the full Scheme programming language, so by the time the student reached the end of the book, they wouldn't even be sure that they had learned a real programming language.

The book was quite ambitious, since learning how to design programs starting from square one actually involves learning three almost distinct things at once: the syntax of a programming language, how to write code, and how to program. The first task is about learning what a programming language is, what keywords and punctuation are available, and what it all does when put together in the correct structure. This task alone can be overwhelming for the new student. Then, the second task, learning to write code, involves taking a small, well-defined problem statement, thinking up a solution to it, and translating that solution into code that can execute in the newly learned programming language. Normally, once some part of the language has been learned, the first two tasks can be done together, and they support each other as the student practices them both.

The third task, learning how to program, is a much deeper activity that takes a much longer time to become proficient. Learning how to program is not just about solving bigger problems that may not be self-contained or well-defined. It's about learning how to organize all of the required code to solve the problem in a way that makes that code easy to understand, is less likely to suffer from bugs, is testable (and tested), and hopefully is flexible and extensible. I'm not convinced that this book taught this much more advanced skill, or at least not thoroughly.

The book starts out with a little prologue chapter entitled "How to Program." It gives a short introduction and a few examples of how to write some simple programs in BSL, and here the authors try to get the reader excited about what they'll be learning in the rest of the book. I had some misgivings about it. They have a strange way of trying to connect with the reader by disparaging various subjects that the reader is likely taking in school, or at least has fresh memories about, like physics:
Physics?!? Well, perhaps you have already forgotten what you learned in that course. Or perhaps you have never taken a course on physics because you are way too young or gentle. No worries.
I don't understand this kind of writing. It's not cool and it's not helpful to pretend to joke along with students about how much physics or mathematics or any subject sucks. It drives me nuts. Why can't we encourage students to take more of an interest in these subjects by showing how the knowledge can be useful, interesting, and dare I say, fun?! Thankfully, these comments don't continue in the rest of the book, but it's still irritating that they subtly perpetuate this anti-learning bias. It ended up coloring my opinion of the book in a negative way.

The rest of the book is split into six major sections with "intermezzos" between each section. I'm not quite sure why the intermezzos are there because they just seem to continue on with more topics that would fit in as additional chapters within the six sections, but that doesn't matter much. The first section introduces BSL features in more detail than the prologue, and it also lays out the recommended steps of a design process in chapter 3. These steps are touted as the steps for how to design a program, but they're really steps for how to design a function. The process is fine as far as it goes, but it doesn't really scale to large programs. This process is used and refined throughout the book.

The first section only introduced language features that allow for fixed-size data, so the next section introduces lists and recursion. It's a whole five chapters on lists, including basically a whole chapter of problems for the reader to solve. I don't remember lists being quite so hard to understand that it would require five chapters to adequately get the point across, especially with lists being a fundamental data structure of Scheme. Sorry, BSL+. Part of the problem is that the authors seem to explain things in as many words as possible. The text ends up plodding along with slow, tedious explanations, some of which don't even make much sense.

Another part of the problem of understanding in this book is the poor choice of variable names. When the authors are not using single-letter names (shudder), they're using names like alos. What is alos? Is it like, "Alos, poor Yorick! I new him, Horatio?" No, that's not right. That would be 'alas.' Instead, alos means "a list of strings." But why not just use list-of-strings, or even strings if you're into the whole brevity thing. The point is, these super abbreviated and truncated variable names make things more confusing than they need to be, because you have to keep the translation to the full name in your head along with the meaning of the variable and the rest of the code. Using full words for variable names makes the code so much more readable and understandable. It's not like we're working under any space constraints with the text of the code, except for the constraints of our own working memory.

The third section goes into detail on functions and how they enable abstractions that will make the programmer's life easier. Abstractions allow the programmer to solve low-level problems once and then think about harder problems from a higher level. It's a critical programming skill to learn. This section follows a similar format to the last one, with four chapters on functions done in excruciating detail, one of which is full of problems for the reader. We also advance to ISL for this section, and near the end we achieve the final level up to ISL+. Yipee! I remember hating when textbooks would introduce one way of doing things and then later contradict themselves and reveal the real way of doing it. This failing is worse with simplified languages, so I'm pretty tired of "student languages" by now.

The next section covers intertwined data, which is a convoluted title for a section that doesn't have a strong theme. The chapters in this section range from introducing trees to building a simple interpreter to processing multiple lists in parallel. The fifth section focuses on recursion for five chapters, and here they make the distinction between structural recursion, which is based on scanning lists, and generative recursion, which is more general and doesn't use lists as the looping mechanism. The final section discusses accumulators that are used with recursion to enable calculating properties of data that requires keeping track of additional state during the recursion. It's basically passing extra state variables in the recursive call in order to calculate aggregate or cumulative values on the data. All of these sections continued to have chapters near the end that were filled with extra problems for the reader.

This book was super long at nearly 750 pages—one of the longest programming books I've read in a while—and it did not seem like it covered enough ground to warrant that length. There were also 528 problems in total, so a huge amount of practice if the reader worked through all of the problems. Most of the problems were pretty decent, and they stayed relevant and reasonable for the material covered beforehand. But the book as a whole didn't hold up to its goal of teaching the beginner how to design programs. Learning how to program is a huge undertaking, and I don't believe it's possible to adequately cover that whole process in one book. On top of that, the level of discussion in much of the book was too complex for the beginner, and it would just as likely serve to confuse them as to teach them. Conversely, it doesn't seem to work well as a second programming book, either because it is so slow and tedious and long. By the end all we've learned is the basics of Scheme, lists, functions, and recursion. The Little Schemer taught much more in a more entertaining way in less than 200 pages. I can't recommend slogging through this book instead.

Structure and Interpretation of Computer Programs (SICP)

This book was the textbook for the entry-level computer science course at MIT for a number of years. I, unfortunately, was unaware of it until after I had finished college (not at MIT) and had come across it mentioned in a blog post by Steve Yegge, I think. Ah, yes, here it is. Apparently, that's also where I got the idea to read How to Design Programs, but fortunately, SICP was a better recommendation. I also didn't have the same issues with the book's humor that Steve did. I didn't mind the silly names of the students in the exercises, (you always know that Louis Reasoner got it wrong; you just have to figure out how) and some of the other jokes were actually kind of funny:
In testing primality of very large numbers chosen at random, the chance of stumbling upon a value that fools the Fermat test is less than the chance that cosmic radiation will cause the computer to make an error in carrying out a "correct" algorithm. Considering an algorithm to be inadequate for the first reason but not for the second illustrates the difference between mathematics and engineering.
I mean, come on. That's not half bad for a computer science joke. The majority of the book was not about fun and games, though. It's a serious book on introducing the computer science student to how programming languages—particularly Scheme—work.

SICP is split into five fairly balanced chapters. Each chapter starts off easy with an introduction to the material covered in the chapter and more detailed explanations of the mechanics of Scheme or the interpreter or whatever is the topic for the chapter. As things develop, the difficulty ramps up until near the end you can feel your brain going numb and draining out of your ears. Then you get a breather at the beginning of the next chapter with another gentle introduction.

The first chapter starts off with the requisite intro-to-the-language stuff that every book for a new programming language needs. After covering Scheme's operators and primitives, we move on to functions and immediately jump into recursion. By the end of the chapter we're learning about how to pass functions around as arguments and return values, and I wonder how an entry-level student could really grok all of this in a semester course. This is just chapter 1!

Chapter 2 teaches us all about how to structure and process data in Scheme. Since the fundamental data structure in Scheme is the list, this means we're going to get very comfortable with list processing (which is how Lisp gets its  name, see?). Between these first two chapters, we gain a thorough understanding of the foundations of Scheme and how to put together Scheme programs to do interesting things with data. Even after reading so many books on programming and practicing it in the field for a couple of decades, I was quite enjoying this "beginner" programming book.

Helpful exercises are interspersed with the text throughout the book, generally at the end of each subsection, and they are quite well thought-out exercises. With 356 exercises in all, they provide a ton of practice to ensure that the reader is understanding the material. At first they seem to be somewhat random but standard fare, asking the reader to solve programming problems with rational and complex numbers and other such mundane mathematical problems. Then, near the end of chapter 2, we learn how to implement generic arithmetic operations that can automatically promote and demote arguments from one class of number to another. It's pretty slick, if somewhat impractical. I can't think of a system where this behavior would be necessary, but it's cool to get it working nonetheless.

The next chapter kind of let the wind out of my sails a bit. The previous chapters had really exemplified the elegance of Scheme with beautiful functional programming, but now we had to learn about the mucky reality of objects and mutable state. This chapter introduces the set! operations that allow variables to be changed in place instead of creating and returning new variables that are set with the define primitive. The allowance for changing variable values enables the creation and maintenance of objects with state, and this complicates the analysis of program execution because now we have to deal with side effects. The authors did a nice job of explaining when objects are useful, because we don't want to use them for everything:
The object model approximates the world by dividing it into separate pieces. The functional model does not modularize along object boundaries. The object model is useful when the unshared state of the "objects" is much larger than the state that they share. An example of a place where the object viewpoint fails is quantum mechanics, where thinking of things as individual particles leads to paradoxes and confusions. Unifying the object view with the functional view may have little to do with programming, but rather with fundamental epistemological issues.
The second half of the chapter continues on from objects with concurrency, which does not play nice with mutable state at all, and introduces streams in order to deal with that problem. Streams are a mechanism that enables lazy execution of functions on lists. Instead of performing all of the computations on a list at the time the processing function is called, the function will return another function that will do the computation on its corresponding list element at the time that element is needed to be read. It's wild and confusing at first, but working through the exercises helps clarify how it all works.

Chapter 4 tackles the task that all Lisp books seem to reach eventually, and that is to write an interpreter. How to Design Programs did it. The Little Schemer did it. SICP does it to, but it doesn't simply stop with one interpreter. No, after the basic interpreter, we go on to write a lazy interpreter that does delayed evaluation. Then, we write another interpreter that does ambiguous evaluation, meaning the programmer can specify a problem and an input range for that problem, and the interpreter will perform a search to find a solution (or every solution) that satisfies the constraints of the problem. Think that's enough? Not now that we're on a role! The final interpreter extends Scheme to be a logic language similar to Prolog. You would think the previous ambiguous interpreter would be a good basis for this extension, but the text uses the lazy interpreter as the base instead. Extending the ambiguous interpreter is left as an exercise.

Things are getting pretty mind-bending by now, so why don't we finish things off with something truly warped. The last chapter goes through implementing a register machine model in Scheme. What's a register machine? It's basically a model of a computer that uses fixed registers, a load-store memory model, and low-level operations to execute an assembly language. Then we need something to run on this register machine, so we modify the interpreter to run on top of this assembly language. Now let's step back and think about what we've done. We now have an interpreter that takes in Scheme code, spits out assembly code, and runs it on a model of a computer (the register machine); and this is all done inside another Scheme interpreter running on a real computer. Wat? Let's think again about what we've done:
From this perspective, our evaluator is seen to be a universal machine. It mimics other machines when these are described as Lisp programs. This is striking. Try to imagine an analogous evaluator for electrical circuits. This would be a circuit that takes as input a signal encoding the plans for some other circuit, such as a filter. Given this input, the circuit evaluator would then behave like a filter with the same description. Such a universal electrical circuit is almost unimaginably complex. It is remarkable that the program evaluator is a rather simple program.
It's mind-blowing, really, but we're not done. The last part of the last chapter walks through building a compiler so that we can compile Scheme functions down to the assembly language of the register machine, and modify the register machine so that it can run the assembly code directly instead of it being fed from the interpreter. If that's not enough, the last two exercises are simply about writing a scheme interpreter in C and a compiler in C instead of what we just did in Scheme. Easy-peasy, right?

While these last two chapters were fun and fascinating, they were quite a stretch for one book. The first three chapters plus the basic Scheme interpreter would have been enough for the learning experience. I'm not sure how much practical knowledge readers would get out of the rest of the interpreters, the register machine, and the compiler. The explanations became very mechanical and it felt like a major effort just to fit in the code listings and brief descriptions while still keeping the book around 600 pages. Beyond the issue of cramming a bunch of complex stuff in the last chapter and a half of the book, there are much better books out there on compilers and interpreters, like the dragon book or Writing Compilers and Interpreters, that go into more detail and explain those details more thoroughly. Likewise for machine languages and computer architecture, if you really want to understand the underlying machine language and hardware, Computer Architecture: A Quantitative Approach is excellent. Although, for a lighter introduction, Computer Organization and Design might be a better place to start.

That criticism notwithstanding, SICP is an excellent book on both how to write programs in Scheme and how to write a Scheme interpreter. It's a solid textbook for a second course in programming, but not a first course. I can't imagine most entry-level students would grok everything this book tries to present, so it would be good to have some other programming language under your belt before tackling this beast. Given its age, it's still surprisingly relevant as a programming textbook, and quite enlightening.


SICP is far and away the better book in this face off. True, How to Design Programs is meant for a less technical audience, but I'm not convinced that it would be an appropriate book for non-programmers, either. Scheme is just not the right introductory language, and something like Python or Ruby would be a much better learning language. Taking that consideration out of the equation, SICP packs a ton more content into 150 less pages, and it goes in much more depth on both basic programming concepts like lists and functions, and advanced concepts like streams and interpreters. Did I mention it also uses way better variable names? The code is much easier to understand as a result, and it's only the complexity of the concepts later in the book that make that code difficult.

Definitely pass on How to Design Programs, but if you're in the mood to level-up your fundamental programming knowledge, give SICP a look. If you're so inclined to read it online, check out this version at Sara Bander's GitHub site. It's rendered in a beautiful Linux Libertine font that's an absolute joy to read on a screen, and the footnotes come up in text boxes when clicked. It's the best experience I've had reading an ebook.

Storium Basics: Cardless Moves

Last time, we discussed multi-card moves here on Storium Basics. This time, I'd like to spend a bit of time on their opposite: cardless moves.

While most moves in Storium games will probably involve cards, cardless moves are an option in Storium. Narrators will vary on how much they like them. For my part, I'm totally fine with them as they add some great color to scenes, but I do want to caution that you not allow them to overwhelm scenes. They're great for adding detail but can also sap a scene of momentum if they are overused.

When writing a cardless move, think similarly to how you write a move for a Neutral card like a Subplot - but unlike neutral cards, cardless moves don't push the scene closer to completion. Remember, a challenge's remaining card slots are, in a way, the measure of how much "story" is left in the challenge, and how close it is to a conclusion. When you play cardless, you aren't changing that at all. You also aren't in any way tipping the challenge's balance - cardless moves obviously don't count as Strong or Weak, or even Neutral. In other words, the story of the challenge does not move forward in a significant fashion, and the actions of your character do not have a particularly noteworthy impact on the challenge.

When you write a cardless move it should be more about showing what your character is doing in the current status of the scene than anything else. Your move doesn't significantly impact the scene and doesn't move the situation forward in any notable way…but it still needs to relate to what's going on. You're not playing on a challenge, but…still think about the move in relation to a challenge and/or the scene all the same. It should never drift totally away from what the scene is focused on.

I'm fond of using cardless moves to show my character's reactions to big moments - to help make other players awesome by making clear that what they've done got a reaction out of my character. That's one good way of using these.

They can also be used to just develop a point a little more, without actually pushing it forward. Maybe your last move was about conversing with a character, trying to convince him of something, and while other stuff is going on in the scene, you'd like to take a moment to show that the conversation is still going on and develop the character's motivations a bit more, without actually having the challenge's situation change yet. That can be a good use of a cardless move.

The trick is to use them, but not abuse them. It's easy to fall into a trap of overusing these move types when a challenge is active. They're good for reactions, and good for further development...but don't react to everything, and don't develop everything. When challenges are active, keep the focus on playing on the challenges. Moves with cards, for most games, should clearly outnumber cardless moves while challenges are active...otherwise, games really risk losing momentum. Use them with restraint, and they'll work best.

That does bring up an important side note, though: There are times when a narrator will set up or continue a scene without challenges, specifically to give you the opportunity to roleplay with cardless moves. Obviously at that point, cardless moves are what the game's all about! Just remember to play according to the story, and even if there aren't challenges present, don't allow your character to overwhelm the rest of the game.

For more information on cardless moves and cardless moments, see these articles:

[Hackaday] LEGO Microtonal Guitar: Building Blocks Of Music Theory

LEGO Microtonal Guitar: Building Blocks of Music Theory

Wednesday, February 19, 2020

How To Download And Install Batman Arkham Asylum With Joker DLC On PC Wi...

SuperStarfighter, A Local Multiplayer Game Made With Godot

Looks like FOSS game development with Godot is a breeze :)
SuperStarfighter is a fast-paced local party game for up to 4 players. Outmaneuver and shoot your opponents in a 2d top-down arena, and become an intergalactic champion!



Get it on Itch.io or find the source code here.

Hat-tip to GoL.

For commenting please visit our forums.

Thursday, February 13, 2020

Brave Browser the Best privacy-focused product of 2020



Out of all the privacy-focused products and apps available on the market, Brave has been voted the best. Other winners of Product Hunt's Golden Kitty awards showed that there was a huge interest in privacy-enhancing products and apps such as chats, maps, and other collaboration tools.

An extremely productive year for Brave

Last year has been a pivotal one for the crypto industry, but few companies managed to see the kind of success Brave did. Almost every day of the year has been packed witch action, as the company managed to officially launch its browser, get its Basic Attention Token out, and onboard hundreds of thousands of verified publishers on its rewards platform.

Luckily, the effort Brave has been putting into its product hasn't gone unnoticed.

The company's revolutionary browser has been voted the best privacy-focused product of 2019, for which it received a Golden Kitty award. The awards, hosted by Product Hunt, were given to the most popular products across 23 different product categories.

Ryan Hoover, the founder of Product Hunt said:

"Our annual Golden Kitty awards celebrate all the great products that makers have launched throughout the year"

Brave's win is important for the company—with this year seeing the most user votes ever, it's a clear indicator of the browser's rapidly rising popularity.

Privacy and blockchain are the strongest forces in tech right now

If reaching 10 million monthly active users in December was Brave's crown achievement, then the Product Hunt award was the cherry on top.

The recognition Brave got from Product Hunt users shows that a market for privacy-focused apps is thriving. All of the apps and products that got a Golden Kitty award from Product Hunt users focused heavily on data protection. Everything from automatic investment apps and remote collaboration tools to smart home products emphasized their privacy.

AI and machine learning rose as another note-worthy trend, but blockchain seemed to be the most dominating force in app development. Blockchain-based messaging apps and maps were hugely popular with Product Hunt users, who seem to value innovation and security.

For those users, Brave is a perfect platform. The company's research and development team has recently debuted its privacy-preserving distributed VPN, which could potentially bring even more security to the user than its already existing Tor extension.

Brave's effort to revolutionize the advertising industry has also been recognized by some of the biggest names in publishing—major publications such as The Washington Post, The Guardian, NDTV, NPR, and Qz have all joined the platform. Some of the highest-ranking websites in the world, including Wikipedia, WikiHow, Vimeo, Internet Archive, and DuckDuckGo, are also among Brave's 390,000 verified publishers.

Earn Basic Attention Token (BAT) with Brave Web Browser

Try Brave Browser

Get $5 in free BAT to donate to the websites of your choice.

Brave Browser voted the best privacy-focused product of 2019

Out of all the privacy-focused products and apps available on the market, Brave has been voted the best. Other winners of Product Hunt's Golden Kitty awards showed that there was a huge interest in privacy-enhancing products and apps such as chats, maps, and other collaboration tools.

An extremely productive year for Brave

Last year has been a pivotal one for the crypto industry, but few companies managed to see the kind of success Brave did. Almost every day of the year has been packed witch action, as the company managed to officially launch its browser, get its Basic Attention Token out, and onboard hundreds of thousands of verified publishers on its rewards platform.

Luckily, the effort Brave has been putting into its product hasn't gone unnoticed.

The company's revolutionary browser has been voted the best privacy-focused product of 2019, for which it received a Golden Kitty award. The awards, hosted by Product Hunt, were given to the most popular products across 23 different product categories.

Ryan Hoover, the founder of Product Hunt said:

"Our annual Golden Kitty awards celebrate all the great products that makers have launched throughout the year"

Brave's win is important for the company—with this year seeing the most user votes ever, it's a clear indicator of the browser's rapidly rising popularity.

Privacy and blockchain are the strongest forces in tech right now

If reaching 10 million monthly active users in December was Brave's crown achievement, then the Product Hunt award was the cherry on top.

The recognition Brave got from Product Hunt users shows that a market for privacy-focused apps is thriving. All of the apps and products that got a Golden Kitty award from Product Hunt users focused heavily on data protection. Everything from automatic investment apps and remote collaboration tools to smart home products emphasized their privacy.

AI and machine learning rose as another note-worthy trend, but blockchain seemed to be the most dominating force in app development. Blockchain-based messaging apps and maps were hugely popular with Product Hunt users, who seem to value innovation and security.

For those users, Brave is a perfect platform. The company's research and development team has recently debuted its privacy-preserving distributed VPN, which could potentially bring even more security to the user than its already existing Tor extension.

Brave's effort to revolutionize the advertising industry has also been recognized by some of the biggest names in publishing—major publications such as The Washington Post, The Guardian, NDTV, NPR, and Qz have all joined the platform. Some of the highest-ranking websites in the world, including Wikipedia, WikiHow, Vimeo, Internet Archive, and DuckDuckGo, are also among Brave's 390,000 verified publishers.

Earn Basic Attention Token (BAT) with Brave Web Browser

Try Brave Browser

Get $5 in free BAT to donate to the websites of your choice.