每周最令人期待的一天就是星期日了,大部分人都可以好好休假一天,但是在家无聊,我们一般都会找一些电影看,然而很多想看的不是要会员就是要付费,很令人头疼。
不过这些都是小事儿,今天我就来分享5个珍藏已久的电影网站,各种大片免费看,不过要请大家悄悄滴收藏。
一、迅捷CAD教程 眼看就要工作了,得提前温故一下知识,有学习CAD制图的快来看看,主要分为CAD零基础教程和CAD入门到精通,这个两大教学视频,适合新手老手学习,整套教程结构完善、脉络清晰、易于掌握。
二、99电影网 长长久久的线上电影院,提供电视剧、电影、动漫、综艺等等,经常更新最新的视频,也能查看影片排行;还支持搜索影片关键词和明星、演员查找电影。
三、4K屋电影网 追求电影画质,还是这个网站比较靠谱,一听名字就知道是4K画质,主打电影和电视剧,挑选影片时可以根据分类筛选,能很快帮你定位到你需要的类型。
四、被窝电影网 很多人都会开玩笑说,是一款躲在被窝里看的电影网站,除了有电影、电视剧、动漫之外,还提福利;此外还有资讯、专题、留言栏目,让你看片不再孤单。
五、飘花电影网 这个电影网站的资历比较老了,想必是众所周知!强档推荐各种大片免费看,每都会更新最新电影,电影种类也很多,动作片、科幻片、喜剧、爱情等。
星期日的这波电影网站福利,你喜欢吗?各种大片随意看,不花钱也能享受特殊待遇,但是不要到处宣传哦。
有需要的链接的的朋友记得私信我:“84”,即可获取。
一、下载安装 1、在官网下载:Nexus Repository Manager OSS 3.x, 解压至任意位置。(但是我在官网下载了几次都没成功)
百度云下载地址:
Nexus Repository Manager OSS 3.x
提取码:7w7w
2、管理员运行cmd, 切换到 nexus-3.17.0-01/bin 目录,
nexus.exe /install进行安装, 成功后会提示 Installed service 'nexus'
注意: 如果提示 wrapper | OpenSCManager failed - 拒绝访问。 (0x5) 是因为没有使用管理员身份启动cmd
解决方式: 找到cmd.exe文件,右键点击 ----> 以管理员身份运行 ,然后进入到nexus-3.17.0-01/bin 目录,就可以正常执行nexus install 和 nexus.exe /run 命令了
二、启动 1、nexus.exe /run 运行服务。这里注意:有的版本的启动命令是:nexus.exe /start
2、等待启动完毕后, 进入http://localhost:8081, 点击右上角 Sign In登陆。网上大部分博客都会讲默认的用户名和密码分别是admin和admin123。但是,如果你在3.x上面直接输入是进不去的。会有一个错误提示,如下图所示:
解决方案: 当nexus解压之后会有两个文件夹nexus3.x和sonatype-work, 默认的密码在sonatype-work文件夹下,会有一个admin.password的文件,里面就是默认的密码,复制即可,然后输入用户名:admin,密码:就是复制的那一串东西。进去之后会让你更改密码,改成你自己的密码即可。
3、修改默认的端口(可以不修改,看自己喜好)
在你的nexus路径下的etc文件夹下的nexus-default.properties里面修改,打开nexus-default.properties文件,如下图所示,修改默认端口8081为8092即可。
三、添加npm仓库 1、点击在左侧菜单Repositories,可以看到仓库类型列表,如下: npm(group)表示分组,npm(hosted)表示本机私有,npm(proxy)表示远程代理。
若registry配置为group(包括hosted和proxy),首先会从hosted取,若无则从proxy取并缓存,下次则会从缓存取。
2、点击Create repository按钮创建仓库 第一种:代理 npm 仓库: npm(proxy) 将公共 npm 服务器的资源代理缓存,减少重复下载,加快开发人员和CI服务器的下载速度。创建时选择 npm(proxy) ,只需填写 Name 和 Remote storage (公有库域名)即可。https://registry.
因为安装了360 安全卫士,导致右下角总是有很多应用程序在弹出广告,烦死人。
在 任务管理器 --进程 --打开文件所在位置
试图删除这些应用程序,竟然被保护了,不让删除!
气人!
怎么办?
进入安全模式进行删除:
Win+R 输入 msconfig --引导选项卡 --勾选 安全引导–重启电脑
重启过程中,按F8,进入 安全模式,对 此前的弹窗应用程序进行删除。
Tips1:
文件被定位到了比如: c:\users\***\AppData\Roaming\360safe\SoftMgr
目录下,但是你从任务管理器进去时,却发现没有这个文件夹,神奇了。
这是因为文件夹对系统文件进行了隐藏
找到文件夹查看相关的菜单,对隐藏文件进行解隐藏即可。
Tips2:
360的比如 360Newsld(新闻)、360DayPop(每日要闻)、360speedld(开机小助手)
不仅需要在 c:\users\***\AppData\Roaming\360safe\SoftMgr 下进行删除,在:
c:\Program Files\360\360Safe\SoftMgr
目录下也需要同步删除
我试过只删除某一个目录下的,看上去,开机后,程序还是能起来。不是太明白为什么360 这么厉害。
当然,这段话,我还需要再花时间再实践再验证。
Tips3:
进入安全模式后,想要重启后退出安全模式
用进入安全模式的逆操作:
win+r --msconfig–引导–去掉 安全引导 复选框
再次开机后,就没有那么多弹窗啦~~
开心极了~
宝塔搭建oneindex 一、基本介绍效果图 二、准备工作三、宝塔配置四、登录 azure 获得机密与ID五、安装六、完善 一、基本介绍 OneIndex针对Onedrive网盘的一个开源程序。可以将Onedrive存储的文件展示,直连下载。视频还能在线播放!不用服务器空间,不走服务器流量!
不建议用来做 床图,oneindex虽然上传下载不需要走自己的服务器,不过还是需要有服务器的辅助,不易做床图的之类的关键节点。
效果图 二、准备工作 服务器一台,域名,准备一个OneDrive账号
php5.6、Nginx、Redis
以及下载oneindex,提取码:4vxs
三、宝塔配置 1、安装Redis
2、php5.6以及php中的扩展REdis
3、绑定并选择php5.6,不需要数据库
4、配置ssl证书,并设置伪静态
伪静态
if (!-f $request_filename){ set $rule_0 1$rule_0; } if (!-d $request_filename){ set $rule_0 2$rule_0; } if ($rule_0 = "21"){ rewrite ^/(.*) /index.php?/$1 last; } 5、oneindex解压至安装路径
修改cenoroller目录下的Admincontroller.php,框中部分改成自己的域名
四、登录 azure 获得机密与ID 1、访问自己的域名
2、点击获取机密和id这里需要记得依次保存
最后这个是id
五、安装 1、输入刚刚的密码和id
2、然后就是说绑定你的onedrive账号
3、绑定成功
六、完善 安装完成后有很多玩法,看自己需求这里我就做一下基本都要做的
1、修改网站显示路径
默认都是显示\目录下的所有文件我一般不喜欢这么做
2、上传文件后台是可以上传的,不过那样比较繁琐,它只能从服务器上传上去到onedrive,我一般是本地安装一个onedrive软件,直接上传上去到我的/storage目录
3、文件上传上去是不会立即在网站上显示的,你需要点击“重构所有缓存”,当然我猜没有人想每次都来后台点击,所以你可以复制shell脚本在宝塔的“计划任务中来自动执行”
脚本
手动
自动
#!/bin/bash
#这里可替换为你自己的执行程序,其他代码无需更改
APP_NAME=websocketserver-0.0.1-SNAPSHOT.jar
#使用说明,用来提示输入参数
usage() {
echo "Usage: sh 脚本名.sh [start|stop|restart|status]"
exit 1
}
#检查程序是否在运行
is_exist(){
pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}' `
#如果不存在返回1,存在返回0 if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
#启动方法
start(){
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is already running. pid=${pid} ."
else
nohup java -jar /mnt/ssd1/project/websocket/$APP_NAME > /mnt/ssd1/project/websocket/websocketserverlog.file 2>&1 &
echo "${APP_NAME} start success"
fi
一、本书的Part I(C++基础)是C++基础,必须进行通读掌握。这几章有非常多的小细节比较坑爹,指针与数组、指针与const、sizeof()运算符、this指针等等,看完这部分,一些最基础的程序基本上都能解决。第3、6、7章个人觉得对新手最困难,而且非常重要,需要重点理解。
二、Part II(C++标准库) ,第8、9章最为重要,IO库和容器对于一个程序来说是比较基础的,记得不要在C++中还依然保持C的习惯,使用cout而不是printf()、使用vector而不是内置数组、使用迭代器进行遍历。第10、11章有点基础的看起来不是很难,第十章的泛型算法,如果能用起来会让你的程序更上一层楼。第12章动态内存个人觉得对于一个想要深入学习C++的人来说非常重要,对于内存的理解、动态数组、new和delete运算符,对于C++的理解更加”底层“一点,最后12.3的例子,一定要自己动手写!
三、Part III (类设计者的工具),我觉得是中级学习的核心了,第13章对于一个C语言的学习者来说是全新的东西,理解了拷贝和赋值还有移动,可以理解更加深入的理解类,面向对象是一个很重要的概念。第十四章我略过没看,暂时用处不大。第15章面向对象程序设计,学完个人觉得是一个显著的提升过程,最重要的是面向对象的这种思想,第15章中有很多的例子,一定要亲手敲出来!第16章,模版与泛型编程,重在理解,16.1中的函数模版和类模版只要掌握就好了
四、Part IV(高级主题),第17章我也略过了,这些东西从来没遇到过(17.5可以看看,作为第八章的延伸也挺有用的),暂时不看,只作了解。第18章个人觉得你要是有志于进行C++软件开发,算是很重要的部分,18.1异常处理、18.2命名空间、18.3多重继承与虚继承都要重点理解,个人在看很多github上的大型工程源码时,遇到的次数还是比较多的。第19章,虽然遇到不多,但是面试笔试过程真的很喜欢问这些,new和malloc的区别、new的底层实现过程、union的内存机制等等,建议19.1、19.4、19.6重点理解。
引自https://blog.csdn.net/misayaaaaa/article/details/53786215
链接: link.https://blog.csdn.net/misayaaaaa/article/details/53786215
https://blog.csdn.net/misayaaaaa/article/details/53786215
(https://blog.csdn.net/misayaaaaa/article/details/53786215)
使用 @WebServlet("/XXX"); 声明一个servlet。启动浏览器访问后显示失败。
通过查询其他博客得知,问题出在 Web.xml 文件中 标签web-app 的属性 metadata-complete。
当这个属性设置为true时,文件告诉容器,它的描述是完整的,不需要扫描注释。
将属性改为false后重新访问,果然问题解决了。
最近在搞无人机飞控的学习,大致了解了下PX4的文件结构和编译,它的文件中有许多Makefile和Cmake文件,对其在整个文件编译过程中的作用不甚了解。在进行一番查询后,终于有了个大致的认识,现在将其记录下来。
以下内容大部分来自知乎网友:“辉常哥”和“玟清”在问题make makefile cmake qmake都是什么,有什么区别?下的回答。
目录
1.什么是gcc
2.什么是make
3.什么是Makefile
4.什么是Cmake
5.简单总结
gcc是GNU Compiler Collection的缩写(就是GNU编译器套件),也可以简单认为是编译器,它可以编译很多种编程语言(括C、C++、Objective-C、Fortran、Java等等)。当你的程序只有一个源文件时,直接就可以用gcc命令编译它。但当你的程序包含很多个源文件时,用gcc命令逐个去编译时,你就很容易混乱而且工作量大,所以出现了make工具。
2.什么是make make工具可以看成是一个智能的批处理工具,它本身并没有编译和链接的功能,而是用类似于批处理的方式—通过调用makefile文件中用户指定的命令来进行编译和链接。
3.什么是Makefile 简单的说就像一首歌的乐谱,make工具就像指挥家,指挥家根据乐谱指挥整个乐团怎么样演奏,make工具就根据makefile中的命令进行编译和链接。makefile命令中就包含了调用gcc(也可以是别的编译器)去编译某个源文件的命令。makefile在一些简单的工程完全可以用人工手写,但是当工程非常大的时候,手写makefile也是非常麻烦的,如果换了个平台makefile又要重新修改。这时候就出现了Cmake工具。
4.什么是Cmake cmake可以更加简单的生成makefile文件给上面那个make用。当然cmake还有其他功能,就是可以跨平台生成对应平台能用的makefile,你就不用再自己去修改了。cmake根据什么生成makefile呢?它又要根据一个叫CMakeLists.txt文件(学名:组态档)去生成makefile。到最后CMakeLists.txt文件谁写啊?亲,是你自己手写的。
当然如果你用IDE,类似VS这些一般它都能帮你弄好了,你只需要按一下那个三角形。
5.简单总结 5.1 cmake用来转译CMakeLists.txt,在linux下它会生成Makefile,来给make执行。
5.2 Makefile+make可理解为类unix环境下的项目管理工具, 而cmake是抽象层次更高的项目管理工具。
5.3 下面给出其关系图:
目录 一、http Headers的基本概念二、http Headers详解1. Accept2. Accept-Charset3. Accept-Encoding4. Accept-Language5. Accept-Ranges6. Access-Control-*7. Age8. Allow9. Authorization10. Cache-Control11. Connection12. Content-Encoding13. Content-Language14. Content-Length15. Content-Location16. Content-Range17. Content-Security-Policy18. Content-Type19. Cookie20. Date21. ETag22. Expect23. Expires24. From25. Host26. If-Match27. If-Modified-Since28. If-None-Match29. If-Range30. If-Unmodified-Since31. Last-Modified32. Link33. Location34. Max-Forwards35. Negotiate36. Origin37. Pragma38. Proxy-Authenticate39. Range40. Referer41. Retry-After42. Server43. Set-Cookie44. Strict-Transport-Security45. TE46. Trailer47. Transfer-Encoding48. Upgrade49. User-Agent50. Vary51. Via52. Warning 总结 本文主要参考自MDN文档: HTTP Headers,并参考网上资料,对较为常用且文档中不详细的地方加以解释。 完整的Headers列表在IANA 注册表中维护,该文档内包含每个Headers对应的RFC文档,不过这些文档过于详尽且不易理解,所以只适合需要深入学习http协议的开发者阅读。
一、http Headers的基本概念 对http和https的原理感兴趣的,可以参考我之前的博客:http与https原理分析。在该博客内,我们讲到过http的消息结构:
一次http请求包含请求和响应两个阶段,它们的消息结构是一致的。
请求阶段指客户端向服务端发送请求的阶段。所发送的消息包含请求行、请求头部、一个回车加换行符以及请求数据四个部分,如上图所示。
请求行包含本次请求的资源路径、请求方法、协议等;请求头部(Request Headers)携带了关于本次请求的描述信息,如可接受的压缩格式、编码类型、期望的数据响应格式、cookie等参数,服务端将根据这些参数来决定如何封装响应体;回车和换行是隔离消息头部和消息体的标志;请求数据是请求所携带的实体数据,在POST、PUT一类方法中较为常用。
String a = "a"; String b = "b"; String c1 = "ab"; String c = "a"+"b"; String c2 = "a"+"b"; 1.字符串常量直接相加 分析:
String a = "a"; String b = "b"; String c1 = "ab"; 1.会把字符串"a"、“b”、“ab"放进常量池中,并返回给a、b、c1
2.String c=”a“+“b” jvm会在运行时将"a”+“b"自动拼接成"ab”,
然后会首先在常量池中寻找是否已有"ab",有则将”ab“在常量池中的地址返回给c,否则在常量池中创建"ab",并返回常量池中”ab“的地址
3.c2同理;
所以c、c1、c2都是存放的时常量池中’'ab"的地址。
2.1字符串常量对象相加 String a = "a"; String b = "b"; String c1 = "ab"; String c = "a"+"b"; String c2 = "a"+"b"; 分析:
String a = "a"; String b = "
1、jsp发出请求
<a href="emp!addEmp">add</a> <a href="emp!deleteEmp">delete</a> <a href="emp!updateEmp">update</a> 2、配置action,不需要指定具体方法,用!动态调用
<package name="invoke" namespace="/" extends="struts-default"> <action name="emp" class="com.slh.struts.invoke.InvokeAction"></action> </package> 3、调用方法
private static final long serialVersionUID = 1L; public String addEmp(){ System.out.println("addEmp..."); return NONE; } public String deleteEmp(){ System.out.println("deleteEmp..."); return NONE; } public String updateEmp(){ System.out.println("updateEmp..."); return NONE; } 前半部分与action 的name相同,后面是方法名。例如emp!updateEmp。
动态调用需要开启。
<!-- 开启动态调用 --> <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
前言 生活艰难,又需要学习neo4j 典型的图型数据库。笔者使用阿里云服务器windows server 2019进行neo4j数据库的安装配置,实现远程访问
踩坑其实不多 可能是之前配过很多东西?甚至感觉这个有点好配..
下载 neo4j有梯子的话直接去官网下载即可 注意不要下载错了 很容易下载一个neo4j desktop 是一个集成的管理环境,也包括neo4j,但是对于服务器来说
多余的管理环境是不必要的,配置好后直接可以通过自己的移动终端进行远程管理
没有梯子建议使用百度网盘:
https://pan.baidu.com/s/1hygHS6_W5rqoAc41V30sTQ
提取码: v524
安装 1. 下载好之后直接解压缩到服务器硬盘目录 记好路径
2. 配置环境变量 习惯使用小娜直接搜索 win 输入环境变量 系统变量中新建刚才的解压路径 配置变量名为NEO4J_HOME
然后在PATH变量中新增 %NEO4J_HOME%\bin
3. 检查是否安装成功 命令行窗口中输入
neo4j.bat console 然而实测会出现这样的错误
此时打开power shell 输入以下命令
neo4j --powershell Set-ExecutionPolicy -ExecutionPolicy RemoteSigned Import-Module 'C:\Program Files (x86)\neo4j-community-3.5.5\bin\Neo4j-Management.psd1' Invoke-Neo4j console # 记得切换路径为自己的安装路径 出现starting说明neo4j已经安装完毕
远程访问配置 上述过程已经把neo4j配置安装在了服务器本地上,然而并未对公网暴露端口,可以看到http端口默认为7474,bolt端口为7687(实际部署端口)
那么需要在阿里云安全组当中配置好这两个端口的入站规则
然后进入安装目录的conf文件夹当中,编辑neo4j.conf文件
可以选择自行修改,或者直接复制文章末尾已经配置完毕的neo4j.conf文件代码到你的文件当中替换
自行修改需要修改两处
1.将此处注释替换掉 赋值0.0.0.0(全开放)
2.将此处修改为如图所示的配置
如果进行域名备案的话还需要配置https和SSL证书等配置,烦请注意
配置好后,通过ip:7474即可访问自己服务器的neo4j
初始用户名密码均为 neo4j
初次登录后会提示修改密码
over! 附:neo4j.
package com.xxx; import android.util.Base64; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.security.InvalidKeyException; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; import java.security.spec.InvalidKeySpecException; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; /** * create by chenyingjie on 2020/3/30 * desc */ public class RSAUtil { private static final String PUB_K = ""; private static final Charset CHARSET = StandardCharsets.
问题描述 在Vue的项目中使用了Vue-Router,当某个路由有子级路由时,如下写法:
export default new Router({ routes: [ { path: '/', name: 'home', component: Home, children:[ { path:'/', name: 'console', component: Console, } ] } ] }) 如果写法是如上的写法,就会报出如下警告: 解决办法 因为当某个路由有子级路由的时候,这时候父级路由需要一个默认的路由,所以父级路由不能定义name属性,SO解决办法是:即去除父级的name属性即可
export default new Router({ routes: [ { path: '/', //把这里的name属性去掉 //name: 'home', component: Home, children:[ { path:'/', name: 'console', component: Console, } ] } ] })
前言 本文用栈解决迷宫问题,采用C语言实现,包括问题介绍、算法简介、求解过程、代码实现、结果展示。并附有完整代码。
本文完整代码:
https://pan.baidu.com/s/1r24R6mTlGHxUkEezWm4BjQ
提取码:2bbE
一、迷宫问题 概括来说,迷宫问题就是在一个封闭空间里,事先不知道这个封闭空间的内部结构,经过个方向试探,从而找到一个出口。假设有个机器人放置在这个封闭空间的入口处:
迷宫用一个二维数组表示,0表示可以通行,1表示不可以通行
构成迷宫为类似二维数组
(可以看到这个数组周围全是1,这里1表示不同,相当于迷宫的四周,这样可以保证机器人不会在搜寻过程中不会离开迷宫,当给定的迷宫没有边界时,建议自己添加上)在任意给定时刻,机器人只能在上下左右四个方向上移动1步机器人只能移动到没有障碍物的位置即0的位置,且不可以离开迷宫机器人不可以重复走某点机器人应该搜索从起始位置到目标位置的路径,直到找到一个或者耗尽他所有可能性 二、问题分析 1.位置表示 由于迷宫构成是一个二维数组,我们可以采用坐标的形式 ( x , y ) (x,y) (x,y)来表示机器人的位置,为了方便代码实现,我将入口出的位置规定为(1,1)标蓝的位置为(1,1)如下图所示:
2.方向探寻 规定机器人探寻的方向为四个
dierctincXincY00111020-13-10 我们用incX、incY分别表示x、y方向上的增量表示如果机器人往这个方向上移动其位置坐标将会发生如上的变化。可以看到上面这个方向是遵循右下左上的原则,我们就可以定义一个结构体数组分别保存incX、incY这两个变量,对其实例化后即可实现方向的增量表示。
//定义一个结构体表示方向的增量 typedef struct{ //x,y方向的增量 int incX,incY; }Direction; 实例化:
Direction direct[4]= {{0,1},{1,0},{0,-1},{-1,0}}; 3、算法实现过程 双层循环控制,内层循环控制机器人方向探寻过程,依次探寻四个方向,外层循环保证机器人进行回溯时退栈不为空。
机器人从入口处(1,1)出发,开始按照右下左上的方向顺序进行搜索,判断四个方向上是否有路可走,这里实现过程可以利用一层循环实现,依次遍历方向搜寻的四个方向,有路可走的含义就是机器人目前所处的位置上下左右四个方向是不是有为0的取值,有的话就证明机器人目前所处的位置不是死路,是能够前进的。因此把目前的位置和前进的方向这三个变量进行入栈操作。入栈完成后进行位置更新。要不这个已经走过的位置用-1替换,不再用0或者1表示。 if(maze[line][col]==0) { temp.x=x; temp.y=y; temp.di=di; push(&S,temp.x ,temp.y ,temp.di); x =line; y =col; maze[line][col]= -1; 当然,如果四个方向都搜寻完,一位置这一层循环跳出了,那这样就是回溯算法的核心思想,这是机器人目前所处的位置是不会入栈的,反而会执行退栈操作,返回到前一个位置,我们之前保存的其前进的位置就有用了,用di这个方向变量同时接受收当时保存的位置,位置更新后再次进入方向搜索的循环,这样不需要重复搜索原来已经搜索过的地方,因为原来搜索过的地方是走不通的,如果入栈时不保存原来的位置就会陷入死循环。 while(!IsEmptyStack(&S)) { pop(&S,&(temp.x),&(temp.y),&(temp.di)); x = temp.x; y = temp.y; di = temp.di +1; while(di <4) { line = x+ direct[di].
文章目录 vim的a和i的区别 vim的a和i的区别 首先我写了一些东西,现在正处于插入模式! 然后我按Esc,他就处于普通模式了! 并且光标还跑到了g这个字符上面了呢! 如果我下面按i,那么他就如下图所示了! 如果我按照a的話,这就很好了!
1.安装wget
yum install -y wget
2.备份服务器原有的yum源文件
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
3.下载阿里云镜像文件
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
4.清理缓存
yum clean all
5.生成缓存
yum makecache
6.更新最新源设置
yum update -y
田海立@CSDN 2020-11-07
PyTorch 1.3中发布Pytorch Mobile,其支持情况如何,能否与TensorFlow Lite一较高下呢?本文试分析之。PyTorch Mobile的宣传显得要么诚意不足要么对行业领悟不够。目前只能说是有Mobile这个路在而已,与TFLite比不可同日而语,至少目前的实现是。相对于Google移动端的即有Android生态布局,Facebook有其苦衷,要坚守其生态底线又要放弃次要考量去适配NNAPI才是其捷径。
一、历史 Facebook历史上,在Caffe2中号称设计之初就为移动部署考虑的,笔者也跟踪了几年,发现Caffe2对NNAPI的支持就是3年前提交过代码,也只是对几个最常用算子做了适配,几乎是无所作为,当然显然Caffe2目前也基本是被废弃的状态。现在PyTorch实现Mobile支持,特别是PyTorch作为训练(模型)框架,已占主导地位,当然也应关注其在移动领域的表现。
关注AI移动领域的读者应该有所了解,其实TensorFlow最初对移动的支持是通过TensotFlow Mobile,之后才是重新实现了TensorFlow Lite,而TensorFlow Mobile也终究是被放弃的。
二、PyTorch Mobile 据PyTorch Mobile网站介绍,处在Beta阶段,待API稳定之后,很快会推出稳定版。Feature包括:
为ios,Android,Linux提供支持;提供API,涵盖将 ML 集成到移动应用中所需的常见预处理和集成任务;通过TorchScript IR支持tracing与scripting;支持 XNNPACK为ARM CPU上执行浮点运算;集成QNNPACK 支持INT8量化内核库,可支持per-channel量化、动态量化以及其他方式;根据用户的应用需求进行构建级别的优化和选择性编译,也就是根据应用如用的模型里的算子可定制选择算子从而改变最终编译出目标程序的尺寸;GPU/DSP/NPU等backends会在后续支持。 典型工作流程:
与别的推理框架其实并没大的差别:
把训练出的模型进行量化(可选)模型转换:pt(TorchScript)优化(可选)保存部署到终端上执行 只是,上述1~4步骤中在Host上完成;步骤5在手机或别的端侧设备上部署。别的方案把这些都明白的交代清楚了而已。
三、PyTorch Mobile前景分析 PyTorch Mobile目前发布的信息可以说是没什么特别的新意,本来就在移动端落后了TensorFlow Lite很多,第一次发布这种情况也可以理解。
不过,有些说法就让人觉得要么真的跟产业离的太远,不知道端侧设备的痛点在哪,要么诚意不足!
看Facebook所宣传的PyTorch Mobile的“卖点”:
No new frameworkNo model conversionNo operator porting No new framework:都已经转换了模型了,在端侧设备上执行pt模型了还说是没有新的Framework,应该是有一个端侧Runtime的东西在运行,什么量级的才叫Framework呢?刻意隐藏不告诉普通开发者而已。
No model conversion:变成pt TorchScript模型了不是模型转换吗?而且将来有NPU/GPU/DSP支持没有模型转换或编译的存在才怪。也还是偷换概念。
No operator porting:这点还没有深入看实现,不好说做没做。不过知道TensorFlow Mobile到TensorFlow Lite发展变化历程的读者应该都知道,这可能不是卖点,而是还没get到痛点。之前TensorFlow Mobile是挑选了一些TF的算子做了个c++的推理,但是尺寸和运行速度都是端上设备最关注的,所以后来才全部重写算子,重新实现而成的TFLite,TensorFlow Mobile也被放弃了,后来者可能连TF Mobile的名字都没听说过。当然,可能PyTorch Mobile也是重写了的,只是不宣传,隐藏起来而号称的算子一样而已。
目前PyTorch Mobile只能说是有Mobile这个路在而已,与TFLite的现状不可同日而语,至少目前的现状是。
端侧设备更关注的是Latency、功耗、隐私等,所以对加速器的支持更重要:
TFLite里对GPU通过Delegate机制(OpenCL/OpenGL ES)支持;TFLite对Qualcomm Hexagon提供Delegate机制支持;TFLite对通过NNAPI Delegate对所有NN Device(GPU/DSP/NPU)提供支持 当然对Arm CPU浮点计算今年7月也提供了XNNPACK delegate方式,加上之前Neon/dotproduct的INT计算支持等,基本上对CPU和加速器(NPU/GPU/DSP)的支持是完备的。
实现的效果为:超过一定温度小风扇打开否则反之。
1、硬件准备
树莓派、dh11、小风扇、杜邦线、继电器
2、线路连接
(1)dh11与树莓派连接
dh11 对应 树莓派(引脚)
vcc 5v
grand grand
data input(数据读取)
(2)继电器和风扇的连接
继电器直接使用树莓派供电给小风扇,形成回路即可,具体连接如下图:
3、核心代码
温湿度控制小风扇(自己根据自己连接情况修改引脚的参数)
#!/usr/bin/python import RPi.GPIO as GPIO import time while True: channel = 20 data = [] j = 0 GPIO.setmode(GPIO.BCM) time.sleep(1) GPIO.setup(26,GPIO.OUT) GPIO.setwarnings(False) GPIO.setup(channel, GPIO.OUT) GPIO.output(channel, GPIO.LOW) time.sleep(0.02) GPIO.output(channel, GPIO.HIGH) GPIO.setup(channel, GPIO.IN) while GPIO.input(channel) == GPIO.LOW: continue while GPIO.input(channel) == GPIO.HIGH: continue while j < 40: k = 0 while GPIO.input(channel) == GPIO.
Tomcat源码构建的步骤 一、下载源码二、导入idea之前的准备工作1、pom.xml2、创建source文件夹(此名称不是固定的) 三、导⼊源码⼯程到IDE并进⾏配置1、给 tomcat 的源码程序启动类 Bootstrap 配置 VM 参数,因为 tomcat 源码运⾏也需要加载配置⽂件等2、此时启动Bootstrap类下的main方法,访问【http://localhost:8080】,会报错3、Error:(505, 53) java: 程序包 sun.rmi.registry 不可见 (程序包 sun.rmi.registry 已在模块 java.rmi 中声明, 但该模块未将它导出到未命名模块) 一、下载源码 http://tomcat.apache.org/
二、导入idea之前的准备工作 1、pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.apache.tomcat</groupId> <artifactId>apache-tomcat-8.5.50-src</artifactId> <name>Tomcat8.5</name> <version>8.5</version> <build> <!--指定源⽬录--> <finalName>Tomcat8.5</finalName> <sourceDirectory>java</sourceDirectory> <resources> <resource> <directory>java</directory> </resource> </resources> <plugins> <!--引⼊编译插件--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <encoding>UTF-8</encoding> <source>11</source> <target>11</target> </configuration> </plugin> </plugins> </build> <!--tomcat 依赖的基础包--> <dependencies> <dependency> <groupId>org.easymock</groupId> <artifactId>easymock</artifactId> <version>3.4</version> </dependency> <dependency> <groupId>ant</groupId> <artifactId>ant</artifactId> <version>1.