#include<iostream> using namespace std; int max_min(int x) { int a[5]; a[0]=x%10;x/=10; a[1]=x%10;x/=10; a[2]=x%10;x/=10; a[3]=x; int i,j,flag,temp; int max,min; int n; for(i=0;i<=3;i++) { flag=i; for(j=i+1;j<=3;j++) if(a[flag]<a[j]) flag=j; temp=a[i]; a[i]=a[flag]; a[flag]=temp; } if(a[0]==a[1]&&a[0]==a[2]&&a[0]==a[3]) cout<<"输入不正确"<<endl; max=1000*a[0]+100*a[1]+10*a[2]+a[3]; min=1000*a[3]+100*a[2]+10*a[1]+a[0]; n=max-min; return n; } int main() { int m; cin>>m; int ans=m; while(ans) { if(ans==6174) { cout<<"验证成功"<<endl; return 0; } ans=max_min(ans); } }
所有模板效果都是通过栏目和导航的多种展示样式组合实现的。并不是死板的模板!自己可以根据自身的需求在后台自由设置。实时预览更新,无须再提交审核。
版本更新:
版本号:33.0.0 - 普通版 11:38
增加智能广告位功能,实现了首页任何位置插入图片,以及点击图片跳转等功能
增加了一套旅游类模板,一套环保工程类模板
增加幻灯片跳转外链,小程序功能
优化了栏目页二级分类过多的显示问题,现在改为了一行可滑动
优化了联系我页面公司名称过长溢出的问题
本次更新,如果想使用新功能,需要重新上传审核小程序
支持创建多个小程序!(没有数量限制,一次性买断,后续免费升级)支持一键生成,节省网站设置时间。
可以在后台里自由设置任意全站主题颜色
支持自定义底部菜单
支持多种栏目展现方式,包括带缩略图新闻、无缩略图新闻、一行两列图片列表、一行一列图片列表等等
支持跳转外部链接
支持自定义广告位
支持多种栏目修饰样式和导航样式
支持自定义表单,管理员微信能够实时查看客户新提交的表单内容
支持做成小程序导航网站
支持播放视频、所有页面转发、在线客服、一键拨号、地图导航!
持续稳定运行一年多的Hbase,就在前天晚上突然有RegionServer挂掉了,首先尝试了一下启动这个挂掉的RegionServer,执行指令:
hbase-daemon.sh start regionserver 这个RegionServer还真的启动成功了,于是乎进行了一次手动balance,进入hbase shell,执行“balance”指令,一直返回false,打开Hbase管理页面后也发现region并没有balance,负载失败。索性把整个集群关闭重启吧(集群规模很小,重启速度很快,其实这种操作不太好)。重启Hbase之后,几个RegionServer都没有问题,并且region数已经平衡。问题搞定。
然而问题真的搞定了吗?
好景不长,第二天那个RegionServer又挂了,这里一定有事情,没办法看一下日志吧。下面是RegionServer中报的错,当我看到是Hadoop的错,我也相应的看了一下HDFS的日志,也出现同样的异常。
org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /hbase/data/default/T_ENV_EMISSION_HOUR2/001e47b6f14026e7b221c085d63febf4/recovered.edits/0000000000002862983.temp could only be replicated to 0 nodes instead of minReplication (=1). There are 2 datanode(s) running and no node(s) are excluded in this operation. at org.apache.hadoop.hdfs.server.blockmanagement.BlockManager.chooseTarget(BlockManager.java:1441) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:2702) at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.addBlock(NameNodeRpcServer.java:584) at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.addBlock(ClientNamenodeProtocolServerSideTranslatorPB.java:440) at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java) at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:585) at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:928) at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2013) at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2009) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:415) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1556) at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2007) at org.apache.hadoop.ipc.Client.call(Client.java:1410) at org.apache.hadoop.ipc.Client.call(Client.java:1363) at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:206) at com.
参考社区问答https://cloud.tencent.com/developer/ask/96327
1.不建议改apache的配置 在Apache下,限制是一个可配置的值。如果想要支持更长的请求URI,请将此值更改为大于默认值8190的值。该值位于/etc/apache2/apache2.conf中。如果不是,请LimitRequestLine 10000在下添加一个新行()AccessFileName .htaccess。 但是如果实际遇到此限制,可能会先滥用GET。你应该使用POST传输这种数据 - 尤其是因为你甚至承认你正在使用它来更新值。如果你检查上面的链接,你会注意到Apache甚至说:“在正常情况下,值不应该从默认值改变。” 2.主要在后端处理,前端改请求方法 基本上,区别在于GET请求具有一个字符串中的url和参数,然后发送null:
http.open("GET", url+"?"+params, true); http.send(null); 而POST请求通过单独的命令发送url和参数:
http.open("POST", url, true); http.send(params); 这是一个工作示例
ajaxPOST.html:
<html> <head> <script type="text/javascript"> function ajaxPOSTTest() { try { // Opera 8.0+, Firefox, Safari ajaxPOSTTestRequest = new XMLHttpRequest(); } catch (e) { // Internet Explorer Browsers try { ajaxPOSTTestRequest = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { ajaxPOSTTestRequest = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { // Something went wrong alert("
许多flask_sqlalchemy都是在程序初始化时进行建表,当需要使用数据库中已存在的表时,有以下几种方法:
- 1. 在程序中将该表以ORM模型的形式写出,可借助sqlacodegen工具生成,但似乎太费事了;
- 2. 将已存在的表反射出来;
反射数据库中已存在的表 from flask_sqlalchemy import SQLAlchemy from flask_sqlalchemy import make_url from server import create_app def get_mysql_conn_url(config): """ :description: 生成sqlalchemy使用的连接url :param hy_config: hy_config :return: url """ mysql_conn_map = dict( dialect="mysql", driver="pymysql", host=config["MYSQL_HOST"], port=config["MYSQL_PORT"], database=config["MYSQL_DB"], user=config["MYSQL_USER"], password=config["MYSQL_PASSWORD"], ) s = "{dialect}+{driver}://{user}:{password}@{host}:{port}/{database}?charset=utf8".format(**mysql_conn_map) # s = "{dialect}+{driver}://{user}:{password}@{host}:{port}/{database}".format(**mysql_conn_map) url = make_url(s) return url def create_mysql_ORM(app): """ 创建MySQL的ORM对象并反射数据库中已存在的表,获取所有存在的表对象 :param app: app:flask实例 :return: (db:orm-obj, all_table:数据库中所有已存在的表的对象(dict)) """ # 创建mysql连接对象 url = get_mysql_conn_url(config=app.
一般当系统挂掉时没看到下面的log linux-pnm4:/var/log # Message from syslogd@linux-pnm4 at Feb 23 09:14:52 ... kernel:[ 838.942245] Internal error: Oops - BUG: 0 [#1] SMP 这种情况下通过改变log level也无法打印,这个时候可以通过cat /proc/kmsg 这里会实时将dmesg中的log打印到串口上, 这样一般就可以看到出问题的点. linux-pnm4:~ # cat /proc/kmsg <47>[ 617.651769] systemd-journald[1463]: Successfully sent stream file descriptor to service manager. <47>[ 617.671703] systemd-journald[1463]: Successfully sent stream file descriptor to service manager. <6>[ 627.290487] BTRFS info (device sda1): qgroup scan completed (inconsistency flag cleared) <47>[ 679.325602] systemd-journald[1463]: Sent WATCHDOG=1 notification.
扣扣技术交流群:460189483
制作U盘引导盘,安装Ubuntu18.04 LTS系统
一、下载Ubuntu18.04 LTS系统的iso文件 镜像下载地址 https://www.ubuntu.com/download/desktop
下载后的文件:ubuntu-18.04.4-desktop-amd64.iso
二、制作U盘启动系统 启动盘制作工具,建议Ubuntu官网推荐的rufus,无需安装即可使用
Rufus https://rufus.akeo.ie
插入U盘后,直接双击下载的fufus.exe(绿色免安装)启动, 按照如图设置后,软件会把ubuntu-18.04.4-desktop-amd64.iso文件,写入U盘,制作系统启动盘。
选择时不要选错U盘,完成后U盘会格式化,小心操作。
完成U盘制作,电脑关机插入U盘,开机时间启动BIOS设置从U盘启动,具体如何设置BIOS这里不分开来细说了,大家百度查找一下,问题应该不大。下面是本人电脑的选择方式,大家随机应变,不行就多试试,找到U盘的名字,多试几次从U盘启动肯定可以找到。本人是按按键F10
然后进入安装界面,按照提示一步步来就可以了,很傻瓜式的安装
1. 选择安装语言,在语言选择栏拉到底可以看到简体中文,选择中文(简体),然后点击安装Ubuntu进入安装
2. 选择键盘布局,直接默认,然后点击继续
3. 选择正常安装
4. 选择双系统并存还是只安装Ubuntu,由于我之前安装过Ubuntu18.04LTS,这里第一项提示卸载Ubuntu 18.04LTS并重新安装,如果之前没有安装过,会显示与Windows10系统并存,选择双系统并存的选择第一项,选择只安装Ubuntu的可以选择第二项,清除整个磁盘并安装Ubuntu,这里我先选择第一项,然后点击现在安装 5. 这个是类似报告一样将改动写入U盘,直接点击继续 6. 选择安装时所在位置,主要用于设置时区,这个写北京上海都可以,继续 7. 填写姓名、计算机名,用户名,密码,具体解释在下面,然后点击继续
您的姓名->指的是计算机登录时,显示的名字,与下面的2行密码(这个密码是用户名的密码,非姓名的密码,而且这个密码可以)配合登录计算机,登录之后就没什么用了,仅仅用于登陆时显示的名字,如下图所示
计算机名->指的是计算机登录之后的主机名,也就是hostname,在shell终端中输入hostname,会显示该名称,同时,shell终端的命令提示符格式就是:user@hostname:~$: 这个hostname就是这个计算机名,至于它的作用,自行百度即可
用户名:->指的是计算机登录之后的用户名,在shell终端中使用w命令可以查看当前所有登录过的用户名,使用who/whoami可以查看当前登录的用户名,使用ssh远程登录时,需要使用的就是用户名,如下图所示
8. 开始正式进行安装,安装过程有快有慢,大概10分钟左右吧
9. 安装完成之后 ,弹出安装完毕对话框,表示安装完成,点击现在重启,然后拔掉U盘
10. 重启后输入选择启动Ubuntu,登陆后显示如下界面,表示安装完成 至此全部OK,码字不容易,觉得没问题的朋友给个👍呗
CentOS7配置网络yum源 实验环境
我这里使用的镜像版本为:
CentOS-7-x86_64-DVD-1810
开源镜像站点
mirrors.163.com
https://opsx.alibaba.com/mirror?lang=zh-CN
链接工具为Xshell6
官方下载地址:
https://www.netsarang.com/zh/xshell-download/
传输工具为Xftp6
官方下载地址:
https://www.netsarang.com/zh/xftp-download/
如果我们只是用于学习可以在此页面申请免费的许可证
要使用网络yum源,是要在能够连同外网的前提下,至于如何链接外网,这里就不详细描述了。
使用命令:yum repolist (查看当前的软件仓库的信息)
yum repolist 使用命令:vi /etc/yum.conf(查看yum的配置文件)
在这个文件的最后两行,写了配置文件的存储位置,以及文件的命名规范
①:yum源的配置文件的命名格式为:*.repo
②:yum源配置文件的存放目录为:/etc/yum.repos.d
(一):我们CD到配置文件的存放目录
cd /etc/yum.repos.d/ (二):我们创建一个目录,用来存放这些自带的yum配置文件
mkdir backup mv C* backup cd backup/ 可以看到我们已经把文件移动到此backup文件夹下了
(三):查看本地系统的版本信息
cat /etc/redhat-release 可以看出我的操作系统版本为7.6.1810
(四):下载对应系统版本的网络yum源配置文件(此链接为网易的yum源)
http://mirrors.163.com/.help/centos.html
(五):上传配置文件至/etc/yum.repos.d目录下
(六):清除yum缓存
yum clean all (七):建立一个新的缓存
yum makecache (八):再次查看yum仓库信息
yum repolist 可以看出,yum源已经更换成功
错误背景 AppCan制作小程序,Html代码报错
错误信息如下 ①
错误: Uncaught ReferenceError: echarts is not
解决方案:页面没有引入echarts.js文件
②
错误:Failed to load resource: net::ERR_FILE_NOT_FOUND
原因:插入的js是该目录下面不存在的
Generalized Intersection over Union: A Metric and A Loss for Bounding Box Regression论文核心解读 (最近在忙于考研(20),所以这里就放核心的思想,详细的其他,以后有时间再补充吧)
目录
Generalized Intersection over Union: A Metric and A Loss for Bounding Box Regression论文核心解读
本文的主要贡献总结如下:
什么是IOU
针对IOU问题的改进
对象检测精度测量
边界框表示和损失
使用近似函数或替代函数优化IoU
GIOU的算法公式
GIOU与IOU的区别
GIOU的边界回归损失
这是一遍关于目标监测的一篇论文,作者通过敏锐的观察发现了一个被大家所忽视的一点------基于并集交叉点(IOU)计算的度量损失替换替代回归损失。不得不说,作者对细节观察很仔细而且想法很大胆。
本文的主要贡献总结如下: •我们介绍了IOU的广义版本,作为比较任意两个任意形状的新指标。
•我们提供了将giou用作两个轴对齐矩形之间的损耗的分析解决方案,通常是n-orthotopes。
•我们将giou loss纳入最流行的目标检测算法,如更快的r-cnn、mask r-cnn和yolo v3,并在标准目标检测基准上显示其性能改进。
什么是IOU IOU,也称为JacCard索引,是比较两个任意形状之间相似性的最常用指标。IOU将要比较的对象的形状属性(例如,两个边界框的宽度、高度和位置)编码到Region属性中,然后计算聚焦于其区域(或体积)的标准化度量。此属性使IOU对所考虑问题的规模不变。由于这一吸引人的特性,用于评估分段、目标检测和跟踪的所有性能指标都依赖于这一指标。
然而,可以证明,在最小化常用损失(例如“Ln-norm”)与改进其IOU值之间没有很强的相关性,这是在二维/三维中两个边界框的参数表示上定义的。例如,考虑图1(a)中的简单二维场景,其中预测的边界框(黑色矩形)和真值框(绿色矩形)由它们的左上角和右下角表示,即(x1、y1、x2、y2)。为了简单起见,假设两个框的一个角之间的距离(例如“L2-norm”)是固定的。因此,任何第二个角位于以绿色矩形第二个角为中心的固定半径圆上的预测边界框(以灰色虚线圆表示)与真值框之间的“2-范数距离”将完全相同,但是它们的IOU值可以显著不同(图1(a))。同样的论点可以扩展到任何其他表示和损失,例如图1(b)。直观地说,对于这些类型的目标来说,一个好的局部优化未必是IOU的局部优化。此外,与IOU相比,基于上述参数表示定义的n-范数目标对问题的规模并不是不变的。为此,具有相同重叠级别但不同比例(例如透视)的多对边界框将具有不同的目标值。此外,一些表示可能会受到用于表示的不同类型参数之间缺乏正则化的影响。例如,在中心和大小表示中,(xc,yc)在位置空间上定义,而(w,h)属于大小空间。复杂度随着参数的增加而增加,例如旋转,或者在为问题添加更多维度时。为了缓解上述一些问题,最先进的物体探测器引入锚箱的概念作为假设良好的初始猜测。它们还定义了非线性表示来天真地补偿比例变化。即使有了这些手工制作的更改,优化回归损失和IOU值之间仍然存在差距。
在本文中,我们探讨了两个轴对齐矩形之间或通常是两个轴对齐的N-正交体之间的IOU的计算,这是一个简单的分析解,与普遍的观点相反,在这种情况下,IOU可以被反向传播,即它可以直接用作优化的目标函数。因此,最好使用IOU作为二维目标检测任务的目标函数。考虑到优化度量本身与代理损失函数之间的选择,最佳选择是度量本身。
然而,IOU作为度量和损失有两个主要问题:
(i)如果两个对象不重叠,IOU值将为零,并且不会反映两个形状彼此之间的距离。在非重叠对象的情况下,如果将IOU用作损耗,则其梯度将为零,无法优化;
(ii)IOU无法正确区分两个对象的不同对齐方式。更准确地说,两个物体在多个不同方向上重叠,且交叉点水平相同,其IOU将完全相等。因此,iou函数的值并不反映两个对象之间如何发生重叠。
针对IOU问题的改进 在本文中,我们将通过将IOU的概念扩展到不重叠的情况来解决IOU的这两个弱点。我们确保这种概括
(a)遵循与IOU相同的定义,即将比较对象的形状属性编码为区域属性;
(b)保持IOU的比例不变量属性;
(c)在对象重叠的情况下确保与IOU的强相关性。
我们介绍了IOU的这个广义版本,即giou,作为比较任意两个凸形的一个新指标。我们还提供了计算两个轴对齐矩形之间的giou的解析解,允许在这种情况下将其用作损失。将giou loss纳入最先进的目标检测算法中,我们始终使用基于iou的标准和新的基于giou的性能度量,在流行的目标检测基准(如pascal voc和ms coco)上提高它们的性能。
对象检测精度测量 联合交叉(IoU)是在对象检测中使用的事实评估度量。 它用于确定一组预测中的正确性和误差。 使用IoU作为评估指标时,必须选择准确度阈值。 例如,在PASCAL VOC挑战中,广泛报告的检测精度测量值,即平均平均精度(mAP),是基于固定的IoU阈值,即0.5来计算的。 然而,任意选择IoU阈值并不能完全反映不同方法的定位性能。 任何高于阈值的定位精度都被平等对待。 为了使此性能测量对IoU阈值的选择不那么敏感,MS COCO基准测试在多个IoU阈值中平均mAP。
概述 CryptoJS (crypto.js) 为 JavaScript 提供了各种各样的加密算法。
安装 npm install crypto-js --save-dev 加解密 import CryptoJS from 'crypto-js'; ... /** * CryptoJS加密 */ var getAES = function(data){ //加密 var key = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'; //密钥 var iv = '1234567812345678'; var encrypted = getAesString(data,key,iv); //密文 var encrypted1 = CryptoJS.enc.Utf8.parse(encrypted); return encrypted; } /** * CryptoJS解密 */ var getDAes = function(data){//解密 var key = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'; //密钥 var iv = '1234567812345678'; var decryptedStr = getDAesString(data,key,iv); return decryptedStr; } AES加解密 AES_ENCRYPT() 和 AES_DECRYPT()两个函数有两个参数
 今天手机没话费了,怎么办,网络打不开,但是身边有台电脑,网线插上可以用的。那只能下个软件开个WiFi了。但是我又突然不想去下软件,电脑有没有自带开启WiFi的功能呢?
然后我真的找到一种方法,感兴趣的来看看吧。
第一步:
首先,在“开始”菜单里找到cmd,以管理员身份运行cmd,如果不是用管理员身份打开的,那么执行命令是不能成功的。成功打开之后的界面是这样的

第二步:
输入命令:netsh wlan set hostednetwork mode=allow ssid=RedMi key=Red840Mi, 然后回车。
注意这条命令中,ssid表示的你设置的这个WiFi名,key表示的是密码。就拿我的这条命令来说,WiFi名就叫RedMi,密码是Red840Mi。
如果没有错误的话,你会看到如下的提示

第三步:
输入命令来启动网络: netsh wlan start hostednetwork
如果没有错误,你会看到如下的提示

现在就算是成功启动了,但是还需要设置一些东西。
如果要关闭网络,用命令:netsh wlan stop hostednetwork
第四步:
打开网络共享中心

你可以看到刚刚设置的WiFi名出现了,后面的访问类型现在是“无法连接到网络”。上面的那个叫NJUPT的是我当前连接上的可用网络。
第五步:

点击WLAN(NJUPT),在弹出的页面里点击“属性”,然后点击“分享”选项卡

到这儿之后,默认那这两个勾选框是没有勾选的,现在勾选第一个(勾选了第一个之后,第二个才会允许被勾选,但是这儿不要勾选)。在“家庭网络连接”的下拉框中找到”本地连接* 11“,这儿的“本地连接*11”就是之前我们那个WiFi访问类型下面的连接那个。
然后确定 。现在就可以用手机连接这个WiFi了
数据库驱动是不同数据库开发商(比如oracle mysql等)
为计算机语言能够实现数据库访问而开发的程序
它将计算机语言对数据库的操作翻译成自身的数据库语言
使用go语言操作mysql, 需要的驱动: github.com/go-sql-driver/mysql
使用命令:go get安装第三方mysql驱动:
C:\Windows\System32>go get github.com/go-sql-driver/mysql
C:\Windows\System32> // 没有报错就表示安装成功(会下载到go path里面)
查看:D:\golang\workspace\project\src\github.com\go-sql-driver\mysql
导入mysql驱动包:
import ( "database/sql" // 这个是go操作数据的系统包 _ "github.com/go-sql-driver/mysql" // go操作mysql的驱动包 ) mysql连结:
"mysql" 表示连结的数据库是mysql(也可以是其它的数据库)
"root" 表示帐户
"xxx" 表示密码
"test" 表示连结mysql的test数据库
db, err := sql.Open("mysql", "root:xxx@tcp(127.0.0.1:3306)/test"); 返回的 *DB 是线程安全的, 可以被多个线程同时访问, 并会维护自身的闲置连接池。
这样一来,Open函数只需调用一次, 很少需要关闭DB
可以在init中连结数据库:
/*在init中连结mysql*/ func init() { db, err := sql.Open("mysql", "root:@tcp(127.0.0.1:3306)/go_test") // 此处没有密码 } 查询所有:
package main import ( "fmt" _ "
报错信息如下图:
“迭代中的元素期望具有'v-bind:key'指令” 大意就是说要给一个:key
解决方法如下:
<li v-for="user in users" :key="user">{{user}}</li> 这样就不会报错啦~
如果在浏览器中出现警告如下--“vue.esm.js?efeb:628 [Vue warn]: Avoid using non-primitive value as key, use string/number value instead”
报错原因是:key后面的值最好不是一个对象,使用string/number作为key的值,上面的警告就解决了。
<li v-for="user in users" :key="user.username">{{user}}</li> 具体原因现在阶段解释不清,日后解析o(╥﹏╥)o
原文:https://blog.csdn.net/shymi1991/article/details/50540214/ 当我们试图在命令行编译运行一个简单的java程序HelloWorld.java,编译命令javac HelloWorld.java顺利通过,但是执行运行java HelloWorld却报出:“错误:找不到或无法加载主类 xxx(Error: Could not find or load main class )”,注:Java 1.7以下是这样的Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld.
为了解决这个问题,就必须知道java是寻找和加载类的原理。首先有个环境变量叫做CLASSPATH,它包含所有Java类文件的目录。如果它找不到我们所运行程序的main方法就会抛出上面的错误。在Eclipse里面编译运行程序很简单,因为它把Classpath设置好了,但是在命令行,你就得自己处理了。CLASSPATH和PATH不同,PATH用于定位系统可执行文件或命令,在Windows系统是扩展名为 .exe, .dll的文件,在Linux系统是 .so文件。Path也用来定位java程序的本地库。CLASSPATH是用来定位类文件或JAR文件,java类加载器通过CLASSPATH来查找和加载类。
下面用一个例子来演示如何在命令行执行java程序。
项目目录E:\Users\workspace,项目名hellojava,包名com.sommer.learn,类名HelloJava
package com.sommer.learn; public class HelloJava { public static void main(String[] args) { System.out.println("Hello Java!"); } } 如果用Eclipse编译,它的.class文件在E:\Users\workspace\hellojava\bin\com\sommer\learn里面。命令行进入该路径,输入java HelloJava
提示出错,因为这个类的全名是com.sommer.learn.HelloJava,而不是HelloJava。重新输入命令 java com.sommer.learn.HelloJava
为什么还是出错呢?因为我们没有CLASSPATH环境变量,也没有用java命令的-classpath或-cp选项,所以Java默认在当前目录下寻找主类 com/sommer/learn/HelloJava.class,但是我们已经在com/sommer/learn目录里面了,所以找不到类。将目录切换到包的父路径,再来运行一遍
这回终于可以了!
如果想从任意路径来运行程序该怎么办呢?如上文提到的,使用java命令的-classpath或-cp选项,或设置CLASSPATH。先来看第一种
第二种设置CLASSPATH
windows+pause快捷键打开系统属性——高级系统设置——环境变量,在系统变量里新建CLASSPATH(不区分大小写),一般设变量值为 .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar,注意最前面有个点号,表示当前路径。
可以在命令行输入echo %CLASSPATH%来查看变量值。如果将本项目E:\Users\workspace\hellojava\bin加在classpath变量值里(用分号跟其他的隔开),则可以在任意路径执行命令 java com.sommer.learn.HelloJava。
但是一般不建议这样设,如果把每个项目的类路径都添加到系统CLASSPATH会造成混乱,建议用java命令的 -classpath选项来指定。
如果在eclipse里运行一个java类时报出“错误:找不到或无法加载主类 xxx”这样的错,一般是项目没有编译,检查菜单栏的Project——Build Automaticlly有没有被勾上。
Android 6.0版本之后,需要配置动态权限,动态权限代码有点多,纯粹记住是比较难的,所以这里提供一下模板代码,直接copy即可,然后修改或增加需要的权限即可。
基类文件RequestPermissionsActivityBase:
package com.android.face.permission; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.os.Bundle; import android.os.Trace; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import java.util.ArrayList; import java.util.Arrays; /** * Activity that asks the user for all {@link #getDesiredPermissions} if any of * {@link #getRequiredPermissions} are missing. * * NOTE: As a result of b/22095159, this can behave oddly in the case where the final permission * you are requesting causes an application restart.
在线程编程时,编译器报
terminate called after throwing an instance of 'std::system_error'
terminate called recursively
what(): Unknown error -1
Aborted (core dumped)
解决方法:在链接时,加上 -pthread选项。g++ -std=c++11 -pthread thread_demo.cpp -o demo。
clion编译时,会报这种错误。需要在CMakeLists.txt修改编译选项。
参考:《计算机网络-自顶向下》
正文 UDP 检验和提供了差错检测的功能。这是基于端到端原则实现的。但是 UDP 的检验和并不提供差错回复的能力。
本文不叙述 UDP 的原理,仅仅着力介绍一下检验和的实现原理。
原理
对发送方的 UDP 报文段的所有 16 比特字的和进行反码运算,当求和遇见溢出的时候,进行回卷(回卷的补充在下面),得到的结果放在 UDP 报文段中的检验和字段
什么是回卷
所谓 “回卷” 就是当进行 16 比特的加法运算的时候,如果进位到 17位,则将第 17 位和后 16 位进行加法和运算。
我们将在下面的小例子中实际操练。
小栗子
假设我们有 3 个 16 比特的字,分别如下
0110011001100000 0101010101010101 1000111100001100 第一步:对 3 个 16 比特的字依次相加 0110 0110 0110 0000 + 0101 0101 0101 0101 + 1000 1111 0000 1100 = 0100 1010 1100 0010 注意,在最后一次加法的过程中,发生了回卷,看下面,多了第 17 位,要消除第 17 位
这两个数相加得到
此时用 1 + 0100 1010 1100 0001 = 0100 1010 1100 0010
本人开发是在Android 7.0版本上,并且是可以修改系统源码的,项目需要使用外置的sd卡,不是内置的存储卡。
1.外置sd路径的获取
需要从外置sd卡上读写文件,首先需要拿到外置sd卡的路径,结果发现开放的API是无法拿到外置sd卡路径的。
一般情况,我们都会调用Environment.getExternalStorageDirectory().getAbsolutePath()来获取sd卡的路径的,但是这个拿到的路径是内部存储的路径。所以我们只能另辟蹊径,参照Android原生应用可以找到获取外置sd卡的方法。通过StorageManager类来获取,这个类需要在系统内部的app(和系统一起编译的那些APP)才能调用,如果要在三方APP开发中调用,那只能通过反射机制了,这里就不介绍反射的部分。
通过StorageManager获取sd卡路径,为了支持在Android studio上开发调用,我的做法是,首先在系统上自定义了一个系统进程,需要使用到aidl,并且支持通过Context.getSystemService(进程名)获取进程实例,再在系统的进程类中增加getSdcardPath()方法(如果你的APP是直接放在Android源码上编译,也可以在你的APP代码上直接加上这个方法),方法实现如下:
public String getSdcardPath() throws RemoteException { StorageManager storageManager = mContext.getSystemService(StorageManager.class); if (null == storageManager) { return null; } String path = null; StorageVolume volumes[] = storageManager.getVolumeList(); if (volumes != null) { for (StorageVolume volume : volumes) { if (!Environment.MEDIA_MOUNTED.equals(storageManager.getVolumeState(volume.getPath()))) { continue; } if(volume.isRemovable()) { path = volume.getPath(); break; } } } return path; } 在系统的进程类中增加getSdcardPath方法后,就可以在Android studio工具上,先通过获取到你定义的系统进程类实例,然后调用getSdcardPath获取外置sd卡的路径。
另外一个获取外置sd卡的方式是通过反射,这个就可以直接在三方APP开发中进行了,实现代码如下:
public static String getStoragePath(Context mContext, boolean is_removale) { StorageManager mStorageManager = (StorageManager) mContext.
nginx的配置系统由一个主配置文件和其他一些辅助的配置文件构成。这些配置文件均是纯文本文件,全部位于nginx安装目录下的conf目录下。
配置文件中以#开始的行,或者是前面有若干空格或者TAB,然后再跟#的行,都被认为是注释,也就是只对编辑查看文件的用户有意义,程序在读取这些注释行的时候,其实际的内容是被忽略的。
由于除主配置文件nginx.conf以外的文件都是在某些情况下才使用的,而只有主配置文件是在任何情况下都被使用的。所以在这里我们就以主配置文件为例,来解释nginx的配置系统。
在nginx.conf中,包含若干配置项。每个配置项由配置指令和指令参数2个部分构成。指令参数也就是配置指令对应的配置值。
下面是我的nginx服务器的配置,用于实现负载均衡和HTTPS
worker_processes 16;#启动进程,通常设置成和cpu的数量相等 #工作模式及连接数上限 events { worker_connections 1024;#单个后台worker process进程的最大并发链接数 } #设定http服务器,利用它的反向代理功能提供负载均衡支持 http { include mime.types;#设定mime类型,类型由mime.type文件定义 default_type application/octet-stream;#默认文件类型 sendfile on;#sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为 on, #如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime. keepalive_timeout 90;#连接超时时间,单位秒 #设定负载均衡的服务器列表 upstream riskraiders { server 172.16.0.52:443; server 172.16.0.53:443;#weight=5;weigth参数表示权值,权值越高被分配到的几率越大 } server { listen 80;#侦听80端口 listen 443 ssl;#侦听443端口 server_name fk.riskraider.com;#定义使用fk.riskraider.com访问 ssl_protocols TLSv1.2 TLSv1.1 TLSv1; ssl_certificate /etc/ssl/fk.riskraider.com.crt; ssl_certificate_key /etc/ssl/fk.riskraider.com.key; ssl_prefer_server_ciphers on; #自动跳转到HTTPS if ($server_port = 80) { rewrite ^(.