• vim树形目录插件NERDTree

    开始

    • 打开vim
    • 输入:NERDTRee,回车打开Tree
    • ctrl+w+h/l在左右侧窗口间切换光标,多次ctrl+w效果相同
    • ? 打开或关闭帮助文档
    • CD切换根目录
    • u返回上一层根目录
    • :q关闭窗口

    命令

    • :NERDTreed [start-directory] 打开NERDTree
    • :NERDTreeClose 关闭目录树

    快捷键

    • o 打开文件,目录,书签
    • go 打开选择的文件,但不移动光标
    • t 在新的tab中打开节点和书签
    • T 同上,但是停留在当前tab中
    • i 在分割的窗口中打开文件
    • gi 同上,但光标仍留在树中
    • s 在新的vsplit打开文件
    • gs 同上, 但光标仍留在树中.
    • O 递归打开选择的目录
    • x 收缩当前节点的父节点.
    • X 收缩当前节点的所有子节点
    • e 编辑当前目录
    • D 删除当前书签
    • P 跳到根节点
    • P 跳到当前节点的父节点
    • J, K 当前树深度上下跳转
    • C-J, C-K 当前目录相邻目录的上下跳转
    • C 改变树的根为所选择的目录
    • u 根的上一层目录为树的根
    • U 同上, 但旧的根目录仍保持打开
    • r 递归更新当前目录
    • R 递归更新当前根
    • cd 改变CWD为所选择节点的目录
    • CD 改变CWD为树根所在目录
    • I 切换模式, 表示隐藏文件是否可见.
    • f 切换模式, 表示是否使用文件过滤器
    • F 切换模式, 表示文件是否可见
    • B 切换模式, 表示书签表格是否可见

    鼠标

    • 双击同 o
    • 中键单击, 文件同 i, 目录同 e

    来源http://www.cnblogs.com/summericeyl/p/350247

  • web路径解析三种方式

    路径解析经过三个阶段:

    文件路径

    静态文件与网站目录结构一致,动态文件也是根文件路径执行脚本,比如/index.asp

    MVC

    java中的struts就是典型的MVC模式,将url映射到控制器,调用服务操作数据,再返回结果. 操作的行为主要是用post和get请取方法.

    restful

    目前最流程的就是restful,restful全称是Representational State Transfer表现层状态转换
    它将服务器端提供的内容实体看作资源,并表现在url上, 对资源的操作体现在http方法上, 资源的类型体现在请求字段Accept和响应字段Content-Type上

    在MVC中,主要使用post和get请取方法,增删操作表现在url上

    POST /user/add?username=jacksontian
    GET  /user/remove?username=jacksontian
    POST /user/update?username=jacksontian
    GET  /user/get?username=jacksontian
    

    在restful中

    POST   /user/jacksontian   增加
    DELETE /user/jacksontian   删除
    PUT    /user/jacksontian   更新
    GET    /user/jacksontian   查询
    
  • 理解svg中画箭头代码[viewbox,refX,refY]

    常见示例

    最常见的在线条上画箭头代码

    <svg>
        <!-- 预定义marker-->
        <defs>
            <marker id="arrow" refX="0" refY="3" markerWidth="20" markerHeight="20" orient="auto">
                <path d="M0 0 L0 6 L10 3" style="fill: #ffff;"></path>
            </marker>
        </marker>
        </defs>
        <!-- 引用预定义的marker -->
        <line class="link" marker-end="url(#arrow)" x1="0" y1="0" x2="80" y2="80"></line>
    </svg>
    
    

    先预定义了一个箭头形状的marker,然后画了一条线,并且将预定义的marker标到线条末端.

    画出的图形

    实现方法是用path画一个三角形并填充到marker中,形成三角marker,之所以用marker是因为,只有marker才能标到其它图形上. 但是marker是怎样被标记线条末端的?在marker中有refX、refY作用就是用来指定线条末点连接到marker上的位置. 连接上后,箭头指向哪边?orient属性则指定marker的方向.

    如何为marker中坐标取值

    首先marker与包含的path共用一个坐标系,如果坐标值不对则会显示不全.
    比如上面marker的显示范围是(0,0)到(20, 20), path的范围是(0,0)到(10,6),可知道path完全处在marker的显示区域内,因此path可以全部显示.

    如果需改path值,path显示范围为(0,-3)到(10,3),有一半内容在marker显示区域外,我们看到的就是半个三角形。设置坐标时要知道marker与path是共用同一个坐标系,path坐标不是相对于marker,注意path要在marker的可视范围内

    <svg>
        <!-- 预定义marker-->
        <defs>
            <marker id="arrow" refX="0" refY="0" markerWidth="20" markerHeight="20" orient="auto">
                <path d="M0 -3 L0 3 L10 0" style="fill: #ffff;"></path>
            </marker>
        </marker>
        </defs>
        <!-- 引用预定义的marker -->
        <line class="link" marker-end="url(#arrow)" x1="0" y1="0" x2="80" y2="80"></line>
    </svg>
    

    如下

    理解marker的viewBox属性

    用法viewBox(xmin, ymin, width, height)

    查看文档可知道viewBox作用是拉伸图形。它是如何控制拉伸的?要想拉伸的话,指定长宽比例就可以了,怎么会用到xmin, ymin, width, height这些值,它们是和拉伸有什么关系?怎么理解?

    实际上拉伸只是它的一个功能,换一种叫法就很好理解: 取景框. 它使用xmin,ymin,width,height这些参数确定取景范围,然后将取到的景象,放到marker中,并且充满整个marker. 如果取到的景象比marker可视范围小,则景象会被放大再充满marker;如果取到的景象比marker可视范围大,怎取景会被缩小再充满marker. 所以viewbox有两个功能:一是填充功能;二是拉伸.

    比如上面只显示半个三角形,可以通过设置viewbox让它,在marker中完整显示.

    <svg>
        <!-- 预定义marker-->
        <defs>
            <marker id="arrow" refX="0" refY="0" markerWidth="20" markerHeight="20" orient="auto" viewBox="0, -3, 10, 6" >
                <path d="M0 -3 L0 3 L10 0" style="fill: #ffff;"></path>
            </marker>
        </marker>
        </defs>
        <!-- 引用预定义的marker -->
        <line class="link" marker-end="url(#arrow)" x1="0" y1="0" x2="80" y2="80"></line>
    </svg>
    

    上面viewBox控制了取景范围,正好将整个三角形取出来,再放入长20宽20的marker中,因为viewbox取到的景象长为10宽为6,小于marker大小,要想让三角形充满,则要放大景象,放大的比例长为20/10,宽为20/6.

    显示结果

  • web前端开发包管理器bower[笔记]

    Bower是用于web前端开发的包管理器。对于前端包管理方面的问题,它提供了一套通用、客观的解决方案。它通过一个API暴露包之间的依赖模型,这样更利于使用更合适的构建工具。Bower没有系统级的依赖,在不同app之间也不互相依赖,依赖树是扁平的。
    Bower运行在Git之上,它将所有包都视作一个黑盒子。任何类型的资源文件都可以打包为一个模块,并且可以使用任何规范(例如:AMD、CommonJS等)。

    安装

    #安装bower
    npm install -g bower
    

    基本用法

    #安装包
    bower install jqeury
    #指定版本
    bower install jquery#1.10.3
    #查找包
    bower search jquery
    #卸载包
    bower install jqeury
    

    使用包

    <script src="/bower_components/jquery/index.js"></script>
    

    配置

    配置文件.bowerrc

    {
      "directory" : "components", #指定安装路径
      "json"      : "bower.json",
      "endpoint"  : "https://Bower.herokuapp.com",
      "searchpath"  : "",
      "shorthand_resolver" : ""
    }
    
  • linux与linux之间共享目录

    简述

    在linux与windows之间共享目录使用smbfs. 但是在linux与linux之间共享目录要用nfs(Network File System网络文件系统). 服务端用nfs提供共享目录服务,客户端通过mount将共享目录挂载到本地.

    以fedora 20设置共享目录为例

    • 安装nfs fedora 20要安装以下两个包
    [wyq@localhost ~]$ rpm -qa |grep nfs
    libnfsidmap-0.25-8.fc20.x86_64
    nfs-utils-1.3.0-2.1.fc20.x86_64
    
    • 配置共享目录 在/etc/exports文件中添加以下内容
    /home/wyq/share  192.* (insecure,rw,sync,no_root_squash)
    
    • 设置防火墙,允许nfs服务 输入sudo firewall-config打开防火墙配置界面,选中nfs服务
    <img src="/2014-06-19-linux.png" width="800" hight="350"/>
    
    • 启动nfs服务
    sudo service nfs start
    
    • 挂载目录
    sudo mount -t nfs 127.0.0.1:/home/wyq/share /home/wyq/mount
    
    • 取消挂载
    umount /home/wyq/mount
    

    exports配置文件说明

    /home/wyq/share 共享的目录
    192.* 允许访问的主机IP, 如果不能确定 ,请使用 *(在fedora 20实验中表示任意IP时,不用加星号,否则nfs会无法启动)
    insecure 一个安全选项, 如果nfs服务端口号小于1024则可以不添加这个选项, 否则不添加的话, 是无法访问的.其他主机访问的话就会被拒绝.
    rw 共享目录的权限,rw 是可读写的权限,只读的权限是ro.
    sync 同步的选项, 可选的还有 async. sync是不使用缓存,随时写入同步, async是使用缓存的.
    no_root_squash NFS服务共享的目录的属性, 如果用户是root, 那么对这个目录就有root的权限.

    启动nfs失败示例

    • 启动nfs时提示失败
    [wyq@localhost workspace]$ sudo service nfs start
    Redirecting to /bin/systemctl start  nfs.service
    Job for nfs-server.service failed. See 'systemctl status nfs-server.service' and 'journalctl -xn' for details.
    
    • 根据提示查看错误信息
    [wyq@localhost workspace]$ sudo systemctl status nfs-server.service
    nfs-server.service - NFS Server
       Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled)
       Active: failed (Result: exit-code) since 四 2014-06-19 22:20:37 CST; 5s ago
      Process: 4984 ExecStopPost=/usr/sbin/exportfs -f (code=exited, status=0/SUCCESS)
      Process: 4980 ExecStop=/usr/sbin/rpc.nfsd 0 (code=exited, status=0/SUCCESS)
      Process: 3778 ExecStartPost=/usr/libexec/nfs-utils/scripts/nfs-server.postconfig (code=exited, status=0/SUCCESS)
      Process: 3761 ExecStart=/usr/sbin/rpc.nfsd $RPCNFSDARGS $RPCNFSDCOUNT (code=exited, status=0/SUCCESS)
      Process: 5371 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=1/FAILURE)
      Process: 5369 ExecStartPre=/usr/libexec/nfs-utils/scripts/nfs-server.preconfig (code=exited, status=0/SUCCESS)
     Main PID: 3761 (code=exited, status=0/SUCCESS)
    
    6月 19 22:20:37 localhost.localdomain systemd[1]: Starting NFS Server...
    6月 19 22:20:37 localhost.localdomain exportfs[5371]: exportfs: No options for /home/wyq/share *: suggest *(sync) to avoid warning
    6月 19 22:20:37 localhost.localdomain exportfs[5371]: exportfs: No host name given with /home/wyq/share (insecure,rw,sync,no_root_squash), suggest *(insecure,rw,sync,no_root_squash) to avoid warning
    6月 19 22:20:37 localhost.localdomain exportfs[5371]: exportfs: incompatible duplicated export entries:
    6月 19 22:20:37 localhost.localdomain exportfs[5371]: exportfs:         *:/home/wyq/share (0x422) [IGNORED]
    6月 19 22:20:37 localhost.localdomain exportfs[5371]: exportfs:         *:/home/wyq/share (0x425)
    6月 19 22:20:37 localhost.localdomain systemd[1]: nfs-server.service: control process exited, code=exited status=1
    6月 19 22:20:37 localhost.localdomain systemd[1]: Failed to start NFS Server.
    6月 19 22:20:37 localhost.localdomain systemd[1]: Unit nfs-server.service entered failed state.
    

    注意到信息中"exportfs: incompatible duplicated export entries:" 意思是有重复配置

    • 查看配置文件/etc/exports, 内容如下
    /home/wyq/share  *  (insecure,rw,sync,no_root_squash)
    
    • 猜测是配置错误导致nfs无法启动 将配置更改为以下几种,逐一尝试 第一种
    /home/wyq/share  192.*  (insecure,rw,sync,no_root_squash)
    

    第二种

    /home/wyq/share  (insecure,rw,sync,no_root_squash)
    

    发现使用以上两种方式的配置,nfs均能正常启动并且被挂载.

    • 结论 在fedora 20的nfs配置文件/etc/exports中,如果想让任意主机访问共享目录,不需要用*表示,不填即表示任意主机.
  • postgres复制表结构

    复制表结构 sql create table his_process_data_201405 as ( select * from his_process_data_201406 limit 0)

    完整复制一张表

    create table his_process_data_201405 as
    ( select * from his_process_data_201406)
    
  • 局域网如何访问外网

    通常一台主机拥有外网地址,根据网络协议很容易理解,通信的过程.

    如果主机拥有的是局域网IP地址,该如何理解?
    比如:常见的一种情况,主机地址是192.168.1.100,连接着一个路由器,路由器通过拨号上网(拥有临时外网IP). 这种情况下局域网主机, 如何访问外网主机(比如www.baidu.com), 根据网络协议似乎很难理解两者是如何通信的?

    答案是: 网络地址转换(NAT),将私有地址转化为合法IP地址。

    当主机192.168.1.100向外网主机发送数据,在通过个人路由器时,路由器会修改IP报文,将IP和端口替换为它的外网IP和随机分配的端口,并且将修改前后的信息作为映射关系保存起来, 再将IP报文转发出去. 当外网主机返回信息时,先被路由器接收到,路由器再根据发送数据时保存的映射关系,将数据发送给内网主机.

  • ssh登陆提示Too many authentication failures for wyq

    碰到使用ssh登陆,直接出现认证失败次数太多的问题.

    在自己机器上模拟了下面测试.

    ssh登陆系统,未输入密码就提示认证失败

    [wyq@localhost ~]$ ssh wyq@192.168.1.107
    Received disconnect from 192.168.1.107: 2: Too many authentication failures for wyq
    

    查看/etc/sshd/sshd_config尝试认证次数

    MaxAuthTries 1
    

    最大认证次数为1,为什么还没有输入密码就已经提示 Too many authentication failures ?

    开启ssh的debug模式

    [wyq@localhost ~]$ ssh -v wyq@192.168.1.107
    OpenSSH_6.4, OpenSSL 1.0.1e-fips 11 Feb 2013
    debug1: Reading configuration data /home/wyq/.ssh/config
    debug1: Reading configuration data /etc/ssh/ssh_config
    debug1: /etc/ssh/ssh_config line 51: Applying options for *
    debug1: Connecting to 192.168.1.107 [192.168.1.107] port 22.
    debug1: Connection established.
    debug1: identity file /home/wyq/.ssh/id_rsa type 1
    debug1: identity file /home/wyq/.ssh/id_rsa-cert type -1
    debug1: identity file /home/wyq/.ssh/id_dsa type -1
    debug1: identity file /home/wyq/.ssh/id_dsa-cert type -1
    debug1: identity file /home/wyq/.ssh/id_ecdsa type -1
    debug1: identity file /home/wyq/.ssh/id_ecdsa-cert type -1
    debug1: Enabling compatibility mode for protocol 2.0
    debug1: Local version string SSH-2.0-OpenSSH_6.4
    debug1: Remote protocol version 2.0, remote software version OpenSSH_6.4
    debug1: match: OpenSSH_6.4 pat OpenSSH*
    debug1: SSH2_MSG_KEXINIT sent
    debug1: SSH2_MSG_KEXINIT received
    debug1: kex: server->client aes128-ctr hmac-md5-etm@openssh.com none
    debug1: kex: client->server aes128-ctr hmac-md5-etm@openssh.com none
    debug1: sending SSH2_MSG_KEX_ECDH_INIT
    debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
    debug1: Server host key: ECDSA 66:29:e1:f3:32:92:64:da:98:bc:ab:f8:9c:a4:63:02
    debug1: Host '192.168.1.107' is known and matches the ECDSA host key.
    debug1: Found key in /home/wyq/.ssh/known_hosts:21
    debug1: ssh_ecdsa_verify: signature correct
    debug1: SSH2_MSG_NEWKEYS sent
    debug1: expecting SSH2_MSG_NEWKEYS
    debug1: SSH2_MSG_NEWKEYS received
    debug1: Roaming not allowed by server
    debug1: SSH2_MSG_SERVICE_REQUEST sent
    debug1: SSH2_MSG_SERVICE_ACCEPT received
    debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
    debug1: Next authentication method: gssapi-keyex
    debug1: No valid Key exchange context
    debug1: Next authentication method: gssapi-with-mic
    debug1: Unspecified GSS failure.  Minor code may provide more information
    Cannot determine realm for numeric host address
    
    debug1: Unspecified GSS failure.  Minor code may provide more information
    Cannot determine realm for numeric host address
    
    debug1: Unspecified GSS failure.  Minor code may provide more information
    
    
    debug1: Unspecified GSS failure.  Minor code may provide more information
    Cannot determine realm for numeric host address
    
    debug1: Next authentication method: publickey
    debug1: Offering RSA public key: /home/wyq/.ssh/id_rsa
    debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
    debug1: Trying private key: /home/wyq/.ssh/id_dsa
    debug1: Trying private key: /home/wyq/.ssh/id_ecdsa
    debug1: Next authentication method: password
    wyq@192.168.1.107's password:
    

    发现在提示输入密码前它已经进行了几次验证

    debug1: Next authentication method: gssapi-keyex
    debug1: Next authentication method: gssapi-with-mic
    debug1: Next authentication method: publickey
    debug1: Next authentication method: password
    

    原来在密码认证之前,ssh已经进行了几种认证.
    应该是他们导致的,具体原因就不是很清楚.

    还有一个问题就是MaxAuthTries值再大,也只能输入三次密码.
    这个问题也很疑惑的.

    挺奇怪的,管理人员怎么喜欢修改MaxAuthTries的值?
    ssh登陆密码输入错误,被中断后,别人再ssh不行吗?
    默认值很合理的,完全没有必要修改.

  • cnpm包管理工具

    通常的包管理工具是npm,npm使用的镜像源在国外,经常被gfw屏蔽掉.
    发现另一个包管理工具cnpm,可以正常使用.

    • 安装cnpm
    npm install -g cnpm --registry=http://r.cnpmjs.org
    
    • 使用
    cnpm install package
    

    用法与npm一样

  • npm无反应

    通过npm安装node包时,发现卡住了,没有反应

    查找原因

    加上参数-verbose,查看详细信息
    发现卡在下面这个地方

    npm http GET https://registry.npmjs.org/express
    npm info retry will retry, error on last attempt: Error: connect ETIMEDOUT
    

    通过提示知道应该是出现超时.

    解决方法

    最后找到,通过修改它的安装源,换成国内的http://registry.cnpmjs.org 即可.
    * config命令

    npm config set registry http://registry.cnpmjs.org
    npm info underscore
    
    • 命令行指定
    npm --registry http:/registry.cnpmjs.org install express
    

    修改~/.npmrc配置文件,加入以下内容

    registry = http://registry.cnpmjs.org
    

    cnpm

    更方便的方法是使用cnpm,安装后用法与npm一样

    sudo npm install -g cnpm --registry http://r.cnpmjs.org