C++ 分割 HTTP 链接为 主机名、路由和参数

前几日在更新自己的开源游戏引擎 EtherEngine 时编写了使用 C++ 对 HTTP/HTTPS 链接进行分割的算法,分享一下:

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
ETHER_API splitLink(lua_State* L)
{
string link = luaL_checkstring(L, 1), domain, route, param;

if (!link.empty())
{
link.erase(0, link.find_first_not_of(" "));
link.erase(link.find_last_not_of(" ") + 1);
}

domain = link.substr(0, 5) == "http:" || link.substr(0, 6) == "https:" ?
link.substr(0, link.find_first_of("/", link.find_first_of("/") + 3))
: link.find_first_of("/") == string::npos ? link : link.substr(0, link.find_first_of("/"));

size_t index_quemark = link.find_first_of("?");

index_quemark == string::npos ?
(param = "", route = domain.size() == link.size() ? "/" : link.substr(domain.size()))
: (param = link.substr(index_quemark + 1), route = link.substr(domain.size(), index_quemark - domain.size()));

lua_pushstring(L, domain.c_str());
lua_pushstring(L, route.c_str());
lua_pushstring(L, param.c_str());

return 3;
}

由于上述代码是与 Lua 语言进行交互的 API,所以在下面给出通用的函数封装:

阅读更多

《Game Programming Patterns》学习笔记 - 观察者模式

观察者模式可能是应用最为广泛的设计模式了,Java 将它放到了自己的核心库 java.util.Observer 中,C# 更是将其通过 event 关键字把它嵌入到了自己的语法中

一种常见的定义可以把它描述为:

一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统

在游戏中最常见的用途便是 “成就系统”

阅读更多

《Game Programming Patterns》学习笔记 - 享元模式

简而言之,享元模式就是将对象的数据分为两部分,其中一部分没有特定指明是哪个对象的实例,因此可以在它们间共享,GoF 称这部分为 “固有状态”,一个很常见的例子便是开放世界中的树林的渲染和瓦片地图的数据存储方式

享元模式是对内存和开发者友好的,它可以通过减少重复部分数据避免内存冗余,并且通过合并类来减轻程序员的管理负担

阅读更多

《Game Programming Patterns》学习笔记 - 命令模式

GoF 中的定义:

将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

命令模式是一种回调的面向对象实现。

简而言之,便是将 “操作” 封装为类,将其实例化为对象后作为 “第一公民” 对待,一个通俗易懂的应用便是如绘图软件中的 Ctrl+Z 撤销功能

阅读更多

Lua 的开源 JSON 解析库 LuaJSONLib

开源了一个 Lua 的 JSON 解析库 LuaJSONLib,基于 cJSON
效率比较高,在关闭嵌套层数限制的情况下,每秒可以递归解析 1500 层 JSON 数据
项目链接:https://github.com/VoidmatrixHeathcliff/LuaJsonLib

API 总览

名称 功能
value = Load(str) 将已编码的 JSON 对象解码为 Lua 对象
value = LoadFromFile(path) 将指定路径文件中已编码的 JSON 对象解码为 Lua 对象
str = Dump(value [, isFormat=false]) 将 Lua 对象编码成 JSON 字符串
DumpToFile(value, path [, isFormat=false]) 将 Lua 对象编码成 JSON 字符串并存储到指定路径的文件中
阅读更多

SDL2入门 - 常用功能简明笔记

常用第三方库:

  • SDL2_ttf 用来处理文本显示
  • SDL2_mixer 用来处理扩展格式的音乐(譬如MP3等)
  • SDL2_image 用来加载带有透明通道的图片等

初始化

1
2
3
#include <SDL.h>

SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO); // 初始化视频和音频

创建窗口

1
2
3
4
5
6
7
8
9
10
11
12
#include <SDL.h>


#define WINDOW_WIDTH 窗口宽度
#define WINDOW_HEIGHT 窗口高度


SDL_Window* window = SDL_CreateWindow(
"窗口标题",
SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, // 分别表示窗口位置的x坐标和y坐标,使用内置常量SDL_WINDOWPOS_UNDEFINED表示窗口显示在默认位置
WINDOW_WIDTH, WINDOW_HEIGHT, // 分别表示窗口的宽度和高度
SDL_WINDOW_SHOWN); // 表示立即显示此窗口
阅读更多

从零开始用Python做一个女朋友

因为一只蝙蝠所引起的一系列连锁反应,导致一直宅在家中的自己突然有了重拾Python的勇气,一直以来想要做个智能对话机器人,于是说干就干,从最简单的关键词匹配做起,在目前进度中,通过调用公共接口实现了天气查询和实时新闻查询两个功能,后续功能将逐渐完善。由于本人Python学识不深,很多细节的处理上可能不尽完善,欢迎各位大佬指点~

由于目标是比较智能的机器人,所以借用了动漫刀剑的梗虚拟人物形象叫Alice 【宅属性暴露无遗】

总体思路还是模块化的思想,通过循环接收用户输入,然后通过自定义的__analyse()函数进行关键词匹配,将匹配结果通过数组返回,并在主过程内遍历数组内的事件标签,如果天气查询标签或新闻查询标签在内,则将用户输入传递给相应的自定义模块函数进行处理。话不多说,先呈上main.py模块代码:

阅读更多

关于拼凑MySQL语句时出现MySQLSyntaxErrorException错误提示


今天在学习JDBC时拼凑了如下MySQL语句,作为参数传给executeQuery()方法,运行时出现了运行时异常:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near……

错误的拼凑代码

错误提示

出错原因:拼凑出的sql字符串实际为“SELECT id, name, email, birthFROM customersWHERE”,其中birth与FROM以及customers与WHERE之间无空格,不符合MySQL语法标准,故会出现如上错误。

阅读更多