Linux 创建新用户 异常提示/usr/bin/xauth: file /home/spring/.Xauthority does not exist

创建新用户,需要root权限设置 以root账号登录 进home目录,执行命令 cd /home 2 . 创建新用户 并 新建用户目录,执行命令 useradd spring -d /home/spring -m -g users 说明: 用户名为spring,-d指定用户所在目录,-m没有则创建,-g是指定用户组users 2. 设置密码, 执行命令后需要输入两次 passwd spring 3. 查看确认是否有/bin/bash,指定了sh访问, 执行命令 cat /etc/passwd 如果没有则需要修改成这样,执行命令 vim /etc/passwd 用该用户登录 如果抛出异常提示 /usr/bin/xauth: file /home/spring/.Xauthority does not exist 执行命令, 指定shell usermod -s /bin/bash spring 然后就可以使用该用户正常登录了

工业PDA的选购方法

工业PDA,又叫工业终端,现在国内的工业PDA品牌有很多,不同公司又有不同型号、不同应用系统的工业PDA,很多用户在挑选工业PDA的时候,不知道应该怎么选择。如何选购工业PDA? 工业PDA的选购方法 如何选购工业PDA?选购方法: 1、厂家实力:厂家的研发能力、生产力、创新力、产品的品质以及售后服务等,都决定了厂家的实力。具备一定实力和良好口碑的生产厂家,其工业PDA产品的质量才能有所保证。 2、售前售后服务:完善的服务体系可以保证一旦购买的工业PDA出现问题,均有专门团队答疑解难,为已购买的工业PDA保驾护航。 4、使用场景:不同的场景,在选购工业PDA的时候,要求不一样。企业应根据自身的应用需求来选择对应的功能模块。 5、续航能力:面对高频率的工作,如果电量无法保障,将影响资产管理人员的工作效率。 如何选购工业PDA?工业PDA优势: 1、专属识别、全程跟踪:通过工业PDA扫描功能,做到了物品的监管管理、物流应用、商家结算、消费者查询的功能统一。 2、节省人力,减少误差:传统的固定资产管理方法,人工抄录、人工录入,费时费力,工作量大,效率低下,错误率高,通过工业PDA采集,大大提高了信息采集效率,减少人力投入,满足现代快速的生产要求以及对数据信息快捷的把握与管理。

LDPC码简介【定义、特点、算法、Tanner】

LDPC码简介 低密度校验码(LDPC码)是一种前向纠错码,LDPC码最早在20世纪60年代由Gallager在他的博士论文中提出,但限于当时的技术条件,缺乏可行的译码算法,此后的35年间基本上被人们忽略,其间由Tanner在1981年推广了LDPC码并给出了LDPC码的图表示,即后来所称的Tanner图。1993年Berrou等人发现了Turbo码,在此基础上,1995年前后MacKay和Neal等人对LDPC码重新进行了研究,提出了可行的译码算法,从而进一步发现了LDPC码所具有的良好性能,迅速引起强烈反响和极大关注。经过十几年来的研究和发展,研究人员在各方面都取得了突破性的进展,LDPC码的相关技术也日趋成熟,甚至已经开始有了商业化的应用成果,并进入了无线通信等相关领域的标准。 LDPC码的特点 LDPC码是一种分组码,其校验矩阵只含有很少量非零元素。正是校验矩阵的这种稀疏性,保证了译码复杂度和最小码距都只随码长呈现线性增加。除了校验矩阵是稀疏矩阵外,码本身与任何其它的分组码并无二致。其实如果现有的分组码可以被稀疏矩阵所表达,那么用于码的迭代译码算法也可以成功的移植到它身上。然而,一般来说,为现有的分组码找到一个稀疏矩阵并不实际。不同的是,码的设计是以构造一个校验矩阵开始的,然后才通过它确定一个生成矩阵进行后续编码。而LDPC的编码就是本文所要讨论的主体内容。对于LDPC码而言,校验矩阵的选取十分关键,不仅影响LDPC码的纠错性能力,也影响LDPC编译码的复杂度及硬件实现的复杂度。准循环 LDPC 码(Quasi-Cycle,QC-LDPC)是 LDPC 码中重要的一类,是指一个码字以右移或左移固定位数的符号位得到的仍是一个码字。QC-LDPC 码的校验矩阵是由循环子矩阵的阵列组成,相对于其他类型的 LDPC 码,在编码和解码的硬件实现上具有许多优点。编码可以通过反馈移位寄存器有效实现,采用串行算法,编码的复杂度与校验比特位数成正比,而采用并行算法,编码复杂度与码字长度成正比。对硬件解码实现,准循环的结构简化了消息传递的路径,可以部分并行解码,实现了解码复杂度和速率的折中。这些优点,使得 QC-LDPC 码作为未来通信和存储系统应用的主要 LDPC 码。 译码算法的选择 译码方法是LDPC码与经典的分组码之间的最大区别。经典的分组码一般是用ML类的译码算法进行译码的,所以它们一般码长较小,并通过代数设计以减低译码工作的复杂度。但是LDPC码码长较长,并通过其校验矩阵H的图像表达而进行迭代译码,所以它的设计以校验矩阵的特性为核心考虑之一。由于 LDPC 码校验矩阵的稀疏性,其译码复杂度与码长不是指数关系,而是线性关系,因而 LDPC 码的码长可以很长,可以达到几千到几万甚至更高,这样带来的一个好处是:一个码字内各比特之间的关联长度比较长,一般通过迭代译码方法进行译码,充分利用码字内各比特的关联性以提高译码准确度,并且还充分利用了信道的特征。本课题采用的译码算法为置信传播(BP)译码算法,置信传播算法是基于 Tanner 图的迭代译码算法。在迭代过程中,可靠性信息,即“消息”通过 Tanner图上的边在变量节点和校验节点中来回传递,经多次迭代后趋于稳定值,然后据此进行最佳判决,BP译码算法有着非常好译码性能。 Tanner图 LDPC码常常通过图来表示,而Tanner图所表示的其实是LDPC码的校验矩阵。Tanner图包含两类顶点:n个码字比特顶点(称为比特节点),分别与校验矩阵的各列相对应和m个校验方程顶点(称为校验节点),分别与校验矩阵的各行对应。校验矩阵的每行代表一个校验方程,每列代表一个码字比特。所以,如果一个码字比特包含在相应的校验方程中,那么就用一条连线将所涉及的比特节点和校验节点连起来,所以Tanner图中的连线数与校验矩阵中的1的个数相同。以下图是矩阵的Tanner图,其中比特节点用圆形节点表示,校验节点用方形节点表示,加黑线显示的是一个6循环: ​​​​​​ Tanner图中的循环是由图中的一群相互连接在一起的顶点所组成的,循环以这群顶点中的一个同时作为起点和终点,且只经过每个顶点一次。循环的长度定义为它所包含的连线的数量,而图形的围长,也可叫做图形的尺寸,定义为图中最小的循环长度。如上图中,图形的尺寸,即围长为6,如加黑线所示。 LDPC编码 基于校验矩阵H直接编码方案 首先推导出根据校验矩阵直接编码的等式。将尺寸为(m,n)校验矩阵写成如下形式: H = [ H 1 H 2 ] H = [ H 1 H 2 ] H = [ H 1 H 2 ] H=[H1 H2]H=[H1 H2] H=[H_1 \ H_2] H=[H1 H2]H=[H1 H2]H=[H1​ H2​]Kij​是校正因子,使每次计算出的

下一代视频编码技术的云视频应用探索

本文由华为云资深产品专家左雯在LiveVideoStackCon2020线上峰会的演讲内容整理而成,本文从视频编解码技术的趋势、难点和挑战以及华为云视频产品的编解码关键技术实践与成果两方面介绍下一代视频编解码技术优化应用的探索。 文 / 左雯 整理 / LiveVideoStack 大家下午好,非常荣幸参加LiveVideoStack首届音视频线上峰会。先自我介绍一下,我叫左雯,来自华为云,是云视频服务的产品经理。在做产品经理之前,一直从事视频编解码算法研究优化、转码产品架构设计等工作!今天参加这个专题目的有两个,一个是想通过这次峰会,向大家分享一下华为云视频对下一代视频编码技术发展的想法和应用成果,另一个是像各位专家学习,相互交流,促进下一代视频编码技术的快速发展,推动云视频这个行业的发展。 今天分享的主题包括三个部分,首先是华为云视频对视频行业发展趋势的一些看法,以及这些趋势对下一代视频编码技术提出的挑战;其次从标准角度来介绍下一代视频编码技术以及华为相关工作;最后从云视频应用角度来具体介绍华为云在视频编码技术上的一些实践和探索。希望能给大家带来干货和技术启发。 1 视频行业趋势 5G、云、AI已经成为ICT行业甚至是整个社会的发展趋势,促使整个视频行业需求和技术不断演进,推动整个视频行业不断升级。如图所示,视频生命周期的每个环节都在更新升级,包括视频生产、视频处理、视频传输和视频消费。 视频生产:多源数据的采集,包括超高清、VR、自由视角、3D建模和视频渲染。 视频处理:基于AI让视频处理更实时、智能和准确,包括各种编码方式。 视频传输:超低时延的传输,云边协同等等。 视频消费:智能终端的深度结合提供视频服务的最佳体验。 视频行业本质是对媒体数据的处理,背后是算力、存储、网络、AI的支撑,同时视频行业又推动着5G、云、AI的不断前行,相辅相成! 视频演进带动了算力、存储、带宽需求的大幅增长。简单来看,视频分辨率越来越高,从高清到超高清再到8K/VR。算力增长 24倍,存储增长12倍,带宽增长 20倍。这些需求通过云,也只有通过云才能很好的满足,实现高质量的视频体验。云原生视频是行业趋势,视频将成为云的基础服务能力。 前面说的是行业的整体趋势,下面说一下具体场景。互联网视频发展已经历两个阶段,第一阶段从08年到13年,以长视频VOD、点播观看为热点;第二阶段,从13年到19年,也就是去年,其实还在延续,以直播、短视频为热点;第三阶段,也就是下一代会以什么为热点?我们认为因为5G、云、AI的推动,视频将进入实时互动、VR/AR时代。 互动视频方式从IM向实时音视频过渡。直播连麦,主播PK,直播带货,视频分发方式的升级,百毫秒级超低时延实时互动视频成为趋势。 VR/AR,360度视角带来沉浸式体验革命,用户从看视频向玩视频过渡,体验提升的同时,视频传输能力也从兆级向十兆甚至百兆级单流带宽提升。 RTC实时音视频会成为5G时代基础设施的核心控制点,RTC应用很广泛,它的市场年增长率是30%左右,而且这项技术不仅能赋能直播、游戏等泛娱乐行业,更能在在线医疗、教育、金融等大视频行业渗透。现有的实时音视频市场正处于爆发期,玩家很多,但由于它是非云厂商,难以持续发展。原因之一是它的技术门槛比较高,特别是像音视频编码或者整个RTC网络的构建,另一点是目前各家均采用私有协议的方式接入,各家互通、客户的自由切换都比较困难。在RTC视频业务产品上,我们认为音视频编码处理将是各家构建技术壁垒和性能差异化竞争力的关键之一。 另外一个应用场景就是Cloud VR,我们一直认为VR是5G技术发展下的关键场景。VR发展是一波三折的,但在目前来看,之前碰到的一些问题正在逐渐改善。从终端的角度来看,之前的终端很贵,但是目前千元终端机已经逐渐来临,而且体验也会越来越好。除了设备终端,VR此前还面临内容缺失的重大问题,而VR直播很大程度上缓解了内容缺乏的问题。 虽然困境在逐步改善,但VR目前还面临着新的问题。互联网VR业务很难形成商业闭环,主要原因在于VR业务带来了收入增加,但与此同时带宽增加更多,VR追求的高质量体验需要通过更高带宽来实现,高带宽势必会带来高成本,而高成本就会导致商业无法闭环。在这样的前提下,很多玩家都会通过降低体验来开展VR,比如说内容采用4K以下,码率采用10兆以下,终端采用卡片机来体验VR,虽然这样可以将VR的业务打通,但体验效果是很差的,也导致付费用户非常少,产业发展比较缓慢。所以在VR的发展上,我们认为通过视频压缩编码以降低带宽是关键,是可以帮助实现商业闭环的一个环节。 从前面讲述视频行业趋势不难看出,用户体验升级、视频产业升级、商业成本等驱动着视频全方位升级,分辨率从高清到8K,帧频从30帧到120帧,视场角从不到90度到360度,SDR到HDR等,这些参数升级推动视频压缩编码技术不断演进,追求压缩比是永恒不变的! 另外,前车之鉴,HEVC/H.265,其实是很优秀的编码技术,但因为前期不友好的专利政策,市场占有率一直不高13%。还好目前有所好转!整个行业急需压缩比更高、生态更完善、专利政策更合理的视频编码技术。 提升压缩比有两条路线,这也是各厂商正在做的。 标准技术路线,作为基础内核,H.266、AV1、AVS3、AI编码 非标技术路线,依赖基础标准,结合人眼感知特征,感知编码、内容编码、ROI编码 2 下一代视频编码技术 下面将从这两个角度来介绍华为云视频在下一代视频编码技术上的一些工作。这些技术得力于华为2012媒体技术院全力支持。 2.1 下一代视频编码标准技术 从上图看出,下一代的视频编码标准大概分为三个阵营或者三个类型: 国际标准:由MPEG、VVC联合推动的像VVC/H.266还有EVC; 国内标准:国内标准组织正在推出或已经推出的AVS3的phase1、AVS3的phase2,两者主要差别在于AVS3的第1阶段标准瞄准H.266,第二阶段的标准则是瞄准未来,可能会加入一些智能编码的技术; 谷歌牵头的AOM联盟推出的AV1,是一个开源技术。 下一代的视频编码技术仍是采用传统的演进思路——在经典架构上做模块增强。在H.266CFP时,华为联合其他几家公司提了P41提案,在PSNR和MOS评估方面都是排名第一,这个提案也是后面基础。华为在VVC里的核心专利数量已属于第一阵营,这是一个了不起的成就,也说明了国内的视频压缩编码基础研究实际上不弱于欧美传统的公司。 上图是以VVC为例,对其新增的增强工具进行盘点。纵轴是每个工具的压缩收益,横轴是每个工具编解码复杂度,编码复杂度的权重可能会更高一点。VVC在块划分、帧内预测、帧间预测、熵编码、变换量化等多个模块上进行了增强,其中主要的增强是帧内、帧间预测、块划分、滤波的增强以及机器学习工具演进带来的收益。VVC暂时没有引入深度学习这一类编码工具。 图中还有三个用红圈标出来的工具,这是VVC中公认trade off比较好的三个工具点。蓝色的是ALF,这是大家比较熟悉的自适应环路滤波,其实它在H.265的时代就已经有了, H.266将它引入标准中;绿色的是仿射运动预测,这个主要是由华为提出的;橙色的是量化技术。 EVC标准的提出某种程度是因为H.265/H.266的专利政策不友好,有可能导致H.266的落地都比较困难。MPEG希望能通过一个新的专利友好的标准来推动落地,同时也促使改变H.266、H.265的专利授权政策。EVC由华为、三星、高通等共同提出推动,华为在这里面加入了很多技术。在标准立项时期望它比H.265的压缩性能提升20%,实测在4K娱乐视频上相比H.265压缩效率提升达30%以上,目前已经进入了最终的标准投票阶段。 AVS3是国内提出的标准,它的phase1是瞄准H.266标准的,并且在2019年3月份就已经制定完成率先推出,在2019年9月份,华为海思也同步推出了AVS3 8K的解码芯片,AVS3相对H.265性能提升了20%以上,并且针对娱乐视频和监控视频做了很多针对性的设计,性能上还可进一步提升。 H.266实际已经基本定稿,它的压缩效率在4K视频场景下相较于H.265能提升40%左右,其解码复杂度相对提升60%,目前看最大的问题还是专利政策不够透明,而且专利费可能比较高,推广节奏可能相对比较慢。 EVC也基本定稿,而且其压缩效率也能提升30%左右,解码复杂度相对H.265增加60%。其专利收费可能相对比较低,第二是他的专利收费比较透明和明确,目前主要依靠三星、华为、高通来做产业的推动和生态的构建。 AVS3在2019年3月份推出,在性能上还是有保证的,压缩效率能够提升25%,复杂度增加相对较低,其专利收费也是比较低的,正通过互联网等行业做产业的推动和生态构建,目前实际上有很多联盟和和公司正在做推动,我们也希望AVS3尽快落地。 表格中没有列举AV1的数据,这主要是因为它和其他三个标准不太一样,AV1开源软件实际上是瞄准商用化去做的,大家也比较清楚其压缩效率和解码复杂度。AV1有个很大的优势就是没有专利费,这是AOM联盟的承诺。在产业落地方面AV1做的很好,生态构建走的较前。 2.2 AI编码 下一代视频编码标准还有一个趋势就是AI编码,这一块实际上从HEVC、VVC标准制定就有提出,但因为考虑计算复杂度以及AI硬件普适性,都暂时搁置了。但这是个技术趋势。 AI编码包括两个演进思路,第一个是全新架构,类似于图像编码,实际上AI的图像编码已经取得了不错的成效,谷歌牵头的AI图像编码技术都已经得到了很好地应用,但针对视频中的应用还在探索过程中。所谓的全新架构,就是不用传统架构,视频进入黑盒后会得出一个压缩过的视频,这个视频可能没有块划分,也没有各种其他的方式,它的压缩效率会非常高,但这一切还处于研究的过程中。 另外一个思路是基于经典架构,对每个架构里的模块做增强。例如针对块划分、变换、矢量量化、帧内预测做不同的AI网络适应和增强。实际上华为也在做这方面的研究,未来可能会提出一些AI编码方面的论文或提案。并且我们认为AI编码的这两种思路,最终将是融合设计的过程,不会呈相互独立的状态。 3 华为云视频应用和实践 3.1 云视频简介 上面简单介绍了下一代视频编码标准技术,下面介绍一下从实际商用及非标角度,介绍一下华为云视频在视频编码技术上的应用和实践。 首先介绍一下华为云视频,华为云视频是从2017年开始构建的,目前包括两大类业务,一种是比较传统的直播、点播、媒体处理以及监控业务,另一种是整个行业正在新晋的服务,比如RTC、VR/AR以及超高清制播。华为云视频面向很多的场景,例如娱乐直播、短视频、在线教育、企业直播、4K直播、4K制作等等,我们致力于帮助行业客户、伙伴、开发者、ISV快速上线应用,并帮他们构建差异化的竞争力,实现商业闭环。这里需要重点提一下RTC,RTC是华为云视频对下一代视频的理解并作出了实际的推动,针对RTC,我们重点构建超低时延、音视频质量等差异化竞争力。 3.2 视频编码技术 3.2.1 视频编码框架 结合今天的主题,下面重点讲解华为云视频在视频编码技术上的一些工作。这些技术得力于华为2012媒体技术院全力支持。上图比较直观地表达了这点。图中黄框表示了编码器的内核,所有的华为云视频编码的编码能力、编码服务都是基于编码内核。编码内核采用了一个标准的编码器,类似于前面提到的H.264、H.265、AVS3、H.266或者EVC这一类,在这个编码内核的基础上,我们面向不同的场景做了不同的编码技术的优化和实践。比如 面向RTC实时音视频场景,采用低时延编码技术;面向VR场景,采用FOV tile编码;面向多视角场景,采用空间云边协同编码;面向监控场景,采用智能语义编码;面向直播、点播,采用感知编码和画质增强等;另外,华为云视频借助鲲鹏、昇腾两大专有硬件,加速视频编转码效率。鲲鹏主要面向CPU这类计算,昇腾主要面向AI方面的加速。

[Go菜牛系列]通过go-wrk进行HTTP接口压力测试

http 接口压力测试示例 go-wrk 是一个用Go语言实现的轻量级的http基准测试工具,类似于wrk,本文将简单介绍一下如何使用go-wrk实现接口的性能(压力)测试。 安装 go-wrk https://github.com/wg/wrk # 本次采用go-wrk测试 https://github.com/adjust/go-wrk git clone git://github.com/adeven/go-wrk.git cd go-wrk # 开启go modules的情况, 需要初始化配置(go1.11或以上) go mod init go-wrk go build go-wrk 选项说明 # #go-wrk [flags] url #./go-wrk --help Usage of ./go-wrk: -CA string A PEM eoncoded CA's certificate file. (default "someCertCAFile") -H string the http headers sent separated by '\n' (default "User-Agent: go-wrk 0.1 benchmark\nContent-Type: text/html;") -b string the http request body -c int the max numbers of connections used (default 100) -cert string A PEM eoncoded certificate file.

运放专题:运放输出电压

运放输出电压 定义:在给定电源电压和负载情况下,输出能够达到的最大电压范围。或者给出正向 最大电压 VOH 以及负向最小电压 VOL——相对于给定的电源电压和负载;或者给出与电 源轨(rail)的差距。 优劣范围:一般运放的输出电压范围要比电源电压范围略窄 1V 到几 V。较好的运放 输出电压范围可以与电源电压范围非常接近,比如几十 mV 的差异,这被称为“输出至轨 电压”。这在低电压供电场合非常有用。当厂家觉得这个运放的输出范围已经接近于电源电 压范围时,就自称“输出轨至轨”,表示为 Rail-to-rail output,或 RRO。 理解: 在没有额外的储能元件情况下,运放的输出电压不可能超过电源电压范围,随 着负载的加重,输出最大值与电源电压的差异会越大。这需要看数据手册中的附图。 输出电压范围,或者输出至轨电压有如下特点: 1) 正至轨电压与负至轨电压的绝对值可能不一致,但一般情况下数量级相同; 2) 至轨电压与负载密切相关,负载越重(阻抗小) 至轨电压越大; 3) 至轨电压与信号频率相关,频率越高,至轨电压越大,甚至会突然大幅度下降; 4) 至轨电压在 20mV 以内,属于非常优秀。 实际运放的输出电压 一、我们将拿LM324 与 OPA2363 作为对比来看下运放的输出电压,以及轨至轨运放与非轨至轨运放的输出电压的区别。 需要说明: 1、LM324 为非轨至轨运放,可单电源供电也可双电源供电,数据手册如下图所示: 2、OPA2363为单电源,轨至轨运放,数据手册如下图所示: 二、我们用仿真的软件来看下负载大小这两款芯片的输出电压。 仿真电路接成单限电压比较器, 1、不带负载,当电路输出低电平时: LM324的输出电压:-19.75mV (单电源供电,为什么还会出现负电压呢?) OPA2363的输出电压:5.83mV 总结:这两款芯片输出低电平时,不是标准的的0V (均为单电源供电)。 2、不带负载,当电路输出高电平时: LM324输出高电平为:4.02V (比电源电压略低) OPA2363 输出高电平为: 5V (正好为电源电压) 总结:轨至轨运放输出的高电平为电源电压(正电源轨),非轨至轨运放输出高电平接近电源电压(正电源轨),但离电源电压还有一段距离。 3、带2k负载,输出高电平时: LM324 输出高电平为:3.89V(比空载时的4.02V略低) OPA2363输出高电平为:4.93V(比空载时的5V略低) 总结:运放的输出电压不可能超过电源电压范围,随着负载的加重,输出最大值与电源电压的差异会越大 **三、**信号频率对运放输出电压的影响 把电路接成同相比例放大电路, 放大倍数为5倍,以使输出信号幅值饱和 1、信号源:幅值1V 1KHz 正弦波 看电路:

mui 上下拉刷新pullRefresh

mui 上下拉刷新pullRefresh,例子 <!doctype html> <html> <head> <meta charset="UTF-8"> <title></title> <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" /> <link href="../css/mui.min.css" rel="stylesheet" /> <script src="../js/mui.min.js"></script> <style type="text/css"> li { height: 30px; line-height: 30px; font-size: 14px; color: #bbb; text-indent: 4%; border-bottom: 1px solid currentColor; } </style> </head> <body> <!--下拉刷新容器--> <div id="refreshContainer" class="mui-content mui-scroll-wrapper"> <div class="mui-scroll"> <!--数据列表--> <ul class="mui-table-view mui-table-view-chevron" id="list"> </ul> </div> </div> </body> <script type="text/javascript" charset="utf-8"> var dataJson = { "header": { "ret": "S" }, "

RFID资产管理的应用效果

RFID资产管理的应用效果有哪些?RFID资产管理正在逐步取代传统管理方式,在使用的时候,可以提高工作效率,节省成本,更能避免很多人为差错。 RFID资产管理的应用效果 RFID资产管理的亮点: 1、盘点 工作人员盘点资产时,只需持有RFID盘点机就可读取到资产上的RFID电子标签信息,同时通过通讯接口将所读取到的信息传给服务器,服务器通过应用软件再对这些信息进行相应的处理。如果发现扫描的数据和数据库中现存的数据有冲突时,则产生报警,核对无误后则完成盘点操作。同时生成盘点、盘盈和盘亏报表。 2、出入库 在资产出入处设置RFID门禁。资产进出门禁时,门禁会自动识别贴有电子标签的资产,读到其相关信息,并将信息上传后台服务器,如果该资产未经授权移动,即属于非法标签,门禁会有报警提示。同样,当资产到达目的地的时候,被其门禁读到,系统会更新资产信息。 RFID资产管理的应用效果: 1、提升盘点速度:RFID盘点机快速盘点,盘点速度提升数倍以上,自动生成盘点报表。 2、及时掌握资产信息:对于每个资产,都能及时了解总数量、所在位置、使用状态、使用人、折旧金额等信息。 3、全生命周期管理:RFID资产管理可进行资产新增、调拨、领用、盘点、维修、报废等全生命周期管理过程。 4、提高管理效率,降低差错率:通过RFID资产管理系统,实现资产自动化管理,管理效率提高一半以上,在一定范围内达到了预期的应用效果。 5、资产去向可查:每当资产进行领用、借用、调拨、维修等申请后,都会生成对应的操作记录,给到资产管理员进行审批,及时了资产规范操作,去向可查。

greenplum mirror节点的 wal receiver process

WalReceiverMain 进程,这里有个 bug,如果 mirror 节点本身的日志比 primary 还要多,这样会出问题,但不知道 greenplum 有没有修复这个 bug。 首先读出 timeline 的位置,进入 wal 的接收状态 (walrcv_receive),当有消息到来,告知 primary 节点已收到日志,将日志刷盘后,再告知 primary 节点,刷盘的消息。 创建 xxx.done 文件来标记备份完成。并等待下一条消息(WalRcvWaitForStartPosition)。 startup 背景进程收到消息后,会读 wal 文件,执行 redo(RmgrTable[record->xl_rmid].rm_redo(ReadRecPtr, EndRecPtr, record);)

Vivado学习笔记一

Vivado开发流程 主要流程新建工程源文件仿真综合约束方法一:利用I/O Planning方法二:手动输入约束命令 设计实现 小结 主要流程 在Vivado中创建RTL设计 进行HDL编写 设置激励仿真 综合、实现、进行管脚约束 生成bit文件下载到FPGA 新建工程 1.打开Vivodo2019.1 2.点击Create Project 点击Next 为新建工程命名,注意路径和名字不要有中文 点击Next 选择RTL project,源文件之后再配置,勾选Do not specify sources at this time 选好了之后点击Next 选择FPGA版型号,Nexys4 DDR对应型号为xc7a100tcsg324-1,点击Next 点击Finish完成创建 创建完成后的界面如下 选择左上角的Add Sources 选择Add or create design sources,点击next 点击Create File以创建Source File 点击Finish完成创建 点击OK完成创建 源文件 双击test.v文件可以进行程序的编写,左上角点击保存别忘了 写一个简单的两个开关分别控制两个LED,代码如下 module test( input [1:0]SW, output [1:0]LED ); assign LED[1]=SW[1]; assign LED[0]=SW[0]; endmodule 仿真 然后写仿真程序 首先添加仿真文件,点击Add sources,选择Add or create simulation sources 双击tb_test.v文件编写程序,代码如下 `timescale 1ns / 1ps module tb_test( ); reg [1:0]SW; wire [1:0]LED; test uut( .

Python爬虫实战导航索引,30个爬虫项目让你一次吃到撑!!!

Python爬虫入门实战教程目录(持续更新中......) 1、淘宝模拟登录2、淘宝登录数据爬取3、12306模拟登陆4、斗鱼爬虫5、B站爬虫6、虎牙爬虫7、京东爬虫8、微博爬虫9、2020疫情数据可视化10、拉勾网爬虫11、爬虫IP代理教程12、BOOS直聘爬虫13、51Job爬虫14、唯美女生15、IP代理池构造教程16、网易云音乐爬取下载17、ZOL壁纸任意分辨率高清大图批量爬取18、网页模板爬取19、爬虫JS解密详解,学会直接破解80%的网站!!!20、批量爬取CSDN文章,并保存为md文件21、使用线程池派遣爬取22、Scrapy爬虫爬取链家全国各省城市房屋数据23、解决书荒问题,Python爬虫带你搞定24、爬虫进阶之字体反扒25、Python爬虫一血入门——彼岸图网26、股票数据可视化27、普通爬虫 VS 多线程爬虫!真香警告~~~28、多线程表情包分类爬取,助你称为斗图帝!!!29、大众点评SVG字体反扒30、网易新闻爬虫CSDN独家福利降临!!! 1、淘宝模拟登录 Python爬虫实战:Selenium和动作链实现淘宝模拟登录 2、淘宝登录数据爬取 Python爬虫实战:基于Scrapy的淘宝登陆后实现数据爬取并保存到Mysql 3、12306模拟登陆 Python爬虫实战:Selenium+超级鹰实现12306网站模拟登录 4、斗鱼爬虫 Python爬虫实战:基于Scrapy的爬取斗鱼颜值主播图片并下载保存到本地以供观赏 5、B站爬虫 Python爬虫实战:Scrapy爬取B站娱乐直播全部主播图片重命名下载到本地 6、虎牙爬虫 Python爬虫实战:基于Scrapy爬取虎牙星秀主播图片并下载到本地 7、京东爬虫 Python爬虫实战:Selenium+BeautifulSoup实现对京东商品完整数据的爬取 8、微博爬虫 Python爬虫实战:Selenium爬取微博头条信息保存到Mysql 9、2020疫情数据可视化 爬虫实战:Pyecharts实现2020疫情动态实时播报可视化 10、拉勾网爬虫 Python爬虫实战:爬取拉勾网任意职位信息并保存到Mysql 11、爬虫IP代理教程 Python爬虫IP代理教程(reuqests和selenium的ip代理) 12、BOOS直聘爬虫 Python爬虫实战:2020最新BOOS直聘爬取教程 13、51Job爬虫 Python爬虫实战:2020最新51job招聘网站爬取教程 14、唯美女生 唯美女生写真爬虫 15、IP代理池构造教程 IP代理池构造教程 16、网易云音乐爬取下载 网易云音乐爬取下载 17、ZOL壁纸任意分辨率高清大图批量爬取 ZOL壁纸高清大图批量爬取 18、网页模板爬取 网页模板爬取 19、爬虫JS解密详解,学会直接破解80%的网站!!! JS解密教程 20、批量爬取CSDN文章,并保存为md文件 批量爬取CSDN文章 21、使用线程池派遣爬取 线程池爬取教学 22、Scrapy爬虫爬取链家全国各省城市房屋数据 Scrapy爬虫爬取链家全国各省城市房屋数据 23、解决书荒问题,Python爬虫带你搞定 新笔趣阁全部小说爬取 24、爬虫进阶之字体反扒 字体反扒 25、Python爬虫一血入门——彼岸图网 爬虫入门——彼岸图网 26、股票数据可视化 股票数据可视化教程 27、普通爬虫 VS 多线程爬虫!真香警告~~~ 普通爬虫 VS 多线程爬虫 28、多线程表情包分类爬取,助你称为斗图帝!!! 多线程表情包分类爬取 29、大众点评SVG字体反扒 大众点评SVG反扒 30、网易新闻爬虫 网易新闻爬虫 CSDN独家福利降临!!! 最近CSDN有个独家出品的活动,也就是下面的《Python的全栈知识图谱》,路线规划的非常详细,尺寸 是870mm x 560mm 小伙伴们可以按照上面的流程进行系统的学习,不要像我当初一样没人带自己随便找本书乱学,系统的有规律的学习,它的基础才是最扎实的,在我们这行,《基础不牢,地动山摇》尤其明显。

RabbitMQ环境搭建及遇到问题解决办法

文章目录 RabbitMQ环境搭建1、 安装依赖2、 安装Erlang3、 安装RabbitMQ4、查看是否安装成功5、启用UI管理工具插件5、启动rabbitmq5、浏览器登陆rabbitmq6、配置rabbitmq用户 遇到问题及解决问题1:升级openssl RabbitMQ环境搭建 1、 安装依赖 1、RabbitMQ的安装需要首先安装Erlang,因为它是基于Erlang的VM运行的; 2、RabbitMQ需要的依赖:socat、logrotate、logrotate,后两个操作系统中已经存了,只需要安装socat即可; 3、安装socat: [root@10 /]# yum install socat -y ....... 总下载量:290 k 安装大小:1.1 M Downloading packages: socat-1.7.3.2-2.el7.x86_64.rpm | 290 kB 00:00:00 Running transaction check Running transaction test Transaction test succeeded Running transaction 正在安装 : socat-1.7.3.2-2.el7.x86_64 1/1 验证中 : socat-1.7.3.2-2.el7.x86_64 1/1 已安装: socat.x86_64 0:1.7.3.2-2.el7 完毕! 2、 安装Erlang 1、下载地址:https://github.com/rabbitmq/erlang-rpm/releases/download/v23.0.2/erlang-23.0.2-1.el7.x86_64.rpm 2、安装包上传linux服务器; 3、安装软件包: [root@10 software]# pwd /home/laosan/software [root@10 software]# yum -y install erlang-23.0.2-1.el7.x86_64.rpm 3、 安装RabbitMQ 1、下载地址:https://github.

python文件工程化,隐藏源码

python文件工程化,隐藏源码 py文件转换为pyc文件 全文来自博客https://www.cnblogs.com/HByang/p/13223118.html pyc介绍 pyc是一种二进制文件,是由py文件经过编译后,生成的文件,是一种byte code,py文件变成pyc文件后,加载的速度有所提高。 而且pyc是一种跨平台的字节码,是由python的虚拟机来执行的,这个是类似于JAVA或者.NET的虚拟机的概念。 pyc的内容,是跟python的版本相关的,不同版本编译后的pyc文件是不同的。 使用 通过自带模块py_compile进行 1、将单个文件转换成pyc文件 用如下代码 import py_compile py_compile.compile('test.py') 或者通过终端 python -m py_compile test.py 这样会在test.py文件所在的目录下,生成一个__pycache__(注意:这里目录名前后有两个下划线)的目录,并且其中存有一个test.cpython-35.pyc文件,这个pyc文件就是test.py编译之后生成的文件。 2、将目录下所有py文件转换成pyc文件 一般来说,我们的工程都是在一个目录下的,一般不会说仅仅编译一个py文件而已,而是需要把整个文件夹下的py文件都编译为pyc文件,python又为了我们提供了另一个模块:compileall 。使用方法如下: import compileall compileall.compile_dir(r'C:\Users\abc\Desktop\release_project') 也可以使用终端 python -m compileall C:\Users\abc\Desktop\release_project 这样就会在C:\Users\abc\Desktop\release_project目录下生成一个新的目录__pycache__,这个目录的下面会存放所有的和python源代码对应的pyc文件 python文件编译成.so二进制文件 这里要使用到Cython工具,官方中文文档https://moonlet.gitbooks.io/cython-document-zh_cn/content/ Cython 的 Hello World 由于 Cython 能接受几乎所有的合法 Python 源文件,开始使用 Cython 的最难的事情之一是怎么编译你的拓展(extension)。 那么,让我们从典型的(canonical)Python hello world 开始: print "Hello World" 将代码保存在文件 helloworld.pyx 中。现在,我们需要创建 setup.py,它是一个类似 Python Makefile 的文件(更多信息请看源文件和编译过程)。 你编写的 setup.py 应该看起来类似这样: from distutils.core import setup from Cython.Build import cythonize setup( ext_modules = cythonize("

scipy.optimize.minimize参数

scipy.optimize.minimize 英文文档 scipy.optimize.minimize(fun, x0, args=(), method=None, jac=None, hess=None, hessp=None, bounds=None, constraints=(), tol=None, callback=None, options=None) 参数: fun:要最小化的目标函数。 fun(x,*args)->float 其中x是(n,)的一维数组,args是完全指定函数所需的固定参数的元组。 x0:ndarray,shape=(n,) 大小为(n,)的实元素数组,其中“n”是自变量的数目。 args:可选。传递给目标函数及其导数(fun、jac和hess函数)的额外参数。 method:str或callable,可选 解算器的类型: “Nelder Mead” “Powell” ‘CG’ ‘BFGS’ “Newton-CG” ‘L-BFGS-B’ “TNC” ‘COBYLA’) “SLSQP” “trust-constr” “dogleg” “trust-ncg” “trust-exact” “trust-krylov” custom-自定义-一个可调用的对象(在0.14.0版中添加) 如果没有给定,则选择BFGS,L-BFGS-B,SLSQP中的一个,这取决于问题是否有约束或边界。 jac:{callable,‘2-point’,‘3-point’,cs’,bool},可选 计算梯度向量的方法。仅适用于CG、BFGS、Newton CG、L-BFGS-B、TNC、SLSQP、dogleg、trust ncg、trust krylov、trust exact和trust Construct。 如果它是可调用的,它应该是一个返回梯度向量的函数: jac(x,*args)->array_like,shape(n,).其中x是(n,)的数组,args是具有固定参数的元组。 如果jac是布尔值且为真,则假定fun返回objective和gradient作为(f,g)元组。“Newton CG”、“trust ncg”、“dogleg”、“trust exact”和“trust krylov”方法要求提供可调用函数,或者fun返回目标和梯度。 如果None或False,则使用绝对步长的两点有限差分估计来估计梯度。或者,关键字{‘2-point’、‘3-point’、‘cs’}可用于选择具有相对步长的梯度的数值估计的有限差分格式。这些有限差分格式服从任何指定的边界。 hess:{callable,‘2-point’,3-point’,cs’,HessianUpdateStrategy},可选 计算Hessian矩阵的方法。只适用于Newton CG、dogleg、trust ncg、trust krylov、trust exact和trust constr。如果它是可调用的,它应该返回Hessian矩阵: hess(x,*args)->{linearerator,spmatrix,array},(n,n) 其中x是(n,)ndarray,args是具有固定参数的元组。lineroperator和稀疏矩阵返回只允许用于“trust constr”方法。或者,关键字{‘2-point’、‘3-point’、‘cs’}选择一个有限差分格式进行数值估计。或者,实现HessianUpdateStrategy接口的对象可以用来近似Hessian。实现该接口的可用拟牛顿方法有: BFGS; SR1。 当用有限差分法估计梯度时,Hessian不能用选项{‘2-point’、‘3-point’、‘cs’}来估计,需要使用一种拟牛顿策略来估计。有限差分选项{‘2-point’、‘3-point’、‘cs’}和HessianUpdateStrategy仅适用于“trust constr”方法。

[Java]jhsdb查看内存内Java对象

java版本 (13)jhsdb简介 jhsdb从java9开始引入,可执行文件放在JAVA_HOME/bin目录下, 其取代了之前的JAVA_HOME/lib/sa-jdi.jar; clhsdb、debugd、hsdb、jstack、jmap、jinfo、jsnap这些是jhsdb命令不同的mode; jhsdb是一种进程外的调试工具,基于Java实现的API集合,以服务性代理的形式工作,主要从HotSpot虚拟机中获取Java虚拟机的运行相关信息。 # jhsdb clhsdb command line debugger hsdb ui debugger debugd --help to get more information jstack --help to get more information jmap --help to get more information jinfo --help to get more information jsnap --help to get more information jhsdb jmap模式查看JVM中堆对象的分配详情 # jhsdb jmap <no option> To print same info as Solaris pmap. --heap To print java heap summary. --binaryheap To dump java heap in hprof binary format.

Ubuntu下SU(seismic unix)安装教程

记录程序人生 环境:linux 我用的是 ubuntu 16.04 具体步骤: 1 . 下载Seismic unix安装包 // Download the seismic unix 链接: https://pan.baidu.com/s/1pEN27rycB_iA5kNneWf3mA 提取码: 1wsg 得到 cwp_su_all_41R3.tar.gz,然后用tar -zxvf cwp_su_all_41R3.tar.gz进行解压。 2 . 安装必要的依赖包 // install the necessary package sudo apt-get install build-essential sudo apt-get install libx11-dev sudo apt-get install libxt-dev sudo apt-get install freeglut3 sudo apt-get install freeglut3-dev sudo apt-get install libxmu-dev sudo apt-get install libxi-dev sudo apt-get install gfortran 3 . 设置环境变量 sudo gedit ~/.bashrc 在末尾处添加如下代码(其中 /home/yourname/su为解压的路径)

Ubuntu下Madagascar安装教程

从Madagascar安装开始 第一次使用CSDN记录程序人生 每次找资源都是直接搜索,但下一次遇到同样的问题还得摸索半天,实在麻烦。这是我第一次使用csdn来记录之前遇到的坑。 环境:linux 我用的是 ubuntu 16.04 具体步骤: 1 . 下载最新的Madagascar安装包 // Download the latest version of madagascar http://sourceforge.net/projects/rsf/files/madagascar/ 得到 madagascar-..tar.gz,然后用tar -zxvf madagascar-..tar.gz进行解压。 2 . 安装必要的依赖包 // install the necessary package sudo apt-get install libxaw7-dev freeglut3-dev libnetpbm10-dev libgd-dev libplplot-dev libavcodec-dev libcairo2-dev libjpeg-dev swig python-dev python-numpy g++ gfortran libopenmpi-dev libfftw3-dev libsuitesparse-dev python-epydoc 3 . 安装前配置 转到保存代码的头目录下(如 /home/abc/madagascar-.) ./configure --prefix=/home/abc/madagascar-*.* 建立c++,fortran90等链接(前提是这些选项已在系统中存在): ./configure API=c++,f90 --prefix=/home/abc/madagascar-*.* 4 . 编译安装: // run the code sudo make install 5 .

手机访问电脑本地html文件

如果用webstrom打开一个单独的页面,在浏览器中现实的地址是: http://localhost:63342/meipro-work/pages/active/findreset.html?_ijt=jhp5kumvugie2h6r0ublp089kf 如果这恰好是你正在开发的用于移动端的页面,想要在手机上访问以便于测试验证效果,怎么访问到呢? 在webstorm的setting中是有相关可设置的,只是我试了不好用 下面有几种办法: 如果你已经安装了全局的node.js,可以使用前两种方法。 1、http-server 手机地址输入电脑的ip加端口号8080即可访问本地编写的html页面(确保手机跟电脑在同一个局域网下) npm install -g http-server 在站点目录下开启命令行输入http-server,运行结果如下: Paste_Image.png 在浏览器中输入http://10.69.57.60:8080会访问meipro-work根目录下的页面,如果是子文件夹下的,修改相应路径就行了 2、browser-sync 文档说明 npm install -g browser-sync 安装成功后我们就可以在想要测试的文件目录下,在DOS窗口或者git bash输入: browser-sync start --server --files "css/.css, .html",即可开启服务 Paste_Image.png 3、nginx conf文件夹中名为nginx的配置文件,需要修改的地方有如下: server { listen 80; server_name localhost; location ~ ^([/\w-]+\.[/\w-]*)+$ { root E:/mei/rootfile; index index.html; } } 需要注意的是1,2是在根文件夹中运行命令,3是root的值就是本文件夹的路径 4、如果想访问vue项目在npm run build之后生成的文件 可以使用如下server.js放到vue项目的根目录下 var express = require('express'); var app = express(); app.use('/static',express.static(__dirname + '/start/static')); app.get('/', function(req, res){ res.sendFile(__dirname+'/start/index.html'); }); var server = app.

【js】js实现动态分页功能(拿来就能用)

1、动态分页功能(利用ajax获取的动态数据) 首先确保以下: 1)分页的前提是已经用 ajax 动态读取数据 ,显示在id = “trbody"中,如果没有的话就不用往下看了 2)代码中的 id=” " 不要修改,是对应 分页 中的 3)我自定义显示的是 每页显示 3 条数据(可以随便更改显示自己需要的) 4)默认显示的分页数字是 4 个,这个不要修改了,要修改的话需要改很多地方(缺点) 功能如下(样式是我自己的css): HTML 部分( demo.html ) ///table 表格 用来显示 ajax 的动态数据 <table id="tableSort"> <thead><tr><th/></th></tr></thead> <tbody id="trbody" > <!--数据库数据--> </tbody> </table> ///分页显示的位置 <span id="spanPre"><a>Previous</a></span> <div id="spbody" style="display: flex;"> <!--这里是显示的分页的数字页数--> </div> <span id="spanNext"><a>Next</a></span> <script src="js/fenye.js"></script> ///在 demo.html 中引入fenye.js js 部分( fenye.js ) //分页 //全局变量 var numCount; //数据总数量 var columnsCounts; //数据列数量 var pageCount; //每页显示的数量 var pageNum; //总页数 var currPageNum ; //当前页数 //页面标签变量 var blockTable; var preSpan; var firstSpan; //第一页 var nextSpan; var lastSpan; window.

idea中 VM options配置

点击Intellij IDEA 界面窗口Run,打开Edit Configuration,出现Run/Debug Configurations界面。Application server 选择安装Tomcat所在的文件夹,点击Configuration一般自动配置好了,其他的就按照图上的填写。 VM options这项需要我们自己填写,我填的是VM options : -Xms768m -Xmx768m -XX:PermSize=64M -XX:MaxPermSize=512m 每一项以空格隔开 参数说明 -Xms768m:设置JVM初始堆内存为768m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。 -Xmx768m:设置JVM最大堆内存为768m。 -Xss128k:设置每个线程的栈大小。JDK5.0以后每个线程栈大小为1M,之前每个线程栈大小为256K。应当根据应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。需要注意的是:当这个值被设置的较大(例如>2MB)时将会在很大程度上降低系统的性能。 -Xmn2g:设置年轻代大小为2G。在整个堆内存大小确定的情况下,增大年轻代将会减小年老代,反之亦然。此值关系到JVM垃圾回收,对系统性能影响较大,官方推荐配置为整个堆大小的3/8。 -XX:NewSize=1024m:设置年轻代初始值为1024M。 -XX:MaxNewSize=1024m:设置年轻代最大值为1024M。 -XX:PermSize=256m:设置持久代初始值为256M。 -XX:MaxPermSize=256m:设置持久代最大值为256M。 -XX:NewRatio=4:设置年轻代(包括1个Eden和2个Survivor区)与年老代的比值。表示年轻代比年老代为1:4。 -XX:SurvivorRatio=4:设置年轻代中Eden区与Survivor区的比值。表示2个Survivor区(JVM堆内存年轻代中默认有2个大小相等的Survivor区)与1个Eden区的比值为2:4,即1个Survivor区占整个年轻代大小的1/6。 -XX:MaxTenuringThreshold=7:表示一个对象如果在Survivor区(救助空间)移动了7次还没有被垃圾回收就进入年老代。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代,对于需要大量常驻内存的应用,这样做可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象在年轻代存活时间,增加对象在年轻代被垃圾回收的概率,减少Full GC的频率,这样做可以在某种程度上提高服务稳定性。 标准参数,所有JVM都必须支持这些参数的功能,而且向后兼容;例如: -client——设置JVM使用Client模式,特点是启动速度比较快,但运行时性能和内存管理效率不高,通常用于客户端应用程序或开发调试;在32位环境下直接运行Java程序默认启用该模式。 -server——设置JVM使Server模式,特点是启动速度比较慢,但运行时性能和内存管理效率很高,适用于生产环境。在具有64位能力的JDK环境下默认启用该模式。 非标准参数(-X),默认JVM实现这些参数的功能,但是并不保证所有JVM实现都满足,且不保证向后兼容; 非稳定参数(-XX),此类参数各个JVM实现会有所不同,将来可能会不被支持,需要慎重使用;

Linux服务器上vim not found 问题

vim是Linux下最常用的文本编译器,在终端输入vim时可能会出现,但是因为服务器一般都是大家公用的,时不时会有新的同学进来,操作失误导致vim无法正常使用了。 一般重新安装vim使用的就是一个命令: sudo apt-get install vim 但是,如果服务器之前就安装过vim,会有一些残余文件,再次重新安装就容易出现下列问题: The following packages have unmet dependencies: vim-gtk : Depends: vim-common (= 2:7.4.1689-3ubuntu1.3) but 2:7.4.1689-3ubuntu1.2 is to be installed Depends: vim-runtime (= 2:7.4.1689-3ubuntu1.3) but it is not going to be installed E: Unable to correct problems, you have held broken packages. 这种情况可以很容易读懂,就是说版本不同导致冲突,那么最好的解决方法就是删掉,然后重新安装(参考:博客) sudo apt-get purge vim-common 这里面的purge命令删除更加强效,会删除残余的文件。 之后按照下列操作,依次更新之后,重新安装vim即可。 sudo apt-get update sudo apt-get upgrade sudo apt-get install vim

OK-CC天天呼叫中心系统,外呼中心安装后如何使用

呼叫中心系统 OK-CC呼叫中心技术,采用软硬件结合的架构方式、及分布式的IP技术,从多角度为企业提供整合的一体化解决方案;由于新技术的应用,在提供优质高效的客户服务的同时,大大降低了运营成本,给企业的客户服务带来震撼性的变革,共同辅助企业树立优秀的品牌形象。 群呼系统 群呼系统综合了各行业不同企业厂商的不同需要而专门的设计的一个平台。该自动外呼营销系统能够有效的提高营销部门的工作效率、降低企业销售成本和方便管理人员对销售代表进行考核等功效。

Halcon 去除ROI边界区域region,和ROI边界有交集的部分

read_image (Image060gmWg105WMa120WWd230165mm, 'C:/Users/Administrator/Desktop/有隔弧片060GM+WG105-W+MA120-W WD230 165mm.bmp') set_system ('tsp_clip_region', 'false') draw_rectangle1 (200000, Row1, Column1, Row2, Column2) gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2) boundary (Rectangle, RegionBorder, 'inner') reduce_domain (Image060gmWg105WMa120WWd230165mm, Rectangle, ImageReduced) threshold (ImageReduced, Region, 120, 255) connection (Region, ConnectedRegions) gen_empty_obj (regions) count_obj (ConnectedRegions, Number) for Index := 1 to Number by 1 select_obj (ConnectedRegions, ObjectSelected, Index) intersection (ObjectSelected, RegionBorder, RegionIntersection1) area_center (RegionIntersection1, Area1, Row3, Column3) if (Area1==0) concat_obj(ObjectSelected,regions,regions) endif endfor

SAEJ1939-21数据链路层部分解读(第二部分)

传输协议连接管理消息: 这类消息用于建立和管理连接,以及控制数据流。 传输协议提供了6种传输协议连接管理消息:连接模式下的请求发送,连接模式下的准备发送,消息结束应答,放弃连接,以及广播公告消息。 1、连接模式下的请求发送(TP.CM_RTS):指定目标地址 字节: 1 控制字节=16,指定目标地址请求发送(RTS) 2,3 整个消息大小,字节数目 4 全部数据包的数目 5 保留给 SAE 设定使用,该字节应设为 FF16 6-8 所装载数据的参数群编号 2、连接模式下的准备发送(TP.CM_CTS):指定目标地址 字节: 1 控制字节=17,指定目标地址准备发送(CTS) 2 可发送的数据包数目 3 下一个将要发送的数据包编号 4,5 保留给 SAE 设定使用,该字节应设为 FF16 6-8 所装载数据的参数群编号 3、消息结束应答(TP.CM_EndofMsgAck):指定目标地址 字节: 1 控制字节=19,消息结束应答 28 2,3 整个消息大小,字节数目 4 全部数据包的数目 5 保留给 SAE 设定使用,该字节应设为 FF16 6-8 所装载数据的参数群编号 4、放弃连接(TP.CM_Abort):指定目标地址 字节: 1 控制字节=255,放弃连接 2-5 保留给 SAE 设定使用,该字节应设为 FF16 6-8 所装载数据的参数群编号 5、广播公告消息(TP.CM_BAM):全局目标地址 字节: 1 控制字节=32,广播公告消息(BAM) 2,3 整个消息大小,字节数目 4 全部数据包的数目 5 保留给 SAE 设定使用,该字节应设为 FF16

http://和www.前缀网站有什么具体区别?

转载自品略图书馆 http://www.pinlue.com/article/2019/03/1813/598231572617.html 将http://和www.放一起比较,是没有实际意义的。 一、http协议二、域名一、http协议 首先对于http://,这个其实只是一种协议;简单来说,就是先声明现在使用的是哪种方式来访问服务器上的内容。而除了http之外,还有ftp、https(http加上ssl,可以理解成http加上个安全锁)等协议方式。 举个例子:网站存储在服务器上的内容并不是我们打开网站时候的样子,而是由许多文件夹、源码文件(php、asp、jsp等)等内容组成,在服务器上的呈现方式和我们打开电脑看到硬盘上的文化是一样的。 只有使用http等相关协议,才可以在浏览器上呈现出具体的图像效果。但是倘若是使用ftp协议,那么打开出来的就是像电脑上的文件了(一般网站是打不开ftp,除非管理员开放ftp,以及提供账户密码)。 再形象一点,人是由许多的细胞构成,如果使用的是ftp协议那么看到的就是一堆细胞;只有通过http协议,才能看到完整的一个人形。 二、域名 什么是域名?比如baidu 、poren .org之类。其中.com是域名后缀,类似的还有.cn(中国域名后缀)、.org(非盈利机构)、.net(网络组织)等等。部分行业还会加上稳定的后缀,比如edu.cn(教育类,xmu.edu.cn厦门大学)、gov.cn(政府单位,mod.gov.cn国防部)等等。 而在这些域名中,如果加上www.(比如www.sina .com),一般是指网站的主站;与之对应的比如mail.sina .com是邮箱的登录网站、news.sina .com是新浪新闻,sina.com是顶级域名,mail.sina.com这些就是二级域名。如果再往后像old.mail.sina.com就是三级域名,以此类推。但不论是几级域名,在域名的前面肯定会有http://(或者https://)。 另外大家可能发现,并不是所有的网站主站都必须加上www.的,baidu .com和www.baidu .com一样都是可以用,甚至是www8.baidu .com也可以。但是为了更好收录以及出于其他方面的考虑,一般只使用其中一个作为主站域名,另外一个就使用301跳转之类的操作。对于大型的网站比较建议是使用www.baidu .com,至于小站倒无所谓,怎么好看怎么来(比如酋长即将使用的域名就不用www,直接poren.org)。 所以总的来说,http是一种网络访问协议,网站基于这个协议来保证正常访问;www是域名组成的其中一部分(非必须),起到网站具体主机位置的作用。 最后给大家稍微讲下域名与ip。一个网站的地址其实是一个ip,比如120.77.161.212这样的形式;但是对于电话号码都记不了多少的普遍大众,记一堆ip显然更麻烦,所以就发明了方便记忆的域名来绑定ip。 这就好比家庭地址,使用家里的具体地址,显然比背经纬度更方便。

CSS中图片居中显示不拉伸,且占满盒子大小

CSS中图片居中显示不拉伸,且占满盒子大小 <div class="img_box"> <img class="img" src='URL'/> </div> .img_box{ width:200px; height:200px; position:relative; } .img { max-width: 100%; max-height: 100%; position: absolute; top: 0; right: 0; bottom: 0; left: 0; margin: auto; display: block; }

React中input框为只读状态

React中input框只读状态 <input type="text" rereadOnly={true} defaultValue={“helloworld”} /> DOM事件:rereadOnly={true} 实现需求:"hello world"只可以被复制,不可以被修改

Python数据结构与算法笔记(八):数据结构——树,二叉树和AVL树

树 class Node: def __init__(self, name, type='dir'): self.name = name self.type = type #"dir" or "file" self.children = [] self.parent = None # 链式存储 def __repr__(self): return self.name class FileSystemTree: def __init__(self): self.root = Node("/") self.now = self.root def mkdir(self, name): # name 以 / 结尾 if name[-1] != "/": name += "/" node = Node(name) self.now.children.append(node) node.parent = self.now def ls(self): return self.now.children def cd(self, name): # "/var/python/" if name[-1] !

Python数据结构与算法笔记(七):数据结构——队列,链表和哈希表

队列 看成人在排队。 在出队到最后一个元素时,再想入队,使用列表可以在后面append,但是前面仍然占据着一部分内存,无法处理。想个办法让其收尾连成一个圈。 队列的实现方式:环形队列 判定一个队列是否为空,rear=front。最后一个图,rear和front之间空一位,是为了更好地判别这个队列是空的还是满的。 规定空的一块空间为队满。 对最大数取余,为0时,进入从0开始的索引。 class Queue: def __init__(self,size=100): self.queue = [0 for _ in range(size)] self.rear = 0 # 队尾指针 self.front = 0 # 队首指针 self.size = size def push(self,element): if not self.is_filled(): self.rear = (self.rear + 1) % self.size self.queue[self.rear] = element else: raise IndexError('Queue is filled.') def pop(self): if not self.is_empty(): self.front = (self.front + 1) % self.size return self.queue[self.front] else: raise IndexError('Queue is empty.

Celery介绍以及使用

文章目录 celery一、什么是celery1、celery是什么:2、使用场景3、Celery的优点4、Celery的安装 二、Celery执行异步任务1、创建异步任务执行文件(消费者)2、创建生产者文件3、创建result文件去获取任务函数的返回值,从而查看任务执行结果4、多目录结构5、异步任务和定时任务6、多目录结构下celery执行 三、Django中使用celery注意点概念介绍总体流程文件对应的代码 celery 转载地址:https://www.cnblogs.com/pyedu/p/12461819.html 视频讲解:https://www.bilibili.com/video/BV1Pa4y1Y7QN?p=1 一、什么是celery 1、celery是什么: celery是一个分布式队列的管理工具 celery是一个简单、灵活且可靠的,处理大量消息的分布式系统,专注于实时处理的异步任务队列,同时也支持任务调用 Celery的架构由三部分组成,消息中间件(message broker),任务执行单元(worker),任务执行结果存储(task result store) 2、使用场景 celery是一个强大的分布式任务队列的异步处理框架,它可以让任务的执行完全脱离主程序,甚至可以被分配到其他主机上运行。我们通常使用它来实现异步任务(async task)和定时任务(crontab)异步任务:将耗时操作任务提交给Celery去异步执行,比如发送短信/邮件、消息推送、音视频处理等等定时任务:定时执行某件事情,比如每天数据统计 3、Celery的优点 Simple简单:因为Celery作为一个对并发技术做了封装的框架,给别人使用和维护都不能做的很复杂,别人也不用太去了解底层的东西。Highly Available高可用:在分布式系统下,一定要做到高可用,保证分布式服务器中的程序对外供给的时间有一个最大的利用率,还要做到稳定Fast快速:单个Celery进程每分钟可以处理百万级的任务Flexible灵活:Celery几乎每个部分都可以扩展使用,自定义池实现、序列化、压缩方案、日志记录、调度器、消费者、生产者、broker传输等等。由于语法上调用比较简单,比如要将消息中间件由RabbitMQ换成Redis,则只需要去配置文件修改一下对应的IP和端口即可,其他配置都不太需要更改 4、Celery的安装 pip install -U Celery sudo easy_install Celery 二、Celery执行异步任务 1、创建异步任务执行文件(消费者) celery_task.py import celery import time # backend(后台),就是task result store backend = 'redis://127.0.0.1:6379/1' # broker 消息中间件 broker = 'redis://127.0.0.1:6379/2' # 实例化一个celery对象,test只是个名字,可以任意改 cel = celery.Celery('test', backend=backend, broker=broker) @cel.task # 使用celery中的装饰器将函数装饰成celery任务(可能是异步任务,可能是定时任务) def send_mail(name): print('向%s 发送邮件...'%name) time.sleep(5) print('向%s 发送邮件完成'%name) return 'ok' @cel.task def send_msg(name): print('向%s 发送短信.

爬虫实战爬取豆瓣电影Top250榜单电影

爬虫实战爬取豆瓣电影Top250榜单电影 实战内容:直接上代码,重要地方有注释。 from bs4 import BeautifulSoup import re import urllib.request,urllib.error import xlwt import sqlite3 def main(): baseurl = "https://movie.douban.com/top250?start=" #1.爬取网页 datalist = getData(baseurl) savepath = "豆瓣电影Top250.xls" #3.保存数据 saveData(datalist,savepath) #askURL("https://movie.douban.com/top250?start=") findlink = re.compile(r'<a href="(.*?)">')#影片详情链接 findImgSrc = re.compile(r'<img.*src="(.*?)"',re.S)#让换行符包含在字符中 #影片图片链接 findtitle = re.compile(r'<span class="title">(.*)</span>')#影片片名 findRating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')#影片评分 findJudge = re.compile(r'<span>(\d*)人评价</span>') findInq = re.compile(r'<span class="inq">(.*)</span>') findBd = re.compile(r'<p class="">(.*?)</p>',re.S) #爬取网页 def getData(baseurl): datalist = [] for i in range(0,10): url =baseurl + str(i*25) html = askURL(url) #2.

Vue中需要注意的地方

1. ESlint ESlint 是一个代码规范检查工具,它定义了很多特定的规则, 一旦你的代码违背了某一规则, ESlint 会作出非常有用的提示。ESlint提供以下支持:ES, JSX, style检查以及自定义错误和提示。 2. 组件化编码的基本流程 拆分组件实现静态组件实现动态组件 初始化显示 动态交互(写交互要先给目标元素绑定监听) 动态组件的实现还主要包括实现初始化显示和动态交互功能。 此外还要对在编码时所使用的数据确定数据名称,定义数据的类型。同时还要分析对于这个数据是某一个组件需要还是某些组件需要。 3. 模板字符串(ES6) window.confirm(`确定删除${comment.name}的评论吗?`) 模板字符串(template string)是增强版的字符串,用反引号(`)标识。它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量。 4. 鼠标滑入/滑出监听 mouseenter/mouseleave 对当前元素及其内部元素都有效。 mouseover/mouseout 只对当前元素有效,对内部元素无效。 5. 数据存储(localStorage) localStorage 和 sessionStorage 属性允许在浏览器中存储 key-value 对的数据。localStorage 用于长久保存整个网站的数据,保存的数据没有过期时间,直到手动去删除。localStorage 属性是只读的。在使用数据存储时要先分析数据的存储和读取时间。使用深度监视能够监视内部的任何改变。 watch: { todos: { deep: true, // 深度监视 handler: function (value) { // 将todos最新的值的JSON数据格式保存到localStorage中 window.localStorage.setItem('todos_key', JSON.stringify(value)) } } } 当要保存的数据为数组或对象类型时,要先用JSON.stringify()转换为JSON格式,在window.localStorage.getItem时再使用JSON.parse()转换回源格式。 6. 其他 写函数方法时要分析确定到底要不要传形参,如果要传的话传的是什么,参数是一个还是多个,名字叫什么。当既要读这个数据又要监视数据的变化就要想到使用计算属性。深度监视:能够监视内部任何的改变

网页前端与java后台的json数据交互

涉及技术 html+js+jquery+java+tomcat json的java解析工具jar包(maven依赖)(这个不是一定需要的): <!--主要使用jsonobject类,--> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.28</version> </dependency> 1,web后台向前端发送json数据 java本身是没有json数据格式的,利用的是第三方实现的类JSONObject。其实直接向网页传送json字符串也是可以的。 JSONObject传送: //设置字符格式 response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); //创建json并向里面添加数据 JSONObject json=new JSONObject(); json.put("name","精灵公主"); json.put("age","18"); json.put("words","夜空越暗,星星越亮"); //向请求数据的网页回应数据 PrintWriter printWriter= null; printWriter = response.getWriter(); printWriter.print(json); printWriter.flush(); printWriter.close(); 直接访问得到的是json数据。我自己的servlet类对外访问路径是/QingDataServlet。 html页面: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="../jq/jquery-3.4.1.min.js"></script> </head> <body> </body> <script> $(document).ready(function () { $.getJSON("/QingDataServlet",function (datas) { console.log(datas); for (var data in datas){ console.log(data+"="+datas[data]); } }); }); </script> </html> 运行调试结果: 字符串直接传送: 其实java后台是直接传送json数据格式的字符串。所以我们只要传个json数据的字符串就可以了。比如下面的:

无刷直流电机反电动势过零检测_TI电机库源码

FOC中的Clarke变换_TI和ST电机控制库的源码实现 FOC中的PARK变换_TI和ST电机控制库的源码实现 FOC中的反PARK变换_TI和ST电机控制库的源码实现 1.位置信息 无刷电机的控制不可脱离转子的位置信息。知道转子的位置反馈是对无刷电机控制的前提。通常分为有感和无感。 有感:即为有位置传感器,像霍尔、光电增量式编码器、旋转变压器、磁编等等。 无感:则是电机不需要位置传感器,通过电机自身的信息计算或则估计转子的位置。 2.无感的方法 基于模型法的位置/转速观测器有三部分,反电动势、磁链信息观测、位置误差信号解耦位置/转速观测。反电动势或磁链信息观测方法的不同,模型有自适应法、扩展卡尔曼滤波器法、磁链观测法、状态观测法、滑膜观测法。 反电动势过零检测法应用广泛,实现简单、技术成熟。 3.反电动势过零检测 3.1反电动势过零检测法基本原理: 忽略电动机电枢反应,无刷直流电动机在稳态运行过程中,通过检测关断相的反电动势过零点获得转子的位置信号,进行对逆变器开关导通顺序切换,控制电机运动。 3.2缺点: 电机静止和低速时,反电动势很小或者为0,无法获取转子位置信号,电机低速时性能较差,启动时需要开环启动。 3.3硬件电路 反电动势图: 正向反电动势过零点变化: 反电动势零点变化趋势C-C相反电动势又正到负B+B相反电动势又负到正A-A相反电动势又正到负C+C相反电动势又负到正B-B相反电动势又正到负A+A相反电动势又负到正 3.4电路计算: 可以直接得到电机端的电压方程: { U A = R i A + L d i A d t + e A + U N U B = R i B + L d i B d t + e B + U N U C = R i C + L d i C d t + e C + U N ① \left\{ \begin{array}{l} U_A=Ri_A+L\frac{di_A}{dt}+e_A+U_N\\ U_B=Ri_B+L\frac{di_B}{dt}+e_B+U_N\\ U_C=Ri_C+L\frac{di_C}{dt}+e_C+U_N\\ \end{array} \right.

【收藏】RPM包制作和spec文件详解

1、How to create an RPM package/zh-cn https://fedoraproject.org/wiki/How_to_create_an_RPM_package/zh-cn#RPM_.E5.9F.BA.E7.A1.80.E7.9F.A5.E8.AF.86 目录清晰,知识点全面 2、CSDN : RPM打包原理、示例、详解及备查 https://blog.csdn.net/get_set/article/details/53453320 根据spec文件编写逻辑排序,针对每个目录讲解详细,包含各种spec文件需要的宏含义。

vue移动端项目中使用postcss-pxtorem进行适配方案

首先,我们先使用vue-cli创建一个初始化的vue项目。 vue create hello-world 当项目创建好以后,我们在根目录下新建一个vue.config.js,想必大家也都懂这个文件是干什么的。 既然是使用postcss-pxtorem对移动端项目进行适配,那肯定先要安装它,于是我们在电脑上敲下这行命令 npm install postcss-pxtorem -D postcss-pxtorem有一个好伙伴amfe-flexible,也需要一并安装。 npm install amfe-flexible -D 当我们安装好这两个依赖以后呢,我们就要使用它们了,先在main.js中引入amfe-flexible import Vue from 'vue' import App from './App.vue' import router from './router' import store from './store' // 引入amfe-flexible import 'amfe-flexible/index' Vue.config.productionTip = false new Vue({ router, store, render: h => h(App) }).$mount('#app') 然后我们在vue.config.js文件中对postcss-pxtorem进行配置。 const autoprefixer = require('autoprefixer') // 这个依赖不用安装 const pxtorem = require('postcss-pxtorem') module.exports = { css: { loaderOptions: { postcss: { plugins: [ autoprefixer(), pxtorem({ rootValue: 37.

推荐一款技术人必备的接口测试神器:Apifox

推荐阅读: 这套Github上40K+star学习笔记,可以帮你搞定95%以上的Java面试 毫不夸张的说,这份SpringBoot学习指南能解决你遇到的98%的问题 最全面试题新鲜出炉:70+算法题、近30种大厂面试笔试常考知识点 1. 背景 作为互联网行业技术从业者,接口调试是必不可少的一项技能,通常我们都会选择使用 Postman 这类工具来进行接口调试,在接口调试方面 Postman 做的确实非常出色。 但是在整个软件开发过程中,接口调试只是其中的一部分,还有很多事情 Postman 是无法完成的,或者无法高效完成,比如:接口文档定义、Mock 数据、接口自动化测试等等。 今天给大家推荐的一款神器: Apifox,它是集:接口文档管理、接口调试、Mock、接口自动化测试于一体的。有的读者乍一看,会觉得和YAPI有点类似,但两者在功能特色上,只能说是各有千秋的。 细心的读者,会发现文章,正文干货还没有开始,就已经为大家推荐了三款效率神器: Apifox、Postwoman、YAPI。 2. 聊一聊接口管理的现状 对于接口管理的现状来说,目前行业大部分采取的解决方案有如下几种: 使用 Swagger 管理接口文档。 使用 Postman 调试接口。 使用 RAP或Easy Mock来进行 Mock 数据。 使用 JMeter 做接口自动化测试。 上述的接口管理手段,咋一看,貌似没有什么问题,但仔细分析,不难发现,当中存在的问题还真不少,比如要维护不同工具,并且这些工具之间数据一致性非常困难、非常低效。这里不仅仅是工作量的问题,更大的问题是多个系统之间数据不一致,导致协作低效,频繁出问题,开发人员、测试人员痛苦不堪。 设想一下这样的一个协作流程: 开发人员在 Swagger 定义好文档后,接口调试的时候还需要去 Postman 再定义一遍。前端开发 Mock 数据的时候又要去 RAP 或Easy Mock定义一遍,手动设置好 Mock 规则。测试人员需要去 JMeter 定义一遍。前端根据 RAP 或Easy Mock定义 Mock 出来的数据开发完,后端根据 Swagger 定义的接口文档开发完,各自测试测试通过了,本以为可以马上上线,结果一对接发现各种问题:原来开发过程中接口变更,只修改了 Swagger,但是没有及时同步修改 RAP 或Easy Mock。同样,测试在 JMeter 写好的测试用例,真正运行的时候也会发现各种不一致。时间久了,各种不一致会越来越严重。 3. Apifor介绍 官方对Apifor定位,Apifox = Postman + Swagger + Mock + JMeter,如下图所示

css中的position定位

前言: 在画页面时遇到一个问题,用element-ui的图片放大查看大图的时候,放大后的图片仍然显示在小图的div中,而不是视口大小。在调试工具中排查问题,发现当把图片div的transform属性去掉之后,元素定位正常在视口,如果添加了transform属性,则仍旧显示在小图的视图div中。查看文档后发现是fixed定位的条件限制。 position属性用于指定一个元素在文档中的定位方式。定位属性:top right bottom left 决定了元素的最终显示位置。 1. 定位类型 相对定位 relative绝对定位 absolute fixed粘性定位 stickily 2. 定位后的尺寸 width和height被设定为auto后的绝对定位的元素,会按其内容大小调整尺寸。此外,被绝对定位的元素,可以通过设置top + bottom开保留height未指定的height高度,left + right来指定水平的weight宽度,并且如果原来设置了weight和height,仍以定位的宽高为准。 如果 top 和 bottom 都被指定(严格来说,这里指定的值不能为 auto ),top 优先。如果指定了 left 和 right ,当 direction设置为 ltr(水平书写的中文、英语)时 left 优先, 当direction设置为 rtl(阿拉伯语、希伯来语、波斯语由右向左书写)时 right 优先。 3. 取值 3.1 static (默认)元素在文档常规流中当前的布局位置。 3.2 relative 元素先放置在未添加定位时的位置,再在不改变页面布局的前提下调整元素位置,相对定位的元素并未脱离文档流(因此会在此元素未添加定位时所在位置留下空白)。 position:relative 对 table-*-group, table-row, table-column, table-cell, table-caption 元素无效。 3.3 absolute 元素会被移出正常文档流,并不为元素预留空间,通过指定元素相对于最近的非 static 定位祖先元素的偏移,来确定元素位置。绝对定位的元素可以设置外边距(margins),且不会与其他边距合并。元素会跟随页面的滚动而滚动。 3.4 fixed 元素会被移出正常文档流,并不为元素预留空间,而是通过指定元素相对于屏幕视口(viewport)的位置来指定元素位置。元素的位置在屏幕滚动时不会改变。打印时,元素会出现在的每页的固定位置。fixed 属性会创建新的层叠上下文。当元素祖先的 transform, perspective 或 filter 属性非 none 时,容器由视口改为该祖先。元素不会根据页面的滚动而滚动。

SAEJ1939-21数据链路层部分解读(第一部分)

OSI在SAEJ1939中的应用: 应用层->网络层->数据链路->介质访问控制->物理层。 对应: 优先级,R,DP,PF,SA,数据->一个或多个PDU->一个或多个CAN数据帧。 R是保留位,DP是数据页,PF是PDU格式,PS是特定PDU,SA是源地址。CAN是控制器局域网,ID是标识符,P是优先级,GE是群扩展,DA是目标地址,RTR是远程运输请求。SA是帧起始。 PDU(协议数据单元),它定义了一个框架,框架里组成一些要发送消息并放入CAN数据帧。通过物理介质传送到网络设备。 PF是PDU格式,既是确定PDU格式的8位构成于,也是确定数据域对应的参数群编号的域。 如果消息大于8字节,必须分组封装发送。小于8字节,使用单个CAN数据帧。 PS是特定的PDU,取决于PDU的格式。它可能是目标地址DA,可能是群扩展GE。如果PF值小于240,它是目标地址;在240和255之间,它就是群扩展。 SA源地址,它的域长8位,一个源地址只能匹配一个设备。 数据域:长度在0到8字节的数据,它表示一个给定参数群是,可用CAN数据帧全部的的8个字节。 长度在9到1785个字节时,数据通信通过多个CAN数据帧实现。会使用传输协议功能 PDU1格式:适用于参数群被发送到特定目的地和全局目的地。 PDU2格式:只能用在作为全局消息的参数组通信中。它的消息的值在240到255之间,值为255留做专用 消息类型:命令,请求,广播/响应,确认和群扩展 命令:消息类型包括哪些从源地址命令特定目的地或全局目的地的参数群,目的地接收到关于命令类型的消息应采取特定的动作。 它的类型消息包括传动控制、地址请求、扭矩/速度控制等。 请求:消息类型包括了从全局范围到特定目的地请求信息的功能。 广播/响应:消息类型是某设备主动提供的消息广播,也可能是命令或请求的响应。 确认:两种形式。第一种由CAN协议规定,它是确认消息已被至少一个节点接收的“帧内”确认组成。第二种由应用层规定,对于特定命令、请求的普通广播或ACK或NACK响应。 群功能:此消息类型用于一组特殊功能(如专用功能、网络管理功能、多组传输功能等)。专用群功能规定另一个在传输专用消息过程中消除不同制造商之间CAN标识符的方法,同时也规定 了当需要接收员和识别专用消息的方法。 消息优先级:CAN标识符的值决定了消息优先级。较小值0具有较高的优先级,值最大的CAN标识符优先级却是最低的。 总线访问:总线空闲时,任何节点都可以传送数据帧。假如两个或者两个以上的节点要同时传送数据帧,总线访问冲出用CAN数据帧的标识符通过仲裁来解决。 争夺仲裁:仲裁过程中。每个传送者对传输位级别和总线上的被监控的级别进行比较。若两者相等,节点继续发送。发送“隐性”电平而检测到“显性”电平时,节点会失去仲裁,必须取消发送数据。当发送“显性”电平而检测到“隐性”电平时,节点则检测到一个位错。 错误检测:监控(传送者对发送位电平和总线检测的位电平进行比较)。 源地址和参数群编号的分配过程: 参数群使用 PDU1 或者 PDU2 格式来进行专门分配。一旦为参数群分配了其中一种格式,则另外一种格式就不 可分配给该参数群。当需要发送一个参数群到某个指定的目标地址时,必须使用 PDU1 格式。 **地址分配准则:**在 SAE J1939 中,未被分配的地址数目是有限的,因此必须有效地分配新的地址。在整个系统中,可分配的地址数目最大不能超过 256。 参数群设定准则: a. PDU1 格式(PS=允许指定目的地通讯的目标地址) b. PDU2 格式通讯(PS=群扩展) c. 使用两个预定义的专用参数群编号的专用通讯 PDU2 格式通讯应用于以下场合: a. 从一个或多个源地址发送消息到一个目标地址 b. 从一个或多个源地址发送消息到多个目标地址 PDU2 格式通讯不能用于发送消息到众多目标地址中的一个。 通过使用专用的参数群编号实现了第三种通讯方法,专用通讯。有一个参数群编号被分配用于非指定目的地专用通讯,而另一个参数群编号被分配用于指定目的地专用通讯。 专用通讯应用于以下两种情况: a. 在不需要进行标准通讯的场合 b. 在进行专用信息通讯很重要的场合 数据域的定义: 基于 CAN 的系统中,最短的消息也需要全部使用数据域(全部 8 个字节)。除非是

uniapp引入本地图片

注意使用相对路径,需要require <image class="" mode="aspectFill" :lazy-load="true" :src="require('./img/beauty.png')" />

SPI 机制原理

SPI 机制原理 Java SPI 机制使用介绍 Dubbo SPI 机制标签@SPI 用法标签@Activate 用法标签@Adaptive 用法 总结 因 dubbo 框架是建立的 SPI 机制上,因此在探寻 dubbo 框架源码前,我们需要先把 SPI 机制了解透彻 Java SPI 机制 SPI 全称 Service Provider Interface,是 Java 提供的一套用来被第三方实现或者扩展的 API,它可以用来启用框架扩展和替换组件。 可以看到,SPI 的本质,其实是帮助程序,为某个特定的接口寻找它的实现类。而且哪些实现类的会加载,是个动态过程(不是提前预定好的)。有点类似 IOC 的思想,就是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要。所以 SPI 的核心思想就是解耦。 使用介绍 要使用 Java SPI,需要遵循如下约定: 当服务提供者提供了接口的一种具体实现后,在 jar 包的META-INF/services 目录下创建一个以“接口全限定名”为命名的文件,内容为实现类的全限定名;接口实现类所在的 jar 包放在主程序的 classpath 中;主程序通过 java.util.ServiceLoder 动态装载实现模块,它通过扫描META-INF/services 目录下的配置文件找到实现类的全限定名,把类加载到 JVM;SPI 的实现类必须携带一个不带参数的构造方法; 示例 先定义一个接口 public interface InfoService { Object sayHello(String name) ; } 在定义几个实现类 public class InfoServiceAImpl implements InfoService { @Override public Object sayHello(String name) { System.

java.lang.StackOverflowError: null解决方法

栈内存溢出问题 我在使用SpringBoot框架进行web开发时遇见了这个问题,出现这个问题的原因是由于深度递归,抛出此错误以指示应用程序的堆栈已耗尽。 在递归中,一个方法在执行期间调用自己。递归被认为是一种强大的通用编程技术,但必须谨慎使用,StackOverflowError以避免这种情况。 解决的方法是检查service的实现类里面是否调用了这个类中的方法,例如,下面是我的代码,我在service里面声明了一个toListIds()的方法,然后在这个service类的另一个方法里面调用了这个方法造成了栈内存溢出,应该修改成下面的样式 @Override public List<Tag> findTagById(String ids) { return tagRepository.findAllById(toListIds(ids)); } public List<Long> toListIds(String ids){ List<Long> list = new ArrayList<>(); if(!"".equals(ids) && ids != null){ String[] arr = ids.split(","); for(String a : arr){ list.add(new Long(a)); } } return list; } @Override public List<Tag> findTagById(String ids) { List<Long> list = new ArrayList<>(); if(!"".equals(ids) && ids != null){ String[] arr = ids.split(","); for(String a : arr){ list.add(new Long(a)); } } return tagRepository.

解决报错 Docker无法启动

启动docker服务 systemctl start docker.service 错误信息 Job for docker.service failed because the control process exited with error code. See “systemctl status docker.service” and “journalctl -xe” for details. 提示执行systemctl status docker.service and journalctl -xe 对我来说,看了和没看差不多,没有有用信息,需要查找详细日志才能得出结论。 这里我们不去找日志,让错误简单的输出到终端。 vim /usr/lib/systemd/system/docker.service 找到ExecStart=/usr/bin/dockerd这一行 复制下来,如果有参数也带上参数,去终端命令行执行,这样会直观的看到运行和错误信息.(不太unix socket 参数) 我的错误是stored UUID 和 Current Base UUID 不一致导致的, stored UUID 存储在 /var/lib/docker/devicemapper/metadata/deviceset-metadata 替换成Current Base Device UUID即可。 每个人的错误不一样,知道错误,搜索解决方案就可以了。

Linux搭建主主后没有同步数据,报Slave I/O for channel ‘‘错误

数据没有同步之后,查看日志看到错误(为了好看换行了) Slave I/O for channel '': error connecting to master 'repl@192.168.0.104:3306' - retry- time: 60 retries: 24 message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection. Error_code: MY-002061 查看错误大概意思就是连不上 repl是搭建主主的同步账号名, 在被同步的主机上用repl登录一下MySQL就行了 我的报错连不上192.168.0.104,在192.168.0.104服务器上登录 mysql -u repl -p 密码

Windows下 VSCode配置cuda编译环境

Windows系统下,在Visual Studio 里配置CUDA环境网上已经有很多资料了,而在轻量级IDE VScode上编译CUDA的材料不是很多,本篇博文将简要介绍在Windows 系统下配置CUDA环境的方法。 一、VScode插件 code-runner法 在VScode里安装插件——coder-runner,在settings.json里添加(win10下的) "code-runner.executorMap": { "cu": "cd $dir; nvcc $fileName -o $fileNameWithoutExt.exe -I'C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v9.0\\include' && $dir$fileNameWithoutExt" }, // 右键 win7下的(注意win7 和win 10 下的不太一样,之前的博文里有提到过) "code-runner.executorMap": { "cu": "cd $dir && nvcc $fileName -o $fileNameWithoutExt.exe -I'C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v9.0\\include' && $dir$fileNameWithoutExt" }, // 右键 注意:这里的settings.json 是当前工作目录 .vscode 目录下(没有自己创建,自己写也可以)的设置文件,是局部的,如果需要全局通用的话,则转到全局settings.json 文件里修改。 上面的命令里比较关键的地方在于 nvcc——指定编译器(这里直接使用是因为已经在系统环境变量里添加了nvcc的地址了,否则这里需要把nvcc所在的路径写全),其次 -I (大写的i)为指定include文件路径,用 ' 而不是 " 是因为语句已经被 " "包含了。此外如果还需要使用链接库的话,还需要加 -l 和 -L 来分别指定需要的库名称,和库所在的位置。具体参考博文:https://www.

uds协议之can总线程序升级

1.什么是UDS协议 UDS(Unified Diagnostic Services,统一的诊断服务)协议是在汽车电子ECU环境下的一种通用诊断协议,属于应用层的协议。可在不同的汽车总线上实现(如CAN、LIN、Flexray和Internet等),但目前大部分汽车厂商都是基于can总线的uds应用。 更详细的介绍可参考: https://blog.csdn.net/u012252959/article/details/83063899 https://zhuanlan.zhihu.com/p/72543808 2.如何通过UDS协议进行程序升级 UDS协议其本质其实就是一种请求-响应(Request/Response)的交互协议,主要是对candata部分内容进行了统一定义,ECU会根据收到的不同请求内容,执行不同的操作或响应不同的数据。而这个“不同的请求内容”实际上就是我们所说的诊断服务ID及其附带的一些参数。UDS的服务ID种类大致可分为如下几类: 而我们进行程序升级要用到的服务ID毫无疑问就是0x34、0x36、0x37这三个服务了。 0x34请求下载服务参考:https://zhuanlan.zhihu.com/p/107889509 0x36数据传输服务参考:https://zhuanlan.zhihu.com/p/108100282 0x37请求退出传输服务参考:https://zhuanlan.zhihu.com/p/108124762 整个数据上传、下载流程参考:https://blog.csdn.net/u012252959/article/details/83077069 除此之外,还需用到0x10会话控制服务,用于切换会话模式。(不同的会话模式、对服务的响应权限不一样,比如必须在编程模式下,ECU才能响应上传下载功能单元的服务) 下图为会话模式的种类: 0x10会话控制服务参考:https://zhuanlan.zhihu.com/p/84609132 除会话控制外,0x27安全访问服务也有用到。一般情况下,需要通过安全服务的认证,ECU才允许进行数据下载操作。 安全服务认证方式首先由客户端向ECU发送请求,获取随机码(种子),客户端收到随机码后,按照双方约定好的算法进行计算得到秘钥值,客户端再将这个值发送给ECU,进行安全认证(如果算法相同,则计算出的结果相同,ECU回复肯定响应)。 具体可参考:https://zhuanlan.zhihu.com/p/88651234 此外,0x31例行控制服务也是必须的。比如:升级前需要通过该服务确认ECU的可编程性,每次进行程序块下载前需要调用该服务进行程序擦除操作,下载完成后需要通过该服务检查程序的完整性,检测是否可以正常运行。(具体的routineIdentifier及其含义一般由车厂执行定义) 详细可参考: https://blog.csdn.net/weixin_44536482/article/details/94866212 3.升级流程 升级流程可参考: 4.升级数据CAN报文分析与UDS协议学习 0x10会话控制: 其中,0x791为客户端发送至ECU的的CANID,0x799为ECU响应客户端的CANID,一般由汽车厂商自行定义。0x7DF为uds定义的功能地址,用于一对多发送诊断服务请求。 数据请求中,02代表长度,10 代表0x10服务ID,01和03分别代表要切换的会话模式。 0x27安全访问: 0x31例行控制: 该数据包为多帧格式,其中10中的高位1表示该帧数据为连续帧,低位0和第二个字节(0x00D)为该包连续帧数据的长度。31为服务ID,01位启动指令,之后的数据含义由汽车厂商执行定义(如此处 FF 00 表示擦除程序, 44 高位表示擦除首地址长度为4bytes,擦除数据长度为4byte,其后1byte 00 及 连续帧 F9 80 08 为擦除地址, 00 00 00 58为擦除长度) 其中21中的高位2表示该帧为连续帧,低位1为连续帧的序列,范围从1增至F后归零,依次反复。 其中30表示该帧为流控帧,用于告知发送方是否可以继续传输消息、接收方一次能接收的数据最大量以及两个连续帧之间的最小时间间隔。 0x34/0x36/0x37 数据下载: 如上图所示,红色表示写入的数据内容。5A表示连续帧数据长度(包含数据内容长度0x58+两个字节(36 01),其中36为服务ID,01为块序列号,每发送一段数据块后自增,增至FF后归零) 上述Execl记录的完整UDS升级抓包数据下载:https://download.csdn.net/download/fangye945a/19322702

EMC | 静电防护方法

1、并联放电器件 常用的放电器件有TVS,齐纳二极管,压敏电阻,气体放电管等。如图 1.1、齐纳二极管( Zener Diodes ,也称稳压二极管 ) :利用齐纳二极管的反向击穿特性可以保护 ESD敏感器件。但是齐纳二极管通常有几十 pF 的电容,这对于高速信号(例如 500MHz)而言,会引起信号畸变。齐纳二极管对电源上的浪涌也有很好的吸收作用。 1.2、瞬变电压消除器 TVS(Transient Voltage Suppressor):TVS 是一种固态二极管,专门用于防止 ESD 瞬态电压破坏敏感的半导体器件。与传统的齐纳二极管相比, TVS 二极管 P/N 结面积更大,这一结构上的改进使 TVS 具有更强的高压承受能力,同时也降低了电压截止率,因而对于保护手持设备低工作电压回路的安全具有更好效果。 TVS二极管的瞬态功率和瞬态电流性能与结的面积成正比。该二极管的结具有较大的截面积,可以处理闪电和 ESD所引起的高瞬态电流。TVS也会有结电容,通常0.3个pF到几十个pF。TVS有单极性的和双极性的,使用时要注意。手机上用的TVS大约0.01$,低容值的约2-3分$。 1.3、多层金属氧化物结构器件 (MLV):大陆一般称为压敏电阻。MLV也可以进行有效的瞬时高压冲击抑制,此类器件具有非线性电压 - 电流 ( 阻抗表现 ) 关系,截止电压可达最初中止电压的 2 ~ 3倍。这种特性适合用于对电压不太敏感的线路和器件的静电或浪涌保护,如电源回路,按键输入端等。手机用压敏电阻约0.0015$,大约是TVS价格的1/6,但是防护效果没有TVS好,且压敏电阻有寿命老化。 2、串联阻抗 一般可以通过串联电阻或者磁珠来限制ESD放电电流,达到防静电的目的。如图。如手机的高输入阻抗的端口可以串1K欧电阻来防护,如ADC,输入的GPIO,按键等。不要担心0402的电阻会被打坏,实践证明是打不坏的。这里不详细分析。用电阻做ESD防护几乎不增加成本。如果用磁珠,磁珠的价格大 约0.002$,和压敏电阻差不多。 3、增加滤波网络 前面提到了静电的能量频谱,如果用滤波器滤掉主要的能量也能达到静电防护的目的。 对于低频信号,如GPIO输入,ADC,音频输入可以用1k+1000PF的电容来做静电防护,成本可以忽略,性能不比压敏电阻差,如果用1K+50PF的压敏电阻(下面讲的复合防护措施),效果更好,经验证明这样防护效果有时超过TVS。 对于射频天线的微波信号,如果用TVS管,压敏等容性器件来做静电防护,射频信号会被衰减,因此要求TVS的电容很低,这样增加ESD措施的成本。对于微波信号可以对地并联一个几十nH的电感来为静电提供一个放电通道,对微波信号几乎没有影响,对于900MHZ和1800MHz的手机经常用22nH的电感。这样能把静电主要能量频谱上的能量吸收掉很多。 4、复合防护 有一种器件叫EMI filter,他有很好的ESD防护效果,如图。EMI filter也有基于TVS管的和基于压敏电阻的,前者效果好,但很贵,后者廉价,一般4路基于压敏电阻的EMI价格在0.02$。 实际应用中可以用下面的一个电阻+一个压敏电阻的方式。他既有低通滤波器的功能,又有压敏电阻的功能,还有电阻串联限流的功能。是性价比最好的防护方式,对于高阻信号可以采用1K电阻+50PF压敏;对于耳机等音频输出信号可以采用100欧电阻+压敏电阻;对于TP信号串联电阻不能太大否则影响TP的线性,可以采用10欧电阻。虽然电阻小了,低通滤波器效果已经没有了,但限流作用还是很重要的。 5、增加吸收回路 可以在敏感信号附件增加地的漏铜,来吸收静电。道理和避雷针原理一样。在信号线上放置尖端放电点(火花隙)在山寨手机设计中也经常应用。 本文来自网络,如有侵权联系删除

安装k8s 抛出异常提示Unable to locate package kubectl

在ubuntu上安装k8s ,当执行命令 apt-get install -y kubelet kubeadm kubectl 抛出如下异常提示 然后参照官方文档去操作,执行命令 echo “deb https://apt.kubernetes.io/ kubernetes-xenial main” | sudo tee /etc/apt/sources.list.d/kubernetes.list 在执行命令 sudo apt-get update 又出现了异常提示 这个是因为官方镜像地址需要能访问国外网的,没有翻墙,国内是连接不上的 改为国内的镜像地址 echo “deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main” | sudo tee /etc/apt/sources.list.d/kubernetes.list 在执行命令 sudo apt-get update 这样就能解决这个加载的问题 E: Unable to locate package kubelet E: Unable to locate package kubeadm E: Unable to locate package kubectl

Dubbo基础使用

Dubbo基础使用 Dubbo服务的角色关系Dubbo的基础配置使用xml 配置方式服务端代码示例客户端代码示例 注解方式 Dubbo高级特性启动时检查Dubbo 超时重连集群容错负载均衡配置结果缓存 服务分组多版本只订阅/只注册异步调用事件通知 服务拆分最佳实现 在上面的章节,我们重点详述了,一个具体的 RPC 调用的全过程。那么在现 实工作中,服务节点间的 RPC 调用是非常普遍并且错踪复杂的 我们除了要关心 RPC 的过程实现,还需要考虑: 服务方是集群时,如何挑选一台机器来响应客户端?因网络抖动引起的调用失败,如何重试来弥补?服务方机器的动态增减,如何能够让客户端及时了解到并做出调整? … Dubbo 的使命,即是解决上述围绕 RPC 过程的问题 Dubbo服务的角色关系 节点角色说明: 调用关系说明: 服务容器负责启动,加载,运行服务提供者。服务提供者在启动时,向注册中心注册自己提供的服务。服务消费者在启动时,向注册中心订阅自己所需的服务。注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将 基于长连接推送变更数据给消费者。服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供 者进行调用,如果调用失败,再选另一台调用。服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟 发送一次统计数据到监控中心。 Dubbo的基础配置使用 xml 配置方式 <dubbo:service/> 服务配置,用于暴露一个服务,定义服务的元信息,一个服务可以用多个协议暴露,一个服务也可 以注册到多个注册中心。 <dubbo:reference/> 引用配置,用于创建一个远程服务代理,一个引用可以指向多个注册中心。 <dubbo:protocol/> 协议配置,用于配置提供服务的协议信息,协议由提供方指定,消费方被动接受。 <dubbo:application/> 应用配置,用于配置当前应用信息,不管该应用是提供者还是消费者。 <dubbo:registry/> 注册中心配置,用于配置连接注册中心相关信息。 dubbo:module/ 模块配置,用于配置当前模块信息,可选。 <dubbo:monitor/> 监控中心配置,用于配置连接监控中心相关信息,可选。 <dubbo:provider/> 提供方的缺省值,当 ProtocolConfig 和 ServiceConfig 某属性没有配置时,采用此缺省值,可选。 <dubbo:consumer/> 消费方缺省配置,当 ReferenceConfig 某属性没有配置时,采用此缺省值,可选。 <dubbo:method/> 方法配置,用于 ServiceConfig 和 ReferenceConfig 指定方法级的配置信息。 <dubbo:argument/> 用于指定方法参数配置。 引入pom依赖 <!--zk --> <dependency> <groupId>org.