2021-12-05 18:09:24    8    0    0

每个周末的午后,把儿子送进EF读书,随后找个环境幽静的咖啡馆坐一会,这便是我一周中最放松的时光。
在咖啡厅的气氛和环境这两点上,我似乎有强迫症,比如装修主色调的运用,地上装饰是否比较体验文化气息,营造了一场视觉盛宴,尤其在比较细微的地方我会非常关注。
简单说,必须能让我一进门就迅速有耳目一新的感觉,要不然我就会转头离开。因为我觉得只有在这样的环境中,闲暇时能够更加放松和享受,写出的文章才会更带有情感。
如果这一天心情大好,也会和妻子点上一壶功夫茶,畅谈一些身边的先闻趣事。
毕竟和她谈话,能让我捕获很多的写作素材。

熟悉我的人都知道,我有位从事猎头工作的老婆,平时的工作是专为某些医疗、金融投资机构提供中、高级岗位职位人才招聘及相关咨询服务。
相比之下,这项工作对业务专业性与人脉关系要求较高,经常会被行业大咖问:“这家公司你觉得怎么样?和某某公司比,你觉得他们之间区别是啥?”
如果回答的不够专业,或者被对方感觉很水,不仅当场尴尬,而且会在信任上大打折扣。
对猎头这项工作来说,一旦失去了信任,就意味着确定性的消失,长此以往,这个圈子也就别想混了。

上周,我妻子手上的某候选人,在通过初试、复试后,最终被卡在了终面上。
这种高端VP岗位的夭折,显然让她十分郁闷。
我本想安慰她,没想到被瞪了一眼,说:“少跟我提这事!煮熟的鸭子都飞了,几十万佣金啊,就这么飞了!”
我一哆嗦,感受到怨愤之气已冲破了天空,立马话锋一转,“胜败乃兵家常事,没事的。”
“去你的兵家常事!我真火大着呢,少惹我!”
我很理解,毕竟业务的发展非常艰难,这给她的情绪带来了压力,笑了笑说:“好吧。那为什么终面被拒呢?”
“现在的客户真难伺候,招的是VP,问的全是与细节相关的问题,最终,候选人抱怨企业小瞧了他,企业则吐槽这哥们很水。”
她喝了口茶,抬起头问我。
“好像在你们技术圈里,这种事情还挺多见?”

这样的话题,曾经在技术圈内也争论了过一阵子。
我试图用几个例子来向他解释,还别说,这方面可是我的强项。

比如,当团队规模超过几十人以上,而且不止一条产品线,那就需要有一名技术总监来管理和协调各个产品线Leader,并负责搭建公共技术平台,提升开发效率,控制质

2021-12-05 18:09:24    10    0    0

螺旋模型是一种演化软件开发过程模型,它兼顾了快速原型的迭代的特征以及瀑布模型的系统化与严格监控。螺旋模型最大的特点在于引入了其他模型不具备的风险分析,使软件在无法排除重大风险时有机会停止,以减小损失。同时,在每个迭代阶段构建原型是螺旋模型用以减小风险的途径。螺旋模型更适合大型的昂贵的系统级的软件应用。[1] 
1988年,巴利·玻姆(Barry Boehm)正式发表了软件系统开发的“螺旋模型”,它将瀑布模型和快速原型模型结合起来,强调了其他模型所忽视的风险分析,特别适合于大型复杂的系统。

简介

螺旋模型(Spiral Model)采用一种周期性的方法来进行系统开发。这会导致开发出众多的中间版本。使用它,项目经理在早期就能够为客户实证某些概念。该模型是快速原型法,以进化的开发方式为中心,在每个项目阶段使用瀑布模型法。这种模型的每一个周期都包括需求定义、风险分析、工程实现和评审4个阶段,由这4个阶段进行迭代。软件开发过程每迭代一次,软件开发又前进一个层次。采用螺旋模型的软件过程如下图所示::
title
螺旋模型基本做法是在“瀑布模型”的每一个开发阶段前引入一个非常严格的风险识别、风险分析和风险控制,它把软件项目分解成一个个小项目。每个小项目都标识一个或多个主要风险,直到所有的主要风险因素都被确定。

螺旋模型强调风险分析,使得开发人员和用户对每个演化层出现的风险有所了解,继而做出应有的反应,因此特别适用于庞大、复杂并具有高风险的系统。对于这些系统,风险是软件开发不可忽视且潜在的不利因素,它可能在不同程度上损害软件开发过程,影响软件产品的质量。减小软件风险的目标是在造成危害之前,及时对风险进行识别及分析,决定采取何种对策,进而消除或减少风险的损害。

四种象限

螺旋模型沿着螺线进行若干次迭代,图中的四个象限代表了以下活动:
title

  1. 制定计划:确定软件目标,选定实施方案,弄清项目开发的限制条件;
  2. 风险分析:分析评估所选方案,考虑如何识别和消除风险;
  3. 实施工程:实施软件开发和验证;
  4. 客户评估:评价开发工作,提出修正建议,制定下一步计划。

螺旋模型由风险驱动,强调可选方案和约束条件从而支持软件的重用,有助于将软件质量作为特殊目标融入产品开发之中。

2021-12-04 14:05:11    8    0    0

1.Vuex是什么

Vuex 是实现组件全局状态(数据)管理的一种机制,可以方便的实现组件之间数据的共享。

当我们的应用遇到多个组件共享状态(数据)时,就可以用到Vuex了。

2.Vuex的使用

安装完VueX后,在项目的src目录下新建store文件夹,然后在store目录下新建index.js。(使用最新的Vue-CLI 4.x.x安装Vuex会自动配置好以下步骤)

在store/index.js中 导入 Vuex 包并创建 Store 对象

  1. import Vue from 'vue'
  2. import Vuex from 'vuex'
  3. Vue.use(Vuex)
  4. export default new Vuex.Store({
  5. state: {
  6. },
  7. mutations: {
  8. },
  9. actions: {
  10. },
  11. getters:{
  12. }
  13. })

在main.js中将 store 对象挂载到 vue 实例中

  1. import store from './store'
  2. //.....
  3. new Vue({
  4. render: h => h(App),
  5. // 将创建的共享数据对象,挂载到 Vue 实例中
  6. // 所有的组件,就可以直接从 store 中获取全局的数据了
  7. store,
  8. }).$mount('#app')

3.Vuex的核心概念

Vuex 中的主要核心概念如下:

  • State
  • Mutation
  • Getter
  • Action
    在上面的index.js中我们也可以看到一个Store对象就包含了这几个对象

3.1 State

State 提供唯一的公共数据源,所有共享的数据都要统一放到 Store 的 state 中进行存储。

3.1.1创建数据

  1. export default new Vuex.Store({
  2. state: { num: 0 }
  3. })

然后我们在组件中访问 state 中数据的有两种方式:

3.1.2访问数据的第一种方式

this.$store.state.全局数据名称 //访问刚刚创建的num就是

  1. this.$store.state.nu
2020-10-29 09:40:04    104    0    0

数据库结构

title

语句

  1. $info = $model->user_info();
  2. if (isset($info['error'])) return $this->response($info);
  3. if (!isset($info['id'])) return $this->param_error('返回信息错误');
  4. $rs = $this->model->where('id', $this->id)->update(['cid' => $info['id']]);

打印出info的值

  1. array (
  2. 'id' => 1329389309362531,
  3. ...
  4. }

保存后数据库的值
title

修复bug

  1. $rs = $this->model->where('id', $this->id)->update(['cid' => $info['id'].'']);

后续

上面是使用laravel5.7,使用laravel5.5之后得到
title

而其他同事laravel5.5是正常的

2020-09-07 18:44:42    182    0    0

在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的SQL语句,找出这些SQL语句并不意味着完事了,些时我们常常用到explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有没有使用上了索引,有没有做全表扫描,这都可以通过explain命令来查看。所以我们深入了解MySQL的基于开销的优化器,还可以获得很多可能被优化器考虑到的访问策略的细节,以及当运行SQL语句时哪种策略预计会被优化器采用。(QEP:sql生成一个执行计划query Execution plan)

  1. mysql> explain select * from servers;
  2. +----+-------------+---------+------+---------------+------+---------+------+------+-------+
  3. | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
  4. +----+-------------+---------+------+---------------+------+---------+------+------+-------+
  5. | 1 | SIMPLE | servers | ALL | NULL | NULL | NULL | NULL | 1 | NULL |
  6. +----+-------------+---------+------+---------------+------+---------+------+------+-------+
  7. 1 row in set (0.03 sec)

expain出来的信息有10列,分别是id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra,下面对这些字段出现的可能进行解释:

一、 id

我的理解是SQL执行的顺序的标识,SQL从大到小的执行

  1. id相同时,执行顺序由上至下
  2. 如果是子查询,i
2020-09-07 18:04:49    52    0    0

背景

表结构

  1. CREATE TABLE `zb_interface_logs_35` (
  2. `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  3. `url` varchar(255) NOT NULL COMMENT '接口地址',
  4. `param` text NOT NULL COMMENT '提交参数',
  5. `response` longtext NOT NULL COMMENT '返回信息',
  6. `interface_type` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '接口类型:0.发送短信, 10.百度, 20.阿里, 30.纳米',
  7. `ip` varchar(45) NOT NULL DEFAULT '' COMMENT '请求ip',
  8. `created_at` timestamp NULL DEFAULT NULL,
  9. `updated_at` timestamp NULL DEFAULT NULL,
  10. PRIMARY KEY (`id`),
  11. KEY `interface_logs_35_interface_type_index` (`interface_type`)
  12. ) ENGINE=InnoDB AUTO_INCREMENT=6910328 DEFAULT CHARSET=utf8

#

数据3718534条,13.52G

分析

  1. EXPLAIN SELECT id, created_at, response FROM `zb_interface_logs_31` WHERE interface_type=32 AND id BETWEEN 3484981 AND 3560959 LIMIT 3

结果

title

实际时间

title

分析

  1. EXPLAIN SELECT id, created_at, response FROM `zb_interface_logs_31` WHERE interface_type=32 AND id > 3484981 LIMIT 3

结果

title

2020-09-03 18:22:48    51    0    0

基于HTTP的长连接,是一种通过长轮询方式实现"服务器推"的技术,它弥补了HTTP简单的请求应答模式的不足,极大地增强了程序的实时性和交互性。

一、什么是长连接、长轮询?

用通俗易懂的话来说,就是客户端不停的向服务器发送请求以获取最新的数据信息。这里的“不停”其实是有停止的,只是我们人眼无法分辨是否停止,它只是一种快速的停下然后又立即开始连接而已。

二、长连接、长轮询的应用场景

长连接、长轮询一般应用与WebIM、ChatRoom和一些需要及时交互的网站应用中。其真实案例有:WebQQ、Hi网页版、Facebook IM等。

如果你对服务器端的反向Ajax感兴趣,可以参考这篇文章 DWR 反向Ajax 服务器端推的方式:http://www.cnblogs.com/hoojo/category/276235.html

欢迎大家继续支持和关注我的博客:

http://hoojo.cnblogs.com

http://blog.csdn.net/IBM_hoojo

也欢迎大家和我交流、探讨IT方面的知识。

email:hoojo_@126.com

三、优缺点

轮询:客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接。
优点:后端程序编写比较容易。
缺点:请求中有大半是无用,浪费带宽和服务器资源。
实例:适于小型应用。

长轮询:客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。
优点:在无消息的情况下不会频繁的请求,耗费资源小。
缺点:服务器hold连接会消耗资源,返回数据顺序无保证,难于管理维护。
实例:WebQQ、Hi网页版、Facebook IM。

长连接:在页面里嵌入一个隐蔵iframe,将这个隐蔵iframe的src属性设为对一个长连接的请求或是采用xhr请求,服务器端就能源源不断地往客户端输入数据。
优点:消息即时到达,不发无用请求;管理起来也相对方便。
缺点:服务器维护一个长连接会增加开销。
实例:Gmail聊天

Flash Socket:在页面中内嵌

2020-08-24 17:53:20    47    0    0

作者:韩天峰
链接:https://www.zhihu.com/question/47994137/answer/131700752
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

性能上Swoole毕竟是C语言开发的,在某些地方如内存管理、数据结构、通信协议解析上肯定要比PHP开发的workerman高。

功能上swoole提供的高级特性很多,列举几个workerman没有的吧,比如SSL/TLS隧道加密、http2.0、异步mysql驱动、异步redis驱动、异步的http/websocket客户端、process、lock、atomic、table。另外Swoole 2.0内置了PHP原生协程的支持,PHP代码也可以使用类似于Go语言的协程来实现高并发的网络服务器。

外部依赖上workerman需要依赖很多额外的第三方PHP扩展来实现,局限性比较大,这些扩展并非是PHP官方维护的,维护性方面良莠不齐,有些扩展连PHP7都不支持,数年没人维护。而Swoole基本上无依赖,底层的代码全部可控。

开发维护方面,Swoole的开发团队目前有大概18人左右,开发者基本上都是来自腾讯、百度、阿里、滴滴、微博等国内一线互联网企业,支持维护的团队更稳定。

当然workerman的优势是它完全使用PHP代码实现,开发者可以直接看它的源码。有特殊需求也可以直接改源码来实现。如果换成swoole就不是那么简单了。workerman做的事情更多一些,即是框架又是工具和完整的解决方案,对于没有太多后端编程功底的程序员也来说确实会容易很多。而swoole实际上只是一个底层库,不是拿来可用的完整产品,基于swoole有很多PHP的框架和程序,比如tsf、zan php framework、hprose-swoole、zphp、swoole/framework、blink、dorarpc、SwooleDistributed等等,普通开发者可以直接基于这些项目进行开发。

Swoole是给高手用的,门槛比较高,需要使用者有深厚的功底。你这里问的哪个更容易开发,这个没办法回答,这个要看你要开发什么、团队或个人

2020-08-23 18:01:43    93    0    0

服务器配置

web服务器

  • 8:00 4台
  • 9:00 8台
  • 9:52 12台

socket服务器

  • 8:00 2台
  • 9:00 4台
  • 9:32 6台
  • 9:45 8台
  • 9:52 12台
  • 11:00 24台

推广时期各资源状况

DDo高防数据

4个带宽峰值时间分别是8:55,9:45,10:15和10:25
带宽

5个并发峰值时间分别是9:00,9:45,10:15,10:25和10:45
title

Waf防火墙

title
title

SLB

web

title
title

socket

title
title

ECS

web

title
title
title
title

socket

title
title
title

RDS (高可用版)

写库

title
title

读库

title
title

Redis (8G集群版4节点)

title

Mongodb

title

2020-07-25 15:00:56    127    0    0

测试能力等级划分
最近看一本书,上面说到测试工程师随着工作经验的提高,能力也会提高,但是有时候也会问自己,工作三年与工作四年的区别在哪里,书上对测试工程师分了几种等级,等级与技术无关,与测试方法与测试经验有很大的关系。在此总结出来,再加上自己的理解,基本能解决心中一直以来的困惑。

测试一级
能根据测试用例描述的步骤来执行测试用例,能对照用例的预期结果发现产品的问题,能够将问题清晰想记录下来反馈给开发,开发能够读懂bug的含义。

个人理解:执行用例的tester,只有大型的公司或外包公司才会有这种岗位,一般公司都会要求写测试用例的。

测试二级
对产品需求有一定理解,能够根据产品需求设计产品的测试用例,发现问题后能进行初步定位。

个人理解:这条涉及到两方面的能力。
1、独立编写测试用例的能力。
2、发现问题后能大概判断出是哪里的问题,这个定位不是代码级别的定位,而是功能模块方面的定位。就好比我测试一个系统,由a、b、c、组成,a出了问题,能判断是数据经过b时处理错误了还是经过c时处理错误了。但是这个能力需要你对被测试的产品有很深的理解,对于跳槽就基本等于换行业的IT技术来说,这个能力通俗点讲应该叫“上手速度快”。这个应该算是合格的测试工程师的基本能力。

测试三级
对产品的需求和实现都有较为深入的理解,设计用例时会注意用例的有效性,测试用例时会考虑使用自动化测试等方法提升测试执行的效率;

个人理解:编写测试用例时不再是严格按照规范来编写,而是会根据被测产品,找出测试重点来有针对性的编写测试用例,而其他的一些不太重要的地方则大概写一些测试case来提醒自己不要漏测就好。自动化方面小规模做还行,大规模得要领导与公司的支持,毕竟也要投入人力与时间。

测试四级
深入理解产品需求和实现,理解产品质量,理解产品的隐形需求,对产品性能、可靠性、易用性等非功能属性的测试均有所涉及,并掌握其中的测试方法,会使用测试缺陷分析技术,会评估产品质量;

个人理解:不明白具体的是什么能力

测试五级
不断追求最适合产品的测试技术,关注测试过程改进,推动产品测试技术的进步;

个人理解:不断学习新的技术,关注测试过程,应该根据每次的测试结果来

10/12