воскресенье, 29 марта 2020 г.
Meet Commodore's VIC(-20), The Friendly Computer
When Commodore made the PET-2001, they made a computer that found some success in the market, especially in Europe. The PET turned into a series, but it was an all-in-one PC that came with a monochrome monitor and was rather an expensive product. Commodore wanted to expand to more of a mass-market, and they designed the Commodore VIC-20, the first personal computer to sell for less than $300. The VIC was very successful when it was released in 1981, becoming the first computer to sell over one million systems. Its low price and feature set (color graphics, 4-channel sound) helped it to outsell its competitors. But it days in the limelight were short-lived due to the arrival of its successor, the Commodore 64. Having acquired a VIC-20, let's take a look at some of the practical issues with using it.
Read more »
What I've Learned From Programming Languages
I just finished up learning about fourteen new programming languages, and while my head may still be spinning, I've been struck by one thing about learning new languages. Every single new language I learn teaches me something new and valuable about programming. Some languages reveal many new things because they happen to be the first language I've learned based on a new programming paradigm, and other languages may expose only one or two new ideas because they overlap quite a lot with languages I already know. Every language has shown me at least one new thing, though, so I thought I'd take a look back and pick out one thing learned from each language I've encountered. Some of these languages I've used extensively and others I've barely scratched the surface, so I may miss some great insights in the languages less well-known to me, but that's okay. There's still plenty to reflect on.
Logo
Logo was my first programming language. Of all of the introductory programming concepts it taught me, the main thing I learned from Logo was how to give the computer instructions in order to accomplish a goal. What exactly did I need to type in to get that turtle to move the way I wanted it to? I had to be precise and not make any mistakes because the computer could only do exactly what it was told. When things went awry, I had no one or nothing to blame but myself.
QBasic
My programming journey really started with QBasic. As with Logo, I learned a ton of things from it because it was one of the first languages I learned, but since I'm going to pick only one thing, I'm going with fun. QBasic showed me that programming could be fun, and that I loved solving coding puzzles and writing basic arcade games in it. For me, QBasic was the gateway to the entire programming world and it was where the fun all began.
Pascal
Pascal was the first language I learned through study and coursework in high school. Of all the things I learned with Pascal, the one thing that stands out most in my memory is functions. Learning how variables and control structures worked came easily to me, but function declarations, definitions, and calls were the first programming abstraction that really stretched my mind. The fact that the argument names in the function call could be different than the parameter names in the function definition, as well as the rules surrounding function scoping all took time to full assimilate. It would not be the last time a programming concept would challenge my understanding, and every time it does, it inspires me to learn even more about programming.
C
The primary abstraction I learned in C was pointers, and with that comes memory allocation. Pointers are an extremely powerful, confusing, and dangerous tool. With them, you can write elegant, concise algorithms for all kinds of problems, and you'll come back to the code later and have no idea how it works. Most languages try to temper and wrap pointers in soft packaging so they can be used more easily and cause less damage. C leaves them raw and exposed so you can use them to their full potential, but you have to be careful to use them wisely or spend hours debugging segmentation faults (or worse).
C++
The first object-oriented language I learned was C++, so of course, the one thing I learned about was classes (and objects and methods and inheritance and polymorphism and encapsulation. This all counts as one thing, right? I won't even mention all of the other new things I learned in C++.) Object-oriented programming was a huge paradigm shift, and not just for me, but for all programmers. That shift came for me with C++, and it was an entirely new way to organize and structure programs. With OOP, programs could support more complexity with less code so we could all write bigger, buggier software. Yay!
Java
I'm trying to keep this list in roughly the order I learned languages, so Java is next. Java finally did away with manual memory management with the introduction of a garbage collector. I actually had to learn to not worry so much about memory, and that took some time after all the scars left by C and C++. Having the language and runtime handle memory allocation and deallocation was liberating and more than a little disconcerting. At the time computers were just getting enough memory to make this form of memory management possible, but now we don't even think twice about using garbage collected languages for most things. Ah, the luxury of 16GB of RAM.
MIPS Assembly
I was in college going down the technology stack while studying computer architecture, so I learned how to program in assembly language with MIPS. MIPS taught me many things, but let's focus on register allocation. All of those variables, arguments, parameters, addresses and constants have to be managed somewhere in the processor, and that place is the register file. Depending on the processor, you may have anywhere from 8 to 32 (or more) named registers to work with, and much of assembly programming is figuring out how to efficiently get all of the program values you need in and out of that register file to use it most efficiently. Programming in assembly dramatically increased my appreciation for compilers.
Verilog HDL
Even further down the technology stack from assembly language is the physical digital gates of the processor, made up of transistors. It turns out that there are a couple programming languages that describe them, and they are aptly named hardware description languages. Verilog is the one I learned first (VHDL is largely the same, just three times more verbose), and it taught me about fine-grained, massively parallel programming. It's the ultimate concurrent programming language because everything, and I mean everything, in a Verilog program happens at once. Every bit of every variable moves through its combinational logic at the same time. The only way to manage this colossal network of signals is with a clock and flip-flops to create a state of the machine that changes over synchronized time periods. It's an entirely different way to program, and it's programming how you want the hardware of a digital circuit to behave.
SKILL
SKILL was the first scripting language I learned, and it was a proprietary language embedded in the super-expensive semiconductor design software called Cadence. Little did I know at the time, but SKILL is also a Lisp dialect. I did not learn much about functional programming with SKILL because it allowed parentheses to be used like this: append(list1 list2) and statements could be delimited with semicolons. However, it still had car, cdr, and cons, and there were still plenty of parentheses. What I learned without realizing it was how to program using lists as the main data (and code) abstraction. It was a powerful way to extend the functionality of Cadence, and to program in general.
MATLAB
My first mathematical programming was done with MATLAB. The one thing above all else that I learned in MATLAB was how to program with matrices to do linear algebra, statistical analysis, and digital signal processing in code. The abstractions provided for doing this kind of computing were powerful and made solving these kinds of problems easy and elegant. (To be clear, the matrix code was elegant. The rest of it, not so much.)
LabView
Yes, I'm not ashamed to say I learned a graphical programming language. Well, maybe a little ashamed. LabView taught me that for certain kinds of programming problems, laying the program out like a circuit can actually be a reasonably clear and understandable way to solve the problem. These types of problems mostly involve interfacing with a lot of external hardware that generates signals that would make sense to lay out in a schematic. LabView also taught me that you can never get a monitor big enough to effectively program in LabView.
Objective-C
I explored iOS programming for a short time around iOS 4, and the thing that I really loved about Objective-C was the named parameters in functions. While it may seem to make function calls unnecessarily verbose, naming the parameters eliminates a lot of confusion and allows literals to be used much more often without sacrificing readability. It turns out to be a pleasantly descriptive way to write functions, and I found that it made code much more clear and understandable.
Ruby
There is so much to love about Ruby, but I'm limiting myself to one thing so for this exercise I'm going to go with code blocks. Being able to wrap up snippets of code to pass into functions so that it can be called by the function as needed is an incredibly awesome abstraction. Plus code blocks are closures, and that just increases their usefulness. I think code blocks are one of the most elegant and beautiful programming abstractions I've learned, and I still remember the giddy feeling I got the first time I grokked them.
JavaScript
JavaScript is the first prototypical language I learned. Programming with objects, but not classes, was a shocking experience. After spending so much time in OOP land, learning how to create objects from other objects and then change their parameters to suite the needs of the problem can be a powerful programming paradigm. There aren't that many different programming paradigms, so every chance to learn a new one is a valuable experience. It teaches you so much about entirely new ways to solve problems and organize your code.
CoffeeScript
I learned CoffeeScript in tandem with Ruby on Rails, since it's the default language used for coding front-end interfaces. With CoffeeScript, I learned about transpiling—the act of compiling one programming language into another instead of an assembly language. CoffeeScript is neither interpreted nor compiled into an assembly language, but instead it's compiled into JavaScript to run in the browser (or Node.js). Learning that you don't have to live with JavaScript's warts if you would rather transpile from another language was certainly eye opening, and pleasantly so.
Python
List comprehensions are to Python what code blocks are to Ruby. It's amazing how much you can express in a simple one line list comprehension. You can map. You can filter. You can process files. You can do much more than that, too. List comprehensions are an excellent feature, and they make Python programming exciting and fun. They are a scalpel, though, and not a chain saw. The best list comprehensions are neat little cuts in code. If you try to make one big one do everything you need to a list, it's going to get complicated and confusing real fast. List comprehensions are a precision tool that solves many kinds of little problems very well.
C#
When Microsoft designed C#, they tried to put everything in it. Then they kept adding more with each release of the language. Somehow through it all, they managed to make a fairly decent and usable language with some nice features. One of the best features that was new to me is delegates. A delegate is basically a special-purpose list of function pointers. Classes can add one of their functions to the delegate of another class. Then the class that has the delegate can call all of the functions attached to the delegate when certain things happen, like when a button in a UI is clicked, for example. This abstraction turns out to be exactly what's needed to make GUI programming elegant and clean. It not only works for the UI, but for all of the different asynchronous events happening in a GUI program.
Scheme
My first experience with a functional language that I knew was a functional language was with Scheme. Learning how powerful functional programming can be was another eye-opening experience, as learning any new programming paradigm can be. Part of what makes functional programming so expressive is how natural it is to use recursion to solve problems. Recursion is used in Scheme like pointers are used in C. It's the other fundamental programming abstraction.
Io
We have finally gotten to the latest languages I learned in quick succession with the 7 in 7 books. Io is the second prototypical language I've encountered, and while it is much simpler than JavaScript, it seems much more flexible as well. I learned that pretty much the behavior of the entire language is controlled by the functions in certain slots of an object, and these slots can be changed to completely change the behavior of the language, add new syntax, and create custom DSLs on the fly. It's incredibly powerful and, well, scary. The ability to change so much about a language while your program is running is fascinating.
Prolog
So far we have procedural, object-oriented, prototypical, and functional programming paradigms. Prolog introduces another one: logic programming. In logic programming you don't so much write a program to solve a problem as you write facts and rules that describe the problem and have the computer search for the solution. It's an entirely different way to program, and when this paradigm fits the problem well, it feels like magic. The fundamental abstraction that you learn in logic programming is pattern matching, where you write rules that include variables and both sides of each rule need to match up. There is no assignment in the normal sense, though, and one program can generate multiple solutions because multiple combinations of values are attempted for the set of variables. Prolog will definitely change the way you think about programming.
Scala
The one thing to learn with Scala is concurrency done well with actors and messages. Actors can be defined with message loops to receive and process messages, and they can be spawned as separate threads. Then, threads can send messages to these actors to do work concurrently. The actor model of concurrency is a lot safer than many of the models that came before it, and it will help programmers develop much more stable concurrent programs to utilize all of those extra cores we now have available in modern processors.
Erlang
If Scala taught me something about concurrency, Erlang taught me how to take concurrency to the extreme. With Erlang, concurrency is the normal way of doing things, and instead of threads, it uses lightweight processes. These processes are so easy to start up, and the VM is so rock solid, that it's actually easier to let processes fail when they encounter an error and start a new one instead. The mantra with Erlang is actually "Let it crash," which was simply shocking to me. After learning for decades to write careful error-checking code, seeing code with sparse error checking that instead monitored processes and restarted them if they failed was a big change. It's a fascinating concept.
Clojure
One of the Clojure features that stood out to me was lazy evaluation. With the addition of a number of constructs, Clojure is able to delay computation on sequences (a.k.a lists) until the result of the computation is needed. These lazy sequences can significantly improve performance for code that would otherwise compute huge lists of values that may not all be used in subsequent calculations. Generators can also be easily set up that will feed values to a consumer as needed without having to precompute them or specify an end to the sequence of values. It's a great trick to keep in mind for optimizing algorithms.
Haskell
The big take-away with Haskell is, of course, the type system. It's the most precise, well-done type system I've ever seen, yet it's not as onerous as it sounds because it leverages type inference. I was worried when starting out with Haskell that I would constantly be fighting the type system, but that's not at all the case. It still takes some time to design the types of a program properly, but once that's done it provides great structure and support for the rest of the program. I especially learned from this experience to not write off a certain way of programming just because I've gotten burned by it in the past with other languages. One language's weakness can be another language's strength, and a perceived weakness may not be inherent to the feature itself.
Lua
With Lua I learned that if one fundamental abstraction is made powerful enough, you can make the language be whatever you want it to be. Lua's tables provide that abstraction, and depending on how you use them, you can program as if Lua is an OO language, a prototypical language, or a functional language. You can also ignore all of that and use it as a procedural language if you so choose. The tables allow for all of these options and leave the power in the hands of the programmer.
Factor
The final programming paradigm I've learned happened through Factor, and it's stack-based programming, also known as concatenative programming because of the post-fix style of the code. Because of the global stack on which all values are pushed and popped (well, almost all), the stack needs to be constantly kept in mind when analyzing the code. This concept is mind-bending. I'm sure it gets better with practice, but for how long I've used the language, it's a significant mental effort to keep program execution straight. However, some problems can be solved so neatly with stacks that it's definitely worth keeping this paradigm in mind. Stacks can be used in any language!
Elm
Elm taught me another way to do UI development with signals. While C# introduced me to delegates with their PubSub model, signals are a finer-grained, more tightly integrated feature that makes front-end browser development so much cleaner. Signals can be set up to change state, to kick off tasks or other processing, or to chain different actions together when specified events happen. Signals take delegates to the next level, and provide a lot of functionality that you'd have to build yourself with delegates.
Elixir
Elixir combines a lot of things from a lot of other languages, but one thing not covered yet that I learned in Elixir is metaprogramming with macros. Macros are an extremely powerful tool for compacting programs and making difficult or tedious problems much simpler. Any time you're repeating similar code over and over, it's best to start thinking of how to implement it more quickly and efficiently using a macro. Spending any amount of time copy-pasting code and making slight changes is a dead giveaway that a macro could be used instead. Metaprogramming has a way of wringing the drudgery out of programming. It's simply magical.
Julia
The killer feature that I learned in Julia is definitely multiple dispatch. While other languages have to deal with calling the same function with different types in various convoluted ways, Julia says "Screw it. Just give all of those functions the same name with different types, and I'll figure it out." It's a great feature when you need it, and since Julia is built for scientific computing, it probably comes up a lot.
miniKanren
I've learned about how great logic programming can be for certain types of problems, and I've learned how great functional programming can be for other types of problems. Now miniKanren has shown me how powerful it is to combine these two paradigms into one language. Since logic programming works well for isolated logic problems, but doesn't do so well for implementing a complete program, putting it into a functional language bridges that gap so that you can create a fully working program. Having Clojure there to provide the input and process the output of the logic program really ups the ante for what can be accomplished in miniKanren.
Idris
Idris takes the powerful type system of Haskell and turns it up a notch. The novelty of Idris' type system is dependent types that allow types to be specified in relation to other types using characteristics of those other types and operations. It's basically making the type system programmable. Types can be specified so that arrays have a certain length, the output of a function has the same length or combination of lengths of its inputs, or any other set of operations can be done on characteristics of a function's types to specify the dependent type. It is a really powerful type system that stretched my mind even more than Haskell did.
As you can see, I've come in contact with a lot of languages. It looks like 31 so far, if I haven't forgotten any, and I've learned something valuable from each one of them. Some languages have taught me much more than others simply because of where they fell on my programming journey, but old or new, popular or unknown, every language has something to teach. While this is a lot of languages, there are notable omissions including Go, Rust, Swift, and Kotlin, just off the top of my head. I imagine that those languages, too, would have much to teach me about new programming features or improvements to concepts I already know. That's the beauty of learning new programming languages: there's always something more to learn about the craft. You just have to be ready for it.
Logo
Logo was my first programming language. Of all of the introductory programming concepts it taught me, the main thing I learned from Logo was how to give the computer instructions in order to accomplish a goal. What exactly did I need to type in to get that turtle to move the way I wanted it to? I had to be precise and not make any mistakes because the computer could only do exactly what it was told. When things went awry, I had no one or nothing to blame but myself.
QBasic
My programming journey really started with QBasic. As with Logo, I learned a ton of things from it because it was one of the first languages I learned, but since I'm going to pick only one thing, I'm going with fun. QBasic showed me that programming could be fun, and that I loved solving coding puzzles and writing basic arcade games in it. For me, QBasic was the gateway to the entire programming world and it was where the fun all began.
Pascal
Pascal was the first language I learned through study and coursework in high school. Of all the things I learned with Pascal, the one thing that stands out most in my memory is functions. Learning how variables and control structures worked came easily to me, but function declarations, definitions, and calls were the first programming abstraction that really stretched my mind. The fact that the argument names in the function call could be different than the parameter names in the function definition, as well as the rules surrounding function scoping all took time to full assimilate. It would not be the last time a programming concept would challenge my understanding, and every time it does, it inspires me to learn even more about programming.
C
The primary abstraction I learned in C was pointers, and with that comes memory allocation. Pointers are an extremely powerful, confusing, and dangerous tool. With them, you can write elegant, concise algorithms for all kinds of problems, and you'll come back to the code later and have no idea how it works. Most languages try to temper and wrap pointers in soft packaging so they can be used more easily and cause less damage. C leaves them raw and exposed so you can use them to their full potential, but you have to be careful to use them wisely or spend hours debugging segmentation faults (or worse).
C++
The first object-oriented language I learned was C++, so of course, the one thing I learned about was classes (and objects and methods and inheritance and polymorphism and encapsulation. This all counts as one thing, right? I won't even mention all of the other new things I learned in C++.) Object-oriented programming was a huge paradigm shift, and not just for me, but for all programmers. That shift came for me with C++, and it was an entirely new way to organize and structure programs. With OOP, programs could support more complexity with less code so we could all write bigger, buggier software. Yay!
Java
I'm trying to keep this list in roughly the order I learned languages, so Java is next. Java finally did away with manual memory management with the introduction of a garbage collector. I actually had to learn to not worry so much about memory, and that took some time after all the scars left by C and C++. Having the language and runtime handle memory allocation and deallocation was liberating and more than a little disconcerting. At the time computers were just getting enough memory to make this form of memory management possible, but now we don't even think twice about using garbage collected languages for most things. Ah, the luxury of 16GB of RAM.
MIPS Assembly
I was in college going down the technology stack while studying computer architecture, so I learned how to program in assembly language with MIPS. MIPS taught me many things, but let's focus on register allocation. All of those variables, arguments, parameters, addresses and constants have to be managed somewhere in the processor, and that place is the register file. Depending on the processor, you may have anywhere from 8 to 32 (or more) named registers to work with, and much of assembly programming is figuring out how to efficiently get all of the program values you need in and out of that register file to use it most efficiently. Programming in assembly dramatically increased my appreciation for compilers.
Verilog HDL
Even further down the technology stack from assembly language is the physical digital gates of the processor, made up of transistors. It turns out that there are a couple programming languages that describe them, and they are aptly named hardware description languages. Verilog is the one I learned first (VHDL is largely the same, just three times more verbose), and it taught me about fine-grained, massively parallel programming. It's the ultimate concurrent programming language because everything, and I mean everything, in a Verilog program happens at once. Every bit of every variable moves through its combinational logic at the same time. The only way to manage this colossal network of signals is with a clock and flip-flops to create a state of the machine that changes over synchronized time periods. It's an entirely different way to program, and it's programming how you want the hardware of a digital circuit to behave.
SKILL
SKILL was the first scripting language I learned, and it was a proprietary language embedded in the super-expensive semiconductor design software called Cadence. Little did I know at the time, but SKILL is also a Lisp dialect. I did not learn much about functional programming with SKILL because it allowed parentheses to be used like this: append(list1 list2) and statements could be delimited with semicolons. However, it still had car, cdr, and cons, and there were still plenty of parentheses. What I learned without realizing it was how to program using lists as the main data (and code) abstraction. It was a powerful way to extend the functionality of Cadence, and to program in general.
MATLAB
My first mathematical programming was done with MATLAB. The one thing above all else that I learned in MATLAB was how to program with matrices to do linear algebra, statistical analysis, and digital signal processing in code. The abstractions provided for doing this kind of computing were powerful and made solving these kinds of problems easy and elegant. (To be clear, the matrix code was elegant. The rest of it, not so much.)
LabView
Yes, I'm not ashamed to say I learned a graphical programming language. Well, maybe a little ashamed. LabView taught me that for certain kinds of programming problems, laying the program out like a circuit can actually be a reasonably clear and understandable way to solve the problem. These types of problems mostly involve interfacing with a lot of external hardware that generates signals that would make sense to lay out in a schematic. LabView also taught me that you can never get a monitor big enough to effectively program in LabView.
Objective-C
I explored iOS programming for a short time around iOS 4, and the thing that I really loved about Objective-C was the named parameters in functions. While it may seem to make function calls unnecessarily verbose, naming the parameters eliminates a lot of confusion and allows literals to be used much more often without sacrificing readability. It turns out to be a pleasantly descriptive way to write functions, and I found that it made code much more clear and understandable.
Ruby
There is so much to love about Ruby, but I'm limiting myself to one thing so for this exercise I'm going to go with code blocks. Being able to wrap up snippets of code to pass into functions so that it can be called by the function as needed is an incredibly awesome abstraction. Plus code blocks are closures, and that just increases their usefulness. I think code blocks are one of the most elegant and beautiful programming abstractions I've learned, and I still remember the giddy feeling I got the first time I grokked them.
JavaScript
JavaScript is the first prototypical language I learned. Programming with objects, but not classes, was a shocking experience. After spending so much time in OOP land, learning how to create objects from other objects and then change their parameters to suite the needs of the problem can be a powerful programming paradigm. There aren't that many different programming paradigms, so every chance to learn a new one is a valuable experience. It teaches you so much about entirely new ways to solve problems and organize your code.
CoffeeScript
I learned CoffeeScript in tandem with Ruby on Rails, since it's the default language used for coding front-end interfaces. With CoffeeScript, I learned about transpiling—the act of compiling one programming language into another instead of an assembly language. CoffeeScript is neither interpreted nor compiled into an assembly language, but instead it's compiled into JavaScript to run in the browser (or Node.js). Learning that you don't have to live with JavaScript's warts if you would rather transpile from another language was certainly eye opening, and pleasantly so.
Python
List comprehensions are to Python what code blocks are to Ruby. It's amazing how much you can express in a simple one line list comprehension. You can map. You can filter. You can process files. You can do much more than that, too. List comprehensions are an excellent feature, and they make Python programming exciting and fun. They are a scalpel, though, and not a chain saw. The best list comprehensions are neat little cuts in code. If you try to make one big one do everything you need to a list, it's going to get complicated and confusing real fast. List comprehensions are a precision tool that solves many kinds of little problems very well.
C#
When Microsoft designed C#, they tried to put everything in it. Then they kept adding more with each release of the language. Somehow through it all, they managed to make a fairly decent and usable language with some nice features. One of the best features that was new to me is delegates. A delegate is basically a special-purpose list of function pointers. Classes can add one of their functions to the delegate of another class. Then the class that has the delegate can call all of the functions attached to the delegate when certain things happen, like when a button in a UI is clicked, for example. This abstraction turns out to be exactly what's needed to make GUI programming elegant and clean. It not only works for the UI, but for all of the different asynchronous events happening in a GUI program.
Scheme
My first experience with a functional language that I knew was a functional language was with Scheme. Learning how powerful functional programming can be was another eye-opening experience, as learning any new programming paradigm can be. Part of what makes functional programming so expressive is how natural it is to use recursion to solve problems. Recursion is used in Scheme like pointers are used in C. It's the other fundamental programming abstraction.
Io
We have finally gotten to the latest languages I learned in quick succession with the 7 in 7 books. Io is the second prototypical language I've encountered, and while it is much simpler than JavaScript, it seems much more flexible as well. I learned that pretty much the behavior of the entire language is controlled by the functions in certain slots of an object, and these slots can be changed to completely change the behavior of the language, add new syntax, and create custom DSLs on the fly. It's incredibly powerful and, well, scary. The ability to change so much about a language while your program is running is fascinating.
Prolog
So far we have procedural, object-oriented, prototypical, and functional programming paradigms. Prolog introduces another one: logic programming. In logic programming you don't so much write a program to solve a problem as you write facts and rules that describe the problem and have the computer search for the solution. It's an entirely different way to program, and when this paradigm fits the problem well, it feels like magic. The fundamental abstraction that you learn in logic programming is pattern matching, where you write rules that include variables and both sides of each rule need to match up. There is no assignment in the normal sense, though, and one program can generate multiple solutions because multiple combinations of values are attempted for the set of variables. Prolog will definitely change the way you think about programming.
Scala
The one thing to learn with Scala is concurrency done well with actors and messages. Actors can be defined with message loops to receive and process messages, and they can be spawned as separate threads. Then, threads can send messages to these actors to do work concurrently. The actor model of concurrency is a lot safer than many of the models that came before it, and it will help programmers develop much more stable concurrent programs to utilize all of those extra cores we now have available in modern processors.
Erlang
If Scala taught me something about concurrency, Erlang taught me how to take concurrency to the extreme. With Erlang, concurrency is the normal way of doing things, and instead of threads, it uses lightweight processes. These processes are so easy to start up, and the VM is so rock solid, that it's actually easier to let processes fail when they encounter an error and start a new one instead. The mantra with Erlang is actually "Let it crash," which was simply shocking to me. After learning for decades to write careful error-checking code, seeing code with sparse error checking that instead monitored processes and restarted them if they failed was a big change. It's a fascinating concept.
Clojure
One of the Clojure features that stood out to me was lazy evaluation. With the addition of a number of constructs, Clojure is able to delay computation on sequences (a.k.a lists) until the result of the computation is needed. These lazy sequences can significantly improve performance for code that would otherwise compute huge lists of values that may not all be used in subsequent calculations. Generators can also be easily set up that will feed values to a consumer as needed without having to precompute them or specify an end to the sequence of values. It's a great trick to keep in mind for optimizing algorithms.
Haskell
The big take-away with Haskell is, of course, the type system. It's the most precise, well-done type system I've ever seen, yet it's not as onerous as it sounds because it leverages type inference. I was worried when starting out with Haskell that I would constantly be fighting the type system, but that's not at all the case. It still takes some time to design the types of a program properly, but once that's done it provides great structure and support for the rest of the program. I especially learned from this experience to not write off a certain way of programming just because I've gotten burned by it in the past with other languages. One language's weakness can be another language's strength, and a perceived weakness may not be inherent to the feature itself.
Lua
With Lua I learned that if one fundamental abstraction is made powerful enough, you can make the language be whatever you want it to be. Lua's tables provide that abstraction, and depending on how you use them, you can program as if Lua is an OO language, a prototypical language, or a functional language. You can also ignore all of that and use it as a procedural language if you so choose. The tables allow for all of these options and leave the power in the hands of the programmer.
Factor
The final programming paradigm I've learned happened through Factor, and it's stack-based programming, also known as concatenative programming because of the post-fix style of the code. Because of the global stack on which all values are pushed and popped (well, almost all), the stack needs to be constantly kept in mind when analyzing the code. This concept is mind-bending. I'm sure it gets better with practice, but for how long I've used the language, it's a significant mental effort to keep program execution straight. However, some problems can be solved so neatly with stacks that it's definitely worth keeping this paradigm in mind. Stacks can be used in any language!
Elm
Elm taught me another way to do UI development with signals. While C# introduced me to delegates with their PubSub model, signals are a finer-grained, more tightly integrated feature that makes front-end browser development so much cleaner. Signals can be set up to change state, to kick off tasks or other processing, or to chain different actions together when specified events happen. Signals take delegates to the next level, and provide a lot of functionality that you'd have to build yourself with delegates.
Elixir
Elixir combines a lot of things from a lot of other languages, but one thing not covered yet that I learned in Elixir is metaprogramming with macros. Macros are an extremely powerful tool for compacting programs and making difficult or tedious problems much simpler. Any time you're repeating similar code over and over, it's best to start thinking of how to implement it more quickly and efficiently using a macro. Spending any amount of time copy-pasting code and making slight changes is a dead giveaway that a macro could be used instead. Metaprogramming has a way of wringing the drudgery out of programming. It's simply magical.
Julia
The killer feature that I learned in Julia is definitely multiple dispatch. While other languages have to deal with calling the same function with different types in various convoluted ways, Julia says "Screw it. Just give all of those functions the same name with different types, and I'll figure it out." It's a great feature when you need it, and since Julia is built for scientific computing, it probably comes up a lot.
miniKanren
I've learned about how great logic programming can be for certain types of problems, and I've learned how great functional programming can be for other types of problems. Now miniKanren has shown me how powerful it is to combine these two paradigms into one language. Since logic programming works well for isolated logic problems, but doesn't do so well for implementing a complete program, putting it into a functional language bridges that gap so that you can create a fully working program. Having Clojure there to provide the input and process the output of the logic program really ups the ante for what can be accomplished in miniKanren.
Idris
Idris takes the powerful type system of Haskell and turns it up a notch. The novelty of Idris' type system is dependent types that allow types to be specified in relation to other types using characteristics of those other types and operations. It's basically making the type system programmable. Types can be specified so that arrays have a certain length, the output of a function has the same length or combination of lengths of its inputs, or any other set of operations can be done on characteristics of a function's types to specify the dependent type. It is a really powerful type system that stretched my mind even more than Haskell did.
As you can see, I've come in contact with a lot of languages. It looks like 31 so far, if I haven't forgotten any, and I've learned something valuable from each one of them. Some languages have taught me much more than others simply because of where they fell on my programming journey, but old or new, popular or unknown, every language has something to teach. While this is a lot of languages, there are notable omissions including Go, Rust, Swift, and Kotlin, just off the top of my head. I imagine that those languages, too, would have much to teach me about new programming features or improvements to concepts I already know. That's the beauty of learning new programming languages: there's always something more to learn about the craft. You just have to be ready for it.
суббота, 28 марта 2020 г.
Apotheosis - Recent Challenges And Possible Solutions
I have been testing Apotheosis quite a bit lately, and on a coarse grained scale, I think it's going pretty well. The structure of the game works and has improved with iteration, and the game action is fun (for me at least). One of my regular testers doesn't seem to love it (I don't think it's really his type of game), but the others still seem to enjoy it.
But games don't get finished on a "coarse grained scale." At least, they shouldn't! When talking about some of the finer details of the game, there are some challenges I'm still facing with it. Until these challenges are overcome, I cannot call the game finished. However I do think these challenges are overcome-able! Here are some of the bigger challenges I'm currently facing, and what I'm planning to try to do about them:
In an effort to keep this from happening, I was looking for a way to add uncertainty to the end game. I thought I had found something, but in my first attempt I implemented it wrong so it didn't work. But after trying it, I started to think it wouldn't be quite right even if implemented better.
My next attempt was a more subtle thing, which won't stop a player from figuring out how many turns it'll take them to "finish," but might obfuscate whether or not someone else can beat them to it (thereby keeping the game interesting enough to play out the last few rounds):
Having tried this format once so far, I think it has helped a little bit, but may not have completely solved the problem.
One thing that occurred to me as I was thinking about this challenge is that there are games -- popular, well received games -- that have a similar dynamic. Just about every time I played the 2014 title Istanbul, by Rudiger Dorn, I was able to see that I could "finish" the race to 5 gems in 4 or 5 turns, and often I could see whether or not anybody could stop me or beat me to it. That made the last 4 turns or so feel like something of a slog, but the game hasn't seemed to suffer from it.
So maybe I'm overly concerned about this "problem" in my game. I think if you can call the game in 4 turns or so, it wouldn't be so bad, but 6-8 turns out i maybe too much. So maybe I don't need to solve the problem 100%, but rather make sure that if it DOES happen, it only happens within 4-5 turns of the end of the game.
One solution is to cut Equipment altogether, reducing the number of resources (by 4, technically, since there are 4 types of equipment). Some of my testers seem to think there are too many resources in the game, and cutting equipment would certainly help that. But I fear that would just mean you use the stuff you're already collecting to pay for the valuable stuff Equipment was supposed to buy you, which seems lame to me.
Another solution is to make Equipment a bigger deal in the game. My first attempt at this, partly to try and salvage Equipment, and partly because removing it would mean I'd need to do more updating to the prototype and design work before testing again (and I had other things to test), had to do with the attempt mentioned above to add some uncertainty to the end game. That may work in some format, but having tried it, I'm not sure I like it as much as I'd hoped.
My next attempt was to add Equipment as a cost for the 3rd adventure tier. The 3rd tier requires a few worker levels of any type in addition to what's needed for tier 2, and currently has no additional resource cost (but I think it should). The rewards are a handful of Blessings (which are a flexible commodity), and a track bump (vp) of your choice. Originally, instead of Blessings, the reward was a Spoils -- a special resource you need to do a certain thing (it's kind of like 2 points and a power). The only other way to get those is by (a) Side Quest cards, which cost Equipment, or (b) spending a large number of blessings (which is hopefully inefficient by comparison). So maybe putting the reward back to a Spoils instead of Blessings (which is kind of thematic anyway), and adding an Equipment cost, then it makes some sense: Equipment is always for getting Spoils -- if you do it through an Adventure, then you also get VP, if you do it through a Side Quest, then you maybe get something else with it.
In addition, I added some worker placement spaces that care only about your worker's class (that was partly to address some other issue I was worried about), and one of them lets you get Equipment, so now there are a few ways to get equipment, and a few ways to spend it. Since you can't always guarantee you get the TYPE of equipment you want, I also added the option at one of the worker spots to trade in any 2 equipment for the one you want.
So far I think this is promising, so I'll try it again. I'm sure those same playtesters will still complain there are too many different resources :)
Related to Spoils, it might be nice if there were 1 more thing you could do with it. Because currently you only need a maximum of 4 or 5 in the game, and you can technically finish (though I don't know if you could realistically win) with only 1. I don't know if I like being able to buy them with Blessings, because that means you can avoid dealing with Equipment altogether. Is that OK?
But games don't get finished on a "coarse grained scale." At least, they shouldn't! When talking about some of the finer details of the game, there are some challenges I'm still facing with it. Until these challenges are overcome, I cannot call the game finished. However I do think these challenges are overcome-able! Here are some of the bigger challenges I'm currently facing, and what I'm planning to try to do about them:
Challenge number 1: The Endgame
One of the biggest problems this game has been facing is an end game dynamic that is disappointing. The game is basically a race up some tracks, and players can see how many turns it will take them to "finish" the race, and can sometimes tell whether anybody can stop them. It's super anticlimactic to hear your opponent say "I can win in 6 turns. Can anybody do better than that, or should we just stop now?"In an effort to keep this from happening, I was looking for a way to add uncertainty to the end game. I thought I had found something, but in my first attempt I implemented it wrong so it didn't work. But after trying it, I started to think it wouldn't be quite right even if implemented better.
My next attempt was a more subtle thing, which won't stop a player from figuring out how many turns it'll take them to "finish," but might obfuscate whether or not someone else can beat them to it (thereby keeping the game interesting enough to play out the last few rounds):
- Give players a face-down adventure which they could do instead of one of the face-up ones. This way you can't be sure whether your opponent can advance on a track, or what they need to be able to do so.
- Try player screens to hide resources, so it's harder to tell what your opponents can do.
- With player screens, maybe add more instances of getting things at random (resource cubes, equipment, Side Quest cards, etc) so that it's not all Hidden Trackable Information (HTI). There are already random equipment draws currently, and we could easily hide the Side Quests in hand, maybe that's enough.
Having tried this format once so far, I think it has helped a little bit, but may not have completely solved the problem.
One thing that occurred to me as I was thinking about this challenge is that there are games -- popular, well received games -- that have a similar dynamic. Just about every time I played the 2014 title Istanbul, by Rudiger Dorn, I was able to see that I could "finish" the race to 5 gems in 4 or 5 turns, and often I could see whether or not anybody could stop me or beat me to it. That made the last 4 turns or so feel like something of a slog, but the game hasn't seemed to suffer from it.
So maybe I'm overly concerned about this "problem" in my game. I think if you can call the game in 4 turns or so, it wouldn't be so bad, but 6-8 turns out i maybe too much. So maybe I don't need to solve the problem 100%, but rather make sure that if it DOES happen, it only happens within 4-5 turns of the end of the game.
Challenge number 2: Equipment not pulling its weight
Equipment in this game is basically a secondary resource, a little harder to get, and useful mostly for one particular aspect (an aspect that players could mostly neglect if they wanted to, but theoretically is more efficient if they don't). I think Equipment is nice thematically, but the mechanisms for getting it are a bit overblown and maybe too random for the relatively small role they play.One solution is to cut Equipment altogether, reducing the number of resources (by 4, technically, since there are 4 types of equipment). Some of my testers seem to think there are too many resources in the game, and cutting equipment would certainly help that. But I fear that would just mean you use the stuff you're already collecting to pay for the valuable stuff Equipment was supposed to buy you, which seems lame to me.
Another solution is to make Equipment a bigger deal in the game. My first attempt at this, partly to try and salvage Equipment, and partly because removing it would mean I'd need to do more updating to the prototype and design work before testing again (and I had other things to test), had to do with the attempt mentioned above to add some uncertainty to the end game. That may work in some format, but having tried it, I'm not sure I like it as much as I'd hoped.
My next attempt was to add Equipment as a cost for the 3rd adventure tier. The 3rd tier requires a few worker levels of any type in addition to what's needed for tier 2, and currently has no additional resource cost (but I think it should). The rewards are a handful of Blessings (which are a flexible commodity), and a track bump (vp) of your choice. Originally, instead of Blessings, the reward was a Spoils -- a special resource you need to do a certain thing (it's kind of like 2 points and a power). The only other way to get those is by (a) Side Quest cards, which cost Equipment, or (b) spending a large number of blessings (which is hopefully inefficient by comparison). So maybe putting the reward back to a Spoils instead of Blessings (which is kind of thematic anyway), and adding an Equipment cost, then it makes some sense: Equipment is always for getting Spoils -- if you do it through an Adventure, then you also get VP, if you do it through a Side Quest, then you maybe get something else with it.
In addition, I added some worker placement spaces that care only about your worker's class (that was partly to address some other issue I was worried about), and one of them lets you get Equipment, so now there are a few ways to get equipment, and a few ways to spend it. Since you can't always guarantee you get the TYPE of equipment you want, I also added the option at one of the worker spots to trade in any 2 equipment for the one you want.
So far I think this is promising, so I'll try it again. I'm sure those same playtesters will still complain there are too many different resources :)
Related to Spoils, it might be nice if there were 1 more thing you could do with it. Because currently you only need a maximum of 4 or 5 in the game, and you can technically finish (though I don't know if you could realistically win) with only 1. I don't know if I like being able to buy them with Blessings, because that means you can avoid dealing with Equipment altogether. Is that OK?
вторник, 24 марта 2020 г.
Hitman 6 Alpha Free Download
Hitman 6 Alpha Free Download
Hitman 6 Alpha Free Download PC Game setup in single direct link for Windows. Hitman 6 Alpha PC Game 2015 is a stealth and action game.
Hitman 6 Alpha PC Game 2015 Overview
Hitman 6 Alpha is developed by Square Enix. Hitman series has been around for quite some time now and has made a mark with its compelling actions and storyline. You can also download Hitman Absolution.
The story of Hitman 6 Alpha revolves around Agent 47. Who is a cloned assassin . He has got a flawless record which has made him apple of elite people's eyes. Agent 47 also known as 47 or Mr. 47 has offered his services for assassinating anyone if money is poured in his pocket. The case is not different in Hitman 6 as well. Hitman 6 has got some interactive environments. Load outs are back in this game and you can select your suit as well as side weapon. You may also be interested in downloading Hitman Contracts.
There are lots of side missions. Which will help you in completing the main mission easily. This time around you have many patch choices in order to enter a building you can take the front entrance, can climb a pole if there is any outside the building or you can go through the back underground staircases. The graphics as always are very crispy and impressive and you will surely love this game. You can also download Hitman Blood Money.
Features of Hitman 6 Alpha
Following are the main features of Hitman 6 Alpha that you will be able to experience after the first install on your Operating System.
- Impressive stealth game.
- Compelling actions and storyline.
- Got interactive environments.
- Load outs are back in this game.
- Can select your suit as well as side weapons.
- Got lots of side missions.
- Got many path choices.
- Impressive graphics.
- Alpha Version
System Requirements of Hitman 6 Alpha PC Game 2015
Before you start Hitman 6 Alpha Free Download make sure your PC meets minimum system requirements.
- Operating System: Tested on Windows 7 64 Bit
- CPU: Intel Core i5 or later.
- RAM: 8 GB
- Hard Disk Space: 30 GB
Hitman 6 Alpha Free Download
Click on the below button to start Hitman 6 Alpha Free Download. It is full and complete game. Just download and start playing it. We have provided direct link full setup of the game.
Size:8.40 GBPrice:Free
Virus status: scanned by Avast security
суббота, 21 марта 2020 г.
Building My New Gaming Rig
So this is about a month late, but I wanted to document the awesomeness of building my new PC with my oldest daughter.
I got sick of waiting for the Ryzen 3000 series to launch, which as it turns out with a month of hindsight, wont' be happening till July 2019, meaning my build back in late April was a good idea since I was having a really hard time putting off a new build then.
Because price drops occurred, I managed to get an incredible deal on a Ryzen 5 1600 CPU. It's older, but I paid effectively $50 for it because AMD dropped the price to $120 MSRP, Microcenter (which is about 1 hour away from where I live) had a sale where it was $80 if you bought it in store, and they had a second deal that gives you $30 off the motherboard when you purchase a motherboard and compatible CPU together.
As such my final specs are:
Ryzen 5 1600
16Gb DDR4 3200 RAM
GeForce GTX 1660 Ti
AData M.2 1Tb SSD
Corsair lighting node pro controller, ML120 LED fans, and LED light strips
Thermaltake Core V21 Case
Antec 620W PSU
Building with my daughter
As stated previously the way you interest your young daughter in building gaming PC's is to add RGB. For my new machine I was pulling out all the stops and splurged on a Corsair lighting node pro + ML 120 RGB Fans plus their LED strips which came with the necessary hub. I did need to buy some additional fan power cable splitters since my motherboard didn't have enough fan headers.
Still, I was very excited to do the install with my daughter, even though the assembly over like 4+ hours made her lose some interest towards the end, we did have a good time.
Part of what made things take so long was my being very meticulous about cable management.
I agonized over the case to pick that had the looks I wanted and didn't cost a ton of money, and the Thermaltake Core V21 delivered. It gives you plenty of room to work with for cable management, though it's still a Micro ATX build so things are going to be tight, especially since I was reusing an older, non-modular power supply I already owned to save a few bucks.
Amazingly the Core V21 lets you rotate the entirety of the case, which I ended up doing since I wanted the window to give a traditional shot, rather than the standard mounting of the Core V21 which would have the window largely showing just the video card.
In the end I think I ended up with a very nice, clean build. Note that I have since read the motherboard manual correctly and put the DIMM's for the RAM into the proper slots to get dual channel.
Gaming
So it's been a month since the build was completed and I've had to fall back to mostly PC gaming in order to spend enough time at home to help with the kids. What have I played?
Overwatch is my standard game to play when my buddies are online as it's the one game we all own and can enjoy together. That's kind of like our bread and butter game that I'll hop on, but it isn't what has made me really enjoy the new machine.
I finished Wolfenstein New Order on the new machine and I appreciated being able to turn everything to Ultra and sit above 100 FPS. It was enjoyable on my old machine, though certainly smoother on the new one.
I then oddly moved towards playing an older game, Dishonored. It certainly wasn't stressing my system, but I played through it with my wife watching my play through while doing some hobby of her own once our daughters were put to bed at night. I end up mirroring my display to the TV right next to the PC and put the sound through there to make it so she can more easily see what's going on.
I did a stealth/non-leathal play through of the game and enjoyed the low-chaos ending.
Once that was finished, I used my Steam gift cards I had laying around and purchased Rage 2 on release. A bit of a splurge, but I wanted a new Doom-like FPS that I could crank to max settings and enjoy high end graphics that the machine could deliver.
Rage 2 definitely does that. I can crank the settings to max and it's gorgeous, and the gameplay is great. The more you play and upgrade your stuff the more fun and outrageous the game becomes. I've been enjoying more and more as I play and it's been a nice stress reliever after rough days at work or when my toddler decides she wants to stand in a toilet to "swim".
Spring sales rolled around and I picked up Dishonored 2 for $20 on Humble-Bundle which I've started playing through with my wife. I'm playing Emily on low-Chaos again, though I'm not being too strict about not killing anyone. The game is nice in that it doesn't force you into high chaos for killing guards who are "bad". It's also nice that you can get caught and be forced to fight but still have an option for non-lethal take downs if you block and time the take down just right.
I'm very much looking forward to Doom Eternal's release and may replay Doom 2016 once I'm done Rage 2. Maybe I'll get Wolfenstein New Colossus if it's on sale, though I definitely am liking Rage/Doom more than the Wolfenstein games. It's still fun either way.
пятница, 20 марта 2020 г.
HEAVEN'S DAWN
Heaven's Dawn by the Taiwanese developers at Art 9 Entertainment is perhaps one of the rarest games I've ever played. This traditional point-and-click adventure was only ever translated into English for the Australian and New Zealand markets and judging by the dearth of information out there sold very little. Despite its Eastern roots, this tale of high-fantasy feels far more western than its origins would have you believe.
Read more »
Movie Reviews: Mission Impossible: Fallout, Ant-Man And The Wasp, Jurassic World: Fallen Kingdom, The Incredibles 2, Breathe, Midnight Sun
See all of my movie reviews.
Mission Impossible: Fallout - A very good, but not great, entry in this franchise.
MI's plots are generally unimportant: a bunch of people want to kill a bunch of people, MI agents are the only ones who can stop them, but there are traitors in the CIA who are secretly working against them together with the bad guys. Lots of tropes: cool gadgets, deceptively getting suspects to talk, impersonating bad guys using fake masks, plans gone awry, Tom Cruise dangling off of something high, and last second triumphs.
This movie has a few things going for it that its competition franchises (MCU, DCU, James Bond, Fast and Furious, Transformers, Jurassic Park) don't. One is Tom Cruise, who is a great actor and action hero ONLY when he isn't carrying the entire movie. MI has a nice cast of characters that provide relief from endless shots of Tom running, dangling, and jumping. Another is that they manage to keep coming up with tense situations and action sequences that are at least plausible and thus captivating. And that Tom does his own stunts and the CGI is minimal, which makes the action sequences more engaging and less like watching cool effects on a computer. Tom doing things while skydiving is really Tom Cruise skydiving, which is pretty cool. Mostly, it's that they take some time to give Tom, at least, some real personality, so that he makes different choices based on conflicting targets of loyalty.
The last one is important, and while MI:F includes this, it doesn't include it nearly enough. They keep trying to muscle in more action sequences and less character time. This may make Marvel fans happy but only makes the movie less engaging and more exhausting. The movie too often jumped from action sequence to action sequence without a breath, which left me just a bit numb. I'm sure there are people who like this; who would complain, in fact, if there were more character sequences. So it's just my opinion. These people also tend to overlook little problems, like how certain people deceive other people when these deceivers are under careful, continuous observation, how certain people could possibly know to be in certain places at certain times to meet certain other people when these other people are doing things purely randomly, and and how certain people would surely have to go through a number of checks before getting to where they got to. I guess I am not supposed to notice those things.
Anyway, I enjoyed it. Not as much as 1 or 4, but more then 5 (I didn't see 2 or 3).
Ant-Man and the Wasp - Marvel, yippee. I never actually made it through Ant-Man because it was formulaic and boring. Perhaps the only thing going for it was that at least the fate of the universe wasn't at stake, which was a nice change.
I'm kind of at a loss as to why I found this one more enjoyable. Not exactly a good movie, but better. The ending was poorly executed, and really the science doesn't make any sense. I'm happy that the fate of the world isn't at stake - just one woman. And I'm happy that the main "bad guy" is someone who has a compelling motivation and who isn't bad at all, just trying to survive.
I guess dispensing with a lot of the back-story helped, as did allowing us to see all of the many ways that shrinking/expanding can be used in a fight. Its lack of ambition made it feel less pretentious and thus easier to accept. It felt like a pretty good television episode. So it was okay.
Jurassic World: Fallen Kingdom - The first one (Jurassic Park) was a classic; the last one (Jurassic World) was okay, but the characters were so flat as to make it feel like a Marvel movie. This one is about the same as the last one, but the plot is dumber and even less original. They need to either let the dinosaurs die or rescue them to some other island, and by the way, someone wants to steal some of the dinosaurs and by the way, someone wants to sell them as military weapons (somehow). It sounds familiar because it is.
Same kinds of bad guys doing the same kinds of bad things; yadda yadda. The characters from the last movie are a little different, but just as flat. It's hard to care.
The Incredibles 2 - The first was a great movie, marrying Disney with superheroes with some actual adult themes that didn't talk down to kids. This one is even more so. It starts exactly where the last one left off, only they have to deal with the consequences of the damage caused to the city after they stop the first bad guy (exactly like Captain America: Civil War). In order to solve their PR problem, they decide that Elastigirl (rather than the less PR-worthy Mr Incredible) be sent out to do some careful superhero work, which leaves Mr Incredible alone at home with the kids and their new baby of wildly unknown superpowers.
Cue a little male resentment and a touch of 1950s role reversal comedy, but really not too much. Elastigirl really is a superhero as well as a mom, and she does it well, and Mr Incredible proves that every stay-at-home parent is a superhero in his or her own way. Of course, eventually everything has to come to a head.
The plot is good and thought-provoking, but still full of humor and great action. Of course, it's beautifully rendered and well voiced. A worthy sequel to the original.
Breathe - The true story of a British flyboy who becomes paralyzed by polio while in Kenya in the 1950s. He is ready to die, but his wife won't let him and he goes on to travel home, leave the hospital (which never happened back then) and eventually design the first wheelchair with a respirator. His work (and his good friend the engineer) went on to improve the life of thousands of people in similar condition.
It's wrapped up in beautiful scenery and costuming and a true-life love story. It was interesting to watch, although I guess they glossed over some of the less palatable parts of taking care of a paralyzed person. Meanwhile, some parts of the movie went on longer than they should have, such as the entire last half hour where he decides he has finally lived long enough; these parts could have been shorter. I loved and was even surprised by, the scenes in Spain.
Worth watching, although I wouldn't go out of my way to see it.
Midnight Sun - This is a pretty terrible movie from nearly every perspective. It is about a girl with xeroderma pigmentosum.
In real life, this is a non-curable condition whose sufferers tend to sunburn or blister after small exposures to sunlight and who are therefore extremely vulnerable to skin cancer. People with this condition are visibly distinguishable as such, having typically found out about their condition the hard way. They may have special glass in their house windows, but they can go out in daylight with a lot of clothing and extra caution.
In movie life, the girl has movie-perfect skin and never goes outside during daylight. Furthermore, the moment she is exposed to a few seconds of sunlight she develops a brain condition that begins causing her death.
If that wasn't enough of a problem, just let the anemic characters and the predictable, manipulative, and poorly scripted and acted plot do the rest. And, of course, she is going to "hide" her condition from the first (and last) boy she goes out with, because we never get enough of that kind of thing from sitcoms.
Mission Impossible: Fallout - A very good, but not great, entry in this franchise.
MI's plots are generally unimportant: a bunch of people want to kill a bunch of people, MI agents are the only ones who can stop them, but there are traitors in the CIA who are secretly working against them together with the bad guys. Lots of tropes: cool gadgets, deceptively getting suspects to talk, impersonating bad guys using fake masks, plans gone awry, Tom Cruise dangling off of something high, and last second triumphs.
This movie has a few things going for it that its competition franchises (MCU, DCU, James Bond, Fast and Furious, Transformers, Jurassic Park) don't. One is Tom Cruise, who is a great actor and action hero ONLY when he isn't carrying the entire movie. MI has a nice cast of characters that provide relief from endless shots of Tom running, dangling, and jumping. Another is that they manage to keep coming up with tense situations and action sequences that are at least plausible and thus captivating. And that Tom does his own stunts and the CGI is minimal, which makes the action sequences more engaging and less like watching cool effects on a computer. Tom doing things while skydiving is really Tom Cruise skydiving, which is pretty cool. Mostly, it's that they take some time to give Tom, at least, some real personality, so that he makes different choices based on conflicting targets of loyalty.
The last one is important, and while MI:F includes this, it doesn't include it nearly enough. They keep trying to muscle in more action sequences and less character time. This may make Marvel fans happy but only makes the movie less engaging and more exhausting. The movie too often jumped from action sequence to action sequence without a breath, which left me just a bit numb. I'm sure there are people who like this; who would complain, in fact, if there were more character sequences. So it's just my opinion. These people also tend to overlook little problems, like how certain people deceive other people when these deceivers are under careful, continuous observation, how certain people could possibly know to be in certain places at certain times to meet certain other people when these other people are doing things purely randomly, and and how certain people would surely have to go through a number of checks before getting to where they got to. I guess I am not supposed to notice those things.
Anyway, I enjoyed it. Not as much as 1 or 4, but more then 5 (I didn't see 2 or 3).
Ant-Man and the Wasp - Marvel, yippee. I never actually made it through Ant-Man because it was formulaic and boring. Perhaps the only thing going for it was that at least the fate of the universe wasn't at stake, which was a nice change.
I'm kind of at a loss as to why I found this one more enjoyable. Not exactly a good movie, but better. The ending was poorly executed, and really the science doesn't make any sense. I'm happy that the fate of the world isn't at stake - just one woman. And I'm happy that the main "bad guy" is someone who has a compelling motivation and who isn't bad at all, just trying to survive.
I guess dispensing with a lot of the back-story helped, as did allowing us to see all of the many ways that shrinking/expanding can be used in a fight. Its lack of ambition made it feel less pretentious and thus easier to accept. It felt like a pretty good television episode. So it was okay.
Jurassic World: Fallen Kingdom - The first one (Jurassic Park) was a classic; the last one (Jurassic World) was okay, but the characters were so flat as to make it feel like a Marvel movie. This one is about the same as the last one, but the plot is dumber and even less original. They need to either let the dinosaurs die or rescue them to some other island, and by the way, someone wants to steal some of the dinosaurs and by the way, someone wants to sell them as military weapons (somehow). It sounds familiar because it is.
Same kinds of bad guys doing the same kinds of bad things; yadda yadda. The characters from the last movie are a little different, but just as flat. It's hard to care.
The Incredibles 2 - The first was a great movie, marrying Disney with superheroes with some actual adult themes that didn't talk down to kids. This one is even more so. It starts exactly where the last one left off, only they have to deal with the consequences of the damage caused to the city after they stop the first bad guy (exactly like Captain America: Civil War). In order to solve their PR problem, they decide that Elastigirl (rather than the less PR-worthy Mr Incredible) be sent out to do some careful superhero work, which leaves Mr Incredible alone at home with the kids and their new baby of wildly unknown superpowers.
Cue a little male resentment and a touch of 1950s role reversal comedy, but really not too much. Elastigirl really is a superhero as well as a mom, and she does it well, and Mr Incredible proves that every stay-at-home parent is a superhero in his or her own way. Of course, eventually everything has to come to a head.
The plot is good and thought-provoking, but still full of humor and great action. Of course, it's beautifully rendered and well voiced. A worthy sequel to the original.
Breathe - The true story of a British flyboy who becomes paralyzed by polio while in Kenya in the 1950s. He is ready to die, but his wife won't let him and he goes on to travel home, leave the hospital (which never happened back then) and eventually design the first wheelchair with a respirator. His work (and his good friend the engineer) went on to improve the life of thousands of people in similar condition.
It's wrapped up in beautiful scenery and costuming and a true-life love story. It was interesting to watch, although I guess they glossed over some of the less palatable parts of taking care of a paralyzed person. Meanwhile, some parts of the movie went on longer than they should have, such as the entire last half hour where he decides he has finally lived long enough; these parts could have been shorter. I loved and was even surprised by, the scenes in Spain.
Worth watching, although I wouldn't go out of my way to see it.
Midnight Sun - This is a pretty terrible movie from nearly every perspective. It is about a girl with xeroderma pigmentosum.
In real life, this is a non-curable condition whose sufferers tend to sunburn or blister after small exposures to sunlight and who are therefore extremely vulnerable to skin cancer. People with this condition are visibly distinguishable as such, having typically found out about their condition the hard way. They may have special glass in their house windows, but they can go out in daylight with a lot of clothing and extra caution.
In movie life, the girl has movie-perfect skin and never goes outside during daylight. Furthermore, the moment she is exposed to a few seconds of sunlight she develops a brain condition that begins causing her death.
If that wasn't enough of a problem, just let the anemic characters and the predictable, manipulative, and poorly scripted and acted plot do the rest. And, of course, she is going to "hide" her condition from the first (and last) boy she goes out with, because we never get enough of that kind of thing from sitcoms.
The Last Sane Man In A World Gone Mad
The passing of The Daily Banter's Chez Pazienza is a great loss to journalism that few will ever know about. While The Banter, which he co-founded with Bob Cesca, is small potatoes compared to the Internet powerhouses of Buzzfeed, Salon, Vox, and The Huffington Post, he helped bring something to the online paper that is quickly become a dying practice: quality writing. In the obsessive desire for traffic and shares, otherwise reliable bastions of liberal thought have devolved into cheap listicles and sensationalist outrage blogging. It is a dumbing down of the Left comparable to what Rush Limbaugh and Sean Hannity did to the Right.
A lone auteur in a wilderness of mediocrity.
Chez was left-wing P.J. O'Rourke with a sharp scintilla of Hitch. He opposed nonsense and bullshit wherever he saw it, from the hourly insanity of President Trump, to the maddening political correctness on colleges, to the insipid humor of Jimmy Fallon, to the left-wing nihilists who refused to vote for Hillary, to the self-destructive madness of the Republican Party, and the inability of many liberals to be frank about critiquing Islam. I didn't always agree with Chez, nor did I always agree with Hitch, but what they held in common, for me, was their witty and no-holds-barred takes the latest news events. Their perspectives were always fresh, often sating my hunger for something savage, contrarian, and nuanced all in the same piece.
If there were an overriding theme to Chez's latest Banter writings, if one can be salvaged, it'd be that America is going further and further down the shithole of absurdity, with the only comforting reprieve being the ability to laugh in defiance like George C. Scott riding the nuclear bomb in the finale of Dr. Strangelove. Literary voices like Chez are a dying breed. Even The Washington Post and The New Republic are falling prey to the Buzzfeed effect. Gravitas on the guillotine.
In his death, however tragic, it can hoped that Chez'll receive the due recognition that he deserved in life. I could quote any number of passages from his long bibliography to give you an idea of what I'm taking about, but I think it most prescient, given the toddler-in-chief, that I quote from one of his more recent warnings about Trump, as he tried tirelessly to resist the normalization of this imbecile of a president in the media, a resistance that we need to continue,
"So the time for arguing amongst ourselves over petty outrages and miniscule transgressions is over. It has to be. We don't have the time for it anymore. Those closest to Trump's firing line within our diverse population will be counting on every single decent person in this country to take a stand for them and the only way we can do that is with a unified front and sheer numbers. Our voices have to be loud. Our anger has to be righteous and it needs to be seen and heard in everything from our politics and those who speak for us politically, to our music, to our art, to even, ironically, our comedy. We're already seeing our artists, creators, and thought leaders giving us a hint of what might be to come. And come it must. That's the voice of the resistance."
Further Reading
Chez Pazienza's Articles For The Daily Banter.
http://thedailybanter.com/author/chez-pazienza/
"In Memory Of Chez Pazienza, The Writer I Always Wished I Could Be."
http://thedailybanter.com/2017/02/in-memory-of-chez-pazienza/
Bibliography
Pazienza, Chez. "Make America Rage Again." The Daily Banter, November 10, 2016. Web. http://thedailybanter.com/2016/11/make-america-rage-again/
вторник, 17 марта 2020 г.
понедельник, 16 марта 2020 г.
PUBG Mobile 0.12.0 Update
What's next after PUBG mobile 0.11.5 update? Yeah, it's 0.12.0 update! This update will also bring some new guns, new features, new attachments, and many new features. So let us have a look at those features.
1. MP5K (Gun) :
MP5K is a new SMG gun coming to PUBG mobile 0.12.0 update. This gun will be available only on Vikendi map and will replace Vector from Vikendi map. This gun will require 9mm ammo. The MP5K is highly versatile with single, burst and full auto firing options. It can support all attachment types. View the video to know more about it.
2. Skorpion (Gun) :
It is a full-auto weapon pistol that works on 9mm ammo. Its capacity can be increased from default 20 rounds to 40 rounds using a standard extended magazine. It can be switched from single fire to full auto. The only disadvantage is that it has lower per bullet damage than other pistols. If you want to use this weapon, you have to wait for PUBG mobile 0.12.0 update.
3. Competitive mode will be re-added:
This mode was once available in PUBG but later it was removed. Now on public demand, they are bringing it back on PUBG mobile 0.12.0 update. Those players who don't know what it is or recently started players, let me explain it to you. So basically, it is an arcade mode where there are no bots i.e. all the players are real.
The minus point of this mode is that it takes 10 minutes or more, depending on the number of players, to load. This mode is perfect for those who hate bots or for pro players who want only real players to kill.
4. Canted sight (attachment) :
It is a secondary attachment that allows the player to quickly switch between the 1x Canted sight and the other scope used. It is already launched in PUBG PC, Xbox and PS4. To know more about Canted sight you can visit my post about it.
It was planned to release in PUBG 0.11.5 update but later it was postponed to PUBG mobile 0.12.0 update.
5. Death Cam (feature) :
Death Cam is a new feature coming to PUBG mobile 0.12.0 update. If you are playing the game and suddenly someone kills you then this Cam will allow you to view the scene i.e. after your death you can use the feature to know exactly who killed you, what gun the opponent used and other information. The main reason behind the adding of this feature is that many players were reporting the presence of hackers in the game. So PUBG added this feature to know whether there was a real hacker or not.
6. Bug tracking system :
Lagging is the worst enemy for online players. PUBG Corp. understands it and is trying its best to remove lagging as much as possible.
For this, PUBG is installing a software called Bug tracking system. This software will scan the game, detect any bug present in the game and will report it to the PUBG developers. The PUBG developers can, then work on that bug and remove it. This is just a concept for now but we hope to find it in the PUBG mobile 0.12.0 update.
7. More chats are added :
If you are bored with existing chats like "Help!", " I got supplies!" etc. then in the PUBG mobile 0.12.0 update you will be able to add some more chats in both male and female voices. And you can irritate your friends as like I do with my friends.
8. The White Eagle :
You will be able to have the White Eagle as your companion in the PUBG mobile 0.12.0 update. The Eagle will follow wherever you go.
9. Scope colors :
The PUBG mobile 0.12.0 update will let you change the color and shape of the pointer of a gun. People who were bored red color can change it to several colors including white, sky, pink, black and others.
Release date:
There is no officially confirmed release date for PUBG mobile 0.12.0 update, but the expected date, as of my prediction, is 20-25 April 2019. I repeat again this is my prediction and not officially confirmed. Once the date is officially confirmed, the date will be posted on our facebook page. So please like our page to get future updates.
Enough reading! Now it's your time to tell me your opinion about these updates. The comment section is below.
1. MP5K (Gun) :
MP5K is a new SMG gun coming to PUBG mobile 0.12.0 update. This gun will be available only on Vikendi map and will replace Vector from Vikendi map. This gun will require 9mm ammo. The MP5K is highly versatile with single, burst and full auto firing options. It can support all attachment types. View the video to know more about it.
MP5K |
2. Skorpion (Gun) :
It is a full-auto weapon pistol that works on 9mm ammo. Its capacity can be increased from default 20 rounds to 40 rounds using a standard extended magazine. It can be switched from single fire to full auto. The only disadvantage is that it has lower per bullet damage than other pistols. If you want to use this weapon, you have to wait for PUBG mobile 0.12.0 update.
Skorpion |
3. Competitive mode will be re-added:
This mode was once available in PUBG but later it was removed. Now on public demand, they are bringing it back on PUBG mobile 0.12.0 update. Those players who don't know what it is or recently started players, let me explain it to you. So basically, it is an arcade mode where there are no bots i.e. all the players are real.
The minus point of this mode is that it takes 10 minutes or more, depending on the number of players, to load. This mode is perfect for those who hate bots or for pro players who want only real players to kill.
Competitive mode |
4. Canted sight (attachment) :
It is a secondary attachment that allows the player to quickly switch between the 1x Canted sight and the other scope used. It is already launched in PUBG PC, Xbox and PS4. To know more about Canted sight you can visit my post about it.
It was planned to release in PUBG 0.11.5 update but later it was postponed to PUBG mobile 0.12.0 update.
Canted Sight |
5. Death Cam (feature) :
Death Cam is a new feature coming to PUBG mobile 0.12.0 update. If you are playing the game and suddenly someone kills you then this Cam will allow you to view the scene i.e. after your death you can use the feature to know exactly who killed you, what gun the opponent used and other information. The main reason behind the adding of this feature is that many players were reporting the presence of hackers in the game. So PUBG added this feature to know whether there was a real hacker or not.
Death Cam |
6. Bug tracking system :
Lagging is the worst enemy for online players. PUBG Corp. understands it and is trying its best to remove lagging as much as possible.
For this, PUBG is installing a software called Bug tracking system. This software will scan the game, detect any bug present in the game and will report it to the PUBG developers. The PUBG developers can, then work on that bug and remove it. This is just a concept for now but we hope to find it in the PUBG mobile 0.12.0 update.
7. More chats are added :
If you are bored with existing chats like "Help!", " I got supplies!" etc. then in the PUBG mobile 0.12.0 update you will be able to add some more chats in both male and female voices. And you can irritate your friends as like I do with my friends.
Chats in PUBG |
8. The White Eagle :
You will be able to have the White Eagle as your companion in the PUBG mobile 0.12.0 update. The Eagle will follow wherever you go.
The White Eagle |
9. Scope colors :
The PUBG mobile 0.12.0 update will let you change the color and shape of the pointer of a gun. People who were bored red color can change it to several colors including white, sky, pink, black and others.
Scope colors |
Release date:
There is no officially confirmed release date for PUBG mobile 0.12.0 update, but the expected date, as of my prediction, is 20-25 April 2019. I repeat again this is my prediction and not officially confirmed. Once the date is officially confirmed, the date will be posted on our facebook page. So please like our page to get future updates.
Enough reading! Now it's your time to tell me your opinion about these updates. The comment section is below.
пятница, 6 марта 2020 г.
Now Hiring: Community Manager And Event Coordinator
We are now looking for a "Community Manager and Event Coordinator" for our company. This will be a very broad role and we are looking for someone who is very driven and creative. The tasks will range from the simple, such as:
- Managing our social media accounts and platform-specific communication channels (such as Steam communities and PS4 Game hub).
- Answering various emails.
- Coordinating and booking special internal and external events.
- Planning and coordinating PR for a new game release.
- Making plans for improving our social media and implementing these.
- Overseeing a revamp of all our webpages (company and game-specific).
- Becoming the company's catalyst for generating interesting posts and events on all of our public channels.
The basic requirements are as follows:
- It's crucial that you are a person who is highly able to work on your own initiative. No one will be laying out an exact schedule of things that you must do - you will need to drive your own workload. You will also need to be a creative member of the team, bringing a lot of your own ideas and suggestions to the table and then going on to implement them when possible.
- You must live in Sweden or be prepared to move here. Note that any employment starts with a six month trial period, and there is no need to move until that is over.
- You must have excellent writing skills in English.
- You need good knowledge of how social media, such as Twitter and Facebook, works.
- You should have a burning interest in video games and an understanding of the market.
In order to apply, start by doing the following assignments:
- Imagine that SOMA is about to be released. Write a short (at most 150 words) and playful cover letter that will be sent out with all of the review copies of the game.
- We really need to become much more frequent in our social media usage and communicate what we do as a company and what we are like as individuals. In 200 words or less, explain how you would try to go about increasing the number of interesting posts on our social media channels.
- An angry user has written an email complaining that our games have all become worse since Penumbra, as they no longer have proper puzzles and gameplay. Write a response.
- Being proactive and self-starting is crucial for this position. Therefore, write your own question similar to the ones above and answer it.
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.
Подписаться на:
Сообщения (Atom)