Jekyll2021-03-21T14:25:28+00:00http://cxh.me/feed.xmlCXH.ME北航本,清华硕,先后就职于支付宝北京、搜狐大数据中心、美团云。方向分布式数据库系统、分布式文件系统、推荐/广告系统。
Harry Chensdqxcxh@gmail.com在上海2021-03-21T22:22:00+00:002021-03-21T22:22:00+00:00http://cxh.me/2021/03/21/at_shanghai<p>感觉比北京要精致多了。天气不见得好多少,这几天看外面都是雾蒙蒙的,外滩看着也属于分辨率不高的状态。但是城市管理的细节还是比北京到位,堵车是一样的堵,可能没有北京司机那么大的情绪?反正是交通警力足够多,鸡贼司机少不少。</p>
<p><img src="https://harrychen.oss-cn-beijing.aliyuncs.com/2021-03-21-142437.jpg" alt="" /></p>
<p><img src="https://harrychen.oss-cn-beijing.aliyuncs.com/2021-03-21-142500.jpg" alt="" /></p>Harry Chensdqxcxh@gmail.com感觉比北京要精致多了。天气不见得好多少,这几天看外面都是雾蒙蒙的,外滩看着也属于分辨率不高的状态。但是城市管理的细节还是比北京到位,堵车是一样的堵,可能没有北京司机那么大的情绪?反正是交通警力足够多,鸡贼司机少不少。inline static的成员初始化2021-03-21T19:49:00+00:002021-03-21T19:49:00+00:00http://cxh.me/2021/03/21/inline_static_since_c++17<p>c++非静态变量可以直接在定义的时候初始化。这个算是比较简单的构造方式,相当于对初始化列表的优化,可以认为是初始化列表的一个简单的写法。</p>
<p>比如</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#pragma once
</span><span class="k">class</span> <span class="nc">File</span> <span class="p">{</span>
<span class="nl">private:</span>
<span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">filename</span> <span class="o">=</span> <span class="s">"test"</span><span class="p">;</span>
<span class="nl">public:</span>
<span class="kt">void</span> <span class="n">print</span><span class="p">()</span> <span class="k">const</span> <span class="p">{</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o"><<</span> <span class="n">filename</span> <span class="o"><<</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>
<p>而静态变量不太一样。静态变量本身定义跟声明是分开的,这本来也合理,所以在不同的编译单元里面,静态变量可以各自实现,当然相互影响。。一般情况系因为.h和 .cpp的相互对应,也不会出现多次包含之后定义的重复的问题。</p>
<p>但是static变量毕竟是可以寻址的,从这个角度看,一个头文件如果包含了定义和声明,同时被多个编译单元包含,还是会出现multiple definition的问题。</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#pragma once
</span><span class="k">class</span> <span class="nc">File</span> <span class="p">{</span>
<span class="nl">private:</span>
<span class="k">static</span> <span class="kt">char</span> <span class="n">filename</span><span class="p">[];</span>
<span class="nl">public:</span>
<span class="kt">void</span> <span class="n">print</span><span class="p">()</span> <span class="k">const</span> <span class="p">{</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o"><<</span> <span class="n">filename</span> <span class="o"><<</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">};</span>
<span class="kt">char</span> <span class="n">File</span><span class="o">::</span><span class="n">filename</span><span class="p">[]</span> <span class="o">=</span> <span class="s">"file.txt"</span><span class="p">;</span>
</code></pre></div></div>
<p>静态的const变量因为不涉及修改,可以认为编译期能确定,所以可以直接在定义的时候声明。同时c++11提供了constexpr来现实说明编译期可以确定。但是constexpr不能支持复杂类型。</p>
<p>比如:</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#pragma once
</span><span class="k">class</span> <span class="nc">File</span> <span class="p">{</span>
<span class="nl">private:</span>
<span class="k">static</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">file_size</span> <span class="o">=</span> <span class="mi">1025</span><span class="p">;</span>
<span class="nl">public:</span>
<span class="kt">void</span> <span class="n">print</span><span class="p">()</span> <span class="k">const</span> <span class="p">{</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o"><<</span> <span class="n">filename</span> <span class="o"><<</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>
<p>所以c++17继续从编译器层面支持了多个编译单元对static的展开,也就是inline变量,是的,不只是函数,变量本身也可以inline了。</p>
<p>比如:</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#pragma once
</span><span class="k">class</span> <span class="nc">File</span> <span class="p">{</span>
<span class="nl">private:</span>
<span class="c1">// static constexpr std::string filename = "test";//not supported</span>
<span class="kr">inline</span> <span class="k">static</span> <span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">filename</span> <span class="o">=</span> <span class="s">"test"</span><span class="p">;</span><span class="c1">//c++17 supported</span>
<span class="nl">public:</span>
<span class="kt">void</span> <span class="n">print</span><span class="p">()</span> <span class="k">const</span> <span class="p">{</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o"><<</span> <span class="n">filename</span> <span class="o"><<</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>
<p>同样支持非const的static初始化,比如:</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="cp">#pragma once
</span><span class="k">class</span> <span class="nc">File</span> <span class="p">{</span>
<span class="nl">private:</span>
<span class="k">static</span> <span class="kt">char</span> <span class="n">filename</span><span class="p">[];</span>
<span class="nl">public:</span>
<span class="kt">void</span> <span class="n">print</span><span class="p">()</span> <span class="k">const</span> <span class="p">{</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o"><<</span> <span class="n">filename</span> <span class="o"><<</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">};</span>
<span class="kr">inline</span> <span class="kt">char</span> <span class="n">File</span><span class="o">::</span><span class="n">filename</span><span class="p">[]</span> <span class="o">=</span> <span class="s">"file.txt"</span><span class="p">;</span>
</code></pre></div></div>
<p>或者</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">File</span> <span class="p">{</span>
<span class="nl">private:</span>
<span class="kr">inline</span> <span class="k">static</span> <span class="kt">char</span> <span class="n">filename</span><span class="p">[]</span> <span class="o">=</span> <span class="s">"file.txt"</span><span class="p">;</span>
<span class="nl">public:</span>
<span class="kt">void</span> <span class="n">print</span><span class="p">()</span> <span class="k">const</span> <span class="p">{</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o"><<</span> <span class="n">filename</span> <span class="o"><<</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>
<p>感觉并不是很有用,主要是支持了static const std::string的定义初始化?</p>Harry Chensdqxcxh@gmail.comc++非静态变量可以直接在定义的时候初始化。这个算是比较简单的构造方式,相当于对初始化列表的优化,可以认为是初始化列表的一个简单的写法。 比如 #pragma once class File { private: const std::string filename = "test"; public: void print() const { std::cout << filename << std::endl; } }; 而静态变量不太一样。静态变量本身定义跟声明是分开的,这本来也合理,所以在不同的编译单元里面,静态变量可以各自实现,当然相互影响。。一般情况系因为.h和 .cpp的相互对应,也不会出现多次包含之后定义的重复的问题。 但是static变量毕竟是可以寻址的,从这个角度看,一个头文件如果包含了定义和声明,同时被多个编译单元包含,还是会出现multiple definition的问题。 #pragma once class File { private: static char filename[]; public: void print() const { std::cout << filename << std::endl; } }; char File::filename[] = "file.txt"; 静态的const变量因为不涉及修改,可以认为编译期能确定,所以可以直接在定义的时候声明。同时c++11提供了constexpr来现实说明编译期可以确定。但是constexpr不能支持复杂类型。 比如: #pragma once class File { private: static const int file_size = 1025; public: void print() const { std::cout << filename << std::endl; } }; 所以c++17继续从编译器层面支持了多个编译单元对static的展开,也就是inline变量,是的,不只是函数,变量本身也可以inline了。 比如: #pragma once class File { private: // static constexpr std::string filename = "test";//not supported inline static const std::string filename = "test";//c++17 supported public: void print() const { std::cout << filename << std::endl; } }; 同样支持非const的static初始化,比如: #pragma once class File { private: static char filename[]; public: void print() const { std::cout << filename << std::endl; } }; inline char File::filename[] = "file.txt"; 或者 class File { private: inline static char filename[] = "file.txt"; public: void print() const { std::cout << filename << std::endl; } }; 感觉并不是很有用,主要是支持了static const std::string的定义初始化?李显龙的一个演讲2021-03-14T18:58:00+00:002021-03-14T18:58:00+00:00http://cxh.me/2021/03/14/lee_hsien_loong_speech<iframe width="560" height="315" src="https://www.youtube.com/embed/xEeFZ1ceEVY" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>
<p>从里面能看到新加坡一贯的社会治理理念,里面关于养老的一些设计,关于大家长式的执政理念,都有比较到位的体现。</p>Harry Chensdqxcxh@gmail.com从里面能看到新加坡一贯的社会治理理念,里面关于养老的一些设计,关于大家长式的执政理念,都有比较到位的体现。美国对Youtuber收税的影响2021-03-13T20:14:00+00:002021-03-13T20:14:00+00:00http://cxh.me/2021/03/13/us_tax_on_youtube<iframe width="560" height="315" src="https://www.youtube.com/embed/TbYpKlabY3k" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>
<p>最近看有的youtuber收到了美国的海外课税单,具体细节上面的up主已经讲很清楚了。
这里主要分析下对海外的影响。</p>
<p>首先这种税如果确定的推进下去,相当于是长臂管辖的2.0版本。1.0版本的长臂管辖大家应该还有印象,比如华为孟晚舟事件,Tiktok事件。2.0的长臂管辖扩大了美国在全球的剥削范围,只是没有1.0那么致命。美元的全球霸权已经不够了,放水放太多了导致全球对美元信心下降,同时美元贬值美联储也不能坐视不理,通胀这么下去,美联储肯定还是要加息的,但是现在这么印钱发救济金,美债是要创新高的。而加息之后美债的压力肯定要上去,从这个角度看,节流不了那就开源,Biden的全球收税也就可以理解了。毕竟收国内的税压力太大了,那就收不影响选票的税呗。</p>
<p>从另外一个角度想,如果推行的下去的话,避税就已经不是一个本地行业了,避税行业即将国际化。尤其对全球的科技公司会带来长远的影响,现在在开曼群岛,百慕大注册的公司可能会被美国盯上。Tiktok的例子可能会有其他的版本,比如以美国市场准入为条件,不限制你必须把公司卖给美国,但是对这家公司的海外营收收取更高的税,相当于把营业税转嫁成了消费税。相反的,不注册在美国本土但是涉足美国市场的公司,可能会被要求实体注册在美国本土,从而导致更多的公司需要为美国市场拆分一个实体,否则这个平台就变成了美国平台,平台上的用户都被加了一道美国消费税。</p>
<p>另外,BTC可能会创新高吧,倒逼支付手段的匿名化来避免海外课税。</p>Harry Chensdqxcxh@gmail.com最近看有的youtuber收到了美国的海外课税单,具体细节上面的up主已经讲很清楚了。 这里主要分析下对海外的影响。 首先这种税如果确定的推进下去,相当于是长臂管辖的2.0版本。1.0版本的长臂管辖大家应该还有印象,比如华为孟晚舟事件,Tiktok事件。2.0的长臂管辖扩大了美国在全球的剥削范围,只是没有1.0那么致命。美元的全球霸权已经不够了,放水放太多了导致全球对美元信心下降,同时美元贬值美联储也不能坐视不理,通胀这么下去,美联储肯定还是要加息的,但是现在这么印钱发救济金,美债是要创新高的。而加息之后美债的压力肯定要上去,从这个角度看,节流不了那就开源,Biden的全球收税也就可以理解了。毕竟收国内的税压力太大了,那就收不影响选票的税呗。 从另外一个角度想,如果推行的下去的话,避税就已经不是一个本地行业了,避税行业即将国际化。尤其对全球的科技公司会带来长远的影响,现在在开曼群岛,百慕大注册的公司可能会被美国盯上。Tiktok的例子可能会有其他的版本,比如以美国市场准入为条件,不限制你必须把公司卖给美国,但是对这家公司的海外营收收取更高的税,相当于把营业税转嫁成了消费税。相反的,不注册在美国本土但是涉足美国市场的公司,可能会被要求实体注册在美国本土,从而导致更多的公司需要为美国市场拆分一个实体,否则这个平台就变成了美国平台,平台上的用户都被加了一道美国消费税。 另外,BTC可能会创新高吧,倒逼支付手段的匿名化来避免海外课税。关于两会的提案2021-03-13T14:21:00+00:002021-03-13T14:21:00+00:00http://cxh.me/2021/03/13/proposal_of_two_meeting<p>最近两会提案的新闻又多起来了,原则上民众平时是没有什么参政议政机会,到每年两会的时候算是有一个集中的意见出口,而媒体也倾向于这时候报道一些有话题性的提案,博一把眼球的同时,也能合理合法的在政策问题上赚点点击率。</p>
<p>其实很多提案感觉并没有什么意义,真正被报道出来的,大部分也不见得能通过,核心问题的提案也一般不会拿出来报道。每年两会都有几个特别有话题性但是影响面特别低的提案报道出来,感觉是媒体把握了安全性和话题性之后作出的最优选择。</p>
<p>而且这些提案大部分也没什么可行性,从标题上看有相当一部分有比较强的话题性,但是不具备执行条件,比如增加春节假期的长度。从受众的角度看,那我举双手赞成啊,但是实际上集中春节假期大部分是对个人观感上会好一些,对社会经济没有大的促进。首先边际效应递减让春节假期从7天到10天没有很好的投入产出比,其次春节后也不是一个消费性节日,传统意义上这是个商业停止,大家回老家过年的节日,唯一的好处可能是带动了四五线城市的突击购物需求。增加在春节远不如增加一个新的假期,来拉动旅游消费。</p>
<p>另外一些提案就是影响面特别低那种,比如什么汉服日汉字日,要么是利益相关要么是造消费风口,本身的影响面非常小,只对行业里面的细分商家和消费者有用,属于用公共资源投资正向明显但是影响面低的策略,这种也放到两会去launch review?</p>
<p>还有把女性产假提高到三年这种。。不知道适是何居心。。。不想喷了都。。</p>Harry Chensdqxcxh@gmail.com最近两会提案的新闻又多起来了,原则上民众平时是没有什么参政议政机会,到每年两会的时候算是有一个集中的意见出口,而媒体也倾向于这时候报道一些有话题性的提案,博一把眼球的同时,也能合理合法的在政策问题上赚点点击率。 其实很多提案感觉并没有什么意义,真正被报道出来的,大部分也不见得能通过,核心问题的提案也一般不会拿出来报道。每年两会都有几个特别有话题性但是影响面特别低的提案报道出来,感觉是媒体把握了安全性和话题性之后作出的最优选择。 而且这些提案大部分也没什么可行性,从标题上看有相当一部分有比较强的话题性,但是不具备执行条件,比如增加春节假期的长度。从受众的角度看,那我举双手赞成啊,但是实际上集中春节假期大部分是对个人观感上会好一些,对社会经济没有大的促进。首先边际效应递减让春节假期从7天到10天没有很好的投入产出比,其次春节后也不是一个消费性节日,传统意义上这是个商业停止,大家回老家过年的节日,唯一的好处可能是带动了四五线城市的突击购物需求。增加在春节远不如增加一个新的假期,来拉动旅游消费。 另外一些提案就是影响面特别低那种,比如什么汉服日汉字日,要么是利益相关要么是造消费风口,本身的影响面非常小,只对行业里面的细分商家和消费者有用,属于用公共资源投资正向明显但是影响面低的策略,这种也放到两会去launch review? 还有把女性产假提高到三年这种。。不知道适是何居心。。。不想喷了都。。关于新加坡和北京的交通比较2021-03-13T14:21:00+00:002021-03-13T14:21:00+00:00http://cxh.me/2021/03/13/traffic_of_beijing_and_singapore<p>最近在上海,远郊区,看整体交通状况感觉比北京好多了。上海市里估计也是一样的堵,但是北京G6到了回龙观也就还那样,属于比较奇葩的了。</p>
<p>对比一下新加坡的交通,能明显感觉城市规划的一些想法上的不一样,两边似乎都没有可以相互参考的地方,但是可以拿出来比较一下。</p>
<p>新加坡地方小,人口密度大,车相对人口算,其实不低了。100万辆车,大概去年到了105万辆吧,人口大概是470万人,北京大概常驻人口3000万人,车710万辆,应该也是去年的数字,从这个角度看,其实人车比差不多。从面积上看呢,新加坡岛上的面积应该也是500平方公里,比海淀区大点,应该跟朝阳差不多?从这个角度看,应该也有可比性,北京的车相对来说等人口、面积比例下会多一点点,外牌的比例之前控制了一把,所以可以认为差不多。</p>
<p>但是整体交通状况新加坡就比北京好太多了。一个是路网密度更高,大部分祖屋社区都是不封闭的,少量的condo虽然封闭但是也只有很少几栋楼,大部分空间拿出来规划了城市道路。北京之前有段时间也想做开放社区,迫于强大的居民压力放弃了。从这个角度看政策跟人性的博弈是一直存在的,民众的想法永远是堵车就是政府不修路,政府跑我们小区修路那我跟你没完。。。</p>
<p>其次是交通执法的压力上很不一样,新加坡这种执法程度放到北京的话,估计短期内交通会有不少改观,很多问题不都是规划,鸡贼的司机占了很大一部分。违法成本低,罚款罚分都是属于广撒网但是力度小,长期执行下去之后违法和查违法之间就形成了一个稳态,加上也不是每次都被抓,交通违章就成为一个是期望为正的事情。新加坡的执法效率没感觉有多高,但是罚的是挺狠,北京这种时不时看到的遮挡号牌,在新加坡试一下,绝对罚的你此生难忘。</p>
<p>另外这边核心区也是有拥堵费的,只不过北京是通过限行调节的。没办法,我们是社会主义国家嘛。要讲公平,不能什么都向钱看。再就是北京停车位是真的不够,新加坡这边祖屋的停车场就没怎么看到停满的,毕竟车是真的贵。</p>
<p>增量控制上,那新加坡是全世界买车最贵的地方,拥车证最近的价格应该是已在4-5w新币徘徊,加上车本身的价格+100%的税,额外的注册费,算下来比北京至少贵个4-5倍?一辆卡罗拉50w人民币是差不多要的,而拥车证只有10年的有效期,这基本上就是说穷人就别开车了吧。公共交通上,两个城市都不错,新加坡因为小,公共交通密度相对更高,也一定程度上补齐了买不了车的短板。按照新加坡政府的规划,应该车的总数就控制在这个量级了,以后可能没有退出就没有新增。而北京就很奇葩了,且不说摇号比彩票的概率还低,存量怎么一下子放到这个程度的,北京政府就没有什么反思么。。车辆控制基本上跟城市摊大饼的规划保持了一致,属于以后的事情以后再说。。</p>
<p><img src="https://harrychen.oss-cn-beijing.aliyuncs.com/2021-03-13-122238.jpg" alt="" /></p>Harry Chensdqxcxh@gmail.com最近在上海,远郊区,看整体交通状况感觉比北京好多了。上海市里估计也是一样的堵,但是北京G6到了回龙观也就还那样,属于比较奇葩的了。 对比一下新加坡的交通,能明显感觉城市规划的一些想法上的不一样,两边似乎都没有可以相互参考的地方,但是可以拿出来比较一下。 新加坡地方小,人口密度大,车相对人口算,其实不低了。100万辆车,大概去年到了105万辆吧,人口大概是470万人,北京大概常驻人口3000万人,车710万辆,应该也是去年的数字,从这个角度看,其实人车比差不多。从面积上看呢,新加坡岛上的面积应该也是500平方公里,比海淀区大点,应该跟朝阳差不多?从这个角度看,应该也有可比性,北京的车相对来说等人口、面积比例下会多一点点,外牌的比例之前控制了一把,所以可以认为差不多。 但是整体交通状况新加坡就比北京好太多了。一个是路网密度更高,大部分祖屋社区都是不封闭的,少量的condo虽然封闭但是也只有很少几栋楼,大部分空间拿出来规划了城市道路。北京之前有段时间也想做开放社区,迫于强大的居民压力放弃了。从这个角度看政策跟人性的博弈是一直存在的,民众的想法永远是堵车就是政府不修路,政府跑我们小区修路那我跟你没完。。。 其次是交通执法的压力上很不一样,新加坡这种执法程度放到北京的话,估计短期内交通会有不少改观,很多问题不都是规划,鸡贼的司机占了很大一部分。违法成本低,罚款罚分都是属于广撒网但是力度小,长期执行下去之后违法和查违法之间就形成了一个稳态,加上也不是每次都被抓,交通违章就成为一个是期望为正的事情。新加坡的执法效率没感觉有多高,但是罚的是挺狠,北京这种时不时看到的遮挡号牌,在新加坡试一下,绝对罚的你此生难忘。 另外这边核心区也是有拥堵费的,只不过北京是通过限行调节的。没办法,我们是社会主义国家嘛。要讲公平,不能什么都向钱看。再就是北京停车位是真的不够,新加坡这边祖屋的停车场就没怎么看到停满的,毕竟车是真的贵。 增量控制上,那新加坡是全世界买车最贵的地方,拥车证最近的价格应该是已在4-5w新币徘徊,加上车本身的价格+100%的税,额外的注册费,算下来比北京至少贵个4-5倍?一辆卡罗拉50w人民币是差不多要的,而拥车证只有10年的有效期,这基本上就是说穷人就别开车了吧。公共交通上,两个城市都不错,新加坡因为小,公共交通密度相对更高,也一定程度上补齐了买不了车的短板。按照新加坡政府的规划,应该车的总数就控制在这个量级了,以后可能没有退出就没有新增。而北京就很奇葩了,且不说摇号比彩票的概率还低,存量怎么一下子放到这个程度的,北京政府就没有什么反思么。。车辆控制基本上跟城市摊大饼的规划保持了一致,属于以后的事情以后再说。。关于马云在外滩的演讲2021-03-07T16:14:00+00:002021-03-07T16:14:00+00:00http://cxh.me/2021/03/07/mayun_speech_about_supervise<p>事情大家都知道,只是之前没注意马云在外滩关于监管的演讲到底讲了什么。原文在这里。</p>
<p>https://finance.sina.com.cn/tech/2020-10-25/doc-iiznezxr8009643.shtml</p>
<p>摘抄一点:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>理论和系统是不一样的,专家和学者是不一样的,专家是干出来的,干得很厉害,但不一定会总结,很多学者是不具体干,但是能形成理论。只有专家和学者结合起来,只有理论和实践结合起来,才能真正去创新解决今天和明天的问题。我们需要来自实践的理论,不是来自办公室理论的实践,P2P是来自办公室理论的实践,它给我们的启发,不是否定互联网,而是不要再重复办公室理论的实践。
我觉得有一个现象,就是我们的一些处长,监管到后来,变成了自己没有风险,自己部门没有风险,但是整个经济有风险,整个经济不发展的风险。未来的比赛是创新的比赛,不仅仅是监管技能的比赛。我的理解,习主席说的执政能力的提升,是指发展了并且监管有序的发展,而不是监管了没发展。
</code></pre></div></div>
<p>水平高不高不知道。。反正有点沈万三那味了。。</p>Harry Chensdqxcxh@gmail.com事情大家都知道,只是之前没注意马云在外滩关于监管的演讲到底讲了什么。原文在这里。 https://finance.sina.com.cn/tech/2020-10-25/doc-iiznezxr8009643.shtml 摘抄一点: 理论和系统是不一样的,专家和学者是不一样的,专家是干出来的,干得很厉害,但不一定会总结,很多学者是不具体干,但是能形成理论。只有专家和学者结合起来,只有理论和实践结合起来,才能真正去创新解决今天和明天的问题。我们需要来自实践的理论,不是来自办公室理论的实践,P2P是来自办公室理论的实践,它给我们的启发,不是否定互联网,而是不要再重复办公室理论的实践。 我觉得有一个现象,就是我们的一些处长,监管到后来,变成了自己没有风险,自己部门没有风险,但是整个经济有风险,整个经济不发展的风险。未来的比赛是创新的比赛,不仅仅是监管技能的比赛。我的理解,习主席说的执政能力的提升,是指发展了并且监管有序的发展,而不是监管了没发展。 水平高不高不知道。。反正有点沈万三那味了。。单例模式讨论2021-03-07T16:09:00+00:002021-03-07T16:09:00+00:00http://cxh.me/2021/03/07/single_instance<p>其实就是记录下。。不算自己写的。</p>
<p>mutex版本:</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="n">std</span><span class="o">::</span><span class="n">shared_ptr</span><span class="o"><</span><span class="n">some_resource</span><span class="o">></span> <span class="n">resource_ptr</span><span class="p">;</span>
<span class="n">std</span><span class="o">::</span><span class="n">mutex</span> <span class="n">resource_mutex</span><span class="p">;</span>
<span class="kt">void</span> <span class="nf">foo</span><span class="p">()</span> <span class="p">{</span>
<span class="n">std</span><span class="o">::</span><span class="n">unique_lock</span><span class="o"><</span><span class="n">std</span><span class="o">::</span><span class="n">mutex</span><span class="o">></span> <span class="n">lk</span><span class="p">(</span><span class="n">resource_mutex</span><span class="p">);</span> <span class="c1">// 所有线程在此序列化 </span>
<span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">resource_ptr</span><span class="p">)</span>
<span class="p">{</span><span class="n">resource_ptr</span><span class="p">.</span><span class="n">reset</span><span class="p">(</span><span class="k">new</span> <span class="n">some_resource</span><span class="p">);</span> <span class="c1">// 只有初始化过程需要保护</span>
<span class="n">lk</span><span class="p">.</span><span class="n">unlock</span><span class="p">();</span>
<span class="n">resource_ptr</span><span class="o">-></span><span class="n">do_something</span><span class="p">();</span>
<span class="p">}</span>
</code></pre></div></div>
<p>double-checking版本:</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="kt">void</span> <span class="nf">undefined_behaviour_with_double_checked_locking</span><span class="p">()</span>
<span class="p">{</span>
<span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">resource_ptr</span><span class="p">)</span> <span class="c1">// 1</span>
<span class="p">{</span>
<span class="n">std</span><span class="o">::</span><span class="n">lock_guard</span><span class="o"><</span><span class="n">std</span><span class="o">::</span><span class="n">mutex</span><span class="o">></span> <span class="n">lk</span><span class="p">(</span><span class="n">resource_mutex</span><span class="p">);</span>
<span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">resource_ptr</span><span class="p">)</span> <span class="c1">// 2</span>
<span class="p">{</span>
<span class="n">resource_ptr</span><span class="p">.</span><span class="n">reset</span><span class="p">(</span><span class="k">new</span> <span class="n">some_resource</span><span class="p">);</span> <span class="c1">// 3</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="n">resource_ptr</span><span class="o">-></span><span class="n">do_something</span><span class="p">();</span> <span class="c1">// 4</span>
<span class="p">}</span>
</code></pre></div></div>
<p>call_once版本</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">std</span><span class="o">::</span><span class="n">shared_ptr</span><span class="o"><</span><span class="n">some_resource</span><span class="o">></span> <span class="n">resource_ptr</span><span class="p">;</span>
<span class="n">std</span><span class="o">::</span><span class="n">once_flag</span> <span class="n">resource_flag</span><span class="p">;</span> <span class="c1">// 1</span>
<span class="kt">void</span> <span class="nf">init_resource</span><span class="p">()</span>
<span class="p">{</span>
<span class="n">resource_ptr</span><span class="p">.</span><span class="n">reset</span><span class="p">(</span><span class="k">new</span> <span class="n">some_resource</span><span class="p">);</span>
<span class="p">}</span>
<span class="kt">void</span> <span class="nf">foo</span><span class="p">()</span> <span class="p">{</span>
<span class="n">std</span><span class="o">::</span><span class="n">call_once</span><span class="p">(</span><span class="n">resource_flag</span><span class="p">,</span><span class="n">init_resource</span><span class="p">);</span> <span class="c1">// 可以完整的进行一次初始化</span>
<span class="n">resource_ptr</span><span class="o">-></span><span class="n">do_something</span><span class="p">();</span>
<span class="p">}</span>
</code></pre></div></div>
<p>static instance版本。</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">my_class</span><span class="p">;</span>
<span class="n">my_class</span><span class="o">&</span> <span class="n">get_my_class_instance</span><span class="p">()</span>
<span class="p">{</span>
<span class="k">static</span> <span class="n">my_class</span> <span class="n">instance</span><span class="p">;</span> <span class="c1">// 线程安全的初始化过程</span>
<span class="k">return</span> <span class="n">instance</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>Harry Chensdqxcxh@gmail.com其实就是记录下。。不算自己写的。 mutex版本: std::shared_ptr<some_resource> resource_ptr; std::mutex resource_mutex; void foo() { std::unique_lock<std::mutex> lk(resource_mutex); // 所有线程在此序列化 if(!resource_ptr) {resource_ptr.reset(new some_resource); // 只有初始化过程需要保护 lk.unlock(); resource_ptr->do_something(); } double-checking版本: void undefined_behaviour_with_double_checked_locking() { if(!resource_ptr) // 1 { std::lock_guard<std::mutex> lk(resource_mutex); if(!resource_ptr) // 2 { resource_ptr.reset(new some_resource); // 3 } } resource_ptr->do_something(); // 4 } call_once版本 std::shared_ptr<some_resource> resource_ptr; std::once_flag resource_flag; // 1 void init_resource() { resource_ptr.reset(new some_resource); } void foo() { std::call_once(resource_flag,init_resource); // 可以完整的进行一次初始化 resource_ptr->do_something(); } static instance版本。 class my_class; my_class& get_my_class_instance() { static my_class instance; // 线程安全的初始化过程 return instance; }一个简单的httpserver库squeasel2021-03-07T15:22:00+00:002021-03-07T15:22:00+00:00http://cxh.me/2021/03/07/cpp_http_server_lib_squeasel<p>cloudera开源的一个lib:https://github.com/cloudera/squeasel</p>
<p>许可是:</p>
<p>This is a fork of Mongoose, branched at the last commit of Mongoose that was released as MIT license. Newer versions of Mongoose are now licensed as GPLv2, so we cannot use them in our projects.</p>
<p>所以用旧版本还是可以的。</p>
<p>之所以注意到是因为在yugabyte-db里面偶然看到。关注下的意义主要是c++毕竟没有go那么方便的pprof,用来做个统计信息debug还是比较方便的。</p>
<p>核心就是一个文件,如果不需要用lua写handler的话,直接编译到lib或者加到source里就行。需要的lib主要是ssl\crypto</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gcc <span class="nt">-o</span> squeasel.c <span class="nt">-lpthread</span> <span class="nt">-lm</span> <span class="nt">-lssl</span> <span class="nt">-lcrypto</span>
ar rcs libsqueasl.a squeasel.o
</code></pre></div></div>
<p>改一个example:</p>
<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="cp">#include <stdio.h>
#include <string.h>
#include "squeasel.h"
</span>
<span class="c1">// This function will be called by squeasel on every new request.</span>
<span class="k">static</span> <span class="n">sq_callback_result_t</span> <span class="nf">begin_request_handler</span><span class="p">(</span><span class="k">struct</span> <span class="n">sq_connection</span> <span class="o">*</span><span class="n">conn</span><span class="p">)</span> <span class="p">{</span>
<span class="k">const</span> <span class="k">struct</span> <span class="n">sq_request_info</span> <span class="o">*</span><span class="n">request_info</span> <span class="o">=</span> <span class="n">sq_get_request_info</span><span class="p">(</span><span class="n">conn</span><span class="p">);</span>
<span class="kt">char</span> <span class="n">content</span><span class="p">[</span><span class="mi">100</span><span class="p">];</span>
<span class="c1">// Prepare the message we're going to send</span>
<span class="kt">int</span> <span class="n">content_length</span> <span class="o">=</span> <span class="n">snprintf</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">content</span><span class="p">),</span>
<span class="s">"Hello from squeasel! Remote port: %d"</span><span class="p">,</span>
<span class="n">request_info</span><span class="o">-></span><span class="n">remote_port</span><span class="p">);</span>
<span class="c1">// Send HTTP reply to the client</span>
<span class="n">sq_printf</span><span class="p">(</span><span class="n">conn</span><span class="p">,</span>
<span class="s">"HTTP/1.1 200 OK</span><span class="se">\r\n</span><span class="s">"</span>
<span class="s">"Content-Type: text/plain</span><span class="se">\r\n</span><span class="s">"</span>
<span class="s">"Content-Length: %d</span><span class="se">\r\n</span><span class="s">"</span> <span class="c1">// Always set Content-Length</span>
<span class="s">"</span><span class="se">\r\n</span><span class="s">"</span>
<span class="s">"%s"</span><span class="p">,</span>
<span class="n">content_length</span><span class="p">,</span> <span class="n">content</span><span class="p">);</span>
<span class="c1">// Returning non-zero tells squeasel that our function has replied to</span>
<span class="c1">// the client, and squeasel should not send client any more data.</span>
<span class="k">return</span> <span class="p">(</span><span class="n">sq_callback_result_t</span><span class="p">)</span><span class="mi">1</span><span class="p">;</span>
<span class="p">}</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
<span class="k">struct</span> <span class="n">sq_context</span> <span class="o">*</span><span class="n">ctx</span><span class="p">;</span>
<span class="k">struct</span> <span class="n">sq_callbacks</span> <span class="n">callbacks</span><span class="p">;</span>
<span class="c1">// List of options. Last element must be NULL.</span>
<span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">options</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="s">"listening_ports"</span><span class="p">,</span> <span class="s">"8080"</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">};</span>
<span class="c1">// Prepare callbacks structure. We have only one callback, the rest are NULL.</span>
<span class="n">memset</span><span class="p">(</span><span class="o">&</span><span class="n">callbacks</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">callbacks</span><span class="p">));</span>
<span class="n">callbacks</span><span class="p">.</span><span class="n">begin_request</span> <span class="o">=</span> <span class="n">begin_request_handler</span><span class="p">;</span>
<span class="c1">// Start the web server.</span>
<span class="n">ctx</span> <span class="o">=</span> <span class="n">sq_start</span><span class="p">(</span><span class="o">&</span><span class="n">callbacks</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">options</span><span class="p">);</span>
<span class="c1">// Wait until user hits "enter". Server is running in separate thread.</span>
<span class="c1">// Navigating to http://localhost:8080 will invoke begin_request_handler().</span>
<span class="n">getchar</span><span class="p">();</span>
<span class="c1">// Stop the server.</span>
<span class="n">sq_stop</span><span class="p">(</span><span class="n">ctx</span><span class="p">);</span>
<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>
<p>编译执行:</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gcc t.cpp <span class="nt">-lsqueasl</span> <span class="nt">-L</span><span class="nb">.</span> <span class="nt">-lssl</span> <span class="nt">-lcrypto</span> <span class="nt">-lpthread</span>
curl localhost:8080
Hello from squeasel! Remote port: 30586%
</code></pre></div></div>Harry Chensdqxcxh@gmail.comcloudera开源的一个lib:https://github.com/cloudera/squeasel 许可是: This is a fork of Mongoose, branched at the last commit of Mongoose that was released as MIT license. Newer versions of Mongoose are now licensed as GPLv2, so we cannot use them in our projects. 所以用旧版本还是可以的。 之所以注意到是因为在yugabyte-db里面偶然看到。关注下的意义主要是c++毕竟没有go那么方便的pprof,用来做个统计信息debug还是比较方便的。 核心就是一个文件,如果不需要用lua写handler的话,直接编译到lib或者加到source里就行。需要的lib主要是ssl\crypto gcc -o squeasel.c -lpthread -lm -lssl -lcrypto ar rcs libsqueasl.a squeasel.o 改一个example: #include <stdio.h> #include <string.h> #include "squeasel.h" // This function will be called by squeasel on every new request. static sq_callback_result_t begin_request_handler(struct sq_connection *conn) { const struct sq_request_info *request_info = sq_get_request_info(conn); char content[100]; // Prepare the message we're going to send int content_length = snprintf(content, sizeof(content), "Hello from squeasel! Remote port: %d", request_info->remote_port); // Send HTTP reply to the client sq_printf(conn, "HTTP/1.1 200 OK\r\n" "Content-Type: text/plain\r\n" "Content-Length: %d\r\n" // Always set Content-Length "\r\n" "%s", content_length, content); // Returning non-zero tells squeasel that our function has replied to // the client, and squeasel should not send client any more data. return (sq_callback_result_t)1; } int main(void) { struct sq_context *ctx; struct sq_callbacks callbacks; // List of options. Last element must be NULL. const char *options[] = {"listening_ports", "8080", NULL}; // Prepare callbacks structure. We have only one callback, the rest are NULL. memset(&callbacks, 0, sizeof(callbacks)); callbacks.begin_request = begin_request_handler; // Start the web server. ctx = sq_start(&callbacks, NULL, options); // Wait until user hits "enter". Server is running in separate thread. // Navigating to http://localhost:8080 will invoke begin_request_handler(). getchar(); // Stop the server. sq_stop(ctx); return 0; } 编译执行: gcc t.cpp -lsqueasl -L. -lssl -lcrypto -lpthread curl localhost:8080 Hello from squeasel! Remote port: 30586%vim-floaterm配置2021-03-07T15:02:00+00:002021-03-07T15:02:00+00:00http://cxh.me/2021/03/07/vim_floaterm<p>这个插件主要是提供vim内部调用shell环境的,安装是比较容易,但是发现会有很多不兼容的地方。</p>
<p>https://github.com/voldikss/vim-floaterm</p>
<p>安装可以用vundle、bundle或者手动等。我这边一直是bundle</p>
<p>git submodule add https://github.com/voldikss/vim-floaterm</p>
<p>首先这个插件默认配置直接跟tabnine冲突,大概是window的问题,仔细看了下代码,注释掉tabnine里面的vimsupport的window切换部分可以,但是看着不优雅啊。</p>
<p><img src="https://cxhblog.s3.amazonaws.com/2021-03-07-070937.png" alt="" /></p>
<p>后来发现其实可以控制floaterm不使用默认的float方式,也就是改split或者vsplit,顺便重定义快捷键。</p>
<div class="language-vimscript highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="k">let</span> <span class="nv">g:floaterm_wintype</span> <span class="p">=</span> <span class="s2">"vsplit"</span>
<span class="k">let</span> <span class="nv">g:floaterm_keymap_toggle</span> <span class="p">=</span> <span class="s1">'<leader>s'</span>
<span class="k">let</span> <span class="nv">g:floaterm_keymap_new</span> <span class="p">=</span> <span class="s1">'<leader>sn'</span>
<span class="k">let</span> <span class="nv">g:floaterm_keymap_prev</span> <span class="p">=</span> <span class="s1">'<leader>sl'</span>
<span class="k">let</span> <span class="nv">g:floaterm_keymap_next</span> <span class="p">=</span> <span class="s1">'<leader>sh'</span>
</code></pre></div></div>
<p>但是发现vim8.0的版本下,这个快捷键定义直接会报错,查了一下function load,发现FloatermNew什么的在这个版本直接不支持。看来只能手动编译8.2了。</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code> ./configure <span class="nt">--prefix</span><span class="o">=</span><span class="nv">$HOME</span> <span class="se">\</span>
<span class="nt">--enable-multibyte</span> <span class="se">\</span>
<span class="nt">--enable-pythoninterp</span> <span class="se">\</span>
<span class="nt">--enable-python3interp</span> <span class="se">\</span>
<span class="nt">--enable-cscope</span> <span class="se">\</span>
<span class="nt">--enable-fontset</span> <span class="se">\</span>
<span class="nt">--enable-largefile</span> <span class="se">\</span>
<span class="nt">--enable-luainterp</span> <span class="se">\</span>
<span class="nt">--enable-tclinterp</span> <span class="se">\</span>
<span class="nt">--enable-perlinterp</span> <span class="se">\</span>
<span class="nt">--with-python3-command</span><span class="o">=</span>python3.5 <span class="se">\</span>
<span class="nt">--with-python-config-dir</span><span class="o">=</span>/usr/lib/python2.7/config-x86_64-linux-gnu <span class="se">\</span>
<span class="nt">--with-python3-config-dir</span><span class="o">=</span>/usr/lib/python3.5/config-3.5m-x86_64-linux-gnu <span class="se">\</span>
<span class="nt">--with-lua-prefix</span><span class="o">=</span>/usr/local/bin/lua
</code></pre></div></div>
<p>上面编译完之后会发现vim的python和python3 support要么都没识别,要么都识别之后,进去就崩溃。看了下vim论坛的反馈,好像python和python3同时支持会有冲突。改成只用python的话,很多插件又有问题,改成只用python3好了。</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code> ./configure <span class="nt">--prefix</span><span class="o">=</span><span class="nv">$HOME</span> <span class="se">\</span>
<span class="nt">--enable-multibyte</span> <span class="se">\</span>
<span class="nt">--enable-python3interp</span> <span class="se">\</span>
<span class="nt">--enable-cscope</span> <span class="se">\</span>
<span class="nt">--enable-fontset</span> <span class="se">\</span>
<span class="nt">--enable-largefile</span> <span class="se">\</span>
<span class="nt">--enable-luainterp</span> <span class="se">\</span>
<span class="nt">--enable-tclinterp</span> <span class="se">\</span>
<span class="nt">--enable-perlinterp</span> <span class="se">\</span>
<span class="nt">--enable-rubyinterp</span> <span class="se">\</span>
<span class="nt">--with-python3-command</span><span class="o">=</span>python3.4 <span class="se">\</span>
<span class="nt">--with-python3-config-dir</span><span class="o">=</span>/usr/lib/python3.4/config-3.4m-x86_64-linux-gnu
</code></pre></div></div>
<p>另外有的机器上是python3.4-dev有的是python3.5。编译完之后至少正常使用不会报错了,但是发现vimsupport切换window的时候有新问题,表现为q:的时候会直接报错。</p>
<p><img src="https://cxhblog.s3.amazonaws.com/2021-03-07-141000.png" alt="" /></p>
<p>开始我考虑直接改tabnine或者youcompleteme算了。。翻了下代码,windows switch的逻辑只有在youcompleteme的g:ycm_enable_diagnostic_highlighting打开的时候才会调用,看了下一些issue,这个特性打开也会带来性能的下降,而只有在编译错误提示的时候会用到,而我的vim的编译插件是我自己写的,所以算了。关掉。</p>
<div class="language-vimscript highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="k">let</span> <span class="nv">g:ycm_enable_diagnostic_signs</span> <span class="p">=</span> <span class="m">0</span>
<span class="k">let</span> <span class="nv">g:ycm_enable_diagnostic_highlighting</span> <span class="p">=</span> <span class="m">0</span>
<span class="k">let</span> <span class="nv">g:ycm_min_num_of_chars_for_completion</span> <span class="p">=</span> <span class="m">1</span>
</code></pre></div></div>
<p>世界终于清净了。效果类似于</p>
<p><img src="https://harrychen.oss-cn-beijing.aliyuncs.com/2021-03-07-071627.png" alt="" /></p>
<p>然鹅折腾这些也花了一个晚上。。</p>Harry Chensdqxcxh@gmail.com这个插件主要是提供vim内部调用shell环境的,安装是比较容易,但是发现会有很多不兼容的地方。 https://github.com/voldikss/vim-floaterm 安装可以用vundle、bundle或者手动等。我这边一直是bundle git submodule add https://github.com/voldikss/vim-floaterm 首先这个插件默认配置直接跟tabnine冲突,大概是window的问题,仔细看了下代码,注释掉tabnine里面的vimsupport的window切换部分可以,但是看着不优雅啊。 后来发现其实可以控制floaterm不使用默认的float方式,也就是改split或者vsplit,顺便重定义快捷键。 let g:floaterm_wintype = "vsplit" let g:floaterm_keymap_toggle = '<leader>s' let g:floaterm_keymap_new = '<leader>sn' let g:floaterm_keymap_prev = '<leader>sl' let g:floaterm_keymap_next = '<leader>sh' 但是发现vim8.0的版本下,这个快捷键定义直接会报错,查了一下function load,发现FloatermNew什么的在这个版本直接不支持。看来只能手动编译8.2了。 ./configure --prefix=$HOME \ --enable-multibyte \ --enable-pythoninterp \ --enable-python3interp \ --enable-cscope \ --enable-fontset \ --enable-largefile \ --enable-luainterp \ --enable-tclinterp \ --enable-perlinterp \ --with-python3-command=python3.5 \ --with-python-config-dir=/usr/lib/python2.7/config-x86_64-linux-gnu \ --with-python3-config-dir=/usr/lib/python3.5/config-3.5m-x86_64-linux-gnu \ --with-lua-prefix=/usr/local/bin/lua 上面编译完之后会发现vim的python和python3 support要么都没识别,要么都识别之后,进去就崩溃。看了下vim论坛的反馈,好像python和python3同时支持会有冲突。改成只用python的话,很多插件又有问题,改成只用python3好了。 ./configure --prefix=$HOME \ --enable-multibyte \ --enable-python3interp \ --enable-cscope \ --enable-fontset \ --enable-largefile \ --enable-luainterp \ --enable-tclinterp \ --enable-perlinterp \ --enable-rubyinterp \ --with-python3-command=python3.4 \ --with-python3-config-dir=/usr/lib/python3.4/config-3.4m-x86_64-linux-gnu 另外有的机器上是python3.4-dev有的是python3.5。编译完之后至少正常使用不会报错了,但是发现vimsupport切换window的时候有新问题,表现为q:的时候会直接报错。 开始我考虑直接改tabnine或者youcompleteme算了。。翻了下代码,windows switch的逻辑只有在youcompleteme的g:ycm_enable_diagnostic_highlighting打开的时候才会调用,看了下一些issue,这个特性打开也会带来性能的下降,而只有在编译错误提示的时候会用到,而我的vim的编译插件是我自己写的,所以算了。关掉。 let g:ycm_enable_diagnostic_signs = 0 let g:ycm_enable_diagnostic_highlighting = 0 let g:ycm_min_num_of_chars_for_completion = 1 世界终于清净了。效果类似于 然鹅折腾这些也花了一个晚上。。