ge

Coronavirus: UK warned to avoid climate change crisis

UK government advisors say post-pandemic recovery funds should go to firms reducing carbon emissions.




ge

Coronavirus: 'Modest' lockdown changes announced in Wales

People will be allowed to exercise outside more than once a day, First Minister Mark Drakeford says.




ge

Coronavirus lockdown: UK 'should not expect big changes'

The PM will set out a "cautious" road map for the UK in his speech on Sunday, a cabinet minister says.




ge

Climate change: Could the coronavirus crisis spur a green recovery?

Some governments want to channel their economic recovery plans into low-carbon industries.




ge

'B' teams or partner clubs back on the agenda? Clubs may have to 'share resources' to survive

The controversial concept of B teams may be back on the agenda as football tries to navigate a way through Covid-19, Brighton technical director Dan Ashworth says.




ge

Extra substitutes among temporary law changes when leagues resume

Teams will be allowed to use five substitutes when the season resumes after a Fifa proposal to help with fixture congestion was approved.




ge

India coronavirus: Why celebrating Covid-19 'success models' is dangerous

Experts tell the BBC that euphoria over success models runs the risk of people becoming complacent.




ge

Coronavirus: Belarus WW2 parade defies pandemic and upstages Putin

Belarus goes ahead with a Victory Day parade but in Russia coronavirus forced its cancellation.




ge

UK 'to bring in 14-day quarantine' for air passengers

An airline industry body says it has been told coronavirus quarantining will start from the end of May.




ge

Couples get married in virtual wedding ceremonies

Video calling technology is helping people share their special day with others during lockdown.




ge

Coronavirus: Lockdown life 'a challenge' for vulnerable children

Charities warn some children who are missing out on additional support at school are falling into crisis.




ge

Coronavirus and climate change a ‘double crisis’

Many activists have had to stop their usual work due to the pandemic. Here's how they're responding.




ge

Mother of killed Georgia man seeks justice

Wanda Cooper says her son, Ahmaud Arbery, was "hunted down like an animal and killed".




ge

Ahmaud Arbery: Joggers out in solidarity with the killed 25-year-old

People have been dedicating their workouts to Ahmaud Arbery who was shot and killed while out jogging.




ge

npm's CTO: So Long, and Thanks for All The Packages

#334 — April 16, 2020

Read on the Web

Node Weekly

npm Has Now (Actually) Joined GitHub — We announced GitHub’s acquisition of npm a month ago but now the process is complete. Not much real news here but the plan is to now focus on community engagement and improving registry infrastructure.

Jeremy Epling (GitHub)

Node v13.13.0 (Current) Releasedfs.readv is a new function to sequentially read from an array of ArrayBufferViews, util.inspect now lets you specify a maximum length for printed strings, the default maximum HTTP header size has been increased to 16KB, there are three new collaborators, and more.

Michaël Zasso

Get Better Insight into Redis with RedisGreen — Modern hosting and monitoring services include memory usage maps, seamless scaling, key size tracking, and more.

RedisGreen sponsor

▶  Watch the Live Coding of a New Feature for Node.js — This is not something for novices, but if the idea of watching ‘over the shoulder’ of a Node.js collaborator implementing a new feature directly into Node itself interests you.. this could be a valuable hour spent.

Vladimir de Turckheim

node-libcurl 2.1: libcurl Bindings for Nodelibcurl is a very powerful and well established way to fetch data from URLs across numerous protocols. node-libcurl 2.1.0 brings support for the latest version of libcurl (7.69.1) to us in the Node world.

Jonathan Cardoso Machado

npm's CTO: 'So Long, and Thanks for All The Packages!' — Ahmad Nassri was npm’s CTO but has now left. Here, he reflects on the past ten years of npm, the repo, the company, and the achievements of both.

Ahmad Nassri

???? Jobs

Find a Job Through Vettery — Vettery specializes in tech roles and is completely free for job seekers. Create a profile to get started.

Vettery

Node.js Developer at X-Team (Remote) — Join X-Team and work on projects for companies like Riot Games, FOX, Coinbase, and more. Work from anywhere.

X-Team

▶️ Get ready for your next role: Pluralsight is free for the entire month of April. Stay Home. Skill Up. #FreeApril — SPONSORED

???? Tutorials

Working With AWS Route 53 from Node — Route 53 is Amazon Web Services’ suite of DNS-related services. Like every AWS service, you can control it via an API, and here’s how to manipulate hosted zones from Node.

Valeri Karpov

Best Practices Learnt Running Express.js in Production for 4 Years — There’s a lot of stuff packed in here focused around middleware, testing, logging, and general concerns around scaling and keeping apps running in production.

Adnan Rahić

The Node.js Security Handbook — Improve the security of your Node.js app with the Node.js security handbook made for developers.

Sqreen sponsor

How To Set Up an Express API Backend Project with PostgreSQL — A pretty extensive walkthrough of creating an HTTP API using Express with Node.js and Postgres on the backend, then deploying it all on Heroku.

Chidi Orji

Porting to TypeScript Solved Our API Woes — From the guy behind the (in)famous Wat video comes a tale of porting a backend from Ruby to TypeScript.

Gary Bernhardt

How to Mass Rename Files in Node

Flavio Copes

▶  Let's Build a Digital Circuit Simulator In JavaScript — A special episode of the Low Level JavaScript series takes us on a brief journey into the world of digital logic.

Low Level JavaScript

The Story of How I Created a Way to Port Windows Apps to Linux — We mentioned ElectronCGI recently as a way to let .NET and Node.js code depend upon each other, but here its creator explains more about the how and why.

Rui Figueiredo

How to Create an Alexa Skill with Node — Implementing a custom ‘skill’ for Amazon Alexa by using Node and AWS Lambda.

Xavier Portilla Edo

???? Tools, Resources and Libraries

Node v10.20.1 (LTS) Released — If you’re still using Node 10, don’t use v10.20.0, use this, due to a bug in the .0 release.

Bethany Nicolle Griggs

emoji-regex: A Regular Expression to Match All Emoji-Only Symbols

Mathias Bynens

ip-num: A Library to Work with ASN, IPv4, and IPv6 Numbers — Happy in both Node and the browser.

dadepo

Optimize Node.js Performance with Distributed Tracing in Datadog

Datadog APM sponsor

verify-json: Verify JSON Using a Lightweight Schema — A lighter weight alternative to something like JSON Schema.

Yusuf Bhabhrawala

middle-manager: A Lightweight 'No BS' Presentation Tool — A bit of humor, really. It turns Markdown into basic presentations but then the magic is it detects your ‘BS’ business language so you can remove it ????

Anders




ge

Coronavirus: The month everything changed

In the space of a month, the United Kingdom has transformed beyond recognition.




ge

The actor who was really stabbed on stage

Conor Madden was playing Hamlet when a sword fight went badly wrong. Would he ever act again?




ge

Birth in a pandemic: 'You are stronger than you think'

Coronavirus is throwing many birth plans up in the air and leading some health trusts to increase home births.




ge

Coronavirus: what we can learn from the war generation

What can younger people learn from the generations that lived through World War Two?




ge

The shop where you can still buy huge bags of pasta

Wholesalers are opening their doors to members of the public keen to buy supplies in bulk.




ge

Bill Gates: Few countries will get 'A-grade' for coronavirus response

The Microsoft billionaire says we find ourselves in uncharted territory with the coronavirus pandemic.




ge

Coronavirus: Pint delivery service to challenge Belfast ban

A pub delivering Guinness to people's homes during lockdown says it was operating within the law.




ge

Coronavirus: Aer Lingus flight had 'no social distancing' says passenger

Sean Mallon's photos of an Aer Lingus Belfast-Heathrow flight showed passengers sitting close together.




ge

Millie Small: My Boy Lollipop singer dies aged 72

The singer, who had Jamaica's first million-selling single, dies after suffering a stroke.




ge

Brazil's Amazon: Surge in deforestation as military prepares to deploy

The military is preparing to deploy to the region to try to stop illegal logging and mining.




ge

Leveraging React for Easy Image Management

React is a good tool when it comes to building flexible and reusable UI components. However, it’s “one of those libraries” that cannot handle all the tasks involved in building a full fleshed UI project. Other supporting tools - such as a recently announced React SDK from Cloudinary - are available to provide solutions that the React core cannot.

In such cases where media (images and videos) becomes a heavy task to handle, Cloudinary simplifies the process with the new React SDK. Let’s build and image library with Cloudinary and React using the Cloudinary’s React SDK.

Prerequisites

The only requirements for using Cloudinary in your existing React project are to install the React SDK and the upload widget. If you do not have an existing React project and want to try these examples, take the following steps:

1. Install Dependencies

We need a minimal amount of dependencies so we can focus on building a media library and not structuring a React app:

{
  "name": "img-library",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "watch": "webpack -d --watch",
    "build": "webpack",
    "serve": "serve ./public"
  },
  "author": "",
  "license": "MIT",
  "devDependencies": {
    "babel-core": "^6.18.2",
    "babel-loader": "^6.2.9",
    "babel-preset-es2015": "^6.18.0",
    "babel-preset-react": "^6.16.0",
    "serve": "^1.4.0",
    "webpack": "^1.14.0"
  },
  "dependencies": {
    "axios": "^0.15.3",
    "cloudinary-react": "^1.0.1",
    "react": "^15.4.1",
    "react-dom": "^15.4.1"
  }
}

React (and React DOM) must be used since we are making a React app. The cloudinary-react dependency is Cloudinary’s React SDK, which we will soon see how it works. axios is a tool for making HTTP requests and, in our case, we will use it request images from the Cloudinary server.

# Install dependencies
npm install

2. Setup Webpack

Webpack is our build tool. Only minimal settings are required to have a build running and our React app compiling:

// ./webpack.config.js
var webpack = require('webpack');
var path = require('path');

var BUILD_DIR = path.resolve(__dirname, 'public');
var APP_DIR = path.resolve(__dirname, 'src');

var config = {
    entry: APP_DIR + '/index.jsx',
    output: {
        path: BUILD_DIR,
        filename: 'bundle.js'
    },
    module : {
        loaders : [
            {
                test : /.jsx?/,
                include : APP_DIR,
                loader : 'babel'
            }
        ]
    }
};

module.exports = config;

Basic configuration - an entry, output and loaders to handle the React .jsx files.

3. Entry Points

We need to create an entry point, as we specified in the Webpack configuration, and another entry point for the browser, which is an index.html file:

// ./src/index.jsx
import React, { Component } from 'react';
import { render } from 'react-dom';

class Main extends Component {
    render() {
        return (
           <div className="main">
               <h1>Scotchage</h1>
           </div>
        );
    }
}

render(<Main />, document.getElementById('container'));
<!-- ./public/index.html -->
<html>
<head>
    <!--Stylesheet-->
    <link rel="stylesheet" href="style.css">
    <meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
    <!--Container for React rendering-->
    <div id="container"></div>
    <!--Bundled file-->
    <script src="bundle.js"></script>
</body>
</html>

4. Create Cloudinary Account

You need a Cloudinary account to continue with these examples. Sign up for free and store your credentials safely as shown on the dashboard:

Uploading Images

Before using the React SDK to deliver images from the Cloudinary servers, let’s use the awesome Cloudinary upload widget to upload images. First, we need to add this widget to our index.html:

<!-- ./public/index.html -->
<html>
<head>
   . . .
</head>
<body>
    . . .
    <!-- UPLOAD WIDGET -->
    <script src="//widget.cloudinary.com/global/all.js" type="text/javascript"></script>
    <script src="bundle.js"></script>
</body>
</html>

Next, we create a button, attach an event to it and upload an image once the button is clicked:

import React, { Component } from 'react';
import { render } from 'react-dom';

class Main extends Component {

    uploadWidget() {
        cloudinary.openUploadWidget({ cloud_name: 'CLOUD_NAME', upload_preset: 'PRESET', tags:['xmas']},
            function(error, result) {
                console.log(result);
            });
    }
    render(){
        return (
            <div className="main">
                <h1>Galleria</h1>
                <div className="upload">
                    <button onClick={this.uploadWidget.bind(this)} className="upload-button">
                        Add Image
                    </button>
                </div>
            </div>

        );
    }
}

render(<Main />, document.getElementById('container'));

The uploadWidget member method is the handler invoked by the click event to handle our image upload by calling cloudinary.openUploadWidget. openUploadWidget takes a config object and the upload callback handler. The config object must have at least cloud_name and upload_preset properties with valid values. You can read more about Cloud Names and Upload Presets.

Delivering Images with SDK

The Cloudinary React SDK has three major components, Image, CloudinaryContext and Transformation:

  • Image: This component is responsible for the actual delivery of images. It takes the image ID and asks the server for this image. When the image is provided, it is also responsible for painting the image on the browser.
  • Transformation: This component is used to apply transformations to images delivered with Image.
  • CloudinaryContext: You can specify Cloudinary configuration for each image on the Image component. This can be tedious when you are dealing with multiple images. CloudinaryContext allows you to apply configuration to a group of Images.

Most times you would end up with a structure like this:

<CloudinaryContext>
    <Image>
        <Transformation />
        <Transformation />
    </Image>
    <Image>
        <Transformation />
    </Image>
</CloudinaryContext>

Back to our demo app, we can request an image from the Cloudinary server and display it with the following components:

import React, { Component } from 'react';
import axios from 'axios';
import { CloudinaryContext, Transformation, Image } from 'cloudinary-react';
import { render } from 'react-dom';

class Main extends Component {
    constructor(props) {
        super(props);
        this.state = {
            gallery: []
        }
    }
    componentDidMount() {
    // Request for images tagged xmas       
axios.get('http://res.cloudinary.com/christekh/image/list/xmas.json')
            .then(res => {
                console.log(res.data.resources);
                this.setState({gallery: res.data.resources});
            });
    }
    uploadWidget() {
       // . . .
    }
    render(){
        return (
            <div className="main">
                <h1>Galleria</h1>
                <div className="gallery">
                    <CloudinaryContext cloudName="CLOUDNAME">
                        {
                            this.state.gallery.map(data => {
                                return (
                                    <div className="responsive" key={data.public_id}>
                                        <div className="img">
                                            <a target="_blank" href={`http://res.cloudinary.com/christekh/image/upload/${data.public_id}.jpg`}>
                                                <Image publicId={data.public_id}>
                                                    <Transformation
                                                        crop="scale"
                                                        width="300"
                                                        height="200"
                                                        dpr="auto"
                                                        responsive_placeholder="blank"
                                                    />
                                                </Image>
                                            </a>
                                            <div className="desc">Created at {data.created_at}</div>
                                        </div>
                                    </div>
                                )
                            })
                        }
                    </CloudinaryContext>
                    <div className="clearfix"></div>
                </div>
            </div>

        );
    }
}

render(<Main />, document.getElementById('container'));

Take one more look at the upload code:

 cloudinary.openUploadWidget({ cloud_name: 'christekh', upload_preset: 'idcidr0h', tags:['xmas']},
            function(error, result) {
            . . .

Each image is tagged with xmas, which serves as a way to request images with this tag as a collection. This is exactly what we are using the axios library to do when the component mounts:

axios.get('http://res.cloudinary.com/CLOUDNAME/image/list/xmas.json')
            .then(res => {
                console.log(res.data.resources);
                this.setState({gallery: res.data.resources});
            });

axios uses promises, so whenever the promise resolves in our case, we have a payload of images. We take advantage of React state to update our UI with the fetched resources.

Down to rendering, we configure the CloudinaryContext with our cloud_name, iterate over the gallery state that stores the images and displays them using the Image component. We also apply few transformations using the Transformation component.

For security reasons, Cloudinary will not allow you to make such request from the client unless you tell it to. The best way to go is to use the admin API via a backend SDK and then send the resource list to the client.

Updating State with New Uploads

We are able to upload images and request for images to be displayed on the user’s browsers. Here is how we update the displayed images instantly when the user uploads a new image:

uploadWidget() {
        let _this = this;
        cloudinary.openUploadWidget({ cloud_name: 'CLOUDNAME', upload_preset: 'PRESET', tags:['xmas']},
            function(error, result) {
            // Update gallery state with newly uploaded image
                _this.setState({gallery: _this.state.gallery.concat(result)})
            });
    }

Rather than logging the uploaded image information to the console, we update the gallery state, which bears the list of requested images, by concatenating the uploaded result to the gallery.

Image Management Simplified

Image uploads, transformation and delivery has never been easier. These tasks have been a serious challenge for developers. Cloudinary has created a way to abstract all this hard work, enabling you to simply plug and play.




ge

A general view of the stadium during the FIFA U-17 World Cup India 2017 final

KOLKATA, INDIA - OCTOBER 27: A general view of the stadium during the FIFA U-17 World Cup India 2017 tournament at Vivekananda Yuba Bharati Krirangan on October 27, 2017 in Kolkata, India. (Photo by Tom Dulat - FIFA/FIFA via Getty Images)




ge

A general view of the stadium during the FIFA U-17 World Cup India 2017 final

KOLKATA, INDIA - OCTOBER 27: A general view of the stadium during the FIFA U-17 World Cup India 2017 tournament at Vivekananda Yuba Bharati Krirangan on October 27, 2017 in Kolkata, India. (Photo by Tom Dulat - FIFA/FIFA via Getty Images)




ge

A general view of the stadium during the FIFA U-17 World Cup India 2017 final

KOLKATA, INDIA - OCTOBER 27: A general view of the stadium during the FIFA U-17 World Cup India 2017 tournament at Vivekananda Yuba Bharati Krirangan on October 27, 2017 in Kolkata, India. (Photo by Tom Dulat - FIFA/FIFA via Getty Images)




ge

A general view of Spain dressing room

KOLKATA, INDIA - OCTOBER 28: A general view of Spain dressing room prior to the FIFA U-17 World Cup India 2017 Final match between England and Spain at Vivekananda Yuba Bharati Krirangan on October 28, 2017 in Kolkata, India. (Photo by Tom Dulat - FIFA/FIFA via Getty Images)




ge

A general view of Spain dressing room

KOLKATA, INDIA - OCTOBER 28: A general view of Spain dressing room prior to the FIFA U-17 World Cup India 2017 Final match between England and Spain at Vivekananda Yuba Bharati Krirangan on October 28, 2017 in Kolkata, India. (Photo by Tom Dulat - FIFA/FIFA via Getty Images)




ge

A general view of England dressing room

KOLKATA, INDIA - OCTOBER 28: A general view of England dressing room prior to the FIFA U-17 World Cup India 2017 Final match between England and Spain at Vivekananda Yuba Bharati Krirangan on October 28, 2017 in Kolkata, India. (Photo by Tom Dulat - FIFA/FIFA via Getty Images)




ge

A general view of England dressing room

KOLKATA, INDIA - OCTOBER 28: A general view of England dressing room prior to the FIFA U-17 World Cup India 2017 Final match between England and Spain at Vivekananda Yuba Bharati Krirangan on October 28, 2017 in Kolkata, India. (Photo by Tom Dulat - FIFA/FIFA via Getty Images)




ge

A general view of England dressing room

KOLKATA, INDIA - OCTOBER 28: A general view of England dressing room prior to the FIFA U-17 World Cup India 2017 Final match between England and Spain at Vivekananda Yuba Bharati Krirangan on October 28, 2017 in Kolkata, India. (Photo by Tom Dulat - FIFA/FIFA via Getty Images)




ge

A general view of England dressing room

KOLKATA, INDIA - OCTOBER 28: A general view of England dressing room prior to the FIFA U-17 World Cup India 2017 Final match between England and Spain at Vivekananda Yuba Bharati Krirangan on October 28, 2017 in Kolkata, India. (Photo by Tom Dulat - FIFA/FIFA via Getty Images)




ge

A general view of England dressing room prior to the FIFA U-17 World Cup India 2017 Final

KOLKATA, INDIA - OCTOBER 28: A general view of England dressing room prior to the FIFA U-17 World Cup India 2017 Final match between England and Spain at Vivekananda Yuba Bharati Krirangan on October 28, 2017 in Kolkata, India. (Photo by Tom Dulat - FIFA/FIFA via Getty Images)




ge

A general view of the Spain dressing room prior to the FIFA U-17 World Cup final

KOLKATA, INDIA - OCTOBER 28: (EDITOR'S NOTE: Image was created as an Equirectangular Panorama. Import image into a panoramic player to create an interactive 360 degree view) A general view of the Spain dressing room prior to the FIFA U-17 World Cup India 2017 Final match between England and Spain at Vivekananda Yuba Bharati Krirangan on October 28, 2017 in Kolkata, India. (Photo by Tom Dulat - FIFA/FIFA via Getty Images)




ge

A general view of action during the FIFA U-17 World Cup India 2017 3rd Place match

KOLKATA, INDIA - OCTOBER 28: A general view of action during the FIFA U-17 World Cup India 2017 3rd Place match between Brazil and Mali at Vivekananda Yuba Bharati Krirangan on October 28, 2017 in Kolkata, India. (Photo by Tom Dulat - FIFA/FIFA via Getty Images)




ge

A general view of the Spain team

KOLKATA, INDIA - OCTOBER 28: A general view of the Spain team prior to the FIFA U-17 World Cup India 2017 Final match between England and Spain at Vivekananda Yuba Bharati Krirangan on October 28, 2017 in Kolkata, India. (Photo by Tom Dulat - FIFA/FIFA via Getty Images)




ge

George McEachran of England battles for the ball with Cesar Gelabert of Spain

KOLKATA, INDIA - OCTOBER 28: George McEachran (L) of England battles for the ball with Cesar Gelabert of Spain during the FIFA U-17 World Cup India 2017 Final match between England and Spain at Vivekananda Yuba Bharati Krirangan on October 28, 2017 in Kolkata, India. (Photo by Buda Mendes - FIFA/FIFA via Getty Images)




ge

Joel Latibeaudiere of England battles for the ball with Cesar Gelabert of Spain

KOLKATA, INDIA - OCTOBER 28: Joel Latibeaudiere of England battles for the ball with Cesar Gelabert of Spain during the FIFA U-17 World Cup India 2017 Final match between England and Spain at Vivekananda Yuba Bharati Krirangan on October 28, 2017 in Kolkata, India. (Photo by Buda Mendes - FIFA/FIFA via Getty Images)




ge

George McEachran of England battles for the ball with Cesar Gelabert of Spain

KOLKATA, INDIA - OCTOBER 28: George McEachran (C) of England battles for the ball with Cesar Gelabert of Spain during the FIFA U-17 World Cup India 2017 Final match between England and Spain at Vivekananda Yuba Bharati Krirangan on October 28, 2017 in Kolkata, India. (Photo by Buda Mendes - FIFA/FIFA via Getty Images)




ge

Morgan Gibbs White of England and Cesar Gelabert of Spain in action

KOLKATA, INDIA - OCTOBER 28: Morgan Gibbs White of England and Cesar Gelabert of Spain in action during the FIFA U-17 World Cup India 2017 Final match between England and Spain at Vivekananda Yuba Bharati Krirangan on October 28, 2017 in Kolkata, India. (Photo by Tom Dulat - FIFA/FIFA via Getty Images)




ge

Marc Guehi (L) and Angel Gomes of England celebrate after the FIFA U-17 Worl

KOLKATA, INDIA - OCTOBER 28: Marc Guehi (L) and Angel Gomes of England celebrate after the FIFA U-17 World Cup India 2017 Final match between England and Spain at Vivekananda Yuba Bharati Krirangan on October 28, 2017 in Kolkata, India. (Photo by Buda Mendes - FIFA/FIFA via Getty Images)




ge

Angel Gomes of England celebrates with the FIFA U-17 World Cup trophy

KOLKATA, INDIA - OCTOBER 28: Angel Gomes of England celebrates after the FIFA U-17 World Cup India 2017 Final match between England and Spain at Vivekananda Yuba Bharati Krirangan on October 28, 2017 in Kolkata, India. (Photo by Buda Mendes - FIFA/FIFA via Getty Images)




ge

Angel Gomez and Joel Latibeaudiere of England lift the winners

KOLKATA, INDIA - OCTOBER 28: Angel Gomez and Joel Latibeaudiere of England lift the winners trophy during the FIFA U-17 World Cup India 2017 Final match between England and Spain at Vivekananda Yuba Bharati Krirangan on October 28, 2017 in Kolkata, India. (Photo by Jan Kruger - FIFA/FIFA via Getty Images)




ge

George McEachran celebrates with the trophy

KOLKATA, INDIA - OCTOBER 28: George McEachran celebrates with the trophy after winning the FIFA U-17 World Cup India 2017 Final match between England and Spain at Vivekananda Yuba Bharati Krirangan on October 28, 2017 in Kolkata, India. (Photo by Buda Mendes - FIFA/FIFA via Getty Images)




ge

FIFA President Gianni Infantino delivers the champion trophy to the captain Angel Gomes of England

KOLKATA, INDIA - OCTOBER 28: FIFA President Gianni Infantino delivers the champion trophy to the captain Angel Gomes of England after the FIFA U-17 World Cup India 2017 Final match between England and Spain at Vivekananda Yuba Bharati Krirangan on October 28, 2017 in Kolkata, India. (Photo by Jan Kruger - FIFA/FIFA via Getty Images)




ge

England manager Steve Cooper celebrates after the 5th goal

KOLKATA, INDIA - OCTOBER 28: England manager Steve Cooper celebrates after the 5th goal during the FIFA U-17 World Cup India 2017 Final match between England and Spain at Vivekananda Yuba Bharati Krirangan on October 28, 2017 in Kolkata, India. (Photo by Jan Kruger - FIFA/FIFA via Getty Images)




ge

England manager Steve Cooper celebrates with the trophy

KOLKATA, INDIA - OCTOBER 28: England manager Steve Cooper celebrates with the trophy during the FIFA U-17 World Cup India 2017 Final match between England and Spain at Vivekananda Yuba Bharati Krirangan on October 28, 2017 in Kolkata, India. (Photo by Jan Kruger - FIFA/FIFA via Getty Images)