Friday, March 20, 2020

ASOIAF: Starks And Lannisters Overview

So.. who's it going to be?

It's probably worth saying that I got into the game fairly easily because my favorite major house in the show is Lannister.  My wife really digs Starks but she has yet to try the game because it looks too nerdy.  Don't worry, it's just a matter of time because I see her eyeing the dinner table that I've fully converted into playing daily games.  It's a good thing that I bought enough stuff to get some variety into the mix so the newer players I'm trying to get into the game can experiment and mix and match units.  Even though I have my favorites, I have probably played at least 40% of my games with Starks because I feel that the best way to learn the game is by playing a lot.

Whenever someone starts with the game, no matter what minis game, I always tell them the same thing:  Go with the aesthetics and look of the faction first above anything else.  With this game, however, I don't think the same principle applies as much in this game because everyone is human (for the most part).  When it comes down to picking a faction, I think one of the things everyone needs to do is examine a bit of their psyche and pick a faction that best aligns with their personality.  It's like picking a color in MTG and understanding that each color represents a bit of your personality.  If you want to go a little bit deeper, picking a faction in this game would be like picking a guild from Ravnica, or even building a character in a D&D campaign.  That is, unless you really really like dogs.  Then I would say just pick Starks and never look back.

Alright, so back to the two starting factions from the Core set.  Since you need this set to play the game and they're the factions with the largest amount of units choices right now, you need to decide if you want to go with House Lannister or House Stark.  Remember what I said about picking the right faction for you, as this will do you big favors because a lot of the game's mechanics are designed around how the houses behave in the books/show whatever.  There's a big chance that if you don't like the houses' personality in the books that you will not like how they play in-game.  It's actually one of my favorite things about the game so far and that's how on-point a lot of book to table translation has been.

Hear me roar!

Alright, let's begin with the Lannisters.  In this game, the Lannisters are the faction that has a lot of panic shenanigans, morale tests, weakens, and counterplots.  Their Tactics cards play heavily with the Crown and Wealth zones on the Tactics Board and controlling those will open up many secondary effects of your cards.  Lannister Commanders come in many shapes and sizes from the destructive and brutal force of The Mountain to the cunning strategist that is Tyrion Lannister (yes, you can take him in combat!).  My favorite Commander for the Lannisters is Tywin Lannister (also my favorite character in the show) because a lot of his Tactics cards and abilities intimidate and Weaken enemy units.  Another Commander that I've tried is Jaimie Lannister because his abilities center around defense, parry, and riposte; turning the opponent's attacks and crappy rolls against them.

When it comes to NCUs or their Tactics cards, the Lannisters focus heavily on debuffing and control elements that limit the opponent's options.  Pycelle's Weaken effect and Cersei's No Confidence are prime examples of debuffing the opponent or making them worse for morale tests, while tactics cards like Counterplot can outright stop an opponent tactics card from going off.  I tried to get some examples of the kind of tactics the Lannisters can employ and I think this lot sums it up pretty nicely.  For the Lannisters, they are all scheming masterminds with several abilities that kicks players while they're down.

Kick 'em while they're down.

As for Lannister units, they are well-supplied and fairly diverse to take on a large breadth of enemies.  The Mountain is its own unit just because he is, Lannister Guardsman are slow with lower attacks but has an excellent defense and a great ability (Lannister Supremacy) that only gets better with attachments, and Lannister Crossbowmen are no joke.  I've recently started playing them and having a unit that just hits units with ranged attacks on a 3+ with Sundering from Long Range is incredible.  Lannisters also have some interesting unique units like Pyromancers that can toss their Wildfire from ranged or in combat and it ignores defense saves while suffering -2 to the defender's Panic tests through Vicious.

While the Lannisters have a solid lineup of units, I would say their strengths come from their debuffs and stopping your opponents from what they want to do more so than just strength of arms.  For that, you want to get into House Stark.  If you're looking for a faction that doesn't care about the subtleties and just wants to beat face, you've come to the right place.

Winter is coming.

When it comes to striking hard and striking fast, Stark is the faction to do it.  One of the many things I enjoy about the core set is that you have two factions that have radically different playstyles.  Just like it is in the books, the Starks and the Lannisters are probably the two houses most different from one another.  While the Lannisters rely on debuffs and abilities that stop your opponents from doing what they intend, Starks are all about battlefield combat and maneuver.  They see an opening and go for the jugular just like the Dire Wolf, their house sigil and in doing so, deliver massive damage to the enemies and leave them reeling.  With Commanders like Robb Stark who can take maneuver warfare to the next level, or Roddrick Cassel and his ability to exploit the Vulnerable enemies, the Starks are the faction you want if you want to destroy the opponent's army rather than play the more drawn-out  game of politics and scheming.

Of course, this doesn't mean that the Stark units or playstyle are just centered around this niche.  With both the Lannisters and the Starks, there will be Commanders and units that will change the regular composition from what you expect from the two factions and that's always a good thing.  For example, on one side, you have the fast-moving and lightly-armored Umber Berserker that has built-in Sundering (-1 to defense saves) and their attacks increase when you lose ranks rather than decrease.  You compare this to the rock-solid Tully Sworn Shields with the Shield Wall ability and good luck trying to break their 3+ defense saves from the front.  This unit variety not only keeps different playstyles fresh and exciting but also gives units legroom to perform depending on the game mode that you play.  Either way, when you think about Starks, their humble foot soldier in the form of Stark Sworn Swords move 5, have excellent morale and rolls 8 dice just because they can.  When you pop Stark Fury on them, they gain +1 to hit and Critical Blows on their attacks (6s deal 2 hits) at the cost of D3 models to your own unit.  If that's not a healthy representation of angry Northmen I don't know what is.

Winter is seriously coming.

When it comes to Tactics cards and NCUs, Stark is pretty straight-forward:  It's all about Combat and Maneuver and taking those zones will be extremely rewarding.  Catelyn Stark can remove a condition from an afflicted unit while buffing them so they're attacking with max dice, and Sansa Stark can instant tutor for any tactics card you need, even if it's a previously discarded card.  That is great tactical flexibility and I have her in almost every single one of my Stark lists.

Well, that's about it for the high-level overview of which armies you will get in the core box.  With so many different commanders, tactics, NCUs, and units to cover, list building deserves its own article.  I'll take you guys through the basics of list building and show you a couple of Lannister and Stark lists tomorrow so you can better grasp some of the things discussed today.

Thursday, March 19, 2020

Feeling Guilty About Gaming Deaths!!!?

I just finished Mass Effect 2 for PS3, I am years behind current games! But being years behind has the advantage of getting an awesome title like ME2 for only £2 in CeX.

I was wondering if anyone else out there couldn't help feeling a bit guilty about the fate of certain characters in this game....

If you don't know, in Mass Effect 2, depending on how you play the game and how much time you pump into the game characters will either live or die in the final chapter of the story and all at a pretty rapid succession!

For me, I felt bad when Mordin died, and again, of all things, when Garrus died, I even had a twinge of guilt at seeing Jack's mangled face.... am I disclosing here how little I put into the game, here...?

I think to be honest only Grunt, the black guy, Miranda and the DLC girl survived for me... this was surprising as I thought if you did the side quests for each character they basically would survive... this was not the case, I used Garrus all the time in pretty much every quest.... but still... he didn't make it.... any I felt a little guilty for it......

As for Grunt, I had no sympathy towards him, I had read a few minor spoiler hints and I was under the impression that you had to choose one character to kill off, to send on a suicide mission..... I had Grunt in mind for this because I figured he was the least human and most animal like..... and yet, Grunt survived!

I went down to CeX and saw Mass Effect 3 for £2, so have just bought it, I understand that characters that lived can get carried over, but those who died, they are gone forever.

There is something refreshing about this. In most games death is something that can be corrected with loading up an old save, or using a phoenix down or whatever.... but here, death is death and we have to live with the consequences of our failings to protect the characters in our team. That's something I really like because its true to life, and whilst we play games as a form of escape, I like games to have some moral teaching in them, or something to help make me a better person. Being reminded of my mortality and the mortality of my friends, and the permanence of death... they are all good things from a Catholic world view.

Remember Mordin, thou art bits, and unto bits thou hast returned.
Remember Fr Higgins you are dust and unto dust you shall return.

What Have I Been Up To?

   Personally, I have been dealing with treatment for Major Depression Disorder and ADD. After many years of denial. Meds and therapy are helping. A lot. Please don't be dumb like me - go get help if you even think you need it.

  Hobby-wise, I have been into Gaslands and KillTeam lately. Lots of terrain painted, and some more cars. Painted up the starter box for KillTeam for my sons, so a few Primaris Reaver Space Marines and some Tau Fire Warriors. Working on my own team of Genestealer Cultists because I have wanted to play them since they first appeared in White Dwarf in 1989 or so. Played some Team Yankee, and some Flames of War v.4. Have almost completed a Starfinder campaign (Against the Aeon Throne AP) that I am GMing. I play in an online Starfinder game, too. Played a big OGRE game in November. Finished up a couple of airships, but need to build stands for them. Though that has been designed.























The Shiny Trashcan Effect

Greetings from debt purgatory!

We are half way through paying off our construction debt for our expansion project started in 2014. Do you remember 2014? Fantasy Flight Games was still an independent company, Magic was going strong and the big news story was the outbreak of Ebola. Good times. Our Kickstarter did fund successfully that year. We did complete the project, albeit two years late. We did send out all the rewards, and one refund to that jackass who likes to leave me (hidden) blog comments. That saga is a whole other story (it's in the book).

Customers occasionally come in, tell us how they're great supporters of ours, how they buy all their games from us and ... holy hell, you built a second floor!!! Yes, thank you, thank you. Mmm hmmm. I stopped mentioning it was years ago. Snark is not appreciated and we need all the customers we can get. Got debt to pay down.

So how are we doing? It's a bit of a struggle making loan payments and trying to grow during a period of industry transition. There are projects I would like to do. There's a white board in my office with $20,000 worth of stuff. Yet, we just improved the store in our bid to obtain Wizards of the Coast "premium" status, and we somehow came up with the thousands to do that.

Yes, thousands of dollars for a nebulous status. However, this is exactly what I had been asking for. Recognition of hard work and capital spent to improve a venue rather than shoeboxes of cardboard (even though the cardboard is more in line with success with the WOTC model). How could I not pursue this? When motivated, we can make things happen. In the future we shall refer to this as the Shiny Trashcan Effect.





Our sales necessary for growth, the needed engine to pay off our debt, have exceeded expectations. We saw a large jump when the space was complete, but it was a one time thing (about three times bigger than projected). We immediately went back to the grind. It brought home the fact that the space is really important to a small subset of customers (20%). That money spent on doubling inventory would have seen growth over years, but probably slower growth, rather than all at once. There's also the question of whether doing nothing at all would have led to the same growth rate, considering we struggled to focus the business in the Kickstarter and construction year. No, no, this will have longer term benefits, if we can leverage them.


Anyway, we're up 25% this year, due to a number of factors, so I'll continue to fantasize about that white board and work on projects that don't require intensive capital. And maybe we'll hit Premium status with WOTC and see some benefit there.

Monday, March 16, 2020

Wooden Jigsaw Puzzles: A Comparison (Monday Musings 80)

I've decided to write as many posts as possible, and titling it Monday Musings from now on, to insure that I don't "fall behind" lol.

As another hobby to consider (to give your eyes much needed rest from all the blue light of video games) is jigsaw puzzles. I got into puzzles once again as my friend introduced me to the Wentworth wooden puzzles. I was so impressed with these puzzles because of the quality and the satisfying tactile feel when you put the pieces together, that I wanted to order some myself.

Upon visiting Wentworth's online site, my heart sank as the puzzles were rather pricey, though at $50 for a 250-piece puzzle, the cost/time is actually reasonable, as long as you do the puzzle a couple of times. Since I'm very slow, it takes about 2 hours, so if you do the puzzle 2 or 3 times, it's cheaper than going to the movies. So I thought of getting one, but then the shipping charges were astronomical, since it's shipping from the UK. However, I found out later that Wentworth often has free shipping to US! But not realizing that at the time, I decided to see if there are US manufacturers which will have lower shipping costs.

Therefore, I did more research and stumbled upon the ridiculous Stave puzzles (Barbara Bush-endorsed) at average price of $1000 (perhaps even $2000 as some are $15K), so this brand will not be reviewed. I then fell upon the much more affordable and reasonable Architect and Liberty puzzles.

I find that they are all equal to each other, so the puzzle manufacturer that is best for you is based really on your preferences and what you're looking for. I'll outline the differences between the three, in alphabetical order.

Artifact puzzles is the most creative of not just the pictures offered, but the many interesting puzzle shapes. I don't find the tired, drab images of known paintings, and boring, uninspired nature scenes, as compelling as the fantastical pictures including monsters, cartoon characters, and so forth that Artifact offers.

Although Artifact pieces are the most loose fitting of the three, the irregularly irregular pieces are significantly more bizarre and odd than the other brands, and therefore quite compelling. It's interesting to see how these weird pieces fit together, often leading to a lot of "Ah ha" moments. They're coming out with the new Ecru line which offers tighter fitting pieces with no glare design, but it's more costly of course. Further, the designs aren't as whimsical or fantastic as their regular line, so I have a feeling that I'd prefer the regular over the upcoming Ecru. Picture for me tends to be most important.


Artifact's Mechanical Griffin
Artifact tends to have the most whimsy pieces out of the three, meaning pieces that are shaped thematically. So a cat puzzle will have cat-shaped pieces.

The image quality on Artifact and Wentworth is better than Liberty in the sense that the images seem like it's actually painted on the wooden pieces. One of the Liberty puzzle pieces had a small peel, that can be glued, so I don't find this a deal breaker.

If interested in Artifact, I would recommend the Griffin that comes with a clever surprise (spoilers avoided here). 

All the Artifact puzzles I own are so completely different from each other (I have 4!). Other customers also noticed that any time you get a puzzle from Artifact, it's a whole new experience.

As for the Liberty Puzzle, it has the same thickness as Artifact (6.35 mm), but the fit of the pieces are much tighter, so in that sense the pieces are better quality than Artifact's regular line, only marred by the fact that a piece may (or may not) have some peeling (it seems like this would be a rare occurrence), unlike Artifact and Wentworth. 

Liberty does have a lot of whimsy pieces, not as much as the Artifact, but more so than the
Liberty's and Wentworth's An Exuberant Success
Wentworth. The pieces are more redundant than Artifact, tending to be more regularly irregular, rather than the irregularly irregular shapes of Artifact.


The Wentworth is made of considerably thinner wood than Artifact and Liberty, less than half the thickness (3 mm versus 6.35 mm). The thicker wood feels more luxurious, but because the Wentworth pieces are thinner, it's the best fitting of the three. The sensation of putting the pieces together in a satisfying click, so it  has the most pleasant sensory experience out of all three. There are whimsy pieces, but nowhere near as much as Artifact and Liberty, and more regular-shaped pieces than even the Liberty.

Wentworth includes a rather lovely felt bag to hold the pieces within its sturdy box. Sadly, Artifact and Liberty don't.

If you prefer unique pictures, and thicker, peculiar, odd and whimsical pieces, I'd recommend Artifact. If you prefer an equally thick cut with better fit, and you don't mind more regularly irregular shaped pieces, than I'd chose the Liberty. Finally, if you want that tactile, satisfying click feel with nice bag, and don't mind less creative shapes, then Wentworth is the puzzle for you. With these criteria in mind, Artifact is my favorite of the three due to the creativity aspects.

If none of these issues matter to you, I'd recommend ordering the designs that you find the most pleasing, because you can't go wrong with any of these puzzle manufacturers. They all cost around the same price, and Wentworth frequently has sales where shipping is free to the US.

For all three manufacturers, prices are cheaper ordering online at their websites:

Artifact Puzzles
Liberty Puzzles
Wentworth Puzzles

The How of Happiness Review

Sunday, March 15, 2020

Hiring: Project-based Programmer



Title: Gameplay Programmer
Type: Full-time, project-based (1 year)
Last day to apply: 8th of July 2018


Frictional Games is famous for its immersive, atmospheric first-person games; games created by a small team working closely together. For our next game, we need to expand that team! We need a gameplay coder who can support the rest of us, taking on responsibility for game-wide systems such as inventory, AI, first-person body, and other features that the player's experience will depend on. Join us, and help us transport our players to strange and terrifying new realms.

The position is full-time, and project-based for the period of 1 year. After that period there may be a possibility for the position to become permanent.

What will you work on?
Here are some of the specific gameplay systems you will find yourself working on:
  • Inventory management
  • AI behavior
  • Physics interactions
  • User interface
  • Game-specific systems (think Sanity system in Amnesia: The Dark Descent)
  • Inverse kinematics
It is a big plus if you have already worked on most of these before. While we value experience, it is more important that you are willing and able to dig into challenges and learn new things. We are interested in playing to your strengths, so the things listed will not be the only ones you will be working on.

What are we looking for?
The person we're looking for should have a solid understanding of different gameplay systems. You need to be able to see the big picture and have a firm grasp on how information flows between modules, and how complex behaviour can be reduced into simple rule sets.

We use our own engines, so you need to be able to adapt to the existing system and code base. We also value the end user experience, so we hope you can step into the players' shoes instead of only focusing on the nitty gritty technical stuff.

You have to be a European resident to apply!

Here are our other essential requirements:
  • You have worked on a game that uses 3D environments.
  • Well-versed in C++, C#, Java or similar.
  • Strong linear algebra skills.
  • Major role in completing at least one game.
  • Strong self-drive and ability to organise your own work.
  • A critical approach to your work, ability to reflect.
  • Confidence in implementing your own designs.
  • Fluency in English.
  • Team communication skills.
  • Knowledge of game design.
  • A Windows PC that runs recent games (such as SOMA) that you can use for work (unless you live in Malmö and will work from the office).
  • A fast and stable internet connection.
For this position you can work from home. We have a central hub in Malmö, Sweden, which you can use if you wish.

What we offer:
  • Flexible working hours, a no-crunch approach.
  • Opportunities to influence your work flow.
  • Variety in your work tasks, and ability to influence your work load.
  • Participation in Show & Tell of games, having a say in all aspects of the game making.
  • An office in central Malmö you can use.
  • An inclusive work environment.
  • A possibility to become a permanent employee.

Apply? Yes!
Did the tasks above sound like your cup of tea (or other beverage)? Are you the person we're looking for? Then we would love you hear from you! The last day to send the application is 8th of July 2018 - but the sooner the better.

Please send us your:
  • Cover letter
    • Tell us why we should hire YOU!
  • CV
  • Portfolio
    • PDF or links to your works
Please note that we require all the attachments to consider you.

Send your application to apply@frictionalgames.com!

Privacy Policy
By sending us your application, you give us permission to store your personal information and attachments.

We store all applications in a secure system. The applications are stored for two years, after which they are deleted. If you want your your information removed earlier, please contact us through our Contact form. Read more in our Privacy Policy.

Thursday, March 5, 2020

Tech Book Face Off: Effective Python Vs. Data Science From Scratch

I must confess, I've used Python for quite some time without really learning most of the language. It's my go-to language for modeling embedded systems problems and doing data analysis, but I've picked up the language mostly through googling what I need and reading the abbreviated introductions of Python data science books. It was time to remedy that situation with the first book in this face-off: Effective Python: 59 Specific Ways to Write Better Python by Brett Slatkin. I didn't want a straight learn-a-programming-language book for this exercise because I already knew the basics and just wanted more depth. For the second book, I wanted to explore how machine learning libraries are actually implemented, so I picked up Data Science from Scratch: First Principles with Python by Joel Grus. These books don't seem directly related other than that they both use Python, but they are both books that look into how to use Python to write programs in an idiomatic way. Effective Python focuses more on the idiomatic part, and Data Science from Scratch focuses more on the writing programs part.

Effective Python front coverVS.Data Science from Scratch front cover

Effective Python

I thought I had learned a decent amount of Python already, but this book shows that Python is much more than list comprehensions and remembering self everywhere inside classes. My prior knowledge on the subjects in the first couple chapters was fifty-fifty at best, and it went down from there. Slatkin packed this book with useful information and advice on how to use Python to its fullest potential, and it is worthwhile for anyone with only basic knowledge of the language to read through it.

The book is split into eight chapters with the title's 59 Python tips grouped into logical topics. The first chapter covers the basic syntax and library functions that anyone who has used the language for more than a few weeks will know, but the advice on how to best use these building blocks is where the book is most helpful. Things like avoiding using start, end, and stride all at once in slices or using enumerate instead of range are good recommendations that will make your Python code much cleaner and more understandable.

Sometimes the advice gets a bit far-fetched, though. For example when recommending to spell out the process of setting default function arguments, Slatkin proposed this method:

def get_first_int(values, key, default=0):
    found = values.get(key, [''])
    if found[0]:
        found = int(found[0])
    else:
        found = default
    return found
Over this possibility using the or operator short-circuit behavior:
def get_first_int(values, key, default=0):
    found = values.get(key, [''])[0]
    return int(found or default)
He claimed that the first was more understandable, but I just found it more verbose. I actually prefer the second version. This example was the exception, though. I agreed and was impressed with nearly all of the rest of his advice.

The second chapter covered all things functions, including how to write generators and enforce keyword-only arguments. The next chapter, logically, moved into classes and inheritance, followed by metaclasses and attributes in the fourth chapter. What I liked about the items in these chapters was that Slatkin assumes the reader already knows the basic syntax so he spends his time describing how to use the more advanced features of Python most effectively. His advice is clear and direct so it's easy to follow and put to use.

Next up is chapter 5 on concurrency and parallelism. This chapter was great for understanding when to use threads, processes, and the other concurrency features of Python. It turns out that threads and processes have unique behavior (beyond processes just being heavier weight threads) because of the global interpreter lock (GIL):
The GIL has an important negative side effect. With programs written in languages like C++ or Java, having multiple threads of execution means your program could utilize multiple CPU cores at the same time. Although Python supports multiple threads of execution, the GIL causes only one of them to make forward progress at a time. This means that when you reach for threads to do parallel computation and speed up your Python programs, you will be sorely disappointed.
If you want to get true parallelism out of Python, you have to use processes or futures. Good to know. Even though this chapter was fairly short, it was full of useful advice like this, and it was possibly the most interesting part of the book.

The next chapter covered built-in modules, and specifically how to use some of the more complex parts of the standard library, like how to define decorators with functools.wraps, how to make some sense of datetime and time zones, and how to get precision right with decimal. Maybe these aren't the most interesting of topics, but they're necessary to get right.

Chapter 7 covers how to structure and document Python modules properly when you're collaborating with the rest of the community. These things probably aren't useful to everyone, but for those programmers working on open source libraries it's helpful to adhere to common conventions. The last chapter wraps up with advice for developing, debugging, and testing production level code. Since Python is a dynamic language with no static type checking, it's imperative to test any code you write. Slatkin relates a story about how one programmer he knew swore off ever using Python again because of a SyntaxError exception that was raised in a running production program, and he had this to say about it:
But I have to wonder, why wasn't the code tested before the program was deployed to production? Type safety isn't everything. You should always test your code, regardless of what language it's written in. However, I'll admit that the big difference between Python and many other languages is that the only way to have any confidence in a Python program is by writing tests. There is no veil of static type checking to make you feel safe.
I would have to agree. Every program needs to be tested because syntax errors should definitely be caught before releasing to production, and type errors are a small subset of all runtime errors that can occur in a program. If I was depending on the compiler to catch all of the bugs in my programs, I would have a heckuva lot more bugs causing problems in production. Not having a compiler to catch certain classes of errors shouldn't be a reason to give up the big productivity benefits of working in a dynamic language like Python.

I thoroughly enjoyed learning how to write better Python programs through the collection of pro tips in this book. Each tip was focused, relevant, and clear, and they all add up to a great advanced level book on Python. Even better, the next time I need to remember how to do concurrency or parallelism or how to write a proper function with keyword arguments, I'll know exactly where to look. If you want to learn how to write Python code the Pythonic way, I'd highly recommend reading through this book.

Data Science from Scratch

I didn't expect to enjoy this book quite as much as I did. I went into it expecting to learn about how to implement the fundamental tools of the trade for data science, and that was indeed what I got out of the book. But I also got a lighthearted, entertaining, and surprisingly easy-to-read tour of the basics of machine learning using Python. Joel Grus has a matter-of-fact writing style and a dry wit that I immediately took to and thoroughly enjoyed. These qualities made a potentially complex and confusing topic much easier to understand, and humorous to boot, like having an excellent tour guide in a museum that can explain medieval culture in detail while cracking jokes about how toilet paper wasn't invented until the 1850s.

Of course, like so many programming books, this book starts off with a primer on the Python language. I skipped this chapter and the next on drawing graphs, since I've had just about enough of language primers by now, especially for languages that I kind of already know. The real "from scratch" parts of the book start with chapter 4 on linear algebra, where Grus establishes the basic functions necessary for doing computations on vectors and matrices. The functions and classes shown throughout the book are well worth typing out in your own Python notebook or project folder and running through an interpreter, since they are constantly being used to build up tooling in later chapters from the more fundamental tools developed in earlier chapters. The progression of development from this chapter on linear algebra all the way to the end was excellent, and it flowed smoothly and logically over the course of the book.

The next few chapters were on statistics, probability, and their use with hypothesis testing and inference. Sometimes Grus glossed over important points here, like when explaining standard deviations he failed to mention that this metric only applies to (or at least applies best to) normal distributions. Distributions that deviate too much from the normal curve will not have meaningful standard deviations. I'm willing to cut him some slack, though, because he is covering things quickly and makes it clear that his goal is to show roughly what all of this stuff looks like in simple Python code, not to make everything rigorous and perfect. For instance, here's his gentle reminder on method in the probability chapter:
One could, were one so inclined, get really deep into the philosophy of what probability theory means. (This is best done over beers.) We won't be doing that.
He finishes up the introductory groundwork with a chapter on gradient descent, which is used extensively in the later machine learning algorithms. Then there are a couple chapters on gathering, cleaning, and munging data. He has some opinions about some API authors choice of data format:
Sometimes an API provider hates you and only provides responses in XML.
And he has some good expectation setting for the beginner data scientist:
After you've identified the questions you're trying to answer and have gotten your hands on some data, you might be tempted to dive in and immediately start building models and getting answers. But you should resist this urge. Your first step should be to explore your data.
Data is never exactly in the form that you need to do what you want to do with it, so while the gathering and the munging is tedious, it's a necessary skill that separates the great data scientist from the merely mediocre. Once we're done learning how to whip our data into shape, it's off to the races, which is great because we're now halfway through this book.

The chapters on machine learning models, starting with chapter 12, are excellent. While Grus does not go into intricate detail on how to make the fastest, most efficient MLMs (machine learning models, not multi-level marketing), that is not the point. His objective is to show as clearly as possible what each of these algorithms looks like and that it is possible to understand how they work when shown in their essence. The models include k-nearest neighbors, naive bayes, linear regression, multiple regression, logistic regression, decision trees, neural networks, and clustering. Each of these models is actually conceptually simple, and the models can be described in dozens of lines of code or less. These implementations may be doggedly slow for large data sets, but they're great for understanding the underlying ideas of each algorithm.

Threaded through each of these chapters are examples of how to use each of the statistical and machine learning tools that is being developed. These examples are presented within the context of the tasks given to a new data scientist who is an employee of a budding social media startup for…well…data scientists. I just have to say that it is truly amazing how many VPs a young startup can support, and I feel awfully sorry for this stalwart data scientist fulfilling all of their requests. This silliness definitely keeps the book moving along.

The next few chapters delve a bit deeper into some interesting problems in data science: natural language processing, network analysis (or graph algorithms), and recommender systems. These chapters were just as great as the others, and by now we've built up our data science tooling pretty well from the original basics of linear algebra and statistics. The one thing we haven't really talked about, yet, is databases. That's the topic of the 23rd chapter, where we implement some of the basic operations of SQL in Python in the most naive way possible. Once again it's surprising to see how little code is needed to implement things like SELECT or INNER JOIN as long as we don't give a flying hoot about performance.

Grus wraps things up with an explanation of the great and all-powerfull MapReduce, and shows the basics of how it would be implemented with mapper and reducer functions and the plumbing to string it together. He does not get into how to distribute this implementation to a compute cluster, but that's the topic of other more complicated books. This one's done from scratch so like everything else, it's just the basics. That was all fine with me because the basics are really important, and knowing the basics well can lead you to a much deeper understanding of the more complex concepts much faster than if you were to try to dive into the deep end without knowing the basic strokes. This book provides that foundation, and it does it with flair. I highly recommend giving it a read.


Both Effective Python and Data Science from Scratch were excellent books, and together they could give a programmer a solid foundation in Python and data science as long as they already have some experience in the language. With that being said, Data Science from Scratch will not provide the knowledge on how to use the powerful data analysis and machine learning libraries like numpy, pandas, scikit-learn, and tensorflow. For that, you'll have to look elsewhere, but the advanced, idiomatic Python and fundamental data science principles are well covered between these two books.

Financial Accounting, 11Th Edition - Fox eBook

Financial Accounting, 11th Edition

Misty Knows The One True Religion


When it comes to getting rid of demons, Jesus Christ is the only way. Mohammed cannot help you, Buddah is useless, there is only one name before whom they must all kneel, the name of Jesus Christ (and the names of His Holy Saints, who are filled with Him and reflect Him).