一个非常方便的视频<->图片互转工具:视频截帧、帧图片合成视频、添加水印/字幕等。
分类目录归档:研发dev
如何使用gdb分析c++ core
一、概述
使用c++开发程序时,经常会遇到运行中core的情况,如果是偶发的就更加难以定位,本文讲解如何使用gdb进行core位置的分析定位。
Jupyter Notebook支持多python版本
jupyter notebook里的代码有py2.7也有py3.0的,本文讲解如何使jupyter同时支持多个python版本(python2.7.5 + python3.6.2)。
Keras: 基于 Python 的深度学习库
Keras 是一个用 Python 编写的高级神经网络 API,它能够以 TensorFlow, CNTK, 或者 Theano 作为后端运行。Keras 的开发重点是支持快速的实验。能够以最小的时延把你的想法转换为实验结果,是做好研究的关键。
python skimage图像处理
skimage即是Scikit-Image。基于python脚本语言开发的数字图片处理包,比如PIL,Pillow, opencv, scikit-image等。 PIL和Pillow只提供最基础的数字图像处理,功能有限;opencv实际上是一个c++库,只是提供了python接口,更新速度非常慢。scikit-image是基于scipy的一款图像处理包,它将图片作为numpy数组进行处理,与matlab一样。
LSM VS B-Tree
LSM树整个结构不是有序的,所以不知道数据在什么地方,需要从每个小的有序结构中做二分查询,找到了就返回,找不到就继续找下一个有序结构。所以说LSM牺牲了读性能。但是LSM之所以能够作为大规模数据存储系统在于读性能可以通过其他方式来提高,比如读取性能更多的依赖于内存/缓存命中率而不是磁盘读取。
TiDB 开源分布式关系型数据库
概述:https://blog.csdn.net/D_Guco/article/details/80641236
MySQL vs RocksDB vs TiDB 完全版性能测试:http://liky.farbox.com/post/tidb
三大主流软件负载均衡器对比(LVS vs Nginx vs Haproxy)
三大主流软件负载均衡器对比(LVS vs Nginx vs Haproxy)
nginx配置https
最近做点小程序,服务端api必须是https域名,配置方法如下:
创建ssh证书
自己生成CA证书:(自己生成的根证书浏览器不认,会提示不安全,但https可访问)
cd /home/openssl
openssl genrsa -des3 -passout pass:123456 -out test.pem 2048 #生成RSA私钥
openssl rsa -passin pass:123456 -in test.pem -out test.key #提取密钥中的公钥
openssl req -new -key test.key -out test.csr -subj /C=CN/ST=beijing/L=beijing/O=YAN/CN=www.yanjingang.com #生成证书请求文件
openssl x509 -req -days 365 -in test.csr -signkey test.key -out test.crt #生成自签名证书
openssl x509 -in test.crt -noout -text #查看证书文件
阿里云、百度云有免费的单域名DV证书(下载注意选择nginx版本证书)
深入理解PHP7内核之zval
PHP7已经发布, 如承诺, 我也要开始这个系列的文章的编写, 主要想通过文章让大家理解到PHP7的巨大性能提升背后到底我们做了什么, 今天我想先和大家聊聊zval的变化.
教娃学编程—1.入门概念、int变量、if判断、函数
程序概念、int变量、if判断、函数概念
#include <stdio.h>
int main()
{
/* YJY */
int num = 1;
printf("%d\n", num);
if(num == 1){
printf("YJY\n");
}else{
printf("YAN\n");
}
/* jiafa lianxi */
int num1 = 89;
int num2 = 107689;
int result = sum(num1, num2);
printf("%d\n", result);
return 0;
}
/* sum */
int sum(int num1, int num2){
return num1+num2;
}
2018.10.20
安全加密算法选择指南
用途 | 推荐使用的安全的密码算法 | 常见的不安全的密码算法 |
对称加密 | AES(密钥长度>=128bits) | DES、3DES、RC2、RC4 |
哈希算法 | SHA256或以上 | MD5、SHA1 |
非对称加密 | RSA(密钥长度>=2048bits) | RSA(密钥长度<=1024bits) |
数字签名 | RSA(密钥长度>=2048bits) | RSA(密钥长度<=1024bits) |
密钥交换 | DH(密钥长度>=2048bits) | DH(密钥长度<=1024bits) |
备注:
1. AES不建议使用ECB(同样的明文总是会产生相同的密文),推荐使用CBC模式。
2. 应注意编码及加密的区别,例如base64属于编码而不属于加密。
3. 加解密中建议使用安全随机数,如java.security.SecureRandom,类Unix系统 (包括OS X): /dev/random;不安全随机数如C标准函数random(),java.util.Random()。
4. 不建议使用私有、非标准化的加解密方式。
密码保护:压测工具uload
小猪学AI—线性回归之房价预测
上次我们进行了简单的环境安装和模型应用尝试,今天开始通过paddlepaddle的房价预测看一下简单的线性回归有监督模型是怎么训练出来的。
matplotlib绘图学习 Mark
Jupyter Notebook 快速入门
Jupyter Notebook(此前被称为 IPython notebook)是一个交互式笔记本,支持运行 40 多种编程语言。在本文中,我们将介绍 Jupyter notebook 的主要特性,以及为什么对于希望编写漂亮的交互式文档的人来说是一个强大工具。
史上最详细的iptables说明
# 限制redis端口只能被制定ip访问
vim /etc/sysconfig/iptables
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
#-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#-A INPUT -p icmp -j ACCEPT
#-A INPUT -i lo -j ACCEPT
#-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
#-A INPUT -j REJECT --reject-with icmp-host-prohibited
#-A FORWARD -j REJECT --reject-with icmp-host-prohibited
# 除127.0.0.1、10.10.67.77这两台机器外禁止链接本机redis 6379端口
-A INPUT -s 127.0.0.1 -p tcp --dport 6379 -j ACCEPT
-A INPUT -s 10.10.67.77 -p tcp --dport 6379 -j ACCEPT
-A INPUT -p TCP --dport 6379 -j REJECT
COMMIT
service iptables restart
service iptables status
小猪手把手教你搭建MongoDB分片+副本集群
分片为应对高吞吐量与大数据量提供了方法。使用分片减少了每个分片需要处理的请求数,因此,通过水平扩展,集群可以提高自己的存储容量和吞吐量。
MongoDB内置了非常棒的分片与副本集机制以及无结构文档的特性,并迅速崛起为最受欢迎的Nosql数据库(db ranking),尤其是它的分片机制非常值得学习(MongoDB官方文档)。
MongoDB Shard分片:
mongodb分片可以非常方便的实现大规模存储集群并易于扩展。
mongo的分片集群架构设计:
(1)mongos :前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。
(2)config server:mongod实例,存储了整个 ClusterMetadata,其中包括 chunk信息。
(3)shard:用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个replica set承担,防止主机单点故障。
同库内分片表与非分片表共存 :
根据分片键值 划分为 多个块区间,块内数据超过指定大小后单块区间会裂变为多个块区间:(MongoDB在超出配置的块大小时会拆分块。插入和更新都可以触发块拆分。)
块划分到不同分片,默认规则为每个分片保持相同的块数:(需要多地域机房部署,建议分片键前缀稳定的地域字段,这样可以使数据存储和请求发送到对应地域的分片中)
分片数据不均匀时,均衡器负责在分片间移动块,并修改分片块配置。(均衡器一次只迁移一个块,但依然可能会对性能有一定影响)
MongoDB Replica副本集:
可以非常方便的实现主从复制和故障自动切换。
mongo副本集特性:
(1)N 个节点的集群
(2)任何节点可作为主节点
(3)所有写入操作都在主节点上
(4)自动故障转移
(5)自动恢复
mongo副本集节点包含以下三类角色:
(1)主节点(Primary):是 Replica Set 中唯一接收写请求的节点,并将写入指令记录到 oplog 上。副本节点通过复制 oplog 的写入指令同步主节点的数据。Secondary。一个 Replica Set 有且只有Primary 节点,当Primar挂掉后,其他 Secondary 或者 Arbiter 节点会重新选举出来一个主节点。应用程序的默认读取请求也是发到 Primary节点处理的。
(2)副本节点(Secondary):通过复制主节点 oplog 中的指令与主节点保持同样的数据集,当主节点挂掉的时候,参与主节点选举。需要注意副本节点不建议用于读写分离,同步延迟时会有数据不一致的情况,建议只用于HA故障快速切换、数据备份、非时效性数据分析等。读写分离问题通过shard分散压力解决。
(3)仲裁者(Arbiter):不存储实际应用数据。与其他members保持心跳连接,持有一个投票配额(在members为偶数时增加arbiter节点为奇数可以加快primary多少派意见达成),只投票参与选取主节点,但不会被选举成为主节点。
副本集的最小的部署单位可以为“primary + secondary + arbiter”,或者为“primary + 2*secondaries”,已经基本可以满足HA的需要。建议3个meembers即可,如确实需要更多,需要尽可能保证members个数为奇数,且至少有2个member保存数据。一个复制集集群内最多支持50个members,但是最多只能有7个可以投票。
典型的“Primary主 + Secondary从+ Arbiter辅助投票”:
典型的“Primary主 + 2*Secondary从”故障转移:
下边主要讲解一下实际搭建mongodb分片+副本集集群的具体过程。
一、下载mongodb
mkdir -p /home/work/mongodb/bin/
cd /home/work/mongodb/bin/
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.2.22.tgz
tar zxvf mongodb-linux-x86_64-3.2.22.tgz
二、mongodb集群配置
测试集群拓扑结构:
server0作为route入口;后置server1/server2/server3为数据存储及仲裁服务器,各3个分片,互为主从。
python使用esmre代替ahocorasick实现ac自动机[多模匹配]
为什么会用AC自动机? 如果你想知道一篇文章有没有你要过滤的敏感词,怎么办? 不可能用正则一个个的匹配吧? 敏感词超过300个之后,用Trie来构建模式树 (字典树)的速度优势相当的明显… …
特别说下,trie图也是一种DFA,可以由trie树为基础构造出来,对于插入的每个模式串,其插入过程中使用的最后一个节点都作为DFA的一个终止节点。
如果要求一个母串包含哪些模式串,以用母串作为DFA的输入,在DFA 上行走,走到终止节点,就意味着匹配了相应的模式串。
ps: AC自动机是Trie的一种实现,也就是说AC自动机是构造Trie图的DFA的一种方法。还有别的构造DFA的方法…
不扯淡了,我们后端都是python写的,python的ahocorasick模块跟我们的业务不太匹配,问题是这样的 ! 如果你的服务是用来做敏感词匹配,也就是说所有文章里面只要含有一个关键词,那就说明匹配了。 但是我们的业务是文章中的所有能匹配到的关键词都一一的抽取出来。 我想有些朋友可能还不太明白,那么我举个例子, 如果我的关键词里面有宝马和马,那么用python的ahocorasick库只会得到宝马,而不会得到马。 问题是处在马这个字节是在宝马的链条里面的。 如何避开这个问题,我们也懒得自己重写了,已经有人给出了解决的模块。 已经测试完成,并上线使用了。
安装简单,直接pip install esmre
import esm
index = esm.Index()
index.enter("宝马")
index.enter("马")
index.enter("奔驰")
index.enter("保时捷")
index.fix()
index.query("哎呀,今天在楼下看到了宝马,我老家倒是有养马的,以前的邻居有个奔驰,不对是保时捷,大爷的,都是马")
再来一个完整的例子. 后续有时间我会把ac自动机的服务集成到rpc服务里面,然后用docker打包。
#coding:utf-8
import esm
index = esm.Index()
with open('keyword.config','r') as f:
for i in f.readlines():
index.enter(i.strip())
index.fix()
str = """
head&shoulders海飞丝Hershey‘s
Loreal欧莱雅LUX2
力士
L’OREALMagic2
美即
MysteryCity
谜城
NO.1BABY2
RESIN
SANXIAO
SHISEIDO FINE TOILETRY2
SKII美之匙
Tao yu tang2
淘雨堂
whoo倍加洁
卡尔林奈
娇韻诗
德国帮宝适
Perfect puff2
See Young2
落健
高夫
"""
data = index.query(str)
print data
测了几天,性能还是可以的,500KB的文章,6000多个关键词,消耗的时间在0.002左右,相比ahocorasick一点都不差的。 观察了下,esmre是没有发现内存异常泄露等问题。
[2015-06-12 23:34:01,043] INFO extractor "Get keywords takes 0.0003 seconds"
[2015-06-12 23:34:01,069] INFO extractor "Get keywords takes 0.0002 seconds"
[2015-06-12 23:34:01,178] INFO extractor "Get keywords takes 0.0002 seconds"
[2015-06-12 23:34:02,372] INFO extractor "Get keywords takes 0.0002 seconds"
[2015-06-12 23:34:02,386] INFO extractor "Get keywords takes 0.0012 seconds"
[2015-06-12 23:34:02,631] INFO extractor "Get keywords takes 0.0002 seconds"
[2015-06-12 23:34:03,656] INFO extractor "Get keywords takes 0.0021 seconds"
[2015-06-12 23:34:03,744] INFO extractor "Get keywords takes 0.0001 seconds"
[2015-06-12 23:34:03,785] INFO extractor "Get keywords takes 0.0001 seconds"
[2015-06-12 23:34:03,910] INFO extractor "Get keywords takes 0.0002 seconds"
[2015-06-12 23:34:04,031] INFO extractor "Get keywords takes 0.0002 seconds"
[2015-06-12 23:34:05,004] INFO extractor "Get keywords takes 0.0035 seconds"
[2015-06-12 23:34:05,579] INFO extractor "Get keywords takes 0.0055 seconds"
[2015-06-12 23:34:05,602] INFO extractor "Get keywords takes 0.0005 seconds"
[2015-06-12 23:34:05,662] INFO extractor "Get keywords takes 0.0010 seconds"
[2015-06-12 23:34:06,125] INFO extractor "Get keywords takes 0.0002 seconds"
[2015-06-12 23:34:06,299] INFO extractor "Get keywords takes 0.0002 seconds"
[2015-06-12 23:34:06,404] INFO extractor "Get keywords takes 0.0003 seconds"
[2015-06-12 23:34:07,396] INFO extractor "Get keywords takes 0.0002 seconds"
[2015-06-12 23:34:07,595] INFO extractor "Get keywords takes 0.0004 seconds"
[2015-06-12 23:34:08,725] INFO extractor "Get keywords takes 0.0015 seconds"
[2015-06-12 23:34:09,504] INFO extractor "Get keywords takes 0.0004 seconds"
[2015-06-12 23:34:09,515] INFO extractor "Get keywords takes 0.0005 seconds"
[2015-06-12 23:34:10,650] INFO extractor "Get keywords takes 0.0002 seconds"
[2015-06-12 23:34:11,206] INFO extractor "Get keywords takes 0.0003 seconds"
[2015-06-12 23:34:12,298] INFO extractor "Get keywords takes 0.0002 seconds"
[2015-06-12 23:34:12,319] INFO extractor "Get keywords takes 0.0001 seconds"
[2015-06-12 23:34:13,547] INFO extractor "Get keywords takes 0.0006 seconds"
[2015-06-12 23:34:13,853] INFO extractor "Get keywords takes 0.0005 seconds"
Docker—概述
2013年发布至今, Docker 一直广受瞩目,被认为可能会改变软件行业。
但是,许多人并不清楚 Docker 到底是什么,要解决什么问题,好处又在哪里?本文就来详细解释,帮助大家理解它,还带有简单易懂的实例,教你如何将它用于日常开发。
一、环境配置的难题
软件开发最大的麻烦事之一,就是环境配置。用户计算机的环境都不相同,你怎么知道自家的软件,能在那些机器跑起来?
用户必须保证两件事:操作系统的设置,各种库和组件的安装。只有它们都正确,软件才能运行。举例来说,安装一个 Python 应用,计算机必须有 Python 引擎,还必须有各种依赖,可能还要配置环境变量。
如果某些老旧的模块与当前环境不兼容,那就麻烦了。开发者常常会说:”它在我的机器可以跑了”(It works on my machine),言下之意就是,其他机器很可能跑不了。
环境配置如此麻烦,换一台机器,就要重来一次,旷日费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。
1. 虚拟机
虚拟机(virtual machine)就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统,比如在 Windows 系统里面运行 Linux 系统。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。
虽然用户可以通过虚拟机还原软件的原始环境。但是,这个方案有几个缺点。
(1)资源占用多
虚拟机会独占一部分内存和硬盘空间。它运行的时候,其他程序就不能使用这些资源了。哪怕虚拟机里面的应用程序,真正使用的内存只有 1MB,虚拟机依然需要几百 MB 的内存才能运行。
(2)冗余步骤多
虚拟机是完整的操作系统,一些系统级别的操作步骤,往往无法跳过,比如用户登录。
(3)启动慢
启动操作系统需要多久,启动虚拟机就需要多久。可能要等几分钟,应用程序才能真正运行。
2. Linux 容器
由于虚拟机存在这些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。
Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。
由于容器是进程级别的,相比虚拟机有很多优势。
(1)启动快
容器里面的应用,直接就是底层系统的一个进程,而不是虚拟机内部的进程。所以,启动容器相当于启动本机的一个进程,而不是启动一个操作系统,速度就快很多。
(2)资源占用少
容器只占用需要的资源,不占用那些没有用到的资源;虚拟机由于是完整的操作系统,不可避免要占用所有资源。另外,多个容器可以共享资源,虚拟机都是独享资源。
(3)体积小
容器只要包含用到的组件即可,而虚拟机是整个操作系统的打包,所以容器文件比虚拟机文件要小很多。
总之,容器有点像轻量级的虚拟机,能够提供虚拟化的环境,但是成本开销小得多。
二、Docker 是什么?
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。
Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。
总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
1. Docker 的用途
Docker 的主要用途,目前有三大类。
(1)提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。
(2)提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。
(3)组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。
2. Docker的架构
Docker 镜像(Images) | Docker 镜像是用于创建 Docker 容器的模板。 |
Docker 容器(Container) | 容器是独立运行的一个或一组应用。 |
Docker 客户端(Client) | Docker 客户端通过命令行或者其他工具使用 Docker API (https://docs.docker.com/reference/api/docker_remote_api) 与 Docker 的守护进程通信。 |
Docker 主机(Host) | 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。 |
Docker 仓库(Registry) | Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。
Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。 |
Docker Machine | Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。 |
3. Docker 的安装
Docker 是一个开源的商业产品,有两个版本:社区版(Community Edition,缩写为 CE)和企业版(Enterprise Edition,缩写为 EE)。企业版包含了一些收费服务,个人开发者一般用不到。下面的介绍都针对社区版。
Docker CE 的安装请参考官方文档。
3.1 Mac安装docker
a.下载mac版本的docker