centos安装svn客户端

安装命令如下:

yum install -y subversion

其中-y用于自动确认安装,没有-y参数的话,还剩下手工输入一下y。

安装之后就可以正常使用svn co、svn update 了。

mysql手工杀死事务

在mysql上执行以下语句,半天都没有响应:

UPDATE doc_tag_status SET machine_tag_status = 2, machine_tag_date = NOW(), machine_tag_desc = 'som desc' WHERE doc_id IN(SELECT doc_id FROM doc_claim_summary WHERE claim_summary = '');

最后还是得手工杀死该事务进程才行:
Read the rest of this entry »

package-lock.json的作用

其实用一句话来概括很简单,就是锁定安装时的包的版本号,并且需要上传到git,以保证其他人在npm install时大家的依赖能保证一致。

引用知乎@周载南的回答

根据官方文档,这个package-lock.json 是在 `npm install`时候生成一份文件,用以记录当前状态下实际安装的各个npm package的具体来源和版本号。

它有什么用呢?因为npm是一个用于管理package之间依赖关系的管理器,它允许开发者在pacakge.json中间标出自己项目对npm各库包的依赖。你可以选择以如下方式来标明自己所需要库包的版本

这里举个例子:

"dependencies": {
 "@types/node": "^8.0.33",
},

这里面的 向上标号^是定义了向后(新)兼容依赖,指如果 types/node的版本是超过8.0.33,并在大版本号(8)上相同,就允许下载最新版本的 types/node库包,例如实际上可能运行npm install时候下载的具体版本是8.0.35。波浪号

大多数情况这种向新兼容依赖下载最新库包的时候都没有问题,可是因为npm是开源世界,各库包的版本语义可能并不相同,有的库包开发者并不遵守严格这一原则:相同大版本号的同一个库包,其接口符合兼容要求。这时候用户就很头疼了:在完全相同的一个nodejs的代码库,在不同时间或者不同npm下载源之下,下到的各依赖库包版本可能有所不同,因此其依赖库包行为特征也不同有时候甚至完全不兼容。

因此npm最新的版本就开始提供自动生成package-lock.json功能,为的是让开发者知道只要你保存了源文件,到一个新的机器上、或者新的下载源,只要按照这个package-lock.json所标示的具体版本下载依赖库包,就能确保所有库包与你上次安装的完全一样。

原来package.json文件只能锁定大版本,也就是版本号的第一位,并不能锁定后面的小版本,你每次npm install都是拉取的该大版本下的最新的版本,为了稳定性考虑我们几乎是不敢随意升级依赖包的,这将导致多出来很多工作量,测试/适配等,所以package-lock.json文件出来了,当你每次安装一个依赖的时候就锁定在你安装的这个版本。

那如果我们安装时的包有bug,后面需要更新怎么办?

在以前可能就是直接改package.json里面的版本,然后再npm install了,但是5版本后就不支持这样做了,因为版本已经锁定在package-lock.json里了,所以我们只能npm install xxx@x.x.x 这样去更新我们的依赖,然后package-lock.json也能随之更新。

假如我已经安装了jquery 2.1.4这个版本,从git更新了package.json和package-lock.json,我npm install能覆盖掉node_modules里面的依赖吗?

其实我也有这个疑问,所以做了测试,在直接更新package.json和package-loc.json这两个文件后,npm install是可以直接覆盖掉原先的版本的,所以在协作开发时,这两个文件如果有更新,你的开发环境应该npm install一下才对。

来源:https://www.cnblogs.com/cangqinglang/p/8336754.html

官方链接:https://docs.npmjs.com/files/package-lock.json

ASCII ‘\0’字符导入mysql source无法导入

在使用mysql的source命令导入sql文件的时候收到如下错误:

ASCII '\0' appeared in the statement, but this is not allowed unless option --binary-mode is enabled and mysql is run in non-interactive mode. Set --binary-mode to 1 if ASCII '\0' is expected. Query:

在Stack Overflow上看到有解释说用使用命令可以解决:

mysql -h127.0.0.1 -uroot -proot -D db_name --binary-mode -o < /home/data/db_name.sql

我试验了一下,还是不行。后来用如下方式解决问题:

1、用emeditor打开sql文件,文件编码选择utf-8;
2、在打开的过程中提示有编码问题,我估计无法导入也是编码造成的,选择继续以utf-8打开文件;
3、另存文件;
4、使用另存的文件再次导入,成功;

这是一个4G的sql文件,在搞定上面三步的过程中我做了50个俯卧撑。

如何退出telnet终端

其实telnet之后有提示如何退出的:Escape character is ‘^]’.

也就是ctrl + ]

[root@ws-02 ~]# telnet 172.17.258.36 9892
Trying 172.17.248.36...
Connected to 172.17.248.36.
Escape character is '^]'.

^]

第一次会退出到telnet命令行下,然后输入:quit 就可以了:

telnet> quit
Connection closed.

linux安装locate

开始使用 yum install locate 进行安装,发现提示:

No package locate available.

后来发现应该使用:

yum install mlocate

初次安装之后需要进行初始化:

updatedb

执行安装,就可以使用了。

|

对javascript匿名函数的理解(透彻版)

(function(){
//这里忽略jQuery所有实现 
})();

半年前初次接触jQuery的时候,我也像其他人一样很兴奋地想看看源码是什么样的。然而,在看到源码的第一眼,我就迷糊了。为什么只有一个匿 名函数又没看到运行(当然是运行了……),就能有jQuery这么个函数库了?于是,我抱着疑问来到CSDN。结果相信现在很多人都很清楚了(因为在我之 后也不乏来者,呵呵~)。当一个匿名函数被括起来,然后再在后面加一个括号,这个匿名函数就能立即运行起来!真神奇哦!

嘿嘿!胡闹到此为止。在这一节,我们碰到的jQuery片段是一组立即运行的匿名函数。而这种用法在论坛上也曾引起过激辩——这段代码究竟属不 属于闭包呢?带着这个疑问,我们从基础开始,分析每个关键要素,寻找属于自己的答案。(没错,自己的答案!在我看来,所有理论只是形式,只要它有利于我们 的应用实现,就是可取的——黑猫白猫,抓到老鼠的就是好猫!)

Read the rest of this entry »

防止js全局变量污染方法总结-待续

javaScript 可以随意定义保存所有应用资源的全局变量。但全局变量可以削弱程序灵活性,增大了模块之间的耦合性。
在多人协作时,如果定义过多的全局变量 有可能造成全局变量冲突,也就是全局变量污染问题,以下是两种解决办法

一.定义全局变量命名空间
只创建一个全局变量,并定义该变量为当前应用容器,把其他全局变量追加在该命名空间下

var MY={};
my.name={
big_name:”zhangsan”,
small_name:”lisi”
};
my.work={
school_work:”study”,
family_work:”we are”
};
二 . 利用匿名函数将脚本包裹起来

(function(){
var exp={};
var name=”aa”;
exp.method=function(){
return name;
};
window.ex=exp;
})();

前言

记得long long ago,刚刚开始写JS的时候,我喜欢写一些函数在JS文件里边,然后通过script标签引进来,在DOM节点上绑定onclick等事件,看了很多人写的代码,也大多是这样。
后来会发现,当项目小的时候这么做为了快速开发是可以接受的,然而当很多人一起开发一个Javascript大应用的时候,你会发现不同的代码风格跟全局变量会导致很多冲突,这是一个很痛苦的事情。

曾经的经历

用过jQuery的人就知道其主要的变量符号就是$,没错!因此很多项目的开发人员也要学,就自己把$定义成别的含义了,我心里对其是无敌的鄙视跟厌恶。
我曾经拿过一个项目使用jQuery的,然后上头要我使用一个已有的富文本编辑器,这样就有两个JS文件了
jquery.js和editor.js,于是我要开始写该页面的逻辑了,我发现editor.js里边自定义了$符号,我原本想要把它直接替换成别的标志符,但是悲剧的是,它还有一些插件也会用到,混乱的结构导致我花了很多时间去解决这个冲突。

全局Window

我们都知道,在文件中直接定义的变量跟函数(不嵌套在任何域底下的)都是属于全局的,也就是都在当前页面的window变量底下。例如:

function test1(){
}

var name;

function test2(){
i = 1;
}

上边代码中的name,test1,test2和i都是属于window底下的全局变量,也就是可以通过以下三种办法访问到它们:
1.直接访问name,test1()等;
2.使用window[“name”], window[‘test1’]()等;
3.使用window.name,window.test1()等。

注意:上边代码中的i虽然是在test2函数里边才出现的,因为其前面没有使用var关键字,解释器会认为它在test2的上一层定义的,依次查找上一层,直到找到window全局,如果发现还是未定义,那么将其挂在window底下成为了全局变量。

所以你直接定义的函数通通都挂到了window底下,这就是一种污染了,当很多人定义各种变量跟函数,你又得同时引入进来的时候,这个冲突的概率就变大了。

减少污染

那为了避免过多这样的冲突,以及模块之间的耦合性更低,需要减少这样的污染。
此时我们会想,那不要把变量定义在全局呗,采用类似C++的命名空间,Java的包的思路就行啦。
首先就是将不同的模块划入到不同的全局“包”(这里的包的概念实际上就是一个Javascript对象而已)。
例如,程序员A为全局添加一个A变量,然后他把自己定义的函数/变量全部挂到A底下,这样就跟程序员B所定义的隔离了。
再者我们可以使用函数域来隔离一些局部变量的冲突,比如说程序员A写的代码如下:

(function(obj){
/* 在这里边就与外边隔离了,定义的局部变量不会与外界干扰 */
/* 为了跟外界达到共享的目的,还可以为其加入参数,例如obj,在最后调用的时候把相关的参数传进来,例如下边的window */

var A = {};//定义一个A包
var tmp;//临时变量

A.i = 1;//定义这个包里边的i变量
A.func = function(){alert(‘I am A’);};

obj.A = A;/* 把A包挂到obj底下 */

})(window);

当离开了这个函数域之后,tmp等局部变量被销毁(只要不要存在在闭包里边),程序员A定义的东西通通挂到了变量window.A底下,从而减少了很多污染,避免了不必要的冲突。

回到过去

再次回到刚刚提过的那个经历,如果我现在为editor.js整个包围在function里边,通过这种方式把$给隐藏在一个包里边,在它的其他控件中也采取这样的做法,当然还要做一小点改动:

/* editor.js */
(function(obj){
/* 原先editor里边的内容 */
/* 里边有定义了自己的$标志 */

obj.editor = obj.editor || {};//如果没有editor对象,则生成一个空对象
obj.editor.$ = $;//把$挂在全局的editor对象上
})(window);

/* 其他控件.js */
(function(obj){
var $ = obj.$;//把$恢复
/* 原先控件的内容 */
})(window.editor);

当然咯,如果editor.js有些功能需要暴露到全局的话,还需要将其进一步的挂在editor变量底下,这里只是一个示范。

本篇总结

很多框架都采用了这种做法减少全局污染,可能很多人一开始对这种做法有疑惑,这里只是个人理解拿出来分享一下,继续欢迎交流。

https://blog.csdn.net/xllily_11/article/details/52816699
https://zhuanlan.zhihu.com/p/25489604

js全局变量污染问题

javaScript 可以随意定义保存所有应用资源的全局变量。但全局变量可以削弱程序灵活性,增大了模块之间的耦合性。
在多人协作时,如果定义过多的全局变量 有可能造成全局变量冲突,也就是全局变量污染问题,以下是两种解决办法

一.定义全局变量命名空间
只创建一个全局变量,并定义该变量为当前应用容器,把其他全局变量追加在该命名空间下

var MY={};
my.name={
big_name:”zhangsan”,
small_name:”lisi”
};
my.work={
school_work:”study”,
family_work:”we are”
};
二 . 利用匿名函数将脚本包裹起来

(function(){
var exp={};
var name=”aa”;
exp.method=function(){
return name;
};
window.ex=exp;
})();
alert(ex.method())

防止js全局变量污染方法总结-待续

javaScript 可以随意定义保存所有应用资源的全局变量。但全局变量可以削弱程序灵活性,增大了模块之间的耦合性。
在多人协作时,如果定义过多的全局变量 有可能造成全局变量冲突,也就是全局变量污染问题,以下是两种解决办法

一.定义全局变量命名空间
只创建一个全局变量,并定义该变量为当前应用容器,把其他全局变量追加在该命名空间下

var MY={};
my.name={
big_name:”zhangsan”,
small_name:”lisi”
};
my.work={
school_work:”study”,
family_work:”we are”
};
二 . 利用匿名函数将脚本包裹起来

(function(){
var exp={};
var name=”aa”;
exp.method=function(){
return name;
};
window.ex=exp;
})();

前言

记得long long ago,刚刚开始写JS的时候,我喜欢写一些函数在JS文件里边,然后通过script标签引进来,在DOM节点上绑定onclick等事件,看了很多人写的代码,也大多是这样。
后来会发现,当项目小的时候这么做为了快速开发是可以接受的,然而当很多人一起开发一个Javascript大应用的时候,你会发现不同的代码风格跟全局变量会导致很多冲突,这是一个很痛苦的事情。

曾经的经历

用过jQuery的人就知道其主要的变量符号就是$,没错!因此很多项目的开发人员也要学,就自己把$定义成别的含义了,我心里对其是无敌的鄙视跟厌恶。
我曾经拿过一个项目使用jQuery的,然后上头要我使用一个已有的富文本编辑器,这样就有两个JS文件了
jquery.js和editor.js,于是我要开始写该页面的逻辑了,我发现editor.js里边自定义了$符号,我原本想要把它直接替换成别的标志符,但是悲剧的是,它还有一些插件也会用到,混乱的结构导致我花了很多时间去解决这个冲突。

全局Window

我们都知道,在文件中直接定义的变量跟函数(不嵌套在任何域底下的)都是属于全局的,也就是都在当前页面的window变量底下。例如:

function test1(){
}

var name;

function test2(){
i = 1;
}

上边代码中的name,test1,test2和i都是属于window底下的全局变量,也就是可以通过以下三种办法访问到它们:
1.直接访问name,test1()等;
2.使用window[“name”], window[‘test1’]()等;
3.使用window.name,window.test1()等。

注意:上边代码中的i虽然是在test2函数里边才出现的,因为其前面没有使用var关键字,解释器会认为它在test2的上一层定义的,依次查找上一层,直到找到window全局,如果发现还是未定义,那么将其挂在window底下成为了全局变量。

所以你直接定义的函数通通都挂到了window底下,这就是一种污染了,当很多人定义各种变量跟函数,你又得同时引入进来的时候,这个冲突的概率就变大了。

减少污染

那为了避免过多这样的冲突,以及模块之间的耦合性更低,需要减少这样的污染。
此时我们会想,那不要把变量定义在全局呗,采用类似C++的命名空间,Java的包的思路就行啦。
首先就是将不同的模块划入到不同的全局“包”(这里的包的概念实际上就是一个Javascript对象而已)。
例如,程序员A为全局添加一个A变量,然后他把自己定义的函数/变量全部挂到A底下,这样就跟程序员B所定义的隔离了。
再者我们可以使用函数域来隔离一些局部变量的冲突,比如说程序员A写的代码如下:

(function(obj){
/* 在这里边就与外边隔离了,定义的局部变量不会与外界干扰 */
/* 为了跟外界达到共享的目的,还可以为其加入参数,例如obj,在最后调用的时候把相关的参数传进来,例如下边的window */

var A = {};//定义一个A包
var tmp;//临时变量

A.i = 1;//定义这个包里边的i变量
A.func = function(){alert(‘I am A’);};

obj.A = A;/* 把A包挂到obj底下 */

})(window);

当离开了这个函数域之后,tmp等局部变量被销毁(只要不要存在在闭包里边),程序员A定义的东西通通挂到了变量window.A底下,从而减少了很多污染,避免了不必要的冲突。

回到过去

再次回到刚刚提过的那个经历,如果我现在为editor.js整个包围在function里边,通过这种方式把$给隐藏在一个包里边,在它的其他控件中也采取这样的做法,当然还要做一小点改动:

/* editor.js */
(function(obj){
/* 原先editor里边的内容 */
/* 里边有定义了自己的$标志 */

obj.editor = obj.editor || {};//如果没有editor对象,则生成一个空对象
obj.editor.$ = $;//把$挂在全局的editor对象上
})(window);

/* 其他控件.js */
(function(obj){
var $ = obj.$;//把$恢复
/* 原先控件的内容 */
})(window.editor);

当然咯,如果editor.js有些功能需要暴露到全局的话,还需要将其进一步的挂在editor变量底下,这里只是一个示范。

本篇总结

很多框架都采用了这种做法减少全局污染,可能很多人一开始对这种做法有疑惑,这里只是个人理解拿出来分享一下,继续欢迎交流。

https://blog.csdn.net/xllily_11/article/details/52816699
https://zhuanlan.zhihu.com/p/25489604

Mysql入门系列:MYSQL创建、删除和选择数据库

创建、删除和选择数据库
MySQL提供了三条数据库级的语句,它们分别是: CREATE DATABASE 用于创建数据库,DROP DATABASE 用于删除数据库,USE 用于选择缺省数据库。

1. CREATE DATABASE 语句
创建一个数据库很容易;只要在CREATE DATABASE 语句中给出其名称即可:

其中限制条件是该数据库的名称必须是合法的,该数据库必须不存在,并且您必须有足够的权限来创建它。

2. DROP DATABASE 语句
删除数据库就像创建它一样容易,假如有权限,执行下列语句即可:

请注意,不要乱用DROP DATABASE 语句,它将会删除数据库及其所有的表。在删除了一个数据库后,该数据库就永远没有了。换句话说,不要仅为了看看这条语句如何工作就试着执行该语句。如果管理员已经正常完成了数据库备份,那么删除的数据库可能还可以恢复。

请注意,数据库是由数据目录中的一个目录表示的。如果在该目录中放置了一些非表的数据文件,它们是不会被DROP DATABASE 语句删除的。此时,该数据库目录自身也不被删除。

3. USE 语句
USE 语句选择一个数据库,使其成为服务器的给定连接的缺省(当前)数据库:

必须对数据库具有某种访问权限,否则不能使用它。为了使用数据库中的表而选择该数据库实际上不是必须的,因为可以利用db_name.tbl_name 形式来引用它的表。但是,不必指定数据库限定词引用表要方便得多。选择一个缺省数据库并不代表在连接的持续时间内它都必须是缺省的。可发布任意数目的USE 语句在数据库之间进行任意地切换,只要具有使用它们的权限即可。选择一个数据库也不限制您只使用该数据库中的表。您仍然可以通过用数据库名限定表名的方法,引用其他数据库中的表。
在服务器的连接终止时,服务器关于缺省数据库的所有记忆都消失了。即,如果您再次连接到该服务器,它不会记住以前您所选择的数据库。事实上,假定MySQL是多线程的,可通过一个用户处理多个连接,用户可以按任何顺序连接或断开,让服务器对缺省数据库进行记忆的想法也是没有意义的。在这个环境中,“以前选择的数据库”这句话指什么并不清楚。

查看 redhat linux 版本的几个简单方法

登陆到一台正在运行的redhat linux服务器查看它的系统版本是很容易的一件事情,下面就说我自己常用的几种方法。
方法一:
查看redhat-release文件
[root@server ~]# cat /etc/redhat-release
Red Hat Enterprise Linux AS release 4 (Nahant Update 8)

方法二:
查看issue文件
[root@server ~]# cat /etc/issue
Red Hat Enterprise Linux AS release 4 (Nahant Update 8)
Kernel /r on an /m

方法三:
使用lsb_release命令
[root@server ~]# lsb_release -a
LSB Version: :core-3.0-ia32:core-3.0-noarch:graphics-3.0-ia32:graphics-3.0-noarch
Distributor ID: RedHatEnterpriseAS
Description: Red Hat Enterprise Linux AS release 4 (Nahant Update 8)
Release: 4
Codename: NahantUpdate8

以上就是我常用的三种查看系统版本的方法,如果你有更好的方法,也请告诉我一下。

Tumblr 架构设计

英文原文:The Tumblr Architecture Yahoo Bought For A Cool Billion Dollars

创业公司迈向成功,都要迈过危险的迅速发展期这道门槛。寻找人才,不断改造基础架构,维护旧的架构,同时要面对逐月大增的流量,而且曾经只有4位工程师。这意味着必须艰难地选择应该做什么,不该做什么。这就是Tumblr的状况。好在现在已经有20位工程师了,可以有精力解决问题,并开发一些有意思的解决方案。

Tumblr最开始是非常典型的LAMP应用。目前正在向分布式服务模型演进,该模型基于Scala、HBase、Redis、Kafka、Finagle,此外还有一个有趣的基于Cell的架构,用于支持Dashboard .现在的重点被放在了解决他们PHP程序中的短期问题,找出问题,并正确的使用服务化去解决他们.

Tumblr目前的最大问题是如何改造为一个大规模网站。系统架构正在从LAMP演进为最先进的技术组合,同时团队也要从小的创业型发展为全副武装、随时待命的正规开发团队,不断创造出新的功能和基础设施。下面就是Blake对Tumblr系统架构情况的介绍。

Tumblr网址: http://www.tumblr.com/

统计
每天 5 亿页面浏览量
每月超过 150亿 页面浏览量
约 20 名工程师
峰值每秒大约 4 万请求
每天有超过 1TB 的数据进入 Hadoop 集群
每天有几个 TB 的数据进入 MySQL/HBase/Redis/Memcache
每月增长 30%
产品环境有大约 1000 个硬件节点
平均每个工程师每月处理10亿页面访问
每天大约 50GB 的文章,关注者列表更新大约每天 2.7TB
Dashboard 每秒百万次写,每秒 5w 读

软件
OS X 用于开发,产品环境用 Linux (CentOS, Scientific)
Apache
PHP, Scala, Ruby
Redis, HBase, MySQL
Varnish, HA-Proxy, nginx,
Memcache, Gearman, Kafka, Kestrel, Finagle
Thrift, HTTP
Func – 一个安全的、脚本化的远程控制框架和 API
Git, Capistrano, Puppet, Jenkins

硬件
500 台 Web 服务器
200 数据库服务器 (大多数是备用池)
47 个池
30 个分区
30 台 memcache 服务器
22 台 redis 服务器
15 台 varnish 服务器
25 个 haproxy 节点
8 个 nginx
14 个作业队列服务器 (kestrel + gearman)

构架
与其他社交网站不同的是,Tumblr有其独特的使用模式。
每天有超过5千万篇文章更新,平均每篇文章的跟帖又数以百计。用户一般只有数百个粉丝。这与其他社会化网站里少数用户有几百万粉丝非常不同,使得Tumblr的扩展性极具挑战性。
按用户使用时间衡量,Tumblr已经是排名第二的社会化网站。内容的吸引力很强,有很多图片和视频,文章往往不短,一般也不会太长,但允许写得很长。文章内容往往比较深入,用户会花费更长的时间来阅读。
用户与其他用户建立联系后,可能会在Dashboard上往回翻几百页逐篇阅读,这与其他网站基本上只是部分信息流不同。
用户的数量庞大,用户的平均到达范围更广,用户较频繁的发帖,这些都意味着有巨量的更新需要处理。
Tumblr目前运行在一个托管数据中心中,已在考虑地域上的分布式构架。
Tumblr平台由两个组件构成:公共Tumblelogs和Dashboard
公共Tumblelogs与博客类似,并非动态,易于缓存
Dashboard是类似于Twitter的时间轴,用户由此可以看到自己关注的所有用户的实时更新。
与博客的扩展性不同,缓存作用不大,因为每次请求都不同,尤其是活跃的关注者。
而且需要实时而且一致,文章每天仅更新50GB,跟帖每天更新2.7TB,所有的多媒体数据都存储在S3上面。
大多数用户以Tumblr作为内容浏览工具,每天浏览超过5亿个页面,70%的浏览来自Dashboard。
Dashboard的可用性已经不错,但Tumblelog一直不够好,因为基础设施是老的,而且很难迁移。由于人手不足,一时半会儿还顾不上。

老的Tumblr构架
Tumblr最开始是托管在Rackspace上的,每个自定义域名的博客都有一个A记录。当2007年Rackspace无法满足其发展速度不得不迁移时,大量的用户都需要同时迁移。所以他们不得不将自定义域名保留在Rackspace,然后再使用HAProxy和Varnish路由到新的数据中心。类似这样的遗留问题很多。
开始的架构演进是典型的LAMP路线
最初用PHP开发,几乎所有程序员都用PHP
最初是三台服务器:一台Web,一台数据库,一台PHP
为了扩展,开始使用memcache,然后引入前端cache,然后在cache前再加HAProxy,然后是非常奏效的MySQL sharding
采用“在单台服务器上榨出一切”的方式。过去一年已经用C开发了两个后端服务:ID generator和Staircar(用Redis进行Dashboard通知)
Dashboard采用了“扩散-收集”方式。当用户访问Dashboard时将显示事件,来自所关注的用户的事件是通过拉然后显示的。这样支撑了6个月。由于数据是按时间排序的,因此sharding模式不太管用。

新的构架
由于招人和开发速度等原因,改为以JVM为中心。
目标是将一切从PHP应用改为服务,使应用变成请求鉴别、呈现等诸多服务之上的薄层。
选择了Scala 和 Finagle
在团队内部有很多人具备Ruby和PHP经验,所以Scala很有吸引力。
Finagle是选择Scala的重要因素之一。这个来自Twitter的库可以解决大多数分布式问题,比如分布式跟踪、服务发现、服务注册等。
转到JVM上之后,Finagle提供了团队所需的所有基本功能(Thrift, ZooKeeper等),无需再开发许多网络代码,另外,团队成员认识该项目的一些开发者。
Foursquare和Twitter都在用Finagle,Meetup也在用Scala。
应用接口与Thrift类似,性能极佳。
团队本来很喜欢Netty,但不想用Java,Scala是不错的选择。
选择Finagle是因为它很酷,还认识几个开发者。
之所以没有选择Node.js,是因为以JVM为基础更容易扩展。Node的发展为时尚短,缺乏标准、最佳实践以及大量久经测试的代码。而用Scala的话,可以使用所有Java代码。虽然其中并没有多少可扩展的东西,也无法解决5毫秒响应时间、49秒HA、4万每秒请求甚至有时每秒40万次请求的问题。但是,Java的生态链要大得多,有很多资源可以利用。
内部服务从C/libevent为基础正在转向Scala/Finagle为基础。
开始采用新的NoSQL存储方案如HBase和Redis。但大量数据仍然存储在大量分区的MySQL架构中,并没有用HBase代替MySQL。
HBase主要支持短地址生产程序(数以十亿计)还有历史数据和分析,非常结实。此外,HBase也用于高写入需求场景,比如Dashboard刷新时一秒上百万的写入。之所以还没有替换HBase,是因为不能冒业务上风险,目前还是依靠人来负责更保险,先在一些小的、不那么关键的项目中应用,以获得经验。
MySQL和时间序列数据sharding(分片)的问题在于,总有一个分片太热。另外,由于要在slave上插入并发,也会遇到读复制延迟问题。
此外,还开发了一个公用服务框架:
花了很多时间解决分布式系统管理这个运维问题。
为服务开发了一种Rails scaffolding,内部用模板来启动服务。
所有服务从运维的角度来看都是一样的,所有服务检查统计数据、监控、启动和停止的方式都一样。
工具方面,构建过程围绕SBT(一个Scala构建工具),使用插件和辅助程序管理常见操作,包括在Git里打标签,发布到代码库等等。大多数程序员都不用再操心构建系统的细节了。
40台服务器采用HAProxy进行负载均衡,Varnish进行缓存.
200台数据库服务器中,很多是为了提高可用性而设,使用的是常规硬件,但MTBF(平均故障间隔时间)极低。故障时,备用充足。
500台服务器运行Apache和其他PHP程序。
6个为了支持PHP应用的后端服务,并有一个小组专门开发后端服务。新服务的发布需要两到三周,包括Dashboard通知、Dashboard二级索引、短地址生成、处理透明分片的memcache代理。
其中在MySQL分片上耗时很多。虽然在纽约本地非常热,但并没有使用MongoDB,他们认为MySQL的可扩展性足够了。
Gearman用于会长期运行无需人工干预的工作。
可用性是以达到范围(reach)衡量的。用户能够访问自定义域或者Dashboard吗?也会用错误率。
历史上总是解决那些最高优先级的问题,而现在会对故障模式系统地分析和解决,目的是从用户和应用的角度来定成功指标。
最开始Finagle是用于Actor模型的,但是后来放弃了。对于运行后无需人工干预的工作,使用任务队列。而且Twitter的util工具库中有Future实现,服务都是用Future(Scala中的无参数函数,在与函数关联的并行操作没有完成时,会阻塞调用方)实现的。当需要线程池的时候,就将Future传入Future池。一切都提交到Future池进行异步执行。
Scala提倡无共享状态。由于已经在Twitter生产环境中经过测试,Finagle这方面应该是没有问题的。使用Scala和Finagle中的结构需要避免可变状态,不使用长期运行的状态机。状态从数据库中拉出、使用再写回数据库。这样做的好处是,开发人员不需要操心线程和锁。
22台Redis服务器,每台的都有8-32个实例,因此线上同时使用了100多个Redis实例。
Redis主要用于Dashboard通知的后端存储。
所谓通知就是指某个用户like了某篇文章这样的事件。通知会在用户的Dashboard中显示,告诉他其他用户对其内容做了哪些操作。
高写入率使MySQL无法应对。
通知转瞬即逝,所以即使遗漏也不会有严重问题,因此Redis是这一场景的合适选择。
这也给了开发团队了解Redis的机会。
使用中完全没有发现Redis有任何问题,社区也非常棒。
开发了一个基于Scala Futures的Redis接口,该功能现在已经并入了Cell架构。
短地址生成程序使用Redis作为一级Cache,HBase作为永久存储。
Dashboard的二级索引是以Redis为基础开发的。
Redis还用作Gearman的持久存储层,使用Finagle开发的memcache代理。
正在缓慢地从memcache转向Redis。希望最终只用一个cache服务。性能上Redis与memcache相当。

内部通讯管道(Firehose)
内部的应用需要活跃的信息流通道。这些信息包括用户创建/删除的信息,liking/unliking 的提示,等等。挑战在于这些数据要实时的分布式处理。我们希望能够检测内部运行状况,应用的生态系统能够可靠的生长,同时还需要建设分布式系统的控制中心。
以前,这些信息是基于 Scribe (Facebook 开源的分布式日志系统。)/Hadoop 的分布式系统。服务会先记录在 Scribe 中,并持续的长尾形式写入,然后将数据输送给应用。这种模式可以立即停止伸缩,尤其在峰值时每秒要创建数以千计的信息。不要指望人们会细水长流式的发布文 件和 grep。
内部的 firehose 就像装载着信息的大巴,各种服务和应用通过 Thrift 与消防管线沟通。(一个可伸缩的跨语言的服务开发框架。)
LinkedIn 的 Kafka 用于存储信息。内部人员通过 HTTP 链接 firehose。经常面对巨大的数据冲击,采用 MySQL 显然不是一个好主意,分区实施越来越普遍。
firehose 的模型是非常灵活的,而不像 Twitter 的 firehose 那样数据被假定是丢失的。
firehose 的信息流可以及时的回放。他保留一周内的数据,可以调出这期间任何时间点的数据。
支持多个客户端连接,而且不会看到重复的数据。每个客户端有一个 ID。Kafka 支持客户群,每个群中的客户都用同一个 ID,他们不会读取重复的数据。可以创建多个客户端使用同一个 ID,而且不会看到重复的数据。这将保证数据的独立性和并行处理。Kafka 使用 ZooKeeper (Apache 推出的开源分布式应用程序协调服务。)定期检查用户阅读了多少。

为 Dashboard 收件箱设计的 Cell 架构
现在支持 Dashboard 的功能的分散-集中架构非常受限,这种状况不会持续很久。
解决方法是采用基于 Cell 架构的收件箱模型,与 Facebook Messages 非常相似。
收件箱与分散-集中架构是对立的。每一位用户的 dashboard 都是由其追随者的发言和行动组成的,并按照时间顺序存储。
就因为是收件箱就解决了分散-集中的问题。你可以会问到底在收件箱中放了些什么,让其如此廉价。这种方式将运行很长时间。
重写 Dashboard 非常困难。数据已经分布,但是用户局部升级产生的数据交换的质量还没有完全搞定。
数据量是非常惊人的。平均每条消息转发给上百个不同的用户,这比 Facebook 面对的困难还要大。大数据+高分布率+多个数据中心。
每秒钟上百万次写入,5万次读取。没有重复和压缩的数据增长为2.7TB,每秒百万次写入操作来自 24 字节行键。
已经流行的应用按此方法运行。

Cell构架
每个 cell 是独立的,并保存着一定数量用户的全部数据。在用户的 Dashboard 中显示的所有数据也在这个 cell 中。
用户映射到 cell。一个数据中心有很多 cell。
每个 cell 都有一个 HBase 的集群,服务集群,Redis 的缓存集群。
用户归属到 cell,所有 cell 的共同为用户发言提供支持。
每个 cell 都基于 Finagle(Twitter 推出的异步的远程过程调用库),建设在 HBase 上,Thrift 用于开发与 firehose 和各种请求与数据库的链接。
一个用户进入 Dashboard,其追随者归属到特定的 cell,这个服务节点通过 HBase 读取他们的 dashboard 并返回数据。
后台将追随者的 dashboard 归入当前用户的 table,并处理请求。
Redis 的缓存层用于 cell 内部处理用户发言。
请求流:用户发布消息,消息将被写入 firehose,所有的 cell 处理这条消息并把发言文本写入数据库,cell 查找是否所有发布消息追随者都在本 cell 内,如果是的话,所有追随者的收件箱将更新用户的 ID。
cell 构架的优点:
大规模的请求被并行处理,组件相互隔离不会产生干扰。 cell 是一个并行的单位,因此可以任意调整规格以适应用户群的增长。
cell 的故障是独立的。一个 Cell 的故障不会影响其他 cell。
cell 的表现非常好,能够进行各种升级测试,实施滚动升级,并测试不同版本的软件。
关键的思想是容易遗漏的:所有的发言都是可以复制到所有的 cell。
每个 cell 中存储的所有发言的单一副本。 每个 cell 可以完全满足 Dashboard 呈现请求。应用不用请求所有发言者的 ID,只需要请求那些用户的 ID。他可以在 dashboard 返回内容。每一个 cell 都可以满足 Dashboard 的所有需求,而不需要与其他 cell 进行通信。
用到两个 HBase table :一个 table 用于存储每个发言的副本,这个 table 相对较小。在 cell 内,这些数据将与存储每一个发言者 ID。第二个 table 告诉我们用户的 dashboard 不需要显示所有的追随者。当用户通过不同的终端访问一个发言,并不代表阅读了两次。收件箱模型可以保证你阅读到。
发言并不会直接进入到收件箱,因为那实在太大了。所以,发言者的 ID 将被发送到收件箱,同时发言内容将进入 cell。这个模式有效的减少了存储需求,只需要返回用户在收件箱中浏览发言的时间。而缺点是每一个 cell 保存所有的发言副本。令人惊奇的是,所有发言比收件箱中的镜像要小。每天每个 cell 的发言增长 50GB,收件箱每天增长2.7TB。用户消耗的资源远远超过他们制造的。
用户的 dashboard 不包含发言的内容,只显示发言者的 ID,主要的增长来自 ID。
当追随者改变时,这种设计方案也是安全的。因为所有的发言都保存在 cell 中了。如果只有追随者的发言保存在 cell 中,那么当追随者改变了,将需要一些回填工作。
另外一种设计方案是采用独立的发言存储集群。这种设计的缺点是,如果群集出现故障,它会影响整个网站。因此,使用 cell 的设计以及后复制到所有 cell 的方式,创建了一个非常强大的架构。
一个用户拥有上百万的追随者,这带来非常大的困难,有选择的处理用户的追随者以及他们的存取模式(见Feeding Frenzy)
不同的用户采用不同并且恰当的存取模式和分布模型,两个不同的分布模式包括:一个适合受欢迎的用户,一个使用大众。
依据用户的类型采用不同的数据处理方式,活跃用户的发言并不会被真正发布,发言将被有选择的体现。
追随了上百万用户的用户,将像拥有上百万追随者的用户那样对待。
cell 的大小非常难于决定。cell 的大小直接影响网站的成败。每个 cell 归于的用户数量是影响力之一。需要权衡接受怎样的用户体验,以及为之付出多少投资。
从 firehose 中读取数据将是对网络最大的考验。在 cell 内部网络流量是可管理的。
当更多 cell 被增添到网络中来,他们可以进入到 cell 组中,并从 firehose 中读取数据。一个分层的数据复制计划。这可以帮助迁移到多个数据中心。

在纽约启动运作
纽约具有独特的环境,资金和广告充足。招聘极具挑战性,因为缺乏创业经验。
在过去的几年里,纽约一直致力于推动创业。纽约大学和哥伦比亚大学有一些项目,鼓励学生到初创企业实习,而不仅仅去华尔街。市长建立了一所学院,侧重于技术。
团队架构
团队:基础架构,平台,SRE,产品,web ops,服务
基础架构:5层以下,IP 地址和 DNS,硬件配置
平台:核心应用开发,SQL 分片,服务,Web 运营
SRE:在平台和产品之间,侧重于解决可靠性和扩展性的燃眉之急
服务团队:相对而言更具战略性
Web ops:负责问题检测、响应和优化

软件部署
开发了一套 rsync 脚本,可以随处部署 PHP 应用程序。一旦机器的数量超过 200 台,系统便开始出现问题,部署花费了很长时间才完成,机器处于部署进程中的各种状态。
接下来,使用 Capistrano(一个开源工具,可以在多台服务器上运行脚本)在服务堆栈中构建部署进程(开发、分期、生产)。在几十台机器上部署可以正常工作,但当通过 SSH 部署到数百台服务器时,再次失败。
现在,所有的机器上运行一个协调软件。基于 Redhat Func(一个安全的、脚本化的远程控制框架和接口)功能,一个轻量级的 API 用于向主机发送命令,以构建扩展性。
建立部署是在 Func 的基础上向主机发送命令,避免了使用 SSH。比如,想在组A上部署软件,控制主机就可以找出隶属于组A的节点,并运行部署命令。
通过Capistrano的命令实现部署。它可以可以从git仓库中拉取代码。正因为是基于HTTP的,所以非常易于扩展。他们喜欢Capistrano,因为它支持简单的基于目录的版本控制,能够很好地管理PHP程序。版本更新的时候,每个目录都包含一个SHA,所以很容易检查版本的正确性。

Func API 可用于返回状态报告,报告哪些机器上有这些软件版本。
安全重启任何服务,因为它们会关闭连接,然后重启。
在激活前的黑暗模式下运行所有功能。

开发
从哲学上,任何人都可以使用自己想要的任意工具。但随着团队的发展壮大,这些工具出现了问题。新员工想要更好地融入团队,快速地解决问题,必须以他们为中心,建立操作的标准化。
过程类似于 Scrum(一种敏捷管理框架),非常敏捷。
每个开发人员都有一台预配置的开发机器,并按照控制更新。
开发机会出现变化,测试,分期,乃至用于生产。
开发者使用 VIM 和 TextMate。
测试是对 PHP 程序进行代码审核。
在服务方面,他们已经实现了一个与提交相挂钩的测试基础架构,接下来将继承并内建通知机制。
招聘流程
面试通常避免数学、猜谜、脑筋急转弯等问题,而着重关注应聘者在工作中实际要做什么。
着重编程技能。
面试不是比较,只是要找对的人。
挑战在于找到具有可用性、扩展性经验的人才,以应对 Tumblr 面临的网络拥塞。
例如,对于一个新的ID生成器器,他们需要一个高可用的JVM进程,并且需要在1万次每分钟的请求下及最多使用500兆内存的情况下完成1毫秒以下的响应。他们发现串行收集器给这个特定的工作负载带来最低的延迟。在 JVM优化上花了大量的时间。
在 Tumblr 工程博客(Tumblr Engineering Blog),他们对已过世的 Dennis Ritchie 和 John McCarthy 予以纪念。

经验及教训
自动化无处不在
MySQL(增加分片)规模,应用程序暂时还不行
Redis 总能带给人惊喜
基于 Scala 语言的应用执行效率是出色的
废弃项目——当你不确定将如何工作时
不顾用在他们发展经历中没经历过技术挑战的人,聘用有技术实力的人是因为他们能适合你的团队以及工作。
选择正确的软件集合将会帮助你找到你需要的人
建立团队的技能
阅读文档和博客文章。
多与同行交流,可以接触一些领域中经验丰富的人,例如与在 Facebook、Twitter、LinkedIn 的工程师多交流,从他们身上可以学到很多
对技术要循序渐进,在正式投入使用之前他们煞费苦心的学习 HBase 和 Redis。同时在试点项目中使用或将其控制在有限损害范围之内。

案由概念总结

案由,是人民法院对诉讼案件所涉及的法律关系的性质进行概括后形成的案件名称。

根据2011年2月18日《最高人民法院关于修改〈民事案件案由规定〉的决定》(法〔2011〕41号),对2007年10月29日最高人民法院审判委员会第1438次会议讨论通过《民事案件案由规定》第一次修正。为了正确适用法律,统一确定案由,根据《中华人民共和国民法通则》、《中华人民共和国物权法》、《中华人民共和国合同法》、《中华人民共和国侵权责任法》和《中华人民共和国民事诉讼法》等法律规定,结合人民法院民事审判工作实际情况,对民事案件案由作了规定。

案由 [1] 是表明该起案件的具体法律关系,有时会出现多个法律关系合并审理的情况,本诉与反诉可能是一个案由,也可能是两个,这就要求法官助理在制作文书的时候表述清楚。

案由的其他解释:
1、《中华实用法学大辞典》“案由:在民事案件中指原告人起诉中所提出的诉讼请求(如离婚、继承、收养、损害赔偿、返还财物等)”。
2、《中国司法大辞典》“案由:案件性质、内容的简要概括”。
3、《中华法学大辞典·诉讼法学卷》认为“案由:具体诉讼案件的性质、内容的概括提要”。
4、 《最新常用法律大词典》“案由:案件的由来或内容提要。”
5、1984年版《法学词典》的解释是:“每一特定诉讼案件的原由。在刑事案件中,指被告人被被控所犯的罪名(如盗窃、杀人);在民事案件中指原告人起诉中所提出的诉讼请求(如离婚、损害赔偿、返还财产)”。
6、《金山词霸Ⅲ》仅有一个英文解释brief of a

来源:https://baike.baidu.com/item/案由/7192018?fr=aladdin

案号的概念解释

案号是法院等司法机关立案后,对收到案件根据案件的性质进行分类,并进行登记,所分配的案件号码。案号的基本要素为收案年度、法院代字、类型代字、案件编号。收案年度是收案的公历自然年,用阿拉伯数字表示。法院代字是案件承办法院的简化标识,用中文汉字、阿拉伯数字表示。类型代字是案件类型的简称,用中文汉字表示。案件编号是收案的次序号,用阿拉伯数字表示。
2015年7月15日,最高人民法院发布《关于人民法院案件案号的若干规定》。
如:
(2009)威民一字第282号民事判决书
解释为:2009年度,威海民事第282号民事判决书

参考链接:
https://baike.baidu.com/item/案号/9994775?fr=aladdin

最高人民法院关于印发《关于人民法院案件案号的若干规定》及配套标准的通知
http://www.court.gov.cn/zixun-xiangqing-14970.html

vim主题相关命令总结

:colorscheme “查看当前主题
:colorscheme space tab “列出所有主题
:colorscheme your-theme “切换主题

Vim行号的显示与隐藏

显示行号,在命令模式下输入:

set nu

或者

set number

取消显示行号,,在命令模式下输入:

set nonu

或者

set nonumber

永久显示的方法是我们可以修改配置文件:

输入命令:

vim ~/.vimrc

打开后添加

set nu

保存退出,再次进入vim编辑器,就会自动显示行号了。

MySQL中数据表操作详解

使用MySQL,目前你可以在三种基本数据库表格式间选择。当你创建一张表时,你可以告诉MySQL它应该对于表使用哪个表类型。MySQL将总是创建一个.frm文件保存表和列定义。视表类型而定,索引和数据将在其他文件中存储。

你能用ALTER TABLE语句在不同类型的表之间变换。 Read the rest of this entry »

mysql中对已存在的表做增/删/改列的相关操作

1.创建列
alter table tablename add colname type not null default ‘0’;

例:
alter table mmanapp_mmanmedia add appid_id integer not null default 372;

2.删除列
alter table tablename drop column colname;

例:
alter table mmanapp_mmanmedia drop column appid_id;

Read the rest of this entry »

MySQL索引(index)专题

索引(Index)是帮助MySQL高效获取数据的数据结构,它的存在形式是文件。索引能够帮助我们快速定位数据,它可以让mysql高效运行,大大提高mysql的查询(包括排序,分组)效率。

Mysql目前主要有以下几种索引类型(按存储结构划分):FULLTEXT,HASH,BTREE,RTREE。

Read the rest of this entry »

第 1 页,共 69 页12345...102030...最旧 »