HiKariのTechLab

光の技术屋


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 站点地图

  • 搜索

【GitHub探索】FastAPI——新一代实用python轻量级Web后端框架

发表于 2020-02-01 | 更新于 2024-04-07 | 分类于 GitHub探索

本月,一款名为FastAPI的轻量级Web框架在trending榜上有名。本着踩坑的心态试用了fastapi,发现其坑并没有许多相同量级web框架(比如flask)来的多,上手极其容易。因此果断整理了一下fastapi的上手过程。

FastAPI基于Starlette网络框架进行封装,不仅性能优异,并且解决了许多用python开发效率工具或是轻量级应用的后端同学的痛点。比如:

  • 结合pydantic,实现param与body的静态类型检查
  • 用妥当的方式接收/返回json body
  • 结合Starlette,从而自带restful api以及middleware的支持
  • 自带调试router,基本顶替postman的工作
  • etc

安装fastapi需要python3.6以上,预先pip3 install fastapi uvicorn。我们来看一下FastAPI的例子:

阅读全文 »

【测试人生】为游戏策划与QA量身定制的excel表diff算法

发表于 2020-01-23 | 更新于 2024-04-07 | 分类于 测试人生

国内的游戏研发团队里许多策划同学都习惯采用excel作为配表工具。因此对策划同学校对与QA同学验收工作来说,需要相应的diff工具去检测excel文件的变更,从而能够尽早发现配表的问题。为此,在笔者启动的游戏效率工具集gameff-toolset小项目中,首个小脚本便做了excel diff。

diff的算法有非常多,但是如何体现策划表与策划工作的特性,这才是最需要注意的。许多项目的策划表都通过SVN进行存储,因此从SVN的commit信息中就可以知道哪些策划表发生了变更/增加,因此,我们只需关心每个excel文件如何进行diff运算就可以了。

策划的excel配表有如下的特点:

阅读全文 »

【极客日常】解决使用mongodb时同时update多条数据的问题

发表于 2020-01-12 | 更新于 2024-04-07 | 分类于 极客日常

在实际使用mongodb的场景中,我们经常遇到多个请求同时在某个collection里update多条document的需求。这个需求看似有许多种解法,但是具体哪种好也说不准。现在便让我们一探究竟吧~

首先我们利用pymongo添加1000000条数据,name字段为hello:

1
2
3
4
5
6
7
8
9
10
11
12
13
from pymongo import MongoClient

client = MongoClient()
db = client['test']
coll = db['concurrency']

coll.insert_many([
{
"name": "hello",
"num": i
}
for i in range(1000000)
])

然后,我们另外加一个进程,启动任务为将num字段为偶数的documents的name字段给update成aa,而主线程则update所有documents的name字段为bb。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
from pymongo import MongoClient
import pprint
from multiprocessing import Pool, Process


client = MongoClient()
db = client['test']
coll = db['concurrency']


def f(name, m):
coll.update_many(
{"num": {"$mod": [m, 0]}},
{"$set": {"name": str(name)}},
)
return 1


if __name__ == '__main__':
p = Process(target=f, args=('aa', 2))
p.start()
coll.update_many({}, {"$set": {"name": 'bb'}})
p.join()
docs = coll.find()
d = dict()
for doc in docs:
n = doc['name']
if n not in d.keys():s
d[n] = 0
d[n] += 1
pprint.pprint(d)

最后结果是:

阅读全文 »

【测试人生】测试、策划与开发,谁来把控游戏的质量?

发表于 2019-12-22 | 更新于 2024-04-07 | 分类于 测试人生

近期进入了另外一个项目组,工作沟通的时候遇到了一些碰撞。在和项目组其它伙伴交换意见的同时,自己也开始思考这个问题:测试、策划与开发,这三个主导游戏研发的部门,谁才是真正把控着游戏的质量?

从自己的职业立场与岗位的配置上来看,测试理所应当真正管控游戏的质量,但是实际上又不尽然。从策划和开发的立场上来看,一个关心游戏呈现的效果,一个关心游戏的稳定性,都是广义上的“质量管理”。但实际情况下,许多研发与策划同学会希望测试能专注于提bug,这方面没有什么问题,而希望测试同学只提出经过自己确认后的所谓的bug,这种观点倒是有点不靠谱。

阅读全文 »

【测试人生】小谈游戏测试用例与代码间的联系

发表于 2019-12-06 | 更新于 2024-04-07 | 分类于 测试人生

近几周一直在某SLG项目内负责功能模块测试与周边工具推进的工作,渐渐感悟到了些用例设计与业务代码的联系。

游戏的业务逻辑是比一般应用复杂的。而且对于自己项目这种强玩法的游戏而言,甚至还会出现以下的现象——QA驱动策划,策划驱动开发。

策划案能够大概阐述游戏的界面、逻辑与数值,但是如果有复杂的特例,还需要QA在实际测试中去挖掘。游戏测试用例的设计过程,不仅可以看成是策划案的延伸,而且也可以看作是一份业务代码的参考文档。如果了解游戏服务端与客户端机制,跟进过代码的话,甚至可以根据它们设计一些极端的用例。

好比说,某一个建筑,占地是5x5,但是它横跨国界,一部分在A国,一部分在B国。那么这个建筑,是属于A国,还是B国呢?

阅读全文 »

【从零单排Golang】第五话:用自带net包写一个简单的负载均衡

发表于 2019-11-24 | 更新于 2025-04-04 | 分类于 从零单排Golang

前言

Github传送门

golang在工业中用途最多的方面就是编写中间件以及上游设施,因此切入golang的话,了解其网络库是很有必要的。因此,笔者上手了自带的net包,花了一天左右的时间写了个简单的负载均衡(Load Balancer),也算是能用啦= =

用net包写负载均衡

我们在浏览网页时,通常会遇到服务方故障的情况,提示我们nginx、apache之类的字眼。这些,便都是负载均衡的工作了。

一个负载均衡可能会包含以下的功能:

  • 负载调节
    • 上游连接分配(策略:轮流(roundrobin)、最少连接等)
    • 权重管理
  • 健康检查(业务是否OK)
  • 协议支持
    • tcp、udp
    • http、https
    • 路由代理
    • 数据缓存与压缩
  • 安全
    • 限流,DDOS防护
    • 备用负载均衡

为了实践一下(培养手感),笔者用net包弄了一个基于tcp的简易负载均衡,实现了上述最基础的负载调节与健康检查功能。

首先设计一个struct:

阅读全文 »

【GitHub探索】v语言上手,用vlang写一个聊天应用

发表于 2019-11-16 | 更新于 2024-07-20 | 分类于 GitHub探索

前言

vlang(v语言)自从6月份突然炒热起来,不知不觉到了11月,正式版就要出来了,在11月的GitHub Trending榜中依然排在前10。这着实令人好奇,因此笔者决定试用一下vlang,写一个小应用,体验一下感受。

v语言上手

v语言可以在GitHub传送门中clone下载,支持多操作系统,有以下的特性:

  • 快速编译
  • 快速转译
  • 热更

其余的,还有自带的GUI库、结合Go与Rust的语言特性之类,也可以算作所谓的卖点。

安装v语言也很简单,比如在windows上,首先需要安装Visual Studio提供的MSVC环境,然后只需要:

1
git clone https://github.com/vlang/v.git

然后执行:

1
./make.bat

再设置环境变量到PATH,就能够随时随地执行vlang了。

阅读全文 »

【测试人生】游戏业务用例测试体验感悟

发表于 2019-11-03 | 更新于 2025-07-12 | 分类于 测试人生

近期稍微停歇了下开发的任务,转为进入游戏项目组去探究真正的游戏测试业务是如何进行。在此前做测试工具与平台时会常常遇到业务需求不能准确击中的瓶颈,因此真实投入体验,调研项目组的测试痛点,能够对后续的技术支持工作大有裨益。

游戏,尤其是网游,是一类非常特殊的软件产品,可能会有以下的特点:

  • 服务端与客户端强耦合
  • 各个系统模块间存在复杂的联系,业务复杂度相对于一般的产品高
  • 单体状态的变化,可能影响到多个实体的状态及属性
  • 策划配表数值变动多,迭代频率高
  • 游戏的新功能特性研发,需要牵扯到很多原有的设定
  • etc…

简而言之,游戏是一个高内聚、体量较大、变化需求多的软件系统,因此游戏业务测试本身就是不小的挑战。

项目组现处于刚上线的阶段,主要业务是外网缺陷修复的验收以及新功能的测试及回归。其中,新功能的回归测试在笔者认为是更为艰巨的任务。我们首先可以看一下一个基本的测试用例是怎样的:

阅读全文 »

【DIY小记】解决技嘉Z390 AORUS PRO不识别SSD/机械硬盘的问题

发表于 2019-10-29 | 更新于 2024-04-07 | 分类于 DIY小记

笔者近期用技嘉(GIGABYTE)Z390装机时遇到了装上一个SSD跟一个机械硬盘后,机械硬盘无法被主板/操作系统识别的问题,经过一番研究后发现了解决方案,特地分享:

首先本经验理论上应当适用于不同厂家的Z390主板上(比如华硕之类)

SSD或机械硬盘无法识别可能是主板芯片共享频宽的问题。以技嘉为例,我们首先需要知道SSD或机械硬盘插在了哪里,以及硬盘有哪些接口。在技嘉Z390上,有以下的硬盘接口:

  • M.2(M2A/M2M)
  • SATA

在说明书中应当会有这些插口所插到的位置图示。

如果不了解硬盘原来插到了哪个接口,可以开机进入BIOS,BIOS中也会显示这些接口插了哪些硬盘。如果插过的硬盘没显示,那就是没识别到了。

接下来也得翻说明书找硬盘接口相关的内容,以技嘉Z390为例,在说明书的插座及跳线介绍——M.2及SATA插座安装注意事项中,会有表格及文字显示M.2的哪个接口安装了哪种SSD,会与哪个SATA接口共享频宽,从而不兼容。借助这个表格找到兼容的接口,把原先插在SATA的硬盘换一个兼容号码的插座,就好了。技嘉的话,SATA插到3、4号(中间两个),是没问题的。

【Lua杂谈】服务端架构skynet简易入门项目——create-skynet

发表于 2019-10-26 | 更新于 2024-07-20 | 分类于 Lua杂谈

前言

在skynet通信原理与源码分析一文中,我们已经详尽地弄清楚了skynet地通信架构,为我们上手skynet提供了极大的帮助。因此本篇文章接续上文,正式上手使用skynet。

skynet入门项目:create-skynet

要做一个基于skynet的项目,首先需要一个好的模板。skynet的最佳实践并非将服务卸载skynet模块中,而是将skynet当作一个单独的库/SDK看待,自己独立在另外的目录写业务逻辑。因此,笔者在数月前简单地整合了一下skynet的boilerplate项目——create-skynet,采用这个项目搭建skynet服务端结构会较为清晰。

服务&库的约定

在create-skynet的配置中,每个服务的lua文件入口以config中luaservice项为准:

  • service/服务名.lua
  • service/服务名/main.lua
  • skynet/service/服务名.lua(默认的服务)

skynet启动时会根据服务名注册相应服务,因此自己在service下定义的服务名最好不要与skynet原有服务重名。

skynet在为每一个服务读取lua库的时候,会根据运行skynet脚本的工作目录以及config里的设置去读取,这是由config的lua_path与lua_cpath为准的。在create-skynet里,lualib的位置有:

阅读全文 »
1…161718…21
ひかり.HDQ

ひかり.HDQ

talk is cheap, code is rich
203 日志
14 分类
423 标签
GitHub Mail CSDN Juejin Steam Bilibili
© 2019 – 2025 ひかり.HDQ
|