brokkr

brokkr 查看完整档案

北京编辑  |  填写毕业院校  |  填写所在公司/组织填写个人主网站
编辑
_ | |__ _ _ __ _ | '_ \| | | |/ _` | | |_) | |_| | (_| | |_.__/ \__,_|\__, | |___/ 个人简介什么都没有

个人动态

brokkr 回答了问题 · 4月14日

git 防止提交

如果你要忽略的文件在某个文件夹中,那么用 .gitignore 就可以,譬如你希望忽略 temp 目录下的文件,在 .gitignore 加入一行:

temp/

就可以了。

关注 6 回答 5

brokkr 回答了问题 · 4月9日

解决2-3树和2-3-4树为啥不直接叫3阶树或者4阶树?

因为二叉树表示每个节点都有两个儿子,而2-3树表示每个节点有二或三个儿子,如果你叫三叉树就容易让人误解每个节点都必须有三个儿子。2-3-4树的问题类似。

关注 3 回答 3

brokkr 关注了标签 · 4月5日

c++

C++是一种静态数据类型检查的,支持多范型的通用程序设计语言。C++支持过程化程序设计、数据抽象化、面向对象程序设计、泛型程序设计、基于原则设计等多种程序设计风格。

关注 14782

brokkr 回答了问题 · 4月5日

C++右值引用问题

你这个问题涉及到编译器层面了,首先确认一点,这个代码在 Windows 下运行,跟 Linux 下的结果并不一致,在 Windows 下运行,即使带析构函数,其结果也是不一样的,如下:

ctor: 00D8F350
f 00D8F350
dtor: 00D8F350
ff 00D8F51C
dtor: 00D8F51C
Hello World!

这说明你的这个问题其实是编译器的差异所导致,正常来说

Foo f()
{
    Foo foo;
    cout << "f " << &foo << endl;
    return foo;
}

你在 f() 函数里面定义的 foo 变量是声明在局部堆栈里面,即便编译器帮你优化,也不应该直接返回局部堆栈里面的东西,因为函数返回后堆栈指针就调平了,类似 move 这样的优化只是让你少调用一次构造而已,但数据仍然要做拷贝的。
但 g++ 能让局部堆栈里面的东西在函数返回后也能继续使用,那就是g++编译器的优化技术牛X了,但这东西是不能当作标准来使用的。

关注 3 回答 1

brokkr 回答了问题 · 4月5日

解决【vscode报错】"\"f\" is not defined"

应该就是不小心插入了一个分页符,那个符号是不显示的,你在报警的地方按两下Backspace就好了。

关注 2 回答 1

brokkr 回答了问题 · 4月4日

解决git提交大文夹怎么办

你可以看看https://github.com/nachoparke...
里面的 git forget-blob file-to-forget命令貌似就是你想要的
上面那个动gif演示了如何删除一个误上传的大ISO文件。

关注 3 回答 3

brokkr 回答了问题 · 4月4日

windows下可以“纯静态编译”吗?

按你所说的纯静态的概念,在Windows上是不存在的,除了 msvcrt.dll 外,其它的几个库都是Windows 系统的核心,除非你的程序只做纯计算,不做任何io输出,否则必然需要调用系统API,这些系统核心的DLL是必须要打交道的。

而且你所谓的纯静态编译也没有意义,因为你编译的Windows程序不可能脱离Windows环境去运行,系统的动态库你编译到你的程序里面也没任何好处,不要说为了更好的兼容性,因为kernel32.dll又会依赖系统其它的dll,到最后真的纯静态编译是要把整个Windows打包到你的程序里面才能实现,那是没有意义的。

关注 2 回答 1

brokkr 发布了文章 · 4月3日

打造程序员自己的“云笔记”

因为工作关系经常在台式机/笔记本,家里/单位切换来切换去,希望能够有一种不用那么费神的保持工作连贯性的方式。git 很好,但太繁琐了,下班走的时候忘记push了,到家就续不上了。当然我指的不是开发的代码,而是一些文档性的东西,譬如一些计划、一些学习心得,在网站上查东西的时候也会有一些随笔的记录什么的,因为太零碎,又随时希望能够查到,所以觉得也许云笔记是一个不错的选择。

在使用了一年左右的“xx云笔记”后,感觉自己越来越难以忍受了,首先的问题是搜索,云笔记的搜索是 word 式的,需要一个一个搜,不支持内容列表、不支持F3,对于程序员来说完全是废物。其次是我曾经在一个 .md 文件中贴了一大段的代码,结果下次打开的时候足足卡了7、8秒,上下翻页也是卡的不行。文档上说md支持很多流程图、甘特图...,结果做好的 .md 文件发到 github 上很多都显示不了,大都是自己的扩展,离开了“xx云笔记”后就是一堆谁都看不懂的东西。

那么有没有更加符合程序员需求的“云笔记”呢,因为日常开发上经常使用 vscode 做开发,vscode 无论在编辑还是搜索上,都完全符合要求。于是就考虑能否用 vscode 打造一个符合自己的“云笔记”,我们都知道 vscode 里面有大量的插件,而且可订制化非常强,那么能否把 vscode 改造成符合自己要求的“云笔记”呢,抱着这个想法开始了对 vscode 的研究工作。

云服务器的选择

如果想做到跨设备同步,一个云存储后台是必须要有的,那么第一个问题就是选择什么样的云后台服务器。这里我又回到了 git 的怀抱,毕竟 git 服务器是非常成熟的解决方案,而且 vscode 与 git 的配合是天生的。而且即使没有“云笔记”的垃圾桶功能也不怕误删除文档,git 用来干这个事完全是大才小用。

我可以选择 github 或 “码云”,反正都是免费的,完全够用了,在国内选择“码云”会比 github 快一些。如何去注册 github 或 “码云”的账户就不在这里说明了,不了解的朋友可以自行搜索。

自动化的同步

下一个问题是 git 的操作问题,git 的设计目标是为了做代码管理的,但我希望的效果是像云笔记那样的完全无感的自动化同步,如果每次都要记着 push/pull 就还不如用云笔记了。在插件仓库里面各种查找和测试,终于找到一个基本符合需要的插件 -- Auto-Git,这个插件可以定时自动从仓库里面 push/pull 数据,正是我需要的。

这个插件装完了,会在我当前的文档工程下建立一个 .autogit 目录,里面有一个 autogit.json 文件,这个文件是 Auto-Git 的配置文件,例如我的配置:

{
  "updateInterval": 1800,
  "logging": false,
  "silent": true
}
  • updateInterval
    是这个插件同步代码的时间,我设定为 1800 秒,也就是半小时,当然你可以设定的更短一些,但半小时对我来说足够了,因为我单位的电脑从来不关机,从单位到家也不止半小时。
  • logging
    指是否要在上传下载的时候生成 log,完全不需要,我只要结果,不关心过程。
  • silent
    静默模式,当然了,要不我装你干嘛。

插件装好后,你可以在下面的状态栏左侧看到类似:

Next Auto-Git in... 1265

的显示,这就是告诉你在 1265 秒后开始自动同步数据。

最后还有一个比较麻烦的问题,我只想在我的文档项目中使用 Auto-Git,不想在真正的开发项目中做这种自动化的同步,容易把其他人搞晕。这个问题的解决办法是给我的文档工程建立一个工作区,然后全局禁用 Auto-Git,然后再在这个工作区上单独开启 Auto-Git,这样就让这个插件只在这个工作区开启了。

像 github 一样显示 .md 文档

首先我的文档基本都是 .md 格式的,有时候写好的文档会上传到 github 这样的代码平台上。vscode 是自带 .md 的显示支持的(Ctrl-K V),但它默认的显示效果跟 github 上显示的 .md 的显示效果并不一样,那么有没有办法能够让我在 vscode 里面看到跟 github 上一样的显示效果呢?好在并不是只有我有这样的需求,网上已经有人做过了:

https://github.com/raycon/vscode-markdown-style

这个项目 preview 目录下的 github.css 就是我需要的。把这个文件下载回来,放到文档项目的 .vscode 目录下(为了避免干扰正常的文档文件),然后打开 .vscode 目录下的 setting.json 文件,加入:

"markdown.styles": [
    ".vscode/github.css"
]

现在再预览 .md 文件就跟在 github 上看到的一致了。

像“xx云笔记”一样编辑 md 文件

因为用了一年的“xx云笔记”,已经习惯了绿色的标题、蓝色的代码,在用 vscode 写 md 后,编辑环境的颜色就各种不习惯,本人又是轻度强迫症患者,一定要把 vscode 的编辑环境也搞得跟“xx云笔记”一样才行。
本来以为有插件能帮我搞定这个事,但测试了一圈各种插件后,发现没有符合我需要的插件,我不相信 vscode 无法搞定这个事,在网上搜到一篇《VSCode 修改编辑器配色》的文章后,才豁然开朗,原来 vscode 本身就支持订制化。

这个就不能在当前工作区的设置里面改了,必须要改全局的 setting.json,

  1. 按 Ctrl+Shift+P打开 vscode 控制台
  2. 输入 Open Settings(JSON) 打开全局的 setting.json
  3. 在后面加入:

    "editor.tokenColorCustomizations" : {
        "textMateRules" : [
            {
                "scope" : "markup.heading.markdown",
                "settings" : {
                    "foreground" : "#8bcc8b",
                }
            },
            {
                "scope" : "markup.fenced_code.block.markdown",
                "settings" : {
                    "foreground" : "#6699cc",
                }
            },
            {
                "scope" : "punctuation.definition.list.begin.markdown",
                "settings" : {
                    "foreground" : "#a0a0a0",
                }
            }
        ]
    }

    现在就能看到熟悉的绿标题,蓝代码了,如果没看到请重启 vscode。

结束语

虽然花了不少时间去研究,一旦成功了还是非常有成就感的。在这里把自己趟过的坑跟大家分享一下,希望有更多的程序员朋友能够跟我一样订制出最符合自己的“云笔记”,也希望能够跟我一起分享你的订制心得。

查看原文

赞 0 收藏 0 评论 0

brokkr 回答了问题 · 3月31日

javascript md5无法实现二进制的md5计算只能进行string的md5计算吗

可以对二进制做md5,你需要使用 spark-md5.js 来实现对二进制流进行md5。如果想了解原理就自己看代码吧。

关注 3 回答 2

brokkr 回答了问题 · 3月31日

C++接口类析构的疑问

1.(父类析构函数不是虚函数)使用父类指针指向子类对象,析构该子类对象时,只会调用父类析构函数
2.(父类析构函数是虚函数)使用父类指针指向子类对象,析构该子类对象时,会先调用子类的析构函数,再调用父类的析构函数
3.(父类析构函数不是虚函数)使用子类指针指向子类对象,那么会先调用子类析构函数,再调用父类析构函数

B 与 A 的关系符合 2,所以先调用 B 的析构再调用 A 的析构
A 与 parent_t 的关系符合 3,所以调用完 A 的析构会继续调用 parent_t 的析构

关注 2 回答 1

brokkr 回答了问题 · 3月31日

解决Windows上有办法判断一个程序的运行方式吗?

GetParentProcessID 可以获取父进程的 pid
CreateToolhelp32Snapshot 可以获取正在运行的进程列表,然后你通过父进程 pid 就能知道到底是哪个程序启动了你的程序。

关注 3 回答 3

brokkr 回答了问题 · 3月31日

解决malloc结构体指针问题?

Link 是一个指针, 我假设你编译的是 32 位的代码,那么 sizeof(Link) = 4
同理 sizeof(struct Node) = 16
那么 pa 指向了一个 4 字节的空间,而 pb 指向了一个 16 字节的空间
pa->a 恰好指向了这4字节的空间,当然没问题,如果你用 pa->b 可能就崩了。

关注 3 回答 2

brokkr 回答了问题 · 3月31日

在Emeditor或everedit中如何配置编译C语言的外部工具?

你说的这两个都是文本编辑器,不是集成开发环境,文本编辑器可以用来写代码,但也就限于写代码,你需要配合外部C编译器需要的是集成开发环境,譬如 vscode。

关注 2 回答 1

brokkr 回答了问题 · 3月31日

头文件里定义了一个struct Stu {}; 在cpp里不包含头文件,怎么能引入这个struct呢?

不包含头文件,你就只能再定义一次,反正你不引入头文件,也不会产生重命名的问题。

关注 2 回答 1

brokkr 回答了问题 · 3月31日

A服务器到B服务器,有没有可能ping不同,但是telnet端口是通的?

ping 是 ICMP 包,你可以在防火墙的设置里面禁止 ICMP,就屏蔽ping了。
telnet 通常使用的是 tcp/ip 22 端口,只要你的防火墙设置里面设置允许 telnet 的端口,telnet 就能够连接,这个设置跟 ping 的设置是无关的。
服务器屏蔽 ping 通常是为了防止黑客的嗅探。

关注 3 回答 3

brokkr 回答了问题 · 3月31日

解决c++ Tcp/IP的socket编程中,如何自定义传输的协议?

协议是一个很大的概念,通常来说tcp/udp/http我们称之为传输协议。
而你这里的协议我理解为通讯的数据格式,最简单的例子:

struct Point
{
   int x;
   int y;
};

// ...
Point point{22, 31};
send(&point, sizeof(Point));

这是最简单的数据格式,但通常来说,你传输的内容应该不止"点"的数据,所以通常会需要一个类型用于区分数据类型。

struct Point
{
   int x;
   int y;
};
struct Line
{
   int x1;
   int y1;
   int x2;
   int y2;
};

struct Data
{
    int type; // 后面的数据类型(0=Point, 1=Line)
    union
    {
        Point point;
        Line line;
        // ...
    }
};
// ...
send(&data, sizeof(Data));

这就是我们通讯中最常见的数据格式定义。

关注 2 回答 2

brokkr 回答了问题 · 3月17日

请问通过OpenProcess 和 CreateProcess获得的handle有何不同。

用CreateProcess创建出来的进程是你的进程的子进程,所以默认权限会比较高,你可以调用WriteProcessMemory。但OpenProcess 打开的是其他已运行的进程,默认只有查询的权限,所以调用 WriteProcessMemory就会失败。

在 OpenProcess 的时候 dwDesiredAccess 如果给 PROCESS_ALL_ACCESS 就没问题,但如果你的程序本身没有管理员权限,OpenProcess 很可能会失败。

关注 2 回答 1

brokkr 回答了问题 · 3月14日

解决C++使用FindWindow (windows.h) 为什么不能识别中文?

在 C++11标准增加了一种新的字符串定义方式原始字符串文字(raw string literal)

auto s0 = "hello";    // const char*
auto s1 = u8"hello";// const char*, encoded as UTF-8
auto s2 = L"hello"; // const wchar_t*
auto s3 = u"hello"; // const char16_t*, encoded as UTF-16
auto s4 = U"hello"; // const char32_t*, encoded as UTF-32

把你的中文字符串前面加上u,应该就是你需要的,然后别忘了在编译的时候加上 -std=c++11

关注 2 回答 1

brokkr 回答了问题 · 2月17日

c++ 的dll 转golang可以调用

没明白为什么要用swig来封装?go 可以直接调用dll的,写成类似:

var (
    user32, _     = syscall.LoadLibrary("user32.dll")
    messageBox, _ = syscall.GetProcAddress(user32, "MessageBoxW")
)

这样的就可以直接调用了。
大概看了一下你说的“易盛期货”的dll,导出函数只有四个:

TAP_DLLEXPORT ITapTrade::ITapTradeAPI *TAP_CDECL CreateITapTradeAPI(const ITapTrade::TapAPIApplicationInfo *appInfo, ITapTrade::TAPIINT32 &iResult);
TAP_DLLEXPORT void TAP_CDECL FreeITapTradeAPI(ITapTrade::ITapTradeAPI *apiObj);
TAP_DLLEXPORT const ITapTrade::TAPICHAR *TAP_CDECL GetITapTradeAPIVersion();
TAP_DLLEXPORT const char  * TAP_CDECL GetITapErrorDescribe(ITapTrade::TAPIINT32 errorCode);

你按类似的方法来声名就好了,但在结构上Go与C++可能会有一定的区别,需要注意一下结构的差异性。

关注 3 回答 2

brokkr 回答了问题 · 2月17日

解决c++的 new int{10} 和 new int(10) 有什么区别?

对于 char, int, double 等基础类型来说,这两种初始化的方法是等同的。

class A
{
public:
    int a;
    // A(int _a) { a = _a; }
}

A* a1 = new A(10);
A* a2 = new A{10}

在 new 的对象是一个类的时候就有区别了,用(),如果没有构造函数会直接报错,用{}会直接按列表初始化来处理。如果有构造函数,这两种方式都可以正确的处理,{}也会去调用构造函数。所以C11之后,尽量用{}来做初始化构造。

关注 3 回答 2