概念 将字符串通过哈希函数转换为唯一的哈希值,可以减少内存占用,降低时间复杂度。问题时不同的字符串可能会得到相同的哈希值,也就是发生了哈希碰撞,因此哈希算法的难点就是就是如何来构造一个哈希函数,尽可能的避免哈希碰撞,以满足我们的使用需求。
基本哈希方法 给定字符串 S = s 1 s 2 s 3 s 4 . . . S=s_1s_2s_3s_4... S=s1s2s3s4...令 i d x ( x ) = x − ′ a ′ + 1 idx(x)=x-'a'+1 idx(x)=x−′a′+1, 或者直接使用x的ASCII码也行
自然溢出法 这种方法是利用数据结构unsigned long long的范围自然溢出:即当存储的数据大于unsigned long long的存储范围时,会自动mod 264−1264−1,就不用mod其他质数来保证唯一性了。
unsigned long long Hash[n] hash[i]=hash[i−1]∗p+idx(s[i]); 这里的p一定要是个质数,不然可能无法保证唯一性。
单哈希法 相当于自然溢出法没有了自动取模的操作,所以需要自己进行取模操作。但是这种Hash方法在模数较小的时候的稳定性不一定得到保证,所以在这个方面不如其他方法。
hash[i]=(hash[i−1])∗p+idx(s[i])%mod; 这里的p和mod都是质数,且满足p<mod。最好在选取的时候把p和mod的值取大一点。
双哈希法 双Hash就是对一个hash值用两个不同的质数进行两次modmod操作,然后最后用一对数<hash1[n],hash2[n]><hash1[n],hash2[n]>来表示一个字符串的哈希值,这样的一对数的重复几率加上选择较大的质数,冲突率几乎为0。
hash1[i]=(hash1[i−1])∗p+idx(s[i]) % mod1 hash2[i]=(hash2[i−1])∗p+idx(s[i]) % mod2 计算子串的哈希值 如果我们求出一个串的Hash,就可以O(1)求解其子串的Hash值。
若已知一个 ∣ S ∣ = n |S|=n ∣S∣=n的字符的hash值, h a s h [ i ] , 0 < = i < = n hash[i], 0<=i<=n hash[i],0<=i<=n 子串为 S [ l : r ] , 1 < = l < = r < = n S[l:r], 1 <= l <= r <= n S[l:r],1<=l<=r<=n对应的hash值为:
Go操作MySql 连接 go语言中的database/sql包提供了Sql数据库的泛用接口,但是不提供具体的驱动。使用这个包时必须注入数据库驱动。
下载依赖 go get -u github.com/go-sql-driver/mysql 使用MySql驱动 func Open(driverName, dataSourceName string) (*DB, error) 打开一个指定driverName的数据库,dataSourceName指定数据源
import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" ) func Open() { // DSN:data source name dsn := "root:123@tcp(127.0.0.1:3306)/t1231est" db, err := sql.Open("mysql", dsn) if err != nil { fmt.Printf("打开失败,db:%#v", db) panic(err) } defer db.Close() // 写在error判断的下面 fmt.Printf("成功打开数据库,db:%#v", db) } 初始化连接 Open函数只有检查参数格式的作用,并不创建与数据库的连接,如需检查数据源是否有效应该使用Ping方法。
Open得到的DB对象可以被多个goroutine并发使用,并且维护一个空闲的连接池。所以Open函数应该只被调用一次,很少关闭DB对象。
// 定义一个全局变量 var db *sql.DB // 表示连接的数据库对象, 内部维护着一个连接池,可以安全的被多个goroutine使用 func initDB() (err error) { dsn := "
给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例 2:
输入:s = “cbbd”
输出:“bb”
示例 3:
输入:s = “a”
输出:“a”
示例 4:
输入:s = “ac”
输出:“a”
提示:
1 <= s.length <= 1000
s 仅由数字和英文字母(大写和/或小写)组成
class Solution { public String longestPalindrome(String s) { // write code here // 先来一个n^2时间复杂度的方法,就是每一个点使用双指针遍历,看这个点的最长回文子串有多长 int left = 0; int right = 0; int len = s.length(); // arr=[max_len, start_index, end_index] int[] arr = new int[] {1, 0, 1}; for(int i = 0; i < len; i++){ // 第一种情况以i为中心,像两遍扩散 BAB left = i - 1; right = i + 1; get_max_len(s, left, right, 1, arr); // 第二种情况是 BAAB left = i; right = i + 1; get_max_len(s, left, right, 0, arr); } return s.
@EnableAutoConfiguration实现的关键在于引入了AutoConfigurationImportSelector,其核心逻辑为selectImports方法, 逻辑
大致如下:
从spring-boot-autoconfigure包下的META-INF/spring.factories文件中加载所有可能用到的自动配置类;
去重,并将exclude和excludeName属性携带的类排除;
过滤,将满足条件(@Conditional)的自动配置类返回;
启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要组合包含了以下 3 个注解:
@SpringBootConfiguration: 组 合 了 @Configuration 注 解 , 实 现 配 置 文 件 的 功 能 。 @EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能:
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。 @ComponentScan:Spring组件扫描。
什么是 go:linkname 在go语言的源码中,会发现很多,代码只有函数签名,却看不到函数体,如:
// src/os/proc.go 68行 func runtime_beforeExit() // implemented in runtime 此处我们只看到函数签名,却看不到函数体,全局搜了一把,发现它的函数体却定义在src/runtime/proc.go中
// os_beforeExit is called from os.Exit(0). //go:linkname os_beforeExit os.runtime_beforeExit func os_beforeExit() { if raceenabled { racefini() } } 它是通过go:linkname把函数签名和函数体连接在一起的。
指令格式:
//go:linkname B A 第一个参数表示当前方法或变量,第二个参数表示需要建立链接方法,变量的路径。
go:linkname引导编译器将当前(私有)方法或者变量在编译时链接到指定的位置的方法或者变量,第一个参数表示当前方法或变量,第二个参数表示目标方法或变量,因为这个指令会破坏系统和包的模块化,因此在使用时必须导入unsafe
注意点
go:linkname可以跨包使用,需要导入 unsafe包。A所在的包必须要打入B所在的包,这个也好理解,相当于A调用了B。go build无法编译go:linkname,必须用单独的compile命令进行编译,因为go build会加上-complete参数,这个参数会检查到没有方法体的方法,并且不通过,报错missing function body。或者,在这个没有方法体的包下添加一个空的aa.s 的汇编文件标示,就可以编译了。 为什么要用 go:linkname 这个指令不经常用,最好也不要用,但理解这个指令可以帮助你理解核心包的很多代码。在标准库中是为了可以使用另一个包的unexported的方法或者变量,在敲代码的时候是不可包外访问的,但是运行时用这个命令hack了一下,就变得可以访问。
最大的作用就是定向可访问。
实例 go-ole hello hello.s hello.go link link.go demo.go go.mod // hello.go // 要导入 link 包 // 一般需要一个可导出的方法,例如 CallHello package hello import ( _ "
在wsl中执行以下命令即可:
source ~/.bashrc
点击下方卡片,关注“CVer”公众号
AI/CV重磅干货,第一时间送达
2021年度中科院分区来了!
2021年12月20日,《2021年中国科学院文献情报中心期刊分区表》正式发布,新增 217 本 SCIE/SSCI 期刊和 113 本 ESCI 中国期刊。其中,有60本期刊升级超过2个区,53本期刊降级超过2个区。期刊变动表、期刊分区表详情及查询方式详见文末。
今年也是最后一次发布基础版,2022年起将只发布升级版。
主要看点:
1. 今年,共有3本国产期刊位列综合性期刊1区。除了科学通报(英文版)Science Bulletin和国家科学评论(英文版)National Science Review仍在综合性1区以外,变化大的当属Research,由去年的四区,直接变成今年的一区。
2. 两大化学综述期刊Chemical Review和Chemical Society Review依然霸榜化学类期刊前两名,新刊Chem在化学类非综述期刊中,仅次于Nature Catalysis和Nature Chemistry,超越JACS和Angew;
3. Matter首次入选即为工程技术一区!
4. Nature Energy近三年平均影响因子53.784,在工程技术类非综述类期刊第一名;第一名为Nature Reviews Materials,近三年平均影响因子70.649;
5. Joule入选工程技术类第四名(去年第六),仅次于Nature Reviews Materials,Nature Energy和NATURE MATERIALS,高于Nature Nanotechnology;
6. Nature Sustainability在环境科学与生态学类别中排名第一!
计算机视觉期刊方面,Amusi 发现在工程技术大类中:TPAMI 1区、TIP 1区、IJCV 2区等等。感兴趣的同学,可以查询一下你关注的AI/CV期刊分区是否有变动。
部分期刊分区变动情况(青塔学术整理)
升区≥2的部分期刊(60本)
降区≥2的部分期刊(53本)
期刊详细情况如下:
综合类期刊60本,一区8本
化学类,一区36本
生物学
医学
工程技术
管理科学
环境科学与生态学
农林科学
更多分区查询方法:
本文分区为基础版,中国科学院文献情报中心指出,期刊分区表是中国科学院文献情报中心的研究成果,旨在评估SCI期刊的学术影响力,可为学术投稿提供参考、为科研管理部门的宏观判断提供支撑。不建议任何单位和个人将分区表用于微观科技评价。
版权声明
本文转载自:科研大匠 | 来源:青塔学术、中国科学院文献情报中心、国际科学编辑,版权属于原作者,仅用于学术分享
ICCV和CVPR 2021论文和代码下载 后台回复:CVPR2021,即可下载CVPR 2021论文和代码开源的论文合集 后台回复:ICCV2021,即可下载ICCV 2021论文和代码开源的论文合集 后台回复:Transformer综述,即可下载最新的3篇Transformer综述PDF CVer-Transformer交流群成立 扫码添加CVer助手,可申请加入CVer-Transformer 微信交流群,方向已涵盖:目标检测、图像分割、目标跟踪、人脸检测&识别、OCR、姿态估计、超分辨率、SLAM、医疗影像、Re-ID、GAN、NAS、深度估计、自动驾驶、强化学习、车道线检测、模型剪枝&压缩、去噪、去雾、去雨、风格迁移、遥感图像、行为识别、视频理解、图像融合、图像检索、论文投稿&交流、PyTorch和TensorFlow等群。 一定要备注:研究方向+地点+学校/公司+昵称(如Transformer+上海+上交+卡卡),根据格式备注,可更快被通过且邀请进群 ▲长按加小助手微信,进交流群 ▲点击上方卡片,关注CVer公众号 整理不易,请点赞和在看
什么是用例图?
用例图是被称为参与者的外部用户所能观察到的系统功能的模型图
用例图的组成
(1)用例(Use Case)
(2)参与者(Actor)
(3)关系(依赖、泛化以及关联)
用例图之间的箭头关系
关系
解释
图
参与者与用例之间的关系
关联
表示参与者与用例之间的交互,通信途径。
(关联有时候也用带箭头的实线来表示,这样的表示能够显示地表明发起用例的是参与者。)
___________
用例之间的关系
包含
箭头指向的用例为被包含的用例,称为包含用例;箭头出发的用例为基用例。包含用例是必选的,如果缺少包含用例,基用例就不完整;包含用例必须被执行,不需要满足某种条件;其执行并不会改变基用例的行为。
《include》
-------------------->
扩展
箭头指向的用例为被扩展的用例,称为扩展用例;箭头出发的用例为基用例。扩展用例是可选的,如果缺少扩展用例,不会影响到基用例的完整性;扩展用例在一定条件下才会执行,并且其执行会改变基用例的行为。
《extend》
----------------->
参与者之间的关系
泛化
发出箭头的事物“is a”箭头指向的事物。泛化关系是一般和特殊关系,发出箭头的一方代表特殊的一方,箭头指向的一方代表一般一方。特殊一方继承了一般方的特性并增加了新的特性。
——————
l用例图的主要元素是用例和参与者:所谓用例是指对系统提供的功能(或系统的用途)的描述;参与者是指可能使用用例的人或外部系统。两者的关系是“谁使用了哪个用例”。
案例 《网上图书销售系统》功能需求
(1)查询图书信息:顾客登录该系统后,可根据书名对所需的图书信息进行查询。
(2)订购图书:顾客查询到所需图书后,可制作图书订单。
(3)维护订单信息:顾客可根据需要增加、删除个人订购的图书,及时更新订单信息。
(4)维护个人信息:顾客可随时查询个人信息资料,并更新。
(5)处理顾客订单:图书网站的工作人员收到顾客订单后,对订单及时做出处理,包括:查询顾客订单、查询库存、接受订单并更新库存或拒绝接受顾客订单。
查询顾客订单:从所有订单记录中查询当前未被处理的订单。
查询库存:了解了顾客所需图书后,立即查询该图书的库存。
接受订单并更新库存:库存中尚有该图书,工作人员便可接受顾客订单,并修改库存数量。
拒绝接受顾客订单:库存中若没有该图书,则拒绝接受顾客订单。
(6)查询图书的销售记录:图书网站的管理人员可查询近期图书的销售记录,为今后新书的采购和经营决策提供依据。
(7)维护员工信息:管理人员可对公司所有员工的基本信息进行查询、添加、删除和更新。
(8)采购新书:管理人员根据近期图书的销量情况采购新的图书。
(9)更新图书信息:对原有图书信息及时更新,删除无用图书信息。
树莓派程序自启动 前言树莓派程序自启动的几种方法1)将程序置于rc.local下2)通过.conifg文件夹下新建 *.desktop文件3)树莓派用服务器方式设置开机启动4)利用crontab -e定时查询(能实现自检)---- crontab简述 ----------操作步骤------ 文章目录 前言树莓派程序自启动的几种方法1)将程序置于rc.local下2)通过.conifg文件夹下新建 *.desktop文件3)树莓派用服务器方式设置开机启动4)利用crontab -e定时查询(能实现自检)---- crontab简述 ----------操作步骤------ 前言 记录之前使用过的几种树莓派程序自启动的相关操作。 树莓派程序自启动的几种方法 1)将程序置于rc.local下 这里假设在树莓派的 /home/pi/SIM8200_for_RPI/Goonline/ 路径下存在一个 simcom-cm 的可执行文件。并且我需要这个可执行文件每次开机都自动启动。
设置开机启动,打开树莓派开机配置脚本 sudo nano /etc/rc.local 将启动命令加入倒数第二行,注意是你的运行文件的绝对路径,也就是exit 0的上一行 sudo /home/pi/SIM8200_for_RPI/Goonline/simcom-cm & 注意一定要添加"&" 后台运行,否则可能会出现系统不能启动的情况
系统启动后,可通过ps命令查看进程是否存在。
ps -ef |grep simcom 从图片中可以看到程序已正常启动。
2)通过.conifg文件夹下新建 *.desktop文件 这个方式不用修改 rc.local 文件。机制上类似于 Windows 的“开始”菜单中的“启动”菜单。方法如下:
在 /home/pi/.config 下创建一个文件夹,名称为 autostart,并在该文件夹下创建一个xxx.desktop文件(文件名以.desktop结尾,前面可以自定义,这里假设为my.desktop)
cd ~/.config sudo mkdir autostart cd autostart sudo nano my.desktop 文件内容如下:
[Desktop Entry] Type=Application Exec=/home/pi/Desktop/Release/qm2 3)树莓派用服务器方式设置开机启动 这种方法主要是设置程序在初始化进程完成前就启动设置的脚本程序。实现步骤如下:
准备需要运行的python脚本
这里以一个简单树莓派控制LED灯闪烁为例,程序写好后还需增加权限 #!/usr/bin/env python import RPi.
这里写目录标题 Kubectl命令的使用creategetexposedeleteeditscaleautoscalecluster-infodescribelogsattachexecport-forwardcplabelapi-resourcesapi-versions 滚动更新、回滚更新回滚 Kubectl命令的使用 create 创建一个来源一个文件或标准输入的资源
[root@master ~]# kubectl create deployment b1 --image busybox deployment.apps/b1 created 创建好后查看,发现b1状态是ContainerCreating,表示正在拉镜像,如果你的镜像早早拉下来了,那它就直接启动了
[root@master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE b1-68578fbb6c-gzhn2 0/1 ContainerCreating 0 10s 过了一会再查看b1,发现是CrashLoopBackOff,表示已经退掉了,退掉了并不代表没运行,它是运行了,运行之后退出了;因为busybox默认是打开/bin程序,而/bin一执行就退出了,跟容器里面一样的,一启动就退出了。
[root@master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE b1-68578fbb6c-gzhn2 0/1 CrashLoopBackOff 3 102s 再创建一个b2,在命令后面加上一个-- date,过一会查看状态,发现也挂掉了,因为-- date命令也是一样的一执行就没了
[root@master ~]# kubectl create deployment b2 --image busybox -- date deployment.apps/b2 created [root@master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE b1-68578fbb6c-gzhn2 0/1 CrashLoopBackOff 7 14m b2-75d5678b7f-76zpc 0/1 CrashLoopBackOff 7 12m 再创建一个b3,还是在创建b1的命令后,加上-- sleep 6000,过了一会发现,运行起来了
请先允许我狠狠吐个槽:vue-socket.io相关中文博客实在太少太少,来来去去就那么几篇,教程也比较零散,版本也比较老,就算我有暴风式搜索还是找不到解决问题的方案,然后我怒了,开始看源码、写测试demo、几乎把相关的issues都看了一遍,折腾1天后终于。。。搞定了,下面总结一下~
考虑到很多小伙伴看完文章还是一头雾水或者无法复现方案,附加demo源码https://github.com/dreamsqin/demo-vue-socket.io一份,耗时一天~满意到话给我个start~感谢
前言
vue-socket.io其实是在socket.io-client基础上做了一层封装,将$socket挂载到vue实例上,同时你可以使用sockets对象轻松实现组件化的事件监听,让你在vue项目中使用起来更方便。我目前用的vue-socket.io:3.0.7,可以在其package.json中看到它依赖于socket.io-client:2.1.1。
我遇到的问题
websocket连接地址是从后端动态获取,所以导致页面加载时VueSocketIO实例还未创建,页面中通过this.$socket.emit发起订阅报错,同时无法找到vue实例的sockets对象(写在内部的事件将无法监听到,就算后面已经连接成功)
如果你的websocket连接地址是静态的(写死的),可以只看使用教程,如果你跟我遇到了同样的问题,那就跳跃到解决方案
console报错如下:
使用教程
先抛开可能遇到的问题,按照官网的教程我们走一遍:
安装
npm install vue-socket.io --save
引入(main.js)
import Vue from ‘vue’
import store from ‘./store’
import App from ‘./App.vue’
import VueSocketIO from ‘vue-socket.io’
Vue.use(new VueSocketIO({
debug: true,
connection: ‘http://metinseylan.com:1992’,
vuex: {
store,
actionPrefix: ‘SOCKET_’,
mutationPrefix: ‘SOCKET_’
},
options: { path: “/my-app/” } //Optional options
}))
new Vue({
router,
store,
render: h => h(App)
}).$mount(’#app’)
debug:生产环境建议关闭,开发环境可以打开,这样你就可以在控制台看到socket连接和事件监听的一些信息,例如下面这样:
connection:连接地址前缀,注意!这里只有前缀,我之前被坑过,因为明明后端有给我返回上下文,但莫名其妙的被去除了,vue-socket.io这里用到的是socket.io-client的Manager api,关键源码如下(只看我写中文备注的部分就好):
vue-socket.io(index.js)
import SocketIO from “socket.
文章目录 Part1 Meet Vue1. 安装2. hello world3. Vue lifecycle Part2 Basic Vue1. 插值操作2. 绑定属性 v-bind3. 计算属性4. 事件监听 v-on5. 条件和循环 v-show6. 表单绑定 v-model7. ES6语法补充let/varconstjavascript高阶函数换行字符串 Part3 Vue组件化开发1. 组件基础2. 组件高级3. 组件声明周期4. ES6模块化实现 Part4 Webpack1. 安装2. 简单使用3. 配置vue :star: Part5 Vue CLI安装 vue脚手架vue-cli 3 特点vue-cli 3 创建项目vue-cli 3 项目结构vue-cli 3 项目运行 Part6 vue-routerPart7 vuexPart8 axios Part1 Meet Vue 1. 安装 方式一:直接CDN引入 你可以选择引入开发环境版本还是生产环境版本
<!-- 开发环境版本,包含了有帮助的命令行警告 --> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <!-- 生产环境版本,优化了尺寸和速度 --> <script src="https://cdn.jsdelivr.net/npm/vue"></script> 方式二:下载和引入(前期学习使用这个,后续学习CLI使用NPM)
设计内容: 某乡有 A,B,C,D,E 5 个村庄,如下图所示,图中边上的权值表示两村之间的距离。现要在 5 个村庄中选某个村庄建立卫生所。其选址应使得距离卫生所最远的村庄到卫生所最近。
设计要求: (1) 给出各村庄之间最短距离的矩阵 A; (2) 卫生所应设在哪个村庄?输出各村庄到卫生所的路径和路径长度。
#include <iostream> #define N 100 using namespace std; void main() { char v[N] = { 0 };//存放顶点字母 int n; int e[N][N] = { 0 };//存放两地之间的距离 cout << "输入顶点个数" << endl; cin >> n; cout << "输入顶点字母" << endl; for (int i = 0; i < n; i++) cin >> v[i]; cout << "输入两地之间的距离" << endl; //输入邻接矩阵 for (i = 0; i < n; i++) for (int j = i + 1; j < n; j++) { cout << "
背景 通常通过restTemplate请求别人系统的接口时,如果返回是500,或者400等Http状态码,对程序来说是检测到了异常,只会提示500 null ,但是并不清楚接口返回的错误内容,要想打印出返回的错误内容,参考如下
实现 try{ ResponseEntity<String> result = restTemplate.postForEntity(url,httpEntity,String.class); }catch(Exception e){ if(e instanceof HttpStatusCodeException){ logger.error("请求异常,异常原因为{}",((HttpStatusCodeException) e).getResponseBodyAsString()); } }
1.方法重载:方法名相同,但方法的参数类型或数量不同
2.上转型对象有怎样的特点:
上转型对象不能操作子类新增的成员变量;
不能使用子类新增的方法。
上转型对象可以操作子类继承或者隐藏的成员变量,也可以使用子类继承的或者重写的方法。
上转型对象操作子类继承或重写的方法,其作用等价于子类对象去调用这些方法。
因此,如果子类重写了父类的某个方法,则当对象的上转型对象调用这个方法时
一定是调用了这个重写的方法
。
3.什么叫事务,JDBC处理事物的步骤:
1,事务是作为单个逻辑工作单元执行的一系列操作。
2,一个逻辑工作单元必须有四个属性,称为原子性、一致性、隔离性和持久性 (ACID) 属性,
只有这样才能成为一个事务
事务处理步骤:
3,conn.setAutoComit(false);设置提交方式为手工提交
4,conn.commit()提交事务
5,出现异常,回滚 conn.rollback();
5.常用的事件处理:
动作事件处理 焦点 鼠标 键盘
6.MouseListener接口有5个抽象方法,分别在什么时候触发:
在光标移入组件时;在光标移出组件时;鼠标按键被按下时;鼠标按键被释放时;
发生单击事件时;
7.JDBC操作的步骤?
加载数据库驱动类;打开数据库连接;执行sql语句;处理返回结果;关闭资源
8.表与表之间关系:一对一,一对多,多对多
9.什么是set集合?
set集合为集类型,集是最简单的一种集合,存在集中的对象不按特定方式排序 ,
只是简单把对象加入集合中,类似于向口袋里放东西
10.简述addall()方法和removeall()方法的用途?
addall方法用来将指定集合中的所有对象添加到该集合中;
removeall方法用来从该集合中移除同时包含在指定集合中的对象;
文章目录 一、ELK概述1、ELK简介2、ELK组成3、为什么要使用ELK4、完整日志系统的基本特征5、ELK的工作原理 二、ELK Elasticsearch 集群部署(在Node1、Node2节点上操作)1、环境准备2、部署 Elasticsearch 软件img3、安装 Elasticsearch-head 插件img4、 ELK Logstash 部署(在 Apache 节点上操作)img5、 ELK Kiabana 部署(在 Node1 节点上操作)img6、Filebeat+ELK 部署 一、ELK概述 1、ELK简介 ELK平台是一套完整的日志集中处理解决方案,将ElasticSearch、Logstash和Kiabana三个开源工具配合使用,完成更强大的用户对日志的查询、排序、统计需求。
2、ELK组成 (1)ElasticSearch
• 是基于Lucene(一个全文检索引擎的架构)开发的分布式存储检索引擎,用来存储各类日志
• Elasticsearch是用Java开发的,可通过RESTful Web接口,让用户可以通过浏览器与Elasticsearch通信
• Elasticsearch是个分布式搜索和分析引擎,优点是能对大容量的数据进行接近实时的存储、搜索和分析操作
• Elasticsearch可以划分为三种:主节点、数据节点和客户端节点
1、master主节点: elasticsearch.yml: node.master:true node.data:false 主要功能:维护元数据,管理集群节点状态;不负责数据写入和查询 配置要点:内存可以相对小一些,但是机器一定要稳定,最好是独占的机器 2、data数据节点 elasticsearch.yml: node.master:false node.data:true 主要功能:负责数据的写入与查询,压力大 配置要点:大内存,最好是独占的机器 3、client客户端节点 elasticsearch.yml: node.master:true node.data:true 主要功能:综合上述三个节点的功能。 配置要点:大内存,最好是独占的机器。 特别说明:不建议这种配置,节点容易挂掉 4、一般配置主节点3台服务器,数据节点与客户端节点配置比例一般在3:1左右,根据实际情况调节 (2)Logstash
• 作为数据收集引擎。它支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,然后存储到用户指定的位置,一般会发送给Elasticsearch
• Logstash由JRuby语言编写,运行在Java虚拟机(JVM)上,是一款强大的数据处理工具,可以实现数据传输、格式处理、格式化输出。Logstash具有强大的插件功能,常用于日志处理
(3)Kibana
是基于Node.js开发的展示工具,可以为Logstash和ElasticSearch提供图形化的日志分析Web界面展示,可以汇总、分析和搜索重要数据日志
(4)Filebeat
轻量级的开源日志文件数据搜集器。通常在需要采集数据的客户端安装 Filebeat,并指定目录与日志格式,Filebeat就能快速收集数据,并发送给logstash进行解析,或是直接发给Elasticsearch存储,性能上相比运行于JVM上的loqstash优势明显,是对它的替代
3、为什么要使用ELK (1)日志主要包括系统日志,应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及。错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误
(2)往往单台机器的日志我们使用grep、awk等工具就能基本实现简单析,但是当日志被分散的储存不同的设备上。如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志。这样感觉很繁琐和效率低下
(3)当务之急我们使用集中化的日志管理,例如∶开源的syslog,将所有服务器上的日志收集汇总。集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,一般我们使用grep、awk和wc等Linux命令能实现检索和统计,但是对于要求更高的查询、排序和统计等要求和庞大的机器数量依然使用这样的方法难免有点力不从心
(4)一般大型系统是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,可以提高定位问题的效率
63个投票调查PHP源码下载链接:https://pan.baidu.com/s/1ToBUwHrCUDVWN-cW-cVG9g 提取码:xfuy
PHP投票调查源码 分享63个投票调查PHP源码,总有一款适合你
下面是文件的名字,我放了一些图片,文章里不是所有的图主要是放不下...,大家下载后可以看到。
LimeSurvey 开源问卷调查正式版php源码 v3.27.23
LimeSurvey php开源问卷调查系统 v5.2.0 正式版
PESCMS Ticket开源客服工单系统 v1.3.12
PHP得推投票比赛系统 v1.0
PHP得推考试系统 v1.2
响应式投票评选系统(支持微信) v3.2.1 礼物献花版
LimeSurvey问卷调查管理系统 V4.3.19 中文版
PHP微信公众号投票活动系统源码 独立版
盾灵投票吸粉系统(防刷版)V1.0
宜软通投票管理系统 PHP版 v1.1
支持Ajax星星投票的PHP无刷新评论程序源码 v1.0
免费微信投票管理系统源码 php版 v2.0
响应式投票系统(支持微信、手机) php版 v3.2
微信投票系统 v3.0
wordpress主题:问答类主题 v3.9
俏迅VMS投票管理系统 php版 v1.0
EnableQ php在线问卷调查引擎 V8.20
夏日PHP+mysql投票系统 v1.1
逆袭猴织梦笑话网大拇指插件 php版 v1.0
PHPlot 创建图表的PHP图形类 v6.1.0
php网上评选投票系统 v1.0
LimeSurvey 2.00+ build121121 php投票调查系统
queXML php问卷调查 v1.3.9
一贝php图片投票管理系统 v6.8 build 20110905 (防刷票版)
eclipse中对此方法的解释如下:
Returns whether or not this mouse event is the popup menu trigger event for the platform.
Note: Popup menus are triggered differently on different systems. Therefore, isPopupTrigger should be checked in both mousePressed and mouseReleased for proper cross-platform functionality.
Returns:
boolean, true if this event is the popup menu trigger for this platform
大致意思为:
如果该mouseEvent触发了平台中的popup menu,则返回true,否则返回false。需要注意的是:popup menu在不同系统中的触发条件并不相同。因此,为了正确实现跨平台功能,必须同时监听mousePressed(鼠标按下)和mouseReleased(鼠标释放)两个动作,以此来确保能够检测到isPopupTrigger。(具体代码见示例)
实战中在windows环境下,注释掉mousePressed方法,也可以触发popup menu,即只需要mouseReleased即可触发。
JPopupMenu jPopupMenuOne; MouseListener popupListener = new PopupListener(jPopupMenuOne); class PopupListener extends MouseAdapter{ JPopupMenu popupMenu; public PopupListener(JPopupMenu popupMenu) { this.
原文链接:
python读取电脑识别码_三更雪的博客-CSDN博客_python获取机器码
机缘巧合下,看见了这篇文章。就copy下来,想运行一下。结果上班看了1,2天代码终于看懂了(我是新手),bug也解决好几天,就想着记录一下,顺便加点注释。总体代码在最后。
目录
一、注释
二、总体代码
一、注释 1、引入模块
import wmi import json import base64 from pyDes import * 这里可能引入会报下面的错,我的原因是因为pywin32的版本不对,不在过多赘述,具体查看import win32api; ImportError: DLL load failed: 找不到指定的程序_TaiBai_435_的博客-CSDN博客
ImportError: DLL load failed while importing win32api: 找不到指定的程序。
2、定义函数:设置key和自定iv向量
def __init__(self): self.Des_Key = "DESCRYPT" # Key self.Des_IV = "\x15\13\x2a\3\1\x23\2\0" # 自定IV向量 3、定义加密函数Encrypted():通过上面key和iv向量
def Encrypted(self, tr): k = des(self.Des_Key, CBC, self.Des_IV, pad=None, padmode=PAD_PKCS5) EncryptStr = k.encrypt(tr) return base64.b64encode(EncryptStr) # 返回base64编码的值 4、定义函数:获取cpu,硬盘,主板序列号和mac地址
# cpu 序列号 def get_CPU_info(self): cpu = [] cp = s.