svn 分支管理

参考

1. svn 初始目录结构

1
2
3
4
D:\pro-repo
├─branches
├─tags
└─trunk

如果没有对应的结构目录,可以使用以下命令来创建:

1
svn mkdir branches

2. branchs/tags 的建立

需求一:产品开发已经基本完成,并且通过很严格的测试,这时候我们就想发布给客户使用,发布我们的1.0版本:

1
svn copy svn://server/trunk svn://server/tags/release-1.0 -m "1.0 released"

需求二: 需要开发一个新的功能

1
svn copy svn://server/trunk svn://server/branches/fea-01 -m "新开分支开发01新需求"

咦,这个和branches有什么区别,好像啥区别也没有?
是的,branches和tags是一样的,都是目录,只是我们不会对这个release-1.0的tag做修改了,不再提交了,如果提交那么就是branches

需求三:有一天,突然在线上发现一个致命的bug,那么所有的branches一定也一样了,该怎么办?
首先我们是从线上发现的,那么我第一步先:

1
svn copy svn://server/tags/release-1.0 svn://server/branches/bugfix-01 -m "1.0 线上bug (copy from tags/release-1.0) "

然后我们拉去分支bugfix-01代码到本地,开发、测试,如果没有问题的话,合并分支到在生命周期的分支,这里是:branches/fea-01trunk/

1
2
3
$ svn -r 6:7 merge  https://orh-vm-pc/svn/test-tzbms/branches/bugfix-01 trunk # bug 合并至主干
$ svn -r 0:HEAD merge https://orh-vm-pc/svn/test-tzbms/trunk branches/fea-01 # 主干合并至需求分支
$ svn delete https://orh-vm-pc/svn/test-tzbms/branches/bugfix-01 -m "删除-bug-01"

新的bug产生时(上次升级没有打tag,直接取trunk):

1
2
3
4
5
6
7
$ svn copy https://orh-vm-pc/svn/test-tzbms/trunk https://orh-vm-pc/svn/test-tzbms/branches/bugfix-02 -m "1.0 线上bug (copy from trunk) "
$ cd trunk/
$ svn mergeinfo https://orh-vm-pc/svn/test-tzbms/branches/bugfix-02 --show-revs eligible # 查看Branch中那些改动还未合并
$ svn merge https://orh-vm-pc/svn/test-tzbms/branches/bugfix-02 # bug 合并至主干 (和上面的指定版本功能效果一样,这里省去了指定版本的麻烦)
$ svn mergeinfo https://orh-vm-pc/svn/test-tzbms/branches/bugfix-02 # 查看当前Branch中已经有那些改动已经被合并到Trunk中
$ cd ../branches/fea-01
$ svn merge https://orh-vm-pc/svn/test-tzbms/trunk # 主干合并至分支fea-01

合并后对 trunk 严格测试没问题的话,就可以发布release-1.1了。

3. 几个问题

1. 考虑到部署release时,每次都要打上tag,会略显繁琐, tags 不一定非得有,也就是上面用trunk作为线上分支

2. 上面有提到在生命周期的分支,这是为了强调branchs下的分支尽可能缩短其生命周期,因为在生命周期的分支都得维护,线上bug、其他分支新功能这些代码所有修改都得合并入在生命周期的分支

在生命周期的分支,一般有:

1
2
3
4
5
6
7
trunk/

branches/fea-01
branches/fea-02
branches/fea-....

branches/bugfix-01

同时开发的需求fea-n可能有几个,bugfix线上bug通常就作为一个了。

3. 冲突解决

如果一个文件在两个分支上都被修改,那么合并两个分支时将可能发生冲突。

之所以说可能发生冲突,是因为如果两个分支修改的文件明显不同,merge会自动的帮我们处理好。比如一端对文件第一行修改了内容,一端对文件增加了一行内容这种情况。

当文件发生冲突时可以有以下方式来处理:

工具设置

我们可以使用TortoiseSVN设置下对比工具来方便我们compare和merge,比如BeyondCompare

操作步骤:项目目录-右键 —> TortoiseSVN —> Settings —> Diff Viewer
Diff-tool-set
其中代码:

1
2
"D:\tools\BeyondCompare\Beyond Compare\BCompare.exe" %base %mine /title1=%bname /title2=%yname /leftreadonly
"D:\tools\BeyondCompare\Beyond Compare\BCompare.exe"

合并工具设置:
merge-tool-set
其中代码:

1
"D:\tools\BeyondCompare\Beyond Compare\BCompare.exe"  %mine %theirs %base %merged /title1=%yname /title2=%tname /title3=%bname /title4=%mname

解决冲突

edit-conflict
merging
在上一步合并完后,就可以标记解决完冲突了:
resolve

#### 3. merge的几种方式及应用场景, 参考svn分支合并类型

3. merge 我使用merge的两种方式

  1. 指定分支地址,合并至当前目录:

    1
    2
    3
    4
    5
    6
    7
    # 将 `bug-01`分支 合并到 `trunk`
    $ cd trunk/
    $ svn merge https://server/svn/pro/branches/bug-01

    # 将 `trunk` 合并至 分支 `fea-01`
    $ cd ../branches/fea-01
    $ svn merge https://server/svn/pro/trunk
  2. 指定分支地址和版本,合并至指定分支目录:

    1
    2
    3
    4
    5
    # 将 bugfix-01 分支 合并至trunk
    $ svn -r 6:7 merge https://orh-vm-pc/svn/test-tzbms/branches/bugfix-01 trunk/

    # 强 trunk 合并至 需求分支
    $ svn -r 0:HEAD merge https://orh-vm-pc/svn/test-tzbms/trunk branches/fea-01

注意:

  1. 以上的svn copy -m "comment"命令会直接发给服务端执行,也就是说操作即时生效,无需手动commit,所以copy时最好加上-m 注释内容

  2. 一般分支分为两种:需求分支、bug修复分支(暂时撇开tags、trunk),一般约定其命名规则:fea-xxxbugfix-xxx,这其实都属于临时性分支,使用完应该删除(为了方便开发,不用每次签出新的bug分支,有时会把把bug作为一个长期性的分支,但要注意与trunk保持同步)。
    同名分支,重建(同名分支,前bug已经delete):

    1
    2
    3
    4
    5
    6
    $ svn copy https://orh-vm-pc/svn/test-tzbms/trunk https://orh-vm-pc/svn/test-tzbms/branches/bugfix-live -m "bug长期分支(完成后delete,需要时同名重建)"
    ... 修改、测试、合并后
    $ svn delete https://orh-vm-pc/svn/test-tzbms/branches/bugfix-live -m "bug长期分支(完成后delete,需要时同名重建)"
    ... 下次有新的bug时
    $ svn copy https://orh-vm-pc/svn/test-tzbms/trunk https://orh-vm-pc/svn/test-tzbms/branches/bugfix-live -m "bug长期分支(完成后delete,需要时同名重建)"
    ... 重复上面的步骤
  3. svn merge merge动作是在本地执行的,所以可以放心执行,如果有出现失误,不提交,使用$ svn revert . -R回滚工作区, 再重新merge分支即可。

  4. 合并前保证目标分支是clean的,不要忘记来源分支都提交了

  5. 合并完分之后,切记维护生命周期还未结束的分支。一般分支的合并都是基于trunk来交互的,这就是说的经常的与主干保持同步,比如有以下情况

    1. 新开分支解决了bug, 新的分支bug-02开发测试完,合入trunk。此时别的分支代码应该也是存在bug的,解决同样的bug我们当然不需要再在其他分支上手动去修复bug了,而是把trunk上的修改尽快merge到其他分支,有冲突就在此时解决,不然隔的时间长了,鬼还记得修改了什么。
    2. 新开分支完成了某个功能, 新的分支fea-02开发测试完,合入trunk。此时其他分支应尽快的与trunk同步,将trunk分支merge至其他分支,如果bug分支作为长期分支,也需要同步,否则bug分支应该已经delete掉了。

glossary-生词本

2017年10月

1
determine   确定;判断

2017年9月

1
2
3
4
5
6
7
8
9
biased      有偏见的;有偏的
coarsening 粗化;(使)变粗糙
elimination 消除;淘汰
adaptive 适应的;有适应能力的
spinning 使...旋转;纺纱
arrange 安排
threats 威胁
earnings 收益
emerged 出现

2017年8月

1
2
3
conventionality 惯例;习俗
barrier 屏障
etcetera 等等;etc

2017年7月

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
simulate    模拟
genuine 真正的
avoid 避免;避开
slight 轻微;略
aboundant 丰富
corresponds 对应
proving 证明
idempotent 幂等
resigned 辞职
painful 痛苦
implicit 含蓄;简化
injustice 不公平;冤屈
witness 目睹;见证
principals 身份
credentials 证书;凭证

2017年6月

1
2
3
4
5
6
celebrate   庆祝;歌颂
elixir 炼金药;长生不老药
briefly 简要的;略略
skeptics 怀疑者
strangers 陌生人;外人
exploration 勘探

2017年5月

1
2
3
4
5
6
7
8
9
10
paradigm    范例;模范
shortcuts 快捷键
consensus 共识;合意
majority 多数;成年
vote 投票;投票表决
hipster 潮人;(指衣服)低到臀部的
collaborator 协作者;合作者
elusive 难以捉摸的;不易记住的
sensitive 敏感的;易受影响的;
throttle 节流;减速

2017年4月

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
triangle    三角形;三人一组
supplementary 增补的;追加的
multilingual 使用多语言的
surrogate 代理;代表
brief 短暂的;简明的
desire 渴望;希望
innovation 改革;创新
undergraduate 大学生;本科
volunteer 志愿者;自愿的
sweep 打扫;清除
elapsed 过去;消逝
pursuit 追赶
finery 华丽;服饰
sneakers 运动鞋;球鞋
trouser 裤子
leather 皮革制品;皮的

2017年3月

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
candidate   候选;候选人
snippet 片段;小片
compete 竞争;竞赛
peek 偷看;窥视
trait 特性;少许
assembly 装配;集会
interrupt 打断;阻止
instead 代替;反而
inherently 本质上;固有地
illegal 非法的;违反规则的
segment 环节;部分
pessimistic 悲观的;厌世的
mutex 互斥
acquire 学到;获得
stamp 邮票;戳
volatile 易变的;不稳定的
reentrant 再进去
mutation 变异;变化
additional 额外的;附加的
spread 伸开;展开
combine 使结合;兼有
craft 手艺;诡计
behaviour 行为;举止

2017年2月

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
stage       舞台;阶段
pick 挑选;选中
omit 省略;删掉
severity 严重性
trivial 不重要的;琐屑的
critical 危急;关键
major 重大的;主要
minor 次要;二流的
clarity 清晰度
lack 缺乏;缺少
irrelevant 不相干;落后
shim 垫片
concrete 具体的
paragraph 段落
tidy 整洁的
messy 混乱的
accumulator 累加器
embed 嵌入
capability 能力;性能

2017年1月

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
primitive   原始的;原生的
explicitly 明确的
wildcard 通配符
investment 投资;投入
equity 公平;产权
venture 创业;风险
partner 伙伴;搭档
limited 限定;有限
improve 提高;改善
atomicity 原子性
consistency 一致性
principle 原则;原理
isolatioin 隔离;隔绝
durable 持久的;耐用的
lasting 持久;永久
partition 划分;分割
segregation 隔离
prevent 防止;预防
leak 泄漏;透露
least 最小
nested 嵌套
obtain 获得;得到
various 各种;各个

2016年

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
coercion    强迫;压迫
inherit 继承
introduction 介绍;引言
legacy 遗产
tutorial 教程;个别指导
syntax 语法;句法
recommended 推荐的
below 以下;下面
above 以上;上
integrate 整合
properly 正确的;适当的
following 以下
prepare 准备
hook 钩子
manipulation 操纵;伪造
centric 中心
specific 具体;特定
encounter 遭遇;面临
effects 影响
via 经过;通过
intentionally 故意地
stateless 无状态;无国籍
obfuscate 是模糊;使混乱
also 也
rely 依靠;依赖
incorporate 包含;合并
perhaps 也许(表示不确定)
analytics 分析
domestic 国内的;家庭的
manual 手册;手工
cause 原因;事业
external 外部的
terminated 终止
delimited 分隔;划界
coalesce 联合;合并
exact 精确;确切
enhanced 增强;提高
original 原始的
correct 正确的;更正
expect 预期
deferred 延期;推迟
optimized 优化的
structured 结构化的
handful 少数
visit 访问;参观
compatible 兼容
seveval 一些;几个
scene 场面;现场
launch 发射;发动
detect 发现
latency 潜伏;延迟
responder 响应者;应答器
scaffold 脚手架
draft 草稿;草案
landscape 景观;风景
asset 资产
blame 怪;责备
partial 部分
separate 分离
promote 促进;提升
demote 降级

其它

1
2
3
4
5
6
7
8
9
10
11
12
13
14
for demonstration purpose 为了演示(示范)的目的
think about 想一想;()
aka (also known as) 又名;也称为
CISC (Complex Instruction Set Computing) 复杂指令集;(如x86指令集)
RISC (Reduce Instruction Set Computing) 精简指令集;
in other words 换句话说
no longer 不再
such as 例如
table of contents 目录
getting started 入门;开始
should nerver 不应该
general purpose 一般用途;通用的
comes with 自带;配备
behind the scenes 幕后

clojure-flavored-javascript

Think about how we gonna implement the same thing if not using map

Programmer need to think about nearly every step the machine can understand.

UML类图

1. 类, 动物矩形框代表一个类(Class),类分为三层

  • 第一层显示类的名称,如果是抽象类,则用斜体表示
  • 第二层显示类的特性,通常是字段和属性
  • 第三层是累的操作,通常是方法和行为,注意前面的符号,+表示public-表示private#表示protected


2. 接口, 飞翔表示一个接口

  1. 第一种:

    • 第一行是接口名称,顶部有<<interface>>
    • 第二行是接口方法
  2. 另一种接口表示方法:

    • 棒棒糖表示法,就是唐老鸭实现了‘讲人话’接口


3. 继承

  • 空心三角 + 实线,鸟继承自动物


4. 实现接口

  • 空心三角 + 虚线, 大雁实线了飞翔接口


5. 关联关系

  • 实线箭头表示关联关系,企鹅要知道气候的变化


6. 聚合关系(Aggregation)

  • 空心菱形 + 实线箭头,大雁是群居动物,每只大雁都是属于一个雁群,一个雁群可以有多只大雁,所以他们就是聚合(Aggregation)关系。聚合表示一种弱‘拥有’关系,体现A对象可包含B对象,但B对象不是A对象的一部分。



7. 组合/合成关系(Composition)

  • 实心菱形 + 实线箭头组合关系是一种强拥有关系,体现了严格的部分和整体的关系。 鸟和其翅膀是组合关系,他们是部分和整体的关系,生命周期相同。连线两端的数字称为基数,表明这一端的类可以有几个实例。关联关系、聚合关系也可以有基数。


8. 依赖关系

  • 虚线箭头表示依赖关系,动物有新陈代谢、能繁殖的特征,需要依赖氧气、水等。所以动物依赖氧气和水。



PostgreSQL之psql的使用

psql 的使用

直接键入psql进入到命令行:

1
2
3
[postgres@localhost ~]$ psql 
psql (9.5.3)
Type "help" for help.

安装PostgreSQL数据库时,会建立一个与初始化数据库时的操作系统用户同名的数据库用户,同时这个用户是数据库超级用户,在这个OS用户下,登录是执行的操作系统认证,可以在pg_hba.conf下配置认证
psql命令格式:
psql -h <hostname or ip> -p <端口号> [数据库名称] [用户名称]
例:
pgsql -h 192.168.2.11 -p 5432 testdb postgres

查看有哪些数据库

1
2
3
[postgres@localhost ~]$ psql -l
#或者在进入了psql后,使用“\”开头调用psql命令
postgres-# \l

连接至某个数据库、查看有哪些表、查看表的结构:

1
2
3
postgres-# \c db_name
db_name-# \d
db_name-# \d table_name

为用户设置一个密码

1
postgres-# \password postgres

CentOS6.5.PostgreSQL源码编译安装

准备工作

postgresql官网:http://www.postgresql.org/
下载软件:https://ftp.postgresql.org/pub/source/v9.5.3/postgresql-9.5.3.tar.bz2

安装、环境变量配置

1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~]# ./configure --prefix=/usr/local/postgresql-9.5.3 --with-python --with-perl
[root@localhost ~]# make
[root@localhost ~]# make install
[root@localhost ~]# ln -sf /usr/local/postgresql-9.5.3 /usr/local/pgsql
[root@localhost ~]# export PATH=/usr/local/pgsql/bin:$PATH ## 设置可执行文件的路径
[root@localhost ~]# export LD_LIBRARY_PATH=/usr/local/pgsql/lib ##设置共享库的路径
## --with-perl 加上这个选项,才能使用perl语法的自定义函数,一般都需要。
## --with-python 同上。
## -s: symbole 软链接,-f: force 如果目标链接已经存在则删除重新建立
## 如果9.5.4的版本发布了,升级只需停掉数据库在这里改下软链接地址就可以了
## 可将上面的语句加入到系统环境或者用户环境变量的配置文件中

常见问题FAQ

源码安装一般会出现一些依赖包的问题,因为每个系统的已有环境都不太一样,下面我列出了我碰到的几种依赖的问题,可以参考解决:

1
2
3
4
5
6
[root@localhost ~]# yum install -y redline
[root@localhost ~]# yum install -y readline-devel
[root@localhost ~]# yum install -y zlib-devel
[root@localhost ~]# yum install -y perl-devel
[root@localhost ~]# yum install -y perl-ExtUtils-*
[root@localhost ~]# yum install -y python-devel

其实思路一般都是这样:

  1. 根据报错信息得到缺少的”软件包名“
  2. 检查下系统是否已经安装了这个“软件包名” rpm -qa|grep "软件包名"
  3. 上一步的结果如果是没有,则执行yum install 软件包名安装,如果有则一般代表需要安装他的开发包版本,则执行yum install 软件包名-devel
    当如在未安装前,你可以根据需要安装软件的文档先检查一遍系统的依赖。

数据库配置、初始

创建数据库簇

1
2
3
4
5
6
7
8
[root@localhost ~]# export PGDATA=/mnt/db/pgsql
[root@localhost ~]# groupadd postgres
[root@localhost ~]# useradd -g postgres postgres
[root@localhost ~]# chown -R postgres:postgres/mnt/db/pgsql
[root@localhost ~]# su -postgres
[postgres@localhost ~]$ initdb
## 为了系统安全,pgsql不允许使用root来初始化数据库,故新建postgres
## su 与 su - 是有区别的,su只是切换了用户的权限,su - 是切换了权限并且获取了对应用户的环境变量,上面的一些export 变量其实我们都可以防止到postgresql的用户环境变量下,方便使用postgres用户专门操作pgsql数据库

安装contrib下的工具

contrib 下面的工具比较实用,一般都会安装上。

1
2
3
4
[postgres@localhost ~]# exit ##退出postgresql 用户,使用root用户来编译安装
[root@localhost ~]# cd /usr/local/src/postgresql-9.2.4/contrib/
[root@localhost ~]# make
[root@localhost ~]# make install

启动和停止数据库

1
2
3
4
[root@localhost ~]# su - postgres## 编译安装完了后,到了日常的系统维护,就养成切换回专门的用户来操作吧
[postgres@localhost ~]$ pg_ctl start -D $PGDATA
[postgres@localhost ~]$ pg_ctl stop -D $PGDATA [-m SHUTDOWN-MODEL]
## SHUTDOWN-MODEL: smart 等待所有连接终止后关闭数据库; fast:快速关闭数据库,断开客户端连接,让已有事务回滚,相对于oracle的immediate; immediate: 立即关闭数据库,下次启动时进行恢复,相对于oracle 的abort模式; 这里oracle dba注意区别一下。

修改监听IP和端口

数据目录下编辑 postgresql.conf文件,找到如下内容:

1
2
#listen_address = 'localhost'
#port = 5432

其中listen_address表示监听的IP地址,默认是在“localhost”处监听,这会让远程主机无法登录这台数据库,可以修改成具体的内网地址,或者直接改成*,表示本地所有地址上监听。

参数port表示监听的数据库端口号,默认为5432。如果一台机器需要安装几个数据库实例,可以调整这里的端口。

修改这两个参数,需要重启数据库生效。

与数据库log相关的参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 日志的收集一般是打开的
logging_collector = on

# 日志的目录,一般默认即可
log_directory = 'pg_log'

# 日志的切换和覆盖可以使用以下几种方案

# 1. 每天生成一个新的日志文件
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_truncate_on_rotation = off
log_rotation_age = 1d

# 2. 每当写满一定大小(如10M),则切换一个日志
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_truncate_on_rotation = off
log_rotation_age = 0
log_rotation_size = 10M

# 保留7天的日志进行循环覆盖
log_filename = 'postgresql-%a.log'
log_truncate_on_rotation = on
log_rotation_age = 7d
log_rotation_size = 0

内存参数设置

PostgreSQL可以修改以下两个主要参数:

  • shared_buffers: 共享内存的大小,主要用于共享数据块
  • work_mem: 单个SQL执行时,排序、hash join 所使用的内存,SQL运行完后,内存就释放了。

javascript之apply与call方法

apply

作用:调用函数,并用指定对象替换函数的 this 值,同时用指定数组替换函数的参数。

语法:apply([thisArg [,argArray]])

参数:

  • thisArg: 可选,要用作this对象的对象。

  • argArray:可选,传递给函数的参数数组

例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function callMe(arg1, arg2) {
var s = '';

s += 'this value: ' + this;
s += '\n';
for (i in callMe.arguments) {
s += 'arguments: ' + callMe.arguments[i];
s += '\n';
}
return s;
}

console.log('Original function: ')
console.log(callMe(1, 2));

console.log('Function called with apply:')
console.log(callMe.apply('otherObj', [4, 5]));

// Output:
// Original function:
// this value: [object Window]
// arguments: 1
// arguments: 2

// Function called with apply:
// this value: otherObj
// arguments: 4
// arguments: 5

call

作用:调用一个对象的方法,用另一个对象替换当前对象。

语法:call([thisObj[, arg1[, arg2[, [, argN]]]]])

参数:

  • thisObj: 可选。将作为当前对象使用的对象。
  • arg1, arg2, , argN: 可选。将被传递到该方法的参数列表。

例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
function callMe(arg1, arg2) {
var s = '';

s += 'this value:' + this;
s += '\n';
for (i in callMe.arguments) {
s += 'arguments:' + callMe.arguments[i];
s += '\n';
}
return s;
}

console.log('Original function: \n');
console.log(callMe(1, 2));
console.log('\n');

console.log('Function called with call: \n');
console.log(callMe.call(3, 4, 5));

// Output:
// Original function:
// this value: [object Window]
// arguments: 1
// arguments: 2

// Function called with call:
// this value: 3
// arguments: 4
// arguments: 5

javascript之Bind方法

作用:对于给定函数,创建具有与原始函数相同的主体的绑定函数。在绑定函数中,this 对象将解析为传入的对象。绑定函数具有指定的初始参数。

语法:function.bind(thisArg[,arg1[,arg2[,argN]]])

例1:注意checkNumericRange后面不要使用箭头函数的方式,因为this在箭头函数内已经绑定作用域了,同样call()apply()在执行箭头函数会忽略传入的第一参数,无法对this进行绑定

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var checkNumericRange = function(value) {
if (typeof value !== 'number') {
return false;
} else {
return value >= this.minnum && value <= this.maxnum;
}
};

var range = { minnum: 10, maxnum: 20 };

var boundCheckNumericRange = checkNumericRange.bind(range);

console.log(boundCheckNumericRange(12)); // true
console.log(boundCheckNumericRange(21)); // false

例2:下面例子中this与包含原始原始方法的对象不同

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var originalObject = {
minnum: 50,
maxnum: 100,
checkNumericRange: function (value) {
console.log('This is me?', originalObject === this); // originalobject is true, bind method is false

if (typeof value !== 'number') {
return false;
} else {
return value >= this.minnum && value <= this.maxnum;
}
}
};

console.log(originalObject.checkNumericRange(10)); // false (compare with originalobject)

var range = { minnum: 10, maxnum: 20 };

var boundObjectWithRange = originalObject.checkNumericRange.bind(range);

console.log(boundObjectWithRange(10)); // true (expect)

例3:下面的例子演示如何使用arg1[arg2, [argN]]

1
2
3
4
5
6
7
8
9
var displayArgs = function (val1, val2, val3, val4) {
console.log(val1 + ' ' + val2 + ' ' + val3 + ' ' + val4);
};

var emptyObject = {};

var displayArgs2 = displayArgs.bind(emptyObject, 12, 'a');

displayArgs2('b', 'c'); // Output: 12 a b c

centos6.5-x64.subversion安装文档

一、准备安装包

一共5个包,下面的都可以点击链接直接下载,都是当下(2016年6月3日)最新版本,提供了具体来源的下载页,如有版本控可到提供的下载页下载最新包。

二、安装

我把上面下载的包都放置到了目录: ~/svn-install,如有目录差别,自行调整。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@localhost svn-install]# tar -jxvf subversion-1.9.4.tar.bz2 -C /usr/local/src/
[root@localhost svn-install]# tar -jxvf apr-1.5.2.tar.bz2 -C /usr/local/src/
[root@localhost svn-install]# tar -jxvf apr-util-1.5.4.tar.bz2 -C /usr/local/src/
[root@localhost svn-install]# tar -xvf zlib-1.2.8.tar.xz -C /usr/local/src/
[root@localhost svn-install]# unzip sqlite-amalgamation-3130000.zip -d /usr/local/src/subversion-1.9.4/
[root@localhost svn-install]# cd /usr/local/src/subversion-1.9.4/
[root@localhost subversion-1.9.4]# mv sqlite-amalgamation-3130000 sqlite-amalgamation
[root@localhost subversion-1.9.4]# cd /usr/local/src/apr-1.5.2/
[root@localhost apr-1.5.2]# ./configure --prefix=/usr/local/apr-1.5.2/
[root@localhost apr-1.5.2]# make && make install
[root@localhost apr-1.5.2]# cd /usr/local/src/apr-util-1.5.4/
[root@localhost apr-util-1.5.4]# ./configure --prefix=/usr/local/apr-util-1.5.4/ --with-apr=/usr/local/apr-1.5.2/
[root@localhost apr-util-1.5.4]# make && make install
[root@localhost apr-util-1.5.4]# cd /usr/local/src/zlib-1.2.8/
[root@localhost zlib-1.2.8]# ./configure --prefix=/usr/local/zlib-1.2.8/
[root@localhost zlib-1.2.8]# make && make install
[root@localhost zlib-1.2.8]# cd /usr/local/src/subversion-1.9.4/
[root@localhost subversion-1.9.4]# ./configure --prefix=/usr/local/subversioni-1.9.4 --with-apr=/usr/local/apr-1.5.2/ --with-apr-util=/usr/local/apr-util-1.5.4/ --with-zlib=/usr/local/zlib-1.2.8/
[root@localhost subversion-1.9.4]# make
[root@localhost subversion-1.9.4]# make install

三、配置

1. 创建svn仓库

svnadmin create /mnt/svn/repos

2. 仓库权限用户配置

  1. 用户配置 passwd文件

    1
    2
    3
    4
    [root@localhost conf]# vim passwd 
    [users]
    peter=123456
    john=112233
  2. 权限配置authz文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    [root@localhost conf]# vim authz 
    [aliases]
    # joe = /C=XZ/ST=Dessert/L=Snake City/O=Snake Oil, Ltd./OU=Research Institute/CN=Joe Average

    [groups]
    # harry_and_sally = harry,sally

    # [/foo/bar]
    # harry = rw
    # &joe = r
    # * =

    # [repository:/baz/fuz]
    # @harry_and_sally = rw
    # * = r
    [/]
    peter=rw
    john=rw

四、启动

  1. 启动 svnserve -d -r /mnt/svn/ --listen-port 9999
  2. 编写开机启动脚本(TODO)

配置可以参考这里:http://blog.csdn.net/typa01_kk/article/details/49226615

500公里计划

9.30号前(忘了贴出终止时间)

  1. 已完成 2048KM,总次数195次,最后一次刷了30KM,由于中间女儿出生回家,练习量不够,这次30K的后面几公里小腿乳酸堆积严重,前行困难,下次长跑前记得勤拉练,尤其是下肢 (2017年9月20日16:55:00)
  2. 已完成 1521KM,总次数148次 (s:2017年5月23日11:23:29)
  3. 已完成 1322KM, 感觉给生活带来变化,精力更加充沛、自制力增强、拖延症慢慢消退、学习更加注重系统、带来其他的良好习惯 (s:2017年4月12日11:22:17)
  4. 已完成 1052KM, 正月初八,周六,这次间断够久,满满的罪恶感呀(s:2017年2月4日10:23:42)
  5. 已完成 613KM,期间经历了17的假期(婚假+国庆),假期里只跑了两次,昨天的跑步还是很舒服的,keep指数五颗星!(s:2016年10月11日08:40:45)
  6. 已完成 477KM,有一段时间没有更新了,现在跑10KM已经相对轻松了。(s:2016年8月30日17:08:52)
  7. 已完成 206KM(ps: 由于keep的受GPS信号影响,实际还有几次跑的10KM未记录上,但还是以最终记录数据为准),出发的动力还和当初一样,热情不减 (s:2016年7月13日09:24:42)
  8. 还在继续 Running(昨天奖励了自己两套运动装备,天气凉爽,跑的倍爽,has compeleted 140KM (s:2016年6月27日11:20:43)
  9. 计划不会烂在这里,髂胫束综合征,还在伴随这我,休息复原中,加强下肢、臀部力量,休息为了更好的出发。(s:2016年5月29日18:42:42)
  10. 5.12 开始