在Unity项目的测试交付阶段,有时会碰到以下几个问题:
1 项目现场的测试人员说了一些bug情况,我会需要得到日志的信息支持从而处理,output_log.txt发过来之后,看到的却是只有初始化的一些业务日志。测试人员会告诉我:“哦!我发你之前又重启了一次程序”...output_log.txt每次程序重启都会清空重写。
2 于是我让他再触发一次bug,然后立即给当前的log文件,费了些时间,总算是复现了bug,日志给发过来了。仔细研读日志,定位到了一个函数或是语句,但是崩溃的是,这个函数可能被N个其他函数调用,而那些触发路线我没有埋日志输出,无法判断到底是从哪里进来的。
3 接着我就会埋下更多的print或debug.log,然后build一个程序发过去,让他再试。幸运的是,这下找到了问题并且解决。时间一天天过去,测试人员也回来了。我们促膝长谈,他突然提到:“哦,对了,我大前天上午大概11点半,在驻场测试的时候有触发一个bug,但是后来一直都触发不了,我知道你要output_log,我当天就启动了一次程序所以文件给你带来了”,然后我无语的是,这个文件我根本不知道哪一条语句是哪个时间点的,也没有发现error类的日志输出,所以...感谢他的敬业...
所以我所遇见过的需求,大致整理就是:
1 历史日志要能保存,不应被刷新
2 日志应该反应出其打印语句所在函数是从哪里进来的
3 日志应该要有时间戳
因此,我就用了DebugConsole.cs,关于它,可以参考:http://wiki.unity3d.com/index.php/DebugConsole,它的本有的功能就不多赘述了,我主要就是用DebugConsole.instance.Log.
主要看下面的两个地方,一个是Log函数修改,一个是新增了写文件:
public static void Log(object message) { //调用堆栈的帧,堆栈跟踪 StackTrace trace = new StackTrace(true); StackFrame sf = trace.GetFrame(1); //获取是哪个类来调用的 string className = sf.GetMethod().DeclaringType.ToString().Split('+')[0]; //获取是类中的那个方法调用的 string[] method = sf.GetMethod().ToString().Split(' '); string methodName = method[method.Length - 1].Split('(')[0] + "(" + sf.GetFileLineNumber() + ")";//.PadRight(15); //得到log内容 string logContent = "[" + System.DateTime.Now.ToString("yy/MM/dd HH:mm:ss:fff") + "] [" + className + "
背景 k8s中大多使用nginx-ingress-controller来实现ingress, 但是脆弱的nginx-controller通过ingress解析出nginx配置, 对于某些annotation会reload nignx配置失败, 然后controller就卡死了, 不断重启, 除非删除对应的ingress.
问题复现 创建有问题的ingress
apiVersion: extensions/v1beta1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/auth-tls-pass-certificate-to-upstream: "false" nginx.ingress.kubernetes.io/auth-tls-verify-client: optional nginx.ingress.kubernetes.io/auth-tls-verify-depth: "1" nginx.ingress.kubernetes.io/configuration-snippet: | proxy_set_header Host $targethost; proxy_buffering off; proxy_pass http://$targetbackend; proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; proxy_redirect off; proxy_set_header X-SSL-Client-Verify $ssl_client_verify; proxy_set_header X-SSL-Client-DN $ssl_client_s_dn; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; creationTimestamp: "2020-03-23T04:57:22Z" generation: 1 name: example-ingress namespace: kube-system resourceVersion: "57681168" selfLink: /apis/extensions/v1beta1/namespaces/kube-system/ingresses/example-ingress uid: c7f66385-6cc2-11ea-b6a8-246e96d4b538 spec: rules: - host: example.
前端直播功能开发总结 最近公司要开发一个直播功能,自己也是研究了很久,这里总结一下:
这里直播还是用的第三方的集成:视频用的是七牛云的集成,聊天用的是融云。
一、直播功能(七牛云)
下面是直播的快速入门文档:
https://developer.qiniu.com/pili/manual/1221/the-console-quick-start
这里前端功能没什么可说的,文档中都写的很详细。
我这里用的前端播放器是videojs,引入相关的js和css,只需要简单的设置就可以:
var myPlayer = videojs('demo-video',{
bigPlayButton : true,
textTrackDisplay : true,
posterImage: true,
errorDisplay : true,
controlBar : true
},()=>{
})
二、聊天室功能(融云)
融云这个就比较坑了,文档和demo对于web开发者很不友好,开发的时候很多接口还有问题。下面是心得:
聊天室对于pc端应当有两个界面,用户客户端观看界面和超级管理员的管理界面
客户端观看界面:
1 先引入相关文件
融云的服务器相关js:
<script src="http://cdn.ronghub.com/RongIMLib-2.3.2.js"></script>
chatroom web相关js文件---下载地址:
http://downloads.rongcloud.cn/chatroom-1.0.0.zip
需要用到其中的 message-types.js 文件
2 链接融云服务器
这时候就需要后台的小伙伴协助,通过server 获取 token,详见 https://www.rongcloud.cn/docs/web.html#get_token
以及在融云上注册得到的 appkey,如下:
appInfo:{
appKey : "8tnym1br624m7",
token : "ZThhLI1Xa1BX5EMREAdArWSH6ouuI8NT/fNmMkzF+4IOKIoFvbsi6JnH8QmnSltLkCcsK8vOgKl3IZgfbxFiWg=="
},
通过此次进入的直播间的 房间号或者id 请求后台接口获得该融云聊天室的信息:
chatRoomInfo:{
"chatRoomId" : "chartroom-008",
"count" : 0
写到文件 (取运行目录 () + “\1.txt”, 编码_Ansi到Utf8 (#常量1)) 直接用这个命令,保存出来打开文件就是utf-8的编码了
常用命令 1.插入与查询
1.1 插入文档的语法格式:
db.集合名称.insert({JSON格式的数据})
db.bl_comment.insert({ commentContent: '我是内容', commentUser: NumberInt(12345), commentBlog: '123213141321', commentGoods: NumberInt(0), createTime: '20200410' }) 创建一个集合,相当于关系型数据中的表,并初始化每个字段对应的值,表名为:bl_comment
1.2 查询集合的语法格式:
db.集合名称.find()
1.3 查询commentContent是'我是内容'的数据
db.集合名称.find({commentContent: ‘我是内容’})
如果需要查询 _id 的值的话需要用 ObjectId(查询条件) 包起来才可以.
1.4 只查询一条
db.bl_comment.findOne({createTime: '2020-04-10'})
1.5 返回指定条数的记录
db.集合名称.find().limit(3)
2 修改与删除文档 修改文档的语法结构:
Db.集合名称.update(条件,修改后的数据)
如果我们想修改_id为1的记录,名称为张三,输入以下语句:
Db.集合名称.update({_Id:ObjectId(1)}, {name:’张三’})
执行后,我们会发现,这条文档除了name字段其它字段都不见了,为了解决这个问题,
我们需要使用修改器$set来实现,命令如下:
Db.集合名称.update({_Id:1}, {$set:{name:’张三’}})
删除文档的语法结构:
Db.集合名称.remove(条件)
以下语句可以将数据全部删除,请慎用
Db.集合名称.remove({})
3 统计条数 统计记录条件使用count()方法
Db.集合名称.count()
Db.集合名称.count(条件) 4 模糊查询 MongoDB的模糊查询是通过正则表达式的方式实现的。格式为:
/字符串/
比如标题中包含java的帖子
Db.集合名称.find(title:/java/)
比如查询以“张”开头的名字
Db.集合名称.find(name: /^张/)
5 大于 小于 不等于 包含 不包含 大于:$gt,小于$lt,大于等于$gte,小于等于$lte,不等于$ne,包含$in,不包含$nin
常规的表格是这样的 … 客户的需求是这样的 … 一些固定项目自动带出,可修改;想在哪项下面加一行就在哪里加一行,想删除哪行就删除哪行。就要竖着的表格,不要横着的。如下图:
例如:在身高那一行下方想加一个 胸围 100cm ,就点击“在下方添加行” 于是在下方出现一行空行
实现过程 一、纵向表格部分 java后端——备好数据的过程 注意事项 以上前端代码主体是谁?假设是 form (springMVC中的modelAttribute) table里所展示主体是谁?假设是 data form 和 data 什么关系? 一个form 对应 多个data (所以把多个data对象放进集合再把一个集合放进form对象中) 1. data对象 @Data //用了Lombok public class Data { private String name; private String content; //有参构造 public PrintData(String name, String content) { super(); this.name = name; this.content = content; } //无参构造方法 public PrintData() { super(); } } 2. form主体对象 @Data //用了Lombok public class Form { private .
过程纹理也称为自定义纹理,根据计算得出。
这个例子使用了位置和原点的距离作为输入参数,并加入了动画,但是和目前的纹理没任何关系。纯手工计算。
因为位置是三维的,所以在涉及到纹理的几个地方都要改为三维的
struct RENDEROBJECT_D3DVERTEX
{
//顶点位置
D3DXVECTOR3 Position;
//纹理坐标
float u, v,w; };
//以新的方式创建顶点流
D3DVERTEXELEMENT9 decl[] =
{
{ 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 },
{ 0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 },
D3DDECL_END()
};
shader中。
struct VS_INPUT
{
float4 Position : POSITION; float3 TextureUV : TEXCOORD0; };
struct VS_OUTPUT
{
float4 Position : POSITION; float3 TextureUV : TEXCOORD0; };
顶点着色器中
VS_OUTPUT RenderSceneVS( VS_INPUT In )
{
喜欢的话请关注我们的微信公众号~《你好世界炼丹师》。
公众号主要讲统计学,数据科学,机器学习,深度学习,以及一些参加Kaggle竞赛的经验。公众号内容建议作为课后的一些相关知识的补充,饭后甜点。此外,为了不过多打扰,公众号每周推送一次,每次4~6篇精选文章。 微信搜索公众号:你好世界炼丹师。期待您的关注。
站主近期建立了一个自己的网站来发博文,文章已经搬运到了下面的地址:
通俗讲:自然语言处理(NLP)入门之信息抽取(Information Extraction)
微信小程序自定义switch中带文字效果
最近在玩小程序,需要一个switch组件中带文字的效果,找了很久没找到,终于在github中发现了所需要的组件。
链接: https://github.com/TalkingData/iview-weapp.
这套UI库中的switch有所需效果,如下图所示:
Spring refresh方法详解 一. refresh() 方法预览二. refresh() 方法中调用的每个方法1. this.prepareRefresh() 激活开启容器2. this.obtainFreshBeanFactory() 获取 bean 工厂3. this.prepareBeanFactory(beanFactory) 对获取到的 beanFactory 做预处理设置4. this.postProcessBeanFactory(beanFactory); beanFactory准备工作完成后进行的后置处理工作5. this.invokeBeanFactoryPostProcessors(beanFactory) 执行 beanFactory 后置处理器的方法6. this.registerBeanPostProcessors(beanFactory) 注册 bean 的后置处理器7. this.initMessageSource() 初始化 MessageSource 组件8. this.initApplicationEventMulticaster() 初始化事件派发器,多播器9. this.onRefresh() 用来初始化子容器中的bean,默认是空方法10. this.registerListeners() 注册监听器11. this.finishBeanFactoryInitialization(beanFactory) 初始化所有剩下的单实例 bean12. this.finishRefresh() 完成ben的创建初始化工作,完成 IOC 容器的创建 三. 总结 一. refresh() 方法预览 Spring 容器启动时会创建IOC容器,在创建容器时,会调用 refresh()方法,整个容器就是通过该方法,完成所有的 bean 的创建以及初始化
二. refresh() 方法中调用的每个方法 1. this.prepareRefresh() 激活开启容器 protected void prepareRefresh() { //记录时间 this.startupDate = System.currentTimeMillis(); //设置当前容器未关闭 this.
//在代码中,遇到需要单独提取对象的key值时 //可使用 Object.keys(object) object是你需要操作的对象 //Object.keys()会返回一个存储对象中所有key值的数组 //获取当前对象每个key对应的值使用 object[key] //例子 var map = {}; map[1] = 1; map[2] = 2; console.log(map[1]);//结果是 1 console.log(map[2]);//结果是 2 //遍历map for(var prop in map){ if(map.hasOwnProperty(prop)){ console.log('key is ' + prop +' and value is' + map[prop]); } }
最新更新:不用alert弹窗了,改用jQuery的$.confirm
1、thymeleaf取controller返回的model中的值,2、JavaScript取取controller返回的model中的值, 3、以及thymeleaf整合JavaScript取controller返回的model中的值。
(仅适合低端玩家,譬如我这种)
在搞毕业设计的过程中,我一个做后端的,被逼无奈整前端,过程中遇到了一点坑,顺手发个文章也能帮助他人。
thymeleaf取值 @RequestMapping("/test1") @Controller public String test1( Model model){ model.addAttribute("test","TEST**TEST**TEST"); return "hello"; } <h1>hello word!You success!</h1> <h1 th:text="${test}">hello word!You success!</h1> JavaScript取值 主要是将值传给hidden隐藏域
@RequestMapping("/test2") @Controller public String test2( Model model){ model.addAttribute("msg","TEST**TEST**TEST"); return "hello"; } <input type="hidden" id="msg" th:value="${msg}" > <script type="text/javascript" th:inline="javascript"> onload=function(){ var msg = $("#msg").val(); if(msg){ $.confirm({ title: '消息提示', content: msg, buttons: { confirm: { text: '确认', action: function(){ // $.alert('确认的!'); // 这里是确认按钮点击后的操作 } } } }); } }; </script> thymeleaf整合JavaScript取值 thymeleaf在3版本中加入了JavaScript的内联,使得用户可以使用JavaScript通过thymeleaf直接取返回值。
tree数据结构递归添加属性 function addAttr(data){
for (var j = 0; j < data.length; j++) {
data[j].title = data[j].name //添加title属性
data[j].key = data[j].code //添加key属性
if (data[j].children.length > 0) {
addAttr(data[j].children)
}
}
return data
}
1. 场景
最近有一位小姐姐向我抱怨,说她家宝宝最近要打预防针,受疫情影响,市区定点的社康医院太少,导致预约号基本靠抢,根本是一号难求
每次预约都要一直守在手机旁,不停地刷新页面去抢号,太耽误功夫了,问我有没有办法帮到她?
我分析了一下,功能入口是在微信服务号内部,如果使用 自动化 去抢号,效率会很低,抢号成功率会大减。
因此,我决定花 10 分钟,用 Python 写一段爬虫!
2. 实现步骤 首先,我们在手机端配置手动代理,打开 Charles 或 FD,打开手机的放号界面,进行一次抓包操作
分析界面发出的请求及响应数据,右键复制 cURL 到剪切板
然后,使用下面这个网址将 cURL 转为一段完整的 Python 请求代码,包含:请求头、Cookies 等
https://curl.trillworks.com/
接着,将代码复制到 Pycharm 中,根据第一步抓包获取的数据结构,遍历数据,找出有余号、并且最近的社康医院
result = json.loads(response.text) ym_datas = result.get('data').get('list') foo = False # 遍历每一个社康 for ym_item in ym_datas: # 地址 address = ym_item.get('outpAddress') # 社康名字 ym_name = ym_item.get('outpName') # 状态,是否有号 status = ym_item.get('status') if status == '1' and ym_name in choices: foo = True break else: pass 最后,一旦发现有指定的社康医院有号放出,立马发出一个 警告语音提醒
1,模块依赖解决方式不同
es6 module与commonjs最本质的区别是两者对模块依赖的解决方式,es6 module是静态的而commonjs是动态的,es6在编译阶段既确定了模块依赖关系及模块导入导出的变量,而commonjs只有在运行阶段才能确定这些。
2,变量导出方式不同
在导入一个模块变量的时候es6 module导出的是变量的动态映射,既在当前模块改变变量会影响导出模块变量,在导出模块改变变量也会影响导入模块变量,因为两者指向的是同一个引用变量,而对commonjs模块变量来说在任一模块改变变量都不影响另一模块,因为引入模块仅仅是对导出模块变量的浅拷贝。
otsu(大津法二值化),Kitttle算法相关实现 图像二值化二值化(Thresholding)大津二值化算法(Otsu's Method)Kittle算法图像梯度 图像二值化 二值化(Thresholding) 二值化是将图像使用黑和白两种值表示的方法,就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。
(其中0是黑,255是白)。
#include <opencv2/core.hpp> #include <opencv2/highgui.hpp> #include <iostream> int main(int argc, const char* argv[]){ cv::Mat img = cv::imread("imagepath", cv::IMREAD_COLOR); int height = img.rows; int width = img.cols; int th = 128;//阈值,Threshold value cv::Mat out = cv::Mat::zeros(height, width, CV_8UC1); //灰度化 for (int j=0; j<height; j++){ for (int i=0; i<width; i++){ uchar val = (int)((float)img.at<cv::Vec3b>(j,i)[0] * 0.0722 + \ (float)img.at<cv::Vec3b>(j,i)[1] * 0.7152 + \ (float)img.at<cv::Vec3b>(j,i)[2] * 0.
业务需求 在评论输入框粘贴图片后实现图片自动上传
实现思路 用富文本编辑器实现监听输入框的粘贴事件 考虑到项目其他地方没有富文本的需求,引入富文本增大代码大小,因此选择js方法paste粘贴事件
paste事件 paste: 在 发生 粘贴 操作 时 触发
绑定的元素不一定是input,普通的div也是可以绑定的,如果是给document绑定了,就相当于全局了,任何时候的粘贴操作都会触发
事件对象 操作的数据放在clipboardData对象中的,在ie中这个对象通过window.clipboardData来访问,在其它浏览器中则通过事件处理函数的参数来访问。
获取事件对象: handlePaste(event) { var clipboardData = event.clipboardData || window.clipboardData } 粘贴事件提供了一个clipboardData的属性,如果该属性有items属性,那么就可以查看items中是否有图片类型的数据了。
clipboardData介绍 介绍一下clipboardData对象,它实际上是一个DataTransfer类型的对象,DataTransfer 是拖动产生的一个对象,但实际上粘贴事件也是它。
clipboardData的属性介绍:
属性类型说明dropEffectString默认是 noneeffectAllowedString默认是 uninitializedfilesFileList粘贴操作为空ListitemsDataTransferItemList剪切板中的各项数据typesArray剪切板中的数据类型 items介绍 items是一个DataTransferItemList对象,自然里面都是DataTransferItem类型的数据了。
属性 items的DataTransferItem有两个属性kind和type:
属性说明kind一般为string或者filetype具体的数据类型,例如具体是哪种类型字符串或者哪种类型的文件,即MIME-Type 方法 方法参数说明getAsFile空如果kind是file,可以用该方法获取到文件getAsString回调函数如果kind是string,可以用该方法获取到字符串,字符串需要用回调函数得到,回调函数的第一个参数就是剪切板中的字符串 types介绍 types常见的值:text/plain, text/html, files
值说明text/plain普通字符串text/html带有样式的htmlfiles文件(例如剪切板中的数据) Demo methods: { // 粘贴监听图片上传 handlePaste (event) { // console.log(event) var clipboardData = event.clipboardData || window.clipboardData console.log(clipboardData) // 查看clipboardData const items = clipboardData.items const types = clipboardData.
本文主要介绍 CUHK 的 mmdetection 代码库 (https://github.com/open-mmlab/mmdetection)中关于 anchor 的设置的一些 tips。以下提到的所有 anchor 尺寸均为对应到输入图像上的bounding box 尺寸。 mmdetection 代码库总体框架还比较清晰,对于大部分经典的检测算法都有实现。大部分的接口参数都可以通过修改配置接口文件实现,配置文件在 ~/mmdetection/tree/master/configs/ 文件夹中。
一般来说,利用开源的检测代码库做自己的任务,一个肯定要考虑修改的地方便是 anchor 机制。因为自己检测任务中的目标的尺寸和高宽比和开源模型中的目标可能会不一致。
已 mmdetection 的 faster_rcnn_r50_fpn_1x.py 文件为例。本配置主要是算法是 Faster-RCNN + RPN,目标任务是 COCO 物体检测。输入尺寸为 800 * 1333 左右,利用 FPN 在 5 个尺寸的 featuremap 上进行 anchor 设置。最小的 anchor 基准面积为 32 * 32,最大的基准面积为 512 * 512 (高宽比不同,面积相同)。
而如果自己准备输入的图像尺寸为 512 * 512,而且目标相对较小,比如面积在 16*16~32*32之间,那么anchor 设置就不能用默认的了。那么怎么在 mmdetection 代码库中根据自己的任务来设置 anchor 参数呢?
首先关注以下几个参数:
配置文件中的关键字段 其实,这里面有一个隐含参数没有显示出来就是:
anchor_base_sizes : 见~/mmdet/models/anchor_heads/anchor_head.py ;这个参数物理含义是base anchor 的高和宽。与 anchor_scales 共同决定了基准 anchor 的尺寸。为什么在这里没有显示呢?因为在代码中,anchor_base_sizes 被设置为与 anchor_strides 相同。
Qt中设置控件背景图防止平铺 错误设置背景图正确设置背景图思考 错误设置背景图 我在最近项目里面设置QMdiArea控件背景图时,想要将背景图设置为单个不重复平铺的状态;一顿操作后,代码和效果如下
QPixmap bgPix(":/images/logo.png");
mdiArea->setBackground(QBrush(bgPix));
真的是一顿操作猛如虎,结果得分0:5。
正确设置背景图 1.先设置背景为NoBrush;
2.然后用setStyleSheet设置样式表;
代码如下:
mdiArea->setBackground(QBrush(Qt::NoBrush));
mdiArea->setStyleSheet(“QMdiArea{”
" background-image: url(:/images/logo.png);"
" background-repeat: no-repeat;"
" background-position: center;"
" background-color: rgba(0, 0, 0, 0);"
" }");
其中,background-repeat是设置图片的重复类型,有inherit, no-repeat, repeat, repeat-x, repeat-y;
background-position:center设置图片居中;
background-color: rgba(0,0,0,0)设置背景透明;
将图片抠图之后,显示会好看很多,并且只有一个图,不会平铺整个背景。
思考 Qt中设置背景图,如果不设置为NoBrush或拉伸图片,那么就会平铺整个背景。
我想Brush本来就有铺满的意思,所以一般是设置背景颜色。
1.Linux之Mac安装Homebrew 执行以下命令,即可安装brew:
LEIMINs-MacBook-Air:~ leimin$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 2.Linux之Mac安装wget brew 安装完成,然后安装wget:
brew install wget 3.Linux之Mac安装yum // 下载解压 wget http://yum.baseurl.org/download/3.2/yum-3.2.28.tar.gz tar xvf yum-3.2.28.tar.gz // 安装 cd yum-3.2.28 sudo apt install yum // 更新版本 yum check-update yum update yum clean all
藏建招〔2019〕36号
关于调整2016西藏自治区建设工程费用定额中税金的通知
各市(地)住房和城乡建设局,各有关单位:
根据《财政部 税务总局 海关总署关于深化增值税改革有关政策的公告》(财政部 税务总局 海关总署公告2019年第39号)要求,现对《2016西藏自治区建设工程费用定额》和《2016西藏自治区建设工程预算定额》中一般计税方式和简易计税方式的税金进行调整,并就有关事项通知如下:
一、凡在西藏自治区行政区域内执行《2016西藏自治区建设工程费用定额》,一般计税方法的增值税税率由10%调整为9%。
二、凡在西藏自治区行政区域内执行《2016西藏自治区建设工程预算定额》采用简易计税方式的项目,需要按照下列给定税率计算含税价:
(一)、材料的进项税率:煤炭、液化气、农产品等税率为9%;商品砼、砖、瓦、砂、石、自来水及用量较小的辅助材料税率为3%;废旧物资为2%;水泥、金属、油漆、橡胶制品等其他材料税率均为13%;
(二)、机械费组成中税率见下表:
(三)简易计税方式的增值税税率为3%不变。
三、本通知自2019年4月1日(含4月1日)起执行。已按10%增值税税率计算并形成合同价的在建项目,结算时2019年4月1日前已完成工程量的造价,按10%增值税税率计算。2019年4月1日后(含4月1日)完成的工程量的造价,一般计税方式和简易计税方式均按本通知规定执行。
联系人及电话:张欢喜,0891-6833276
西藏自治区住房和城乡建设厅
2019年3月27日
DI 注入 一. 传统的注入方式通过bean标签方式注入通过包扫描的方式注入 二. 注解方式配置注入@Configuration 与 @Bean 注解方式注入@ComponentScan 包扫描方式注入@Import 注入FactoryBean 方式注入 三. 获取容器中的实例scopt 单例与多例取值,与创建实例的时间针对单例 四. @Conditional() 根据条件向容器中注入实例五. 总结 一. 传统的注入方式 通过bean标签方式注入 例如配置数据库连接的DruidDataSource,设置数据库连接,登入数据库的用户名密码,然后注入到Spring容器中,在.xml配置文件中通过bean标签的形式,注入
获取测试(注意点ClassPathXmlApplicationContext获取时默认获取resources下的直接文件,若文件在resources文件夹中的文件夹中需要通过""classpath:resources文件夹下的文件夹"来指定) public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext ("classpath:spring/applicationContext-mybatis.xml"); DruidDataSource dataSource = (DruidDataSource) context.getBean("dataSource"); System.out.println(dataSource.getUrl()); } 通过包扫描的方式注入 在使用Spring时都用过@Controller,@Service等,将Controller层,Service层注入到Spring容器中,在使这些注解时,前提是通过xml配置开启包扫描,扫描哪些包下的类使用了这些注解来修饰,如果有则将扫描到的注入到Spring容器中
配置扫描与排除 <!--扫描位置,扫描com.test包中所有的--> <context:component-scan base-package="com.test" > <!--排除掉注解, 为Controller类型的--> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component-scan> 原理: 会向容器中注入一个实现了BeanDefinitionParser接口的注解解析器例如ComponentScanBeanDefinitionParser,通过该类中的parse()方法,解析base-package属性配置的扫描路径,进行扫描,进行创建,初始化,注入等 二. 注解方式配置注入 @Configuration 与 @Bean 注解方式注入 创建配置类,该类使用@Configuration修饰,
配置类中创建方法,方法被@Bean注解修饰,(如果@Bean修饰的方法有形参,形参默认在容器中获取并赋值)
方法有返回值,返回的数据就是注入到Spring容器中的数据
通过注解的方式配置数据库连接 import com.
引言 本文将系统的讲下 Xshell 连接 Ubuntu 流程,和二个常见问题。
用到的软件:Ubuntu18.04.1、Xshell6、Xftp6。. Xshell 是一个强大的安全终端模拟软件,可以进行远程登录,它支持 SSH1, SSH2, 以及 Microsoft Windows 平台的 TELNET 协议。
Xftp 是一个基于 MS windows 平台的功能强大的 SFTP、FTP 文件传输软件。
xshell通过ip连接,然后利用xftp在两机间进行文件传输。
我们会发现在Linux虚拟机上下载一些东西很不方便。
我使用XShell的主要目的是在Windows环境下登录Linux终端,传输一些大文件到Linux环境上去。
它可以传输到你的Linux上的任意文件夹,前提是你是以root用户进行连接。以后,我们也可以通过这种方式把本机与远端服务器(阿里云)相连。
连接的基本流程: 1、 开启openssh-server 要在Ubuntu主机开启SSH服务,需要开启openssh-server
命令:
1、执行下句,下载SSH服务
sudo apt-get install openssh-server
2、执行下句,验证下载后是否已经开启了服务:
ps -e | grep ssh
如果只有ssh-agent表示还没启动。
3、执行下句,开启服务
/etc/init.d/ssh start
如果显示sshd则说明已启动成功。
从上图可以看出,我已经提前安装过了openssh-server,并且开启了服务。
2、 查看Ubuntu IP 命令:ifconfig -a
3、 Xshell6连接 文件–>>新建(会话)–>>(连接)填写–>>确定
主机(H)为上图 Ubuntu IP
双击刚刚创建的session linux图标,进行连接。
连接成功后的状态:
4、 Xftp6传输: 连接成功后点击下面图标。
后,在左右锁定要传输的文件和传输到那个文件夹。
解决两个常见问题 好的,整个流程已经讲完。但,往往事情不尽人意。现在,再来总结下大家可能会遇到的问题。一是:一直连不上;二是:root连接拒绝密码。好吧,现在我们来具体看一下。
文章目录 1. SQL1.1. 初始化操作1.2. 数据定义语言DDL(==Data Definition Language==)1.3. 数据操纵语言DML(==Data Manipulation Language==)1.4. 数据查询语言DQL(==Data Query Language==)1.5. 数据控制语言DCL(==Data Control Language==) 2. HQL2.1. 数据定义语言DDL2.2. 数据操纵语言DML2.3. 数据查询语言DQL2.4. 桶表的相关案例2.5. Hive 的集合类型2.6. Hive 严格模式2.7. [Hive参数配置方式](https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties)2.8. [Hive 函数](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF)2.9. [hive面试套路 - 累计报表](https://blog.csdn.net/u012808902/article/details/77874722) 3. FLINK-SQL3.1. [Flink最锋利的武器:Flink SQL入门和实战 ](https://blog.csdn.net/u013411339/article/details/93267838?depth_1-utm_source=distribute.pc_relevant_right.none-task-blog-OPENSEARCH-1&utm_source=distribute.pc_relevant_right.none-task-blog-OPENSEARCH-1)3.2. [Flink1.10集成Hive快速入门](https://mp.weixin.qq.com/s/EQIDS-DEmo4Ld-N4s1W_Iw) 4. 微语:你的每个点赞,我都认真当成了喜欢 1. SQL 1.1. 初始化操作 链接数据库mysql -h 192.168.1.30 -P 3306 -uroot -p123456退出数据库exit/quit/ctrl+d显示时间select now();显示数据库的版本select version(); 1.2. 数据定义语言DDL(Data Definition Language) 关键词: create alter drop truncate(删除当前表再新建一个一模一样的表结构)创建数据库create database hadoop-01 charset=utf8; # 注意有特殊字符时,用tab键上面的字符引起来查看所有的数据库/表show databases/tables查看创建数据库的语句show create database db_test;\G格式化,在终端可以直接拷贝出sql语句查看当前使用的数据库select database();使用数据库use db_test;删除数据库drop database db_test;创建表 格式 auto_increment表示自动增长not null 表示不能为空primary key 表示主键default 默认值create table 数据表名字 (字段 类型 约束[, 字段 类型 约束]); 实例 create table xxxxx(id int, name varchar(30));
Vuex及其五个属性的作用 Vuex 是什么?
Vuex 是一个专为 Vue.js 应用程序开发的状态管理构架。它采用统一式存储管理和维护所有组件的可变化的状态。
什么是状态管理模式?
状态管理包括三个部分:
State
驱动应用的数据源。
View
以声明的方式将State映射到视图上。
Action
响应在View上,用户号输入导致的状态变化(主要用于操作异步)。
下面是一个单向数据流的示意图:
单向数据流遇到多个组件共享状态,单向数据流的简洁性很容易被破坏:
多个视图依赖于同一状态
传参对于多层嵌套会变得非常麻烦,而且对于兄弟组件的状态传递失效。
各个视图的行为需要改变同一状态
我们经常会采用父子组件直接引用或者通过事件进行变更状态,进行多次拷贝,有几率导致代码无法维护。
所以,我们把组件的共享状态提出来,用一个全局单例管理所有状态;无论哪个组件都能够直接获取状态。通过强制规则维持视图和状态间的独立性,我们的代码将会变得更结构化且易维护。
什么情况下我们应使用Vuex?
当你的项目足够简单,不推荐使用Vuex,如果,你需要开发一个中大型项目,那你就可以使用Vuex,在组件外管理状态。
Vuex的五个属性
state, getters, mutations, actions, modules。
state:
vuex的基本数据,用来存储变量。
getter:
从基本数据(state)派生的数据,相当于store的计算属性;getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算。
mutation:
提交更新数据的方法,必须是同步的(如果需要异步使用action)。每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler)。
回调函数就是我们实际进行状态更改的地方,并且它会接受 state 作为第一个参数,提交载荷作为第二个参数。
action:
和mutation的功能大致相同,不同之处在于:
① Action 提交的是 mutation,而不是直接变更状态;
② Action 可以包含任意异步操作。
modules:
模块化vuex,可以让每一个模块拥有自己的state、mutation、action、getters,使得结构非常清晰,管理更为方便。
注意:
使用下面这两种方法存储数据:
dispatch:异步操作,写法: this.$store.dispatch(‘mutations方法名’,值)
commit:同步操作,写法:this.$store.commit(‘mutations方法名’,值)
如需更加详细请进入Vuex官网进行学习:Vuex官网
(操作过程幸得朋友相助,但我还是决定用写博客的方式把操作成功的过程写下来,以免以后再出现相关问题可以翻看自己的博客知快速获取解决办法,也能帮助到一些遇到类似状况的朋友。鄙人电脑小白,初入江湖,涉世未深,该文较适用于初学电脑的人)
以Word 2010为例,下图为异常状况下图标
首先, 找到office的安装目录(可以在此电脑搜索栏当中检索)
里面有个WINWORD.EXE, 右击文件->发送到->桌面快捷方式(即创建快捷方式)
然后打开开始菜单下面的Microsoft,右击Word->更多->打开文件所在位置
将文件夹里面的Word 2010删除(删除之前的快捷方式); 将上一步发送到桌面的快捷方式移动(直接拖动)到该目录, 然后重命名为Word 2010
最后在桌面快捷创建一个Word文档,图标即可恢复正常状态
这是恢复以后的模样。
不管你是 Python 新手还是老鸟,肯定纠结过一个问题:到底用什么编辑器写 Python 代码好?
为此,我们调查了数十位鹅厂程序猿们爱用的 Python IDE,从他们对每款编辑器的看法中,也许能给你一点启示:
以上来源知乎: 腾讯技术工程 https://www.zhihu.com/question/27359349/answer/966051726
个人认为:使用什么IDE,在于你喜欢用什么,习惯用什么,你是用来做什么,或是你工作中,项目组都统一用那个IDE。
下面我们分别来看看
1、喜欢什么? 比如说,你喜欢使用Notebook,这不能说有大佬推荐你使用pycharm,你就马上放弃Notebook,或者今天突然 vs code这个IDE火起来来,你就立马转战vscode
剥开IDE的功能说,你真的喜欢用吗,你用的习惯吗,每个IDE都有自身的优点,使用什么IDE关键在自己,即便是你觉得自己使用的IDE现在好像真没其它的好,你也不用放弃原来的,可以先下载试试,也可以多个IDE结合使用,什么?电脑太卡不够,9102年都过了,你还没有准备换一个性能好一点的?不换就不行换吧,反正我的也卡。
2、用来做什么 这是一个关键,你比如说,你做的是数据科学方面的工作,那么你可以使用
Notebook
浏览器界面形式,支持代码分段运行,还可以图片嵌入显示,你可以将代码转文本,实时的做笔记,这个笔记不是使用注释能够比的,反正我觉得挺好用的。
spyder
左边是代码区,右边跑 ipython 终端, 可以开启多个终端. 右边的 ipython 终端窗口也可以内嵌显示图片,也可以运行代码小片段,我一开始使用的就是这个IDE,用起来还可以,现在用的比较少了。
如果你做用用python做web开发,我强烈推荐。
pycharm
这个IDE的集成度是真的很高,什么virtualenv,Docker,Vagrant轻松,Git集成 ,插件和集成终端以进行版本控制。
在您编码时向您显示PEP-8建议调试功能(这个我比较喜欢,用起来很香),但是这个真的是占内存(我说的是运行内存),集成一键创建 web项目,dajngo,flask等,支持你电脑上的各种文件格式,当然,什么音乐,视频是不支持的。
有个有社区版和专业版,社区版很多功能都是受到限制的,你可以找找破解版的。
下面两个IDE只做介绍,我也不是很清楚合适做什么,用的少,没有发言权。
vs code
这个我用的不多,但是却是很多大佬都有推荐,首先配置是比较麻烦,配置python还是比较简单,配置C++我是现在都没有配置还(个人比较懒),无赖,现在还只是用来学C++,编译都在终端进行。
自定义配置 集成git
智能提示强大 (大部分IDE都有)
支持各种文件格式(html/jade/css/less/sass/xml)
调试功能强大
各种方便的快捷键
强大的插件扩展(这个是真的香)
体量小,这个也很香
vim
如果你不知道vim那么可能到现在为止你还没有接触过Linux系统,使用vim做为IDE,我是没这个胆了,顶多写写简单的代码,用来写大量代码,我怕我死在在上面,享年18。
也就是说这是大佬专享。
3、项目中大家用什么 比如:公司让大家统一使用A这个IDE,你偏要去使用 B这个编译器,啥都不说,兄弟我敬你是条汉子,江湖再见。
python官网自带的IDE
差点把这个给忘了,你用过吗,香不香?
我相信很多人都用过这个IDE,就是只有一个白色界面的那个。
咋说呢,入门的时候使使就好。
文源网络,仅供学习之用,如有侵权,联系删除。
我将优质的技术文章和经验总结都汇集在了我的公众号【Python圈子】里。
在学习Python的道路上肯定会遇见困难,别慌,我这里有一套学习资料,包含40+本电子书,600+个教学视频,涉及Python基础、爬虫、框架、数据分析、机器学习等,不怕你学不会!还有学习交流群,一起学习进步~
题目链接
大意:
晚上有n个亮着的灯泡,标号从1到n。
现在存在2种操作,如下:
操作1,关掉标号 [l,r] 区间的灯操作2,打开标号 [l,r] 区间的灯 下面有q次询问,每次询问执行其中一种操作,询问格式,l,r,k。k为执行操作种类。对于每次询问回答当前开着的灯的数量。
第一行包含一个整数n,第二行一个整数q(1≤n≤10^9,1≤q≤3·10^5) 因为n范围过大,如果用静态开点需要离散化,但是离散化之后就无法根据离散化后的点得到区间长度 ,还需要再开数据记录,有点麻烦,所以这题我们用动态开点,不需要的点不开辟空间就好。
动态开点需要用l,r数组记录当前点的左右子节点,而不能再用rt<<1和rt<<1|1来表示了。
用数组记录左右子节点,如果左右子节点还没有出现过,给它赋值为cnt++(cnt用于给所有出现的节点编号,这样出现了多少点,就开辟了多少空间)
这题是区间更新,代码:
#include <bits/stdc++.h> using namespace std; const int maxn=3e5+10; struct vain { int l,r,sum,lazy; } tree[maxn*50]; int cnt=1; void pushdown(int l,int r,int k) { int mid=(l+r)>>1; if (l!=r) { if (!tree[k].l) tree[k].l=++cnt; if (!tree[k].r) tree[k].r=++cnt; //下传判断儿子是否存在,不存在,便增加节点 tree[tree[k].l].sum=(mid-l+1)*tree[k].lazy; tree[tree[k].r].sum=(r-mid)*tree[k].lazy; tree[tree[k].l].lazy=tree[k].lazy; tree[tree[k].r].lazy=tree[k].lazy; } tree[k].lazy=-1; } void update(int l,int r,int &k,int L,int R,int p) { if (!k) { k=++cnt;//遇到开过的点就不开,没开过开新的节点 tree[k].
Redis Mass Insertion Sometimes Redis instances need to be loaded with a big amount of preexisting or user generated data in a short amount of time, so that millions of keys will be created as fast as possible.
This is called a mass insertion, and the goal of this document is to provide information about how to feed Redis with data as fast as possible.
Use the protocol, Luke Using a normal Redis client to perform mass insertion is not a good idea for a few reasons: the naive approach of sending one command after the other is slow because you have to pay for the round trip time for every command.
在做人物跳跃功能的时候发现官方的方法在视觉效果上很差,其他一些方案比如加刚体等等都效果不好,于是自己写了一个模拟力作用的跳跃算法。
首先定义了5个全局变量来完成跳跃算法的实现
public float jumpSpeed = 2;//跳跃速度 public float gravity = 2;//模拟重力 public bool isJump = false;//是否在跳跃 public float jumpTime= 0.5f;//跳跃时间 public float jumpTimeFlag = 0;//累计跳跃时间用来判断是否结束跳跃 在Update()方法中实现在按下相应按键的时候改变人物状态
if(Input.GetKey(KeyCode.W)&& Input.GetKeyDown(KeyCode.Space)&& !isJump) { isJump = true; playState = PlayState.Jump; characterController.Move(transform.forward * speed*Time.deltaTime); } else if (Input.GetKey(KeyCode.W)) { isMoving = true; playState = PlayState.Moving; characterController.Move(transform.forward * speed * Time.deltaTime); } else if (Input.GetKeyDown(KeyCode.Space)&&!isJump) { isJump = true; playState = PlayState.Jump; }else { playState = PlayState.
一、前言 在完成了搭建环境与编译烧录后,接下来需要了解一下3.0版本的程序架构。
二、本文参考资料 1.esp8266_nonos_3.0版本的API使用文档.pdf(乐鑫官方文档)
2.https://www.bilibili.com/video/BV1dJ411S723?p=12(技小新8266教程)
三、正文部分 3.1 程序架构 ESP8266的SDK编程是基于“内核回调”的方式
user_main.c 文件中:
void user_init(void) //8266内核为用户提供的初始化接口:用户的【应用功能初始化】入口 { 初始化...; //IO口、定时器、设置中断... } 用户看不见,不能修改
{ 内核初始化... user_init(); //执行 用户的【应用功能初始化】 while(1) //类似主循环 { 执行内核功能... 执行用户功能... //比如:用户初始化中设置了1s定时,那么在这里将会进行定时器计时 } } 回调函数 //当满足某条件时,内核调用这些回调函数
void xxx_cb(void) { LED闪烁... } 任务函数 //如果安排了任务,在系统空闲时,内核会调用任务函数
void xxx_Task(void) { ... } 中断函数 //当触发中断时,进入中断函数
void xxx_IRQHandler(void) { ... } 以下是官方文档的介绍
Non-OS SDK 为用户提供了一套应用程序编程接口 (API),能够实现 ESP8266 的核心功能,例如数据接收/发送、 TCP/IP 功能、硬件接口功能,以及基本的系统管理理功能等。用户不必关心底层网络,如 Wi-Fi、 TCP/IP 等的具体实现,只需要专注于物联网上层应用的开发,利用相应接口实现各种功能即可。
ESP8266 物联网平台的所有⽹网络功能均在库中实现,对用户不不透明。用户应用的初始化功能可以在 user_main.c 中实现。
包 包:其实在JAVA当中就是一系列的文件夹而已
com.entity.xxx 规范:包名必须小写 且包名与包名之间用.来分隔
包到底有什么用?最要的用法就是用于分类我的代码
Java类:主类/测试类 实体类 工具类...
service 存放业务代码
entity 存放实体类代码
util 存放工具类代码
权限 公共 public 保护 protected 默认 啥也不写 私有 private public protected 默认 private
本类中 √ √ √ √
本包中 √ √ √
其他包中继承 √ √
其他包中 √ public 只要是在当前项目中 都可以访问
private 只能在本类中访问
默认 只能在本包中访问(无论继承)
protected 本包中可以访问(无论继承);其他包中只能继承访问
YOLO v2 详解 一、Tricks(一)Batch Norm(二)使用高分辨率图像微调分类模型(三)采用先验框(Anchor Boxes)(四)聚类提取先验框尺度(五)约束预测边框的位置(六)passthrough 层检测细粒度特征(七)多尺度图像训练(八)高分辨率图像的对象检测(九)Darknet-19 二、训练过程三、损失函数四、YOLO9000(一)WordTree(二)构建 WordTree(三)类别标签构造(四)标签结果分析(五)联合训练 YOLO9000: Better, Faster, Stronger 论文链接
YOLO v2 相对于 YOLO v1 主要就是通过一系列的 tricks 对模型进行优化。所以在本篇中我们会逐个介绍这些 tricks,以及这些 tricks 所带来的提升。在论文的最后,作者提出了 YOLO9000,它可以支持实时运行同时检测 9000 多个物体。
一、Tricks 下图就是 YOLO v2 在 YOLO v1 上做的改进。其中行代表所有的 tricks,列代表当前使用的 tricks(使用的话打上对号)。我们可以看出,经过一系列的 tricks,最终 YOLO v2 在 VOC2007 数据集上能达到 78.6。
图 1:各个 tricks 以及它们在 VOC2007 数据集上的检测效果
(一)Batch Norm 批归一化使 mAP 有 2.4 的提升。
批归一化有助于解决反向传播过程中的梯度消失和梯度爆炸问题,降低对一些超参数(比如学习率、网络参数的大小范围、激活函数的选择)的敏感性,并且每个 batch 分别进行归一化的时候,起到了一定的正则化效果(YOLO2 不再使用 dropout),从而能够获得更好的收敛速度和收敛效果。
通常,一次训练会输入一批样本(batch)进入神经网络。批规一化在神经网络的每一层,在网络(线性变换)输出后和激活函数(非线性变换)之前增加一个批归一化层(BN),BN 层进行如下变换:
(1)对该批样本的各特征量(对于中间层来说,就是每一个神经元)分别进行归一化处理,分别使每个特征的数据分布变换为均值 0,方差 1。从而使得每一批训练样本在每一层都有类似的分布。这一变换不需要引入额外的参数。
(2)对上一步的输出再做一次线性变换,假设上一步的输出为 Z,则 Z1 = γZ + β。这里 γ、β 是可以训练的参数。增加这一变换是因为上一步骤中强制改变了特征数据的分布,可能影响了原有数据的信息表达能力。增加的线性变换使其有机会恢复其原本的信息。
学更好的别人,
做更好的自己。
——《微卡智享》
本文长度为4829字,预计阅读9分钟
OpenCV DNN人脸检测
使用OpenCV进行人脸检测我写过两篇文章《C++ OpenCV之级联分类器--人脸检测》和《Android NDK OpenCV级联方式实时进行人脸检测》,不过这两篇里面用到的检测方式都是HAAR级联检测器,现在OpenCV4里面官方支持的人脸检测方法也已经是基于深度学习的方法进行检测了,所以我们这篇主要就是看OpenCV下用DNN进行人脸检测。
DNN人脸检测
微卡智享
实现DNN的人脸检测,需要先下载模型文件,在OpenCV的\sources\samples\dnn\face_detector目录下,有一个download_weights.py脚本文件,可以通过Pycharm执行下就可以自动下载两种模型:
01
Caffe模型
res10_300x300_ssd_iter_140000_fp16.caffemodel deploy.prototxt 直接的下载地址为:
https://raw.githubusercontent.com/opencv/opencv_3rdparty/dnn_samples_face_detector_20180205_fp16/res10_300x300_ssd_iter_140000_fp16.caffemodel 02
tensorflow模型
opencv_face_detector_uint8.pb opencv_face_detector.pbtxt 直接的下载地址为:
https://raw.githubusercontent.com/opencv/opencv_3rdparty/dnn_samples_face_detector_20180220_uint8/opencv_face_detector_uint8.pb Tips
由于我个人不用Python,所以模型我是自己下载的,这里我也只用了tensorflow的方式,所以就只下了后面的opencv_face_detector_uint8.pb
DNN的核心函数
微卡智享
#核心函数
1readNetFromTensorflow2blobFromImage
3setInput4
forward
01
readNetFrom
根据我们用的模型不同改为不同的函数,后面的参数就是加载模型文件
//Tensorflow cv::dnn::readNetFromTensorflow(_modelbinary, _modeldesc) //Caffe cv::dnn::readNetFromCaffe(_modelbinary, _modeldesc) 02
blobFromImage
Mat cv::dnn::blobFromImage( InputArray image, //输入图像 double scalefactor = 1.0, //图像缩放的比率 const Size & size = Size(), //返回的Mat中数据的尺寸 const Scalar & mean = Scalar(), //关于mean参数,如果之前没有深入研究过深度学习,这个还是不太好理解的。首先给出mean的数值:(104 117 123);数字从什么地方来的呢?这个是在Net训练的时候设定的,可以看到在训练的时候transform_param中设置了mean bool swapRB = false, //是否交换R和B分量 bool crop = false, //裁剪标志,指示是否在调整大小后裁剪图像 int ddepth = CV_32F //图像的数据类型,目前仅支持32F和8U ) 03
**
数学建模_1:家政服务(1) **
最近在备战数学建模国赛,然后也有一些题目练手,为了督促自己学习,就在博客上不定时更新一下自己练习的题目,用的软件是Python以及Lingo,lingo的官方教程我已经上传到了资源里,只要3个积分,大家自取吧。
问题背景及要求:
1.1 问题背景
某一家政服务公司(甲)专门向雇主提供护理,保姆等M项服务。根据估计,某城市下一年中第i项(i=1,2…,M)家政服务在春、夏、秋、冬四个季度的需求分别是:di1人日,di2人日,di3人日,di4人日,且假设公司的每位员工每季度工作65天。若假设提供第i项(i=1,2…,M)家政服务的员工是直接从该公司而不是从雇主那里得到Ci元/月的报酬(说明:雇主先支付报酬给公司,由公司扣除1%比例的中介费后再支付给员工,即公司主要靠收取中介费盈利,但不是全部。员工的工资Ci与中介费已经无关了。)。春季开始时,甲公司有i种(i=1,2…,M)员工Si名,且在每个季度结束后,第i种员工将有一定比例(设为ri (0,1))的人数将会自动离职。试考虑如下三种情况的最优招聘计划。即考虑在满足市场需求的条件下使得公司的利润最大(即公司的工资支出最少,或公司的待业员工人数最少)。
1.2 问题要求
(1)如果甲公司不允许主动解除员工,请你为公司制定下一年每种员工的最优招聘计划(每年只招聘一次);分析哪些季度需求的增加不会影响招聘计划?可以增加多少?
(2)如果甲公司不允许主动解除员工,且每个季度进行一次招聘,请你为公司制定最优的招聘计划。
(3)如果甲公司针对第i种(i=1,2…,M)员工在每个季度结束后允许解雇一定比例(设为ki)的员工,清为公司制定下一年度的最优招聘计划?(假设k1=k2=…kM=0.02)
因为篇幅的问题,其他的我就不写了,我只把问题的分析以及建模过程稍微写一下,我会将完整的题目以及我和队友建好的模型上传到资源里。
第一问:
问题一的分析
题目要求,在满足市场需求以及公司要求的前提下,为公司制定最优的招聘计划,使得公司的工资支出最少。因此我们建立以公司所有项目年工资支出最少作为目标函数的数学优化模型。如果将招聘员工的数量约束为整数,则可能使新招聘的员工数量远远大于实际需要的数量,很难找合理的到整数解,因此我们将新招聘员工的数量约束为实数并对所得结果向上取整。
根据题意可知,第i项项目的每个员工每季度所得工资为3Ci元。为达到公司与雇主的“互利双赢”原则,则要使员工的数量最少并且每位员工的季度工作强度最高(即每个项目的每位员工每季度工作65天)。我们设第i项服务项目下一年春季初招聘员工xi名,每季度结束后第i种员工有ri比例自动离职,建立数学优化模型并利用LINGO软件进行求解求得最优的年招聘计划。而后我们进行灵敏度分析,求解出哪些季度需求的增加不会影响招聘计划以及允许增加的数量范围。
4.1.1模型的准备
假设第i项(i=1,2…,M)服务项目春夏秋冬四个季度的需求分别为di1人,di2人,di3人,di4人;设第i项服务项目下一年最优招聘人数人数为xi人/年;第一年春第i项项目有员工Si名;第i项服务项目员工工资为Ci元/月/人,则每季度员工工资为3Ci元/季度/人。
4.1.2 模型的建立
根据4.1.1的模型假设及题目中给定的表1、表2、表3中的数据,在公司不允许主动解雇员工的前提下,我们建立以公司M项项目总工资支出(Z)最少为目标函数,以员工工作日总量大于市场需求作为约束条件的数学优化模型,模型如下:
接下来我用lingo进行编程解答:
model: sets: project/1..18/: x ,c,s,r; season/1,2,3,4/; link(project,season):d ; m/1,2,3/ ; endsets data: d = 6300 7900 5600 9400 6100 7900 6100 9200 6600 7800 5900 9000 6400 7700 6300 9500 6600 7500 5400 9500 6200 7500 5700 9300 6100 8100 6100 9400 6000 7900 5900 9200 6500 7600 5500 9100 6000 7400 5600 9200 6500 7600 5500 9100 6500 8200 6200 9100 6000 8400 6000 9300 6400 7600 6200 9700 6600 7600 5400 9500 6400 7900 5900 9300 6200 7500 5500 9500 6100 8100 6100 9400 ; c = 2500 2800 2400 3000 3000 2900 2400 2500 2200 2800 2900 2900 2600 2600 2100 2900 2500 2200 ; s = 120 100 110 110 130 130 140 100 130 130 110 100 130 120 90 130 120 140 ; r = 0.
一、文件管理 1.1、Linux下的文件类型 ● - 普通文件
● d 目录文件directory
● b 块设备blocks
● c字符设备character
● |符号链接文件link
●p管道文件pipe
●s套接字文件socket
范例:
1 [root@centos7 ~]#ls -l /run/ 2 total 60 3 drwxr-xr-x. 2 root root 100 Mar 29 09:32 abrt 4 -rw-------. 1 root root 11 Mar 29 09:32 alsactl.pid 5 -rw-r--r--. 1 root root 5 Mar 29 09:32 atd.pid 6 -rw-r--r--. 1 root root 4 Mar 29 09:32 auditd.pid 7 prw-------. 1 root root 0 Mar 29 09:32 autofs.
Elasticsearch Painless获取当前时间 本文讨论下Elasticsearch如何获取当前时间,通常需要计算时间间隔时使用。日期处理Painless使用标准的Java库,主要类有:
java.timejava.time.chronojava.time.formatjava.time.temporaljava.time.zone 官方API地址为:https://www.elastic.co/guide/en/elasticsearch/painless/master/painless-api-reference-shared-org-elasticsearch-script.html#painless-api-reference-shared-JodaCompatibleZonedDateTime
1. Java 8 获取当前时间 我们首先介绍几种Java 8获取当前日期、时间方式。
1.1. 当前Date 使用java.time.LocalDate 获取当前系统日期:
LocalDate localDate = LocalDate.now(); 获取带时区的当前日期:
LocalDate localDate = LocalDate.now(ZoneId.of("GMT+02:30")); ZonedDateTime zbj = ZonedDateTime.now(ZoneId.of("Asia/Shanghai")); 当然也可以通过LocalDateTime获得LocalDate:
LocalDateTime localDateTime = LocalDateTime.now(); LocalDate localDate = localDateTime.toLocalDate(); 1.1. 当前Time 通过LocalTime类获取当前时间:
LocalTime localTime = LocalTime.now(); 指定时区获取:
LocalTime localTime = LocalTime.now(ZoneId.of("GMT+02:30")); ZonedDateTime zbj = ZonedDateTime.now(ZoneId.of("Asia/Shanghai")); 也可以通过LocalDateTime类获取LocalTime:
LocalDateTime localDateTime = LocalDateTime.now(); LocalTime localTime = localDateTime.toLocalTime(); 1.3. 当前Timestamp java.time.Instant 从epoch时间获取时间戳,即从1970-01-01T00:00:00Z开始计算毫秒正数值:
Instant instant = Instant.
在这里找到了方法
使用word自带的编辑器将文本转化为2010版本。先备份原文件,按Alt+F11(笔记本Fn+Alt+F11)打开VBA编辑器,然后按Ctrl+G弹出窗口,在窗口中复制以下代码:ActiveDocument.SetCompatibilityMode wdWord2010
按回车,保存(Ctrl+S)并退出编辑器,此时文档会变为兼容的2010版本,但公式不会变成图片。
作者:郭昊
链接:https://www.zhihu.com/question/51484213/answer/259094680
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
文章目录 1. Flink Yarn 模式高可用性配置(自己通过源码编译的Flink)2. Hive2.1. Hive简介2.2. Hive的数据存储2.3. [Hive基本架构](https://blog.csdn.net/u013595419/article/details/79632928)2.4. [Hive为什么要启用Metastore](https://blog.csdn.net/qq_35440040/article/details/82462269)2.5. [hive集群搭建](https://blog.csdn.net/yangang1223/article/details/80183038) 3. [Hive Integration](https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/dev/table/hive/)4. [Flink 1.10 SQL、HiveCatalog与事件时间整合示例](https://www.jianshu.com/p/fe49b8f25313)5. 寄语:当你遇到困难时,你会如何去面对, 这将会决定你的人生最终能够走多远! 1. Flink Yarn 模式高可用性配置(自己通过源码编译的Flink) 本次采用自编译(基于Flink-1.10,hadoop-2.9.2)搭建集群
flink-shaded-hadoop-2-uber官方链接
参考链接
Flink高可用集群搭建Flink JobManager HA高可用flink on yarn模式下两种提交job方式 启动集群时遇到的错误
错误一
java.lang.NoSuchMethodError: org.apache.commons.cli.Option.builder(Ljava/lang/String;)Lorg/apache/commons/cli/Option$Builder; at org.apache.flink.yarn.cli.FlinkYarnSessionCli.<init>(FlinkYarnSessionCli.java:197) at org.apache.flink.yarn.cli.FlinkYarnSessionCli.<init>(FlinkYarnSessionCli.java:173) at org.apache.flink.yarn.cli.FlinkYarnSessionCli.main(FlinkYarnSessionCli.java:836) 解决方案
在 flink-shaded-9.0/flink-shaded-hadoop-2-uber/pom.xml 中的 dependencyManagement 标签中添加如下依赖Apache Commons CLI » 1.4;重新编译mvn clean install -DskipTests -Drat.skip=true -Pvendor-repos -Dhadoop.version=2.9.2;最后再重新编译flink源码mvn clean package -T 4 -Dfast -Drat.skip=true -Pinclude-hadoop -Dhadoop.version=2.9.2 -Dmaven.compile.fork=true -DskipTests -Dscala-2.11
错误二
.NET Reactor 简介 .NET Reactor 是针对.NET Framework编写的软件的功能强大的代码保护和软件许可系统,并支持生成.NET程序集的所有语言, .NET Reactor支持对C#、VB等语言生成的dll、exe等进行加固和混淆。
为什么要进行加固 wpf、winform等框架生成的执行文件是可以被ILSPY等软件反编译的,只要将exe文件拖到ILSPY,源码就会被暴露得干干净净。对于安全性要求比较高的公司来说,一般都会要求对exe、dll文件进行加密。
.NET Reactor 使用 点击打开,导入exe文件,按照下图勾选(注:不要点击混淆,混淆后会无法加载外部dll)
然后点击操作,保护,就能生成保护后的exe文件。
ILSPY 反编译测试
这里只介绍最基础的用法,高级的用法请到官网查询。
好久没有敲代码了,昨天拉了下之前的项目,然后各种各样的问题都出来了~~~,一脸懵逼。。。
关键是换了电脑后,没有装任何开发工具,其中影响深刻的本文下面提到的问题:
java.sql.SQLException: Connections could not be acquired from the underlying database! Caused by: com.jcraft.jsch.JSchException: invalid privatekey: [B@309286bd 使用Eclipse和IDEA都一样,找了好久,如上图要彻底解决,百度一大把,好多说是需要:
1.检查驱动配置,一般就看mysql版本需要差不多一致就行。
2.数据库连接地址有误 ur后面一般带上 ?3useUnicode=true&characterEncoding=utf8(jar包版本不同,加的也不一样)
3.检查账号或密码是否有误。
注:说实话,一般能想到的肯定会去检查这一块
其实重点是:invalid privatekey这个提示,意思是使用了高版本的openssh来生成公私钥,而项目中的jsch解析密钥时出错(低版本解析不了高版本),这里可能会有人想说:直接更换jsch为最新版本就行了,百度一大把54、55版的,你会发现导入项目后,还是不行,哈哈哈,我是踩过了。
解决方法:
去Linux服务器上生成公私钥(只要随便链接一台linux即可),查看openssh版本:openssl version 注:这里会有人疑问,为什么出来的是Libressl,这个你们可以自行查询,我理解的是:openssh不在必须依赖于openssl,而是openssl分支Libressl。
ssh-keygen -t rsa -C "你的邮箱" 最后将服务器生成的公私钥分别放入gitee(网页端可以直接添加)或服务器,私钥放入本地
最后在运行项目试试,反正我的是可以了,你的呢 ?
Mac终端启动本地服务有如下方式:
1.启动Mac自带Apache服务方式:
//启动服务apache服务器 sudo apachectl start //失败的话,重启服务 sudo apachectl restart 密码输入完成之后,会自动弹出localhost,出现it works! 或者在本地浏览器中输入127.0.0.1,这时表明服务器已经启动了。
如果自己想在这个基础上增加自己想要启动的服务,则:
打开Finder,前往文件夹:/资源库/WebServer,然后将自己的资源文件放入:Documents下,访问路径就是:localhost/文件名。
若手机要访问的话,直接将刚才路径下的本地地址换成网络分配的IP即可。
2.使用serve
首先需要安装,直接在终端运行即可:sudo npm i serve -g --save
完成后安装后,cd至你要访问的文件下(默认访问的是:index.html)。
最后输入:serve
如图表示已经启动,而且会自动带上端口(注:每次启动端口号不一样),其实原理都是使用了Mac自带的Apache服务。
资源转载:https://www.jianshu.com/p/24fe81ae6ebb 感谢!
口语中常用的连读总结 1.verb plua me1.gimme = give me2.lemme = sort of 2.what + is + word1.wassup = what is up2.whatser = what is her3.whatsis = what is his 3.word + have1.coulda = could have2.mighta = might have3.musta = must have4.shoulda = should have5.woulda = would have 4.word + to1.gonna = going to2.gotta = got to3.hafta = have to4.hasta = has to4.oughta = ought to1.wanna/wansta = want/wants to word + of1.sorta = sort of2.
转载自: http://www.yongfeiyan.cn/post/md/3
P@n 前 n 个结果的准确度, P指的是Precision. 如果用 y i = 0 , 1 y_i=0,1 yi=0,1分别表示第 i 个结果相关、不相关, 则
P @ n = 1 n ∑ i = 1 n y i P@n = \frac{1}{n} \sum_{i=1}^ny_i P@n=n1i=1∑nyi
在评测系统的 P@n 时, 对每个查询的结果计算P@n, 取这些值的平均值作为系统的P@n.
参考:
https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-39940-9_484 MAP Average Precision(AP): P@n的一个平均, 计算方式如下:
A P = 1 R ∑ r = 1 R P @ r AP = \frac{1}{R} \sum_{r=1}^RP@r AP=R1r=1∑RP@r
其中R是预定义的. 在评测系统的AP时, 对每个查询的结果计算AP, 取这些值的平均值作为系统的AP.
这篇是我学习时遇见的struct device内容的集合,记录着所学时对此结构体的理解,内容不完善,会不断更新
在学习Linux设备驱动时,经常遇见的是就是struct device结构体,他是保存设备基本信息的结构体。几乎在所有的驱动中都会遇见,意思就是他是驱动的设备结构体,所有的各种类型的结构体都继承他。在include/linux/device.h的723行有定义,其内容如下:
struct device { struct device *parent; struct device_private *p; struct kobject kobj; const char *init_name; /* initial name of the device */ const struct device_type *type; struct mutex mutex; /* mutex to synchronize calls to * its driver. */ struct bus_type *bus; /* type of bus device is on */ struct device_driver *driver; /* which driver has allocated this device */ void *platform_data; /* Platform specific data, device core doesn't touch it */ void *driver_data; /* Driver data, set and get with dev_set/get_drvdata */ struct dev_pm_info power; struct dev_pm_domain *pm_domain; #ifdef CONFIG_PINCTRL struct dev_pin_info *pins; #endif #ifdef CONFIG_NUMA int numa_node; /* NUMA node this device is close to */ #endif u64 *dma_mask; /* dma mask (if dma'able device) */ u64 coherent_dma_mask;/* Like dma_mask, but for alloc_coherent mappings as not all hardware supports 64 bit addresses for consistent allocations such descriptors.
记录一下,报错原因;之前也报这个错误,让我一顿好找,之前解决后,这个问题居然有出现了,让我感觉很熟悉的错误,但是一下有想不起来,然后仔细看了下报错信息:Caused by: java.lang.NoClassDefFoundError:
这个就很明确了,就是说有个类不能解析,也就是找不到;
就在Mapper.xml文件找了下,如果问题就处在这里,
这个如果是正确的按:Ctrl+鼠标左键就能进入该实体类;由于之前的数据库取字段名不是很规范,然后我就之间自动生成了xml文件,和实体类;之后将类名改了一下就忘记在xml文件里面改了;就导致了这个错误。这个坑希望能帮到一些人!
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'actPrizePoolServiceImpl': Unsatisfied dependency expressed through field 'baseMapper'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'actPrizePoolMapper' defined in file [E:\project\weixin-act-pageant\target\classes\com\zoomlgd\weixin\pageant\constraint\limiter\dao\ActPrizePoolMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.
YOLO v1 详解 一、网络详解(一)网络结构(二)输入(三)输出1. 7 x 7 部分2. 30 通道部分 二、网络训练(一)训练样本构造(二)损失函数(三)训练细节 三、网络预测 You Only Look Once: Unified, Real-Time Object Detection 论文链接
YOLO v1 是典型的 one-stage 的算法。相对于 Faster R-CNN,YOLO v1 不需要分别训练各个部分的网络,可以实现 end-to-end 的训练。YOLO v1 有着更高的检测速度,可以用于视频的检测。
图 1:Bounding Box 回归和最终类别的关系。
人类只用看一眼图片就能大体了解到在各个方位有哪些感兴趣的物体。而对比 Faster R-CNN,我们实际上看了 2 眼图片。那么有没有一种方法能让我们只看 1 眼,并且快速定位物体呢?YOLO v1 就是这样。YOLO v1 的核心思想是直接对 Bounding Box 进行回归然后进行类别的预测。 换句话说 Bounding Box 的回归和最终物体的类别是有很大的关系的。例如图一,我们只用看第一幅图,就能想到猫的耳朵和屁股的大致位置。
对于 Faster R-CNN,第一步我们要生成大量的 anchor,用于 RPN 网络判断 objectness 和边框的微调。那么既然最后会调整 anchor 的边界框,我们就没有必要生成那么多的 anchor,只生成大致的区域就行。类比 YOLO v1,我们在一开始生成少量的预测区域(在 YOLO v1 中没有 anchor)后直接对预测区域进行微调,并给出其对应的物体类别,就可以得到最终的输出结果。这样的方法,要比 Faster R-CNN 速度快很多。
阿里爸爸再次来给在家大学生送温暖了,只要符合资格的,千万别错过这波福利
这不是广告!这不是广告!
活动链接 高校学生“在家实践”计划
活动奖品 完成认证和测试后,免费领取6个月2核4G的ECS云服务器,到期30天内完成进阶测试再次免费续费6个月!!!
活动限制 需要大学生认证如账户下已存在ECS云服务器或者正在参与云翼计划的必须要等过期释放了才能参加!!! 活动规则 领取流程 点击START完成登录注册点击学生认证完成实名认证和学生认证点击完成测试进入答题答题合格后点击领取ECS学习资源就可以完成领取了 PS: ECS每天限量,每天更新时间是上午8点 ,
如果当日没有了可以完成测试后第二天准时蹲守
部分测试题参考答案 题目为随机出题,所以这里只是列举部分题的答案
计算机的软件系统可分为(D )
A. 程序和数据
B. 操作系统和语言处理系统
C. 程序、数据和文档
D. 系统软件和应用软件
阿里云云服务器ECS的英文全称是( A)
A. Elastic Compute Service
B. Elastic Compute Server
C. Elastic Container Service
D. Elastic Computer service
关系型数据库的发现,推动了数据分析的发展。关于关系型数据库的说法中错误的是__D_
A. 其重要特点之一就是能保持事务的一致性
B. 支持结构化查询语言SQL,使用方便,学习成本低
C. 对非结构化数据支持较差
D. 适用于海量数据的高效率读写
软件系统的可维护性评价指标不包括 (C )
A. 可理解性
B. 可测试性
C. 可扩展性
D. 可修改性
IaaS是(B )的缩写。
A. Platform as a service
Python格式化输出 练习题目: 给一个圆的半径,求圆的面积( surface area )和周长(circumference ),圆周率3.14
标准答案 f前缀输出 radius= int(input('the radius is ')) area = 3.14 * radius **2 print ('aera={area}' ) # 双目运算符 先幂后乘 circumference = 3.14 * 2 * radius print(f'circumference ={circumference}') >>>the radius is 2 >>>aera= 12.56 >>>circumference = 12.56 用format函数输出 pai=3.14 r = int(input('您输入的半径为:')) surface_area = 2*r circumference = pai*r*r print('圆的周长为{};圆的面积为{};'.format(surface_area, circumference)) >>>您输入的半径为:2 >>>圆的周长为4;圆的面积为12.56; 用百分号之float f输出 fyi: https://www.cnblogs.com/qinchao0317/p/10699717.html
pai = 3.14 r = int(input('请输入半径')) surface_area = 2 *r circumference = pai*r**2 print('圆的周长为%f,面积为%f'% (surface_area,circumference)) # print('圆的周长为 %d,面积为 %d'% (surface_area, circumference)) # 如果d是整形,输出就是错误的 >>>请输入半径2 >>>圆的周长为4.