CSDN可以保存一些与代码无关的文章吗?
如果不能,有什么像CSDN的博客这么好用的同类软件吗?CSDN的博客实在是太好用啦!在线编辑文章,还能添加标签,云端保存,这都是我想要的。
转自: https://www.cnblogs.com/new-life/p/9265530.html
Eclipse中使用JRebel实现项目热部署(Maven插件版) JRebel实现项目热部署(Maven插件版)
热部署,就是在应用运行过程中不进行重启,可直接进行软件升级。
在开发过程中,热部署就是在项目运行过程中变更代码,无需重启服务器即可使代码生效。
tomcat可以进行项目热部署,但在类中添加方法或方法名改动时则无法热部署,需要重启服务器,导致浪费大量开发时间在等待项目重启上,通过JRebel可实现绝大部分项目代码改动都能进行热部署。
在安装JRebel插件前建议先把Maven jar包中央仓库的下载地址(默认下载地址是国外的,下载速度比较慢)换成国内的,这里推荐设置成阿里的中央仓库。
Maven中央仓库下载地址更换步骤:
①更改Maven配置文件
②设置Maven配置文件到Eclipse
1.找到本地Maven安装路径,打开本地Maven安装路径下的conf/Settings.xml:
2.在<mirrors></mirrors>标签内添加以下镜像参数并保存:
<mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror> 3.打开Eclipse-->Window-->Preferences,找到Maven下的User Settings:
-------------------------------------------------步骤结束-------------------------------------------------------------
在Eclipse中安装JRebel插件:
等待安装完成后,在弹出的是否重启Eclipse对话框点击确定,等待自动重启Eclipse,插件安装完成。
插件激活请参考:https://blog.csdn.net/lawsonjin/article/details/76422807
-------------------------------------------------步骤结束--------------------------------------------------
本人开发时运行项目使用的tomcat是Maven的tomcat插件,因此需要添加Maven的tomcat插件,通过Maven的tomcat插件运行项目想要使用JRebel需要添加Maven的JRebel插件。
Maven的tomcat插件配合JRebel的设置步骤:
1.在pom.xml中<build></build>标签下的<plugins>标签里添加tomcat插件以及jrebel插件:
以下是插件代码:
<!-- maven的tomcat组件,通过maven命令tomcat7:run运行项目 --> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <port>8080</port> <path>/Irritability</path> </configuration> </plugin> <!-- jrebel热部署插件 --> <plugin> <groupId>org.zeroturnaround</groupId> <artifactId>jrebel-maven-plugin</artifactId> <version>1.1.8</version> <executions> <execution> <id>generate-rebel-xml</id> <phase>process-resources</phase> <goals> <goal>generate</goal> </goals> </execution> </executions> </plugin> 2.选中项目,点击右键-->JRebel-->Enable JRebel会在项目的src/main/resources目录下自动生成rebel.xml配置文件:
3.选中项目点击右键-->Run As-->Maven build...:
按照图中步骤设置后点击Run按钮运行项目:
运行结果:如下图说明JRebel插件启动成功,随后tomcat也开始启动:
启动完成后对项目内的某个方法进行更名等操作后保存代码,JRebel就会自动检测到代码变更,并重新编译更改了代码的文件,控制台打印信息:
一、CSS中设置颜色的四种方式:
值描述color_name规定颜色值为颜色名称的颜色(如:yellow黄色)hex_number规定颜色值为16进制颜色值(比如:#ff0000)rgb_number规定颜色值为 rgb 代码的颜色(比如:255,0,0)inherit规定应该从父元素继承颜色 上面是网上提供的设置颜色的表格:(实际上还可以细分一下)
1、通过颜色名称赋值:red、blue、yellow、green、pink…(这种比较简单就不多啰嗦了)CSS 颜色名称对照表
color : red; //红 2、通过6位16进制赋值:每一位都是0-f之间的值。(十六进制:0、1、2、3、4、5、6、7、8、9、a、b、c、d、e、f 其中 a ~ f 表示 10 ~ 15 这些称作十六进制数字)CSS 颜色十六进制值
color : #ff0000; //红 color : #00ff00; //绿 color : #0000ff; //蓝 color : #ffff00; //黄 color : #000000; //黑 color : #ffffff; //白 3、通过3位16进制赋值:(相对第二种有局限性)
说白了就是上面第二种方式的简写,如果12、34、56位都相同就可以 合并 起来,即:color : #00ff00;可以写成color : #0f0;
color : #0f0; //绿 4、通过三位10进制赋值:(此处也就涉及到了rgb()函数,下面会详细的介绍)
color : rgb(255,0,0); // 红 color : rgb(0,255,0); // 绿 color : rgb(0,0,255); // 蓝 color : rgb(0,0,0); // 黑 color : rgb(255,255,255); // 白 5、通过四位10进制赋值:(设置半透明的方式,下面会详细的介绍):
stings包只要是对字符串做操作 strings.HasPrefix(s string, prefix string) bool:判断字符串s是否以prefix开头
strings.HasSuffix(s string, suffix string) bool:判断字符串s是否以suffix结尾。
strings.Index(s string, str string) int:判断str在s中首次出现的位置,如果没有出现,则返回-1
strings.LastIndex(s string, str string) int:判断str在s中最后出现的位置,如果没有出现,则返回-1
strings.Replace(str string, old string, new string, n int):字符串替换
strings.Count(str string, substr string)int:字符串计数
strings.Repeat(str string, count int)string:重复count次str
strings.ToLower(str string)string:转为小写
strings.ToUpper(str string)string:转为大写
strings.TrimSpace(str string):去掉字符串首尾空白字符
strings.Trim(str string, cut string):去掉字符串首尾cut字符
strings.TrimLeft(str string, cut string):去掉字符串首cut字符
strings.TrimRight(str string, cut string):去掉字符串首cut字符
strings.Field(str string):返回str空格分隔的所有子串的slice
strings.Split(str string, split string):返回str split分隔的所有子串的slice
strings.Join(s1 []string, sep string):用sep把s1中的所有元素链接起来
strings.Itoa(i int):把一个整数i转成字符串
strings.Atoi(str string)(int, error):把一个字符串转成整数
Cookie格式 <name>=<value>; <attribute>; <attribute> eg: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly 属性
属性名说明默认值作用域Expires到期时间:UTC--Max-Age到期时间:秒 优先级高于Expires--domain所属域名当前域名默认当前域名, 指定值后是当前域名和子域名path生效的路径当前网址当前路径及其子路径HttpOnly无法通过 JavaScript 脚本拿到--Secure只有在加密协议 HTTPS 下生效-- 特殊说明:
如果不添加过期时间,cookie 在浏览器关闭时删除两个网址只要域名相同和端口相同,就可以共享 Cookie使用document.cookie无法读取到与HTTPOnly属性的cookie只能读取到cookie的键-值,没有办法读取属性的值 Cookie读写操作 如果本地html文件用浏览器打开页面会报错
A cookie associated with a cross-site resource at was set without the `SameSite` attribute. A future release of Chrome will only deliver cookies with cross-site requests if they are set with `SameSite=None` and `Secure`. 可以使用Flask 搭建测试环境
# -*- coding: utf-8 -*- from flask import Flask, send_file app = Flask(__name__) @app.
run
{
allocate channel t1 type disk;
allocate channel t2 type disk;
allocate channel t3 type disk;
allocate channel t4 type disk;
#configure maxsetsize to 20 G;
configure backup optimization on;
crosscheck backup;
crosscheck copy;
delete noprompt expired copy;
delete noprompt expired backup;
delete noprompt obsolete;
backup as compressed backupset database format ‘/orabak/rman/dbbak_%d_%s_%p_%T’;
sql ‘alter system archive log current’;
backup as compressed backupset format ‘/orabak/rman/archbak_%d_%s_%p_%T’ archivelog all delete all input;
1、缩进与tab
(1)Options菜单àPreferencesàTyping卡,勾掉下面两项∶
Typing tab indents line,regardless of selection,空行按tab无法前进
Typing tab replaces current selection,选定部分内容、再按tab时会清除所选
(2)Options菜单àDocument
Options(针对不同文件类型,分别进行设置)à下拉左上文件类型框、选择合适类型(c源文件)àEditing
Options框中,tab width=2à Editing Options框中,勾选Expand
tabs(这样,按tab键、等价于输入2个空格)
(3)Options菜单àDocument
Optionsà选择合适的文件类型à点击右边中间的Auto Indent钮à在弹出的框中,左边一定要点Smart,右边有两个复选框Indent
Open Brace和Indent Close Brace,具体效果可以看SIS的HELP。按照部门里的编程风格要求,最方便的就是把两个复选框都取消掉,然后点OK。
勾选Auto Indent之SMART的效果∶在C程序里,
如果遇到行末没有分号的语句,如IF, WHILE, SWITCH等,
写到该行末按回车,则新行自动相对上一行缩进两列。
勾掉Indent Open Brace和Indent
Close Brace的效果∶继上一段,在相对缩进行里,
如果输入"}", 则自动和上一行列对齐(好像勾不勾都会有这个功能);而输入"{"时,不会与下面的行对齐(这是勾上Indent Open Brace时的效果)。
2、向项目中添加文件时,只添加特定类型的文件(文件类型过滤器)
有个同事比较生猛,得整汇编代码,但在SIS里建立PROJECT并ADD
TREE的时候,根据默认设置并不会把该TREE里面所有汇编文件都包含进来,只加了.inc和.asm后缀的,.s后缀的没有。而且用SIS打开.s的文件,一片黑白没有色彩,感觉回到DOS的EDIT时代了……
解决方法是在Options->Document Options里面,点左上的Document Type下拉菜单,选择x86
Asm Source File,然后在右边的File filter里*.asm;*.inc;的后面加上*.s;接着CLOSE就可以了。上面两个问题解决了,但注意加入*.s后还需要重新ADD
TREE一遍才能把这些汇编加到PROJECT里面。
3、去掉功能强大但是无用的自动完成功能
Options菜单àPreferences
àTyping卡àAuto Completion框,勾掉Use
automatic symbol completion window(这里是SIS的全局设置)
Options菜单àDocument
OptionsàEditing Options框中,勾掉Allow auto-complete(局部设置)
上面两项必须全部勾选,才能启用Auto Completion功能
4、恢复小键盘的“+,-,*,/”功能
Options菜单àKey
前言 quartz是一个用java实现的开源任务调度框架,可以用来创建简单或者复杂的任务调度,并且可以提供许多企业级的功能,比如JTA以及集群等,是当今比较流行的JAVA任务调度框架。
之前多呆过的两家公司及目前所在的公司对于quartz的需求及使用都是比较频繁的,自己也是在这个过程中对于quartz由陌生变为熟悉,因此在这里准备写一系列quartz的文章,既是怕自己遗忘也是对自己的心得进行总结。
quartz可以做什么
如我们需要两小时后将订单失效(也可以使用延迟队列)秒杀或拼团中对活动时间的控制想在某个时间点进行奖励计算 总结下来就是我们想要在特定的时间点做一次或多次某一件事情,这是我们就需要一个框架来帮助我们,quartz的出现就很好的解决了我们的问题
当然除了quartz框架外,还有许多公司在quartz的基础上进行了二次开发,如:elastic-job、XXL-JOB等,需要了解也可以进行了解
在接下来的文章中我将对原理进行讲解及结合自己项目中的实际使用经验进行讲解,敬请期待!
文章目录 语法知识2.34 逆矩阵2.35 LU分解2.36 正交分解2.37 Cholesky分解2.38 广义逆矩阵2.39 数组与矩阵的乘幂2.40 矩阵的水平垂直连接2.41 矩阵的复制2.42 稀疏矩阵2.43 稀疏矩阵的图形显示2.44 寻找矩阵的非零元素 实例演练总结思考 语法知识 2.34 逆矩阵 2.35 LU分解 2.36 正交分解 2.37 Cholesky分解 2.38 广义逆矩阵 2.39 数组与矩阵的乘幂 power(A,B)mpower(A,y)A.^BA^yy=sqrt(x) 2.40 矩阵的水平垂直连接 2.41 矩阵的复制 2.42 稀疏矩阵 <1>
<2>
<3>
2.43 稀疏矩阵的图形显示 2.44 寻找矩阵的非零元素 实例演练 综合演练:
>> A=[1 2 3;4 5 6;7 8 9] A = 1 2 3 4 5 6 7 8 9 >> inv(A) 警告: 矩阵接近奇异值,或者缩放错误。结果可能不准确。RCOND = 2.202823e-18。 ans = 1.
文章目录 反爬虫 反爬虫 今天使用httpclient+jsoup爬取某网站的数据时,一直获取不到网页中动态生成的那部分数据.尝试后发现只需在请求头中加入该网站的Reffer即可!
思路:服务端判断请求,要么是请求参数,要么是header.所以我们要做的就是拿到浏览器的全部请求头和参数,模拟一下.
httpGet.addHeader("Referer", "https://xxx");
1 故障模拟演练
1.1准备数据
create database backup; use backup; create table t1 (id int); insert into t1 values(1),(2),(3); commit; rm -rf /backup/* 1.2 周二 23:00全备
-A 全备份,-B 库备份 -R 存储过程和函数 -E 事件 --triggers 触发器 --master-data=2 *****
(1) 记录备份时刻的binlog信息
(2) 自动锁表
不加--single-transaction ,温备份
加了--single-transaction,对于InnoDB表不锁表备份(快照备份)
--single-transaction *****
对于InnoDB的表,进行一致性快照备份,不锁表.
mysqldump -uroot -p123 -A -R --triggers --set-gtid-purged=OFF --master-data=2 --single-transaction|gzip > /backup/full_$(date +%F).sql.gz 1.3 模拟周二 23:00到周三 10点之间数据变化
use backup insert into t1 values(11),(22),(33); commit; create table t2 (id int); insert into t2 values(11),(22),(33); commit; 1.
在我们刚开始写代码的时候,通常都会使用console.log() 来打印各种数据,各种日志,但是在 IE9浏览器中我们会发现当你第一次在IE9 中打开页面时有时页面是空白的不能正常显示,会报错 ‘console’未定义,这是因为 IE浏览器在 IE10以下对console的支持不是很友好, IE9只有在打开F12时才能唤醒浏览器的console功能。
针对这一情况,我们可以在页面中加入如下 js 代码,
<script type="text/javascript">
//解决 IE8、IE9 不支持 console 问题
window.console = window.console || (function () {
var c = {}; c.log = c.warn = c.debug = c.info = c.error = c.time = c.dir = c.profile
= c.clear = c.exception = c.trace = c.assert = function () { };
return c;
})();
</script>
这样即使IE浏览器不支持console也不会报错了
ecplise安装flowable插件步骤: Help ---- > Install New Software ---- > add, 然后添加的弹窗中输入以下信息:
Name:
Flowable BPMN 2.0 designer Location:
http://flowable.org/designer/update/ 创建一个maven项目测试一下:
title: 每日一题–涂色问题
date: 2019-11-02 20:55:57
tags:
每日一题算法 99.涂色问题 (15分)
C时间限制:1 毫秒 | C内存限制:3000 Kb
题目内容:
有排成一行的n个方格,用红(Red)、粉(Pink)、绿(Green)三色涂每个格子,每格涂一色,要求任何相邻的方格不能同色,且
首尾两格也不同色.求全部的满足要求的涂法。
输入描述
输入正整数n
输出描述
输出结果
输入样例
5
输出样例
30
#include <stdio.h> /* a: 记录格数不同时的涂色总数 n: 格数 */ int a[101], n; int main(){ scanf("%d", &n); //初始化前几个的值 a[1] = 3; a[2] = 6; a[3] = 6; for(int i = 4; i<=n; i++){ //分两种情况,看倒数第二格和第一个相同与不相同两种情况 a[i] = a[i - 1] + 2 * a[i - 2]; } printf("
今天做Windows编程实验时,需要调用word和excel的com。但是发现不停的报错,而且很多dll文件找不到。这里记录一下最后感觉有用的两个方法。
环境:vs 2019 commuity,Office 2016专业增强版64位版。
1.通过VSTO找office各个dll的路径 这个世界上最可怕的就是打开软件安装目录发现找不到dll了。一度让我认为我是不是必须要重新安装Office才能做这个实验。不过后来突然想到了微软早已单独研发出了专门适用于Office开发的项目类型——VSTO。于是我先用打开Visual Studio Installer加入了对VSTO项目的支持。然后创建了一个新的word vsto外接程序。
然后我们运行一下,vs会打开word。说明我们的vsto程序创建成功了。好了,我也没有认真研究vsto,我们还是看怎么找dll。
既然能成功打开word说明vs肯定已经帮我们把各种引用添加好了,我们看看解决方案资源管理器,果不其然各种引用都已经被正常添加到了项目中。
这就很好办了,点开Microsoft.Office.Interop.Word,然后打开属性视图找找路径。
其实这个给人的感觉像是这个项目框架安装时新加入的dll而非电脑上本来的Office自带的。但是管它呢?能打开word让我开始做实验就ok了。重新创建自己的实验项目,然后干脆把那个路径文件夹下的所有dll全部添加进去引用。
2.根据调试信息下载sdk 上一步做完后,word实验可以做了。但之后做excel实验的时候,发现添加System.drawing竟然也有问题,不由得让我怀疑可能确实是我本身环境没有配好。
于是认真阅读报错信息
MSB3091 任务失败,因为未找到“AxImp.exe”,或未安装正确的 Microsoft Windows SDK。任务正在注册表项 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\NETFXSDK\4.7.2\WinSDK-NetFx40Tools-x86 的 InstallationFolder 值中所指定位置下的“bin”子目录中查找“AxImp.exe”。
通过执行下列操作之一可以解决此问题:
安装 Microsoft Windows SDK。安装 Visual Studio 2010。手动向正确的位置设置上面的注册表项。将正确的位置传入任务的“ToolPath”参数中。 这个报错确实是让人很头大,因为我注册表从Microsoft SDKs这层开始就没有它下面说的那些目录了。手动添加我也找不到要添加进去的东西呀。
然后查看Visual Studio Installer的.Net桌面开发。.Net 4.7.2开发工具是必选项不存在没有安装的情况。这还让我说什么。
漫无目的的各种翻,翻到了Visual Studio Installer的单个组件列表。发现了问题。
这个SDK原来是没有装的。这就说的过去了。下载安装就完事了。但是这个不在安装.NET开发平台的时候直接安装sdk而且之后还不提示的操作真的是让我。。安装完成后一切正常运行。
结尾 心情不好没有结尾。
php 在字符串中 特定位置 插入 字符串
直接上代码:
/** * 在一段字符串里增加域名 * @param string $str 字符串 * @param string $find 加入的位置 * @param string $substr_s 在什么地方插入 * @param string $domain 添加的域名 */ function add_domain_url_str($str,$find = 'src="/uploads',$substr_s = '/',$domain = 'test.web1.com/'){ $count=strpos($str,$find); if(!$count){ return $str; } $strlen = strlen($find); $strat = explode($substr_s, $find); $strs = substr_replace($str,$strat[0].$domain.$strat[1],$count,$strlen); //查看还有没有 return add_domain_url_str($strs,$find,$substr_s,$domain); } 转载请附上原文地址
我们主要说run.bat闪退和cracker.jar打不开的问题。因为我发了个破解软件审核不通过,要是想要的话,可以在下面评论我私发给你。
首先,run.bat和cracker.jar都能进行破解。
我们先说cracker.jar的问题。如果cracker.jar可以用JDK打开,那就用cracker.jar来破解。cracker.jar的图标是这样的:
如果cracker.jar打不开很有可能是环境变量没有配好,我也遇见过这样的情况,一般要从新安装JDK然后从新配置环境变量就好了。然后按照步骤破解就好了。
run.bat问题
如果cracker.jar无法打开,就试试run.bat。但是run.bat面临闪退的问题。
解决方法:把run.bat用记事本打开,然后把里面的内容换成
java -jar cracker.jar 再打开就好了,然后就按照破解方法进行破解就好了。
最后,要是破解失败了,一定要把myeclipse从新装一遍再从新破解。
前言 差点忘了写总结,,,
正文 上个月想想干了啥,好像也无从说起,干了不少也好像啥也没干,那就拿着9月的总结说事吧。
Node.js 的话,这个月没有再深入,原本准备认真看看V8的,不料完全沦落到React的怀抱出不去了。后端的东西继续加深了 nest.js 的学习,越发觉得这是一个非常优秀的框架,很是喜欢,完成了一些以前没做过的东西的开发,还是自己琢磨透的感觉还不错;关于nest.js本身,也是了解了诸如 crud写法,workspace的概念,prisma或者graphql的集合,感觉尝试的东西挺多,眼界确实有所扩宽,当然这里有个但是,后面再说。前端JS库,花费了两周的时间在React身上,包括全家桶和RN等一些混合应用的库,Hooks和函数式编程让我一见钟情,下一步应该是继续深入学习,当然不是说Vue的东西不好,只是个人更喜欢React的风格,说不定等Vue3正式版出来后我还会叛变?在一些尝鲜工具方面,前半月做的挺多的,尤其是graphql,配合apollo能做的事情之多真的是让人赞叹,写博客的时候我真的想把graphql作为技术栈的,但是仔细想想,restful学的其实也就那样,还不如巩固,,,小程序也引起了我的注意,一开始我是不想做小程序的,我更愿意写RN或者Flutter,但是接触了PWA之后,我觉得其实这东西有部分特性和小程序其实挺像的,包括无需安装,体验流畅,无需担心版本问题等,总之在PWA在国内不太成熟的前提下,学习小程序也是大势所趋,更何况,Taro真香。然后就是上文说到的博客了,其实技术栈选型我现在都没有考虑的很好,前台和接口分别是Next.js和Nest.js,这也是我目前掌握的比较好的两门技术,后台管理我是想换一个技术栈,这样的话整一个项目去应聘就够了,技术栈挺全面,挺好的,所以我想要不就是用小程序实现后台,或者是用原生实现,但是问题是这两种方式都不方便我写文章。因此估计最后还是会使用React或者Vue来实现,NG就算了,学的真的不咋地。最后就是serverless,我是很喜欢Next.js和hyper的,hyper的话我很早就在用了,现在WT横空出世之后才渐渐放下,因此我对zeit这个公司很有好感,now的话又有免费的serverless服务,因此我在想能不能做个Taro或者RN的serverless项目,然后搞到zeit now上去,只是个想法,下个月还是先把博客构建好。 Future 说实话,展望的东西我一直都没法履行的很好,上个月说好了要把H5搞深点,结果就陷入React无法自拔。。。
但是这个月确实有几个小目标:
上文也说了,博客肯定是要做完的,可能要花一周左右去吧细节做好,部署的话听天由命。再次吐槽波兰的网!React要把一些Hooks等一些新特性的API看完,真正理解状态管理这个东西,尝鲜的话,还是对于graphql和apollo下点功夫。Taro先做几个demo玩一下,不得不说,我确实挺喜欢这个东西的,比RN方便,还可以写Hooks。做题,这个月要开始过面试题了,残酷的日子来了,不能随心所欲了。写个简历呗,要不要写个H5还没确定,再说吧最后就是自己研究上的一些东西了,继续摸鱼!
修改文档内容: 单个更新 update()函数: 用于更新已存在文档 1.首先查看下数据
2.使用update()更新
3.再查看下数据
可以看到数据修改了,可是其他字段都消失了,这就是update的一个特性(没有修改的字段会消失)
$set操作符: 用来指定一个键并更新键值,若键不存在并创建 1.首先查看下数据
2.使用update()更新,同时使用$set操作符,即使没有修改的字段也不会消失
3.再查看下数据
此外$set还可以完成键值对的添加
我们给JessicaJung这条文档添加description
批量更新 使用 multi 参数实现批量更新 这是两条title一样的数据,我们使用multi实现批量更新
使用multi:true实现批量更新
查看数据
module ‘tensorflow’ has no attribute ‘ConfigProto’/'Session’问题的解决 因为tensorflow2.0版本与之前版本有所更新,故将上述代码改成之下即可:
#原版 config = tf.ConfigProto(allow_soft_placement=True) config = tf.compat.v1.ConfigProto(allow_soft_placement=True) #原版 sess = tf.Session(config=config) sess =tf.compat.v1.Session(config=config) #注意 ,这里为tensorflow2.0版本,与第1.0有差距。 觉得有用点个赞吧(≧▽≦)/
接上篇 人脸关键点检测和头部姿态估计数据集整理
1. 借助于OpenPose生成人脸关键点和头部姿态,使用链接:https://github.com/TadasBaltrusaitis/OpenFace/wiki/Command-line-arguments
build/bin/FaceLandmarkImg.exe -fdir "images path" 具体使用可参考博客,每张人脸可得到一个csv文件,里面记录了人脸的很多信息,我们只需要68个关键点和头部姿态
2. 借助于人脸检测网络生成人脸检测结果,每张人脸可得到一个csv文件,里面记录了人脸的左上角和右下角坐标,具体使用可参考博客
3.结合OpenPose和人脸检测结果生成数据集label标注文件,格式为:
face_path x1 y1 x2 y2 x3 y3 ...... x68 y68 pitch yaw roll 执行代码:Generate_labels.py
import sys, os import cv2 import numpy as np import csv import argparse import math from shutil import copyfile #Determine whether it is a rotation matrix def isRotationMatrix(R): Rt = np.transpose(R) shouldBeIdentity = np.dot(Rt, R) I = np.identity(3, dtype=R.dtype) n = np.linalg.norm(I - shouldBeIdentity) return n < 1e-6 #rotationvector to rorationmatrix def vec2matrix(rvec): theta = np.
字符串str转换成int: int_value = int(str_value)
int转换成字符串str: str_value = str(int_value)
a=100 b='666' #int转str类型 print('int转str类型') print('int转str: '+str(a)) #str转int类型 print('str转int类型') print(4+int(b))
软件架构设计原则 基本原则 原则1: KISS (Keep it simple,sutpid) 和保持每件事情都尽可能的简单,用最简单的解决方案来解决问题。
原则2: YAGNI(你不需要它)原则 ,只在需要时构建
原则3: 先学会爬,然后再学会走,最后学会跑。换句话说,先保证能够正常运行,然后优化它使其更好,最后逐渐让它变得完美。使用迭代开发,采用敏捷开发模式。为每个功能制定一个开发周期(最多2周),然后不断迭代。
原则4: 自动化测试是构建稳定、高质量产品的唯一方法。通过自动化测试提升创造力,所有一切都可以自动化!在设计时应当好好考虑自动化。
原则5: 注重投资回报率(ROI)并将最多的注意力放在最重要的地方。
原则6: 了解用户并相应地平衡资源。大多数产品都有数千个最终用户,大致需要20个开发人员和100个 DevOps 人员。不要花费数月的时间来构建一个不太可能使用 DevOps 的用户界面(他们更喜欢脚本)。这是原则5的特例。
原则7: 功能的设计和测试尽可能独立。如果在设计时考虑到这一点,长远来看,它将省去很多麻烦,否则只有一切构建完成时你才可以开始测试整个系统。此外,遵循这个原则,版本发布也会更加顺利。
原则8: 警惕搜索引擎中花里胡哨的架构方案。我们天生都喜欢令人夺目的设计。如果你按奈不住, 就可能把太多根本不需要的功能和解决方案引入到你的架构中。
功能选择 原则9: 想要准确知道用户如何使用我们的产品是很难的。所以我们要推行MVP(最小可行产品)。该理念的核心在于:先制定一些用例,完成用例所涉及的相关功能,立即发布产品,然后根据反馈和经验对产品进行优化。
原则10: 尽可能减少功能,如有疑问则将其删除。许多功能可能从未使用,你只需为其留一个扩展接口即可。
原则11: 听取客户的意见,看他们想要什么功能。
原则12: 当客户要求的功能影响到其他模块时,要勇于和客户辩论。从大局出发,尝试找到另一种方法来处理问题。就像 Fords 所说的那样“每当我问顾客需要什么的时候,他们总是会说需要跑得更快的马”。请记住,你才是专家。你应该主导一切,做出正确和专业的决定。虽然用户可能当时有些疑惑,但最终他们会感谢你的。
服务端设计和并发 原则13: 要知道一个server是如何运行的,从硬件到操作系统,直到编程语言。优化IO调用的数量是你通往最好架构的首选之路。
原则14: 遵循 Amdhal 的同步定律。线程之间共享的可变数据会降低程序速度。如果可以,请使用并发数据结构,并且仅在必要时使用同步。尽可能少地使用锁。如果你打算在线程锁期间阻塞,请确保自己足够了解具体细节,因为这里存在极大的隐患。
原则15: 如果你的设计是基于事件驱动的非阻塞架构,那就不要阻塞线程或者在线程中执行 IO 操作。一旦这样做,系统将慢如蜗牛。
分布式系统 原则16: 无状态系统具有良好的扩展性。我们要尽可能了解和使用无分享架构。
原则17: 除非你能够掌控客户端和服务器的所有代码,否则消息传递失败的情况在所难免。尽量减少你的系统依赖的因素(例如使用原则18)。
原则18: 尽可能实施幂等操作。这样它就很容易恢复,你至少可以保证交付没问题。
原则19: 了解 CAP 定理。可扩展的事务(分布式事务)是很难的 。尽可能使用补偿,基于 RDBMS 的事务很难扩展。
原则20: 分布式系统共识不支持扩展,也无法进行组通信,不支持群集范围内的可靠消息传递。其最大节点限制大约是八个节点。
原则21: 在分布式系统中,你很难隐藏分布式系统中的延迟和故障。(参见分布式计算的谬误解释 )。
描述:
使用整数除法时,取两个(非复数)数作为参数并返回一对由其商和余数组成的数。对于混合操作数类型,应用二进制算术运算符的规则。对于整数,结果与(a//b,a%b)相同。对于浮点数,结果是(q,a%b),其中q通常是math.floor(a/b),但可能小于1在任何情况下,q*b+a%b都非常接近a,如果a%b为非零,则它具有与b相同的符号,且0<=abs(a%b)<abs(b)。
语法:
divmod(a, b) 参数介绍:
a --- 数字,非复数
b --- 数字,非复数
对于整数,结果与(a//b,a%b)相同。
结果是(q,a%b),其中q通常是math.floor(a/b),但可能小于1在任何情况下,q*b+a%b都非常接近a。
如果a%b为非零,则它具有与b相同的符号,且0<=abs(a%b)<abs(b)。
返回值:
返回一个包含商和余数的元组(a // b, a % b)
下面例子展示divmod()函数使用方法
print(divmod(2,1)) print(divmod(2,1.33)) print(divmod(2,-4)) 输出
(2, 0) (1.0, 0.6699999999999999) (-1, -2) 本期divmod()函数就学到这里。
理解 Class.forName()
Class 类概念 Class 也是一个 Java 类,保存的是与之对应 Java 类的 meta信息(元信息),用来描述这个类的结构,比如描述一个类有哪些成员,有哪些方法等,一般在反射中使用。
详细解释:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class类的一个实例(Class 对象)。也就是说,在 Java 中,每个 java 类都有一个相应的 Class 对象,用于表示这个 java 类的类型信息。
类加载概念 当使用一个类的时候(比如 new 一个类的实例),会检查此类是否被加载到内存,如果没有,则会执行加载操作。
读取类对应的 class 文件数据,解析此数据,构造一个此类对应的 Class 类的实例。此时JVM就可以使用该类了,比如实例化此类,或者调用此类的静态方法。
Java 也提供了手动加载类的接口,class.forName()方法就是其中之一。(说来说去,其实就是生成这个类的 Class)
类加载器的概念 顾名思义,类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class 类的一个实例。每个这样的实例用来表示一个 Java 类。通过此实例的 newInstance() 方法就可以创建出该类的一个对象。
基本上所有的类加载器都是 java.
普通判别素数 从2到n枚举根号n次
bool isprime(int n){ for(int j=2;j*j<=n;j++){ if(i%j==0) return 0; } return 1; } 埃拉托斯特尼筛法 基本思想:要得到自然数n以内的全部素数,必须把不大于根号n的所有素数的倍数剔除,剩下的就是素数。
表中有2到n的所有整数,其中2是最小的素数。将2记为素数,然后把表中2的倍数全部去掉。接下来表中最小的数是3,3不能被更小的数整除,所以3是素数,将表中所有3的倍数去掉。
以此类推,如果表中剩余的最小数为m,那么m就是素数,然后将表中m的倍数全部去掉。这样反复枚举就能够得到n以内的所有素数。
时间复杂度:O(nloglogn)。
#include<bits/stdc++.h> const int maxn=1e5; bool vis[maxn]; int prime[maxn],x=0; void Eprime(int n){//埃氏筛 for(int i=2;i<=n;i++){ if(!vis[i]) prime[x++]=i; for(int j=2;i*j<=n;j++){ vis[i*j]=1; } } } 欧拉筛法 基本思想 :在埃氏筛法的基础上,让每个合数只被它的最小质因子筛选一次,以达到不重复的目的。
时间复杂度:O(n)
任何合数都能表示为素数之积,所以每个合数一定有一个最小质因子,每个合数都被其最小质因子筛去过一次,所以是线性时间
void oprime(int n){//欧氏筛 for(int i=2;i<=n;i++){ if(!vis[i]) prime[x++]=i; for(j=0;j<x&&i*prime[j]<=n;j++){ vis[i*prime[j]]=1; if(i%prime[j]==0) break;//找到i*prime[j+k]的最小质因子为prime[j],跳出循环 } } } 关于if(i%prime[j]==0) 如果i%prime[j]==0,i是prime[j]的整数倍,那么记m=i/prime[j]
所以i=m*prime[j]
如果继续内层循环,j+1
设k=i*prime[j+1]
可以得到:
k=i*prime[j+1]=(m*prime[j])*prime[j+1]
=(m*prime[j+1])*prime[j]
这说明i*prime[j+1]是prime[j]的整数倍,即k是prime[j]的整数倍,prime[j]才是k的最小质因子,所以不需要再进行标记,跳出内层循环。
当之后外层循环枚举到i=m*prime[j+1]时,该数k=(m*prime[j+1])*prime[j]会在内层循环中被i*prime[j]标记。
1.第一步先看视频显示和视频编码后输出流程图 2.第二步视频显示代码详细步骤说明 在初始化视频时,启动了一个线程函数obs_video_thread(),所有画面源的合成,画面显示以及视频输出都在这个函数里触发。
void *obs_video_thread(void *param) { uint64_t last_time = 0; uint64_t interval = video_output_get_frame_time(obs->video.video); uint64_t frame_time_total_ns = 0; uint64_t fps_total_ns = 0; uint32_t fps_total_frames = 0; obs->video.video_time = os_gettime_ns(); os_set_thread_name("obs-core: graphics thread"); const char *video_thread_name = profile_store_name(obs_get_profiler_name_store(), "arcvideo_director_video_thread(%g"NBSP"ms)", interval / 1000000.); profile_register_root(video_thread_name, interval); while (!video_output_stopped(obs->video.video)) { uint64_t frame_start = os_gettime_ns(); uint64_t frame_time_ns; profile_start(video_thread_name); profile_start(tick_sources_name); last_time = tick_sources(obs->video.video_time, last_time); profile_end(tick_sources_name); profile_start(render_displays_name); render_displays(); profile_end(render_displays_name); profile_start(output_frame_name); output_frame(&obs->video.main_track, obs_get_video_context(), obs_get_video()); for (int i = 0; i < MAX_AUX_TRACK_CHANNELS; i++) { output_frame(&obs->video.
ubuntu 18.04 安装 lotus 1,依赖安装1.1 go环境配置 2,终端代理3,克隆源码(当前版本Devnet 6)4,运行lotus5,lotus存储交易6,重新安装7,Devnet 6 升级 Devnet 7 1,依赖安装 apt install mesa-opencl-icd ocl-icd-opencl-dev -y add-apt-repository ppa:longsleep/golang-backports apt install golang-go gcc git bzr jq pkg-config mesa-opencl-icd ocl-icd-opencl-dev -y 安装go,需要使用1.13.3版本 apt install golang -y 卸载重新安装 # go version go version go1.10.4 linux/amd64 # apt remove -y golang # wget https://dl.google.com/go/go1.13.3.linux-amd64.tar.gz # tar -zxvf go1.13.3.linux-amd64.tar.gz # mv go /usr/local/ # rm -rf /usr/bin/go # rm -rf /usr/bin/gofmt # ln -s /usr/local/go/bin/* /usr/bin/ # go version go version go1.
最近,在工作中,要做一个关键日志保存工具。在开发过程中,使用了函数fwrite写入到文本文件中,但是当用UE打开以后,却总是以十六进制的形式显示,
即使进行转换,文本文件中,仍然有很多乱码,但是使用函数fprintf写入却不会出现上面的问题。
一、 fwrite函数介绍
size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
功能:向文件写入一个数据块(以二进制形式对文件进行操作,不局限于文本文件)
返回值:返回实际写入的数据块数目
参数说明:
1. buffer:要获取数据的地址;
2. size:要写入内容的单字节数;
3. count:要进行写入size字节的数据项的个数;
4. stream:目标文件指针;
注意:fwrite函数写到用户空间缓冲区,并未同步到文件中,所以修改后要将内存与文件同步可以用fflush(FILE *fp)函数同步
#include <stdio.h> struct mystruct{ int i; char c;}; int main(void){ FILE *stream; struct mystruct s; if((stream = fopen("./test.tmp", "wb")) == NULL) { fprintf(stderr, "cannot open output file.\n"); return 1; } s.i = 2; s.c = 'A'; fwrite(&s, sizeof(s), 1, stream); //写mystruct到文件中 fclose(stream); //关闭文件 return 0;} 结果:[root@f8s fwrite_test]# cat test.
控制台输出就直接代表着数据可以实现传输功能了
<input bindinput ="userNameInput" placeholder="请输入修改内容"></input> //js: userNameInput(e) { console.log(e) },
创建内部Parcel仓库 安装web服务
以apache为例
//# RHEL $ sudo yum install httpd $ sudo service httpd start //# SLES $ sudo zypper install httpd $ sudo service apache2 start //# Ubuntu $ sudo apt-get install httpd $ sudo service apache2 start 下载和发布Parcel仓库
下载地址
//# CDH 5: Impala,Kudu,Spark1等等 https://archive.cloudera.com/cdh5/parcels/ //# Accumulo https://archive.cloudera.com/accumulo-c5/parcels/ //# GPL Extras https://archive.cloudera.com/gplextras5/parcels/ //# CDS 2: CDH5 用的spark2 https://archive.cloudera.com/spark2/parcels/ //# Navigator Key Trustee Server http://www.cloudera.com/content/www/en-us/downloads/navigator/key-trustee-server.html //# Navigator Key Trustee KMS and HSM KMS http://www.
几次的委外单价对不上,人为选了历史单据而操作员不承认,避免类似错误出现写一触发器
ALTER trigger testmocdj on MOCTA AFTER UPDATE
AS BEGIN DECLARE @PH VARCHAR(60)
DECLARE @DJ NUMERIC(18,8)
DECLARE @DJX NUMERIC(18,8)
DECLARE @VENDOR VARCHAR(20)
DECLARE @SHM VARCHAR(2)
SELECT @PH=TA006,@DJ=TA022,@VENDOR=TA032,@SHM=TA013 FROM inserted WHERE TA030='2'
SET @DJX=(SELECT TOP 1 MA005 from MOCMA where MA001=@PH AND MA003=@VENDOR order by MA013 DESC)
IF (@SHM='Y') AND (@DJX<>@DJ)
BEGIN
RAISERROR('核对价格是否为最新的或者单价为0',16,1)
ROLLBACK
END
END
#jmeter持续集成中引用时间戳的用法
##使用当前时间:${__time(,)}
1、__time:获取时间戳、格式化时间
(1)、${__time(yyyy-MM-dd HH:mm:ss:SSS,time)} :格式化生成时间格式 2018-10-26 11:08:23:635
(2)、${__time(,)}:默认该公式精确到毫秒级别, 13位数 1527822855323
(3)、${__time(/1000,)}:该公式精确到秒级别, 10位数 1527822871
(4)、${__time(yyyy-MM-dd,)}:该公式格式化生成的时间为:2018-10-26
(5)、${__time(yyMMdd,)}:该公式格式化生成的时间为:181026
———————————————
##当前时间的前30天:${__timeShift(,P-30D,)} //后30天,去掉减号
__timeShift(格式,日期,移位,语言环境,变量)函数
“P1DT2H4M5S” 解析为“添加1天2小时4分钟5秒”
“P-6H3M”解析为“-6小时+3分钟”
“-P6H3M”解析为“-6小时-3分钟”
“-P-6H + 3M”解析为“+6小时和-3分钟”
##使用随机时间: __Random({__timeShift(,P-30D,)},{__time(,)},) //看图内格式
//这个是拿当前时间与30天前之间的随机时间,进行使用
//这个随机,平时随机数字也用它${__Random(1,9,)}
##有更多的使用方法,欢迎分享
我在项目中获取getUserId(),和getUserName()获取不到值。
他们都是通过SecurityUtils.getSubject().getPrincipal()去获取的。
反复测试发现原因是 :在shiroConfig里面:
该方法,注意(是该接口名)被写为anon,不通过验证,即:
filterMap.put("/druid/**", “anon”);
这种写法是为了postman测试时不被拦截。
解决办法:
从页面访问后端不需要anon了。
anon是不做拦截,authc是走自定义拦截
oauth2是自带拦截
修改为: filterMap.put("/druid/**", “authc”);
<script>
function onBridgeReady() {
WeixinJSBridge.call('hideOptionMenu');
}
if (typeof WeixinJSBridge == "undefined") {
if (document.addEventListener) {
document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
} else if (document.attachEvent) {
document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
}
} else {
onBridgeReady();
}
</script>
一、背景与目标 通过对客户进行分类,区分无价值客户、高价值客户,企业针对不同价值的客户制定优化的个性化服务方案,采取不同营销策略,将有限营销资源集中于高价值用户,实现企业利润最大化目标。
数据为某航空公司的用户档案信息与航班记录。
字段名称字段说明FFP_DATE入会时间LOAD_TIME观测窗口的结束时间FLIGHT_COUNT观测窗口内的飞行次数avg_discount平均折扣率SEG_KM_SUM观测窗口内的总飞行公里数LAST_TO_END最后一次成绩时间至观测窗口结束时长SUM_YR观测窗口的票价收入 二、分析方法与过程 本案例的目标是客户价值识别,即通过航空公司客户数据识别不同价值的客户。识别客户价值应用最广泛的模型是通过3个指标(最近消费时间间隔(Recency)、消费频率(Frequency)和消费金额(Monetary))来进行客户细分,识别出高价值的客户,简称RFM模型。
在RFM模型中,消费金额表示在一段时间内,客户购买该企业产品金额的总和。由于航空票价收到运输距离、舱位等级等多种因素影响,同样消费金额的不同旅客对航空公司的价值是不同的。因此,我们使用客户在一定时间内累计的飞行里程M和客户在一定时间内乘坐舱位所对应的的折扣系数的平均值C两个指标代替消费金额。此外,考虑航空公司会员入会时间的长短在一定程度上能够影响客户价值,所以在模型中增加客户关系长度L,作为区分客户的另一个指标。
本案例将客户长度L、消费时间间隔R、消费频率F、飞行里程M和折扣系数的平均值C五个指标作为航空公司识别客户价值指标,记为LRFMC指标。
通过对航空公司客户价值的LRFMC模型的五个指标进行K-Means聚类,识别出最有价值客户。
三、代码实现过程 1.数据探索 import numpy as np import pandas as pd # 数据读取 data = pd.read_csv("air_data.csv") # 数据探索 explore = data.describe(percentiles=[],include='all').T explore['null'] = len(data)-explore["count"] explore = explore[['null','max','min']] 2.数据预处理 通过数据探索分析,发现数据中存在缺失值与异常值。比如:票价最小值为0,折扣率最小值为0,总飞行公里数大于0的记录。由于原始数据量大,选择进行丢弃处理。
①.数据清洗 # 数据清洗 data = data[data['SUM_YR_1'].notnull()*data['SUM_YR_1'].notnull()] index1 = data['SUM_YR_1'] != 0 index2 = data['SUM_YR_2'] != 0 index3 = (data['SEG_KM_SUM'] == 0) & (data['avg_discount'] == 0) data = data[index1 | index2 | index3] ②.
首先我跟大家说一下我的遇到的问题,我这边有一台虚拟机服务器的ip地址有人改动了,之前服务器的地址为172.18.2.248,不知道怎么回事,ip地址变为172.18.2.237首先要改动ip,改动的操作如下:
首先使用ifconfig的命令看一下,目前你使用的那个网络配置: eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.18.2.237 netmask 255.255.255.0 broadcast 172.18.2.255 inet6 fe80::20c:29ff:fe3a:6b1 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:3a:06:b1 txqueuelen 1000 (Ethernet) RX packets 174770 bytes 16314429 (15.5 MiB) RX errors 0 dropped 580 overruns 0 frame 0 TX packets 18457 bytes 2849217 (2.7 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 这时候需要改动/etc/sysconfig/network-scripts目录下的 ifcfg-eno16777736文件中的IPADDR=172.18.2.237的内容,改成172.18.2.248 然后进行 /etc/init.d/network restart的操作 network启动成功后使用ssh 172.18.2.248节点的是后出现以下报错:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: POSSIBLE DNS SPOOFING DETECTED!
在我写接口的时候,用到了default和static方法时,然后就出现了四五个错误,通过网上查原因得知
Myeclipse10不支持jdk1.8
??
费尽心思的一个一个查找错误,结果时不支持的原因…
51单片机舵机控制系统 概述硬件设计程序设计PWM波的产生矩阵按键功能与数码管显示参数传递完整程序 外加模块 概述 在这篇博客中,将介绍一个基于51单片机的舵机控制系统,其可以通过矩阵按键输入角度,舵机打到预定角度,并在数码管上显示。
硬件设计 这次的小系统电路都由洞洞板搭建,主要包括51单片机最小系统,矩阵按键,数码管驱动和舵机四个部分。Protues仿真电路图如下
数码管驱动
仿真测试程序数码管时可以直接用IO口驱动,但是实物搭建电路需要再接驱动电路,这次选择了74HC245芯片来驱动。这款芯片使用非常简单,在驱动显示屏,做隔离芯片时应用都非常多。它有A0-A7,B0-B7两组输入输出口,可以DIR管脚选择数据传输方向,在使用时如果不需要转换传输方向可以直接将此管脚接到芯片VCC或者GND。
矩阵按键
4*4的矩阵按键每一行每一列接在一个口上,通过行列扫描确定哪一个按键被按下,也就是导通。
舵机
舵机一般分为数字舵机和模拟电机。它们都由马达,减速齿轮组和控制电路组成。主要区别是数字电机有微处理器和晶振,能产生一周期为20ms,占空比为7.5%(即1.5ms高电平)的基准信号,通过输入与信号比较确定打角。而模拟电机则通过电位器产生的差分电压驱动电机正反转从而改变角度。这次选用的是SG90 180度的模拟舵机,价格低,带动一个激光头绰绰有余。通过单片机输出的周期为20ms的PWM波控制,在宽度从0.5ms到2.5ms,每一个占空比对应一个角度,示意图如下
程序设计 PWM波的产生 在51单片机中,没有可以直接调用产生PWM波的底层库,需要自己用定时器写。一般产生PWM波能用两个定时器写,每一个定时器只固定拉高或者拉低,靠时间差确定周期。也可以只用一个定时器写,通过改变装载值来反复改变电平。以下详细说明用一个定时器写的方式,另外一个定时器空余出来可以实现更多功能。
一个定时器产生PWM波需要两组装载值,分别控制高低电平时间。设置一个全局变量作为中断标志位确定用哪一组装载值,拉高还是拉低电平,每一次进入中断后改变标志位的值。舵机180度对应每周期高电平时间0.5到2.5ms,可调范围2ms,用12M晶振时也就是2000个机器周期长,得到装载值与角度关系系数为11.11,取11,再加0.5ms对应的500个机器周期,就能得到角度与高电平对应值的关系。
机器周期数=角度*11+500
*周期20ms减去高电平时间就能换算出低电平对应装载值。*如果想要更精确,系数和对应值可以用浮点型,在最后计算装载值时再强制转换成整型。
把这段程序单独贴出来
/******************************************************* 装载值计算函数 *******************************************************/ void zhuang(u8 jiaodu) { u16 zhuangza; //高电平对应机械周期数 zhuangza=jiaodu*11+500; //2000/180=11.11 H1= (65536-zhuangza)/256; L1 = (65536-zhuangza)%256; H2 = (45536+zhuangza)/256;//65535-(2000-高电平值) L2 = (45536+zhuangza)%256; } /******************************************************* 定时器1中断服务函数 *******************************************************/ void Time1(void) interrupt 3 { if(servoflag==0) //中断标志位 { TH1 = H1; TL1 = L1; PWM=1; servoflag=1; } else if(servoflag==1) { TH1 = H2; TL1 = L2; PWM=0; servoflag=0; } } 矩阵按键功能与数码管显示参数传递 矩阵按键前10个值分别对应0到9。10为确定键,按下后在主函数中将按键读到的几个一位数转换成角度,传给装载值计算函数,改变PWM波占空比,舵机打到对应角度。另外设计了11,12,13三个键,按下后能使舵机直接打到程序预定好的角度。相应按键功能分配在主函数中。具体程序不再赘述。
Maximum Request Latency CDH zookeeper报警: Maximum Request Latency
存在隐患 : 请求延迟最大值:32,264。会话超时最大值:40,000。会话超时百分比:80.66%。 警告阈值:75.00%。
这是CDH的健康值检查,检查项为ZOOKEEPER_SERVER_MAX_LATENCY
查看日志/var/log/zookeeper/
fsync-ing the write ahead log in SyncThread:5 took 2433ms which will adversely effect operation latency. 这是报警,不是错误,不影响程序运行; 但还是要处理的;
登录报警主机:
$echo stat | nc localhost 2185 Clients: /127.0.0.1:63686[0](queued=0,recved=1,sent=0) Latency min/avg/max: 0/8/32264 Received: 78146 Sent: 85285 Connections: 1 Outstanding: 0 Zxid: 0xc0001111 Mode: follower Node count: 40 可以看到Latency max 值为32264,这是客户端请求zookeeper服务时等待返回响应的延时;与"会话超时最大值"值40,000的比超过75%就会报警.
参见Zookeeper 要避免的事,可知zookeeper服务返回响应前,会将事务日志写入存储介质;
可知问题实质是将事务日志写入介质慢导致的;这也是zookeeper日志写得原因;
因此处理方法为:
如果是临时现象,重置统计信息 $ echo srst | nc localhost 2185 如果长期的现象,则要将事务日志的目录,移到更快的硬盘上;
1. fopen()函数
fopen函数用于打开文件, 其调用格式为:
FILE *fopen(char *filename, *type);
在介绍这个函数之;前, 先了解一下下面的知识。
(1) 流(stream)和文件(file)
流和文件 在Turbo C2.0中是有区别的, Turbo C2.0 为编程者和被访问的设备之间提供了一层抽象的东西, 称之为"流", 而将具体的实际设备叫做文件。流是一个逻辑设备, 具有相同的行为。因此, 用来进行磁盘文件写的函数也同样可以用来进行打印机的写入。在Turbo C2.0中有两种性质的流: 文字流( text stream)和二进制(binary stream)。对磁盘来说就是文本文件和二进制文件。
(2) 文件指针FILE
实际上FILE是一个新的数据类型。它是Turbo C2.0的基本数据类型的集合, 称之为结构指针。有关结构的概念将在第四节中详细介绍, 这里只要将FILE理解为一个包括了文件管理有关信息的数据结构, 即在打开文件时必须先定义一个文件指针。
现在再来看打开文件函数的用法。
fopen()函数中第一个形式参数表示文件名, 可以包含路径和文件名两部分。如:
"B:TEST.DAT"
"C://TC//TEST.DAT"
如果将路径写成"C:/TC/TEST.DAT"是不正确的, 这一点要特别注意。
第二个形式参数表示打开文件的类型。关于文件类型的规定参见下表。
表 文件操作类型
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
字符 含义
───────────────────────────
"r" 打开文字文件只读
"w" 创建文字文件只写
"a" 增补, 如果文件不存在则创建一个
"r+" 打开一个文字文件读/写
"w+" 创建一个文字文件读/写
"a+" 打开或创建一个文件增补
"b" 二进制文件(可以和上面每一项合用)
"t" 文这文件(默认项)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
如果要打开一个CCDOS子目录中, 文件名为CLIB的二进制文件, 可写成:
配置好地图之后首先是添加Marker
MarkerOptions markerOption = new MarkerOptions(); markerOption.position(new LatLng(Double.parseDouble(lat), Double.parseDouble(lon)); markerOption.draggable(true); //Double.parseDouble(lat); markerOption.title(String.valueOf(i)); markerOption.icon(BitmapDescriptorFactory.fromView(getMyView())); aMap.addMarker(markerOption); 如果不想用高德地图的布局,还可以自定义布局
markerOption.icon(BitmapDescriptorFactory.fromView(getMyView())); 其中getMyView就是自定义的布局
//自定义高德标点 protected View getMyView() { View view = getActivity().getLayoutInflater().inflate(R.layout.diandiantu, null); return view; } 下面是Marker的点击事件
aMap.setOnMarkerClickListener(new AMap.OnMarkerClickListener() { @Override public boolean onMarkerClick(Marker marker) { return true; } });
一、& 当在前台运行某个作业时,Shell终端会被该作业一直占用,我们可以在命令后面加上&实现命令在后台运行,例如:sh test.sh &
但如果放在后台运行的作业会产生大量的输出,最好使用下面的方法把它的输出重定向到某个文件中:
command > log.out 2>&1 & 这样,所有的标准输出和错误输出都将被重定向到一个叫做log.out的文件中。
使用&命令后,作业被提交到后台运行,虽然当前Shell终端没有被占用,但是有可能一但把当前Shell终端关掉(退出帐户时),作业就会停止运行。那么怎么确定终端关闭时,作业是否会停止了,可以通过如下命令查看:
$ shopt | grep huponexit 如果输出的是huponexit on就代表是Shell终端退出时,会发送hangup挂断信号给子进程,子进程收到hangup信号后也就退出了。
当作业提交成功以后,就会输出一个进程号,可以用它来监控该进程,或杀死该进程:(ps -ef | grep 进程号 或者 kill -9 进程号)
2>&1 是将错误提示信息的输出重定向到标准输出,而这里的标准输出已经重定向到log.out文件,也就是说标准的错误提示也直接输出到log.out文件中。
二、nohup nohup命令可以在退出Shell终端之后继续运行相应的进程。nohup就是no hang up(不挂起)的缩写,表示不发送hangup信号。该命令的一般形式为:
nohup command & 如果使用nohup命令提交作业,那么在默认情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件:
nohup command > myfile.out 2>&1 & 三、Ctrl+Z结合jobs和bg Ctrl+Z命令可以将当前的前台任务转后台,放到后台任务池中,虽然此时前台窗口就变成非阻塞状态了,但转过去的任务在后台默认是冻结状态,所以还需要使用bg命令将后台冻结的任务再次运行起来,bg命令的用法如下:
bg 任务ID # 可以使用jobs命令查看任务ID
TOP 1:Adblock Plus 介绍:Adblock Plus是Chrome浏览器中非常流行的一款广告拦截插件,Adblock Plus的用户多达数百万之多,在全球范围内都有很高的使用评价,Adblock Plus是由一个开源社区来维护。
TOP 2:Office Editing for Docs, Sheets & Slides 介绍:office editing是一款可以帮助用户查看和编辑微软Office Word、Excel和PPT的google官方插件,用户在Chrome中安装了Google文档、表格及幻灯片插件以后,就可以在本地计算机中没有安装Microsoft Office软件的情况下,在浏览器中来查看、编辑、新建Office文档。
TOP 3:Chrome Toolbox 介绍:Chrome Toolbox以后可以实现现有Chrome中所没有的功能,比如:自动查看图片、关闭标签的时候不关闭浏览器、在新标签页中打开链接、鼠标双击关闭标签、使用桌面快捷菜单等高级功能。
TOP 4:Screencastify 介绍:Screencastify是一款可以帮助用户把当前电脑上的操作录制下来的chrome插件,在chrome中安装了Screencastify插件以后,用户就可以选择录制chrome中的某一个标签页的活动内容,甚至来自己的电脑桌面也能够录制,在录制成功以后,就会在电脑的本地生成一个视频文件,用户可以选择把该文件保存下来,或者上传到社交网站与好友进行分享。
TOP 5:tampermonkey油猴插件 油猴插件有另外一个名字就是tampermonkey,那为什么什么喜欢称呼其为油猴插件呢!因为tampermonkey是是一款免费的浏览器扩展和最为流行的用户脚本管理器。是用来管理什么用户脚本的呢? 就是油猴脚本啦!所以人们也称tampermonkey为油猴插件。
TOP 6:Save All Resources插件 经常在仿站的时候回遇到下载别人的图片、css、js等资源,发现要一个个的手动下载。直接使用仿站工具有时候觉得比较麻烦而且会打乱目录结构。Save All Resources插件可以一键下载当前网站所有资源。
TOP 7:ChaZD 查字典插件 ChaZD 查字典是一款简洁易用的英汉字典Chrome插件,支持英、美发音,并提供在线划词法翻译。类似的Chrome插件还有一键翻译等。
TOP 8:OneTab——管理你打开的网页 我们平时在查阅资料或者工作的时候,常常不自觉就打开了一堆网站,当你想快速地点击到你的目标网站时,会发现十分不便,而且会把眼睛搞得很累,就像下图:
OneTab 就是为解决这个问题诞生的,搜索添加它之后,点击插件栏中的 OneTab 图标,这些打开的网页就被全部集合到一起啦:
TOP 9:Infinity 在Chrome网上应用店中搜索Infinity ,然后将它添加到Chrome:
成功添加之后,当你再打开新标签页,它就变成了这样,背景壁纸可以随意更换.
TOP 10:Awesome screenshot——注释&录屏 主要功能有两个,一是录屏二是捕获整个页面或任何部分,然后对捕获的图片进行注释,可以添加矩形,圆形,箭头,线条和文字,模糊敏感信息等。
作为一款小插件来说,我觉得它已经挺厉害了,有很多朋友说,Mac自带的录屏软件还有快捷键截图也已经很方便了,但我个人觉得插件的操作路径更短些,效率不就是这么一点点提高的吗?
我的视频应用类原创文章 酷播云免费视频二维码的完整使用教程(适合小企业做微信视频宣传) 微信公众号直播有哪些不一样的玩法?微信视频直播如何做收费直播(如何做付费的微信直播)图文教程说说视频编码格式、视频码率、视频帧率、分辨率的概念原创教程:带ppt课件和讲师画面的教学视频录制完整教程如何做电视节目的视频直播(电视台节目直播)做视频直播时如何测试本地网络的上行带宽(网速测试)usb摄像头做教学直播实现pc和手机都可以在线观看教程微信公众号直播有哪些不一样的玩法?微信视频直播如何做收费直播(如何做付费的微信直播)图文教程说说视频编码格式、视频码率、视频帧率、分辨率的概念原创教程:带ppt课件和讲师画面的教学视频录制完整教程如何做电视节目的视频直播(电视台节目直播)做视频直播时如何测试本地网络的上行带宽(网速测试)usb摄像头做教学直播实现pc和手机都可以在线观看教程微信公众号直播有哪些不一样的玩法?如何做电脑游戏桌面录屏直播实现手机直接观看免费视频存储平台(微云、百度网盘、谷歌硬盘、酷播云)的截图对比云课堂直播功能介绍,更贴合在线教育、企业内训的场景应用基于微信小程序做直播的截图(微信小程序发起视频直播)在线教学场景下 讲师们做PPT课件直播的一些介绍FMS/wowza/red5/SRS流媒体服务器产品对比
1. 背景 最近一直再做一些系统上的压测,并对一些问题做了优化,从这些里面收获了一些很多好的优化经验,后续的文章都会以这方面为主。
这次打压的过程中收获比较的大的是,对RocketMq的一些优化。最开始我们公司使用的是RabbitMq,在一些流量高峰的场景下,发现队列堆积比较严重,导致RabbitMq挂了。为了应对这个场景,最终我们引入了阿里云的RocketMq,RocketMq可以处理可以处理很多消息堆积,并且服务的稳定不挂也可以由阿里云保证。引入了RocketMq了之后,的确解决了队列堆积导致消息队列宕机的问题。
本来以为使用了RocketMq之后,可以万事无忧,但是其实在打压过程中发现了不少问题,这里先提几个问题,大家带着这几个问题在文中去寻找答案:
在RocketMq中,如果消息队列发生堆积,consumer会发生什么样的影响?
在RocketMq中,普通消息和顺序消息有没有什么办法提升消息消费速度?
消息失败重试次数怎么设置较为合理?顺序消息和普通消息有不同吗?
2. 普通消息 VS 顺序消息 在RocketMq中提供了多种消息类型让我们进行配置:
普通消息:没有特殊功能的消息。
分区顺序消息:以分区纬度保持顺序进行消费的消息。
全局顺序消息:全局顺序消息可以看作是只分一个区,始终在同一个分区上进行消费。
定时/延时消息:消息可以延迟一段特定时间进行消费。
事务消息:二阶段事务消息,先进行prepare投递消息,此时不能进行消息消费,当二阶段发出commit或者rollback的时候才会进行消息的消费或者回滚。
虽然配置种类比较繁多,但是使用的还是普通消息和分区顺序消息。后续主要讲的也是这两种消息。
2.1 发送消息 2.1.1 普通消息 普通消息的发送的代码比较简单,如下所示:
public static void main(String[] args) throws MQClientException, InterruptedException {
DefaultMQProducer producer = new DefaultMQProducer("test_group_producer");
producer.setNamesrvAddr("127.0.0.1:9876");
producer.start();
Message msg =
new Message("Test_Topic", "test_tag", ("Hello World").getBytes(RemotingHelper.DEFAULT_CHARSET));
SendResult sendResult = producer.send(msg);
System.out.printf("%s%n", sendResult);
producer.shutdown();
}
其内部核心代码为:
private SendResult sendDefaultImpl(Message msg, final CommunicationMode communicationMode, final SendCallback sendCallback, final long timeout
在我的 Google Summer of Code Project 期间,我创建了全新的 Folder Auth 插件,可轻松管理 Folders plugin 对文件夹中组织的项目的权限。这个新插件旨在通过易于管理的角色进行快速权限检查。该插件的 1.0 版本刚刚发布,可以从您的 Jenkins 更新中心下载。
该插件的灵感来自角色策略插件,可改善性能并简化角色管理。开发该插件是为了解决 Role Strategy Plugin 在许多角色上的性能限制。同时,该插件通过文件夹解决了 Jenkins 中组织项目最受欢迎的方式之一。该插件还具有一个新的 UI ,将来会有更多改进。
该插件支持三种类型的角色,分别适用于 Jenkins 中的不同位置。
全局角色:适用于 Jenkins 的所有地方
代理角色:限制连接到您的实例的多个代理的权限
文件夹角色:适用于文件夹内组织的多个作业
角色策略插件的性能改进 与角色策略插件不同,此插件不使用正则表达式来查找匹配的项目和代理,从而改善了我们的性能并简化了管理员的工作。为了减少需要管理的角色数量,通过文件夹角色授予文件夹的权限将继承其所有子项。这对于通过单个角色访问多个项目很有用。同样,一个代理角色可以应用于多个代理,并分配给多个用户。
此插件的设计目的是在权限检查方面优于角色策略插件。这些改进是使用我在 GSOC 项目的第一阶段创建的micro-benchmark framework来衡量的。两个插件相同配置的基准测试表明,与角色策略 2.13 中的全局角色相比, 500 个全局角色的权限检查速度提高了 934 倍,角色策略 2.13 本身包含一些性能改进。将文件夹角色与角色策略的项目角色进行比较,对于 250 个组织在 150 个用户的实例上的两级深层文件夹中的项目,对作业的访问权限检查几乎快了 15 倍。您可以在 此处 看到基准和结果比较。
Jenkins 配置作为代码支持 该插件支持 Jenkins 的“代码即配置”功能,因此您无需通过 Web UI 即可配置权限。YAML 配置如下所示:
jenkins:
authorizationStrategy:
folderBased:
globalRoles:
给定一个单链表,查找链表中倒数第n个节点。
示例:
给定一个链表:1->2->3->4->5,和 n=2
穷举遍历(两次遍历) 先遍历一遍链表,确定链表中节点的个数l。然后再遍历一遍链表,从前往后第(l-n+1)个节点就是倒数第n个节点。
public ListNode nthToLast(ListNode head,int n){ ListNode first = head; int length = 0; while(first != null){ length++; first = first.next; } first = head; for(int i = 0; i < length-n+1; i++){ first = first.next; } return first; } 双指针(一次遍历) 设置两个指针,第一个指针从头结点向前走到第n-1个节点时,第二个指针开始从头结点出发。当第一个指针走到尾结点时,第二个指针的位置即为倒数第n个节点。
public ListNode nthToLast(ListNode head,int n){ ListNode first = head; ListNode second = head; for(int i = 0; i <= n-1; i++){ //第一个指针开始遍历,保证输入的n值小于链表的长度 first = first.
Spring Data JPA 与 MyBatis 的一些心得 引言 之前一直使用 MyBatis ,习惯了自己写增删改查的 SQL 。在入职新公司后,公司是用的是 Spring Data JPA ,半年过去了,由于公司本身是互联网行业,开发和迭代快速,比较深刻的体会到了 Spring Data JPA 和 MyBatis 的优缺点。
先下结语,互联网行业,开发和迭代快速,如果没有 Spring Data JPA / Hibernate 的大牛,或者技术文档没有维护的想法,不建议使用 Spring Data JPA ,哪怕 Spring Data JPA 具有初始的开发速度优势。
Spring Data JPA 与 MyBatis 由于 Spring Data JPA 默认使用 Hibernate 作为 ORM 实现,Spring Data JPA 与 MyBatis 对比,其实也就是 Hibernate 与 MyBatis 的对比。
Spring Data JPA 与 MyBatis 的查询构建
Spring Data JPA 中,如果一个 DAO 查询类继承了 JpaRepository,即
今天使用NetBeans导入一个新的项目,显示去缺失了一些包,所以写一下如何添加包,
缺失包会在这前面有一个小红叉。现在引入缺失的包。
点击项目名前面的加号,打开项目,里面会有一个‘’库‘’的文件夹,右键属性,会有添加jar包的选项,可以自行添加包
while(True): cv2.imshow('img2',img2) cv2.imshow('img5',img5) if cv2.waitKey(5) & 0xff == ord('q'): break cv2.destroyAllWindows() 其中img2,img5是两个要查看的图片