前言
infoq的打卡学习,期望每天都能进步一点点,总结自己的工作和生活,提高技术及概括能力,遇见更好的自己,后期改变格式,arts分门别类的写一个文章
一、Algorithm 一道算法题
背景:工作中,需要将Z张图片合成一张图片,然后调用aws的接口识别。分析aws的rekognition对正方形图片的识别准备率更高,因此合成z张图片时,尽量让其趋近于正方形
建模,变成数学题
假设传入z张「宽度为640,高度为360」的图片,将其按 x行y列 进行合并,使合成的图片趋于正方形,求x和y的值?
0 < x <= z
0 < y <= z
x*y >= z
|360*x - 640*y| =< 360
使用nodejs编写程序得到布局,在取得aws图片识别的结果后解开得到每张图片的识别结果,达到大大减少图片分析/识别的费用的目的:
/**
* 根据图片的数量获取合成图片的布局
* 传入z张宽度为640,高度为360的图片,按 x行y列 进行合并,使合成图片趋于正方形,求x和y的值
* @param picNum
* @param width
* @param height
* @author Cengp
*/
getMergeLayout:function(picNum,width,height){
// 初始化行数和列数
var rowNum = 0;
var columnNum = 0;
// 比较高度和宽度,取出两者中的最大值
var maxLength = Math.max(width,height);
var diff = 0;
// 当前布局周长和最小周长初始化
var currentPerimeter = 0;
var minPerimeter = 0;
// 通过遍历比较,求出应合成一张x行y列的图片,这张图片将最趋向正方形
for(var x = 1; x < (picNum + 1); x++){
for(var y = 1; y < (picNum + 1); y++){
// x和y的积小于图片总数,不是合适的布局
if((x * y) < picNum){
continue;
}
// 结果布局的宽高差,如果差>(宽高的最大值),则还未趋近正方形
diff = Math.abs((height * x) - (width * y));
if(diff > maxLength){
continue;
}
// 取得该布局的周长
currentPerimeter = (height * x) + (width * y);
// 取得最小周长的布局
if(0 === minPerimeter){
minPerimeter = currentPerimeter;
rowNum = x;
columnNum = y;
continue;
}
// 假如还有更小的周长
if(minPerimeter > currentPerimeter){
minPerimeter = currentPerimeter;
rowNum = x;
columnNum = y;
}
}
}
if(0 === rowNum){
return {"ack":false,"msg":"get layout fail!"};
}
// 计算出在第n张图片时需要换列
var lineArr = [];
for(i = 0;i < (columnNum - 1); i++){
lineArr[i] = (i + 1) * rowNum + 1;
}
var layoutRes = {"lineArr":lineArr,"bgWidth":(columnNum * width),"bgHeight":(rowNum * height)};
return {"ack":true,"data":layoutRes};
}
二、Review 读一篇英文文章
《Finding a needle in Haystack: Facebook’s photo storage》
Seaweedfs的核心理论依据,该论文的目标是解决facebook内部图片视频等数据的存储查询问题。论文概述了facebook之前在图片视频方面的面对的现状问题,以及如何保证一致性、高可用等问题(还没有读完,脑裂...)
三、Technique/Tips 分享一个小技术
Sentinel - 面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量控制、流量路由、熔断降级、系统自适应保护等多个维度来帮助用户保障微服务的稳定性。
支持java、go等多种语言,对保障存在高并发场景系统的稳定性效果明显,使系统各分层的资源能够合理有效的分配控制,假如无法直接使用组件,学习其中的流量治理办法、理念然后用到自己的系统中也是极好的
比如php无法使用sentinel,短时间内系统无法使用新语言重写,可以借鉴使用sentinel的系统自适应保护、熔断降级等理念先实现,然后再用go、java重写系统,为重写赢得时间
四、Share 分享一个观点
「教育/学习」应该走在发展前面,但不能走得太前
8-15中午在工厂饭堂吃饭时,刚好遇到乐队的吉他大牛大师父,他坐下来时我正在看吉他的视频教程,为表尊重我赶紧把手机收起来,然后向他请教:最近学吉他有些迷茫,不知道该学些什么。他毫无保留的给我分享高级和声的学习方法以及好处,他说得津津有味,我听着紧皱眉头、一脸雾水,完全搞不懂。直至今天早上运动完在洗澡的时候反思这个事情,结合最近学的教育学原理,大概解释了这种现象。是因为大师父说的技术远远超过了我所能理解的范围,我当前的吉他水平无法理解,反而会给我的发展带来阻碍。
因此我得出一个观点:教育应该走在发展前面,但不能走得太前,应结合学生的实际情况进行教育,否则反而会有副作用。
维果斯基的最近发展区: 借助成人帮助所能达到的解决问题的水平与独自解决问题所达到的水平之间的差异。