分类目录归档:开发dev

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之所以能够作为大规模数据存储系统在于读性能可以通过其他方式来提高,比如读取性能更多的依赖于内存/缓存命中率而不是磁盘读取。 阅读全文

如何搭建一个ssdb高可用集群

概述

ssdb是一个大规模持久化kv存储,类似redis,只是存储介质增加了ssd+sata,适合写入redis数据和qps规模较大,数据读取占比较小,想降低redis内存服务器购买成本,同时使读写性能上损失小些。有朋友公司使用了1T+的ssdb,想实现高可用方案,一直比较忙… 这两天终于有空研究了一下,给一个简单的多主水平分片+主从热备+读写分离代理解决方案

SSDB

SSDB 是一个 C/C++ 语言开发的高性能 NoSQL 数据库, 支持 KV, list, map(hash), zset(sorted set) 等数据结构, 用来替代或者与 Redis 配合存储十亿级别列表的数据。

特点:

1.底层的LevelDB使用LSM存储引擎,相比与关系数据库的B-Tree,写性能更好,而牺牲了部分的读性能。适合写多读少的场景,或读热key相对集中,缓存命中率较高的场景。

2.LSM树整个结构不是有序的,所以不知道数据在什么地方,需要从每个小的有序结构中做二分查询,找到了就返回,找不到就继续找下一个有序结构。在缓存命中率较低时,磁盘读取性能较差。故单个分片容量不宜过大,否则磁盘读性能不可接受

github:https://github.com/ideawu/ssdb

SSDB中文手册:http://ssdb.io/zh_cn/

SSDB入门基础:https://github.com/ideawu/ssdb-docs/blob/master/pdf/SSDB%E5%85%A5%E9%97%A8%E5%9F%BA%E7%A1%80.pdf

TwemProxy 阅读全文

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版本证书)

nginx配置

vim conf/vhost/php.conf
  listen 8080;      #监听8080端口http
  listen 8443 ssl;  #同时监听8443端口https
  #开启ssl并设置证书
  ssl on;
  ssl_certificate /home/openssl/www.yanjingang.crt;
  ssl_certificate_key /home/openssl/www.yanjingang.key;

重启nginx后使用https://www.yanjingang.com:8443端口访问即可(注:私人生成的证书会提示不安全,忽略即可)。

https端口转发

#80->8080、443->8443 端口转发
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8443

service iptables save
iptables -L -t nat  	#查看当前nat规则
	Chain PREROUTING (policy ACCEPT)
	target     prot opt source               destination         
	REDIRECT   tcp  --  anywhere             anywhere             tcp dpt:http redir ports 8080
	REDIRECT   tcp  --  anywhere             anywhere             tcp dpt:https redir ports 8443

注:公网80、443、8080、8443等端口需要在aliyun安全组中入方向打开才可访问

使用https://www.yanjingang.com即可访问

看到这里满足需求的离开即可,遇到微信小程序TLS1.2问题的往后看。

在完成以上步骤后发现,https已经是安全的,百度小程序api调用也正常,但是微信小程序api调用提示“对应的服务器 TLS 为 TLS 1.0 ,小程序要求的 TLS 版本必须大于等于 1.2 。”

Nginx TLS 1.2配置

1.openSSL 版本需要 >= 1.0.2
  openssl version -a
2.nginx 版本为 0.7.65,0.8.19 及更高版本
  nginx -V
3.nginx是使用的openssl 1.0.2+编译的
  nginx -V |grep openssl
4.nginx tls1.2配置
  ssl_session_timeout 5m;
  ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_prefer_server_ciphers on;

实际情况是我们的server使用内部自研开发框架,nginx编译依赖很多内部插件,且使用openssl 1.0.1编译的,所以怎么设置TLS都是1.0,nginx -V如下:

解决方法:

1.长线方案
下载内部插件源码自己使用openssl1.0.2重新编译nginx
2.短线方案
使用外部openssl1.0.2编译的nginx做代理,将iptables端口删除,转发改为nginx代理转发
#设置nginx代理server
vim proxyserver/conf/proxy.conf
    #80->8080端口转发
    server {
        listen              80;
        server_name         _;

        access_log  /home/proxyserver/log/proxyserver.log;
        error_log  /home/proxyserver/log/proxyserver.log.wf;

        location / {
            proxy_set_header Host $http_host;
            proxy_set_header X-Host $http_host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X_ORIG_URI $request_uri;
            proxy_set_header CLIENTIP $remote_addr;
            proxy_set_header X-Forwarded-For-Proto https;
            proxy_set_header Https 1;

            proxy_pass http://127.0.0.1:8080;

        }
    }
    #443->8080端口转发
    server {
        listen              443 ssl;
        server_name         _;

        access_log  /home/proxyserver/log/proxyserver.log;
        error_log  /home/proxyserver/log/proxyserver.log.wf;

        #开启https ssl
        ssl on;
        ssl_certificate      /home/openssl/cert-1542784817162_www.yanjingang.com.crt;
        ssl_certificate_key  /home/openssl/cert-1542784817162_www.yanjingang.com.key;
        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;

        location / {
            proxy_set_header Host $http_host;
            proxy_set_header X-Host $http_host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X_ORIG_URI $request_uri;
            proxy_set_header CLIENTIP $remote_addr;
            proxy_set_header X-Forwarded-For-Proto https;
            proxy_set_header Https 1;

            proxy_pass http://127.0.0.1:8080;

        }
    }
#启动代理nginx
/usr/sbin/nginx -c /home/proxyserver/conf/proxy.conf

#删除iptables端口转发
iptables -t nat -D PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
iptables -t nat -D PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8443
service iptables save
iptables -L -t nat
#删除nginx webserver的8443端口监听和ssl配置并重启

#使用https://www.yanjingang.com验证TLS1.2和小程序调用

重启小程序开发工具后测试调用成功,收工~!

yan 18.11.21 22:00

资料:

openssl 非对称加密算法RSA命令详解:https://www.cnblogs.com/gordon0918/p/5363466.html

openssl 证书请求和自签名命令req详解:https://www.cnblogs.com/gordon0918/p/5409286.html

微信小程序要求的TLS版本大于等于1.2的问题:https://www.cnblogs.com/xjnotxj/p/7252043.html

教娃学编程—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. 不建议使用私有、非标准化的加解密方式。

研发人员的3个技术方向

产品:
以业务需求为主要驱动力,其涉及到的问题往往来自于复杂的业务逻辑和功能的快速上线需求,即其难点主要来自于对产品的理解把握和需求的快速响应能力,对于大数据高并发的系统要求并非其主要考核点。典型的部门为:社区组、fe、客户系统、mi、客户端产品等。面向内部的一些需求,如一些内部平台的开发也划入此类。

工程:
以解决规模、压力等工程技术问题为主要驱动力,其涉及到的问题往往是公司大型基础平台类服务、支持业务实现在大数据量和高并发的server端服务,以及处于支持业务快速迭代而进行业务抽象构建通用服务等工作。另外,不属于算法分组,且不属于产品分组的,均可以归为工程组。这包括op、sys、qa及其他一些方向。

算法:
通过算法策略的设计调优使业务能够获得更好满意度,既包括提高准确率、召回率等优化效果的工作,也包括改进算法逻辑、降低时空复杂性等优化性能的工作。通常通过对数据的统计分析、case的跟踪分析等方法,采用规则策略和(或)统计学习等技术实现。涉及的部门包括面向各产品业务的策略团队及面向通用技术研发的基础团队,典型部门为nlp、rank、ecom策略团队等。