Hadoop各种版本的百度网盘下载

点个赞再走呗 多谢 下载链接:https://www-eu.apache.org/dist/hadoop/common/ 我已经下载了并存放在网盘中,说好的是开源的,结果有的人就是需要给积分才让你下载。充分贯彻开源 链接:https://pan.baidu.com/s/1XvL_jas1yVniE-FNQnZNWg 提取码:8ab2 复制这段内容后打开百度网盘手机App,操作更方便哦

C语言学习系列十二——循环结构程序设计

循环程序实现要点 哪些操作需要反复执行——循环体在什么情况下执行——循环控制条件 三种循环语句 for语句(实现给定了循环次数)whiledo while(先经循环体运算一次) 例4-8-1 #include<stdio.h> int main() { int i,mark,max,n; printf("Enter n:" ); scanf("%d",&n); printf("Enter %d marks",n); scanf("%d" , &mark); max=mark; for(i=1; i<n; i++){ scanf("%d",&mark); if(max<mark) max=mark; } printf("Max=% d\n",max); return 0; } Enter n:5 Enter 5 marks67 88 73 54 82 Max= 88 例4-8-2 #include<stdio.h> int main() { int mark,max; printf("Enter marks: "); scanf("% d",&mark); max=mark; while(mark>=0){ if(max<mark) max=mark; scanf("%d",&mark); }; printf("Max=%d\n",max); return 0; } Enter marks: 67 88 73 54 82 -1 Max=88 例4-9 #include<stdio.

多个join的执行过程

嵌套循环连接,就是先根据Join的类型和on条件进行逐层连接,每次连接完后用where对结果进行过滤。 在这个例子里,第一步只有A一个表,所以没有join的操作,直接对A用where a.id in (1,2,3,4,5,6)进行过滤,符合条件的记录作为主表,得到临时表t_A;第二步,t_A和B按照 A left join B b on a.bid = b.id 的规则来连接,对结果b.class = '1001'进行过滤,得到临时表t_AB;第三步, t_AB left join C c on b.cid = c.id ,对结果用 where c.id > 15进行过滤,得到新的临时表 t_ABC;第四步, t_ABC right join D d on d.age = c.dage,得到最终结果 t_ABCD。 所以每个join都会生成一个临时表,临时表再继续关联。

教你分析9种 OOM 常见原因及解决方案

文章作者:涯海 创作日期:2019-07-15 专栏地址:https://github.com/StabilityMan/StabilityGuide 当 JVM 内存严重不足时,就会抛出 java.lang.OutOfMemoryError 错误。本文总结了常见的 OOM 原因及其解决方法,如下图所示。如有遗漏或错误,欢迎补充指正。 1、Java heap space 当堆内存(Heap Space)没有足够空间存放新创建的对象时,就会抛出 java.lang.OutOfMemoryError:Javaheap space 错误(根据实际生产经验,可以对程序日志中的 OutOfMemoryError 配置关键字告警,一经发现,立即处理)。 原因分析 Javaheap space 错误产生的常见原因可以分为以下几类: 1、请求创建一个超大对象,通常是一个大数组。 2、超出预期的访问量/数据量,通常是上游系统请求流量飙升,常见于各类促销/秒杀活动,可以结合业务流量指标排查是否有尖状峰值。 3、过度使用终结器(Finalizer),该对象没有立即被 GC。 4、内存泄漏(Memory Leak),大量对象引用没有释放,JVM 无法对其自动回收,常见于使用了 File 等资源没有回收。 解决方案 针对大部分情况,通常只需要通过 -Xmx 参数调高 JVM 堆内存空间即可。如果仍然没有解决,可以参考以下情况做进一步处理: 1、如果是超大对象,可以检查其合理性,比如是否一次性查询了数据库全部结果,而没有做结果数限制。 2、如果是业务峰值压力,可以考虑添加机器资源,或者做限流降级。 3、如果是内存泄漏,需要找到持有的对象,修改代码设计,比如关闭没有释放的连接。 2、GC overhead limit exceeded 当 Java 进程花费 98% 以上的时间执行 GC,但只恢复了不到 2% 的内存,且该动作连续重复了 5 次,就会抛出 java.lang.OutOfMemoryError:GC overhead limit exceeded 错误。简单地说,就是应用程序已经基本耗尽了所有可用内存, GC 也无法回收。 此类问题的原因与解决方案跟 Javaheap space 非常类似,可以参考上文。 3、Permgen space 该错误表示永久代(Permanent Generation)已用满,通常是因为加载的 class 数目太多或体积太大。

UI自动化:自己参考

#encoding:utf-8 from selenium import webdriver import json import time from selenium.webdriver.support.ui import Select from selenium.webdriver import ActionChains driver= webdriver.Firefox() url="http://47.92.220.226/webdriver/" driver.get(url) # 各种定位方式 # eles=driver.find_element_by_link_text(u'定位方法测试页面') # eles.click() eles = driver.find_element_by_partial_link_text(u'测试页面') eles.click() input_name=driver.find_element_by_id(u'username') input_name.send_keys(u'yanzhenxing') input_email=driver.find_element_by_name(u'email') input_email.send_keys(u'1234@qq.com') # input_password=driver.find_elements_by_class_name(u'login_input')[2] # input_password.send_keys(u'1233') input_password=driver.find_element_by_id(u'password') input_password.send_keys('1233') input_twopwd=driver.find_element_by_css_selector(u'#confirm_password') input_twopwd.send_keys(u'1233') denglu=driver.find_element_by_xpath(u'//td[@colspan]/input[1]') denglu.click() ele_regmsg = driver.find_element_by_id(u"regmsg") regmsg_text = ele_regmsg.text regmsg_json = json.loads(regmsg_text.split(u"成功:")[-1], encoding='utf-8') print("uid: %s" % regmsg_json['uid']) print("username: %s" % regmsg_json['username']) print("password: %s" % regmsg_json['password']) print("email: %s" % regmsg_json['email']) elems=driver.

[转][分享] 使用VBA操作Lotus Notes

之前在这个帖子中讨论了使用VBA发送Lotus Notes邮件,那个帖子中还有些问题一直没有解决,例如签名。另外之前自己也认为不能使用Lotus Notes的UI操作,实际上是错的。 这里开一个新贴提供一些关于使用VBA操作Notes的例子,主要涉及Notes的邮件功能。使用的Notes版本是R6。如有不足的地方,希望大家补充。 1. 获取当前用户名 Sub GetUserName() Dim aNotes ' 创建NoteSession对象 Set aNotes = CreateObject("Notes.NotesSession") ' 获取用户名 MsgBox aNotes.UserName Set aNotes = Nothing End Sub 2. 访问数据库 Sub AccessDataBase() Dim aNotes Dim aDataBase Dim strTemp As String Set aNotes = CreateObject("Notes.NotesSession") ' 获取当前数据库 Set aDataBase = aNotes.CURRENTDATABASE ' 获取服务器上指定数据库 'Set aDataBase = aNotes.GetDatabase("server/subfolder", "mail/yourname") ' 获取本地联系人数据库 'Set aDataBase = aNotes.GetDatabase("", "names") ' 获取本地数据库 'Set aDataBase = aNotes.GetDataBase("", "c:\work\temp.nsf")

LDPC编译码原理

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=[H1​ H2​] 其中 H 1 H_1 H1​ 的大小为 m ∗ k m*k m∗k , H 2 H_2 H2​ 的大小为 m ∗ m m*m m∗m 。设编码后的码字行向量为 c c c ,它的长度为n,把它写成如下形式

链表的创建与打印

链表 链表的创建与打印 #include<stdio.h> #include<stdlib.h> typedef struct student{ char name[8]; char num[10]; int score; struct student *next; }NODE; //将struct student 结构类型定义为新的类型名NODE //(我得理解是,链表是一种特殊的结构,就是形如 NODE 一样的结构体,所以用NODE表示这种特殊的结构) int main() { NODE *head; //变量声明,定义 一个NODE结构类型的指针变量head NODE *creat(); // creat函数原型申明 ,返回值类型为NODE结构指针 (该函数实现链表的创建) void display(NODE*); // display 函数原型申明,形参为NODE结构指针,返回值为空 (该函数实现链表的打印) head=creat(); //创建链表 display(head); //打印链表 return 0; } //定义函数 NODE *creat() { NODE *head, *p, *s; //声明三个NODE类型的指针 ,head头指针,p可以看作尾指针,s可以看作节点指针 int key=1,n; //n表示链表的节点个数 char k[3],grad[3]; // head=(NODE*)malloc(sizeof(NODE)); //给头指针动态分配内存地址 p=head; // while(key) { printf("

利用KODI轻松开启NAS分享视频方式

铁威马TOS系统多平台兼容,多协议支持如FTP/AFP/SMB/WebDAV/NFS等等,内网外网访问方式多样化,家庭日常影音视听享受也得到了最大化的便捷度。举个简单例子,在电视盒子或手机端安装KODI,即可利用DLNA/UPnP开启NAS分享视频音乐源的新篇章。 当然,也可以用KODI通过SAMBA、NFS等方式实现NAS影音播放。盒子如此,手机端也一样。事实上,TNAS第三方应用也可以实现类似DLNA播放功能,可根据自己喜好选用。 一张动图带你了解这是怎样方便的操作,实测1080p杜比5.1大片播放流畅,用电视看电影再也不用憋脚投屏或来回倒腾了。 KODI通过SAMBA、NFS等方式实现NAS影音播放。 1电视盒子或移动设备下载; 2选择“视频-文件-添加视频-浏览新共享-UPnP Devices”; 3选择添加铁威马NAS的DLNA分享源; 4进入TNAS影视库看电影; 5开始播放。

mongodb "errmsg" : "not master and slaveOk=false"的解决办法

mongodb “errmsg” : "not master and slaveOk=false"的解决办法 ##是正常的,因为SECONDARY是不允许读写的,如果非要解决执行 rs.slaveOk() 这句命令就可以了 [yukw@mongodb4 data]$ ./mongo -port 20000 MongoDB shell version v3.4.4 connecting to: mongodb://127.0.0.1:20000/ MongoDB server version: 3.4.4 Server has startup warnings: 2019-07-31T17:06:43.397+0800 I CONTROL [initandlisten] 2019-07-31T17:06:43.397+0800 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database. 2019-07-31T17:06:43.398+0800 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted. 2019-07-31T17:06:43.398+0800 I CONTROL [initandlisten] 2019-07-31T17:06:43.398+0800 I CONTROL [initandlisten] 2019-07-31T17:06:43.

Celery基础介绍

一、Celery的基础介绍 1.celery简介 Celery 是一个异步任务队列/基于分布式消息传递的作业队列。其本质是生产者和消费者模式。生产者发送任务到消息队列,消费者负责处理任务。 2.celery 的架构 Celery的架构由三部分组成:消息中间件(Broker)、任务执行单元Worker、结果存储(Backend)。 消息中间件Broker:支持RabbitMQ、Redis、Amazon SQS、MongoDB、Memcached 等,官方推荐RabbitMQ任务执行单元Worker:负责从消息队列中取出任务执行,它可以启动一个或者多个,也可以启动在不同的机器节点,这就是其实现分布式的核心。结果存储Backend:支持RabbitMQ、 Redis、Memcached,SQLAlchemy, Django ORM、Apache Cassandra、Elasticsearch 3.celery 工作原理 1.任务模块Task包含异步任务和定时任务。 异步任务通常在业务逻辑中被触发并发往消息队列,定时任务由Celery Beat进程周期性地将任务发往消息队列 2.任务执行单元Worker实时监视消息队列获取队列中的任务执行3.Woker执行完任务后将结果保存在Backend中 4.安装 由于celery是有python开发,所以可以使用pip包管理工具直接下载 pip install celery 5.使用 不使用配置文件的简单使用 在assets应用模块的__init__.py 创建celery实例 tests.py:任务定义文件 import time from assets import app @app.task def add(x, y): time.sleep(5) # 模拟耗时操作 return x + y 启动worker celery worker -A assets.tests -l debug worker: 代表启动的角色是worker,当然还有beat等其它角色A: 项目路径,这里我的项目引用路径是assets.testsl: 启动的日志级别,这里我启用了debug级别 查看日志输出,会发现我们定义的任务 现在worker启动了,但是我们需要用delay或apply_async来将任务添加到worker中。这里我们使用交互方式来添加任务,并返回AsyncResult对象,通过AsyncResult对象获取结果. a = add.delay(args),发送任务到队列中ready(): 判断任务是否有结果,返回True or Falsestate:返回任务状态task_id: 返回任务idresult: 返回任务结果,同get()方法info: 获取任务信息,默认返回结果successful(): 判断任务是否成功,返回True or False 使用配置文件

kibana内存设置

kibana是一个基于NodeJS的单页web应用。而NodeJS则是基于Chrome V8引擎的。V8引擎对于内存的使用是有限制的,默认情况下,64位系统下约为1.4GB,32位系统下约为0.7GB。 在系统内存不是很大,或者kibana出现OOM异常时,就需要对内存进行调整。一般来说,通过调整老年代内存就可以了。在kibana的bin目录下的脚本kibana或kibana.bat中添加如下配置。 示例 Windows: set NODE_OPTIONS=%NODE_OPTIONS% --max-old-space-size=200 Linux: NODE_OPTIONS="$NODE_OPTIONS --max-old-space-size=200" 修改后重新启动kibana即可生效。

数据库连接池和DbUtil工具使用

一、数据库连接池 1.1 数据库连接池介绍 因为创建Connection对象也会消耗系统资源。因此,如果应用程序需要大量创建Connection对象,就有可能会导致服务器的资源很快就被消耗完。 解决办法: 当服务器启动的时候,就预先创建一批的Connection对象保存在一个容器中。每次用户访问数据库的时候,先从该容器中获取一个数据库连接。如果用完之后,再重新把该connection放回到容器中,给其他用户使用。这个容器就是“数据库连接池”。 使用数据库连接池的好处: 1) 减少创建数据库连接的数量; 2) 提高程序的执行效率; 1.2 实现数据库连接池 第一步:定义一个类,实现DataSource接口。 第二步:定义一些变量用来存储连接池的相关信息; 第三步:实现getConnection方法; class MyPool implements DataSource { private String url = "jdbc:mysql://localhost:3306/entor_db"; //数据库URL private String userName = "root"; // 数据库用户名 private String password = "root"; // 数据库用户密码 private int maxPoolSize = 5; // 连接池最大的连接数 private int currentPoolSize = 0; // 当前连接池的连接数 //加载驱动 static { try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } LinkedList<Connection> pool = new LinkedList<Connection>(); //保存数据库连接 //从连接池中获取一个数据库连接 @Override public Connection getConnection() throws SQLException { if (pool.

shouldOverrideUrlLoading返回值

前言 这周在做一个需求时,需要用到WebView,但是在做的过程中,却遇到了一些问题。WebView我其实接触并不多,这次的需求里还涉及了一些JS交互之类的,所以我是边学边做,但是网上的示例和教程,往往藏着一些坑,这一次我就发现关于shouldOverrideUrlLoading这个方法,网上的说法真的是五花八门,这篇文章,我们来澄清一下shouldOverrideUrlLoading的真正用法。 官方文档: /** * Give the host application a chance to take over the control when a new * url is about to be loaded in the current WebView. If WebViewClient is not * provided, by default WebView will ask Activity Manager to choose the * proper handler for the url. If WebViewClient is provided, return true * means the host application handles the url, while return false means the * current WebView handles the url.

高翔博士SLAM硬件体验:INDEMIND双目IMU相机

本文转自高翔博士知乎专栏文章《SLAM硬件体验-INDEMIND双目IMU相机》 很多算法问题本质上是硬件问题。” 这句话相信很多人都应该有所体验。很多时候你发现自己的算法表现不好,背后的原因其实与算法无关,比如: 传感器内外参标定不准; 各传感器的时间同步问题; 驱动程序时不时地丢数据或卡顿; 相机视野不够、曝光不稳定;** 诸如此类。所以我准备写一些SLAM相关的硬件体验,主要是指视觉SLAM方面的。近年来国内外出现了不错的双目/RGBD相机,很多还集成IMU器件,二者硬件同步也慢慢成为一种标准的配置。我之前体验过的主要有: Stereo lab的ZED;双目相机,自身提供不错的功能比如深度估计和ZED Fusion; DUO3d;红外双目相机,集成IMU; 国内的perceptIn、小觅、远形、INDEMIND,等等。 我希望这种硬件体验文章能为该方向的读者提供一些选型的指导,方便读者在自己研究的时候作为参考。在这篇文章里,我主要归纳一下INDEMIND出的这款双目相机的体验: 首先我们明确一下SLAM算法对相机有哪些需求: 图像频率:图像频率越高越好。频率高,两个图像之间的差异就越小,算法允许的运动速度就越快。无人车上用的相机常见为15Hz,20Hz,普通的约30Hz,60Hz,更快的也有120Hz左右的。 图像分辨率:常见的有640x480,752x480,1920x1080的。高分辨率图像会影响算法性能,并且分辨率和频率成反比。在SLAM应用里,我们更偏向频率。 卷帘快门/全局快门。:局快门相机不易产生运动模糊,在SLAM应用中优势较大。 视野(FoV):在畸变能够正确校正的情况下,越宽越好。宽视野相机不易被遮挡,也能有效降低白墙、弱纹理区域影响。SLAM中我通常偏好广角(水平120度以上)、鱼眼(180度)乃至全景相机(360度)。 IMU:通常为MEMS IMU,我们需要有硬件时间同步,因为绝大多数算法无法处理图像数据和IMU存在时延的情况。IMU本身自然在成本范围内,性能越高越好。 下面我们来看INDEMIND这款双目IMU相机,我拿到的这个是工程版,还没有上罩子: 它的几个重要参数列举如下: 两个全局快门相机,灰度图像,输出到USB。 广角相机,水平视野120度,垂直75度。 图像在1280x800分辨率下最高达到100Hz,640x400分辨率下最高200Hz,属于高速相机。 IMU型号为ICM-20602,性能和MPU 6050差不多(Youtube上有一个性能比较视频[1]),最高1000Hz。 基线12cm,和ZED一致,估计深度范围大约在0.5-20m,可用于室内场景。 自带深度估计功能,输出深度图像为640x400,25Hz。 自带SLAM功能,可以读到相机计算的Pose,25Hz。 定价为999(优惠价799)。 综合看来,这款相机属于小基线、高频率的双目摄像头,优势在于频率高,且有硬同步的IMU。同时价格方面相比于ZED这类相机要便宜很多。 配件拿到手里大约是这样,相机本体,一根USB线,两个镜头盖。 插上USB线之后就能点亮(要是有个架子挂电脑上就更方便了,碎碎念): 软件方面,如果是Ubuntu 1604或者1804,可以直接在电脑上测。我用的1804,改了下Demo程序的cmakelist之后就可以测Demo。Demo主要有两项内容:深度图显示以及自带的SLAM功能。以下视频是在我家的小房间内测试: 视频链接:点击此处 测试下来,整体感受有以下几条: 深度图表现和双目算法预期差不多,和RGBD比肯定有一点距离,但是双目稠密深度本来也做不了特别稳定。这个相机的深度图不需要GPU,算是一个优势。 自带的SLAM是基于角点匹配的,由于广角的存在,通常条件下表现不错。 在测试环境中出现了几种情况: 曝光变化。比如窗口在室内看起来很亮,靠近之后曝光会调节到正常水平; 远景。朝窗外观察时,双目应该测不到深度,退化为单目,但slam还能正常工作; 快速旋转。由于存在IMU且相机频率较高,可以正常追踪。 弱纹理。弱纹理对基于特征的方法还是很不友好的。目前这个自带的SLAM在追踪不到时,UI会停止更新,这点还有待加强。 此外,这个器件也支持接入现有的开源SLAM或者ROS,对SLAM开发者比较友好。 综合来说,INDEMIND这款相机优缺点列举如下。 优势: 成本便宜。类似传感器中,ZED价格在2800,DUO3D在5000左右,和小觅的入门版在一个价位。 相机频率做的很高,对快速运动有优势。 有硬同步的IMU,频率也够高,自带标定。 水平120度的广角视野。 SDK自带SLAM功能。 缺点: 目前还没有彩色版本,要做机器学习和感知还需要再加别的传感器。 希望这篇体验文章对读者的科研、开发有所帮助。我之后也会写一些类似的硬件体验类文章,以供读者查询。

mongodb版本升级

mongodb版本升级 一、背景 目前公司的mongodb版本是3.0.6的老版本,公司希望将mongodb版本升级到3.6以上,那么蛋疼了,以前没做过数据库升级,在脑子里的第一反应是要不要重新部署一套mongodb副本集+分片的模式,又或者是可以直接从3.0.6的版本升级到3.6版本以上,经过查阅资料发现,实际mongodb版本升级是需要一步一步来的,需要先升级到3.4版本,再升级到3.6版本。 3.0 ======> 3.4 ======> 3.6 二、三个重点需要注意 1、一定要备份config数据库; 2、修改认证方式;需要将最新的认证方式SCRAM-SHA-1 改成老的认证方式 MONGODB-CR,老用户依然能正常登陆。 3、可通过开启认证的方式启动服务,通过老版本用户登陆授权; 三、环境 当前mongodb集群三台机器,环境是副本集+分片模式 mongodb1:分片主1、分片主2、分片主3、config、mongos mongodb2:分片副本1、分片副本2、分片副本3、config、mongos mongodb3:分片副本1、分片副本2、分片副本3、config、mongos 四、下载各个版本的mongodb包 [yukw@mongodb1 mongodbwork3.4]$ wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.4.4.tgz ##下载版本为3.4.4 [yukw@mongodb1 mongodbwork3.4]$ wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.6.5.tgz ##下载版本为3.6.5 五、下面介绍如何从3.0升级到3.4 ##1、拷贝包到相应目录 [yukw@mongodb1 mongodbwork3.4]$ mkdir /data/service/mongodbwork3.4 [yukw@mongodb1 mongodbwork3.4]$ cp mongodb-linux-x86_64-rhel62-3.4.4.tgz /data/service/mongodbwork3.4/ ##2、解压压缩包 [yukw@mongodb1 mongodbwork3.4]$ tar xf mongodb-linux-x86_64-rhel62-3.4.4.tgz [yukw@mongodb1 mongodbwork3.4]$ mv mongodb-linux-x86_64-rhel62-3.4.4 mongodb ##3、停止mongodb服务 [yukw@mongodb1 mongodbwork3.4]$ ps -ef |grep mongo |grep -v grep | awk '{print $2}' | xargs kill -2 ##每台机器都执行 ##、以3.

如何转换音频文件,mp3格式怎么转为wav格式

现在网上有很多音频转换器,小编今天在百度搜索了一下:“音频转换器”,大家猜一下出现了多少个结果?你们肯定猜不到了啦:两百多万个。是不是很多啊?虽然现在转换音频的软件有很多,最主要的是看哪款比较好用,比较实在才是硬道理啊。那今天小编的重点就是音频转换器了。既然上面说到了有这么多搜索结果,小编肯定是货比较硬才敢拿出来晒啊,好不好用大家先看完再评评理吧!! 方法步骤: 1、在小编这么有信心的介绍下,赶紧在上面的软件下载地址下载这款音频格式转换器吧。下载好直接解压,找到文件夹里面的执行文件点击运行就行了。 2、几乎是千篇一律的开始,打开软件肯定先添加文件对吧。那我们先来添加几首比较好听的背景音乐吧。 3、那接下来就来到了第三个选项,这个选项主要就是对转换格式以及一些相关参数进行设置。首先我们看到“输出格式”设置,我们选择一种格式,点击自定义可以设置其他的一些参数。 4、接下来大家可以不用再设置什么参数了。我们在设置一下输出目录,更改到一个比较容易找到的位置,这个就看各位的需要了。 5、然后点击“开始转换”!转换的时候就希望大家能耐心等待一下了。假如文件很多的话需要的时间肯定就会比较长,等到转换完成之后大家直接打开文件目录就行了。 好了今天的教程大概就到这里了。下面就是小编把转换的文件和没有转换的文件截图出来给大家看一下对比图。相信大家可以清楚的看到这个格式是不一样了。

Flink启动报错could not be determined automatically

今天发布Flink应用,报如下错误: The return type of function 'main(RyeCollectorLauncher.java:77)' could not be determined automatically, due to type erasure. You can give type information hints by using the returns(...) method on the result of the transformation call, or by letting your function implement the 'ResultTypeQueryable' interface. org.apache.flink.streaming.api.transformations.StreamTransformation.getOutputType(StreamTransformation.java:420) org.apache.flink.streaming.api.datastream.DataStream.getType(DataStream.java:175) org.apache.flink.streaming.api.datastream.DataStream.union(DataStream.java:217) com.mogujie.traffic.rye.anchor.flink.collector.RyeCollectorLauncher.main(RyeCollectorLauncher.java:104) 根据错误信心定位到出错位置: 根据错误信息You can give type information hints by using the returns,只需要在后面调用returns方法,然后指明其返回类型即可解决。 问题已经解决,这里简单记录下,希望可以帮到各位朋友!!! 补充: 报错: 2019-07-30 11:36:46,193 ERROR org.apache.flink.runtime.entrypoint.ClusterEntrypoint - Could not start cluster entrypoint YarnJobClusterEntrypoint.

如何解决条码打印机隔张打印问题

经常打印标签的小伙伴可能会遇到过,用条码打印软件批量制作的标签,打印预览没有问题,但是用条码打印机打印的时候会出现隔一张打一个标签这种隔张打印的问题,那么,这种情况如何解决呢?接下来我们来看下 如果出现隔张打印的情况,首先在条码打印软件的文档设置中,点开打印机属性,看一下条码打印软件中设置的纸张大小和条码打印机识别的纸张大小是否一样,如果不一样就改为一样(大小需要根据条码打印机中的标签纸实际大小设置)。 设置好之后在条码打印软件中打印2张标签做下测试,看是否还会出现隔张打印的情况。 如果还是出现隔张打印的问题,那就可能是打印机纸张识别问题,按条码打印机上面的走纸键,看出纸是否正常,然后做一下打印机校验。打印机校验之后,再用条打印软件打印标签,条码打印机就不会出现隔张打印的情况。 以上就是条码打印机出现隔张打印的解决办法,一般只要条码打印机能够正常打印,条码打印软件打印标签的时候就不会出现问题。关于条码打印机校验的方法是不尽相同,打印机不同,校验的方法也不同,具体方法可以参考打印机说明书或者咨询打印机商家。

Laya以后遇到的坑,都写在这里 总结用吧

1.加载fgui的时候 用使用type来指定类型,不然要加载的时候要报错 RangeError: Offset is outside the bounds of the DataView {url:"ui/cup/Cup.fui", type:Laya.Loader.BUFFER}, {url:"ui/cup/Cup_atlas0.png", type:Laya.Loader.IMAGE},

VSCode正则表达式搜索

1.点击.*按钮 2.输入正则表达式 v1/users/(.*).'/addresses' (括号里的为正则表达式的部分(.*)) 常见正则? 匹配整数和小数 \b[0-9]*\.*[0-9]+\b 去掉空白行 ^\s*(?=\r?$)\n 匹配十六进制数 \b0[xX]([0-9a-fA-F])\b 3.替换 原代码:v1/users/(.*).'/addresses' 现代码:v3/users/addresses/all?user_id=$1 其中$1即为匹配到的(.*)的部分 4.详细信息 参考 ? Visual Studio 中的正则表达式

解决foreach异步执行未完成,就执行另一个function的问题

使用new Promise 方法先执行getOnlineList(),forEach完成后,resolve值,再.then()执行其他function,解决异步执行的问题 相关代码: const getOnlineList = function() { //需要先遍历的代码 return new Promise(function(resolve, reject) { vm.onlinelist.forEach(item => { vm.onlinelistLength += item.course_booking.length; }); resolve(vm.onlinelistLength); }); }; getOnlineList().then(() => { //后续执行代码 fn && fn(); }); 放上修改前后对比图:

cdh平台离线搭建(二)

本文接上文,cdh平台离线搭建(一):https://blog.csdn.net/weixin_42814075/article/details/97392216 正式开始cdh平台的有关搭建 创建本地源 在/var/www/html下创建一个cdh_repo文件夹,并将下载的4个文件上传到该目录下 打开http://cm-server/cdh_repo/ 可以验证 其中cm文件夹是解压后的cm5.16.1-centos7.tar.gz 配置本地yum源,并分发到其它节点 vim /etc/yum.repos.d/cloudera-manager.repo [cloudera-manager] name = Cloudera Manager, Version 5.7.0 baseurl = http://cm.cdh.com/cdh_repo/cm/5.16.1/ gpgcheck = 0 scp cloudera-manager.repo root@hadoop-1.com:/etc/yum.repos.d/ scp cloudera-manager.repo root@hadoop-2.cdh.com:/etc/yum.repos.d/ 安装CM 进入上述创建的CM的文件目录下 cd /var/www/html/cdh_repo/cm/5.16.1/RPMS/x86_64 安装cloudera-manager-daemons-5.16.1-1.cm5161.p0.1.el7.x86_64.rpm yum install cloudera-manager-daemons-5.16.1-1.cm5161.p0.1.el7.x86_64.rpm 安装cloudera-manager-server-5.16.1-1.cm5161.p0.1.el7.x86_64.rpm yum -y install cloudera-manager-server-5.16.1-1.cm5161.p0.1.el7.x86_64.rpm 修改CDH关于数据库的配置文件 vim /etc/cloudera-scm-server/db.properties 启动cloudera-scm-server服务并查看日志 启动命令:systemctl start cloudera-scm-server.service 查看状态:systemctl status cloudera-scm-server.service 查看启动日志:vim /var/log/cloudera-scm-server/cloudera-scm-server.out 启动成功如下图所示: 这里列举几种失败报错 1.java环境变量 解决方式:在cdh配置文件中指定 vim /etc/rc.d/init.d/cloudera-scm-server export JAVA_HOME=/opt/java/jdk1.8.0_181 2.数据库驱动包加载不到 Could not load requested class : com.

坑到吐血之——springboot发送邮件本地可以服务器不可以

正经学徒,佛系记录,不搞事情 本来今天高高兴兴,你为什么要报这样的错 状况 本地springboot项目整了一下使用 com.sun.mail <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> 来发送邮件的服务,在本地做好如下配置 spring: mail: #服务器地址 host: smtp.qq.com #发送的邮箱账号 username: xxx@qq.com #授权码 password: xxxx default-encoding: UTF-8 properties: mail: debug: true port: 25 具体代码网上一堆一堆的,随便找了一个测试了一下,用起来也贼像我兄弟顺溜, 正高兴的打包成jar部署上服务器,结果问题来了,服务器上邮件死活发送不出去,各种尝试之下,终于发现了问题所在 解决 道听途说的解释如下:服务器上由于安全策略,不允许使用smtp协议的25端口,因此需要改成经过ssl加密的smtps协议的465端口,配置修改如下,这下顺畅了,不知你们是否遇到这样的问题 spring: mail: #服务器地址 host: smtp.qq.com #发送的邮箱账号 username: xxx@qq.com #授权码 password: xxxx default-encoding: UTF-8 properties: mail: debug: true smtp: socketFactory: class: javax.net.ssl.SSLSocketFactory port: 465

Anaconda 安装的包如何在 Pycharm 中使用

Anaconda 安装的包如何在 Pycharm 中使用 Anaconda 安装和管理包特别方便,我们希望 Pycharm 能够和 Anaconda 联合工作,但是经常遇到在 Anaconda 中安装好了包,在 Pycharm 中使用时,提示找不到的错误。大多数原因都是因为我们包安装的位置和我们 Pycharm 工作环境不一致,所以 Pycharm 找不到包。希望看完这篇文章,我们都不会再受这个问题的困扰! 下文叙述,均基于 Win10 系统,Anaconda3,Pycharm 社区版。 简介 Anaconda 可以方便地安装、更新、卸载包,而且在安装时能自动安装相应的依赖包,同时还能使用不同的虚拟环境隔离不同要求的项目。通过 Anaconda 可以有效的管理工具包、开发环境、Python 版本,大大简化我们的工作流程。 Pycharm 是一个功能强大的 Python 编辑器,深的众猿喜爱,废话就不说了… 两款工具都那么优秀,能结合它们的有点,岂不美哉。 在 Pycharm 使用 Anaconda 的环境 之前已经写过一篇博客,不再重复,直接贴上链接,点击这里 刚开始使用的时候,经常遇到各种各样的问题,时时刻刻不想着劝退我们,但作为一名小白程序员,就要敢于手撕各种问题… 在之后的描述中:Anaconda Path表示你的 Anaconda 安装路径。 Anaconda Anaconda 工作界面如下图: Anaconda 安装的包在什么位置 Anaconda 安装之后,有一个默认的 base 环境,进入终端之后,显示的界面如下: 此环境下安装的包会存放在:[Anaconda Path]/Lib/site-packages/ 路径下。 当我们新建环境之后,比如我图1中的的 tensorflow,在路径 [Anaconda Path]/envs/ 下会看到一个 tensorflow 的文件夹,打开之后会发现和 [Anaconda Path] 目录下的文件很相似。可以联想到,在这个环境下,我们安装的包就会被存放在 [Anaconda Path]/envs/tensorflow/Lib/site-packages/ 路径下。

Java实现读取csv文件

目录 什么是CSV文件显示的样子开始写程序程序如下 什么是CSV文件 csv文件只能存储数字或者文字,格式如下 1,第一行 2,小明 注意编码格式 显示的样子 文件 然后输入的样子 开始写程序 程序如下 package com.admin.controller; import java.io.*; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; /** * @desc: 读取csv文件 * @time: 2019年7月26日 22:50 */ public class export_zhong { public static void main(String[] args) { try { //(文件完整路径),编码格式 BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("C:\\Users\\Coli\\Desktop\\csv文件.csv"), "utf-8"));//GBK // reader.readLine();//显示标题行,没有则注释掉 // System.out.println(reader.readLine()); String line = null; while((line=reader.readLine())!=null){ String item[] = line.split(",");//CSV格式文件时候的分割符,我使用的是,号 String last = item[item.

五种网站跨域问题解决方案

一、什么是跨域问题 是两个项目之间使用ajax(前端类似与后端技术httpclient)实现通讯,如果浏览器访问的域名地址和端口号与ajax访问的地址和端口号不一致的情况下,默认情况下浏览器会有安全机制,这个机制就是跨域问题,会造成无法获取到返回结果(但实际还是可以访问的,请求状态码为200,但无法获取到结果)。 二、跨域问题怎么解决: 跨域问题有如下5中解决方案: 1、使用jsonp解决 跨域问题(不推荐,因为只能支持get请求,不支持post请求) 2、使用httpclient进行转发(不推荐,因为效率非常低,会发送两次请求) 3、设置响应头允许跨域(可以推荐)适合于小公司快速解决问题 4、使用Nginx搭建API接口网关(强烈推荐)因为保证域名和端口都一致,以项目区分反向代理到真实服务器地址。 5、使用Zuul微服务搭建API接口网关(强烈推荐)SpringCloud 网站跨域问题演示: 新建两个maven项目(xwhy_web_a,xwhy_web_b),pom类型为war类型。 pom依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.0.RELEASE</version> </parent> <dependencies> <!-- SpringBoot 对lombok 支持 --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!-- SpringBoot web 核心组件 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </dependency> <!-- SpringBoot 外部tomcat支持 --> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </dependency> <!-- springboot-log4j --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j</artifactId> <version>1.3.8.RELEASE</version> </dependency> <!-- springboot-aop 技术 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> </dependency> <!

echarts Y轴只显示整数,或保留n位小数

yAxis: [ { type: 'value', minInterval: 1//只显示整数 } ], axisLabel: { //保留一位小数 formatter: function (value, index) { return value.toFixed(1); } } 转载于:https://www.cnblogs.com/caoxen/p/11248494.html

深入理解javascript原型及原型链

原型及原型链是javascript中非常重要的东西,对看别人源码和自己设计框架和深入理解javascript这门语言特别有用。 原型及原型链名词解释 prototype 每一个函数都有一个prototype(原型)属性,这个属性是一个指针,指向了一个对象,而这个对象的用途就是包含可以由特定类型的所有实例共享的属性和方法。 proto 所有引用类型(函数,数组,对象)都拥有__proto__属性。JavaScript 只有一种结构:对象。每个实例对象( object )都有一个私有属性(称之为 proto )指向它的构造函数的原型对象(prototype )。 proto 属性是JavaScript 的非标准但许多浏览器实现的属性__proto__ 原型对象 拥有prototype属性的对象,在定义函数时就被创建 prototype原型 原型是Javascript中的继承的基础,JavaScript的继承就是基于原型的继承。 Javascript的继承机制基于原型,而不是Class类。 函数和对象的关系 function fun1(){}; let fun2 = function(){}; let fun3 = new Function('content','console.log(content)'); let obj1 = new fun1(); let obj2 = {}; let obj3 =new Object(); console.log(typeof Object); //function console.log(typeof Function); //function console.log(typeof Array); //function // Object Function和 Array 都是函数 console.log(typeof obj1); //object console.log(typeof obj2); //object console.log(typeof obj3); //object console.log(typeof fun1); //function console.

解决微信开发者工具报错:当前开发者未绑定此AppID,请到小程序后台操作重试

解决微信开发者工具报错:当前开发者未绑定此AppID,请到小程序后台操作重试 首先要在微信公众平台注册小程序账号,注意与公众号(订阅号)账号区别开来,小程序账号不是公众号账号,登录后小程序账号的界面是这样的: 然后用点击上图的添加开发者进入到如下界面: 邀请登录微信开发者工具的微信 成为该小程序的开发者后就解决该问题了。 要注意的是: 1.区分公众号的AppID与小程序的AppID,他们登录微信开放平台的账号是不一样的,登录后的主界面也是不一样的 2.获取小程序的AppID:

redis 集群搭建总结一些好的博客

1.https://blog.csdn.net/qq_42815754/article/details/82912130 2. https://www.cnblogs.com/wuxl360/p/5920330.html 3.这篇比较好 《深入剖析Redis - Redis集群模式搭建与原理详解》 可以作为分享内容。详细讲解了Redis 分布式的两种方案。Redis Cluster 集群模式通常具有 高可用、可扩展性、分布式、容错 等特性。 https://www.jianshu.com/p/84dbb25cc8dc 4. 超详细的Redis集群搭建方案 https://www.cnblogs.com/mafly/p/redis_cluster.html 5. ruby的安装博客 1 http://www.ruby-lang.org/zh_cn/documentation/installation/ 安装博客 2 https://www.cnblogs.com/xuliangxing/p/7132656.html ruby 的下载地址: https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.3.tar.gz

三、mybatis中typehandler详解

前言:今天介绍一个mybatis操作数据库时的一个类似黑匣子的东西,TypeHandler 闲聊: 在我们平常开发操作数据库时,查询、插入数据等操作行为,有时会报数据类型不匹配异常,就可以得知数据的类型是不唯一的必然是多种不同的数据类型。并且我们必须要明确的一点就是java作为一门编程语言有自己的数据类型,数据库也是有自己的数据类型的。 jdbc数据类型:org.apache.ibatis.type.JdbcType 此枚举就是所有的数据库支持类型 java数据类型:int、long、string、… 一定要分清,例如java重的date数据插入到数据库中,应该是已经转换成了数据库的某种类型,必然跟java已经没有关系了。中间有一些我们看不见的操作做了数据处理。 假设此时的java类型与数据库数据类型是一样的,哪么其他语言中的日期数据插入数据库时又该怎么解释,例如C#操作数据库存入时间类型,C#与java肯定没有关系吧。所以每种语言与数据库之间有种数据类型关系对应。 思考: 因为java与数据库各自有数据类型,所以在将java数据存入数据库前中间是否有其他操作,是我们看不见的,不然java数据怎么知道自己与哪个jdbc数据类型匹配? 答:mybatis框架为每种数据类型做了默认的关系对应,BaseTypeHandler的所有实现类,就是来做这些处理的。 例如:java中的date插入数据库时是jdbc哪种类型,怎么就是这种类型? 中间具体有什么操作? 答:DateTypeHandler就是来解决date数据类型的处理。 源码查看: 看一下源码中具体怎么处理date数据类型的。 先看一下接口: //此接口作用是用于指定jdbc与java的数据类型间对应关系处理。 public interface TypeHandler<T> { // 保存操作,数据入库之前时数据处理 void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException; //下面三个则是,从数据库加载数据后,vo对象封装前的数据处理 T getResult(ResultSet rs, String columnName) throws SQLException; T getResult(ResultSet rs, int columnIndex) throws SQLException; T getResult(CallableStatement cs, int columnIndex) throws SQLException; } 具体处理效果:BaseTypeHandler 实现了TypeHandler 接口 public class DateTypeHandler extends BaseTypeHandler<Date> { @Override public void setNonNullParameter(PreparedStatement ps, int i, Date parameter, JdbcType jdbcType) throws SQLException {//插入数据前,类型转关 ps.

【JAVAWEB学习笔记】10_JDBC连接池&DBUtils

使用连接池改造JDBC的工具类: 1.1.1 需求: 传统JDBC的操作,对连接的对象销毁不是特别好.每次创建和销毁连接都是需要花费时间.可以使用连接池优化的程序. 在程序开始的时候,可以创建几个连接,将连接放入到连接池中.用户使用连接的时候,可以从连接池中进行获取.用完之后,可以将连接归还连接池. 1.1.2 分析: 1.1.2.1 技术分析: 【自定义连接池】(了解) SUN公司提供了一个连接池的接口.(javax.sql.DataSource). 定义一个连接池:实现这个接口. 使用List集合存放多个连接的对象. 【自定义连接池的代码】 public class MyDataSource implements DataSource{ // 创建一个List集合用于存放多个连接对象. private List<Connection> list = new ArrayList<Connection>(); // 在程序开始的时候,初始化几个连接,将连接存放到list中. public MyDataSource() { // 初始化3个连接: for(int i=1;i<=3;i++){ Connection conn = JDBCUtils.getConnection(); list.add(conn); } } @Override // 获得连接的方法: public Connection getConnection() throws SQLException { if(list.size() <= 0){ for(int i=1;i<=3;i++){ Connection conn = JDBCUtils.getConnection(); list.add(conn); } } Connection conn = list.remove(0); return conn; } // 归还连接的方法: public void addBack(Connection conn){ list.

CentOS 7.2 - 系统管理 - 列出所有service

列出所有enabled, active的service: systemctl list-units --type=service 列出所有service,不论active还是inactive又或者是failed和not-found: systemctl list-units --type=service --all 列出所有已安装的service,不论有没有运行,不论有没有设置为系统启动项,不论服务是否还有效: systemctl list-unit-files --type=service 备注: 一般安装的service file可能会有4中状态: enabled 安装了的,并会随系统启动而启动。static Enabled服务启动时需要同时启动的依赖服务。disabled 已安装,但不可随系统启动而同时启动的服务。invalid 无效的

Unity实现M选N个随机组件的功能

最近的开发工程中遇到了一个这样的要求:要求在15个按钮中随机选取8个按钮显示出来。 一开始我困于随机数的选取,后来请教大佬之后得出了思路:先将15个按钮使用Guid Layer Group布局排好,但是在Unity视图 中只显示8个按钮。如下图: 为了不打乱原来的数组顺序,我建立了一个长度为15的数组,而且数组中的数为1,2,3,4…15。然后打乱数组的元素顺序, 最后取被打乱数组的前七个数作为遗弃的Button数组下标,将其Active设置为False之后剩下的按钮会自动排列好。代码如下: int[] Rans = new int[15]; for (int i = 0; i < 15; i++) { Rans[i] = i; } System.Random rand = new System.Random(); int k = 0; int tmp = 0; for (int i = 0; i < 15; i++) { k = rand.Next(0, 15); if (k != i)//换位置 { tmp = Rans[i]; Rans[i] = Rans[k]; Rans[k] = tmp; } } for (int j = 0; j < 7; j++) { transform.

echarts增加loading加载效果

echarts设置数据加载前显示loading动画效果: 划重点:利用echart自带showLoading()方法; eg: 在调用setoption方法之前调用showLoadin()方法;之后再调用hideLoading()方法 import echarts from 'echarts'; const mycharts = echarts.init(document.getElementById('echart')); // 调用showLoading方法 mycharts.showLoading({ text: 'loading', color: '#c23531', textColor: '#000', maskColor: 'rgba(255, 255, 255, 0.2)', zlevel: 0, });; setTimeout(() => { // setOption前隐藏loading事件 mycharts.hideLoading(); mycharts.setOption(option); }, 1000); const option = { tooltip: { trigger: 'item', formatter: "{a} <br/>{b}: {c} ({d}%)" }, legend: { orient: 'vertical', x: 'left', data:['直接访问','邮件营销','联盟广告','视频广告','搜索引擎'] }, series: [ { name:'访问来源', type:'pie', radius: ['50%', '70%'], avoidLabelOverlap: false, label: { normal: { show: false, position: 'center' }, emphasis: { show: true, textStyle: { fontSize: '30', fontWeight: 'bold' } } }, labelLine: { normal: { show: false } }, data:[ {value:335, name:'直接访问'}, {value:310, name:'邮件营销'}, {value:234, name:'联盟广告'}, {value:135, name:'视频广告'}, {value:1548, name:'搜索引擎'} ] } ] };

Failed opening the RDB file dump.rdb

运行redis数据库是,打印日志 Failed opening the RDB file dump.rdb (in server root dir C:\Program Files\redis) for saving: Permission denied 原因: 我在搭建好主从节点后,重新启动两个redis实例,发现主节点一直提示如下这个错误: [4664] 22 Jul 22:54:39.122 # rdbSave failed in qfork: Permission denied [6504] 22 Jul 22:54:39.138 # fork operation complete [6504] 22 Jul 22:54:39.138 # Background saving error [6504] 22 Jul 22:54:45.045 * 1 changes in 3600 seconds. Saving... [6504] 22 Jul 22:54:45.060 * Background saving started by pid 8572 [8572] 22 Jul 22:54:45.

linux开放指定端口命令

方式一 CentOS: 1、开启防火墙 systemctl start firewalld 2、开放指定端口 firewall-cmd --zone=public --add-port=1935/tcp --permanent 命令含义: --zone #作用域 --add-port=1935/tcp #添加端口,格式为:端口/通讯协议 --permanent #永久生效,没有此参数重启后失效 3、重启防火墙 firewall-cmd --reload 4、查看端口号 netstat -ntlp //查看当前所有tcp端口· netstat -ntulp |grep 1935 //查看所有1935端口使用情况· 方式二 #开放端口:8080 /sbin/iptables -I INPUT -p tcp --dport 8080 -j ACCEPT 方式三 -A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT service iptables restart 转载于:https://www.cnblogs.com/sxmny/p/11224842.html

ShareTechnote系列LTE(7):SIB调度

SIB调度 在LTE中,MIB、SIB1、SIB2被强制发送给任何小区,由于许多SIB被传输,因此发送SIB的位置(子帧)不应与发送另一个SIB的子帧相同。 SIB总体调度概念如下: i)MIB以固定周期传输(从SFN 0开始每4帧一次) ii)SIB1也以固定周期传输(从SFN 0开始每8帧一次)。 iii)所有其他SIB按照SIB1中SIB调度信息指定的周期进行传输。 如果不正确地设置iii)中的调度信息值,所有其他SIB将不会被UE解码,这意味着,即使所有的SIB都在传输,UE会试图在错误的时间对它们进行解码,但是UE无法识别小区并显示“无服务”消息。 根据36.331的5.2.1.2,MIB调度如下: MIB使用40 ms的固定周期,并在40 ms内重复发送。MIB的第一次传输安排在SFN mod 4=0的无线电帧的子帧0中,在所有其他无线电帧的子帧0中重复发送。 根据36.331的6.2.2 消息定义-主信息块字段描述,MIB中的系统帧号规定如下: 定义SFN的8个最高有效位。如TS 36.211[21,6.6.1]所示,在P-BCH解码中隐式获取SFN的2个最低有效位,即40毫秒P-BCH TTI的定时表示2个最低有效位(在40毫秒P-BCH TTI内,第一个无线帧为00,第二个无线帧为01,第三个无线帧为10,最后一个无线帧:11)。每个适用于所有服务小区(相关功能是通用的,即不是为每个小区单独执行)。 根据36.331的5.2.1.2,SIB1调度如下: SystemInformationBlockType1使用一个80 ms的固定周期,并在80 ms内进行重复。SystemInformationBlockType1的第一次传输安排在SFN mod 8=0的无线电帧的子帧5中,重复安排在所有SFN mod 2=0的无线电帧的子帧5中。 这意味着,尽管SIB1周期为80 ms,但SIB1的不同副本(还原版本:RV)每20 ms传输一次。也就是说,在L3,每80 ms看到SIB1,但在PHY层,每20 ms就能看到它。有关每次传输的详细RV分配,可参阅36.321的5.3.1。 以下日志(来自Amarisoft)清楚地显示了如上所述的SIB1传输。 其他SIB的传输周期由SIB1中的调度信息列表确定,如以下示例所示(本示例是传输SIB2和3的情况)。 注意到,第一个节点中的sib-mappinginfo未指定,但schedulingInfoList的第一个实体应始终是36.331中指定的SIB2,如下所示(参见36.331 SystemInformationBlockType1字段描述)。 映射到此系统信息消息的SIB列表,没有SIB2的映射信息;它始终出现在schedulingInfoList列出的第一条系统信息消息中。 理解子帧编号的整个循环是非常简单的,但是准确理解SIB应该在哪个子帧上传输并不简单,它与SIB1中“si-WindowLength ”有关。si-WindowLength告诉我们,SIB应该从si-Periodicity指定的SFN开始在窗口长度内的某个地方传输。但是这个参数没有明确的指出子帧号。 特定SIB传输的子帧由36.331 的5.2.3SI消息采集算法确定,如下所示: 当获取SI信息时,UE应: 1>确定相关SI消息的SI窗口的开始位置,如下所示: 2>对于相关的SI消息,确定与SIB1中 schedulingInfoList中配置的SI消息列表中的条目顺序相对应的数字n; 注:SystemInformationBlock Typel的 schedulingInfolist指定了SI消息的列表,每个SI消息在该列表中的顺序以n表示(从1开始)。假如schedulingInfolist中指定了4个SI消息,则会有4个连续的SI窗口用于发送这4个SI消息,而n表明了SI消息在第几个SI窗口。 2>确定整数值x=(n–1)*w,其中w是si-WindowLength; 2>si窗口从子帧a开始,其中a=x mod 10,SFN mod t=floor(x/10),t是相关si消息的 si-Periodicity; 注:仅当所有SI都安排在SFN mod 2=0的无线电帧中的子帧5之前时,e-utran才应将SI窗口配置为1 ms。 注2:从公式可以看出,x决定了SI窗口在该SI周期内的起始帧和起始子帧;SFN mod t保证了SI窗口在SI周期内只出现一次;而x=(n-1)*w保证了SI窗口之间紧挨,不重叠,没有空隙。(SI窗口起始帧和起始子帧的的计算,详见36.331的 5.2.3节) 1>使用SI-RNTI 从SI窗口的开始接收DL-SCH,并继续到SI窗口的结束,该窗口的绝对时间长度由si-WindowLength给出,或直到接收到si消息为止,不包括以下子帧: 2>SFNmod 2=0的无线帧的子帧5;

java中如何将OutputStream转换为InputStream

在不需要文件生成的情况下,直接将输出流转换成输入流。可使用下面的三种方法: 如果你曾经使用java IO编程,你会很快碰到这种情况,某个类在OutputStream上创建数据而你需要将它发送给某个需要从输入流读取数据的类。 你很快会被问道,“java中如何将OutputStream转换为InputStream?” 方法一:使用字节数组缓存数据 最简单的方法是用字节数组缓存数据。代码 ByteArrayOutputStream out = new ByteArrayOutputStream(); class1.putDataOnOutputStream(out); class2.processDataFromInputStream( new ByteArrayInputStream(out.toByteArray()) ); 于是,OutputStream就被转换为InputStream了。 方法二:使用管道 第一种方法的问题是你必须有足够的内存缓存所有数据。你可以使用文件系统缓存更多数据,但无论如何可处理数据的大小还是受到限制。 解决方法是创建一个线程产生数据到PipedOutputStream。当前线程可从中读取数据。 PipedInputStream in = new PipedInputStream(); PipedOUtputStream out = new PipedOutputStream(in); new Thread( new Runnable(){ public void run(){ class1.putDataOnOutputStream(out); } } ).start(); class2.processDataFromInputStream(in);||| 方法三:使用循环缓存区 方法二中的两个管道流,实际上管理着一个隐藏的循环缓存区。使用一个显式的循环缓存区更易于理解。CircularBuffers 有如下优点 一个CircularBuffers类而不是两个管道类。 较于缓存所有数据和额外线程的方法更容易使用。 你可以更改缓存大小而不必受限于管道缓存区1K的固定缓存大小。 多线程情形: CircularByteBuffer cbb = new CircularByteBuffer(); new Thread( new Runnable(){ public void run(){ class1.putDataOnOutputStream(cbb.getOutputStream()); } } ).start(); class2.processDataFromInputStream(cbb.getInputStream()); 单线程情形 // buffer all data in a circular buffer of infinite size CircularByteBuffer cbb = new CircularByteBuffer(CircularByteBuffer.

Flutter路由管理和页面参数的传递(获取&返回)

前言 在做 Flutter 开发的时候所有的页面以及页面上的元素都变成了 Widget ,创建一个页面或者视图直接 new 一个新的 widget 就可以,相关的参数我们可以直接通过构造函数直接传递。 我们做 Android 开发的人员都知道 Android 应用程序在进行页面跳转的时候可以利用Intent进行参数传递,那么再开发 Flutter 的时候有类似的方式可以进行参数传递么?答案当然是有。 Flutter中文网 中有一段话,大多数应用程序包含多个页面。例如,我们可能有一个显示产品的页面,然后,用户可以点击产品,跳到该产品的详情页。 在Android中,页面对应的是Activity,在iOS中是ViewController。而在Flutter中,页面只是一个widget! 在Flutter中,我们那么我们可以使用Navigator在页面之间跳转。 所以我们下边讲述 widget 的参数传递,从简单到简便: widget构造参数传递 route参数传递 上面两种方式进混合(onGenerateRoute) widget构造参数传递 class Page extends StatelessWidget{ Page({this.arguments}); final Map arguments; @override Widget build(BuildContext context) { return Material( child: Center( child: Text("this page name is ${arguments != null ? arguments['name'] : 'null'}"), ), ); } } 上面是一个简单的 Flutter 的视图组件,我们在使用参数 arguments 的时候只需要将其传入到 Page({this.arguments}) 的构造函数中。 void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', home: Page(arguments: {"

java中List元素移除元素的那些坑

本文主要介绍,java中list集合移除元素的那些坑,今天小编就和大家一起来了解一下吧! 一、问题案例 1.1、for循环移除 public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("11"); list.add("11"); list.add("12"); list.add("13"); list.add("14"); list.add("15"); list.add("16"); System.out.println("原始list元素:"+ list.toString()); CopyOnWriteArrayList<String> copyList = new CopyOnWriteArrayList<>(list); //通过下表移除等于11的元素 for (int i = 0; i < list.size(); i++) { String item = list.get(i); if("11".equals(item)) { list.remove(i); } } System.out.println("通过下表移除后的list元素:"+ list.toString()); //通过对象移除等于11的元素 for (int i = 0; i < copyList.size(); i++) { String item = copyList.get(i); if("11".equals(item)) { copyList.remove(item); } } System.

redis命令-key操作

目录 DEL RENAME RENAMENX EXPIRE EXPIREAT PEXPIRE PEXPIREAT TTL PTTL PERSIST EXISTS KEYS MOVE RANDOMKEY OBJECT TYPE SORT SCAN DUMP RESTORE MIGRATE DEL 语法:DEL key [key ...]功能:删除给定的一个或多个 key 。可用版本:>= 1.0.0时间复杂度:O(N), N 为被删除的 key 的数量。删除单个列表、集合、有序集合或哈希表类型的 key ,时间复杂度为O(M), M 为以上数据结构内的元素数量。返回值:被删除 key 的数量。 RENAME 语法:RENAME key newkey功能:将 key 改名为 newkey 。可用版本:>= 1.0.0时间复杂度:O(1)返回值:改名成功时提示 OK ,失败时候返回一个错误。当 key 和 newkey 相同,或者 key 不存在时,返回一个错误。当 newkey 已经存在时, RENAME 命令将覆盖旧值。 RENAMENX 语法:RENAMENX key newkey功能:将 key 改名为 newkey 。可用版本:>= 1.

linux模糊删除文件

linux(模糊批量删除文件)删除指定文件夹中某个文件除外的其他文件 # shopt -s extglob # rm -fr !(file1) (慎用) 排除多个可以这样: # rm -rf !(file1|file2) (慎用) 首先科普下shopt -s extglob Bash Shell有个extglob选项,开启之后Shell可以另外识别出5个模式匹配操作符,能使文件匹配更加方便。 开启shopt命令:shopt -s extglob 关闭shopt命令:shopt -u extglob 开启将会有5个模式匹配操作符将被识别: ?(pattern-list) - 所给模式匹配0次或1次; *(pattern-list) - 所给模式匹配0次以上包括0次 +(pattern-list) - 所给模式匹配1次以上包括1次 @(pattern-list) - 所给模式仅仅匹配1次 !(pattern-list) - 不匹配括号内的所给模式 示例 删除文件名不以jpg结尾的文件: rm -rf !(*jpg) 删除文件名以jpg或png结尾的文件: rm -rf *@(jpg|png)

MyBatis 核心配置综述之StatementHandler

StatementHandler 是四大组件中最重要的一个对象,负责操作 Statement 对象与数据库进行交流,在工作时还会使用 ParameterHandler 和 ResultSetHandler 对参数进行映射,对结果进行实体类的绑定 MyBatis 四大组件之StatementHandler 我们在搭建原生JDBC的时候,会有这样一行代码 Statement stmt = conn.createStatement(); //也可以使用PreparedStatement来做 这行代码创建的 Statement 对象或者是 PreparedStatement 对象就是由StatementHandler进行管理的。 StatementHandler 的基本构成 来看一下StatementHandler中的主要方法: prepare: 用于创建一个具体的 Statement 对象的实现类或者是 Statement 对象 parametersize: 用于初始化 Statement 对象以及对sql的占位符进行赋值 update: 用于通知 Statement 对象将 insert、update、delete 操作推送到数据库 query: 用于通知 Statement 对象将 select 操作推送数据库并返回对应的查询结果 StatementHandler的继承结构 有没有感觉和 Executor 的继承体系很相似呢?最顶级接口是四大组件对象,分别有两个实现类 BaseStatementHandler 和 RoutingStatementHandler ,BaseStatementHandler 有三个实现类, 他们分别是 SimpleStatementHandler、PreparedStatementHandler 和 CallableStatementHandler。 RoutingStatementHandler: RoutingStatementHandler 并没有对 Statement 对象进行使用,只是根据StatementType 来创建一个代理,代理的就是对应Handler的三种实现类。在MyBatis工作时,使用的StatementHandler 接口对象实际上就是 RoutingStatementHandler 对象。我们可以理解为 StatementHandler statmentHandler = new RountingStatementHandler(); public RoutingStatementHandler(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) { // 根据 statementType 创建对应的 Statement 对象 switch (ms.

keras faster r-cnn源代码解析(四)——ROI

一、利用ROI训练分类器 最后是ROI的生成了,在每个训练的epch循环中,核心代码如下: #输出:yield np.copy(x_img), [np.copy(y_rpn_cls), np.copy(y_rpn_regr)], img_data_aug #网络训练的输入是图片,和找到的最优的anchor,不是GTbox X, Y, img_data = next(data_gen_train) # loss_rpn = model_rpn.train_on_batch(X, Y)#Scalar training loss (if the model has a single output and no metrics) or list of scalars (if the model has multiple outputs and/or metrics). write_log(callback, ['rpn_cls_loss', 'rpn_reg_loss'], loss_rpn, train_step) P_rpn = model_rpn.predict_on_batch(X)#获取预测的Y值,即[np.copy(y_rpn_cls), np.copy(y_rpn_regr)] #筛选出ROI,ROI指的是在feature map中合法box中具有最大概率包含物体的box,删除重叠率较高的box之后剩下来的box(xxx,4) R = roi_helpers.rpn_to_roi(P_rpn[0], P_rpn[1], C, K.image_dim_ordering(), use_regr=True, overlap_thresh=0.7, max_boxes=300) # note: calc_iou converts from (x1,y1,x2,y2) to (x,y,w,h) format #img_data,图片的信息,R候选ROI #输出: #X2:#选取的iou大于0.

while()循环条件为假却不退出循环

之前在做EFM32TG的一个项目时,遇到了一个问题,while循环条件为假却还是一直在循环里面无法退出,代码如下: /***************************************************************************//** * @brief Delays number of msTick Systicks (typically 1 ms) * @param dlyTicks Number of ticks to delay ******************************************************************************/ void TickDly(uint32_t dlyTicks) { uint32_t curTicks; curTicks = msTicks; while ((msTicks - curTicks) < dlyTicks) ; } 函数功能很简单就是一个毫秒延时,变量msTick在滴答中断中每毫秒自增1。 经过查找资料和跟网友的交流谈一下自己对这个问题的理解: 当进入循环的时候,CPU是把msTick是从内存加载到寄存器中运行的,中断发生的时候同样是把msTick加载到寄存器赋值后在存到内存中,最后退出中断在回到循环中。所以msTick对应的内存值已经发生改变,但循环里面却没有重新从内存中加载变量的值导致循环里面msTick的值并没有发生改变所以无法退出循环。 解决方法就是在msTick加上volatile关键字修饰,这样编译后的程序在msTick变量发生改变的时候就会直接从变量地址中加载该变量的值。

05 spu和sku解析 分布式文件服务器FastDFS

spu商品信息聚合的最小单位 例如iphone7 sku库存进出计量单位 例如 iphone7 金色 移动 32G iphone7 银色 电信 64G iphone7 粉色 电信 128G 都是sku 富文本编辑器 初始化 KindEditor.ready allowFileManager 【是否允许浏览服务器已上传文件】 默认值是:false var editor; KindEditor.ready(function (k) { editor=K.create('textarea[name="content"]',{ allowFileManager:true }); }); 提取富文本编辑器中的内容 var content=editor.html() 清空内容 editor.html("") 上传图片步骤后端使用MultipartFile接收前端传过来的图片获取文件名 multipartFile.getOriginalFilename()使用Client.conf配置文件指定图片服务器地址在springmvc.xml文件中配置文件上传多媒体解析器使用工具类上传图片只返回图片id(由fastDFS自动组装的包括 组名 虚拟磁盘路径 数据两级目录 文件名 组成 )想要前端访问到图片还应拼接上服务器地址在AgularJS中使用new FormData()表示上传带有图片的表单 formData.append("file",file.files[0]) file 是angularjs上传文件固定的post方式上传 data类型设置 为上面的formData 此时还应设置头信息 headers :{'Content-Type':undifined} 此时浏览器就会把header头信息变成 multipart/form-data格式 否则默认为application/json格式 还需要表单序列化 transformRequest : angular.identity formData.append("file",file.files[0]); return $http({ method:'POST', url:"../upload.do", data: formData, headers: {'Content-Type':undefined}, transformRequest: angular.

Redis系列之HyperLogLog用法简介

(1)HyperLogLog简介 在Redis 在 2.8.9 版本才添加了 HyperLogLog,HyperLogLog算法是用于基数统计的算法,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。HyperLogLog适用于大数据量的统计,因为成本相对来说是更低的,最多也就占用12kb内存 业务场景,HyperLogLog常用于大数据量的统计,比如页面访问量统计或者用户访问量统计 举个例子,假如要统计一个页面的访问量(PV),这个还比较好办,可以直接用redis计数器或者直接存数据库都可以做,然后如果再加需求,现在要统计一个页面的用户访问量(UV),一个用户一天内如果访问多次的话,也只能算一次,这样的话,你可能会想到用SET集合来做,因为SET集合是有去重功能的,key存储页面对应的关键字,value存储对应userId,这种方法是可行,可是访问量一多的话,假如有几千万访问量,那就麻烦了,为了统计一个访问量,要频繁创建SET集合对象 那有其它方法吗?针对上面大访问量的情况,redis是有实现了HyperLogLog算法,HyperLogLog 这个数据结构的发明人 是Philippe Flajolet 教授 Redis集成的HyperLogLog使用语法主要有pfadd和pfcount,顾名思义,一个是来添加数据,一个是来统计的,使用比较容易掌握,不过算法是比较复杂的,然后为什么用pf?是因为HyperLogLog 这个数据结构的发明人 是Philippe Flajolet教授 ,所以用发明人的英文缩写,这样我们也容易记住这个语法了 下面给出一些简单例子,启动redis客户端 127.0.0.1:6379> flushall OK 127.0.0.1:6379> pfadd uv user1 (integer) 1 127.0.0.1:6379> pfcount uv (integer) 1 127.0.0.1:6379> pfadd uv user2 (integer) 1 127.0.0.1:6379> pfcount uv (integer) 2 127.0.0.1:6379> pfadd uv user3 (integer) 1 127.0.0.1:6379> pfcount uv (integer) 3 127.0.0.1:6379> pfadd uv user4 (integer) 1 127.0.0.1:6379> pfcount uv (integer) 4 127.