Venom Movie (2018): Here's Every After-Credits Scene, Explained [Spoilers]
Sony's new movie, Venom, has received mostly poor reviews, but that hasn't stopped it from setting a new US box office record in its first weekend. And although it may also not be part of the Marvel Cinematic Universe, it is a comic book movie--and that means it borrowed some pages of the MCU playbook by including a pair of extra scenes after the credits roll. Its two post-credits sequences feature a surprising reveal, a sequel teaser, and some hype for another Spider-adjacent movie entirely. So technically there is a Spider-Man reference in Venom? Does this count? Obvious spoilers ahead--please consider yourself warned!
The first and most consequential of Venom's credits stingers features a rather abrupt jump to Eddie being escorted into a supermax prison by a guard, apparently on assignment for his newly resumed journalistic career. The actual angle of the piece and the outlet that commissioned it are never revealed, but that doesn't stop the guard from running down a list of intimidating Silence of the Lambs style rules Eddie has to follow upon conducting his interview, as if he's Clarice Starling about to meet Hannibal Lecter for the first time. Venom itself stays hidden and mostly quiet as Eddie approaches the cell, and we see a man painting the word "welcome" in blood on the walls of his cage, which happens to be a lone box in the middle of an otherwise empty room. He's the only prisoner kept here, we can assume for the safety of the other inmates.
As the camera focuses on his face, he's revealed to be played by Woody Harrelson, sitting in a white jumpsuit, done up with an almost cartoonish red wig. He never formally introduces himself but begins to speak as Eddie approaches, warning that when he "gets out of here, there's going to be carnage" before the scene cuts to black.
Though he's never formally named, it's pretty obvious that Harrelson is set to play Cletus Kasady in whatever Venom sequel might be in the works, the serial killing mass murderer who eventually comes into possession of his very own symbiote named--wait for it--Carnage.
In the comics, Carnage is actually one of the Venom symbiote's many offspring, created during a brief stint in which Eddie was incarcerated and kept in a cell next to Kasady, where it eventually bonded to him without Eddie's knowledge. Thanks to Kasady's major homicidal streak and psychopathic tendencies, and some comic book science involving the symbiote bonding to Kasady's blood directly (don't worry about it), Carnage became a massive and powerful threat almost immediately.
Physically, Carnage looks similar to Venom, except it's blood red in color and tends to fight with a bunch of gooey tentacle-like appendages in addition to its standard issue symbiote shape-shifting and brute strength. Unlike Brock, however, Kasady was never interested in trying to reign in Carnage's murderous, cannibalistic side, meaning Carnage basically just gets to cut a swath of destruction and terror wherever it wants, whenever it wants.
We can't be sure based on this scene alone just how the Carnage symbiote will come into play or how Kasady will bond with it. The movie universe hasn't dealt with the symbiotes reproducing so far, so it's likely that the family connection between the two will be changed. And given that Brock himself isn't actively incarcerated, there will probably be some other way for Kasady to come in contact with his symbiote--a rogue Life Foundation experiment, maybe? Some sort of Riot fragment that survived the crash? Alternatively, there's a slight possibility that the movie will posit Kasady already having Carnage inside him (hence the high security prison set up and the "there will be carnage" line) with the intent of building out that backstory somewhere down the line. Really anything is possible at this point.
In an interview with GameSpot, Venom director Ruben Fleischer elaborated on the scene and the casting choice of Woody Harrelson, with whom he has worked in the past.
"We tried at the end of our movie to lay the groundwork for a potential sequel, or a further story. And there's a character that's beloved by all Venom fans that does not appear in the body of our film that I think fans will be really excited to see," Fleischer said. "I found somebody who I have a relationship with and love working with. And I love all the characters that he's played. So to imagine him being an iconic adversary to Venom in the future is really exciting."
The only thing we can be sure of is that, should Venom be greenlit for a part two, Carnage fans will definitely have something to write home about.
Enter Spider-Man
Venom's second post credits segment was actually, technically, not a post credits scene at all, but a promotional clip for an entirely different movie: Spider-Man: Into the Spider-Verse, which is set for release this December. Heralded by a bright "Meanwhile, in another universe" title card, the clip featured the animated Miles Morales running from an unknown, masked enemy wearing a makeshift spider-style costume before winding up at the grave of the late Peter Parker.
He's then met by a very much alive Peter Parker, who he accidentally knocks out, prompting a Weekend At Bernie's style series of mishaps around New York in which Miles drags the very unconscious Peter around the city. The clip was previously showcased in part at San Diego Comic-Con this year.
Spider-Man: Into The Spider-Verse has no direct connection with either Venom or the MCU that we know of yet, and even if it did, it certainly doesn't impact the significance of this particular clip. Instead it's set to build its own multiverse populated by some fan favorite Spider-Man comics characters, hence the "Spider-Verse" title. So, no real hidden meanings or major clues for the future of Sony's superhero line on this one, just a little teaser for another movie headed to theaters this winter.
Along with cp and mv, both of which we talked about at length in the previous installment of this series, links are another way of putting files and directories where you want them to be. The advantage is that links let you have one file or directory show up in several places at the same time.
As noted previously, at the physical disk level, things like files and directories don’t really exist. A filesystem conjures them up for our human convenience. But at the disk level, there is something called a partition table, which lives at the beginning of every partition, and then the data scattered over the rest of the disk.
Although there are different types of partition tables, the ones at the beginning of a partition containing your data will map where each directory and file starts and ends. The partition table acts like an index: When you load a file from your disk, your operating system looks up the entry on the table and the table says where the file starts on the disk and where it finishes. The disk header moves to the start point, reads the data until it reaches the end point and, hey presto: here’s your file.
Hard Links
A hard link is simply an entry in the partition table that points to an area on a disk that has already been assigned to a file. In other words, a hard link points to data that has already been indexed by another entry. Let’s see how this works.
Open a terminal, create a directory for tests and move into it:
For extra excitement (?), open test.txt in a text editor and add some a few words into it.
Now make a hard link by executing:
ln test.txt hardlink_test.txt
Run ls, and you’ll see your directory now contains two files… Or so it would seem. As you read before, really what you are seeing is two names for the exact same file: hardlink_test.txt contains the same content, has not filled any more space in the disk (try with a large file to test this), and shares the same inode as test.txt:
$ ls -li *test*
16515846 -rw-r--r-- 2 paul paul 14 oct 12 09:50 hardlink_test.txt 16515846 -rw-r--r-- 2 paul paul 14 oct 12 09:50 test.txt
ls‘s -i option shows the inode number of a file. The inode is the chunk of information in the partition table that contains the location of the file or directory on the disk, the last time it was modified, and other data. If two files share the same inode, they are, to all practical effects, the same file, regardless of where they are located in the directory tree.
Fluffy Links
Soft links, also known as symlinks, are different: a soft link is really an independent file, it has its own inode and its own little slot on the disk. But it only contains a snippet of data that points the operating system to another file or directory.
You can create a soft link using ln with the -s option:
ln -s test.txt softlink_test.txt
This will create the soft link softlink_test.txt to test.txt in the current directory.
By running ls -li again, you can see the difference between the two different kinds of links:
$ ls -li
total 8 16515846 -rw-r--r-- 2 paul paul 14 oct 12 09:50 hardlink_test.txt 16515855 lrwxrwxrwx 1 paul paul 8 oct 12 09:50 softlink_test.txt -> test.txt 16515846 -rw-r--r-- 2 paul paul 14 oct 12 09:50 test.txt
hardlink_test.txt and test.txt contain some text and take up the same space *literally*. They also share the same inode number. Meanwhile, softlink_test.txt occupies much less and has a different inode number, marking it as a different file altogether. Using the ls‘s -l option also shows the file or directory your soft link points to.
Why Use Links?
They are good for applications that come with their own environment. It often happens that your Linux distro does not come with the latest version of an application you need. Take the case of the fabulous Blender 3D design software. Blender allows you to create 3D still images as well as animated films and who wouldn’t to have that on their machine? The problem is that the current version of Blender is always at least one version ahead of that found in any distribution.
Fortunately, Blender provides downloads that run out of the box. These packages come, apart from with the program itself, a complex framework of libraries and dependencies that Blender needs to work. All these bits and piece come within their own hierarchy of directories.
Every time you want to run Blender, you could cd into the folder you downloaded it to and run:
./blender
But that is inconvenient. It would be better if you could run the blender command from anywhere in your file system, as well as from your desktop command launchers.
The way to do that is to link the blender executable into a bin/ directory. On many systems, you can make the blender command available from anywhere in the file system by linking to it like this:
Another case in which you will need links is for software that needs outdated libraries. If you list your /usr/lib directory with ls -l, you will see a lot of soft-linked files fly by. Take a closer look, and you will see that the links usually have similar names to the original files they are linking to. You may see libblah linking to libblah.so.2, and then, you may even notice that libblah.so.2 links in turn to libblah.so.2.1.0, the original file.
This is because applications often require older versions of alibrary than what is installed. The problem is that, even if the more modern versions are still compatible with the older versions (and usually they are), the program will bork if it doesn’t find the version it is looking for. To solve this problem distributions often create links so that the picky application believes it has found the older version, when, in reality, it has only found a link and ends up using the more up to date version of the library.
Somewhat related is what happens with programs you compile yourself from the source code. Programs you compile yourself often end up installed under /usr/local: the program itself ends up in /usr/local/bin and it looks for the libraries it needs / in the /usr/local/lib directory. But say that your new program needs libblah, but libblah lives in /usr/lib and that’s where all your other programs look for it. You can link it to /usr/local/lib by doing:
ln -s /usr/lib/libblah /usr/local/lib
Or, if you prefer, by cding into /usr/local/lib…
cd /usr/local/lib
… and then linking with:
ln -s ../lib/libblah
There are dozens more cases in which linking proves useful, and you will undoubtedly discover them as you become more proficient in using Linux, but these are the most common. Next time, we’ll look at some linking quirks you need to be aware of.
Learn more about Linux through the free “Introduction to Linux” course from The Linux Foundation and edX.
Posted by: xSicKxBot - 10-18-2018, 10:14 AM - Forum: Lounge
- No Replies
New On Netflix This Week: Movies, TV Series, And Originals (US)
This week, a ton of Netflix Original series and movies arrive on the streaming service. You won't be able to see many of them before Friday, but there are a few new shows to watch while you wait.
The second season of Netflix's popular anime about the seven cursed knights who protect the fictional land of Britannia is back. The Seven Deadly Sins: Revival of The Commandments sees the demon Meliodas, giantess Diane, fairy King, immortal Ban, wizard Merlin, and living doll Gowther reunite with Escanor, the Sin of Pride, to once again defend the kingdom with the help of the princess Elizabeth and talking pig Hawk. No longer criminals, the Seven Deadly Sins use their newfound freedom to fulfill promises they each made to friends and family long ago, as well as battle the group of demons that represent the ten Biblical Commandments. For more anime coming to Netflix this month--as well as Crunchyroll, Funimation, Amazon, and HIDIVE--check out our fall 2018 anime guide.
A huge assortment of series and movies are coming to Netflix on Friday. Most notable is Marvel's Daredevil Season 3, which sees Matt Murdock, aka Daredevil, once again go up against Wilson Fisk. Although he was the major villain of Season 1, Fisk was regulated to a background role in Season 2. Vincent D'Onofrio has already provided chilling performances as the Kingpin of Crime in Season 3's trailers, and his return seems to plunge Matt into one of the darkest MCU stories told yet. Charlie Cox and Deborah Ann Woll return to reprise their roles as Matt Murdock and Karen Page respectfully, and Wilson Bethel joins the cast to portray Bullseye, one of Daredevil's most iconic villains.
Below, you'll find the list of every new series, movie, and Original coming to Netflix this week, and you can check out the full list of October add-ons if you want a peek at what's to come.
Netflix: October 14 - October 20 (US)
Available October 15
Octonauts: Season 4
The Seven Deadly Sins: Revival of The Commandments-- NETFLIX ORIGINAL
Available October 16
Ron White: If You Quit Listening, I'll Shut Up-- NETFLIX ORIGINAL
Available October 19
Accidentally in Love-- NETFLIX ORIGINAL
Ask the Doctor-- NETFLIX ORIGINAL
Best.Worst.Weekend.Ever.: Limited Series-- NETFLIX ORIGINAL
Design faster web pages, part 2: Image replacement
Welcome back to this series on building faster web pages. The last article talked about what you can achieve just through image compression. The example started with 1.2MB of browser fat, and reduced down to a weight of 488.9KB. That’s still not fast enough! This article continues the browser diet to lose more fat. You might think that partway through this process things are a bit crazy, but once finished, you’ll understand why.
Preparation
Once again this article starts with an analysis of the web pages. Use the built-in screenshot function of Firefox to make a screenshot of the entire page. You’ll also want to install Inkscape using sudo:
$ sudo dnf install inkscape
If you want to know how to use Inkscape, there are already several articles in Fedora Magazine. This article will only explain some basic tasks for optimizing an SVG for web use.
Analysis
Once again, this example uses the getfedora.org web page.
Getfedora page with graphics marked
This analysis is better done graphically, which is why it starts with a screenshot. The screenshot above marks all graphical elements of the page. In two cases or better in four cases, the Fedora websites team already used measures to replace images. The icons for social media are glyphs from a font and the language selector is an SVG.
Briefly, HTML5 Canvas is an HTML element that allows you to draw with the help of scripts, mostly JavaScript, although it’s not widely used yet. As you draw with the help of scripts, the element can also be animated. Some examples of what you can achieve with HTML Canvas include this triangle pattern,animated wave, and text animation. In this case, though, it seems not to be the right choice.
CSS3
With Cascading Style Sheets you can draw shapes and even animate them. CSS is often used for drawing elements like buttons. However, more complicated graphics via CSS are usually only seen in technical demonstration pages. This is because graphics are still better done visually as with coding.
Fonts
The usage of fonts for styling web pages is another way, and Fontawesome is quiet popular. For instance, you could replace the Flavor and the Spin icons with a font in this example. There is a negative side to using this method, which will be covered in the next part of this series, but it can be done easily.
SVG
This graphics format has existed for a long time and was always supposed to be used in the browser. For a long time not all browsers supported it, but that’s history. So the best way to replace pictures in this example is with SVG.
Optimizing SVG for the web
To optimize an SVG for internet use requires several steps.
SVG is an XML dialect. Components like circle, rectangle, or text paths are described with nodes. Each node is an XML element. To keep the code clean, an SVG should use as few nodes as possible.
The SVG example is a circular icon with a coffee mug on it. You have 3 options to describe it with SVG.
Circle element with the mug on top
<circle style="opacity:1;fill:#717d82;fill-opacity:1;stroke:none;stroke-width:9.51950836;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" id="path36" cx="68.414307" cy="130.71523" r="3.7620001" />
<path style="opacity:1;fill:#717d82;fill-opacity:1;stroke:none;stroke-width:1.60968435;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" d="m 68.414044,126.95318 a 3.7618673,3.7618673 0 0 0 -3.76153,3.76204 3.7618673,3.7618673 0 0 0 3.76153,3.76205 3.7618673,3.7618673 0 0 0 3.76206,-3.76205 3.7618673,3.7618673 0 0 0 -3.76206,-3.76204 z m -1.21542,0.92656 h 2.40554 c 0.0913,0.21025 0.18256,0.42071 0.27387,0.63097 h 0.47284 v 0.60099 h -0.17984 l -0.1664,1.05989 h 0.24961 l -0.34779,1.96267 -0.21238,-0.003 -0.22326,1.41955 h -2.12492 l -0.22429,-1.41955 -0.22479,0.003 -0.34829,-1.96267 h 0.26304 l -0.16692,-1.05989 h -0.1669 v -0.60099 h 0.44752 c 0.0913,-0.21026 0.18206,-0.42072 0.27336,-0.63097 z m 0.12608,0.19068 c -0.0614,0.14155 -0.12351,0.28323 -0.185,0.42478 h 2.52336 c -0.0614,-0.14155 -0.12248,-0.28323 -0.18397,-0.42478 z m -0.65524,0.63097 v 0.21911 l 0.0594,5.2e-4 h 3.35844 l 0.0724,-5.2e-4 v -0.21911 z m 0.16846,0.41083 0.1669,1.05937 h 2.80603 l 0.16693,-1.05937 -1.57046,0.008 z m -0.061,1.25057 0.27956,1.5782 1.34411,-0.0145 1.34567,0.0145 0.28059,-1.5782 z m 1.62367,1.75441 -1.08519,0.0124 0.19325,1.2299 h 1.79835 l 0.19328,-1.2299 z" id="path2714" inkscape:connector-curvature="0" />
You probably can see the code becomes more complex and needs more characters to describe it. More characters in a file result, of course, in a larger size.
Node cleaning
If you open an example SVG in Inkscape and press F2, that activates the Node tool. You should see something like this:
Inkscape – Node tool activated
There are 5 nodes that aren’t necessary in this example — the ones in the middle of the lines. To remove them, select them one by one with the activated Node tool and press the Del key. After this, select the nodes which define this lines and make them corners again using the toolbar tool.
Inkscape – Node tool make node a corner
Without fixing the corners, handles are used that define the curve, which gets saved and will increase file size. You have to do this node cleaning by hand, as it can’t be effectively automated. Now you’re ready for the next stage.
Use the Save as function and choose Optimized svg. A dialogue window opens where you can select what to remove or keep.
Inkscape – Dialog window for save as optimized SVG
Even the little SVG in this example got down from 3.2 KB to 920 bytes, less than a third of its original size.
Back to the getfedora page: The grey voronoi pattern used in the background of the main section, after our optimization from Part 1 of this series, is down to 164.1 KB versus the original 211.12 KB size.
The original SVG it was exported from is 1.9 MB in size. After these SVG optimization steps, it’s only 500.4KB. Too big? Well, the current blue background is 564.98 KB in size. But there’s only a small difference between the SVG and the PNG.
Compressed files
$ ls -lh insgesamt 928K -rw-r--r--. 1 user user 161K 19. Feb 19:44 grey-pattern.png -rw-rw-r--. 1 user user 160K 18. Feb 12:23 grey-pattern.png.gz -rw-r--r--. 1 user user 489K 19. Feb 19:43 greyscale-pattern-opti.svg -rw-rw-r--. 1 user user 112K 19. Feb 19:05 greyscale-pattern-opti.svg.gz
This is the output of a small test I did to visualize this topic. You should probably see that the raster graphic — the PNG — is already compressed and can’t be anymore. The opposite is the SVG, an XML file. This is just text and can compressed, to less then a fourth of its size. As a result it is now around 50 KB smaller in size than the PNG.
Modern browsers can handle compressed files natively. Therefore, a lot of web servers have switched on mod_deflate (Apache) and gzip (nginx). That’s how we save space during delivery. Check out if it’s enabled at your server here.
Tooling for production
First of all, nobody wants to always optimize SVG in Inkscape. You can run Inkscape without a GUI in batch mode, but there’s no option to convert from Inkscape SVG to optimized SVG. You can only export raster graphics this way. But there are alternatives:
SVGO (which seems not actively developed)
Scour
This example will use scour for optimization. To install it:
$ sudo dnf install scour
To automatically optimize an SVG file, run scour similarly to this:
This is the end of part two, in which you learned how to replace raster images with SVG and how to optimize it for usage. Stay tuned to the Fedora Magazine for part three, coming soon.
Today we’re very happy to announce that the third preview of the next minor release of ASP.NET Core and .NET Core is now available for you to try out. We’ve been working hard on this release, along with many folks from the community, and it’s now ready for a wider audience to try it out and provide the feedback that will continue to shape the release.
Customers using Visual Studio should also install and use the Preview channel of Visual Studio 2017 (15.9 Preview 3 or later) in addition to the SDK when working with .NET Core 2.2 and ASP.NET Core 2.2 projects. Please note that the Visual Studio preview channel can be installed side-by-side with existing an Visual Studio installation without disrupting your current development environment.
Azure App Service Requirements
If you are hosting your application on Azure App Service, you can follow these instructions to install the required site extension for hosting your 2.2.0-preview3 applications.
Impact to machines
Please note that is a preview release and there are likely to be known issues and as-yet-to-be discovered bugs. While the .NET Core SDK and runtime installs are side-by-side, your default SDK will become the latest one. If you run into issues working on existing projects using earlier versions of .NET Core after installing the preview SDK, you can force specific projects to use an earlier installed version of the SDK using a global.json file as documented here. Please log an issue if you run into such cases as SDK releases are intended to be backwards compatible.
What’s new in Preview 3
For a full list of changes, bug fixes, and known issues you can read the release announcement.
Routing
We’ve introduced the concept of Parameter Transformers to routing in ASP.NET Core 2.2. A parameter transformer customizes the route generated by transforming parameter’s route values, and gives developers new options when generating routes. For example, a custom slugify parameter transformer in route pattern blog\{article:slugify} with Url.Action(new { article = "MyTestArticle" }) generates blog\my-test-article. Parameter transformers implement Microsoft.AspNetCore.Routing.IOutboundParameterTransformer and are configured using ConstraintMap.
These features are specific to the new endpoint routing system used in MVC by default in 2.2.
Parameter transformers are also used by frameworks to transform the URI to which an endpoint resolves. For example, ASP.NET Core MVC uses parameter transformers to transform the route value used to match an area, controller, action, and page.
With the preceding route, the action SubscriptionManagementController.GetAll() is matched with the URI /subscription-management/get-all. A parameter transformer doesn’t change the route values used to generate a link. Url.Action("GetAll", "SubscriptionManagement") outputs /subscription-management/get-all.
ASP.NET Core provides API conventions for using a parameter transformers with generated routes:
MVC has the Microsoft.AspNetCore.Mvc.ApplicationModels.RouteTokenTransformerConvention API convention. This convention applies a specified parameter transformer to all attribute routes in the app. The parameter transformer will transform attribute route tokens as they are replaced. For more information, see Use a parameter transformer to customize token replacement.
Razor pages has the Microsoft.AspNetCore.Mvc.ApplicationModels.PageRouteTransformerConvention API convention. This convention applies a specified parameter transformer to all automatically discovered Razor pages. The parameter transformer will transform the folder and file name segments of Razor page routes. For more information, see Use a parameter transformer to customize page routes.
Link Generation
Added a new service called LinkGenerator, it is a singleton service that supports generating paths and absolute URIs both with and without an HttpContext. If you need to generate links in Middleware or somewhere outside of Razor then this new service will be useful to you. You can use it in Razor, but the existing APIs like Url.Action are already backed by the new service so you can continue to use those.
For now this is useful to link to MVC actions and pages from outside of MVC. We will add additional features in the next release targeting non-MVC scenarios.
Health Checks
DbContextHealthCheck
We added a new DbContext based check for when you are using Entity Framework Core:
// Registers required services for health checks
services.AddHealthChecks()
// Registers a health check for the MyContext type. By default the name of the health check will be the
// name of the DbContext type. There are other options available through AddDbContextCheck to configure
// failure status, tags, and custom test query.
.AddDbContextCheck<MyContext>();
This check will make sure that the application can communicate with the database you configured for MyContext. By default the DbContextHealthCheck will call the CanConnectAsync method that is being added to Entity Framework Core 2.2. You can customize what operation is run when checking health using overloads of the AddDbContextCheck method.
Health Check Publisher
We added the IHealthCheckPublisher interface that has a single method you can implement:
If you add an IHealthCheckPublisher to DI then the health checks system will periodically execute your health checks and call PublishAsync with the result. We expect this to be useful when you are interacting with a push based health system that expects each process to call it periodically in order to determine health.
Tags
In preview3 we added the ability to tag health checks with a list of strings when you register them:
Once you’ve done this then you can filter execution of your checks via tag:
app.UseHealthChecks("/liveness", new HealthCheckOptions
{
Predicate = (_) => false
});
app.UseHealthChecks("/readiness", new HealthCheckOptions
{
Predicate = (check) => check.Tags.Contains("db")
});
We see tags as a way for consumers of health checks, application authors, to use as a convenient grouping and filtering mechanism for their health checks. Not something that health check authors will pre-populate.
You can also customize what status a failure of this check means for your application, for example if your application is written such that it can handle the database not being available then a database being down might mean Degraded rather than UnHealthy.
Validation Performance Improvements
MVC’s validation system is designed to be extensible and flexible allowing developer to determine on a per request basis what validators apply to a given model. This is great for authoring complex validation providers. However, in the most common case your application only uses the built-in validation pieces such as DataAnnotations ([Required], [StringLength] etc, or IValidatableObject) and don’t require this extra flexability.
In 2.2.0-preview3, we’re adding a feature that allows MVC to short-circuit validation if it can determine that a given model graph would not require any validation. This results in significant improvements when validating models that cannot or do not have any associated validators. This includes objects such as collections of primitives (byte[], string[], Dictionary<string, string> etc), or complex object graphs without many validators.
Some significant performance improvements have been made to SocketsHttpHandler by improving the connection pool locking contention. For applications making many outgoing HTTP requests, such as some Microservices architectures, throughput should be significantly improved. Our internal benchmarks show that under load HttpClient throughput has improved by 60% on Linux and 20% on Windows. At the same time the 90th percentile latency was cut down by two on Linux. See Github #32568 for the actual code change that made this improvement.
Requests Per Second Linux (higher is better)
Requests Per Second Windows (higher is better)
Request Latency Linux (lower is better)
Request Latency Windows (lower is better)
ASP.NET Core Module
We added support for the ability to detect client disconnects when you’re using the new IIS in-process hosting model. The HttpContext.RequestAborted cancellation token now gets tripped when your client disconnnects.
The ASP.NET Core Module also features enhanced diagnostics logs that configurable via the new handler settings or environment variables that expose a higher fidelity of diagnostic information.
Preview 3 includes a few notable changes to the SignalR Java Client as we progress towards a 1.0 release:
The “groupId” for the Maven package has changed to com.microsoft.signalr. To reference the new package from a Maven POM file, add the following dependency:
In Preview 3 we’ve changed all the APIs to be asynchronous, using RxJava. Our Java Client documentation will be updated to show the new usage patterns. We also have support for the invoke method, allowing the client code to wait for the server method to complete. This version also includes support for serializing custom types in method arguments and return values.
The Java Client currently requires Android API Level 26 (or higher). We are investigating moving down to a lower API level before RTM. If you are planning to use SignalR in an Java-based Android application, please comment on the GitHub issue tracking our Android API level support so we know what API level would work well for our users.
Migrating an ASP.NET Core 2.1 project to 2.2
To migrate an ASP.NET Core project from 2.1.x to 2.2.0-preview3, open the project’s .csproj file and change the value of the the element to netcoreapp2.2. You do not need to do this if you’re targeting .NET Framework 4.x.
Giving Feedback
The main purpose of providing previews is to solicit feedback so we can refine and improve the product in time for the final release. Please help provide us feedback by logging issues in the appropriate repository at https://github.com/aspnet or https://github.com/dotnet. We look forward to receiving your feedback!
The Best Games for Two Players on iPhone, iPad and Android
By Michael Coffer17 Oct 2018
Games bring us together or sometimes are just busted out to pass the time. Either way, some of the greatest things in life (*checks crib sheet of shmaltz*) are better shared. No, seriously, two player games offer the most direct chances for head-to-head competition or connection. No misty-eyed sentiment there, just a fact. One mind probing the ingenuity and exiguity of another through games.
Maybe you like to play in person on the same screen, or even on different devices via local multiplayer, or instead online with asynchronous multiplayer. A test of reflexes or planning? The games below run the gamut, with variety enough for all kinds of people and situations. Give them a try the next time with a fellow gamer. You won’t be disappointed.
Uniwar
Developer: Spooky House Studios Platforms: iOS, Android Price: Free with non-invasive IAP
Uniwar is an ambitious turn-based strategy game which proudly wears its influences on its sleeve. It has the conquer-the-map tension of Advance Wars as well as the creative asymmetry of different player races: the fleshy Terrans, chitinous Insectoids and metallic…Robots. The abilities and interactions across these units are rather lively and varied, walking the fine edge between ‘interesting’ and ‘unbalanced’. Hotseat play is simple as can be, with quite a few maps offered, and there’s also online play.
Words with Friends has been around almost as long as smartphones themselves, and it’s still a golden way to spend the better part of a day or longer. Yes, it’s like that other classic board game, and there’s a delicious subtext of who-spells-what-when. (Words score points but also…score points, making associations, repartee, even a kind of conversation). It just works on multiple levels, from a pure gameplay perspective but also in terms of social pay-out and connection. Oh, and on the gameplay front, it’s worth noting that advanced play involves so much more than just scoring the most impressive single word on a given turn. It also means thinking about positioning, letter draws and pacing, bonuses: basically long-con strategy stuff. Words with Friends is an oldie but a goodie, and a surprisingly handy way to keep in touch with friends.
Developer: Fowers Games Inc. Platforms: iOS, Android Price: $4.99
Co-op games are great, but even the greats tend to be best either purely solo or with the max player count. Burgle Bros, however, is unique in that it shines especially with two. With two, the joint is cased twice as fast, but hiding is much harder. To quickly reprise the game for those unfamiliar: players explore each floor’s tiles till they discover the safe, crack the combination, retrieve the and advance to the next level. Patrolling guards and alarms will make things difficult, and if any player runs out of stealth points they risk getting caught and getting sent to the slammer. Some of the game’s more advanced tactics and interactions really only come into their own with a dynamic duo. Yes, gadgets and treasures along with character abilities combine but the real clincher is the pathing and alert system. Guards can be re-routed by tripping alarms, so the best teams take heat for each other. Two-player stealth doesn’t get much better than this.
Onitama
Developer: Asmodee Digital Platforms: iOS, Android Price: Free (with expansions, content packs as optional DLC)
Onitama is a game primarily about not losing. Sounds like weak, roundabout praise, I know, but what this means in practice is thinking many steps in advance, reasoning recursively to move from point B to point A, something surprisingly difficult. Woah there, let’s back up a little and actually talk about the game. Onitama is a two-player abstract game played on a two-dimensional square grid, much like chess. Players win by either capturing their opponent’s ‘King’ piece or alternatively by moving their own respective King onto the other player’s start space. The twist is how movement patterns work, for they are dictated by cards which can be used once, then eventually become playable by the opponent. There are only five given movement pattern cards (of a larger set) in a specific game, and this larger flow between good positioning and a good hand of cards makes the game quite intense. The app is free and as well-polished as any of Asmodee’s releases.
Neuroshima Hex
Developer: Portal Games Platforms:iOS, Android Price: $4.99, 2.99
This one features asymmetrical factions trying to control the board by selecting two of three tiles (six-sided hexes, that is) each turn. The post-apocalyptic setting and wildly divergent playstyles of the groups make it an unusually colorful strategy game, but these flourishes of variety do nothing to detract from the game’s balance. The base game only includes four races, but that alone is plenty to start with and the rest are available as paid DLC. Tile-laying madcap fun.
Arcade- or action-style two player games are the epitome of beer-and-pretzel fun. Crystal clear consequences, nothing to overthink or overanalyze just quick wrists instead of quick wits. Pure impulse and reaction make for some reliable fun, and Glow Hockey is a passable digital dupe for Air Hockey, minus the constant click-clack of the pucks. The physics are satisfying, the controls responsive. It works well in an understated and way that is impossible to hype, but it still entirely worth recognizing.
Bounden
Developer: Adriann de Jongh Platforms:iOS, Android Price: $2.99, $1.99
Tech ads for phones would have you believe that the latest and greatest upgrade will enliven your social life, expand your horizons and altogether transform day-to-day existence. Innovative games and designs do as much to transform the mundane as any simple hardware upgrade would, and Bounden is the result of a marriage between both kinds of ingenuity. It’s a couple’s dance lesson, led by a delicate gyroscope and some nifty programming which mapped out the choreography, as guided by professionals. Like Twister, but artsy, and surprisingly effortless, though you will undoubtedly feel bashful trying it out. Poetry in motion, and action.
Developer: Versus Evil Platforms:iOS, Android Price: $4.99
There is no high road in Antihero. Mischief and misfortune rule in its Victorian, Dickensian setting which makes the sooty and sullen into something fun. (The art direction and design are majorly on point with this game). Plus, the game itself is incredibly intense and stressful, always putting players in a race for victory points over a shockingly brief time. The game still manages to have a distinct beginning, middle, and end while allowing for a non-trivial variety of build paths and playstyles. It’s fog-of-war and bluff systems inject just enough tension to keep the game from becoming deterministic, and it’s one of the best original digital games to come out within recent memory. Oh, and it’s exclusively for two players, either through asynchronous or real-time play.
Ready Steady Bang
Developer: Cowboy Games Platforms:iOS, Android Price: $0.99, Free.
A western showdown at sundown. Quick-draw, one-shot, one-kill. Ready, Steady, Bang is this experience, over and over, with variable countdown timing and a variety of death animations. Technically there’s also a short ‘campaign’ mode vs. AI with ironclad timing thresholds, but the meat of the game can be reduced to a single perfectly timed gesture. Dead simple, quick and satisfying. Just don’t be the other guy.
Patchwork may be pint-sized compared to some of its juggernaut neighbors on this list, but what it lacks in player count or time commitment it makes up in charm and crystal-clear, razor sharp strategy. (Those two make for quite the odd couple) Patchwork is a variable-setup perfect information abstract for two players. Players work to fill up their empty boards by adding patches to them, of various polyomino sizing, with the ultimate goal of filling the whole swath and collecting as many covetous buttons along the way. It is almost instantly intuitive yet perplexing and sophisticated even after dozens of plays, with turns chained together or telegraphed from miles away. A sweet game that can also be a hardcore match of wits.
What are your favourite games to play between two people? Let us know in the comments!
Run and Scale a Distributed Crossword Puzzle App with CI/CD on Kubernetes (Part 3)
In Part 2 of our series, we deployed a Jenkins pod into our Kubernetes cluster, and used Jenkins to set up a CI/CD pipeline that automated building and deploying our containerized Hello-Kenzan application in Kubernetes.
In Part 3, we are going to set aside the Hello-Kenzan application and get to the main event: running our Kr8sswordz Puzzle application. We will showcase the built-in UI functionality to scale backend service pods up and down using the Kubernetes API, and also simulate a load test. We will also touch on showing caching in etcd and persistence in MongoDB.
Before we start the install, it’s helpful to take a look at the pods we’ll run as part of the Kr8sswordz Puzzle app:
kr8sswordz – A React container with our Node.js frontend UI.
puzzle – The primary backend service that handles submitting and getting answers to the crossword puzzle via persistence in MongoDB and caching in ectd.
mongo – A MongoDB container for persisting crossword answers.
etcd – An etcd cluster for caching crossword answers (this is separate from the etcd cluster used by the K8s Control Plane).
monitor-scale – A backend service that handles functionality for scaling the puzzle service up and down. This service also interacts with the UI by broadcasting websockets messages.
We will go into the main service endpoints and architecture in more detail after running the application. For now, let’s get going!
Read all the articles in the series:
This tutorial only runs locally in Minikube and will not work on the cloud. You’ll need a computer running an up-to-date version of Linux or macOS. Optimally, it should have 16 GB of RAM. Minimally, it should have 8 GB of RAM. For best performance, reboot your computer and keep the number of running apps to a minimum.
Running the Kr8sswordz Puzzle App
First make sure you’ve run through the steps in Part 1 and Part 2, in which we set up our image repository and Jenkins pods—you will need these to proceed with Part 3 (to do so quickly, you can run the part1 and part2 automated scripts detailed below). If you previously stopped Minikube, you’ll need to start it up again. Enter the following terminal command, and wait for the cluster to start:
minikube start
You can check the cluster status and view all the pods that are running.
kubectl cluster-infokubectl get pods --all-namespaces
Make sure the registry andjenkins pods are up and running.
So far we have been creating deployments directly using K8s manifests, and have not yet used Helm. Helm is a package manager that deploys a Chart (or package) onto a K8s cluster with all the resources and dependencies needed for the application. Underneath, the chart generates Kubernetes deployment manifests for the application using templates that replace environment configuration values. Charts are stored in a repository and versioned with releases so that cluster state can be maintained. Helm is very powerful because it allows you to templatize, version, reuse, and share the deployments you create for Kubernetes. See https://hub.kubeapps.com/ for a look at some of the open source charts available. We will be using Helm to install an etcd operator directly onto our cluster using a pre-built chart.
1. Initialize Helm. This will install Tiller (Helm’s server) into our Kubernetes cluster.
helm init --wait --debug; kubectl rollout status deploy/tiller-deploy -n kube-system
2. We will deploy an etcd operator onto the cluster using a Helm Chart.
An operator is a custom controller for managing complex or stateful applications. As a separate watcher, it monitors the state of the application, and acts to align the application with a given specification as events occur. In the case of etcd, as nodes terminate, the operator will bring up replacement nodes using snapshot data.
3. Deploy the etcd cluster and K8s Services for accessing the cluster.
You can see these new pods by entering kubectl get pods in a separate terminal window. The cluster runs as three pod instances for redundancy.
4. The crossword application is a multi-tier application whose services depend on each other. We will create three K8s Services so that the applications can communicate with one another.
kubectl apply -f manifests/all-services.yaml
5. Now we’re going to walk through an initial build of the monitor-scale application.
To simulate a real life scenario, we are leveraging the github commit id to tag all our service images, as shown in this command (git rev-parse –short HEAD).
6. Once again we’ll need to set up the Socat Registry proxy container to push the monitor-scale image to our registry, so let’s build it. Feel free to skip this step in case the socat-registry image already exists from Part 2 (to check, run docker images).
This step will fail if local port 30400 is currently in use by another process. You can check if there’s any process currently using this port by running the command lsof -i :30400
9. The proxy’s work is done, so go ahead and stop it.
docker stop socat-registry
10. Open the registry UI and verify that the monitor-scale image is in our local registry.
minikube service registry-ui
11. Monitor-scale has the functionality to let us scale our puzzle app up and down through the Kr8sswordz UI, therefore we’ll need to do some RBAC work in order to provide monitor-scale with the proper rights.
In the manifests/monitor-scale-serviceaccount.yamlyou’ll find the specs for the following K8s Objects.
Role: The custom “puzzle-scaler” role allows “Update” and “Get” actions to be taken over the Deployments and Deployments/scale kinds of resources, specifically to the resource named “puzzle”. This is not a ClusterRole kind of object, which means it will only work on a specific namespace (in our case “default”) as opposed to being cluster-wide.
ServiceAccount: A “monitor-scale” ServiceAccount is assigned to the monitor-scale deployment.
RoleBinding: A “monitor-scale-puzzle-scaler” RoleBinding binds together the aforementioned objects.
12. Create the monitor-scale deployment and the Ingress defining the hostname by which this service will be accessible to the other services.
The sed command is replacing the $BUILD_TAG substring from the manifest file with the actual build tag value used in the previous docker build command. We’ll see later how Jenkins plugin can do this automatically.
13. Wait for the monitor-scale deployment to finish.
kubectl rollout status deployment/monitor-scale
14. View pods to see the monitor-scale pod running.
kubectl get pods
15. View services to see the monitor-scale service.
kubectl get services
16. View ingress rules to see the monitor-scale ingress rule.
kubectl get ingress
17. View deployments to see the monitor-scale deployment.
kubectl get deployments
18. We will run a script to bootstrap the puzzle and mongo services, creating Docker images and storing them in the local registry. The puzzle.sh script runs through the same build, proxy, push, and deploy steps we just ran through manually for both services.
scripts/puzzle.sh
19. Check to see if the puzzle and mongo services have been deployed.
kubectl rollout status deployment/puzzle kubectl rollout status deployment/mongo
20. Bootstrap the kr8sswordz frontend web application. This script follows the same build proxy, push, and deploy steps that the other services followed.
scripts/kr8sswordz-pages.sh
21. Check to see if the frontend has been deployed.
kubectl rollout status deployment/kr8sswordz
22. Check to see that all the pods are running.
kubectl get pods
23. Start the web application in your default browser.
minikube service kr8sswordz
Giving the Kr8sswordz Puzzle a Spin
Now that it’s up and running, let’s give the Kr8sswordz puzzle a try. We’ll also spin up several backend service instances and hammer it with a load test to see how Kubernetes automatically balances the load.
1. Try filling out some of the answers to the puzzle. You’ll see that any wrong answers are automatically shown in red as letters are filled in.
2. Click Submit. When you click Submit, your current answers for the puzzle are stored in MongoDB.
3. Try filling out the puzzle a bit more, then click Reload once. This will perform a GET which retrieves the last submitted puzzle answers in MongoDB.
Did you notice the green arrow on the right as you clicked Reload? The arrow indicates that the application is fetching the data from MongoDB. The GET also caches those same answers in etcd with a 30 sec TTL (time to live). If you immediately press Reload again, it will retrieve answers from etcd until the TTL expires, at which point answers are again retrieved from MongoDB and re-cached. Give it a try, and watch the arrows.
4. Scale the number of instances of the Kr8sswordz puzzle service up to 16 by dragging the upper slider all the way to the right, then click Scale. Notice the number of puzzle services increase.
If you did not allocate 8 GB of memory to Minikube, we suggest not exceeding 6 scaled instances using the slider.
In a terminal, run kubectl get pods to see the new replicas.
5. Now run a load test. Drag the lower slider to the right to 250 requests, and click Load Test. Notice how it very quickly hits several of the puzzle services (the ones that flash white) to manage the numerous requests. Kubernetes is automatically balancing the load across all available pod instances. Thanks, Kubernetes!
6. Drag the middle slider back down to 1 and click Scale. In a terminal, run kubectl get pods to see the puzzle services terminating.
7. Now let’s try deleting the puzzle pod to see Kubernetes restart a pod using its ability to automatically heal downed pods
a. In a terminal enter kubectl get pods to see all pods. Copy the puzzle pod name (similar to the one shown in the picture above).
b. Enter the following command to delete the remaining puzzle pod. kubectl delete pod [puzzle podname]
c. Enter kubectl get pods to see the old pod terminating and the new pod starting. You should see the new puzzle pod appear in the Kr8sswordz Puzzle app.
What’s Happening on the Backend
We’ve seen a bit of Kubernetes magic, showing how pods can be scaled for load, how Kubernetes automatically handles load balancing of requests, as well as how Pods are self-healed when they go down. Let’s take a closer look at what’s happening on the backend of the Kr8sswordz Puzzle app to make this functionality apparent.
1. pod instance of the puzzleservice. The puzzle service uses a LoopBack data source to store answers in MongoDB. When the Reloadbutton is pressed, answers are retrieved with a GET request in MongoDB, and the etcd client is used to cache answers with a 30 second TTL.
2. The monitor-scalepod handles scaling and load test functionality for the app. When the Scale button is pressed, the monitor-scale pod uses the Kubectl API to scale the number of puzzle pods up and down in Kubernetes.
3. When the Load Test button is pressed, the monitor-scale pod handles the loadtest by sending several GET requests to the service pods based on the count sent from the front end. The puzzle service sends Hits to monitor-scale whenever it receives a request. Monitor-scalethen uses websockets to broadcast to the UI to have pod instances light up green.
4. When a puzzle pod instance goes up or down, the puzzle pod sends this information to the monitor-scale pod. The up and down states are configured as lifecycle hooks in the puzzle pod k8s deployment, which curls the same endpoint on monitor-scale (see kubernetes-ci-cd/applications/crossword/k8s/deployment.yml to view the hooks). Monitor-scale persists the list of available puzzle pods in etcd with set, delete, and get pod requests.
We do not recommend stopping Minikube (minikube stop) before moving on to do the tutorial in Part 4. Upon restart, it may create some issues with the etcd cluster.
Automated Scripts
If you need to walk through the steps we did again (or do so quickly), we’ve provided npm scripts that will automate running the same commands in a terminal.
1. To use the automated scripts, you’ll need to install NodeJS and npm.
On Linux, follow the NodeJS installation steps for your distribution. To quickly install NodeJS and npm on Ubuntu 16.04 or higher, use the following terminal commands.
2. Change directories to the cloned repository and install the interactive tutorial script:
a. cd ~/kubernetes-ci-cd b. npm install
3. Start the script
npm run part1 (or part2, part3, part4 of the blog series)
4. Press Enter to proceed running each command.
Up Next
Now that we’ve run our Kr8sswordz Puzzle app, the next step is to set up CI/CD for our app. Similar to what we did for the Hello-Kenzan app, Part 4 will cover creating a Jenkins pipeline for the Kr8sswordz Puzzle app so that it builds at the touch of a button. We will also modify a bit of code to enhance the application and enable our Submit button to show white hits on the puzzle service instances in the UI.
Curious to learn more about Kubernetes? Enroll in Introduction to Kubernetes, a FREE training course from The Linux Foundation, hosted on edX.org.
This article was revised and updated by David Zuluaga, a front end developer at Kenzan. He was born and raised in Colombia, where he studied his BE in Systems Engineering. After moving to the United States, he studied received his master’s degree in computer science at Maharishi University of Management. David has been working at Kenzan for four years, dynamically moving throughout a wide range of areas of technology, from front-end and back-end development to platform and cloud computing. David’s also helped design and deliver training sessions on Microservices for multiple client teams.
My Memory of Us is a reminiscence of a friendship between a boy and a girl. A friendship made during tough times. Times of terror, pain, and exclusion in a world where people were forced to live in two artificially detached worlds.
History Hides Away More Than One Truth... SOULCALIBUR VI represents the latest entry in the premier weapons-based, head-to-head fighting series and continues the epic struggle of warriors searching for the legendary Soul Swords. Taking place in the 16th century, revisit the events of the original SOULCALIBUR to uncover hidden truths. [Bandai Namco]
Posted by: xSicKxBot - 10-18-2018, 03:01 AM - Forum: Lounge
- No Replies
Rocket League's Halloween-Themed Event Returns
The annual Haunted Hallows has returned to Rocket League. This limited-time Halloween-themed event adds a new currency to Psyonix's game that allows you to buy special cosmetic items for your battle cars.
During Haunted Hallows, playing in and completing online matches allows you to earn Candy Corn currency. Candy Corn can be redeemed for Halloween-themed battle car decals, toppers, wheels, and other cosmetic items. One of the limited items, called a Golden Pumpkin, unlocks one random battle car customization from the Nitro, Turbo, or Player's Choice crates.
Haunted Hallows continues until November 5 at 2:00 PM PST / 5:00 PM EST / 10:00 PM BST. Even if you can no longer earn Candy Corn once the event ends, you'll still be able to spend any leftovers you might have for a limited time. You'll have until November 8 at 2:00 PM PST / 5:00 PM EST / 10:00 PM BST to spend your leftover Candy Corn before they're gone for good.
We think Rocket League is superb. In our Rocket League review, Miguel Concepcion gave the game a 9/10, writing, "The joy of Rocket League rests on the countless plans that are conceived and discarded every other second in any given match. Trying to predict where and how the ball will bounce next is a game within the game. Despite the use of cars, Rocket League emulates the emotional surges typical of The Beautiful Game, such as the rush of an unexpected fast break or a well-timed header into a goal. With Rocket League, the promising concept of combining two wonderful things--cars and soccer--is equally magnificent in execution."
Rocket League is available on Xbox One, PS4, PC, and Nintendo Switch. The game supports cross-play between Xbox One, PC, and Switch.