Mac上配置YouCompleteMe

之前主要的语言都是Java,PHP,Go等,很少会用到C/C++,但是自从发现自己算法偏弱之后,就准备搞搞算法了。正好碰巧在编程之美上杀进复赛了,但是用的是Java,这个如果搞比赛的话,Java始终不是长久之计。之前写代码的时候就深深的感到没有指针的坑。所以开始尝试用C++,来进行代码的编写,于是开始捣鼓我自己的VIM了。我之前只是用它来写除Java以外的所有东西。所以刚上手写C++,有点不适应。最大的困难就是STL类库掌握不好,所以一个比较合适的不全对于我这种菜鸟来说是需要的。于是开始了捣鼓YouCompleteMe和Syntastic插件。 后者很方便,一会就好了,但是有个坑,因为YouComplete和Syntastic插件共存的时候,对于Clang Family语言,YouCompleteMe是Disable掉Syntastic语法检查的,但是YouCompleteMe集成了语法检查,所以很容易让人以为出现语法错误是因为Syntastic。这个直接运行SyntasticInfo就可以看到了: :SyntasticInfo Syntastic version: 3.6.0-77 (Vim 704, Darwin) Info for filetype: cpp Global mode: active Filetype cpp is active The current file will be checked automatically Available checker: gcc Currently enabled checkers: – Checkers for filetype cpp possibly disabled by YouCompleteMe 最后一句看到了吗? 编译问题就不说了。解决起来很方便。然后一个坑就是我写C的时候一切顺利,但是当我写C++的时候,各种坑。。。。什么iostream找不到,说好的stl不全不见了。。。一度让我以为他就是个坑。。。其次要喷一下网上那些不负责任,随意Copy Paste的混蛋,都没有理解就开始粘贴复制答案,让我走了很多坑。 最靠谱的永远是作者。首先去Github项目地址上看有没有相关的issue,果然有人遇到了。但是提出的解决办法对我来说没用。比如说Issue303,这边提示了一下,主要就是.ycm_extra_conf.py,的flag的配置,这边网上大部分都是坑,这个需要因人而异,而且有个很好的检验办法,就是将自己编辑的flag作为编译参数看看是不是可用。比如我的配置参数: flags = [ ‘-Wall’, ‘-Wextra’, ‘-Wno-long-long’, ‘-Wno-variadic-macros’, ‘-fexceptions’,…

2015编程之美资格赛记录

Problem 1: 2月29日 描述 给定两个日期,计算这两个日期之间有多少个2月29日(包括起始日期)。 只有闰年有2月29日,满足以下一个条件的年份为闰年: 年份能被4整除但不能被100整除 年份能被400整除 输入 第一行为一个整数T,表示数据组数。 之后每组数据包含两行。每一行格式为”month day, year”,表示一个日期。month为 { “January”, “February”, “March”, “April”, “May”, “June”, “July”, “August”, “September”,”October”, “November” , “December”} 中的一个字符串。day与year为两个数字。 数据保证给定的日期合法且第一个日期早于或等于第二个日期。 输出 对于每组数据输出一行,形如”Case #X: Y”。X为数据组数,从1开始,Y为答案。 package mike.code.oj.micro.y2015.qual; import java.util.HashMap; import java.util.Scanner; /** * @author Mike * @project oj-code * @date 4/17/15, 10:24 AM * @e-mail mike@mikecoder.cn */ public…

PHP 缓冲区相关

故事的开始是这样的,因为需要在旧有系统上添加一个小功能,就是显示出数据库中存储的图片。不过也不想吐槽这数据库的设计,居然将图片存储在数据库里。但是毕竟是任务就开始了,首先查一下数据库的格式,如下图: 常见的Blob格式,所以我就以为代码会很简单,如下的代码就可以了: <?php include(‘db-util.php’); $id = $_GET[‘id’]; $db = db_connect(); $img = db_getImgById($db, $id); header(‘Content-type: image/jpeg’); echo $img; 但是,却出现无法识别图片的情况。觉得很奇怪,于是就把网络的请求结果和实际图片做了一个对比,结果如下: 可以很明显的看到前面多了两个字节的’ ‘字符。第一反应是缓冲区的数据,以及HTML协议中的’ ‘造成的。所以看一下缓冲区数据: $var = ob_get_contents(); var_dump($var); 果不其然发现了一个坑: string(2) ” “。然后就尝试清空一下缓冲区,就是ob_clean()方法。然后就可以了。 当然,这个并不是唯一的解决办法,在php.ini中有关于缓冲区的配置,将output_buffering = 4096改为output_buffering = Off,然后重启PHP即可。为什么会出现这个缓冲区,按照配置文件中的说法,是为了提高服务器的性能,而且默认的4096也是一个推荐配置,故意设置成为一个内存页的大小。所以,当系统默认使用大页的时候,这边就要跟着进行修改了。 同时,使用buffer还可以实现很多好玩的效果,比如模板等。同时附上一段好玩的代码: <?php header(‘Content-type: multipart/x-mixed-replace;boundary=endofsection’); print “\n–endofsection\n”; $pmt = array(“-“, “\\”, “|”, “/” ); for($i = 0; $i < 10; $i++)…