<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[the7daydead的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/the7daydead</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; the7daydead]]></copyright><item><title><![CDATA[AI使用分享-让AI简化我的报表整理工作]]></title><link>https://blog.youkuaiyun.com/the7daydead/article/details/158538503</link><guid>https://blog.youkuaiyun.com/the7daydead/article/details/158538503</guid><author>the7daydead</author><pubDate>Sun, 01 Mar 2026 13:39:13 +0800</pubDate><description><![CDATA[所以我把这件事做成了 venue-electricity-report skill，让重复且高风险的步骤尽量由脚本完成，把我的时间留给核验和异常判断。在没有自动化之前，我每个月都要从原始电量数据里逐条筛选、按日期分段、套用工作日和周末规则，再手工整理到目标报表。说明：这张图对应目标明细表样式（预览），不仅要填值，还要保证分段、公式、周末行样式和备注规则一致。阶段描述：我先把业务需求整理成文档发给助手，明确数据源、目标文件、统计月份和口径一致性要求。AI具体执行：我确认核验通过后再对外交付，保证一致性。]]></description><category></category></item><item><title><![CDATA[win32：windbg定位std::mutex死锁的方法]]></title><link>https://blog.youkuaiyun.com/the7daydead/article/details/125590122</link><guid>https://blog.youkuaiyun.com/the7daydead/article/details/125590122</guid><author>the7daydead</author><pubDate>Sun, 03 Jul 2022 21:55:15 +0800</pubDate><description><![CDATA[windows高级调试]]></description><category></category></item><item><title><![CDATA[ndk：调试&日志]]></title><link>https://blog.youkuaiyun.com/the7daydead/article/details/123275388</link><guid>https://blog.youkuaiyun.com/the7daydead/article/details/123275388</guid><author>the7daydead</author><pubDate>Fri, 04 Mar 2022 14:03:47 +0800</pubDate><description><![CDATA[一、概述

本文档会介绍如何通过native接口写入安卓日志，以及调试的一些技巧。



二、日志


	日志的使用方法
	
通过该方式写得日志，会被重定向到logcat里

a) Android.mk加入模块编译







b) 文件里引用#include &lt;android/log.h&gt;

c) 调用头文件里提供的相关接口

比如：







d) ndk-build







e) 把libs拷贝到工程目录，并在as里面引入配置项







f) java里面调用na...]]></description><category></category></item><item><title><![CDATA[ndk：jni]]></title><link>https://blog.youkuaiyun.com/the7daydead/article/details/123275254</link><guid>https://blog.youkuaiyun.com/the7daydead/article/details/123275254</guid><author>the7daydead</author><pubDate>Fri, 04 Mar 2022 13:58:23 +0800</pubDate><description><![CDATA[一、概述

jni即java native interface，是提供给C++用来开发供Java本地调用的一系列支持接口。

以下会从这几个方面来介绍：


	类型对应&amp;使用
	
	
	成员方法（静态/非静态）调用&amp;&amp;成员变量赋值
	
	
	异常
	
	
	局部引用&amp;全局引用
	
	
	线程
	


二、类型对应&amp;使用

基本类型：







引用类型：







注：基本类型的数据，可以直接使用，但是引用类型不能，必须使用jni的api来存取


	字符..]]></description><category></category></item><item><title><![CDATA[ndk：概述/项目结构/开发流程]]></title><link>https://blog.youkuaiyun.com/the7daydead/article/details/123178092</link><guid>https://blog.youkuaiyun.com/the7daydead/article/details/123178092</guid><author>the7daydead</author><pubDate>Mon, 28 Feb 2022 11:19:01 +0800</pubDate><description><![CDATA[一、概述

ndk，native develope kit，是安卓提供的一套jvm调用本地C++接口的一套机制，支持在windows以及linux下面进行开发编译。



二、NDK提供了什么


	ndk给C++提供了一系列C++调用jvm的接口（jni）
	
	
	交叉编译工具链
	
	
	输出供安卓jvm使用的.so或者.a文件
	


三、NDK的项目结构


	Andriod.mk：描述需要纳入编译的文件，以及一系列编译参数
	
	
	Application.mk：描述编译参数
	...]]></description><category></category></item><item><title><![CDATA[duilib：从底层分析duilib的大致实现逻辑]]></title><link>https://blog.youkuaiyun.com/the7daydead/article/details/122346103</link><guid>https://blog.youkuaiyun.com/the7daydead/article/details/122346103</guid><author>the7daydead</author><pubDate>Thu, 06 Jan 2022 16:04:50 +0800</pubDate><description><![CDATA[按我理解，概括起来，总体包括几个部分，注册窗口，创建窗口，创建控件树，绘制，消息机制。



创建窗口&amp;&amp;注册窗口：

1. RegisterWindow指定一个静态回调函数WndProc



2. CreateWindowEx最后一个参数把自己当作参数传递过去



3. WndProc收到WM_NCCREATE消息后，转换一下tagCREATESTRUCT，获取创建的窗口句柄hWnd还有上一步提供的参数lParam，通过SetWindowLongPtr把hWnd，lParam保存下来
]]></description><category></category></item><item><title><![CDATA[C++：每天一个挨打小技巧-利用模板做一个高可用的windows命令行解析接口(续)]]></title><link>https://blog.youkuaiyun.com/the7daydead/article/details/119481506</link><guid>https://blog.youkuaiyun.com/the7daydead/article/details/119481506</guid><author>the7daydead</author><pubDate>Sat, 07 Aug 2021 11:08:59 +0800</pubDate><description><![CDATA[今天继续来增加挨打技巧，前面写到的一个命令行解析其实可以更狠一点，可以支持所有基本类型的入参解析（后续读者需要新增自定义类型的话也可以自己拓展）

下面贴上源码，其中有个接口需要自己实现，CStringUtil::split就是分隔字符串里面内容的。


#pragma once 

#include &lt;deque&gt;
#include &lt;typeindex&gt;

#include "string_util.h"

class CmdHepler{
public:
	template&l]]></description><category></category></item><item><title><![CDATA[C++：每天一个挨打小技巧-利用模板做一个高可用的windows命令行解析接口]]></title><link>https://blog.youkuaiyun.com/the7daydead/article/details/119458147</link><guid>https://blog.youkuaiyun.com/the7daydead/article/details/119458147</guid><author>the7daydead</author><pubDate>Fri, 06 Aug 2021 16:30:09 +0800</pubDate><description><![CDATA[在日常windows开发过程中，很多时候需要调整我们的命令行参数的个数，以下通过模板的特性，设计一个高可用的命令行解析接口。

实现：


#pragma once 

class CmdHepler{
public:
	template&lt;typename Tup&gt;
	static void get_cmd(Tup&amp; tup) {
		std::vector&lt;std::string&gt; params;
		int nArgs = 0;
		LPWSTR *szArglist =]]></description><category></category></item><item><title><![CDATA[duilib：设计一个“长度不够，按钮来凑“的duilib布局控件]]></title><link>https://blog.youkuaiyun.com/the7daydead/article/details/119103601</link><guid>https://blog.youkuaiyun.com/the7daydead/article/details/119103601</guid><author>the7daydead</author><pubDate>Mon, 26 Jul 2021 10:15:01 +0800</pubDate><description><![CDATA[本控件主要为了支持布局内元素很多，但是又不想显示滚动条，意图通过按钮来控制布局滚动的情形。

效果图如下：

当布局高度足以容纳所有子控件时：



当布局高度不足以容纳子控件时：



并且上下按钮支持点击翻页功能。





主要实现思路：

1. 控件构造的时候，把上下两个按钮以及中间的布局给添加到控件里。

2. 控件处理绘制事件的时候，通过判断中间的布局滚动条的显示状态来隐藏/显示上下按钮。

3. 托管上下按钮的点击通知。

4. 由于需要滚动条显示属性的支持，因此只能把滚动条的宽度设置为...]]></description><category></category></item><item><title><![CDATA[duilib：设计一个高可用，支持uri下载的duilib控件]]></title><link>https://blog.youkuaiyun.com/the7daydead/article/details/119046766</link><guid>https://blog.youkuaiyun.com/the7daydead/article/details/119046766</guid><author>the7daydead</author><pubDate>Sat, 24 Jul 2021 00:28:18 +0800</pubDate><description><![CDATA[先喵两句，本文只是提供一个具体思路，直接copy肯定编译不过，需要自己实现以下接口：

1.uri下载接口

2.主线程调用接口（如果可能的话）

3.线程池

duilib默认没有支持uri图片的控件，很多业务逻辑都需要自己实现，因此就有了以下的大胆想法，由于图片下载/显示的逻辑都很雷同，没必要一个个继承，然后重复写一套逻辑，显得代码很冗余，于是就有了以下想法，直接用模板类来实现这些接口。

代码上面也会有相应的注释，将就着看吧：

.h文件：


using namespace std::tr2;...]]></description><category></category></item><item><title><![CDATA[C++：实现支持传参的PPL调用]]></title><link>https://blog.youkuaiyun.com/the7daydead/article/details/117697626</link><guid>https://blog.youkuaiyun.com/the7daydead/article/details/117697626</guid><author>the7daydead</author><pubDate>Tue, 08 Jun 2021 12:37:33 +0800</pubDate><description><![CDATA[#prama once

template&lt;typename T&gt;
class Task;

//偏特化Task
template&lt;typename R,typename... Args&gt;
class Task&lt;R(Args...)&gt;
{
public:
    using func_type = std::function&lt;R(Args...)&gt;;
    Task(func_type&amp;&amp; func) : m_fn(std::forward.]]></description><category></category></item><item><title><![CDATA[C++：可变长参数模板-函数篇]]></title><link>https://blog.youkuaiyun.com/the7daydead/article/details/117399845</link><guid>https://blog.youkuaiyun.com/the7daydead/article/details/117399845</guid><author>the7daydead</author><pubDate>Sun, 30 May 2021 16:47:18 +0800</pubDate><description><![CDATA[利用C++11的新特性来简化我们的print：

1.递归，递归需要有一个终止条件，具体可以有以下几种方式：

1.1


]]></description><category></category></item><item><title><![CDATA[C++：C++11里std::thread的那些坑]]></title><link>https://blog.youkuaiyun.com/the7daydead/article/details/116598652</link><guid>https://blog.youkuaiyun.com/the7daydead/article/details/116598652</guid><author>the7daydead</author><pubDate>Mon, 10 May 2021 16:09:47 +0800</pubDate><description><![CDATA[1. join()函数

std::thread里面提供了join函数，等待线程返回，这个本没有什么问题，在C++14以上的SDK版本编译下，这个都没啥问题。但是，在C++11的SDK版本下面编译时，如果在析构函数里面调用join()就要注意了的，假如你是个局部变量还好说，假设你的变量生命周期时整个程序，那么在析构函数里面调用join()，在推出程序时，就会导致进程崩溃（同样的操作在C++14以上完美运行）
...]]></description><category></category></item><item><title><![CDATA[C++：enable_if与模板偏特化的学习与实践]]></title><link>https://blog.youkuaiyun.com/the7daydead/article/details/116329639</link><guid>https://blog.youkuaiyun.com/the7daydead/article/details/116329639</guid><author>the7daydead</author><pubDate>Sat, 01 May 2021 13:26:45 +0800</pubDate><description><![CDATA[由于项目的的旧代码不堪入目，只能一块块进行重构，最近找一个结构换json的开源库xpack，为了方便使用，对他封装了一下。

但是并不是所有结构体都可以直接使用xpack生成json串，结合最近学到的新东西，我对封装类进行了改造。

话不多说，先上代码：


#prama once

template&lt;typename T&gt;
struct is_x_pack
{
    template&lt;typename U,typename = decltype(U::xxx)&gt; struct H]]></description><category></category></item><item><title><![CDATA[win32：DLL以及lib的区别]]></title><link>https://blog.youkuaiyun.com/the7daydead/article/details/116140263</link><guid>https://blog.youkuaiyun.com/the7daydead/article/details/116140263</guid><author>the7daydead</author><pubDate>Sun, 25 Apr 2021 23:01:10 +0800</pubDate><description><![CDATA[最近一直在研究项目重构的事情。
考虑把所有模块都做成dll的方式让主进程加载：
1.静态库存储全局共享变量
2.dll存储全局共享变量
经过实验发现，如果把静态库编译到dll，exe里面，各自都会保存一份静态库全局变量的拷贝。无法做到数据共享。因此第一个方法行不通。
后来对第2种做了实验，发现可行。

...]]></description><category></category></item><item><title><![CDATA[C++：主线程异步调用]]></title><link>https://blog.youkuaiyun.com/the7daydead/article/details/115737962</link><guid>https://blog.youkuaiyun.com/the7daydead/article/details/115737962</guid><author>the7daydead</author><pubDate>Thu, 15 Apr 2021 20:17:09 +0800</pubDate><description><![CDATA[.h


#pragma once

#define SEND_TASK(...)				_message_loop_win.SendTask(__VA_ARGS__)
#define POST_TASK(...)				_message_loop_win.PostTask(__VA_ARGS__)
#define POST_DELAY_TASK(...)		_message_loop_win.PostDelayTask(__VA_ARGS__)
#define CURRENTLY_ON_TID_UI			]]></description><category></category></item><item><title><![CDATA[C++：实现mvvm]]></title><link>https://blog.youkuaiyun.com/the7daydead/article/details/114274605</link><guid>https://blog.youkuaiyun.com/the7daydead/article/details/114274605</guid><author>the7daydead</author><pubDate>Tue, 02 Mar 2021 00:04:24 +0800</pubDate><description><![CDATA[最近做了一段时间WPF，印象最深刻就是里面的mvvm模式，打算用C++做一个雏形，并为以后的项目做准备。

首先讲一下我对mvvm的理解（可能会有偏差，各位大佬可以指点），mvvm其实可以分开理解为 model , view ,viewmodel 。model提供数据模型，view就是ui，viewmodel做一些跟ui无关的逻辑（更新数据等），跟传统的mvc对比，control很难摆脱与view的耦合，比如更新ui元素等，长期下来，controler的代码只会越来越臃肿。mvvm是一套基于数据绑定的设计模]]></description><category></category></item><item><title><![CDATA[C++：跨模块调用服务]]></title><link>https://blog.youkuaiyun.com/the7daydead/article/details/113764729</link><guid>https://blog.youkuaiyun.com/the7daydead/article/details/113764729</guid><author>the7daydead</author><pubDate>Tue, 09 Feb 2021 00:35:11 +0800</pubDate><description><![CDATA[跨模块调用是一个比较头疼的问题，往往因为模块耦合性比较强，使得代码逻辑比较复杂。



1. 如何能实现跨模块调用，又不互相耦合？

通知者不关心谁需要处理该消息，处理者也不一定需要知道是谁发送了此消息。

windows自带的消息机制刚好可以解决该问题，但是此消息机制有几个致命的缺点：一，必须有窗口支持，当然该部分逻辑可以注册一个虚拟窗口来处理，但是也为编码带来了很大阻碍。二，更致命的是，消息队列在资源紧缺的情况下，还会出现消息丢失的情况。

但是PostMessage这个思维还是值得推广的。



..]]></description><category></category></item><item><title><![CDATA[关于linux下/sys目录]]></title><link>https://blog.youkuaiyun.com/the7daydead/article/details/8796989</link><guid>https://blog.youkuaiyun.com/the7daydead/article/details/8796989</guid><author>the7daydead</author><pubDate>Sat, 13 Apr 2013 15:00:37 +0800</pubDate><description><![CDATA[sysfs 是 Linux 内核中设计较新的一种虚拟的基于内存的文件系统，它的作用与 proc 有些类似，但除了与 proc 相同的具有查看和设定内核参数功能之外，还有为 Linux 统一设备模型作为管理之用。相比于 proc 文件系统，使用 sysfs 导出内核数据的方式更为统一，并且组织的方式更好，它的设计从 proc 中吸取了很多教训。本文就 sysfs 的挂载点 /sys 目录结构、其与]]></description><category></category></item><item><title><![CDATA[linux下的/proc/目录]]></title><link>https://blog.youkuaiyun.com/the7daydead/article/details/8796954</link><guid>https://blog.youkuaiyun.com/the7daydead/article/details/8796954</guid><author>the7daydead</author><pubDate>Sat, 13 Apr 2013 14:47:45 +0800</pubDate><description><![CDATA[1. /proc目录
Linux 内核提供了一种通过 /proc 文件系统，在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统，它只存在内存当中，而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。

用户和应用程序可以通过proc得到系统的信息，并可以改变内核的某些参数。由于系统的信息，如进程，是动态改变的，所以用户或应用程序读取proc文]]></description><category></category></item></channel></rss>