编程还是下棋


养不教,父之过。

可是,教什么?如何教呢?

机缘巧合,先是教儿子下国际象棋,后来一起学编程。开始的时候,儿子都很感兴趣。学国际象棋是从看视频开始的,有时候发现一段视频都已经反反复复看了好几遍,估计是真有兴趣,就从图书馆借来一本chess for kids,40几页,晚上一起读一起学,大概每天半个小时。看完之后又买了一本chess for children,100页,还有一些题目,儿子也做得很开心。书的最后是一盘完整的棋局,我俩一起复盘。儿子特意选了赢的一方,哪知走到最后发现居然是我选的一方赢了,有点不开心。隔天一起下了一盘,儿子又输,这下发脾气了,还掉了眼泪。于是连忙进行一番挫折教育,儿子大概明白点道理,可还是接受不了,以至于非常期待的how to beat your dad at chess送到之后,根本就不想看,把我气得够呛,嚷嚷着要退掉。

儿子很喜欢看Minecraft视频,有时也玩Minecraft Pocket Edition,只是一个人,时间长了容易无聊,多数时间还是看视频。碰巧图书馆里看到一本Adventures in Minecraft,教Python编程来增强Minecraft游戏体验。想着一来能减少看视频时间,还能练习打字,就买了一个Raspberry Pi 2,开始学习编程。说是学习编程,其实并不严肃,就是把代码抄在编辑器里,运行一下看看效果,语法什么的一带而过,更不指望理解坐标系了。慢慢地,儿子摸出一点门道,问:

“Python shell是干什么的?是不是查看错误信息的?”

“为什么上次减一是脚下,这次是旁边?”

“因为上次是y-1,这次是x-1啊?”我嘴上回答,心里已经乐开了花。尽管不确定儿子是否理解我的解释,但是能问出这样的问题,已经是意外之喜了。

偶尔提起学下棋的事,儿子仍然不情愿,我也不知道该怎么办,反正还有编程,下棋暂时放一放吧。下棋,就要对弈,就有输赢。直面失败,不断提升,是很重要的品质。这也是我的初衷,技能不重要,拥有顽强的性格,是一生的财富。编程,绝少有正面的交锋,却不乏困难的问题。克服困难,也需要顽强的性格。

只要能培养出顽强的性格,下棋还是编程,不是问题。我这样安慰自己……

代码补全

 

最近看emacs-devel里面关于IDE的讨论,有人提到semantic和irony-mode,分别尝试了一下,配置起来都很复杂,其中semantic无法补全LLVM里面的SmallVector,发信到邮件列表求帮助,暂时没有反馈。于是又试了irony-mode,折腾了好几天,才从log里面发现libclang couldn’t parse这样的错误信息,试了一下,原来是我们的项目用gcc编译没问题,用clang编译报错。改正之后就能正常工作了,补全信息非常准确,唯一的不足就是慢,尤其是第一次补全,要等十几秒,可能是LLVM的文件都比较大吧。

上图的效果是配合company-mode使用(单独使用irony-mode的话,使用C-M-i补全),需要分别下载company-mode, irony-mode, 和company-irony。我的配置如下:

(require 'company)
(add-hook 'c++-mode-hook 'company-mode)
(add-hook 'c-mode-hook 'company-mode)

;;; irony-mode

(add-to-list 'load-path "~/elisp/3rd-party-lib/irony-mode/")
(require 'irony)
(require 'irony-cdb)
(add-hook 'c++-mode-hook 'irony-mode)
(add-hook 'c-mode-hook 'irony-mode)

(add-to-list 'load-path "~/elisp/3rd-party-lib/company-irony/")
(require 'company-irony)
(eval-after-load 'company
  '(progn
     (setq company-idle-delay 3)
     (add-to-list 'company-backends 'company-irony)))

;; replace the `completion-at-point' and `complete-symbol' bindings in
;; irony-mode's buffers by irony-mode's function
(defun my-irony-mode-hook ()
  (define-key irony-mode-map [remap completion-at-point]
    'irony-completion-at-point-async)
  (define-key irony-mode-map [remap complete-symbol]
    'irony-completion-at-point-async))
(add-hook 'irony-mode-hook 'my-irony-mode-hook)
(add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options)

(require 'irony-cdb-json)
(irony-cdb-json-add-compile-commands-path
 "~/src/llvm/trunk"
 "~/src/llvm/trunk/build/compile_commands.json")

需要最后一句手工配置LLVM项目是因为irony找不到compile_commands.json文件。产生这个文件的方法是添加一个cmake宏:-DCMAKE_EXPORT_COMPILE_COMMANDS=ON