今年这情况......我劝大家还是多留一手准备吧

硬件笔记本 2023-11-21 07:41

今天我想跟大家说几句心里话,算是有感而发吧。希望我的读者看完后都能重视起来。

我这个公众号,也运营了好几年了,多亏了各位读者的喜欢和支持,才让我有了持续更新下去的动力。
我平时大多是在和大家分享电路知识,今天呢想和大家分享一个读者的来信。
承蒙信任,前两天,收到一位读者的来信,信中写到:
“你好,我最近遇到一件事,心里很纠结,希望通过文字寻求您的帮助。
前几天发小突然来找我,说家里的老母亲突发心肌梗塞,好不容易砸了17万,人才得以从ICU中抢救回来。
现在又被医生告知,要想保证母亲今后的生命质量,就必须再做一个心脏搭桥手术才行,至少还要再准备十几万。

我这个发小,其实经济条件并不差,一年20多万的收入,按理来说不至于到找别人开口借钱的地步,这次主动开口,说明确实是遇到难处了。

作为多年老友,我很想去帮助他,但同时心里又很纠结。

借钱吧,知道治病是个无底洞,还上这笔钱遥遥无期,自己手头也没那么宽裕,而且自己也有一家老小要养。

不借吧,心里又实在是过意不去......

说真的,在现实面前,我真的做不到和年轻时一样,把情谊看的比什么都重了。

最后拧巴了半天,还是微信转了1万块钱给他,想让自己内心好受点。

我不知道自己做的对不对,想听听您的看法。”

我的回复:
首先感谢这位粉丝对我的信任,我很能理解你内心的纠结,我之前也遇到过和你类似情况,最后处理的方式也和你差不多。

这种事情很难有标准答案,不必强求让每个人都满意。
我们大多数人虽然表面上看起来光鲜亮丽,但背后谁都是顶着生活的巨大压力的。
我们大多数人都是上有老、下有小的普通人,我们都有自己的家庭要养,在现实面前,没法和年轻时一样把情谊看的比什么都重要,是正常的,也是合理的。
另外,1万块虽然看似不多,但每一分都是我们的辛苦钱,谁的钱都不是大风刮来的,相信你的朋友也能理解你的难处。
毕竟,疾病、事故、意外都是人生旅途上的暗礁,指不定哪一天自己也会遇上,我们也需要提前为自己的家庭做好打算。
要钱还是要命?这道选择题,看似离我们很遥远,但其实每天都在我们身边上演。
我记得之前看到过一个医学纪录片,片中有这么一段令我印象深刻。
那是一位30多岁的重症胰腺炎患者,在ICU里仅能维持生命,我已经忘记了她的名字,但还记得大家都叫她“九床”。
她住了半个多月ICU,催费单上几乎每天都出现9床的名字。
9床,欠费26000元
9床,欠费30800元 
9床,欠费53000元...
那些日子,9床成了ICU里大家时不时地谈起的话题,担心她的家属会选择放弃治疗。
果然,没过多久,9床不得不提前出院。出院前几天,她全身浮肿,呼吸衰竭,行气管插着管,上着呼吸机。
出院那天,9床看见丈夫进来,她像往常一样,浮肿的脸上浮出一层笑意,吃力的向丈夫挥了挥手。
但她丈夫,并没有看向她,而是一直望着医生,仿佛在故意逃避着什么。
医生停顿了一会儿,才说,9床,别怕,我们今天需要把管子拔了。
9床脸上的笑意顿时凝住了,怎么要拔管子?她说不出话,但眼神里满是疑惑,她将目光从医生移到一旁的丈夫身上,丈夫看向床畔的监测仪,没有说话。
她用尽了全身的力气,扯了扯丈夫的衣角,终于,他的丈夫说话了“咱们回家治,真是没有办法在这里待下去了,亲戚都借遍了”。
护士要伸手解下她嘴上的呼吸面罩,她一把抓住呼吸管子,惊恐地望着医生,再望着丈夫。管子插在嘴里,她无法开口,可是她很清楚,这是救命的管子,哪能拔掉?管子在一天,她的生命才能维持一天。
当医生最终伸手拔掉她身上的插管的时候,她抓住医生的手终于慢慢地、无力地松开,眼泪一直在流,那种求生的欲望令人看着心碎。
1个月后,得知她去世了,这是预料中的结局,大家并没有那么惊讶。
生和死这个大命题,在我们的日常生活中很多人并不会去考虑,但当我们真正面临的时候,往往都会措手不及。
救命谁都想,可前提是自己花不花得起这个钱?
就算花得起,会不会最后人财两空,自己还要负债?
说到底,还是钱的问题,如果能负担得起,谁都有要求医生马上做手术的底气,而不会纠结于计算钱与生命哪个价值更高。
没进医院的你,根本不知道钱有多不经花。进了医院,你就会知道你的那点钱就像在长江里打了几个鸡蛋,根本拍不出啥浪花。
如今的我们,万事顺遂的时候,一切看起来都还过得去。但意外一旦来临,大多都招架不住。
我不敢想,万一哪天我倒下了,年迈的父母如何安享晚年,孤身的伴侣如何支撑整个家庭?
我们很难避免一辈子不遇到这些事情,也无法避免它给我们的生活带来冲击。但是有两样东西是我们可以决定的:

第一,是面对苦难的态度。
第二,是未雨绸缪的准备。

至于如何准备?我思来想去,发现其实也没太多的办法,就两条路:

1、不断增加收入、控制开支,掌握尽可能多的存款,以应对可能出现的意外。

2、对于结余比较少、收入增幅比较慢的读者,应对风险最好的办法就是把自己和家人的保险配置齐全,用尽可能少的钱,把自己不能承受的风险转嫁给保险公司。(本文不推荐具体保险产品)

关注我的老粉丝都知道,一直以来我都很少建议大家一定要把保险配置齐全,但这些年我在医院里见证了太多这样的悲剧,而这些悲剧很多时候都是一份很便宜的保险就能解决的事情。

借此机会,我想再给大家做点简单的保险科普,都是很实用的知识,希望大家耐心看完。

我相信大部分读者都已经参加了城镇医保或者新农合,因而可能会觉得已经后方无忧,那你就错了。大病面前,你会发现医保根本就不够用。

目前医院的药品分为甲乙丙三类,其中甲类药100%报销,乙类药部分报销,丙类药一点不报销。像进口抗癌药、靶向药、新特效药都属于丙类药,只能自费。
        


比如免疫治疗药物pd-L1抑制剂,不管是进口还是国产,都没进入医保,即便算上了赠药,进口药一年需要13~14万,国产2年需要7.5万;

在抢救危重症病人中常用的人工肺,开机费6万元,之后每天2万元起。

以上统统都是自费,医保无法报销。

有的读者可能又会想,一个人患上癌症、中风、心梗这类大病的概率太低了。我只能说,你太想当然了。

你如果去查一查保监会公布的数据,你就知道,人一辈子中招这些大病的概率是72%,当然,大部分人都是在四五十岁后发病的,但我们不能等到年纪大了才考虑这个事,那时要么保费太贵,要么就直接买不了。

关注我的读者应该很多都是家里的经济支柱,我相信,动辄几十、上百万的治疗费并非所有人都能轻易掏的起的,就算掏得起,那又得花多少年来追回这笔损失?

可以这么说,没保险的家庭就像一个脆弱的玻璃球,遇到冲击整个家庭就碎了。而有保险的家庭就像是一个皮球,即使被打压也能够弹起来。

但保险不能瞎买。保险本身是有很高的门槛的,涉及金融、医学、法律三方面知识交叉。因为不懂相关知识,买错保险,最后赔不了钱的,大有人在,我见过的也不止一个两个了。

为了避免大家掉进买错保险的坑,在此,我再次向大家郑重推荐我们的老朋友,一家靠谱的第三方保险咨询服务平台:

他们平台的保险专家都非常专业,我亲身体验后感觉确实很不错,建议大家在挑选具体的保险产品前,都先去找他们做个全面的了解和咨询。

他们家的「家庭保障规划服务」非常专业、细致,很多人亲身体验后觉得很不错。

读者的事情,让我很感慨,所以特意和他们争取了100个免费咨询的名额给到各位粉丝,先到先得哈,下文长按二维码即可报名领取。

免费名额只有100个,报名方式如下:

硬件笔记本粉丝专属福利

🎁
长按扫码报名
即可
免费获得价值500元
专属家庭保障规划方案
👇👇👇
(长按识别二维码报名,前100名免费)

他们不推销保险,不为任何一家保险公司做广告。
只站在你的角度量身定制最适合的家庭保障方案,真正做到了中立、客观,同时还能做到比传统机构节约30%-50%费用。
他们专业的保险服务顾问,会结合专业的智能规划系统,1对1的分析我们的实际需求,生成专属的保险方案,以及相应的储蓄和理财规划方案,并给我们详细讲解。

(保险顾问详细沟通后给出专属的方案)

不管之前有没有买过保险,都可以去体验下,我真心希望每位读者能去预约下这项服务,做好保障,补齐短板,这是对自己和家人的负责
免费名额只有100个,报名方式如下:

硬件笔记本粉丝专属福利

🎁
长按扫码报名
即可
免费获得价值500元
专属家庭保障规划方案
👇👇👇
(长按识别二维码报名,前100名免费)
价值500元保险规划服务包含:
1.专属一对一老师,量身定制保障方案,推荐合适投保的产品;
2.产品深度解读——
货比千家只选合适的,中立客观绝不吹捧隐瞒;
3.提供N+1服务——全面检测已有保单值不值;
4.一站投保服务——对接全网保险公司,
一站投保优质产品;
5.持续增值服务——提供
后续理赔、保单管理及法律援助等服务;
......
他们平台是一家具有14年资历的老牌保险咨询服务机构,累计服务的客户已经超过了1500万,全国30个省市有4万多名专业的保险服务顾问。
而这次为大家提供咨询服务的这100位老师,更是以不足1%的通过率,从中优中选优选拔出来的。

这100个免费名额,是我为大家特别提供的,我建议大家都趁这个机会去做个咨询。等到病来如山倒需要用钱时,再后悔也就晚了。(长按识别下方二维码领取专属福利,也可以通过点击左下角的“阅读原文”报名)
👇👇👇

(长按识别二维码报名,前100名免费)


↓↓↓点击阅读原文领取,服务限时免费,限前100名

硬件笔记本 一点一滴,厚积薄发。
评论 (1)
自做自受 2023-11-21 15:18
人民日报刊文:警惕米饭、面条等主食浪费现象 人民日报 2023-11-21 07:21 又见此话题,粮食紧张了? 可见,当前形势,未来可忧。所以,控制开支是第一要务,毕竟当下增加收入不容易了。 是的,避免掉进买错保险的坑。 保险,当小心!这类新闻也不少。 警惕骗局!想取消“保险”却被骗81万?这种APP别下 央视新闻 2023-11-20 21:52
  • [完结11章]技术大牛成长课,从0到1带你手写一个数据库系统
    大家好,今天我将给大家分享关于如何开发一个数据库系统的知识,将从0到1手把手带着一步步去开发这个项目,希望我的分享对大家的学习和工作有所帮助,如果有不足的地方还请大家多多指正。

    一、什么是数据库系统
    数据库系统一般由数据库、数据库管理系统(及其开发工具)、应用系统、数据库管理员构成 

    二、数据库管理系统的主要功能包括
    数据定义功能:DBMS提供数据定义语言(Data Definition Language,DDL),用户通过它可以方便地对数据库中的对象进行定义
    数据组织、存储和管理:DBMS要分类组织、存储和管理各种数据,包括数据字典、用户数据、数据的存取路径等。
    数据操纵功能:DBMS提-供数据操纵语言(Data Manipulation Language,DML),用户可以使用DML操纵数据,实现对数据库的基本操作,如查询、插入、删除和修改等
    数据库的事务管理和运行管理:数据库在建立、运用和维护时由数据管理系统统一管理、统一控制,以保证数据的安全性、完整性、多用户对数据的并发使用以及发生故障后的系统恢复
    数据库建立和维护功能:数据库初始数据的输入、转换功能,数据库的转储、恢复功能,数据库的重组织功能和性能监视、分析功能等。

    三、数据库系统结构
    1.1模式(概念模式或逻辑模式)
    定义:数据库中全体数据的逻辑结构特征的描述,是所有用户的公用数据库结构。

    特性:

    一个数据库只有一个模式
    模式与应用程序无关,只是数据的一个框架
    1.2子模式(外模式或用户模式)
    定义:数据库用户所见和使用的局部数据的逻辑结构和特征的描述,是用户所用的数据库结构

    特性:

    子模式是模式的子集
    一个数据库有多个子模式,每个用户至少使用一个子模式
    同一个用户可以使用不同的子模式,每个子模式可为不同的用户所用
    1.3内模式(存储模式)
    定义:是数据物理结构和存储方法的描述。它是整个数据库的最低层结构的表示。

    特性:

    一个数据库只有一个内模式,内模式对用户透明
    一个数据库由多种文件组成,如用户数据文件,索引文件及系统文件
    内模式设计直接影响数据库的性能

    以下是开发流程:
    在idea中构建如下几个子模块工程:
    @PostMapping("/doLogin")
    @ApiOperation(value = "一键注册登录接口", notes = "一键注册登录接口", httpMethod = "POST")
    public GraceJSONResult doLogin(HttpServletRequest request,
                                   HttpServletResponse response,
                                   @RequestBody @Valid RegisterLoginBO registerLoginBO,
                                   BindingResult result);
    验证的字段上方可以写一些相关的注解,系统识别后会自动检查
    RegisterLoginBO.java
    public class RegisterLoginBO {

        @NotBlank(message = "手机号不能为空")
        private String mobile;
        @NotBlank(message = "短信验证码不能为空")
        private String smsCode;

        public String getMobile() {
            return mobile;
        }

        public void setMobile(String mobile) {
            this.mobile = mobile;
        }

        public String getSmsCode() {
            return smsCode;
        }

        public void setSmsCode(String smsCode) {
            this.smsCode = smsCode;
        }

        @Override
        public String toString() {
            return "RegisterLoginBO{" +
                    "mobile='" + mobile + '\'' +
                    ", smsCode='" + smsCode + '\'' +
                    '}';
        }
    }

    如果校验有问题,那么可以直接获得并且放回给前端即可。
    BaseController.java
    /**
     * 验证beanBO中的字段错误信息
     * @param result
     * @return
     */
    public Map<String, String> getErrors(BindingResult result) {
        Map<String, String> map = new HashMap<>();
        List<FieldError> errorList = result.getFieldErrors();
        for (FieldError error : errorList) {
            // 发生验证错误所对应的某一个属性
            String errorField = error.getField();
            // 验证错误的信息
            String errorMsg = error.getDefaultMessage();
            map.put(errorField, errorMsg);
        }
        return map;
    }
    一般来说,admin系统不会有主动注册功能,账号都是分配的,那么默认就会存在一个基本账户,这也是预先通过代码生成用户名和密码的。直接手动生成即可:
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>

    同理,查询操作也是类似JPA的操作,再继承Repository后直接使用其内置api即可:
    FriendLinkMngControllerApi.java
    @PostMapping("getFriendLinkList")
    @ApiOperation(value = "查询友情链接列表", notes = "查询友情链接列表", httpMethod = "POST")
    public GraceJSONResult getFriendLinkList();
    首先可以在数据库通过写sql脚本实现查询
    SELECT
    c.id as commentId,
    c.father_id as fatherId,
    c.article_id as articleId,
    c.comment_user_id as commentUserId,
    c.comment_user_nickname as commentUserNickname,
    c.content as content,
    c.create_time as createTime,
    f.comment_user_nickname as quoteUserNickname,
    f.content as quoteContent
    FROM
    comments c
    LEFT JOIN
    comments f
    on
    c.father_id = f.id
    WHERE
    c.article_id = '2006117B57WRZGHH'
    order by
    c.create_time
    desc
    目前我们所搭建的eureka是单机单实例的注册中心,如果挂了,那么整个微服务体系完全不可以,这是不应该的,所以为了实现eureka的高可用,我们可以搭建集群。
    在进行集群构建之前,大家先参照目前的eureka再去构建一个一模一样的工程,可以取名为 springcloud-eureka-cluster。
    为集群中各个eureka节点配置host
    eureka:
      instance:
        hostname: eureka-cluster-${port:7001}    # 集群中每个eureka的名字都要唯一
      # 自定义eureka集群中另外的两个端口号
      other-node-port2: ${p2:7002}
      other-node-port3: ${p3:7003}
      client:
    #    register-with-eureka: false
    #    fetch-registry: false
        service-url:
          # 集群中的每个eureka单实例,都需要相互注册到其他的节点,在此填入集群中其他eureka的地址进行相互注册
          defaultZone: http://eureka-cluster-${eureka.other-node-port2}:${eureka.other-node-port2}/eureka/,http://eureka-cluster-${eureka.other-node-port3}:${eureka.other-node-port3}/eureka/
    我们自己测试的时候时间可以设置为10秒内有10次,我认定非法请求,直接限制这个ip访问15秒,15秒后释放。(像有的网站会出现二维码让你扫描通过,或者手机验证码或者人机交互判断你当前是否是人还是机器,因为有可能是爬虫请求)
    开发步骤:
    首先在yml中设置基本参数:
    @Override
    public Object run() throws ZuulException {
        System.out.println("执行【IP黑名单】Zuul过滤器...");

        // 获得上下文对象requestContext
        RequestContext requestContext = RequestContext.getCurrentContext();
        HttpServletRequest request = requestContext.getRequest();

        // 获得ip
        String ip = IPUtil.getRequestIp(request);

        /**
         * 需求:
         * 判断ip在10秒内请求的次数是否超过10次,
         * 如果超过,则限制访问15秒,15秒过后再放行
         */
        final String ipRedisKey = "zuul-ip:" + ip;
        final String ipRedisLimitKey = "zuul-ip-limit:" + ip;

        // 获得剩余的限制时间
        long limitLeftTime = redis.ttl(ipRedisLimitKey);
        // 如果剩余时间还存在,说明这个ip不能访问,继续等待
        if (limitLeftTime > 0) {
            stopRequest(requestContext);
            return null;
        }

        // 在redis中累加ip的请求访问次数
        long requestCounts = redis.increment(ipRedisKey, 1);

        // 从0开始计算请求次数,初期访问为1,则设置过期时间,也就是连续请求的间隔时间
        if (requestCounts == 1) {
            redis.expire(ipRedisKey, timeInterval);
        }

        // 如果还能取得到请求次数,说明用户连续请求的次数落在10秒内
        // 一旦请求次数超过了连续访问的次数,则需要限制这个ip了
        if (requestCounts > continueCounts) {
            // 限制ip访问一段时间
            redis.set(ipRedisLimitKey, ipRedisLimitKey, limitTimes);

            stopRequest(requestContext);
        }

        return null;
    }

    private void stopRequest(RequestContext requestContext){
        // 停止继续向下路由,禁止请求通信
        requestContext.setSendZuulResponse(false);
        requestContext.setResponseStatusCode(200);
        String result = JsonUtils.objectToJson(
                GraceJSONResult.errorCustom(
                        ResponseStatusEnum.SYSTEM_ERROR_BLACK_IP));
        requestContext.setResponseBody(result);
        requestContext.getResponse().setCharacterEncoding("utf-8");
        requestContext.getResponse().setContentType(MediaType.APPLICATION_JSON_VALUE);
    }
    上面这些都是通过不同key要执行多次才能得到结果,一般来说我们会使用es的aggs功能做聚合统计,会更好。
    通过一个脚本来统计男女数量:
    POST http://192.168.1.203:9200/fans/_doc/_search
    {
        "size": 0,
        "query":{
            "match":{
                "writerId":"201116760SMSZT2W"
            }
        },
        "aggs": {
            "counts": {
                "terms": {
                    "field": "sex"
                }
            }
        }
    }

    以下就是数据库系统开发的整个流程讲解,感谢大家的阅读

  • 首个基于Transformer的分割检测+视觉大模型视频课程(23年新课+源码+课件)
    自动驾驶是高安全型应用,需要高性能和高可靠的深度学习模型,Vision Transformer是理想的选摔。现在主流的自动驾驶感知算法基本都使用了Vision Transformer相关技术,比如分割、2D/3D检测,以及最近大火的大模型 (如SAM),Vision Transformer在自动驾驶领域的落地方面遍地开花。5一方面,在自动驾驶或图像处理相关算法岗位的面试题中,Vision Transformer是必考题,需要对其理论知识有深入理解,并且在项目中真实的使用过相关技术。

    Transformer出自于Google于2017年发表的论文《Attention is all you need》,最开始是用于机器翻译,并且取得了非常好的效果。但是自提出以来,Transformer不仅仅在NLP领域大放异彩,并且在CV、RS等领域也取得了非常不错的表现。尤其是2020年,绝对称得上是Transformer的元年,比如在CV领域,基于Transformer的模型横扫各大榜单,完爆基于CNN的模型。为什么Transformer模型表现如此优异?它的原理是什么?它成功的关键又包含哪些?本文将简要地回答一下这些问题。

    我们知道Transformer模型最初是用于机器翻译的,机器翻译应用的输入是某种语言的一个句子,输出是另外一种语言的句子。
    var i *int = nil
    fmt.Println("i.size:", unsafe.Sizeof(i)) //8

    var i8 *int8 = nil
    fmt.Println("i8.size:", unsafe.Sizeof(i8)) //8

    var s *string = nil
    fmt.Println("s.size:", unsafe.Sizeof(s)) //8

    var ps *struct{} = nil
    fmt.Println("ps.size:", unsafe.Sizeof(ps)) //8

    var si []int = nil
    var si1 []int = nil
    fmt.Println("si.size:", unsafe.Sizeof(si)) //24

    var ii interface{} = nil
    fmt.Println("ii.size:", unsafe.Sizeof(ii)) //16
    我们以生成我,爱,机器,学习,翻译成<bos>,i,love,machine,learning,<eos>这个例子做生成过程来解释。
    训练:

    把“我/爱/机器/学习”embedding后输入到encoder里去,最后一层的encoder最终输出的outputs [10, 512](假设我们采用的embedding长度为512,而且batch size = 1),此outputs 乘以新的参数矩阵,可以作为decoder里每一层用到的K和V;
    将<bos>作为decoder的初始输入,将decoder的最大概率输出词向量A1和‘i’做cross entropy(交叉熵)计算error。
    将<bos>,“i” 作为decoder的输入,将decoder的最大概率输出词 A2 和‘love’做cross entropy计算error。
    将<bos>,“i”,“love” 作为decoder的输入,将decoder的最大概率输出词A3和’machine’ 做cross entropy计算error。
    将<bos>,“i”,"love ",“machine” 作为decoder的输入,将decoder最大概率输出词A4和‘learning’做cross entropy计算error。
    将<bos>,“i”,"love ",“machine”,“learning” 作为decoder的输入,将decoder最大概率输出词A5和终止符做cross entropy计算error。
    那么并行的时候是怎么做的呢,我们会有一个mask矩阵在这叫seq mask,因为他起到的作用是在decoder编码我们的target seq的时候对每一个词的生成遮盖它之后的词的信息。
    func main() {
    s := []string{"a", "b", "c"}
    fmt.Println("s:origin", s)
    changes1(s)
    fmt.Println("s:f1", s)

    changes2(s)
    fmt.Println("s:f2", s)

    changes3(s)
    fmt.Println("s:f3", s)
    }

    func changes1(s []string) {
    var tmp = []string{"x", "y", "z"}
    s = tmp
    }

    func changes2(s []string) {
    // item只是一个副本,不能改变s中元素的值
    for i, item := range s {
    item = "d"
    fmt.Printf("item=%s;s[%d]=%s", item, i, s[i])
    }
    }

    func changes3(s []string) {
    for i := range s {
    s[i] = "d"
    }
    }

    首先我们需要为每个输入向量(也就是词向量)创建3个向量,分别叫做Query、Key、Value。那么如何创建呢?我们可以对输入词向量分别乘上3个矩阵来得到Q、K、V向量,这3个矩阵的参数在训练的过程是可以训练的。注意Q、K、V向量的维度是一样的,但是它们的维度可以比输入词向量小一点,比如设置成64,其实这步也不是必要的,这样设置主要是为了与后面的Mulit-head注意力机制保持一致(当使用8头注意力时,单头所处理的词向量维度为512/8=64,此时Q、K、V向量与输入词向量就一致了)。我们假设输入序列为英文的"Thinking Machines"
    想要深度理解Attention机制,就需要了解一下它产生的背景、在哪类问题下产生,以及最初是为了解决什么问题而产生。

    首先回顾一下机器翻译领域的模型演进历史:

    机器翻译是从RNN开始跨入神经网络机器翻译时代的,几个比较重要的阶段分别是: Simple RNN, Contextualize RNN,Contextualized RNN with attention, Transformer(2017),下面来一一介绍。

    「Simple RNN」 :这个encoder-decoder模型结构中,encoder将整个源端序列(不论长度)压缩成一个向量(encoder output),源端信息和decoder之间唯一的联系只是: encoder output会作为decoder的initial states的输入。这样带来一个显而易见的问题就是,随着decoder长度的增加,encoder output的信息会衰减。
    func main(){
    var c = make(chan int)
    fmt.Printf("c.pointer=%p\n", c) //c.pointer=0xc000022180
    go func() {
    c <- 1
    addChannel(c)
    close(c)
    }()

    for item := range c {
    //item: 1
    //item: 2
    fmt.Println("item:", item)
    }
    }

    func addChannel(done chan int) {
    done <- 2
    fmt.Printf("done.pointer=%p\n", done) //done.pointer=0xc000022180
    }
    在测试模型的时候,Test:decoder没有label,采用自回归一个词一个词的输出,要翻译的中文正常从encoder并行输入(和训练的时候一样)得到每个单词的embedding,然后decoder第一次先输入bos再此表中的id,得到翻译的第一个单词,然后自回归,如此循环直到预测达到eos停止标记
    type visit struct {
    a1  unsafe.Pointer
    a2  unsafe.Pointer
    typ Type
    }

    func deepValueEqual(v1, v2 Value, visited map[visit]bool) bool {
    if !v1.IsValid() || !v2.IsValid() {
    return v1.IsValid() == v2.IsValid()
    }
    if v1.Type() != v2.Type() {
    return false
    }

    // We want to avoid putting more in the visited map than we need to.
    // For any possible reference cycle that might be encountered,
    // hard(v1, v2) needs to return true for at least one of the types in the cycle,
    // and it's safe and valid to get Value's internal pointer.
    hard := func(v1, v2 Value) bool {
    switch v1.Kind() {
    case Pointer:
    if v1.typ.ptrdata == 0 {
    // not-in-heap pointers can't be cyclic.
    // At least, all of our current uses of runtime/internal/sys.NotInHeap
    // have that property. The runtime ones aren't cyclic (and we don't use
    // DeepEqual on them anyway), and the cgo-generated ones are
    // all empty structs.
    return false
    }
    fallthrough
    case Map, Slice, Interface:
    // Nil pointers cannot be cyclic. Avoid putting them in the visited map.
    return !v1.IsNil() && !v2.IsNil()
    }
    return false
    }

    if hard(v1, v2) {
    // For a Pointer or Map value, we need to check flagIndir,
    // which we do by calling the pointer method.
    // For Slice or Interface, flagIndir is always set,
    // and using v.ptr suffices.
    ptrval := func(v Value) unsafe.Pointer {
    switch v.Kind() {
    case Pointer, Map:
    return v.pointer()
    default:
    return v.ptr
    }
    }
    addr1 := ptrval(v1)
    addr2 := ptrval(v2)
    if uintptr(addr1) > uintptr(addr2) {
    // Canonicalize order to reduce number of entries in visited.
    // Assumes non-moving garbage collector.
    addr1, addr2 = addr2, addr1
    }

    // Short circuit if references are already seen.
    typ := v1.Type()
    v := visit{addr1, addr2, typ}
    if visited[v] {
    return true
    }

    // Remember for later.
    visited[v] = true
    }

    switch v1.Kind() {
    case Array:
    for i := 0; i < v1.Len(); i++ {
    if !deepValueEqual(v1.Index(i), v2.Index(i), visited) {
    return false
    }
    }
    return true
    case Slice:
    if v1.IsNil() != v2.IsNil() {
    return false
    }
    if v1.Len() != v2.Len() {
    return false
    }
    if v1.UnsafePointer() == v2.UnsafePointer() {
    return true
    }
    // Special case for []byte, which is common.
    if v1.Type().Elem().Kind() == Uint8 {
    return bytealg.Equal(v1.Bytes(), v2.Bytes())
    }
    for i := 0; i < v1.Len(); i++ {
    if !deepValueEqual(v1.Index(i), v2.Index(i), visited) {
    return false
    }
    }
    return true
    case Interface:
    if v1.IsNil() || v2.IsNil() {
    return v1.IsNil() == v2.IsNil()
    }
    return deepValueEqual(v1.Elem(), v2.Elem(), visited)
    case Pointer:
    if v1.UnsafePointer() == v2.UnsafePointer() {
    return true
    }
    return deepValueEqual(v1.Elem(), v2.Elem(), visited)
    case Struct:
    for i, n := 0, v1.NumField(); i < n; i++ {
    if !deepValueEqual(v1.Field(i), v2.Field(i), visited) {
    return false
    }
    }
    return true
    case Map:
    if v1.IsNil() != v2.IsNil() {
    return false
    }
    if v1.Len() != v2.Len() {
    return false
    }
    if v1.UnsafePointer() == v2.UnsafePointer() {
    return true
    }
    for _, k := range v1.MapKeys() {
    val1 := v1.MapIndex(k)
    val2 := v2.MapIndex(k)
    if !val1.IsValid() || !val2.IsValid() || !deepValueEqual(val1, val2, visited) {
    return false
    }
    }
    return true
    case Func:
    if v1.IsNil() && v2.IsNil() {
    return true
    }
    // Can't do better than this:
    return false
    case Int, Int8, Int16, Int32, Int64:
    return v1.Int() == v2.Int()
    case Uint, Uint8, Uint16, Uint32, Uint64, Uintptr:
    return v1.Uint() == v2.Uint()
    case String:
    return v1.String() == v2.String()
    case Bool:
    return v1.Bool() == v2.Bool()
    case Float32, Float64:
    return v1.Float() == v2.Float()
    case Complex64, Complex128:
    return v1.Complex() == v2.Complex()
    default:
    // Normal equality suffices
    return valueInterface(v1, false) == valueInterface(v2, false)
    }
    }
    这便是encoder的整体计算流程图了,Transformer模型中堆叠了多个这样的encoder,无非就是输出连接输入罢了,常规操作。
    最后再附上一个Transformer的代码实现,读者有兴趣可以跟着自己复现一下Transformer模型的代码。
       package main

       import (
           "log"
           "sync"
       )

       func init() {
           log.SetFlags(log.Lshortfile)
       }
       func main() {
           lock := sync.Mutex{}

           //Go 1.18 新增,是一种非阻塞模式的取锁操作。当调用 TryLock() 时,
           //该函数仅简单地返回 true 或者 false,代表是否加锁成功
           //在某些情况下,如果我们希望在获取锁失败时,并不想停止执行,
           //而是可以进入其他的逻辑就可以使用TryLock()
           log.Println("TryLock:", lock.TryLock())
           //已经通过TryLock()加锁,不能再次加锁
           lock.Lock()

       }

  • 托马斯微积分第十版中文
    电子书为扫描版本,自己手动添加书签作为目录供参考
  • Wayking RadarSensors_LRR7710_中英文产品手册
    Wayking RadarSensors_LRR7710_中英文产品手册
  • Geehy极海微控制器选型手册
    Geehy极海微控制器选型手册,产品基于Arm® Cortex®-M0+/M3/M4F/RISC-V内核,覆盖工业级/车规级/电机控制专用以及无线MCU,丰富的产品组合阵营,满足客户多样化产品应用需求!
  • 12、如何挑选立式磁棒电感厂家
    12、如何挑选立式磁棒电感厂家
  • 注释EN55014-1
    注释EN55014-1
  • CS5511数据手册
    CS5511是一个将DP/eDP输入转换为LVDS信号的桥接芯片,此外,CS5511可以用作在DP/eDP输入到DP/eDP输出场景中桥接芯片
  • 基于单片机的工业级液晶图形显示控制芯片RA8889ML3N-Datasheet
    TFT-LCD液晶显示控制芯片RA8889ML3N的优势:
    低功耗及功能强大:这款芯片最大支持分辨率为1366x2048,内置128Mb SDRAM,可为内容显示进行快速刷新,同时内置视频解码单元,支持JPEG/AVI硬解码播放,为普通单片机实现视频播放提供可能。
    支持多种接口:RA8889ML3N支持MCU端的8080/6800 8/16-bit 非同步并列接口和3/4线SPI及IIC串列接口,以及最大驱动1366x800分辨率的TFT LCD。
    显示功能强大:RA8889ML3N提供多段的显示记忆体缓冲区段,支持多图层功能,并提供画中画(PIP)、支持透明度控制与显示旋转镜像等显示功能。

    应用范围广:这款芯片广泛应用于自动化控制设备、电力监测控制、测量检测仪器仪表、电教设备、智能家电、医疗检测设备、车用仪表及工控自动化等领域。

    技术咨询与交流:QQ2851189731, 微信13760238805

  • [完结19章]SpringBoot开发双11商品服务系统教程下载
    如何使用SpringBoot开发一款关于双11商品服务的系统?今天就给大家说道说道,希望对大家的学习有所帮助!
    1.什么是SpringBoot?
    Spring 的诞⽣是为了简化 Java 程序的开发的,⽽ Spring Boot 的诞⽣是为了简化 Spring 程序开发的。
    Spring Boot是由Pivotal团队提供的基于Spring的框架,该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。Spring Boot集成了绝大部分目前流行的开发框架,就像Maven集成了所有的JAR包一样,Spring Boot集成了几乎所有的框架,使得开发者能快速搭建Spring项目。
    2.SpringBoot的优点
    快速集成框架,Spring Boot 提供了启动添加依赖的功能,⽤于秒级集成各种框架。
    内置运⾏容器,⽆需配置 Tomcat 等 Web 容器,直接运⾏和部署程序。
    快速部署项⽬,⽆需外部容器即可启动并运⾏项⽬。
    可以完全抛弃繁琐的 XML,使⽤注解和配置的⽅式进⾏开发。
    ⽀持更多的监控的指标,可以更好的了解项⽬的运⾏情况

    后端配置
    1.1创建Springboot工程
    打开idea->file->new->project
    选择spring Initializer进行配置,java版本选择8,点击next
    - internal 应用代码
        - controllers 控制器模块
          - admin 后端控制器
          - front 前端控制器
        - listen redis监听器
        - models 模型模块
        - service 服务模块
          - product_serive 商品服务
          - wechat_menu_serive 微信公众号菜单服务
          ......
    - conf 公共配置
      -config.yml yml配置文件
      -config.go 配置解析,转化成对应的结构体
      
    - middleware 中间件
        - AuthCheck.go  jwt接口权限校验
    - cors.go 跨域处理
    ......
    - pkg 程序应用包
      - app
      - base
      - casbin
      - jwt
      - qrcode
      - wechat
      .....
    - routere 路由
    - logs 日志存放
    - runtime 资源目录
    首先,我仔细分析了需求,并且根据业务逻辑设计了合适的接口。
    对于多表关联查询,我使用了MyBatis的注解来编写SQL语句,并通过@One和@Many等注解来实现结果集的映射。
    对于数据分页,我使用了MyBatis-Plus提供的Page对象,并结合相关方法来实现数据分页查询。
    2. 上课中的优秀项目
    在课堂上,我完成了一个优秀的项目,主要是学生实体类的增删改查功能。通过这个项目,我巩固了对Spring Boot框架的理解和掌握。
    具体实现如下:
    //初始化redis
    err := cache.InitRedis(cache.DefaultRedisClient, &redis.Options{
    Addr:        global.CONFIG.Redis.Host,
    Password:    global.CONFIG.Redis.Password,
    IdleTimeout: global.CONFIG.Redis.IdleTimeout,
    }, nil)
    if err != nil {
    if err != nil {
    global.LOG.Error("InitRedis error ", err, "client", cache.DefaultRedisClient)
    panic(err)
    }
    panic(err)
    }

    //初始化mysql
    err = db.InitMysqlClient(db.DefaultClient, global.CONFIG.Database.User,
    global.CONFIG.Database.Password, global.CONFIG.Database.Host,
    global.CONFIG.Database.Name)
    if err != nil {
    global.LOG.Error("InitMysqlClient error ", err, "client", db.DefaultClient)
    panic(err)
    }
    global.Db = db.GetMysqlClient(db.DefaultClient).DB

    开发步骤
    SpringBoot 开发起来特别简单,分为如下几步:
    创建新模块,选择Spring初始化,并配置模块相关基础信息
    选择当前模块需要使用的技术集
    开发控制器类
    运行自动生成的Application类
    知道了 SpringBoot 的开发步骤后,接下来我们进行具体的操作
    shutdown.NewHook().Close(
    //关闭http server
    func() {
    ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
    defer cancel()
    if err := server.Shutdown(ctx); err != nil {
    logging.Error("http server shutdown err", err)
    }
    },

    func() {
    //关闭kafka producer(特别是异步生产者,强制关闭会导致丢消息)
    if err := mq.GetKafkaSyncProducer(mq.DefaultKafkaSyncProducer).Close(); err != nil {
    logging.Error("kafka shutdown err", err)
    }
    },
    func() {
    //关闭mysql
    if err := db.CloseMysqlClient(db.DefaultClient); err != nil {
    logging.Error("mysql shutdown err", err)
    }
    },
    func() {
    //关闭redis
    if err := cache.GetRedisClient(cache.DefaultRedisClient).Close(); err != nil {
    logging.Error("redis shutdown err", err)
    }
    },
    )
    //也可以自己实现优雅关闭
    //signals := make(chan os.Signal, 0)
    //signal.Notify(signals, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT)
    //s := <-signals
    //global.LOG.Warn("shop receive system signal:", s)
    //ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
    //defer cancel()
    //err := server.Shutdown(ctx)
    //if err != nil {
    // global.LOG.Error("http server error", err)
    //}
    //mq.GetKafkaSyncProducer(mq.DefaultKafkaSyncProducer).Close()

    选择 Spring Initializr ,用来创建 SpringBoot 工程
    以前我们选择的是 Maven ,今天选择 Spring Initializr 来快速构建 SpringBoot 工程。而在 Module SDK 这一项选择我们安装的 JDK 版本。
    type StoreProduct struct {
    Image        string         `json:"image" valid:"Required;"`
    SliderImage  string         `json:"slider_image" valid:"Required;"`
    StoreName    string         `json:"store_name" valid:"Required;"`
    StoreInfo    string         `json:"store_info" valid:"Required;"`
    Keyword      string         `json:"keyword" valid:"Required;"`
    CateId       int            `json:"cate_id" valid:"Required;"`
    ProductCate  *StoreCategory `json:"product_cate" gorm:"foreignKey:CateId;association_autoupdate:false;association_autocreate:false"`
    Price        float64        `json:"price" valid:"Required;"`
    VipPrice     float64        `json:"vip_price" valid:"Required;"`
    OtPrice      float64        `json:"ot_price" valid:"Required;"`
    Postage      float64        `json:"postage" valid:"Required;"`
    UnitName     string         `json:"unit_name" valid:"Required;"`
    Sort         int16          `json:"sort" valid:"Required;"`
    Sales        int            `json:"sales" valid:"Required;"`
    Stock        int            `json:"stock" valid:"Required;"`
    IsShow       *int8          `json:"is_show" valid:"Required;"`
    IsHot        *int8          `json:"is_hot" valid:"Required;"`
    IsBenefit    *int8          `json:"is_benefit" valid:"Required;"`
    IsBest       *int8          `json:"is_best" valid:"Required;"`
    IsNew        *int8          `json:"is_new" valid:"Required;"`
    Description  string         `json:"description" valid:"Required;"`
    IsPostage    *int8          `json:"is_postage" valid:"Required;"`
    GiveIntegral int            `json:"give_integral" valid:"Required;"`
    Cost         float64        `json:"cost" valid:"Required;"`
    IsGood       *int8          `json:"is_good" valid:"Required;"`
    Ficti        int            `json:"ficti" valid:"Required;"`
    Browse       int            `json:"browse" valid:"Required;"`
    IsSub        *int8          `json:"is_sub" valid:"Required;"`
    TempId       int64          `json:"temp_id" valid:"Required;"`
    SpecType     int8           `json:"spec_type" valid:"Required;"`
    IsIntegral   *int8          `json:"isIntegral" valid:"Required;"`
    Integral     int32          `json:"integral" valid:"Required;"`
    BaseModel
    }

    //定义商品消息结构
    type ProductMsg struct {
    Operation string `json:"operation"`
    *StoreProduct
    }
    切换web服务器
    现在我们启动工程使用的是 tomcat 服务器,那能不能不使用 tomcat 而使用 jetty 服务器,jetty 在我们 maven 高级时讲 maven 私服使用的服务器。而要切换 web 服务器就需要将默认的 tomcat 服务器给排除掉,怎么排除呢?使用 exclusion 标签
    func (e *StoreProductController) Post(c *gin.Context) {
    var (
    dto  dto2.StoreProduct
    appG = app.Gin{C: c}
    )
    httpCode, errCode := app.BindAndValid(c, &dto)
    if errCode != constant.SUCCESS {
    appG.Response(httpCode, errCode, nil)
    return
    }
    productService := product_service.Product{
    Dto: dto,
    }
    model, err := productService.AddOrSaveProduct()
    if err != nil {
    appG.Response(http.StatusInternalServerError, constant.FAIL_ADD_DATA, nil)
    return
    }

    //发消息队列
    defer func() {
    operation := product.OperationCreate
    if dto.Id > 0 {
    operation = product.OperationUpdate
    }
    productMsg := models.ProductMsg{
    operation,
    &model,
    }
    msg, _ := json.Marshal(productMsg)
    p, o, e := mq.GetKafkaSyncProducer(mq.DefaultKafkaSyncProducer).Send(&sarama.ProducerMessage{
    Topic: product.Topic,
    Key:   mq.KafkaMsgValueStrEncoder(strconv.FormatInt(dto.Id, 10)),
    Value: mq.KafkaMsgValueEncoder(msg),
    },
    )
    if e != nil {
    global.LOG.Error("send product msg error ", e, "partition :", p, "offset :", o, "id :", dto.Id)
    }
    }()

    appG.Response(http.StatusOK, constant.SUCCESS, nil)

    }


  • 16、谷景电子贴片电感在智能电梯领域应用取得新进展
    16、谷景电子贴片电感在智能电梯领域应用取得新进展
  • 作者:Shawn Prestridge,IAR资深现场应用工程师 / 美国FAE团队负责人 安全一直都是一个非常热门的话题,似乎每周都会听到这样的消息:某某公司如何被入侵,数百万用户的数据被泄露。 我们看到这么多的安全问题,部分原因在于我们对待安全的方式:安全性通常被认为是事后考虑的问题,是在开发结束时才添加到设备上的东西。然而,复杂的系统,尤其是嵌入式系统,有一个很大的攻击面,这让攻击者有机可乘,能够在“盔甲”上找到破绽。如果你去研究大部分黑客试图入侵系统的方式,你很快就会发现,在他们的武
    电子科技圈 2023-11-30 14:43 121浏览
  • 随着汽车电子进入电动化+智能网联的时代,新能源、车联网、智能化、电动化四个领域带来了CAN数据的需求,企业车队管理需要数据,汽车运营需要数据,改装、解码、匹配工具打造需要数据,现在就连简单的LED汽车照明控制,也需要匹配数据。这一切,逃脱不了CAN、LIN、SENT、BSD、MOST各种协议下,不同ECU控制单元在不同年份,不同款式下的数据,可以这么说,在新能源这个前提下,我们要做的工作和要做的事情可能要更为复杂、多变。 前日,我拿出一份13年左右丰田的CAN协议,里边包括车灯控制、车
    lauguo2013 2023-11-30 15:45 109浏览
  • 在电力系统中,过电压保护器是一种重要的设备,它对电力设备的安全运行具有重要的作用。下面我们来了解一下过电压保护器的基本结构。过电压保护器通常由三个主要部分组成:间隙、非线性元件和触发器。1. 间隙:间隙是过电压保护器的基本结构之一,它是由两个金属电极组成的,通常采用球形或棒形结构。间隙的间距通常在几毫米到几厘米之间,它能够承受一定的电压,并在过电压条件下进行放电。2. 非线性元件:非线性元件是过电压保护器的另一个重要组成部分。它是一种特殊的电阻器,能够在高电压下呈现出非线性的特性。当电压超过一定
    保定众邦电气 2023-11-30 14:49 173浏览
  •    电源连接器的插针遭受损坏的情况非常普遍,这种故障会让连接器的电流传输受到影响,进而影响设备的正常使用,那是什么因素导致电源连接器的插针遭到损坏呢?下面Amass将为您分析其中的原因。   1、应用环境高温 1. 在高温环境下,电源连接器插针易受腐蚀影响,形成氧化层,损失接触压力,甚至可能发生接头烧损情况。对于这种环境,电源连接器需要具备耐高温性能,不仅需满足环境温度要求,还须考虑其在工作状态下的热量散发。  
    艾迈斯电子 2023-11-30 16:33 130浏览
  • 听力危机不可不慎,助听器市场的发展概况根据世界卫生组织WHO于2021年所发布的世界听力报告(World report on hearing)统计,全球目前有20%左右的听损人口;其中「轻度」与「中度」听损人口就占了大约15亿人左右。台湾方面,根据2021年卫生福利部统计处的数据显示,台湾则约有12万人有听力损失的问题,其中更有高达56% (约71,543人)确诊为轻度听损。足以看出听力受损问题已逐渐成为全球新兴的健康议题。听力损失的成因及轻重程度因人而异,但无论如何,或多或少都会影响到我们的日
    百佳泰测试实验室 2023-11-30 17:26 118浏览
  • 高低温探针台是一种用于材料科学、物理、化学等领域的实验设备,主要用于在高温和低温环境下对材料进行各种实验和研究。下面是高低温探针台的工作原理。工作原理是将样品放置在加热和冷却组件上,然后使用各种测量仪器对其进行实验和测量。具体来说,其工作流程如下:将样品放置在加热和冷却组件上;启动加热系统,将样品加热到所需的温度;启动制冷系统,将冷却组件降温到所需的温度;通过各种测量仪器对样品进行实验和测量;记录实验数据并进行分析和处理;结束实验后,关闭加热和制冷系统,并解除真空状态,取出样品。总之,高低温探针
    锦正茂科技 2023-12-01 14:50 101浏览
  • By Toradex胡珊逢 简介 双屏显示在显示设备中有着广泛的应用,可以面向不同群体展示特定内容。文章接下来将使用 Verdin iMX8M Plus 的 Arm 计算机模块演示如何方便地在 Toradex 的 Linux BSP 上实现在两个屏幕上显示独立的 Qt 应用。 硬件介绍 软件配置 Verdin iMX8M Plus 模块使用 Toradex Multimedia Reference Image V6.4.0 版本,其包含 Qt5.15 相关运行环境。默认系统中已经使
    hai.qin_651820742 2023-12-01 11:53 117浏览
  •    本文介绍在ALPS平台上进行SSL测试的内容和方法   什么是SSL SSL全称是Secure Sockets Layer,指安全套接字协议,为基于TCP的应用层协议提供安全连接;SSL介于TCP/IP协议栈的第四层和第五层之间,广泛用于电子商务、网上银行等。 SSL协议有三个版本,其中SSL2.0和3.0曾被广泛使用,其中SSLv3.0自1996提出并得到大规模应用成为了事实上的标准,在2015年才被弃用。1999年,IETF收纳了SSLv3.0并
    信而泰市场部 2023-11-30 15:08 102浏览
  • 印刷部分 这本书印刷和普通书籍不太一样,类似笔记本的手写体印刷和笔记的网格,有亲近感和新鲜感内容部分 分为通信工程 ;传感器工程;磁传感器工程;太阳电池功能几大部分通信电路是一种用于传输信息的电子电路,可以用于无线通信、有线通信和网络通信等各种通信系统中。传感器电路则是用于感知和测量环境参数的电路,可以探测光、温度、压力、湿度、运动等各种物理量。在学习通信电路方面,可能会接触到模拟通信电路和数字通信电路。模拟通信电路主要涉及模拟信号的传输和处理,如调制解调、信号放大、滤波等。数字通信电路则涉及数
    陇南有只大花猫 2023-11-30 19:01 198浏览
  •     按照 IPC术语,连接盘/Land 是指一块导体,通常用于连接和/或固定元器件的导电部分。    为了增强孔的机械强度,所有的金属化孔或者镀覆孔,在穿过每一层铜箔时,都应该有连接盘,连接盘的形状不限。前面提过的孔环也是连接盘的一种形式。在允许的条件下,孔环和连接盘的尺寸都要尽量大一些。    前面提到过,铜层图案(连接盘)和孔是在不同的工序制作的。由于加工公差的存在,用常见的圆形连接盘和圆孔来说,并不能保证孔和连接盘保持精确的同
    电子知识打边炉 2023-11-30 21:32 146浏览
  • 前言 在网络部署之后和业务开展之前,运营商迫切希望了解当前网络的性能状态,以便为商业规划和业务推广提供必要的基础数据支持。因此,高可靠性和高精确度的性能测试方法对于运营商评判网络性能的优劣,显得尤为重要,而RFC 2544等传统测试标准已不足于鉴定当今的服务等级协议(SLA)。SLA是服务提供商(如ISP)及其最终用户之间的协议,它规定以太网服务的开通或验证必须进行测量,且必须达到SLA的规范要求。目前,对以太网服务进行测试和故障诊断的最佳选择无疑是ITU-T Y.1564标准。 &
    信而泰市场部 2023-11-30 15:06 90浏览
我要评论
1
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦