hexo记录

加上阅读更多的链接

1
2
# 针对phase主题
vim layout/_partial/article.ejs

找到对应的地方,加上相应的代码,如下:

1
2
3
4
5
6
<% if (item.excerpt && index){ %>
<%- item.excerpt %>
<a href="<%- item.permalink %>" target="_blank" class="post-read-more">READ MORE</a>
<% } else { %>
<%- item.content %>
<% } %>

其中的超链接部分就是新增的。然后就是修改样式。。。

f.browser.msie没有定义

1
2
3
4
5
6
7
8
9
# @see: http://stackoverflow.com/questions/14344289/fancybox-doesnt-work-with-jquery-v1-9-0-f-browser-is-undefined-cannot-read/14344290
# vim themes/phase/layout/_partial/head.ejs
<script src="http://code.jquery.com/jquery-latest.js"></script>
# replace by:
<script src="http://code.jquery.com/jquery-latest.js"></script>
<script src="http://code.jquery.com/jquery-migrate-1.0.0.js"></script>

文章摘要

在需要的地方加上:

1
<!--more-->

插入数学公式

Mathjax的语法和LaTeX一致,在markdown中直接插入即可(注意上面我们修改了mathjax默认的inlineMath选项),下面举些例子,更多语法请参考 LaTeX Higher Mathematics

LaTeX入门

插入方程组:

\begin{aligned}
\dot{x} & = \sigma(y-x) \\
\dot{y} & = \rho x - y - xz \\
\dot{z} & = -\beta z + xy
\end{aligned}

插入矩阵:

\begin{bmatrix}
1 & 2\\
3 & 4
\end{bmatrix}

薛定谔方程:

$$ \hbar\frac{\partial \psi}{\partial t}
= \frac{-\hbar^2}{2m} \left(
\frac{\partial^2}{\partial x^2}

  • \frac{\partial^2}{\partial y^2}
  • \frac{\partial^2}{\partial z^2}
    \right
    ) \psi + V \psi. $$

see: http://www.winterland.me/2013/12/hexo-mathjax/

vim themesfolder/layout/_partial/mathjax.ejs

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
<!-- mathjax config similar to math.stackexchange -->
<script type="text/x-mathjax-config">
MathJax.Hub.Config({
tex2jax: {
inlineMath: [ ['$','$'], ["\\(","\\)"] ],
processEscapes: true
}
});
</script>
<script type="text/x-mathjax-config">
MathJax.Hub.Config({
tex2jax: {
skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code']
}
});
</script>
<script type="text/x-mathjax-config">
MathJax.Hub.Queue(function() {
var all = MathJax.Hub.getAllJax(), i;
for(i=0; i < all.length; i += 1) {
all[i].SourceElement().parentNode.className += ' has-jax';
}
});
</script>
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
</script>

自定义页面

1
hexo n page "about"

加载慢的问题

通常是因为加载外部资源超时,例如google开放的jquery库等。修改即可。

常用命令

1
2
3
4
5
hexo clean # deploy到github时,有时需要先运行该命令,例如修改样式时
hexo g
hexo d
hexo s
hexo n "title" # 生成文章

用php将markdown格式的表格转化为sql语句

我们在设计数据表结构的时候,通常使用markdown格式,例如如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
## 用户表
总的规则是:一个用户可以管理多个店铺,每个店铺需要配置不同的淘宝账号和密码。
### 用户登陆表:user_login
登陆表,保存用户基本的账号信息
字段 | 类型 | 其他属性 | 说明
------ | ------- | --- | --------
uid | int(11) | auto\_increment,primary | 自增主键。系统内的所有操作都与uid进行关联。
username | varchar(32) | unique | 用户名。唯一键
email | varchar(80) | unique | email。唯一键
password | char(32) | | 加密后的密码
status | tinyint(3) | default 0 | 状态,默认为0。定义如下
create\_time | datetime | | 注册时间
last\_login\_time | datetime | | 最后登陆时间
登陆时,可以使用用户名登陆,或者邮箱登陆。

当我们需要创建表格的时候,可能还需要写成sql,这很费时费力,而且容易出错,难维护。所以写了一个php的解释工具,可以根据markdown文件快速生成对应的sql语句,生成的sql格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
# md文件:http://git.ibbd.net/ibbd/ibbd-bc-py/blob/master/doc/db-tables.md
# Create By http://git.ibbd.net/ibbd/ibbd-bc-py/blob/master/doc/markdown2sql.php
# Create At 2014-10-14 15:44:36
CREATE TABLE `user_login` {
`uid` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '自增主键。系统内的所有操作都与uid进行关联。',
`username` VARCHAR(32) NOT NULL UNIQUE KEY COMMENT '用户名。唯一键',
`email` VARCHAR(80) NOT NULL UNIQUE KEY COMMENT 'email。唯一键',
`password` CHAR(32) NOT NULL COMMENT '加密后的密码',
`status` TINYINT(3) NOT NULL DEFAULT 0 COMMENT '状态,默认为0。定义如下',
`create_time` DATETIME NOT NULL COMMENT '注册时间',
`last_login_time` DATETIME NOT NULL COMMENT '最后登陆时间'
} ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户登陆表';

php代码如下:

READ MORE

在markdown中快速进行表格对齐

在markdown中的表格格式对齐是比价麻烦的,有了tabular这个vim插件之后,简单了许多,用法如下:

1
:45,67 Tab /|

这样就可以将表格按竖线进行对齐了,比较简单。不过经常修改表格时,每次都要输入这样一个命令还是挺麻烦的,故实现成快捷键的形式,如下:

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
" align
" markdown table align by "|"
nmap tab\| :call CyyAlignBy("\|")<CR>
nmap tab, :call CyyAlignBy(",")<CR>
nmap tab= :call CyyAlignBy("=")<CR>
nmap tab=> :call CyyAlignBy("=>")<CR>
" 根据某字符串对齐
func CyyAlignBy(string)
let __lineno = line('.')
let __begin_ln = __lineno
let __end_ln = __lineno
" 向前搜索,直到空行
while "" != getline(__begin_ln)
let __begin_ln -= 1
if __begin_ln < 1
break
endif
endwhile
" 向后搜索,直到空行
while "" != getline(__end_ln)
let __end_ln += 1
endwhile
let __exec = printf('%d,%d Tab /%s', __begin_ln, __end_ln, a:string)
echo __exec
exec __exec
endfunction

说明:

shell记录

多行复制

1
2
3
4
9,14 copy 45 # copy
9,14 move 45 # move
9,14 m 45 # move

粘贴到行首

使用大写 P

在某个目录下查找包含某个字符串的文件

1
find . | xargs grep -ri "some string"

xargs命令

作用:将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题。

1
2
3
4
5
6
7
rm `find /path -type f`
# 如果path目录下文件过多就会因为“参数列表过长”而报错无法执行。但改用xargs以后,问题即获解决。
find /path -type f -print0 | xargs -0 rm
# xargs将find产生的长串文件列表拆散成多个子串,然后对每个子串调用rm。

查找指定时间范围的文件

1
find ./*.jpg -newermt "2013-10-28" ! -newermt "2013-10-29"

字符串参与条件判断或者计算时,必须加上双引号

1
2
3
4
5
if [ -n "$string" ];
string="test test2"
your_func $string # 错误:函数会接收到两个参数
your_func "$string" # 正常:函数正常接收到一个参数

注意: shell会把字符串按照IFS进行分割处理

多行字符串:IFS换行符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
ifs=$IFS
IFS=$`\n` # 注意这里,不能使用: IFS="\n" or IFS='\n'
config=`cat <<EOF
output: .user.js
dese:
// ==UserScript==
// @name Userscript
// @namespace http://cyy0523xc.github.io/
// @version 0.1
// @description something
// @match http://*/*
// @copyright 2014, Alex(cyy0523xc@gmail.com)
// ==/UserScript==
input:
-
EOF`
echo $config
IFS=$ifs

批量重命名文件

1
rename 's/201[34]\-[01][0-9]\-[012][0-9]\-//' *.md

期待一元表达式

异常信息:

1
bash: [: h: 期待一元表达式]

对应语句:

1
2
3
4
5
if [ "h" = $1 ]
# 如果变量未定义的话,则报错,应改成:
if [ "h" = "$1" ]

shell-export及执行环境

export 功能说明:设置或显示环境变量。

语  法:export [-fnp] [变量名称]=[变量设置值]

补充说明:

  • 在shell中定义的变量,通常只能在当前shell中有效,只有用export输出之后,才能在其fork的子shell中有效。
  • 子shell中的变量无法被父shell读取,即使export也不行。

参  数:

  • -f  代表[变量名称]中为函数名称。
  • -n  删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。
  • -p  列出所有的shell赋予程序的环境变量。

用法:

1
2
3
4
export var
export -f func
export -fp

shell的命令类型

1. 内置命令(Builtin)

shell 执行这些命令时不会派生新进程,而是由 shell 直接执行。比如 read, set, export 都是内置命令,这些命令需要用 help command 来查看其帮助信息。

2. 外部命令

外部命令就是普通的可执行二进制文件,shell 在执行它们时会 fork 出新进程(这是一个子 shell),然后用 exec 系列函数来执行它们,这时候子 shell 的环境就被命令的环境所取代。

3. shell 脚本

在执行 shell 脚本时,shell 同样会先执行 fork 派生出子进程,然后使用 exec 来调用脚本解释程序(内核中会检查脚本中的第一行 #!/bin/xxx 来确定是调用哪一种),然后将脚本装入,由它来解释执行。脚本解释器有很多,比如 bash, cshell, perl, python 等。如果被调出来的解释程序和当前 shell 是同一种 shell,那么它就是当前 shell 的子 shell,脚本中的命令都在子 shell 中执行,不会影响父 shell 的环境。

几种常见的形式

( ) 和 { } 中的指令组:

在 ( ) 和 { } 中都可以内置一组指令。
( ) 中的指令会在一个子 shell 中执行,命令执行结果不影响当前 shell。需要注意的是,$$ 代表当前 shell 进程的 PID,而不是子 shell 进程的 PID 。

{ } 中的指令在当前 shell 中执行,指令执行结果会影响当前的环境。

后台执行和异步执行

在一个 shell 脚本中将一个命令通过 & 放入后台执行,这个命令和当前 shell 的执行是并行的,当前 shell 会派生一个子 shell 执行这个后台命令,而自己则继续往下执行,两者并没有相互依赖及等待的关系,所以这是一种异步的执行方式。以下代码可以说明这一点:

命令替换

`command` 会将 command 命令的输出结果代换到当前的命令行。command 在子 shell 中执行,它的结果不会影响到当前 shell 。比较下面代码:

1
2
3
4
pwd
dir=`cd /tmp; pwd`
echo $dir
pwd

管道

对于 bash 来说(dash,ash 等大部分 shell 也一样), 管道中的命令都是放在子shell里执行的

1
2
3
4
5
6
a="hello world"
echo "$a"| (read var; echo "In subshell:$var")
# 管道中的命令是放在子 shell 里执行的,所以 var 得到的值无法传递到当前 shell ,所以这里要输出为空。
echo $var

相关资料

jquery的promise模式

Promise

典型的ajax调用:

1
2
3
4
5
$.ajax({
url: '/url',
success: successFunction,
error: errorFunction
});

这个实现没有问题,但是耦合性比较高,不够优美,用promise实现如下:

1
2
3
4
5
6
7
8
9
10
$.ajax({url: '/url'})
.done(successFunction)
.done(successFunction2)
.fail(errorFunction);
// 更通用的方式
$.when(ajax({url: '/url'})) // $.when(promise)
.done(successFunction)
.fail(errorFunction);

好处如下:

  • 你可以多次调用done()和fail()函数,并使用不同的回调函数。或许你的一个回调函数用来停止动画,一个用来发起一个新的AJAX请求,一个用来将接受到的数据展示给用户。
  • 即使在AJAX调用完成之后,你依然可以调用done()和fail()函数,并且回调函数可以立即执行。不同的状态之间并不会发生变量混乱。当一个AJAX调用结束时,它保持了一个成功状态或者失败状态,这个状态不会发生改变。

Deferred

那么Deferred和Promise之间有什么区别呢?正如你在前面看到的,一个promise就是一个由异步函数返回的对象。当你想要自己编写一个这样的函数时你需要使用一个deferred。

一个promise对象有done和fail两个函数,Deferred有两个与之对应的函数:resolve和reject。使用Deferred对象可以构造异步模型。如:

1
2
3
4
5
6
7
8
9
10
function wait() {
var deferred = $.Deferred();
// 异步任务(例如异步请求数据)
setTimeout(function(){
deferred.resolve();
}, 2000);
return deferred.promise();
}

see: http://www.html-js.com/article/Study-JavaScript-jQuery-Deferred-and-promise-every-day

Greasemonkey脚本开发

简介

Greasemonkey,简称GM,中文俗称为“油猴子”,是Mozilla Firefox的一个附加组件。它让用户安装一些脚本使大部分HTML为主的网页于用户端直接改变得更方便易用。随着Greasemonkey脚本常驻于浏览器,每次随着目的网页打开而自动做修改,使得运行脚本的用户印象深刻地享受其固定便利性。
Greasemonkey可替网页加入些新功能、修正网页错误、组合来自不同网页的数据、或者数繁不及备载的其他功能。写的好的Greasemonkey脚本甚至可让其输出与被修改的页面集成得天衣无缝,像是原本网页里的一部分。

READ MORE

vim插件

华丽的powerline

下载插件:

1
2
cd ~/.vim/bundle/
git clone https://github.com/Lokaltog/vim-powerline

修改vim的配置文件:vim ~/.vimrc,加入下面几行:

1
2
3
4
" powerline插件
set t_Co=256
let g:Powerline_symbols = 'unicode'
set encoding=utf8

效果如下:

vim-powerline

shell命令自动补全

代码如下:

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
# github相关操作
github() {
cd_github_code
my_github=git@github.com/cyy053xc/
case $1 in
"c"|"clone")
git clone $my_github$2".git"
;;
"l"|"pull")
pushd $my_github$2
git pull
popd
;;
"s"|"push")
pushd $my_github$2
git pull
git commit -am 'script commit'
git push
popd
;;
"h"|"help"|*)
cat <<EOF
github [hcls] [path]
usage:
h|help : help
c|clone project : git clone {$my_github}project.git
l|pull project : git pull
s|push project : git push
EOF
;;
esac
}
# 补全函数
function _github() {
COMPREPLY=()
local cur=${COMP_WORDS[COMP_CWORD]};
local com=${COMP_WORDS[COMP_CWORD-1]};
case $com in
'github')
COMPREPLY=($(compgen -W 'c clone l pull s push h help' -- $cur))
;;
'compile')
local pro=($(awk '{print $1}' project.list))
COMPREPLY=($(compgen -W '${pro[@]}' -- $cur))
;;
*)
;;
esac
return 0
}
# 绑定自动补全函数
complete -F _github github

从效果上,可以说已经实现了tab键自动补全,不过不是很完美:

  • 每个函数需要搭配一个额外的补全函数
  • 补全函数的实现有大量的重复代码
  • 另外还需要一个额外的命令进行绑定

理想的应该是:在函数的内部加上一条命令或者一个配置来解决。

vimscript问题汇总

source时提示“E484: 无法打开文件”

1
source '/home/code/github/code/vim/cyy.vim'

应该去掉路径中的单引号,如下:

1
source /home/code/github/code/vim/cyy.vim