比尔盖茨:记住这三个数据将帮助你理解这个世界

比尔·盖茨近期表示,记住这三个数据将帮助你理解这个世界。

OurWorldInData.org是我最喜欢的网站之一。这个网站设在牛津大学,利用关于从健康、人口增长到战争、环境和能源等方方面面的统计数据,让你深刻了解世界各地人们的生活条件正在发生怎样的变化。我邀请了网站创始人——牛津大学的经济学家麦克斯·罗瑟(Max Roser)——跟大家分享三个所有人都应了解的事实。以下的内容由麦克斯撰写。

在过去的几年里,通过快速的在线搜索,人们很容易就能找到全球发展的许多重要数据。由于现在找到所需信息变得如此容易,很多人认为记住这些数据没有意义。他们说:“需要的时候再查阅下就好了!”

我不同意这种说法。是的,对一些细节,你需要的时候再去搜索数据的确合情合理。但是对于宏大的全球发展问题,了解目前人们生活条件的基本数据,以及过去几十年中我们看到的变化趋势非常重要。了解这些全球变化的事实,能给你提供每日新闻的背景,还能让你真正理解你所掌握的新信息。而且,这也必定是政治辩论的基础,只有这样我们才能去讨论,作为一个社会整体我们应该做什么以及不应该做什么。

因此,我列了一个简短的清单,包含三条我想记住的关于全球生活条件的事实。其中每一条都描述了当前的情况和变化趋势。

事实1:自1960年以来,儿童死亡人数已从每年2000万人下降到每年600万人

想象一下看着自己的孩子死去会多么痛苦。

然后试想一下,每分钟这一情况就会发生在大约11位父母身上。这是平均每分钟的五岁以下儿童死亡数字。24小时内的每分钟都有11名儿童死亡,那每天死亡人数累计为15500人,即每年有560万名儿童死亡。

我们必须接受这一点吗?世界就是这样的吗?

显然不是。我们有很强的能力去推动积极的改变。请看下面的图表。联合国数据告诉我们,现在每年有560万儿童死亡;同时数据也向我们表明,在20世纪50和60年代,世界每年儿童死亡的数据为2000万。

我们很难看到当前世界进步的一个关键原因是,我们不知道过去有多糟糕。

这两种说法都是对的:这个世界比过去要好得多,这个世界仍然很糟糕。

为了记住这一情况,我需要同时知道两边的数据:当有人说我们可以坐下来放松一下,因为这个世界比过去好得多,我会指出每分钟仍有11个孩子死去的事实。我们不能接受现在这样一个世界。而当我在这场悲剧面前感到绝望时,我会记得在过去的五十年里,我们把每年儿童死亡的数量从2000万减少到了560万。

因此,我记得目前的儿童死亡率以及我们看到的变化趋势:儿童死亡人数正在下降,50年前儿童死亡人数是现在的3.5倍。但儿童死亡现象仍然非常普遍,平均每分钟都有11名儿童夭折。

事实2:自1960年以来,生育率下降了一半

全球人口的迅速增长并非不可阻挡。我们之所以知道这一点,是因为在过去几十年中,我们已经看到全球人口变化将终结人口的快速增长。让我们来看看数据。

下面的图表显示了认识世界人口增长情况的关键统计指标——全球生育率,即世界上每名妇女的平均子女人数。当生育率接近2,那么每对夫妇平均被大约两个孩子取代,人口增长缓慢。但是直到20世纪60年代末,每个妇女平均有5个以上的孩子。如此高的生育率,人口增长就很快。当时,每年的世界人口增长率为2%。

避孕工具的供应使得父母想要多少孩子就生多少孩子。这个数字随着人们收入的增加而变化。从几十年的人口统计学研究中,我们了解到女性在获得更好的教育和更好的就业机会时会决定少生孩子。我们还知道,当儿童死亡率下降,家庭不必担心他们的孩子会死亡时,会从一开始就决定少生孩子。

妇女生活条件和儿童健康水平的提高,促使世界各地的生育率迅速下降。事实上,在过去的50年里,全球生育率已经下降了一半,从每个妇女生育超过5个孩子减少为不到2.5个孩子。在过去的50年里,世界人口增长率也下降了一半,仅略高于1%。

我所记住的人口增长统计数据告诉我,人口的快速增长将在本世纪内结束。在过去50年中,全球生育率已从每名妇女生育5个子女降至每名妇女不足2.5个子女。五十年来,生育率已经减半。

事实3:1990至2015年间,每天有13.7万人脱离极端贫困

生活在贫困中意味着生活中许多最重要的东西都遥不可及。贫困人口往往缺乏体面的住房和基本的医疗服务,并且常常买不起足够的食物。

每天必须靠不到1.90国际元(international-dollar,一种可以校正国家之间价格差异和通货膨胀的假定货币)收入生活的人们,被认为处于“极端贫困”状态。

对于贫困的这一定义,用“极端贫困”这个词来概括显然非常恰当:这确实是一条非常低的贫困线。

当你问人们世界是否在对抗极端贫困方面获得了进展时,我们大多数人相信情况正在恶化,相信生活在极端贫困中的世界人口数量正在上升。

但事实恰恰相反,极端贫困人口的数量和比例都在下降:

1990年,18.6亿人每天收入不足1.9国际元,占世界人口比例超过三分之一。25年后,极端贫困人口减少了一半以上,降至7.06亿,也就是十个人中只有一个。

这是一个非常巨大的转变。这意味着过去25年中,平均每一天生活在极端贫困中的人数都比前一天减少了13.7万人。过去25年里,每一天都原本可以有这样的新闻标题:“从昨天到今天,极端贫困人口减少了13.7万人。”

这就是我记得的统计数字:今天,每十个人中就有一个生活在极端贫困之中,全球范围内有7.06亿。数量之多令人无法接受。但我们也应知道,趋势正在朝着好的方向发展。极端贫困人口的数量正在下降。终结极端贫困是可能的。

记住这三个关于世界的事实让我想起了为什么我认为参与全球发展很重要。关于世界现状的统计数字表明,我们不能满足于世界目前的状况,但是关于全球变化的统计数字告诉我们,创造一个更美好的世界是可能的。儿童死亡人数正在下降,人口迅速增长的挑战不会无限期地持续,极端贫困人口的数量正在减少。

让我们继续朝着这个方向前进,过去的成功应该鼓舞着我们为取得更多进步而努力。

Memorizing these three statistics will help you understand the world

One of my favorite websites is OurWorldInData.org. Based at the University of Oxford, it uses statistics—on everything from health and population growth to war, the environment, and energy—to give you phenomenal insight into how living conditions are changing around the world. I asked its founder, Oxford economist Max Roser, to share three facts from the site that everyone should know. Here’s what Max had to say.

–Bill Gates

In the past few years, it has become easy to find many of the important statistics on global development with a quick online search. And since it is now so easy to find the information you need, many argue that it doesn’t make sense to actually remember these statistics. ‘Just look them up when you need them!’ they say.

I disagree with this. Yes, for some details, it makes sense to just search for them when you need them. But for the large global developments, it is important to know some basic statistics that describe living conditions currently and the direction of change that we have seen over the past few decades. Knowing the facts on global changes gives you the context for the daily news and allows you to make sense of new information that you learn. And it must be the basis for political debate, so that we can discuss what we should and shouldn’t do as a society.

And so I compiled a short list of three facts about global living conditions that I want to remember. Each of them describes the current situation and the direction of change.

Fact #1: Since 1960, child deaths have plummeted from 20 million a year to 6 million a year.

Imagine how awful it must be to see your child die.

Then consider that every minute this happens to about 11 parents. This is the number of children, younger than five years of age, who die—on average—every single minute. Eleven deaths every minute for 24 hours add up to 15,500 deaths per day, or 5.6 million deaths per year.

Do we just have to accept that? Is that just how the world is?

Clearly no. We are very much able to drive positive change. Look at the chart below. The same UN data that shows us that 5.6 million are dying today also shows us that in the 1950s and 60s the world saw around 20 million children dying every year.

One key reason why we struggle to see progress in the world today is that we do not know how very bad the past was.

Both are true at the same time: The world is much better than in the past and it is still awful.

To bring this to mind I need to know both statistics: When someone says we can sit back and relax because the world is in a much better place, I point out that 11 children are still dying every minute. We cannot accept the world as it is today. And when I feel hopeless in the face of this tragedy, I remember that we reduced annual child deaths from 20 million to 5.6 million in the last fifty years.

So I am remembering the current extent of child mortality and the direction of change that we have seen: The number of child deaths is falling; there were 3.5-times as many child deaths 50 years ago. But child deaths are still extremely common; 11 children are dying every minute.

Fact #2: Since 1960, the fertility rate has fallen by half.

The chart below shows the key statistic to understand about world population growth: the global fertility rate—the average number of children per woman in the world. When the fertility rate is close to 2 children per woman, so that every couple is on average replaced by about two children, population growth is slow. But until the late 1960s, each woman had on average more than 5 children, and at such high fertility rates, population growth is fast. At that time the world population increased by 2 percent every year.

The availability of contraceptives allows parents to have only as many children as they want. And that number changes as people’s income goes up. From decades of demographic research, we know that women decide to have fewer children as they get access to better education and better opportunities in the job market. We also know that when child mortality falls, so that families do not need to fear that their children will die, they consequently decide to have fewer children in the first place.

Improvements in conditions for women and the health of children have driven a rapid reduction in fertility rates across the world. In fact, the global fertility rate has halved in the last 50 years, from more than 5 children per woman to fewer than 2.5 children. The world population growth rate has also halved in the last 50 years and is just above 1 percent.

The statistic that I remember on population growth is the one that tells me that rapid population growth is coming to an end in this century. In the last 50 years the global fertility rate has fallen from 5 children per woman to less than 2.5 children per woman. In fifty years the fertility rate has halved.

Fact #3: 137,000 people escaped extreme poverty every day between 1990 and 2015.

Living in poverty means that many of the most essential things in life are out of reach. People in poverty tend to lack decent shelter and basic healthcare, and they often struggle to afford adequate food supplies.

People are considered to live in‘extreme poverty’if they have to get by on less than 1.90 international-dollars per day, which is a currency that corrects for price differences between countries and inflation.

In this definition of poverty, the term extreme poverty is clearly appropriate: this is a very low poverty line.

When you ask people whether the world is making progress against extreme poverty, the majority of us believe things are getting worse—that the number of people in extreme poverty in the world is rising.

The opposite is true. Both the number and the share of people in extreme poverty is falling:

In 1990, 1.86 billion people were living on less than 1.90 international-$ per day—more than every third person in the world. Twenty-five years later, the number of people living in extreme poverty has more than halved to 706 million, every tenth person.

This is a very large transformation. It means that, on average, every day for the past 25 years 137,000 fewer people were living in extreme poverty than the day before. On every day in the last 25 years there could have been a newspaper headline reading,“The number of people in extreme poverty fell by 137,000 since yesterday.”

This is the statistic I remember: Today every 10th person is living in extreme poverty—706 million people. An unacceptably large number of people. But we should also know that the trend is moving in the right direction. The number of people in extreme poverty is falling. It is possible to end extreme poverty.

Remembering these facts about the world brings to mind why I think it is important to get engaged in global development. The statistics on the current state of the world make clear that we cannot be complacent about the world as it is today. Especially because progress is uneven, and in sub-Saharan Africa progress has been slower, but is not absent. The statistics on global change over time tell us that it is possible to work for a better world. The number of child deaths is dropping. The challenges of rapid population growth will not continue indefinitely. And the number of people in extreme poverty is falling.

Let’s continue in this direction. Our past successes should encourage us to work for more progress.

文章来源:http://it.ithome.com

原文地址:https://www.ithome.com/html/it/367840.htm

算细账!个税新版“税率表”公布,看看你每月将少缴多少钱?

IT之家6月30日消息 备受社会关注的个人所得税法修正案(草案)29日向全社会公开征求意见。根据草案,修正案自2019年1月1日起施行,而工资、薪金收入5000元“起征点”有望自今年10月1日至12月31日的过渡期内率先开始实施。

《草案》还给出了“起征点”上调后的新版税率表。过渡期内,个人所得税税率也将按照新的税率表执行。

“起征点”上调,税率结构优化调整,一系列改革动作后,你每月会少缴纳多少钱?一图看懂↓

文章来源:http://it.ithome.com

原文地址:https://www.ithome.com/html/it/367839.htm

大数据开发之路—Java基础(一)



因为最近工作用到java,所以了解一些java的知识,当然这篇文章也是适用于有语言基础的,因为是用于快速熟悉java的一些语法规范,并没有整理细节的内容,零基础的不适合看这篇文章

Hello world

老规矩先来hello world代码:

package study_java.ex01;

public class HelloWorld {
    public static void main(String[] args){
        System.out.println("hello world");
    }
}

注释

// 表示单行注释
/* */ 表示多行注释

Java语言的关键字

Java关键字的特点:
组成关键字的字母全是小写
常碰到的关键字有:

标识符要求(变量)

  • 不能数字开头
  • 不可以使用关键字
  • 严格区分大小写

Java中的名称规范:

  • 包含多词组组成时,都小写
  • 类名接口名,多个单词组成时,使用大驼峰方式
  • 变量名和函数名:多个单词组成时,小驼峰法
  • 常量名:所有的字母都大写,多单词时每个单词用下划线连接

常量

不能改变的数值

整数常量
小数常量
布尔型常量
字符串常量
null常量

变量

数据类型 变量名 = 初始化值

变量的作用范围,就是它所在的{}内部

 

 自动类型转换也叫隐式类型转换
强制类型转换也叫显式类型转换

 

package study_java.ex01;

public class TypeConvert {
    public static void main(String[] args){
        byte b = 100;
        int i = b;   // 这里就是进行了隐式转换

        byte b2 = (byte)i;   // 这里是显式转换
        System.out.println(b2);
    }
}

表达式的数据类型自动提升:
byte short char 提升到int

 

    byte b3 = 3;
    int x = 4;
    x = x + b3;     // b3会自动提升为int类型进行运算
    System.out.println(x);

运算符

算术运算符

赋值运算

= += -= *= /= %=

比较运算符

逻辑运算符

 

位运算符

关于三元运算
实例代码:

package study_java.ex01;

public class IfDemo {
    public static void main(String[] args){
        int age = 100;
        if(age <= 50){
            System.out.println("小");
        }
        else{
            System.out.println("大");
        }

        // 更改为三元运算
        String str = age <= 50 ? "小":"大";
        System.out.println(str);

    }
}

流程控制

判断结构

 

 

选择结构

 

switch语句特点:
switch 语句只有四种类型的表达式:byte short int char

case 之间与default没有顺序,先执行第一个case,没有匹配的case执行default
结束switch语句有两种情况:遇到break, 执行到switch语句结束

如果匹配的case或者default没有对应的break,那么程序会继续向下执行,直到遇到break或者switch结束

代码例子:

package study_java.ex01;

public class SwitchDemo {
    public static void main(String[] args){
        char x = 1;
        switch(x){
            case 1:
                System.out.println("x=1");
                break;
            case 2:
                System.out.println("x=2");
                break;
            case 3:
                System.out.println("x=3");
                break;
            default:
                System.out.println("x=?");
                break;

        }
    }
}

循环结构

while循环

代码例子:

 

package study_java.ex01;

public class WhileDemo {
    public static void main(String[] args){
        int i = 0;
        while (i <= 10) {
            System.out.println(i);
            i++;
        }
    }
}

代码例子2:

 

package study_java.ex01;

public class WhileDemo2 {
    public static void main(String[] args){
        int i = 1;
        int sum =0;
        while (i <= 100){
            sum += i;
            i += 1;

        }
        System.out.println(sum);
    }
}

do while 循环

代码例子:

 

package study_java.ex01;

public class DoWhileDemo {
    public static void main(String[] args){
        int i = 1;
        do {
            System.out.println(i);
        }while (i > 10);
    }
}

for循环

代码例子:

 

package study_java.ex01;

public class ForDemo {
    public static void main(String[] args){
        for(int i = 0;i<10;i++){
            System.out.println(i);
        }
    }
}

打印一个九九乘法表:

package study_java.ex01;

public class ForDemo3 {
    public static void main(String[] args){
        for(int i = 1;i < 10;i++){
            for (int j = 1;j <= i;j++){
                System.out.print(j + "*" + i + "=" + i*j + "\t");
            }
            System.out.println();
        }

        System.out.println();

        for (int i = 9; i>0;i--){
            for (int j = 1;j<=i;j++ ){
                System.out.print(j + "*" + i + "=" + i*j + "\t");
            }
            System.out.println();
        }
    }
}

打印一个实心和空心的三角形

package study_java.ex01;

public class ForDemo4 {
    public static void main(String[] args){

        for(int i=1;i <= 5;i++){
            for(int j = 1; j<=9;j++){
                if (j <= 5-i){
                    System.out.print(" ");
                }
                else if (9-j < 5-i){
                    System.out.print(" ");
                }
                else {
                    System.out.print("*");
                }
            }
            System.out.println();
        }

        System.out.println();

        for(int i = 1;i<= 5;i++){
            for(int j = 1;j<=9;j++){
                if (i == 5){
                    System.out.print("*");
                }
                else if (j == 5-i+1){
                    System.out.print("*");
                }
                else if ( 9-j == 5-i){
                    System.out.print("*");
                }
                else {
                    System.out.print(" ");
                }
            }
            System.out.println();
        }
    }
}

函数

函数就是定义在类中的具有特定功能的一段独立小程序
函数也称为方法

修饰符 返回值类型 函数名称(参数类型 参数名称,…) {
执行语句;
return 返回值;
}

函数特点:

封装功能
重用
调用时才会被执行
对于函数没有具体的返回值的情况,返回值类型用关键字void表示,那么该函数中的return语句如果在最后一行可以省略不写

注意:
函数中只能定义调用函数,不可以在函数内部定义函数
定义函数时,函数的结果应该返回给调用者,交给调用者处理

一个简单的函数例子:

package study_java.ex01;

public class FunctionDemo1 {

    public static void main(String[] args){
        int res = add(10,20);
        System.out.println(res);
    }

    public static int add(int a, int b){
        return a + b;
    }
}

函数递归:

通过阶乘的两种写法来理解,其实就是自己调用自己:

public static int fabric(int n) {
    int res = 1;
    for (int i=1;i<=n;i++){
        res *= i;
    }
    return res;
}

public static int fabric2(int n) {
    if (n == 1) {
        return 1;
    }
    else {
        return n * fabric2(n-1);
    }

}

函数重载

在同一个类中,允许存在一个以上的同名函数,只要它们的参数个数或者参数类型不同即可

重载的特点:
与返回值类型无关,只看参数列表
例子代码:

package study_java.ex01;

public class FunctionDemo2 {
    public static void main(String[] args){
        add(10,3,2);
    }
    // add
    public static int add(int a, int b){
        return a+b;
    }

    // 重载add
    public static int add(int a, int b, int c){
        return a + b + c;
    }
    // 重载add
    public static float add(int a, float b) {
        return a + b;
    }

    // 重载add
    public static float add(float a, int b) {
        return a + b;
    }

}

函数的可变参数:

public static int multiply(int... xyz){
    int sum = 0;
    for (int i =0;i <xyz.length;i++){
        System.out.println(i);
        sum += i;
    }
    System.out.println(sum);
    return sum;
}

数组

同一种类型数据的集合,其实就是一个容器
可以自动给数组中的元素从0开始编号,方便操作这些元素

元素类型[] 数组名 = new 元素类型[元素个数或者数组长度]
例子 int [] arr = new int[5]
或者:

元素类型[] 数组名 = new 元素类型[元素,元素,….]
int [] arr = new [1,2,3,4]

数组这里的一些练习题,通过一些排序来熟悉:
冒泡排序,以及选择排序

package study_java.ex01;

public class BubbleDemo1 {
    public static void main(String[] args) {
        int[] arr = {1,4,90,22,12,20,99};
        select(arr);
        for (int i =0;i<arr.length;i++){
            System.out.println(arr[i]);
        }
    }

    public static void bubble(int[] arr){
        int tmp = 0;
        for (int i= 0; i< arr.length -1;i++){
            for (int j=0;j<arr.length -1 - i;j++){
                tmp = arr[j];
                if (arr[j] > arr[j+1]){
                    arr[j] = arr[j+1];
                    arr[j+1] = tmp;
                }
            }
        }
    }

    public static void bubble2(int[] arr){
        int tmp =0;
        for (int i = 0; i < arr.length-1;i++){
            for (int j=0;j<arr.length-1-i;j++){
                tmp = arr[j];
                if (arr[j] < arr[j+1]){
                    arr[j] = arr[j+1];
                    arr[j+1] = tmp;
                }
            }
        }
    }

    public static void select(int[] arr){
        int tmp = 0;
        for(int i = 0;i < arr.length-1;i++){
            int min_loc = i;
            for (int j=i+1;j<arr.length;j++){
                if (arr[j] < arr[min_loc]){
                    min_loc = j;
                }
            }
            tmp = arr[i];
            arr[i] = arr[min_loc];
            arr[min_loc] = tmp;
        }
    }
}

 


文章来源:http://www.cnblogs.com

原文地址:https://www.cnblogs.com/zhaof/p/9248913.html

清华大学晒“清华园”2018新版录取通知书,网友:分不够,要不起

IT之家6月30日消息 此前全国高考录取分线已经公布,高考志愿正在填报中,又到了各大高校抢人的时候了,就连清华大学也不例外。今天清华大学在微博上表示,一份由清华师生共同打造的这份手工定制、独一无二的2018新版录取通知书,已经整装待发。当然你需要先报考清华大学才行。

清华大学晒出了这份独特的2018新版录取通知书,亮点就是“清华园”大门模型很别致,希望大家可以穿过这座“二校门”,进入清华大学的校园和课堂。

清华大学新版录取通知书中将夹带一份激光雕刻的3D清华“二校门”纸雕工艺品,有30多件纸艺部件,上百个拼插结构,经激光雕刻、建材、拼插组装,由清华师生打造。打开通知书,二校门就会跃然纸上。

亲爱的同学,你好!

你的高考志愿填完了吗?

是不是在焦急地等待录取通知书?

如果你选择了清华,那么恭喜你!

由清华师生共同打造的这份手工定制、独一无二的2018新版录取通知书,

已经整装待发。

当你在盛夏八月穿过这座“二校门”,

一个全新的世界将在你面前徐徐铺开,

一个崭新的清华将等待你探索与创造。#我在清华等你来# #我在大学等你#

不过评论里大部分网友却表示,

很努力了,可终究差几分。。。[微风]

要不起你的录取通知书啊[吃瓜][吃瓜]

我分不够[泪][泪][泪] 但好想要,能送个样品么

好的 已经报了 请问通知书是等统一发放还是自己去领

20年后,儿子,清华见[馋嘴][馋嘴][馋嘴]

下面是清华大学2018新版录取通知书更多展示,创意十足。

文章来源:http://it.ithome.com

原文地址:https://www.ithome.com/html/it/367837.htm

95后工作了!4000名小鲜肉在苏宁“C位出道”

六月毕业季过后就是职场新人入职季。今年夏天,越来越多95后将踏入职场。在经济繁荣大背景下出生成长,又是互联网原住民,95后有着鲜明个性,渴望实现自我价值。对企业而言,如何接纳并培养这些“新鲜社会人”,开始成为重要课题。

悄然间,苏宁已经开启行动:从6月29日起,来自海内外众多顶级名校的4000多名高校毕业生,将在一周内陆续抵达苏宁总部,参加入职迎新仪式。他们是苏宁1200工程十六期管培生,多数是95后,有颜值更有才华,被亲切地称为“小石榴”。针对这批年轻人,苏宁推出了系统培养规划及创新举措,鼓励他们大胆拼,而这次迎新也显得别具一格,让“新鲜社会人”的“职场生涯第一站”不仅平稳顺利,更充满惊喜与创意。

(图示:苏宁1200工程十六期管培生入职合影)

入职上演“C位出道” “极限挑战”拼才华

“当我们还在幽默调侃90后因职场焦虑而产生脱发困扰的时候,95后已经离开校园成为了我们的同事与伙伴”,苏宁1200工程招聘负责人笑着说:”以往按部就班的入职报到,确实有点枯燥甚至冗长,于是我们做了大胆创新。“

刚刚抵达报到大厅,这群初出校园的小鲜肉们很是惊喜。原来,为了契合年轻人活力、青春的风格,苏宁特地准备了“我在苏宁C位出道”的入职迎新仪式:新人组队在苏宁总部基地不同的“网红打卡点”,如电影院、健身房、餐厅、篮球场等区域进行打卡,完成指定小游戏,最终便可在苏宁“C位出道”,正式完成入职。“这简直像在玩现场版的《极限挑战》,太有意思了!”小鲜肉们摩拳擦掌,跃跃欲试。

(图示:完成入职挑战的1200工程十六期管培生)

毕业于北京大学的小刘格外激动,他和即将同去苏宁科技集团报到的几名1200管培生组成一队,开始“打卡挑战”。没想到首站健身房,他们就碰上了难题:40秒平板撑挑战难倒了好几个瘦弱的小姑娘,时间一分一秒过去,队友们分享技巧、加油打气,最终硬是“拼”下来了;而到了餐厅,眼前的场面则让他们连连尖叫:刺身龙船、龙虾、香煎牛排……一场丰盛的美食盛宴正等着他们。据透露,这些诱人的“鲜食”都是苏宁员工餐厅的大厨们比照江苏苏宁名脚特谢拉同款餐食做的,特地献给新来的1200“小石榴”们。

(图示:在苏宁餐厅品尝美食的1200工程十六期管培生)

“这一路的打卡挑战真的很奇妙,大家一起玩,很快就熟络了。而且最让我惊喜的是,在苏宁既能健身又能看电影,每天还能吃到这么多美食,简直太幸福了。”小刘和小伙伴们手拿打卡成功的纪念品“世界杯吉祥物玩偶”,笑得格外灿烂,“我在苏宁C位出道啦!”

“我们希望通过这个仪式,给他们一个难忘的‘苏宁入职初体验’,一方面通过在总部基地各处打卡,可以快速了解和融入公司的工作生活场景;另一方面通过游戏过程中的互助努力,快速培养团队协作的默契与感情”,上述负责人介绍到,“当然,营造创新开放的氛围,最终还是为了让他们在工作上拼才华、拼业绩,实现个人价值。”

注入新鲜血液  “秘密武器”再升级

“人力资源是苏宁最宝贵的资源,自主培养是干部的最重要来源之一。”苏宁控股集团董事长张近东历来重视人才培养,早在16年前就亲自创立“1200工程”自主培养人才:苏宁当时在全国招聘1200名大学毕业生,“1200工程”就此得名。这些年来,苏宁靠这个“秘密武器”破解人才难题,它也成为助力苏宁发展的基础性工程,推动苏宁从“小舢板”变成了拥有零售、物流、金融、科技、置业、体育、文创、投资等八大产业的“超级航母”。

“苏宁1200管培生意味着‘三高’,即高压力、高责任、高管带教。”苏宁CHO孟祥胜如是说。苏宁将1200管培生定位为事业接班人,对每位1200进行系统的培训,项目的历练,让他们在压力中成长,在成长中实现价值。而事实也表明,许多优秀的1200干部已经承担了重要职责,实现自我价值:数据显示,苏宁总裁级别干部中的1200管培生占19%,总经理、总监级别则达到30%。

伴随苏宁新一轮转型变革,1200工程在2013年也升级为“优中选优、重能力、重创新”的“管培生模式”,对应聘者的挑选更为严格,也因为如此,越来越多的起点更高、素质更好的优秀毕业生纷纷加入,为苏宁发展注入新鲜血液。以1200工程十六期为例,毕业于国内如清华、北大、南大等顶级名校的超100人,“双一流”院校的毕业生更为数众多,海外毕业生近300人,其中不乏来自美国哥伦比亚大学、美国卡内基梅隆大学、英国伯明翰大学、日本早稻田大学等名校的学子;从专业来看,金融数学、供应链管理、数据科学、计算机等高大上专业比比皆是,这也从侧面印证了苏宁智慧零售的迅猛发展对高端人才的迫切需求。

对于这批年轻的1200,张近东也寄予了厚望,鼓励他们要敢拼敢闯。他在与1200管培生沟通时曾说:“有人说很多95后都非常‘佛系’,但是我要告诉大家,在苏宁要坚决杜绝‘佛系’心态。年轻人还是要‘燃’一点,要有危机感,有竞争意识,不拼、不闯,就永远不会看到诗和远方。”

(图示:张近东与苏宁1200工程十六期管培生合影)

事实上,95后看似年轻,但也有了较成熟的价值观。《2018年应届毕业生就业力市场调研报告》显示,41.70%的应届毕业生认为,找工作时最看重的因素是“工作是我实现个人价值的重要部分”,26.97%的应届毕业生认为“工作必须符合我的兴趣,做人开心最重要”。在越来越多的95后眼中,一份好工作的核心标准不再是“钱多事少离家近”,而是能够在职场中实现自我价值,并从事符合自己兴趣爱好的工作。他们不仅关注当下的发展,也看重未来的成长潜力。这一新现象,恰与苏宁1200工程培养目标不谋而合。

Jack Dong便是一名1200十六期管培生,他毕业于美国南加州大学计算机科学与电子工程硕士专业,在2017CES期间,他参观了苏宁展区,现场展示的大数据、物联网、人工智能等前沿技术让他产生了浓厚的兴趣。“苏宁提出‘智慧零售’,并以此为核心构筑了一整套的解决方案,让我看到了它作为一家世界500强企业的雄心布局和广阔的发展前景。”Jack直言,他希望在这里用所学贡献一份力量,也会鼓励更多的学弟学妹来加入苏宁。

“日前,苏宁1200工程十七期校园招聘已经启动内推,2019届的毕业生们,只要找到这些‘小石榴’们,就可以得到被推荐的机会,而能够提前进行面试。“苏宁1200工程招聘负责人介绍到。

文章来源:http://it.ithome.com

原文地址:https://www.ithome.com/html/it/367835.htm

大阵仗,今年夏天有4000颗“小石榴”涌入狮厂!

“你多大”“96的”“96年都出来找工作了?!”

这一对话在这个夏天格外常见。近期在苏宁应届生员工入职现场,就有不少95后年轻面孔。据统计,4000名高校毕业生将作为第16期1200工程的“事业接班人”入职苏宁,人送外号——“小石榴”。16年前,苏宁控股集团董事长张近东创立“1200工程”自主培养人才:苏宁当时在全国招聘1200名大学毕业生,“1200工程”就此得名。

“小石榴”们中,不仅有北大、清华、浙大等国内顶级高校的学霸,更有来自美国哥伦比亚大学、美国卡内基梅隆大学、英国伯明翰大学、日本早稻田大学等近300位国际院校“大牛”。入职后,高管带教、系统培训等职业规划将帮助他们成为苏宁的“秘密武器”。

在近10天的入职迎新活动中,狮厂为“小石榴”们打造了全新的“入职初体验”,帮助他们完成“社会人”的转变。

(奇怪,仿佛有小岳岳乱入了呢)

为了迎合年轻人活力、青春的风格,苏宁特地准备了“我在苏宁C位出道”的入职迎新仪式,通过在苏宁总部不同的“网红打卡点”如电影院、健身房、餐厅、篮球场等场地打卡,并完成指定小游戏,最终成功在苏宁“C位出道”,便可正式完成入职。

入职办理地点作为第一站,同时寓意着从走入职场的地点出发起航。第一个关卡便是团队体力大考验,一分钟内跳绳100下即为通过,虽然小伙伴们的能力不同,但在团队成员的帮助下六组成员全部挑战成功!打卡完成!出发前往下一个目标地点。紧接着前往苏宁影城、苏宁小店、员工健身房、公寓等点位打卡。团队配合完成打卡闯关,绝对棒棒哒。

外面艳阳高照,特色餐厅的美食早已在等待欢迎他们!这天,苏宁食堂还上演了一场“吃货界的维密秀”,用美食来迎接“新鲜”的新人。刺身龙船、顶级牛排、香煎龙利鱼等20多道高级菜品惊现苏宁食堂。据相关负责人表示,这些“鲜食”都是比着江苏苏宁名脚特谢拉同款餐食制作,现场“小石榴”纷纷拿出手机拍照,在朋友圈“晒美食”,“晒入职”。糟糕,这就是心动的感觉!

十多年来,“1200工程”这个人才培养的“秘密武器”,已经成为苏宁各级管理干部的重要组成部分。据统计,“1200”在苏宁各层级中占比,总裁级达到19%,总经理及总监级达到30%,在中层骨干中也已达到了较高的比例。

对于这批“小石榴”,苏宁控股集团张近东也寄予了厚望,鼓励他们要敢拼敢闯。他在与1200管培生沟通时说:“有人说很多95后都非常‘佛系’,但是我要告诉大家,在苏宁要坚决杜绝‘佛系’心态。年轻人还是要‘燃’一点,要有危机感,有竞争意识,不拼、不闯,就永远不会看到诗和远方。”

文章来源:http://it.ithome.com

原文地址:https://www.ithome.com/html/it/367834.htm

你的公积金基数调了多少?支付宝可查全国超120个城市

IT之家6月30日消息 从7月1日开始,全国多个城市将调整职工住房公积金的缴存基数,想知道你的公积金调整了多少吗?支付宝表示能查了。用户可以在支付宝内搜索“公积金”,选择自己所在的城市后即可操作查询,支持全国超120个城市。

下面是具体说明:

文章来源:http://it.ithome.com

原文地址:https://www.ithome.com/html/it/367833.htm

微信朋友圈频频“诈尸”的旧号,为何广告满天飞

“在我朋友圈发了一年广告的你,请把广告费结了。”

这曾是社交平台上相当流行的一个搞笑段子。可见不少网友对于朋友圈那些滥发广告者的行为,早已不胜其烦。也有人戏称,要是朋友圈没个一两条广告,都不好意思说自己在用微信。

“特别奇怪,(最近)有些很久都没更新朋友圈的好友,突然开始发小广告了。”读者李琰给懂懂笔记来信“举报”,多年来自己加好友都十分谨慎,一般不可能加到微商或营销人员。但近期朋友圈里突然有几个人开始狂发广告,这些账号名称和头像又的的确确是自己曾经认识的朋友。但是其所发的内容与好友的工作内容完全不相符,这让他摸不着头脑。

“直接删了(对方)有点不大好意思,又不好直接私聊问个究竟。”这让习惯刷朋友圈的李琰开始有点儿烦了,不得已只能选择屏蔽掉那些“霸屏”发广告的好友。

为什么这些很久都不更新一次朋友圈的好友,突然间就“诈尸”了,这背后到底是怎么一回事?

长期不用的微信号,成了“广告栏”

如今,有不少网友都拥有两个甚至更多的微信账号。目的是和拥有多个手机号码一样,用于将生活与工作区分开来——一边是亲友,一边是公务。

从事金融行业的白领张宇彤,便是其中一员。只不过最近这一个月里,发生在她朋友圈里的怪事却远比读者李琰所遭遇到的,还要离奇得多。

“最近总有旧同事短信通知我,说我的朋友圈在滥发广告。”她告诉懂懂笔记,前同事所说的微信号,指的是她曾经使用过的一个工作账号。然而,在换了好几份工作之后,这个号不仅没有登陆过了,而且早就淡忘了。

对此十分纳罕的张宇彤,试着去登录一下账号,想看看是否如前同事所说的那样出现了异常。然而让她意想不到的是,这个早期并没有设置保密措施的账号,直接提示密码错误无法登陆了。

“于是我向官方提出了申诉,过程十分繁琐,客服电话也常打不通。”她无奈表示,在经历了数次申诉并提交了大量使用证据之后,她终于将这个久而不用的“工作号”拿了回来。

只不过,这个微信号的“使用情况”却让张宇彤感到非常吃惊。这个号不仅朋友圈发布了大量博彩网站以及外围码广告不说,链接的“钱包”余额也有几笔转账记录。最新的一笔转账,就发生在她将账号申诉回来的前一天。

和张宇彤有着类似遭遇的海淘卖家涂丽也告诉懂懂笔记,最近有一位老微信号上的客户,突然打电话给她,控诉说被她欺骗了。

“说是一个月前看到我发的潮鞋海淘信息就下单购买了,结果收到的全是假货。”她对此很郁闷,自己已经很久没有从事鞋服代购了,加上老账号也有两年没登录了,更不可能有新的信息发布。

于是,她便通过辅助验证的方式重新拿回并登陆了这个旧账号。却发现朋友圈已面目全非,各类鞋服、化妆品、奢侈包代购广告泛滥成灾。

上线后,涂丽就陆续收到了几十条怒斥她的未读信息。而这些信息有不少是那些被代购广告欺骗,购买了高仿假货的老客户发的。要不是其中一位关系亲近的买家打来电话“控诉”,她甚至还被蒙在鼓里。

让张宇彤和涂丽都难以理解的是,已经淡忘或者久而不用的账号,为什么会出现类似密码错误、无法登陆等问题。为什么朋友圈会在毫不知情的情况下,被大量来路不明的广告所“占领”。

实际上,让人后怕的不仅是朋友圈的“诈尸”现象,“诈尸”的账号背后更有玄机。

认证微信号可交易,需求暴增

“不同的用途价格也不同。”

通过高人指点,在某世界杯看球“竞猜”群中懂懂笔记找到了一位“账号”卖家。对方表示,这一类微信号现在一号难求,所以价格也都不便宜。大多都在200~500元之间,有些好友数量超级多的“老”账号,价格甚至可以接近千元。

“现在每个人能够注册的账号很有限,所以需求很大。”这位卖家表示,对于许多机构的销售人员来说,线下的获客成本越来越高,线上用户资料也就十分珍贵。

所以,有些机构和个人就需要购入这一类自带用户(好友),并使用了一段时间的微信号。除了用于宣传之外,还能挖掘新的客户,获取较高的信任感,在洽谈业务时事半功倍。

“至于微商的需求就更不用说了,他们本来就是靠好友圈卖东西的。”这位“卖家”表示,许多微商经常在他这儿购买微信账号,尤其是那些已经绑定了银行卡、用户信息的高价账号。这样的账号到手之后,甚至还可以进行交易,无论是转账、收款都不受限制。

即便这些账号有一段时间没有使用,但好友之间的信任度还是比较高的,哪怕“诈尸”直接发广告、推商品,一般也不会被好友删除。甚至有的好友认为是账号的主人转型在卖产品,还会主动找上门咨询购买。

“反正都是文字沟通,对方真假又不知道。”这位“卖家”坦言,正因为这些微信账号有如此好处,所以有部分微商一买就是好几十个。在利用朋友圈做推广之余,还能当群控账号使用,不断增粉。

除了销售人员之外,售卖赌博、诈骗信息的不法分子,也都热衷于购买类似的账号。尤其在世界杯期间,有不少外围私彩机构通过使用他人认证过的微信号进行非法交易,以此收取赌资。此举一是球赛场场爆冷可以随时卷款“跑路”,二是可以隐藏真实身份,以规避一定法律风险。

“这些账号能不能长期用,有时候要看运气的。”从事金融产品销售的李嘉(化名)告诉懂懂笔记,自己曾购买过几十个类似久而不用的“僵尸”号用于推广。但有一部分账号会在使用一段时间之后,突然被原主人通过申诉、验证等方式找回,“如果短时间内被主人找回,卖家也许会补送一个账号,要是时间长一些就没人管了。”

他知道“客户”所信任的,仅仅是账号原有主人的昵称和头像,而并非是他。但是这些拥有大量强关系好友的微信号,的确能帮助他在业务推广方面取得新的突破。他感觉即便多花些钱,有时候也是很值的。

那么,这些需求紧俏的微信“诈尸号”,灰产又是从哪儿弄来的呢?

从盗号到买号,只为抢夺“广告位”

在李嘉的推荐下,懂懂笔记联系上了另一家从事微信账号交易的灰产卖家,并以批发买家的身份进行了咨询。

“最少保用半年,如果少于半年可以来找我。”这位自称叫“光哥”的卖家表示,很多早期的账号几乎都是通过盗号的方式取得的。

倘若用户使用的是安卓手机,又喜欢使用未经安全认证的路边应用或插件,就很有可能将其用于盗号的违规应用,也一并装进了手机里,进而自动抓取用户的使用动作。

根据其使用的频率进行比对分析,如发现在抓取的资料中,有部分是用户不经常使用的所谓“小号”,那么就十分容易成为被盗号的目标。

此外,光哥还表示,早期有些用户并不重视“小号”的保密认证,甚至连实名电话号码都未曾绑定,安全登录保障也并未开启,因此,就会让那些“懂技术”的人有机可乘,轻易窃取了微信号的控制权。

“之所以现在价格高,原因是市场需求大,其次是盗号更难了。”他直言,由于微信经历了多次版本升级,微信号的安全系数也提高了不少。现在想要再通过安装盗号应用的方式获取用户账号,难度也大了许多。

虽然“光哥”和团队也曾想过盗取部分常用微信的账号密码,但过不了多久,用户就都能够通过申诉找回。异地换机登录均需要验证的机制,也使得账号改密的过程变得更为繁琐。

“所以,有部分新到手的微信号其实就是买的。”光哥告诉懂懂笔记,他和许多同行一样,在某二手电商平台上挂了一些收购微信号的信息,几乎每天都有近百人在网上咨询回收的价格。

尤其是部分生活花销比较大的上班族和大学生,会比较愿意将不用或少用的“小号”进行变现。“收号一般都是100~300元左右,看好友数量和认证情况,每天收几十个不成问题。”

有了用户的“配合”,收号者在修改账号密码,验证安全信息的过程中自然也就十分顺利。“光哥”自信地表示,买卖微信号这一行的圈子并不大,即便透露了回收账号的渠道和方式,一般也很少有人能够进到这个圈子里。

不过,如果不懂得如何分辨账号好友质量、朋友圈真假,就很容易让部分骗子有机可乘。有时候,收号者也会收到有意用群控软件造出来的僵尸账号,导致“吃了哑巴亏”。

当刷朋友圈成了所有微信用户的日常习惯时,朋友圈也就成了成本低、转化率高的“广告圈”。除了官方植入的广告之外,许多灰产、销售也都开始瞄准了这一建立在信任关系上的黄金“广告位”,甚至试图窃取这一“广告位”上的流量资源。

再小的个体,也有举足轻重的影响力。因此,我们每个人在使用微信等自带“信任光环”的朋友圈时,还要多加谨慎小心。对于不常用的账号,建议将银行卡等带有个人信息的内容解除绑定,不要忽略任何官方提示使用的保密工具,更不要因为一点蝇头小利出卖个人账号。

很多人是无心,也有人是习惯了“人走茶凉”,旧号、工作号往往是随手丢在脑后。但是这些“号”从某种程度上说也是你的人品和信誉的过往,你的疏忽很容易给曾经的朋友,给自己带来更大的麻烦。

文章来源:http://it.ithome.com

原文地址:https://www.ithome.com/html/it/367829.htm

一加手机将提供三年的安全更新

智能手机是新时代的个人电脑,然而大部分智能手机并不能像安装 Windows 或 Linux 系统的 PC 那样获得长时间更新,Android 生态系统的更新状况尤其复杂。现在,在西方颇受欢迎的深圳手机公司一加
公布了它的更新策略:两年定期软件维护,包括新特性,新版本升级,以及两个月一次的安全更新;外加一年的安全更新。一加手机将提供三年的安全更新。Google 的 Android 每个月会释出一次安全更新,但一加只承诺两个月一次的安全更新。大部分知名 Android 厂商只提供两年的更新,而 Google 为自己的旗舰手机 Pixel 提供了三年的重大更新,苹果则能提供五年的更新。

文章来源:http://www.solidot.org

原文地址:http://www.solidot.org/story?sid=57033

MyBatis入门



安装

要使用 MyBatis, 只需将 mybatis-x.x.x.jar 文件置于 classpath 中即可。
如果使用 Maven 来构建项目,则需将下面的 dependency 代码置于 pom.xml 文件中:

<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>x.x.x</version>
</dependency>

从 XML 中构建 SqlSessionFactory

每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先定制的 Configuration 的实例构建出 SqlSessionFactory 的实例。

从 XML 文件中构建 SqlSessionFactory 的实例非常简单,建议使用类路径下的资源文件进行配置。但是也可以使用任意的输入流(InputStream)实例,包括字符串形式的文件路径或者 file:// 的 URL 形式的文件路径来配置。MyBatis 包含一个名叫 Resources 的工具类,它包含一些实用方法,可使从 classpath 或其他位置加载资源文件更加容易。

String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

XML 配置文件(configuration XML)中包含了对 MyBatis 系统的核心设置,包含获取数据库连接实例的数据源(DataSource)和决定事务作用域和控制方式的事务管理器(TransactionManager)。XML 配置文件的详细内容后面再探讨,这里先给出一个简单的示例:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="org/mybatis/example/BlogMapper.xml"/>
  </mappers>
</configuration>

当然,还有很多可以在XML 文件中进行配置,上面的示例指出的则是最关键的部分。要注意 XML 头部的声明,用来验证 XML 文档正确性。environment 元素体中包含了事务管理和连接池的配置。mappers 元素则是包含一组 mapper 映射器(这些 mapper 的 XML 文件包含了 SQL 代码和映射定义信息)。

不使用 XML 构建 SqlSessionFactory

如果你更愿意直接从 Java 程序而不是 XML 文件中创建 configuration,或者创建你自己的 configuration 构建器,MyBatis 也提供了完整的配置类,提供所有和 XML 文件相同功能的配置项。

DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
configuration.addMapper(BlogMapper.class);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);

注意该例中,configuration 添加了一个映射器类(mapper class)。映射器类是 Java 类,它们包含 SQL 映射语句的注解从而避免了 XML 文件的依赖。不过,由于 Java 注解的一些限制加之某些 MyBatis 映射的复杂性,XML 映射对于大多数高级映射(比如:嵌套 Join 映射)来说仍然是必须的。有鉴于此,如果存在一个对等的 XML 配置文件的话,MyBatis 会自动查找并加载它(这种情况下, BlogMapper.xml 将会基于类路径和 BlogMapper.class 的类名被加载进来)。具体细节稍后讨论。

从 SqlSessionFactory 中获取 SqlSession

既然有了 SqlSessionFactory ,顾名思义,我们就可以从中获得 SqlSession 的实例了。SqlSession 完全包含了面向数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。例如:

SqlSession session = sqlSessionFactory.openSession();
try {
  Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
finally {
  session.close();
}

诚然这种方式能够正常工作,并且对于使用旧版本 MyBatis 的用户来说也比较熟悉,不过现在有了一种更直白的方式。使用对于给定语句能够合理描述参数和返回值的接口(比如说BlogMapper.class),你现在不但可以执行更清晰和类型安全的代码,而且还不用担心易错的字符串字面值以及强制类型转换。
例如:

SqlSession session = sqlSessionFactory.openSession();
try {
  BlogMapper mapper = session.getMapper(BlogMapper.class);
  Blog blog = mapper.selectBlog(101);
finally {
  session.close();
}

现在我们来探究一下这里到底是怎么执行的。

探究已映射的 SQL 语句

现在,或许你很想知道 SqlSession 和 Mapper 到底执行了什么操作,而 SQL 语句映射是个相当大的话题,可能会占去文档的大部分篇幅。不过为了让你能够了解个大概,这里会给出几个例子。

在上面提到的两个例子中,一个语句应该是通过 XML 定义,而另外一个则是通过注解定义。先看 XML 定义这个,事实上 MyBatis 提供的全部特性可以利用基于 XML 的映射语言来实现,这使得 MyBatis 在过去的数年间得以流行。如果你以前用过 MyBatis,这个概念应该会比较熟悉。不过 XML 映射文件已经有了很多的改进,随着文档的进行会愈发清晰。这里给出一个基于 XML 映射语句的示例,它应该可以满足上述示例中 SqlSession 的调用。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.mybatis.example.BlogMapper">
  <select id="selectBlog" resultType="Blog">
    select * from Blog where id = #{id}
  </select>
</mapper>

对于这个简单的例子来说似乎有点小题大做了,但实际上它是非常轻量级的。在一个 XML 映射文件中,你想定义多少个映射语句都是可以的,这样下来,XML 头部和文档类型声明占去的部分就显得微不足道了。文件的剩余部分具有很好的自解释性。在命名空间“org.mybatis.example.BlogMapper”中定义了一个名为“selectBlog”的映射语句,这样它就允许你使用指定的完全限定名“org.mybatis.example.BlogMapper.selectBlog”来调用映射语句,就像上面的例子中做的那样:

Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);

你可能注意到这和使用完全限定名调用 Java 对象的方法是相似的,之所以这样做是有原因的。这个命名可以直接映射到在命名空间中同名的 Mapper 类,并在已映射的 select 语句中的名字、参数和返回类型匹配成方法。这样你就可以向上面那样很容易地调用这个对应 Mapper 接口的方法。不过让我们再看一遍下面的例子:

BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);

第二种方法有很多优势,首先它不是基于字符串常量的,就会更安全;其次,如果你的 IDE 有代码补全功能,那么你可以在有了已映射 SQL 语句的基础之上利用这个功能。

命名空间的一点注释

命名空间(Namespaces)在之前版本的 MyBatis 中是可选的,容易引起混淆因此是没有益处的。现在的命名空间则是必须的,目的是希望能比只是简单的使用更长的完全限定名来更进一步区分语句。

命名空间使得你所见到的接口绑定成为可能,尽管你觉得这些东西未必用得上,你还是应该遵循这里的规定以防哪天你改变了主意。出于长远考虑,使用命名空间,并将它置于合适的 Java 包命名空间之下,你将拥有一份更加整洁的代码并提高了 MyBatis 的可用性。

命名解析:为了减少输入量,MyBatis 对所有的命名配置元素(包括语句,结果映射,缓存等)使用了如下的命名解析规则。
完全限定名(比如“com.mypackage.MyMapper.selectAllThings”)将被直接查找并且找到即用。
短名称(比如“selectAllThings”)如果全局唯一也可以作为一个单独的引用。如果不唯一,有两个或两个以上的相同名称(比如“com.foo.selectAllThings ”和“com.bar.selectAllThings”),那么使用时就会收到错误报告说短名称是不唯一的,这种情况下就必须使用完全限定名。
对于像 BlogMapper 这样的映射器类(Mapper class)来说,还有另一招来处理。它们的映射的语句可以不需要用 XML 来做,取而代之的是可以使用 Java 注解。比如,上面的 XML 示例可被替换如下:

package org.mybatis.example;
public interface BlogMapper {
  @Select("SELECT * FROM blog WHERE id = #{id}")
  Blog selectBlog(int id);
}

对于简单语句来说,注解使代码显得更加简洁,然而 Java 注解对于稍微复杂的语句就会力不从心并且会显得更加混乱。因此,如果你需要做很复杂的事情,那么最好使用 XML 来映射语句。
选择何种方式以及映射语句的定义的一致性对你来说有多重要这些完全取决于你和你的团队。换句话说,永远不要拘泥于一种方式,你可以很轻松的在基于注解和 XML 的语句映射方式间自由移植和切换。

作用域(Scope)和生命周期

理解我们目前已经讨论过的不同作用域和生命周期类是至关重要的,因为错误的使用会导致非常严重的并发问题。
对象生命周期和依赖注入框架
依赖注入框架可以创建线程安全的、基于事务的 SqlSession 和映射器(mapper)并将它们直接注入到你的 bean 中,因此可以直接忽略它们的生命周期。如果对如何通过依赖注入框架来使用 MyBatis 感兴趣可以研究一下 MyBatis-Spring 或 MyBatis-Guice 两个子项目。
SqlSessionFactoryBuilder
这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。你可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例,但是最好还是不要让其一直存在以保证所有的 XML 解析资源开放给更重要的事情。

SqlSessionFactory

SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由对它进行清除或重建。使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次,多次重建 SqlSessionFactory 被视为一种代码“坏味道(bad smell)”。因此 SqlSessionFactory 的最佳作用域是应用作用域。有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。

SqlSession

每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。也绝不能将 SqlSession 实例的引用放在任何类型的管理作用域中,比如 Servlet 架构中的 HttpSession。如果你现在正在使用一种 Web 框架,要考虑 SqlSession 放在一个和 HTTP 请求对象相似的作用域中。换句话说,每次收到的 HTTP 请求,就可以打开一个 SqlSession,返回一个响应,就关闭它。这个关闭操作是很重要的,你应该把这个关闭操作放到 finally 块中以确保每次都能执行关闭。下面的示例就是一个确保 SqlSession 关闭的标准模式:

SqlSession session = sqlSessionFactory.openSession();
try {
  // do work
finally {
  session.close();
}

在你的所有的代码中一致性地使用这种模式来保证所有数据库资源都能被正确地关闭。

映射器实例(Mapper Instances)

映射器是创建用来绑定映射语句的接口。映射器接口的实例是从 SqlSession 中获得的。因此从技术层面讲,映射器实例的最大作用域是和 SqlSession 相同的,因为它们都是从 SqlSession 里被请求的。尽管如此,映射器实例的最佳作用域是方法作用域。也就是说,映射器实例应该在调用它们的方法中被请求,用过之后即可废弃。并不需要显式地关闭映射器实例,尽管在整个请求作用域(request scope)保持映射器实例也不会有什么问题,但是很快你会发现,像 SqlSession 一样,在这个作用域上管理太多的资源的话会难于控制。所以要保持简单,最好把映射器放在方法作用域(method scope)内。下面的示例就展示了这个实践:

SqlSession session = sqlSessionFactory.openSession();
try {
  BlogMapper mapper = session.getMapper(BlogMapper.class);
  // do work
finally {
  session.close();
}

来源:微信公众号:IT哈哈(it_haha)


文章来源:http://www.cnblogs.com

原文地址:https://www.cnblogs.com/baiyu28/p/9248660.html

周鸿祎重新定义360:有核心技术的“国家企业”



在第二届世界西商大会上,360集团董事长周鸿祎重新定义了360公司:希望通过努力,成为有家国情怀、有责任担当、有“杀手锏”核心技术的 “国家企业”。在周鸿祎看来,面对全球新经济时代的挑战,那些勇于担起创新责任,为国家创造独特价值,推进国家和社会进步的企业,应当称为国家企业。

周鸿祎在反思中兴事件时说,一个企业应当具备什么样的能力才能适应多变的形势,即在关键时刻,企业手中是否握有核心技术,这是残酷的市场竞争中决定企业生死存亡的命脉,也是国家竞争中实力比拼的重型武器。

周鸿祎称,“国家企业”就是这种能够主动意识到自己肩负重责,勇于担当的企业,通过不断创新,突破核心技术壁垒,打造国之重器。

不久前,360发布了“安全大脑”,为应对大安全时代的网络新威胁和大挑战提供有效解决方案。

周鸿祎表示,360希望通过自己的努力,把“安全大脑”不断升级迭代为科技创新的“国之重器”,成为有家国情怀、有责任担当、有“杀手锏”核心技术的 “国家企业”。

周鸿祎还界定了“国家企业”的三个“一致”:企业发展方向和国家战略方向一致;企业的主业和国家急迫的需求一致;企业利益和国家利益一致。


文章来源:http://www.cnbeta.com

原文地址:https://www.cnbeta.com/articles/tech/741861.htm

日本章鱼哥遭活煮:生前准确率100%,堪称世界杯最惨预言帝

IT之家6月30日消息 在2018俄罗斯世界杯期间,日本一只名叫“拉比奥”的章鱼迅速在网络走红。“拉比奥”在小组赛期间预测对了日本队三场比赛的结果。但是,据日本《每日新闻》报道,“拉比奥”现在已经被它的主人给煮了。

据悉,章鱼“拉比奥”预测对了日本战胜哥伦比亚、日本战平塞内加尔以及日本输给波兰的三场小组比赛,并且一度被称为日本“章鱼哥”。

“拉比奥”还没等到世界杯淘汰赛就惨遭主人阿部喜三男给煮了,阿部喜三男表示“拉比奥”预测对了全部日本队小组赛的结果,对此感到很开心。虽然它死了,但是阿部喜三男会再推出第2只“拉比奥”,希望它也能预测对全部比赛,同时希望日本队能够最终夺冠。

文章来源:http://it.ithome.com

原文地址:https://www.ithome.com/html/it/367828.htm

动物保护组织大赞《侏罗纪世界2》,恐龙没受伤我们很开心…

《侏罗纪世界2》是有关动物,不过这些都是CG动物,所以该片并没有遭到各种组织的口诛笔伐,也不必雇佣动物专家防止影片中的动物遭到虐待。不过这并没有阻止动物保护组织PETA“蹭热度”。

影片中因为岛屿火山爆发,这些恐龙即将被营救,所以如何拯救恐龙成了该片的最大主题,正是因为这样,动物保护组织PETA大赞了“星爵”克里斯·普拉特以及电影所讲述的善举。

“当有自然灾害比如飓风爆发,附近动物遭到伤害,我们PETA会派出救援队伍到达现场,所以这可以与电影所传达的理念相比较,这时候你必须尽力让这些动物继续生存,继续进食,不受灾害影响,对我们来说,动物受灾是个大问题”,PETA副总Lisa Lange说道。

“所有《侏罗纪公园》电影都鼓励人们设想在破坏生态环境以及其他动物赖以生存的大背景下我们所应该扮演的角色,所以我们对这些影人感到由衷的感谢。”Lisa Lange补充道。

“另外,我们感谢他们拍了一部有关恐龙的电影,当然他们没办法使用真正的恐龙拍摄,但他们打造了一部有关动物生存、动物保护的电影。我们作为人类最大的恶意倾向从来就不是用一种动物来说明问题,所以这些电影恰恰只用了动画和CG,这就很有爱,因为他们没有伤害到动物,甚至是一根动物的毛发都没有受伤,这是极好的,”,Lisa Lange补充道。

虽然拯救恐龙是个好事情,但是Lisa Lange没有注意到恐龙回归大自然,意味着其他捕食者将与恐龙展开对决.

环球影业已经计划拍摄《侏罗纪世界3》,更强大的捕食者将对恐龙产生威胁,场面更加激烈,预定2021年6月11日上映,期待动物保护组织做出的评价。

文章来源:http://it.ithome.com

原文地址:https://www.ithome.com/html/it/367826.htm

OPPO Find X上手:升降起落 机械结构原来可以这么美



手机行业可以说是一个绝对快速更迭的消费产业,几乎每个月都有近十款左右的新产品发布,如此之快的节奏也让很多产品在人们的脑海中慢慢被磨灭掉,仿佛从未出现过一样。但在中国的手机历史上,有那么一个产品系列,从2014年之后就再未进行过产品更新,但仍有无数用户翘首以盼。

这个时隔四年之久才更新的产品系列就是我们熟悉的OPPO Find系列;而OPPO Find X则是OPPO继2014年的Find 7之后的又一款正统旗舰产品,而Find X也是OPPO给用户所交出的一份属于未来的答卷。

外观:我打赌,这绝对是2018年最好看的一款真·全面屏手机

虽然之前Find X已经在国外亮相了,但是在我拿到真机的一瞬间还是被这种精致并且散发着艺术感的美震撼到了。

与之前的OPPO手机时尚轻薄的设计里边不同的是,OPPO这一次是奔着一件艺术品的规格去设计Find X的,而最终的结果就像之前Find X预热阶段说的一样:现代科技与艺术的完美结合。

OPPO Find X的正面采用了一块来自三星独家定制的6.42英寸的柔性OLED屏幕,屏幕比例为19.5:9,这也是目前手机市场上最“长”的一款产品了。

而且在屏幕左右柔性弯曲的情况下,OPPO Find X也是国内第一个采用COP封装技术的手机产品,将底部屏幕部分进行翻折,再把触控IC封装在弯折的基板之上,这也解决了手机下巴过宽的问题。

得益于COP屏幕封装工艺,OPPO Find X实现了目前手机行业全球最窄的3.4mm下边框,配合左右1.65mm的边框和1.91mm上边框,为用户带来了相当优秀的屏幕沉浸式体验,也向着真·全面屏又迈进了一步。

翻到手机的背后来看也是一样的曲面设计,手机背部的左右两侧玻璃也进行了3D热压处理,形成了一个非常舒适,适合手部握持的弧线。通过手机的中框将正反面两连接在一起,有着非常顺滑的过渡触感,也让手机在握持的时候感受更加纤薄。

手机的配色一直都是OPPO的拿手好戏,这一次的Find X也在配色上别出心裁的采用了波尔多红和冰魄蓝两种配色。

与之前的渐变配色不同的是,Find X的渐变色彩凝结在手机的背部四周,将渐变色彩和北部的3D弧度完美的结合在了一起,通过不同的角度变换所呈现出来的色彩流动感更是给Find X增添了艺术的质感。

这一色彩技术名为3D叠层流光点彩,每一个流动的色彩都由7层颜色叠加,再覆上纹理度镀层,如此的设计也让机身折射出宝石的质感,同时在角度变换的时候有可以呈现出流动的感觉。不论是热情的波尔多红还是灵动的冰珀蓝都散发的独特的韵味。

当你拿到OPPO Find X把玩的时候,我相信你一定会注意到这款产品在正面两面的设计上做到了全方位的无孔设计。

再加上正面这一块曲面全面屏和四周窄边框的设计,让OPPO Find X的正面屏占比达到了93.8%,可以说是目前市面上屏占比最高的一款手机,也是屈指可数的一款真·全面屏手机。

双轨潜望结构–起起落落之间的机械奥秘

为了将Find X的正面两面做到无孔设计,那些我们熟悉的传感器和这一次Find X新加入的3D结构光系统都融合进了一个升降式结构之中,OPPO称其为双轨潜望结构。

在这一套潜望结构之中,OPPO将前后摄像头、3D结构光模组以及绝大部分的传感器融入进去。

并配置一套体积小并且噪音更低的马达放进手机之中,再通过降低滑轨的阻尼、柔化连接线等细节的优化,最终实现了只用0.6s就可以将这一套双轨潜望结构快速升起并且还有相对较小的机械噪音。

为了保证这一套升降结构的使用寿命,OPPO还设计了两套保护机制,从主动和被动两个方面都对这一套精密的结构进行保护。

OPPO Find X上手:升降起落 机械结构原来可以这么美

首先就是主动保护,OPPO在马达结构之中设计了一个速度渐变的过程。简单来说就是由慢至快再到慢的一个缓冲上升模式,这样也避免了马达结构长期快速直上直下造成的精密零件损耗,通过一个缓冲的方式来提升使用寿命。

OPPO Find X上手:升降起落 机械结构原来可以这么美

另外就是被动保护了,我们在使用的过程中总是会出现一些意外跌落的情况,当手机内部的重力感应器检测到手机不正常自由落体情况的时候,会将信号直接传递给系统,而系统在接收到不正常信号的时候回将潜望结构快速收回。

这样的回收机制也保护了用户在调用摄像头或者3D结构光模组时候意外跌落的情况,保护潜望结构在跌落的时候可以尽可能的快速回收而不受跌落冲击而造成的内部结构损坏。

OPPO FaceKey–安全、便捷

OPPO FaceKey是这一次OPPO Find X唯一的一个生物识别方式,可能这个名词很多朋友不熟悉,但如果以3D结构光系统来描述是不是就觉得豁然开朗了呢?

没错,OPPO在今年的5月初正式对外展示了3D结构光技术,并且在一个月之后就将其运用到了旗舰产品Find X的身上,如此连贯的操作也不得不感叹OPPO在技术方面的积累和供应链运作方面的强大。

Find X的3D结构光技术在识别的时候通过点阵投影器在人脸上投射15000个识别点,通过这些识别点的反馈来构建出一个用户脸部的3D模型。

在识别的时候通过投射点反馈的模型数据来匹配之前录入的脸部轮廓数据,从而完成识别过程。并且3D结构光技术中内置有红外补光灯,即便是在纯黑环境下也可以配合点阵投影器进行面部轮廓的激光发射和阵点反馈,在黑夜中也完美解锁。

在实际体验的时候,OPPO Find X的3D结构光系统录入过程与我们此前接触过的iPhone X有些许的不同,Find X并没有提示用户进行头部的转动进行面部信息收集。

猜想也可能是因为iPhone X拥有30000个识别点阵,而Find X则只有15000个,所以在脸部周围区域的数据并没有足够的点阵辅助收集吧。所以解锁的时候在45°侧脸的情况下则不会完成解锁操作。

OPPO Find X上手:升降起落 机械结构原来可以这么美

当3D结构光作为唯一的生物识别方式的时候,诸如指纹识别这样用户熟悉的密码验证方式就无效了,为了解决这一问题,OPPO也与支付宝进行合作,做到了使用3D结构光技术代替密码支付,只要刷脸就能付款。

结构光技术功能拓展–3D个性美颜

如果3D结构光技术仅仅是用于解锁和付款的话,那确实有些大材小用了,所以OPPO也借助3D结构光技术强化了自己的自拍功能–3D个性美颜功能也就应运而生。

长久以来,我们所接触到的美颜功能都是通过厂商们通过调研用户大数据而形成的“模块化”美颜效果,但就如这个世界上没有完全相同的两片树叶一样。

我们每个人作为单一的个体,也有着完全不同的面部轮廓,即便是双胞胎的骨骼轮廓也是完全不同的。所以 如何针对单一用户来进行美颜效果设置就成了各家厂商的一个大难题,那么究竟谁最了解你的脸呢?

不是整形医生,不是你父母,而是你自己!所以OPPO借助3D结构光技术通过扫描用户的脸部数据,形成一份3D面部模型,用户可以根据自己的颧骨、鼻骨、下巴的骨骼特征来进行微调,做到针对于自己美颜效果。

并且OPPO还内置了四套美颜模式,分别对应四种风格的滤镜效果,用户可以选择自己最常用的一款风格模式进行保存。

在之后的拍照美颜的时候,我们只要将美颜模式调到“自定义”档位之后,系统就可以根据之前录入和调整的面部数据进行匹配进行专属效果的美颜。

拍照:无愧于旗舰之名号

接着上边的美颜功能我们来进入到相机部分,先来看看用户们最在意的自拍环节。除了上边说到的3D个性美颜之外,轮廓光出现之后也是受到了很多用户的追捧,毕竟这样的“光线补偿技术”也要比很多滤镜拍出来有大片感。

测试下来之后,轮廓光效果的边缘识别效果和实际的光线效果也都确实可以营造出一种不同于其他滤镜的感觉,尤其是双色光场景,从脸部延伸到颈部的过渡逐渐消失的效果呈现也非常的自然,如果操作熟练的话,在某些场景下拍出具有艺术质感的人像照片绝对不成问题。

再来看看OPPO Find X的相机硬件,前置一颗2500万像素的IMX576传感器,具有暗光噪点控制优秀、色彩还原度强的特点,这也非常符合Find X这一次相机的拍照特点,所以也可以说这一次的IMX576和Find X的相遇就是命中注定。

Find X的后置相机采用了变焦双摄,1600万像素+2000万像素的双摄组合,主摄像头传感器是IMX519,特点是具有超高采样率、动态拍照更准确、快速。同时支持OIS光学防抖功能,暗光拍摄拥有更多的进光量,画面亮度有明显提升。

Find X配备了RAW HDR功能,与其他HDR功能捕捉画面形成RAW格式后再压缩的合成方式相比,RAW HDR可以在图像捕捉之后以原版RAW格式进行出片,避免数据压缩造成的画面信息损失。在HDR人像拍照的时候画面的景深层次信息也更加的清晰、明确。

OPPO Find X上手:升降起落 机械结构原来可以这么美

同时Find X也支持场景相机功能,21类独立场景,多达800个场景的组合效果增益,在用户手持Find X拍照的时候可以根据不同的场景进行适当的拍照效果增益,获得更好的拍照效果,下面我们通过一些样张来实际感受一下OPPO Find X的拍照效果:

OPPO Find X上手:升降起落 机械结构原来可以这么美

OPPO Find X上手:升降起落 机械结构原来可以这么美

OPPO Find X上手:升降起落 机械结构原来可以这么美

OPPO Find X上手:升降起落 机械结构原来可以这么美

OPPO Find X上手:升降起落 机械结构原来可以这么美

OPPO Find X上手:升降起落 机械结构原来可以这么美

OPPO Find X上手:升降起落 机械结构原来可以这么美

OPPO Find X上手:升降起落 机械结构原来可以这么美

通过上边的样张我们可以看到Find X在色彩还原方面还是偏艳丽的效果,这样也比较讨好用户,在社交网络分享的时候可以具有不错的视觉观感。

在逆光拍照方面,Find X在暗处的亮度增益也保持在一个合理的范围内,同时对于高光部分也有不错的光线调节 ,使得两部分的观感比较统一,不会产生明显的落差感。

夜景方面的画面亮度也要比肉眼所见明亮许多,而且画面的噪点控制也相当到位,细节部分也没有过多的涂抹感,整体观感还是让人满意的。

玩游戏–只有硬件强大还远远不够

作为一款旗舰级别产品,顶级的硬件也是必不可少的,所以这一次的Find X也是标配了骁龙845平台和8GB的RAM空间。

但是作为2018年的旗舰手机产品,只有强大的硬件就足够了么?答案是NO!除了强大的硬件标准之外,对于游戏这个年轻人最喜欢的领域,OPPO也有着一套自己的专属游戏模式,帮助用户达到极致游戏体验。

OPPO Find X上手:升降起落 机械结构原来可以这么美

在手机的桌面上有一个名为“游戏空间”的APP,点进去之后系统会自动收录手机内的游戏APP,并且还可以在空间内进行游戏模式的功能调节,比如性能方面究竟是均衡运行还是高效率运行、通知消息是否屏蔽都可以在这里轻松设置。

OPPO Find X上手:升降起落 机械结构原来可以这么美

而且在手机横屏使用的时候,从横屏握持时候的上边框的向内滑动就可以呼出一些快捷操作按钮,包括截图、录制屏幕和微信快速打开,对于日常操作来说还是极大地提升了使用的便利性。

Find X–对得起这四年的等待

虽然与Find X接触还没有很久的时间,但是我却是非常喜欢这款产品,不论是其优秀的外观设计和握持手感都绝对算得上是优秀的水准;强大的硬件也让我这个游戏党在吃鸡的时候可以兼顾极致性能和视觉体验。

升降式的双轨潜望结构对于科技爱好者来说是一种机械的美感;对于普通小白用户来说,摄像头部分的升降起落也是前所未有的新科技震撼,再加上这样的外观设计,我实在想不出一个不选择Find X的理由。

OPPO Find X上手:升降起落 机械结构原来可以这么美

四年的等待,从Find 7到现在的Find X,我也看到了OPPO在对于科技探索方面的努力。

四年前的Find 7可以说是中国手机历史上的一个旗舰里程碑,而四年后的Find X则可以说是说全球手机在迈向全面屏进化的一个新的标志,不论双轨潜望结构未来是不是全面屏时代最终的解决方案,至少在现在,Find X就是未来,而我也愿意去拥抱这个未来。


文章来源:http://www.cnbeta.com

原文地址:https://www.cnbeta.com/articles/tech/741859.htm

三星Galaxy Note 9通过3C认证:8月9日发布



备受关注的三星Galaxy Note 9终于公布了发布时间,根据三星官方放出的预告视频,Galaxy Note 9将于8月9日在纽约发布。6月30日消息,三星Galaxy Note 9国行版通过3C认证,其型号为SM-N9608,该机配备的充电器型号为EP-TA200,输出规格为9V/1.67A,和主流快充相比,三星略偏保守。

根据Onleaks曝光的渲染图,三星Galaxy Note 9整体变化不大,采用了全视曲面屏,配备双摄像头,指纹识别位置下移,解锁的时候不容易误触摄像头。

该机将搭载高通骁龙845处理器,部分版本搭载三星Exynos 9810处理器,配备6GB内存,最高可能会提供512GB存储。

系统层面,三星Galaxy Note 9有望搭载全新的智能语音助理Bixby 2.0版本。

此外,三星在预告视频中特别突出了三星Galaxy Note系列独有的S Pen手写笔,暗示三星会在S Pen手写笔上会有大动作,值得期待。


文章来源:http://www.cnbeta.com

原文地址:https://www.cnbeta.com/articles/tech/741857.htm

别了,支付宝、微信支付躺着赚钱的好日子



越来越多的迹象表明,第三方支付野蛮掘金的时代要落幕了。昨天(6月29日)晚上,央行发布通知,宣布将支付机构客户备付金集中交存比例逐步提高至100%。这是国务院部署的互联网金融风险专项整治工作的主要内容之一,也是央行第一次对支付机构100%集中交存备付金提出明确的时间表。

对于支付宝、微信支付等第三方支付来说,这意味着即将彻底告别躺着赚备付金利息收入的好日子。而据业内人士表示,此前大型支付机构利息收入可以达到百亿元。

支付机构备付金将实现100%交存

所谓备付金,通俗来讲就是在网上购买商品或服务时,由客户支付的货款,在客户收到货并且做出确认之前,一直存放在支付机构账上的资金。

每经小编了解到,提高支付机构备付金交存比例有一个循序渐进的过程。

2017年1月,央行发布《关于实施支付机构客户备付金集中存管有关事项的通知》称,自当年4月17日起,支付机构应将客户备付金按照一定比例交存至指定机构专用存款账户。首次交存的平均比例为20%左右,央行目标为最终实现全部客户备付金集中存管。按照这份文件规定,备付金集中存管以后,将不再产生利息。

2017年12月,央行要求,2018年起支付机构客户备付金集中交存比例将由现行20%左右提高至50%左右。具体来说,2018年1月仍执行集中交存比例20%,2月至4月按每月10%逐月提高,至2018年4月将集中交存比例调整到50%左右。

据央行公布的数据,2018年1月末,支付机构客户备付金存款突破千亿元,自此,每月增加千亿元左右,2018年4月末,这一数据将近5000亿元,为4995.04亿元,比最初上缴额度增长494%。按照上缴50%比例测算,支付机构客户备付金总规模为9990.08亿元。

6月29日晚间,央行的通知进一步提高了交存比例。根据通知要求,2018年7月9日起,按月逐步提高支付机构客户备付金集中交存比例,到2019年1月14日实现100%集中交存。

值得注意的是,央行要求支付机构应根据与中国银联或网联清算的业务对接情况,于2019年1月14日前在法人所在地人民银行分支机构开立“备付金集中存管账户”,并于开户之日起2个工作日内将原委托备付金存管银行开立的“备付金交存专户”销户。支付机构“备付金集中存管账户”的资金划转应当通过中国银联或网联清算办理。

而据央行去年的通知,自今日(2018年6月30日)起,支付机构受理的涉及银行账户的网络支付业务全部通过网联平台处理。

备付金分散存放的四个风险

中国支付清算协会《中国支付清算行业运行报告(2018)》指出,我国支付服务参与者规模不断扩大,银行业金融机构仍为主力,非银行支付机构异军突起,截至2017年底,全国共有非银行支付机构243家。非银行支付机构互联网支付和移动支付业务金额占网络支付总业务金额的比重分别为26.9%和73.1%。

之所以要进行备付金集中存管,是因为此前各家支付机构将客户备付金以自身名义在多家银行开立账户存放,客户备付金的规模巨大、存放分散,存在一系列风险隐患。央行方面曾指出,客户备付金分散存放主要有四方面风险:

一是客户备付金存在被支付机构挪用的风险。例如,2014年12月,上海畅购企业服务有限公司发生挪用客户备付金事件,造成资金风险敞口达7.8亿元,涉及持卡人5.14万人。

二是一些支付机构违规占用客户备付金用于购买理财产品或其他高风险投资。

三是支付机构通过在各商业银行开立的备付金账户办理跨行资金清算,超范围经营,变相行使央行或清算组织的跨行清算职能。甚至有支付机构借此便利为洗钱等犯罪活动提供通道,也增加了金融风险跨系统传导的隐患。

四是客户备付金的分散存放,不利于支付机构统筹资金管理,存在流动性风险。

第三方支付躺着赚钱的日子将彻底结束

经济观察网报道,一家总部位于上海的支付机构副总裁表示,第三方支付备付金的利息收益是支付机构舍不得放弃的蛋糕,因此,支付机构推动集中存管的动力很弱。

“支付机构客户备付金和银行结算的利息收益是按照日均资金沉淀量,按照协议存款的方式计算的。这意味着,支付机构的客户备付金沉淀量越高,银行给予的利息就越高。”上述支付机构人士表示,协议存款的价格区间基本是在年化3%左右,高的可以达到4%以上,“二线支付机构备付金的日均沉淀量就可以达到30亿——50亿,也就是说一家二线支付机构一年在银行获得备付金利息就达到1亿以上,远比外界估算的要高。更不要说支付宝、财付通这样的行业巨头。

21世纪经济报道消息,上海一家支付机构人士告诉记者,其每年利息收入大约一亿元。据其了解,大型支付机构利息收入可以达到百亿元。

以港交所上市公司汇付天下为例。该公司招股说明书披露,2015年、2016年、2017年,汇付天下利息收入(主要来自客户备付金结余)分别是2610万元、3830万元、6160万元。“由于我们将越来越多的客户备付金存入集中备付金账户,我们于2018年来自客户备付金的利息收入可能逐步减少。倘该比例持续提高,我们的利息收入将持续减少。”汇付天下在招股书中表示。

显然,对于支付机构而言,当备付金实现100%交存,这种“躺着也能赚钱”的好日子也就彻底终结了。

每日经济新闻综合每经APP、经济观察报、21世纪经济报道等


文章来源:http://www.cnbeta.com

原文地址:https://www.cnbeta.com/articles/tech/741855.htm

OPPO沈义人:Find X不会销量导向 8月解决产能



OPPO于29日在国内发布了Find系列新品Find X。OPPO助理副总裁、国内市场营销负责人沈义人在接受采访时表示,OPPO并未给Find X设立具体的销量目标,而是更加关注产品本身。他还透露,Find X不会饥饿营销,由于新技术的使用在7月的铺货渠道不会那么深,但到8月份将解决产能问题。

因产品和文化加入OPPO

今年5月,OPPO宣布了人事调整, OPPO副总裁、原国内市场营销业务负责人吴强将全面负责OPPO海外市场整体业务;任命沈义人为OPPO助理副总裁,全面负责中国大陆市场营销业务。吴强和沈义人均向OPPO CEO陈明永汇报。

此次Find X的国内发布会,也是沈义人上任后的首次对外公开亮相。

沈义人于2013年加入OPPO,此前担任OPPO中国大陆市场营销策划部长。这位出生于1988年、加入OPPO 5年就被提拔操盘国内市场营销的年轻高管一直被外界好奇。实际上,OPPO经典的营销案例“充电5分钟,通话2小时”就出自他之手。

谈及加入OPPO的原因,沈义人称主要在于OPPO本分的文化和对产品的追求。“在我来到OPPO的时候,与Tony(陈明永)交流中并未讨论过薪资待遇,也没谈过未来怎么样,我们当时都决定要把事情干好。我们每次看到一个好产品,都会感到兴奋。”

此外,沈义人还称,OPPO在内部也给了年轻人很多机会,除了被推上前台的自己之外,OPPO的策划和研发系统的员工有很多是90后甚至95后。

Find X背后的OPPO变与不变

在今年3月的R15发布会上,OPPO副总裁吴强称2018年OPPO的关键词就是“改变”,具体包括四个维度:科技创新、品牌升级、市场布局和产品观。

实际上,Find X的发布便是这四个改变的集中体现。

在Find系列四年的停更后,Find X此次拿出了双轨潜望结构、3D结构光、COP封装等技术,最终呈现出93.8%屏占比的无刘海全面屏。此外,OPPO还在近期加强了对5G、AI、AR等新技术的投入和应用。

在此次国内发布会之前,OPPO先在法国卢浮宫首发了Find X,Find X也成为OPPO进军欧洲市场的首款产品。据介绍,OPPO在欧洲市场的拓展将从法国、意大利、西班牙、荷兰四国开始,这也意味着OPPO在原有的进入30个国家和地区市场之外,海外布局再增版图。而已调任海外市场业务负责人的吴强还透露,OPPO今年将进一步加速海外市场业务发展。

借助Find X,OPPO还将产品价格段再次提升一个档位。Find X标准版(8GB+128GB)售价4999元,搭载Super VOOC超级闪充的超级闪充版(8GB+256GB)售价5999元,而兰博基尼版则售价9999元。

与价格相对应的还有品牌形象。此次OPPO还与兰博基尼汽车正式达成全球战略合作伙伴关系,双方将围绕产品、技术、设计、商业以及市场推广等领域开展合作。同时,OPPO也在通过终端形象的升级提升品牌形象。去年12月,OPPO首家全球超级旗舰店在上海开业,据悉第二家也将于今年内在深圳落地。OPPO也在对旗舰店、专卖店以及品牌专区进行形象升级。

在当前智能手机行业整体陷入增长放缓甚至下滑的态势下,OPPO正在通过变化来应对。不过沈义人也强调,OPPO的企业文化和价值观不会改变,比如对产品的追求。他透露,OPPO并没有为Find X设立具体的销量目标,“比起一年卖多少台,永远没有用户拿到这款产品是什么样的感觉对我们重要。我们并没有刻意地要为了保持销量或者销量增长而去做什么。”

将用技术和人工手段保护用户隐私

Find X的机械结构也让用户意外发现了一些隐私方面的问题。比如有用户称使用Find X打开QQ空间会启动带有摄像头的机械结构,实际上有用户在使用vivo的NEX打开QQ浏览器时也出现了类似的问题,这也引发了关于用户隐私的担忧。

QQ浏览器当时发布声明回应称,QQ浏览器技术团队对该问题进行了测试复现,确认存在摄像头被调起,但强调这一动作不会开启摄像头,更不会拍摄或记录。

沈义人对此表示,OPPO一直以来非常重视保护用户隐私,OPPO应用商店的App都是经过人工审核筛查的,但某些应用可能会因为一些代码或者其它原因引起这样的现象。未来将通过一切技术和人工手段去保护用户的相关隐私,比如对于调用手机权限的App进行相关的限制,或者当App调取前置摄像头权限时,OPPO可能会在手机系统上有一个提示。

沈义人还强调称,OPPO所有的相关行为都是在国家的法律法规之下,不会随便侵犯用户隐私。他举例称,很多手机厂商会把指纹和相关的密码数据在本地加密,而OPPO用户的生物信息如指纹和人脸信息,以及相关密码都是保存在硬件当中的加密芯片,“这些信息只有在相关应用有需要时才会被调取,更不会有任何第三方包括OPPO可以存储或者修改用户相关的信息数据。”


文章来源:http://www.cnbeta.com

原文地址:https://www.cnbeta.com/articles/tech/741853.htm

有人讨厌有人说是青春,你希望腾讯保留QQ宠物吗?

IT之家6月30日消息 昨天晚上,腾讯QQ宠物官方论坛发布公告,表示《QQ宠物》、《乐斗Ⅱ》游戏将退市并停止运营。公告表示,7月5日起,腾讯将关闭游戏充值,停止新用户注册。9月15日起,游戏将正式停止运营,服务器也将关闭,届时玩家将无法通过官方渠道下载、登录游戏。

IT之家报道,《QQ宠物》是腾讯推出的虚拟社区养成游戏,游戏过程贯穿宠物成长全程。玩家可以对宠物进行喂食、清洁,让其打工、学习、游戏、结婚、生蛋、旅游等。

在腾讯发布公告之后,网络上掀起了针对《QQ宠物》停止运营的大讨论,有人说之前好不容易饿死了,不知道怎么又活了;也有人惋惜,养了十几年的宠物要消失了,心疼,这是我们的青春啊。还有人表示无所谓…反正没玩过。

文章来源:http://it.ithome.com

原文地址:https://www.ithome.com/html/it/367825.htm

SpringMVC详解



高级参数绑定

绑定数组

    jsp中获取list集合并遍历

<c:forEach items="${itemList }" var="item">
<tr>
    <td><input name="ids" value="${item.id}" type="checkbox"></td>
    <td>${item.name }</td>
    <td>${item.price }</td>
    <td><fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/></td>
    <td>${item.detail }</td>
    <td><a href="${pageContext.request.contextPath }/itemEdit.action?id=${item.id}">修改</a></td>
</tr>
</c:forEach>

  

    controller层接收参数并操作

1 @RequestMapping("/itemEdit")
2     public void itemEdit(QueryVo queryVo, String[] ids) {
3             queryVo.getItems.setName( (queryVo.getItems().getName());
4         queryVo.getItems.setPrice( (queryVo.getItems().getPrice());
5         ...
6     }

 

 

 


 

@RequestMapping

 

通过RequestMapping注解可以定义不同的处理器映射规则。

 

窄化请求映射

@RequestMapping(“/item”)放在类名上边,设置请求前缀

@RequestMapping(“/queryItem “)放在方法名上边,请求url为 /前缀/queryItem

 

请求方法限定

 

     默认请求方式为get请求    

 

  •   限定GET方法

@RequestMapping(method = RequestMethod.GET)

 

如果通过Post访问则报错:HTTP Status 405 – Request method ‘POST’ not supported

 

例如:

@RequestMapping(value=”/editItem”,method=RequestMethod.GET)

 

  •   限定POST方法

@RequestMapping(method = RequestMethod.POST)

 

如果通过Post访问则报错:HTTP Status 405 – Request method ‘GET’ not supported

 

  •   GET和POST都可以

@RequestMapping(method={RequestMethod.GET,RequestMethod.POST})

 

 


 

controller层方法返回值

 

  • 返回ModelAndView

 

    controller方法中定义ModelAndView对象并返回,对象中可添加model数据、指定view页面。

 

  • 返回void

 

在controller方法形参上可以定义request和response,使用request或response指定响应结果:

1、使用request转向页面,如下:

request.getRequestDispatcher(“页面路径”).forward(request, response);

 

2、也可以通过response页面重定向:

response.sendRedirect(“url”)

 

3、也可以通过response指定响应结果,例如响应json数据如下:

response.setCharacterEncoding(“utf-8”);

response.setContentType(“application/json;charset=utf-8”);

response.getWriter().write(“json串”);

 

  • 返回字符串

    逻辑视图名 

      controller方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。

//指定逻辑视图名,经过视图解析器解析为jsp物理路径:/WEB-INF/jsp/item/editItem.jsp
return "item/editItem";

 

    Redirect重定向

      Contrller方法返回结果重定向到一个url地址,如下商品修改提交后重定向到商品查询方法,参数无法带到商品查询方法中。

//重定向到queryItem.action地址,request无法带过去
return "redirect:queryItem.action";

 

redirect方式相当于“response.sendRedirect()”,转发后浏览器的地址栏变为转发后的地址,因为转发即执行了一个新的request和response。

由于新发起一个request原来的参数在转发时就不能传递到下一个url,如果要传参数可以/item/queryItem.action后边加参数,如下:

/item/queryItem?…&…..

 

 

    forward转发

      controller方法执行后继续执行另一个controller方法,如下商品修改提交后转向到商品修改页面,修改商品的id参数可以带到商品修改方法中。

//结果转发到editItem.action,request可以带过去
return "forward:editItem.action";

 

forward方式相当于“request.getRequestDispatcher().forward(request,response)”,转发后浏览器地址栏还是原来的地址。转发并没有执行新的request和response,而是和转发前的请求共用一个request和response。所以转发前请求的参数在转发后仍然可以读取到。

 

 

请求重定向与请求转发的区别:

请求转发forward:浏览器URL地址不会发生变化,在服务器端做了一个跳转,同一个request域中

请求重定向redirect:浏览器地址会发生变化,服务器端向浏览器响应302状态码,浏览器收到302之后,重新请求服务器一个新的地址,不同的request域了

 


 

异常处理器

 

 

  异常处理思路

 

 

    系统中异常包括两类:预期异常运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。

         系统的dao、service、controller出现都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理,如下图:

 

 

 

  •   自定义异常类

    为了区别不同的异常通常根据异常类型自定义异常类,有时需要创建一个自定义系统异常,如果controller、service、dao抛出此类异常说明是系统预期处理的异常信息。

 1 public class CustomException extends Exception {
 2     /** serialVersionUID*/
 3     private static final long serialVersionUID = -5212079010855161498L;
 4     
 5     public CustomException(String message){
 6         super(message);
 7         this.message = message;
 8     }
 9 
10     //异常信息
11     private String message;
12 
13     public String getMessage() {
14         return message;
15     }
16 
17     public void setMessage(String message) {
18         this.message = message;
19     }
20 }

 

  •   自定义异常处理器实现HandlerExceptionResolver

 

 1 public class CustomExceptionResolver implements HandlerExceptionResolver {
 2     @Override
 3     public ModelAndView resolveException(HttpServletRequest request,
 4             HttpServletResponse response, Object handler, Exception ex) {
 5         String msg = null;
 6         if(ex instanceof CustomerException){
 7             CustomerException exception = (CustomerException) ex;
 8             msg = exception.getMessage();
 9         }else{
10             StringWriter s = new StringWriter();
11             PrintWriter printWriter = new PrintWriter(s);
12             ex.printStackTrace(printWriter);
13             msg = s.toString();
14         }
15         ModelAndView view = new ModelAndView();
16         view.setViewName("error");
17         view.addObject("message", msg);
18         return modelAndView;
19     }
20 }

 

  •   错误页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix="fmt"%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>错误页面</title>
</head>
<body>
您的操作出现错误如下:<br/>
${message}
</body>
</html>

 

  •   异常处理器配置

    在springmvc.xml中添加:

   <!-- 异常处理器 -->
    <bean id="handlerExceptionResolver" class="cn.itcast.ssm.controller.exceptionResolver.CustomExceptionResolver"/>

 

  •   异常测试

    需求:修改商品信息,id输入错误提示商品信息不存在。

 

    实现:修改controller方法“editItem”,调用service查询商品信息,如果商品信息为空则抛出异常:

1        // 调用service查询商品信息
2         Items item = itemService.findItemById(id);
3         if(item == null){
4             throw new CustomException("商品信息不存在!");
5         }

 

 

 


 

上传图片

  配置tomcat代理目录

在tomcat上配置图片虚拟目录,在tomcat下conf/server.xml中添加:

<Context docBase=”F:\develop\upload\temp” path=”/pic” reloadable=”false”/>

 

访问http://localhost:8080/pic即可访问F:\develop\upload\temp下的图片。

  也可以通过eclipse配置:

 

  •   依赖的jar包

<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.1</version>
</dependency>

 

  •   配置解析器

    <!-- 文件上传 -->
    <bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 设置上传文件的最大尺寸为5MB -->
        <property name="maxUploadSize" value="5242880"></property>    
   </bean>
    

 

  •   图片上传

    

    controller:

 1    //商品修改提交
 2     @RequestMapping("/imgSubmit")
 3     public String imgSubmit(MultipartFile pictureFile)throws Exception{        
 4         //原始文件名称
 5         String pictureFile_name =  pictureFile.getOriginalFilename();
 6         //新文件名称
 7         String newFileName = UUID.randomUUID().toString()+pictureFile_name.substring(pictureFile_name.lastIndexOf("."));
 8         
 9         //上传图片
10         File uploadPic = new java.io.File("F:/develop/upload/temp/"+newFileName);
11         
12         if(!uploadPic.exists()){
13             uploadPic.mkdirs();
14         }
15         //向磁盘写文件
16         pictureFile.transferTo(uploadPic);
17 
18 .....

 

    页面:

<!-- form添加enctype="multipart/form-data":-->
<form id="imgForm"
action="${pageContext.request.contextPath }/imgSubmit.action"
        method="post" enctype="multipart/form-data">
        <input type="hidden" name="pic" value="${item.pic }" />


<!-- file的name与controller形参一致:-->
<tr>
    <td>商品图片</td>
    <td><c:if test="${item.pic !=null}">
            <img src="/pic/${item.pic}" width=100 height=100 />
            <br />
        </c:if> <input type="file" name="pictureFile" /></td>
</tr>

 

 


 

json数据交互

  @RequestBody

作用:

@RequestBody注解用于读取http请求的内容(字符串),通过springmvc提供的HttpMessageConverter接口将读到的内容转换为json、xml等格式的数据并绑定到controller方法的参数上。

List.action?id=1&name=zhangsan&age=12

 

 

  @ResponseBody

作用:

该注解用于将Controller的方法返回的对象,通过HttpMessageConverter接口转换为指定格式的数据如:json,xml等,通过Response响应给客户端

 

  请求json,响应json实现

 

    1、依赖jar包

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.8.8</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.8.8</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.8.8</version>
</dependency>

  

   2、配置json转换器

  在注解适配器中加入messageConverters

   <!--注解适配器 -->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <property name="messageConverters">
        <list>
        <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
        </list>
        </property>
    </bean>

 

  注意:如果使用<mvc:annotation-driven /> 则不用定义上边的内容。

 

   3、controller层

 

1    // 商品修改提交json信息,响应json信息
2     @RequestMapping("/editItemSubmit_RequestJson")
3    @ResponseBody
4     public Items editItemSubmit_RequestJson(@RequestBody Items items) throws Exception {
5         System.out.println(items);
6         return items;
7     }

 

   4、页面js方法

//引入 js:
<script type="text/javascript" 
src="${pageContext.request.contextPath }/js/jquery-1.4.4.min.js"></script>


    //请求json响应json
    function request_json(){
        $.ajax({
            type:"post",
            url:"${pageContext.request.contextPath }/item/editItemSubmit_RequestJson.action",
            contentType:"application/json;charset=utf-8",
            data:'{"name":"测试商品","price":99.9}',
            success:function(data){
                alert(data);
            }
        });
    }

 

 

 


 

RESTful支持

 

Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格,是对http协议的诠释

资源定位:互联网所有的事物都是资源,要求url中没有动词,只有名词。没有参数

Url格式:http://blog.csdn.net/briblue/article/details/73824058

资源操作:使用put、delete、postget,使用不同方法对资源进行操作。分别对应添加、删除、修改、查询。一般使用时还是post和get。Put和Delete几乎不使用。

 

  •   添加DispatcherServlet的rest配置

<servlet>
        <servlet-name>springmvc-servlet-rest</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring/springmvc.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc-servlet-rest</servlet-name>

        <!-- / :表示拦截所有请求,但是不拦截jsp
            /*  : 表示所有的请求都会拦截,包括jsp
            一般都是推荐只使用  /
         -->
        <url-pattern>/</url-pattern>    
</servlet-mapping>

 

  •   URL 模板模式映射

@RequestMapping(value=”/ viewItems/{id}”):{×××}占位符,请求的URL可以是“/viewItems/1”或“/viewItems/2”,通过在方法中使用@PathVariable获取{×××}中的×××变量。

@PathVariable用于将请求URL中的模板变量映射到功能处理方法的参数上。

 

    @RequestMapping("/itemEdit/{id}")//id和形参名称一致
    public String getItemEdit(Model model,@PathVariable("id")Integer id) throws CustomerException{//@PathVariable不用指定名称。
        Items  items = itemService.getItemById(id);
        //view.addObject("item", items);
        model.addAttribute("item", items);
        return "editItem";
    }

 

  •   静态资源访问<mvc:resources>

 

如果在DispatcherServlet中设置url-pattern为 /则必须对静态资源进行访问处理。

spring mvc 的<mvc:resources mapping=”” location=””>实现对静态资源进行映射访问。

  如下是对js文件访问配置:

  <mvc:resources location=”/js/” mapping=”/js/**”/>

 


 

拦截器

 

Spring Web MVC 的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理。

区别: 拦截器不需要依赖servlet容器,过滤器需要依赖于javaWeb的环境

    拦截器是spring提供的一种机制,过滤器是javaWeb提供的一种支持

 

   一、定义拦截器

Public class HandlerInterceptor1 implements HandlerInterceptor{

    /**
     * controller执行前调用此方法
     * 返回true表示继续执行,返回false中止执行
     * 这里可以加入登录校验、权限拦截等
     */
    @Override
    Public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        // TODO Auto-generated method stub
        Return false;
    }
    /**
     * controller执行后但未返回视图前调用此方法
     * 这里可在返回用户前对模型数据进行加工处理,比如这里加入公用信息以便页面显示
     */
    @Override
    Public void postHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        // TODO Auto-generated method stub
        
    }
    /**
     * controller执行后且视图返回后调用此方法
     * 这里可得到执行controller时的异常信息
     * 这里可记录操作日志,资源清理等
     */
    @Override
    Public void afterCompletion(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        // TODO Auto-generated method stub
        
    }
}

 

 

   二、配置拦截器

      1、针对某种mapping配置拦截器

<bean
    class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
    <property name="interceptors">
        <list>
            <ref bean="handlerInterceptor1"/>
            <ref bean="handlerInterceptor2"/>
        </list>
    </property>
</bean>
    <bean id="handlerInterceptor1" class="springmvc.intercapter.HandlerInterceptor1"/>
    <bean id="handlerInterceptor2" class="springmvc.intercapter.HandlerInterceptor2"/>

 

 

      2、针对所有mapping配置全局拦截器

<!--拦截器 -->
<mvc:interceptors>
    <!--多个拦截器,顺序执行 -->
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="springmvc.filter.HandlerInterceptor1"></bean>
    </mvc:interceptor>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="springmvc.filter.HandlerInterceptor2"></bean>
    </mvc:interceptor>
</mvc:interceptors>

 

 

   三、正常流程测试

  定义两个拦截器分别为:HandlerInterceptor1和HandlerInteptor2,每个拦截器的preHandler方法都返回true。

  运行结果:

HandlerInterceptor1..preHandle..

HandlerInterceptor2..preHandle..

 

HandlerInterceptor2..postHandle..

HandlerInterceptor1..postHandle..

 

HandlerInterceptor2..afterCompletion..

HandlerInterceptor1..afterCompletion..

 

   四、中断流程测试

  

  HandlerInterceptor1的preHandler方法返回false,HandlerInterceptor2返回true,运行流程如下:

    HandlerInterceptor1..preHandle..

  从日志看出第一个拦截器的preHandler方法返回false后第一个拦截器只执行了preHandler方法,其它两个方法没有执行,第二个拦截器的所有方法不执行,且controller也不执行了。

 

 

  HandlerInterceptor1的preHandler方法返回true,HandlerInterceptor2返回false,运行流程如下:

    HandlerInterceptor1..preHandle..

    HandlerInterceptor2..preHandle..

    HandlerInterceptor1..afterCompletion..

  从日志看出第二个拦截器的preHandler方法返回false后第一个拦截器的postHandler没有执行,第二个拦截器的postHandler和afterCompletion没有执行,且controller也不执行了。

 

  总结

preHandle按拦截器定义顺序调用

postHandler按拦截器定义逆序调用

afterCompletion按拦截器定义逆序调用

postHandler在拦截器链内所有拦截器返成功调用

afterCompletion只有preHandle返回true才调用

 

 

   * 拦截器应用

 

1、有一个登录页面,需要写一个controller访问页面

2、登录页面有一提交表单的动作。需要在controller中处理。

a)       判断用户名密码是否正确

b)       如果正确 向session中写入用户信息

c)        返回登录成功,或者跳转到商品列表

3、拦截器。

a)       拦截用户请求,判断用户是否登录

b)       如果用户已经登录。放行

c)        如果用户未登录,跳转到登录页面。

 

  用户身份认证

Public class LoginInterceptor implements HandlerInterceptor{

    @Override
    Public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {

        //如果是登录页面则放行
        if(request.getRequestURI().indexOf("login.action")>=0){
            return true;
        }
        HttpSession session = request.getSession();
        //如果用户已登录也放行
        if(session.getAttribute("user")!=null){
            return true;
        }
        //用户没有登录挑战到登录页面
        request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
        
        return false;
    }
}

  

  controller

   //登陆页面
    @RequestMapping("/login")
    public String login(Model model)throws Exception{        
        return "login";
    }
    
    //登陆提交
    //userid:用户账号,pwd:密码
    @RequestMapping("/loginsubmit")
    public String loginsubmit(HttpSession session,String userid,String pwd)throws Exception{        
        //向session记录用户身份信息
        session.setAttribute("activeUser", userid);
        
        return "redirect:item/queryItem.action";
    }
    
    //退出
    @RequestMapping("/logout")
    public String logout(HttpSession session)throws Exception{    
        //session过期
        session.invalidate();      
        return "redirect:item/queryItem.action";
    }

 


文章来源:http://www.cnblogs.com

原文地址:https://www.cnblogs.com/jifengblog/p/9248510.html

Linux Mint 19 “Tara”发布

Linux Mint 项目发布了最新版本 Linux Mint 19“Tara”。Linux Mint 19 根据不同的桌面环境发布了两个版本:
Cinnamon
MATE,将提供五年支持至 2023 年。Linux Mint 19 最大特性是 Timeshift,Timeshift 是在 Linux Mint 18.3 中引入的,并向后移植到了所有版本,它现在是 Linux Mint 更新策略的核心。通过 Timeshift,用户可以在系统出现问题时返回到能正常工作的一个最新快照,就好象问题从来没有发生过一样。这项功能简化了用户对系统的维护,不用再担心系统更新后遭遇各种奇奇怪怪的问题。在回滚到正常工作的版本之后,用户仍然可以选择性的对应用进行更新。更新管理器现在也依赖于 Timeshift 确保系统的稳定。

文章来源:http://www.solidot.org

原文地址:http://www.solidot.org/story?sid=57032