分类 猪在写代码 下的文章

配置一个能用的VIM

若干年前,我知道了世界上有vi这么个东西,后来我接触到了vi,并且开始使用vim进行工作,本着磨刀不误砍柴工的原则,对vim的配置研究了一下,也有一些新的,但迟迟没有写出来跟大家共享,今天闲着没事,就跟大家分享一下。各种原因,很多软件还得指着win的环境,所以不能完全抛弃 Windows,所以Linux下边的配置就不说了,跟Win下边的gvim异曲同工。

把我自己在Windows下边gvim的配置贴一贴吧。另外搞了几个小插件。

首先是常规的一些配置和说明:

colorscheme murphy "这是GVIM一个配色方案,默认的,看起来比较舒服
syntax on "语法高亮
filetype on "文件类型检测
filetype plugin on "这个据说是补全需要的
set nocompatible "关闭vi兼容,vi兼容太恶了……
set number "行号
set autoindent "自动缩进
set smartindent "也是缩进
set showmatch "匹配,括号之类的
set hls "搜索高亮
set incsearch "搜索自动定位
set mouse=a "鼠标模式,还可以等于v,至于习惯哪一个,仁者见仁了
set background=dark "顾名思义
set tabstop=4 "缩进4字符
set shiftwidth=4 "一个tab
set guioptions-=m "不显示菜单
set guioptions-=T "不显示工具
set ruler "右下角显示状态
set mousehide "输入隐藏鼠标
set guifont=YaHei_Consolas_Hybrid:h10:cANSI "这个是字体,我用了雅黑和consolas的组合
set fenc=chinese "一下几个都是编码的问题,用来消除乱码的
set encoding=utf-8
set fileencodings=utf-8,chinese,latin-1
set fileformat=unix
set cursorline "高亮当前行,配合后边的hi,我喜欢比较舒服的grey15
set visualbell "屏幕闪烁,我开始是novisualbell,现在想打开玩一段时间
autocmd GUIEnter * simalt ~x "最大化打开
highlight Cursorline guibg=grey15 "这就是当前的背景高亮
if has("win32")
set fileencoding=chinese
else
set fileencoding=utf-8
endif
language messages us_EN.utf-8
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim

配置基本就这些,再说说插件,我装了三个插件,nerdTree一个目录树的工具,我很喜欢,个人认为好过project;ctags,这个偶尔读大代码会用到,很方便;mark,这个写代码会用到,避免变量出错,适合我这种人;omni,这是自动补全,就装上了,其实不太用……

下边是有关这几个插件的配置:

" auto command 自动补全用的
autocmd FileType python set omnifunc=pythoncomplete#Complete
autocmd FileType javascript set omnifunc=javascriptcomplete#CompleteJS
autocmd FileType html set omnifunc=htmlcomplete#CompleteTags
autocmd FileType css set omnifunc=csscomplete#CompleteCSS
autocmd FileType xml set omnifunc=xmlcomplete#CompleteTags
autocmd FileType php set omnifunc=phpcomplete#CompletePHP
autocmd FileType c set omnifunc=ccomplete#Complete

" map 首先是nerdtree的几个很方便
map tr :NERDTreeToggle d:\

map ^c:NERDTree c:\
map ^d:NERDTree d:\
map ^e:NERDTree e:\
map ^f:NERDTree f:\

map ^m:Mark regex
" 先变是ctags的
map fun :TlistOpen
map cls :TlistClose

" taglist
let Tlist_Auto_Highlight_Tag = 1
let Tlist_Auto_Open = 0
let Tlist_Auto_Update = 1
let Tlist_Close_On_Select = 0
let Tlist_Compact_Format = 0
let Tlist_Display_Prototype = 0
let Tlist_Display_Tag_Scope = 1
let Tlist_Enable_Fold_Column = 1
let Tlist_Exit_OnlyWindow = 0
let Tlist_File_Fold_Auto_Close = 0
let Tlist_GainFocus_On_ToggleOpen = 1
let Tlist_Hightlight_Tag_On_BufEnter = 1
let Tlist_Inc_Winwidth = 0
let Tlist_Max_Submenu_Items = 1
let Tlist_Max_Tag_Length = 30
let Tlist_Process_File_Always = 0
let Tlist_Show_Menu = 0
let Tlist_Show_One_File = 1
let Tlist_Sort_Type = "order"
let Tlist_Use_Horiz_Window = 0
let Tlist_Use_Right_Window = 0
let Tlist_WinWidth = 30
let tlist_php_settings = 'php;c:class;i:interfaces;d:constant;f:function'

就这些配置了,后边我挂出我插件和vimrc的文件:

plugins: http://jiajun.org/g/vimplugins.zip

vimrc: http://jiajun.org/g/vimrc

 

 

vimrc的这个,下下来放到相应的位置就好了,默认安装的gvim在我的文档,有个叫.vimrc的

Tor工具初步探究(感谢Fay,FY和CC同学)

首先,感谢Fay老师,FY老师和CC老师对本人的鞭策,于是我去研究了一下Tor这个东西,撰下此文。

江湖上流传着一句话,叫“想FanQiang,带套吧”,这句话就像我们介绍了一个工具Tor,在FanQiang界,一般来说是用Tor技术的一个FireFox扩展,可以把FireFox发出的请求隐藏起来,以达到逃过GFW的效果。

Tor是第二代洋葱路由的一种实现。弄一堆server搞一个分布式网络出来,这些机器的组成的这个分布式网络提供路由功能,就叫:洋葱路由器。当我们使用这个洋葱路由,本文中对这个洋葱路由的使用就是基于Tor技术的那个插件。

事实上Tor刚刚出现的时候,并不是为了翻墙,而是一款为了维护访问者的隐私而诞生的,在最初的时候这是一个军方支持项目,之后与军方脱离关系,收到EFF的指导和支持,而且作为其一个项目得以继续发展,貌似到了05年EFF也给Tor断了奶,仅仅是继续维护其首页,仅此。

这个Tor的原理就是说,每一个安装了Tor的终端,发出请求时,这个请求会发向洋葱路由,请求包在路由间沿着不固定的路线传播,以达到匿名的作用,并信息在传递过程中,Tor还会对传递的信息进行加密,因此信息在这里传播是安全的。

一个最短路径的问题

题目:

北京的一位出租车司机向你抱怨:城市发展太快,公路越来越多,他已经疲于计算行驶路线,于是求你开发一个自动导航的工具。

出租车只能在公路上行驶。所有的公路都是笔直、双向的,相交的公路视为连通(可以在交叉点处从一条公路开到另一公路上)。由于道路施工,整个城市的公路系统可能并不完全通畅。如果乘客的目的地不在公路边,则乘客下车后要步行前往,步行路线不受公路限制。这位好心的司机还特别提出,乘客步行距离越短越好;其次,出租车行驶里程越短越好。

方便起见,用笛卡儿坐标系来描述城市地图,所有坐标都在第一象限[0, 10000]的范围内。公路宽度忽略不计。

输入格式:

第一行是一个整数k,代表公路条数。以下k行每行用4个非负整数描述一条公路(用空格隔开),前两个表示公路起点的坐标,后两个表示公路终点的坐标。下一行包含4个非负整数(用空格隔开),前两个表示乘客出发点(保证在某条公路上),后两个表示乘客目的地坐标。乘客必须在出发点上车,中途不换车。任意两条公路最多只有一个公共点。

输出格式

仅一行,为出租车行驶的里程数,保留一位小数(四舍五入)。

输入样例 例

2

2 2 10 10

10 2 2 10

3 3 9 4

输出样例

7.8

评分规则:

1. 程序将运行在一台Linux机器上(内存使用不作严格限制),在每一测试用例上运行不能超过1秒,否则该用例不得分;

2. 要求程序能按照输入样例的格式读取标准输入数据,按照输出样例的格式将运行结果输出到标准输出上。如果不能正确读入数据和输出数据,该题将不得分;

3. 本题包含20个测试点,前10组满足k<=10,后10组满足k<=50。每个测试点10分,共200分。

-----------------解答--------------------

太晚了,不写具体实现了,说说思路吧,明天有时间补代码。

这道题典型的最优路径问题,两种经典算法,Dijkstra和Floyd-warshall,各有优势。纯从算法复杂度上来说呢,Dijkstra要比 Floyd要稍微低一点,但是Dijkstra存在一个问题,每一次查询需要扫描一次节点集合,而Floyd就只需要运行时构建一次列表,而此后的查询只需查表。

考虑这道题目的要求,需要用20个测试点进行测试,就是说节点列表要更新20次,未提到每个测试点采用多少个测试用例,所以我觉得还是采用Dijkstra算法靠谱。

具体的算法设计:

1,算出节点列表

这一步是比较关键的,也相对麻烦,我认为甚至比 4 更麻烦,因为 4 的Dijkstra算法是既有的。

首先,我们有一些线段集合 D={d1, d2, ..., dn},我们记线段di为(Ai, Bi),其中Ai和Bi是线段端点。

然后,对集合D进行计算,即考虑线段交点,扩展集合D,若di和dj两个交点(Mij, Nij),那么D={d1, d2, ..., dn, (Ai, Mij), (Mij, Bi), (Aj, Mij), (Bj, Mij)}。由于两点之间线段最短,因此D中原有的线段不变,只加入新元素。在这一步涉及到一个计算线段交点的算法,分三步:1 通过向量积的方法看是否平行(题目中有,两条路最多1个交点,因此不存在重合问题,若是延长情况,这个问题可忽略),即,积为0无交点;2 有相交的情况,算出交点,这算法不复杂; 3 看交点坐标是否同时在两条线段上。

2,计算权值

权值就是距离,算出来就行了

3,构造可达矩阵

可达矩阵,这不用说了吧,无向图的邻接矩阵,求个n-1次方,然后求并。无向图的邻接是对称的,所以压缩存储,存一半就行了,一般来说是是稀疏的,所以存起来就行了。存矩阵的数据结构也好多,十字链表之类的,随便挑一个就行了。

4,获取起止点,通过dijkstra算法计算最短路径

接下来就是计算两个点,起始点V和终止点U之间的最短路径P,P是点的集合来描述路径的。dijkstra的算法描述也不用仔细写了吧~就是从V开始,列出所有可以直达的点集合S,及其权值,然后看以S中的点作为起点,在继续往下求,顺便看S中有没有可以互达距离小于直达距离的,就是说S中有三个点A, B, C,有A-B,和B-C的关系,且V-C的权值大于V-A, B-C权值之和,则更新V-C的权值,依次,知道S中出现U为止。

这个最优解就求出来啦,哈哈

-----------------------写完了才发现个问题-----------------------

低4步中的点U和V也是要在地1步中计算进D的,这个V是给出的,U是要求的,计算U的算法最SB的就是暴力计算,即把求终点到各个线段的垂直距离,然后找出最小的那个垂足,那个垂线段和已知线段的交点是叫垂足吧?

这就行了,基本就这些,有时间在写实现吧,应该不复杂的。