Monday, March 16, 2020

As Long As I'm There...

I started to clear the table this morning but it seemed a shame to clear it after a single game so.......



Now that my 54's are back on their Volley & Bayonet/Morschauser style 3" unit bases, the grid is less useful than it was. I still had the measuring sticks I made a couple of years ago with brightly coloured 3" segments. It is easy to use and read in dim light even without glasses and also makes the grid less useful as long as all ranges and moves are in multiples of 3".


Since it's not quite a Square Brigadier game I quickly scribbled a one page variation but decided to experiment with getting a bit more radical and  leaving out  even more detail and removing more unit action options since I was going to be playing a Thomas scenario anyway. By and large it worked and a play through only took about an hour using roughly 1/2 the planned total number of units per side.  I think I want to bring back a bit more colour and more player decisions but its going to take some thought and experimentation.

Thursday, March 5, 2020

Tech Book Face Off: The New Turing Omnibus Vs. Patterns Of Software

I'm churning through tech books now, finishing off a bunch that I had started a while back, but couldn't find the time to finish until now. The pair that I'll look at here are a couple of older books that I picked up through recommendations on blog posts. The first one, The New Turing Omnibus: 66 Excursions in Computer Science by A.K. Dewdney, is a survey of 66 topics in a wide range of areas of Computer Science. The second book, Patterns of Software by Richard P. Gabriel, is about advice and experiences on a variety of topics in software development. Whereas NTO is of a strictly technical nature, Patterns of Software has much more of the human aspect of working with computers and software. Let's see how these older books hold up today.

The New Turing Omnibus front coverVS.Patterns of Software front cover

The New Turing Omnibus


With the new edition published in 1993, this is definitely an older computer science book. That can be okay, if the author sticks to the more timeless aspects of computer and software design. For the most part, this is the case in NTO, but a few of the chapters—especially the ones on VLSI computers and disk operating systems—are definitely dated and nearly beyond usefulness. The topics vary far and wide, though, and are generally grouped into eleven subject areas with the following breakdown:
  • Analysis of Algorithms (8)
  • Applications (7)
  • Artificial Intelligence (5)
  • Coding and Cryptology (3)
  • Complexity Theory (6)
  • Computer Graphics (3)
  • Data Structures (6)
  • Automata and Languages (5)
  • Logic and Systems Design (9)
  • Theory of Computation (9)
  • Miscellany (5)
The miscellany chapters could honestly been grouped into the other categories, and the three computer graphics chapters were just as much algorithms or data structures as anything, so nine categories would have been sufficient. That's fairly inconsequential, though, because the topics were presented completely haphazardly anyway. The chapters would go from Karnaugh Maps to the Newton-Raphson Method of finding roots to minimum spanning trees without any ceremony whatsoever, leaving the reader grappling for a solid structure to hold on to.

Each chapter is a brief 5-7 page discussion on the given topic followed by two or three problems related to the topic as practice for the reader. These problems commonly explored points glossed over in the text. The topic discussions read like blog posts and don't give more than a cursory introduction to the sometimes deep and complex subjects they are covering.

I had high hopes for this book, considering the glowing recommendation that Jeff Atwood gave it back in 2007 on Coding Horror, but I just couldn't get into it the way he did. I found the treatment of the topics that I had already learned in much more depth, mostly from studying in college, to be tedious and unremarkable. The remaining 25% of the topics, mostly on the theory of computation and automata, was quite difficult to understand from the short expositions given, and I would have to do more extended studying with a book like the Introduction to the Theory of Computation to get enough of a handle on the subject to answer the more difficult end-of-chapter problems.

I may not have been the right audience for this book, but I had a lot of trouble figuring out who the right audience would be. The material was so superficial that I didn't find any additional insights or valuable practice from any topics I already knew about, and those topics that I had little exposure until now were nearly completely opaque from the text. It was weird. The book didn't seem to fit for either a novice or a (moderate) expert on any of the topics, and the fact that related topics were strewn throughout the book, separated by completely unrelated topics, made it even more frustrating and less helpful. Maybe if you were using it as a supplement while studying some of the broader subjects for extra practice, it would prove to be of some use, but I'm not even convinced of that. I have to give this book a solid "no" at this point. There are much better books out there on the subject areas covered here.

Patterns of Software


This was an odd book, and not at all what I expected. I had expected a book relating advice to the reader on how to design and develop software. What it is instead is an extended comparison of Christopher Alexander's work on patterns in architecture to patterns in programming followed by speculations on programming languages, advice on learning to become a good writer, and a significant part of Richard P. Gabriel's life story. It was a strange mishmash of things that didn't quite hold together as a cohesive book.

Throughout the first part on how Alexander's books—the most well-known being A Pattern Language—relate to programming, Gabriel quotes Alexander extensively, to the point where I almost felt like I was reading Alexander more than Gabriel. He also did not spend enough time tying all of these quotes into programming and software, so much of the time I was left wondering if the book was just a review of Alexander's works.

Gabriel did have some insights into programming that resonated well, such as
Maintaining compressed code requires understanding its context, which can be difficult. The primary feature for easy maintenance is locality: Locality is that characteristic of source code that enables a programmer to understand that source by looking at only a small portion of it. Compressed code doesn't have this property, unless you are using a very fancy programming environment.
We must be careful to strike the right balance when coding so that we don't unnecessarily obscure things that should be simple and easy to understand just for the sake of abstraction. Sometimes it's better to lay out a process linearly so that it can all fit on the screen at the same time instead of slicing and dicing to the point where the poor sap who has to debug the code needs to chase the flow of execution through dozens of functions and variables across tens of files. This insight gets at one of the themes of the book on making code habitable:
Habitability is the characteristic of source code that enables programmers, coders, bug-fixers, and people coming to the code later in its life to understand its construction and intentions and to change it comfortably and confidently.
This idea of habitability is a worthy goal, and Gabriel returns to it often in the context of Alexander's architecture patterns:
What Alexander seems to be saying is that if we try to use modular parts (solid building blocks not easily molded to the current circumstances), then the overall structure of the thing built with them may become overly constrained by their shape. In programming, if a set of large abstractions does nearly the right thing, it is tempting is [sic] to use them and to bend the structure of the surrounding program to fit them. This can lead to uninhabitable programs.
It seems like much of modern software development has become exactly this, where we as programmers have been reduced to searching for and slapping together all of the packages we need to meet the given software requirements. In this process of moving towards extreme reuse, something has been lost in software development, and this is speaking from a perspective more than twenty years after this book was written, with reuse being much more common and extensive than it was then. This thing that has been lost is Alexander's "quality without a name."

Both Alexander and Gabriel spent a lot of time trying to define this quality without a name, but neither succeeded very well. Gabriel critiqued Alexander's choices in descriptive words, like "simple" and "cohesive," but while he was right that the word choices did not do the concept justice, he did not do much better in clarifying what the quality was. Even more troublesome than defining it, Alexander found that he couldn't replicate this nameless quality by enumerating the patterns of architecture. It's not something that you can create simply by combining known good patterns in a building.

This difficulty of codifying quality is true for almost anything we do. It's as true for architecture as it is for programming as it is for every form of craftsmanship, and it seems obvious that this would be so. We can't package up and mass produce quality that simultaneously exhibits beauty, elegance, efficiency, and function. Reaching the point where you can produce things of such a high level of quality takes decades of experience, creativity and experimentation. Most people will never reach the level of craftsmanship where their work is elevated to an art form.

It was frustrating that Gabriel danced around that conclusion for most of the book, but never really committed to it. He did spend a fair amount of time on silly tangents, like the chapter where he claimed that the development of programming languages was at an end, and C was the ultimate answer. That prediction looks mighty short-sighted today.

The rest of the book, detailing Gabriel's struggles through college and running a software business, was sometimes interesting and sometimes not, but it didn't have much to do with the first half of the book on patterns and code habitability. In general, his writing was quite repetitive and disorganized. He would introduce a new topic or part of a story by giving away the conclusion as if it was a stand-alone statement, and then proceed into an extended discussion on it. A few pages later I would realize he was talking about the details of a story that I had thought was just an isolated observation and we had moved on. This writing style was quite disorienting, and the constant repetition of certain observations or narratives, each time stated as if it was the first, became fairly annoying.

Between the sparse real insights and disjointed structure of the book, I can't recommend Patterns of Software at all. The software development advice can easily be had in much better books without the extended and largely irrelevant fluff. It's unfortunate. I feel like I really struck out with this book and The New Turing Omnibus, but sometimes that happens. Maybe the next couple books I read will be much better.

Metal Gear Solid 2: Substance (PS2)

Metal Gear Solid 2 substance title screen playstation 2 PAL
Developer:Konami|Release Date:2003 (Sons of Liberty 2001)|Systems:PS2, PS3, Vita, Xbox, Xbox 360, Windows

March 4th, 2000, two decades ago, the second and most popular of the sixth-generation consoles was released in Japan. That means that today is the PlayStation 2's 20th birthday!

My first idea was that I could play one of its original launch titles to celebrate, but then I looked at what they were and decided that I could do better. So this week on Super Adventures, I'm playing Metal Gear Solid 2: Sons of Liberty! Actually to be precise I'm playing the re-released Substance edition (PAL version) but really it's the same thing. They were just getting people to double dip for a handful of special missions. Well okay, lots of handfuls of special missions.

I actually beat this game once, many years ago, on PC. So I'll have a vague idea of what I'm doing but not what buttons to press to do it. Though one thing I definitely haven't forgotten, is how great the opening theme by Harry Gregson-Williams is. I think it sounds even better the original Metal Gear Solid theme by TAPPY, which sounds better than "The Winter Road" by Russian composer Georgy Sviridov. Unfortunately it also sounds kind of similar, and the other song was written back in the 70s, so Konami had to stop using their own MGS theme in the MGS games. This means they won't get to use it in the movie either!

Okay, I'm going to be playing the game up to a little bit into the Plant chapter, so there'll be SPOILERS for the first two hours or so. I might also mention at some point that the story becomes a bit of a confusing mess by the end and the game left a lot of questions that weren't answered for seven years.

Read on »

Download Here They Lie For PS4

Download Here They Lie For PS4

PRELUDE | CUSA05344 | Update v1.03 | VR | HACKED


PlatformPlayStation 4
There's something truly terrifying about not having any idea where you are or what you're doing there and not even being able to trust your own eyes. In Here They Lie, part of the horror comes from not knowing if the world is messed up, or if it's just you. The starting area was the scariest for me because everything was so mysterious — as I moved through a train, shadowy figures appeared before me and then vanished. Showing the threat but not actually sending anything my way as I wandered (with smooth movement using the gamepad) through an unfamiliar, labyrinthine subway station was enough to make me tense up quite a bit.







DOWNLOAD

 PRELUDE - Here They Lie - DIRECT LINK


Password: After 10$ payment is done

Wednesday, March 4, 2020

Tech Book Face Off: Seven Languages In Seven Weeks Vs. Seven More Languages In Seven Weeks

Yes, that's right. I learned fourteen programming languages in as many weeks. Actually, it was more like four weeks, but I just couldn't put these books down. I had wanted to work through them ever since I had read Seven Databases in Seven Weeks a few years ago and loved it. Now I finally made the time to read them, and had a blast the whole time. I shouldn't have waited so long to crack these books open. I started off with Seven Languages in Seven Weeks by Bruce Tate, and then quickly moved on to consuming his follow on book, Seven More Languages in Seven Weeks, co-authored with Ian Dees, Frederic Daoud, and Jack Moffitt. It's not as hard as it would seem to learn about so many languages in such a short amount of time, as long as you already have a few under your belt, because really the hardest programming language to learn is the second one. After you overcome the confusion of holding two different languages in your head, it becomes much easier to add another and another and another. The differences get slotted into your brain more readily, and the major hurdle becomes figuring out how to use the new paradigms and features that you run up against. Let's see how these books handled presenting all of these different languages and smoothing the shock of moving from one language to another in rapid succession.

Seven Languages in Seven Weeks front coverVS.Seven More Languages in Seven Weeks front cover

Seven Languages in Seven Weeks


With such an ambitious goal crammed into 300 pages, Bruce Tate certainly had to take some shortcuts with this book. Those cuts included any installation instructions beyond a link and a version number, detailed descriptions of the literals, operators, and control structures of each language, and extended tours of the standard libraries. There's just no time for that crap, and it's expected that if you're reading a book like this, you've been around the block a few times and can either figure out how to write basic lines of code in any language on your own or you know how to google it. There are more important things to cover for these languages.

Each of the seven languages gets its own chapter, split into three days. The first day introduces the basics of a language with some quick examples and an interview with the language's creator. The second day starts covering the unique aspects of the language and gets further into the programming model. The third day usually gets into the concurrency aspects of the language, if it has special constructs for concurrency, or some other special aspect of the language, like metaprogramming in Ruby or monads in Haskell. At the end of each day Tate gives some good exercises to help solidify the ideas presented for that day and lead into the next day.

The discussions were great—concise and to the point while also being clear and extremely helpful for understanding the difficult parts of each language. To make the material even better, all throughout the book the languages are compared with popular movies. It was entertaining to see Tate go from Ferris Bueller's Day Off to The Princess Bride to The Matrix without missing a beat. I never knew which movie reference would pop up next, and it made me keep plowing through for more. It was a wild ride. So what were the seven languages covered?

Ruby
First off was a language I already knew pretty well. Ruby is a beautiful language that achieves its goal of making programmers happy. It's probably my favorite language of all the ones I (now) know. It's a straight-up object-oriented language where everything is an object, including literals and operators. Tate covers duck typing, code blocks, mixins, the almightly Enumerable module, and of course metaprogramming. In three short days you can really get a sense of what makes Ruby a great language for programmers.

Io
Io is a prototypical language, meaning everything is an object, but there are no classes. Objects are derived from other objects and then changed by adding parameters and functions to slots in the object. It's quite a small language without many extra features or syntax, but it is definitely a flexible language. The programmer has complete freedom to change how objects behave by changing their base functions. It took me a little while to wrap my head around how to program in this language, but it was very satisfying to figure it out.

Prolog
This language is probably the weirdest one in the set. Prolog is a pattern-matching (a.k.a. logic programming) language that excels at certain types of problems like scheduling and natural-language processing. Instead of a program being made up of expressions and executing statements in a sequential order, Prolog programs are made up of facts and rules, and the runtime environment solves for the rules given the facts and a question posed to it by trying different combinations of values for the free variables. It's a fascinating language. Mind-bending, but fascinating.

Scala
Scala is a hybrid language that is equal parts object-oriented and functional. It's the modern day equivalent of C++ for hybrid procedural and object-oriented programming, and it runs on the JVM so it has access to the entire Java edifice. Bridging these two programming paradigms makes it an important language to watch, but I could tell Tate thought it was rather boring. This chapter was the dullest of the bunch, and programming in Scala seemed fairly straightforward using either paradigm, compared to many of the other languages.

Erlang
Erlang is built on top of Prolog, so it retains much of the same weirdness of Prolog's pattern-matching logic programming paradigm, but softens it somewhat. What makes Erlang unique is its incredible robustness for highly-concurrent programs. Instead of threads, Erlang spawns lightweight processes for each task that needs to run in parallel, and those processes can be monitored and quickly restarted if they fail. It's a compelling concurrency model. You just have to get over the Prolog roots.

Clojure
Here it is—the one Lisp language of the set. Clojure runs on top of the JVM, like Scala, but it takes the path of a functional language. Personally, I love programming in Lisp. It has a certain elegance and expressiveness that other languages can't duplicate, and it's great to see a version of it have a chance at wider adoption in Clojure. It even eases the code syntax a bit by removing some of the parentheses. This chapter was especially enjoyable to work through.

Haskell
Tate saved the most challenging language for last. Haskell builds on many of the features of the other languages with pattern-matching, lazy evaluation, and list comprehensions. It is strongly-typed like Scala and uses type inference to take much of the burden of specifying types off of the programmer. Haskell's type system is truly legendary, and this chapter only scratches the surface of it. Haskell's also a purely functional language, so monads are needed to handle I/O and mutable state. I feel like I barely caught a glimpse of this language, but this chapter has motivated me to learn more.

I had such a blast going through this book and learning all of these languages, many of which I've been meaning to take a look at for some time. This book allowed me to do that efficiently, and now I know what I want to explore in more depth. While I wouldn't say I learned any of these languages in any detail, I was able to see the strengths and big ideas surrounding each of them, and I have a better sense of which languages are well suited for different kinds of problems. Sometimes that's half the battle of solving a problem. This book is a phenomenal resource for quick tours of different languages and programming paradigms. I can't recommend it highly enough.

Seven More Languages in Seven Weeks


Whereas in the first book I had at least known of all of the languages and was already fluent in one of them, nearly all of the languages in this book I had never heard of before, save one: Elixir. That ended up not mattering much, since almost every language was related to one that I already knew in some way. That meant I could slot the various programming models into my brain based on how they compared and contrasted with other languages. Not knowing of them before hand didn't make any difference in being able to learn about them during the course of the book.

I certainly learned plenty of new things as I went through the book, but by now you may be wondering, why am I subjecting myself to this onslaught of languages between these two books? As Bruce Tate explained in the introduction:
Each new language exposes you to a vocabulary, but not one of words. This new vocabulary is composed of the ideas that you use to shape your world. Though the precise syntax will almost certainly not commute from your sandbox into your production solutions, you'll see that many of the idioms do.
Different languages excel at different things. They have different programming models, and different things that they make easy or hard to do. They have different ways of solving problems. Learning about those different ways of doing things makes every program you write better because you can bring more resources to bear on the problem, even if you don't get to use the language that would be best suited to it. With that perspective in mind, let's see which languages this cadre of authors chose to explore.

Lua
Lua is a scripting language in the truest sense of the word. It's commonly used as the scripting language for video games and big scriptable applications. It runs almost anywhere, and is commonly used in embedded systems as a higher level language than the old stalwart embedded workhorse, C. It also integrates easily with C, and they showed how to do exactly that on day 3 of this chapter. The overarching abstraction in Lua is the table. Everything in the language is a table, and data and functions are added into an object's table to enable state and behavior. Tables even have metatables that allow the programmer to write their own programming models and override basic language behavior. It's an amazingly flexible paradigm for a language.

Factor
This language was the weird one of the bunch for this book. Factor is a stack based language as well as a functional language. While most functional languages use prefix notation (+ 1 1), and most other languages use infix notatation (1 + 1), because of the stack, Factor uses post-fix notation (1 1 +). Prefix notation is hard enough to switch to, but post-fix notation will melt your brain. It took awhile to get the hang of mentally parsing the code, and I don't feel like I truly grasped the advantages of this stack language. It was a fascinating exercise trying to learn it, though, and I'm glad it was included.

Elm
Elm was created specifically to bring some sanity to client-side JavaScript programming. It's a strongly-typed functional language that compiles to JavaScript, and is intended to be used for user interface development. The killer feature that makes Elm so interesting in this regard is signals. Instead of using callbacks to write asynchronous UI code in the browser, Elm programmers can configure signals that are generated by various interface elements and can be received by other code in the program to initiation relevant processing. It's a welcome escape from callback hell, and a really clean programming model for the browser. If only the language would hold still for a little while. It had changed significantly between the writing of the book and now, so it took some time to get certain parts of the code examples working.

Elixir
What I knew of Elixir already was that, like Ruby, it has a ton of syntax sugar to make code compact and beautiful. That's true, but it's not all. Elixir is built on the Erlang VM, so it comes with the same robustness and safety for concurrent programming that Erlang has refined for decades, as well as access to the Erlang libraries. Elixir is also a functional language, and adds other fresh programming features like the pipe |> operator for chaining functions together and for comprehensions, which are kind of like list comprehensions on steroids. To top it all off, Elixir has a powerful Lisp-like macro system to enable metaprogramming.

Julia
Julia is meant to be a scientific programming language in the same vein as MATLAB, R, and Python (well, Python is not specifically for scientific programming, but it's heavily utilized for that purpose). Julia is a dynamic language, but it's compiled so it doesn't suffer from the same performance slowdowns as the other interpreted languages. The goal is to get scientific computing performance from an easy to use language, and Julia makes some interesting trade-offs there. It also has plenty of syntax sugar for doing linear algebra and DSP calculations. I'll be curious to see if it makes any inroads into the machine learning space.

miniKanren
This language is the logic programming language of the group, but it doesn't have the weird syntax of Prolog. It's built on top of Clojure, so it has the weird syntax of Lisp instead. The neat idea with miniKanren is that because it's layered on top of Clojure, it's a logic-and-functional programming language, and that combination greatly increases the problem space for which it's well suited. Clojure can be used for program I/O and pre- and post-processing, and miniKanren can be used precisely where it shines with solving logical problems cleanly and efficiently. Another fun fact is that miniKanren is an implementation of the logic programming language developed in The Reasoned Schemer, which is another book I've been meaning to read.

Idris
The final language is another pure functional language with a strong type system, like Haskell in the previous book. They always save the most complicated language for last, don't they? Idris is written in Haskell, and it takes Haskell's type system to the next level with dependent types. This type system enables new kinds of type-checking sorcery by specifying that a vector type must be a certain length, for example, or that the output matrix must have the same dimensions as the input matrix. Types can even be dependent on operations of other types, so we're really programming in types here. I'm not sure, but Idris' type system might be Turing complete in and of itself.

The format of these seven chapters was fairly similar to the last book, but with four different authors, the tone was a bit different. The analogies with movies were still there, although I would say they weren't quite as entertaining. Instead, on each third day the authors showed the reader how to implement something relatively significant in the chosen language, and that exercise was quite satisfying. From a mini-game with bouncing heads in Elm to a rudimentary JPEG compression algorithm in Julia, the programming tasks they came up with were good and showed off the strengths of each language. It's another highly recommended book on multiple languages that was extremely well done.


So did I learn fourteen languages in four weeks? No, of course not, but that's not the point. All four authors from the second book said it best near the end of the book:
Some will try to tell you that this journey is worthless, that you can't truly learn a language in seven days any more than you can learn Italian by eating at the Olive Garden once a week. If you've worked through these exercises, you know different. Traveling for the sake of traveling is not worthless. True, on your brief trip you've not yet accumulated the fluency of a permanent resident, but you have been there.
I've learned a ton of new things from these two books and fourteen languages. They were all so different that the number of ideas covered was incredible. I had no idea that the world of programming languages was so rich and varied, and I've come away from this experience wanting to learn even more. I'm certainly going to explore Clojure, Prolog (or miniKanren), Elixir, and Elm more deeply, and I may even delve into Io and Haskell if I can find the time. These books have shown me much more of the map, and that it is filled with fascinating destinations. Now I know better where I want to go.

Call For Candidates For IESF's Referee Course.

Johan van Breda (ZAG Academy) in action at MSSA's National Championships.
International Esports Federation (IESF) has a vision to standardise esports and its ecosystem in which it finds itself. As such IESF established an 'International Referee system'. Supported by 

Busan IT Industry Promotion Agency (BIPA), IESF has achieved great  strides in this arena and has been able to, as a result, add value to esports championships world-wide.

In 2016 Mind Sports South Africa's (MSSA) candidate (Thomas Brown)  participated in the first international referee workshop in Yinchuan on 12 May 2016. Thomas went on to be the first South African to referee a major esports event in Beijing in the Olympic Tennis Stadium.


Thus International Esports Federation (IESF) have requested its member federations to submit candidates for its 2020 Referee Training Course to be held from 24 to 28 February 2020 in Busan, Korea.

The curriculum has been developed by IESF together with game publishers in an effort to ensure that it meets the highest standards. 

Candidates for IESF's International Esports Referee program are nominated by member federations until Wednesday, February 12th (KST).  Successful candidates will be announced on Friday, February 14th (KST) by IESF.

Thus all Registered Players who are currently qualified as MSSA umpires who are willing to be considered for selection must provide the following to the Board by 10 February 2020:
  1. Number of national championships refereed by the candidate, and
  2. Proficiency in English