🌓

为八戒鸣不平——西行路上行李是谁挑的?

《西游记》中行李是谁挑的呢?有人说是沙僧挑的,因为86版的电视剧西游记里是沙僧挑担,但我想告诉你,那是电视剧的演绎,小说里面挑行李的是猪八戒。

关于猪八戒挑行李最直接的证据是佛祖对取经成员的评价:

猪悟能,汝本天河水神,天蓬元帅,为汝蟠桃会上酗酒戏了仙娥,贬汝下界投胎,身如畜类,幸汝记爱人身,在福陵山云栈洞造孽,喜归大教,入吾沙门, 保圣僧在路,却又有顽心,色情未泯,因汝挑担有功,加升汝职正果,做净坛使者。

《西游记》第一百回 径回东土 五圣成真

其实八戒从进入取经团队的那天起就挑担了:

阅读全文

关于《西游记》里沙僧的新看法

楔子

电视里预报,今天晚上的《老梁故事汇》会讲沙僧,但我没有看成,网上百度一下,其实这期节目是以前的了(链接见下面参考资料),今天只是重播。看了一下,结合自己的以前的认识,写点东西总结一下。有些是以前知道的,有些是新学的,按照我的叙述习惯写出来,留点蒂儿。

关于沙和尚的误解

我先说几个有关沙和尚的误解,基本是老梁在节目里面讲过的。

阅读全文

Markdown和Org-mode的比较

这篇文章被我链接到Emacs China的一个帖子里,收到一些反馈。应该强调的是,这篇文章表达的是我个人对于两种标记语言的态度,于我而言,Markdown可以满足我的需求,而Org-mode在使用中有不便,于是我选择了Markdown。

背景

Org-modeMarkdown是两种轻量级的标记语言格式(lightweight markup language),前者在Emacs世界很受欢迎,而且非常强大,不仅是一种标记语言格式,也可以用来时间管理(Getting Things Done),后者在整个黑客圈都很出名,用的最多的可能就是GitHub了。

我最开始学的是Org-mode,也用它来写Blog(通过org2blog),但最近我慢慢转向了Markdown,一个原因是Hexo用的是Markdown,当然还有其他的一些原因,趁假期思考了一下,总结总结,希望能给别人提供一些帮助。

下面我分别列一下两者的优缺点然后再比较。

Org-mode

优点

  • 依托Emacs,写作与编辑非常方便。
  • 功能强大,可以在纯文本环境下做许多事,而且容易扩展。
  • 语法全面,包括了引用和表格等高级的用法。
  • 我非常喜欢的一点,具备了一些LaTeX的语法(上标和下标)。

阅读全文

Windows下使用Hexo的一个坑

楔子

Hexo很好很强大 我很喜欢 但用的时候也遇到一些问题 今天这个是我觉得比较恶心的

背景

我一直在Windows下用Emacs写Hexo 上传到运行Debian的服务器(VPS)上

而Windows嘛 一个特性是文件系统大小写不敏感 *nix系列的系统大小写是分的很清楚的

我在新建(hexo new)的时候输入的标题是Different Coding for Chinese 这样新建出来的文件名是Different-Coding-for-Chinese.md generate deploy 都没问题 但我偶然发现这和其他的命名规则不一样 于是 我直接把文件名改成了只有首字母大写的形式 麻烦来了 本地测试的时候一点问题都没有 但跑到服务器上就无法正常打开 我怀有是Nginx的配置文件有问题 因为昨晚为了这个东东折腾了半个晚上 于是又尝试在配置文件上找毛病 可找来找去 就这几行 能有啥毛病

不知道是脑子想什么了 我突然想到 会不会是大小写的问题呢 于是 我hexo clean后又生成 上传 毛病就没有了 因为这时候删除重新生成纠正了目录大小写不一致的问题

阅读全文

不同编码(GB2312, UTF-8, UTF-16)下中文内容的占用大小的区别

楔子

有一次 一个人问 有什么编码能使用一个字节存储中文 当然 结果是否定的 中文没法做到一个字节存储

可是 如果是压缩呢 于是有此测试

结果

直接放结果 数据单位是字节

文章 (中文/全部字数)/编码 GB2312 UTF-16注1 UTF-8注2 GZIPed UTF-16 GZIPed UTF-8
Wiki的【量子力学】词条的源码 (13135/32873) 43,782注3 66,436 59,111 27,491 27,282
《共产党宣言》 (30352/35993) 62,594 64,634 92,670 32,554 38,593

注1 UTF-16-LE-DOS 这也就是Windows记事本的Unicode保存出来的编码
注2 UTF-8-UNIX
注3 此编码缺一些繁体字,用相应的简化字代替。

阅读全文

生成指定格式的数字序列

问题描述

写论文的时候需要插入引用文献 如果手写的话 如何快速生成类似下面样子是序列?

1
2
3
[1] 
[2]
[3]

Emacs Lisp

1
(loop for i from 1 to 10 do (insert (format "[%d] \n" i)))

一行解决问题 这是我以前经常用的

阅读全文

谁还是火狐(Firefox)用户 一个知乎用户的搞笑回答

出处

我就明确的告诉你。

你们啊,我感觉你们这些Chrome的用户还要学习,你们非常熟悉西方的那几个浏览器。

你们毕竟图样,你明白我的意思吗?

阅读全文

多语言(Batch, BASH, Octave, Emacs Lisp, ..)批量处理文件

楔子

有人提了一个问题 如何用C语言编程实现批量处理一个目录里面的所有文件 想起我自己也做过类似的事 就把自己的解决方案分享出来 写完觉得不过瘾 总结一下我的实现方案

以下的方案牵扯可执行文件的时候 都假设这个文件名字是a 读取一个参数进行处理 后面有些只是实现了列举 简单总结一下而已

Batch

1
for /f "delims=" %%i in ('"dir /b *.txt"') do a.exe %%i

我很不喜欢Batch 觉得语法好恶心 但百度一下还是能写出来 要点是 dir/b参数实现只输出文件名 完美解决

阅读全文

两个Emacs函数用于新建和发布Hexo网站

先发出来 慢慢完善

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
(defun hexo-deploy (dir)
"Deploy hexo site.
If called with a prefix argument, the user is asked for directory of
the site. Otherwise, the directory is guessed from
`default-directory'."
(interactive (list (if current-prefix-arg
(file-name-as-directory
(read-directory-name "Hexo site directory: "
default-directory))
default-directory)))
(let ((old-dir default-directory))
(if (file-exists-p (concat dir "db.json"))
(progn
(setq default-directory dir)
(start-process "hexo-deploy" "*Hexo Deploy Output*" "hexo" "d" "-g")
(setq default-directory old-dir))
(progn
(if (file-exists-p (expand-file-name
(concat old-dir "../../db.json")))
(progn
(setq default-directory (expand-file-name
(concat old-dir "../../")))
(start-process "hexo-deploy"
"*Hexo Deploy Output*" "hexo" "d" "-g")
(setq default-directory old-dir))
(error "Hexo deploy failed. Wrong directory?"))))))

(defun hexo-wait-and-visit (proc max)
"Use timer to wait hexo process finish then visit the created file."
(if (eq (process-status proc) 'exit)
;; Exit normally.
(let ((hexo-buffer (process-buffer proc)))
(set-buffer hexo-buffer)
(goto-char (point-min))
(if (search-forward "File created at " nil t 1)
(progn
(find-file (buffer-substring-no-properties (point) (line-end-position)))
(kill-buffer hexo-buffer))))
(when (< max 5)
(run-with-timer 1 nil `(lambda () (funcall 'hexo-wait-and-visit ,proc ,(1+ max)))))))

(defun hexo-new (dir type title)
"Create an hexo draft/page/photo/post/.
If called with a prefix argument, the user is asked for type of the
created item. By default, `tpye' is post."
(interactive
(list (file-name-as-directory
(read-directory-name "Hexo site directory: "
default-directory))
(if current-prefix-arg
(read-string "Type to create: " "post" nil "post")
"post")
(read-string "title: ")))
(let ((old-dir default-directory))
(if (and (file-exists-p (concat dir "db.json"))
title)
(progn
(setq default-directory dir)
(hexo-wait-and-visit (start-process "hexo-new" "*Hexo New Output*" "hexo" "n" type title) 0)
(setq default-directory old-dir)
)
(error "Input directory is wrong."))))

阅读全文

理解Emacs lisp里的(interactive)

以前对(interactive)理解不深,只知道给函数加这个表示它可以被交互调用,但今天为了实现在Emacs里操作Hexo,借鉴了一下Magit的代码,发现原来里面的道道真不少,简单写写。

1
2
3
4
5
6
7
8
(defun get-dir (dir)
"This function can be called non-interactively and interactively."
(interactive (list (if current-prefix-arg
(file-name-as-directory
(read-directory-name "A directory: "
default-directory))
default-directory)))
(print dir))

上面的定义的函数有三种调用方式:

  • 在Lisp程序里调用,比如(get-dir "/tmp")
  • 交互式调用,比如M-x get-dir
  • 带参数交互式调用,比如C-u M-x get-dir

这种方式灵活性更大,而且还可以用下面的方法判断多个前缀。

阅读全文