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

简述
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;}' |
俺学习和使用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为空时,各参数不会粘到一块儿,”$*”和”$@“的扩展不同 |
Bellman-Ford算法简述
Dijkstra算法是处理单源最短路径的有效算法,但它局限于边的权值非负的情况,若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的。这时候,就需要使用其他的算法来求解最短路径,Bellman-Ford算法就是其中最常用的一个。该算法由美国数学家理查德•贝尔曼(Richard Bellman, 动态规划的提出者)和小莱斯特•福特(Lester Ford)发明。Bellman-Ford算法的流程如下:
给定图G(V, E)(其中V、E分别为图G的顶点集与边集),源点s,
- 数组Distant[i]记录从源点s到顶点i的路径长度,初始化数组Distant[n]为
, Distant[s]为0; - 以下操作循环执行至多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进行更新,说明最短路径已经查找完毕,或者部分点不可达,跳出循环。否则执行下次循环;
- 为了检测图中是否存在负环路,即权值之和小于0的环路。对于每一条边e(u, v),如果存在Distant[u] + w(u, v) < Distant[v]的边,则图中存在负环路,即是说改图无法求出单源最短路径。否则数组Distant[n]中记录的就是源点s到各顶点的最短路径长度。
可知,Bellman-Ford算法寻找单源最短路径的时间复杂度为O(V*E).
这是一款供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模式下执行命令,会对选中的特定区块进行注释/反注释
有码有真相,各位看官您上眼:
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),即不可以修改;用户自定义类型的临时对象可以作为左值。
最近玩儿无损,据说有人曾说无损是种生活,是吗?上帝知道,烧友知道,我知道,你知道吗?
今天来了兴致,想把自己的几张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.
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 |
现有一个数列
,另有一个栈Stack和一个队列Queue,Stack与Queue初始为空。现对S中元素依次进行如下操作:
- 若Stack为空,则从S中取出一个元素入栈;
- 若Stack非空,则有两种选择:将栈顶元素弹出并入队,或者从S中取出一个元素入栈;
- 若S元素已经取完则操作结束,否则执行操作1或2。
问最终队列Queue有多少种排列情况?聪明且见识广博的你或许一下子就可以说出答案:
现在对这个结果进行证明。
设1表示入栈操作,0表示出栈操作。那么上面对n个元素的入栈和出栈操作就构成了长度为2n的由0和1组成的序列,其中1和0的个数均为n个,在没有任何限制的情况下,一共有
个这样的序列。但是,这里的01序列是建立在一些列的入栈出栈操作的基础上的,因此就会受到入栈、出栈操作的限制。这里,唯一的限制就是栈为空时,无法进行出栈操作。反映到这个01序列中就是,任意位置之前,0的个数都能比1的个数多。因为有了01序列的总数
,所以为了找出满足条件的序列的个数,只需要找出不符合条件的序列的个数。
提到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; } |