本文为 2025年11月工作生活总结。
研发编码
一次解决前端跨域问题的记录
背景:某带有网页的服务程序,前端使用了iframe技术,部署时使用nginx转发。iframe区域访问出错,同一页面其它内容正常。
信息:Refused to frame 'https://10.20.30.40:9000/' because an ancestor violates the following Content Security Policy directive: "frame-ancestors https://10.20.30.40:8888 https://10.20.30.40:8889".、Failed to execute 'sendmsg' on 'DOMWindow': The target origin provided ('https://10.20.30.40:9000/') does not match the recipient window's origin ('null').
解决:提示信息有几个IP地址,经核实是干扰项,与本服务无关。经过调研,发现需要在nginx配置文件添加如下几行配置项:
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET,POST,DELETE';
add_header 'Access-Control-Allow-Header' 'Content-Type,*';
含sqlite3的go程序的编译
因工作需要,在go工程里使用了go-sqlite3实现对sqlite3数据库文件的读写。在引入该库之前,该工程是纯go代码,因此可以在windows上交叉编译linux平台的运行文件。也因此不需要开虚拟机开发。引入该库后,进行交叉编译时出错。编译命令如下:
time CGO_ENABLED=1 GO111MODULE=on GOOS=$TARGET_OS GOARCH=$TARGET_ARCH go build -mod vendor \
-ldflags "-s -w -X '$proname/cmd.BuildTime=${BuildTime}' -X '$proname/cmd.Version=${Version}' -X '$proname/cmd.AutoRelease=${AutoRelease}'" \
-o $target main.go || exit 1
其中TARGET_OS为linux,TARGET_ARCH为amd64,可以看到,编译命令用CGO_ENABLED=1使能了CGO,出错具体信息如下:
# runtime/cgo
gcc_linux_amd64.c: In function '_cgo_sys_thread_start':
gcc_linux_amd64.c:57:2: error: unknown type name 'sigset_t'; did you mean '_sigset_t'?
sigset_t ign, oset;
^~~~~~~~
_sigset_t
gcc_linux_amd64.c:62:2: error: implicit declaration of function 'sigfillset' [-Werror=implicit-function-declaration]
sigfillset(&ign);
^~~~~~~~~~
gcc_linux_amd64.c:57:16: error: unused variable 'oset' [-Werror=unused-variable]
sigset_t ign, oset;
^~~~
cc1.exe: all warnings being treated as errors
从信息上看就是不同平台的某些函数和结构体不同而导致的,而我又不想大动干戈改造mingw环境。但不使能CGO也可通过编译,只是运行时出错,提示如下:
Binary was compiled with 'CGO_ENABLED=0', go-sqlite3 requires cgo to work. This is a stub
看来注定要开虚拟机编译,由于事情紧急,因此临时使用这种方法------虽然有服务器,但CICD还没时间搞。
后来找到了modernc.org/sqlite库,这个库是不依赖CGO,可以实现跨平台编译了。
C++字符串分割
问题:之前在C++工程里使用vector和string实现了一个字符串分隔的函数,在代码中主要用于解析csv文件(每行以逗号','隔开),为方便起见,还过滤了字段左右的空格。具体实现如下:
// 去掉前后空格------中间的不去掉
std::string& trim(std::string &str)
{
if (str.empty())
{
return str;
}
str.erase(0, str.find_first_not_of(" ")); //去除左边空格
str.erase(str.find_last_not_of(" ") + 1);//去除右边空格
return str;
}
std::vector <std::string> splitString(const char *s1, const std::string & delim)
{
std::string s = s1;
return splitString(s, delim);
}
// 分割string
std::vector <std::string> splitString(const std::string & s, const std::string & delim)
{
std::vector < std::string > elems;
std::string tmp;
size_t pos = 0;
size_t len = s.length();
size_t delim_len = delim.length();
if (delim_len == 0)
return elems;
while (pos < len)
{
int find_pos = s.find(delim, pos);
if (find_pos < 0)
{
tmp = s.substr(pos, len - pos);
elems.push_back(trim(tmp));
break;
}
tmp = s.substr(pos, find_pos - pos);
elems.push_back(trim(tmp));
pos = find_pos + delim_len;
}
return elems;
}
最近使用到了一个CSV文件,最后一项是备注字段,目前没有内容,字符内容为空。上述函数就无法正常读取了。由于该函数已被大量使用,为不扩大影响范围,再单独封装一个解析函数,具体如下:
std::vector<std::string> splitStringEmpty(const std::string& str, const std::string& delimiter) {
std::vector<std::string> tokens;
if (str.empty()) return tokens;
std::string::size_type start = 0;
std::string::size_type end = str.find(delimiter);
while (end != std::string::npos) {
tokens.push_back(str.substr(start, end - start));
start = end + delimiter.length();
end = str.find(delimiter, start);
}
// 添加最后一个token
tokens.push_back(str.substr(start));
return tokens;
}
使用上述函数分隔CSV文件每行字符串,不会去掉空的字段,比如",",其返回的长度为6,只是所有内容均为空。
紧急任务
本月被安排一个紧急的开发任务,加班加点赶工,月底正式上线试运行,截至今天,运行良好。
这个月中旬请了今年第一次的3天年假,在假期最后一天晚上去图书馆还书路上,领导来电,有个新的任务,优先级高,需尽快完成。后来了解一下,是因其他组的人员没时间,因此本是其他组的事派到我身上。我想我平时也没少加班,早到晚退都没落下,领导怎么还认为我能再抽时间完成其它组的事。经过一些评估后,决定使用自己熟悉的技术路线,并将其定性为demo等级。因为急有急的做法,什么文档方案什么需求评审,先不管。其它的事也暂时放后,按部分同事说的,事情都紧急,看哪个更紧急。
生活记录
感冒发烧买药
这个月下旬伊始,天气突然转凉,大睡发烧了,请假3天。后来发现又是秋季流感高发时期。只要天气突变,大锤就发烧,转而咳嗽。大妞还好一些,只是偶尔咳嗽。后来拿社保卡去买药,花了一些时间。先是听人说要绑定卡,于是我在某宝上搜索社保卡,刷脸认证,输入小孩身份信息进行绑定。结果药店不认,说要绑定医保卡。
我拿着手上写着"社会保障卡"几个大字的卡发了几分钟呆,终于明白是因为程序员思维作怪。这张卡实际是医保卡,于是继续在某宝上搜索医保卡,再次进行绑定。药店先是扫了小孩的二维码,再扫大人的二维码,一次不成功,再重复一次,最终买了小孩的药了。
在刷卡过程中咨询了工作人员,得到明确的答复,大人卡不能买小孩的药。后来我搜索了一些资料,资料表明,根据国家医保局2024年11月发布的《关于调整基本医疗保险用药管理有关事项的通知》,自2025年1月1日起,成人医保账户将无法直接支付儿童专用药品费用。
于是又学习并巩固了一些知识。