text:
package org.apache.camel.component.platform.http.vertx;

import java.io.File;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;

import javax.activation.DataHandler;

import io.vertx.core.VertxOptions;
import io.vertx.ext.web.handler.BodyHandler;
import org.apache.camel.CamelContext;
import org.apache.camel.attachment.AttachmentMessage;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.platform.http.PlatformHttpComponent;
import org.apache.camel.impl.DefaultCamelContext;
import org.apache.camel.support.jsse.KeyManagersParameters;
import org.apache.camel.support.jsse.KeyStoreParameters;
import org.apache.camel.support.jsse.SSLContextParameters;
import org.apache.camel.support.jsse.SSLContextServerParameters;
import org.apache.camel.support.jsse.TrustManagersParameters;
import org.apache.camel.test.AvailablePortFinder;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;

import static io.restassured.RestAssured.given;
import static org.assertj.core.api.Assertions.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;

public class VertxPlatformHttpEngineTest {
    public static SSLContextParameters serverSSLParameters;
    public static SSLContextParameters clientSSLParameters;

    @BeforeAll
    public static void setUp() {
        serverSSLParameters = new SSLContextParameters();
        clientSSLParameters = new SSLContextParameters();

        KeyStoreParameters keystoreParameters = new KeyStoreParameters();
        keystoreParameters.setResource("jsse/service.jks");
        keystoreParameters.setPassword("security");

        KeyManagersParameters serviceSSLKeyManagers = new KeyManagersParameters();
        serviceSSLKeyManagers.setKeyPassword("security");
        serviceSSLKeyManagers.setKeyStore(keystoreParameters);

        serverSSLParameters.setKeyManagers(serviceSSLKeyManagers);

        KeyStoreParameters truststoreParameters = new KeyStoreParameters();
        truststoreParameters.setResource("jsse/truststore.jks");
        truststoreParameters.setPassword("storepass");

        TrustManagersParameters clientAuthServiceSSLTrustManagers = new TrustManagersParameters();
        clientAuthServiceSSLTrustManagers.setKeyStore(truststoreParameters);
        serverSSLParameters.setTrustManagers(clientAuthServiceSSLTrustManagers);
        SSLContextServerParameters clientAuthSSLContextServerParameters = new SSLContextServerParameters();
        clientAuthSSLContextServerParameters.setClientAuthentication("REQUIRE");
        serverSSLParameters.setServerParameters(clientAuthSSLContextServerParameters);

        TrustManagersParameters clientSSLTrustManagers = new TrustManagersParameters();
        clientSSLTrustManagers.setKeyStore(truststoreParameters);
        clientSSLParameters.setTrustManagers(clientSSLTrustManagers);

        KeyManagersParameters clientAuthClientSSLKeyManagers = new KeyManagersParameters();
        clientAuthClientSSLKeyManagers.setKeyPassword("security");
        clientAuthClientSSLKeyManagers.setKeyStore(keystoreParameters);
        clientSSLParameters.setKeyManagers(clientAuthClientSSLKeyManagers);
    }

    @Test
    public void testEngineSetup() throws Exception {
        final int port = AvailablePortFinder.getNextAvailable();
        final CamelContext context = new DefaultCamelContext();

        try {
            VertxPlatformHttpServerConfiguration conf = new VertxPlatformHttpServerConfiguration();
            conf.setBindPort(port);

            context.addService(new VertxPlatformHttpServer(conf));
            context.start();

            assertThat(VertxPlatformHttpRouter.lookup(context)).isNotNull();
            assertThat(context.getComponent("platform-http")).isInstanceOfSatisfying(PlatformHttpComponent.class, component -> {
                assertThat(component.getEngine()).isInstanceOf(VertxPlatformHttpEngine.class);
            });

        } finally {
            context.stop();
        }
    }

    @Test
    public void testEngine() throws Exception {
        final int port = AvailablePortFinder.getNextAvailable();
        final CamelContext context = new DefaultCamelContext();

        try {
            VertxPlatformHttpServerConfiguration conf = new VertxPlatformHttpServerConfiguration();
            conf.setBindPort(port);

            context.addService(new VertxPlatformHttpServer(conf));
            context.addRoutes(new RouteBuilder() {
                @Override
                public void configure() throws Exception {
                    from("platform-http:/get")
                            .routeId("get")
                            .setBody().constant("get");
                    from("platform-http:/post")
                            .routeId("post")
                            .transform().body(String.class, b -> b.toUpperCase());
                }
            });

            context.start();

            given()
                    .port(conf.getBindPort())
                    .when()
                    .get("/get")
                    .then()
                    .statusCode(200)
                    .body(equalTo("get"));

            given()
                    .port(conf.getBindPort())
                    .body("post")
                    .when()
                    .post("/post")
                    .then()
                    .statusCode(200)
                    .body(equalTo("POST"));

        } finally {
            context.stop();
        }
    }

    @Test
    public void testSlowConsumer() throws Exception {
        final int port = AvailablePortFinder.getNextAvailable();
        final CamelContext context = new DefaultCamelContext();

        try {
            VertxPlatformHttpServerConfiguration conf = new VertxPlatformHttpServerConfiguration();
            conf.setBindPort(port);

            context.getRegistry().bind(
                    "vertx-options",
                    new VertxOptions()
                            .setMaxEventLoopExecuteTime(2)
                            .setMaxEventLoopExecuteTimeUnit(TimeUnit.SECONDS));

            context.addService(new VertxPlatformHttpServer(conf));
            context.addRoutes(new RouteBuilder() {
                @Override
                public void configure() throws Exception {
                    from("platform-http:/get")
                            .routeId("get")
                            .process(e -> Thread.sleep(TimeUnit.SECONDS.toMillis(3)))
                            .setBody().constant("get");
                }
            });

            context.start();

            given()
                    .port(conf.getBindPort())
                    .when()
                    .get("/get")
                    .then()
                    .statusCode(200)
                    .body(equalTo("get"));

        } finally {
            context.stop();
        }
    }

    @Test
    public void testFailingConsumer() throws Exception {
        final int port = AvailablePortFinder.getNextAvailable();
        final CamelContext context = new DefaultCamelContext();

        try {
            VertxPlatformHttpServerConfiguration conf = new VertxPlatformHttpServerConfiguration();
            conf.setBindPort(port);

            context.addService(new VertxPlatformHttpServer(conf));
            context.addRoutes(new RouteBuilder() {
                @Override
                public void configure() throws Exception {
                    from("platform-http:/get")
                            .routeId("get")
                            .process(exchange -> {
                                throw new RuntimeException();
                            });
                }
            });

            context.start();

            given()
                    .port(conf.getBindPort())
                    .when()
                    .get("/get")
                    .then()
                    .statusCode(500);

        } finally {
            context.stop();
        }
    }

    @Test
    public void testEngineSSL() throws Exception {
        VertxPlatformHttpServerConfiguration conf = new VertxPlatformHttpServerConfiguration();
        conf.setSslContextParameters(serverSSLParameters);
        conf.setBindPort(AvailablePortFinder.getNextAvailable());

        CamelContext context = new DefaultCamelContext();

        try {
            context.addService(new VertxPlatformHttpServer(conf));
            context.getRegistry().bind("clientSSLContextParameters", clientSSLParameters);

            context.addRoutes(new RouteBuilder() {
                @Override
                public void configure() throws Exception {
                    from("platform-http:/")
                            .transform().body(String.class, b -> b.toUpperCase());
                }
            });

            context.start();

            String result = context.createFluentProducerTemplate()
                    .toF("https://localhost:%d?sslContextParameters=#clientSSLContextParameters", conf.getBindPort())
                    .withBody("test")
                    .request(String.class);

            assertThat(result).isEqualTo("TEST");
        } finally {
            context.stop();
        }
    }

    @Test
    public void testEngineGlobalSSL() throws Exception {
        VertxPlatformHttpServerConfiguration conf = new VertxPlatformHttpServerConfiguration();
        conf.setUseGlobalSslContextParameters(true);
        conf.setBindPort(AvailablePortFinder.getNextAvailable());

        CamelContext context = new DefaultCamelContext();

        try {
            context.setSSLContextParameters(serverSSLParameters);
            context.addService(new VertxPlatformHttpServer(conf));
            context.getRegistry().bind("clientSSLContextParameters", clientSSLParameters);

            context.addRoutes(new RouteBuilder() {
                @Override
                public void configure() throws Exception {
                    from("platform-http:/")
                            .transform().body(String.class, b -> b.toUpperCase());
                }
            });

            context.start();

            String result = context.createFluentProducerTemplate()
                    .toF("https://localhost:%d?sslContextParameters=#clientSSLContextParameters", conf.getBindPort())
                    .withBody("test")
                    .request(String.class);

            assertThat(result).isEqualTo("TEST");
        } finally {
            context.stop();
        }
    }

    @Test
    public void testEngineCORS() throws Exception {
        VertxPlatformHttpServerConfiguration conf = new VertxPlatformHttpServerConfiguration();
        conf.setBindPort(AvailablePortFinder.getNextAvailable());
        conf.getCors().setEnabled(true);
        conf.getCors().setMethods(Arrays.asList("GET", "POST"));

        CamelContext context = new DefaultCamelContext();

        try {
            context.addService(new VertxPlatformHttpServer(conf));
            context.addRoutes(new RouteBuilder() {
                @Override
                public void configure() throws Exception {
                    from("platform-http:/")
                            .transform().constant("cors");
                }
            });

            context.start();

            final String origin = "http://custom.origin.quarkus";
            final String methods = "GET,POST";
            final String headers = "X-Custom";

            given()
                    .port(conf.getBindPort())
                    .header("Origin", origin)
                    .header("Access-Control-Request-Method", methods)
                    .header("Access-Control-Request-Headers", headers)
                    .when()
                    .get("/")
                    .then()
                    .statusCode(200)
                    .header("Access-Control-Allow-Origin", origin)
                    .header("Access-Control-Allow-Methods", methods)
                    .header("Access-Control-Allow-Headers", headers);
        } finally {
            context.stop();
        }
    }

    @Test
    public void testMatchOnUriPrefix() throws Exception {
        VertxPlatformHttpServerConfiguration conf = new VertxPlatformHttpServerConfiguration();
        conf.setBindPort(AvailablePortFinder.getNextAvailable());

        CamelContext context = new DefaultCamelContext();
        try {
            final String greeting = "Hello Camel";
            context.addService(new VertxPlatformHttpServer(conf));
            context.addRoutes(new RouteBuilder() {
                @Override
                public void configure() throws Exception {
                    from("platform-http:/greeting/{name}?matchOnUriPrefix=true")
                            .transform().simple("Hello ${header.name}");
                }
            });

            context.start();

            given()
                    .port(conf.getBindPort())
                    .when()
                    .get("/greeting")
                    .then()
                    .statusCode(404);

            given()
                    .port(conf.getBindPort())
                    .when()
                    .get("/greeting/Camel")
                    .then()
                    .statusCode(200)
                    .body(equalTo(greeting));

            given()
                    .port(conf.getBindPort())
                    .when()
                    .get("/greeting/Camel/other/path/")
                    .then()
                    .statusCode(200)
                    .body(equalTo(greeting));
        } finally {
            context.stop();
        }
    }

    @Test
    public void testFileUpload() throws Exception {
        final int port = AvailablePortFinder.getNextAvailable();
        final String fileContent = "Test multipart upload content";
        final File tempFile = File.createTempFile("platform-http", ".txt");
        final CamelContext context = new DefaultCamelContext();

        try {
            VertxPlatformHttpServerConfiguration conf = new VertxPlatformHttpServerConfiguration();
            conf.setBindPort(port);

            VertxPlatformHttpServerConfiguration.BodyHandler bodyHandler
                    = new VertxPlatformHttpServerConfiguration.BodyHandler();
            bodyHandler.setUploadsDirectory(tempFile.getParent());
            conf.setBodyHandler(bodyHandler);

            Files.write(tempFile.toPath(), fileContent.getBytes(StandardCharsets.UTF_8));

            context.addService(new VertxPlatformHttpServer(conf));
            context.addRoutes(new RouteBuilder() {
                @Override
                public void configure() throws Exception {
                    from("platform-http:/upload")
                            .process(exchange -> {
                                AttachmentMessage message = exchange.getMessage(AttachmentMessage.class);
                                DataHandler attachment = message.getAttachment(tempFile.getName());
                                message.setBody(attachment.getContent());
                            });
                }
            });

            context.start();

            given()
                    .port(conf.getBindPort())
                    .multiPart(tempFile)
                    .when()
                    .post("/upload")
                    .then()
                    .statusCode(200)
                    .body(is(fileContent));
        } finally {
            context.stop();
        }
    }
}

redpajama_set_name: RedPajamaGithub


text:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<title>Uses of Class org.springframework.web.servlet.view.AbstractUrlBasedView (Spring Framework 5.1.18.RELEASE API)</title>
<meta name="date" content="2020-09-15">
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">

JavaScript is disabled on your browser.

Skip navigation links

Overview

Package

Class

Use

Tree

Deprecated

Index

Help

Spring Framework

Prev

Next

Frames

No Frames

All Classes

Uses of Class
org.springframework.web.servlet.view.AbstractUrlBasedView

Packages that use AbstractUrlBasedView

Package
Description

org.springframework.web.servlet.view

Provides standard View and ViewResolver implementations,
 including abstract base classes for custom implementations.

org.springframework.web.servlet.view.document

Support classes for document generation,
 providing View implementations for PDF and Excel.

org.springframework.web.servlet.view.freemarker

Support classes for the integration of
 FreeMarker
 as Spring web view technology.

org.springframework.web.servlet.view.groovy

Support classes for the integration of

 Groovy Templates as Spring web view technology.

org.springframework.web.servlet.view.script

Support classes for views based on the JSR-223 script engine abstraction
 (as included in Java 6+), e.g.

org.springframework.web.servlet.view.tiles3

Support classes for the integration of
 Tiles 3
 (the standalone version of Tiles) as Spring web view technology.

org.springframework.web.servlet.view.xslt

Support classes for XSLT,
 providing a View implementation for XSLT stylesheets.

Uses of AbstractUrlBasedView in org.springframework.web.servlet.view

Subclasses of AbstractUrlBasedView in org.springframework.web.servlet.view

Modifier and Type
Class and Description

class
AbstractTemplateView

Adapter base class for template-based view technologies such as FreeMarker,
 with the ability to use request and session attributes in their model and
 the option to expose helper objects for Spring's FreeMarker macro library.

class
InternalResourceView

Wrapper for a JSP or other resource within the same web application.

class
JstlView

Specialization of InternalResourceView for JSTL pages,
 i.e.

class
RedirectView

View that redirects to an absolute, context relative, or current request
 relative URL.

Methods in org.springframework.web.servlet.view that return AbstractUrlBasedView

Modifier and Type
Method and Description

protected AbstractUrlBasedView
AbstractTemplateViewResolver.buildView(String viewName)

protected AbstractUrlBasedView
UrlBasedViewResolver.buildView(String viewName)

Creates a new View instance of the specified view class and configures it.

protected AbstractUrlBasedView
InternalResourceViewResolver.buildView(String viewName)

Methods in org.springframework.web.servlet.view with parameters of type AbstractUrlBasedView

Modifier and Type
Method and Description

protected View
UrlBasedViewResolver.applyLifecycleMethods(String viewName,
                     AbstractUrlBasedView view)

Apply the containing ApplicationContext's lifecycle methods
 to the given View instance, if such a context is available.

Uses of AbstractUrlBasedView in org.springframework.web.servlet.view.document

Subclasses of AbstractUrlBasedView in org.springframework.web.servlet.view.document

Modifier and Type
Class and Description

class
AbstractPdfStamperView

Abstract superclass for PDF views that operate on an existing
 document with an AcroForm.

Uses of AbstractUrlBasedView in org.springframework.web.servlet.view.freemarker

Subclasses of AbstractUrlBasedView in org.springframework.web.servlet.view.freemarker

Modifier and Type
Class and Description

class
FreeMarkerView

View using the FreeMarker template engine.

Uses of AbstractUrlBasedView in org.springframework.web.servlet.view.groovy

Subclasses of AbstractUrlBasedView in org.springframework.web.servlet.view.groovy

Modifier and Type
Class and Description

class
GroovyMarkupView

An AbstractTemplateView subclass based on Groovy XML/XHTML markup templates.

Uses of AbstractUrlBasedView in org.springframework.web.servlet.view.script

Subclasses of AbstractUrlBasedView in org.springframework.web.servlet.view.script

Modifier and Type
Class and Description

class
ScriptTemplateView

An AbstractUrlBasedView subclass designed to run any template library
 based on a JSR-223 script engine.

Uses of AbstractUrlBasedView in org.springframework.web.servlet.view.tiles3

Subclasses of AbstractUrlBasedView in org.springframework.web.servlet.view.tiles3

Modifier and Type
Class and Description

class
TilesView

View implementation that renders
 through the Tiles Request API.

Uses of AbstractUrlBasedView in org.springframework.web.servlet.view.xslt

Subclasses of AbstractUrlBasedView in org.springframework.web.servlet.view.xslt

Modifier and Type
Class and Description

class
XsltView

XSLT-driven View that allows for response context to be rendered as the
 result of an XSLT transformation.

Methods in org.springframework.web.servlet.view.xslt that return AbstractUrlBasedView

Modifier and Type
Method and Description

protected AbstractUrlBasedView
XsltViewResolver.buildView(String viewName)

Skip navigation links

Overview

Package

Class

Use

Tree

Deprecated

Index

Help

Spring Framework

Prev

Next

Frames

No Frames

All Classes


text:
Posts Tagged 'Copenhagen'
Nopenhagen saviors US, China deserve praise
In the fallout from last month's failed climate change conference, the US and China emerged as villains. But the real blame for turning Copenhagen into Nopenhagen rests with the UN, small developing countries, and environmental groups. Those parties had little to contribute to the negotiations and were committed a flawed concept that, even it had been adopted, would not have effectively curbed emissions. The US and China, countries that really can make a difference in emissions, came up with a plan that can actually help save the planet, and they deserve to be praised for it.
Totally globalized native New Yorker and former broadcast news producer Muhammad Cohen is author of Hong Kong On Air , a novel set in his adopted hometown during the 1997 handover about television news, love, betrayal, financial crisis, and cheap lingerie.
Tags:Ban Ki-moon, BASIC group, climate change, Copenhagen, Earth Day, environmental groups, environmental movement, global warming, greenhouse gas emissions, Hong Kong, Hong Kong On Air, Kyoto Protocol, NGOs, UN, UN Framework Conference on Climate Change, UNFCCC Copenhagen 2009, US-China relations
No Friends of the Earth
I'm a true believer in saving the planet, active since the first Earth Day nearly 40 years ago, and participating in a beach clean up on September 19 as part of Clean Up the World Day. But overall, I'm absolutely sick about how little has been achieved in all these decades. The surge of attention to climate change is the best hope in my lifetime for meaningful progress to save the planet. But the UN and its green group allies will fail to seize this opportunity unless they dramatically change their approach, and do it fast.
UN Secretary General Ban Ki-moon has called a summit of world leaders for September 22 to energize stalled negotiations for a new global climate change treaty to be signed in Copenhagen in December. But the UN's new treaty incorporates and deepens the flaws of its predecessor, the Kyoto Protocol. Kyoto placed restrictions on just 40 industrialized countries while letting the rest of world, including number one greenhouse gas emitter China, continue to spew at will. Those flaws led the US to shun Kyoto, leaving more than 70 percent global emission beyond the scope of Kyoto. Predictably, Kyoto has failed to cut greenhouse gas emissions.
For Kyoto's successor, the stakes are even higher. Developing countries represent half of current emissions and up to three-fourths of projected emissions growth in the next decade, the crucial time to prevent a more than two degrees Celsius that scientists say would radically alter life as we know it. After Kyoto's failure, you'd expect to lean on developing countries for cuts and reach out to the US, recognizing its potential to provide missing leadership and technological innovation. Instead, the UN embraced nearly 1,000 non-governmental organizations (NGOs), most of which demonize the US and champion "climate justice," the right of developing countries to destroy as much of the environment as industrialized countries did. So Kyoto's developing country exemption remains, along with a new demand that the US and its industrialized allies pay an estimated US$140 billion a year to developing countries; the UN and NGOs stand ready to serve as siphons – I mean vehicles – for that funding.
Little wonder industrialized nations haven't warmed to the talks, even though the Obama administration wants to address climate change constructively. The UN and its NGO allies are letting their politics get in the way of finding solutions. For both, failure on this issue would extend a decades-long legacy of futility. Given their record of failure, most green groups should disband if they truly want to help Mother Earth.
Tags:Ban Ki-moon, Clean Up the World Day, climate change, Copenhagen, Earth Day, environmental groups, environmental movement, global warming, greenhouse gas emissions, Hong Kong, Hong Kong On Air, Kyoto Protocol, NGOs, UN, UN Climate Summit 2009, UN Framework Conference on Climate Change, UNFCCC Copenhagen 2009

redpajama_set_name: RedPajamaCommonCrawl


People who view your pictures will be able to pick up on your mood when the photos were taken. Not to deter you off your course, obviously, but any photographer worth his or her salt must be more than willing to practice a few new tactics to use out there when snapping photos.
A good tip you can use when shooting photographs is to practice using digital techniques. With the right techniques, you can make your photos look like classic works of art. Many software packages are available, with Adobe Photoshop being the most popular. You can easily use a "filter" to turn them into art, just by choosing the selection you want and clicking it.
Apply digital techniques in order to make pictures that look like watercolors, oil paintings, graphic pencil sketches, etc. There are various image editing software for digital photos, but the program Adobe Photoshop, is pretty much the industry standard. You will be able to instantly convert the photo into artistic portraits with the simple click of the filter button and choosing the medium that you prefer.
When shooting landscapes, it is important for you to create depth within the image. Put a person in the foreground to get the sense of scale of the surroundings. A small aperture, usually smaller than f/8 in many digital cameras and f/16 for SLR's, allows greater sharpness throughout the entire picture.
Framing the subject in a photo is very important. Make sure to zoom in on the focus of the picture, and keep distracting elements out of the picture. This helps your photo remain clutter-free without distracting elements.
Skies that are overcast should be avoided in photographs. A gray sky is going to make your pictures look washed-out. If you find yourself shooting into overcast skies, taking classic, black and white photos may be your best option. If the sky is blue, you should put it in your photo, but be careful of the light.
Get into the habit of adjusting the white balance on your camera. When taking shots inside, you generally have a yellow cast due to the light bulbs. If you adjust your camera's white balance, you will have better results with indoor shots. The professionalism should be much more apparent in your photos by using this technique.
A major part in photography composition would be the framing. Make sure to zoom in on the focus of the picture, and keep distracting elements out of the picture. When you do this, you avoid having a cluttered photo with unintended focal points.
Try to experiment with colors, angles and the different features of your camera. You don't need spectacular subjects to get spectacular pictures. A skilled photographer can take even the most overshot subject and create an image which is creative and jaw-dropping. Try many different methods to develop your style.
Be creative with colors, focus, angles, and lighting. You don't have to shoot a unique subject to capture a great photo. A skilled photographer with an artistic eye can turn a mundane subject into an exceptional picture. You will find your own style as you experiment.
Be sure to keep informative notes of the photographs that you take. As your collection grows, it will become more and more difficult to remember the details, such as where and when you took a particular shot. Use a notepad to record numbers of photos and descriptions.
Take shots of people you see in your day. Always get their permission first. When traveling, looking at these pictures will remind you of particular memories, even if the people you photographed do not look like they would stand out from a crowd at the moment when you take your picture. Seek out spontaneous actions and everyday attire.
When your perfect shot is in view, stay still and hold your breath when you push the shutter. Slight movements can decrease the quality of a shot. A fast shutter speed, a higher ISO setting and opening up the aperture to allow in more light are all effective at helping to minimize blur in handheld shots.
Consider documenting your souvenirs with photography during your travels. You may take a photo of the store it was bought in or shoot the object with a unique background. These pictures can be placed in an album to create the story of your trip, with memories to treasure in future years.
Adjusting the white balance setting of your camera to a proper level makes a lot of sense if you are shooting inside with fluorescent lights. Fluorescent lighting usually gives off bluish and greenish light, so subjects may take on a cooler tone than you intend without compensating for the lack of red tones with your camera.
Be more creative using limitation. You could restrict yourself to taking pictures intended to represent one concept (like "sweetness") all day, for instance. You might try shooting 100 photos from a particular viewpoint or inside the same room. Limitations can often times allow us to see beautiful, or unique things, that would have otherwise gone undetected.
Every time you change subjects or backgrounds, take some practice shots to see how your settings are working with the shot. Every photographic opportunity is different, and taking several practice shots can help you figure out the best way to approach the picture. In hectic environments, the lighting can change from second to second, so don't feel the need to count every shot as a "real" shot.
Enhance your photograph with a silhouette. There are other ways beside the sun to create a type of silhouette. If your background is brighter than your subject, you will be able to see a silhouette. You can easily create this effect by having a flash go off behind your subject or even just using a brightly lit window. Although these images can be beautiful, sometimes they can focus on unflattering outlines, so keep this in mind.
If you want to create a powerful look for your subject, take your photo from a low vantage point, looking upward. Take the picture angled downwards to demean the object. There are great instances to use these tips, and practice can help you find out when that time is.
Shoot your subjects from a variety of angles to find a unique perspective. Unique angles bring a new dimension into your photography. View your potential shots from above the subject or from ground level upwards. Other interesting alternatives are framing your subject from a diagonal or sideways view.
You can use your cell phone camera in a pinch, but remember that they are limited, especially with lighting. The majority of phone cameras lack a built in flash, or the flash is not very effective. Keep that in mind when taking photos and position your subject to take advantage of the light available. Use zoom to keep shadows and sunspots out of the shot.
You can be the editor of your own photos! Software designed for image editing is readily available in the marketplace. Choose a program that is packed with features and allows you a great deal of freedom in editing and enhancing your photographs. Make sure you can use it easily as well!
Think of how you will use your photograph before taking the picture. For example, should it be shot horizontally or vertically? While it is possible to edit the picture after it's been taken, it's better to try and capture the moment as you imagine its final form.
Get closer to your subject. When you frame a shot, you want to move close to your subject, or correctly use the zoom feature. Make the photo's subject fill the frame. If you have too much going on in the background, even if it is scenic, can make you lose focus of the subject. Your photo will contain more details if you are closer to it as well.
Achieve noteworthy effects by trying different shutter speeds. Capturing objects in motion can make them appear blurry, using a faster shutter speed can help you produce clear pictures. This comes in handy at sporting events or when photographing pets and children. On the other hand, you can set your shutter to a slow speed, so you can incorporate motion blur into your photograph as a special effect. Waterfalls and streams make exquisite photographs when this method is used.
When you are going to be taking a close-up shot, be careful if you are using the digital zoom features instead of optical zoom. Cameras will usually let you zoom closer and closer optically until the digital zoom takes over. The problem is that this compromises the overall picture quality. Digital mode will add pixels to your image and make the image quality very poor. The manual for your camera should have instructions to disable digital mode.
You should check to see the amount of light coming through your camera's aperture. If the photos are overexposed (too light) you need to decrease the aperture and if they are underexposed (too dark), increase it. Read the instructions that came with your camera, and learn how to read the light exposure level, or histogram. It allows you to see if a shot is overexposed or underexposed, so you can make adjustments for the next shot.
Keep in mind that photos are not limited to smiles when it comes to emotions. Real stories happen when true emotions are expressed in the photos. Look at famous war or depression era photographs to see how people have successfully captured more painful expressions. No matter what the occasion is for taking the photo, make sure that the emotions recorded are real.
It is important to learn how white balance works if you are a beginner photographer. All kinds of light has some color, you need to know what kind of lighting you are taking photos in.
It is a little tricky to take good pictures in low lighting because, if not taken properly, they have the tendency to blur. In low light, it is imperative to keep your hands steady. You might consider placing your hands on a fixed object to ensure that they don't move. You might want to consider investing in a tripod.
If you follow the guidelines from this article, you can improve your photography and make the most of your talents. Taking pictures isn't just pointing and then clicking. It is more about making a moment in nature or in a life last forever.
If you're taking photographs in a dimly lit environment, you can enhance their quality by decreasing the aperture, also known as the f-stop setting. This will cause the aperture to open wide and allow for more light to pass through.


Prosoma dark reddish brown, with a radial, wedge-shaped pattern and a posteriorly widened median line. Sternum reddish brown, with black reticulate pattern. Legs light reddish brown. Opisthosoma black.
Prosoma length: 0.70-0.79 mm. TmI 0.77-0.82.


I love pictures. Good pictures tell really good stories, without any words. But because I love to write, my pictures have to have words.
I had a lovely weekend north. The leaves are changing, the colors are popping, and the cold brings the most beautiful colors to the lake.
I love the dark skies. The clouds threatened all afternoon.
But in with the dark skies sat a little rainbow. Sort of like life .. there is always something wonderful, even in the darkest times.
Friends north who have dual residences, usually talk about here and there; north and south; there and back. Because so much of there feels like home just as much as here feels like home. So as I wrap up this late Sunday, I am back. Home and not. Loving here and loving there. Loving life.


Run a test with just one bag and make sure you have them inserted in the printer the correct direction.
Once it's through on the front side of the bag, tie it in a bow, and cut any extra.
I have a board on Pinterest that is dedicated to Little Gift ideas, so check it out if this is something you enjoy.
Giving little gifts don't cost much, but they bring BIG smiles to people's faces! Everyone loves to be thought of!
If you have some little gift ideas, be sure to link up to them in the comments.
The wordart was available for a limited time only and has been removed.


A Mission Beach woman has been woken by a 5 metre, 40 kilo Scrub Python in her bedroom.
News SNAKE catcher Matt George says some species of snake never sleep - a lesson staff at the Sunshine Coast Daily learned well today.
WATCH: "We've got a visitor...and it's very big!"
Offbeat TWO Queensland women have been woken by the most unlikely breakfast guest: a five metre, 40kg python.


Praise for the man who helped restore Bath's Spa.
Bath and North East Somerset Council has been paying its condolences to the family of Dr. Geoffrey Kellaway – the man who helped the city restore its Spa status after the discovery of pathogenic amoebae in the hot springs forced their complete closure in the late1970's.
Dr Kellaway – who was a former Geologist Consultant to the Council – died last week.
Councillor Paul Crossley, Leader of B&NES, said, " Dr. Kellaway made a significant and highly valued contribution to the heritage of our area. His work and research on the Hot Springs continue to be important to Bath, ensuring that one of the city's most treasured assets will be maintained for generations to come. We are all very sorry to hear of his passing.
"His legacy includes supporting the restoration of the Spa to working order – something that has not only been good for the economy of Bath but also for its soul as it is one of the unique assets that Bath has.
In 1977 the discovery of pathogenic amoebae in the water closed the bathing pools and also the pipeline supplying the water for treatment to the Royal Mineral Water Hospital. For the first time in nearly two thousand years the natural springs were not being used by man.
In response to this disaster Bath City Council mounted a major geological investigation in order to restore a supply of biologically 'clean' thermal water. This work was carried out on the advice of Dr Kellaway with the assistance of the Wessex Water Authority and the co-operation of scientists from the British Geological Survey, the Universities of Bristol and Bath and the Hospital for Tropical Diseases in London.
The King's Bath or Sacred Spring – fed by three-quarters of a million litres of natural water a day.
Dr. Kellaway undertook an extensive investigation of the Bath Hot Springs over a period of 25 years and designed the boreholes to ensure that clean hot water fed the springs subsequently.
He edited the definitive review of research into the hot springs (Hot Springs of Bath, 1991, Edited by G.A. Kellaway, Bath City Council). Dr. Kellaway was a joint author of our paper recently published in the Quarterly Journal of Engineering Geology and Hydrogeology (McCann, C., Mann, A..C., McCann, D.M, and Kellaway, G.A., 2013, Insights into the origin of the thermal springs of Bath and Bristol, England from geophysical data, Q.J.E.G.H., 46,267-279).
Dr. Kellaway was born in Bristol and undertook major geological surveys in the South-West from pre-war times onwards, in his capacity as a geologist with the British Geological Survey. He was a very eminent and outstanding geologist.
My husband is currently working on the eulogy for Geoff's funeral – if anyone would like to share any memories, please email me – pooky@inourhands.com Equally if anyone is interested in the details of the funeral so they might attend, or where to send flowers (another of Geoff's loves!) please drop me a line.
Thank you again, I shall make sure this is seen by Geoff's daughters, grandchildren and great grandchildren.
Thank you for that – and what a wonderful photograph of your husband's grandfather with his grandson and great grandson. I have published your comments and hope anyone who wants to contribute to his memory will make contact! Director.


text:
\section{Introduction}

Gait recognition is a research topic for systematic study on human motion, attracting increasing interest in recent years. Due to the fact that gait can be recognized at a long-distance without the cooperation of interest-subjects while other biometric characteristics cannot, gait recognition has considerable prospect for video surveillance, crime investigation and social security. In order to extract the robust and invariant features from videos of human walking, numerous technologies have been investigated over last decades. However, the violent changes caused by exterior variations such as carrying, clothing and view changing, bring significant challenges to gait recognition.

Based on the difference of raw data, current research efforts on gait recognition can be classified into two categories, i.e., appearance-based methods and model-based methods. The first type extracts compact representations from gait silhouettes, which either compresses all gait silhouettes into one gait energy image (GEI) \citep{he2018multi,takemura2017input,wu2016comprehensive} or regards gait as silhouette sequences \citep{wolf2016multi,chao2019gaitset}. However, such methods that relies on the human body shape are extremely sensitive to carrying, clothing and view changing since variations like that can alter the human appearance drastically. In contrast to the above, the second category takes raw skeleton data obtained by pose estimation algorithms as input and performs feature extraction through Convolutional Neural Networks (CNN) \citep{an2018improving,liao2017pose,liao2020model} or Graph Convolutional Networks (GCN) \citep{teepe2021gaitgraph,li2020jointsgait}. Although this kind of methods can overcome the interference caused by occlusion and view-changing to a certain extent, the accuracy of pose estimation methods and the lack of information contained in skeleton data bring limitations to the improvement of gait recognition accuracy.

More specifically, GCN-based approaches~\citep{teepe2021gaitgraph,li2020jointsgait} learn the human joint movement patterns from a skeleton spatial-temporal graph with joints as nodes and bones as edges. For robust gait recognition, it is indisputable that the feature extractor should not only aggregate the information of directly connected joints, but also extract multi-scale structural features and long-range dependencies on account of strong correlations between joints that are physically apart. To implement this, existing methods deploy multi-scale graph convolutions with multiple adjacency matrix to expand the receptive field (Figure~\ref{fig0}(a)), where every pair of nodes connected in the same adjacency matrix have the same shortest walks between them. But in practice, it is important to directly capture joint dependency between two nodes that are far apart, such as right wrist and left ankle, the movement direction and patterns of which are closely related when people walking. To achieve this, existing methods~\citep{wang} apply excessive adjacency matrixes for different joint pair connections, which causes high training costs. This means that the method suffers from the balance problem between training difficulty and the effective fusion of important information from distant joints, i.e., the \textit{distant-joint connection problem}.

\begin{figure}
\centering
\subfigure[]{
\includegraphics[width=0.2\textwidth]{figa.eps}}
\subfigure[]{
\includegraphics[width=0.2\textwidth]{figb.eps}}
\caption{(a)Prior methods deploy multi-scale graph convolutions to aggregate information of nonadjacent vertices. (b)We propose to capture correlations between any two vertices based on full connected skeleton graph.}
\label{fig0}
\end{figure}

Motivated by the above analysis, we propose a novel two-branch neural network for gait recognition task to realize the reciprocity of appearance-based methods and model-based methods, which can significantly promote the enhancement of recognition accuracy. The appearance-based branch leverages stacked CNN to extract discriminative representations from a sequence of gait silhouettes. Besides, the model-based branch deploys multi streams, namely Joint-stream, Bone-stream and Motion-stream, to learn multi-order robust and compact representations from human skeleton data with GCN blocks. In the GCN branch, we further design two modifications for modeling the skeleton feature for gait recognition. First, to address the distant-joint connection problem as discussed above, we present a fully-connected graph structure without the natural connections between human joints, to adaptively integrate the multi-scale graph convolutions instead of the redundant adjacency matrixes for the distant joints.
Second, an attention module named STC-Att is introduced to dynamically adjust the weight of convolution kernel on the spatial, the temporal and the channel dimensions.
Extensive experiments indicate that the proposed model outperforms all state-of-the-art methods on the popular CASIA-B dataset. The main contributions of the proposed method are summarized as follows:

\begin{enumerate}[1.]
\item We propose a novel two-branch framework for gait recognition task, which combines appearance-based features and model-based features to obtain their complementary advantages.
To the best of our knowledge, this is the first work to integrate the appearance- and model-based features for gait recognition.

\item In the model-based branch, we propose a simple but effective fully connected graph convolution operator that constructs a fully connected skeleton graph, which can adaptively capture the dependencies between all nodes without multi-scale convolutions. For more discriminative representations from raw skeleton data, we propose a fine-grained attention module named STC-Att to learn the spatial, temporal and channel-wise attention meanwhile.

\item
Experimental results on CASIA-B dataset demonstrate that the proposed method achieves superior gait recognition performance and outperforms prior state-of-the-art methods.

\end{enumerate}

\section{Related Work}

In the previous literature, there are two main ways to represent human body for gait recognition, i.e., silhouettes and skeletons. According to that gait recognition approaches can be laid in appearance-based and model-based categories.

First, gait silhouettes that can be easily computed by background subtraction and binarization are adopted most frequently in current works, which have been proven to express gait pattern with low computational expense effectively. Taking silhouettes as input, appearance-based methods usually apply two types, template or sequence to deal with temporal information. The former aggregates gait information into a single gait template, such as gait energy image (GEI) \citep{han2005individual}, chrono-gait Image (CGI) \citep{wang2010chrono} and frame-difference energy images (FDEI) \citep{chen2009frame}, and then extracts discriminative features from it with machine learning techniques, including linear discriminant analysis (LDA) \citep{bashir2010gait}, canonical correlation analysis (CCA) \citep{xing2016complete} and deep learning \citep{wu2016comprehensive,takemura2017input,yu2017invariant,shiraga2016geinet}. In contrast, the latter directly considers gait as a sequence of silhouettes. \cite{zhang2019gait} proposed a novel Auto-Encoder framework to explicitly disentangle appearance and gait feature representation from raw RGB frames, and utilize a multi-layer LSTM that can integrate pose features over time to generate gait representation for each video sequence. Some works \citep{wolf2016multi,lin2020gait} created 3D tensors from spatio-temporal information available in sequences and trained with 3D CNNs. \cite{chao2019gaitset} learned identity information from the set and aggregated convolutional maps over the whole sequence. However, although a sequence of silhouettes contains useful gait features such as speed, gait cycle time, step length and stride length \citep{nieto2015vision,verlekar2019gait}, they are extremely sensitive to changes in the appearance of human body shape, especially due to different clothing and carrying conditions.

Second, model-based methods commonly take skeletons as raw input data, which can be captured with depth-sensing cameras \citep{gianaria2013gait} or be estimated from videos with pose estimation methods \citep{cao2019openpose}. Since the skeleton data only contain the 2D or 3D coordinates of the human key joints, which is highly abstract information free of external noises, skeleton-based methods are more robust against viewpoint and appearance changes. \cite{feng2016learning} extract heatmaps using a CNN based pose estimate method to describe the gait information in a single frame and then adopt the LSTM to model gait sequence. \cite{liao2017pose} proposed a pose-based temporal-spatial network (PTSN) to extract the temporal features and spatial features from preprocessed gait pose using LSTM and CNN. \cite{liao2020model} exploited human 3D pose to obtain spatio-temporal features with CNN. In addition, as recently Graph Convolutional Networks (GCN) performs well on various tasks including image classification \citep{bruna2013spectral}, semi-supervised learning \citep{kipf2016semi}, and action recognition \citep{yan2018spatial}, some researchers attempt to leverage GCN to extract effective information from skeletons. For instance, \cite{li2020jointsgait} firstly applied a GCN to recognize gait and obtained remarkable performance in spite of the low dimensional feature. \cite{teepe2021gaitgraph} extracted the gait information from human 2D joints based on ResGCN architecture \citep{song2020stronger}. Nevertheless, these approaches are generally more sensitive to occlusions, due to the over-reliance on accurate detection of body joints \citep{verlekar2019gait}.

\section{Proposed Method}

We propose a novel two-branch neural network for gait recognition in this section, which combines appearance-based approach and model-based approach to realize complementary advantages. The overall pipeline is illustrated in Figure~\ref{fig1}. Taking raw skeletons and silhouettes respectively as input, the GCN-based branch (Section~\ref{Preliminaries},\ref{Unified},\ref{Attention}) and the CNN-based branch (Section~\ref{Model}) extract multi-order discriminative features. The features of all output are aggregated to obtain final compact gait signatures. We will introduce the components in detail in the following parts.
\begin{figure}
\centering
\includegraphics[width=0.9\textwidth]{fig1.eps}
\caption{The framework of the proposed two-branch neural network.}
\label{fig1}
\end{figure}

\subsection{Preliminaries}
\label{Preliminaries}
\subsubsection{Graph construction}
Generally, the raw skeleton data is a sequence of vectors, each of which denotes the 2D or 3D coordinates of human key joints in one frame. According to previous works \citep{teepe2021gaitgraph,li2020jointsgait}, we need to construct a spatio-temporal graph to input to GCN, formulated as $G=\left(V,E\right)$. In particular, the nodes of the graph represent all joints and the edges of the graph represent the natural connections along the spatial and temporal dimension, i.e., $V=\left\{ v_{ti}\mid t=1,2,\dots,T;i=1,2,\dots,N \right\}$, where $T$ represents the number of frames and $N$ represents the number of joints. In spatial dimension, two joints with physical dependency at each frame are connected, that is, intra-frame edges $E_s=\left\{\left(v_{ti},v_{tj}\right)\mid t=1,2,\dots,T;i,j=1,2,\dots,N;i\neq j\right\}$. In temporal dimension, two same joints between continuous frames are connected, that is, inter-frame edges $E_t=\left\{\left(v_{ti},v_{\left(t+1\right)i}\right)\mid t=1,2,\dots,T-1;i=1,2,\dots,N \right\}$.

\subsubsection{Spatial convolution}
Spatial convolution acts on joints in the same frame, bringing in weighted average features of neighbors for each joint. The graph convolution \citep{yan2018spatial} can be summarized as:
\begin{equation}\label{eq:1}
f_{out} = \sigma \left(\sum_{k}\Lambda _k^{-\frac{1}{2}} \left(A_k + M \right)\Lambda _k^{-\frac{1}{2}}f_{in}W_k \right) \quad
\Lambda _k^{ii}=\sum_{j}A_k^{ij}
\end{equation}
where the feature map $f_{in}$ and $f_{out}$ are actually tensors in $\left(C,V,T\right)$ dimensions. Note that $C$, $V$, $T$ denotes the number of channels, joints and frames, respectively. Besides, $A_k$ denotes the adjacency matrix representing intra-frame connections, $M$ is a learnable weight matrix to give minor edge corrections, $W_j$ is the weight matrix and $\sigma \left(\cdot \right)$ is an activation function.

\subsubsection{Temporal convolution}
The convolution on the temporal dimension is relatively simple. Similar to the classical convolution operation, we directly perform a standard 2D convolution with a fixed kernel size $1\times K$ on the output feature map calculated above, where $K$ is the the number of neighbors for each node considered within the kernel receptive field. Notably, following the work in \citep{liu2020disentangling}, for larger temporal receptive fields without increasing the kernel size, we introduce a bottleneck architecture with a fixed kernel size and different dilation rates to enhance temporal convolutional layers. Also, residual mode is applied here to boost performance.

\subsubsection{Spatial-temporal modeling}
Besides adopting factorized formulation to learn spatial-wise and temporal-wise features alternately, we also deploy a unified spatial-temporal graph convolutional operator \citep{liu2020disentangling}, which allows that signals can be propagated directly across spacetime, to capture complex spatial-temporal joint relationships. Concretely, unfold the original graph into a spatial-temporal subgraph $G_{\tau}=\left(V_{\tau},E_{\tau}\right)$ with a sliding temporal window of size $\tau$ and a dilation rate $d$, where $V_{\tau}=V_1 \cup V_2 \cup \dots \cup V_{\tau}$ denotes all nodes of $\tau$ frames in the sliding window and $E_{\tau}$ is defined by the adjacency matrix $A_k^{\tau ,d}$ that can be computed by tiling $A_k$ into
\begin{equation}\label{eq:2}
A_k^{\tau ,d} =
\left[
\begin{array}{lll}
A_k & \cdots & A_k \\
\vdots & \ddots & \vdots \\
A_k & \cdots & A_k
\end{array}
\right ]
 \in \left\{0,1\right\} ^{\tau N \times \tau N}
\end{equation}
Then, the implementation of the unified spatial-temporal convolution is derived as
\begin{equation}\label{eq:3}
f_{out}^{\tau ,d} = \sigma \left(\sum _k \left(\Lambda _k^{\tau ,d}\right) ^{-\frac{1}{2}} \left(A_k^{\tau ,d}+M\right)\left(\Lambda _k^{\tau ,d}\right) ^{-\frac{1}{2}}f_{in}^{\tau ,d}W_k\right)
\end{equation}

\subsection{Fully Connected Graph Convolution}
\label{Unified}
Under the spatial modeling in Equation \ref{eq:1}, in order to learn long-range dependencies, current methods \citep{liu2020disentangling} employ multi-scale graph convolution with multiple adjacency matrixes to aggregate information of distant neighbors. Concretely, k-adjacency matrix of the graph that defines the connections between the current joint and its k-hop neighbors is first adopted to learn the dependencies at different scales, then all features are summed followed by an activation function and sent into the temporal convolution operator. The k-adjacency matrix can be formulated as
\begin{equation}\label{eq:4}
A_k^{i,j}=\left\{
\begin{array}{l}
1, i=j \\
1, d\left(v_i,v_j\right)=k \\
0, otherwise
\end{array}
\right .
\end{equation}

However, take right wrist (the red vertex in Figure~\ref{fig2}) for example, if all the other joints are taken into account, eight adjacency matrixes are needed since the smallest hop between the right wrist and the farthest node left ankle (the green vertex in Figure~\ref{fig2}) is seven. On account of the inclusion of self-loops in all adjacency matrixes, the information from the right wrist joint itself will be aggregated eight times throughout the convolutional process, which leads to a bias towards the local body joint and the attenuation of other joint dependencies.
\begin{figure}
\centering
\includegraphics[width=0.3\textwidth]{fig2.eps}
\caption{The demonstration of the raw joints data. The red vertex denotes joint right wrist, the green vertex denotes joint left ankle, and the yellow lines denote that the smallest hop between right wrist and left ankle is seven.}
\label{fig2}
\end{figure}

To attack the problem above, we argue that such factorized modeling is dispensable and the weight of each joint can be learned at a time. With that in mind, we propose a simple but effective fully connected graph convolution operator to integrate multi-scale convolutions and balance the contributions from the joint itself and other joints. The operator no longer relies on the physical connections and defines the adjacency matrix $A$ as
\begin{equation}\label{eq:5}
A^{ij}=1  \quad i,j=1,2,\dots,N
\end{equation}
that is, each pair of nodes of the skeleton graph is interconnected. Substituting $A_k$ with $A$ in Equation~\ref{eq:1}, we can arrive at:
\begin{equation}\label{eq:6}
f_{out} = \sigma \left( \Lambda ^{-\frac{1}{2}} \left(A+M\right) \Lambda ^{-\frac{1}{2}}f_{in}W\right) \quad \Lambda ^{ii}=\sum_{j}A^{ij}
\end{equation}

Compared with multi-scale graph convolution where neighbors are divided into multiple scales based on the number of hops, the proposed fully connected convolution operator treats all nodes equally and automatically capture relationships between them. Experiments in Section~\ref{Ablation} has proved that the proposed operator can enhance the recognition performance to a certain degree, particularly when taking features away from bone-wise and motion-wise data.

\subsection{Attention Mechanism}
\label{Attention}
Based on the successful application of the attention mechanism in certain fields, e.g. sequence learning \citep{bluche2016joint}, image captioning \citep{chen2017sca} and action recognition \citep{song2021constructing}, we introduce an attention module in this section. The preliminary version of this paper \citep{wang} presented a SE block which only works on the channel dimension. However, intuitively, in addition to the focus on the channel dimension, the distinguishment of information in spatial and temporal dimension is equally critical. Actually, not all frames and joints make the same contribution to the gait recognition task, in other words, the most discriminative information generally is contained in certain joints from certain frames. Thus, to distinguish the importance of gait features on the spatial, temporal and channel dimensions, according to the works in \citep{song2021constructing}, we propose a Spatial Temporal Channel Attention (STC-Att) module to dynamically adjust the weight of convolution kernel.
\begin{figure}
\centering
\includegraphics[width=0.6\textwidth]{fig3.eps}
\caption{The schema of the proposed STC-Att module.}
\label{fig3}
\end{figure}

The concrete structure of the STC-Att module is depicted in Figure~\ref{fig3}. Channel-wise attention (the right branch in Figure~\ref{fig3}) \citep{hu2018squeeze} is performed according to the correlation between channels, which can selectively enhance useful features and suppress secondary features. Given a feature map $F\in {\mathbb{R}}^{C\times V\times T} $, the weight of each channel is learned in three steps. First, the squeeze step, where global average pooling is performed to compact gait features along the spatial and temporal dimension to a single unit, that is, the feature map is converted into $F^{'}\in {\mathbb{R}}^{C\times 1}$. Then, the excitation step generates the weight for gait features $W\in {\mathbb{R}}^{C\times 1}$ using two fully connected layers and activation functions to learn the nonlinear interaction between channels. Finally, the scale layer is adopted to complete the recalibration of gait features through channel-wise product in the reweight step.

Spatial-wise and temporal-wise attention (the left branch in Figure~\ref{fig3}) are performed together to adaptively distinguish key joints and key frames from the whole skeleton sequence. Given a feature map $F\in {\mathbb{R}}^{C\times V\times T}$, we firstly average the spatial information along the spatial dimension into the feature map $F_{T}\in {\mathbb{R}}^{C\times T}$ and average the temporal information along the temporal dimension into the feature map $F_{V}\in {\mathbb{R}}^{C\times V}$. Then, the pooled feature maps are concatenated together into feature map $F_{VT}\in {\mathbb{R}}^{C\times \left(V+T\right)}$, followed by a fully connected layer and an activation function to compress information. After that, two independent fully connected layers are deployed to learn attention scores for temporal dimension and spatial dimension respectively, which can be formulated as $W_{T}\in {\mathbb{R}}^{C\times T}$, $W_{V}\in {\mathbb{R}}^{C\times V}$. Finally, the product of the spatial and temporal attention maps is multiplied to the input feature map for adaptive features refinement.

On the whole, by computing the importance weights for different frames, joints and channels depending on input feature maps, the proposed STC-Att module can effectively pick the information that is relatively essential to the recognition task, thereby increasing the contribution of meaningful key frames, key joints and key channels and boosting the recognition precision.

\subsection{Model Architecture}
\label{Model}
\subsubsection{Model-based branch}
In order to abstract discriminative and robust descriptors from the raw skeleton data, spatial-temporal graph convolutional (STGC) blocks \citep{liu2020disentangling} are introduced as the basic component of the model, which deploys the G3D pathway that can learn complex spatial-temporal joint dependencies and the factorized pathway that captures spatial-only and temporal-only features alternately. The proposed STC-Att module is employed after each STGC block to explicitly model the channel-wise, spatial-wise and temporal-wise correlation between feature maps. Finally, a global average pooling layer and a softmax classifier are utilized at the end of the model for identification. The architecture of the model-based branch is depicted in Figure~\ref{fig4}.
\begin{figure}
\centering
\includegraphics[width=0.8\textwidth]{fig4.eps}
\caption{The architecture of the model-based branch.}
\label{fig4}
\end{figure}

For further improvement of performance, we also fuse part-level features proposed in our previous work \citep{wang} in this paper to capture fine-grained information. In addition, we apply a multi-stream framework \citep{wang} that input the joint, bone and motion data to three GCN streams with the same model architecture separately and fuse all the output feature maps as the final gait representations, which has been proven to significantly boost the individual recognition.

\subsubsection{Appearance-based branch}
In the appearance-based branch, we choose a part-based model GaitPart \citep{fan2020gaitpart} that has tremendous performance compared to other appearance-based methods to recover instructive representations from gait silhouettes. The overview of GaitPart is shown in Figure~\ref{fig5}. As seen, the network takes a sequence of gait silhouettes as input. The frame-level part feature extractor (FPFE) composed of stacked CNNs initially generate feature maps for each frame and the horizontal pooling (HP) module horizontally splits feature maps into multi parts. Then multi parallel micro-motion capture modules (MCM) are deployed to aggregate part-level feature vectors of each corresponding human body part into a single feature vector. Finally, all the output vectors are simply concatenated as the final gait descriptors.
\begin{figure}
\centering
\includegraphics[width=0.5\textwidth]{fig5.eps}
\caption{The overview of the appearance-based branch.}
\label{fig5}
\end{figure}

\subsubsection{Two-branch network}
To our knowledge, current gait recognition approaches can be classified as either appearance-based or model-based, that is, they extract gait representations either only from silhouettes or only from skeletons. However, despite its standout recognition accuracy on normal walking, the type of methods based on silhouettes is exceedingly sensitive to changes of human body shape, which are fairly routine under the scene of different carrying and clothing conditions. On the contrary, the type of methods based on skeletons is more robust to such variations like cross-carrying and cross-clothing conditions since it does not depend on the shape of human body but only focuses on the coordinates of the key joints. Notwithstanding, these methods are limited by the correctness of pose estimation algorithms and after all, the raw skeleton data only contains the 2D coordinates of key joints which means finite information that we can mine. Consequently, model-based algorithms cannot achieve quite high accuracy for the above reasons. Inspired by that, we devise a two-branch neural network to combine the two type of methods in the hope of that they can complement one another perfectly and attain fairly high accuracy in all conditions.

Concretely, suppose that the feature vector outputted by model-based branch is $f_m$ and the feature vector outputted by appearance-based branch is $f_a$, a straightforward concatenation operation is adopted to merge the two feature vectors together, which brings out the final gait descriptors for recognition. Note that because the two vectors that are obtained from completely different raw data using diverse networks have unequal size and range, a ratio $\lambda$ is needed to adjust the rate of them. Hence, we can get the overall feature vector through $f=f_m \oplus \left(\lambda \cdot f_a\right)$, where $\oplus$ means the concatenation operation. Extensive experiments in Section~\ref{Ablation} demonstrates the effectiveness of the proposed fusion strategy.

\section{Experiments}

\subsection{Dataset and Experimental Setting}

\subsubsection{CASIA-B}
To evaluate the proposed two-branch neural network, adequate experiments are conducted on the popular public gait recognition dataset CASIA-B \citep{yu2006framework}, which was created by the Institute of Automation, Chinese Academy of Sciences (CASIA). For each subject, there are 11 views captured from 11 cameras at the same time, where the view angles are $\left\{0^{\circ}, 18^{\circ},36^{\circ},\cdots,180^{\circ} \right\}$. For each view, there are 10 sequences, namely 6 sequences for normal walking (NM), 2 sequences for walking with bag (BG) and 2 sequences for walking in coat (CL). Since the dataset does not provide skeleton data, openpose \citep{cao2019openpose} is exploited here to locate joints in human body from RGB videos. We choose the most representative 15 joints from the 25 estimated results as the input of model-based branch, i.e., Nose, Neck, RShoulder, RElbow, RWrist, LShoulder, LElbow, LWrist, MidHip, RHip, RKnee, RAnkle, LHip, LKnee, LAnkle. Note that all coordinates need to be normalized to the range [0,1] before entering the network. In the experiment, we follow the popular large-sample training (LT) in \citep{chao2019gaitset}, where the first 74 subjects are grouped into training set and the rest 50 subjects belongs to the test set. In the test set, the gallery set contains the first 4 sequences of NM condition (NM01-NM04), and the probe set retains the remaining sequences (NM05-NM06, BG01-BG02, CL01-CL02). During the test, rank-1 accuracies on all gallery views are averaged where identical-view cases are excluded. For example, the accuracy of probe view $0^{\circ}$ is obtained by averaging other 10 gallery views.

\subsubsection{Experimental setting}
In model-based branch, the network is composed of 3 STGC blocks. The dimensions of feature maps outputted by each block are 96, 192, 384 in order and the strides of the latter two blocks are 2. The size of the raw skeleton data is $2\times 120\times 15$, which means that there are 120 frames for each sequence, 15 joints for each frame, and 2 channels (horizontal and vertical coordinate) for each joint. The batch size is set to 128 and the training epoch is set to 65. The initial learning rate is set to 0.1 and decays with a factor of 0.1 after the 45th and 55th epoch. In appearance-based branch, the silhouettes are aligned and resized to the size of 64×64 as the input of CNNs. The triplet loss with the margin of 0.2 is applied to guide network training. In addition, the batch size is set to (8, 16), the maximum number of iteration is set to 8,000, the learning rate is set to 1e-4 and the momentum is set to 0.9. All experiments in this paper are performed on 1 NVIDIA 2080TI GPU.

\subsection{Ablation Study}
\label{Ablation}
To validate the effectiveness of each component in the proposed method, a series of ablation studied are carried out on CASIA-B in this section.

\subsubsection{Effectiveness of fully connected graph convolution}
We first verify the effect of the proposed fully connected graph convolution in GCN-based branch by conducting controlled experiments for three streams separately. Each set of experiments considers two scenarios, viz., the module with predefined adjacency matrix based on natural connections that represented with suffix "-P" and the module with the proposed fully connected graph convolution that represented with suffix "-F". The results are shown in Table~\ref{tab:table1}. It can be clearly seen that the model that we devise gain higher accuracies for all conditions in bone stream and motion stream, which verifies the availability of fully connected graph convolution. However, we discover that although our model improved performance under NM condition in joint stream, the accuracies for BG and CL are negatively affected to a certain extent, the possible reason for which is that unlike bone and motion data, the joint data is more dependent on the natural structure of human body. Take that into consideration, we will just apply fully connected graph convolution to bone and motion stream in the following experiments.

\begin{table}[]
\centering
\caption{The recognition results of models with/without fully connected graph convolution.}
\label{tab:table1}
\begin{tabular}{llll}
\hline
               & \multicolumn{3}{c}{Accuracy(\%)} \\ \cline{2-4}
               & NM        & BG        & CL        \\ \hline
Multi-Stream-P & 89.8 & 78.5 & 78.0 \\
Multi-Stream-F & \textbf{91.3} & \textbf{79.4} & \textbf{78.5} \\  \hline
Joint-Stream-P & 82.4 & 70.0 & 65.3 \\
Joint-Stream-F & 86.0 & 68.0 & 63.4 \\  \hline
Bone-Stream-P & 69.9 & 50.3 & 40.0 \\
Bone-Stream-F & 71.8 & 50.7 & 40.8 \\ \hline
Motion-Stream-P & 63.9 & 51.0 & 50.9 \\
Motion-Stream-F & 66.1 & 53.2 & 52.3 \\ \hline
\end{tabular}
\end{table}

\subsubsection{Effectiveness of STC-Att}
Here we focus on validating the proposed attention mechanism, STC-Att. In the experiments, we compare the accuracy of the model without STC-Att and the model with STC-Att embedded after GCN blocks. Notably, according to \citep{wang}, channel-wise attention for joint stream is just beneficial to normal walking but harmful to other states, so we merely focus on spatial-wise and temporal-wise attention for joint stream in this paper. The results are presented in Table~\ref{tab:table2}, which show the impact of attention strategy. It can be seen that after the introduction of our attention mechanism, the recognition rates of the multi-stream and each single-stream network have been improved in almost all conditions, which reveals the superiority of STC-Att to capture the discriminative gait representations.
\begin{table}[]
\centering
\caption{Ablation studies conducted on CASIA-B. The results are rank-1 accuracies averaged on all 11 views, excluding identical views.}
\label{tab:table2}
\begin{tabular}{lccc}
\hline
                      & \multicolumn{3}{c}{Accuracy(\%)}  \\ \cline{2-4}
                      & NM  & BG  & CL   \\ \hline
Multi-stream w/o Att  & 91.3 & 79.4 & 78.5 \\
Multi-stream w Att  & \textbf{91.8} & \textbf{79.8} & \textbf{79.4} \\ \hline
Joint-stream w/o Att  & 82.4 & 70.0 & 65.3 \\
Joint-stream w Att   & 83.8 & 69.2 & 65.6 \\ \hline
Bone-stream w/o Att   & 71.8 & 50.7 & 40.8 \\
Bone-stream w Att    & 74.1 & 53.1 & 44.5 \\ \hline
Motion-stream w/o Att & 66.1 & 53.2 & 52.3 \\
Motion-stream w Att  & 66.6 & 54.4 & 53.8 \\ \hline
\end{tabular}
\end{table}

\subsubsection{Discussion of two-branch fusion}
As mentioned in Section~\ref{Model}, to combine model-branch and appearance-based branch, a ratio $\lambda$ is needed to weigh the disparity between them. In order to determine the most suitable ratio for the best performance of the two-branch network, we compare different values of $\lambda$, namely from 300 to 500 with 50 as interval. The averaged accuracies are shown in Table~\ref{tab:table3}. The first two lines show the averaged accuracies of model-branch and appearance-based branch respectively. We observe that as the value of $\lambda$ increases, the accuracy rate under all conditions shows a trend of first increasing and then decreasing. NM and BG condition get the best results with setting $\lambda =450$ and CL condition gets the best results with setting $\lambda =300$. In addition, we calculate the mean value of accuracies under the three conditions (shown in the last column). Considering that the model should perform well in various states, we choose $\lambda =400$ with the highest mean value as the final ratio.
\begin{table}[]
\centering
\caption{Averaged rank-1 accuracies with different values of $\lambda$.}
\label{tab:table3}
\begin{tabular}{ccccc}
\hline
\multicolumn{1}{l}{}  & \multicolumn{4}{c}{Accuracy(\%)} \\ \cline{2-5}
\multicolumn{1}{l}{}    & NM & BG & CL & Mean \\ \hline
model-based branch      & 91.8 & 79.8 & 79.4 & 83.67  \\
appearance-based branch & 91.5 & 81.7 & 68.6 & 80.60 \\ \hline
$\lambda =300$ & 97.0 & 92.8 & \textbf{93.4} & 94.38 \\
$\lambda =350$  & 97.5 & 93.4  & 93.1 & 94.65   \\
$\lambda =400$  & 97.7 & 93.8 & 92.7 & \textbf{94.74} \\
$\lambda =450$  & \textbf{97.7} & \textbf{93.9} & 91.9  & 94.51  \\
$\lambda =500$  & 97.6 & 93.5 & 90.8  & 93.98 \\ \hline
\end{tabular}
\end{table}

More specifically, we compare the recognition rates of the singe branch and the fused branch at 4 different probe angles with $36^{\circ}$ interval, namely $36^{\circ}$, $72^{\circ}$, $108^{\circ}$ and $144^{\circ}$. The comparisons are depicted in Figure~\ref{fig6}, where each row represents a probe angle and each column represents a walking condition. As clearly seen in Figure~\ref{fig6}, the fused network outperforms the model-only and appearance-only network at the vast majority of pairs of probe angle and gallery angle under all walking conditions. The results demonstrate that the proposed two-branch network can achieve complementation of the two types of methods and dramatically improve performance.
\begin{figure}
\centering
\resizebox*{12cm}{!}{\includegraphics{fig6.eps}}
\caption{Comparison of the singe branch and the fused branch at different probe angles.}
\label{fig6}
\end{figure}

\subsection{Comparisons with State-of-art Methods}
In this section, we compare the proposed two-branch neural network to additional state-of-the-art gait recognition methods with the same experimental settings systematically and comprehensively, including GaitGraph \citep{teepe2021gaitgraph}, MS-Gait \citep{wang}, GaitSet \citep{chao2019gaitset} and GaitPart \citep{fan2020gaitpart}. Among that, the first two methods belong to model-based and the last two methods belong to appearance-based. Notably, the accuracies of the compared approaches are directly cited from their original papers. The detailed results are listed in Table~\ref{tab:table4}. From the view of results, the proposed model exceeds all existing approaches and presents the best performance under various walking conditions on CASIA-B. Especially in the CL condition, the accuracy of ours increases by 14\% compared with GaitPart \citep{fan2020gaitpart}, which can indicate that the proposed network have great utility in handling with the presence of occlusion and abstracting discriminative and fine-grained gait descriptors. Apart from that, it is worth mentioning that our work is the first to devise a two-branch network to merge gait features learned from silhouettes and from skeletons, and the results has proven the effectiveness of this combination.
\begin{table}[]
\centering
\caption{Comparison of gait recognition performance on CASIA-B.}
\label{tab:table4}
\resizebox{.95\columnwidth}{!}{
\begin{tabular}{cccccccccccccc}
\hline
\multicolumn{2}{c}{Gallery angle NM01-NM04} & \multicolumn{12}{c}{$0^{\circ}-180^{\circ}$} \\ \hline
\multicolumn{2}{c}{Probe angle} & $0^{\circ}$ & $18^{\circ}$ & $36^{\circ}$ & \multicolumn{1}{l}{$54^{\circ}$} & \multicolumn{1}{l}{$72^{\circ}$} & \multicolumn{1}{l}{$90^{\circ}$} & $108^{\circ}$ & $126^{\circ}$ & $144^{\circ}$ & \multicolumn{1}{l}{$162^{\circ}$} & \multicolumn{1}{l}{$180^{\circ}$} & \multicolumn{1}{l}{Mean} \\ \hline
\multirow{5}{*}{NM}
& GaitGraph\citep{teepe2021gaitgraph} & 85.3 & 88.5 & 91.0 & 92.5 & 87.2 & 86.5 & 88.4 & 89.2 & 87.9 & 85.9 & 81.9 & 87.7 \\
 & MS-Gait\citep{wang} & 89.4 & 91.7 & 91.6 & 90.2 & 90.6 & 90.6 & 90.4 & 90.9 & 90.4 & 88.5 & 85.6 & 90.0 \\
 & GaitSet\citep{chao2019gaitset} & 90.8 & 97.9 & \textbf{99.4} & 96.9 & 93.6 & 91.7 & 95.0 & 97.8 & 98.9 & 96.8 & 85.8 & 95.0 \\
 & GaitPart\citep{fan2020gaitpart} & 94.1 & \textbf{98.6} & 99.3 & \textbf{98.5} & 94.0 & 92.3 & 95.9 & 98.4 & \textbf{99.2} & 97.8 & 90.4 & 96.2 \\
 & Ours & \textbf{97.0} & 97.9 & 98.4 & 98.3 & \textbf{97.2} & \textbf{97.3} & \textbf{98.2} & \textbf{98.4} & 98.3 & \textbf{98.1} & \textbf{96.0} & \textbf{97.7} \\ \hline
\multirow{5}{*}{BG}
& GaitGraph\citep{teepe2021gaitgraph} & 75.8 & 76.7 & 75.9 & 76.1 & 71.4 & 73.9 & 78.0 & 74.7 & 75.4 & 75.4 & 69.2 & 74.8 \\
 & MS-Gait\citep{wang} & 75.7 & 84.8 & 83.7 & 83.2 & 80.6 & 80.1 & 82.2 & 79.8 & 79.1 & 75.9 & 71.1 & 79.7 \\
 & GaitSet\citep{chao2019gaitset} & 83.8 & 91.2 & 91.8 & 88.8 & 83.3 & 81.0 & 84.1 & 90.0 & 92.2 & \textbf{94.4} & 79.0 & 87.2 \\
 & GaitPart\citep{fan2020gaitpart} & 89.1 & \textbf{94.8} & \textbf{96.7} & \textbf{95.1} & 88.3 & \textbf{94.9} & 89.0 & 93.5 & \textbf{96.1} & 93.8 & 85.8 & 91.5 \\
 & Ours & \textbf{91.9} & 94.6 & 96.4 & 94.3 & \textbf{94.4} & 91.6 & \textbf{94.1} & \textbf{95.4} & 95.5 & 93.9 & \textbf{89.5} & \textbf{93.8} \\ \hline
\multirow{5}{*}{CL}
& GaitGraph\citep{teepe2021gaitgraph} & 69.6 & 66.1 & 68.8 & 67.2 & 64.5 & 62.0 & 69.5 & 65.6 & 65.7 & 66.1 & 64.3 & 66.3 \\
 & MS-Gait\citep{wang} & 75.1 & 79.7 & 80.5 & 84.7 & 84.0 & 82.4 & 79.8 & 80.4 & 78.3 & 78.0 & 70.9 & 79.4 \\
 & GaitSet\citep{chao2019gaitset} & 61.4 & 75.4 & 80.7 & 77.3 & 72.1 & 70.1 & 71.5 & 73.5 & 73.5 & 68.4 & 50.0 & 70.4 \\
 & GaitPart\citep{fan2020gaitpart} & 70.7 & 85.5 & 86.9 & 83.3 & 77.1 & 72.5 & 76.9 & 82.2 & 83.8 & 80.2 & 66.5 & 78.7 \\
 & Ours & \textbf{87.4} & \textbf{96.0} & \textbf{97.0} & \textbf{94.6} & \textbf{94.0} & \textbf{90.1} & \textbf{91.5} & \textbf{94.1} & \textbf{93.8} & \textbf{92.6} & \textbf{88.5} & \textbf{92.7} \\ \hline
\end{tabular}
}
\end{table}

\section{Conclusion}
In this paper, we presented a novel two-branch neural network composed of a CNN-based branch extracting gait features from silhouettes and a GCN-based branch extracting gait features from skeletons. We also provide a concise but effective fully connected graph convolution operator and an attention module to enhance the recognition performance. Extensive experiments based on the CASIA-B database shows that our method surpasses all the appearance-based and model-based methods under all walking conditions, showing its great potential in dealing with the presence of viewpoint, carrying and clothing condition variations. However, the fusion mode of the two types of approaches employed in this paper is simply concatenation operation. We will explore better in-depth integration strategy to further improve gait recognition accuracy in the future.

\section*{Declarations}

This work was supported by Tianjin Research Innovation Project for Postgraduate Students under Grant 2021YJSB174.

redpajama_set_name: RedPajamaArXiv


text:
How to Upgrade the Firmware of Your SSD on a Windows Machine
Chaitanya Tapase
A Solid State Drive (SSD) has many advantages over a traditionally spinning hard drives with moving parts. It's faster, sleeker, lasts longer and generally is easier to maintain. Did I mention it's faster? There might be one little thing, however, that some owners may neglect. That's the firmware.
Do the right thing, before you get an SOS | Shutterstock
Since Windows 10 has been launched, a number of manufacturers have rolled out updates to their SSD firmware's. But non-tech owners have been blissfully unaware, because unlike the apps on your smartphone, these aren't upgraded automatically unless you have the right tools installed.
Why Bother With Firmware
The firmware of SSDs is essential for running them smoothly and efficiently. Sometimes, manufacturers are alerted about issues only after the product has been sold to customers and sometimes it is a newer version of Windows, which may cause some issues.
In any case, it's best to stay updated with SSD firmware, especially if it's a high-performance one which you rely on 100%.
Find Out SSD Models
The first and obvious step is to find out if you have an SSD or not. If so, then by which manufacturer. If you already know all this, skip this section. If not, go to the search box on your taskbar and type defrag and you will see the below option.
Clicking on it will open the Optimize Drives window and here you will see how many of your drives are SSDs and HDDs. Again, if you find that none of your drives are SSDs, stop reading and go Netflix and Chill. If there is even one drive which is an SSD, then find out which model it is.
The best way to find that out is by going to the My Computer screen and right-clicking the drive you found was the SSD. It was the C:\ drive in my case, so I will right-click that and then click Properties. From here, click on the Hardware tab and the name of the SSD maker will be revealed.
OEM Tools Only
Once you know who's made the SSD running on your PC, it's easier to sort things out. Each SSD maker, be it Intel or Samsung or Kingston or OCZ, has some sort of utility which will have the option to upgrade firmware. Let's take my case, where I found that I had an Intel SSD. A simple Google search later, I found the Intel SSD Toolbox page, downloading and installing it was easy.
Once I launched it, there was a nice layout with each tab clearly highlighting what it does. Clicking on Upgrade Firmware revealed I was on an older version and the software automatically downloaded and installed the latest one for me. A reboot later, my SSD was now running the latest firmware and I can now rest easy.
Similarly, Samsung has its own utilities, Corsair its own, SanDisk its own as does Crucial and so does OCZ.
Some, like Kingston and OWC, offer SandForce-based client which is ok but don't offer anything extra. You could try a 3rd party tool like SSD Tweaker for this, but only as a last resort.
Don't Lax, Upgrade Now
Remember how much you had to save up for your precious SSD? Then why be careless and let a little old thing like outdated firmware corrupt it? Upgrade now. It ain't that hard.
Last updated on 5 Jul, 2019
#drivers #hard disk
PayPal was voted as one of the top 10 worst business ideas in 1999.
More in Windows
How to Add and Edit Signatures in Outlook Web, Desktop and Phone
How to Set XnView as Default Image Viewer on Windows 10
Chaitanya Tapase has varied interests in Technology from Android to Windows to DSLR Photography. On weekends, you'd find him catching up on TV Shows like Game of Thrones and enjoying House Music.


text:
The Cable: Rabid Dogs, Nuclear Rights, and Fussy Frenchies: What to Watch at the Iran Talks Rabid Dogs, Nuclear Rights, and Fussy Fre...
The Cable
The Cable goes inside the foreign policy machine, from Foggy Bottom to Turtle Bay, the White House to Embassy Row.
Rabid Dogs, Nuclear Rights, and Fussy Frenchies: What to Watch at the Iran Talks
Geneva — American and Iranian negotiators settled into a luxury hotel here for several days of talks designed to hash out the final details of what could be a historic nuclear deal. Secretary of State John Kerry and other foreign secretaries are watching the talks closely, ready to fly to Geneva at a moment's notice if ...
By Yochi Dreazen
FABRICE COFFRINI/AFP/Getty Images
Geneva — American and Iranian negotiators settled into a luxury hotel here for several days of talks designed to hash out the final details of what could be a historic nuclear deal. Secretary of State John Kerry and other foreign secretaries are watching the talks closely, ready to fly to Geneva at a moment's notice if an agreement is reached.
U.S. officials say they're cautiously optimistic these talks will pan out. The two sides came exceptionally close to a deal earlier this month, but those negotiations ended with Kerry and his colleagues boarding their planes and flying home without an agreement. This time around, officials from both sides believe that many of the disputes that gummed up the last round of negotiations have been at least partially resolved.
Don't take out the champagne just yet, however. Some significant differences remain, and it's not at all clear that the negotiators will be able to bridge all of them. Below are three key issues worth watching as the talks get underway.
Geneva — American and Iranian negotiators settled into a luxury hotel here for several days of talks designed to hash out the final details of what could be a historic nuclear deal. Secretary of State John Kerry and other foreign secretaries are watching the talks closely, ready to fly to Geneva at a moment's notice if an agreement is reached.
U.S. officials say they're cautiously optimistic these talks will pan out. The two sides came exceptionally close to a deal earlier this month, but those negotiations ended with Kerry and his colleagues boarding their planes and flying home without an agreement. This time around, officials from both sides believe that many of the disputes that gummed up the last round of negotiations have been at least partially resolved.
Don't take out the champagne just yet, however. Some significant differences remain, and it's not at all clear that the negotiators will be able to bridge all of them. Below are three key issues worth watching as the talks get underway.
United They Stand. The negotiations are being led by the so-called P5+1 — a grouping of the United States, England, Russia, France, China, and Germany — and the success of any deal will depend on whether all of the countries will be willing to sign off on it. The last time around, France refused, effectively vetoing the proposed agreement. Paris felt that the deal didn't do enough to reduce Iran's stockpile of enriched uranium or stop the construction of the plutonium enrichment facility at Arak. The key question now is whether the current talks will produce a deal that can go as far as France wants without demanding concessions that go beyond what Tehran can accept.
Nuclear Rights. It may seem small in the scheme of things, but one of the biggest remaining disagreements between the two sides concerns the question of whether Iran has the "right" to enrich uranium. Tehran has long demanded what would amount to a Western stamp of approval of sorts for its nuclear efforts. The United States has refused to grant it for just as long. Part of the disagreement is practical: Acknowledging that Iran has a right to continue enriching uranium would allow Iran to keep much of its current nuclear infrastructure intact, albeit under strict international supervision. The other aspect is legal: Tehran could use Western acknowledgement of its right to enrich uranium to argue that the United States and its allies have no legal standing for sanctioning its nuclear program. On Wednesday, a senior administration official said the Non-Proliferation Treaty is "silent" on the issue. "It neither confers a right nor denies a right," the official said. "We do not believe it is inherently there." The official expressed optimism that the two sides could find common ground, but the wording issue has stymied previous attempts at a deal.
Tehran's "Rabid Dogs." Iran's supreme leader, Ayatollah Ali Khamenei, raised eyebrows Wednesday when he told members of a paramilitary group that Israel was "a rabid dog" and accused the United States of harboring "warmongering" policies. Khamenei also mocked Washington for the recent government shutdown, telling the crowd that "instead of using threats, go and repair your devastated economy so that your government is not shut down for 15 or 16 days." It's easy to listen to those comments and conclude that Khamenei is simply uninterested in a deal, which is a definite possibility. Some administration officials take a different view, however. They say that Khamenei might have been directing his comments at a domestic audience that remains deeply skeptical of U.S. intentions after decades of hostility. The more important aspect of the supreme leader's comments, they argue, were his continued public support of the ongoing nuclear talks. The success of the current negotiations will come down to which interpretation of Khamenei's words is correct.
Tags: Foreign & Public Diplomacy, Iran, Middle East and North Africa, Nuclear Weapons, U.S. Foreign Policy, United Nations
NEW FOR SUBSCRIBERS: Want to read more on this topic or region? Click + to receive email alerts when new stories are published on U.S. Foreign Policy U.S. Foreign Policy, Foreign & Public Diplomacy Foreign & Public Diplomacy, United Nations United Nations, Iran Iran, Middle East and North Africa Middle East and North Africa
U.S. Vice President Mike Pence announces the Trump administration's plan to create the U.S. Space Force by 2020 during a speech at the Pentagon August 9, 2018 in Arlington, Virginia. Photo by Chip Somodevilla/Getty Images
Security Brief: What Trump's Space Force Will and Won't Do; U.S. Sanctions Rattle Markets, Allies
Catch up on everything you need to know about Trump's Space Force, the impact of powerful new White House sanctions on Russia, Turkey and Iran, an interview with U.S. Central Command chief Gen. Joseph Votel, and more.
Flag draped transfer cases with the remains of American soldiers repatriated from North Korea are seen during a ceremony after arriving to Joint Base Pearl Harbor-Hickam, Honolulu, Hawaii, on August 1, 2018. RONEN ZILBERMAN/AFP/Getty Images
Security Brief: Korean War Remains 'Believed to be American'; Cutting Deals with al Qaeda
Catch up on everything you need to know about the credibility of the Korean War remains turned over by North Korea, deal-making with al Qaeda in Yemen, Russia's proposal to cooperate with the United States on rebuilding Syria, and more.


text:
Broadband and DVD Usage Rises
Robert Garcia Tagorda · Tuesday, June 21, 2005 · 3 comments
Welcome to the new millenium:
Dial-Up Internet Going the Way of Rotary Phones (NYT | RSS)
[Michelle] Phillips is among the seven million Americans expected to drop their slow Internet connections this year for high-speed lines, which are as much as 100 times as fast and are always on. As recently as six months ago, a majority of Americans were using dial-up connections at home. In the first quarter of this year, broadband connections for the first time overtook dial-up.
Last year, 36 million American homes, or 52 percent of all households with Internet access, used dial-up services, according to SG Cowen, the brokerage firm. That percentage is expected to drop to 40 percent at the end of this year. At the same time, cable and phone companies are expected to add 8 million broadband subscribers this year, bringing their total to 38.7 million.
In the first quarter of this year, D.S.L. providers signed up a record 1.38 million subscribers, while cable companies added 1.19 million new broadband customers, according to the Leichtman Research Group.
Price is a significant factor in the shift. According to a survey by Goldman Sachs, when broadband connections are priced below $29 a month – closer to the average cost of dial-up service which is around $20 – twice as many consumers sign up.
Blog readers often take high-speed connections for granted. But many people, like some of my relatives, are just becoming familiar with the technology and finding enough usage for it. Every once in a while, it's instructive to read about how the internet is still very much catching on, as it were. Meanwhile:
Americans 'Prefer' DVDs to Cinema (BBC)
Most Americans would now rather watch films at home than at the cinema, a poll has suggested.
Seventy three per cent of adults said they preferred watching movies at home on DVD, video or pay-per-view to going to a cinema.
The survey of 1,000 adults also found that 47% said films were getting worse.
The results come as the US box office experiences its worst slump in 20 years. The number of cinema-goers has dropped for the last two years running.
Just 22% of people said they would rather see films at the cinema, in the survey for the Associated Press news agency and AOL News.
A quarter of those surveyed said they had not been to a cinema in the past year. On the plus side, a third of people believed movies are getting better.
Eighty per cent said they used a DVD player at home.
(Via IndieWire.) These numbers are precisely what I had in mind when I discussed the limitations of quantifying overall moviegoers' opinion.
As an aside, I very much enjoyed Batman Begins. Hopefully, people avail themselves of the opportunity to experience it in the theaters, where such a phenomenon deserves to be seen.
FILED UNDER: Economics and Business, Science & Technology
Tuesday, 21 June 2005 at 07:52
Even some of us blog readers can't get high-speed at a decent price at home, so we're stuck on dial-up.
Scott in CA says:
I used to enjoy certain big movies in the theater. Now, with a 42″ HD TV with surround sound, Doby whatever-version-I have, etc, I just can't be bothered. The last several times I went to the theater, the print was bad, the sound was bombastic, 30 minutes of ads, chatty teens on phones, surly ushers who wouldn't tell them to knock it off, $3 bottle of water, etc. You get the picture, and I am not alone.
Ooops, and they're bringing out those HD DVDs soon, and the new HD TVs are compatable.
The Divide Within Our Parties is Almost as Wide as that Between Them
Vigilante Politics
Is COVID Being Overhyped?