Ubuntu 搭建 GitLab

1.首先是安装一些依赖服务

sudo apt-get install curl openssh-server ca-certificates postfix
2.官方的建议是使用脚本直接执行安装

sudo curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
sudo apt-get install gitlab-ce

3.打开/etc/gitlab/gitlab.rb,将external_url = ‘http://git.example.com’修改为自己的域名地址:http://example.com,默认为80端口,如要使用其他端口后面加上端口号,如:http://127.0.0.1:8080。

然后执行:
sudo gitlab-ctl reconfigure
启动完成后浏览器访问配置好的地址,应该出现重置管理员密码的界面。

6.检查GitLab是否安装好并且已经正确运行,输入下面的命令

sudo gitlab-ctl status
如果得到类似下面的结果,则说明GitLab运行正常

run: gitlab-workhorse: (pid 1148) 884s; run: log: (pid 1132) 884s
run: logrotate: (pid 1150) 884s; run: log: (pid 1131) 884s
run: nginx: (pid 1144) 884s; run: log: (pid 1129) 884s
run: postgresql: (pid 1147) 884s; run: log: (pid 1130) 884s
run: redis: (pid 1146) 884s; run: log: (pid 1133) 884s
run: sidekiq: (pid 1145) 884s; run: log: (pid 1128) 884s
run: unicorn: (pid 1149) 885s; run: log: (pid 1134) 885s

汉化

1.下载社区提供的汉化包,在 https://gitlab.com/xhang/gitlab/ 中找到相应的汉化分支。
sudo wget wget -cO gitlab-9.0_zh.tar.gz https://gitlab.com/xhang/gitlab/repository/archive.tar.gz?ref=9-0-stable-zh

2.解压包
sudo tar zxvf gitlab-9.0_zh.tar.gz

3.停止 GitLab 服务
sudo gitlab-ctl stop

4.备份 gitlab-rails 目录,该目录下主要是web应用部分,也是当前项目仓库的起始版本,也是汉化包要覆盖的目录。
sudo tar zcvf /opt/gitlab/embedded/service/gitlab-rails-bak.tar.gz gitlab-rails

5.将解压后的汉化补丁覆盖原来的
sudo cp -rf gitlab-9-0-stable-zh/* gitlab-rails/

6.启动服务
sudo gitlab-ctl start

7.重新执行配置命令
sudo gitlab-ctl reconfigure

汉化完成

owncloud简单的优化

1、查看回收站的文件大小
du -sh /var/www/html/files/hfhleo/files_trashbin/*

2、修改回收站保存的时间
vim /var/www/html/yunpan/config/config.php

'trashbin_retention_obligation' => 'auto,5',

2、修改版本保存的时间
vim /var/www/html/yunpan/config/config.php

'versions_retention_obligation' => 'auto,5',

前端规范-css

css规范

[强制] 属性定义后必须以分号结尾。
示例:
/* good */
.selector {
margin: 0;
}

/* bad */
.selector {
margin: 0
}
[建议] 选择器的嵌套层级应不大于 3 级,位置靠后的限定条件应尽可能精确。
示例:
/* good */
#username input {}
.comment .avatar {}

/* bad */
.page .header .login #username input {}
.comment div * {}
[建议] 在可以使用缩写的情况下,尽量使用属性缩写。
示例:
/* good */
.post {
font: 12px/1.5 arial, sans-serif;
}

/* bad */
.post {
font-family: arial, sans-serif;
font-size: 12px;
line-height: 1.5;
}
[建议] 选择器的嵌套层级应不大于 3 级,位置靠后的限定条件应尽可能精确。
示例:
/* good */
#username input {}
.comment .avatar {}

/* bad */
.page .header .login #username input {}
.comment div * {}
3.2 属性缩写
[建议] 在可以使用缩写的情况下,尽量使用属性缩写。
示例:
/* good */
.post {
font: 12px/1.5 arial, sans-serif;
}

/* bad */
.post {
font-family: arial, sans-serif;
font-size: 12px;
line-height: 1.5;
}
3.4 清除浮动
[建议] 当元素需要撑起高度以包含内部的浮动元素时,通过对伪类设置 clear 或触发 BFC 的方式进行 clearfix。尽量不使用增加空标签的方式。
解释:
触发 BFC 的方式很多,常见的有:
• float 非 none
• position 非 static
• overflow 非 visible
如希望使用更小副作用的清除浮动方法,参见 A new micro clearfix hack 一文。
另需注意,对已经触发 BFC 的元素不需要再进行 clearfix。
3.5 !important
[建议] 尽量不使用 !important 声明。
[建议] 当需要强制指定样式且不允许任何场景覆盖时,通过标签内联和 !important 定义样式。
解释:
必须注意的是,仅在设计上 确实不允许任何其它场景覆盖样式 时,才使用内联的 !important 样式。通常在第三方环境的应用中使用这种方案。下面的 z-index 章节是其中一个特殊场景的典型样例。
3.6 z-index
[建议] 将 z-index 进行分层,对文档流外绝对定位元素的视觉层级关系进行管理。
解释:
同层的多个元素,如多个由用户输入触发的 Dialog,在该层级内使用相同的 z-index 或递增 z-index。
建议每层包含100个 z-index 来容纳足够的元素,如果每层元素较多,可以调整这个数值。
[建议] 在可控环境下,期望显示在最上层的元素,z-index 指定为 999999。
解释:
可控环境分成两种,一种是自身产品线环境;还有一种是可能会被其他产品线引用,但是不会被外部第三方的产品引用。
不建议取值为 2147483647。以便于自身产品线被其他产品线引用时,当遇到层级覆盖冲突的情况,留出向上调整的空间。
[建议] 在第三方环境下,期望显示在最上层的元素,通过标签内联和 !important,将 z-index 指定为 2147483647。
解释:
第三方环境对于开发者来说完全不可控。在第三方环境下的元素,为了保证元素不被其页面其他样式定义覆盖,需要采用此做法。
4.2 数值
[强制] 当数值为 0 – 1 之间的小数时,省略整数部分的 0。
示例:
/* good */
panel {
opacity: .8;
}

/* bad */
panel {
opacity: 0.8;
}
4.4 长度
[强制] 长度为 0 时须省略单位。 (也只有长度单位可省)
示例:
/* good */
body {
padding: 0 5px;
}

/* bad */
body {
padding: 0px 5px;
}
4.5 颜色
[强制] RGB颜色值必须使用十六进制记号形式 #rrggbb。不允许使用 rgb()。
解释:
带有alpha的颜色信息可以使用 rgba()。使用 rgba() 时每个逗号后必须保留一个空格。
示例:
/* good */
.success {
box-shadow: 0 0 2px rgba(0, 128, 0, .3);
border-color: #008000;
}

/* bad */
.success {
box-shadow: 0 0 2px rgba(0,128,0,.3);
border-color: rgb(0, 128, 0);
}
[强制] 颜色值可以缩写时,必须使用缩写形式。
示例:
/* good */
.success {
background-color: #aca;
}

/* bad */
.success {
background-color: #aaccaa;
}
[强制] 颜色值不允许使用命名色值。
示例:
/* good */
.success {
color: #90ee90;
}

/* bad */
.success {
color: lightgreen;
}
[建议] 颜色值中的英文字符采用小写。如不用小写也需要保证同一项目内保持大小写一致。
示例:
/* good */
.success {
background-color: #aca;
color: #90ee90;
}

/* good */
.success {
background-color: #ACA;
color: #90EE90;
}

/* bad */
.success {
background-color: #ACA;
color: #90ee90;
}
4.6 2D 位置
[强制] 必须同时给出水平和垂直方向的位置。
解释:
2D 位置初始值为 0% 0%,但在只有一个方向的值时,另一个方向的值会被解析为 center。为避免理解上的困扰,应同时给出两个方向的值。background-position属性值的定义
示例:
/* good */
body {
background-position: center top; /* 50% 0% */
}

/* bad */
body {
background-position: top; /* 50% 0% */
}
5.1 字体族
[强制] font-family 属性中的字体族名称应使用字体的英文 Family Name,其中如有空格,须放置在引号中。
解释:
所谓英文 Family Name,为字体文件的一个元数据,常见名称如下:
字体 操作系统 Family Name
宋体 (中易宋体) Windows SimSun
黑体 (中易黑体) Windows SimHei
微软雅黑 Windows Microsoft YaHei
微软正黑 Windows Microsoft JhengHei
华文黑体 Mac/iOS STHeiti
冬青黑体 Mac/iOS Hiragino Sans GB
文泉驿正黑 Linux WenQuanYi Zen Hei
文泉驿微米黑 Linux WenQuanYi Micro Hei
示例:
h1 {
font-family: “Microsoft YaHei”;
}
[强制] font-family 不区分大小写,但在同一个项目中,同样的 Family Name 大小写必须统一。
示例:
/* good */
body {
font-family: Arial, sans-serif;
}

h1 {
font-family: Arial, “Microsoft YaHei”, sans-serif;
}

/* bad */
body {
font-family: arial, sans-serif;
}

h1 {
font-family: Arial, “Microsoft YaHei”, sans-serif;
}
5.2 字号
[强制] 需要在 Windows 平台显示的中文内容,其字号应不小于 12px。
解释:
由于 Windows 的字体渲染机制,小于 12px 的文字显示效果极差、难以辨认。
5.3 字体风格
[建议] 需要在 Windows 平台显示的中文内容,不要使用除 normal 外的 font-style。其他平台也应慎用。
解释:
由于中文字体没有 italic 风格的实现,所有浏览器下都会 fallback 到 obilique 实现 (自动拟合为斜体),小字号下 (特别是 Windows 下会在小字号下使用点阵字体的情况下) 显示效果差,造成阅读困难。
5.4 字重
[强制] font-weight 属性必须使用数值方式描述。
解释:
CSS 的字重分 100 – 900 共九档,但目前受字体本身质量和浏览器的限制,实际上支持 400 和 700 两档,分别等价于关键词 normal 和 bold。
浏览器本身使用一系列启发式规则来进行匹配,在 <700 时一般匹配字体的 Regular 字重,>=700 时匹配 Bold 字重。
但已有浏览器开始支持 =600 时匹配 Semibold 字重 (见此表),故使用数值描述增加了灵活性,也更简短。
示例:
/* good */
h1 {
font-weight: 700;
}

/* bad */
h1 {
font-weight: bold;
}

前端规范

css规范

[强制] 属性定义后必须以分号结尾。
示例:
/* good */
.selector {
margin: 0;
}

/* bad */
.selector {
margin: 0
}
[建议] 选择器的嵌套层级应不大于 3 级,位置靠后的限定条件应尽可能精确。
示例:
/* good */
#username input {}
.comment .avatar {}

/* bad */
.page .header .login #username input {}
.comment div * {}
[建议] 在可以使用缩写的情况下,尽量使用属性缩写。
示例:
/* good */
.post {
font: 12px/1.5 arial, sans-serif;
}

/* bad */
.post {
font-family: arial, sans-serif;
font-size: 12px;
line-height: 1.5;
}
[建议] 选择器的嵌套层级应不大于 3 级,位置靠后的限定条件应尽可能精确。
示例:
/* good */
#username input {}
.comment .avatar {}

/* bad */
.page .header .login #username input {}
.comment div * {}
3.2 属性缩写
[建议] 在可以使用缩写的情况下,尽量使用属性缩写。
示例:
/* good */
.post {
font: 12px/1.5 arial, sans-serif;
}

/* bad */
.post {
font-family: arial, sans-serif;
font-size: 12px;
line-height: 1.5;
}
3.4 清除浮动
[建议] 当元素需要撑起高度以包含内部的浮动元素时,通过对伪类设置 clear 或触发 BFC 的方式进行 clearfix。尽量不使用增加空标签的方式。
解释:
触发 BFC 的方式很多,常见的有:
• float 非 none
• position 非 static
• overflow 非 visible
如希望使用更小副作用的清除浮动方法,参见 A new micro clearfix hack 一文。
另需注意,对已经触发 BFC 的元素不需要再进行 clearfix。
3.5 !important
[建议] 尽量不使用 !important 声明。
[建议] 当需要强制指定样式且不允许任何场景覆盖时,通过标签内联和 !important 定义样式。
解释:
必须注意的是,仅在设计上 确实不允许任何其它场景覆盖样式 时,才使用内联的 !important 样式。通常在第三方环境的应用中使用这种方案。下面的 z-index 章节是其中一个特殊场景的典型样例。
3.6 z-index
[建议] 将 z-index 进行分层,对文档流外绝对定位元素的视觉层级关系进行管理。
解释:
同层的多个元素,如多个由用户输入触发的 Dialog,在该层级内使用相同的 z-index 或递增 z-index。
建议每层包含100个 z-index 来容纳足够的元素,如果每层元素较多,可以调整这个数值。
[建议] 在可控环境下,期望显示在最上层的元素,z-index 指定为 999999。
解释:
可控环境分成两种,一种是自身产品线环境;还有一种是可能会被其他产品线引用,但是不会被外部第三方的产品引用。
不建议取值为 2147483647。以便于自身产品线被其他产品线引用时,当遇到层级覆盖冲突的情况,留出向上调整的空间。
[建议] 在第三方环境下,期望显示在最上层的元素,通过标签内联和 !important,将 z-index 指定为 2147483647。
解释:
第三方环境对于开发者来说完全不可控。在第三方环境下的元素,为了保证元素不被其页面其他样式定义覆盖,需要采用此做法。
4.2 数值
[强制] 当数值为 0 – 1 之间的小数时,省略整数部分的 0。
示例:
/* good */
panel {
opacity: .8;
}

/* bad */
panel {
opacity: 0.8;
}
4.4 长度
[强制] 长度为 0 时须省略单位。 (也只有长度单位可省)
示例:
/* good */
body {
padding: 0 5px;
}

/* bad */
body {
padding: 0px 5px;
}
4.5 颜色
[强制] RGB颜色值必须使用十六进制记号形式 #rrggbb。不允许使用 rgb()。
解释:
带有alpha的颜色信息可以使用 rgba()。使用 rgba() 时每个逗号后必须保留一个空格。
示例:
/* good */
.success {
box-shadow: 0 0 2px rgba(0, 128, 0, .3);
border-color: #008000;
}

/* bad */
.success {
box-shadow: 0 0 2px rgba(0,128,0,.3);
border-color: rgb(0, 128, 0);
}
[强制] 颜色值可以缩写时,必须使用缩写形式。
示例:
/* good */
.success {
background-color: #aca;
}

/* bad */
.success {
background-color: #aaccaa;
}
[强制] 颜色值不允许使用命名色值。
示例:
/* good */
.success {
color: #90ee90;
}

/* bad */
.success {
color: lightgreen;
}
[建议] 颜色值中的英文字符采用小写。如不用小写也需要保证同一项目内保持大小写一致。
示例:
/* good */
.success {
background-color: #aca;
color: #90ee90;
}

/* good */
.success {
background-color: #ACA;
color: #90EE90;
}

/* bad */
.success {
background-color: #ACA;
color: #90ee90;
}
4.6 2D 位置
[强制] 必须同时给出水平和垂直方向的位置。
解释:
2D 位置初始值为 0% 0%,但在只有一个方向的值时,另一个方向的值会被解析为 center。为避免理解上的困扰,应同时给出两个方向的值。background-position属性值的定义
示例:
/* good */
body {
background-position: center top; /* 50% 0% */
}

/* bad */
body {
background-position: top; /* 50% 0% */
}
5.1 字体族
[强制] font-family 属性中的字体族名称应使用字体的英文 Family Name,其中如有空格,须放置在引号中。
解释:
所谓英文 Family Name,为字体文件的一个元数据,常见名称如下:
字体 操作系统 Family Name
宋体 (中易宋体) Windows SimSun
黑体 (中易黑体) Windows SimHei
微软雅黑 Windows Microsoft YaHei
微软正黑 Windows Microsoft JhengHei
华文黑体 Mac/iOS STHeiti
冬青黑体 Mac/iOS Hiragino Sans GB
文泉驿正黑 Linux WenQuanYi Zen Hei
文泉驿微米黑 Linux WenQuanYi Micro Hei
示例:
h1 {
font-family: “Microsoft YaHei”;
}
[强制] font-family 不区分大小写,但在同一个项目中,同样的 Family Name 大小写必须统一。
示例:
/* good */
body {
font-family: Arial, sans-serif;
}

h1 {
font-family: Arial, “Microsoft YaHei”, sans-serif;
}

/* bad */
body {
font-family: arial, sans-serif;
}

h1 {
font-family: Arial, “Microsoft YaHei”, sans-serif;
}
5.2 字号
[强制] 需要在 Windows 平台显示的中文内容,其字号应不小于 12px。
解释:
由于 Windows 的字体渲染机制,小于 12px 的文字显示效果极差、难以辨认。
5.3 字体风格
[建议] 需要在 Windows 平台显示的中文内容,不要使用除 normal 外的 font-style。其他平台也应慎用。
解释:
由于中文字体没有 italic 风格的实现,所有浏览器下都会 fallback 到 obilique 实现 (自动拟合为斜体),小字号下 (特别是 Windows 下会在小字号下使用点阵字体的情况下) 显示效果差,造成阅读困难。
5.4 字重
[强制] font-weight 属性必须使用数值方式描述。
解释:
CSS 的字重分 100 – 900 共九档,但目前受字体本身质量和浏览器的限制,实际上支持 400 和 700 两档,分别等价于关键词 normal 和 bold。
浏览器本身使用一系列启发式规则来进行匹配,在 <700 时一般匹配字体的 Regular 字重,>=700 时匹配 Bold 字重。
但已有浏览器开始支持 =600 时匹配 Semibold 字重 (见此表),故使用数值描述增加了灵活性,也更简短。
示例:
/* good */
h1 {
font-weight: 700;
}

/* bad */
h1 {
font-weight: bold;
}

其它规范

HTML
语法
用两个空格来代替制表符(tab) – 这是唯一能保证在所有环境下获得一致展现的方法。
嵌套元素应当缩进一次(即两个空格)。
对于属性的定义,确保全部使用双引号,绝不要使用单引号。
不要在自闭合(self-closing)元素的尾部添加斜线 – HTML5 规范中明确说明这是可选的。
不要省略可选的结束标签(closing tag)(例如,

或 )。
[code lang=”js”]
<!DOCTYPE html>
<html>
<head>
<title>Page title</title>
</head>
<body>
<img src="images/company-logo.png" alt="Company">
<h1 class="hello-world">Hello, world!</h1>
</body>
</html>
[/code]

HTML5 doctype
为每个 HTML 页面的第一行添加标准模式(standard mode)的声明,这样能够确保在每个浏览器中拥有一致的展现。
[code lang=”js”]
<!DOCTYPE html>
<html>
<head>
</head>
</html>
[/code]

语言属性

根据 HTML5 规范:
强烈建议为 html 根元素指定 lang 属性,从而为文档设置正确的语言。这将有助于语音合成工具确定其所应该采用的发音,有助于翻译工具确定其翻译时所应遵守的规则等等。

更多关于 lang 属性的知识可以从 此规范 中了解。

这里列出了语言代码表。





IE 兼容模式

IE 支持通过特定的 标签来确定绘制当前页面所应该采用的 IE 版本。除非有强烈的特殊需求,否则最好是设置为 edge mode,从而通知 IE 采用其所支持的最新的模式。

阅读这篇 stack overflow 上的文章可以获得更多有用的信息。

[code lang=”js”]<meta http-equiv="X-UA-Compatible" content="IE=Edge">[/code]

引入 CSS 和 JavaScript 文件

根据 HTML5 规范,在引入 CSS 和 JavaScript 文件时一般不需要指定 type 属性,因为 text/css 和 text/javascript 分别是它们的默认值。

HTML5 spec links

Using link
Using style
Using script



实用为王

尽量遵循 HTML 标准和语义,但是不要以牺牲实用性为代价。任何时候都要尽量使用最少的标签并保持最小的复杂度。

属性顺序
HTML 属性应当按照以下给出的顺序依次排列,确保代码的易读性。
class
id, name
data-*
src, for, type, href
title, alt
aria-*, role
class 用于标识高度可复用组件,因此应该排在首位。id 用于标识具体组件,应当谨慎使用(例如,页面内的书签),因此排在第二位。
[code lang=”js”]
<a class="…" id="…" data-modal="toggle" href="#">
Example link
</a>

<input class="form-control" type="text">

<img src="…" alt="…">
[/code]
布尔(boolean)型属性

布尔型属性可以在声明时不赋值。XHTML 规范要求为其赋值,但是 HTML5 规范不需要。

更多信息请参考 WhatWG section on boolean attributes:

元素的布尔型属性如果有值,就是 true,如果没有值,就是 false。

如果一定要为其赋值的话,请参考 WhatWG 规范:

如果属性存在,其值必须是空字符串或 […] 属性的规范名称,并且不要再收尾添加空白符。

简单来说,就是不用赋值。


减少标签的数量

编写 HTML 代码时,尽量避免多余的父元素。很多时候,这需要迭代和重构来实现。请看下面的案例:






JavaScript 生成的标签

通过 JavaScript 生成的标签让内容变得不易查找、编辑,并且降低性能。能避免时尽量避免。

CSS
语法

用两个空格来代替制表符(tab) – 这是唯一能保证在所有环境下获得一致展现的方法。
为选择器分组时,将单独的选择器单独放在一行。
为了代码的易读性,在每个声明块的左花括号前添加一个空格。
声明块的右花括号应当单独成行。
每条声明语句的 : 后应该插入一个空格。
为了获得更准确的错误报告,每条声明都应该独占一行。
所有声明语句都应当以分号结尾。最后一条声明语句后面的分号是可选的,但是,如果省略这个分号,你的代码可能更易出错。
对于以逗号分隔的属性值,每个逗号后面都应该插入一个空格(例如,box-shadow)。
不要在 rgb()、rgba()、hsl()、hsla() 或 rect() 值的内部的逗号后面插入空格。这样利于从多个属性值(既加逗号也加空格)中区分多个颜色值(只加逗号,不加空格)。
对于属性值或颜色参数,省略小于 1 的小数前面的 0 (例如,.5 代替 0.5;-.5px 代替 -0.5px)。
十六进制值应该全部小写,例如,#fff。在扫描文档时,小写字符易于分辨,因为他们的形式更易于区分。
尽量使用简写形式的十六进制值,例如,用 #fff 代替 #ffffff。
为选择器中的属性添加双引号,例如,input[type=”text”]。只有在某些情况下是可选的,但是,为了代码的一致性,建议都加上双引号。
避免为 0 值指定单位,例如,用 margin: 0; 代替 margin: 0px;。
对于这里用到的术语有疑问吗?请参考 Wikipedia 上的 syntax section of the Cascading Style Sheets article。

/* Bad CSS */
.selector, .selector-secondary, .selector[type=text] {
padding:15px;
margin:0px 0px 15px;
background-color:rgba(0, 0, 0, 0.5);
box-shadow:0px 1px 2px #CCC,inset 0 1px 0 #FFFFFF
}

/* Good CSS */
.selector,
.selector-secondary,
.selector[type=”text”] {
padding: 15px;
margin-bottom: 15px;
background-color: rgba(0,0,0,.5);
box-shadow: 0 1px 2px #ccc, inset 0 1px 0 #fff;
}
声明顺序

相关的属性声明应当归为一组,并按照下面的顺序排列:

Positioning
Box model
Typographic
Visual
由于定位(positioning)可以从正常的文档流中移除元素,并且还能覆盖盒模型(box model)相关的样式,因此排在首位。盒模型排在第二位,因为它决定了组件的尺寸和位置。

其他属性只是影响组件的内部(inside)或者是不影响前两组属性,因此排在后面。

完整的属性列表及其排列顺序请参考 Recess。

.declaration-order {
/* Positioning */
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: 100;

/* Box-model */
display: block;
float: right;
width: 100px;
height: 100px;

/* Typography */
font: normal 13px “Helvetica Neue”, sans-serif;
line-height: 1.5;
color: #333;
text-align: center;

/* Visual */
background-color: #f5f5f5;
border: 1px solid #e5e5e5;
border-radius: 3px;

/* Misc */
opacity: 1;
}
不要使用 @import

标签相比,@import 指令要慢很多,不光增加了额外的请求次数,还会导致不可预料的问题。替代办法有以下几种:

使用多个 元素
通过 Sass 或 Less 类似的 CSS 预处理器将多个 CSS 文件编译为一个文件
通过 Rails、Jekyll 或其他系统中提供过 CSS 文件合并功能
请参考 Steve Souders 的文章了解更多知识。

媒体查询(Media query)的位置

将媒体查询放在尽可能相关规则的附近。不要将他们打包放在一个单一样式文件中或者放在文档底部。如果你把他们分开了,将来只会被大家遗忘。下面给出一个典型的实例。

.element { … }
.element-avatar { … }
.element-selected { … }

@media (min-width: 480px) {
.element { …}
.element-avatar { … }
.element-selected { … }
}
带前缀的属性

当使用特定厂商的带有前缀的属性时,通过缩进的方式,让每个属性的值在垂直方向对齐,这样便于多行编辑。

在 Textmate 中,使用 Text → Edit Each Line in Selection (⌃⌘A)。在 Sublime Text 2 中,使用 Selection → Add Previous Line (⌃⇧↑) 和 Selection → Add Next Line (⌃⇧↓)。

/* Prefixed properties */
.selector {
-webkit-box-shadow: 0 1px 2px rgba(0,0,0,.15);
box-shadow: 0 1px 2px rgba(0,0,0,.15);
}
单行规则声明

对于只包含一条声明的样式,为了易读性和便于快速编辑,建议将语句放在同一行。对于带有多条声明的样式,还是应当将声明分为多行。

这样做的关键因素是为了错误检测 – 例如,CSS 校验器指出在 183 行有语法错误。如果是单行单条声明,你就不会忽略这个错误;如果是单行多条声明的话,你就要仔细分析避免漏掉错误了。

/* Single declarations on one line */
.span1 { width: 60px; }
.span2 { width: 140px; }
.span3 { width: 220px; }

/* Multiple declarations, one per line */
.sprite {
display: inline-block;
width: 16px;
height: 15px;
background-image: url(../img/sprite.png);
}
.icon { background-position: 0 0; }
.icon-home { background-position: 0 -20px; }
.icon-account { background-position: 0 -40px; }
简写形式的属性声明

在需要显示地设置所有值的情况下,应当尽量限制使用简写形式的属性声明。常见的滥用简写属性声明的情况如下:

padding
margin
font
background
border
border-radius
大部分情况下,我们不需要为简写形式的属性声明指定所有值。例如,HTML 的 heading 元素只需要设置上、下边距(margin)的值,因此,在必要的时候,只需覆盖这两个值就可以。过度使用简写形式的属性声明会导致代码混乱,并且会对属性值带来不必要的覆盖从而引起意外的副作用。

MDN(Mozilla Developer Network)上一片非常好的关于shorthand properties 的文章,对于不太熟悉简写属性声明及其行为的用户很有用。

/* Bad example */
.element {
margin: 0 0 10px;
background: red;
background: url(“image.jpg”);
border-radius: 3px 3px 0 0;
}

/* Good example */
.element {
margin-bottom: 10px;
background-color: red;
background-image: url(“image.jpg”);
border-top-left-radius: 3px;
border-top-right-radius: 3px;
}
Less 和 Sass 中的嵌套

避免非必要的嵌套。这是因为虽然你可以使用嵌套,但是并不意味着应该使用嵌套。只有在必须将样式限制在父元素内(也就是后代选择器),并且存在多个需要嵌套的元素时才使用嵌套。

// Without nesting
.table > thead > tr > th { … }
.table > thead > tr > td { … }

// With nesting
.table > thead > tr {
> th { … }
> td { … }
}
注释

代码是由人编写并维护的。请确保你的代码能够自描述、注释良好并且易于他人理解。好的代码注释能够传达上下文关系和代码目的。不要简单地重申组件或 class 名称。

对于较长的注释,务必书写完整的句子;对于一般性注解,可以书写简洁的短语。

/* Bad example */
/* Modal header */
.modal-header {

}

/* Good example */
/* Wrapping element for .modal-title and .modal-close */
.modal-header {

}
class 命名

class 名称中只能出现小写字符和破折号(dashe)(不是下划线,也不是驼峰命名法)。破折号应当用于相关 class 的命名(类似于命名空间)(例如,.btn 和 .btn-danger)。
避免过度任意的简写。.btn 代表 button,但是 .s 不能表达任何意思。
class 名称应当尽可能短,并且意义明确。
使用有意义的名称。使用有组织的或目的明确的名称,不要使用表现形式(presentational)的名称。
基于最近的父 class 或基本(base) class 作为新 class 的前缀。
使用 .js-* class 来标识行为(与样式相对),并且不要将这些 class 包含到 CSS 文件中。
在为 Sass 和 Less 变量命名是也可以参考上面列出的各项规范。

/* Bad example */
.t { … }
.red { … }
.header { … }

/* Good example */
.tweet { … }
.important { … }
.tweet-header { … }
选择器

对于通用元素使用 class ,这样利于渲染性能的优化。
对于经常出现的组件,避免使用属性选择器(例如,[class^=”…”])。浏览器的性能会受到这些因素的影响。
选择器要尽可能短,并且尽量限制组成选择器的元素个数,建议不要超过 3 。
只有在必要的时候才将 class 限制在最近的父元素内(也就是后代选择器)(例如,不使用带前缀的 class 时 – 前缀类似于命名空间)。

centos6.5搭建ownCloud

1、用yum安装基本的LAMP环境:
[code]
yum -y install httpd mysql mysql-server
yum -y install httpd-manual mod_ssl mod_perl mod_auth_mysql
[/code]
由于最新版本owncloud-7.0.2.tar.bz2要求php版本在5.3.8以上,centos 6.5 64bit默认Yum是5.3.3,所以要改yum源
[code]
rpm -Uvh http://mirror.webtatic.com/yum/el6/latest.rpm
[/code]
2、安装php5.5以及扩展
[code]
yum install php55w php55w-bcmath php55w-cli php55w-common php55w-devel php55w-fpm php55w-gd php55w-imap php55w-ldap php55w-mbstring php55w-mcrypt php55w-mysql php55w-odbc php55w-pdo php55w-pear php55w-pecl-igbinary php55w-xml php55w-xmlrpc php55w-opcache php55w-intl php55w-pecl-memcache
[/code]
3、启动httpd和mysqld
[code]
/etc/init.d/httpd start
/etc/init.d/mysqld start
[/code]
4、创建一个名为’ownclouddb’和数据库用户’ownclouduser’以及密码是’password’的数据库
[code]
mysql -uroot -p
mysql> CREATE DATABASE ownclouddb;
mysql>GRANT ALL ON ownclouddb.* TO ownclouduser@localhost IDENTIFIED BY ‘password’;
[/code]
5、下载最新版本的owncloud
[code]
wget https://download.owncloud.org/community/owncloud-9.1.1.tar.bz2
[/code]
6、解压和设置权限
[code]
tar xvf owncloud-7.0.2.tar.bz2
mv owncloud /var/www/html
chown -R apache:apache /var/www/html/owncloud
chmod 777 /var/www/html/owncloud/
[/code]
7、启用apache重写模式
[code]
vi /etc/httpd/conf/httpd.conf
[/code]
查找并修改 AllowOverride None 为 Allowoverride All
[code]
Options FollowSymLinks
AllowOverride All
[/code]
8、重启httpd
[code]
/etc/init.d/httpd restart
[/code]
9、owncloud开始安装和配置,浏览器打开网址执行安装步骤:
http://IP地址/owncloud/
为了配置数据库,点“Advanced” 选择MySQL,然后输入MySQL的数据库名ownclouddb、用户名ownclouduser和密码password。
你要建立一个管理员帐号,输入必填的用户名和密码。然后点击“finish”完成安装过程。

10、如果https不能连接,需要安装sll
[code]
yum install mod_ssl
[/code]

svn搭建

检查已安装版本
#检查是否安装了低版本的SVN
[root@localhost /]# rpm -qa subversion

#卸载旧版本SVN
[root@localhost modules]# yum remove subversion

安装SVN
[root@localhost modules]# yum install httpd httpd-devel subversion mod_dav_svn mod_auth_mysql

确认已安装了svn模块
[root@localhost /]# cd /etc/httpd/modules
[root@localhost modules]# ls | grep svn
mod_authz_svn.so
mod_dav_svn.so

验证安装
检验已经安装的SVN版本信息
[root@localhost modules]# svnserve –version

[code]
svnserve,版本 1.6.11 (r934486)
编译于 Jun 23 2012,00:44:03
版权所有 (C) 2000-2009 CollabNet。
Subversion 是开放源代码软件,请参阅 http://subversion.tigris.org/ 站点。
此产品包含由 CollabNet(http://www.Collab.Net/) 开发的软件。

下列版本库后端(FS) 模块可用:

* fs_base : 模块只能操作BDB版本库。
* fs_fs : 模块与文本文件(FSFS)版本库一起工作。

Cyrus SASL 认证可用。
[/code]

代码库创建
SVN软件安装完成后还需要建立SVN库
[root@localhost modules]# mkdir -p /var/www/html/svn/sites
[root@localhost modules]# svnadmin create /var/www/html/svn/sites
执行上面的命令后,自动建立sites库,查看/var/www/html/svn/sites 文件夹发现包含了conf, db,format,hooks, locks, README.txt等文件,说明一个SVN库已经建立。

配置代码库
进入上面生成的文件夹conf下,进行配置
[root@localhost modules]# cd /var/www/html/svn/sites/conf

用户密码passwd配置
[root@localhost password]# cd /var/www/html/svn/sites/conf
[root@admin conf]# vi + passwd
修改passwd为以下内容:
[code]
[users]
# harry = harryssecret
# sally = sallyssecret
hfhleo=hfh12345
[/code]

权限控制authz配置
[root@admin conf]# vi + authz
目的是设置哪些用户可以访问哪些目录,向authz文件追加以下内容:

[code]
#设置[/]代表根目录下所有的资源
[/]
zhoulf=rw
[/code]

服务svnserve.conf配置
[root@admin conf]# vi + svnserve.conf

追加以下内容:

[code]
[general]
#匿名访问的权限,可以是read,write,none,默认为read
anon-access=none
#使授权用户有写权限
auth-access=write
#密码数据库的路径
password-db=passwd
#访问控制文件
authz-db=authz
#认证命名空间,subversion会在认证提示里显示,并且作为凭证缓存的关键字
realm=/var/www/html/svn/repositories
[/code]

配置防火墙端口
[root@localhost conf]# vi /etc/sysconfig/iptables
添加以下内容:
-A INPUT -m state –state NEW -m tcp -p tcp –dport 3690 -j ACCEPT
保存后重启防火墙
[root@localhost conf]# service iptables restart

启动SVN(注意,创建sites库,启动必须是前一个目录)
svnserve -d -r /var/www/html/svn/

查看SVN进程
[root@localhost conf]# ps -ef|grep svn|grep -v grep
root 12538 1 0 14:40 ? 00:00:00 svnserve -d -r /var/www/html/svn/

检测SVN 端口
[root@localhost conf]# netstat -ln |grep 3690
tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN

停止重启SVN
[root@localhost password]# killall svnserve //停止
[root@localhost password]# svnserve -d -r /var/www/html/svn/ // 启动

测试
SVN服务已经启动,使用客户端测试连接。
客户端连接地址:svn://url/sites
用户名/密码: hfhleo/hfh12345

centos常用命令

####vi编辑
i //进入编辑模式
esc+:wq //保存退出

#####系统服务
//检查服务状态:
service –status-all
service –status-all | grep ntpd
service –status-all | less
service httpd status

chkconfig –list //列出所有服务启动级别
chkconfig xx on //添加服务开机启动
service pptpd restart //重启服务
service pptpd restart-kill //先杀死再重启

######端口操作
netstat -tulpn //列出服务和他们对应的端口:
netstat –apn //查看所有的进程和端口使用情况
netstat -tunlp|grep 端口号,用于查看指定端口号的进程情况
ps -aux | grep xxx //查看xx进程具体使用情况

#文件操作
~ //代表/root目录
/ //代表根目录
# //代表超级管理员
$ //当前登陆的用户是普通用户
pwd //查看当前路径
ls //查看当前目录下的文件和文件夹
mkdir //创建文件夹mkdir /tmp/test
touch //创建文件touch /tmp/a.txt
rm //删除文件或文件夹(f,r参数)
cp //复制文件(cp [参数] 源文件 目标文件)
mv //移动和改名 移动:(mv [参数] 源文件 目地文件);改名:移动mv dir/ directory
find //查找
cat //查看文件()
cat //重定向,需要将一些文件信息不是输出到屏幕上,而是让其输出到指定的文件或其它位置 (cat /etc/services > a.txt)

###防火墙操作
iptables -A INPUT -p tcp –dport 1723 -j ACCEPT //开放对应端口
iptables -t nat -A POSTROUTING -o venet0:0 -s 192.168.7.0/24 -j SNAT –to-source 45.124.67.22 //添加网卡转发( 192.168.7.0/24的客户机,通过本机网卡venet0:0转发)
/etc/init.d/iptables save //保存修改
/sbin/service iptables restart //重启服务

vps搭建pptpd

###ppp和pptpd对应的版本库
#安装ppp
yum install ppp
#查看当前的ppp版本 (ppp 2.4.4——————>pptpd 1.3.4,ppp 2.4.5——————>pptpd 1.4.0)
yum list installed ppp

#安装对应的pptpd版本
wget http://acelnmp.googlecode.com/files/pptpd-1.3.4-1.rhel5.1.x86_64.rpm
#安装
rpm -ivh pptpd-1.3.4-1.rhel5.1.x86_64.rpm
//////或者
#加入yum源:
rpm -Uvh http://poptop.sourceforge.net/yum/stable/rhel6/pptp-release-current.noarch.rpm
#安装pptpd
yum install -y pptpd
chkconfig pptpd on //开机启动pptp vpn服务

1、
#配置文件/etc/ppp/options.pptpd
cp /etc/ppp/options.pptpd /etc/ppp/options.pptpd.bak
vi /etc/ppp/options.pptpd
#加入dns
ms-dns 8.8.8.8
ms-dns 8.8.4.4

2、
#配置文件/etc/ppp/chap-secrets
cp /etc/ppp/chap-secrets /etc/ppp/chap-secrets.bak
vi /etc/ppp/chap-secrets

# Secrets for authentication using CHAP
# client server secret IP addresses
myusername pptpd mypassword *
//myusername是你的vpn帐号,mypassword是你的vpn的密码,*表示对任何ip,记得不要丢了这个星号。我这里根据这个格式,假设我的vpn的帐号是ksharpdabu,密码是 sky。那么,应该如下:
ksharpdabu pptpd sky *

3、
#配置文件/etc/pptpd.conf
cp /etc/pptpd.conf /etc/pptpd.conf.bak
vi /etc/pptpd.conf
#添加:
localip 127.16.36.1
remoteip 127.16.36.11-30 //表示vpn客户端获得ip的范围
////////pptpd.conf这个配置文件必须保证最后是以空行结尾才行,否则会导致启动pptpd服务时,出现“Starting pptpd:”,一直卡着不动的问题,无法启动服务,切记呀!

4、
配置文件/etc/sysctl.conf
vi /etc/sysctl.conf //修改内核设置,使其支持转发
将net.ipv4.ip_forward = 0 改成 net.ipv4.ip_forward = 1
保存修改后的文件:
/sbin/sysctl -p

5、启动pptp vpn服务和iptables
/sbin/service pptpd start 或者 #service pptpd start
/sbin/service iptables start

6、添加转发规则
#开启端口
iptables -A INPUT -p tcp –dport 1723 -j ACCEPT
iptables -A INPUT -p tcp –dport 47 -j ACCEPT
iptables -A INPUT -p gre -j ACCEPT
iptables -A INPUT -p UDP –dport 53 -j ACCEPT //开启dns

iptables -t nat -A POSTROUTING -o venet0:0 -s 192.168.7.0/24 -j SNAT –to-source 45.124.67.22
iptables -t nat -A POSTROUTING -s 127.16.36.0/24 -j SNAT –to-source 45.124.67.22

##出现某些网站不能访问(一般不用添加)
iptables -A FORWARD -s 127.16.36.0/24 -p tcp -m tcp –tcp-flags SYN,RST SYN -j TCPMSS –set-mss 1400(mss可以连接vpn后通过netstat -i,看看mtu;mss=mtu-20字节的IP头部+20字节的TCP 头部)

/etc/init.d/iptables save
/sbin/service iptables restart
//重启
service pptpd restart

//查看全部连接
netstat -antp

个人积累的js的写法

一:方法1

[code lang=”js”]
//设置对象
var play = function(imgList){
this.imgList = imgList;
//判断设备是否支持touch事件
this.isTouch = (‘ontouchstart’ in window) || window.DocumentTouch && document instanceof DocumentTouch;
this.init();
}
//设置对象属性
play.prototype = {
init:function(){
//调用对应的方法
this.imgLoad();//图片加载
},
imgLoad:function(){
//do somthing
}
};
//调用方法
var start = new play(arr);
[/code]

二:方法2
[code lang=”js”]
//var对象
var doSome = function(){
return new doSome.prototype.init();
};
//添加prototype属性
doSome.prototype = {
init:function(){
return this;
},
loadImg:function(arr){

}
};
//设置this的指向
doSome.prototype.init.prototype = doSome.prototype;//把this->init
doSome = doSome();
//调用方法
doSome.loadImg(arr);
[/code]

三:方法3
[code lang=”js”]
//var对象
var im = {
winHei: parseInt($(‘#winHei’).height()),
init:function(){
var self = this;
self.loadingImg(arr);
},
loadingImg:function(arr){
//do something
}
}
//调用方法
im.init();
[/code]

四:方法4
[code lang=”js”]
var Circle = function() {
var obj = new Object();
obj.PI = 3.14159;

obj.area = function( r ) {
return this.PI * r * r;
}
return obj;
}

var c = new Circle();
alert( c.area( 1.0 ) );
[/code]

解决 嵌入Flash,默认会将flash放在页面的最上面的问题

在HTML中,如果嵌入Flash,默认会将flash放在页面的最上面。也就是说,即使用绝对定位,将z-index设的无穷高,页面里的任何元素还是无法将它盖住。这时候,有两种方法可以控制flash的z-index
1、在嵌入flash时,设置flash的wmode参数为opaque
2、在嵌入flash时,设置flash的wmode参数为transparent
对应的IE和FireFox的代码如下所示,
发现ie和FF加该参数的方式不同,遂针对处理了一下,这下都可以了。
让Flash不档住浮动对象或层的关键参数:wmode=opaque

方法:
针对IE 在内加上参数或者针对FF 在内加上参数wmode=”opaque”

eg:
[code lang=”js”]
<object type=”application/x-shockwave-flash” data=”style/flash/001.swf” width=”400″ height=”400″> <param name=”movie” value=“001.swf” /><param name=”wmode” value=”opaque” />
<embed wmode=”opaque”></embed>
</object>

[/code]