Vim 中 buffer 操作及管理

通常情况下工作的内容都会是打开一个文件进行编辑,但是 Vim 的强大之处不仅在于单文件编辑,更重要的是可以对多文件编辑,这些文件可以存在不同的 Tab 中,不同的 Windows 中,甚至不同的 buffer 中,这一篇主要就是集中整理一下 buffer 相关的操作内容。

A buffer is an area of Vim’s memory used to hold text read from a file. In addition, an empty buffer with no associated file can be created to allow the entry of text. –vim.wikia

Buffer 创建

通常情况下 vim file1 file2 便是将两个文件放到了 buffer 中。

  • :e /path/to/file 也可以打开文件到 buffer 中
  • :new:vnew
  • :badd {filename} 添加到缓冲区,光标保持在当前缓冲

buffer delete

移除缓冲区

:bd[elete]
:bunload
:bwipeout
:3,5bdelete
:bd file1

如果未保存会退出失败,强行退出

:bd!

buffer navigation

使用 Ctrl + ^ 可以来在最近的缓冲去中切换。

:ls, :buffers          " 列出所有缓冲区

在展示的列表中有一些 buffer 的状态:

  • - 非活动的缓冲区
  • a 光标所在缓冲区
  • h 隐藏缓冲区
  • % 当前的缓冲区
  • # 交换缓冲区, 可以使用 Ctrl + ^
  • = 只读缓冲区
  • + 已经更改的缓冲区

切换缓冲区:

:bn[ext]
:bp[revious]
:b {number, bufname}
:bfirst
:blast

说明:

  • :b <Tab> “ 循环滚动 buffer 中的文件

buffer 替换

:bufdo %s/pattern/replace/ge | update

2014-05-01 vim , buffer , vim-buffer

Visual Assist And Eclipse使用doxygen注释

##修改Visual Assist中的方法注释样式

Visual Assist生成的方法注释又长又丑有木有?那就简单修改一下吧~

  • 如下面的两张图所示,打开在Visual Assist的选项卡,按图中标示顺序打开Refactor Document Method脚本,就可以按照自己喜欢的风格修改了~不同版本的Visual Assist中设置的路径可能不一样,总之都在Suggestions选项卡下。
  • 可用的宏可以点左上角最后一个图标查看,意思看名字就能推断出来了~
  • 是不是还想来个快捷键什么的,在想要注释的函数定义上方敲 /** 回车就行

visual assist 1

visual assist 2

###Eclipse中使用doxygen注释C++方法 修改一下选项就可以了~然后在要注释的方法的上一行输入 /** 按回车即可. enter image description here

参考: http://cherishlc.iteye.com/blog/1777034


2014-04-25 doxygen , Visual Studio , Eclipse

CPU知识

###步进 所谓步进:同一处理器型号随着时间推移,会有一些小的改进,厂商把这些小的改进通过新的步进来体现。 (通过汉语意思理解:就是与之前相比进了一小步,针对同一型号) 酷睿 i3/i5全线将从C2步进转换到K0,预计在品质等诸多方面比上一个步进要更加出色。 现在知道了吧,不用去关注它,只要知道是处理器在架构或者其他方面提高了就行。 步进更多的知识详见百度百科,里面讲到了用CPU-z识别当前使用的CPU的步进信息,如何通过编码知道步进信息。

###CPU各版本信息 ####ES 测试版CPU,发给制造商用于各类测试的版本,因为不是免费提供,intel无法回收CPU,测试结束以后部分CPU会流入市场,该类CPU如要购买最好先搜一下看看ES版是否存在一些BUG

####QS 最后一个版本的ES,一般用工具检测,固件烧录的也是ES,用于区分正式版

####BGA、PGA

BGA和PGA是intel的两种封装类型,BGA没有阵脚,直接焊在主板上,PGA带有阵脚,可以插在socket插座上使用,一些JS把BGA的CPU拆掉私自焊针脚来销售,稳定性极差,价格要低很多,温度要高一些,BGA和PGA无法用软件区分,只能拆开自己检查

引用:低电压板,L,SP,SU开头的型号,基本都是bga的 引用:http://www.xj123.info/1717.html

###CPU后面跟随的数字 I3 后面有四个数字 拿I3 3220为例, 第一个3就是第三代,所以2100就是第二代,530(三个数字)就是第一代 第二个2就是规格,一般取比第一个数字小1的数字,比如第一个是4,后面就是3,如果小于3,那就是进一步降低主频或删减缓存的缩水货。 第三个2就是等级,档次,越高越好。 最后一个0只是加上去为了英语发音好读。

I5也是一样,比如I5 3570K 第一个数字3代表第三代,第二个数字固定为5,小于5的就是精简过规格的产品,第三个是等级。

另外关于第二个数字还有一个小秘密,一般3以下都是I3(也有双核I5,很少),3-5是I5,6-9是I7。 引用:http://zhidao.baidu.com/question/573950249.html


2014-03-13

Android SDK环境变量配置

Android SDK就是Google提供的Android开发工具包,之前请先配置好JDK

###Android SDK下载地址

  • Google搜索Android SDK
  • 或者https://developer.android.com/sdk/index.html

###配置Android SDK环境变量

  1. 下载Android SDK,点击安装,直接默认路径即可! 下载地址:https://developer.android.com/sdk/index.html

  2. 默认路径安装后,安装完成,开始配置环境变量。

  3. 打开计算机属性——高级系统设置——环境变量(如上文)

  4. 新建一个环境变量,变量名:ANDROID_HOME,变量值:D:\Android\android-sdk(以你安装目录为准,确认里面有tools和add-ons等多个文件夹),点击确认。

  5. 在用户变量PATH后面加上变量值;%ANDROID_HOME%\platform-tools;%ANDROID_HOME%\tools;点击确认即可

  6. Android SDK配置完成,接下来验证配置是否成功。

  7. 点击运行——输入cmd——回车——输入adb——回车,如果出现一堆英文,即表示配置成功,输入Android,启动Android SDK Manager。

###目录tools和platform-tools的区别

Android sdk目录里,有一些文件夹:

  • tools:该目录存放大量的Android开发,调试工具,该目录下存放大量Android开发工具,例如SDK Manager、androidavd、emulator、ddms等等。
  • platforms-tools:该文件夹存放Android平台和相关工具,存放Android不同平台的相关工具;随着SDK更新版本,这里的工具会有相应更新变化,但是一般都是向后兼容。最常用的是Android Debug Bridge(adb)工具
  • add-ons:该目录存放额外的附件软件。刚解压时该目录为空。
  • platforms:该目录存放不同版本的Android版本。刚解压时该目录为空。
  • SDK Manager.exe:该程序就是Andriod SDK管理器。
  • AVD Manager.exe:该程序就是Andoid虚拟设备。
  • docs:该文件夹存放了Android SDK开发文件和API文档等
  • samples:该文件夹存放不同的Android平台和示例程序。

参考:http://blog.csdn.net/rflyee/article/details/8973529


2014-03-04 Android , JDK

Vim 插件介绍:Nerdtree

地址

介绍

:help NERDTree

Config

通常情况下会设置一个 map

nmap <F2> :NERDTreeToggle<cr>

然后设置

" nerd comment
" Add spaces after comment delimiters by default
let g:NERDSpaceDelims = 1

" Use compact syntax for prettified multi-line comments
let g:NERDCompactSexyComs = 1

" Align line-wise comment delimiters flush left instead of following code indentation
let g:NERDDefaultAlign = 'left'

" Set a language to use its alternate delimiters by default
let g:NERDAltDelims_java = 1

" Add your own custom formats or override the defaults
let g:NERDCustomDelimiters = { 'c': { 'left': '/**','right': '*/' } }

" Allow commenting and inverting empty lines (useful when commenting a region)
let g:NERDCommentEmptyLines = 1

" Enable trimming of trailing whitespace when uncommenting
let g:NERDTrimTrailingWhitespace = 1

" Highlight Cursor line
let g:NERDTreeHighlightCursorline = 1
" Show hidden files
let NERDTreeShowHidden=1
" NERDTree will recursively open dirs with only one child
let NERDTreeCascadeOpenSingleChildDir=1

Keyboard Mappings

使用 :help NERDTreeMappings 来查看插件所有的绑定,这一些是日常中使用频率比较高的:

  • Enter 在窗口打开文件
  • i 水平分割线分割,如果有一个打开的窗口,那么会分成上下两个窗口
  • s 垂直分割线分割,左右两个窗口
  • I 显示或者隐藏 hidden file
  • m 菜单,m 是一个非常强大的命令,可以支持新增,删除,重命名,复制等等操作
  • r 递归刷新当前目录
  • R 递归刷新 root 目录
  • ?

2014-02-21 vim , nerdtree , vim-tips , vim-plugin

Blogger 主题中Widget使用

Blogger 的主题和插件有自带的一套语法,下面就是 Blogger 主题中关于 Widget 的使用说明。

Widget Tags for Layouts

标签是用来创建最基本的widget的,描述在 [Page Element Tags for Layouts](http://help.blogger.com/bin/answer.py?answer=46888) 中.而这篇是描述在widget标签中具体可以设置哪些东西的,例如你可以在widget中放置什么. 第一件事就是放置一个闭合的标签,像这样: `<b:widget [...attributes...] />` 展开之后是这样的: `<b:widget [...attributes...]>

`

接下来谈论一下可以在widget中放置什么

Includes

Widget的内容包含在”includable” section中,像这样:

<b:includable id='main' var='thiswidget'>
    [insert whatever content you want here]
</b:includable>

includable的属性有:

  • id:(必须)唯一标识符,由字母和数字组成
  • var:(可选)标识符,由字母数字组成,用来引用section中的data.(具体请见下面说的data section)

每一个widget必须有一个具有id='main'的 includable 。通常这个widget的大部分内容都包含在这个includable中.

如果你有很多具有不同id属性的includable,他们不会自动的显示出来.但是如果你有一个includable带有id='new'的属性,那么在main includable中通过<b:include name='new' />就能够引用,并显示出来.

b:include标签的属性如下:

  • name:(必须)标识符由字母和和数字组成,它必须是在同一个widget中已经存在的b:includable的id
  • data:(可选)An expression or peice of data to pass on to the includable section. This will become the value of the var attribute in the includable.

简单例子同来讲解b:includableb:include的用法.Loops和data会在后面讲述,这里主要要理解’main’ section是如何包含 ‘post’ section的.main包含了一个includable,传递了一个data叫做’i’,included section引用做’p’,使用p访问title.

<b:includable id='main'>
   <b:loop var='i' values='posts'>
      <b:include name='post' data='i'/>
   </b:loop>
</b:includable>

<b:includable id='post' var='p'>
   Title: <data:p.title/>
</b:includable>

下面这段的意思就是说如果你想重复使用代码,可以将代码放到includable中,然后用include引用.就不翻译了. Includes are most useful if you have a section of code that you want to repeat multiple times in different places. You can just write the code once, put it inside a b:includable, then use b:include wherever you want it to appear. If you don’t need to do that, then you can just stick with the single main includable and not worry about the rest. (Note that the main includable is included automically – is unnecessary.)

Data

data:标签大概是最为重要的一个标签了,因为它是获取一切事实数据的途径,一些例子如下:

<data:title/>

or

<data:photo.url/>

这个例子非常简单,他能够在几乎所有的widget中起作用,因为大多数widget有title.上面的例子就是打印出widget的title.第二个例子是一个较为复杂的变量,获取photo的url.

有很多data你能够通过data:标签来获取,查阅 comprehensive list 查询需要的data,一些data只能在特定的widget中使用.

Loops

b:loop 标签让你重复使用section中内容.通常用在打印给定的一系列post,或者每一条留言,或者每一个label,等等.通常用法,像这样:

<b:loop var='identifier' values='set-of-data'>
   [repeated content goes here]
</b:loop>
  • identifier 可以选用任何名字,用来代表list中每一个item.可以简单的设定为”i”.
  • set-of-data 可以是在 data tags article中定义的任何一系列data

例如,在blog post widget中, posts是一个list,下面的代码是遍历每一个post,打印出每一个的标题title

<b:loop var='i' values='data:posts'>
   <h2><data:i.title/></h2>
</b:loop>

注意,”i”是每一个post,在循环中使用i获取每一个post的title

if / Else

if/else像很多编程语言一样,条件判断,这里是选择哪些显示和哪些不显示.通常如下:

<b:if cond='condition'> 
   [content to display if condition is true]
<b:else/>
   [content to display if condition is false]
</b:if>

b:else tag是可省略的. 而</b:if>是不可省略的. 如果没有else子句,那么只有满足if条件才会执行if子句中代码,不然什么都不执行

条件语句中你可以放置任何结果是true或者false的语句,有一些data本身就表示true/false,像post中allowComments.其他data,你可以用来比较得到结果.一些例子:

<b:if cond='data:post.showBacklinks'> True if the current post is set to show backlinks.
<b:if cond='data:blog.pageType == "item"'> True if the current page is an item page (post page).
<b:if cond='data:displayname != "Fred"'> True if this is not Fred's display name.
<b:if cond='data:post.numComments > 1'> True if the current post has more than one comment.

翻译自:Blogger Help Widget Tags for Layouts


2014-02-04 Google , Blogger , Knowledge

HAProxy 转发 shadowsocks

HAProxy is free, open source software that provides a high availability load balancer and proxy server for TCP and HTTP-based applications that spreads requests across multiple servers. It is written in C and has a reputation for being fast and efficient.

简单的来说 HAProxy 就是一个负载均衡,TCP 和 HTTP 的代理程序,开源,高可用,C 写成。他原本的作用是将前端的大量流量分发到后端的服务器中,用于负载特别大的 WEB 网站的,这里被大材小用了。

使用 HAProxy 中转 SS 流量至少需要两台 VPS,国内一台,国外一台,SS 客户端直接连国内的 VPS,而通过国内的 VPS 转发流量到国外的 VPS 上。

安装

sudo apt install -y haproxy

配置

HAProxy 的配置文件在 /etc/haproxy/haproxy.cfg 下:

global
    ulimit-n  51200

defaults
    log global
    mode    tcp
    option  dontlognull
        timeout connect 5000
        timeout client  50000
        timeout server  50000

frontend ss-in
    bind *:8888
    default_backend ss-out

backend ss-out
    server server1 [VPS]:8888 maxconn 20480

主要的配置就是 frontendbackend,也很好理解,将入站的 8888 端口中的流量转发到 VPS 的 8888 端口。然后重启 HAProxy 即可

sudo /etc/init.d/haproxy restart

启动之后,本地的 SS 客户端直接连国内的 IP 即可,需要注意的是配置用的是 ssserver 的配置。

reference


2014-02-03 haproxy , shadowsocks , ss , tcp , load-balancer , proxy-server , proxy

Linux Mint 下开机自启动应用

在 Cinnamon 桌面环境下有一个开机启动应用的管理程序叫做 startup applications,用该程序来管理开机启动应用是非常方便的。更准确的来说应该是 login 到桌面环境中启动的应用程序管理。

使用

命令行是

cinnamon-settings startup

同样在 gnome 的桌面环境下也有一个相似的 gnome-session-properties 但是这个应用没有 Cinnamon 提供的方便友好,一个很大的差别就是 Cinnamon 提供的 startup 工具允许用户直接选择已经安装的应用,而 gnome 提供的只允许用户自己选择执行脚本(命令),自己选择图标,标题等等。Cinnamon 帮我们做了很多友好的工作。

实际上所有开机自启动的配置都在 ~/.config/autostart 目录中,每一个启动项都以自己名字开头,叫做 goldendict.desktop 这样的名字,包含如下内容。

[Desktop Entry]
Type=Application
Terminal=false
Categories=Office;Dictionary;Education;Qt
Name=GoldenDict
GenericName=Multiformat Dictionary
Comment=GoldenDict
Encoding=UTF-8
Icon=goldendict
Exec=goldendict
X-GNOME-Autostart-enabled=true
NoDisplay=false
Hidden=false
Name[en_US]=GoldenDict
Comment[en_US]=GoldenDict
X-GNOME-Autostart-Delay=100

其中定义了常见的配置,包括启动命令,图标,名字等等。

reference


2014-02-02 linux , linux-mint , cinnamon , startup , application

manual guide tutorial 区别

manual 一般翻译为手册,指南。通常是制造商提供的一份详细的操作指示,更具体来说一般为官方提供的。

guide 向导,指南。是一个比较宽泛的词,鉴于 manual 可能是一份文档,游戏的小册子,或者更加复杂的汽车的手册,但是 guide 可能就是一个卡片,或者介绍的视频。guide 可能是一个比较细节的说明,但也可能是一个简单的介绍或者说明。

tutorial 通常翻译为教程,通常是针对无经验的初学者提供 step-by-step 每一步详细的说明。

cookbook 直译是食谱,在 鉴别 Mastering Cookbook xxx in Action 系列图书 文章中就已经解释了,通常指的是比较实用的一些用例。

reference 一般译作参考,引用,这个 reference 倒是不会产生什么歧义。我的文章中也经常使用。

reference


2014-02-01 document , guide , difference

Java 查漏补缺之:赋值语句的返回值

在看 JDK 源码 HashMap 时发现在 put 方法实现过程中使用了下面的语句

if ((tab = table) == null || (n = tab.length) == 0)
    n = (tab = resize()).length;

能够看到在判断语句中使用了赋值语句的结果来和 null 和 0 比较,再比如读写文件时会有

while ((line = reader.readLine()) != null) {
    out.append(line);
}

就能发现 Java 中的赋值语句是有返回值的,并且也不是简单的 boolean 。事实上赋值语句返回的是左侧变量的引用值,也就是右侧的结果

@Test
public void testAssignment() {
    int i;
    System.out.println(i=0);
    System.out.println(i=1);
}

输出分别是 0 和 1.


2014-01-20 java , jdk , programming

电子书

最近文章

  • Linux 下使用 emoji Ubuntu 或者其他一些 Linux 发行版会内置 Google Noto Color emoji font
  • 理解 GraphQL Schema 结构定义 在上一篇 GraphQL 使用 中了解了 GraphQL 大致用法,如果要更加深入的了解 GraphQL ,那就不得不重新从 Schema 来认识 GraphQL,说到底 GraphQL 还是一个强类型定义,客户端可操作的类型都是需要提前定义好的,这个结构就是这篇文章的重点 Schema.
  • 从 MySQL 迁移到 PostgreSQL 方案调研 之前的文章 PostgreSQL 初识 和 PostgreSQL 数据类型 大致的把 PostgreSQL 了解了一下,那么接下来就是真正地把它用起来。
  • GraphQL 使用 很多人都知道 GraphQL 起源于 Facebook,但是似乎很少中文材料提到 GraphQL 出现的契机,我在看完这个纪录片 之后才对 GraphQL 的出现有更加深刻的了解。都知道当年 Facebook 的移动客户端都是网页,随着移动互联网发展,Facebook 网页实现的客户端性能和体验受到非常严重的影响,所以后来不得不去做原生的应用。那么这个时候就遇到了一个问题,原来直接使用网页,那么不同客户端用的接口都是给网页用的,最多做一下屏幕的适配,但是如果使用原生的应用,那么必然会需要设计不同的 API,而 Facebook 的工程师发现,对于复杂的 Feed 流,评论等等,用 RESTful 接口将是一个灾难,所以一帮人开始设计一种查询语言,这就是后来的 GraphQL。也应该纠正一下 Facebook 那帮工程师,只是开源了一份设计和一份实现,但他们万万没有想到开源社区的力量,就像片中 Nick Schrock 说的那样,他低估了社区的力量,在短短的几个月,几年时间中,GraphQL 就已经有了非常多语言的支持,周边应用也非常丰富。原来在脑海里的想法,都没有到生产环境中用过,就这样在所有社区的人的努力下成为了改变这个行业的一部分。
  • Drools : Guided Decision Table Column