- 博客(96)
- 资源 (1)
- 收藏
- 关注
原创 【游戏开发】minecraft沉浸工程电孤炉自动更换石墨电极
前言 解压怀旧一下mc,打造一个全自动化世界。期间,做了很多自动化逻辑流程设计、查修一些bug反馈到github修正,手工开发一些function补充功能,自编译mod提前修已知问题等,基本没有娱乐,主要在研究和创造,过程不亚于工作中的开发。 结果很不错,这里分享一些难点解决。一、问题背景 mc 全自动化实现,电孤炉不能更换石墨电极,批量生产更换频率不低,有待解决。 环境:mc1.16.3,forge,沉浸工程 植物魔法 精致存储等...
2021-01-26 21:38:07
1455
转载 【C++11】thread_local/TLS/线程本地存储
c++11关键字,简单理解就是thread_local int a,不同的线程读到不的a是不同的存储空间,避免了全局变量冲突,时间关系,简单贴一下别人的总结http://blog.csdn.net/u013390476/article/details/52129607c++之前,有编译器修饰符或api支持等价实现,没有深入研究,具体参考TLS相关的资料,这里给出其一。http:
2017-10-21 00:11:29
3191
原创 【LINUX】RM命令安全操作
linux下操作,一个不慎就rm -rf *了,尤其是写rm -rf a.* 时,网络一卡,就变成rm -rf a. *,恢复相当麻烦。之前写过两篇相关文章,一个是关于命令安全重定向的http://blog.csdn.net/jlusuoya/article/details/73698205,一个是关于rm恢复的http://blog.csdn.net/jlusuoya/article/detai
2017-10-20 23:54:16
1106
原创 【理论实践】快速认识allocator,并不神奇但吓退一片的内存管理机制:内存分配和对象构造分离
从面试来看,很少人掌握allocator,似乎是很难的东西,但其实不是,我个人总结原因以下几点: 1、如果不是运行环境特殊,没有个性化实现的必要,默认即可,所以根本没有给别人实践的机会。 2、标准接口定义偏多,显得复杂。 3、很多c++研发都是通过读《c++ primer》加深c++的,这本书,对这块只是简单略过。我用我自己话,带你简单的
2017-08-17 18:43:19
559
原创 【理论实践】new的三种用法:plain new,nothrow new和placement new
一、plain new就是最普通的new的,动态创建一个对象或数组,基本用法如下:class A{ int m_v;public: A() {} A(int v) : m_v(v) {} A(double v) : m_v(ceil(v)) {}}; A* p1 = new A; /
2017-08-17 18:01:45
831
原创 【理论实践】用alignas代替#pragma pack
知识背景: 字段对齐,使对象或成员的地址满足一定要求。4字节对齐就是地址都是4的整数倍,这个必须是2的N次方。 为什么要对齐?一方面,如果4字节对齐了,对于128个内存空间,实际只有32个独立地址,相当于管理地址变少了,文件系统经常这么用,用少的寻址空间,管理更大的磁盘空间。另一方面,一些硬件设计上了,为了一些考虑,强制要求地址要符合指定规则。 对齐
2017-08-17 15:43:18
2737
原创 【工具巧用】用killall -STOP保留多进程运行环境现场
程序异常分为2类,一类是技术性错误,一类是逻辑错误。前者,程序会崩溃掉,开启core之后,调试core即可。后者不会异常,但可以通过增加assert断言,保留core。单进程无论是单线程还是多线程,都没有问题。但是多进程调试挺麻烦的,依赖很强,恨不得暂停所有进程,分析好了再继续。不用恨,linux直接做就行。STOP信号就可以暂停掉进程kill -STOP
2017-08-16 20:33:26
512
原创 【读书精华分享】《大规模分布式系统架构与设计实战》彭渊著
【分享说明】:我会花很多时间或浅或深的研读一本书,然后总结一些提炼出来的精华,用简短的语言,让其他人能够用很少的时间大致知道这本书能带给自己的价值,如果适用自己,鼓励买一本正本实体书细读和收藏。通篇会以原文目录为结构,给出提炼内容,如果不重要或者一看目录就懂的,会保留目录,有不明白的,以原文学习为参照。所有分享内容,为了区分,会以》开头,可能有多行缩进,或差异化颜色表示。
2017-08-16 20:12:12
577
原创 【工具巧用】用vim ab/iab定制化个人输入习惯,简化命令,快速输入
先插曲一下: 这是我惦记时间最长思念次数最多的一个技术点了,能让我佩服的事很少,这个够让我佩服一下。 2010年,听一个讲座,知道了vi/vim可以配置自动输入一些常用,当时的例子是输入nm替换为using namespace std; 然后自己配置了一下,一直用到2011年毕业,切到公司新配置的环境,配置一直也没同步过去,后来装windows系统覆
2017-08-16 17:44:35
5984
2
原创 【概念普及】很通俗的解释一下RESTful(表现层状态转移)架构风格
官方:REST(Representational State Transfer)指的是一种架构设计风格,而满足这种设计风格的应用程序或设计就被认为是RESTful的。这也是目前互联网中最流行的一种软件架构风格,它结构清晰、符合标准、易于理解,越来越多的应用服务开始使用RESTful这种架构风格,尤其是那些基于HTTP协议的网络服务。 这话要是有人能听懂就是天才,网上大部分资料还是
2017-08-16 11:47:56
1815
原创 【读书精华分享】《分布式实时处理系统 原理、架构与实现》卢誉声著/2016年
【分享说明】:我会花很多时间或浅或深的研读一本书,然后总结一些提炼出来的精华,用简短的语言,让其他人能够用很少的时间大致知道这本书能带给自己的价值,如果适用自己,鼓励买一本正本实体书细读和收藏。通篇会以原文目录为结构,给出提炼内容,如果不重要或者一看目录就懂的,会保留目录,有不明白的,以原文学习为参照。所有分享内容,为了区分,会以》开头,可能有多行缩进,或差异化颜色表示。
2017-08-16 11:14:03
2431
1
原创 【读书精华分享】《分布式服务框架原理与实践》李林锋(华为PaaS平台架构师)著
【分享说明】:我会花很多时间或浅或深的研读一本书,然后总结一些提炼出来的精华,用简短的语言,让其他人能够用很少的时间大致知道这本书能带给自己的价值,如果适用自己,鼓励买一本正本实体书细读和收藏。通篇会以原文目录为结构,给出提炼内容,如果不重要或者一看目录就懂的,会保留目录,有不明白的,以原文学习为参照。所有分享内容,为了区分,会以》开头,可能有多行缩进,或差异化颜色表示。
2017-08-14 23:20:16
2382
原创 【读书精华分享】《c++并行与分布式编程》Cameron Hughes/ Tracey Hughes著,肖和平译
【分享说明】:我会花很多时间或浅或深的研读一本书,然后总结一些提炼出来的精华,用简短的语言,让其他人能够用很少的时间大致知道这本书能带给自己的价值,如果适用自己,鼓励买一本正本实体书细读和收藏。通篇会以原文目录为结构,给出提炼内容,如果不重要或者一看目录就懂的,会保留目录,有不明白的,以原文学习为参照。【书名】:《c++并行与分布式编程》Cameron Hughes/ Trac
2017-08-10 18:26:47
2738
原创 【标准答案】sort命令多列排序/复合条件的方法
这只是一个小问题,但是假攻略太多了,所有发出真正的答案。数据如下:ba 11 aab 1 baa 1 cba 3 d要求:先按第一列排序,如果重复,再按第2列以数字方式排序先看一下非常容易百度出来的错误答案:百度搜索"sort 多列排序"第一条: 并列参数, 也就是 sort -k1 -k2n file,输出如下,错误:aa 1 cab
2017-08-09 11:44:18
4343
2
原创 【理论实践】指向类模板函数的指针的使用(以std::list为例)
假设有这个一个场景,我们希望根据条件决定插入元素到list首或尾,条件判断一次,插入操作多次,例如二叉树,至少要处理左和右各一次。普通的代码很简单,每次操作时,都判断一下,简化一下是一个三元表达式。巧妙一点的,可以定义一个变量指定接口函数,根据条件设定指定的值,然后后面就可以直接用函数指针了,不再需要重复判断,实现代码如下: list l; typedef
2017-07-29 14:21:52
1690
原创 【理论实践】实例体会一下using声明会屏蔽外层作用域的同名实体
理论铺垫:using 声明:明确指定使用哪个作用域下的实体,比如: using std::vector。一次只能引用一个命名空间的一个成员。using 指示:明确指定引用哪个命名空间,比如:using namespace std。相当于引用所有成员。using 声明和指示可以出现在:全局作用域、局部作用域、命名空间作用域,但仅using声明可以出现在类的作用域中(定义类的{}里)。
2017-07-24 13:39:08
273
转载 使用智能指针shared_ptr注意事项
发现一个总结的非常不错的文章,转一下。先补一条自己的补充:一、子类转父类问题前提是基于错误的正常,父类未写virtual析构,子类有虚函数。手动管理时类型明确遮掩了问题,智能指针管理时,是根据传入类型来管理,如果先行转换为了父类,暴露问题。class Base{public: int a = 1;};class B : public Base{publi
2017-07-21 17:36:13
789
转载 linux网络编程和快速理解epoll
linux网络编程这块应用层的api并不复杂,需要掌握的有价值信息多在内核实现上,这块之前接触有限,为了用而用。近期简单回顾了一上完整的信息,重点是epoll和异步io。epoll这块,使用上很简单:4个接口:epoll_create和close创建与关闭,epoll_ctl设置监听事件范围和参数,epoll_wait阻塞直到事件唤醒,所以epoll是同步io。ctl一共可设置5类事件
2017-07-21 16:32:15
677
原创 【经验分享】3个C++实用技巧
一、柔性数组(长度是0的数组)技巧:定义在结构体最后面,占位,用于访问转换之后对应位置的数据,通用用于流式数据结构化过程。例如:消息结构是16位长度,后跟数据,但数据是不定长的,代码如下:typedef struct{ uint16_t len; char data[0];} msg_head_t;int main(){ uin
2017-07-20 21:11:31
321
转载 std::async替代std::thread
std::thread提供了比较简洁的线程操作,如果我们需要获得线程内的结果时,比较麻烦,需要先外部定义一个变量,然后内部赋值,外部join。这个过程代码大致如下:void f1(){ char rst[32]="\0"; thread t([&rst]{ cout << "thread run begin"
2017-07-20 19:56:23
1117
原创 【理论实践】c++11杂七杂八技术点
一、thread.joinable(),用于判断线程是否在运行,可结束状态。一般用于上一个线程的回收。 文档:http://www.cplusplus.com/reference/thread/thread/joinable/ 示例:if(t.joinable()) t.join();二、lock_guard和unique_lock,前者只是简单的构造获得锁
2017-07-18 13:30:10
427
转载 C++11Lambda捕获列表使用
情况比较多,发现一个比我总结好的,转自http://blog.csdn.net/zh379835552/article/details/19542181摘抄之:捕获值列表,是允许我们在Lambda表达式的函数体中直接使用这些值,捕获值列表能捕获的值是所有在此作用域可以访问的值,包括这个作用域里面的临时变量,类的可访问成员,全局变量。捕获值的方式分两种,一种是按值捕获,一种是按引用捕获。
2017-07-18 13:27:15
16063
原创 【理论实践】c++11初始化列表使用
1、用于初始化对象,避免定义仅赋值的构造函数。注意,如果定义了任意一个构造函数,将不再合成默认构造函数,需要显示定义。class A{public: int a; int b; int c;};int main(){ A a{1,2,3}; //等价于定义A(int ia, int ib, int ic): a(ia), b(ib), c
2017-07-18 12:58:26
185
原创 【g++bug】 vector.erase (const_iterator)调用报错
报错如下:no matching function for call to ‘std::vector::erase(__gnu_cxx::__normal_iterator >&)’ v.erase(e);原因:g++未实现这个接口,但c++11标准定义了这个接口,算编译器bug。g++4.9.0修正。详情: 1、接口定义如下,参见htt
2017-07-18 12:47:57
1650
原创 【初级算法剖析】超大文件获取顺序相关数据问题
一类问题,典型问题一般如下:1、给出超大文件,比如100T,每一行是一个访问ip/查询关键字等,计算频率最高的前100个。2、给出超大文件,比如100T,第一行是一个值,计算第N个。特点:1、数据非常大,无法用内存加载。2、数据无序。3、结果顺序相关。初步思路:一直在思考怎么用流式的一次遍历就直接出结果,无果。算法拼的就是经验,没搞过就很麻烦。有效思
2017-07-13 18:10:03
597
原创 【c++11 新特性应用】利用bind实现通用的混合任务线程池
先简单认识一下std::bind,详细资料查阅相关资料,这里不啰嗦,假设你已经具备了理论知识:auto f1 = bind(&fun_int, 3,std::placeholders::_1);这名话的意思是给fun_int绑定2个参数,第一个是3,第二个本来的第1个参数,返回一个函数对象,这样调用f1(5) 等价于调用fun_int(3,5)这样,bind就可以将任意函数的任意具体调
2017-07-05 22:51:41
985
原创 整理并解释一些c++编译和运行错误
一、error: passing ‘const 类名' as ‘this’ argument of ‘bool 类名::函数名 (const XXX&)’ 字面翻译就可以大体知道原因,const XXX无法传递给this,类成员函数有一个隐藏参数,就是this,原因很明显了,const到非const转换。那怎么把this const了呢? 声明const成员函数
2017-07-04 21:48:47
1304
1
原创 对比理解一下STL的自定义比较方法
STL模板定义比较操作的方法不止一种,之前见过别人用时总是变换方式直到编译不出错为止,STL的错误提示非常长和复杂,不理解透彻将是耗时的。实际上STL的模板提供了2种完全独立的方法,一种是使用前者相当于扩展对象,通过重载两者情况混淆才是造成前面所提以试验为导致的解决方法混乱的原因。以sort函数调用为例进行讲解,后文全部给出完整可运行代码以避免自行编译有错误影响分析。
2017-07-04 20:52:29
514
原创 【初级算法剖析】计算字符串需要的哈夫曼长度
算法要求和答案并不复杂,不复制,不直接贴结果,而是加一些个人分析,面向非算法专业的人员。背景: 哈夫曼编码,构造一个二叉树,左支代表编码0,右支1,从根节点到叶子节点就是编码,这样每个树叶节点都是具有唯一不等长编码的,通用用于无损压缩。为了合理利用空间,频率赵越高的,越要短,靠近根。每个元素有一个相应的权重,将子节点的权重加和,就表示这一支的总权重。自然权重越小,越要靠底层
2017-06-30 13:59:59
828
原创 【陷阱代码】c++ 第二篇 c++11新特性及偏冷门语法场景 面对审查代码
很遗憾,原始代码未仔细整理,只留有分享给别人的截图,来源于学习c11时的构想陷阱点:1、lamda[i]传值是只读复制,不能改,++无效,要用i+12、如果加了mutable之后,是可以改了,但改的是副本3、如果用了引用,lamda内部会改这个值,而且lamda调用是回调,可能有非顺序的时序(多线程环境)或者复杂的流程顺序,使分析不清楚i的值建议:lamda捕获
2017-06-29 19:48:10
422
原创 【陷阱代码】c++ 第一篇 简单但却常见
主要来源是自己多年工程经验以及审查代码的总结,一些和常见的网上资料原理相同,但是实际场景经常比看起来复杂,一个疏忽就中了。以下这个代码,都不是基于冷门语法刻意考查基本功的,真正解决起来要靠警觉,就好比熟练的司机更容易出车祸一样。bool less(char* s1, char* s2){ reutrn s1 == s2; /
2017-06-29 19:18:46
463
原创 【理论实践】#define 和const带给开发者的影响区别
#define STR 1.76333333预编译const double STR = 1.76333333;主要区别:1、处理阶段不同预编译可以简单的理解为替换代码,基本不会出错,靠前。常量定义是合法的变量只是不可修改值,发生在编译和链接阶段2、标识符号处理结果不同预编译处理之后,标识舍弃,编译、链接和运行时绝对不会提示出原名称。常量定义如果编译带符号编译
2017-06-29 19:14:14
313
原创 基于c++11泛型编程开发一个LeetCode本地开发测试组件
LeetCode初次接触感觉还不错,重点是可以对比讨论共同实现的一段代码,https://leetcode.com。处理复杂问题不适合在OJ上直接开发,本地调试更简单。暂时(我想应该会有)未发现可以直接拿来运行的框架,自己简单实现一个,未来发现更好的再补充。注意:只以用c++11,g++编译选项-std=c++11一个需要两个文件leetcode.h 包含一些流程控制和通用api(
2017-06-29 17:21:23
671
原创 【理论实践】size_t和std:size_t可能是不同的类型定义,只是定义为相同的类型
这个很少被人意识到,2个分别对应到c头文件定义和c++头文件定义,日常使用没有影响是因为先包含的会使后续包含定义触发条件编译,而且经常using namespace std;使不区分std:size_t。做为一个优秀的代码输出者,要严谨的弄清楚,有针对性的处理,提高代码质量,降低代码开发周期。结论:c和C++混编,尤其是跨平台时,一定要注意头文件包含顺序,如果是c++,最早的包含c++
2017-06-28 10:39:00
2620
原创 【旧资料整理】初级算法-单/双链表逆序一点改进
毕业之前实现过的,当时受到老师一点好评,有所印象,暂未发现完全相近实现,分享出来另外递归实现可以通过栈间接省去变量,也是个代码简洁但使用有限的算法,有限之处在于链表过长会栈异常,效率也不好。#include #include struct node_t{ int val; struct node_t* prev; struct nod
2017-06-28 10:28:58
304
原创 给出进程启动区间计算任意时间点并行进程数量
题目:原题不公开,需求是给出大量进程的启动和结束时间,计算任意时间点进程并发数。进程数有限,查询次数很大。关闭开区间: [启动,关闭)思路:先将时间区间点排序,然后遍历计数,遇到启动+1,遇到关闭-1,时间点切换时,就得出上个值到当前值区间的进程数接口定义如下:void number_of_tasks_running( OUT int result[], //输出结果
2017-06-27 21:27:45
464
原创 处理流式数据中MAX N问题
题目:要求找出数据流中最大的5个数思路:构建一个5个元素的最小堆,循环处理,每次和堆顶元素比较即可#include #include #include inline void swap(int arr[], int i, int j){ int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp;
2017-06-27 19:57:40
618
原创 将语句单词反转
题目:将语句的单词反转, I am chinese 输出 chinese am I,不能开辟非常量存储空间算法:先将每个单词反转,再整体反转一次。题很简单,但这个思路一般人不好往这个方向想。#include #include #include inline void swap(char* p1, char* p2) //交换{ char c = *p1;
2017-06-27 19:30:10
378
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人