【踩坑】aspose-words转换word至pdf表格变窄

问题: 在对aspose-words for java的使用中发现了一个问题 我使用的版本是19.1和19.10(若是有小伙伴需要jar包,可私信我发送) 个别表格转成PDF之后会变窄,但是在windows下用office转是没有问题的。 这个表格是用python docx生成的,也设置了列宽,但是转PDF之后,列宽设置失效。 生成的word随便修改点什么,再次转换就成功。 询问作者之后,这个确实是个BUG,之后若是解决,我会再次补上解决办法。 解决: 上述问题是因为表格可以自适应,因此生成word的时候,表格会变窄,这个确实是aspose-words的BUG,不过我们也可以避免这个问题. 去掉表格自适应 table.autofit = False doc = DocxTemplate(template_dir) sd = doc.new_subdoc() table = sd.add_table(rows= 4, cols=3, style='outertable') table.autofit = False

C#实现RESTFUL接口三板斧

C#实现Web格式的API有很多种方法,包括: 1、直接用webform窗体实现,这是需要把窗体上的除了第一行的代码全删了,主要靠Page_load中写代码,利用webform提供的server、page、上下文等对象解释参数,和返回数据。 2、还有一种不是webform窗体,可以调用 *.ashx (一般处理程序),它和aspx一样都实现了IHttpHandler接口。 3、还可以使用在aspx.cs中中声明带有[WebMehtod]的public static 的方法。 4、另外,.net还提供了web service框架、web api框架,但都太麻烦,需要生成一堆辅助类,我虽然大致明白是什么意思,但用起来太繁琐。 我最后采用了第3种方法。生成一个webform窗体,作为总入口,[WebMehtod]声明的方法似乎只支持json格式数据、post请求,当用get方法式会调用page_load,这时正好可以把API说明都放在页面里。另外为了避免特殊字符,建议用json序列化方法,这样单引号双引号等特殊字符都不用你处理了。为了方便json序列化,就需要客户端和服务端共享一些类说明。当然,你也可以直接拼接字符串,但json格式字符串容易把人搞晕。 web方法声明形如: [WebMethod(EnableSession = false)] public static string InsertColumn(string str参数1, string str参数2) { return “”; } javascript调用形如: $.ajax({ type: "POST", contentType: "application/json", url: "logview.aspx/InsertColumn", data: "{\"intID\":" + intErrorMaxID + "}", dataType: 'json', success: function (result) { if (result.d == "") return; var obj = JSON.parse(result.d); var BugListJson = obj.T1; ......... } } }); C#调用形如: WebClient wc; wc = new WebClient();

Python 天气 简单 数据分析及可视化

Python 天气情况数据分析及可视化 环境配置 Pycharm开发环境 python 版本 python3.7 Anconda 集成开发环境 第三方库导入 ## pip install 模块 清华大学镜像源 import requests from bs4 import BeautifulSoup import io import sys import pandas from matplotlib import pyplot as plt 步骤 1.爬虫requests 获取数据 2.pandas 处理数据 3.matplotlib 绘制图形 4.其他 保存数据进入csv格式,简单处理,例如雷达图 小案例 雷达图 #-*- codeing = utf-8 -*- #@Time : 2020/6/2 20:07 #@Author : dele #@File : demo.py #@Software: PyCharm # 雷达图 import pygal # pip install pygal 安装模块 rader_chart = pygal.

cannot create network xxx(br-xxx) conflicts with network yyy(br-yyy) networks have overlapping IPv4

执行 docker stack deploy -c docker-compose.yml stack-demo 时报错cannot create network xxx(br-xxx) conflicts with network yyy(br-yyy) networks have overlapping IPv4 具体报错信息 cannot create network aa90481a88226785be9da4cffdc97415051b2025dbe267f992422bc56efe7a1f (br-aa90481a8822): conflicts with network b811025ad90df8b5de6e551bec44ef795b95d75cbc17e0a8802f7cceac269f39 (br-b811025ad90d): networks have overlapping IPv4 表示将要创建的网络aa90481a8822 和 原有网络b811025ad90d 冲突。 排查 执行 docker network ls 查看docker网络 如果看到冲突网络id存在于docker网络列表中,可以通过移除冲突网络解决此问题: docker network rm b811025ad90d 如果冲突网络id不存在于docker网络列表,则继续: 执行 ip addr 查看服务器的网络配置,发现确实有相应id的网桥,而且是DOWN状态 删除掉网桥 brctl delbr br-b811025ad90d (如果没有brctl命令,通过 yum install -y bridge-utils 安装) 重启docker服务即可 systemctl restart docker reference:

关于IDEA 导入 gradle 项目堆内存溢出的解决方法(gradle VM options 配置)

Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded 2020-1.1及之前 2020-1.4见底部(所有的都可用底部) 公司项目用的是gradle,项目较大,当重新导入项目时发生了堆内存溢出 找了很长时间没找到解决办法; 之后看到了有关IDEA 导入 Maven 项目 Tomcat VM options 配置的文章 于是照猫画虎的配置了一下; 因为之前有报错说1024M 内存不够 所以将最大内存设置成了-Xmx2048m 需要设置多项时用空格 隔开 其余可以设置项: -Xms768m:设置JVM初始堆内存为768m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。 -Xmx768m:设置JVM最大堆内存为768m。 -Xss128k:设置每个线程的栈大小。JDK5.0以后每个线程栈大小为1M,之前每个线程栈大小为256K。应当根据应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。需要注意的是:当这个值被设置的较大(例如>2MB)时将会在很大程度上降低系统的性能。 -Xmn2g:设置年轻代大小为2G。在整个堆内存大小确定的情况下,增大年轻代将会减小年老代,反之亦然。此值关系到JVM垃圾回收,对系统性能影响较大,官方推荐配置为整个堆大小的3/8。 -XX:NewSize=1024m:设置年轻代初始值为1024M。 -XX:MaxNewSize=1024m:设置年轻代最大值为1024M。 -XX:PermSize=256m:设置持久代初始值为256M。 -XX:MaxPermSize=256m:设置持久代最大值为256M。 -XX:NewRatio=4:设置年轻代(包括1个Eden和2个Survivor区)与年老代的比值。表示年轻代比年老代为1:4。 -XX:SurvivorRatio=4:设置年轻代中Eden区与Survivor区的比值。表示2个Survivor区(JVM堆内存年轻代中默认有2个大小相等的Survivor区)与1个Eden区的比值为2:4,即1个Survivor区占整个年轻代大小的1/6。 -XX:MaxTenuringThreshold=7:表示一个对象如果在Survivor区(救助空间)移动了7次还没有被垃圾回收就进入年老代。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代,对于需要大量常驻内存的应用,这样做可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象在年轻代存活时间,增加对象在年轻代被垃圾回收的概率,减少Full GC的频率,这样做可以在某种程度上提高服务稳定性。 标准参数 所有JVM都必须支持这些参数的功能,而且向后兼容();例如: -client——设置JVM使用Client模式,特点是启动速度比较快,但运行时性能和内存管理效率不高,通常用于客户端应用程序或开发调试;在32位环境下直接运行Java程序默认启用该模式。 -server——设置JVM使Server模式,特点是启动速度比较慢,但运行时性能和内存管理效率很高,适用于生产环境。在具有64位能力的JDK环境下默认启用该模式。 非标准参数(-X),默认JVM实现这些参数的功能,但是并不保证所有JVM实现都满足,且不保证向后兼容; 非稳定参数(-XX),此类参数各个JVM实现会有所不同,将来可能会不被支持,需要慎重使用; 之后又找到一篇关于 VM options 配置的文章 -Xms2048m -Xmx2048m -XX:MaxMetaspaceSize=512m -XX:MetaspaceSize=512m -XX:InitialBootClassLoaderMetaspaceSize=64M -XX:NewRatio=2 -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=6 -XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=5 -XX:+CMSParallelRemarkEnabled -XX:+CMSClassUnloadingEnabled -Xss1024k -XX:+DisableExplicitGC -XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses -XX:ReservedCodeCacheSize=240m -XX:SoftRefLRUPolicyMSPerMB=50 -ea -Dsun.io.useCanonCaches=false -Djava.

LeetCode 例题精讲 | 16 最大子数组和:子数组类问题的动态规划技巧

来源:面向大象编程 本期例题: LeetCode 53. Maximum Subarray Sum 最大子数组和(Easy) LeetCode 718. Maximum Length of Repeated Subarray 最长公共子数组(Medium) 在前面的文章中,我们分别讲解了一维和二维动态规划问题的解题步骤与基本思路。不过,仅仅掌握基本步骤是不够的。要想熟练做出动态规划题目,还要掌握足够的解题技巧。 接下来的文章中,我会讲解动态规划问题中针对不同类型问题的小技巧。今天要讲的是关于「子数组」类题目的常见技巧。 在讲具体问题之前,我们要明确一下「子数组」和「子序列」的概念。 子序列 (subsequence) 可以是不连续的。例如 "ACD" 是 "ABCDE" 的子序列; 子数组 (subarray)、子串 (substring) 必须是连续的。例如 "BCD" 是 "ABCDE" 的子数组/子串。 我们前面的例题中讲过的最长公共子序列问题,关注的是「子序列」,而今天的文章我们要关注的都是「子数组」,请牢记这一点。 这篇文章的内容包括: 子数组类问题的动态规划技巧 「最大子数组和」问题的解法 「最长公共子数组」问题的解法 最大子数组和 LeetCode 53. Maximum Subarray Sum 最大子数组和(Easy) 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 子问题定义的错误尝试 拿到这道「最大子数组和」问题,如果直接把动态规划的解题四步骤往上套,那么你可能首先会想到这么定义子问题: 子问题 表示「nums[0..k) 中的最大子数组和」。 子问题定义的尝试 很不幸,这么定义子问题是行不通的。因为这么定义的话,我们无法写出子问题的递推关系! 我们用一个实际的例子 [-1, 2, 3, -2, 4, 1] ,看看每个子问题计算的结果:

我去,这么简单的三目运算符竟然也有这么多坑?|踩坑指南

每天早上七点三十,准时推送干货 今天是六一儿童节,各位大朋友们每天也要开开心心哦~ 最近,阿粉在一个业务改造中,使用三目运算符重构了业务代码,没想到测试的时候竟然发生 NPE 的问题。 重构代码非常简单,代码如下: // 方法返回参数类型为 Integer // private Integer code; SimpleObj simpleObj = new SimpleObj(); // 其他业务逻辑 if (simpleObj == null) { return -1; } else { return simpleObj.getCode(); } 这段 if 判断,阿粉看到的时候,感觉很是繁琐,于是使用三目运算符重构了一把,代码如下: // 方法返回参数类型为 Integer SimpleObj simpleObj = new SimpleObj(); // 其他业务逻辑 return simpleObj == null ? -1 : simpleObj.getCode(); 测试的时候,第四行代码抛出了空指针,这里代码很简单,显然只有 simpleObj#getCode才有可能发生 NPE 问题。 但是我明明为 simpleObj做过判空判断,simpleObj 对象肯定不是 null,那么只有 simpleObj#getCode 返回为 null。但是我的代码并没有对这个方法返回值做任何操作,为何会触发 NPE? 难道是又是自动拆箱导致的 NPE 问题?

graphviz安装与python中的调用(Windows版本)

graphviz安装与python调用 安装 Graphviz验证 graphviz 是否安装成功基本绘图入门 python 使用 graphviz 注: graphviz 包的安装问题 graphviz这个包,使用 pip install graphviz 安装后是不行的,这只安装了graphviz的pyhon调用接口,使用的话还需要下载graphviz的安装文件。 在决策树模型的部署中,使用sklearn库提供的现成方案是省事的方法,但为对其进行可视化操作,使用pydotplus-Graphviz库必不可少-如何正常使用该库给我造成了一些困扰。 目标是决策树模型的绘制,最终输出如图: 安装 Graphviz Graphviz 是一个开源工具,可以运行在类似于 UNIX® 的大多数平台和 Microsoft® Windows® 之上。适用于大多数平台的二进制文件可以在 Graphviz 主页 上找到。AIX 二进制文件可以在 perzl.org上找到。 下载地址: https://graphviz.gitlab.io/_pages/Download/Download_windows.html 由于上述网站为外网,访问下载需要较长时间,可以选择以下地址选择安装包下载 将graphviz安装目录下的bin文件夹添加到Path环境变量中 验证 graphviz 是否安装成功 进入windows命令行界面,输入 dot -version 然后按回车,如果显示graphviz的相关版本信息,则安装配置成功。 基本绘图入门 (一)、打开graphviz安装文件中,找到编辑器gvedit, 编写如下的dot脚本语言,保存成gv格式文本文件。然后进入命令行界面,使用dot命令,将gv文件转化为png图形文件。 dot D:\graphviz_file\graph1.gv -Tpng -o image.png (二)、可以不用命令,直接使用IDE带的功能导出图片 点击 File -> New . 进行编码后点击红色方框可以输出图片 digraph G{ size = "5, 5";//图片大小 main[shape=box];/*形状*/ main->parse; parse->execute; main->init[style = dotted];//虚线 main->cleanup; edge[color = green]; // 连接线的颜色 execute->{make_string; printf}//连接两个 init->make_string; main->printf[style=bold, label="

贪心算法求解最大安排相容活动个数,时间管理符合最优解求法

问题描述: 假设有n个活动的集合E={a1,a2,…,an},其每个活动都要求使用同一资源(如某个设备、教室、场地等),而在同一时间内只允许一个活动使用这一资源。 每个活动都有一个要求使用该资源的起止时间si,fi,且si<fi。如果选择了活动ai,则它在半开的时间区间[si,fi)内占有资源。两个活动ai,aj称为是相容的,当且仅当它们的时间区间[si,fi)和[sj,fj)不相交,即si>=fj 或 sj >=fi。现要求在所给定的活动集中选出最大的相容活动子集。(提示:贪心策略) 主函数已经给出, 请补充 Sort 和 Select 函数。 答案区只提交两个函数代码,不允许补充或修改其他代码! #define Maxn 100 //定义活动的类型 typedef struct act_Node { int Id; //活动ID int s_Time; //活动开始时间 int f_Time; //活动结束时间 } ACND; // ******** Sort 函数 ********** // ******** Select 函数 ********** int main() { ACND arr[Maxn]; int an,i; cin>>an; //读入活动个数 //读入各个活动的编号和占用资源的起止时间 for(i=0;i<an;i++) cin>>arr[i].Id>>arr[i].s_Time>>arr[i].f_Time; Sort(an,arr); Select(an,arr); return 0; } 输入,有多行,第1行是活动的个数n,后面n行,每行3个整数,是每个活动的编号、占用资源的开始时间、结束时间 输出,选出的最大活动子集,即有多行,每行包括活动的编号、开始时间、结束时间。 例如: 输入: 11 1 3 8 2 2 13

CentOS 7上安装MongoDB

博客项目使用数据库为mongodb,此章介绍在centos 7 上安装mongodb 安装 配置包管理系统yum 进入linux环境中输入 vim /etc/yum.repos.d/mongodb-org-4.2.repo 写入 [mongodb-org-4.2] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.2/x86_64/ gpgcheck=1 enabled=1 gpgkey=https://www.mongodb.org/static/pgp/server-4.2.asc 安装MongoDB yum install -y mongodb-org 或 yum install -y mongodb-org-4.2.6 mongodb-org-server-4.2.6 mongodb-org-shell-4.2.6 mongodb-org-mongos-4.2.6 mongodb-org-tools-4.2.6 文件夹路径 如果使用 yum 进行安装,则默认创建以下文件夹 /var/lib/mongo (the data directory) /var/log/mongodb (the log directory) 如果使用压缩包,也就是以下方式进行安装,则需要手动创建 data 和 log 文件夹 wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.0.tgz 启动,重启,关闭 开启服务 systemctl start mongod 关闭服务 systemctl stop mongod 重启服务 systemctl restart mongod 开机启动 systemctl enable mongod 移除MongoDB service mongod stopyum erase $(rpm -qa | grep mongodb-org)rm -r /var/log/mongodbrm -r /var/lib/mongo 安全策略 连接 mongo 或 mongo mongodb://localhost:27017 没有进行验证,任何人都可以连接到咱们数据库,进行一些操作,显然不安全

anaconda快速切换python环境

conda常用命令 # cmd查看 conda info -e # 创建环境 conda create -n python38 python=3.8 # 删除环境 conda remove -n python38 --all # 进入环境 activate python38 # 退出环境,关掉窗口也能自动退出 deactivate python38 # 管理python包 conda list # 在python环境里安装包 conda install -n python38 xx # 更新conda,慎重!新版本可能跟操作系统不兼容 conda update conda win10安装 官网下载傻瓜式安装,最后勾选添加到环境变量 centos安装 # 下载 wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2019.03-Linux-x86_64.sh # 安装,一路yes sh Anaconda3-2019.03-Linux-x86_64.sh # 最后一步问是否添加到环境变量一定要打个yes,不能直接回车。。。不然就看下一步手动添加环境变量 Python 3.6.0 :: Continuum Analytics, Inc. creating default environment... installation finished. Do you wish the installer to prepend the Anaconda3 install location to PATH in your /home/hanbairu/.

博客评论插件 Beaudar(表达)

很多人的博客都会有评论功能。对于大多数静态博客来说,评论是读者与博主建立联系的唯一桥梁。 被广泛使用的评论插件是 Disqus,遗憾国外 UCG (用户自产内容)基本上都被墙了,国内还没看到有与其同样优秀的。 我使用过 Wildfire 🔥,UI很不错,但是要用 Firebase ,在国内很不稳定,用了一段时间后发现使用 Github issue 的 Utterances 非常轻便快速,然后开始使用 Utterances。 当然类似的项目,国内有: GitalkVssueGitment(貌似已经不再维护) 除了以上提到的,国内被广泛使用的,还有 Valine,使用了 Gravatar 作为用户图像,评论只需要提供 Gravatar 账号设置的邮箱,非常方便。 但是还是觉得 utterances 的实现比较好,但是没有多语言是个缺陷。索性把它的源码拿来自己改成中文的了。 于是,就有了 Beaudar(表达)。 我使用的是“Issue 标题包含页面标题”的版本,另外还有五个模式任君选择。引用代码可以在线生成。也可以参考我下方给出的代码片段,在引用时,我增加了模式切换提示,及加载的状态。 完整的代码片段在 这里查看。 /** * 在 #beaudar 处,append 评论的 script */ function addBeaudar() { // 显示加载状态 var loading = document.getElementById('loading'); loading.style.display = 'flex'; var script = document.createElement('script'); var beaudar = document.getElementById('beaudar'); script.src = 'https://beaudar.lipk.org/client.js'; script.setAttribute('repo', 'zsdycs/lipk.org'); script.setAttribute('issue-term', 'title'); script.setAttribute('crossorigin', 'anonymous'); if (window.

gist.github无法访问解决方法及hosts文件格式变为.txt问题解决

1、gist.github无法访问 打开系统hosts文件,滑到最下方,回车另起一行添加以下两行内容: 192.30.253.118 gist.github.com 192.30.253.119 gist.github.com 保存后win系统打开cmd。尝试ping 192.30.253.118,如果能ping通,就可以正常访问了 hosts文件路径: win系统在c:/windows/system32/drivers/etc/hosts目录下 hosts文件打开修改方式: 右键-打开方式-记事本打开即可 或下一个Notepad++,右键-Edit with Notepad++ 2、hosts文件格式问题 系统中最原始的hosts文件应为无格式文件,即名称全称为hosts,若发现为hosts.txt等带有格式后缀的文件,则按上方步骤修改内部内容不会生效,原因可能是你在之前使用过加速器或者用第三方软件修改过hosts文件导致。 此时应在电脑桌面再新建一个txt文本文档,其中复制粘贴入以下原版内容(或复制hosts.txt错误格式文件中的内容)并保存,再手动在桌面删去后面的.txt使其变成无格式文件,然后拖动至etc文件夹中选择覆盖,最后删掉一切其他带格式的hosts文件。 注:为什么不直接删去原本的.txt后缀,是因为hosts文件并不是真的没有,而是好像以某种形式还存在,显示隐藏文件也看不见的那种,当修改后缀后,系统会默认问你是不是名称要修改为host(1)。不会让你直接覆盖的。所以要在桌面上先搞一个hosts文件,然后拖拽进来,才会提示是否覆盖,选择覆盖就会生效。 # Copyright (c) 1993-2009 Microsoft Corp. # # This is a sample HOSTS file used by Microsoft TCP/IP for Windows. # # This file contains the mappings of IP addresses to host names. Each # entry should be kept on an individual line. The IP address should # be placed in the first column followed by the corresponding host name.

kafka日志清理策略,compact和delete

文章目录 1. kafka日志清理策略概述2. kafka segment2.1 segmnet 的作用2.2 segment生成相关的配置 3. 日志清理delete策略3.1 delete 相关配置3.2 简单总结 4. 日志清理compact策略4.1 日志compact的使用场景4.2 compact的工作模式4.3 tombstone 消息4.4 低流量topic的注意事项4.5 简单总结compact的配置 5. kafka创建修改topic的命令5.1. 创建topic的时候指定配置5.2 topic创建时忘了设置,修改方式5.3 查看你的配置 1. kafka日志清理策略概述 kafka log的清理策略有两种:delete,compact,默认是delete 这个对应了kafka中每个topic对于record的管理模式 delete:一般是使用按照时间保留的策略,当不活跃的segment的时间戳是大于设置的时间的时候,当前segment就会被删除compact: 日志不会被删除,会被去重清理,这种模式要求每个record都必须有key,然后kafka会按照一定的时机清理segment中的key,对于同一个key只保留罪行的那个key.同样的,compact也只针对不活跃的segment 配置为 cleanup.policy: delete cleanup.policy: compact 如果没有特殊说明,本文中的配置均为kafka-1.1, 且为topic级别是设置 2. kafka segment 在学习日志清理策略之前,首先了解一下kafka是如何存储和管理日志的,因为他的管理都是基于segment的,所以有必要先了解清楚这个 segement的产生策略。 2.1 segmnet 的作用 kafka的日志存储和消费,对外的最小粒度是partion,也就是producer和consumer最小的选择粒度是某个topic的某些partition。每个partition又多个segment组成,这些segment一般是按照时间顺序产生的。在单个partition中只有一个处于active的segment,这个segment是正在写入的segment(假设为segmentA),当segmentA的大小达到一定的程度(或者是经过了一定的时长),就会产生一个新的segmentB,这个时候segmentA就不再有数据写入了,变成了不活跃的segment,而segmentB就是当前Active的segment.日志清理的策略总是针对不活跃的segment进行的。 2.2 segment生成相关的配置 segment.bytes: 每个segment的大小,达到这个大小会产生新的segment, 默认是1Gsegment.ms: 配置每隔n ms产生一个新的segment,默认是168h,也就是7天 这两个配置是同时起作用的,那个条件先满足都会执行产生新的segment的动作 在这里,我们就需要注意,需要理解这两个配置在日志的不同场景下可能带来的影响,在下面介绍具体的日志清理策略的时候会再回来看这一块儿。 3. 日志清理delete策略 3.1 delete 相关配置 假如对某个topic(假设为user_topic)设置了 cleanup.policy: delete 那么当前topic使用的log删除策略就是 delete,这个策略会周期性的检查partion中的不活跃的segment,根据配置采用两种方式删除一些旧的segment. retention.bytes: 总的segment的大小限制,达到这个限制后会删除旧的segment,默认值为-1,就是不会删除 retention.

spring源码:九大后置处理器

目的: spring在完成一个bean的初始化、实例化的过程中,会用到九个后置处理器;本文梳理出这九个后置处理器 九大后置处理器 spring在初始化的过程中,会在九个地方分别调用了五个后置处理的九个方法 第一次调用后置处理器org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#resolveBeforeInstantiation InstantiationAwareBeanPostProcessor --> postProcessBeforeInstantiation方法 InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation方法可以返回任何类型,如果返回的对象不为null,就调用beanPostProcessor的postProcessAfterInitialization方法;如果返回null,就正常的执行流程;该后置处理器 在spring AOP当中,spring如果判断当前类100%不需要进行增强,会把这个bean放到一个map中,并将value置为false,那么在后面进行增强的时候,会排除这个map中的bean 第二次调用后置处理器,该后置处理器推断使用哪个构造函数来初始化bean对象 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#determineConstructorsFromBeanPostProcessors InstantiationAwareBeanPostProcessor --> determineCandidateConstructors();推断使用哪个构造函数来初始化bean对象 在推断使用哪一个构造函数的时候,会首先判断当前构造函数是否有@Value和@Autowired注解,如果没有,那就校验当前构造方法对应的bean和传来的beanClass是否一样,如果是同一个,就把当前构造函数赋值给defaultConstructor 在第二次调用后置处理器的时候,会返回当前可用的构造函数,由此来决定,使用哪个构造函数来创建bean 都三次调用后置处理器 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyMergedBeanDefinitionPostProcessors 调用的是MergedBeanDefinitionPostProcessor --> postProcessMergedBeanDefinition 第三个后置处理器,是后面生命周期流程中的某些流程缓存一些meta信息 比如:在CommonAnnotationBeanPostProcessor和AutowiredAnnotationBeanPostProcessor的postProcessorMergedBeanDefinition的方法中,会调用finAutowiringMetadata和findResourceMetadata方法,将当前bean所依赖的bean(@Autowired和@Resource注解)存到一个map中,后面在进行属性注入的时候,会先从这个map中找当前bean依赖的bean有哪些,如果map中为空,就再查找要注入的属性有哪些 再比如:在CommonAnnotationBeanPostProcessor的这个方法中,将@PostConstrct和@PreDestroy注解对应的方法,缓存起来,在后面调用初始化的后置处理器的时候,先从这里存的map中找方法,找到,就直接执行即可 这些提前缓存的操作,都是在这个后置处理器完成的 第四次调用后置处理器 循环依赖 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#getEarlyBeanReference SmartInstantiationAwareBeanPostProcessor --> getEarlyBeanReference 第四个后置处理器(把创建的对象 放到earlySingletonObjects,解决循环依赖的),处理循环依赖问题会用到这个后置处理器 这里通过后置处理器,暴露出一个ObjectFactory(个人理解是一个bean工厂),可以完成bean的实例化等操作;这里的方法不会立即执行,只有执行到objectFactory.getObject()方法的时候,才会执行 第五次调用后置处理器 判断是否需要进行属性填充 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean–InstantiationAwareBeanPostProcessor–postProcessAfterInstantiation 调用的是InstantiationAwareBeanPostProcessor --> postProcessAfterInstantiation 第五个后置处理器(判断是否需要填充属性) 如果我们需要在程序中自己注入属性,可以利用这个点,在这里返回false,那么spring就不会调用下面这个后置处理器来注入属性 第六次调用后置处理器 进行属性注入 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean–InstantiationAwareBeanPostProcessor–postProcessPropertyValues 调用的是InstantiationAwareBeanPostProcessor --> postProcessPropertyValues 第六个(处理类的属性值) 主要是CommonAnnotationBeanPostProcessor(用来处理@Resource注解)和AutowiredAnnotationConigApplication(处理@Autowired和@Value注解);如果是自动注入(AutowireMode不为null),是无需通过后置处理器来进行属性注入的 第七次调用后置处理器 执行初始化方法 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInitialization 调用的是BeanPostProcessor --> postProcessBeforeInitialization bean初始化方法 CommonAnnotationBeanPostProcessor 继承了 InitDestroyAnnotationBeanPostProcessor,在该后置处理器处理的是@postconstruct注解 第八次调用后置处理器 springAop org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization 调用的是BeanPostProcessor --> postProcessAfterInitialization bean初始化之后执行的方法,典型应用:对aop进行处理,对目标类生成代理对象

pydotplus graphviz InvocationException GraphViz s executables not found(虚拟环境中)

开始时,是pydot报错, 解决办法是:Lib\site-packages\keras\utils\vis_utils.py 中的pydot,全部都改成pydotplus。 然后运行还是报错:“pydotplus.graphviz.InvocationException: GraphViz's executables not found”。 解决办法如下: 1、在anaconda环境下安装,按照如下命令安装: conda install pydotplus conda install graphviz 2、虽然安装了这两个安装包,但是运行的时候还是报同样的错误。原来只安装graphviz这个python包还不够,还得需要安装GraphViz’s executables。Graphviz不是一个python tool,它是一个独立的软件。可以按照如下方法安装。 先下载:由于我在官网上没找到那个安装包,这个是在别人的博客上看到的。可供参考 链接:https://pan.baidu.com/s/1lnBmQspuBqzYevtPr1xuTQ 提取码:ioxf 双击 graphviz-2.38.msi 安装 3、将bin目录,放到系统环境变量中(我的电脑---鼠标右键-----属性,就可以看见下图。然后点击高级系统设置,将 “C:\Program Files (x86)\graphviz-2.38\bin ”) 4、将 graphviz-2.38\bin 下的所有文件都放到所在 anaconda 的虚拟环境的 Library\bin 中(我的是放在“D:\anaconda3\envs\python36_1\Library\bin”) 最后成功,亲测可用!

三个表的全连接查询(多表联合查询):替代full join

(首先声明一下,本篇文章是要查询表的所有数据) 参考:https://blog.csdn.net/u012410733/article/details/63684663 在mysql中没有full join。我们可以使用union来达到目的。 三个数据表:bas_goods , pur_goods ,pur_provider 1.当两个表时实现左连接: select * from bas_goods left join pur_goods on bas_goods.id=pur_goods.id 2.当两个表时实现右连接: select * from bas_goods right join pur_goods on bas_goods.id=pur_goods.id 3.当两个表时实现全连接(full join不可行的情况): select * from bas_goods left join pur_goods on bas_goods.id=pur_goods.id union select * from bas_goods right join pur_goods on bas_goods.id=pur_goods.id 使用union 是自动去除重复项,若想保留重复项: union all 4.当三个表时实现左连接: select * from bas_goods //需要几个表实现就加几条 left join pur_goods on bas_goods.id=pur_goods.id left join pur_provider on bas_goods.id=pur_provider.id 5.

[TOOLS] 解决Verdi 无法打开部分波形

使用Verdi dump waveform经常会遇到部分信号无法打开,可尝试一下办法: 1. 查看filelist中是否加入-v ,如果加入-v 则把他删除; -v filename Specifies a Verilog library file. VCS looks in this file for definitions of the module and UDP instances that VCS found in your source code, but for which it did not find the corresponding module or UDP definitions in your source code. 注:指定一个库文件,VCS会来这个文件中找源代码中例化的但在源代码中找不到的module,这里一个文件可以里面包含很多module。 -y directory Specifies a Verilog library directory. VCS looks in the source files in this directory for definitions of the module and UDP instances that VCS found in your source code, but for which it did not find the corresponding module or UDP definitions in your source code.

什么是服务治理?

目录 服务治理的伟大目标实现目标要先解决问题四个问题(3W1H) 服务治理的解决方案 服务治理就像是白羊座宫殿,它是通向微服务架构圣殿的第一关,是所有微服务应用要考虑的第一个问题。本章将带大家深入浅出,从“提出问题-解决问题”的思路出发,让大家对服务治理领域的核心功能有个直观的感受。这就像相亲见姑娘的第一面,不求深入了解,但求心中有数,为后面的章节开一个好头。Let’s Go! 服务治理的伟大目标 服务治理这个名字乍一听很唬人,其实他很低调,能做的事情无非就是专治分布式系统各种不服。呦,你看这口气还挺大,既然牛已经吹出来了,那就先给自己定几个小目标吧! 高可用性 换成通俗易懂的说法就是**”当一只打不死的小强“**,在服务治理麾下的所有微服务节点,不论是被闪电击中还是被挖掘机铲断了电源,即使战至最后一个存活节点,服务治理框架也要保证服务的可用性。分布式调用 微服务的节点通常散落在不同的网络环境中,大型互联网公司甚至会使用两地三机房或跨洲际机房做异地容灾。这就要求服务治理框架具备在复杂网络环境下准确获知服务节点网络地址(IP,端口以及服务名称)的能力。作为服务消费者,就可以借助服务治理框架的精准制导能力,向服务节点发起请求。一只穿云箭,千军万马来相见。生命周期管理 万物都在轮回之中,在Spring的世界更是如此。微服务也把自己平凡而充实的一生,交给了服务治理框架,从服务上线、持续运行直到临终关怀,服务治理始终贯穿整个微服务生命周期。健康检查 微服务的节点都是任劳任怨的执行996,当然,如果一个节点因为任何原因不再能996的辛勤工作,那就不再是哥的兄弟了。服务治理框架要精准识别这些节点,将其从自己的兄弟会中剔除。 实现目标要先解决问题 目标和想法是美好的,但是现实里却没那么容易。为了实现这些小目标,我们必须解决眼前的几个大问题。 四个问题(3W1H) 假设我们把每个微服务集群比喻成一个武林门派,比如搜索服务就是“所罗门”,优惠券服务就是“卷莲门”,那么这个服务集群中的每个机器就相当于门下的一个弟子,而每个业务调用方就是一个前来踢馆的江湖高手。 中原武林浩如烟海,如何在茫茫人海中找到我想要挑战的那个人呢?服务治理框架,就是要帮这些踢馆的高手找到对应门派的精壮弟子进行切磋。在这个过程中服务治理要帮助踢馆高手翻过四座大山,实现最终目标,这就是四个需要服务治理框架来解决的问题,我们称之为3W1H。 Who are you 作为服务治理框架,我如何知道中原武林各门各派的众弟子(服务提供者)的信息,这里面的信息是他们行走江湖的独一无二的标识,包含三个维度:a) 名号-敢问你的IP和端口是什么 b) 门派 - 报上你的服务名称 c) 身体状况 - 服务当前是可用or下线状态决定了你是能打还是不能打。Where are you from 作为踢馆人(服务调用方),我如何知道这些武林人士(服务提供者)来自哪里?我又如何从服务治理框架手里拿到他们的地址,从而使我可以找到正确的人?How are you doing 服务治理框架需要时刻甄别这些门派弟子的身体情况,一旦某个弟子断了气,就要做出相应标识,并告知踢馆人,以防别人走了冤枉路,找到了地方却找不见人。When you die 有的门派弟子比较怂包,不敢应战,且主动请求下线。或者为了闭关修炼高级武功(系统升级重启),短时间内不在线,那么服务治理框架也要做出相应的回应,对主动下线的服务做清退处理。 服务治理的解决方案 为了解决前面提到的四个问题,服务治理领域祭出了六门独门武艺,用来解决这四个问题。在这一章节各位就当听个响,知道这些个武功路数的名称就好,后面的章节我们再来深入学习 Who are you - 服务注册 - 服务提供方自报家门Where are you from - 服务发现 - 服务消费者拉取注册数据How are you doing - 心跳检测,服务续约和服务剔除 一套由服务提供方和注册中心配合完成的去伪存真的过程When you die - 服务下线 - 服务提供方发起主动下线

ClickHouse常见问题及其解决方案

1 概述 在对ClickHouse进行分布表+复制表+zookeeper保证高可用的情况下进行性能测试时遇到如下坑,进行整理 2 分布表join问题Unknown identifier: LO_CUSTKEY, context:… 1.1 问题描述 SQL如下: SELECT count(1) FROM performance.line_all AS c LEFT JOIN performance.customer_all AS l ON l.C_CUSTKEY = c.LO_CUSTKEY 执行该SQL报错如下: Received exception from server (version 19.4.0): Code: 47. DB::Exception: Received from 10.0.0.50:9000. DB::Exception: Received from ambari04:9000, 10.0.0.54. DB::Exception: Unknown identifier: LO_CUSTKEY, context: query: 'LO_CUSTKEY' required_names: 'LO_CUSTKEY' source_tables: table_aliases: complex_aliases: masked_columns: array_join_columns: source_columns: . 根据报错信息可以不知道LO_CUSTKEY,这个连接字段 1.2 解决 分布表join,在on后的连接条件中,from后面跟的表的连接字段放在前面。修改SQL如下: SELECT count(1) FROM performance.customer_all AS c LEFT JOIN performance.

Microsoft.Data.Sqlite和System.Data.SQLite的区别和优劣

System.Data.SQLite是sqlite官方实现的ado.net。据说已经不更新了,但我看最新的包是2020年4月份。 Microsoft.Data.Sqlite是微软官方实现的ado.net。 两者的接口类似但Microsoft.Data.Sqlite没有实现SQLiteDataAdapter。不知道怎么往dataset中装,所以我还是使用了System.Data.SQLite。 另外,System.Data.SQLite需要SQLite.Interop.dll,不知道Microsoft.Data.Sqlite能否不需要。 SQLite.Interop.dll最好需要两个目录x86和x64。

SpringCloud核心组件介绍 (Netflix + Alibaba套件)

目录 三大门派Netflix阿里巴巴Spring Open Source 势力范围小结 上一章我们队Spring Cloud里的各个组件做了简单的介绍,大家有所不知,看着Spring Cloud大家庭其乐融融,可是这里头有三股势力在暗地里较劲呢。 三大门派 有Spring Cloud的地方就有江湖,我们就来看一看在这个江湖中都有哪些独霸一方的门派! Netflix 是先有Spring Cloud还是先有Netflix?这是一个好问题。Netflix是一家大名鼎鼎的互联网传媒公司,但为什么它在开源软件领域有这么大的名声呢?这就不得不说起它和Spring Cloud的渊源了。 很久很久以前,天和地还没有分开,宇宙混沌一片。有个叫Netflix的公司,在这混沌之中,拿自身的业务动手,开启了一段微服务的改造之旅。在这段漫长的过程中,沉淀出了一系列优秀的微服务组件,比如大名鼎鼎的Eureka,Hystrix,Zuul等等,这些组件经过Pivotal的一系列封装以后就构成了初代目Spring Cloud。 目前Spring Cloud Netflix组件库是Spring Cloud中最受欢迎的项目,并且还拥有最广泛的群众基础,这么说吧,10个用Spring Cloud的公司,有八九个都会选用Netflix组件库全家桶来构建自己的技术栈。听到这,同鞋们可能会问,难道Spring Cloud里还有其他的组件库吗?那我们就往下看。 阿里巴巴 阿里近些年开源的步子迈的很大,都说步子迈得大容易扯着裆,不过凭借阿里996+鸡血文化的加持,用互联网行业特有的糙快猛的精神,近几年在开源软件上不断开疆扩土,发展速度和规模都是是可圈可点。 目前开源领域一大热门当属Spring Cloud,尽管前面有Netflix组件库占尽天时地利,可是不妨碍阿里巴巴集团一贯怼天怼地的做派。这不,Spring Cloud大家族中又添新丁,那就是–Spring Cloud Alibaba组件库。 从目前的势头来看,Alibaba组件库还是呈现一路高歌猛进的态势,其中多款组件已经站上擂台和Netflix组件展开直接竞争。得益于阿里集团的福报文化,加班不要命的码农们给这些组件添加了各种业务功能,从我个人使用这两个组件的感受来说,Netflix组件相对来说比较“纯粹和纯净”,Alibaba组件似乎透出一股“KPI导向”的味道(恨不得把能想到的功能全塞进去)。 Spring Open Source 这最后一股势力就是Spring自个儿了,由Spring自己独家挂牌的开源组件,可以说是“原配”组件了。都说原配的才是最好的,不过在上面两个重量级组件库面前还真不好说。同鞋们经常会看到这样一个情况,在某个领域中这三家的组件会扎堆出现。比如服务治理,这三家各自都有一个独立组件,想想大家都是Spring Cloud一家子,为何还整出了一副三足鼎立的态势呢?这背后都有很多故事的,我们在后面再来跟大家说说这里面的恩怨情仇。 势力范围 那接下来我们就看一看上面那三股恶势力都在哪些领域部署了兵力 应用领域名称Netflix组件Alibaba组件Spring或其他开源厂商服务治理EurekaNacos,Dubbo(RPC框架)Consul负载均衡Ribbonspring-cloud-loadbalancer服务调用Feign(后划归为openfeign)服务容错Hystrix + Turbine + DashboardSentinel限流SentinelGateway支持网关层限流服务网关ZuulGateway配置管理ArchaiusAlibaba Cloud ACMConfig消息总线Bus调用链路追踪Sleuth消息驱动组件RocketMQ(Java写的消息中间件)Stream(对接Kafka,RabbitMQ)任务调度Alibaba Cloud SchedulerXspring-cloud-task其他Sidecar(跨语言)Seata(分布式事物), SMS(短信服务) 从上面的表格中可以看出,在大多数的领域当中,我们都有多与一种的解决方案,而且各个组织在不同领域发力程度也不一样。我们在实际的研发当中不会只盯着一个组件库用,而是结合使用来自不同组织开发的组件,这样才能发挥Spring Cloud的最强功力。 小结 本章我们对Spring Cloud里的几大势力做了一番介绍,并且了解了在不同的业务领域都有哪些可供我们选择的组件。

微服务的拆分规范和原则

目录 拆迁方案1、压力模型拆分2、业务模型拆分2.1 主链路拆分2.2 领域模型拆分2.3 用户群体拆分2.4 前后台业务分离 前面我们了解了什么是微服务和为什么需要做微服务架构(What & Why),这一章我们就来探讨如何做微服务架构的拆分(How) 微服务拆分没有一个绝对正确的方案,服务拆分的粒度完全要根据业务场景来规划,而随着业务的发展,原先的架构方案也需要做调整。既然没有标准答案,那我们就使出“乱拳打死老师傅”的招数,想怎么拆怎么拆好了?且慢且慢,这不就成了暴力拆迁了吗,现在“扫黑除恶”正当头,我们可不能这么干。这里总结了几个服务拆分的心法秘籍,同鞋们可以照着这个路子去思考服务拆分的粒度,我行走江湖就靠着这套武功心法。 拆迁方案 这辈子当不成拆迁户的同学们,你们也别灰心,咱房子拆不成,微服务还是可以拆一拆的。说到拆迁,咱就得有一套方式方法,不能暴力拆迁。不妨看一看在下一般怎么规划拆迁方案 1、压力模型拆分 压力模型简单来说就是用户访问量,我们要识别出某些超高并发量的业务,尽可能把这部分业务独立拆分出来。这么做的原因非常简单,高并发业务相当于前线战场,战况非常激烈,如果我方部署兵力不够(服务器资源),而敌方攻势又过于猛烈(剁手族们疯狂的流量),万一战线失手了服务器压力抵挡不住,我们不希望让这种情况影响到其他用户场景。 我这里举两个例子: 秒杀 秒杀是一个典型的低频突发流量的场景,参加秒杀的商品的数量一般不会很多,但是在秒杀开始的时候,尤其是对爆款商品来说(比如新发布的苹果手机),会有一个很明显的突发流量商品详情页 商品详情页毫无疑问是电商场景中并发量最大的业务,一笔成功达成的订单背后,可能会调用几十次商品详情页接口(大家买东西都要货比三家么不是) 我在做具体规划的时候,会尽量把压力模型拆解为三个维度 高频高并发场景 比如商品详情页,它既是一个高频场景(时时刻刻都会发生),同时也是高并发的场景(QPS - Query per seconds极高)低频突发流量场景 比如前面提到的秒杀,它并不是高频场景(偶尔发生),但是它会产生突发流量。再跟大家举一个例子,那就是“商品发布”,对新零售业务来说,当开设一个线下大型卖场以后,需要将所有库存商品一键上架,这里的商品总数是个非常庞大的数字(几十万+),瞬间就可以打出很高的QPS低频流量场景 这一类多为后台运营团队的服务接口,比如商品图文编辑,添加新的优惠计算规则,上架新商品。它发生的频率比较低,而且也不会造成很高的并发量。 通常我们建议将高频高并发的场景隔离出来,单独作为一个微服务模块,典型的就是商品详情页的后台服务。对低频突发流量的场景,如果条件允许也可以剥离出来独立组成模块,如果必须和其他业务包在一个微服务下,那一定要做好流控措施(最典型的就是削峰策略),而且还要考虑到异常情况下的补偿机制。对于低频流量场景,我们根据业务模型切分就好了(后面会讲到)。 2、业务模型拆分 业务模型拆分的维度有很多,我们在实际项目中应该综合各个不同维度做考量。我这里主要从主链路、领域模型和用户群体三个维度来讲一下 2.1 主链路拆分 在电商领域“主链路”是一个很重要的业务链条,它是指用户完成下单场景所必须经过的场景。按照我们平时买买买的剁手经验,可以识别出很多核心主链路,比如商品搜索->商品详情页->购物车模块->订单结算->支付业务,这是就是一条最简单的主链路。如果这是一场战斗的话,那么主链路就是这场战斗的正面战场,我们必须力保主链路不失守。 电商领域背后还有很多隐藏的核心主链路,比如下单之前的营销优惠结算,它会影响订单的最终价格;再比如用户地址模块,它会影响下单前的配送地址选择。如果这两个模块出了问题,大部分用户恐怕都要放弃下单了。试想,双十一我们添加了一揽子购物车,结果结算的时候发现所有优惠组合都失效了,或者是无法选择配送地址,那也只好放弃了。 各位亲,这里建议将核心主链路拆分,有以下几个目的: 异常容错 为主链路建立层次化的降级策略(多级降级),以及合理的熔断策略,这部分我们将在Hystrix服务容错阶段的课程中详细解释调配资源 主链路通常来讲都是高频场景,自然需要更多的计算资源,最主要的体现就是集群里分配的虚机数量多。举个例子,就说淘系中台业务中单品营销优惠微服务,在平日非大促阶段(非双11扩容场景)一个服务后台都有接近一万台虚机,一到了发布窗口就要通宵达旦做发布。将主链路服务单独隔离出来,这样有利于根据需要指定资源计划(比如双11阶段为每个主链路服务拟定不同的扩容计划)服务隔离 主链路是主打输出的C位,把主链路与其他打辅助的业务服务隔离开来,避免边缘服务的异常情况影响到主链路。 2.2 领域模型拆分 领域驱动设计DDD(Domain-Driven Design 领域驱动设计)不是一个新概念,但老外们有个毛病,做什么事情特别喜欢提炼方法论,本来一个非常简单的概念,愣是被吹到神乎其神高深莫测。 其实领域模型是一个很简单的概念,抛掉繁文缛节的方法论,我们一样可以做好领域模型拆分。我举一个例子大家就明白了。阿里集团推出了一套大中台战略,将集团内部的公共领域服务从各个事业部中剥离出来,整合成了一个“集团级别”的大型中台业务。比如说IC订单系统,淘系商品服务,UMP营销优惠服务,汇金平台,用户账号系统等等。 从上面这个例子中我们可以看出,所谓领域模型,其实就是一套各司其职的服务集合。这里涉及到领域和合并和分拆。领域合并的例子就是淘系的营销优惠服务,曾经天猫和淘宝各有一套营销服务,如果不考虑底层技术,从业务层面来说它们做的事情是一样的,都属于营销优惠计算的领域范围,因此后面两条技术线整合成了一套UMP营销优惠服务。领域拆分的例子就太多了,我们做微服务规划的时候要确保各个领域之间有清晰的界限,比如商品服务,和订单服务,尽管他们之间有交集(都围绕商品主数据),但是毕竟是服务于不同领域(商品域和订单域),所以我们要将两者拆分成独立的服务。 2.3 用户群体拆分 根据用户群体做拆分,我们首先要了解自己的系统业务里有哪些用户,比如说电商领域,我们有2C的小卖家,也有2B的大客户,在集团内部有运营、采购、还有客服小二等等。对每个不同的用户群体来说,即便是相同的业务领域,也有该群体其独有的业务场景。 用户群体相当于一个二级域,我们建议先根据主链路和领域模型做一级域的拆分,再结合具体的业务分析,看是否需要在用户领域方向上做更细粒度的拆分。 2.4 前后台业务分离 同学们如果下了班当过顺丰车主的话,就会知道网约车业务不仅有一个乘客端app,也有一个司机端app。电商领域也是一样的,我们通过手淘app买买买(前台业务场景),商家通过后台的业务系统管理商品信息(后台业务场景)。在实际项目中通常也会将前台业务和后台业务做一个隔离,这也符合高频业务(前台)和低频业务(后台)的隔离策略。

微服务介绍

目录 Teenage Sex(青少年行为)一字箴言 - 微微服务的印象标签拆迁办事处单一职责研发团队赋能可独立部署学习Tips Teenage Sex(青少年行为) 微服务是什么?杜克大学教授Dan Ariely说过一段非常出名的话,用来表述Big Data的发展现状。我觉得把这句话放到微服务身上也极其贴切。 Micro-services is like teenage sex: Everyone talks about it, nobody really knows how to do it, everyone thinks everyone else is doing it, so everyone claims they are doing it 微服务就像青春期性行为的话题,所有(小屁孩)都在讨论它,但没人知道怎么做,所有人都以为其他的人都在做,因此所有人都宣称他们自己也在这么做。 大到BAT级的应用,小到两三人的软件作坊,开发团队都会说自己的系统是使用“微服务架构”,这就像几年前大数据被吹到天上的时候,只要有一个数据库就可以说自己的系统是“基于大数据技术”。那这些所谓的微服务架构,到底是真微服务还是伪微服务?又或者是为了微服务而微服务呢?God knows 一字箴言 - 微 要说微服务,那么就绕不开这个微小的微字。亚马逊的掌门人Jeff Bezos提出过一个很有意思的观点:The two pizza principle,双披萨原则。 Teams shouldn’t be larger than what two pizzas can feed 言下之意就是,如果两个Pizza还不能让你的团队吃饱,那么你的团队可能太大了。很可惜,它并没有说Pizza的大小,而且他的团队也没有老师这号凭一己之力就可以干掉2个Pizza的人。但是Jeff提出了一个蛮有建设性的意见,就是保持小规模的团队。 如果我们保持规模较小的特战队模式,那么这个团队的项目/模块规模必然也要控制在一定范围以内,他们所负责的项目也应当是一组相对较小,并且独立的功能单元。通常情况下并不是先有团队再有业务架构,实际上我们的团队应该是围绕“业务功能”来组织的。 对于微服务的划分,什么粒度的微服务才是合适的?这个没有标准的答案,假如你的用户只有100个,那么还需要做服务划分吗?我想并不需要,因为对这种规模的项目来说,单体应用是更好的选择,微服务反而会增加运维和研发成本。那么当你的应用要承接几十万用户的时候,无论是从交付迭代的效率来说,还是从高可用的角度来说,微服务架构会是更好的选择。我们在后面的章节里,将和大家一起来讨论服务拆分的几个衡量标准。 微服务的印象标签 微服务领域有众多开源项目,比如Spring Cloud就是目前这个领域的头牌。但是要提醒大家的是,并不是说你在项目中应用了微服务的开源技术,那么这个项目就摇身一变成了微服务架构,土鸡穿了马甲还是土鸡,可变不成凤凰。这些开源技术就像一个人的外功招式,武术架子使的再漂亮,没有内功加持还是花架子。 那么微服务领域都有哪些所谓内功?其实这些都是软件设计中很常见的准则,并不是什么高深的功夫,但是这些准则可以很好的应用到微服务规划,或者用来识别业务主链路。我们来回顾一下这些耳熟能详的软件设计方法论。 拆迁办事处 对我们来说最直观的感受就是一个字“拆”,应用微服务化的第一步就是理清楚两个问题,拆什么和怎么拆。字面意思上很好理解,就是将一大坨纠缠在一起的服务拆分成单个服务,剥离出去独立提供服务。在稍后的小节里我们将一起来探讨拆迁办的办事儿准则。

D触发器的建立时间和保持时间原理

大家都知道D触发器需要建立时间和保持时间,它们的含义大家也清楚,但是为什么需要建立时间Tsu和保持时间Th?下图展示了一般D触发器的内部结构 具体的分析有兴趣可以慢慢分析,不是很难。主要说一下大概:默认SD,RD信号为高,cp=0时,D信号作用于G5,G6两个与非门分别输出D和!D,当cp=1时,G5,G6的输出端数据经过G3,G4到达其输出端,然后根据RS触发器得到输出Q。其中当cp=1时,无论D信号怎么变化都不会影响G3,G3输出的结果。(这里假设忽略了门延时)。 这样的话一个上升沿触发的D触发器就完成了。 但是逻辑门的延时是不能忽略的,那么Tsu代表什么呢?代表了数据D到达G5,G6输出端的时间。我们假设Tsu为4ns,即数据D需要要cp=1时前4ns就要保持稳定,同时也代表了G5,G6最大的门延时是4ns。那么假如我们在cp=1前3ns改变我们的D值会怎样呢?那是不是当cp=1时,改变的D值还没用通过逻辑延时为4ns的门,也就是说此时G5,G6的数据还是cp=1前4ns的D值。也就是说明了当在建立时间以后改变输入数据是没有作用的。 同样,Th代表了G5,G6的输出端口到G3,G4的输出端口的时间。前面分析我们知道如果不考虑延时,那么cp=1时,G5,G6的输出端口值会马上在G3,G4端口输出,且由于cp=1了,D数据的改变并不会影响G5,G6的输出结果从而保持数据的稳定。那么由于门延时的存在,cp=0时,G4,G3端口输出为1,当cp=1时,G3,G4的端口值并不能马上改变,这里我们假设Th=4,即需要4ns端口值才能变化,那么假如在这4ns中外部数据D发生了改变,由于此时G3,G4的输出端口依然为0(逻辑延时4ns),那么他们的反馈回路会造成G5,G6的输出端口值随着D的改变而改变,这样会导致G3,G4的数据随之改变从而造成输出数据的错误。

视频教程-105集大白话学懂Python教育项目教程-Python

105集大白话学懂Python教育项目教程 张长志技术全才、擅长领域:区块链、大数据、Java等。10余年软件研发及企业培训经验,曾为多家大型企业提供企业内训如中石化,中国联通,中国移动等知名企业。拥有丰富的企业应用软件开发经验、深厚的软件架构设计理论基础及实践能力。项目开发历程:基于大数据技术推荐系统 ,医疗保险大数据分析与统计推断,H5跨平台APP,携程酒店APP,Go语言实现Storm和ZK类似框架。 张长志 ¥58.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+技术好课免费看 APP订阅课程,领取优惠,最少立减5元 ↓↓↓ 订阅后:请点击此处观看视频课程 视频教程-105集大白话学懂Python教育项目教程-Python 学习有效期:永久观看 学习时长:1604分钟 学习计划:27天 难度:高 「口碑讲师带队学习,让你的问题不过夜」 讲师姓名:张长志 CTO/CIO/技术副总裁/总工程师 讲师介绍:张长志技术全才、擅长领域:区块链、大数据、Java等。10余年软件研发及企业培训经验,曾为多家大型企业提供企业内训如中石化,中国联通,中国移动等知名企业。拥有丰富的企业应用软件开发经验、深厚的软件架构设计理论基础及实践能力。项目开发历程:基于大数据技术推荐系统 ,医疗保险大数据分析与统计推断,H5跨平台APP,携程酒店APP,Go语言实现Storm和ZK类似框架。 ☛点击立即跟老师学习☚ 「你将学到什么?」 本教程为官方授权教程 整个项目,从项目的准备阶段到最终的部署上线全面涵盖;项目全程手写代码,逐行讲解;Django相关业务逻辑基本全部涵盖。 本课程中你将学习到,Django的框架使用流程、Django配置第三方的后台xadmin、Django使用邮箱处理用户登陆注册、Django-simple-captcha第三方验证码的使用、项目的部署上线流程等。 「课程学习目录」 1.01、项目准备_根据模板页面抽象app 2.02、目准备_app当中模型类(表)的抽象(1) 3.03、项目准备_app当中模型类(表)的抽象(2) 4.04、项目准备_项目的创建和配置 5.05、项目准备_创建其余app配置子路由,创建自主app管理的包去管理所有的app 6.06、项目准备_用户模块的模型类创建 7.07、项目准备_机构模块的模型类创建 8.08、项目准备_课程模块的模型类创建 9.09、项目准备_用户操作app模型类的创建(1) 10.10、项目准备_用户操作app模型类的创建(2) 11.11、项目准备_所有模型类的迁移和同步 12.12、项目准备_xadmin简介 13.13、项目准备_xadmin注册模型类添加测试数据(1) 14.14、项目准备_xadmin的主题设置及全局样式设置 15.15、项目准备_xadmin注册模型类添加测试数据(2) 16.16、项目准备_xadmin配置icon 17.17、项目准备_首页逻辑及首页的显示 18.18、项目准备_多级继承的原理及首页使用继承显示(1) 19.19、项目准备_多级继承的原理及首页使用继承显示(2) 20.20、用户模块_用户基本注册get请求方式实现 21.21、用户模块_用户基本注册post实现 22.22、用户模块_用户基本登陆逻辑实现 23.23、用户模块_第三方验证码django-simple-captcha的配置和使用 24.24、用户模块_为基本登陆添加激活功能并引出发送邮件逻辑 25.25、用户模块_注册发送邮箱验证码(1) 26.26、用户模块_注册发送邮箱验证码(2) 27.27、用户模块_邮箱验证码激活功能的实现 28.28、用户模块_忘记密码之发送邮箱验证码功能 29.29、用户模块_忘记密码之修改密码功能 30.30、机构模块_机构列表页的模板页面展示 31.31、机构模块_机构列表页模板数据的填充和展示 32.32、机构模块_机构列表页的分页功能实现 33.33、机构模块_机构列表页按照机构类别进行筛选过滤 34.34、机构模块_机构列表页按照所在地区进行筛选过滤 35.35、机构模块_机构列表页类别和地区联合过滤 36.36、机构模块_按照学习人数和课程数进行排序 37.37、机构模块_将过滤筛选和排序进行关联 38.38、机构模块_用户咨询功能ajax实现(1) 39.39、机构模块_用户咨询功能ajax实现(2) 40.40、机构模块_用户咨询使用自定义验证规则验证手机 41.41、机构模块_机构详情页首页后台逻辑及模板二级base制作 42.42、机构模块_机构详情页首页继承二级base进行展示 43.43、机构模块_机构详情页首页的数据展示 44.

[其他] Linux内核模块管理命令(modprobe、modinfo、rmmod、insmod)

---------------------------------------- modprobe ---------------------------------------- #1 显示模块配置信息 modprobe -c|grep tipc #2 显示模块依赖关系 modprobe --show-depends tipc #3 开机加载模块 systemd 读取 /etc/modules-load.d/ 中的配置加载额外的内核模块。配置文件名称通常为 /etc/modules-load.d/<program>.conf。 格式很简单,一行一个要读取的模块名,而空行以及第一个非空格字符为#或;的行会被忽略,如: /etc/modules-load.d/virtio-net.conf # Load virtio-net.ko at boot virtio-net /etc/modules-load.d/tipc.conf # Load tipc.ko at boot tipc 也可以使用命令modules-load.d来配置开机加载的模块。 #4 配置模块参数 要通过配置文件传递参数,在 /etc/modprobe.d/ 中放入任意名称 .conf 文件,比如:tipc.conf #5 使用内核命令行 如果模块直接编译进内核,也可以通过启动管理器(GRUB, LILO 或 Syslinux)的内核行加入参数: modname.parametername=parametercontents 例如:thinkpad_acpi.fan_control=1 #7 模块黑名单 #7-1 禁用内核模块 有些模块作为 initramfs 的一部分装入。要阻止 initramfs 装入某些模块,可以在 /etc/modprobe.d/modprobe.conf 中将它们加入黑名单 #7-2 使用 /etc/modprobe.d/ 中的文件 在 /etc/modprobe.d/ 中创建 tipc.

十六、hive sql求连续三天购买指定需求

在实际开发中经常会有一些求连续类型指标,如系统连续几天登录、商城连续几天下单客户,等等关于连续时间类型的指标问题 需求:下面会做一个求连续三天下单的客户 1、测试数据 001 zs p001 2020-02-04 002 zs p005 2020-03-05 003 zs p006 2020-03-06 004 zs p002 2020-03-07 005 zs p001 2020-03-19 006 ls p002 2020-03-04 007 ls p001 2020-03-05 008 ww p002 2020-03-07 009 ww p001 2020-03-08 010 ww p002 2020-03-09 011 ww p001 2020-03-14 012 zl p002 2020-03-09 013 zl p001 2020-03-10 014 tq p002 2020-03-09 015 tq p001 2020-03-10 016 tq p002 2020-03-11 017 tq p001 2020-03-17 018 tq p002 2020-03-19 019 tq p001 2020-03-20 2、建表 hive (default)> create table t_order(order_id string,user_id string,product_id string,order_date string) row format delimited fields terminated by '\t'; 3、导入数据 hive (default)> load data local inpath '/opt/module/hive/order.

WPf 使用KeyDown后屏蔽方向键导致的焦点移动

private void MainWindows_KeyDown(object sender, KeyEventArgs e) { if (e.KeyStates == Keyboard.GetKeyStates(Key.Left)) { Last_Click(null, null); //取消该事件不然会移动焦点 e.Handled = true; } else if (e.KeyStates == Keyboard.GetKeyStates(Key.Right)) { Next_Click(null , null); //取消该事件,不然会移动焦点 e.Handled = true; } } KeyDown="MainWindows_KeyDown"

PySpark源码分析之Driver端基于Py4j的通信详解

文章目录 概述服务端启动Python客户端编程示例 概述 接上文 PySpark源码分析之AM端运行流程(Driver) 的最后部分可知,PySpark是通过Py4j来实现与Scala端JVM通信交互的(注:Py4j只用于Driver端Python调用JVM中方法;Executor端是直接通过socket通信的。),PySpark主要提供一层Python API的封装。其过程主要是JVM会开启一个Socket端口提供RPC服务,Python需要调用Spark API时,它会作为客户端将调用指令序列化成字节流发送到Socket服务端口,JVM接受字节流后解包成对应的指令,然后找到目标对象和代码进行执行,然后将执行结果序列化成字节流通过Socket返回给客户端,客户端收到字节流后再解码成Python对象,于是Python客户端就成功拿到了远程调用的结果(注:Py4j同时支持【Python -> JVM】和【JVM -> Python】,本文仅仅分析前者,后者在Spark Streaming中有适用场景,以后有时间再分析)。 官方文档:https://www.py4j.org/index.html github:https://github.com/bartdag/py4j Py4j内存模型: Every time a Java object is sent to the Python side, a reference to the object is kept on the Java side (in the Gateway class). Once the object is garbage collected on the Python VM (reference count == 0), the reference is removed on the Java VM: if this was the last reference, the object will likely be garbage collected too.

ubuntu20.04 server 无图形命令行安装

参考连接已经连接在文章中 安装图形界面参考 ubuntu修改开机进入命令行添加链接描述 设置root密码添加链接描述 配置静态ip参考参考 # Let NetworkManager manage all devices on this system,注意下ip段,不要超出 network: ethernets: ens33: addresses: [192.168.81.31/24] dhcp4: no optional: true gateway4: 192.168.81.2 nameservers: addresses: [114.144.144.144,8.8.8.8] version: 2 renderer: NetworkManager ~ ~ 安装ssh服务 apt-get install openssh-server 开启root用户允许连接 参考 报错 Host key verification failed. [zeng@localhost .ssh]$ rm known_hosts #删除就好 参考 配置阿里源阿里镜像官网 配置方法官网 先备份 root@ubuntu:/etc/apt# ls apt.conf.d preferences.d sources.list.curtin.old trusted.gpg.d auth.conf.d sources.list sources.list.d root@ubuntu:/etc/apt# mv sources.list sources.list.bak 直接新建sourcess.list 将官网内容复制进去

十二、over开窗行数,rank排序函数介绍

一、函数介绍 1、OVER(): 指定分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变而变化,例如分区排序; over函数相关参数: partition by:分区,窗口大小为分区 order by:一般与分区相结合使用,窗口大小为排序后的数据起点到当前行 CURRENT ROW:当前行 n PRECEDING:往前n行数据 n FOLLOWING:往后n行数据 UNBOUNDED:起点,UNBOUNDED PRECEDING 表示从前面的起点, UNBOUNDED FOLLOWING表示到后面的终点 2、其他函数 LAG(col,n):往前第n行数据 LAG(col,n):往前第n行数据 NTILE(n):把有序分区中的行分发到指定数据的组中,各个组有编号,编号从1开始,对于每一行,NTILE返回此行所属的组的编号。注意:n必须为int类型。 此三个函数都需要over() 开窗来确定数据范围大小,不然单独无法使用 3、排序函数介绍 RANK() 排序相同时会重复,总数不会变 DENSE_RANK() 排序相同时会重复,总数会减少 ROW_NUMBER() 会根据顺序计算 一样需要over函数来开窗确定数据范围大小。 二、over使用介绍 1、数据准备 jack,2017-01-01,10 tony,2017-01-02,15 jack,2017-02-03,23 tony,2017-01-04,29 jack,2017-01-05,46 jack,2017-04-06,42 tony,2017-01-07,50 jack,2017-01-08,55 mart,2017-04-08,62 mart,2017-04-09,68 neil,2017-05-10,12 mart,2017-04-11,75 neil,2017-06-12,80 mart,2017-04-13,94 建表 create table business( name string, orderdate string, cost int ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ','; 导入 load data local inpath "

java PDF加印章

图章(印章)是一种在合同、票据、公文等文件中表明法律效应、部门机关权威的重要指示物,常见于各种格式的文件、文档中。对于纸质文档可以手动盖章,但对于电子文档,则需要通过特定的方法来实现。本篇文档分享通过Java代码在PDF文档中添加图章的方法。内容将分两部分介绍: 1. 添加图片图章。即通过加载现有的图章(以图片形式),添加到PDF指定页面位置 2. 添加动态图章。即加载PDF文档,并在动态的添加印章内容,包括印章字样、日期、时间、经办人、组织名称等 使用工具:Free Spire.PDF for Java v2.0.0(免费版) 关于jar文件导入: Maven配置: 首先,在pom.xml文件中配置Maven仓库路径。 <repositories> <repository> <id>com.e-iceblue</id> <url>http://repo.e-iceblue.cn/repository/maven-public/</url> </repository> </repositories> 然后,在pom.xml文件中指定Spire.PDF for Java的Maven依赖。 <dependencies> <dependency> <groupId> e-iceblue </groupId> <artifactId>spire.pdf</artifactId> <version>3.4.2</version> </dependency> </dependencies> 配置完成后,在IDEA中,您只需点击”Import Changes”即可导入JAR包;在Eclipse中,您需要点击”Save”按钮, JAR包才会自动下载。至此,您已经成功在Maven项目中添加了Spire.PDF JAR包依赖。 注: Free Spire.PDF for Java的artifactId为spire.pdf.free <dependencies> <dependency> <groupId>e-iceblue</groupId> <artifactId>spire.pdf.free</artifactId> <version>2.6.3</version> </dependency> </dependencies> 配置完成如图:(注意:spire.pdf在最新版本生成的pdf在第一页会有警告) 非Mavenxinagm配置如下: 步骤1:步骤1:在Java程序中新建一个文件夹可命名为Lib。并将产品包中的2个jar文件复制到新建的文件夹下。 步骤2:复制文件后,添加到引用类库:选中这两个jar文件,点击鼠标右键,选择“Build Path” – “Add to Build Path”。完成引用。 Java示例(供参考) 1. 添加图片图章 import com.spire.pdf.FileFormat; import com.spire.pdf.PdfDocument; import com.spire.pdf.PdfPageBase; import com.spire.pdf.annotations.PdfRubberStampAnnotation; import com.

十一、行转列、列转行函数

一、行转列 1、相关行数 CONCAT(string A/col, string B/col…):返回输入字符串连接后的结果,支持任意个输入字符串; CONCAT_WS(separator, str1, str2,…):它是一个特殊形式的 CONCAT()。第一个参数剩余参数间的分隔符。分隔符可以是与剩余参数一样的字符串。如果分隔符是 NULL,返回值也将为 NULL。这个函数会跳过分隔符参数后的任何 NULL 和空字符串。分隔符将被加到被连接的字符串之间; COLLECT_SET(col):函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生array类型字段。 2、数据准备 数据 [root@hadoop102 datas]$ vi person.txt 孙悟空 白羊座 A 大海 射手座 A 宋宋 白羊座 B 猪八戒 白羊座 A 凤姐 射手座 A 建表 create table person_info( name string, constellation string, blood_type string) row format delimited fields terminated by "\t"; 导入数据 load data local inpath '/opt/module/datas/person.txt' into table person_info; 3、concat函数使用 hive (default)> select name,concat(constellation,',',blood_type) hb from person_info; OK name hb 孙悟空 白羊座,A 大海 射手座,A 宋宋 白羊座,B 猪八戒 白羊座,A 凤姐 射手座,A 4、collect_set 数据列去重聚合 select hb,collect_set(name) names from ( select name,concat(constellation,',',blood_type) hb from person_info ) t group by t.

MFC串口操作一:显示串口输入信息

目录 一、目的 1、想知道:MFC串口输入输出信息 二、参考 1、无 三、问题: 1、当有提示说明:OnComm不准确时候, ①方法一:LONG改为LRESULT 四、操作 1、运行效果:完成MFC获取串口输入信息功能 1、创建新工程:我取名字为:MyComTest 1、SerialPort.h 1、SerialPort.cpp 1、将SerialPort.h和SerialPort.cpp文件复制到项目中 1、头文件添加现有项:SerialPort.h 1、源文件添加现有项:SerialPort.cpp 1、MyComTestDlg.h:创建串口SerialPort类:记得头文件 1、创建编辑框:显示外面发送来的串口信息:名字叫做:IDC_EDIT1 1、添加MFC相应消息事件:为了方便得到外面的信息:(因为我没有找到类向导之类直接导入这个事件的方法,直接填写代码也可以实现同样的功能) 1、初始化:串口类:MyComTestDlg.cpp:OnInitDialog()中 1、注销和关闭串口: 一、目的 1、想知道:MFC串口输入输出信息 二、参考 1、无 三、问题: 1、当有提示说明:OnComm不准确时候, 答: ①方法一:LONG改为LRESULT afx_msg LRESULT OnComm(WPARAM ch,LPARAM port);//为了有消息给MFC发送后,MFC有变化 LRESULT CFlashAndVideoDlg::OnComm(WPARAM ch,LPARAM port) 四、操作 1、运行效果:完成MFC获取串口输入信息功能 ①我发送了7位的串口信号,它只会读取我设置额度前6个信号。 1、创建新工程:我取名字为:MyComTest 1、SerialPort.h #pragma once #define WM_COMM_BREAK_DETECTED WM_USER+1 // A break was detected on input. #define WM_COMM_CTS_DETECTED WM_USER+2 // The CTS (clear-to-send) signal changed state. #define WM_COMM_DSR_DETECTED WM_USER+3 // The DSR (data-set-ready) signal changed state.

十、hive异常记录

1、TezSession has already shutdown Caused by: org.apache.tez.dag.api.SessionNotRunning: TezSession has already shutdown. Application application_1546781144082_0005 failed 2 times due to AM Container for appattempt_1546781144082_0005_000002 exited with exitCode: -103 For more detailed output, check application tracking page:http://hadoop103:8088/cluster/app/application_1546781144082_0005Then, click on links to logs of each attempt. Diagnostics: Container [pid=11116,containerID=container_1546781144082_0005_02_000001] is running beyond virtual memory limits. Current usage: 216.3 MB of 1 GB physical memory used; 2.6 GB of 2.1 GB virtual memory used. Killing container.

MySQL事务隔离级别,看这一篇就够了(图文并茂)

我是风筝,微信搜「古时的风筝」,关注我,第一时间获取干货。一个在程序圈混迹多年,主业 Java,另外 Python、React 也玩儿的 6 的斜杠开发者。现已转行程序员鼓励师。 Spring Cloud 系列文章已经完成,可以到 我的github 上查看系列完整内容。也可以在公众号内回复「pdf」获取我精心制作的 pdf 版完整教程。 经常提到数据库的事务,那你知道数据库还有事务隔离的说法吗,事务隔离还有隔离级别,那什么是事务隔离,隔离级别又是什么呢?本文就帮大家梳理一下。 MySQL 事务 本文所说的 MySQL 事务都是指在 InnoDB 引擎下,MyISAM 引擎是不支持事务的。 数据库事务指的是一组数据操作,事务内的操作要么就是全部成功,要么就是全部失败,什么都不做,其实不是没做,是可能做了一部分但是只要有一步失败,就要回滚所有操作,有点一不做二不休的意思。 假设一个网购付款的操作,用户付款后要涉及到订单状态更新、扣库存以及其他一系列动作,这就是一个事务,如果一切正常那就相安无事,一旦中间有某个环节异常,那整个事务就要回滚,总不能更新了订单状态但是不扣库存吧,这问题就大了。 事务具有原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)四个特性,简称 ACID,缺一不可。今天要说的就是隔离性。 概念说明 以下几个概念是事务隔离级别要实际解决的问题,所以需要搞清楚都是什么意思。 脏读 脏读指的是读到了其他事务未提交的数据,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。读到了并一定最终存在的数据,这就是脏读。 可重复读 可重复读指的是在一个事务内,最开始读到的数据和事务结束前的任意时刻读到的同一批数据都是一致的。通常针对数据**更新(UPDATE)**操作。 不可重复读 对比可重复读,不可重复读指的是在同一事务内,不同的时刻读到的同一批数据可能是不一样的,可能会受到其他事务的影响,比如其他事务改了这批数据并提交了。通常针对数据**更新(UPDATE)**操作。 幻读 幻读是针对数据**插入(INSERT)**操作来说的。假设事务A对某些行的内容作了更改,但是还未提交,此时事务B插入了与事务A更改前的记录相同的记录行,并且在事务A提交之前先提交了,而这时,在事务A中查询,会发现好像刚刚的更改对于某些数据未起作用,但其实是事务B刚插入进来的,让用户感觉很魔幻,感觉出现了幻觉,这就叫幻读。 事务隔离级别 SQL 标准定义了四种隔离级别,MySQL 全都支持。这四种隔离级别分别是: 读未提交(READ UNCOMMITTED) 读提交 (READ COMMITTED) 可重复读 (REPEATABLE READ) 串行化 (SERIALIZABLE) 从上往下,隔离强度逐渐增强,性能逐渐变差。采用哪种隔离级别要根据系统需求权衡决定,其中,可重复读是 MySQL 的默认级别。 事务隔离其实就是为了解决上面提到的脏读、不可重复读、幻读这几个问题,下面展示了 4 种隔离级别对这三个问题的解决程度。 隔离级别脏读不可重复读幻读读未提交可能可能可能读提交不可能可能可能可重复读不可能不可能可能串行化不可能不可能不可能 只有串行化的隔离级别解决了全部这 3 个问题,其他的 3 个隔离级别都有缺陷。 一探究竟 下面,我们来一一分析这 4 种隔离级别到底是怎么个意思。 如何设置隔离级别 我们可以通过以下语句查看当前数据库的隔离级别,通过下面语句可以看出我使用的 MySQL 的隔离级别是 REPEATABLE-READ,也就是可重复读,这也是 MySQL 的默认级别。

自动控制原理(1)-典型环节的传递函数

构成线性定常控制系统的七个环节:比例环节,微分环节,一阶微分环节,二阶微分环节,积分环节,惯性环节,振荡环节 1.比例环节 K为比例系数比例环节又称无惯性环节或放大环节比例环节既无零点,又无极点性质:比例环节输出与输入成正比,不失真也不滞后实例:理想的杠杆、放大器、测速发电机、电位器等 2.惯性环节 T为时间常数 K为放大系数(比例系数)惯性环节无零点性质:当系统输入时单位阶跃信号时系统输出按单调指数规律上升 3.积分环节 T为积分时间常数积分环节无零点当输入是单位阶跃信号时,积分环节的输出以固定斜率 1 T \frac{1}{T} T1​单调上升 4.微分环节 微分环节的输出与输入的一阶导数成正比,因此微分环节能预示输入信号的变化趋势,常用来改善控制系统的动态性能 5.振荡环节 ωn为无阻尼自然振荡频率ζ为阻尼比 6.一阶微分环节 τ \tau τ为时间常数比例微分环节可以抑制震荡,提高控制系统的稳定性,改善系统的动态性能 7.二阶微分环节 τ \tau τ为时间常数ζ为阻尼比二阶微分环节没有极点,有2个零点实际中也不存在真正的二阶微分环节

最优化问题—非线性规划(一)

最优化问题—非线性规划(一) 1. 非规划模型的引入和形式描述 1.1 一个非规划的例子 在之前的文章中,我们主要介绍了线性规划模型。其实,在我们建模的过程中,更多的是非规划的问题。我们下面从一个问题进入: 设第 i i i个仓库的位置为 ( x i , y i ) , ( i = 1 , 2 , , . . . , m ) (x_i,y_i),(i=1,2,,...,m) (xi​,yi​),(i=1,2,,...,m),第i个仓库向第j个市场的货物供应量为 z i j z_{ij} zij​(i=1,2,3,…,m,j=1,2,…,n),第i个仓库到第j个市场的距离为: d i j = ( x i − p j ) 2 + ( y i − q j ) 2 d_{ij}=\sqrt{(x_i-p_j)^2+(y_i-q_j)^2} dij​=(xi​−pj​)2+(yi​−qj​)2 ​ 这里,我们的目标是最小化距离和货物供应量的乘积的结果,这里我们用公式来描述就是: ∑ i = 1 m ∑ j = 1 m z i j d i j = ∑ i = 1 m ∑ j = 1 m z i j ( x i − p j ) 2 + ( y i − q j ) 2 ∑_{i=1}^m∑_{j=1}^mz_{ij}d_{ij}=∑_{i=1}^m∑_{j=1}^mz_{ij}\sqrt{(x_i-p_j)^2+(y_i-q_j)^2} i=1∑m​j=1∑m​zij​dij​=i=1∑m​j=1∑m​zij​(xi​−pj​)2+(yi​−qj​)2 ​

DragonBones学习记录

骨骼动画学习记录 用的是 dragonBones 一.官方文档和API 看这个其实就够了。 DB Pro:介绍如何使用DB以及一些骨骼动画的概念;DB 程序库:这里虽然是白鹭里的代码使用,但人家是开发商,很值得参考,而且Creator的文档目前似乎只有API和样例。 二.bilibili官方教学视频 P5.骨骼创建 骨骼的长度是为了好操作,不用拉的太长(基本长度还是要的); P6.IK骨骼约束 参考: IK 和 Fk 正向运动学和反向运动学 1. 一般来说root下只有一个胯骨,其他的骨头都在其下; 2.分组 选中要分组的骨骼,然后按如图键位。随时按下分组的number,比如1,就可以选中分好组的骨骼了。 3.IK FK为正向动力学的缩写。通常情况下,父骨骼带动子骨骼运动即为正向动![力学。例如,大臂带动小臂,大腿带动小腿。 IK与FK相反,用来实现由下而上的驱动。例如,做俯卧撑时,手撑住地面,支起身体。 指的是在子骨骼的末端。 可以看到,这两根骨骼变红了,并在root下生成了一个IKTarget,这就是一个IK约束骨骼,只是它的长度为0,所以就是个点。 3DMAX&DragonBones中骨骼绑定,IK约束,蒙皮权重的概念 注意:IK是可以做补间动画的。 IK最多只能两根骨头,并且要为父子关系;IK可以单根骨头。 如图,这里为什么IK骨骼下面还嵌套了一个IK骨,因为这样才能实现IK的互动,如果不这样的做,那么移动脚,小腿和大腿是不会产生正常的骨骼连带的。 个人理解,外层的是脚IK,子是小腿IK,既然是反向动力学,那么肯定是反向上来的,所以脚在最外层。 小腿受到脚踝骨的约束,而脚又是一个约束骨,然而脚踝骨要受到脚的约束,所以脚踝IK骨要是脚Ik的子节点。 P7.时间轴之骨骼关键帧 1.手动添加关键帧 如图,当我们在没有关键帧的一帧上,做了修改,那么这个旗子会变黄。这时候,我们添加关键帧(按K),那就会记录下来。 但是如果我们改变了某个属性,但是没有记录,然后做一些其他操作,那么又会变回去。比如,角度原来是0,我们改成了30,没记录,做一些其他操作,就会又变回0。 2.自动添加关键帧 如图,要点这个小旗子。这就是只要在没有关键帧的地方,我们做了修改,那就会自动添加关键帧。 3.向左,向右整体移动关键帧 如图,这两个按钮。这时候当前帧是8,我们向右移动,那么后面两个帧都会移动,其实就是拉宽了第一关键帧到第二关键帧的时间,且后面帧的帧距不变。向左同理。 目前可以一直按住,就可以一直向右/左移动。 4.等比拉大/小动画 蓝色框为选中框,拉动这个框即可 等比拉大/小 帧动画。拉到最小的时候继续向那个方向拉,就会反向。 5.编辑多帧 比如,我们要20个帧都偏移20度,那么可以使用它。点击编辑多帧,选中你所有需要修改的帧,然后修改你想修改的属性即可。 6.动画制作小技巧 如图,这里老师是做摆动,这里是全选骨骼拉动制作的,可以看到很顺滑 如图,这种就是用pose工具做的,因为pose工具是按照骨骼来做变化的,所以会像图中这样变化。并且,如果是多根骨头参与变化,那么是很有可能有多种结果的(方程的多个解,骨头越多,一个动作到另一个动作的变化过程也就越多) 自然环境下,摆动应该是有延迟的,下面传递到上面,具体可以看视频的后半部分。 这里老师是把每根骨头动画,做相对的向后移动即可。 P8.时间轴之插槽关键帧 每个插槽可以放多张图片,但是只能显示一张。 P7.时间轴之层级与事件关键帧 1.层级 如图,想做的是这个苹果绕着熊头,所以苹果绕圈的时候,有一半的动画是在熊的身后,而不是熊的前面,这时候,我们就要动态的修改层级。 我们可以看到 apple_ 有个向下的图标,表示这层向下移动了,然后右上角可以看到有个添加层级关键帧,这时候我们就可以添加关键帧,来满足苹果在移动到熊的头部附近时,能够将层级移动到头的前面,让头遮住苹果。 层级修改的帧会出现在绘制顺序上,而不是以颜色来区分,归于某个骨骼的帧上。 这里,如果没有层级帧事件,则“绘制顺序”不会出现。 2.事件 如图,听老师说,原来事件也是放在骨骼帧上的,但现在改了,同意都在一个叫事件的特殊点上。 它也可以挂在骨骼上,如图右上侧的eye。并且可以有多个事件 这里的“动画控制“是指到这帧时,可以切换到指定的下个动画。 P10.骨骼旋转 如果我们第一帧是0度,最后一帧也是0度,中间没有主动添加变化帧的话,那么是不会有动画的。 所以一般我们做旋转都要做多帧,来表明不是没有旋转,和到底旋转了多少圈。

css所有知识点全面复习

文章目录 什么是 CSS?id 和 class 选择器id 选择器class 选择器 如何插入样式表外部样式表(External style sheet)内部样式表(Internal style sheet)内联样式(Inline style)多重样式多重样式优先级深入概念 CSS 背景背景颜色背景图像背景图像 - 水平或垂直平铺背景图像- 设置定位与不平铺 CSS 文本格式文本颜色文本的对齐方式文本修饰文本转换 文本缩进CSS 字体CSS字型字体样式字体大小用em来设置字体大小 CSS 链接CSS列表属性:列表作为列表项标记的图像 CSS 表格表格边框表格宽度和高度表格文字对齐表格填充 CSS 盒子模型(Box Model)元素的宽度和高度 CSS 边框属性边框样式边框宽度边框-单独设置各边 CSS 轮廓(outline)CSS margin(外边距)CSS padding(填充)CSS 分组 和 嵌套 选择器分组选择器嵌套选择器 CSS 尺寸 (Dimension)CSS Display(显示) 与 Visibility(可见性)CSS Position(定位)static 定位fixed 定位relative 定位absolute 定位sticky 定位 CSS 布局 - OverflowCSS Float(浮动)CSS 布局 - 水平 & 垂直对齐元素居中对齐文本居中对齐左右对齐 - 使用定位方式 CSS 组合选择符后代选择器子元素选择器相邻兄弟选择器后续兄弟选择器 CSS 伪类(Pseudo-classes)anchor伪类 CSS :first-child 伪类CSS 伪元素:first-line 伪元素:first-letter 伪元素CSS - :before 伪元素 什么是 CSS?

解决 Adobe Acrobat Pro DC更新后提示登录激活问题

解决 Adobe Acrobat Pro DC 更新后提示登录激活问题 问题描述解决方法 问题描述 Adobe Acrobat Pro DC在安装的时候使用“AMTEmu v0.9.2”激活。 但是没有关闭自动更新,更新后发现提示需要登录才能使用,结果登录后发现激活已经失效。 此时再直接用“AMTEmu v0.9.2”无法激活。 解决方法 快捷键“win+R”打开运行; 输入“regedit”打开注册表编辑器; 找到以下位置: [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Adobe\Adobe Acrobat\DC\Activation] 创建新键值,名称为: IsAMTEnforced 类型为REG_DWORD,数值为十六进制0x00000001; 然后发现使用“AMTEmu v0.9.2”就能够激活了。 然后可以把Adobe Acrobat Pro DC自动更新关了。。。

Hive 数据倾斜 常用解决办法

1.数据倾斜的原因 数据分布不均匀,造成数据热点问题 2.数据倾斜的现象 Hive任务进度长时间维持在99%或者100%的附近,进度好久没变化。通过查看任务监控页面Web,发现只有一个或者少数的reduce任务未完成,因为其处理的数据量和其他的reduce差异过大。单一reduce处理的记录数和平均记录数相差过多,导致最长时间远大于任务的平均时长。 3.数据倾斜情况 group by 不和聚集函数(count,sum等)配合使用时时候,维度过小,某值的数量过多 count(distinct)和distinct,特殊值过多,导致单个reduce慢 小表关联大表join 大表关联大表,空值过多 4.产生数据倾斜的原因 key分布不均匀(底层还是mr):因为分区是根据key值取哈希值再根据reduce取模 业务数据本身的特性 建表考虑不周全 某些HQL语句本身就存在数据倾斜:count(distinct) 5.实际场景 (1)空值产生的数据倾斜 场景说明: 在日志中,常会有信息丢失的问题,比如日志中的 user_id,如果取其中的 user_id 和用户表中的 user_id 相关联,就会碰到数据倾斜的问题。 解决方案 user_id 为空的不参与关联 select * from log a join user b on a.user_id is not null and a.user_id = b.user_id union all select * from log c where c.user_id is null; 赋予空值新的 key 值 select * from log a left outer join user b on case when a.

wireshark分析http协议 计网实验总结

利用wireshark分析http报文 上周实验中进行了课程实验用wireshark抓包了http协议,收获许多,准备开启我的第一篇博客文章。 0x01 http的基本知识 HTTP(HyperText Transfer Protocol,超文本传输协议)是Web系统最核心的内容,是Web服务器和客户端直接进行数据传输的规则。HTTP协议是用于从WWW服务器传输超文本到本地浏览器的传送协议。可以使浏览器更加高效,使网络传输减少。不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及首先显示(如文本先于图形)等。HTTP是一个应用层协议,有请求和响应构成,是一个标准的客户端服务器模型。HTTP具有以下几个特点: 支持客户/服务器模式:支持基本认证和安全认证;简单快速:客户端向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快;灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记;HTTP 0.9和1.0使用非持续连接:限制每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。HTTP 1.1使用持续连接:不必为每个web对象创建一个新的连接,一个连接可以传送多个对象;无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。 http的请求格式 HTTP请求信息由3部分组成: (1)请求方法URI协议/版本 (2) 请求头(Request Header) (3) 请求正文 请求方法URI协议/版本:请求的第一行是"方法URI协议/版本" 例如:GET/sample.jsp HTTP/1.1 其中"GET"代表请求方法,"/sample.jsp"表示URI,"HTTP/1.1代表协议和协议的版本。 请求方法的8种方法 OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向Web服务器发送"*"的请求来测试服务器的功能性。 HEAD:向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。 GET:向特定的资源发出请求。注意:get方法不应当被用于产生“副作用”的操作中。例如在Web APP中,其中一个原因是GET可能会被网站蜘蛛等随意访问。 POST:向指定资源提交数据进行处理请求(比如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立或已有资源的修改。 PUT:向指定资源位置上传其最新内容。 DELETE:请求服务器删除Request-URI所标识的资源。 TRACE:回显服务器收到的请求,主要用于测试或者诊断。 CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。 请求头: - Accept:[表示浏览器可以接受文本,网页图片等] - Accept-Charaset: [表示接受字符编码] - Accept-Encoding:[可以接受格式压缩后数据] - Accept-Language:[浏览器支持的语言为中文] - Host:[浏览器要找的主机] - IF-MODIFIED-Since:[文件在缓存中且指明文件时间] - Referer:[指明来源] - User-Agent:[本机浏览器内核] - Connection:close/Keep-Alive [保持链接,即发完数据后不关闭链接] - Date:[浏览器发送数据的请求时间] 请求正文: 请求头和请求正文之间是一个空行,这个行非常重要,它表示请求头已经结束,接下来的是请求正文。请求正文中包含客户提交的查询字符串信息: http响应格式 HTTP请求信息由3部分组成:: (1)响应首行; (2)响应头信息; (3)响应正文。 响应首行:包含协议版本,响应状态码,对状态码的解释。 例如:分析”HTTP/1.1 200 OK” 其中HTTP/1.1:为协议版本。200 :为响应状态码,此表示响应成功。OK :为解释响应状态码200是响应成功。

plt.scatter分类数据legend添加图例

画图代码参考的帖子:~~~~~~点这~~~~~~ 还有这个 ~~~~~~摁这~~~~~~ 渲染分类边界参考这个帖子:~~~~~~~~戳这~~~~~~~ 一个二分类任务,根据年龄和薪资估计其是否会买车, 数据集有两个特征,Age 和 Salary 标签是 Purchased ,两个取值(0或1) 横轴 Age, 纵轴 Salary,把这些离散的点画出来,并根据标签取值上色 环境 jupyter, python 3.7 # This tells Jupyter to set up Matplotlib so it uses Jupyter’s own backend. %matplotlib inline import matplotlib.pyplot as plt # 根据训练集标签 y 的取值确定所画点的颜色 # y_train 是个 array,里面只有0,1两种取值 # X_train 也是 array 有两列,X_train[i,0] 代表第 i 行,第 0 列, X_train[i][0] 也一样 # scatter 参数中,lw:点宽,s:不知道,color:'r'是红色, marker:'^'代表三角形 for i in range(len(y_train)): if y_train[i] == 0: s1 = plt.

数据挖掘之航空公司客户价值分析

课程设计选题:详细文档项目见https://download.csdn.net/download/sereasuesue/12050550 题目:航空公司客户价值分析 目录 一、 任务背景 2 二、 数据挖掘目标 2 三、数据探索与预处理 3 构建航空客户价值分析的关键特征 3 数据抽取 5 探索性分析 5 数据处理 6 四、模型构建与评价 12 1.模型构建K-Means聚类算法 12 客户价值分析 13 五、 总结 16 任务背景 高铁、动车等铁路的不断兴建,出行方式的多元化让航空公司受到很大的冲击。航空公司之间竞争也很激烈,除了四大航空公司之间的竞争之外,还有新兴产业的各类小型航空公司、民营航空公司,旅游等。甚至国外航线出现高速度增长。 随着时代的发展,客户问题越来越受到关注,客户流失对利润增长造成了非常大的负面影响。客户与航空公司的关系越长,航空公司的利润就越高。一个客户使用了几次这次服务,感觉服务不错,那下次还会倾向于这个服务,但是要获得新客户,不仅需要在广告和人员工资上花费很多,去吸引顾客,在销售、市场也会花费很多,并且大多数新客户产生的利润不如那些流失的老客户多。很明显,失去一个客户对公司来说比得到一个新客户更昂贵。另外老用户也可以带来新用户。 因此,在这一背景下,分析航空公司客户数据,对客户进行分类,提高客户流失率是当务之急。航空公司应针对不同类型的客户制定相应的营销模式,以实现利润最大化。。 数据挖掘目标 按航空公司客户数据进行分类。分析了不同类型顾客的特点,比较不同类型顾客的顾客价值。可以为不同价值客户类别提供个性化服务,并采用相应的营销策略。 分类客户的目的,就是要更精确地说明谁是我们的客户,了解客户到底有哪些实际需要,企业应该去吸引哪些客户,哪些客户应该被重点保留,以及应该如何迎合重点客户的需求等重要问题,进而使客户关系管理真正成为业务获得成功、扩大产品销量的催化剂。客户分类是客户关系管理的核心。帕累托定律(2/8定律):就是20%的顾客给企业带来80%的销售利润。20%的客户其利润率达到100%。现有客户可以带来90%以上的收入。而大部分的营销预算经常被用在非现有客户上。在客户金字塔中具有升级潜力有5%至30%的客户。客户金字塔中客户升级2%,销售收入增加10%,利润就增加50%。 这些经验可能并不完全准确,但我们可以看到新时代客户差异化的趋势和客户价值分析的重要性。 企业应该投入大量的资源来赢得客户,而目标应该放在一小部分能够为企业带来高利润的客户群中,而不是所有的客户群中,以便长期实现自身的特点。航空公司如何投入有限的资源来实现精准营销,从而提高企业的竞争力,最终实现利润最大化?这是航空公司面临的第一个也是必要解决的问题。 三、数据探索与预处理 构建航空客户价值分析的关键特征 这种数据挖掘的目标是通过航空公司的客户数据识别客户价值,并识别具有不同价值的客户。首先,目标是客户价值识别。RFM模型是识别顾客价值最常用的模型,可以用来对顾客进行分类。数据挖掘的目标是客户价值分析,即通过航空公司客户数据识别具有不同价值的客户。识别客户价值最常用的模型是RFM模型。 R(Recency)指的是最近一次消费时间与截止时间的间隔。一般而言,最近一次消费时间与截止时间的间隔越短,说明对当时提供的商品或是服务也最有可能感兴趣。 F(Frequency)指顾客在某段时间内所消费的次数。可以说消费频率越高的顾客,也是满意度越高的顾客,其忠诚度也就越高,顾客价值也就越大。 M(Monetary)指顾客在某段时间内所消费的金额。消费金额越大的顾客,他们的消费能力自然也就越大,这就是所谓“20%的顾客贡献了80%的销售额”的二八法则 RFM模型包括三个特征,使用三维坐标系进行展示,如图所示。X轴表示最近(时间),Y轴表示频率,Z轴表示货币,每个轴一般会分成5级表示程度,1为最小,5为最大 转存失败重新上传取消正在上传…重新上传取消 然而,由于机票价格受距离、舱位等诸多因素的影响,同一金额对航空公司的价值也不尽相同。因此,我们需要对指标进行修订。在所选变量中,客舱系数=对应于客舱系数的平均折扣系数=c,距离系数=某段时间内的累计飞行里程=m。 考虑到航空公司的会员制会因用户的出勤时间长短而在一定程度上影响客户价值,增加指标L=成为会员时间长度=客户关系长度决定了五个指标。R代表客户最近一次消费距今时间长度,客户关系长度L(从入会之日算起),消费频率f、飞行里程m和折扣系数。以上指标是航空公司对客户价值的识别,称为LRFMC模型。 综上,本案例,采用聚类的办法进行识别客户价值,以LRFMC模型为基础该案例,总体流程如下图 挖掘步骤 从航空公司中,有选择地提取数据进行观察、探索性数据分析和预处理,包括缺失和异常值的分析和处理、属性说明、清理和转换。将处理后的数据作为建模数据,利用客流价值的LRFMC模型对客户进行聚类。然后分析每个客户群的特点,识别出有价值的客户。针对模型结果得到不同价值的客户,采用不同的营销手段,推送定制化的营销服务,重点维护老客户 数据抽取 选取两年的时间作为观察窗口 探索性分析 对航空公司的客户数据进行了探索和分析。主要分析缺失和异常数据。通过观察发现,有票价为0、折扣率为0、飞行公里数为0的数据。票价为空值,可能是不存在飞行记录,其他空值可能是,飞机票来自于积分兑换、特价0折优惠等渠道 查找每列属性观测值中空值的个数、最大值、最小值的代码如下 #-*- coding: utf-8 -*- #对数据进行基本的探索 #返回缺失值个数以及最大最小值 import pandas as pd datafile= '../data/air_data.csv' #航空原始数据,第一行为属性标签 resultfile = '.

前端菜鸟必学!less使用基础讲解

前端菜鸟必学!less使用基础讲解 概述使用方法语法简介嵌套规则实例 概述 less是动态的样式表语言,通过简单,明了的语法定义,使编写css 的工作变得非常简单,在实际项目开发中,大大提高了前端工程师的工作效率。 不过个人觉得less的编写过程较为复杂,若是在平时的小项目中大可不必使用它。但是在大型工程项目中可以实现高效的代码管理,所以less是前端工程师必学的内容之一。 使用方法 使用less语法将样式表达式写进格式为 .less 的文档中,再将less文档编译成css文档直接引入html中使用 编译文档我们需要一个 less 编译的工具:个人推荐使用(考拉)koala。 koala 的下载与安装: http://koala-app.com 使用方法十分简单,直接拖拽进去 点击编译即可在原文档路径下生成一个css文档,这里不多做介绍。 语法简介 学习less需要有css的基础,原因可通过下文实例自行思考 less 的注释有两种方法 /* */ 和 // 前一种会在 css 文件中显示,后一种不会在 css 显示 嵌套规则 变量延迟加载:同级属性加载完后加载变量 ,从上往下加载。 @var: 0; .class { @var: 1; .brass { @var: 2; three: @var; //=3 @var: 3; } one: @var; //=1 } 定义一个变量,并为它赋上默认参数: // 形参 实参 都可以写默认参数: @w:10px .box1(@w:100px,@h:100px,@c:pink){ &:extend(.common all); width: @w; height: @h; background: @c; 实例 @zero:0; @selector:wrap; @url:"

为什么电脑唯独搜不到自己家wifi?

转载自品略图书馆 http://www.pinlue.com/article/2020/05/2213/2410586244619.html 电脑唯独搜不到自己家wifi,别人家的都能搜到,手机也可以搜到自己家的,就是电脑不可以,之前连别的地方的wifi都是可以的,还有别人的电脑是可以连上的。win10系统的 为了你这个问题我专门注册了一个知乎账号,我遇到了相同的问题,我的解决方法是将路由器的信道由13修改为11,国内有些设备无法连接 12 或者是13信道。 设备:华硕FL5800L 系统:WINDOWS 10 电脑搜索不到自己家里的wifi 1打开电脑发现无线网络未连接 2打开无线网络列表找不到家里的wifi,但是其他wifi都可以搜索到 3手机连家里的wifi没有问题 4百度各种解决办法尝试未果(这一步可以忽略 其实也没有什么特别的设置) 5重启路由器,完成向导 6手机依然连上了wifi 7电脑还是搜索不到家里的wifi,但是其他wifi都可以搜索到 不知道哪里出了问题,就是打开电脑然后发现居然wifi断了,这样。 以前也出现过一次这样的情况,打开电脑wifi断了搜索不到家里的wifi但是手机可以连上。那次重启路由器,完成向导之后,电脑就搜索到了连上了。电脑是mac,没有连网线的插口。求解决!! 进入路由器设置页面更改频道后问题就解决了。 奇怪的是 原本的频道设置为 自动 ,以前也没有问题。而且 尝试了频道设置为1和2,就都能搜得到我的wifi了,改回为自动后,又搜不到我的wifi了,这是为什么呢? 1、先进无线网络链接属性里,把IP和DNS都设置为自动获取。再链接看看 是否可以正常链接并上网; 2、其次到设备管理器,找到无线网卡设备,右键卸载,并删除此驱动程序 软件【下面打钩】;完后再到您笔记本官网,下载型号一致最新版本的无线 网卡驱动安装,重启本本再链接看看是否可以正常链接; 3、若还木有解决,用360安全卫士里的【断网急救箱】的功能进行修复应 该就可以解决了。 4、若还木有解决,那可能与路由器设置有关了。您先重启下路由器,然后 登录路由器界面。在无线设置选项下,把无线加密方式、信道、模式、频段 都更换另外的参数;还有开启DHCP服务功能。再重启路由看看是否解决。 还木有解决就恢复路由器出厂设置,看看是否可以正常链接。相关操作教程 可参考说明书,或者百度搜索。