PHP算法之快速冒泡产牛猴子大王算法

2014/10/18 | 星期六 分类:PHP | 没有评论 标签: | 作者: | 1,088 views

最近突然迷恋上算法了。温故而知新,这些简单而基础的东西是学习算法的基石,所以又必要再次练习下。

冒泡排序 && 选择排序 这两个算法很相近,至于原理请自己分析,很容易混淆。

猴子选大王算法:.

产牛算法,按在08年腾讯在广州天河社招时面试题,记得当时俺写不出来.

冒泡算法:

选择排序算法:
对比冒泡算法,其优点在哪里? 分析下代码即可…

快速排序算法:.

插入排序算法:

MySql数据库操作与主从配置

2014/10/07 | 星期二 分类:数据库 | 没有评论 标签: | 作者: | 982 views

MySql数据库操作与主从配置,整理日志

#清空数据表 query TRUNCATE TABLE 表名
TRUNCATE TABLE table
#创建数据库 CREATE DATABASE MYSQLDATA
#删除数据库 DROP DATABASE MYSQLDATA.

#MySql 数据导出 用mysqldum 命令行
#导出整个数据库 命令格式
mysqldump -u 用户名 -p 数据库名 >路径+数据库名.sql
mysqldump -u root -p paddy >d:\paddy.sql

#导表,数据库 paddy 表 users
#mysqldump -u 用户名 -p 数据库名 表名 >导出路径+文件名
mysqldump -u root -p paddy users >d:\users.sql

#导数据库结构 说明 1).”-d 没数据”
2).”–add-drop-table 每create 语句前增加drop table”
musqldump -u root -p -d –add-dorp-table users > d:\users.sql

#导入数据库 用source命令
#进入mysql数据库控制台
mysql -u root -p
#mysql use 选择数据库mysqlDB
use mysqlDB

#查看数据库表结构三个方法 数据表table
SHOW FULL COLUMNS table;
DESC table;
SHOW CREATE TABLE table;

#MySql主从复制配置.
数据库主从复制:一般来说是由一台主数据服务器(实际上是可以多台的)和若干台从数据库服务器组成,从服务器不断从主服务器获取bin-log日志,并执行,从而保持与主服务器数据同步。

#主从服务器复制有如下优点:
1)如果主服务器出现了问题,可以快速切换到从服务器继续提供服务器;
2)负载均衡,可以在从服务器执行数据查询操作,降低主服务器的压力(对更新不频繁的数据或对实时性要求不高的数据可以通过从服务器查询);
3)可以在从服务器上执行备份,以避免在主服务器上执行备份而影响数据服务;

#bin-log日志
#开启 bin-log 日志,配置文件(/etc/my.cnf)增加一行
log-bin = mysql-bin #可自定义路径,可写绝对路径名比如: “D:/mysql.log”
#查看 bin-log 是否开启,登录mysql 命令
mysql> show variables like ‘%bin%’;
#log-bin = ON 说明 bin-log 日志已开启

#主从配置步骤
1.设置对从服务器的数据库授权.
#方法一
grant all on *.* to slave_user1@192.168.1.101 identified by ‘123456’
#方法二
grant replication slave on *.* slave_user2@192.168.1.102 identified by ‘123456’
#赋予从机权限,有多台从机,就执行多次 slave_user1 slave_user2 是用户名,’123456′ 是密码
#刷新权限
flush privileges;
#测试登录服务器,(从服务器)101 或 102 登录主服务器100
mysql -u slave_user1 -p 123456 -h 192.18.1.100
#若能登录,说明数据库授权成功

2.修改主服务器配置my.cnf
server-id = 1 #主机标示,整数
log-big = /var/log/mysql/mysql-bin.log #确保此文件可写,二进制文件
#read-only = 0 #主机,读写都可以.
binlog-do-db = test #需要同步的数据库,多个写多行
binlog-ignore-db = mysql #不需要同步的数据库,多个写多行

3.从服务器配置my.cnf
server-id = 2;
log-bin = var/log/mysql/mysql-bin.log
replicate-do-db = test #只复制某个库
replicate-ignore-db = mysql #不复制某个库
mysql> change master to master_host=’192.168.1.100′,master_user=’slave_user1′,master_password=’123456′,master_port=3306,master_log_file=’mysql-bin.000001′,master_log_pos=100;
#仅支持5.1以上版本
#注意:(master_log_file 和 master_log_pos) 的值可以主服务器上运行 show master status 来得到

4.同步数据库
#不用太费事,先后启动主从服务器即可。

5.(从服务器)查看slave状态,使用本地账户进入数据库
show slave status\G;
若在输出中看到 Slave_IO_Running = Yes 和 Slave_SQL_Running = Yes 则说明mysql 数据库主从配置成功.
#说明:1)Slave_IO_Running 进程负责从服务器到主服务器读取binlog 日志,并写入从服务器的中继日志。
2)Slave_SQL_Running 进程负责读取并执行中继日志中的binlog日志
3)从服务器常用命令
start slave –启动复制进程.
stop slave –停止负责进程
show slave status –查看从服务器复制状态
show master logs –查看主数据库数据库状态
change master to –动态改变到主服务器的配置
show processlist –查看从服务器运行进程
4)解决服务器冲突的方法
mysql> slave stop;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
mysql> slave start;

#命令解释
mysql> flush logs;
#mysql系统会自动生成一个最新的 bin-log 日志,可记录当前时刻后的所有数据库操作
mysql> reset master;
#清空所有的 bin-log 日志 (清除后剩余mysql-bin.index 和 mysql-bin.000001)
mysql> flush privileges;
#刷新权限

Linux 常用Shell技巧

2014/10/02 | 星期四 分类:命令文档 | 没有评论 标签: | 作者: | 983 views

#Linux 常用Shell技巧

#命令补齐tab键
范例:1) ls -l mylearingtestfile –键入前部分文件名后按tab键,系统可以自动补齐命令;
2) 输入shell 命令时,按两次tab键会补全相关命令,若存在多个命令,则会列出所有命令;

#常用的快捷键.
范例:1)清屏 Ctrl + l
2)删除当前命令行 Ctrl + U

#浏览器输入历史命令,history命令,系统会显示执行过的所有命令记录,输入 !+对应命令编号,可以执行对应的命令;
范例:1) history –列出所有历史命令
2) !5 –执行第五个命令

#命令别名 alias 命令 和 unalias 命令,语法: alias
范例:1) alias –查看系统所有的别名
2) alias copy = cp –定义copy为cp的别名
3) unalias copy –删除别名copy

#重定向,输出( > 和 >> ),输入( < ) 和错误输出重定向( 2> )
范例:1) ls -l > newfile –将 ls -l 命令执行的结果重定向输出到文件newfile中(写入方式:覆盖)
2) ls -l >> newfile –同上,区别是写入方式为追加
3) cp -R /user /backup/usr.back 2> /back.error –将/user拷贝到/backup/usr.back 并将错误信息写入文件/back.error
#注意:1) “>” 写入方式是覆盖; “>>” 写入方式是追加
2) 0-STDIN ,标准输入; 1-STDOUT ,标准输出; 2-STDERR ,标准错误输出

#管道:将一个命令的输出传送给另外一个命令,作为另外一个命令的输入;
范例:1) ls -l /etc | more –将 ls -l /etc 命令执行的结果作为more命令参数输出;
2) ls -l /etc | grep init — 在 ls -l /etc 命令执行的结果中查找包含init字符串的行;

#命令链接符
范例:1) ; –用分号间隔的各命令按顺序依次执行;
2) && –前后命令执行存在逻辑与关系;
#例子: command1 && command2 ,当command1命令执行成功后,command2命令才会执行,否则command2不执行。
3) || –与&&对应,逻辑或.

#信息提取命令,文件内容提取特定信息 awk命令,格式:awk -F 分隔符
范例:1) awk -F: ‘$3==0 {print $1}’ /etc/passwd
#查看所有系统管理员 /etc/passwd 行信息如下:
root:x:0:0:root:/root:/bin/bash
2)awk -F: ‘length($2) {print $1}’ /etc/shadow
#查看密码长度为0的用户

CSS样式调控之盒子模型

2014/09/27 | 星期六 分类:JsCss | 没有评论 标签: | 作者: | 922 views

什么是CSS?是英文Cascading Style Sheets的缩写,中文是层叠样式。说说样式的盒子,上图:
CSS-Style
CSS盒子模型:内容(content)、填充(padding)、边框(border)、边界(margin),CSS盒子模式都具备这些属性,请看衍生示例:
4.内容(CONTENT)就是盒子里装的东西;
3.而填充(PADDING)就是怕盒子里装的东西(贵重的)损坏而添加的泡沫或者其他抗震的辅料;
2.边框(BORDER)就是盒子本身了;.
1.至于边界(MARGIN)则说明盒子摆放的时候的不能全部堆在一起,要留一定空隙保持通风,也为了方便取出;
如下从上几点细细说上四点:

1.对象外边框距设置
margin : auto | length
#一个值代表全部,否则将按“上-右-下-左”的顺序作用于四边,拆分:
margin-top : auto | length
margin-right : auto | length
margin-bottom : auto | length
margin-left : auto | length

2.对象设置边框样式
border : border-width || border-style || border-color
#可拆分为四
#如果只提供一个参数,将用于全部的四条边;如果只提供两个参数,第一个用于“上-下”,第二个用于“左-右”;如果只提供三个参数,第一个用于上,第二个用于“左-右”,第三个用于下;若提供全部四个参数值,将接“上-右-下-左”的顺序作用于四个边框。.
border-color border-style border-width
border-top-color border-top-style border-top-width
border-right-color border-right-style border-right-width
border-bottom-color border-bottom-style border-bottom-width
border-left-color border-left-style border-left-width

3.对象外边距设置
padding : length
#如果提供全部四个参数,将按“上-右-下-左”的顺序作用于四边,如果只提供一个,将用于全部的四条边;如果提供两个,第一个用于“上-下”,第二个用于“左-右”;如果提供三个,第一个用于上,第二个用于“左-右”,第三个用于下。.
padding-top padding-right padding-bottom padding-left

4.对象高度与长度设置(1+2+3)
height : auto | length
#按照样式表的规则,对象的实际高度为其下列属性值之和;
#margin-top + boder-top + padding-top + height + padding-bottom + border-bottom + margin-bottom
width : auto | length
#按照样式表的规则,对象的实际宽度为其下列属性值之和;
#margin-left + border-left + padding-left + width + padding-right + border-right + margin-right
max-height : none | length
min-height : none | length
max-width : none | length
min-width : none | length

===========================================

其他样式:对象布局设置
display : block | none
#块对象的默认值,块对象将占用整个空间
#隐藏对象,其不为被隐藏的对象保留其物理空间

CSS样式调控
设置样式背景样式
background:background-color || background-image || background-repeat || background-attachment || background-possition
#默认值为:transparent none repeat scroll 0% 0%
.example{background:#CEDFEF url(“normal.png”) no-repeat right center;}

定位问题
Position : static | absolute | fixed | relative
static : 默认值,无特殊定位,对象遵循HTML定位规则
absolute : 将对象从文档中拖出,使用left,right,top,bottom等属性相对于其最接近的一个最有定位设置的父对象进行绝对定位。若不存在这样的父对象,则依据body对象,而层叠通过 z-index 属性进行定义。
relative : 对象不可叠层,将依据left,right,top,bottom 等属性在正常文档流中偏移位置。

z-index : auto | number
#auto : 默认值,遵从其父对象的定位number;无单位的整数值,可为负数;
#number : 好比一张张透明的纸叠在一起,数值大的在最前端,且此属性仅仅作用于position属性值为 retative 或 absolute 对象

===========================================

在网页设计上,内容常指文字、图片等元素,但是也可以是小盒子(DIV嵌套),与现实生活中盒子不同的是,现实生活中的东西一般不能够大于盒子,否则盒子会被撑坏的,而CSS盒子具有弹性,里面的东西大过盒子本身最多把它撑大,但它不会损坏的。

填充只有宽度属性,可以理解为生活中盒子每个HTML标记多可以看作一个盒子。

从上描述:CSS属性可以转移到我们日常生活中的盒子(箱子)上来理解,日常生活中所见的盒子也就是能装东西的一种箱子,也具有这些属性,所以叫盒子模式。

通篇看完,大致对CSS有所了解鸟。

JavaScript构造函数详解

2014/09/24 | 星期三 分类:JsCss | 没有评论 标签: | 作者: | 939 views

JavaScript构造函数详解

此页面的字,脚本,手抄一遍,电脑上打两遍,目的都是为了加深理解,最近懒,想到这招方法学习JavaScript,在此献丑鸟.

1.JavaScript构造函数中显式地用 return 语句返回一个自定义对象(包括函数)时,不论new调用该构造函数,还是对该构造函数的普通调用都会返回该自定义对象。

2.不易理解,请看示例代码.

或者

构造函数返回值
JavaScript 中的构造函数通常是没有返回值,但函数是允许有返回值的;若一个构造函数有一个返回值,则返回的对象成为new表达式的值,在此情况下,作为this的对象将会被抛弃。

另外:在构造函数中 var name; function 都成了私有方法,只能在构造函数内部使用。

3.构造函数中显式用return 返回一个非对象的值时(或为空的retrun;语句)用new调用该构造函数时,该return语句会被抛弃掉,会真正返回this指向的新创建的对象;普通调用该构造函数时,会返回retrun语句中的值。

4.构造函数没有显式的return语句时,用new调用该构造函数时,将返回this指向的对象,普通调用该构造函数时,将返回undefined值。

#new一个构造函数,它的生成对象的执行过程怎样子的?

#示例中的
#var this = Object.create( Person.prototype );
#return this;.
#这两个语句是被隐式执行的(实际代码中不用这样写)
#注意:一开始,新创建的对象就从Person.Prototype 中继承了所有属性;
#最后,隐式地返回了该新创建的对象;
#自动调用构造函数
#为了防止一个构造函数被当成普通函数被调用所带来的问题,通过判断this指向的对象是否是当前构造函数的实例来完成判断;

或者

#构造函数:使自己的对象多次复制,同时实例根据设置的访问等级可以访问其内部的属性和方法;
#当对象被实例化后,构造函数会立即执行它所包含的任何代码.

MongoDB通读《权威指南》学习日记

2014/09/22 | 星期一 分类:数据库 | 没有评论 标签: | 作者: | 888 views

MongoDB 是面向文档的数据库,文档是一个抽象的概念,其具体的呈现形式取决于使用的驱动和编程语言(Binary JSON) BSON

  1. MongoDB 的”文档” document 相当于 MySql 的”行” row;
  2. MongoDB 的”集合” 可以看做是没有模式的表;.
  3. MongoDB 的每个文档都有一个特殊的键”_id” 它在所有的集合中是唯一的。

#Win 下运行 mongo 命令:先进入mongo安装目录;
mongod –dbpath = d:\data\db

.使用find 或者 findOne 函数和查询文档对数据执行查询;
.使用 $ 条件查询实现范围,计划包含,不等式和其他查询;.
.有些查询用查询文档,甚至 $ 条件语句都不能表达,对于此类复杂的查询使用 $where 字句,用强大的JavaScript 来表达;
.查询返回一个数据库游标,游标只有在你需要的时候才会惰性地批量返回;
.还有很多针对游标执行的元操作,包括忽略一定数量的结果,或者限定返回结果,还有对结果排序。

GridFS 存储文件
通过数据库命令使用高级特性,使用一种特殊的集合,固定大小的集合使用GridFS存储大文件;利用MongoDB对服务器JavaScript的支持理解何为数据库引用,何时使用。

#获取运行中MongoDB 服务器统计信息
db.runCommand({“serverStatus”:1})

#backup MongoDB 数据库 paddy (文件默认保存在mongoDB安装目录下)
mongodump -d paddy -o backup
#还原数据库 paddy to paddyok
mongorestore -d paddyok –drop backup/paddy/

#搭配 master slave mongoDB 主从配置
mongo –dbpath=d:\data\db –port 27017 –master
mongo –dbpath=d:\data\slaves –port 27018 –slave –source localhost:27017

#MongoDB 诊断,复制
db.printReplicationInfo();
db.printSlaveReplicationInfo();

MongoDB 默认的存储引擎是内存映射引擎,当服务器启动后,将所有的数据文件映射到内存,然后由操作系统来负责将缓冲数据写入磁盘并将数据调入调出内存页面;

  1. MongoDB管理内存的代码非常精炼,原因就是将大部分的工作推给了操作系统;
  2. MongoDB服务器进程的虚拟大小通常非常大,超过整个数据集的大小,这没关系,操作系统会处理让那些数据常驻内存;
  3. MongoDB不能控制数据库写入到磁盘的顺序,也就是不能用预写日记提供单机的持久性;
  4. MongoDB数据库在32机器智能处理2GB数据;.

PS:通读一本数MongoDB的书,有点乱,有兴趣的就把它记录下来写入到日记,往后细读的时候再细写日记。

Web 前端优化最佳实践之图象篇

2014/09/21 | 星期日 分类:建站优化 | 没有评论 标签: | 作者: | 951 views

Web 前端优化最佳实践之 图象篇

Web 前端优化其中第一条就是减少HTTP请求,若网站某一页面很多很多小图片,整个页面就会增加N多的HTTP请求,从这方面入手谈谈图片对前端页面的优化:

1. 优化图片 (Optimize Images)

使用 GIF 、JPG 还是 PNG 格式的图片? 尽可能的使用 PNG 格式的图片,更多的功能,更小的尺寸(与 GIF 相比)。

对于 PNG 图片,考虑用 Pngcrush 或类似的工具进行优化。常见的工具如下表:

pngcrush http://pmt.sourceforge.net/pngcrush/
pngrewrite http://www.pobox.com/~jason1/pngrewrite/
OptiPNG http://www.cs.toronto.edu/~cosmin/pngtech/optipng/ (refer: 教程)
PNGOut http://advsys.net/ken/utils.htm
另请参见: Five Tips For the Effective Use of PNG Images

对 JPEG 图片的优化工具:

jpegtran (http://jpegclub.org/)
必需要强调的是,图片设计的同学啊,请考虑设计面向 Web 的图片,不要动不动就设计超过可接受尺寸之外大家伙,这应该是一种习惯,而不是什么高超的技能,只需要记住就成了。

2. 使用 CSS Sprites 技巧对图片优化 (Optimize CSS Sprites)

简单的说就是”利用 CSS background 相关元素进行背景图绝对定位”,把多次 HTTP 调用变为一次调用,更多参考:CSS Sprites: Image Slicing’s Kiss of Death

补充一下:对于这个技巧我曾经见到有人滥用的。把多个背景图片揉成一个,减少 HTTP 调用,这是一个很好的思路。但一定要记住这个大图片不能太”重”,我看到过 100 多K 的背景图。一个图片就把整个网站拖得很慢。

更新:使用 CSS Sprites 的一个潜在的副作用是客户端将消耗更多内存。

3. 不要在 HTML 中使用缩放图片 (Don’t Scale Images in HTML)

更多的时候,可能是因为偷懒而没有制作合适大小的图片,如果是批量处理图片的话,可能一条 ImageMagic 命令(convert )就能搞定 。必须提及的是,看到太多的对图片拉伸很难看的页面!

4. 用更小的并且可缓存的 favicon.ico (Make favicon.ico Small and Cacheable)
地址栏显示的小图标:favicon.ico

更小,可缓存,这两条可能都不是问题。问题是,太多站点根本没有 favicon.ico 。有的时候,判断独立域名的 Blog 是否专业,基本看一下是否有 favicon.ico 就差不多了。

参考:http://dbanotes.net/web/best_practices_for_speeding_up_your_web_site_image.html

WEB前端优化之JavaScript篇

2014/09/17 | 星期三 分类:建站优化 | 没有评论 标签: | 作者: | 962 views

WEB前端优化之JavaScript,先来两个问题:什么是JavaScript?JavaScript有什么用?

JavaScript是一种脚本语言,其源代码在发往客户端运行之前不需经过编译,而是将文本格式的字符代码发送给浏览器由浏览器解释运行。
JavaScript主要被作为客户端脚本语言在用户的浏览器上运行,不需要服务器的支持.

JavaScript用途:
a.嵌入动态文本于HTML页面;
b.对浏览器事件做出响应;.
c.读写HTML元素;
d.在数据被提交到服务器之前验证数据;
e.检测访客的浏览器信息;
f.控制cookies,包括创建和修改等。

WEB前端优化之JavaScript:

1. js脚本放到 HTML 代码页底部 (Put Scripts at the Bottom)

当一个脚本在下载的时候,浏览器干不了其它的事儿(串行了)。所以,把它扔到最后面去处理。对于一些功能性的脚本,可能实现起来有些两难。不过对于国内网站来说,有很多使用 Google Analytics 服务进行网站数据分析的。这这一点来说,绝对可行的建议,放到页面最底下。

2. Make JavaScript and CSS External.

剥离后,能够有针对性的对其进行单独的处理策略,比如压缩或者缓存策略。

3. 精简 JavaScript 与 CSS (Minify JavaScript and CSS)

如果没有 JavaScript 与 CSS 可能更好。但,这是不可能的,SO,尽量小点吧。语法能简写的简写。

4. 移除重复脚本 (Remove Duplicate Scripts)

对于一些历史遗留站点或是论坛类的网站来说,这倒是比较常见的。接手维护人前后变化过多,每个人都有自己的一套。这就会带来一些潜在的麻烦。

5. 减少 DOM 访问 (Minimize DOM Access)

有三条指导建议:

缓存已经访问过的元素 (Cache references to accessed elements)
“离线”更新节点, 再将它们添加到树中 (Update nodes “offline” and then add them to the tree)
避免使用 JavaScript 输出页面布局–应该是 CSS 的事儿 (Avoid fixing layout with JavaScript)
阅读全文

PHP错误日记打印与调试Demo

2014/09/16 | 星期二 分类:PHP | 没有评论 标签: , , | 作者: | 1,064 views

PHP错误日记打印与调试Demo 注意:此Demo 适合在本地调试,方便自己开发,做项目,若php_error.log 日记文件过大,浏览器会崩溃哦。

场景:在做项目的时候,有时候会需要查看一下PHP/Apache的错误日志,然后就需要很繁琐的打开那个目录下面,看信息,只有当错误的时候才会去打开那个文件。但是最近我发现在开发的时候,自己忽略掉了很多错误,虽然不会导致出错,但是搞不好哪天就会爆发。

而且每次打开那个文件,然后自己又要手动的刷新,太麻烦,所以就做了个网页版的Demo,能够实时查看错误日志。

这个小工具比较简陋,就是简单的将文件内容打印到页面中,并在有新错误的时候做个title的闪动小提示。
跟着做如下四步即可:
第一步,先做些准备工作,配置PHP日记:

阅读全文

WEB前端优化之CSS

2014/09/14 | 星期日 分类:建站优化 | 没有评论 标签: | 作者: | 915 views

什么是CSS?
CSS是英文Cascading Style Sheets的缩写;(通俗的描述就是HTML的衣服^_^)
CSS指层叠样式表 (Cascading Style Sheets),如果说把页面想象成一个人,HTML就是人的骨架,CSS就是人的衣装,一个人的品味从他的衣装就能一目了然。

说说前端CSS优化:CSS是用来渲染页面的,也是存在渲染效率的问题。
Web 前端优化最佳实践第四部分面向 CSS。另请参见 Mozilla 开发者中心的文章:Writing Efficient CSS

1. 把 CSS 放到代码页上端 (Put Stylesheets at the Top)

官方的解释我觉得多少有点语焉不详。这一条其实和用户访问期望有关。CSS 放到最顶部,浏览器能够有针对性的对 HTML 页面从顶到下进行解析和渲染。没有人喜欢等待,而浏览器已经考虑到了这一点。

2. 避免 CSS 表达式 (Avoid CSS Expressions)

个人认为通过 CSS 表达式能做到的事情,通过其它手段也同样能做到而且风险更小一些。

3. 从页面中剥离 JavaScript 与 CSS (Make JavaScript and CSS External)

剥离后,能够有针对性的对其进行单独的处理策略,比如压缩或者缓存策略。

4. 精简 JavaScript 与 CSS (Minify JavaScript and CSS)

如果没有 JavaScript 与 CSS 可能更好。但,这是不可能的,SO,尽量小点吧。语法能简写的简写。

5. 使用 而不是@importChoose over @import

在 IE 中 @import 指令等同于把 link 标记写在 HTML 的底部。而这与第一条相违背。

6. 避免使用Filter (Avoid Filters)

对于第3,4点,对javaScript 与 CSS压缩,一般常用 YUI Compressor,它的特点是:移除注释;移除额外的空格;细微优化;标识符替换。
亦可以在线压缩:http://ganquan.info/yui/?hl=zh-CN

额外知识:请自行查询 YUI Compressor的配置和使用。

文章来源:http://dbanotes.net/web/best_practices_for_speeding_up_your_web_site_css.html
转帖文章,主要用于学习。

第 2 页,共 7 页1234567