美国亚马逊新规下架多款充电宝 中国卖家受影响



亚马逊从4月25日开始限制充电宝销售。根据爆料截图内容,充电宝整个类目都是限制销售的范围,限制销售的原因则是“充电宝之前发生了很多起安全事故”。另外,据亚马逊运营人员透露,目前的限制销售政策只针对带锂电池的充电宝,对其他充电配件无影响。充电头网通过查询了解,找到了更多关于亚马逊下架充电宝的资料:

从这位卖家和运营人员的对话中可以看出,此次禁售充电宝事件为亚马逊官方平台强制实施,针对的是全部移动电源品类。而在实施禁售之前,亚马逊官方并没有与卖家进行任何沟通与协商,属于单方面强制下架,亚马逊运营人员对此也表示事发突然。关于被禁售的卖家,亚马逊暂时也没有给出相应的解决方案。

而一位自称美国卖家的网友声称,已经收到了亚马逊的通知,在5月25日前没有提供UL2056认证的所有充电宝将全部被禁售

有关于亚马逊移动电源的安全问题,充电头网之前也有过相应报道。就在今年3月,亚马逊对自家basicms品牌的移动充电宝进行召回,共计26万台。主要原因是在美国范围内,亚马逊已经收到了超过50起充电宝出现过热现象的报道,认为产品存在安全隐患。而这也是本次充电宝禁售事件的导火索。

关于UL2056

UL2056是全世界第一个针对移动电源的标准,旨在保护消费者免受因移动电源起火、爆炸等危险事故所造成的人身及财产损害,同时帮助制造商降低承受昂贵的产品回收及品牌受损风险。

UL2056认证费用因产品的而异,充电头网通过咨询业内人士得知,单款移动电源的认证费用大概为10万人民币,后期每年还得缴纳2~3万不等的维护费用。认证项目和流程也是比较复杂的,所以一般情况下,认证周期为一年左右。

另外,充电头网通过查询了解到,目前亚马逊对手机/笔记本电脑电池和充电器已经有一系列的上架要求,产品必须取得相应的UL认证资质才可上架。

随着充电宝问题逐渐暴露,亚马逊已经意识到了诸多潜在的安全隐患。强制下架处理虽然有些暴力、不近人情,但也是为了制定更加完善的监管制度,这对消费者来说是一个好消息。


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

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

苹果iPhone X成为全球头号智能手机



据Counterpoint Research的最新数据显示,iPhone X不仅是所有iPhone机型当中最畅销智的一款,还是战胜三星旗舰机型成为全球最畅销的智能手机。对苹果来说更好的消息是,今年第二个月的五个畅销设备中有四个是iPhonee,而销量也比去年同期提高了5%。

iPhone X以5.1%的销售份额排名第一,其次是iPhone 8的3.1%和iPhone 7的2.2%。由于2017年推出后的折扣,iPhone 7销售特别好。更大的iPhone 8 Plus以1.9%的份额排名第四,而小米的Redmi 5A则成功获得了相同的份额。

另一方面,三星Galaxy S8获得1.45%的销售份额排名第六位,但值得一提的是,二月份Galaxy S9尚未上市,当S9成为数据的一部分时,三星可能会观察到更好的结果。Counterpoint Research指出,由于Galaxy S8发布之前的降价,以及J7系列的良好性能,Galaxy S8销售年增长了约3%。该研究报告指出,三星在全球手机和智能手机销售中继续保持第一的位置。

有些令人惊讶的是,尽管苹果在这些设备之间在规格方面产生了较大的差异,但较小的iPhone仍然比其较大的兄弟姐妹卖得更好。例如,iPhone 8 Plus配备了双摄像头系统和更大的电池,但从这些数字来看,较小的型号对客户而言仍然更具吸引力。

iphone-x-becomes-the-number-one-smartphone-worldwide-520896-2.png


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

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

一项研究显示Google Assistant是目前最准确的智能语音助手



数字助理之争越来越激烈,越来越多的大公司开发自己的解决方案,最终安装在针对全球消费者和企业的软硬件产品上。Stone Temple进行的一项研究显示,Google Assistant是目前最准确的助手,其次是微软的Cortana。该研究分析了Cortana在Invoke扬声器上,Google Assistant在智能手机和Google Home上的表现。

当涉及到不正确的回应时,Alexa和Siri位列榜首,苹果Siri的错误率甚至比前一年增长。Alexa和Siri的许多”错误“都来自结构性很差的查询或模糊的查询,例如“纽约拉什莫尔在哪些电影当中出现过?”,在Alexa和Siri当中,超过三分之一的查询来自这些晦涩难懂的问题。

但是,尽管Siri未能对您的问题给出最正确答案,但实际上与其聊天最令人愉快。研究指出,苹果的助手是最有趣的,并以最多的笑话回应。总的来说,谷歌助理击败了所有的竞争对手,研究指出,在这个特定市场上的竞争正在增加,特别是当公司在这个领域投资更多时。 Alexa的成绩与去年相比有了最大的提高,并可能在2018年持续这种趋势。


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

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

中国正在大规模测试大脑情绪监测技术

阿里巴巴旗下的南华早报
报道,多家中国公司正在大规模测试监视大脑情绪的设备。这种设备使用无线传感器监视佩戴者的大脑活动,将脑电波数据传送到计算机,计算机软件使用 AI 算法探测情绪波动如抑郁、焦虑或愤怒。一家使用大脑情绪监测设备的公司声称该设备过去两年给公司增加了 1.4 亿元收入。大脑情绪监测技术的一个主要研究中心是宁波大学的政府资助项目 Neuro Cap。宁波大学脑科学副教授 Jin Jia 说,关键岗位的高度情绪化雇员会影响整个生产线,危险到其自身安全和其他人的安全。当系统发出警告,经理可以要求雇员休息一天或转移到非关键岗位。她说,这里没有犯错的空间。她称工人一开始对设备的反应是恐惧和怀疑,后来就习惯了,它就像天天戴得安全帽。她说中国的大脑阅读技术与西方处于同一水平,但中国是唯一一个在工作场所大规模使用该技术的国家。一家生产大脑监测设备的上海公司 Deayea 称,设备探测出疲劳和注意力下降等大脑活动的正确率超过九成。北京师范大学教授 Qiao Zhian 认为设备让企业更具竞争力的同时也可能会被滥用去控制思想和侵犯隐私,引发“思想警察”的担忧,雇主有强烈动机使用它雇员则太弱小而无法说不。他说,人类思想不应该被用于获利目的。

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

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

多态性






lesson Eleven                        2018-04-30  22:34:59




多态性

1.多态性指的是什么?   多态性,可以理解为一个事物的多种表现形态。

  1.1方法的重载与重写

  1.2子类对像的多态性

2.子类对像的多态性使用的前提

  2.1要有类的继承

  2.2要有子类对父类方法的重写

3.程序运行分为编译状态和运行状态

  如:Person p = new Person();

  3.1对于多态性来说,编译时,检测等号左边,将此引用变量理解为父类的类型。

  3.2对于多态性来说,运行时,检测等号右边,关注于真正对像的实体,子类的对像。执行的方法


 1 public class Person {
 2     private String name;
 3     private int age;
 4     int id = 1001;
 5 
 6     public String getName() {
 7         return name;
 8     }
 9 
10     public void setName(String name) {
11         this.name = name;
12     }
13 
14     public int getAge() {
15         return age;
16     }
17 
18     public void setAge(int age) {
19         this.age = age;
20     }
21 
22     public void eat() {
23         System.out.println("eating");
24     }
25 
26     public void walk() {
27         System.out.println("walking");
28     }
29 
30 }

父类

4.虚拟方法调用:通过父类的引用指向子类的对像实体,当调用方法时,实际执行的是子类重写父类的方法

5.父类引用指向子类实体后,不可以调用子类独有的方法和属性。

6.子类对像的多态性并不适用于属性。


 1 public class man extends Person {
 2 
 3     int id = 1002;
 4 
 5     public void eat() {
 6         System.out.println("man is eaeting!");
 7     }
 8 
 9     public void walk() {
10         System.out.println("man is walking");
11     }
12 
13     public void playGame() {
14         System.out.println("man is playing games");
15     }
16 }

子类



 1 public static void main(String[] args) {
 2         Person p = new Person();
 3         p.eat();
 4         p.walk();
 5         System.out.println();
 6 
 7         man m = new man();
 8         m.eat();
 9         m.walk();
10         System.out.println();
11         
12         //子类对像的多态性:父类的引用指向子类对像
13         Person p1 = new man();
14         //虚拟方法调用:通过父类的引用指向子类的对像实体,当调用方法时,实际执行的是子类重写父类的方法
15         p1.walk();
16         p1.eat();
17         System.out.println(p.id);
18 //        p1.playGame();
19 //        不可以调用子类独有的方法和属性。
20     }

主方法




 


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

原文地址:https://www.cnblogs.com/Fkuennhvo/p/8975077.html

Spring统一返回Json工具类,带分页信息



前言:

  • 项目做前后端分离时,我们会经常提供Json数据给前端,如果有一个统一的Json格式返回工具类,那么将大大提高开发效率和减低沟通成本。

  • 此Json响应工具类,支持带分页信息,支持泛型,支持HttpStatus标准返回码

效果预览:

步入正题:

1. Resp工具类
import java.io.Serializable;
import java.util.Map;

/**
 * @Author: XiongFeng
 * @Description: Restful统一Json响应对象封装
 * @Date: Created in 9:39 2018/4/10
 */
public class Resp<T> implements Serializable {
    private static final long serialVersionUID = 1L;

    private final static String SUCCESS_CODE = "200";

    /**
     * 返回状态码
     */
    private String status;

    /**
     * 返回消息
     */
    private String message;

    /**
     * 返回内容
     */
    private T data;

    /**
     * 分页信息
     */
    private PageInfo page;

    /**
     * 其他内容
     */
    private Map<String, Object> ext;

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public Map<String, Object> getExt() {
        return ext;
    }

    public void setExt(Map<String, Object> ext) {
        this.ext = ext;
    }

    public PageInfo getPage() {
        return page;
    }

    public void setPage(PageInfo page) {
        this.page = page;
    }

    public Resp(){
        this.status = SUCCESS_CODE;
        this.message = "SUCCESS";
    }

    public Resp(String status, String message) {
        this.status = status;
        this.message = message;
    }

    public Resp(String status, String message, T data) {
        this.status = status;
        this.message = message;
        this.data = data;
    }

    public Resp(String status, String message, T data, Map<String, Object> ext) {
        this.status = status;
        this.message = message;
        this.data = data;
        this.ext = ext;
    }

    public Resp(String status, String message, T data, PageInfo pageInfo) {
        this.status = status;
        this.message = message;
        this.data = data;
        this.page = pageInfo;
    }

    public Resp(String status, String message, T data, Map<String, Object> ext, PageInfo pageInfo) {
        this.status = status;
        this.message = message;
        this.data = data;
        this.ext = ext;
        this.page = pageInfo;
    }

    public Resp(String status, String message, T data, Long total, Integer pageNo, Integer pageSize){
        PageInfo pageInfo = new PageInfo(total, pageNo, pageSize);
        this.status = status;
        this.message = message;
        this.data = data;
        this.page = pageInfo;
    }

    public Resp(String status, String message, T data, Map<String, Object> ext, Long total, Integer pageNo, Integer pageSize){
        PageInfo pageInfo = new PageInfo(total, pageNo, pageSize);
        this.status = status;
        this.message = message;
        this.data = data;
        this.ext = ext;
        this.page = pageInfo;
    }

    //快速返回成功
    public static <T>Resp success(){
        return new Resp<T>(SUCCESS_CODE,"请求成功",null);
    }

    public static <T>Resp success(T result){
        return new Resp<T>(SUCCESS_CODE,"请求成功",result);
    }

    public static <T>Resp success(String message, T result){
        return new Resp<T>(SUCCESS_CODE,message,result);
    }

    public static <T>Resp success(String message, T result, Map<String, Object> extra){
        return new Resp<T>(SUCCESS_CODE,message,result, extra);
    }

    public static <T>Resp success(T result, Long total, Integer pageNo, Integer pageSize){
        PageInfo pageInfo = new PageInfo(total, pageNo, pageSize);
        return new Resp<T>(SUCCESS_CODE,"请求成功",result, pageInfo);
    }
    
    public static <T>Resp success(T result, Map<String, Object> extra, Long total, Integer pageNo, Integer pageSize){
        PageInfo pageInfo = new PageInfo(total, pageNo, pageSize);
        return new Resp<T>(SUCCESS_CODE,"请求成功",result, extra,pageInfo);
    }

    public static <T>Resp success(String message, T result, Long total, Integer pageNo, Integer pageSize){
        PageInfo pageInfo = new PageInfo(total, pageNo, pageSize);
        return new Resp<T>(SUCCESS_CODE,message,result,pageInfo);
    }

    public static <T>Resp success(String message, T result, Map<String, Object> extra, Long total, Integer pageNo, Integer pageSize){
        PageInfo pageInfo = new PageInfo(total, pageNo, pageSize);
        return new Resp<T>(SUCCESS_CODE,message,result, extra,pageInfo);
    }

    //快速返回失败状态
    public static <T>Resp fail(){
        return new Resp<T>(ErrorCode.SYSTEM_ERROR.getCode(),ErrorCode.SYSTEM_ERROR.getMessage());
    }

    public static <T>Resp fail(T result){
        return new Resp<T>(ErrorCode.SYSTEM_ERROR.getCode(),ErrorCode.SYSTEM_ERROR.getMessage(),result);
    }
    
    public <T>Resp fail(String message, T result){
        return new Resp<T>(ErrorCode.SYSTEM_ERROR.getCode(),message,result);
    }

    public <T>Resp fail(String message, T result, Map<String, Object> extra){
        return new Resp<T>(ErrorCode.SYSTEM_ERROR.getCode(),message,result, extra);
    }

    public static <T>Resp fail(ErrorCode errorCode){
        return new Resp<T>(errorCode.getCode(),errorCode.getMessage());
    }

    public static <T>Resp fail(ErrorCode errorCode, T result){
        return new Resp<T>(errorCode.getCode(),errorCode.getMessage(),result);
    }

    public static <T>Resp fail(ErrorCode errorCode, String message, T result){
        return new Resp<T>(errorCode.getCode(),message,result);
    }

    public static <T>Resp fail(ErrorCode errorCode, String message, T result, Map<String, Object> extra){
        return new Resp<T>(errorCode.getCode(),message,result, extra);
    }

    //快速返回自定义状态码
    public static <T>Resp result(String statusCode, String message){
        return new Resp<T>(statusCode,message);
    }

    public static <T>Resp result(String statusCode, String message, T result){
        return new Resp<T>(statusCode,message,result);
    }

    public static <T>Resp result(String statusCode, String message, T result, Map<String, Object> extra){
        return new Resp<T>(statusCode,message,result, extra);
    }

    public static <T>Resp result(String statusCode, String message, T result, Long total, Integer pageNo, Integer pageSize){
        PageInfo pageInfo = new PageInfo(total, pageNo, pageSize);
        return new Resp<T>(statusCode,message,result, pageInfo);
    }

    public static <T>Resp result(String statusCode, String message, T result, Map<String, Object> extra, Long total, Integer pageNo, Integer pageSize){
        PageInfo pageInfo = new PageInfo(total, pageNo, pageSize);
        return new Resp<T>(statusCode,message,result, extra,pageInfo);
    }

    //快速返回Http状态
    public static <T>Resp httpStatus(HttpStatus httpStatus, String message){
        return result(httpStatus.toString(),message);
    }

    public static <T>Resp httpStatus(HttpStatus httpStatus, String message, T result){
        return result(httpStatus.toString(),message,result);
    }

    public static <T>Resp httpStatus(HttpStatus httpStatus, String message, T result, Map<String, Object> extra){
        return result(httpStatus.toString(),message,result, extra);
    }

    public static <T>Resp httpStatus(HttpStatus httpStatus, String message, T result, Long total, Integer pageNo, Integer pageSize){
        PageInfo pageInfo = new PageInfo(total, pageNo, pageSize);
        return result(httpStatus.toString(),message,result, total, pageNo, pageSize);
    }

    public static <T>Resp httpStatus(HttpStatus httpStatus, String message, T result, Map<String, Object> extra, Long total, Integer pageNo, Integer pageSize){
        PageInfo pageInfo = new PageInfo(total, pageNo, pageSize);
        return result(httpStatus.toString(),message,result, extra, total, pageNo, pageSize);
    }
}
2. PageInfo 用于封装分页信息的
import java.io.Serializable;

/**
 * @Author: XiongFeng
 * @Description: 分页信息
 * @Date: Created in 9:39 2018/4/10
 */
public class PageInfo implements Serializable{


    private static final long serialVersionUID = 1L;
    /**
     * 总记录数
     */
    private Long total;
    /**
     * 总页数
     */
    private Long totalPages;
    /**
     * 当前页
     */
    private Integer pageNo;
    /**
     * 页记录数
     */
    private Integer pageSize;

    public PageInfo(Long total) {
        this.total = total;
    }

    public PageInfo(Long total, Integer pageNo,
                    Integer pageSize) {
        this.total = total;
        this.totalPages = (total - 1) / pageSize + 1;
        this.pageNo = pageNo;
        this.pageSize = pageSize;
    }

    public static PageInfo page(Long total) {
        return new PageInfo(total);
    }

    public static PageInfo page( Long total, Integer pageNo,
                                      Integer pageSize) {
        return new PageInfo(total, pageNo, pageSize);
    }

    public Long getTotal() {
        return total;
    }

    public void setTotal(Long total) {
        this.total = total;
    }

    public Long getTotalPages() {
        return totalPages;
    }

    public void setTotalPages(Long totalPages) {
        this.totalPages = totalPages;
    }

    public Integer getPageNo() {
        return pageNo;
    }

    public void setPageNo(Integer pageNo) {
        this.pageNo = pageNo;
    }

    public Integer getPageSize() {
        return pageSize;
    }

    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }
}
4. ErrorCode 用于定义错误码
/**
 * @Author: XiongFeng
 * @Description: 错误码
 * @Date: Created in 9:39 2018/4/10
 */
public enum ErrorCode {

    SYSTEM_ERROR(500, "系统错误"),
    PARAMETER_CHECK_ERROR(400, "参数校验错误"),
    AUTH_VALID_ERROR(701, "用户权限不足"),
    UNLOGIN_ERROR(401, "用户未登录或登录状态超时失效"),
    ;

    private final Integer value;
    private final String message;

    ErrorCode(int value, String message) {
        this.value = value;
        this.message = message;
    }

    public int getValue() {
        return value;
    }

    public String getMessage() {
        return message;
    }

    @Override
    public String toString() {
        return value.toString();
    }

    public String getCode() {
        return value.toString();
    }

    public static ErrorCode getByCode(Integer value) {
        for (ErrorCode _enum : values()) {
            if (_enum.getValue() == value) {
                return _enum;
            }
        }
        return null;
    }

}
5. HttpStatus 提取自org.springframework.http,可以自己引入
/**
 * Enumeration of HTTP status codes.
 *
 * <p>The HTTP status code series can be retrieved via {@link #series()}.
 *
 * @author Arjen Poutsma
 * @author Sebastien Deleuze
 * @author Brian Clozel
 * @since 3.0
 * @see HttpStatus.Series
 * @see <a href="http://www.iana.org/assignments/http-status-codes">HTTP Status Code Registry</a>
 * @see <a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes">List of HTTP status codes - Wikipedia</a>
 */
public enum HttpStatus {

    // 1xx Informational

    /**
     * {@code 100 Continue}.
     * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.2.1">HTTP/1.1: Semantics and Content, section 6.2.1</a>
     */
    CONTINUE(100, "Continue"),
    /**
     * {@code 101 Switching Protocols}.
     * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.2.2">HTTP/1.1: Semantics and Content, section 6.2.2</a>
     */
    SWITCHING_PROTOCOLS(101, "Switching Protocols"),
    /**
     * {@code 102 Processing}.
     * @see <a href="http://tools.ietf.org/html/rfc2518#section-10.1">WebDAV</a>
     */
    PROCESSING(102, "Processing"),
    /**
     * {@code 103 Checkpoint}.
     * @see <a href="http://code.google.com/p/gears/wiki/ResumableHttpRequestsProposal">A proposal for supporting
     * resumable POST/PUT HTTP requests in HTTP/1.0</a>
     */
    CHECKPOINT(103, "Checkpoint"),

    // 2xx Success

    /**
     * {@code 200 OK}.
     * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.3.1">HTTP/1.1: Semantics and Content, section 6.3.1</a>
     */
    OK(200, "OK"),
    /**
     * {@code 201 Created}.
     * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.3.2">HTTP/1.1: Semantics and Content, section 6.3.2</a>
     */
    CREATED(201, "Created"),
    /**
     * {@code 202 Accepted}.
     * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.3.3">HTTP/1.1: Semantics and Content, section 6.3.3</a>
     */
    ACCEPTED(202, "Accepted"),
    /**
     * {@code 203 Non-Authoritative Information}.
     * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.3.4">HTTP/1.1: Semantics and Content, section 6.3.4</a>
     */
    NON_AUTHORITATIVE_INFORMATION(203, "Non-Authoritative Information"),
    /**
     * {@code 204 No Content}.
     * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.3.5">HTTP/1.1: Semantics and Content, section 6.3.5</a>
     */
    NO_CONTENT(204, "No Content"),
    /**
     * {@code 205 Reset Content}.
     * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.3.6">HTTP/1.1: Semantics and Content, section 6.3.6</a>
     */
    RESET_CONTENT(205, "Reset Content"),
    /**
     * {@code 206 Partial Content}.
     * @see <a href="http://tools.ietf.org/html/rfc7233#section-4.1">HTTP/1.1: Range Requests, section 4.1</a>
     */
    PARTIAL_CONTENT(206, "Partial Content"),
    /**
     * {@code 207 Multi-Status}.
     * @see <a href="http://tools.ietf.org/html/rfc4918#section-13">WebDAV</a>
     */
    MULTI_STATUS(207, "Multi-Status"),
    /**
     * {@code 208 Already Reported}.
     * @see <a href="http://tools.ietf.org/html/rfc5842#section-7.1">WebDAV Binding Extensions</a>
     */
    ALREADY_REPORTED(208, "Already Reported"),
    /**
     * {@code 226 IM Used}.
     * @see <a href="http://tools.ietf.org/html/rfc3229#section-10.4.1">Delta encoding in HTTP</a>
     */
    IM_USED(226, "IM Used"),

    // 3xx Redirection

    /**
     * {@code 300 Multiple Choices}.
     * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.4.1">HTTP/1.1: Semantics and Content, section 6.4.1</a>
     */
    MULTIPLE_CHOICES(300, "Multiple Choices"),
    /**
     * {@code 301 Moved Permanently}.
     * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.4.2">HTTP/1.1: Semantics and Content, section 6.4.2</a>
     */
    MOVED_PERMANENTLY(301, "Moved Permanently"),
    /**
     * {@code 302 Found}.
     * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.4.3">HTTP/1.1: Semantics and Content, section 6.4.3</a>
     */
    FOUND(302, "Found"),
    /**
     * {@code 302 Moved Temporarily}.
     * @see <a href="http://tools.ietf.org/html/rfc1945#section-9.3">HTTP/1.0, section 9.3</a>
     * @deprecated in favor of {@link #FOUND} which will be returned from {@code HttpStatus.valueOf(302)}
     */
    @Deprecated
    MOVED_TEMPORARILY(302, "Moved Temporarily"),
    /**
     * {@code 303 See Other}.
     * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.4.4">HTTP/1.1: Semantics and Content, section 6.4.4</a>
     */
    SEE_OTHER(303, "See Other"),
    /**
     * {@code 304 Not Modified}.
     * @see <a href="http://tools.ietf.org/html/rfc7232#section-4.1">HTTP/1.1: Conditional Requests, section 4.1</a>
     */
    NOT_MODIFIED(304, "Not Modified"),
    /**
     * {@code 305 Use Proxy}.
     * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.4.5">HTTP/1.1: Semantics and Content, section 6.4.5</a>
     * @deprecated due to security concerns regarding in-band configuration of a proxy
     */
    @Deprecated
    USE_PROXY(305, "Use Proxy"),
    /**
     * {@code 307 Temporary Redirect}.
     * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.4.7">HTTP/1.1: Semantics and Content, section 6.4.7</a>
     */
    TEMPORARY_REDIRECT(307, "Temporary Redirect"),
    /**
     * {@code 308 Permanent Redirect}.
     * @see <a href="http://tools.ietf.org/html/rfc7238">RFC 7238</a>
     */
    PERMANENT_REDIRECT(308, "Permanent Redirect"),

    // --- 4xx Client Error ---

    /**
     * {@code 400 Bad Request}.
     * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.1">HTTP/1.1: Semantics and Content, section 6.5.1</a>
     */
    BAD_REQUEST(400, "Bad Request"),
    /**
     * {@code 401 Unauthorized}.
     * @see <a href="http://tools.ietf.org/html/rfc7235#section-3.1">HTTP/1.1: Authentication, section 3.1</a>
     */
    UNAUTHORIZED(401, "Unauthorized"),
    /**
     * {@code 402 Payment Required}.
     * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.2">HTTP/1.1: Semantics and Content, section 6.5.2</a>
     */
    PAYMENT_REQUIRED(402, "Payment Required"),
    /**
     * {@code 403 Forbidden}.
     * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.3">HTTP/1.1: Semantics and Content, section 6.5.3</a>
     */
    FORBIDDEN(403, "Forbidden"),
    /**
     * {@code 404 Not Found}.
     * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.4">HTTP/1.1: Semantics and Content, section 6.5.4</a>
     */
    NOT_FOUND(404, "Not Found"),
    /**
     * {@code 405 Method Not Allowed}.
     * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.5">HTTP/1.1: Semantics and Content, section 6.5.5</a>
     */
    METHOD_NOT_ALLOWED(405, "Method Not Allowed"),
    /**
     * {@code 406 Not Acceptable}.
     * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.6">HTTP/1.1: Semantics and Content, section 6.5.6</a>
     */
    NOT_ACCEPTABLE(406, "Not Acceptable"),
    /**
     * {@code 407 Proxy Authentication Required}.
     * @see <a href="http://tools.ietf.org/html/rfc7235#section-3.2">HTTP/1.1: Authentication, section 3.2</a>
     */
    PROXY_AUTHENTICATION_REQUIRED(407, "Proxy Authentication Required"),
    /**
     * {@code 408 Request Timeout}.
     * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.7">HTTP/1.1: Semantics and Content, section 6.5.7</a>
     */
    REQUEST_TIMEOUT(408, "Request Timeout"),
    /**
     * {@code 409 Conflict}.
     * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.8">HTTP/1.1: Semantics and Content, section 6.5.8</a>
     */
    CONFLICT(409, "Conflict"),
    /**
     * {@code 410 Gone}.
     * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.9">HTTP/1.1: Semantics and Content, section 6.5.9</a>
     */
    GONE(410, "Gone"),
    /**
     * {@code 411 Length Required}.
     * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.10">HTTP/1.1: Semantics and Content, section 6.5.10</a>
     */
    LENGTH_REQUIRED(411, "Length Required"),
    /**
     * {@code 412 Precondition failed}.
     * @see <a href="http://tools.ietf.org/html/rfc7232#section-4.2">HTTP/1.1: Conditional Requests, section 4.2</a>
     */
    PRECONDITION_FAILED(412, "Precondition Failed"),
    /**
     * {@code 413 Payload Too Large}.
     * @since 4.1
     * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.11">HTTP/1.1: Semantics and Content, section 6.5.11</a>
     */
    PAYLOAD_TOO_LARGE(413, "Payload Too Large"),
    /**
     * {@code 413 Request Entity Too Large}.
     * @see <a href="http://tools.ietf.org/html/rfc2616#section-10.4.14">HTTP/1.1, section 10.4.14</a>
     * @deprecated in favor of {@link #PAYLOAD_TOO_LARGE} which will be returned from {@code HttpStatus.valueOf(413)}
     */
    @Deprecated
    REQUEST_ENTITY_TOO_LARGE(413, "Request Entity Too Large"),
    /**
     * {@code 414 URI Too Long}.
     * @since 4.1
     * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.12">HTTP/1.1: Semantics and Content, section 6.5.12</a>
     */
    URI_TOO_LONG(414, "URI Too Long"),
    /**
     * {@code 414 Request-URI Too Long}.
     * @see <a href="http://tools.ietf.org/html/rfc2616#section-10.4.15">HTTP/1.1, section 10.4.15</a>
     * @deprecated in favor of {@link #URI_TOO_LONG} which will be returned from {@code HttpStatus.valueOf(414)}
     */
    @Deprecated
    REQUEST_URI_TOO_LONG(414, "Request-URI Too Long"),
    /**
     * {@code 415 Unsupported Media Type}.
     * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.13">HTTP/1.1: Semantics and Content, section 6.5.13</a>
     */
    UNSUPPORTED_MEDIA_TYPE(415, "Unsupported Media Type"),
    /**
     * {@code 416 Requested Range Not Satisfiable}.
     * @see <a href="http://tools.ietf.org/html/rfc7233#section-4.4">HTTP/1.1: Range Requests, section 4.4</a>
     */
    REQUESTED_RANGE_NOT_SATISFIABLE(416, "Requested range not satisfiable"),
    /**
     * {@code 417 Expectation Failed}.
     * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.14">HTTP/1.1: Semantics and Content, section 6.5.14</a>
     */
    EXPECTATION_FAILED(417, "Expectation Failed"),
    /**
     * {@code 418 I'm a teapot}.
     * @see <a href="http://tools.ietf.org/html/rfc2324#section-2.3.2">HTCPCP/1.0</a>
     */
    I_AM_A_TEAPOT(418, "I'm a teapot"),
    /**
     * @deprecated See <a href="http://tools.ietf.org/rfcdiff?difftype=--hwdiff&url2=draft-ietf-webdav-protocol-06.txt">WebDAV Draft Changes</a>
     */
    @Deprecated
    INSUFFICIENT_SPACE_ON_RESOURCE(419, "Insufficient Space On Resource"),
    /**
     * @deprecated See <a href="http://tools.ietf.org/rfcdiff?difftype=--hwdiff&url2=draft-ietf-webdav-protocol-06.txt">WebDAV Draft Changes</a>
     */
    @Deprecated
    METHOD_FAILURE(420, "Method Failure"),
    /**
     * @deprecated See <a href="http://tools.ietf.org/rfcdiff?difftype=--hwdiff&url2=draft-ietf-webdav-protocol-06.txt">WebDAV Draft Changes</a>
     */
    @Deprecated
    DESTINATION_LOCKED(421, "Destination Locked"),
    /**
     * {@code 422 Unprocessable Entity}.
     * @see <a href="http://tools.ietf.org/html/rfc4918#section-11.2">WebDAV</a>
     */
    UNPROCESSABLE_ENTITY(422, "Unprocessable Entity"),
    /**
     * {@code 423 Locked}.
     * @see <a href="http://tools.ietf.org/html/rfc4918#section-11.3">WebDAV</a>
     */
    LOCKED(423, "Locked"),
    /**
     * {@code 424 Failed Dependency}.
     * @see <a href="http://tools.ietf.org/html/rfc4918#section-11.4">WebDAV</a>
     */
    FAILED_DEPENDENCY(424, "Failed Dependency"),
    /**
     * {@code 426 Upgrade Required}.
     * @see <a href="http://tools.ietf.org/html/rfc2817#section-6">Upgrading to TLS Within HTTP/1.1</a>
     */
    UPGRADE_REQUIRED(426, "Upgrade Required"),
    /**
     * {@code 428 Precondition Required}.
     * @see <a href="http://tools.ietf.org/html/rfc6585#section-3">Additional HTTP Status Codes</a>
     */
    PRECONDITION_REQUIRED(428, "Precondition Required"),
    /**
     * {@code 429 Too Many Requests}.
     * @see <a href="http://tools.ietf.org/html/rfc6585#section-4">Additional HTTP Status Codes</a>
     */
    TOO_MANY_REQUESTS(429, "Too Many Requests"),
    /**
     * {@code 431 Request Header Fields Too Large}.
     * @see <a href="http://tools.ietf.org/html/rfc6585#section-5">Additional HTTP Status Codes</a>
     */
    REQUEST_HEADER_FIELDS_TOO_LARGE(431, "Request Header Fields Too Large"),
    /**
     * {@code 451 Unavailable For Legal Reasons}.
     * @see <a href="https://tools.ietf.org/html/draft-ietf-httpbis-legally-restricted-status-04">
     * An HTTP Status Code to Report Legal Obstacles</a>
     * @since 4.3
     */
    UNAVAILABLE_FOR_LEGAL_REASONS(451, "Unavailable For Legal Reasons"),

    // --- 5xx Server Error ---

    /**
     * {@code 500 Internal Server Error}.
     * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.6.1">HTTP/1.1: Semantics and Content, section 6.6.1</a>
     */
    INTERNAL_SERVER_ERROR(500, "Internal Server Error"),
    /**
     * {@code 501 Not Implemented}.
     * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.6.2">HTTP/1.1: Semantics and Content, section 6.6.2</a>
     */
    NOT_IMPLEMENTED(501, "Not Implemented"),
    /**
     * {@code 502 Bad Gateway}.
     * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.6.3">HTTP/1.1: Semantics and Content, section 6.6.3</a>
     */
    BAD_GATEWAY(502, "Bad Gateway"),
    /**
     * {@code 503 Service Unavailable}.
     * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.6.4">HTTP/1.1: Semantics and Content, section 6.6.4</a>
     */
    SERVICE_UNAVAILABLE(503, "Service Unavailable"),
    /**
     * {@code 504 Gateway Timeout}.
     * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.6.5">HTTP/1.1: Semantics and Content, section 6.6.5</a>
     */
    GATEWAY_TIMEOUT(504, "Gateway Timeout"),
    /**
     * {@code 505 HTTP Version Not Supported}.
     * @see <a href="http://tools.ietf.org/html/rfc7231#section-6.6.6">HTTP/1.1: Semantics and Content, section 6.6.6</a>
     */
    HTTP_VERSION_NOT_SUPPORTED(505, "HTTP Version not supported"),
    /**
     * {@code 506 Variant Also Negotiates}
     * @see <a href="http://tools.ietf.org/html/rfc2295#section-8.1">Transparent Content Negotiation</a>
     */
    VARIANT_ALSO_NEGOTIATES(506, "Variant Also Negotiates"),
    /**
     * {@code 507 Insufficient Storage}
     * @see <a href="http://tools.ietf.org/html/rfc4918#section-11.5">WebDAV</a>
     */
    INSUFFICIENT_STORAGE(507, "Insufficient Storage"),
    /**
     * {@code 508 Loop Detected}
     * @see <a href="http://tools.ietf.org/html/rfc5842#section-7.2">WebDAV Binding Extensions</a>
     */
    LOOP_DETECTED(508, "Loop Detected"),
    /**
     * {@code 509 Bandwidth Limit Exceeded}
     */
    BANDWIDTH_LIMIT_EXCEEDED(509, "Bandwidth Limit Exceeded"),
    /**
     * {@code 510 Not Extended}
     * @see <a href="http://tools.ietf.org/html/rfc2774#section-7">HTTP Extension Framework</a>
     */
    NOT_EXTENDED(510, "Not Extended"),
    /**
     * {@code 511 Network Authentication Required}.
     * @see <a href="http://tools.ietf.org/html/rfc6585#section-6">Additional HTTP Status Codes</a>
     */
    NETWORK_AUTHENTICATION_REQUIRED(511, "Network Authentication Required");


    private final int value;

    private final String reasonPhrase;


    HttpStatus(int value, String reasonPhrase) {
        this.value = value;
        this.reasonPhrase = reasonPhrase;
    }


    /**
     * Return the integer value of this status code.
     */
    public int value() {
        return this.value;
    }

    /**
     * Return the reason phrase of this status code.
     */
    public String getReasonPhrase() {
        return this.reasonPhrase;
    }

    /**
     * Whether this status code is in the HTTP series
     * {@link org.springframework.http.HttpStatus.Series#INFORMATIONAL}.
     * This is a shortcut for checking the value of {@link #series()}.
     */
    public boolean is1xxInformational() {
        return Series.INFORMATIONAL.equals(series());
    }

    /**
     * Whether this status code is in the HTTP series
     * {@link org.springframework.http.HttpStatus.Series#SUCCESSFUL}.
     * This is a shortcut for checking the value of {@link #series()}.
     */
    public boolean is2xxSuccessful() {
        return Series.SUCCESSFUL.equals(series());
    }

    /**
     * Whether this status code is in the HTTP series
     * {@link org.springframework.http.HttpStatus.Series#REDIRECTION}.
     * This is a shortcut for checking the value of {@link #series()}.
     */
    public boolean is3xxRedirection() {
        return Series.REDIRECTION.equals(series());
    }


    /**
     * Whether this status code is in the HTTP series
     * {@link org.springframework.http.HttpStatus.Series#CLIENT_ERROR}.
     * This is a shortcut for checking the value of {@link #series()}.
     */
    public boolean is4xxClientError() {
        return Series.CLIENT_ERROR.equals(series());
    }

    /**
     * Whether this status code is in the HTTP series
     * {@link org.springframework.http.HttpStatus.Series#SERVER_ERROR}.
     * This is a shortcut for checking the value of {@link #series()}.
     */
    public boolean is5xxServerError() {
        return Series.SERVER_ERROR.equals(series());
    }

    /**
     * Returns the HTTP status series of this status code.
     * @see HttpStatus.Series
     */
    public Series series() {
        return Series.valueOf(this);
    }

    /**
     * Return a string representation of this status code.
     */
    @Override
    public String toString() {
        return Integer.toString(this.value);
    }


    /**
     * Return the enum constant of this type with the specified numeric value.
     * @param statusCode the numeric value of the enum to be returned
     * @return the enum constant with the specified numeric value
     * @throws IllegalArgumentException if this enum has no constant for the specified numeric value
     */
    public static HttpStatus valueOf(int statusCode) {
        for (HttpStatus status : values()) {
            if (status.value == statusCode) {
                return status;
            }
        }
        throw new IllegalArgumentException("No matching constant for [" + statusCode + "]");
    }


    /**
     * Enumeration of HTTP status series.
     * <p>Retrievable via {@link HttpStatus#series()}.
     */
    public enum Series {

        INFORMATIONAL(1),
        SUCCESSFUL(2),
        REDIRECTION(3),
        CLIENT_ERROR(4),
        SERVER_ERROR(5);

        private final int value;

        Series(int value) {
            this.value = value;
        }

        /**
         * Return the integer value of this status series. Ranges from 1 to 5.
         */
        public int value() {
            return this.value;
        }

        public static Series valueOf(int status) {
            int seriesCode = status / 100;
            for (Series series : values()) {
                if (series.value == seriesCode) {
                    return series;
                }
            }
            throw new IllegalArgumentException("No matching constant for [" + status + "]");
        }

        public static Series valueOf(HttpStatus status) {
            return valueOf(status.value);
        }
    }

}
6. 测试示例:

    @ResponseBody
    @RequestMapping("/json")
    public Resp json(String token) {
        MemberDetails member = memberService.getMemberDetailsByToken(token);
        return Resp.success(member, 5L, 1, 3); //这里分页信息,请自己从PageHelper返回的数据中得到。参看下面注释内容:

        //Page<Object> page = PageHelper.startPage(1, 5);
        //MemberDetails member = memberService.getMemberDetailsByToken(token);
        //return Resp.success(member, page.getTotal(), page.getPageNum(), page.getPageSize());
    }

    @ResponseBody
    @RequestMapping("/json2")
    public Resp json2(String token) {
        MemberDetails member = memberService.getMemberDetailsByToken(token);
        Map<String, Object> ext = new HashMap<>();
        ext.put("msg", "扩展内容");
        return Resp.success("成功了", member, ext, 5L, 1, 3);
    }

    @ResponseBody
    @RequestMapping("/json3")
    public Resp json3(String token) {
        MemberDetails member = memberService.getMemberDetailsByToken(token);
        return Resp.fail();
    }

    @ResponseBody
    @RequestMapping("/json4")
    public Resp json4(String token) {
        MemberDetails member = memberService.getMemberDetailsByToken(token);
        Map<String, Object> ext = new HashMap<>();
        ext.put("msg", "扩展内容");
        return Resp.result("201", "成功了", member);
    }

    @ResponseBody
    @RequestMapping("/json5")
    public Resp json5(String token) {
        MemberDetails member = memberService.getMemberDetailsByToken(token);
        return Resp.success(member);
    }

    @ResponseBody
    @RequestMapping("/json6")
    public Resp json6(String token) {
        MemberDetails member = memberService.getMemberDetailsByToken(token);
        return Resp.httpStatus(HttpStatus.ACCEPTED, "成功了");
    }
7. 运行结果:

更多用法,请查看Resp类里面的静态方法

后记:

  • 如果大家有更好的改进建议或代码,欢迎在评论留言反馈,谢谢!

原文地址:http://www.seifon.cn/2018/04/30/Spring统一返回Json工具类,带分页信息/


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

原文地址:https://www.cnblogs.com/seifon/p/8975025.html

新型隐形眼镜研发成功 有助于纠正色盲



隐形眼镜对于短期或长期视力恢复者可能有用,但对矫正色盲的用处不大。现在伯明翰大学的研究人员开发了一种隐形眼镜,可以帮助纠正某些种类的色盲,这要归功于安全,低成本的染料。

光线照射到眼睛后部,称为锥状细胞群。不同的锥体拾取不同波长的光线,并一起工作,让我们看到整个颜色的光谱。当这些锥体无法正常工作时(通常是因为遗传原因),它们会影响一个人感知某些颜色的能力,从而导致我们所知的色盲或色觉不足(CVD)。

最常见的CVD形式影响红色和绿色部分的光谱。当任何一种颜色的光进入眼睛时,红敏锥和绿敏锥同时触发,这意味着患者不能轻易识别这两种颜色之间的差异。这种“色彩混淆”意味着他们所看到的只是一种泥泞的黄褐色,它可能会妨碍开车者辨识红绿灯等日常情况。

新型隐形眼镜的工作原理与EnChroma的太阳镜相同。镜片用衍生自罗丹明的染料着色,其吸收红色和绿色之间的某些波长的光。通过阻断这些波长,光线更容易被红色或绿色感光锥吸收,而不是两套,使患者更好地区分这些颜色。

该研究的首席研究员Haider Butt说:“隐形眼镜对于色盲矫正很有意义,因为矫正整个视野更容易。我们进行的染料加工不需要任何复杂的配制,对人眼无毒害,我们的方法可以很容易地用于眼镜和隐形眼镜,成本低廉。”

QQ图片20180430224812.png


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

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

三星A6/A6+曝光:Exynos 7870+18.5:9屏



日前,三星Galaxy A6/A6+新机拿到了工信部的入网许可,型号SM-A6050,将会很快上市。根据外媒GSMArena消息,该机的售价和渲染图得到了曝光,售价方面,Galaxy A6(2018)的售价在300至340欧元之间(约2300-2600元人民币),而Galaxy A6+(2018)的售价则是360至400欧元(2750-3050元人民币)。

具体配置方面,三星Galaxy A6采用5.6英寸屏幕,分辨率为720*1480,而三星Galaxy A6+则是6.0英寸屏幕,分辨率为1080*2220,而且两款手机的屏幕比例三星Galaxy S9/S9+一样,为18.5:9。

根据此前消息,三星Galaxy A6与Galaxy A6+都搭载后置指纹模块,Galaxy A6搭载Exynos 7870芯片(8核1.6GHz、Mali-T830),Galaxy A6+则可能为了全网通而支持高通芯片。

电池方面,三星Galaxy A6配备3000mAh电池,Galaxy A6+则是3500mAh电池。

至于发布时间,预计最快会在5月份、最晚6月份国内上市。


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

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

苹果将宣布给股东发1000亿美元“海外现金大红包”



北京时间4月30日消息 苹果要花完全部的净现金,大规模增加股东回报是唯一的办法。美国当地时间5月1日,苹果将发布一季度财报,另外按照承诺,苹果也将公布对于股东的海外现金回报计划。据外媒最新消息,华尔街金融机构近日进行了各种预测,他们认为苹果将给股东发放最少1000亿美元的海外现金“大红包”。

随着特朗普政府对美国公司海外现金大规模减税(从35%降到15%),苹果公司已经准备把全部的海外现金转移回美国。

早前,苹果已经公布了海外现金给美国经济以及苹果公司员工带来的两个大礼包:苹果今年将在美国开支550亿美元,未来将带来经济增长和就业机会,对于内部员工,苹果也公布了一次性奖金等福利。

据英国金融时报网站报道,华尔街分析师预测,苹果1630亿美元净现金的绝大部分将会在未来几年内回报给股东。这样,加上苹果过去实施的回报计划,在2020年之前,苹果将累计向股东回报4500亿美元。

在库克担任苹果掌门人之后,苹果对股东实施了慷慨的回报计划,几乎每一年的四五月份,苹果总会宣布总额在300亿美元到500亿美元的股东回报计划。在下周的“股东大红包”之前,这些历史回报计划的累计金额已经达到3000亿美元。

美国投资银行摩根士丹利公司在近日的研究报告中预测,本周二,苹果将会宣布1500亿美元的回报计划。这意味着未来三年内,苹果将会回购价值2100亿美元的股票,支付520亿美元的分红。


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

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

分析师纷纷看衰苹果二季报:中国市场销量未来将下滑



苹果公司(以下简称“苹果”)将于美国东部时间5月1日(北京时间5月2日凌晨)发布2018财年第二季度财报。多位分析师认为,苹果在中国市场的表现将相比低迷。他们表示,由于iPhone X售价过高,同时伴随着华为等本土智能手机厂商的崛起,苹果本季度在中国市场的表现并不乐观。在不远的将来,苹果在中国市场的销售额也将下滑。

摩根士丹利分析师凯蒂·休伯特(Katy Huberty)称:“未来几个季度,苹果在中国市场的表现将继续低迷。”此外,瑞银分析师和野村证券分析师也用“疲软”一词来形容苹果近期在中国市场的表现。

事实上,在过去的三年间,苹果在中国智能手机市场的份额已经流失了1/3或更多。来自瑞银和Gartner的数据显示,2015年苹果在中国市场售出了7100万部iPhone。而2017财年,该数字降至4900万部。瑞银还预计,2018财年将降至4700万部。

瑞银称,2015年苹果在中国智能手机市场(一线和二线城市)的份额约为40%-50%,而如今已降至20%至30%。而摩根士丹利预计,苹果目前的市场份额约为18%。

分析师们指出,苹果在中国市场主要面临两大问题。首先,中国拥有13亿人口,但苹果iPhone手机主要面向中国的一线和二线城市,而这些城市的人口数量只有2亿至3亿。其中,只有1.5亿至2.2亿有能力购买iPhone。

其次,中国本土厂商的崛起,正在蚕食苹果的市场份额。如今,华为和其他本土Android厂商的市场份额已达到56%。而2015年,苹果的市场份额曾高达54%。

与此同时,另一大手机巨头三星在中国的市场份额更是跌至约2%。调研公司GFK数据显示,2017年年底,三星在中国智能手机市场的份额已由5年前的20%降到了2%。


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

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

长和与小米达成战略合作 具体内容小米不予置评



4月30日晚间消息,针对长和与小米达成战略合作的消息,小米方面对合作的具体内容方面表示不予置评。据彭博社报道,李嘉诚旗下企业长和与小米达成战略合作,长和将于5月3日披露与小米战略联盟的细节。新浪科技向小米方面核实具体合作内容,小米方面表示不予置评。

港交所新制定的《上市规则》于4月30日起正式生效,放开对同股不同权结构公司上市的限制。据港媒报道,有私募基金界人士透露,小米的上市前股权交易于上周结束,但以最近期交易作价对应的公司估值,仍未能突破此前650亿至700亿美元水平,折合5100亿至5495亿港元,预计公司很快就会提交上市申请。长和与小米的合作是否涉及上市一事还未知。

此前,小米就与李嘉诚旗下企业有过合作。2014年3月,小米曾与李嘉诚旗下无线运营商3香港(3 Hong Kong)合作,在香港发布小米3。而李嘉诚的全球电信部门3集团(3 Group)在意大利、英国、印尼、越南和香港等国家和地区提供服务,双方的进一步合作将对小米业务的国际化有一定帮助。


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

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

谷歌涂鸦纪念数学王子高斯



德国神童Johann Carl Friedrich Gauss成为历史上最伟大的数学家之一。1777年至1855年生活的约翰卡尔弗里德里希高斯对数论,代数,地球物理学,力学和统计学做出了重要贡献。高斯出生在德国北部不伦瑞克的一个贫穷家庭,是个神童。

高斯时他19岁,高斯创建了十七边形的数学证明,一个17边多边形。他要求在他的墓碑上刻上一个十七边形,但是石匠认为它会看起来像一个圆圈。同年,高斯参与证明素数定理,帮助理解质数如何分布在整数当中。

同年,他又发现了二次互惠定律,它允许数学家在模算术中确定任何二次方程的可解性。

高斯在21岁时完成关于数论的工作,当他24岁时,被作为一本教科书出版,而且获得其他数学家高度评价,它被认为是他的巨作,并且对该领域产生了巨大的影响。另外,在19世纪20年代中期,高斯计算了小行星谷神星的轨道。

QQ图片20180430222805.png


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

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

埃克塞特大学研究人员创造了一种可再生氢气的半导体材料



利用太阳能分解水和生产氢燃料是正在研发当中,最有前途的清洁能源技术之一。阻碍它的最大障碍之一是发现了一种用于水分解过程的高效稳定的半导体材料。现在,埃克塞特大学一个团队声称已经清除了这个障碍。使用人工光合作用过程将水分解成其组成成分氢和氧原子保证了清洁并且产生零碳排放,所产生的氢具有超过化石燃料能量密度的两倍,并且当使用时,其副产品是水。它也将提供基本无限的能量来源。

为了实现这一目标,埃克塞特大学团队建立了一个新的光电极,该光电极吸收光线并触发电化学转换,利用镧,铁和氧的纳米粒子从水中提取氢。它的创造者声称氧化镧氧化物半导体材料是廉价的喷雾热解技术,然后是后退火步骤,是可再生氢气产生的最强候选者,因为它是稳定的,低成本的,应该可以在全球范围内广泛使用。

文章的第一作者Govinder Pawar说:“我们已经证明,我们的LaFeO3光电极具有理想的能带自动排列所需的能带结构,无需外部偏压,此外,我们的材料具有出色的稳定性,经过21小时的测试后,它不会降解,非常适用于水分解目的。我们正在努力进一步改进材料,使其更有效地生产更多的氢气。”

artificial-photosynthesis-photelectrode-1.jpg


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

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

研究发现光疗疗法可以调节人体生物钟



根据一项新的研究,轮班工人可以接受光疗法,来使他们的生物钟恢复同步。一项研究显示,晚上暴露在明亮的灯光下会减少褪黑激素,这是一种调节昼夜节律的激素。而褪黑素是人体内为促进睡眠而分泌的胺类激素。科学家们测试了褪黑素和生物钟之间的关系,即让参与者在晚上接受持续或者间歇性的强光照射。

实验在波士顿布里格姆妇女医院进行,参与者需要接受9到10天的住院治疗,当然这些都必须在高度控制的实验室条件下进行。他们的睡眠时间表受到密切监控。

当他们间歇性地接触不同的例程时,他们的生物钟会出现明显的变化。此外,每一种间歇性的强光脉冲都会引起类似程度的褪黑激素抑制。

Shadab Rahman博士说:“总的来说,我们的数据表明,褪黑素的抑制程度和阶段重置有关,但最终是由不同的神经生理系统调控的。”

因此,褪黑素抑制并不是生物钟重置的可靠替代物。对于那些睡眠质量差和生物钟紊乱的人来说,这是一个重要的考虑因素,比如轮班工人,或者抑郁症等疾病。

这项发表在《生理学杂志》上的研究显示了夜间光照射对生物钟的影响。

根据最新研究,上周的一项研究发现,现代路灯是引发了成千上万的癌症病例的罪魁祸首。

一项研究发现,生活在大城市的男性患前列腺癌的几率是女性患乳腺癌几率都成倍的提高,科学家将这一趋势归咎于手机、电脑和其他屏幕发出的“蓝光”,这降低了控制生物钟的褪黑激素水平。

人体有一个内部时钟,它使各种生理过程在24小时周期内有序进行,其中包括日常的睡眠变化。光线是调节人体生物钟的主要环境时间线索。

研究人员旨在探索人体生物钟与外部时间信号同步的生理过程(即昼夜节律)和抑制褪黑激素之间的联系,从而用于改善轮班工作的睡眠障碍和抑郁症的治疗。


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

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

显卡价格开始下降了

过去一年的挖矿热导致显卡短缺,价格居高不下。但随着数字货币市场热度下降(或叫矿难),显卡开始不短缺了,
价格也降下来了。今年 1 月,去百思买购买显卡的话,你会发现货架上几乎找不到几张,即使有价格也高得惊人, 8GB 的 Radeon 580  显卡售价 529.99 美元,店员还会告诉你错过了就买不到了;今天相同的显卡只需 419.99 美元,供应充足。除了 AMD 显卡价格下跌外,Nvidia 的显卡也存在类似现象。一名以太币矿工称,以太币的价格下跌导致了利润大幅减少,显卡短缺结束了。

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

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

男子起诉法国扣押了他的 France.com 域名

一名出生在法国的美国男子
起诉了他的祖国,称法国外交部非法扣押了他在 1994 年注册的域名 France.com。Jean-Noël Frydman 于 1994 年在 Web.com 购买了 France.com 域名,设立了一个网站服务于美国的亲法和说法语的用户。过去二十年里,他与法国的多个官方机构建立了合作关系,其中包括洛杉矶总领事馆和外交部。但在 2015 年法国外交部递交了诉讼试图接管 France.com 域名。Web.com 锁定了该域名。2017 年 9 月,巴黎上诉法院裁决 France.com 侵犯了法国商标法,随后代表法国政府的律师向 Web.com 提出要求接管该域名。2018 年 3 月 12 日,Web.com 在没有通知 Frydman 也没有赔偿的情况下将域名所有权转让给了法国外交部。Frydman 很生气,作为 Web.com 年代最悠久客户之一,该公司的处理方法令他出离愤怒。4 月 19 日,他在维吉尼亚州递交诉状试图拿回域名,法国、Atout France、外交部、部长 Jean-Yves Le Drian 以及 VeriSign 作为被告。

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

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

中国逮捕 15 名《绝地求生》外挂开发者

《绝地求生》开发商
宣布,中国逮捕了 15 名被怀疑制作游戏外挂(作弊工具)的主要嫌疑人,对他们罚款了 3000 万人民币。被捕的嫌疑人包括了 “OMG”, “FL”, “火狐”, “须弥” 和 “炎黄” 等。他们开发的部分外挂程序还被发现含有灰鸽子木马,灰鸽子是一种远程访问工具,允许外挂开发者控制用户的电脑,扫描数据,非法窃取信息。《绝地求生》是去年的现象级游戏,在中国非常火爆,而在中国玩家中间,使用外挂的现象也非常多,以至于其他国家的玩家呼吁屏蔽中国区。中国玩家通常使用 QQ 微信等途径购买外挂,而中国的社交网络和消息应用已经全面推行实名制,只要腾讯协助识别嫌疑人的难度并不高。

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

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

shiro的过滤器



shiro的过滤器也是不多的我们可以自定义的方法,它的继承体系如下:

另外UserFilter是继承于AccessControlFilter

 

1、NameableFilter

NameableFilter给Filter起个名字,如果没有设置默认就是FilterName;还记得之前的如authc吗?当我们组装过滤器链时会根据这个名字找到相应的过滤器实例;

 

2、OncePerRequestFilter

OncePerRequestFilter用于防止多次执行Filter的;也就是说一次请求只会走一次过滤器链;另外提供enabled属性,表示是否开启该过滤器实例,默认enabled=true表示开启,如果不想让某个过滤器工作,可以设置为false即可。

 

3、ShiroFilter

ShiroFilter是整个Shiro的入口点,用于过滤需要安全控制的请求进行处理,这个之前已经用过了。

 

4、AdviceFilter

AdviceFilter提供了AOP风格的支持,类似于SpringMVC中的Interceptor:

Java代码  

boolean preHandle(ServletRequest request, ServletResponse response) throws Exception  
void postHandle(ServletRequest request, ServletResponse response) throws Exception  
void afterCompletion(ServletRequest request, ServletResponse response, Exception exception) throws Exception;   

preHandler:类似于AOP中的前置增强;在过滤器链执行之前执行;如果返回true则继续过滤器链;否则中断后续的过滤器链的执行直接返回;进行预处理(如基于表单的身份验证、授权)

postHandle:类似于AOP中的后置返回增强;在过滤器链执行完成后执行;进行后处理(如记录执行时间之类的);

afterCompletion:类似于AOP中的后置最终增强;即不管有没有异常都会执行;可以进行清理资源(如接触Subject与线程的绑定之类的);

 

5、PathMatchingFilter

PathMatchingFilter提供了基于Ant风格的请求路径匹配功能及过滤器参数解析的功能,如“roles[admin,user]”自动根据“,”分割解析到一个路径参数配置并绑定到相应的路径:

Java代码  

boolean pathsMatch(String path, ServletRequest request)  
boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception   

pathsMatch:该方法用于path与请求路径进行匹配的方法;如果匹配返回true;

onPreHandle:在preHandle中,当pathsMatch匹配一个路径后,会调用opPreHandler方法并将路径绑定参数配置传给mappedValue;

然后可以在这个方法中进行一些验证(如角色授权),如果验证失败可以返回false中断流程;默认返回true;也就是说子类可以只实现onPreHandle即可,无须实现preHandle。如果没有path与请求路径匹配,默认是通过的(即preHandle返回true)。

 

6、AccessControlFilter

AccessControlFilter提供了访问控制的基础功能;比如是否允许访问/当访问拒绝时如何处理等:

Java代码  

abstract boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception;  
boolean onAccessDenied(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception;  
abstract boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception;   

isAccessAllowed:表示是否允许访问;mappedValue就是[urls]配置中过滤器参数部分,如果允许访问返回true,否则false;

onAccessDenied:表示当访问拒绝时是否已经处理了;如果返回true表示需要继续处理;如果返回false表示该过滤器实例已经处理了,将直接返回即可。

 

onPreHandle会自动调用这两个方法决定是否继续处理:

Java代码  

boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {  
    return isAccessAllowed(request, response, mappedValue) || onAccessDenied(request, response, mappedValue);  
}   

 

另外AccessControlFilter还提供了如下方法用于处理如登录成功后/重定向到上一个请求: 

Java代码  

void setLoginUrl(String loginUrl) //身份验证时使用,默认/login.jsp  
String getLoginUrl()  
Subject getSubject(ServletRequest request, ServletResponse response) //获取Subject实例  
boolean isLoginRequest(ServletRequest request, ServletResponse response)//当前请求是否是登录请求  
void saveRequestAndRedirectToLogin(ServletRequest request, ServletResponse response) throws IOException //将当前请求保存起来并重定向到登录页面  
void saveRequest(ServletRequest request) //将请求保存起来,如登录成功后再重定向回该请求  
void redirectToLogin(ServletRequest request, ServletResponse response) //重定向到登录页面

比如基于表单的身份验证就需要使用这些功能。

 

(1)如果我们想进行访问访问的控制就可以继承AccessControlFilter

例如:Shiro提供roles拦截器,其验证用户拥有所有角色,没有提供验证用户拥有任意角色的拦截器。

public class AnyRolesFilter extends AccessControlFilter {  
    private String unauthorizedUrl = "/unauthorized.jsp";  
    private String loginUrl = "/login.jsp";  
    protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {  
        String[] roles = (String[])mappedValue;  
        if(roles == null) {  
            return true;//如果没有设置角色参数,默认成功  
        }  
        for(String role : roles) {  
            if(getSubject(request, response).hasRole(role)) {  
                return true;  
            }  
        }  
        return false;//跳到onAccessDenied处理  
    }  
  
    @Override  
    protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {  
        Subject subject = getSubject(request, response);  
        if (subject.getPrincipal() == null) {//表示没有登录,重定向到登录页面  
            saveRequest(request);  
            WebUtils.issueRedirect(request, response, loginUrl);  
        } else {  
            if (StringUtils.hasText(unauthorizedUrl)) {//如果有未授权页面跳转过去  
                WebUtils.issueRedirect(request, response, unauthorizedUrl);  
            } else {//否则返回401未授权状态码  
                WebUtils.toHttp(response).sendError(HttpServletResponse.SC_UNAUTHORIZED);  
            }  
        }  
        return false;  
    }  
}   

流程:

1、首先判断用户有没有任意角色,如果没有返回false,将到onAccessDenied进行处理;

2、如果用户没有角色,接着判断用户有没有登录,如果没有登录先重定向到登录;

3、如果用户没有角色且设置了未授权页面(unauthorizedUrl),那么重定向到未授权页面;否则直接返回401未授权错误码。

 

(2)FormAuthenticationFilter基于表单登录拦截器

public class FormLoginFilter extends PathMatchingFilter {  
    private String loginUrl = "/login.jsp";  
    private String successUrl = "/";  
    @Override  
    protected boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {  
        if(SecurityUtils.getSubject().isAuthenticated()) {  
            return true;//已经登录过  
        }  
        HttpServletRequest req = (HttpServletRequest) request;  
        HttpServletResponse resp = (HttpServletResponse) response;  
        if(isLoginRequest(req)) {  
            if("post".equalsIgnoreCase(req.getMethod())) {//form表单提交  
                boolean loginSuccess = login(req); //登录  
                if(loginSuccess) {  
                    return redirectToSuccessUrl(req, resp);  
                }  
            }  
            return true;//继续过滤器链  
        } else {//保存当前地址并重定向到登录界面  
            saveRequestAndRedirectToLogin(req, resp);  
            return false;  
        }  
    }  
    private boolean redirectToSuccessUrl(HttpServletRequest req, HttpServletResponse resp) throws IOException {  
        WebUtils.redirectToSavedRequest(req, resp, successUrl);  
        return false;  
    }  
    private void saveRequestAndRedirectToLogin(HttpServletRequest req, HttpServletResponse resp) throws IOException {  
        WebUtils.saveRequest(req);  
        WebUtils.issueRedirect(req, resp, loginUrl);  
    }  
  
    private boolean login(HttpServletRequest req) {  
        String username = req.getParameter("username");  
        String password = req.getParameter("password");  
        try {  
            SecurityUtils.getSubject().login(new UsernamePasswordToken(username, password));  
        } catch (Exception e) {  
            req.setAttribute("shiroLoginFailure", e.getClass());  
            return false;  
        }  
        return true;  
    }  
    private boolean isLoginRequest(HttpServletRequest req) {  
        return pathsMatch(loginUrl, WebUtils.getPathWithinApplication(req));  
    }  
}   

onPreHandle主要流程:

1、首先判断是否已经登录过了,如果已经登录过了继续拦截器链即可;

2、如果没有登录,看看是否是登录请求,如果是get方法的登录页面请求,则继续拦截器链(到请求页面),否则如果是get方法的其他页面请求则保存当前请求并重定向到登录页面;

3、如果是post方法的登录页面表单提交请求,则收集用户名/密码登录即可,如果失败了保存错误消息到“shiroLoginFailure”并返回到登录页面;

4、如果登录成功了,且之前有保存的请求,则重定向到之前的这个请求,否则到默认的成功页面。

 

(3)CasFilter用于客户端从cas server获取到ticket后回调应用发起请求的时候被拦截,应用将ticket发送到cas server做验证

 

(4)BasicHttpAuthenticationFilter通过Basic认证的方式登录(例如JWT token方案)

 

 部分参考:第八章 拦截器机制——《跟我学Shiro》

 


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

原文地址:https://www.cnblogs.com/xiangkejin/p/8974967.html

兰博基尼刚刚在北京车展推出的敞篷车,可能是这个夏天最佳的搭讪用品

这是一个刚刚发生的真实故事。

北京车展不仅是汽车编辑被迫卖命的绞肉机,还是富家子弟主动出手的菜市场。

在每天太阳落山之际从展馆回市区的“移动停车场”上,你能有机会见到很多骑着马赶着牛的土豪们。

比如前天,当我正在董车会的宝马 7 系工作车的后座上舒展那根本不想再动一下的腿的时候,脑袋边上就想起了我小时候在坏了的摩托车上才能听到的声音:咕噜噜噜噜,轰隆隆隆隆。

抬头看,一个看不太清楚的脸正跳过副驾驶上貌美如花的乘客的脸鄙视着我们,好像在说:你也可以买一辆最新的兰博基尼来这样吸引注意力嘛。

我只好跳过他副驾驶上貌美如花的乘客的脸鄙视他:不好意思,你这车刚刚已经成为旧款了。

高性能+敞篷,花样打脸组合拳

在本次北京车展上,兰博基尼在展台最重要的位置放上了这台蓝色的超跑。

Huracan Performante Spyder。

熟悉兰博基尼命名的读者一定知道,Performante 后缀在产品体系中代表高性能版本,Spyder 则对应敞篷版本,在一辆车上同时用上两种后缀,可以说是实力打脸与颜值秒杀的双结合。

在兰博基尼的那台宝贝 5.2L V10 发动机的带动下,整整 640 马力推动着这台蛮牛快速前进,只需 3.1 秒即可完成 0-100km/h 加速,并在出发 9.3 秒之后突破 200km/h 大关,如果你敢于一直把脚放在油门上,时速表会在 325km/h 的刻度上进行午休。

不过也不要认为开超跑就是难于登天(至少比攒够买超跑的钱容易),这辆车上搭载的 7 档双离合变速器和 4 驱系统都已在前辈身上被证明对于普通驾驶者分外友好,只要选择对合适的驾驶模式,稍加培训就能享受这种极致的速度激情。

身为 Performante 车型,也就有资格从自家的武器库里先去选择装备,Huracan Performante Spyder 相对 Huracan 普通的敞篷车型最大的优势,是大量使用了锻造碳纤维材质,结果就是整车轻了 35 公斤,为提升性能立下了汗马——至少有汗那么多——的功劳。

这套软顶敞篷系统可以在车速 50km/h 之下动态使用,无论开合只需 17 秒即可搞定,相信车主不会浪费每一次吸引眼光的机会。

内饰自然是标准的兰博基尼风格,只是这次的材质配色让我想起了……鸟屎……嗯,我收到了兰博基尼设计师喊我去补课美学的邮件提醒了。

但这个类似导弹发射器的控制器还是帅出天际,加上方向盘之后的硕大换挡拨片,给每次出发都制造了仪式感。

无论你想踩下油门让别人看不到你,亦或是你想降下顶棚让别人多看看你,随意。

超跑不再是钢铁之躯,想要亲近要多背单词

作为 Performante 车型,Huracán Performante spyder 屁股上翘起的硕大尾翼可非浪得虚名。

这里面就出现了今天董车会课程需要大家掌握的三个缩写了:

ALA(Aerodinamica Lamborghini Attiva),兰博基尼先进主动空气动力学系统,这套系统不仅可以调整尾翼,更可以调整位于车头和进气口当中的一系列空气扰流板和扩散器,当车辆处于直线加速、弯道漂移和快速刹车的状态下,让这些空气组件处于完全不同的状态,用空气只手来帮你摆弄兰博基尼。

LPI(Lamborghini Piattaforma Inerziale),兰博基尼动态监控系统,通过遍布车身的传感器,Huracán Performante spyder 可以实时了解车辆的各种运动状态,并将数据处理完之后交由 ALA 系统和 ESP 系统等进行车身控制,保证各种状态下车辆性能最佳,兰博基尼表示 LPI 系统可以在 500 毫秒之内感受到车辆的各种变化,并在 0.2 秒之内完成车辆状态的调整。

ANIMA (Adaptive Network Intelligence Management),自适应网络智能化管理系统,这套系统为Huracán Performante spyder 提供了三种驾驶模式(STRADA 道路模式、SPORT 运动模式和 CORSA 赛道模式),在不同状态下的车辆获得不同的性能调教,甚至提供不同的车内氛围展示。

好了,这就是本次董车会单词小课堂的全部内容了。

请不要问我学这些有什么用,都买不起车了,这不是教你怎么在看车的时候碾压周边小朋友了么。

对了,为了不让评论区被“膨胀了”刷屏,最后告诉大家价格:424 万。

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

原文地址:http://www.ifanr.com/1021801

罗永浩“相声”预告:秋冬还各有一场

IT之家4月30日消息 今天罗永浩在微博回应了网友关于今年新品发布会的问题,老罗说到,“封什么箱啊,秋天冬天还各有一场”,这意味着下半年还会有两部锤子新机发布。

据悉,罗永浩今天还表示坚果R1将会从3000元起步。

锤子科技已经宣布将在5月15日北京鸟巢举行新品发布会,届时新旗舰坚果R1将正式亮相。而现在随着发布会的临近,关于这款手机的消息也是越来越多,目前罗永浩就在微博曝光了全新的坚果R1的售价,表示坚果R1将会从3000元起步,顶配版甚至达到15000元。

坚果R1将搭载全新Smartisan OS系统,整合人工智能技术,效率有望提升超过200%,同时根据锤子科技产品线&硬件研发副总裁吴德周透露,坚果R1将支持大功率无线充电功能。罗永浩也表示,坚果R1拍照肯定是一流水准。

配置方面,坚果R1很有可能搭载的是高通骁龙845处理器。

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

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