vs启动程序设置环境变量

目的

因为经常用第三方库,调试时候我不想复制Dll到运行目录,所以希望找到一个办法解决库的问题。

解决过程

设置环境
设置path=你自己的文件夹目录;
多个用分号分开即可。

补充:
向日葵远程操作的时候vs无法显示,可以在选项里面
如果可用,请使用硬件加速,这个选项关闭即可

POCO c++ 库 使用

背景

c++ 标准库基本没有考虑业务开发,偏离业务太远,对于开发者太不友好,我之前想在使用websocket ,但标准库没有,找了第三方库好久,发现不知道选什么好,c++库引用又不方便,必须编译成自己使用版本,对于我这个老手嫌麻烦,对新手不知道怎么办了.

poco库

这个库已经有10几年了,而且代码开发都是现代c++,代码可读性非常好,开发时候可以学习一下,我都不知道标准库代码为什么写成那样子,基本没有可读性,感觉自带混淆。。POCO 基本涵盖所有方面,加密,压缩,网络,转码 ,json,等等基本想到都有。

POCO 编译

https://github.com/pocoproject/poco

里面写了

自己必须自己安装cmake,我自己用cmake编译的,因为我直接点击sin工程编译总是编译失败,所以建议cmake,这里默认编译64位,windows开发大多数32位,目前我感觉不到64位程序的优势。

  1. 下载,我直接点击下载,我不用git
  2. 收到创建一个cmake-build目录
  3. 在当前目录启动cmd,要切换到当前目录,win11默认启动就当前目录
  4. cmake .. -A Win32 //生成工程,vs 版本必须要支持c++ 14 ,我开始用vs2012编译是不行,我后面用的vs2019, 默认会最高的版本编译,我这里编译32 ,如果你想64 就cmake ..
  5. cmake --build . --config Debug //编译debug版本,不然你开发debug时候,找不到对应库,因为POCO在头文件写lib引入,不同版本引入不一样。
  6. 找到bin debug dll复制到自己要工程即可。

总结

对于c++ windows 开发人来说,不怎么喜欢写命令编译,POCO 貌似有商业版本了,不过我们免费版本就可以了,基本涉及大部分业务。不得不佩服老外毅力,这个东西能写10几年维护,不得不说我们太多缺少这些精神,我们大部分一切只是为了利益。。。

node js 多线程

一、前提

我以前只认为node js 只能单线程,我自己用了一段时间electron 桌面开发,如果遇到CPU密集型业务怎么做呢?我不可能只靠一个CPU来搞业务啊,这个限制不是太大了?

二、解决方法

1:多进程

child_process

等模块创建多进程

这种打补丁方法不是很好,涉及进程通信,写代码效率不高,很容易出现bug。开发者很可能出现变量无法访问的问题,因为多个进程,变量没有共享。不过业务写很分开,也问题不大,多进程资源比较大。

2:多线程

worker_threads

真正用的是多线程,我自己写代码测试,不停创建worker_threads..

测试代码

const { Worker, isMainThread, parentPort } = require('worker_threads');
console.log("hello world:" + isMainThread)

/*if (isMainThread) {
  // This code is executed in the main thread and not in the worker.
  
  // Create the worker.
  const worker = new Worker(__filename);
  // Listen for messages from the worker and print them.
  worker.on('message', (msg) => { 
      console.log(msg); 
    });
} else {
  // This code is executed in the worker and not in the main thread.
  
  // Send a message to the main thread.
  parentPort.postMessage('Hello world!');
}*/

function test(){
    if(isMainThread){
      console.log("自动线程哦");
      const worker = new Worker("./work.js");
    }
   
}

setInterval(() => {
  test();
}, 1000);

通过定时器不停创建工程线程。

work.js

const { isMainThread, parentPort,Worker, threadId } = require('worker_threads');



const min = 2
const max = 1e7

function generatePrimes(start, range) {
    let primes = []
    let isPrime = true
    let end = start + range
    for (let i = start; i < end; i++) {
      for (let j = min; j < Math.sqrt(end); j++) {
        if (i !== j && i%j === 0) {
          isPrime = false
          break
        }
      }
      if (isPrime) {
        primes.push(i)
      }
      isPrime = true
    }
    return primes
 }


console.log("线程id:" + threadId)
generatePrimes(1, 10000000)
console.log("线程id:" + threadId + " 完成")

可以通过资源管理器查看线程【默认不显示,自己设置一下】,线程数不停增加

可以不停增加,因为我这个写法,会很快把cpu吃死。。。。如果像以前nodejs 普通写法,最多只能吃一个CPU..


注意在线程里面不要直接访问对象,毕竟node js 模式就是异步+主线程,引入多线程导致更多问题,多线程仅仅执行,然后丢回主线程即可。

electron 拦截 window.open

一、背景

我之前写一个工具用来客户端加载网页,同时可以注入js,增加功能,类似chrome 浏览器扩展逻辑,但由于网页总是新建一个窗口,我虽然用JS 注入,修改了所有 a 标签的 。但对于动态的无能为力,除非定时器不停遍历,但性能不好,于是就想从electron入手。

二、过程

自己网络查找一些有关的信息,找到一个new-window 事件,这个事件可以捕获新建窗口逻辑。

one_plugin_ui.webContents.on('new-window',(event, url, frameName, disposition, options, additionalFeatures)=&gt;{
      log.debug("new")
      one_plugin_ui.loadURL(url) //在当前窗口打开,如果不想打开,完全想拦截,可以通过url 判断,然后不跳转URL
      event.preventDefault()      
    })

protobuf 简单总结

一、为什么?

因为要做一个简单解析和生成代码,方便自己使用,不想用protobuf工具的生成cpp文件,觉得稍微麻烦一点,因为我只要简单解析和生成。不想写proto 文件。

二、工具

PC 工具

【自用工具】协议分析工具,进制转换,protobuf反序列化 - 『精品软件区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

web反序列化工具

Protobuf Decoder (protobuf-decoder.netlify.app)

三、原理

这种二进制协议一般都要有标志数据长度,可以说基本属性(虽然长度可以用分割符号来区别,以前传奇就是一个特殊符号来进行数据包切割)。

protobuf 编码格式: klv 对应key length value ,其实这么看没有特别。我们自己定义协常常这样子。

key: tag << 3 | wire_type 这样子生成。 tag代表标志类似编程语言的变量名,所以在proto 里面是唯一,wire_type 写的类型。这样子就很容易对应到我们编程中的变量定义。

这个Key 不一定是一个字节,因为tag 是varint ,动态整数。这个好处方便解析进制数据,方便扩展,不用担心,插入字段导致二进制顺序,如果对一些不需要字段可以不传,这样子网络传输内存就会减少。但坏处也是扩张带来数据增加,因为key不是必须的,比喻我们网络协议所有字段都是必须,而且不会在中间插入别的字段,那么key是没有必要的,如果一个包有10字段,相当于一个包起码增加10个字节,那么我一天发送很多数据包,那么浪费一些流量。但一个很多人产品,协议是不断升级的,所以前面说的也只是绝对条件下。相对于业务开发带来的好处,这点浪费算不了什么。想想http 这种短连接,浪费多少字节,但也不照样很流行。凡事不能太极端,否则收益就很低了。

四、总结

原理我只简单写一下key 的东西,本来还想写varint ,但感觉查一下资料也比较理解。varint主要用来表示整数,主要为了省字节占用而已。tag 也是用varint表示,varint 涉及都大小端,然后还有进制操作,所以新手很难理解,我最开始不知道怎么算的,多看几次就够了。

动态解析protobuf好处,可以不用写proto文件,简单解析对应数据,然后根据经验猜出具体类型。因为wire_type 里面只是大类型,里面还有几种类型,如果没有原始proto的文件,那么只能通过自己具体业务分析具体类型。

后续补充一下自己解析c语言代码,因为当前含一些垃圾测试代码,所以暂时不贴出来。

最近遇到难解决的问题,自己亲人生病了,忽然发现身体才是最重要的。

  • 坚持读书
  • 坚持锻炼身体
  • 注意饮食
  • 注意环境
  • 买保险

一切美好肯定不现实,但珍惜每一天还是可以做到