bingtaoli / bingtaoli.github.io Goto Github PK
View Code? Open in Web Editor NEWmy blog
Home Page: http://bingtaoli.github.io
my blog
Home Page: http://bingtaoli.github.io
我觉得人最重要的就是有良知,金钱买不到良知,神说“我爱怜悯,不爱祭祀”。
现代社会鼓吹消费,鼓吹金钱至上。但是为啥那么多富人不快乐呢,因为真正的快乐是来自于爱。
如果一个人只用金钱看待人,那就是把自己自降人格,他失去了人性最重要的温暖、爱、感恩、良知等等美好的品格。社会越强调金钱,因为权贵想让普通人做金钱的奴隶,也终将成为罪的奴仆。
感谢上帝,免费的阳光,免费的空气和水,廉价的食物。上帝为我们供养了最基础的生命保障。我们需要花费一生的时间去体会他让我们在地球上要寻求的东西,“你们要寻求他的国和他的义,这一切都加给你们了”。
我们可以一身傲骨地活着,因为神没有让我们缺乏什么。我们只把荣耀归给天父而不是终将丧失的地上的财宝。
“你们要彼此相爱,像我爱你们一样;这就是我的命令”,阿门。
今晚和同事冉冉同学聊了挺多,在工位上,从晚上9点40左右聊到了快11点。一开始是聊工作内容,她是刚入职做数据分析的,所以我在后台角度给了她一些建议,还和她讲了一下后台开发的技巧包括shell使用啥的。
之后我们聊了下公司的氛围。我和她观点很一直,老板不喜欢有个性的员工。
待续..
首先以问题开篇:
“为什么要做设计
---复杂性。业务复杂到个人难以驾驭,仅在脑海里思考不足以应对。
什么方法对付复杂性最有效
---分而治之--模块化
”
程序员拿到一个项目的一般流程,不管三七二十一,先开始写代码再说,一路删删改改,各种大坑,各种方案边写代码边调整,最终项目质量不达标,自己也被折腾得够呛。
这是一个很容易犯的通病,初心是好的,想快点编码推动项目前进。但是结果却是事与愿违。
因为轻视了设计,轻视了质量左移,只能累到死。
你见过哪个大楼前期不是各种规划,各种设计图纸满天飞,各种方案博弈。哪有拿到一块地皮不管三七二十一直接打地基开干的。
软件工程为啥要有设计,就是在前期把项目的结构尽量梳理顺畅,大的难点细化清楚,风险点尽量暴露干净,这样真正开干的时候才有条不紊,心有成竹。
以前看一个项目,只觉得宏伟只觉得自己肯定做不出这么好的项目出来。但是慢慢有了设计思维,就会开始觉得也许一步一步来,一个模块一个模块累积,我们是可以做好一个大项目的。
7月23号,我和鹏程签了蓝虹雅苑的一个公寓,三室一厅,5500一个月,我们觉得不错。当天是周六,我们花了一下午打扫。打扫期间,我们发现中间的卧室有点小,当时看房子的时候房间里摆了一张小床显得大点,放了大床后就显得小了。我们有点担心没法找到室友了,甚至有点浮躁觉得被坑了,但是还是觉得找到的可能性很大,毕竟房子的地理位置还好。
当晚我们便开始找室友了,因为我们工作日需要工作。因为鹏程喜欢在一些校友群发言,脸混得比较熟,所以我叫他在群里说说;我则问问先前大梅沙封闭培训认识的老乡朱礼,需要说明的是,朱礼是看过房子的,我和鹏程在看房子交定金的时候我带他来看过,那时候房子欠缺打扫显得很脏乱,他说待确认,于是当晚我给他发了消息问想清楚没。当晚我发给朱礼的消息一直没得到回复。我觉得朱礼应该是不会住的,心里难免有点找室友失败的失落感,但是内心欣慰占主要,觉得有了一个安身之所,在深圳这个城市算是有了一个稳定的容身之地。
我在第二天早上失望占领了我,因为我心里很清楚如果周一之前找不到室友,又得耽误一个星期,到了8月份就很难找室友了。鹏程这边联系了一个今天入职的毕业生,并且约了这个人今天中午来看房子,鹏程和这个毕业生的定价是1700,为了让今天中午他看房子满意,早上我把马桶盖换了新的,还打扫了厨房,房子显得干净多了。
中午那个毕业生来看了,看了一眼就想走了(应该是觉得房间小了),我便和他闲聊,争取让他多看看,聊了几分钟后,他说自己下午封闭培训有事比较急,我也是过来人,就让他快点回腾讯大厦。我心里也知道,这个人不会住的。
这时候我和鹏程都很伤心了,万一找不到室友呢?要两个人平摊5500的房租吗?我们越想越可怕,看着阳台外的天空,心中很失落,我和鹏程商量后说,不管了,次卧1500租出去,爱要不要,这时候我们的心情失落且非常急躁。
下午我在豆瓣上发了征室友贴,在一个小时内没有人回复。这更加剧了我内心的焦虑,原来室友这么难找啊。在焦虑之中,我突然冒出一个想法,公司bbs上应该是很好找的,因为有腾讯大厦离这个房子非常近,上班多方便啊。于是下午我便去公司,在bbs上发了帖,次卧1500,主卧2000,诚招室友。
这个帖子出乎我意料地很快被关注了,马上有两个人找我聊天问房子次卧还在不在,我于是两面迎合,稳住了两个人。这又是一个故事了,但不想多说这个点。
一个想看房子的人叫董冲,他在和我联系后一个半小时就到了蓝虹雅苑这边。我当时是挺开心的,总算是有把房子租出去的希望了。看了房子后,他了当地说行,定下来吧,于是我收了他2000块定金。
我内心的石头算是放了下来。
今天是8月17号,董冲在7月30号搬进来的,在他住的这半个月中,他、我、鹏程共享这个房子,包括客厅阳台卫生间。我慢慢觉得1500这个价格和我付出的2000这个价格之间有不平衡的地方,1700和1900才合适,虽然那样我出的只有100块差异,但是仍然觉得应该如此。因为主次之间的差异就在200块,500块太多了。房子不止卧室,次卧的人也共享了房子的很多其他地方。
现在细想租房的事情,还是有点感悟的。由于我是签房子后要找室友的人,我急需要找一个室友来安慰我急躁的心情,注定我是处于弱势的,并且我是无法理性思考的,我内心一直想只要找到一个室友就可以了。这半个月,董的一些生活习惯和我不同步更加剧了我的这种感想。
这两天王宝强的事情非常热门,我觉得也是这样的道理,宝强当时并不是特别富裕,追这个妹子肯定是处于弱势的,为了追到这个漂亮女生应该失去了理性判断。当然找一个爱自己的女友这个道理不是今天要谈的。
今天我想说的是,做任何的事情,请理性思考,这是美德,帮助你少犯令自己后悔的mistakes。
今天周末,下午在正风篮球场打篮球锻炼身体,从下午4点到6点,两小时的运动让身体感觉很舒适。回家的时候,有一丝失落。
和我们这些大人打球的有不少高中生,和他们打球总是看到高中时候的自己,那些打鸡血打球、觉得天底下自己最牛的青涩日子总是浮现脑海。下午我离开球场时,一起打球的一个高中生也打算回家,我们都回家,但是回家的方式不一样。我得去公交站等公交,而后者却直接进了他父亲的车,看着他家车的远去,我不禁想起我们这些农村的孩子的一丝苦涩,从小对城里孩子的羡慕再次涌上心头。
我从小在农村长大,家里大部分孩子都在城里。小孩子的心思其实也是比较敏感的,我们家兄弟之间虽然都很有礼貌,但是我心中的自卑是不言而喻的,这种苦涩可能下一辈的人再也无法体会了。我有意无意会感觉自己像是鲁迅笔下的闰土,这当然有点极端了,但是农村小孩和城里小孩的距离感,可能会伴随我很长时间。
想大一点,我想**这三十年的城市化,一个比较深层次的驱动力便是农村孩子的不服气,我也要成为城里人,所以一代代年轻人为之奋斗,钢筋水泥下藏着无数人的血汗。人变得更好的愿望是美好的,这三十年**的发展也帮助了无数**人战胜了曾经的贫穷和自卑。
回到今天下午,我看到这个高中生乘自己父亲的车离去后,我也选择了打车回:)
马云演讲时经常提到一句话,大意是“不要抱怨,相反要把问题转变为机遇,有问题说明有需求,有需求就抓住做好”。
这句话听着假大空,但是在工作中真的是大有裨益。我们无数次抱怨工作,抱怨同事。如果能理解马云的这句话,烦恼能减少90%以上。
往大了说,我们的国家也是这么走过来的。文人喜欢抱怨,可是真正干事情的人还是要忍受着抱怨负重前行的。
1921年7月23日至31日党第一次全国人民代表大会,出席的有13人,包括***、陈云、周恩来等。这次会议后**几经波折,这13个人有的叛逃投敌有的光荣牺牲。万里长征过草地,一穷二白搞革命,这期间我想抱怨肯定是无休止的,但是很幸运我们的开国圣贤们总是负重前行找机会,把人民的抱怨转化成了力量,最终在灰烬上重建中华。
1949年建国后,新生的共和国内忧外患。我想一定有投敌派,“干脆舔苏联或者跪美帝算了,我们干不过人家的,没啥希望的”,还好这种抱怨派不是主流,我们的领导在大方向上再次选择了创造机会,在无数爱国科学家的攻坚下,我们搞出了核武器,有了立国之本。
眼光转移到现在。从2018年开始老美开始对我们开展贸易战,限制高科技芯片的供应。我们国家再次掀起舆论热潮,很多观点比如“我们搞不出来芯片的,我们没这个基因,跪吧舔美吧”,很多人妄自菲薄抱怨这抱怨那,但是真正做事情的人还是得扛着使命前进。就我一个股民的视角,我看到国家大基金开始重点扶持我国的半导体行业,力度如此之大,掀起了半导飙涨的热潮,为行业注入了巨量的资金。这说明政府是审视了自己的不足并且在往好的方向去尝试攻克问题的。
往个人说,我看很多平台上都在贩卖年轻人的焦虑,中年危机固然是几乎每个人都会遇到的。但是这种焦虑或抱怨社会无法解决问题。我们担心以后的生活,那去考公务员,或者是现在开始掌握投资能力,增加自己的收入保障。我觉得在这个发展远远没有到头的国家里,机会总比抱怨多。
虽然此文较为假大空,但是确实是我目前的心境。前几年我也经常抱怨环境,但是随着工作经历和阅历的增加,抱怨少了,思考变多了,心态也变宽了。希望我保持这种心态,也希望对假如看到此文的你有所帮助。
上周几个同事们中午一起吃午饭的时候,谈天说地。
大家说着说着就说到评价对方了,大家对我的观点就是挺自我的,我说我这就是从小养成的习惯,喜欢标新立异抖抖机灵。路琳问“你是不是被保护得太好了,你有姐姐吗?”,我说”没有,可能从小就喜欢自命清高吧“,然后她说”感觉这是一种幼稚的表现吧“。
她说得是对的,我总结了下男人成熟的几点建议。
1、不要刻意在聊天中去表现自己,刻意凸显自己的幽默。这样很容易刹不住车导致言多必失,其次就是在不熟的人面前留下话多或者是交浅言深的印象。
2、不要刻意标新立异显得自己清高。
3、不要卖弄自己,简称耍小聪明。比如刻意显得自己懂很多,卖弄卖弄文化,讲讲生硬的笑话,其实只会拉低你的格调,显得幼稚。
男人走向成熟一定是一个趋于稳重的过程,是一个心理变得强大的过程,不再需要寻求别人的认可来满足自己的虚荣心。前面几点一个通病就是都在刻意寻求别人的认可。经历过足够的事情才会懂得,认可是自己给自己的,内心的空洞才需要别人的认可。
引用海子的诗:
”从明天起,做一个幸福的人
喂马、劈柴,周游世界
从明天起,关心粮食和蔬菜
我有一所房子,面朝大海,春暖花开“
这种心态就是一种成熟,一种坦然,一种充实。
2016年8月25号,hank给我们新人做了一次关于TDSQL的分享。
应对金融级的数据库需求,怎么做?普通的数据库要求是不停不爆,但是金融级需求还包括不丢不错。而实际的基础服务是存在很多不确定性的,而服务要求一定是确定的。所以TDSQL的定位就是把不确定的场景转化为确定的服务。
TDSQL的基本原则是:
“有故障才是正常的”,“数据肯定是会丢失的,但是我们做的就是把丢失的可能性降到最小”,“单点不会毁了整个服务”,“加入有三个备份,两个坏了都可以忍耐,但是三个坏了就真的坏了,没办法解决的”,在这些基础前提下,TDSQL才可以开展。
按照hank的话就是“我们规范了边界,画了一个区域,有了这个区域后,我们才可以施展拳脚”。
现在的TDSQL的可用性为6个9,这个在金融数据库领域是很难做到的。
hank说,有些困难跨不过就只能绕开了,TDSQL就是这么做的,结果为导向,如果死纠结某个问题,就没有结果了。阿里的oceanbase没有开源,但是也应该会有很多绕过去的坑。
hank问了我们一个问题,数据库最怕的是什么?大家沉默,他笑着说“其实是怕别人不会用,比如没有建立索引却要查询,在千万级数据行的时候几条这样的语句就会把资源完全消耗完。”,这个很实在,慢查询会导致后台的优化白费了。所以TDSQL的做法是“检测是否有慢查询,然后告警用户,把问题移到前端,而不是花力气去解决使用不当带来的问题”。
TDSQL有两种服务模式:
公有云比如腾讯云
私有云比如理财通、阅文、webank
TDSQL有两种模式,一种是NoSharding,一种是GroupSharding。前者和mysql无区别,而后者在建表时需要明确指出shardkey(即分区字段)。后者的扩容是水平的增加,即增加多少台机器就增加多少性能。
最后,hank指出部门的发展:
hank讲话高屋建瓴,比如“以前磁盘性能很差,所以我们搞了一套东西叫厚德”,我们常使用的组件就是这些高级工程师所建立的,很尊敬这些老工程师们。
最近A股、美股市场不少股票出现剧烈的回调,今天正好是9月9号,创业板大跌4.8%,很多人以“韭月韭日祭山顶兄弟”来调侃。我也想扯几句。
汪总说这个市场将会消灭很多不懂估值的人,我深以为然。当创业板调整到20%限制后,这个是加速发生的。不懂估值注定会追涨杀跌,频繁亏钱,而且失去自我,怀疑自己的价值。
我觉得只有以做实业的心态才能做好投资。如果我们做实业我们就会理解一些公司是多么难得了。
A股市场绝大部分的公司都是赚辛苦钱,有多辛苦?有辛苦一年下来还亏损的,有就算是收入还可以但是几乎没有净利润的,有动不动业绩大打折扣的.....这些股票背后都是实实在在的公司,所以赚钱多难啊,赚大钱多难啊。可是我们的市场就是有一些王者级别的赚钱机器:贵州茅台、海天味业、爱尔眼科等等。这些公司的ROE能持续多年维持在20%以上,而且最重要的是这些公司能保持20%左右的年复合增长率。
一家公司要做到赚大钱已经不容易,赚大钱还能保持高增长,是市场的奇迹,我们做投资就是要盯住这些奇迹。
林园说这个市场他看得上的公司不超过20家,他会投的也在这些范围内。
如果我们是做实业的人,你的公司一年收入10个亿,只有0.5个亿的净利润,5%的净利润率,这太难了啊,我觉得做这种实业的人内心肯定是难熬的,你再怎么勤劳也没辙,可能公司的商业模式就是不赚钱,就得辛苦。
但是如果你的公司一年收入10个亿,实打实能到5个亿的净利润,那这个公司就是王者级别的赚钱机器了。类似茅台片仔癀这种,那就是管理层再蠢都不影响公司大赚。
就投资而言,之前在2019年的雪球嘉年华@方何之子已经做出了比较好的三点总结:
一看,成长性。没有成长的公司直接pass,我们只能赚到公司成长的钱,估值博弈的钱太难赚。
二看,持续性。如果只有一两年的成长,第三年公司可能就面临断崖式风险,直接pass。比如军工,可能三年内订单比较多业绩刺激,但是之后面临断崖。
三看,确定性。成长的确定性有多高,会不会突然面临强大的竞争,比如行业变成了红海,面临巨大竞争,那盈利的确定性不在了。
这三性是做投资检验标的的真理,能满足这三性的公司凤毛麟角,茅台、爱尔眼科、海天味业都复合这三性,所以走出长牛了。
我再补充一点就是别赚辛苦钱,收入10个亿,只有0.5个亿的公司,再怎么鼓吹成长,再怎么鼓吹确定也难以打动人,这说明商业模式是存在问题的。这个通过ROE来进行筛选,一定要选ROE连续几年20%以上的才是好的商业模式。
在C语言中,我们设计接口往往会为对象设计两个接口:
使用场景比如:
obj *p = create_obj(); //引用计数为1
addref(p); //引用计数2
loop_queue(p); //放到队列中稍后处理。那么 需要先addref保证到时候使用到p的时候p没有被销毁。
p->xxx = yyy;
delref(p); //引用计数1
在cpp中,智能指针就起到类似作用。它帮助程序员更好地管理内存,不再malloc后忘记了free。
上面的例子就变成了:
MySharedPtr<obj> p(create_obj());
loop_queue(p); // 传参数会拷贝p生成一个临时变量,原始资源的引用计数会自动+1.
p->xxx = yyy;
智能指针协助你,没有了自己管理计数的麻烦。
关键几点:
#include <iostream>
#include <stdio.h>
#include <assert.h>
using namespace std;
#define EXPECT_TRUE(exp) if (!(exp)) assert(0)
#define EXPECT_EQ(a, b) if ((a) != (b)) { \
cout << a << " != " << b << endl; \
assert(0); \
} else {\
printf("pass\n");\
}
template <typename T>
class MySharedPtr
{
public:
MySharedPtr() {
ref = NULL;
ptr = NULL;
}
// 析构
~MySharedPtr() {
if (!ref) {
return;
}
(*ref)--;
if (*ref == 0) {
delete ptr;
delete ref;
}
}
// 裸指针构造
MySharedPtr(T *raw) {
if (raw) {
ref = new int(1);
ptr = raw;
}
}
// 拷贝构造,共享资源,引用+1
MySharedPtr(const MySharedPtr &p) {
cout << "copy construct" << endl;
if (p.ptr) {
ptr = p.ptr;
ref = p.ref;
(*ref)++;
}
}
/**
* 移动构造,把p管理的资源偷到自己这里
* @param p 右值引用
*/
MySharedPtr(MySharedPtr &&p) {
cout << "move construct" << endl;
ref = NULL;
ptr = NULL;
this->swap(p);
}
// 操作符重载
void operator =(const MySharedPtr &p) {
// 交出自己的管理权
MySharedPtr<T> tmp;
this->swap(tmp);
ptr = p.ptr;
ref = p.ref;
(*ref)++;
}
T* operator ->() {
return ptr;
}
T& operator *() {
return *ptr;
}
int use_count() {
if (ref) {
return *ref;
}
return 0;
}
T *get() {
return ptr;
}
// 交换管理权
void swap(MySharedPtr &p) {
std::swap(this->ref, p.ref);
std::swap(this->ptr, p.ptr);
}
void reset() {
// 交出自己的管理权
MySharedPtr<T> tmp;
this->swap(tmp);
}
private:
int *ref;
T *ptr;
};
class Test
{
public:
Test() : n1(0), n2(0) {
cout << "Test created" << endl;
}
~Test() {
cout << "Test deleted" << endl;
}
Test(int arg) : n1(0), n2(0) {
cout << "Test created with arg:" << arg << endl;
n1 = arg;
}
int get_n1() {
return n1;
}
private:
int n1;
int n2;
};
void swap_test()
{
printf("------------------------%s--------------------------\n", __FUNCTION__);
MySharedPtr<Test> a(new Test(1024));
EXPECT_EQ(a.use_count(), 1);
MySharedPtr<Test> b;
b.swap(a);
EXPECT_EQ(a.use_count(), 0);
EXPECT_EQ(b.use_count(), 1);
}
void construct_test()
{
printf("------------------------%s--------------------------\n", __FUNCTION__);
MySharedPtr<Test> a(new Test(1024));
Test *p;
p = a.get();
EXPECT_EQ(p->get_n1(), 1024);
// 重载=
MySharedPtr<Test> b = a;
EXPECT_EQ(a.use_count(), 2);
// 拷贝构造
MySharedPtr<Test> c(b);
EXPECT_EQ(a.use_count(), 3);
// 重新赋值
MySharedPtr<Test> d(new Test);
c = d;
EXPECT_EQ(a.use_count(), 2);
}
void move_test()
{
printf("------------------------%s--------------------------\n", __FUNCTION__);
// 移动拷贝
MySharedPtr<Test> a(new Test(1024));
EXPECT_EQ(a.use_count(), 1);
MySharedPtr<Test> b(std::move(a));
EXPECT_EQ(a.use_count(), 0);
EXPECT_EQ(b.use_count(), 1);
EXPECT_EQ(b->get_n1(), 1024);
}
void reset_test()
{
// reset测试
printf("------------------------%s--------------------------\n", __FUNCTION__);
MySharedPtr<Test> a(new Test());
EXPECT_EQ(a.use_count(), 1);
a.reset();
EXPECT_EQ(a.use_count(), 0);
}
int main()
{
swap_test();
construct_test();
move_test();
reset_test();
return 0;
}
这两天在看一部电视剧,王志文主演的,叫《人到四十》。剧中大概讲的就是王志文演的主角梁志辉到了四十出头的年纪查出了肺癌,在剩下半年的生命里经历的工作和生活。
看了头两集,挺有感触,看到王志文和老友在江边喝酒,然后王说”想到我走后这世界还要轰轰烈烈地往前走,不知目的在哪里。如果给我重来一次青春,我不会和郑洁(剧中梁志辉的老婆)结婚,她每天絮叨我,每次都是命令式的口吻,给我日复一日的绝望。没想到没等我休她,老天先把我休了“。这个台词从王志文这个台词专家口中说出来,很打动人。
我想起小时候在老家,隔壁邻居有一户人家,那时候大人们都称呼那户人家男主人叫”老半“,老半在我10岁左右得了癌症与世长辞,留下了老婆和两个孩子。我记得老半的职业是卖泡菜,他也有时候会款待我们这些小孩。他走后他老婆继承了他的职业,但是我始终记不清之后那个卖泡菜摊位的事情了。
余华说”展望是那么漫长,回忆却是如此短暂“。站在上帝视角回顾主角的生活,确实仓促且短暂,但是时间的烙印打在当事人身上,那感受却是极为厚重。
很庆幸,我还很年轻,没有感受到时间给我沉重的生理压力。我还能一气呵成爬上南山,我还能时刻感受到身体里充沛的激情。
知乎上有个帖子大意是”为什么要考公务员“,下面一个回复很有趣:”因为体制外的人永远年轻“。这话有点细思极恐了,腾讯也是这样,虽然公司已经发展了20多年了,但是平均年龄却那么小,那么那些老人去哪里了呢?大浪淘沙后,90%以上的人应该是被淘汰了。男人40正好是家中顶梁柱,只能另寻他路了。
还好,这些人生的问题我还有很长时间去思考体会。毕竟,青春**。
项目里规则使用了如下数据结构,其中策略模块使用了指针,减少结构体拷贝过程中数据的拷贝,其中refcount引用计数控制结构体生命周期。
struct strategy_rule_st
{
STRATEGY_FUNCTION_TYPE function_type; //功能类型
common_strategy_st *common_strategy; // 策略共同部分数据
int refcount; // 引用计数
union {
port_control_strategy *port_ctrl_strategy; //端口差异策略
#ifdef _MSC_VER
appnet_control_strategy *appnet_ctrl_strategy; //应用管控差异策略
#endif
};
}
void ReleaseStrategyNode(strategy_rule_st* rule) {
if (!rule){
return;
}
if (--rule->refcount == 0){
FWALL_SAFE_DELETE(rule->common_strategy);
}
}
我在下发规则的使用了浅拷贝,只拷贝了指针和引用计数,但是释放的时候调用了真正的析构ReleaseStrategyNode函数,会减引用且可能真正free结构里面的指针。
vector<strategy_rule_st > eaio_rules;
vector<strategy_rule_st > product_rules;
if (StrategyRules[i].common_strategy->product_name == FWALL_WHITE_LIST_NAME) {
eaio_rules.push_back(item);
} else {
product_rules.push_back(item);
}
}
// ....
ReleaseStrategyGroup(&product_rules);
ReleaseStrategyGroup(&eaio_rules);
但是原先的vector里面的结构体还会用到已经被释放的指针。这导致了内存被释放后继续读的隐患,虽然不一定会导致问题,但是可能读到脏数据,导致程序的运行出现奇怪的问题。
修改成如下,直接clear,不调用真正的结构体析构函数,这样只会清理结构体,但不会清理结构体中的指针。
vector<strategy_rule_st > eaio_rules;
vector<strategy_rule_st > product_rules;
if (StrategyRules[i].common_strategy->product_name == FWALL_WHITE_LIST_NAME) {
eaio_rules.push_back(item);
} else {
product_rules.push_back(item);
}
}
// ....
// 浅拷贝vector不用销毁真正策略数据
product_rules.clear();
eaio_rules.clear();
水利万物而不争。
任何人在市场里都是一朵小浪花,你无法主导市场,只能顺应市场。
包容性,应该更多去包容不同的资金属性、不同的操作模式,学习各种体系的优劣,取长补短。
淘股吧里的赵老哥、逸神的交割单,看着模式都很简单,简单的事情重复做,久而久之就成神。真正的悟道,我目前感觉是放下自己,没有执念,感受并顺应市场。
顺势而为,在涨潮时拥抱热情,在退潮时克制冷静,知易行难。
docker目前已经是个非常成熟的技术了,最近才体验了下。
我们的项目涉及到流水线的CICD也就是自动化编译,这样可以保证质量左移。流水线linux环境就是docker构建的,你可以改docker镜像,流水线跑自动化的时候都会自动拉取最新的docker镜像。
比如我最近在项目中用了c++的正则,我使用的库提示g++4.8版本的正则实现有漏洞,所以要想这用这个库,就必须在linux升级g++。
最好的方法就是改docker镜像。
1、在一个linux宿主机登陆进去
docker login docker.saxxxxfor.com -u xxx -p xxx
2、查看所有镜像
docker images
3、进入容器
以2e2f4db5aeb3这个镜像,创建lbt_new容器
docker run -it --name lbt_new 2e2f4db5aeb3 /bin/bash
4、在宿主机提交改动,可以看到和git管理代码非常像,这种方式管理镜像版本挺方便。
tag是docker.xxxxxxxx.com/cicd_2557/corss-compiler-asan:v1
docker commit lbt_new docker.xxxxxxxx.com/cicd_2557/corss-compiler-asan:v1
docker push docker.xxxxxxx.com/cicd_2557/corss-compiler-asan:v1
流水线日志:
[2022-11-28 17:18:35] 在节点 k8s-node4 复用工作空间 /10/zb_gitlab/16700
[2022-11-28 17:18:36] 正在排队中
[2022-11-28 17:18:43] 分配工作节点
[2022-11-28 17:18:54] 工作节点分配成功
[2022-11-28 17:18:54] 拉取镜像 docker.sangfor.com/cicd_2557/corss-compiler-asan:v1
[2022-11-28 17:18:55] 拉取代码 http://code.sangfor.org/AC/NAC/EAIO3 分支 feature-scribee_5-lbt
[2022-11-28 17:19:06] 开始执行
今晚,封闭培训的毕业晚会顺利结束。回顾这10天的培训,期间的很多感触带给我很多的冲击,明天就正式工作了,所以在这个晚上记录一点东西。
今晚的晚会非常精彩,唱歌、口技、舞蹈、小品都非常有效果。我们之中有很多会跳舞的人(5班的妹子最多了),她们有着很好的节奏感和充满青春活力的舞姿。看着这些充满才艺的人的表演,真是自愧不如,羡慕不已。
自信而又有能力的人最让人羡慕了,今晚却让我接触了这么多,我们四班的杜夏、汪洲、朱礼、吕力、李研、武甄等等;其他班的虽人不知道名字,但是B-Bocks的高手、舞蹈高手、歌唱高手都有。总而言之,培训期间接触的同事让我知道了世界是很大的,自己要学习的东西有很多。
今天下午的毕业典礼上有类似TED的Talk,有一个叫ccqu的妹子的演讲非常令人印象深刻。Talk是关于**股市的,她本科是清华大学的新闻和经济双学位,研究生是上海交大的金融,可以说是目前见过的最高学历的女生了,她分享了自己在大学的时候自己创立基金并且操盘的经历,并且给我们建议:如果不懂、没有精力、心态不好就不要把血汗钱投入股市。这个妹子让我看到了高学历是怎么碾压平凡人的。
这次培训从7月10号开始,一开始心态很好,觉得混着混着十天不就过去了嘛,第二天老师讲信息安全时候说我们班的谢天忆(一入职就T2.X)在安全界已经小有名气了,我开始发现不对劲了,仔细观察后发现身边的人各有各的特长,而自己却默默无闻,非常平凡,接下来的日子,在课堂上,在狼人游戏中,这种感觉越来越强烈。
趣味运动会上,汪洲的统筹协调能力和人际交往能力让我很佩服,最后的结果很好;我们班的毕业晚会节目是班长及一些活跃分子策划导演的,最后的效果也是非常的好。这些事实让我不断反思自己的不足,为什么自己在这方面做得不好呢,因为锻炼太少了,自己变得有些腼腆,不敢去表达自己、与别人交流意见。
我希望接下来的日子自己可以不断地完善自己,变得open并且自信。和去年实习相比,今年我少了很多出生牛犊不畏虎的冲动,更多的是理性和思考。在接下来的工作和生活中,我希望找到一个balance,即安静地享受代码和咖啡,又能去拥抱人与人之间奇妙的沟通交流;即能够在计算机技术上有很大的进步,又可以有一些爱好、一群挚友、一个她。
—写于2016年7月19号晚
深圳大梅沙海景酒店3325
招年轻人,裁掉35岁以上的老人。这不就是投机吗?
你押注一个年轻人最黄金的几年时间,低价格去博取10倍收益, 然后等过了快速成长期、这只人力股变笨重了性价比不高了,果断清仓,再去买下一个十倍股。
价值投资个毛线,一直投机一直爽。
你我皆是商品。
幕后玩家只能适应社会法则,否则这些玩家也得出局。
这场人力投机游戏,没有长期投资的观念,充斥着焦虑和赚快钱的快感。
必然经历高峰,然后重重崩盘。
vc调试非常好用。
设置断点
设置启动项,比如单元测试就设置xtest作为启动项。
调试进程也可以attach到进程上去,但是保证你附加的进程是你vc打开的项目编译得到的,这样才有符号表,才可以断点调试。
pycharm非常好用,配置好本机的python。pytest跑自动化案例,直接Debug运行还可以打断点。
我本机的python解释器路径:
C:\Users\User\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Python 3.8\Scripts\python.exe
pytest运行的话习惯了命令行,直接带--trace就可以用pdb方式运行你的python案例。
我们项目的自动化框架是这样的,在python脚本里面发送请求到进程中执行相关操作,检查日志看是否符合预期。发送数据是udp:
def do_operation(self, opr, msg, tid=-1, print=True):
req = {
'tid': tid,
'msg': {
'opr': opr,
'data': msg
}
}
data = json.dumps(req)
if print:
logger.info(f'do operation : {data} to {self.sport}')
self.sk.sendto(data.encode(), ('127.0.0.1', self.sport))
这几天在性能测试时候,发送量比较快就会出现丢包,而且是集中在发送循环的后面丢包。
早上问了我们的架构师旭哥,他推断是我们的进程接收数据buff满了,udp发送端也不会确保数据发送成功,udp本身也不可靠。
这样性能测试只能分开到多个进程去测试了,单个peer_agent接收数据太多容易丢数据。
查了下资料发现,起udp服务时候可以指定buff大小:
int nRecvBuf = 700 * 1024;//设置为700K
if (0 != setsockopt(m_sock, SOL_SOCKET, SO_RCVBUF, (const char*)&nRecvBuf, sizeof(int)))
{
TRACE(_T("setsockopt buf size failed.\n"), WSAGetLastError());
return FALSE;
}
今早醒来在现实和梦境的模糊边界,我的大脑迸发出了一些灵感,何为stay hungry?
乔布斯提到的"stay hungry, stay foolish“影响了很多人,这句话中文理解为"保持饥渴,保持愚昧"。说这话时候的乔布斯已经是苹果CEO,而当时的苹果也已经是引领世界移动互联网的弄潮儿,在这春风得意马蹄疾的时候,他为何提出这句名言呢。
人最开始会努力追求一个目标,可能最终你达到了它,你会倍感珍惜,但是随着时间流逝,你的珍惜会慢慢消失,人的惰性慢慢浮现。举个例子,假如你一开始很穷,你努力工作,最终你可能成为了部门总经理,这个时候,你拼搏的热情一定不比当年一穷二白的时候。因为人只有在饥寒交迫时候才最有提升自己追求梦想的欲望,那是最原始的欲望。我想乔布斯的理解可能是苹果目前已经取得这样的地位,自己已经取得这样的地位,他的愿景是永远保持饥渴,保持追求梦想的欲望。stay hungry让我有想起《华尔街》这部经典电影中的台词“Greed is good, may be the best thing in the world.”
如何解释stay foolish,最近我看知乎比较多,有个感觉就是知乎的用户越来越极端了,人们往往喜欢说一些绝对的话,比如什么什么一定是错的什么什么一定是对的,这种极端的想法其实不是一种聪明,反而是另一种一种愚蠢。只有当人一知半解的时候才容易出现盲目的自信。儒家的中庸之道诚不我欺;三体最后人类和三体文明一起灭绝也体现了“打败人类的不是无知,而是傲慢”这句主旨。stay foolish我的理解是保持谦卑,保持批判,保持学习。
去年看过一部韩国电影《burning》,里面提到人的hungry分为两种,一种是肉体饥饿,一种是灵魂的饥饿,前者属于small hungry吃点东西就能满足,后者却是big hungry难以填补。电影中富二代的big hungry让他以玩弄人为乐,他却永远无法填补那份空虚。我经常坐在沙发上想,希望自己这份简单的hungry能维持久一点。一个简单的例子就是在三年前,我赚500块人民币时候我很开心,可是现在我只有赚1w人民币以上才能让我有一种赚了钱的感觉,这说明我的欲望提高了。我经常想巴菲特每天只吃简单的可乐汉堡,却能保持那样的满足和冲劲,这种圣人级别的stay hungry, stay foolish是难以企及的。
我们迟早会面临生活的林林种种,成家立业,生老病死,人的七宗罪会让人空虚寂寞甚至痛苦,但是我想,我一定会牢记这句“stay hungry, stay foolish”.
设计一个函数时候,先想好这个方法要做哪些事情,那么这些事情组合在一起就成了这个函数,我们要求事情尽量少而精,这样函数看上去就比较清晰明了。
举个例子,我在设计我们网络项目时候的一个函数,检查是否支持cgroup网络管控,以进行服务降级。
开始的代码如下。Initialize这么重要的初始化入口内部逻辑看上去混乱,也容易出错。我这里确实就因为写得乱而把业务逻辑搞错了。b_cgroup=true时候,去创建cgroup组失败的话直接返回引擎初始化失败了,本来降级的逻辑一下子把整个模块的功能搞没了。
static bool check_cgroup()
{
char cmd[IPTABLE_CMD_LEN] = { 0 };
str_snprintf(cmd, IPTABLE_CMD_LEN,
"iptables --append OUTPUT -p tcp -m cgroup --cgroup %u -j ACCEPT", FW_CG_CLASSID);
int exit_code = loop_exec_cmd(cmd, 3);
if (exit_code != 0) {
error("exe failed: %s, exit code: %d\n", cmd, exit_code);
return false;
} else {
info("cmd succ:%s \n", cmd);
}
str_snprintf(cmd, IPTABLE_CMD_LEN,
"iptables --delete OUTPUT -p tcp -m cgroup --cgroup %u -j ACCEPT", FW_CG_CLASSID);
eaio_shell_execute_timeout(cmd, RUNCMD_TIMEOUT);
return true;
}
int CIptEngine::Initialize()
{
// 判断系统是否支持cgroup
b_cgroup = check_cgroup();
if (b_cgroup) {
info("system check cgroup succ \n");
// 创建目录
if (eaio_dirutils_mkdir(FW_CG_NET_LIMIT_PATH, 0755)) {
warn("eaio_dirutils_mkdir is fail, %s.\n", FW_CG_NET_LIMIT_PATH);
return -1;
}
int exit_code(0);
char cmd[IPTABLE_CMD_LEN] = { 0 };
str_snprintf(cmd, IPTABLE_CMD_LEN, "echo %u > %snet_cls.classid", FW_CG_CLASSID, FW_CG_NET_LIMIT_PATH);
exit_code = eaio_shell_execute_timeout(cmd, RUNCMD_TIMEOUT);
if (exit_code != 0) {
error("exe failed: %s, exit code: %d\n", cmd, exit_code);
return -1;
} else {
info("cmd succ:%s \n", cmd);
}
} else {
warn("system check cgroup failed \n");
}
return 0;
}
优化后代码,首先引擎初始化中检查是否需要降级,降级不会影响初始化成功;check_cgroup检查降级代码里面有两件事情,一是检查iptables是否有xt_cgroup;二是创建cgroup组是否能成功。
这样逻辑会清晰很多,可扩展性也好了,如果要修改check_cgroup的逻辑,加一个环节就行。
/**
* 检查cgroup规则设置是否有效
*/
static bool check_iptables_cgroup()
{
char cmd[IPTABLE_CMD_LEN] = { 0 };
str_snprintf(cmd, IPTABLE_CMD_LEN,
"iptables --append OUTPUT -p icmp -m cgroup --cgroup %u -j ACCEPT", FW_CG_CLASSID);
int exit_code = loop_exec_cmd(cmd, 3);
if (exit_code != 0) {
error("exe failed: %s, exit code: %d\n", cmd, exit_code);
return false;
} else {
info("cmd succ:%s \n", cmd);
}
str_snprintf(cmd, IPTABLE_CMD_LEN,
"iptables --delete OUTPUT -p icmp -m cgroup --cgroup %u -j ACCEPT", FW_CG_CLASSID);
eaio_shell_execute_timeout(cmd, RUNCMD_TIMEOUT);
info("check_iptables_cgroup succ\n");
return true;
}
/**
* 检查系统支持cgroup的net_cls流量管控
*/
static bool check_net_cls()
{
int exit_code = 0;
// 创建目录,如果机器禁用了net_cls的话,创建cgroup组会失败
if (eaio_dirutils_mkdir(FW_CG_NET_LIMIT_PATH, 0755)) {
warn("eaio_dirutils_mkdir is fail, %s.\n", FW_CG_NET_LIMIT_PATH);
return false;
}
// 为刚创建的cgroup组设置id
char cmd[IPTABLE_CMD_LEN] = { 0 };
str_snprintf(cmd, IPTABLE_CMD_LEN, "echo %u > %snet_cls.classid", FW_CG_CLASSID, FW_CG_NET_LIMIT_PATH);
exit_code = eaio_shell_execute_timeout(cmd, RUNCMD_TIMEOUT);
if (exit_code != 0) {
error("exe failed: %s, exit code: %d\n", cmd, exit_code);
return false;
} else {
info("cmd succ:%s \n", cmd);
}
info("check_net_cls succ\n");
return true;
}
/**
* 检查本机是否支持iptables设置cgroup网络管控
*/
static bool check_cgroup()
{
return check_net_cls() && check_iptables_cgroup();
}
int CIptEngine::Initialize()
{
// 判断系统是否支持cgroup
b_cgroup = check_cgroup();
if (b_cgroup) {
info("system check cgroup succ \n");
} else {
warn("system check cgroup failed \n");
}
return 0;
}
今晚跑步的时候循环听的是《听妈妈的话》,除了想起我的妈妈之外,还想起了周董的母亲,叶惠美。
在2013年的暑假,我去了一趟广州,那时候很有幸作为周杰伦演唱会的志愿者,我是证件组的一员,这个组有三个人,我和大神、伟哥。我被安排守在周杰伦的房间外面防止有其他人进去。
守了很久终于等来了一辆车,一开始是周杰伦下车,我居然没认出来,因为他低着头,带着帽子,有点驮着背。发现后,他几乎来到了我身边,当时非常紧张。他进了房间,当时的我呆萌呆萌地呆呆看着偶像。
然后呢,又来了一辆车,首先下来了一位女士,这就是周董的母亲—叶惠美了。
她灰色的衣服,很素雅,她的笑容我印象非常深刻,而且最令人感动的是,她下车后微微鞠了躬向我们工作人员表示感谢。她的笑容从未离开脸庞。至今已经忘记了她当时具体的样子,只是记得那温暖又平易近人的笑容。
跑步的时候,我总是在幻想,哪一天带着自己的妈妈去听周杰伦的演唱会,那该是多么浪漫的事情啊。我想就这样牵着你的手不放开,爱可不可以永远单纯没有悲哀。
《听妈妈的话》的“幸福的白发,温暖中发芽”简直催泪,但是我想绝对是幸福的眼泪。
— 2016.5.30
摘自《财经杂志》
世界上没有任何一个国家能在外汇管制很严重的情况下实现开放式经济,也没有一个国家能在汇率严重偏离均衡的情况下实现国内外市场的良好互动。改革需要顶层设计,需要从更高层面认识开放的意义。及时开放存在各种困难和潜在的危险,依然需要坚持扩大开放的大方向,不断推动有关政策改革。
周小川:很多新兴市场经济体特别是转轨经济体,基本上是从封闭型经济转向开放式经济。一般而言,从不开放转为开放的难处首先是汇率。在不开放的条件下,绝大数时候回来都处于不合理、不均衡的水平。为此,外汇管理部门需要对用汇进行管制,而外汇管制又使对外开放的门打不太开。
从金融改革来看对外开放的过程就是汇率趋于均衡、可兑换程度提高的过程。总体上,你需要什么样的开放程度,汇率机制和外汇体制就需要相应配合到什么程度。我国改革开放的进程始终伴随着外汇管制的逐步减少和汇率走向合理化。
人民币加入SDR,说明贸易投资对外开放、市场化汇率形成机制和减少外汇管制“三驾马车”拉着**经济在对外开放到了上走了相当长的里程,迈过了很大的台阶,解决了**经济发展中遇到的不少问题。三者即互相配合和促进,也互相影响和牵制。
众所周知,**改革开放是从十一届三中全会开始的。
《财经》:人民币加入SDR,人民币汇率形成机制必然要跟上台阶,但有人认为要慎重,条件不够不能勉强推动,您怎么看?
周小川:人民币汇率问题历来众口难调。站在不同角度就会各异,有争议,有负面评价也有反对意见。反对意见就主要来自“条件论”。他们认为,外汇改革是一件好事,但需要满足三个条件:出口足够强大、外汇储备足够多、宏观调控有完善体系和足够经验。事实上,如果不搞市场经济、不扩大开放、不进行外汇体制改革的话,出口乏力和外汇短缺的现象就不可能纠正,宏观调控就会陷于管制和外汇分配,也难以积累新型的宏观调控经验,这些条件又怎么达到呢?
从国内外经验看,往往都是最困难的时候倒逼改革出台。上世纪70年代末期,**倒逼反思和改革开放;1993年决定汇改前,各省都有外汇交易中心,海南人民币对美元一度贬值到11,外汇储备只有100多亿美元,下决心实行汇率并轨后,改革的信号释放了,汇率反而有所升值,外汇储备也在增加。
**加入WTO也是一例,当时争议很多,甚至被认为挑战大于机遇,条件尚不完备,但当时**主要领导同志力排众议、果断排版,实践证明加入WTO释放了非常大的开放红利,也促进了多项改革。
国际上,上世纪90年代初期,波兰经济和国际收支难以为继,兹罗提不断贬值,通胀率达到了700%,外汇大量流出,迫使波兰决定改革汇率、允许自由兑换、放松外汇管制。政策一出,波兰人反而不急着兑换外汇了,外汇流出好转,随后通货膨胀也逐步下降了。
《财经》:既然条件论和顺序论都有不足,那么人民币加入SDR在推进汇率改革等方面究竟给我们哪些启示?
周小川:具体而言,对外开放、汇率制度改革、减少外汇管制要整体推进,不管各自速度如何,整体大方向是要往前的。这需要注意时间窗口,有些改革遇到了合适的时间窗口就可以加速前进,有些没有到时间窗口就可以缓一点。全球金融危机成为人民币加入SDR的一个重要机遇。
本来人民币没有完全做好国际化货币的准备,但全球金融危机导致周边国家和地区出现流动性紧缩,纷纷要求使用人民币进行贸易和投资结算,人民币加入SDR就是从这里起步并加快推进的,应该说我们抓住了机遇。
《财经》:**经济的对外开放推动和实现了人民币加入SDR,那么反过来,加入SDR是否会在高层次上进一步推动**的对外开放呢?
周小川:答案是肯定的。人民币加入SDR对我国的对外开放带来的影响是不可逆的。在我国改革开放的进程中,如吸引外资、贸易开放、汇率改革、加入WTO、修改外汇条例、人民币跨境使用等,中间也出现过少量反复,或是走走停停,但一旦上了那个台阶,就难以往回退了。人民币加入SDR后,国际组织和金融市场都越来越多地使用人民币了;国际上投资者已经在用人民币投资国内的金融市场;法规和条例也修订了,贸易商和投资商都在用新规则;如果想倒退回去,难度很大,成本很高。
《财经》:一般认为,蒙代尔-克鲁格曼的“不可能三角”会制约改革开放的政策选择,您怎么在这三难或者两难中做出选择的?
周:它的一个意义是告诉我们,政策设计不会让你好处全得,缺点全免;政策有时候像“抓中药”,每样来一点,有些选择是相互矛盾、相互掣(che)肘的。
“不可能三角”理论发端于上世纪60-70年代,当时各国的开放程度和现在经济全球化格局是不可同日而语的。随着开放程度扩大,三角形的三个角点的政策定义和其功效模糊化了。由“一点”变为“一片”了。就拿汇率这个大家认为最不容易模糊的“角点”来说,一国是固定汇率还是浮动汇率已经不像原先那样固定且可选了。
一个角点是货币政策的独立性。我理解的是货币政策的独立有效性,在全球化背景下,货币政策无论如何都不是“要么有效、要么无效”那么简单,也是一个模糊的范围,一国货币往往很难单独有效。
一个典型的例子就是美国搞量化宽松QE,全球货币政策都受到感染,另外还有就是通胀。过去认为各国物价都是各国自己的政策选择结果,互相之间独立。随着全球贸易发展和大宗商品交易等,通胀也可以互相影响和传染,通胀都变得不那么独立了。不过,这不是通过资本流动产生的影响,而主要通过进出口贸易发生作用。在通胀受影响的情况下,主要针对通胀的货币政策也变得无法独立有效。
近年来,我们一直追求动态变化的立足点,现在看来效果也还不错。
和同事配合开发一个功能点。同事给了头文件给我,我这边开发不受阻塞,单测中mock他的接口就可以了。
有个函数A,原型是int A();但是后面他有更新分支了,改了原型变成了int A(bool arg);
那我功能代码里面肯定跟着改了,但是单测里面忘记改了。单测使用如下:
int mockA()
{
return 0;
}
xreplace((void *A, (void *mockA);
由于转了void*
,编译时不会报错的。
实际上功能代码跑到A会调用mockA这个函数,参数其实是不同的。运行单测时,调用A(false),实际上会变成:
调用约定是__stdcall
。
在Win32 Api中,由主调用函数采用从右到左的压栈方式进行参数压栈,然后由被调用者弹栈(pop),被调用者自己在退出时清空堆栈。
所以调用者压栈了false,但是mockA退出时候不会清理堆栈因为他认为自己是没有入参的。这样栈就不平衡了。
首先肯定是把mockA原型改对。这样确实在win32下跑单测不会蹦了。
有啥更好的拓展吗,怎么预防后面再次出现类似问题?很自然想到单测mock应该限制函数类型一致。
优化mock方法,校验函数原型应该一样:
// 强制函数类型需要一样
#define cpp_xtest_replace(target, hook) \
do {\
if (!std::is_same<decltype(target), decltype(hook)>::value) {\
ASSERT_TRUE(0); \
}\
xtest_replace__((void*)target, (void*)hook, #target, #hook);\
} while (0);
使用:
cpp_xtest_replace(A, mockA);
表达自己的想法是一个非常重要的技能,在工作中非常重要。今天中午给leader讲项目的细化方案,自己准备也算是足够,可是在白板上讲的时候丢失了大量细节,逻辑也讲不通,讲述的时候自己也不知道后面要讲什么,凭着印象中的逻辑关系画了一通就over了,脑子有点懵,计划讲很多结果2分钟就讲完了。期间我的导师不断给我眼神,意思是不对啊、不是这样啊,后来干脆很多话都替我说了,“冰涛的意思是,这个这个......”,我则尴尬地听导师帮我解围。
leader听完后:“逻辑有点乱,貌似是这个样子,还是我来给你理理”。
于是leader拿起签字笔在白板上开始讲自己理解的项目怎么做,每一步都有条有理,语句清晰,并且不时问问“听懂了吗?”
leader讲了近20分钟,期间我、导师和他都有很多的交流,最终大家都明白了项目的设计方向。入职以来,我记得leader常给组内新人题一个观点“要把事情讲清除透彻,让别人明白”,入职以来听他分享讲话4次,有在台上ppt展示、有白板讲项目、白板讲小组未来规划,这些讲话他都是一个人讲几十分钟,听者都容易get意思,leader喜欢互动,不尴尬且引发听者思考。
我的导师的表达能力也较强,他在中心半年会上总结赤兔项目的进展时,自信而不浮夸,条理清晰;把眼界放大一点,隔壁支付中心的高级工程师hank介绍我们部门的金融级数据库TDSQL时,从架构层高屋建瓴讲解,我们这些小白却也可以听懂;眼界再大点,在IT业界,看过鸟哥laruence在QCON和**的php大会上的演讲,扎实稳重、句句有料。
我毫无疑问是反面教材,在和别人分享时总是语塞,脑子懵起来。能自信扎实地陈述自己的想法是非常重要的,写程序扎实是必须的,清楚明白地表达出来却是和别人融洽合作的前提。
权当日记
over
2016.9.1
四年前的自己,懵懵懂懂地进入了华中科技大学,进入了船海学院。进入大学最初带给我的不是一开始希望的充满夏天气息的香樟大道和为梦想奋斗的自己,而是很多的不适应,对课程的缺乏兴趣让我迷失了很长一个学期。
而在这个大二这个关键时间点,我接触了一些社团,很有幸进入了“思存工作室”这个集体,在这里我接触了计算机,认识了令自己佩服的学长和有相同爱好的朋友。这是一段美好的回忆。那段时间充实而有趣,学习一个新的感兴趣的东西让我觉得大学变得有趣起来,并且对未来充满了信心,在大二这一年我学到了很多,并且有了一点编程的基础。
大三这一年,又是一个天大的幸运,让我进入了启明学院的点团队,这里的平台十分广阔。几乎所有的队员都是异常优秀,从他们身上学到了很多东西,我们一起写代码、做项目,陈贵华、郭震宇等等学长对我的影响很大,在此表达我最真挚的感谢。
大四做这个毕业设计,由于之前两年的积累,我进行得算是顺利。感谢吴军老师,感谢吴超勇学长、朱勇猛学长,还有和我一起做这个课题的王旭同学。这是一段美好的回忆,每个星期在东二楼待3天左右,坐在工位的时候总让我想起自己在腾讯的工位,我也很享受和大家待在一起搞科研的感觉。
谢谢我的母亲,没有你的支持,我走不到今天,一直想说,你是我最大的动力。
谢谢华中科技大学,谢谢你的宽广与包容,感谢你提供了一个开放的平台,让一个少年自由学习,自由成长。
笔者最近在工作中把c++的一个json库引入到我们的项目中,我们项目以c语言为主体开发语言,所以需要做导出接口提供c语言使用。
定义接口
#ifndef __JSONSCHEMA_WRAP_H__
#define __JSONSCHEMA_WRAP_H__
#ifdef __cplusplus
extern "C" {
#endif
/**
* \return 0:校验成功
*/
extern int jsoncon_schema_check(const char *p_schema, const char *p_json);
#ifdef __cplusplus
};
#endif
#endif
#该模块的名字
set(_TARGET_NAME libjsoncons)
#生成库的类型,SHARED 为动态库,STATIC为静态库,APP为可执行文件
set(_TYPE LIB)
#安装目录
set(_INSTALL_DIR eaio_base/bin)
set(_LIB_DEPENDS libsfabase)
set(_SRC_DIR_WIN windows)
set(_EXTRA_CFLAGS -DHAVE_STDINT_H)
set(WERROR NO)
include(common)
接口实现
#include <jsoncons/json.hpp>
#include <jsoncons_ext/jsonschema/jsonschema.hpp>
// for brevity
using jsoncons::json;
namespace jsonschema = jsoncons::jsonschema;
#ifdef __cplusplus
extern "C" {
#endif
#include "eaio/jsonschema/wrap.h"
#include "eaio/base/log.h"
int jsoncon_schema_check(const char *p_schema, const char *p_json)
{
int err = 0;
if (!p_schema || !p_json) {
warn("schema or json null");
return -1;
}
try {
json schema = json::parse(p_schema);
json data = json::parse(p_json);
auto sch = jsonschema::make_schema(schema);
std::size_t error_count = 0;
auto reporter = [&error_count](const jsonschema::validation_output& o)
{
++error_count;
warn("schema check errmsg:%s:%s\n", o.instance_location().c_str(), o.message().c_str());
std::cout << o.instance_location() << ": " << o.message() << "\n";
};
jsonschema::json_validator<json> validator(sch);
// Will call reporter for each schema violation
validator.validate(data, reporter);
std::cout << "\nError count: " << error_count << "\n\n";
if (error_count > 0) {
return -1;
}
} catch (const std::exception& e) {
std::cout << e.what() << '\n';
err = -1;
warn("schema exception:%s\n", e.what());
}
return err ? -1 : 0;
}
#ifdef __cplusplus
};
#endif
#ifdef XTEST
#include "xtest/xtest_jsoncons.cpp"
#endif
代码如下所示,session_init_active_id函数每500ms执行一次,就泄漏一个sessionid_st大小的内存。
根因就是创建hash表的时候没有传析构函数。struct中没有指针就不用释放自己了?
/* 登陆会话结构 */
typedef struct _session_id_st {
sfe_uint32_t session_id; /* session id */
sfe_uint32_t uid;
char seat[64]; /* session SEAT */
char display[64]; /* DISPLAY变量 */
char type[64]; /* Type变量 */
char service[64]; /* Service变量 */
} session_id_st;
static int get_sessions(sfe_hash_st **p)
{
// 获取新的hash表
sfe_hash_st *session_map = eaio_xhash_create(NULL, NULL);
// 往hash表中存数据
session_id_st *item = (session_id_st *)malloc(sizeof(session_id_st));
xhash_insert(session_map, &item->session_id, sizeof(item->session_id), item);
*p = session_map;
}
/**
* 获取登陆会话列表
*/
void session_init_active_id()
{
sfe_hash_st *session_map = NULL;
int ret = get_sessions(&session_map);
if (ret) {
warn("get sessions failed ret:%d\n", ret);
return;
}
// 更新全局hash表
sfe_hash_st *p = s_session_hash;
s_session_hash = session_map;
eaio_xhash_destroy(p);
}
修改:
sfe_hash_st *session_map = eaio_xhash_create(free, NULL);
这个函数每500ms执行一次,每次泄漏大概8+8+4x64=272个字节,一个小时就是3600x2x272=1958400bytes,也就是1.9M的内存,一天就是1.9Mx24=46M的内存。
这个为啥跑稳定性测试没有跑出来?
因为没有关注这个进程的内存,主观觉得这个进程肯定没问题。
对于这种高频执行的流程,一定要做性能测试,它外网500ms每执行一次。你性能测试就需要10ms执行一次,看是否会有内存泄漏。
窈窕淑女,君子好逑。追求女生没有任何错误,关键在于,君子爱美,取之有道。
1、心态建设
很多男生在追求女生时候心态是很急的,总希望聊两三天就能让女生喜欢并对自己产生依恋,可是现实完全不是这样。
我也被女生追求过,在陌生交友平台女生加我微信后,聊了几句,然后她的感觉就是放低身段来追我,我感觉挺奇怪的,你都没见过我呢,然后聊了一天后,女生没有主动找我,我自然也不会主动找她,然后就再也没啥联系了。
我在追女生时,也犯过类似的错误,和女生聊了两三天后,女生还是对我没啥感觉,于是我会比较急甚至和女生说“感觉你都不怎么回我”,这样和女生表达了负面情绪后,更加剧了关系走向陌路,女生回我“哈哈哈,我们也不怎么熟”。
男生追求女生的正确心态,应该是自尊自爱地释放爱意,如果没有回应,也坦然一点,觉得就是常态啊,多主动联系女生,找点话题逗她开心,这是一个很需要时间的过程。
2、平等对待
男女是平等的,对待自己和对待女生应该是平等的。可能在追求过程中,你主动点,但那也是你的绅士表现,还是平等的。
你找女生聊天,不要连续发那么多信息,那一看就不平等了,完全降低自己的身段去舔别人了。正确做法应该是你来我往,而不是单方面的跪舔。
人活在这个世界上,做人是第一位的。
做人第一要把自己做好,对自己要充满自信,满足自己的生活,当你欣赏自己的生活并且有自己信仰的东西,那你的精神就会非常富足,生活也会很快乐并且强化你的自信。这种自信不是无根据的自信,要有做人的准则,古人云“天行健,君子以自强不息;地势坤,君子以厚德载物”,这话到现在都是做人的明灯。
做人第二就是要对别人的态度做好。对待优秀的人加以欣赏不要嫉妒,对遇到困难的人平常心看待而不落井下石。这个世界上的人良莠不齐,要坦然接受这种现实,在这种混沌中拿捏好待人处世的准则,做到不卑不亢。遇到有人品性不正,就要及时醒悟切不可深交;遇到有人品行兼优,就要虚心学习。
做人做得好的人做事不会差,而做事做得好的人一定是做人做得极好。以汪总为例,汪总做人就是相当好。前几天股市暴跌,群里有人提出全球通货膨胀抬头将导致**收紧货币,我不解私信问汪总,截图见附录。
然后我打电话给他,他当时正在吃饭还给我解释了几分钟,然后说等吃完饭再和我详谈。过了没多久汪总就给我回电话仔细解释了下**2010年有通胀的原因等等。谈话中他问我是否是因为股票仓位有杠杆而有压力,并且问我杠杆是否安全并提供了一些建议。这个小事就展示了汪总怎么做人的,他乐于分享自己的经验并且发自内心关心朋友,无论地位高低,都坚守做人标准。
这半年见过不少有钱人,大名鼎鼎的冯柳还有他的助手hongwei,做酒鬼酒赚了近10倍的弘毅老师,超级牛散孙骏华等等,这些牛人有个共同特点,都很会做人。
**古人的做人原则很多,可以细细品味,“散财聚友”,“虚怀如谷”等等都蕴藏大智慧。
windows运行时库有MT和MD两种,我们的项目中默认静态是编译成MT,动态库编译成MD。
我有个库专门做jsonschema的校验,编译成静态的也就是MT版本的so,lib_schema。
然后我们的core库引入我的库,core库是编译成动态MD库的。
特性库防火墙firewall是个c++项目,引入了core库,也使用了我的库中的函数,编译的时候报错了,提示运行时库冲突,同时引入MT和MD,导致有函数重复定义了。
core库的cmake部分如下:
set(_TARGET_NAME libeaio_core)
set(_hidden_symbol YES)
#生成库的类型,SHARED 为动态库,STATIC为静态库,APP为可执行文件
set(_TYPE SHARED)
#安装目录
set(_INSTALL_DIR eaio_sys/bin)
set(_LIB_DEPENDS libsfe_jansson libsfe_ejs libsfe_cl_ev libeaioschema_static libeaiobase libeaioalgo librsa_static)
我的库是libeaioschema_static
。
为了解决冲突,我的库需要编译一份MD版本的静态库:
#该模块的名字
set(_TARGET_NAME libeaioschema)
#生成库的类型,SHARED 为动态库,STATIC为静态库,APP为可执行文件
set(_TYPE LIB)
#是否添加md的生成方式
set(_CRT_TYPE_MD 1)
其中_CRT_TYPE_MD
的实现原理:
if (DEFINED _CRT_TYPE_MD)
set(_TARGET_NAME ${_TARGET_NAME}_md)
if (("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") )
set(_EXTRA_CFLAGS_WIN ${_EXTRA_CFLAGS_WIN_TMP} /MDd)
else()
set(_EXTRA_CFLAGS_WIN ${_EXTRA_CFLAGS_WIN_TMP} /MD)
endif()
compile(${platform})
endif()
最近在刷一些算法题,让我回忆起了当初学计算机的一些初衷。
记得大一时候学习c++,那时候一头雾水啊。老师讲的也无趣,书本也看不懂,感觉是一个完全陌生的世界,我很排斥这种陌生感所以很多课不愿去上,电脑课也不用心做,感觉这个没什么用。
后来上机考试很糟糕,完全不会,一些很简单的题目廖田教我,我感觉他好强,这种感觉让我有点慌张觉得自己啥都不会。
再后来大二开始主动参加一些社团,结识了一些计算机大神,开始萌发主动学习的念头,毕竟知道自己哪里不会,没有不克服的道理,于是慢慢网上学习一些知识,买书+动手实践,慢慢入门了。
再后来大三去参加一些团队做做项目,工程能力慢慢有了,对大项目看着也不怕。其中大三还教了一个大一的学生c++,我讲得比较容易懂,也算是弥补当年的遗憾。
现在,参加工作已经三年半了,最近又重温一些算法题,数据结构啊之类的,大学青涩懵懂的感觉又浮现脑海,华科的记忆真的很难忘。
对于职业选择,我没有感觉后悔,觉得这是个好行业,科技的的确确才是真正推动了社会发展的东西。我们作为时代一个很小的角色,能参与做一点微小贡献都算是荣幸了。
很久不写东西了,写作是一件非常费力的事情,最近工作较忙,再加上思维较为混乱,很难下笔。今天周六得闲,心情平和,于是思维不吐不快了。
这个题目很大很空,但是对于刚刚接触了解巴菲特的我来说,对他的性格也好、投资理念也好,其实很多东西都是非常大方向的,所以巴菲特之道讲的是我对于巴老的整体轮廓概括,这种概括不涉及到具体生活琐事,纯粹是为人处世的道理法则。
我们理工男都学过大学物理,接触过熵这个概念,整个世界其实是向混乱发展的。但是在股市中,整个世界是向有序发展的,毕竟股市是一个绝对由人所构成的社会,不论股价有时猛涨有时猛跌,当我们忽略过程噪音,价格终究是沿着价值的曲线在奔走。这也是巴菲特向格雷厄姆学到的最为深刻且实用的理念。
价值回归也深深影响了巴老的信徒们,包括我在内。这一影响体现在方方面面,在股市是一定的,在情感方面,在个人发展也都影响显著。
情感方面的价值回归。我们在择偶中,颜值往往是在首位的,但其实颜值是在随着时间流逝中逐渐贬值的,而且不经过悉心维护,颜值立马严重贬值。价值投资和谈恋爱一样,讲究长期持有,十年五十年,这个期限中,股市真正的价值回归是企业的本质和行业地位,而恋爱的价值回归是吻合的三观,良好的修养。
自我发展方面。我觉得一个人的自我经营可以当做一个企业的经营。企业有资产负债表,人也有;企业有核心竞争力和发展目标,人也有。所以可以说每个人都是一个单独的企业。以我们混股市的人在资产负债方面作为例子,当牛市时,你会融资会贷款去获取更大的收益,可能负债比例达到50%甚至100%以上,你的现金流更为充足,可以迈着大步向前走;在熊市中,你会尽快还清负债离开市场,并且思考下一步的战略。这个和企业多么类似啊,我看一家企业的财报时,总是会感慨原来像恒大、蒙牛、格力这类的大型企业都是背负了很多债务的,贷款给了企业庞大的现金流去发展自身不断壮大。所以你可以看到人和企业多么相似了,那么人的价值回归应该怎么做呢?核心竞争力和不断的拼搏,这和一个企业完全一致,企业具有核心竞争力并且不断超越目标后,市场无形的手会把它抬到价值回归的路上,人一样;企业管理无序,竞争力减弱,市场会唾弃它,人也一样。
总结下,其实都是讲价值回归,但是这一点是巴菲特给我最大的启迪了,在市场上找有护城河的企业,这一点上,一月时间,在港股市场市值由9万港币到15万港币,感谢牛市中市场的价值回归;自身发展需要不断提高竞争力,这一点希望自己和所有的朋友一样,去做得更好。
近来我逐渐愈发感受到时间的流动,就像兰亭集序中的“不知老之将至”那样感到担忧,我不知道这是一种悲观主义还是现实主义,毫无疑问的是,这种感受让我有了写下这种感受的迫切渴望。我想记录此时此刻,因为回忆是如此短暂,当我回忆起三五年前,甚至十年前,都感觉恍惚之间。我担心十年后的我回忆今天也是这种感受,甚至会更加感到时间如梭,回忆可能如狭义相对论类似地随着阅历增加而变得更加短暂。
我想起多年前初中时候,我的语文老师是一个嘴巴有点歪的男人,但是在我眼中他很英俊潇洒,因为他总是穿着熨帖的西装,发型也打扮地很熨帖。总之,崇拜让我对他说的话深信不疑。他经常提到自己有写日记的习惯,并称人生最大的乐趣就是在自己年迈的时候阅读自己的日记,他说如果能成天坐在舒服的沙发上,翻阅叠起来可以几箱子的日记是多么惬意的事情。年少的我略微理解那种感受,但是我想我的理解更多应该来自他说起这个爱好时的沉醉表情。多年后,我愈发感觉人的成长在于理解了时间,因为在时间面前任何事情都是平等且苍白的。
近来阅读起余华的《世事如烟》和《没有一条道路是重复的》,我想没有比余华更简练流畅的语言了。他对自己童年的回忆,对儿子成长的回忆,对自身思考的记录,让我这种迫切更为焦虑。“时间对我是一种**,因为展望是那么漫长,回忆却是如此短暂”。
今早行走在上班路上的时候,脑海中蹦出一个奇思妙想,人的一生是否是灵魂慢慢飘散的过程呢?我们行走着生活着,灵魂洒落在每时每刻的地方然后停留在那里。当我重温一个地方的时候,我能感受到灵魂的共振与呼喊。最简单的例子便是当我重新回到大学校园时,那份灵魂似乎重回我的身体,大学时的迷茫苦涩、一时得意的愉悦林林种种地回到了我的身体。感受着过往的灵魂,我感到很惋惜,这部分的我本应该更加快乐,应该少一点忧郁,可惜它永远无法更改了,它停留在了大学里,早已经不属于我了。
于是乎,我要开始记录生活。不为了让别人看到,只为了给自己留念想。我希望我散落的灵魂能和我的文字产生共鸣,同时,我也期许记录能让心灵更加敏感和柔软,少一点麻木不仁。
--2020-3-19 松日鼎盛大厦20楼
人是周围环境文化的产物,好的文化给你带来成长,坏的文化让你自我怀疑没有成长。
深信服的文化是纯粹的工程师文化,技术驱动,架构师地位非常高。
腾讯的文化是产品驱动,产品经理地位非常高。
对于做技术的人来说,工程师文化让人谦逊,好的流程让程序员能多思考编码以外的价值,一个程序员80%的价值都是在非编码阶段产生的,好的需求分析、方案设计、测试设计、性能兼容性分析等等环节是非常有价值的。
回忆下华科的文化。
我的感受是偏浮躁,沉下心来做事情的人很少,大多数同学包括我自己都在追名逐利的氛围中迷失,搞了一点小成就就沾沾自喜装逼啥的。华科提倡的“明德厚学、求是创新”,我践行太差了。
但可能是专业缘故,我在的船舶专业普遍很浮躁,攀比之心盛行,沉下心来踏踏实实搞研究,踏踏实实做真正价值的人太少了。而且氛围是正循环的,越来越焦虑和攀比,就越沉不下心。急功近利、只看表面价值,内心缺乏对学术的敬畏之心。
在学校的一些老一辈老师中,我确实感受过这种沉稳做学术的文化,比如模电的老师、比如线性代数的老师。但是更多的是有些老师也开始浮躁起来了,这种文化会传导,会放大。
时间过得很快,2019年走到了尾声。今年没有虚度。我想谈一谈19年并且展望下以后的日子。
其实到了2019年底,我想先谈下2018年。最想谈谈2018年投资方面。从2月份的贸易战开始,负面新闻围绕了每一天,我记得的大标题有:“美联储缩表”,“贸易战升级”...2018年股市很差,做投资的人应该都尝到了苦头。很罕见地有好几天市场达到千股跌停,足以说明大家的信心有多悲观。在这单边下行的洪流中,我屡次做错,还玩了几次港股的牛熊导致亏损了十万,这导致了在18年我的心情不是很好,甚至有点影响到了工作。不过,幸运的是在工作上,同事之间的合作很好,我与大家相处也不错并且也收获了不少工作能力的成长,这缓解了很多的负面情绪。
回到19年。工作上,今年比较平淡,少了2018年那种野蛮成长的感觉。世上很多事情最终都归于平凡,我很欣然能进入比较平淡的状态。我在组内也算是个资深成员了,各种业务都对接过,对业务安全的理解比较成熟吧。投资上,2019年走得比较顺利,核心资产价格在外资的流入下水涨船高,**的未来不会被压制,世界属于乐观主义者。
年底了,抛出一个问了自己很久的问题,未来的行业机遇在哪里?
这几年来的工作经验让我深刻理解了一个道理:成全他人,成就自己。在这个充分竞争的市场,只有长期服务好他人的行业才能经久不衰。理解了这一点,对**的未来在哪里应该有点看法了。我觉得未来最好的行业应该是医药。
为什么巴菲特一直只投资消费股,因为只有消费品会长期被人需要。可口可乐、银行、美国运通这些重仓股都是长期服务于社会的;至于科技股,没有人知道某项科技是否长期被社会需要,比如facebook可能这些年很火但是十年后呢?netflix电视很好看,但是十年后随着流媒体不断革新你还在不在呢?
长期来看医药的定位归属于大消费。为了服务于他人,我们必须了解未来社会的人口结构,**社会主体年龄段不断上升,未来社会对医药的需求比较平稳地只增不减,这个赛道够宽,由于有巨大的需求,这个赛道上可以容纳多家巨头。
虽说很看好医药,但是我作为一个互联网行业里写代码的工人,确实难以接触医药行业。好在,市场给予了我这个机会。
2020年,我将挪一些仓位到医药行业里,我希望通过资本杠杆与这个行业沟通,依靠他人的力量去成全他人,成就自己。我预计投资在医药的仓位不会低于20万,这部分会从大金融中腾挪出来。
任何的岁月静好都是因为有人负重前行,只有持续给他人创造价值的个人和公司才能最终成就自己。2020年,我希望能守正出奇,无论在工作还是投资上,尽自己最大努力去逐浪前行。
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.