BurningBright

  • Home

  • Tags

  • Categories

  • Archives

  • Search

get nacos config in win10 cygwin

Posted on 2024-03-28 | In c++

安装

勾选组件并安装

1
2
3
4
5
6
7
8
make
cmake
gcc-core
gcc-g++
gdb
curl
mingw64
zlib

20240328134338.png


Cygwin安装教程

在Windows命令行中编译运行C/C++程序

源码

下载源码:nacos-sdk-cpp-1.1.0.zip

https://github.com/nacos-group/nacos-sdk-cpp

cmake . 正常运行

make 在构建 tid.h 时报错

1
2
3
#if defined(__CYGWIN__) || defined(MS_WINDOWS)
//TODO:for windows/cygwin
#include <sys/syscall.h>

cygwin能否使用syscall()或gettid()?

尝试在 tid.h 中添加 #include<windows.h> 引入windows上获取线程号的方法
发现很多全局定义冲突,例如 nb30.h中的 #define GROUP_NAME 0x80,和nacos中的GROUP_NAME冲突

Expected unqualified-id before numeric constant for defining a number

意识到是引入的范围太大,导致太多重名。
去除 tid.h 的引入,转而在实现部分 tid.cpp 中引入具体的windows方法

tid.h

1
2
3
4
5
#if defined(__CYGWIN__) || defined(MS_WINDOWS)
//TODO:for windows/cygwin
#include <unistd.h>
#define TID_T unsigned long long
TID_T gettidv1();

tid.cpp

1
2
3
4
5
6
#if defined(__CYGWIN__) || defined(MS_WINDOWS)
//TODO:for windows/cygwin
#include<windows.h>
TID_T gettidv1() {
return GetCurrentThreadId();
}

应该早点看到源码中的注释 //TODO:for windows/cygwin -_-!!!

编译

尝试删除test和example 再make,报错缺少main

c++ - 使用 cygwin 和 cmake 对 `WinMain’ 的 undefined reference
链接库的构建需要test包下的main,运行后获得动态、静态库、测试执行文件

libnacos-cli.dll.a
libnacos-cli-static.a
nacos-cli.out.exe

本地启动nacos服务,nacos-cli.out.exe可正常测试通过

从 example/getConfig.cpp copy 一份至根目录,修改配置
执行命令编译

1
2
g++ -I/usr/local/include/nacos/ getConfig.cpp libnacos-cli.dll.a -o getConfig.exe
g++ -I/usr/local/include/nacos/ getConfig.cpp libnacos-cli-static.a -o getConfig.exe -lcurl -lz -L.

和 README 提示给的命令有些不一样,命令的 -l 参数要放最后边

libcurl in Netbeans: ‘undefined reference to…’

双拼输入法

Posted on 2022-09-29 | Edited on 2024-03-28 | In blog

很久之前就听闻双拼大名,说是对拼音输入速度有很大提升。

一开始只是知道小鹤双拼,还特意在知乎看了看哪个双拼的码表好。

筛选了一下选项,打算在自然码和小鹤之间选一个。

20220907_160600.png

自然码的区块感较好便于记忆,小鹤更对称对双手负载友好。

看了知乎的打字分析,决定还是选择中下排使用率更高、双手负载更均衡的小鹤输入法。

最后附上一段声母、韵母的练习诗歌:

>
《采桑谣》
chūn,rì,qǐ,měi,zǎo,
春日起每早
cǎi,sāng,jīng,tí,niǎo,
采桑惊啼鸟
fēng,guò,pū,bí,xiāng,
风过扑鼻香
huā,kāi,huā,luò,zhī,duō,shǎo
花开花落值多少

>
《捕鱼歌》
rén,yuǎn,jiāng,kōng,yè,
人远江空夜
làng,huá,yī,zhōu,qīng,
浪滑一舟轻
wǎng,zhào,bō,xīn,yuè,
网罩波心月
gān,chuān,shuǐ,miàn,yún,
杆穿水面云
ér,yǒng,āi,yō,tiáo,
儿咏唉唷调
lǔ,ài,hé,ā,shēng,
橹嗳和啊声
yú,xiā,liú,wèng,nèi,
鱼虾留瓮内
kuài,huó,sì,shí,chūn,
快活四时春

用拼音输入汉字时,各字母的使用频率是怎样的?
各双拼输入方案之间有明显的优劣之分吗?

手持两把锟斤拷

Posted on 2022-08-10 | Edited on 2022-08-11 | In blog

tomcat乱码

在准备注解驱动spring mvc时,发现idea的控制台tomcat日志存在乱码淇℃伅
网上搜了搜文章,把tomcat的logging.properties字符集改GBK就能解决这个问题。

分析一下:tomcat默认输出UTF8日志,到idea控制台以GBK展示出现乱码。

常凯申的锟斤拷

联想起锟斤拷,似乎也是一样的问题
看知乎的文章锟斤拷是什么?,发现一个很简洁的回答和一个有意思的评论

匿名用户:gbk编码传过去,utf8的服务器不认得,给你返回了容错字符,又被gbk翻译回了汉字。。
万般皆苦唯有自度 回复 匿名用户:感觉和常凯申同理啊

蒋介石的『韦氏拼音』译名是『Chiang Kai-shek』,结果被又被国内学者译为『常凯申』。
倒是和字符集的乱码有异曲同工之妙,国外的拉丁字母做了容错,国内的翻译又不认识,妙啊~~~

用java试一下

1
2
3
4
5
6
7
8
String a = new String(new byte[]{-70, -70}, new GBK());
System.out.println(a);

String b = new String(new byte[]{-70, -70}, StandardCharsets.UTF_8);
System.out.println(b);

String c = new String(b.getBytes(StandardCharsets.UTF_8), new GBK());
System.out.println(c);

输出:

汉
��
锟斤拷

IDEA中控制台启动乱码(淇℃伅)的原因简单分析
IDEA控制台乱码问题,原因&解决方式,解决不了算我输

Spring注解驱动开发 Servlet 3.0整合Spring MVC

Posted on 2022-08-09 | Edited on 2022-08-10 | In java

准备

  • Intellij IDEA 2019
  • JDK 1.8
  • Maven 3.3.9
  • Spring 5.2.2.RELEASE
  • Tomcat 8.5.45

使用 maven-archetype-webapp 新建工程

Read more »

关于数据异步导出

Posted on 2022-05-18 | Edited on 2022-05-23 | In java

上周开始做大量数据导出需求,今天记录些思路。

分析

  1. 原系统使用同步导出,文件流形式响应前端。
  2. 前端页面一直卡住无提示体验不佳,且数据量有限制以避免请求超时。
  3. POI导出工具类使用XSSFworkbook,如果数据量巨大可能会内存溢出。

基于现状需要改造系统导出,采用异步导出。
异步导出可以做成统一界面、前端轮询或是邮件通知的形式。
异步导出文件对象,采用上传云存储返回用户URL的形式下载。

思路

asychronous _export.png
不开发界面查询导出任务,用户提交导出请求后,以同参数轮询接口。
应用系统兼顾后台系统和导出系统。

聊一聊数据导出那些事 这篇文章中聊到的导出过程相当有范

  1. 提交导出申请:接口实现
  2. 生成导出批次:参数实现
  3. 发送导出批次到中间件
  4. 提交申请成功
  5. 读取导出批次信息:异步线程池传参
  6. 查询/生成/加密文件
  7. 上传到云存储
  8. 组装下载地址
  9. 回填信息:前端轮询
  10. 查询导出申请并下载:前端轮询

总体看来思路相同,包括第六步对旧文件的处理
主要区别来自需求和架构,在用户交互和第五步对导出任务执行上的区别

实现

  1. 改造工具类使用SXSSFWorkbook导出excel
  2. 设计导出任务数据结构
  3. 同进程异步线程池执行导出任务;更新进度
  4. 管道流在异步线程池中上传文件对象;更新进度
  5. 列举云存储文件,删除旧导出文件
  6. 返回轮询目标任务文件URL,导出完成

聊一聊数据导出那些事
使用SXSSFWorkbook来导出excel
HSSFworkbook,XSSFworkbook,SXSSFworkbook区别总结
Java中怎么将OutputStream 转换成InputStream
对象存储 OSS

macOS 上安装 STM32CubeProgrammer

Posted on 2022-03-22 | In 漫步键圈

看了一段时间QMK主控,想找IO口多一点的板子,考虑过tensy2.0++,找了一下价格感人。
就算是tensy2.0,虽说IO口符合需求,但价格也有点贵,而且还是上古mini-usb接口,果断放弃。
想过自制type-c pro micro,考虑到没什么贴片元件焊接经验,手头又没焊接工具,也就不折腾了。
https://docs.qmk.fm/#/compatible_microcontrollers

最后选了一款stm32的板子。
STM32F411 “BlackPill” Development Board

安装

https://www.st.com/zh/development-tools/stm32cubeprog.html
从官网下载macOS安装包,对怎么安装使用两眼一抹黑,看见解压包里竟然有jre文件夹就有种不详预感。
果然双击带图标的文件,图标一闪而过,下意识以为是jre版本不对,毕竟压缩包里附赠jre,一通环境变量修改,把JAVA_HOME指向附赠的jre,依旧闪退。。。只好上网找答案。

万能的『栈溢出』

最后是在 stackoverflow 找到了答案Installing STM32CubeProgrammer on macOS Big Sur
没想到这玩意需要用命令行来打开,只能说很符合用户群风格。。。

1
./SetupSTM32CubeProgrammerx.y.z.app/Contents/MacOs/SetupSTM32CubeProgrammer-x_y_z_macos

20220318_231934
20220318_232001

测试

从qmk编译了 handwired/onekey/blackpill_f411,烧录顺利,测试成功。
有意思是这玩意儿对烧录的温度有要求,上周末降温尝试烧录别的固件一直报错,一度以为是空间超了,结果放电脑上热一会再烧录就好了。

log4j2 lookups issues

Posted on 2021-12-20 | In java

2021-12-10 上上周五,log4j2爆出一个严重的代码注入漏洞。
突发!Log4j 爆“核弹级”漏洞,Flink、Kafka等至少十多个项目受影响

看完报道,感觉挺严重,抱着试试看的心态打开intellij想复现表达式注入,结果失败了。
表达式并没有被执行,而是字符串打印了出来,当时下意识感觉和jdk版本有关联,后边证实了我的想法。

1
logger.info("hello {}", "${java:os}");
Read more »

探索httpClient 4.5.13 源码

Posted on 2021-10-28 | Edited on 2021-11-07 | In java

客户端创建

1
2
3
4
5
6
CloseableHttpClient httpClient = HttpClientBuilder.create()
.setDefaultSocketConfig(socketConfig)
.setDefaultRequestConfig(requestConfig)
.setMaxConnTotal(totalNum)
.setMaxConnPerRoute(routeNum)
.build();

连接池

连接池建造者

建造者模式在创建HttpClient时如果没设置自定义连接池,会默认创建池化连接管理器
Registry用于创建套接字上下文,dnsResolver用于域名解析

HttpClientBuilder::build()

1
2
3
4
5
6
7
8
9
10
11
// line: 984
final PoolingHttpClientConnectionManager poolingmgr = new PoolingHttpClientConnectionManager(
RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", PlainConnectionSocketFactory.getSocketFactory())
.register("https", sslSocketFactoryCopy)
.build(),
null,
null,
dnsResolver,
connTimeToLive,
connTimeToLiveTimeUnit != null ? connTimeToLiveTimeUnit : TimeUnit.MILLISECONDS);

Read more »

tapip的工程框架

Posted on 2021-09-18 | In network

工程目录

目录 文件 Description
app 内嵌shell的网络命令
ping.c 网络请求命令
snc.c 网络监听命令
arp arp_cache.c 地址数据缓存
arp.c 地址解析处理逻辑
doc 工程文档
… …
include 头文件
… …
ip 网络层
icmp.c 网际控制报文协议
ip_forward.c 报文重定向
ip_in.c 收到ip数据报,交给运输层
ip_out.c 发送ip数据报,从运输层来
raw.c 读取链路层数据
route.c 路由寻找下一跳
lib 静态库文件
cbuf.c 环型缓冲数据结构
checksum.c 加和检查完整性
lib.c 打印、内存分配方法等
net 物理层、数据链路层
loop.c 事件轮询
net.c 数据链路层
netdev.c 网络设备相关
pkb.c 数据报相关
tap.c 操作tap设备
veth.c 虚拟网络,用户态处理的起点
shell 交互界面
main.c 程序启动入口
net_command.c 网络命令交互
ping_command.c ping命令交互
shell.c
socket
inet.c 绑定上层运输层协议
raw_sock.c 默认网络帧处理
sock.c 底层套接字
socket.c 上层套接字
tcp 模拟传输控制协议
tcp_in.c tcp报文接收处理
tcp_out.c tcp报文发送处理
tcp_reass.c 分配数据段?
tcp_sock.c tcp套接字相关
tcp_state.c 状态处理 RFC 793
tcp_text.c 滑动窗口收发数据
tcp_timer.c 超时计时器
udp 模拟用户数据报协议
udp_sock.c udp套接字相关
udp.c udp报文接收处理

编译过程

外层Makefile 配置调试选项、网络拓扑选项
执行make命令时,先用下层Makefile构建各个模块.o文件
各模块.o文件链接为目标文件xxx_obj.o
各模块目标文件,构建为可执行文件tapip

1
2
3
4
5
6
7
8
9
LD = ld
CC = gcc
CFLAGS = -Wall -I../include
LFLAGS = -pthread
export LD CC CFLAGS

ifeq ($(CONFIG_DEBUG), y)
CFLAGS += -g
endif
  • ld 链接器
  • gcc 编译器
  • -Wall 选项可以打印出编译时所有的错误或者警告信息
  • -I 选项指定寻找头文件的路径
  • -pthread 执行多线程选项
  • -g 选项是指可以用gdb调试

CMake中使用pthread实践

tapip的网络拓扑

Posted on 2021-09-13 | Edited on 2021-09-18 | In network

网络拓扑一:替换内核网络协议栈

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
+----------+
| internet | (10.20.133.20)
+----|-----+ |
+----|-----+ |
| eth0 | (0.0.0.0)
+----|-----+ |
+----|-----+ |
| bridge | (0.0.0.0)
+----|-----+ |
+----|---------+ |
| tap0 | (0.0.0.0)
|--------------|
| /dev/net/tun | /dev/net/tun
+--|----|---|--+ |
poll | | |
| read | |
| | write |
+--|----|---|--+ |
| my netstack | (10.20.133.21)
+--------------+

通过网桥连通本地网络eth0和虚拟网络tap0

区别

  1. 本地网络作为网关
  2. 不支持重定向
  3. 路由初始化,下一跳为TAP的IP
  4. 如果下一跳不可达,需要返回Code 0 (Network Unreachable) ICMP报文(RFC 1812)
  5. 虚拟网络设备额外初始化过程
  6. ifconfig 命令特殊提示

脚本

  1. 创建网络设备tap0 简要输出接口名到垃圾桶
  2. 创建网桥设备br0
  3. 配置网桥通过 br0 连通 eth0 tap0
  4. 将eth0 tap0 br0加入本地网络并启动

WARNING

谨慎使用该模式,内核协议栈会被挂起,网络由用户态接管。
如果是远程登录使用TOP1可能会导致断连,无法继续使用。
建议直接使用串口同真实机器交互,以方便恢复原网络拓扑。

网络拓扑二:虚拟设备与核心交互

1
2
3
4
5
6
7
8
localhost                     outside network
kernel stack usermode stack [ ./tapip ]
| (10.0.0.1)
| (write) | .
| \|/ /|\
| ' | (read)
tap0 <------ netif_rx() -----/dev/net/tun
(10.0.0.2) `-- tun_net_xmit() -----------^

local -> tap0(10.0.0.2) -> veth0(10.0.0.1)

交互

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
                  +-------------------[Linux kernel TCP/IP stack]---------------------+
| |
arping 10.0.0.1 -----> socket send --> route --> tap0 --> tap0::dev_hard_xmit |
| ( arp packet: | |
| 10.0.0.2 request | |
| hwaddr of 10.0.0.1) | _tap0 (10.0.0.2)_ |
| | |
arping received <----- socket recv <-- tap0(netif_rx) <----. | |
| | | |
+-----------------------------------------|--|----------------------+
| |
/dev/net/tun
| |
(write) | | (read)
| |
.--------> reply --> netdev_tx-' | _veth (10.0.0.1)_
| \|/
| '
'- arp_in <-- netif_in <----- process
update arp cache <------' { usermode network stack }
  1. arping 命令进程向内核发起寻址请求
  2. 内核将请求包路由至tap0设备
  3. 经虚拟网络设备交换至用户态协议栈tapip处理
  4. 寻址结果返回设备tap0,经内核返回arping命令进程显示

Linux虚拟网络设备之tun/tap
user-mode TCP/IP stack based on linux tap device

12…29

Leon

282 posts
20 categories
58 tags
GitHub
Links
  • clock
  • typing-cn
  • mathjax
  • katex
  • cron
  • dos
  • keyboard
  • regex
  • sql
  • toy
© 2017 – 2024 Leon
Powered by Hexo v3.9.0
|
Theme – NexT.Muse v7.1.2