- 博客(52)
- 资源 (2)
- 收藏
- 关注
原创 SpringBoot配置走数据库(自定义配置源)
SpringBoot配置走数据库(自定义配置源)SpringBoot配置走数据库(自定义配置源)有时候我们想更改一些配置而又不像重新修改yml或者properties文件重新打包,除了springcloud的config之外,我们可以把配置写在数据库中通过 @Value("${xxx.xxx}")的方式去使用。Mysql定义配置表格DROP TABLE IF EXISTS `tb_system_properties`;CREATE TABLE `tb_system_properties`
2021-04-21 16:47:41
883
原创 SpringBoot Mysql主从读写分离(主从,Mybatis,ShardingSphere )
目前我们有项目需要用到主从读写分离,以前的做法是配置多数据源,还要侵入业务这种方法比较不够灵活。经过了一番研究决定使用shardingsphere来实现读写分离和主从,基本上只要简单的配置就可以了,兼容Mybatis。注意,下文的代码都是假设读者已经配置好Mysql主从机器的情况下。Apache ShardingSphere 是一套开源的分布式数据库解决方案组成的生态圈,它由 JDBC、Proxy 和 Sidecar(规划中)这 3 款既能够独立部署,又支持混合部署配合使用的产品组成。 它们均提供标准化的
2021-02-01 19:16:54
885
原创 浏览器播放RTSP
浏览器播放RTSP由于现在浏览器不直接支持RTSP,然后很多监控厂商如海康大华等又不提供RTMP的情况下,项目需要实现HTML中播放监控视频。之前做过转流的方案,在服务器中把RTSP转成RTMP,这种方案开发量大而且转码不稳定,同时消耗大量的带宽资源。最后问了做浏览器内核的同学,他说可以试试ppapi技术,顺藤摸瓜,真的有用ppapi实现的native client,VXG Media Player。同时也有同学实现了demo:https://github.com/aitexiaoy/rtsp_chro
2020-10-28 15:09:03
3633
2
原创 SpringBoot NULL转“”(空字符串)
#SpringBoot NULL转“”(空字符串)有时候前端的同学要求把String类型为NULL变成空字符串“”返回给他们,然而我们又不能简单的把全局的所有的类型为NULL的对象都这么去处理,而且也不能在非Http请求中这么返回,因为严格来说NULL并不等于“”,可能会引发意想不到的错误,所以我们只需要在Http访问的时候把JSON的String返回去。所以参考下面一篇文章,但是引用的文章中会...
2020-03-24 10:12:10
3409
原创 JAVA实现简单的切面注解
背景今天在分析同事遇到一个springboot的注解和方法锁一起用而导致的问题(@Transaction和synchronized用在同一个方法中由于事务先于锁进入后于锁释放而可能引发的数据问题)中而突然思考到spring的Aspect是怎么样的执行顺序,本文介绍java中其中一种(InvocationHandler)利用动态代理的方式实现的代理的方法,从而类似的机制我们推测出spring的切面...
2019-08-22 00:31:07
18029
原创 本地调试微信公众号授权
如何在本地进行微信公众号授权调试原因最近前端同事开发微信公众号,接近后期,当涉及到授权登录,支付等等的时候js就会校验安全域名和ip,那么就意味每次同事做了更改都要把微信公众号打包部署到线上服务器才能调试了,来来去去很郁闷。于是我建议用内网穿透的方式来让他实现本地调试。怎么做首选需要一个ngrok或者花生壳,才能够实现内网穿透。把花生壳的内网端口设置成本地调试的端口(注意不能用类似reac...
2019-07-18 19:20:34
4819
原创 微信公众号调试缓存的坑
微信调试缓存的坑由于微信调试有时候我们需要真机调试看效果,但是有时候你会发现怎么刷新都刷不出来,特别是用react之类的框架,js死活改了没什么用。为什么原来是被浏览器缓存了怎么解决因为浏览器的缓存规则是服务器的头部定义的,所以改一下web服务器的定义就好了:expires 30s;add_header Cache-Control no-store;...
2019-04-01 15:43:48
3257
原创 SpringBoot Shiro Ajax的认证处理
吐槽真是什么都做一点,最近撸主变成了一个web后端程序员去了,真是什么都弄一点,什么都不精通,八爪章鱼问题springboot用shiro来做ajax动静分离的方案的认证和授权的时候遇到一个特别为难的问题,那就是你访问未授权页面的时候,登陆未成功或者未登陆访问需要认证的接口的时候,服务器端回redirect重定向到loginUrl,这对于莫版型写法的页面是很方便的,但是我们ajax更希望看到...
2018-11-21 10:43:31
1349
原创 Android应用开发之CPU优化
最近开发一个APK的时候遇到了一个问题,CPU动不动就占用到40%以上,而且是一个服务型的常驻内存APK,这样子肯定不行的,CPU发热可能会过高。这个APK需要优化,包括内存优化,结构优化,CPU优化等等1.获取APK内存占用情况使用top命令,确定自己是不是占用了比较高的cputop2.获取线程占用情况直接执行top命令智能获取到整个进程总的cpu占用,但是我们的APK大...
2018-06-01 16:30:50
5448
原创 Android Studio使用aar
在Android Studio Gradle的compile给了我们很大的方便。不过题主最近遇到了一个问题,使用了一个封装了zxing的库(barcodescanner)时,发现好几个参数都是写死了,不可以设置。不得不下载源码,本来是直接把整个项目作为module引用,可发现和自己的代码一起编的时候就报gradle错误,但是单独编译barcodescanner的时候就没问题,实在没空去处理就想到把...
2018-05-30 09:50:54
1717
原创 GORM初次使用
GORM是中国人写的一个go语言的ORM,全世界都在用,下面我们用一段代码演示一下怎么用 文档地址:http://doc.gorm.io/crud.html 安装:go get -u github.com/go-sql-driver/mysqlgo get -u github.com/jinzhu/gormpackage mainimport ( "github.com/j...
2018-05-12 16:59:11
8727
原创 byte转int的问题,unsigned char和char
ps:其实这篇文章我是想不出叫什么名字了。。。。。。 事情是这样的,最近用java把一个4 byte转成int,于是写出了这种代码:int dataSize = ((dataSizeArray[3]) | (dataSizeArray[2]) 这段代码的问题是什么,上面的过程byte被隐式转换成int再移位求或,byte[0] = 0x81 (-127),我们本意是转成这样0x000
2018-01-19 11:00:34
1182
转载 帧差法检测运动目标
转自:http://blog.youkuaiyun.com/tiemaxiaosu/article/details/51558830一、原理 摄像机采集的视频序列具有连续性的特点。如果场景内没有运动目标,则连续帧的变化很微弱,如果存在运动目标,则连续的帧和帧之间会有明显地变化。 帧间差分法(Temporal Difference)就是借鉴了上述思想。由于场景中的目标在运动,目标的影像
2018-01-13 16:11:19
35077
转载 H.264 NALU语法结构(转载)
转自[http://blog.youkuaiyun.com/newthinker_wei/article/details/8748442](http://blog.youkuaiyun.com/newthinker_wei/article/details/8748442) 补充笔记:关于VCL:VCL层是指视频编码层,VCL NAL 单元是指那些nal_unit_type 值等于 1 到
2017-12-26 22:16:58
290
原创 java.util.NoSuchElementException
在一个android项目上用到List来作为RTP包的队列,一个线程入队一个线程出队,频率比较高,跑几秒钟就挂了,异常:java.util.NoSuchElementException这是什么原因呢,原因是一开始我就认为java的书结构是线程安全的,但默认情况下并不是这样的,有一部分数据结构并不是线程安全的,所以我们得在构造的时候用线程安全的版本:Collections.synchronizedLi
2017-12-13 22:04:57
478
转载 Android 摄像头后台采集
转自:http://blog.youkuaiyun.com/ak47zhangzhiwei/article/details/68483888 由于某些特殊要求,可能在Android视频采集是需要不回显,只在后台进行采集传统做法需要使用SurfaceView,通过SurfaceView 获取SurfaceHolder,通过调用 Camera.setPreviewDisplay,设置Holder,才可以进行视
2017-12-09 20:01:55
2153
原创 android md5求hash值
重要的事情说三遍:“md5是hash算法,不是加密算法;md5是hash算法,不是加密算法;md5是hash算法,不是加密算法;“MessageDigest md5 = null;try { md5 = MessageDigest.getInstance("MD5");} catch (NoSuchAlgorithmException e) { HMLog.d("get md5
2017-12-06 15:32:49
1282
转载 ubus实现进程间通信
上一篇文章介绍了ubus的组件和实现原理,本文通过代码实例介绍使用ubus进行进程间通信的三种方式。1. invoke的方式实现端对端通信最简单的情景就是一个提供服务的server端,一个请求服务的client端,client请求server的服务。下面的例子中,server注册了一个名为“scan_prog”的对象,该对象中提供一个“scan”方法:ubus_invoke.h:
2017-12-02 10:45:52
4964
原创 Makefile编译当前目录下所有c文件到共享库
在编写c的项目的时候有时候把接口文件都放在一个目录下,并且需要打包成一个共享库,这时候我们充分的利用通配符和函数就可以不用把所有文件都一一写出来了。OBJS := $(patsubst %.c, %.o, $(wildcard *.c))OUTLIB := libmyapi.soCFLAGS := -fPIC -I.CFLAGS += -I ../myapiall: $(OBJS) $(OUTL
2017-11-29 17:34:25
8751
原创 protocol buffers c语言的使用
以下源码示例来源于https://github.com/protobuf-c/protobuf-c/wiki/Examples 定义消息message AMessage { required int32 a=1; optional int32 b=2;}安装protobuf-c我们需要把proto文件编译成c源码,才能在代码中使用,所以需要用到官方的编译工具sudo apt-get
2017-11-27 16:28:08
4864
原创 vagrind检测内存泄露
今天想检测自己写的一段代码有没有内存泄露,于是想到了googleperf和vagrind,对比了一下,vagrind能检测出一处内存泄露,而googleperf却没有,不知道是什么原因,这两个工具的原理也不太一样,vagrind的在自己的模拟环境下跑的,而googleperf是通过链接自己的tcmalloc的方式来实现。vagrind检测内存泄露的方法是这样的:方法valgrind --leak-c
2017-11-23 11:02:17
2432
原创 分治法计算乘幂
如果直接重复相乘的方法需要n次乘法,如果利用递归的方法分解子问题,只要log2n的复杂度。#include <stdio.h>#include <stdlib.h>#include <string.h>int count = 0;unsigned long long power1(int x, int n) { unsigned long long ret = 0; if(n =
2017-11-12 15:58:35
1171
原创 perf之timechart(系统性能图形化分析工具)
perf record可以统计系统在一段时间内,进程的性能表现,但是其结果不适合直接阅读,有很多图形化工具可以把其结果转换成图形界面的方式,而perf自带了timechart分析工具,当然它只记录了进程粒度上的表现,还是替代不了火焰图这种可以在函数级别上进行分析的工具,最好可以配合使用。
2017-11-06 10:07:58
15301
1
原创 http进行wifi认证的设计思路
目前很多家庭的wifi被客人“万能钥匙”自动分享,导致家里wifi慢的可怜,这次回家就看到家里的wifi的dhcp服务器上挂满满的各种陌生的客户端,其实来了家里都是朋友肯定不会去主动分享密码的,于是我想wifi密码改来改去的还是被一些“小人软件”自动分享了,有没有什么方法来抵抗这个呢,当然一般路由器可以隐藏ssid和或者绑定mac的方式可以解决,但是这个对于客人来说太不友好了,主人家也麻烦。所以突发
2017-10-22 00:16:25
11150
原创 iperf点到点测速
iperf 是一个网络性能测试工具。Iperf可以测试最大TCP和UDP带宽性能,具有多种参数和UDP特性,可以根据需要调整,可以报告带宽、延迟抖动和数据包丢失。在嵌入式开发的过程中经常需要用到这个工具,下面我们演示一下如何利用这个工具来测两台机器之间的数据传输速度: 分别在两台待测机器中安装iperf,我使用的是ubuntusudo apt-get install iperf3然后其中一台作为客
2017-10-17 14:37:45
9654
1
转载 敏捷宣言遵循的原则
转自:http://agilemanifesto.org/iso/zhchs/principles.html 当在团队中或者平时和一些其它的程序员聊天中聊起了“敏捷开发”这个话题,但是问起敏捷开发是什么时,大多是不知所云,只知道敏捷开发”快速“的一面,而忽略了敏捷开发”可持续“的一面我们遵循以下原则: 我们最重要的目标,是通过持续不断地 及早交付有价值的软件使客户满意。欣然面对需求变化,即
2017-09-25 00:08:12
413
原创 gRPC的使用(cpp)
gRPC是google开源的一套实现rpc调用的框架,支持多种语言,并且比较易用,其数据传输是通过google自家的protobuf来序列化的,下面我们通过改写gRPC的example来实现获取远程host内存的功能。 例子中的文件目录结构如下./examples/cpp/sysproc./examples/cpp/sysproc/sysproc_server.cc./examples/c
2017-09-21 21:09:33
8100
原创 一个换行符引发的“血案”
今天项目发生了一件很有意思的事情,案件很离奇。案件的经过是这样的:案件经过我们在写一个库对接硬件平台和第三方模块,库封装了一些平台有关的接口给第三方使用,但是当我们把对接第三方模块的时候对方服务器报错了,服务器方反馈上报的某个参数有误。然后我们发现参数的确有误://本来参数在终端应该是这么显示的//printf("abc=[%s]", efg)abc=[efg]//但是结果是这样的[bc=[
2017-09-15 19:26:39
4680
原创 Linux FIFO (进程间通信,生产者消费者)
上一篇中我们写到了PIPE无名管道,的确是一种很方便的通信机制,但是其有一个缺点就是,PIPE是依赖于文件描述符的,并不在文件系统中维护,如果两个通信进程之间没有共同的祖先,他们就无法拿到相同的文件表项,所以没有共同祖先的两个进程是不能通过PIPE直接通信的。为此Linux提供一种称为有名管道称为FIFO来解决,FIFO是一种全双工的管道,先进先出,并且在磁盘有索引节点,这样只要进程知道FIFO文件
2017-09-14 20:51:24
5534
原创 Linux Pipe (进程间通信,生产者消费者)
PIPE是Linux下可以用来实现进程间通信的一种手段,当我们调用pipe系统调用时,将会产生一对文件描述符,fd[0]可以用来读,fd[1]用来写,fd[1]写的数据将会在fd[0]中读到,我们称之为管道。进程之间可以依赖管道的方式实现进程间通信,pipe是半双工的,所以如果要实现pipe之间互相通信的话,需要建立2对pipe。下面我们演示用pipe实现父进程生产数字,子进程消费数字并排序的一个程
2017-09-13 10:41:20
5570
原创 svn sqlite[S5]:database is locked
今天遇到一件比较奇葩的事情,在svn update的过程中直接ctr+z终端svn命令,结果再次svn update,报错“sqlite[S5]:database is locked”。sqlite被锁住了,svn cleanup没用了。解决该问题的方法如下:cd .svnmv wc.db wc.db.oldsqlite3 wc.db.old.backup main wc.db.exitc
2017-09-06 11:49:19
13073
原创 基数排序
基数排序是一种“非比较排序算法”,什么叫非比较排序算法呢,就是在实施排序的过程中,没有直接的比较元素之间的大小。其复杂度和被排序个数呈线性关系,原理是利用从小到大依次基于更小的已经排序的位的每一个十进制位进行排序,最后得到最优的结果(具体证明和过程请参考MIT 的《算法导论》书籍)。下面用c++代码演示一个处理正整形数的基数排序,如果要处理负数需要做一些特殊的改进。栗子如下:#include <io
2017-09-01 10:29:20
5956
原创 JavaScript IP转INT(整形)
有时候我们需要在web页面中对ip进行一些和掩码相关的验证,由于掩码是二进制的概念(当然如果你字符串操作实在很溜,经历旺盛的话,那就可以不用往下读了,读到这里为止了)。JavaScript位操作和c差不多,但是JavaScript转成无符号整形我们需要一个“>>>”,否则最左边一位会被解析成符号位,得到的结果与期望不符合。例子中我们将会演示如何判断两个ip的网络位是否相同,这在页面进行网关和ip是否
2017-08-30 14:17:23
10189
原创 跳跃表的实现(c++)
这里不介绍跳跃表是什么东西了,如果没有推导过跳跃表或者索性不知道跳跃表是什么东西请看麻省理工大学公开课 算法导论 跳跃表。 代码中有一个容易误解的地方解释一下,randomLevel模拟抛硬币的过程比较不太直观,在插入过程中一个节点上升的次数实际上等价于连续出现“正面”的次数,所以我们直接一次性算出来,而不是每插完一个节点抛一次硬币,这样方便在进行实际插入之前进行一些检查 本代码
2017-08-28 00:27:36
7398
原创 Linux 动态装载库(dlopen)
Linux有时我们需要在运行时指定库的路径去加载库,而不是依赖于系统自动动态链接。比如说我们在需要做到动态加载库插件时就会用到动态装载库的特性(比如像lighthttpd和nginx的动态mod功能),Linux提供了函数来帮助我们做到这件事,主要的几个函数为:dlopen,dlsym,dlclose栗子假设我们一个项目可能会需要加载不同版本的库v1和v2,我们希望在配置文件中实现可配置加载哪个库,
2017-08-21 23:26:37
7258
原创 dup2复制文件描述符
dup2是Linux下用来实现文件描述符复制的api,dup2(fd1, fd2)将会把fd1复制到指定的fd2下,如果fd2是一个已经打开的描述符,dup2会自动的先将其安静的关闭。我们知道Linux的进程表中会维护打开的fd的表项,每个fd指向一个文件表,复制的作用是使fd2指向了fd1所指向的文件表项。当我们关闭了指向同一个文件的fd的时候,关闭一个fd另外一个fd是不受影响的。下面的例子我们
2017-08-21 16:46:31
6019
原创 c++11 thread
c++11在语言层面上提供了对thread的支持,由于不同的平台提供了不同线程API,在语言层面提供了对thread的支持可以大大的减小代码移植的工作量。thread的构造函数参数为函数名和可变参数,请看栗子thread的默认构造函数创建一个没有执行过程的线程,该线程既不可以被join,也没有id,如果join将会产生terminated不可以被拷贝和赋值,拷贝构造函数和赋值函数都被threa
2017-08-20 19:46:36
9791
原创 gperftools检查内存泄漏
上次,我们提到利用google gperftools定位程序cpu使用性能问题,这次利用同样的工具的heap checker的功能对程序进行内存泄漏的定位。安装请看之前的文章:#include <iostream>#include <vector>using namespace std;extern "C" {#include <string.h>}class MyClass { p
2017-08-18 15:27:39
7840
原创 用最大堆实现优先队列(c++)
关于最大堆,最小堆的概念这里不再介绍。#include <iostream>#include <vector>using namespace std;template<typename T>class PriorityQueue { private: vector<T> v; int size; const static int init
2017-08-18 00:42:11
6940
原创 VIM命令备忘录
本文仅仅是写给自己的备忘录,没有条理,请谨慎阅读 :ls 显示打开的文件我习惯vim用NerdTree打开一大堆文件,或者ctags跟踪跟踪着就一大堆文件了,这时打开的文件一般在buffer中,这时又记不起具体文件名,想看看打开过了哪些文件了,用”:ls”就可以了:bn 跳转到已经打开的某个文件ls显示了buffer文件了之后,每个文件都带有一个序号n,我们通过”:bn”的方式就可以跳转到某个
2017-08-16 22:20:44
232
Systems_Performance-Enterprise_and_the_Cloud
2017-11-07
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人