Posted by: xSicKxBot - 06-13-2020, 09:06 AM - Forum: Lounge
- No Replies
Despite Confusion, PS5's Spider-Man: Miles Morales Is A Standalone Game
Update: The exact nature and scope of PS5's Spider-Man: Miles Morales remains unclear, but one thing has been straightened out--it is a standalone game, as confirmed by Insomniac's James Stevenson. This is despite the suggestion from a Sony exec that it would be an "expansion" of sorts to the existing Marvel's Spider-Man game. You can read those original comments below.
Sony introduced its new PS5 titles during its latest event with what looked like a sequel to Insomniac's Spider-Man, which launched in 2018. But in statements made after the stream, Sony has clarified that it's in fact an expansion to the original title.
Spider-Man: Miles Morales will reportedly be a substantial expansion to the original game, which is being enhanced for the PS5 with the new console's hardware in mind. In an interview with The Telegram (and reposted by Twitter user Nibel), Sony's EVP head of European Business, Simon Rutter likened it to an expansion that uses an upgraded version of the original.
Posted by: xSicKxBot - 06-13-2020, 02:49 AM - Forum: Python
- No Replies
How to Merge Lists into a List of Tuples? [6 Pythonic Ways]
The most Pythonic way to merge multiple lists l0, l1, ..., ln into a list of tuples (grouping together the i-th elements) is to use the zip() function zip(l0, l1, ..., ln). If you store your lists in a list of lists lst, write zip(*lst) to unpack all inner lists into the zip function.
The proficient use of Python’s built-in data structures is an integral part of your Python education. This tutorial shows you how you can merge multiple lists into the “column” representation—a list of tuples. By studying these six different ways, you’ll not only understand how to solve this particular problem, you’ll also become a better coder overall.
Problem: Given a number of lists l1, l2, …, ln. How to merge them into a list of tuples (column-wise)?
Example: Say, you want to merge the following lists
This tutorial shows you different ways to merge multiple lists into a list of tuples in Python 3. You can get a quick overview in our interactive Python shell:
Exercise: Which method needs the least number of characters?
Method 1: Zip Function
The most Pythonic way that merges multiple lists into a list of tuples is the zip function. It accomplishes this in a single line of code—while being readable, concise, and efficient.
The zip() function takes one or more iterables and aggregates them to a single one by combining the i-th values of each iterable into a tuple. For example, zip together lists [1, 2, 3] and [4, 5, 6] to [(1,4), (2,5), (3,6)].
Note that the return value of the zip() function is a zip object. You need to convert it to a list using the list(...) constructor to create a list of tuples.
If you have stored the input lists in a single list of lists, the following method is best for you!
Method 2: Zip Function with Unpacking
You can use the asterisk operator*lst to unpack all inner elements from a given list lst. Especially if you want to merge many different lists, this can significantly reduce the length of your code. Instead of writing zip(lst[0], lst[1], ..., lst[n]), simplify to zip(*lst) to unpack all inner lists into the zip function and accomplish the same thing!
You can use a straightforward list comprehension statement [(l0[i], l1[i], l2[i]) for i in range(len(l0))] to merge multiple lists into a list of tuples:
l0 = [0, 'Alice', 4500.00]
l1 = [1, 'Bob', 6666.66]
l2 = [2, 'Liz', 9999.99] print([(l0[i], l1[i], l2[i]) for i in range(len(l0))])
This method is short and efficient. It may not be too readable for you if you’re a beginner coder—but advanced coders usually have no problems understanding this one-liner. If you love to learn everything there is about one-liner Python code snippets, check out my new book “Python One-Liners” (published with San Francisco Publisher NoStarch in 2020).
Method 4: Simple Loop
Sure, you can skip all the fancy Python and just use a simple loop as well! Here’s how this works:
l0 = [0, 'Alice', 4500.00]
l1 = [1, 'Bob', 6666.66]
l2 = [2, 'Liz', 9999.99] lst = []
for i in range(len(l0)): lst.append((l0[i], l1[i], l2[i]))
print(lst)
Especially coders who come to Python from another programming language such as Go, C++, or Java like this approach. They’re used to writing loops and they can quickly grasp what’s going on in this code snippet.
You can visualize the execution of this code snippet in the interactive widget:
Exercise: Click “Next” to see how the memory usage unfolds when running the code.
Method 5: Enumerate
The enumerate() method is considered to be better Python style in many scenarios—for example, if you want to iterate over all indices of a list. In my opinion, it’s slightly better than using range(len(l)). Here’s how you can use enumerate() in your code to merge multiple lists into a single list of tuples:
With Python’s map() function, you can apply a specific function to each element of an iterable. It takes two arguments:
Function: In most cases, this is a lambda function you define on the fly. This is the function which you are going to apply to each element of an…
Iterable: This is an iterable that you convert into a new iterable where each element is the result of the applied map() function.
The result is a map object. What many coders don’t know is that the map() function also allows multiple iterables. In this case, the lambda function takes multiple arguments—one for each iterable. It then creates an iterable of tuples and returns this as a result.
Here’s how you can create a list of tuples from a few given lists:
This is both an efficient and readable way to merge multiple lists into a list of tuples. The fact that it isn’t well-known to use the map() function with multiple arguments doesn’t make this less beautiful.
Where to Go From Here?
Enough theory, let’s get some practice!
To become successful in coding, you need to get out there and solve real problems for real people. That’s how you can become a six-figure earner easily. And that’s how you polish the skills you really need in practice. After all, what’s the use of learning theory that nobody ever needs?
Practice projects is how you sharpen your saw in coding!
Do you want to become a code master by focusing on practical code projects that actually earn you money and solve problems for people?
Then become a Python freelance developer! It’s the best way of approaching the task of improving your Python skills—even if you are a complete beginner.
The 188th GalaQuiz will be LIVE soon, win up to $50 in GalaCredit!
[www.indiegala.com] The GalaQuiz will take place in less than 15 minutes from this announcement Today's GalaQuiz[www.indiegala.com] hints are up. The theme will be Ernest Hemingway
DragonRuby is a game development framework powered by the Ruby programming language. It is lightweight and crossplatform with an easy to learn API. It is regularly $47USD, however it is currently included in the Bundle For Racial Justice currently running on Itch.io, along with hundreds of games for just $5.
Key features of DragonRuby include:
Dirt simple apis capable of creating complex 2D games.
Fast as hell. Powered by highly optimized C code written by Ryan C. Gordon, the creator of SDL (a library that powers every commercial game engine in the world).
Battle tested by Amir Rajan, a critically acclaimed indie game dev.
Tiny. Like really tiny. The entire engine is a few megabytes.
Hot loaded, realtime coding, optimized to provide constant feedback to the dev. Productive and an absolute joy to use.
Turn key builds for Windows, MacOS, and Linux with seamless publishing to Itch.io.
Cross platform: PC, Mac, Linux, iOS, Android, Nintendo Switch, XBOX One, and PS4 (mobile and console compilation requires a business entity, NDA verification, and a Professional GTK License, contact us).
You can learn more about DragonRuby in the video below.
If you work on any type of app that has a user interface (UI) you probably have experienced that inner-loop development cycle of making a change, compile and run the app, see the change wasn’t what you wanted, stop debugging, then re-run the cycle again. Depending on the frameworks or technology you use, there are options to improve this experience such as edit-and-continue, Xamarin Hot Reload, and design-time editors. Of course, nothing will show the UI of your app like…well, your app!
For ASP.NET WebForms we have had designers for a while allowing you to switch from your WebForms code view to the Design view to get an idea what the UI may look like. As modern UI frameworks have evolved and relied more on fragments or components of CSS/HTML/etc. this design view may not always reflect the UI:
And these frameworks and UI libraries are becoming more popular and common to a web developer’s experience. We ship them in the box as well with some of our Visual Studio templates! As we looked at some of the web trends and talked with customers in our user research labs we wanted to adapt to that philosophy that the best representation of your UI, data, state, etc. is your actual running app. And so that is what we are working on right now.
Starting today you can download our preview Visual Studio extension for a new editing mode we’re calling “web live preview.” The extension is available now so head on over to the Visual Studio Marketplace and download/install the “Web Live Preview” extension for Visual Studio 2019. Seriously, go do that now and just click install, then come back and read the rest. It will be ready for you when you’re done!
Using the extension
After installing the extension, in an ASP.NET web application you’ll now have an option that says “Edit in Browser” when right-clicking on an ASPX page:
This will launch your default browser with your app in a special mode. You should immediately notice a small difference in that your view has some adorners on it:
In this mode you can now interactively select elements on this view and see the selection synchronized with your source. Even if you select something that comes from a master page, the synchronization will open that page in Visual Studio to navigate to the selection.
So what you may say, well it’s not just selection synchronization, but source as well. You may have a web control and be selecting those elements and we know that, for example, that is an asp:DataGrid component. As you make changes to the source as well, they are immediately reflected in the running app. Notice no saving or no browser refresh happening:
When working with things like Razor pages, we can detect code as well and even interact within those blocks of code. Here in a Razor page I have a loop. Notice how the selection is identified as a code loop, but I can still make some modifications in the code and see it reflected in the running app:
So even in your code blocks within your HTML you can make edits and see them reflected in your running app, shortening that inner loop to smaller changes in your process.
But wait, there’s more!
If you already use browser developer tools you may be asking if this is a full replacement for that for you. And it probably is NOT and that is by design! We know web devs rely a lot on developer tools in browsers and we are experimenting as well with a little extension (for Edge/Chrome) that synchronizes in the rendered dev tools view as well. So now you have synchronization across source representation (including controls/code/static) to rendered app, and with dev tools DOM tree views…and both ways:
We have a lot more to do, hence this being a preview of our work so far.
Current constraints
With any preview there are going to be constraints, so here they are for the time of this writing. We eventually see this just being functionality for web developers in Visual Studio without installing anything else, so the extension is temporary. For now, we support the .NET Framework web project types for WebForms and MVC. Yes, we know, we know you want .NET Core and Blazor support. This is definitely on our roadmap, but we wanted to tackle some very known scenarios where our WebForms customers have been using design view for a while. We hear you and this has been echoed in our research as well…we are working on it!
For pure code changes outside of the ASPX/Razor pages we don’t have a full ‘hot reload’ story yet so you will have to refresh the browser in those cases where some fundamental object models are changing that you may rely on (new classes/functions/properties, changed data types, etc.). This is something that we hope to tackle more broadly for the .NET ecosystem and take all that we have learned from customers using similar experiments we have had in this area.
The extension works with Chromium-based browsers such as the latest Microsoft Edge and Google Chrome browsers. This also enables us to have a single browser developer tools extension that handles that integration as well. To use that browser extension, you will have to use developer mode in your browser and load the extension from disk. This process is fairly simple but you have to follow a few steps which are documented on adding and removing extensions in Edge. The location of the dev tools plugin is located at C:\Program Files (x86)\Microsoft Visual Studio\2019\Common7\IDE\Extensions\Microsoft\Web Live Preview\BrowserExtension (assuming you have the default Visual Studio 2019 install location and ensuring you specify Community/Professional/Enterprise you have installed). Please note this is also a temporary solution as we are in development of these capabilities. Any final browser tools extensions would be distributed in browser stores.
Summary
If you are one of our customers that can leverage this preview extension we’d love for you to download and install it and give it a try. If you have feedback or issues, please use the Visual Studio Feedback mechanism as that helps us get diagnostic information for any issues you may be facing. We know that you have a lot of tools at your disposal but we hope this web live preview mode will make some of your flow easier. Nothing to install into your project, no tool-specific code in your source, and (eventually) no additional tools to install. Please give it a try and let us know what you think!
On behalf of the team working on web tools for you, thank you for reading!
Apple releases teaser for Apple TV+ original ‘Little Voice’
Apple on Friday released a “first look” at Apple TV+ original series “Little Voice,” a J.J. Abrams-produced half-hour drama series set to debut in July.
First teased in May, Little Voice stars Brittany O’Grady and features original music by Grammy, Emmy and Tony Award-nominee Sara Bareilles.
The drama follows Bess King (O’Grady) as she navigates the New York music scene and deals with life issues like love and family. Sean Teale, Colton Ryan, Shalini Bathina, Kevin Valdez, Phillip Johnson Richardson and Chuck Cooper also star.
Today’s sneak peek features Bareilles singing “Little Voice” over snippets of the show. A full trailer has yet to see release.
[embedded content]
Little Voice is produced by Abrams’ Bad Robot Productions in association with Warner Bros. Television. Abrams, Bareilles, Ben Stephenson (“Westworld”) and Jessie Nelson (“I Am Sam,” “Stepmom,”) are listed as executive producers, with the latter writing and directing the first episode.
Little Voice streams on July 10 and joins other Apple TV+ originals including Golden Globe-nominated and Critics Choice and SAG award-winning series The Morning Show, sitcom Mythic Quest: Raven’s Banquet, Beastie Boys Story, The Banker and sci-fi epic See.
Sharing files with Fedora 32 using Samba is cross-platform, convenient, reliable, and performant.
What is ‘Samba’?
Samba is a high-quality implementation of Server Message Block protocol (SMB). Originally developed by Microsoft for connecting windows computers together via local-area-networks, it is now extensively used for internal network communications.
In this guide we provide the minimal instructions to enable:
Public Folder Sharing (Both Read Only and Read Write)
User Home Folder Access
Note about this guide: The convention '~]$' for a local user command prompt, and '~]#' for a super user prompt will be used.
Public Sharing Folder
Having a shared public place where authenticated users on an internal network can access files, or even modify and change files if they are given permission, can be very convenient. This part of the guide walks through the process of setting up a shared folder, ready for sharing with Samba.
Please Note: This guide assumes the public sharing folder is on a Modern Linux Filesystem; other filesystems such as NTFS or FAT32 will not work. Samba uses POSIX Access Control Lists (ACLs). For those who wish to learn more about Access Control Lists, please consider reading the documentation: "Red Hat Enterprise Linux 7: System Administrator's Guide: Chapter 5. Access Control Lists", as it likewise applies to Fedora 32. In General, this is only an issue for anyone who wishes to share a drive or filesystem that was created outside of the normal Fedora Installation process. (such as a external hard drive). It is possible for Samba to share filesystem paths that do not support POSIX ACLs, however this is out of the scope of this guide.
Create Folder
For this guide the /srv/public/ folder for sharing will be used.
The /srv/ directory contains site-specific data served by a Red Hat Enterprise Linux system. This directory gives users the location of data files for a particular service, such as FTP, WWW, or CVS. Data that only pertains to a specific user should go in the /home/ directory.
Make the Folder (will provide an error if the folder already exists).
~]# mkdir --verbose /srv/public Verify folder exists:
~]$ ls --directory /srv/public Expected Output: /srv/public
Set Filesystem Security Context
To have read and write access to the public folder the public_content_rw_t security context will be used for this guide. Those wanting read only may use: public_content_t.
Label files and directories that have been created with the public_content_rw_t type to share them with read and write permissions through vsftpd. Other services, such as Apache HTTP Server, Samba, and NFS, also have access to files labeled with this type. Remember that booleans for each service must be enabled before they can write to files labeled with this type.
Now that the folder has been added to the local system’s filesystem security context registry; The restorecon command can be used to ‘restore’ the context to the folder:
Restore security context to the /srv/public folder:
$~]# restorecon -Rv /srv/public Verify security context was correctly applied:
~]$ ls --directory --context /srv/public/ Expected Output: unconfined_u:object_r:public_content_rw_t:s0 /srv/public/
User Permissions
Creating the Sharing Groups
To allow a user to either have read only, or read and write accesses to the public share folder create two new groups that govern these privileges: public_readonly and public_readwrite.
User accounts can be granted access to read only, or read and write by adding their account to the respective group (and allow login via Samba creating a smb password). This process is demonstrated in the section: “Test Public Sharing (localhost)”.
Create the public_readonly and public_readwrite groups:
~]# groupadd public_readonly
~]# groupadd public_readwrite Verify successful creation of groups:
~]$ getent group public_readonly public_readwrite Expected Output: (Note: x:1...: number will probability differ on your System) public_readonly:x:1009:
public_readwrite:x:1010:
Set Permissions
Now set the appropriate user permissions to the public shared folder:
Set User and Group Permissions for Folder:
~]# chmod --verbose 2700 /srv/public
~]# setfacl -m group:public_readonly:r-x /srv/public
~]# setfacl -m default:group:public_readonly:r-x /srv/public
~]# setfacl -m group:public_readwrite:rwx /srv/public
~]# setfacl -m default:group:public_readwrite:rwx /srv/public Verify user permissions have been correctly applied:
~]$ getfacl --absolute-names /srv/public Expected Output: file: /srv/public
owner: root
group: root
flags: -s-
user::rwx
group::---
group:public_readonly:r-x
group:public_readwrite:rwx
mask::rwx
other::---
default:user::rwx
default:group::---
default:group:public_readonly:r-x
default:group:public_readwrite:rwx
default:mask::rwx
default:other::---
Samba
Installation
~]# dnf install samba
Hostname (systemwide)
Samba will use the name of the computer when sharing files; it is good to set a hostname so that the computer can be found easily on the local network.
View Your Current Hostname:
~]$ hostnamectl status
If you wish to change your hostname to something more descriptive, use the command:
Modify your system's hostname (example):
~]# hostnamectl set-hostname "simple-samba-server"
For a more complete overview of the hostnamectl command, please read the previous Fedora Magazine Article: "How to set the hostname on Fedora".
Firewall
Configuring your firewall is a complex and involved task. This guide will just have the most minimal manipulation of the firewall to enable Samba to pass through.
Allow Samba access through the firewall:
~]# firewall-cmd --add-service=samba --permanent
~]# firewall-cmd --reload Verify Samba is included in your active firewall:
~]$ firewall-cmd --list-services Output (should include): samba
Configuration
Remove Default Configuration
The stock configuration that is included with Fedora 32 is not required for this simple guide. In particular it includes support for sharing printers with Samba.
For this guide make a backup of the default configuration and create a new configuration file from scratch.
Create a backup copy of the existing Samba Configuration:
~]# cp --verbose --no-clobber /etc/samba/smb.conf /etc/samba/smb.conf.fedora0 Empty the configuration file:
~]# > /etc/samba/smb.conf
Samba Configuration
Please Note: This configuration file does not contain any global definitions; the defaults provided by Samba are good for purposes of this guide.
Edit the Samba Configuration File with Vim:
~]# vim /etc/samba/smb.conf
Add the following to /etc/samba/smb.conf file:
# smb.conf - Samba Configuration File # The name of the share is in square brackets [],
# this will be shared as //hostname/sharename # There are a three exceptions:
# the [global] section;
# the [homes] section, that is dynamically set to the username;
# the [printers] section, same as [homes], but for printers. # path: the physical filesystem path (or device)
# comment: a label on the share, seen on the network.
# read only: disable writing, defaults to true. # For a full list of configuration options,
# please read the manual: "man smb.conf". [global] [public]
path = /srv/public
comment = Public Folder
read only = No
Write Permission
By default Samba is not granted permission to modify any file of the system. Modify system’s security configuration to allow Samba to modify any filesystem path that has the security context of public_content_rw_t.
For convenience, Fedora has a built-in SELinux Boolean for this purpose called: smbd_anon_write, setting this to true will enable Samba to write in any filesystem path that has been set to the security context of public_content_rw_t.
For those who are wishing Samba only have a read-only access to their public sharing folder, they may choose skip this step and not set this boolean.
Set SELinux Boolean allowing Samba to write to filesystem paths set with the security context public_content_rw_t:
~]# setsebool -P smbd_anon_write=1 Verify bool has been correctly set:
$ getsebool smbd_anon_write Expected Output: smbd_anon_write --> on
Samba Services
The Samba service is divided into two parts that we need to start.
Samba ‘smb’ Service
The Samba “Server Message Block” (SMB) services is for sharing files and printers over the local network.
Enable and start smb and nmb services:
~]# systemctl enable smb.service
~]# systemctl start smb.service Verify smb service:
~]# systemctl status smb.service
Test Public Sharing (localhost)
To demonstrate allowing and removing access to the public shared folder, create a new user called samba_test_user, this user will be granted permissions first to read the public folder, and then access to read and write the public folder.
The same process demonstrated here can be used to grant access to your public shared folder to other users of your computer.
The samba_test_user will be created as a locked user account, disallowing normal login to the computer.
Create 'samba_test_user', and lock the account.
~]# useradd samba_test_user
~]# passwd --lock samba_test_user Set a Samba Password for this Test User (such as 'test'):
~]# smbpasswd -a samba_test_user
Test Read Only access to the Public Share:
Add samba_test_user to the public_readonly group:
~]# gpasswd --add samba_test_user public_readonly Login to the local Samba Service (public folder):
~]$ smbclient --user=samba_test_user //localhost/public First, the ls command should succeed,
Second, the mkdir command should not work,
and finally, exit:
smb: \> ls
smb: \> mkdir error
smb: \> exit Remove samba_test_user from the public_readonly group:
gpasswd --delete samba_test_user public_readonly
Test Read and Write access to the Public Share:
Add samba_test_user to the public_readwrite group:
~]# gpasswd --add samba_test_user public_readwrite Login to the local Samba Service (public folder):
~]$ smbclient --user=samba_test_user //localhost/public First, the ls command should succeed,
Second, the mkdir command should work,
Third, the rmdir command should work,
and finally, exit:
smb: \> ls
smb: \> mkdir success
smb: \> rmdir success
smb: \> exit Remove samba_test_user from the public_readwrite group: ~]# gpasswd --delete samba_test_user public_readwrite
After testing is completed, for security, disable the samba_test_user‘s ability to login in via samba.
Disable samba_test_user login via samba:
~]# smbpasswd -d samba_test_user
Home Folder Sharing
In this last section of the guide; Samba will be configured to share a user home folder.
For example: If the user bob has been registered with smbpasswd, bob’s home directory /home/bob, would become the share //server-name/bob.
This share will only be available for bob, and no other users.
This is a very convenient way of accessing your own local files; however naturally it carries at a security risk.
Setup Home Folder Sharing
Give Samba Permission for Public Folder Sharing
Set SELinux Boolean allowing Samba to read and write to home folders:
~]# setsebool -P samba_enable_home_dirs=1 Verify bool has been correctly set:
$ getsebool samba_enable_home_dirs Expected Output: samba_enable_home_dirs --> on
Add Home Sharing to the Samba Configuration
Append the following to the systems smb.conf file:
# The home folder dynamically links to the user home. # If 'bob' user uses Samba:
# The homes section is used as the template for a new virtual share: # [homes]
# ... (various options) # A virtual section for 'bob' is made:
# Share is modified: [homes] -> [bob]
# Path is added: path = /home/bob
# Any option within the [homes] section is appended. # [bob]
# path = /home/bob
# ... (copy of various options) # here is our share,
# same as is included in the Fedora default configuration. [homes] comment = Home Directories valid users = %S, %D%w%S browseable = No read only = No inherit acls = Yes
Reload Samba Configuration
Tell Samba to reload it's configuration:
~]# smbcontrol all reload-config
Test Home Directory Sharing
Switch to samba_test_user and create a folder in it's home directory:
~]# su samba_test_user
samba_test_user:~]$ cd ~
samba_test_user:~]$ mkdir --verbose test_folder
samba_test_user:~]$ exit Enable samba_test_user to login via Samba:
~]# smbpasswd -e samba_test_user Login to the local Samba Service (samba_test_user home folder):
$ smbclient --user=samba_test_user //localhost/samba_test_user Test (all commands should complete without error):
smb: \> ls
smb: \> ls test_folder
smb: \> rmdir test_folder
smb: \> mkdir home_success
smb: \> rmdir home_success
smb: \> exit Disable samba_test_userfrom login in via Samba:
~]# smbpasswd -d samba_test_user
The Pokémon Company Pledges A “Minimum” Of $5 Million For Charity
Today, The Pokémon Company has issued a statement announcing that it will donate a “minimum” of $5 million to charity.
The money will be going to nonprofit organisations working toward “improving the lives of children with a focus on diversity, equity and inclusion”. The notice comes after Pokémon GO developer Niantic revealed that it would be donating proceeds from Pokémon GO Fest 2020 ticket sales, also committing a minimum of $5 million to “fund new projects from Black gaming and AR creators” and for “US nonprofit organisations that are helping local communities rebuild”.
Here’s Pokémon’s full statement:
The Pokémon Company says that a list of charities receiving donations will be shared soon.
Last week, Pokémon also shared a message of solidarity to Black Lives Matter, as well as its employees and fans who “continue to be impacted by systemic racism and senseless violence”.
Posted by: xSicKxBot - 06-13-2020, 02:43 AM - Forum: Lounge
- No Replies
The Last Of Us Part 2 Review Roundup: What Are The Critics Saying?
The Last of Us Part II is still a week away from launching, and the general consensus from reviews is that it's going to feel like a long wait. The latest from Naughty Dog, The Last of Us Part II picks up a few years after the PS3 original, following Ellie on a bloody path of revenge. It's bleak, tragic and gut-wrenching, but a tale most reviews suggest you don't miss.
Overall critic reception has been incredibly positive, with a few caveats. In GameSpot's own 8/10 spoiler-free review for The Last of Us Part II, editor Kallie Plagge commends the game's strong characters and tense combat, but feels it suffers from pacing issues and uneven analysis of its themes. "In the second half of the game, these exploration issues persist, as do the horrors of combat and violence. But for reasons I can't explain due to spoiler restrictions, the narrative shifts significantly at a certain point, and the context of everything you've done up until then changes along with it. There's a lot I want to say that I'm not allowed to until the game is out, but this half of the game is the reason anything in it works at all. It examines a lot of the violence that happens early on, though not all the violence in general, and it's where the story finds its meaning." Take note that we'll be publishing another review (with the same score) that further explores the story and other spoiler-y elements once the embargo permits us to do so.
In the meantime, we've gathered additional reviews below, with the majority laying praise on the game's narrative and personal character writing. A lot of praise has also been given to the game's extensive accessibility options, allowing more players than ever to experience the game in a manner that is comfortable for them. For more reviews, check out our sister site Metacritic to see what other sites had to say. Plus, see our The Last of Us Part II pre-order guide for more information on pre-order bonuses and special editions.