0%

为了弄明白git show-branch的输出格式,先做一系列实验,看其输出

初始化一个空的git库

1
2
$ git init
Initialized empty Git repository in /home/${username}/test/.git/

在master分支上做初始提交

1
2
3
4
5
6
$ touch master
$ git add --all
$ git commit -m "master init commit"
\[master (root-commit) d47b60d\] master init commit
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 master

看看当前分支的情况

$ git branch

  • master

$ git show-branch
[master] master init commit

新建devel分支

$ git branch devel
$ git branch
   devel

  • master

$ git show-branch
!  [devel] master init commit
  *  [master] master init commit

+*  [devel] master init commit

切换到devel分支并做新的提交
$ git checkout devel
Switched to branch ‘devel’
$ touch devel
$ git add –all
$ git commit -m “first commit on devel”
$ git branch

  • devel
       master

$ git show-branch
*  [devel] first commit on devel
  !   [master] master init commit

*     [devel] first commit on devel
*+  [master] master init commit

回到master分支
$ git checkout master
$ git show-branch
!   [devel] first commit on devel
   *    [master] master init commit

+      [devel] first commit on devel

    •   [master] master init commit

在devel分支上新建feature分支

$ git checkout devel
$ git checkout -b feature
$ touch feature
$ git add –all
$ git commit -m “first commit on feature”
$ git show-branch
show_branch_on_feature

切换到devel分支
$ git checkout devel
$ git show-branch
show_branch_on_devel

切换到master分支
$ git checkout master
$ git show-branch
show_branch_on_master

合并分支feature到devel

$ git checkout devel
$ git merge feature
$ git show-branch
show_branch_on_devel_merged_feature

feature分支多次提交之后
multiple_commit

然后再将分支feature合并到devel
merge

结论
  • git show-branch输出
    输出分为上下两部分,使用短划线”-“分隔。两个分支使用两个短划线”–”,三个分支使用三个短划线”—“,依次类推。
    上半部分为层次缩进的分支列表,下半部分为commit列表。
    上半部分的分支列表中,使用标识当前分支,其他分支使用!标识。分支前的标识符或者!一直垂直贯通到下半部分,这一垂直列的符号都是属于这个分支的。
    下半部分的commit列表中,前导的符号有和+号。表示这一列上的分支(当前分支)有此commit。而+表示这一列上的分支(非当前分支)有此commit。

标识符的颜色只是用于容易区分列,一列的颜色是一致的,看起来更清楚。

  • 分支名字和commit标识
    show-branch输出中,上半部分的分支名字使用[分支名字]标识,下半部分的commit使用[分支名字]标识最后的commit,[分支名字^]标识该分支的上一个提交
    [分支名字~2]标识该分支的倒数第三个commit。这是commit的快捷标识符,在git命令中可以引用对应的commit,也可以直接使用commit的hash tag,不过比较不直观而已。
  • git branch
    branch只是简单的输出所有的分支,当前分支前使用*表示,当前分支的文字颜色为绿色。
  • merge
    一个commit只输出一次,分支被合并后,被合并分支的commit使用[合并分支]标识,但commit是属于两个分支的,所以commit的前面有两个标识符号*和+。
  • 分支名字空间
    git的分支名字空间是扁平的,共享同一个namespace。

===
[erq]

在这个多核的时代,代码的线程安全是应该优先被考虑的事情。

Read more »

过早优化是万恶之源(premature optimization is the root of all evil)

jQuery对象(实际是jQuery.fn.init对象)并不会继承jQuery.xxx这些jQuery名字空间下的函数,但可以调用这些函数,因为所有人都可以调用。jQuery.xxx函数只是使用了jQuery作为名字空间,避免了全局名字空间污染而已。当用普通方式调用jQuery.xxx函数时,this指针指向jQuery函数对象自身。

盒模型

一图胜千言:
box model

HTML元素实际占据content部分,外围是padding填充,再往外是border边框,最外面为margin空白。
padding又叫内边距,margin又叫外边距。

可以这样想象CSS盒模型:

有一个存储货物的仓库,货物用纸箱包装起来,因为货物很贵重,所以在货物和纸箱之间我们要加一些泡沫填充材料。货物就是HTML元素,填充的塑料泡沫就是padding,而纸箱本身就是border。因为货物很贵重,不能将箱子直接叠放在一起,所以我们有了margin,也就是箱子与箱子之间的空白。

而这些padding,border,margin都是可以调整的,如果货物比较廉价,那就不用太在意,直接将货物堆放在一起就可以了,这时候padding,border和margin就都为零了。

定位模型

HTML文档默认采用流式布局。

块元素(block)和行内元素(inline)

所有的HTML标签都遵守CSS Box Model,都是盒子,但是在HTML的流式布局中分为两种显示类型。

一种是块元素(block),比如div,p,h1等。这种元素在默认的流式布局中会独占一行,前后都会有断行符。

另一种是行内元素(inline),比如span,strong,input等。这种元素在在默认的流式布局只会占据必要的宽度,而且不会自动断行,会与其他行内元素和平共处,共享同一行(line box)。

可以使用水平方向的内边距(padding)、边框(border)和外边距(margin)调整行内元素的间距。但是,垂直方向内边距、边框和外边距不影响行内元素的高度。行的高度总是足以容纳它包含的所有内联元素,也可以通过设置行高增加这个行的高度。

HTML元素有默认的显示类型,block或inline。但可以通过使用display属性显式的更改它们的显示类型,比如将典型的块级元素div,设置为行内元素
[html]
div {display:inline;}
[/html]

如果将元素的display属性设置为none,则元素根本就不会显示。

定位(position)

HTML元素可以有4种不同的定位类型,使用positon元素来进行定位。

  • static
    这是默认的定位类型。元素在正常文档流中布局,块级元素生成一个矩形框,作为文档流的一部分,行内元素则会存在于行内。
    元素的top,bottom,left,right还有z-index属性都会被忽略。
  • relative
    元素相对于其在正常文档流中的位置(这个元素为static定位方式所应该占据的位置)定位。元素在正常文档流中的位置会保留,元素生成框的位置由’top’, ‘right’, ‘bottom’和’left’属性和包含块决定。如果不指定这些影响定位的属性,那么relative看起来与static没有差别,其实还是有差别的,比如可以作为absolute定位元素的相对定位父元素,而static元素则不可。
  • absolute
    元素从正常文档流中删除,不保留其位置。然后相对于第一个非static定位的父级元素(祖先)进行定位。从元素自身逐级上溯查找父级元素,直到找到第一个非static定位的元素,如果没有找到非static定位的父元素,则其定位相对于顶级容器元素(html in standards compliant mode; body in quirks rendering mode)body进行定位。但是absolute定位的元素会跟随定位的父元素移动。元素生成框的位置由’top’, ‘right’, ‘bottom’和’left’属性和包含块决定。

如果不指定其位置属性(top,bottom等),则元素会跟随在上一个正常文档流(没有被删除的,包括保留位置的relative定位元素)的位置之后定位,但其宽度只能容纳其实际内容,不会自动伸展。

虽然绝对定位框有外边距,这些外边距不与其他外边距折叠(Collapse)。

  • fixed
    元素相对于浏览器窗口(screen’s viewport)定位,就是绝对定位,fixed定位的元素不会随浏览器窗口滚动而移动。元素生成框的位置由’top’, ‘right’, ‘bottom’和’left’属性和包含块决定。
浮动(float)

浮动可以让某个元素脱离正常的文档流,漂浮在正常的文档流之外。浮动元素在正常文档流中的位置不会保留。浮动的设置有两个属性,float和clear。

float可以设置为left,right和none值,用于指定元素的浮动类型。

  • left
    元素向左侧浮动
  • right
    元素向右侧浮动
  • none
    默认值。元素不浮动,并会显示在其在正常文档流中应该出现的位置。

根据HTML代码中元素定义的顺序,如果浮动元素的上一个元素不是浮动的,则当前浮动元素紧随上一个非浮动元素的下一个元素位置(下一个元素的位置依据非浮动元素的显示类型而有所不同)处布局,根据float属性,靠左侧或右侧浮动。
如果浮动元素的上一个元素也是浮动元素,则当前浮动元素会紧随上一个元素在同一个行内进行浮动。

而clear则用于清除浮动,取值为left,right,both和none。

  • left
    不允许左侧有浮动元素
  • right
    不允许右侧有浮动元素
  • both
    左右两侧均不允许有浮动元素
  • none
    默认值。允许两边都可以有浮动元素

对于CSS的清除浮动(clear),有一点要注意,清除浮动只能影响使用清除的元素本身,不能影响其他元素。也就是说,比如想让A浮动元素右侧的B浮动元素移动到下一行,应该设置B浮动元素的clear属性为left,而不是在A元素中设置clear属性为right。也就是不能通过一个元素的clear属性强迫另一个元素移动,只能通过clear属性让自己移动。

z-index

CSS不但可以平面布局,还可以通过指定元素的堆叠次序来进行垂直布局(深度方向),这个属性就是z-index。(x,y)是平面,而z是垂直于平面的第三维。

只有非静态定位(static)的定位元素可以使用z-index属性,也就是只有position:absolute, position:relative, 或者position:fixed的元素可以使用z-index指定堆叠次序。

box-sizing

如果所有的浏览器都遵守W3C规范就不会有这个属性。不用看我,我说的就是你,低版本的IE!

CSS属性box-sizing用于更改默认的CSS盒模型来计算元素的宽度和高度。可以用这个属性来模拟没有正确支持CSS盒模型的浏览器。

这个属性的取值如下:

  • content-box
    CSS标准默认值。元素的宽度和高度属性只包含content,不包含padding,border和margin,
  • padding-box
    元素的宽度和高度属性包含content和padding,但不包含border和margin。目前这个属性只有firefox支持。
  • border-box
    元素的宽度和高度属性包含content,padding和border,但不包含margin。这种盒模型只在IE的怪异模式(Quirks mode)下使用。
    IE在版本6之前使用不规范的CSS盒模型,也就是现在所说的border-box,I6之后使用符合规范的CSS盒模型,但使用Quirks mode来支持之前的不规范盒模型,直到IE9。

不推荐使用这个属性,保持其默认值即可。

IE 10+才算是现代浏览器,之前的版本都应该被抛弃!

参考:
1、CSS Box Model
2、CSS Positioning
3、CSS Display and Visibility
4、CSS z-index Property
5、理解绝对定位和相对定位布局
5、CSS浮动(float,clear)经验分享
6、用z-index进行层次堆叠
7、CSS float 属性
8、CSS clear 属性
[9]box-sizing
[10]HTML DOM display 属性
[11]position

===
[erq]

批量查找文件内的字符串,并输出结果的行号,可以这样find . -name “*.foo” xargs grep -n -s ‘bar’或者grep -n -s ‘bar’ `find . -name “*.foo”`

Spring 3 内置支持5种scope(bound),还可以自定义scope。

  • singleton

如果没有明确的指定scope,默认就是singleton。Spring IoC容器只会创建一个singleton bean的实例,所有对这个bean的请求,spring都会返回这个实例。spring的singleton不同于GOF模式书中的singleton,GOF的singleton是每一个类装载器实例化一个对象,而spring是每一个容器实例化一个对象。
因为singleton是被共享的,因此singleton bean应该是无状态的,线程安全的,不然并发访问会出现问题。

  • prototype

每次请求prototype bean,容器会生成(或从缓存队列中挑选)一个新的bean实例,因此prototype bean没有并发的问题,因为没有共享问题。所有有状态的bean应该使用prototype scope,而所有无状态的bean应该使用singleton scope。
singleton bean的性能和节约资源方面会优于prototype bean

但是spring不会管理prototype bean的全部生命周期,spring只负责实例并初始化prototype bean,然后交付给客户就撒手不管了,客户使用完prototype bean后必须负责清理bean使用的资源。也可以通过bean post-processor让容器负责prototype bean的清理工作。

  • Request

每一个HTTP请求有一个Request scope bean的实例。每一个http请求会在一个单独的线程里处理,因此Request scope bean无需考虑并发问题。其他的HTTP请求不会看到另一个HTTP请求使用的bean实例的状态。

  • Session

每一个HTTP Session生成一个Session scope bean实例。会话之间是隔离的,因此也不会有并发问题。

  • Global session

只有portlet web应用程序中才有的scope,绑定到整个portlet Session。

注意事项:

1、只要有可能,尽量将bean设计为线程安全的,从而可以使用默认的singleton scope,提高程序的运行效率,减少对系统资源的占用。
可以通过使用ThreadLocal改造非线程安全的类,使其可以使用singleton scope。Spring和Mybatis的很多组件使用了这个技术。

2、@Controller, @Service, @Repository, @Compenent等注解修饰的bean默认都是singleton scope,因此一定要注意线程安全问题。非线程安全的类要么使用ThreadLocal改造为线程安全的,要么使用其他scope。

3、Request,Session和Global session只在web应用程序环境中存在。

4、通常不应该让容器管理细粒度的domain对象(又叫entity对象或者model对象),因为创建和管理domain对象是DAO和业务逻辑层的职责。实际上一定不要让容器管理domain对象,因为domain对象是state full的,非线程安全的,自己管理比交给容器管理更容易,更少出问题。
Typically one does not configure fine-grained domain objects in the container, because it is usually the responsibility of DAOs and business logic to create and load domain objects.

参考:
The IoC container

from spring:

Typically one does not configure fine-grained domain objects in the container, because it is usually the responsibility of DAOs and business logic to create and load domain objects.

添加cassandra源

新建source list文件/etc/apt/source.list.d/cassandra.list,在其中添加cassandra源

[javascript]
deb http://www.apache.org/dist/cassandra/debian 20x main
deb-src http://www.apache.org/dist/cassandra/debian 20x main
[/javascript]

20x表示使用2.0.x系列版本,20x目前是最新的,可选12x,11x等。

添加源的public key

1
2
3
4
$ gpg --keyserver pgp.mit.edu --recv-keys F758CE318D77295D
$ gpg --export --armor F758CE318D77295D sudo apt-key add -
$ gpg --keyserver pgp.mit.edu --recv-keys 2B5C1B00
$ gpg --export --armor 2B5C1B00 sudo apt-key add -

输出:

1
2
3
4
5
6
7
8
9
10
gpg: requesting key 8D77295D from hkp server pgp.mit.edu
gpg: key 8D77295D: public key "Eric Evans " imported
gpg: no ultimately trusted keys found
gpg: Total number processed: 1
gpg: imported: 1 (RSA: 1)

gpg: requesting key 2B5C1B00 from hkp server pgp.mit.edu
gpg: key 2B5C1B00: public key "Sylvain Lebresne (pcmanus) " imported
gpg: Total number processed: 1
gpg: imported: 1 (RSA: 1)

安装cassandra

1
2
# apt-get update
# apt-get install cassandra

update(06/21/2019)

当前最新的release版本系列为311x,当前还在支持的release版本系列还有30x, 22x, or 21x
22x的最新版本为2.2.14,下面以安装2.2.14为例:

添加源

1
$ echo "deb http://www.apache.org/dist/cassandra/debian 22x main" sudo tee -a /etc/apt/sources.list.d/cassandra.sources.list

添加仓库公钥key

1
$ curl https://www.apache.org/dist/cassandra/KEYS sudo apt-key add -

安装

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
$ sudo apt update

$ apt-cache show cassandra

Package: cassandra
Version: 2.2.14
Architecture: all
Maintainer: Eric Evans <eevans@apache.org>
Installed-Size: 32142
Depends: openjdk-7-jre-headless java7-runtime, adduser, python (>= 2.7)
Recommends: ntp time-daemon
Suggests: cassandra-tools
Conflicts: apache-cassandra1
Replaces: apache-cassandra1
Homepage: http://cassandra.apache.org
Priority: extra
Section: misc
Filename: pool/main/c/cassandra/cassandra_2.2.14_all.deb
Size: 24139668
SHA256: 17cbe0fffe313eb066f4b446cc23883fa82f96e42e076f82389c7f0c8e1d7ac3
SHA1: 2636dd7a5eb5f02572f42e09cf85c2dc01842484
MD5sum: e0ad56afe1b5c428bb296312cef6b73a
Description: distributed storage system for structured data
Cassandra is a distributed (peer-to-peer) system for the management
and storage of structured data.
Description-md5: 449c17857a17bf5afa4d96fab0cc89e5

$ sudo apt install cassandra

References:
[1]Downloading Cassandra