前些天看到这篇文章,知道有这么个网站提供了这样的服务。除了方便的在线编辑外,这个网站对外还提供生成公式图片的服务,而且图片格式可选,公式清晰、字体饱满。于是我产生了修改LaTeX for Wordpress插件的想法,于是就有了这个插件Using \LaTeX。使用方法原来zhiqiang的插件,即通过一对$ $之间嵌入LaTeX公式(如$$\LaTeX $$),通过在公式末尾加!号显示LaTeX语句本身(即$$\LaTeX!$$)。
  由于不再使用mimeTeX,而是CodeCogs提供的服务,因此可以使用CodeCogs提供的特有的语法,比如不同的字体风格、不同的分辨率、不同的图片格式、不同背景色等等,其他特色请自己揣摩。另外,Using LaTeX在大约500次访问之后,会自动清空缓冲文件夹。

Tags: .

简述

  sed是Linux环境下的一个文本流、行编辑器,十分强大,这里贴一些常用的单行脚本,脚本最初来源于此,基本未做改动。另外一个强大的文本处理工具就是awk,对于这两个工具,个人觉得,根据个人选择其一就够用了,我自己就喜欢sed多一点。Bones在这里用awk对下面的各个sed命令行做了相应的替代。
  推荐一本关于sed和awk的书《sed & awk》,作者Dale Dougberty, Arnold Robbins。中文版在网上已经买不到了,china-pub倒是有,不过是原版的一般人承受不起那个价位。幸好这本书的作者提供免费的电子版,在网上应该可以搜的到。

sed单行命令快速参考

文本间隔
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 在每一行后面增加一空行
 sed G
 
 # 将原来的所有空行删除并在每一行后面增加一空行。
 # 这样在输出的文本中每一行后面将有且只有一空行。
 sed '/^$/d;G'
 
 # 在每一行后面增加两行空行
 sed 'G;G'
 
 # 将第一个脚本所产生的所有空行删除(即删除所有偶数行)
 sed 'n;d'
 
 # 在匹配式样“regex”的行之前插入一空行
 sed '/regex/{x;p;x;}'
 
 # 在匹配式样“regex”的行之后插入一空行
 sed '/regex/G'
 
 # 在匹配式样“regex”的行之前和之后各插入一空行
 sed '/regex/{x;p;x;G;}'
Tags: .

  俺学习和使用Shell过程中积累的一些东西,希望对某些看官有用。另,本人使用bash环境。

Shell预设环境变量

环境变量 说明
$HOME 当前用户主目录
$PATH 冒号分割的用来搜索命令的目录的几何
$PS1 命令提示符,例如[\u@\h/\W$]给出了user@host/folder $这样的提示符
$PS2 二级提示符,通常仅仅包含一个>
$IFS 输入分割域,通常为空白符,即空格、制表符、回车
$0 shell脚本的文件名
$# 调用本脚本时提供的参数个数
$$ shell脚本的进程号
$! 后台进程的进程号
$? 上一个进程的退出状态
$1, $2, ……, $n 脚本的参数,n超过9时需要用${n}
$* 包含了所有的参数,各参数以$IFS分割
$@ 类似$*,但当$IFS为空时,各参数不会到一块儿,”$*”和”$@“的扩展不同
Tags: .

Bellman-Ford算法简述

  Dijkstra算法是处理单源最短路径的有效算法,但它局限于边的权值非负的情况,若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的。这时候,就需要使用其他的算法来求解最短路径,Bellman-Ford算法就是其中最常用的一个。该算法由美国数学家理查德•贝尔曼(Richard Bellman, 动态规划的提出者)和小莱斯特•福特(Lester Ford)发明。Bellman-Ford算法的流程如下:
  给定图G(V, E)(其中V、E分别为图G的顶点集与边集),源点s,

  1. 数组Distant[i]记录从源点s到顶点i的路径长度,初始化数组Distant[n]为\color{red} \infty, Distant[s]为0;
  2. 以下操作循环执行至多n-1次,n为顶点数:
    • 对于每一条边e(u, v),如果Distant[u] + w(u, v) < Distant[v],则另Distant[v] = Distant[u]+w(u, v)。w(u, v)为边e(u,v)的权值;
    • 若上述操作没有对Distant进行更新,说明最短路径已经查找完毕,或者部分点不可达,跳出循环。否则执行下次循环;
  3. 为了检测图中是否存在负环路,即权值之和小于0的环路。对于每一条边e(u, v),如果存在Distant[u] + w(u, v) < Distant[v]的边,则图中存在负环路,即是说改图无法求出单源最短路径。否则数组Distant[n]中记录的就是源点s到各顶点的最短路径长度。

  可知,Bellman-Ford算法寻找单源最短路径的时间复杂度为O(V*E).

Tags: ,.

  这是一款供Vim使用的插件,看名字可以知道,它和The NERD Tree同属一个作者。使用这款插件,你可以对多种文件类型的文件进行不同方式地、快速地注释。这对使用Vim来写代码或者修改配置文件的同学来说,无疑是提升效率和快感的一件利器。你可以到这里来下载这个插件,将压缩包里面的doc/和plugin/文件夹丢到~/.vim/下面就是安装了。为了可以使用其帮助文档,你还需要在Vim中执行:helptags ~/.vim/doc/来注册。
  简单介绍下NERD Commenter的常用键绑定,以C/C++文件为例,详析的使用方法,请:h NERDCommenter。在Normal或者Visual 模式下:

  • ,ca,在可选的注释方式之间切换,比如C/C++ 的块注释/* */和行注释//
  • ,cc,注释当前行
  • ,c,切换注释/非注释状态
  • ,cs,以”性感”的方式注释
  • ,cA,在当前行尾添加注释符,并进入Insert模式
  • ,cu,取消注释
  • Normal模式下,几乎所有命令前面都可以指定行数
  • Visual模式下执行命令,会对选中的特定区块进行注释/反注释
Tags: .

  有码有真相,各位看官您上眼:

1
2
3
4
5
6
int main()
{
	bar(++foo(372)); //~ 此行报错
	bar(++foo(wrap_int(372))); //~ 无错
	return 0;
}

  第一个bar调用中foo返回int型临时对象,想要把这个int临时对象++后传给bar,未遂。第二个bar调用中,foo返回一个包装过的int, 即wrap_int,对这个临时对象进行++(重载),得逞。结论:C++中,基本类型(内置类型)的临时对象不可以作为左值(l-value),即不可以修改;用户自定义类型的临时对象可以作为左值。

Tags: .

  最近玩儿无损,据说有人曾说无损是种生活,是吗?上帝知道,烧友知道,我知道,你知道吗?
  今天来了兴致,想把自己的几张Avril的碟子给榨出来。Google了一小下,知道有这么个工具,名字挺有意思,abcde = A Better CD Encoder. 它能从CD中rip出来波形文件(WAV),然后根据选项把波形文件转换成特定格式的音频文件,比如mp3, ogg, flac等等。flac = Free Lossless Audio Codec,就是我要的无损了。
  UB/Debian下安装abcde很简单,apt-get abcde就OK了。安装时你可能发现这个东西很小,只有不到2M。其实,abcde只是一个脚本,它利用其它的工具来实现特定的功能。比如利用cdparanoia来生成WAV文件,利用lame生成mp3文件,利用flac生成flac文件,利用mkcue生成cue文件……因此,如果相应的工具没有被安装,或者路径不在PATH中,abcde就会有错误提示:

[ERROR] abcde: lame is not in your path.
[INFO] Define the full path to the executable if it exists on your system.
Tags: ,.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ ssh FenglinHou@Dalian
~% cd Wdir/
~/Wdir% cat dump.cpp
#inlcude <everything>
int
main()
{
    std::set<std::Girl> ().clear();
    std::ifstream lifein("~/*");
    std::ofstream lifeout("~/*");
    std::copy(std::istream_iterator<std::stuff>(lifein), 
              std::istream_iterator<std::stuff>(), 
              std::ostream_iterator<std::stuff>(lifeout, "\newday"));
    return (0);
}
~/Wdir% cat Makefile
dump:dump.cpp
    g++ -odump dump.cpp
~/Wdir% make
~/Wdir% ./dump
Tags: ,,,.

  现有一个数列S = \{1,2,3,\ldots,n\},另有一个栈Stack和一个队列Queue,Stack与Queue初始为空。现对S中元素依次进行如下操作:

  1. 若Stack为空,则从S中取出一个元素入栈;
  2. 若Stack非空,则有两种选择:将栈顶元素弹出并入队,或者从S中取出一个元素入栈;
  3. 若S元素已经取完则操作结束,否则执行操作1或2。

  问最终队列Queue有多少种排列情况?聪明且见识广博的你或许一下子就可以说出答案:\120dpi \color{red}\frac{C_{2n}^{n}}{n+1}\quad\textbf{or}\quad\frac{\binom{2n}{n}}{n+1}
  现在对这个结果进行证明。
  设1表示入栈操作,0表示出栈操作。那么上面对n个元素的入栈和出栈操作就构成了长度为2n的由0和1组成的序列,其中1和0的个数均为n个,在没有任何限制的情况下,一共有C_{2n}^n个这样的序列。但是,这里的01序列是建立在一些列的入栈出栈操作的基础上的,因此就会受到入栈、出栈操作的限制。这里,唯一的限制就是栈为空时,无法进行出栈操作。反映到这个01序列中就是,任意位置之前,0的个数都能比1的个数多。因为有了01序列的总数C_{2n}^n,所以为了找出满足条件的序列的个数,只需要找出不符合条件的序列的个数。

Tags: .

  提到C++ STL,首先被人想到的是它的三大组件:Containers, Iterators, Algorithms,即容器,迭代器和算法。容器为用户提供了常用的数据结构,算法大多是独立于容器的常用的基本算法,迭代器是由容器提供的一种接口,算法通过迭代器来操控容器。接下来要介绍的是另外的一种组件,函数对象(Function Object,JJHou译作Functor仿函数)。

什么是函数对象

  顾名思义,函数对象首先是一个对象,即某个类的实例。其次,函数对象的行为和函数一致,即是说可以像调用函数一样来使用函数对象,如参数传递、返回值等。这种行为是通过重载类的()操作符来实现的,举例说明之,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Print
{
public:
    void operator()(int n)
    {
        std::cout<<n<<std::endl;
        return ;
    }
};
int
main(int argc, char **argv)
{
    Print print;
    print(372);
    print.operator()(372); //~ 显式调用
    return 0;
}
Tags: ,.