0%

Other

现在遇到这么一个情况,在我电脑上配置了一对SSH秘钥,其中公钥已经添加到了我的GitHub上面。 现在我又申请了一个账号,我同样想添加这个秘钥到这个账号上去,但是GitHub提示了一个错误,说这个公钥已经被使用,不能添加。 于是,我意识到了一个问题,同一个公钥是不能添加到不同的GitHub账号的。在我的GitHub上配置了,另一个就不能配置了。 所以,我需要重新生成一对SSH,过程如下: 在命令行中输入:

1
ssh-keygen -t rsa -C '1016903103@qq.com'
1
2
Generating public/private rsa key pair.
Enter file in which to save the key (~/.ssh/id_rsa): ~/.ssh/id_rsa2 #这里输入一个新的ssh key文件名

在这里我们就输入 ~/.ssh/id_rsa2 了,注意此处一定要加上路径名,要不然生成的秘钥不会保存到 .ssh文件夹中。 后面会让你提示输入密码,直接回车两次就好了,如果你非要输入密码也没事。 接下来就会提示秘钥生成成功,会打印出你生成的秘钥。 ~/.ssh/id_rsa2为新SSH Keys文件名,根据实际情况修改,保证每次不一样即可。 打开新生成的~/.ssh/id_rsa2.pub文件,将里面的内容添加到GitHub后台,在这里我就添加到我另一个GitHub账号里了。 接下来你再Push尝试一下,发现会提交失败,提示如下的内容。

1
2
Please make sure you have the correct access rights 
and the repository exists.

这是因为它默认识别了你第一个私钥,也就是id_rsa 为了让它识别你新生成的私钥,你需要在.ssh目录,注意一定要是.ssh目录,和你的秘钥放在一块。要不然不能识别,新建一个config文件,不要后缀,文件名即为config 输入如下内容:

1
2
3
4
5
Host git@github2.com   #此处可以随意指定
HostName github.com
User git
Port 22
IdentityFile ~/.ssh/id_rsa2 #你新生成的SSH名字

Git的时候不是有一个SSH地址吗?比如我原先的是

1
git@github.com:cqcre/shiyida.git

现在我们就要把它改成

1
git@github2.com:cqcre/shiyida.git

其中:前面的内容就是你填写的Host内容。 你可以随意更改,这里我为了保持风格统一,就把Host设置为了 git@github2.com 如果你的Host设置为xxx,那么我的SSH地址就要改为 xxx:cqcre/shiyida.git,你的地址相对应地更改。 现在尝试一下,就可以Push了,如果还不能,请重新打开Git Bash,需要关闭后再次开启一下Git才能生效的。 如果有问题,与我联系~ 邮箱 1016903103@qq.com QQ 1016903103

PHP

首先感谢郝同学告诉我这么一个神奇的接口 可以输入你的手机号、密码、对方手机号、发送内容直接给对方发短信。 源作者博客地址为:http://blog.quanhz.com/ 郝同学的博客地址:http://www.findspace.name 我们先来演示下这个接口的功能: 测试地址:res.cuiqingcai.com/fetion 进入之后会让您选择两种发送方式,一种是 GET,一种是 POST 两种方式什么区别?最重要的区别是 GET 方式是直接以链接形式访问,链接中包含了所有的参数,当然如果包含了密码的话是一种不安全的选择,不过你可以直观地看到自己提交了什么内容。POST 则不会在网址上显示所有的参数,不过如果你想直接查看提交了什么就不太方便了,大家可以酌情选择。 QQ截图20141123225356 或者直接通过以下接口来访问: 1. GET 方式:http://res.cuiqingcai.com/fetion/get.php 2.POST 方式:http://res.cuiqingcai.com/fetion/post.php 二者界面相同,功能稍有不同而已。 QQ截图20141123230147 点击发送之后,便可以向你的飞信好友发送短信了。是不是很神奇,如果你输入的号码不合法,会自动通过 JS 判定,如果不合法,不会提交。 那么接口是怎样调用的呢? GET 接口是这样的:通过访问一个 URL 来进行发送短信。参数如下: 1.你的手机号 2.飞信密码 3.对方的手机号 4.要发送的信息。 例如:http://res.cuiqingcai.com/fetion/php/gsend.php?user=18366119732&key=abcd&number=18366119732&text=hello 加入这四个参数之后,你便可以通过访问这个网址来向好友发送短信。那么 18366119732 就能收到 hello 的信息了,并通过查看返回值来判断发送状况。 P.S.输入你的飞信密码后我不会盗取你的密码的,源码地址在下面,大家可以自行查看。相信我的人品,我不会偷偷存到数据库的… 如果担心,请自行下载源码,并部署到自己的服务器上。 接口为 PHP 版本,我对其源码进行了重构,增加了返回登录信息的功能。并对其接口进行了重写,增加了是否登录成功,是否信息为空,是否信息过长,是否是给自己发短信,是否是给别人发短信的判定,并返回相应的结果。 返回结果判定如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
if(strpos($result,'请输入密码')){
//登录失败
echo "D";
}else if(strpos($result,'NoMessage')){
//发送的消息为空
echo "K";
}else if(strpos($result,'限制在500字')){
//发送内容超长
echo "L";
}else if(strpos($result, '短信发送成功!')) {
//给自己发送成功
echo "M";
}else if(strpos($result,'发送消息成功')){
//给别人发送成功
echo "O";
}else {
//不是好友,发送失败
echo "H";
}

1.登录失败:D 2.发送消息为空:K 3.发送内容超长:L 4.给自己发送成功:M 5.给别人发送成功:O 6.不是好友,发送失败:H 返回结果大家可以更改 echo 的内容自己定制。 在下面附上接口及测试的源代码: https://github.com/cqcre/fetion 另附:JS 和 PHP 用正则表达式判定手机号是否合法的方法,新增加了最新 4G 手机号的判定。 JS:

1
2
3
4
5
6
var number = $("#number").val();
if((number.length != 11) || (!number.match(/^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|17[6|7|8]|18[0-9])\d{8}$/))){
alert("号码不合法");
}else{
alert("号码合法");
}

PHP:

1
2
3
4
5
if((strlen($phone) != 11) || !(preg_match("/13[0123456789]{1}\d{8}|15[012356789]\d{8}|18[0123456789]\d{8}|17[678]\d{8}|14[57]\d{8}/",$phone))){
echo "手机号不合法";
}else{
echo "手机号合法";
}

Linux

作为一名学生,免不了同学之间传送资料和数据的问题。 由于整个学校相当于一个大型局域网,相互之间传送数据非常快,比如要共享个电影,传点资料什么的。 所以我们可以选择搭建一个FTP服务器来共享文件。 那么问题来了,有的同学会问,我们既然在一个局域网内,直接用QQ传也很快啊,干嘛要搭建FTP服务器? 那么告诉大家,如果两人不能同时在线呢?离线文件?传离线文件不就不走局域网了吗? 还有如果你想一个人给多个人同时发呢?一个一个发?网盘链接?算了吧,等到花儿都谢了都下不完… 所以,明智的选择,FTP服务器。 在学校拥有了一台服务器之后,我可以把自己的资料或者电影放到我的FTP服务器上,分享给同学一个链接,分分钟下载完,当然我们需要在一个局域网才能有那样的速度,这样的话,不用我去开个QQ传,也不用动什么网盘分享,简单粗暴。 接下来我就说一下怎样配置自己的FTP服务器。 我的系统为Ubuntu,所以我选择了利用vsftpd来配置自己的服务器。 配置这个,为了确保安全,你可以选择使用用户名和密码来登录,也可以直接匿名登录…随你怎么来。 为了方便,我直接设置了匿名登录,这样让别人分享给我东西时,也不需要告诉别人用户名密码,直接拖进去上传就行了,方便快捷,不过安全性嘛,你懂得~ 这里我只配置了匿名的方式,具体的用户名密码登录的方式,网上的教程也是一大堆。 废话说了一大通了,开始干!配置很简单 首先下载安装vsftpd

1
sudo apt-get install vsftpd

然后修改/etc/vsftpd.conf文件 修改如下几行: #为注释的意思,最前面不加#就是取消掉它的注释,使之生效

1
anonymous_enable=YES    #设置匿名可登录
1
local_enable=YES        #本地用户允许登录
1
write_enable=YES        #用户是否有写的权限
1
anon_upload_enable=YES   #允许匿名用户上传
1
anon_mkdir_write_enable=YES   #允许匿名用户创建目录文件

其他的就不用管了,保存文件。 重启vsftpd服务器

1
sudo service vsftpd restart

设置完了这些之后,其他人就能来访问你的FTP服务器了。 现在你可以登录你的服务器来尝试一下了。 现在应该能登录进去,但是里面什么也没有。 因为匿名用户默认访问的是你的 /srv/ftp 文件夹 现在我们需要两个功能,一个用来上传的,一个用来下载的 上传的文件夹,其他人可以上传到这个文件夹,但是不能有删除权限,试想如果有匿名登录进来的给你删除掉了别人好心给你分享的文件还行吗? 下载的文件夹,其他人只能读取这个文件夹,但是不能修改这个文件夹,也就是你要分享给其他人的文件可以放到这里面。 我们在/srv/ftp 文件夹新建两个文件夹,一个是upload,一个是download 执行下面的两条指令

1
sudo chmod -R 777 /srv/ftp/upload
1
sudo chmod -R 755 /srv/ftp/download

这样就把upload的权限设置为可读可写,把download权限设置为可读不可写。 配置完上面的内容,就大功告成啦,登录FTP服务器后,你就可以看到一个upload文件夹,一个download文件夹。 是不是很简单。 现在下面的事情你就可以实现了: 1. 学校里某个同学有一个非常好看的电影,而你现在又不方便去接受,发网盘又太慢,你就把你的FTP地址扔给他,对他说,你上传到 ftp://<你的IP地址>/upload 文件夹下吧,我回去的时候取下来看。 2. 你剪辑了一个很不错的视频短片,想分享给学校里的小伙伴,你就可以把它扔到你的FTP服务器 /srv/ftp/download 目录下,然后对小伙伴们说,我的视频已经共享了,你们到 ftp://<你的IP地址>/download 里面去下载吧。 恩,只要你配置好了FTP,就能享受FTP局域网高速传输,分分钟搞定~ 如果配置有问题,欢迎与我联系~

Other

一、字符串

以实际输入的命令为例

1.建立键值对

1
set bar 1

建立了一个键值对,键名叫bar,键值是1

2.判断键是否存在

1
exists bar

判断键名bar是否存在 若存在则返回1,不存在返回0

3.删除键

1
del bar

删除键名为bar的键值对 若删除成功则返回删除的个数,删除失败(不存在)则返回0

4.查看所有的键

1
keys *

5.获得键值的数据类型

1
type foo

获得键名为foo的键值类型 返回值类型可能有 string(字符串),hash(散列),list(列表),set(集合),zset(有序集合)

6.获得键对应的值

1
get foo

获得键名为foo的键值

7.自增

1
incr foo

创建一个foo的键值对,并自增为1 但是运行type foo 时,显示为string 增加特定数值

1
incrby foo 3

使foo增加3

8.自减

1
decr foo

减小1个数值

1
decrby foo 3

减小3个数值

9.增加指定浮点数

1
incrbyfloat bar 2.5

bar增加指定的浮点数2.5

10.向尾部追加值

1
append bar hehe
1
append bar " world"

如果是要追加带空格的内容,则要用空格引起来 返回值是一个数字,代表现在键值的长度

11.获取字符串长度

1
strlen bar

返回值是一个数字,代表现在的字符串长度

12.同时设置多个键值对

1
mset key1 value1 key2 value2 key3 value3

13.同时获得多个键值对应内容

1
mget key1 key2
1
2
1)value1
2)value2

二、散列

1.赋值和取值

1
hset key field value

例如:

1
hset car price 500
1
hget car price

同时赋值多个字段的值

1
hmset car price 500 name BMW
1
hmget car price name

2.判断字段是否存在

1
hexists car price

3.只获得字段名

1
hkeys car

4.只获得字段值

1
hvals car

5.获得字段数量

1
hlen key

三、列表

1.向两边添加元素

1
lpush group 1
1
rpush group 2

结果

1
2
1) "1" 
2) "2"

lpush 是向左边添加元素,rpush 是向右边添加元素。

2. 从两边弹出元素

1
lpop group
1
rpop group

lpop 是从左边弹出元素, rpop 是从右边弹出元素,显示元素的值

3.获取列表中元素的个数

1
llen group

4.获得列表片段

1
lrange group 0 3
1
lrange group -2 -1

其中 -2 -1 为负索引,这个也是可行的。-2代表倒数第二个元素,-1代表倒数第一个元素。 特殊地:获取所有元素则可以这么写

1
lrange group 0 -1

5.删除列表中指定的值

1
lrem group count value

当count > 0,它会从左边开始删除前count个值为value的元素。 当count < 0,它会从右边开始删除前|count|个值为value的元素。 但count = 0,它会删除所有值为value的元素。

6.获得索引处的值

1
lindex group 0

获得索引0位置的元素值

7.设置索引处的值

1
lset group 1 5

将 group 索引 1 处的值改为 5

8.只保留特定的片段

1
ltrim group 0 1

只保留索引0到1的值,其余的删除

9.向列表中插入元素

1
linsert group after 2 5

从左边开始查询,找到数字2,在后面插入数字5 insert group before 2 5 从左边开始查询,找到数字2,在前面插入数字5

四、集合

1.添加元素

1
sadd hello 2 4 5

向集合中添加2 4 5元素,返回值是成功加入的元素数量

2.删除元素

srem hello 4 5 从集合中删除4 5,返回值是成功删除的元素数量

3.获得集合中所有元素

1
smembers hello

4.判断元素是否在集合中

sismember hello 2 判断2是否在集合hello中 存在返回1,不存在返回0

5.集合的运算

差集

1
sdiff setA setB

返回值是集合,返回的是存在集合A中但是不存在B中的元素集合

交集

1
sinter setA setB

返回值是setA和setB的交集

并集

1
sunion setA setB

6.获得集合大小

1
scard setA

返回值是数目

7.随机获得集合中的数字

1
srandmember setA

五、有序集合

1.增加元素

增加时需要指定元素的分数和元素的名称

1
zadd score 89 Tom 45 Amy

分数不仅可以是整数,还可以是浮点数

1
zadd score 2.3 Mike
1
zadd score +inf Bob

2.获得元素分数

1
zscore score Tom

如果不存在,返回(nil)

3.获得排名在某个范围内的元素列表

1
zrange score 0 2

带分数显示

1
zrange score 0 -1 withscores

4.获得指定分数范围的元素

1
zrangebyscore score 45 80

获得45分到80分的元素,闭区间 如果不想是闭区间,则可以在索引前面加上(

1
zrangebyscore score (45 80

5.取某几个值

zrangebyscore score (45 80 limit 0 3 取(45,80]之间的元素,从第一个开始,取3个

6.增加某个元素分数

1
zincrby score 5 Tom

给某个元素加5分

1
zincrby score -2 Tom

给某个元素减2分

7.给某个元素重新赋值分数

同样用zadd命令

1
zadd score 22 Tom

8.获得集合中元素的数量

1
zcard score

9.获得指定分数范围内元素个数

1
zcount score 79 90

10.删除一个或者多个元素

1
zrem score Tom

11.按照分数删除元素

1
zremrangebyrank score 0 1

它先会把它按照分数从小到大排列,然后删除索引位置的元素

12.按照分数删除元素

1
zremrangebyscore score 28 99

他会删除指定分数范围内的元素

13.获得元素排名

1
zrank score Tom

获得按照分数从小到大排列后,Tom的索引位置 反向排名

1
zrevrank score Tom

返回从大到小排列后,Tom的索引位置

Other

首先,你可以试着输入git,看看系统有没有安装 Git

1
2
3
$ git
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git

像上面的命令,有很多 Linux 会友好地告诉你 Git 没有安装,还会告诉你如何安装 Git。 如果你碰巧用 Debian 或 Ubuntu Linux,通过一条sudo apt-get install git就可以直接完成 Git 的安装,非常简单。 如果是其他 Linux 版本,可以直接通过源码安装。先从 Git 官网下载源码,然后解压,依次输入:./configmakesudo make install这几个命令安装就好了。 安装完成后,还需要最后一步设置,在命令行输入:

1
2
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

然后我们需要配置 SSH。 第 1 步:创建 SSH Key。在用户主目录下,看看有没有.ssh 目录,如果有,再看看这个目录下有没有id_rsaid_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开 Shell(Windows 下打开 Git Bash),创建 SSH Key:

1
$ ssh-keygen -t rsa -C "youremail@example.com"

你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个 Key 也不是用于军事目的,所以也无需设置密码。 如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsaid_rsa.pub两个文件,这两个就是 SSH Key 的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。 第 2 步:登陆 GitHub,打开“Account settings”,“SSH Keys”页面: 然后,点“Add SSH Key”,填上任意 Title,在 Key 文本框里粘贴id_rsa.pub文件的内容: 0 点“Add Key”,你就应该看到已经添加的 Key: 10 为什么 GitHub 需要 SSH Key 呢?因为 GitHub 需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而 Git 支持 SSH 协议,所以,GitHub 只要知道了你的公钥,就可以确认只有你自己才能推送。 当然,GitHub 允许你添加多个 Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的 Key 都添加到 GitHub,就可以在每台电脑上往 GitHub 推送了。 现在,我们根据 GitHub 的提示,在本地的learngit仓库下运行命令:

1
$ git remote add origin git@github.com:cqcre/cqc.git

请千万注意,把上面的 cqcre 替换成你自己的 GitHub 账户名,否则,你在本地关联的就是我的远程库,关联没有问题,但是你以后推送是推不上去的,因为你的 SSH Key 公钥不在我的账户列表中。 添加后,远程库的名字就是origin,这是 Git 默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。 下一步,就可以把本地库的所有内容推送到远程库上:

1
$ git push -u origin master

好啦,静静等待 git 把你的代码 Push 上去吧~是不是很简单?

福利专区

想学游戏开发吗? 想把自己的创意变成现实吗? 想一次开发,各个平台到处运行吗? 想亲自体验一下开发的成果带给你的惊喜吗? 玩过捕鱼达人么?这个游戏6不6?想不想自己做一个? 那就选择Cocos2d-x游戏开发。在这里提供给小伙伴们全套的视频教程。 来自兄弟连的Cocos2d-x视频教程。 网盘地址:http://pan.baidu.com/s/1ntxCnbF

Linux

今天想配置一下 Linux 服务器,实现在 Windows 下远程连接 Ubuntu,查看远程桌面。我的是 Ubuntu 14.04,就以此为例来配置。 由于 xrdp、gnome 和 unity 之间的兼容性问题,在 Ubuntu 14.04 版本中仍然无法使用 xrdp 登陆 gnome 或 unity 的远程桌面,现象是登录后只有黑白点为背景,无图标也无法操作。所以使用 xrdp 只能登录 xfce 的远程桌面。 也就是说单纯安装一个 xrdp 是无法进行远程桌面连接的。你看不到任何有效信息,桌面至少一个 x 箭头加一个黑白点的屏幕。 所以我们需要安装 xfce 首先安装 xfce:

1
sudo apt-get update
1
sudo apt-get install xfce4

xfce 是一个在 Unix 与 Unix-like 操作系统 (如 GNU/Linux、FreeBSD 和 Solaris)上运行的开源桌面环境,在远程桌面连接时我们会看到 xfce 桌面,但是无法看到 Ubuntu 中安装的原生桌面。换句话说,你远程连接看到的桌面和实际远程 Ubuntu 14.04 的桌面是不一样的。 但是它的文件系统和相关设置是通用的,只不过是样子不一样而已。 然后安装 xrdp 组件和 vnc 服务器:

1
sudo apt-get install xrdp vnc4server

安装好后要自行新建配置文件,使得在远程登录时默认使用 xfce 作为界面登录,然后重启 xrdp 服务:

1
echo "xfce4-session" >~/.xsession
1
sudo service xrdp restart

好了,配置完以上内容,便可以在 Windows 下进行远程桌面连接了。 打开 Windows 下的远程桌面连接,输入目标 IP 地址,便会出现下面的界面。 QQ截图20141120185332 输入目标主机的用户名和密码,登录便可以查看到远程的桌面内容了,即 xfce 桌面。 QQ截图20141120185617 小伙伴们,欢呼吧!

Other

我想大家在生活中一定遇到这样的情况: 请把下面的文档打印出并签字然后拍照上传。 看到这句话我想大家都受不了了,还要打印,还要出门,出门跑腿,还要花钱,还要拍照上传,真麻烦。最近我也遇到各种这样的事情,于是就想了这么一种办法,用 PS 做一个实拍图出来。在此分享给大家,看完这篇文章之后,你就可以免去这样的麻烦,简直妙哉妙哉! 首先上两张图:一张是原来的电子图,一张是经过加工之后签名后的高仿纸张实拍图。亮度可以自行调节。 QQ截图20141115212726QQ截图201411152127d26 效果还可以吧?现在就教大家一步步地做出这样的效果,流程不难,大家细看。不过前提是你有 PS 软件. 1.随意给某个文件截个图保存,用PS打开。 QQ截图20141115215800 2.在需要签字的地方用画笔工具写上自己的名字,大小 1 像素,硬度百分百,直接在纸面上写上名字,日期等等。 QQ截图20141115220111 签字完了效果如图所示 QQ截图20141115220719 3.点击上方菜单中的 图像->调整->曝光度,将曝光度调低 1 个值,这样画面整体就变暗了。 QQ截图20141115220912 4.点击滤镜->渲染->镜头光晕,光晕焦点自己选择,选择 105mm 变焦,亮度自行调节,我调节为 99%,点击确定 QQ截图20141115221338 5.点击滤镜->扭曲->水波,数量 1,起伏 1,用来模拟略微不平的纸张,点击确定 QQ截图20141115221643 6.新建一个图层,注意要新建一个图层!填充为白色,选择 滤镜->渲染->分层云彩。 QQ截图20141115222053 按 Ctrl+F 重复操作几次,在此我们操作了 8 次,效果如下 QQ截图20141115222157 7.选择滤镜->风格化->浮雕效果,我调整为高度 3 像素,数量 52,这样纸张褶皱效果便出来了,具体可以自行调节。 QQ截图20141115222259 8.选中该图层,在图层上方的样式中选择正片叠底效果。 QQ截图20141115222500 QQ截图20141115222646 9.调整一下亮度,导出即可。 QQ截图20141115222804 通过以上过程我们就把一张电子图变成了一张实拍纸张图,有没有比较逼真的效果。 大家可以尝试一下,如果有更好的方法,欢迎与我交流。 恩,最后送大家一句话。懒,也是创造的动力。好有哲理的对吧~

PHP

首先我们需要了解什么是 CDN 加速,CDN 加速简单的来说,就是把原服务器上数据复制到其他服务器上,用户访问时,那台服务器近访问到的就是那台服务器上的数据。CDN 加速优点是成本低,速度快。适合访问量比较大的网站。而且,如果你的博客所在的主机是限制流量的,一个很好的办法就是把图片还有其他静态文件部署到其他服务器,这样就会减少主机流量消耗了。 20141112194809 那么我们为什么要用七牛呢?七牛的优势总结如下: 1、安全性能:为用户数据创建至少三个副本并跨 IDC 存储到多个数据中心,同时支持防盗链设置。

2、数据存储:支持图片、音频、视频、JS、CSS 等多种静态文件的存储,并支持断点续传。 3、云端加速:七牛的 500 多个加速节点遍布全球,会自动选择离用户最近的节点,并实现数据上传下载的双向加速。 4、数据处理:支持云端在线压缩、裁剪等图片处理及音频、视频格式转换,还可在线进行视频截图。 5、开发合作:为开发者提供了多种接入工具及丰富的开发包,提供 API、SDK 教程示例。 6、域名绑定:已备案的网站可申请绑定自己的域名,未备案的用户可使用七牛的二级域名绑定。 7、镜像功能:通过一定的设置,可自动将网站原有图片等静态文件镜像到七牛,而无需重新上传到七牛服务器。 8、外链分享:由于七牛云支持外链,可以将文件上传至七牛,直接利用文件链接地址作外链调用。

首先我们需要先有一个七牛云存储的账号 七牛云存储网址:https://portal.qiniu.com/ 点击此链接申请一个七牛云存储账号,创建一个公开空间,比如我创建一个空间叫 cuiqingcai,和我的域名相对应。 QQ截图20141112184648 创建完成之后它就会为我的这个空间分配一个二级域名。我的就叫 cuiqingcai.qiniudn.com 然后我们需要部署我们的网站,点击右边的空间设置,选择镜像存储里面的一键加速网站,这时就需要你输入镜像源,这里就填写你的博客地址,然后勾选下方的使用默认的 robots.txt 配置文件。 Q:为什么要配置 robot.txt 文件? A:因为你配置了这个网址确定加速之后,七牛会为我们生成一个镜像空间,这个镜像空间的地址就是二级域名地址,我的便是 cuiqingcai.qiniudn.com,你访问之后发现它的内容和我的 cuiqingcai.com 博客网址是完全一致的,这也是为什么把它称为镜像空间的原因。因为内容是一致的,所以会导致搜索引擎对源站 也就是你的域名进行封锁,所以我们可以通过配置 robots.txt 文件避免这种情况的发生。 好,我们继续,点击确定之后我们就能配置好了镜像空间。 QQ截图20141112185908 下面还有一个域名设置,它默认会为你分配一个默认永久的空间,比如我的就是 cuiqingcai.qiniudn.com,这个是七牛的二级域名,七牛的一大特色就是支持域名绑定,在这里你可以添加你的二级域名,不过貌似需要你账户余额大于 10 块,但是它是不收费的。另外的要求就是你的域名需要备案,如果没有备案,那就不行了。 点击下面的申请域名绑定,然后点击新窗口右下角的自定义域名,会出现以下内容。 QQ截图20141112190327 比如你就可以在此处输入你自己定义的二级域名加备案号。比如我的输入 cdn.cuiqingcai.com 便可以,然后输入备案号,提交审核需要一周之内。你可以先用着它给你分配的二级域名。 好了,配置好了镜像空间和你的域名(或者用默认域名)便可以配置我们的 WordPress 了。 登陆 wordpress 仪表盘后,在浏览器中输入:http://你的域名/wp-admin/options.php,使用 Ctrl+F 命令找到 upload_url_path 选项,在其中输入 http://七牛二级域名/wp-content/uploads ,注意,后面一定不要加“/”,比如我的便输入 http://cuiqingcai.qiniudn.com/wp-content/uploads。最终格式如下图: 1114 设置之后,点击最下面的确定,这时你发现你的媒体库中的所有的图片的链接格式都已经更改了,已经不是原来的域名链接了。 而变成了七牛云存储你设置的二级域名的链接。比如我的一张图片链接就变成了 http://cuiqingcai.qiniudn.com/wp-content/uploads/2014/11/545ae06e25ea9.png 而你点击七牛云存储下的内容管理,就会发现你的博客下的所有图片都已经同步到了里面。截图如下: QQ截图20141112191445 以后你再新上传的照片也会自动同步到七牛上,此方法的好处在于你只需在 wordpress 中上传图片,就会自动同步到七牛空间,而无需登陆七牛上传并手动输入图片地址了。并且除了图片地址改变外,其他操作如常。引用图片时会自动加载七牛空间中的图片,实现 wordpress 免费 CDN 全网加速。不便之处是上传的图片仍会在 wordpress 空间中保留,占用空间容量。也就是说,它仍然在你的本地保存了一份,不过访问时会访问七牛的网址,也就可以实现 CDN 加速,而且为你的主机节省流量了。当然,由于图片已同步至七牛镜像空间中,你也可以选择删除 wordpress 中的图片。 现在浏览你的网站,如果现在没有问题,那么你就可以不用浏览下面的额外内容,如果有部分图片显示有问题,那么请继续看。 如果你的网站设置了特色图像功能,比较悲剧的事情就发生了。你的网站可能无法读取特色图像,整个页面也显得很难看。这是因为 WordPress 使用了 timthumb 缩略图剪裁插件,通过这个插件,用户在后台上传的各种图片都会按照预先在前端页面中设置的大小进行剪裁,大大降低了前端开发的难度。 由于 timthumb 默认设置中,出于安全考虑是不允许缓存外部地址图片的。因此我们打开 timthumb 缓存路径时会提示 “您可能无法从该网站获取的图像“。所以解决的办法来了。 找到这个主题所在的目录,找到 timthumb.php 文件,将下面一条语句

1
 define ('ALLOW_ALL_EXTERNAL_SITES', false)

替换为

1
 define ('ALLOW_ALL_EXTERNAL_SITES', true)

这样就可以实现通过外链抓取图片了,特色图像便显示出来了。 现在再浏览你的网站,看看还有没有什么问题,如果没有问题,现在就美美地享受移植到七牛上带来的便捷和欢乐吧! 如果还有问题,请继续阅读下方内容。 现在一般的网站模板加载都没有问题了,如果你用的 WordPress 模板比较高级,利用了 Ajax 异步加载功能,我们便会发现异步加载已经是不会生效的,也可能你的整个网站样式变得混乱。这是为什么?是因为你修改了路径为七牛的路径,加载 JS 或者 CSS 文件时便会去七牛那里寻找,但是现在七牛上只同步了图片,JS 和 CSS 文件是不存在的,这时因为找不到这些文件,你的网站便会出现问题了。 现提供两个解决方法: 1.使用水煮鱼的“七牛镜像存储 WordPress 插件”将你的其他文件(如 JS,CSS)同步到七牛 插件下载地址:https://wordpress.org/plugins/wpjam-qiniu/ 配置好这个插件之后,你可以点击 插件使用帮助 来配置这个插件,配置完了之后便可以将你的 js 和 css 文件上传到七牛中。你的 Ajax 异步加载就不会出现问题了。 2.使用 WP Super Cache 插件进行同步 插件下载地址:http://wordpress.org/plugins/wp-super-cache/ 贴心提示:插件安装之后可能出现如下错误 QQ截图20141112193509 固定链接出错,这时你更改下左边面板-设置-固定链接,更改为其他选项,不要选择原来的固定链接就好了,比如我选择文章名这个选项,插件就可以顺利进入啦。 在这里点击 CDN 选项卡,点击开启 CDN 支持。 112194058 其中 Off-site-URL 更改为你的七牛镜像域名,比如我的便是 cuiqingcai.qiniudn.com,这样点击确定之后便同样可以把你的 JS 等文件同步到七牛。你的样式或者 Ajax 异步加载就可以顺利实现啦。 通过以上步骤,我们就可以将我们的博客部署到七牛云存储上,提高网站加载速度,同时也节省我们的主机流量。一举两得,美哉美哉! 到此为止,我们的网站应该都没有问题了,尽情享受 CDN 加速之后带来的效果吧!如果还有问题,请评论或者给我留言。

Linux

友情提示

注意,本篇教程由于年代比较久远,QQ 可能不再好用,仅供参考。

正文

最近好多人在吐槽 Linux 下上 QQ 简直就是煎熬,网页版的不方便,网上各种版本的 QQ 要么是功能不全、要么是界面丑到爆,要么是运行不稳定。那么这次为大家带来一个功能完整、运行稳定的 wineQQ 安装过程。 我的 Linux 系统是 Ubuntu 14.04,64 位版本。首先展示一下安装完 QQ 之后的体验过程吧。先截个图看一下。 QQ截图20141110092945 QQ截图20141110092651 QQ截图20141110093116 功能还是比较齐全的,基本相当于 Windows 下 QQ2013 的功能了。QQ 对话气泡、传文件、远程协助、群聊、讨论组、视频和语音通话都是有的,体验还是比较好的,光看不行呀,我们就来亲自体验一下怎样在自己的 Ubuntu Linux 下安装这个 QQ 吧。 首先我要说的是这个 QQ 叫 wineQQ,什么是 wine 呢,简单地说它就是在 Linux 下来运行 exe 程序的一个工具。我尝试过打开 Windows 下的 QQ 音乐等软件,但是体验不算很好,有时无响应。要在 wine 里运行的话还是要考虑运行专门为 wine 定制的程序比较好。那么这一款 QQ 就是专门为 wine 定制的一款 QQ,全名 wine QQ TM2013 那么接下来我们首先要做的就是安装 wine 啦,Ubuntu 下的命令一键安装

1
sudo apt-get install wine

安装完之后我们就开始下载一个 wineQQ2013,网盘下载地址为 http://pan.baidu.com/s/1i323T4p QQ 比较大,有 175M,如果大家网速不够给力的话可以先做着其他的事情。 那么下载完成之后呢,我们就需要安装它啦。 找到它的下载路径..一路 cd cd cd 过去,到它所在的目录。

1
sudo dpkg -i WineTM2013-20131206-Longene.deb

解释下这个命令的意思,“dpkg ”是“Debian Packager ”的简写。为 “Debian” 专门开发的套件管理系统,方便软件的安装、更新及移除。所有源自“Debian”的“Linux ”发行版都使用 “dpkg”,例如 “Ubuntu”、“Knoppix ”等。dpkg –i 即为手工安装 deb 包到系统中,那么后面的就是文件名了,后缀是 deb 格式。

如果你的系统是 64 位的系统,还要运行下面的命令来添加一个支持的库,否则你的 QQ 还是不能打开。当然如果是 32 位的系统就不用安装这个了。

1
sudo apt-get install libgtk2.0-0:i386

以上工作完成以后,我们就看一下我们的文件系统有没有什么变化吧,软件安装到哪里了? 我们会发现在 /opt 文件夹下多了一个 longene,里面多了一个 tm2013 的文件夹,这个就是你的 QQ 所在的文件夹。里面存在一个 wine-lib 的支持库,就是利用 wine 来运行这个 QQ 的。 这时桌面上应该会自动生成了一个 tm2013 的 QQ 图标,如果没有的话把文件夹下的 QQ 拖到桌面或者侧边栏就可以随心所欲地使用 QQ 啦。 贴心小提示: 1.如果你没法拖动,提示没有权限操作,那么运行如下命令。

1
sudo chmod 777 -R tm2013

chmod 是赋值权限的意思,777 是添加所有用户控制权限,当然你可以查一下相关资料,为了保证安全,可以将权限数字更改一下也是没有问题的。-R tm2013 是递归地将 tm2013 文件夹的所有文件和文件夹权限全部设为前面的指定的 777 权限。 2.运行 QQ 提示密码错误 如果提示密码错误,请使用 QQ 面板上的虚拟键盘,直接用电脑键盘输入可能识别会不对。这个也是让我折腾了好一阵,甚至都要找回密码了。在此奉献给大家这个经验。 如果还有问题,请留言告诉我,或者发我的邮箱 1016903103@qq.com 希望能给大家带来美好体验!尽情地享受 Linux 里上 QQ 的欢乐吧!

HTML

摘要:2014年10月底,HTML5规范正式定稿,结束了长达8年的长跑。数字天堂董事长,DCloud CEO王安梳理了HTML5诞生至今的演变过程,并从开发者和用户两个角度分析了HTML对两个人群的优势。

2007年W3C(万维网联盟)立项HTML5,直至2014年10月底,这个长达八年的规范终于正式封稿。 过去这些年,HTML5颠覆了PC互联网的格局,优化了移动互联网的体验,接下来,HTML5将颠覆原生App世界。这听起来有点危言耸听,但若认真分析HTML5的发展史,你会发现,这个世界的发展趋势确实就是这样。 熟知历史才能预知未来,先让我们来看看HTML5为什么诞生、这8年是怎么过来的。 作者简介:王安,数字天堂公司董事长,DCloud CEO。

HTML5的诞生

自W3C于1999年发布HTML4后,Web世界快速发展,一片繁荣。人们一度认为HTML标准不需要升级了。一些致力于发展Web App的公司另行成立了WHATWG组织,直到2007年,W3C从WHATWG接手相关工作,重新开始发展HTML5。 HTML5的发展史,有用户的需求在推动,有技术开发者的需求在推动,更有巨大的商业利益在推动。 在互联网的早期,对用户而言,能打开浏览器接入到互联网世界就是一个神奇的事情,但互联网发展到2005年前后,开始出现下一个变化,就是宽带互联。 随着宽带的普及和电脑性能的增强,人们不再满足于单纯的通过互联网看新闻、收发邮件,消耗更高带宽的娱乐产品开始出现,就是流视频和网页游戏。其实视频和游戏是古老的需求,在互联网不普及的时候,需求的满足方式是离线传输的VCD和游戏光盘;后来互联网逐渐普及,人们更改了使用方式,通过下载软件+本地媒体播放器来看视频,下载体积较大的端游玩游戏。 但是对消费者体验更好的新方式还是出现并颠覆了以前的一切,那就是流媒体和网页游戏。YouTube等公司把握住潮流飞速崛起,各种页游公司也如雨后春笋。 但是HTML标准没有把握住产业的变化及时演进,浏览器产品也未升级,这块新需求被浏览器插件满足了,那就是Flash。这个部署在亿万浏览器里的商业插件俨然成为事实标准。2005年Adobe巨资收购Macromedia,把Flash收归旗下,紧接着大幅推广FLV流媒体和action script语言,很明显这桩收购可以列为IT并购的经典案例,FLV流媒体和Flash游戏风靡互联网,Adobe在新的产业升级中攫取了大量的利润。 除了Flash这个商业产品成为了事实标准,W3C还面临一个尴尬,就是另一个私有扩展协议的制造者—IE。IE当时在桌面浏览器占有垄断地位,并且扩展了大量的IE Only语法,开发者完全不知道这些语言是谁定义的。整个Web世界,就被两家公司微软+Adobe绑架了。 很多IT巨头都坐不住了,尤其是苹果和Google。PC操作系统的世界难有突破,Web浏览器被苹果寄予厚望,而且第一代iPhone只支持网页,那时还没有Appstore,Safari是乔布斯非常看重的产品;新贵Google虽然大量赞助Mozilla,但并未对IE的地位产生实质影响,收购了YouTube后发现底层被Adobe控制,也是非常难过,而且Google每年给IE的搜索框和Adoble FLV缴纳的费用真不是小数目。 既然大家都是W3C的主席单位,好吧,我们重新开始做HTML5吧。 是的,HTML5其实就是这么诞生的。那是2007年,IE和Flash由盛转衰的转折点。

HTML5第一阶段:Web增强与破垄断

自HTML5诞生以来,一共经历了两个阶段,分别是Web增强和移动互联网。我们先从Web 增强说起。 Web体验的丰富增强主要表现在:1. WebApp,比如Gmail;2. 流媒体;3. 游戏。我们就这3个方面来讲HTML5做了什么。

  1. WebApp:HTML5新增了离线存储、更丰富的表单(比如Input type=date)、JS线程、socket王乐、标准扩展embed、以及很多CSS3新语法…
  2. 流媒体:HTML5新增了Audio、Video
  3. 游戏:HTML5新增了Canvas、WebGL

当然还有Google努力在HTML5中推进Header和Section等标签,以利于搜索引擎分析,这些不多述。 HTML5补充流媒体和游戏能力后,加上苹果强势拒绝在iOS上引入Flash,成功的遏制了Flash的发展,然后就该遏制IE私有语法了。 在HTML5标准的升级过程中,苹果和Google同时也看到了浏览器市场重新洗牌的机会,他们一方面参与HTML5的规范,一边在浏览器产品上发力。Apple首先开始大力发展Safari,建立WebKit开源项目,Mac、iOS、Windows多平台齐发力;Google起初是赞助Mozilla开发Firefox,后来自己开发了v8引擎,合并WebKit,于2008年正式推出Chrome。“IE的私有规范+Flash不是标准,我们才是标准”这样的口号在新一代浏览器大战中打响,IE瞬间成为千夫所指的垄断代表,甚至成了阻碍Web发展的罪人(当时IE6已数年未更新,并且丝毫不惧Firefox的发展)。 偏偏微软此时也出了晕招,推出了一系列即不完整支持规范又互相不兼容的IE7、8、9、10,彻底失去了开发者的心。 Adobe的Flash被遏制,与Web霸主的位子擦肩而过;IE的私有标准被遏制,并且造成IE市场份额不停下滑,直到IE最新的移动版本反过来开始支持WebKit私有语法,真是令人唏嘘。不知道HTML6是不是该打倒WebKit垄断了。

HTML5第二阶段:移动互联网

随着Chrome和Safari的高歌猛进,以及IE+Flash的衰落,HTML5告一段落,进入了下一个时代——移动互联网。HTML5的跨平台优势在移动互联网时代被进一步凸显。HTML5是唯一一个通吃PC、Mac、iPhone、iPad、Android、Windows Phone等主流平台的跨平台语言。Java和Flash都曾梦想这个位置,但梦断于iOS。此时人们纷纷开始研究基于HTML5开发跨平台手机应用。很多人当时认为,原生应用只是过渡,就像当年从C/S结构转变为B/S结构一样。而且学习Objective-C和Java很费劲,我既然会网页开发,为何不试试HTML5。 W3C此时成立了Device API工作组,为HTML5扩展了Camera、GPS等手机特有的API,然而麻烦的是,移动互联网初期的迭代太快了,手机OS在不停的扩展硬件API,陀螺仪、距离感应器、气压计。。。每年手机OS都有大版本更新。而W3C作为一个数百家会员单位共同决策的组织,从标准草案的提出到达成一致是非常复杂的过程,跟不上移动互联网初期的快速迭代。 PhoneGap的出现,给开发者打开了一扇窗。很多人期待PhoneGap不停扩展API,来补充浏览器的不足。Adobe看到PhoneGap仿佛看到了重振江湖地位的希望,但在Adobe收购PhoneGap后,又发现这个东西可商用性不足,而且开源使得Adobe无法像Flash那样获取商业利益,于是就把PhoneGap捐给了Apache,改名为Cordova。 因为各种原因,Cordova的定位最终没有成为浏览器的强化,而走向了混合式开发。基于当时的背景,他们认为原生是不可替代的,“原生+HTML5”的混合模式更有意义。所以现在Cordova的使用模型是“原生工程师+HTML5工程师”一起协作完成App。 这时Facebook加入了W3C,牵头成立了Mobile Web工作组。Facebook是混Web圈的,并且在手机OS上没有自己的领地,他不喜欢被苹果和Google掌控的原生应用生态系统。Mobile Web这个工作组的重要目标就是让HTML5开发的网页应用达到原生应用的体验。然而,事与愿违,它不努力也就算了,结果是努力了却失败了。2012年,Facebook放弃了HTML5的新闻充斥了全世界的IT媒体,HTML5瞬间被打入冷宫。 Facebook为何放弃HTML5?核心是当时基于HTML5真的做不出好的移动App。对比Twritter等竞争对手的原生App,Facebook的HTML5版本实在无法让用户满意。比如Push功能,到现在HTML5的推送和原生的推送体验差距依然巨大,更不用说HTML5应用的页面切换白屏、下拉刷新/侧滑菜单不流畅等众多问题。看着原生工程师轻松实现摇一摇、二维码、语音输入、分享到朋友圈等功能,更是让HTML5工程师感觉自己站错了队。 即使Facebook不喜欢被控制,也不能拿被用户抛弃来冒险。而且Facebook并没有掌握关键点—手机浏览器内核。如果浏览器不跟上,徒然定一堆标准草案落不了地。 而浏览器在手机上的表现是什么呢?先看Google,Chrome性能虽高,但Android上的浏览器却并非Chrome,而是WebKit改出来的一个蹩脚的Android浏览器;再看苹果,iOS上不允许其他浏览器引擎上架App Store,而且其他使用Safari引擎的应用也无法调用苹果自己的JavaScript加速引擎Nitro。结果是苹果和Google不但不在浏览器上积极实现HTML5关于移动App所需的规范,反而对HTML5做出种种限制。 不管是当时硬件能力不足,还是手机OS厂商的故意限制,总之结果就是:在移动互联网的初期,一定是原生应用生态系统的天下,iOS和Android首先自己的地盘稳固后,产业才会向下个阶段升级。 Facebook也好,PhoneGap也好,想在移动互联网初期就分一杯羹是分不到的,但坚持下来,机会往往会出现。

HTML5这回真的来了

终于,在2014年10月底,W3C宣布HTML5正式定稿。这个时间,不晚不早,硬件性能更强、手机OS迭代速度下降。 随着HTML5标准定稿,一切纷争将告一段落,现在,属于HTML5的时代到来了。 有人说,光标准定稿没用啊,配套起来了吗?HTML5做的应用究竟能否匹敌原生App?答案是,HTML5不但可以匹敌原生App,甚至它天然的很多特性超越了原生App。 我们先谈谈HTML5原来不如原生应用的地方,业内俗称HTML5有“性工能”障碍。即HTML5能不如原生、开发具不如原生、力调用不如原生。 这几个问题导致开发者无法使用HTML5做出与原生一样的App。然而,不管是硬件升级还是OS厂商策略变化,以及相关软件技术的成熟,已解决了HTML5的“性工能”障碍。 1. 硬件升级 2011年,iPhone 4s的CPU是A5,现在iPhone 6是A8,按苹果的历次发布会的说法,速度共提升了7.5倍。这3年间7.5倍的速度提升,抹平了太多HTML5的性能问题。 2. 苹果、Google的策略变化 Google在2013年底发布的Android 4.4,内置的Webview不再是蹩脚的Android WebKit浏览器,而是Chromium,性能大幅提升。从最新的Android 5.0开始,Webview可以通过Google Play Store实时更新,和Chrome的升级保持一致,用户就可以不刷机享受到最新的浏览器引擎;再看Apple方面,2012年iPhone 5发布后,HTML5在iOS上的表现已令人满意,Safari独家的JavaScript加速引擎Nitro不再那么重要,不过在iOS 8发布后,苹果还是很识趣地取消了三方程序调用Nitro的限制,现在任意浏览器或应用调用iOS的UIWebview都可以利用Nitro加速,这样在前端使用JS做大型运算也成为可能。两大手机操作系统霸主和浏览器巨头的态度发生了变化,使得HTML5在手机上的发展不再受限,而且这个变化不可逆只能继续向前,这种变化势必会产生深远的影响。 3. 软件技术的成熟 PhoneGap的发展虽然放缓了,但其他产品技术却成熟了。2014年的iWeb大会上,众多厂商的产品提供了面向开发者免费或开源的HTML5性工能障碍的解决方案。 (注:作者作为从业人员,也会在分析各种方案时提到我们公司的方案,但作者会客观不夸张的陈述方案,而且该方案是纯免费的,没有商业销售嫌疑。) DCloud公司在iWeb大会上发布了系统的HTML5“性工能缺失”的解决方案,包括: a) 性能:提升HTML5性能的手机端引擎,让侧滑菜单、下拉刷新等动态交互卡顿的问题得以解 决; b) 工具:HTML5开发IDE产品HBuilder, 超快的编程利器; c) 能力:把40万原生API封装成JavaScript对象,以解决HTML5能力不足问题的Native.js技术; d) 最接近原生体验的高性能框架:MUI框架,体积只有几十K,加载、运行远快于一般框架。基于该方案开发的HTML5应用完全可以达到原生App的功能和体验。 使用HBuilder开发HTML5应用 英特尔公司发布了Crosswalk引擎,可以让Android 4.0 - 4.3的手机上的应用打包Chromium引擎而不是Android WebKit。毕竟目前市场上存在大量Android 4.0 - 4.3的手机,同时统一的WebView也避免了兼容性的烦恼。 在专业方向上很多公司也做出了不错的成绩。触控的Cocos2d-html5、Egret runtime和Ludei CocoonJS强化了Canvas的表现,让HTML5游戏体验更好;UC、猎豹等手机浏览器都强化了音视频播放的表现。 不管是硬件升级、软件成熟,还是操作系统厂商策略变化,都在强力推动HTML5的爆发。 不过要注意,我说的HTML5爆发,不是指手机浏览器会替代桌面成为应用入口。有人说HTML5不好,因为用户讨厌打开浏览器输入URL的过程。我想说这种想法是对HTML5的片面理解。HTML5!=传统浏览器,虽然编程语言还是HTML、Javascript、CSS,但发行方式绝不是传统网站那么简单。HTML5应用的入口,反而很少是启动浏览器输入URL,它可以是存在于手机桌面的图标、也可以来自超级App(如微信朋友圈)、以及搜索引擎、应用市场、广告联盟。。。到处都是它的入口。它的入口,比原生App更多。

原生App的颠覆

HTML5的“性工能”障碍得到解决,可以接近原生App的效果,所以它就可以替代原生App吗?很多人认为,即使HTML5会发展的比现在好,也将是与原生App各占一部分市场的格局,要求不高的长尾应用会使用HTML5,而主流应用仍是原生App的天下。 但我认为这样的想法很危险,就像Apple成立前,HP的高层告诉沃兹:谁会在家里摆一台电脑呢?未来HTML5肯定会颠覆原生App。“性工能”障碍的消除,只是HTML5的劣势被削弱,但劣势被消除后,它的优势就会大放异彩,HTML5的优势是什么?我们分别就开发者和最终用户来看。 HTML5对开发者的7大优势

  • 跨平台:在多屏年代,开发者的痛苦指数非常高,人人都期盼HTML5能扮演救星。多套代码、不同技术工种、业务逻辑同步,这是折磨人的过程。有点类似个人电脑早期世界,那个时候的每家电脑都有自己的操作系统和编程语言,开发者疲于做不同版本,其实DOS的盛行也很大程度是因为开发者实在没精力给其他电脑写程序。跨平台技术在早期大多因为性能问题夭折,但中后期硬件能力增强后又会占据主流,因为跨平台确实是刚需。
  • 快速迭代:移动互联网是一个快鱼吃慢鱼的时代,谁对用户的需求满足的更快,谁的试错成本更低,谁就拥有巨大的优势。互联网产品大多免费、且有网络效应,后入者抢夺用户的难度非常大。使用原生开发,从招聘、开发、上线各个环节的效率都慢一倍以上,而且参与的人越多,沟通效率往往拖慢不止一倍。
  • 持续交付:很多人有这样的体会,一个原生应用上线App Store,突然有一个大bug,只好连夜加班修复,然后静静等待2周或更长时间的Apple审核,这2个星期被用户的涂抹淹死,市场上一片差评,用户大量流失。等新应用被审核上线了,用户已经卸载了。但是,HTML5没有这些问题,你可以实时更新,有问题立即响应。
  • 大幅下降成本:创业者融资并不容易,如何花钱更高效非常重要。如果你使用原生开发的App和竞争对手使用HTML5开发的App没什么区别,但你的开发成本高出一倍,我相信没有投资人会喜欢给你投钱。
  • 开源生态系统发达:HTML5前端是开放的正反馈循环生态系统,大量的开源库可以使用,开发应用变得更轻松、更敏捷,当然这也体现在了快速迭代和成本下降上。不过更重要的是,这种开放的正反馈循环生态系统未来的生命力是比原生生态系统更强劲的。
  • 开放的数据交换:HTML是以page为单元开放代码的,它无需专门开发SDK,只要不混淆,就能与其他应用交互数据。开发者可以让手机搜索引擎很容易检索到自己的数据, 也更容易通过跨应用协作来满足最终用户需求。
  • 导流入口多:HTML5应用导流非常容易,超级App(如微信朋友圈)、搜索引擎、应用市场、浏览器,到处都是HTML5的流量入口。而原生App的流量入口只有应用市场。聪明的HTML5开发者当然会玩转各种流量入口从而取得更强的优势。
  • 流量大:前段时间微信朋友圈风靡一时《神经猫》,这个游戏如果放到Appstore,绝对没有那么多流量,超级App带来的流量,远大于原生应用市场。假如微信允许游戏在桌面创建快捷方式、假如游戏后续升级解决持续娱乐问题,未来不可想象。
  • 导流效率高:除了入口多、流量大,导流效率高也不可忽视,谁都知道,页游和端游打同样的广告,广告变用户的转化率,页游远远高于端游。可精准导流到二级页:我们都知道搜索引擎可以直接进入到。

HTML5对最终用户的3大优势 1. 大幅降低使用门槛 为什么流媒体会替代下载视频成为主流?为什么页游会如此火爆?只因用户太“懒”。让用户更方便的满足需求,有时效果好于更多的满足需求。 用户眼睛看到一个兴趣点,点击后,就应该立即开始满足用户需求。比如流媒体可以立即看,页游可以立即玩。而目前的原生应用市场,用户需要这样操作:选一个应用、等待下载、确认权限、等待安装,然后点击打开。这样糟糕的体验迟早要被颠覆。 不管是App、游戏还是音视频,未来都将即点即用。谁先满足用户这个需求,谁就制胜。 2. 实时更新、差量更新的优秀体验 HTML5应用可以绕开应用市场的限制进行自主实时更新,用户可以快速享受新服务。 而且这种更新完全可以是差量更新,比如某个HTML页面或某个js文件有问题,只更新这个几K的小文件就可以了,这比原生应用的更新体验好太多。 3. 跨应用的使用体验 目前手机应用切换是以桌面或任务管理器为中心的,但事实上这些中心很影响效率和体验。用户想出差三亚,先打开去哪App订票,然后切回桌面,再找到并打开天气App,搜索输入三亚,再切到桌面,找到并打开航旅纵横App,输入航班号值机,哦对了,航班号多少来着,再切到桌面,找到并打开去哪App看航班号,最后找到并打开租车App,输入租车地点,然后再切回桌面。。。 在原生应用体系下,用户只能这样。但在HTML5体系下,他不需要切回桌面,他可以在App间方便的直接跳来跳去,而不是使用一个一个孤岛App;他更不用重复录入数据,应用间可以方便的互相传递数据。 这种模式需要一点想象力,但未来迟早会来。 分析至此,我们可以明显的看出,不管是站在最终用户角度、还是站在开发者角度,HTML5必将取代原生应用当前的位置。并由此引发一系列颠覆。

还有什么会被改变?

HTML5的爆发,原生App生态系统的颠覆,是一场产业革命,很多角色都会受到影响,我们来预测一番。 新型HTML5引擎战火将烧起 标准的HTML5引擎并不能解决HTML5的所有问题,拥有大流量入口的互联网巨头,莫不在思考内嵌更优秀的增强引擎。腾讯推出了X5浏览器引擎,就是看中这个机会。目前各路浏览器厂商、应用市场厂商、甚至rom厂商,都在努力整合更优质的浏览器引擎。假使微信内嵌的WebView可以运行更优秀的Canvas游戏、假使360手机助手可以发行即点即用的HTML5应用并且能力体验与原生一致、假使小米rom内置更强大的WebView使得所有HTML5应用在小米手机上运行的更流畅。。。 一个巨头开始行动,所有巨头都会闻风而动,没错,这场战役会是移动互联网世界的二次世界大战。 应用发行市场将洗牌 由于超级App的巨大流量能轻易成为HTML5应用的入口,并且会形成大者更大的效应,传统的应用商店、甚至线下预装,这些流量不足和效率偏低的发行模式将被挤出市场主流。本身也是超级App的大流量应用商店,如果转型得当,也将以发行HTML5应用为主。 广告和统计市场 原生的广告和统计SDK提供商会面临尬尴,Google、百度等基于网页的广告和统计服务会取得更大的优势。开发者不再需要打包SDK,引入一个Script即可。 开源技术将在移动互联网领域更加流行 HTML的开放性造就了大量的开源产品,也反向促进了HTML的繁荣。在Github上有大量的JS框架,而原生的开源代码数量相比甚少。而未来移动互联网世界将因为开源而发展的更迅速,这里也同样存在类Github厂商的机遇。 开发工具的变化 早期HTML只需要记事本写几个Tag,中期的HTML、JS、CSS比较复杂,需要更高级的文本编辑器,但HTML5到来后,它的代码量、复杂度、开发模型将与原生开发看齐,需要类似Xcode、Eclipse等专业的IDE工具来解决开发、调试的问题。一些以会使用记事本写代码为荣的开发者,将面临思路转换甚至被更高效的开发者淘汰。 性能分析调优 目前很多针对原生应用的性能分析调优工具或服务,未来也面临转型,HTML5应用的性能分析调优是另一个世界。 混淆与产权保护 HTML5是开放代码的,好处也带来弊端,有些东西开发者希望暴露,但有些东西开发者希望保护。混淆技术就变得更有商业机会。PC Web上Gmail的混淆就做的不错。除了JS混淆,离线数据加密相信也有不少空间。 安全厂商的新机会 HTML5的强大会引发很多安全问题,并且解决思路与原生不一样,业内有可能会出现新的安全厂商领导者。

结语

写到结尾,感觉话题有点大了。其实未来如何发展是没人能准确预测的,变量非常多。但我想让用户和开发者都更方便的趋势是不会错的。 我在这里抛砖引玉,欢迎大家一起讨论,但我希望我们能理智的分析,在争议中提炼真知,而不是未经思考或验证仅因为害怕被颠覆而无谓的乱喷。(作者微博) 也祝愿大家在HTML5的浪潮中,把握住机遇,享受下坐在风口当猪的感觉。 文章来源:CSDN 文章地址

Other

1.Mingw

(1)编辑PATH变量,在最后面加入 D:\mingw\bin D:\mingw\msys\1.0\bin D:\mingw\mingw32\bin (2)添加LIBRARY_PATH变量,内容为: D:\mingw\lib (3)添加C_INCLUDE_PATH变量,内容为: D:\mingw\include (4)添加CPLUS_INCLUDE_PATH变量,内容为: D:\mingw\lib\gcc\mingw32\4.8.1\include\c++ 2.Java (1)JAVA_HOME D:\java Jdk 1.6(2)Path %JAVA_HOME%\bin; %JAVA_HOME%\jre\bin (3)CLASSPATH %JAVA_HOME%\lib 验证:java -version 3.Node.js (1)Path D:\Node.js (2)NODE_PATH D:\Node.js\node_modules 验证: node server.js 4.Android SDK (1)ANDROID_SDK_ROOT D:\AndroidSdk (2)Path %ANDROID_SDK_ROOT%\tools; 验证:android sdk(打开sdk manager) %ANDROID_SDK_ROOT%\platform-tools; 验证:adb devices 5.Android NDK (1)NDK_ROOT D:\AndroidNdk\android-ndk-r9d (2)Path %NDK_ROOT%\ 验证:ndk-build -version 6.Android ANT (1)ANT_ROOT D:\AndroidAnt\apache-ant-1.9.4\bin (2)Path %ANT_ROOT%\ 验证:ant -version 7.Python (1)Path D:\python2.7.7 验证:python —version 8.Cocos2d-x (1)Path D:\cocos2d-x\cocos2d-x-3.0rc2 D:\cocos2d-x\cocos2d-x-3.0rc2\tools\cocos2d-console\bin 验证:cocos compile -p android

Other

1. 字体比例大小

1
2
3
h1 small {
font-size: 65%;
}

font-size:65%的意思是h3标签里面的small标签是外面一层字体的65%大小。 比如:

1
<h1>Bootstrap标题一<small>我是副标题</small></h1>

Bootstrap标题一我是副标题

显示效果便是如上,small标签包含的文字外侧h1文字大小的65% 2. 斜体的设置 CSS方法:

1
**font-style**:**italic**

标签方法:

1
<em>我是斜体</em><i>我也是斜体</i>

3.强调相关的类

1
2
3
4
5
6
.text-muted:提示,使用浅灰色(#999)
.text-primary:主要,使用蓝色(#428bca)
.text-success:成功,使用浅绿色(#3c763d)
.text-info:通知信息,使用浅蓝色(#31708f)
.text-warning:警告,使用黄色(#8a6d3b)
.text-danger:危险,使用褐色(##a94442)

4.对齐相关的类

1
2
3
4
5
6
7
8
9
10
11
12
.text-left {
text-align: left;
}
.text-right {
text-align: right;
}
.text-center {
text-align: center;
}
.text-justify {
text-align: justify;
}

5.列表 无标号列表

1
<ul class = "list-unstyled">

无标号横向列表

1
<ul class="list-inline">

6.代码段 单行内联代码

1
<code>单行内联代码</code>

多行代码

1
<pre>多行代码</pre>

用户输入代码

1
<kbd>用户输入代码</kbd>

硬编码

1
左尖括号&lt; 右尖括号&gt;

滚动代码

1
class = "**.pre-scrollable**"

7.表格

1
2
3
4
5
6
.table:基础表格
.table-striped:斑马线表格
.table-bordered:带边框的表格
.table-hover:鼠标悬停高亮的表格
.table-condensed:紧凑型表格
.table-responsive:响应式表格

8.常用表单样式 纵向表单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<form role="form">
<div class="form-group">
<label for="exampleInputEmail1">邮箱:</label>
<input type="email" class="form-control" id="exampleInputEmail1" placeholder="请输入您的邮箱地址">
</div>
<div class="form-group">
<label for="exampleInputPassword1">密码</label>
<input type="password" class="form-control" id="exampleInputPassword1" placeholder="请输入您的邮箱密码">
</div>
<div class="checkbox">
<label>
<input type="checkbox"> 记住密码
</label>
</div>
<button type="submit" class="btn btn-default">进入邮箱</button>
</form>

水平表单

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
<form class="form-horizontal" role="form">
<div class="form-group">
<label for="inputEmail3" class="col-sm-2 control-label">邮箱</label>
<div class="col-sm-10">
<input type="email" class="form-control" id="inputEmail3" placeholder="请输入您的邮箱地址">
</div>
</div>
<div class="form-group">
<label for="inputPassword3" class="col-sm-2 control-label">密码</label>
<div class="col-sm-10">
<input type="password" class="form-control" id="inputPassword3" placeholder="请输入您的邮箱密码">
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<div class="checkbox">
<label>
<input type="checkbox"> 记住密码
</label>
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-default">进入邮箱</button>
</div>
</div>
</form>

下拉条和文本域

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<form role="form">
<!--下拉条-->
<div class="form-group">
<select class="form-control">
<option>1</option>
<option>2</option>
<option>3</option>
<option>4</option>
<option>5</option>
</select>
</div>
<div class="form-group">
<!--文本域-->
<textarea class="form-control" rows="3"></textarea>
</div>
</form>

单选框和复选框

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<form role="form">
<h3>案例1</h3>
<div class="checkbox">
<label>
<input type="checkbox" value="">
记住密码
</label>
</div>
<div class="radio">
<label>
<input type="radio" name="optionsRadios" id="optionsRadios1" value="love" checked>
喜欢
</label>
</div>
<div class="radio">
<label>
<input type="radio" name="optionsRadios" id="optionsRadios2" value="hate">
不喜欢
</label>
</div>
</form>

9.一些比较好看的按钮 QQ截图20141104191608

个人随笔

暑假时去了一趟北京拜访我叔叔,他是一位IT人士,正走在创业的道路上。他跟我说:“其实创业很简单,你看五道口那边的有个西少爷肉夹馍,是由几个西安交大毕业的大学生创办的,现在已经日入万元啦!”听完之后我觉得很震惊,餐饮业里只靠卖肉夹馍能日入万元?里面到底有什么奥秘,当时真想去看看它那肉夹馍有什么特别的。晚上回去休息的时候正好路过西少爷肉夹馍那边,不过令我惊奇的是都那么晚了竟然还排了那么长的队伍。叔叔说:“这里呀,从早上还没营业就已经排了几十米啦,从早到晚都是这样。”听完真是让我为之一振,不过当时由于赶时间要回去,所以不得不放弃这个亲密接触肉夹馍的机会了,有点遗憾。 回去之后,我一直对这件事念念不忘,西少爷肉夹馍能这么成功?我得去一探究竟。上网扒了一些相关的资料,算是对它有了一定的了解吧。趁这个机会,我把它记录下来。西少爷的创始人叫孟兵,和他一起创业的伙伴们都是来自腾讯、阿里、百度等知名公司的,也是一些IT界人士了,大家可能会纳闷,他们都进了这么大的公司了为什么还辞职卖肉夹馍呢?只能说他们有自己的想法和追求,具体原因,我也不详谈了。话说回来,他们为什么把自己的生意做得这么火爆?可以概括地这么说吧,他们利用了互联网的思维来经营自己的肉夹馍产品。 肉夹馍作为一个传统得不能再传统的餐饮行业,西少爷在它中间注入了互联网思维模式,一切都变得让人不可想象。可以说西少爷不仅仅是在做一个肉夹馍,他们在做一个产品,一个项目,而他们的公司则可以定位成一家互联网公司而不单单是一家餐饮公司。之前有一篇宣传故事叫《我为什么要辞职去卖肉夹馍》,里面写道创始人孟兵一开始就想去做肉夹馍,但其实不是这样。孟兵在北上广深四个一线城市都呆过一段时间,他通过对路边的小吃摊观察后发现,像驴肉火烧这种有地方特色的小吃是比较难流通到其他城市的,而像米粉啊、鸡蛋饼啊等等这种普遍性的产品才适合去经营。不过,要经营必须要结合自身的优势做出一款更好的有特色的产品来,在同行业的竞争中才能显出自己的优势。最后,孟兵通过与家乡陕西的特色小吃相对比,找出了一个最适合的产品,那就是肉夹馍。为什么?肉夹馍也作为陕西的特色小吃,同时也是全国的一项普遍性的产品,另外选择肉夹馍不仅仅是他对自己家乡的热爱,更重要愿望是想把具有陕西特色的肉夹馍带给大众的愿望。可以说,这些观察,这些思考,这些抉择,首先找准了产品路线的定位目标。 那么大多数人如果是确定了方向之后,就直接开始干了吧。孟兵呢?他没有这么做。目标找到了,但是设计理念上怎样呢?毕竟从陕西学到的肉夹馍的制作方法只是能让陕西人喜欢而已,但是能够做到所有人都喜欢吗?在产品研发上,这也是PM(产品经理)所需要考虑的问题。产品当然要做到让大多数人满意,只有一小部分人说好那不叫好,百分之八九十的人说好那才是真正的好。所以,半年的时间,孟兵和其他创始人没有做别的,他们把精力放在了产品(肉夹馍)的内测上,同时生产流程等等要做相应的优化,怎样保持松脆,怎样保持好的口感,都是他们需要考虑的问题。有两个创始人在百度呆过,他们知道搜索引擎这个东西是需要一定的计算公式的,而算法工程师也是要不断调整这个公式的变量来做到网站排名的优化,巧妙的是,他们把这套理念应用到了肉夹馍上,这也是一个学习和应用的过程。他们为肉夹馍放盐的多少、切肉的厚度、肉夹馍的厚度、肉夹馍的直径等等建立了一套计算公式,通过微调来调整口感,并且通过用户的反馈信息来不断进行优化。这种设计理念,这种设计思路,如果你没有相关的经验,如果你没有创新的思维,可以想到吗?孟兵说:”一个肉夹馍的研发绝对不亚于一个搜索引擎。而这种利用公式来制作肉夹馍的做法,一方面是我们的心血创造,但另一方面也很感谢百度这样的大公司为我们带来的视野与格局,也才能如此跨界。”那么他们是怎么测试的呢?可以归结如下:

内测Beta1.0,测试人员为10人左右,不断烘烤反复品尝味道,然后不断更换人员组成(亲戚朋友),反复测试该口感。内测Beta2.0,测试人员为20人左右,不断扩大测试人员的范围。内测Beta3.0,测试人员为30人左右,开始在北京街边学校等随机拉人来品尝。内测Beta4.0,这是测试的最后一版,团队举行了最后一次测试,地点定在清华,测试人员为100人,最后确定这100人中绝大多数人对口感是否非常满意。

正式公测1.0,五道口开张,火爆全场!

西少爷团队除了做到这一天,在每天平均工作近20个小时的情况下,每天准时9点开会,继续商量着怎样对自己的项目进行更好的优化,在工作流程上,切肉环节上,收款环节上能不能有进一步的提升。我想,这也是产品研发过程必不可少的一部分。

说到情怀,大家可能想起老罗和锤子,其实不单是老罗,他们也在追求一种极致情怀,比如小摊上肉夹馍小贩给你的肉夹馍都是用塑料袋盛放的吧,他们可不这样想,他们认为这样降低了用户体验,他们采用的纸袋包装方式,并且非但用普通的纸,他们还在追求一种不能透油的纸,提高他们的用户体验指数,不仅要保证食品的安全,还要达到最优化的效果。设想一下,光包装就追求这样,他们的肉夹馍能达到什么程度?另外北京的物价比较高是众所周知的,不过他们的肉夹馍定价竟然比陕西本地的肉夹馍还便宜,在五道口这个繁华的地段,他们仍坚持7元一份,希望能有更多人来体验到他们的产品。为了做这些肉夹馍,他们几个还特意回到西安拜师学艺,从零开始学习做最正宗的肉夹馍,用掉5000斤面粉和2000斤肉,他们终于研制出西少爷的特有秘方,为了这个产品,他们也是不惜一切,追求极致。毕竟是IT人,他们更懂得IT人的不易,促销时,他们会写凡是持有百度、阿里、腾讯等等公司工卡的顾客,均可享受一份肉夹馍面单,这份贴心,体现的也是一种情怀。

没有深入了解他们时我们可能产生这么一种想法,他们运用的是一种善于操纵营销的互联网思维,但是通过我的深入了解,他们的理念令我敬畏。孟兵的思想是,产品永远放在第一,营销放第二。真正好的产品具有自己的传播能力,口碑好,产品流传得广,自然不会轻易死掉。前几天听了一个讲座,你想做一个推广,原始的B2C模式是难以取得好的效果的,可以说纯粹操纵营销的手段是行不通的。只有产品真正达到一定层次,具有自传播能力,达到C2C亦或是P2P模式,那才说明你真正的成功了。好的产品,用户用着好,自然会去分享传播,真正好的产品不需要你具有多么好的营销手段才能做推广。他们把更多的时间放在产品上,一心一意做自己的产品,用户自然会像龙卷风一样慢慢被卷进来。

当然,并不是说不重视营销手段,只是它的地位比产品低了一层,有了很好的产品,没有合适的营销手段自然也是不行。这里就会牵扯到40人智囊团了。他们在公司里积累了一些人脉资源,有来自大大小小的公司阶层也在为他们的营销出谋划策,他们营销策略的背后不仅是团队的讨论决策,更有各路有经验的人在背后起着导航作用。所以说,营销在他看来虽然比不上产品重要,但是是向各路取经得来的宝贵经验也是他们经营成功的法宝之一。

通过了解他们的经营模式和理念,我真的感触颇深。我相信,越来越多的人会利用这种互联网思维来为他们的创业注入新的血液,将传统的行业升级,打造一个不一样的世界。也或许,我会成为其中之一,但那一切,现在都是未知。

(文/崔庆才)

2014.11.3

Other

1.初始化本地仓库

1
git init

2.添加文件到本地仓库暂存区

1
git add a.txt

3.添加文件到本地仓库

1
git commit -m 'v1'

此命令代表确认提交到本地仓库。-m ‘v1’代表为此添加一个版本标记 v1 4.查看当前 git 的状态

1
git status

结果 A:

1
2
3
4
5
6
7
8
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: readme.txt

no changes added to commit (use "git add" and/or "git commit -a")

证明当前有文件已经修改,但是没有准备提交的修改,没有 add 和 commit 结果 B:

1
2
3
4
5
 On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

modified: readme.txt

证明当前已经有文件提交了,但是还没有 commit 结果 C:

1
2
On branch master
nothing to commit, working directory clean

证明当前所有文件已经提交到本地仓库,工作目录是干净的 5.查看 git 日志

1
git log

结果:

1
2
3
4
5
6
7
8
9
10
11
commit aca3fe6cc3f49ded922d05e4774561f33697f710
Author: Qingcai Cui <1016903103@qq.com>
Date: Sun Nov 2 12:16:25 2014 +0800

v2

commit 90eea044b6da3818770ec482df98bb05ab569472
Author: Qingcai Cui <1016903103@qq.com>
Date: Sun Nov 2 12:07:46 2014 +0800

v1

证明当前我们已经 commit 了两次,上面的为最近提交的。 如果嫌输出太多可以尝试下面的命令,一行显示

1
git log --pretty=oneline

结果如下:

1
2
aca3fe6cc3f49ded922d05e4774561f33697f710 v2
90eea044b6da3818770ec482df98bb05ab569472 v1

一大串类似的

1
aca3fe6cc3f49ded922d05e4774561f33697f710

是 commit id(版本号),和 SVN 不一样,Git 的 commit id 不是 1,2,3……递增的数字,而是一个 SHA1 计算出来的一个非常大的数字,用十六进制表示,而且你看到的 commit id 和我的肯定不一样,以你自己的为准。为什么 commit id 需要用这么一大串数字表示呢?因为 Git 是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用 1,2,3……作为版本号,那肯定就冲突了。 6.版本回退 回退到上一版本:

1
git reset --hard HEAD^

回退到上上个版本:

1
git reset --hard HEAD^^

如果回退的版本过多则不用加那么多的^号 比如回退到上 10 版本,则可以用下面的命令

1
git reset --hard HEAD~10

回退 1 个版本相当于

1
git reset --hard HEAD~1

不过现在利用 git status 来查看已经看不到刚才那个版本了,想要返回的话怎么办 可以仍然用上面的方法

1
git reset --hard aca3f

只要写前几位就好了,git 会自动去匹配的。当然前提是你的命令行窗口没有关闭还能找到之前的 commit id。 不过万一你的命令行关闭了也没关系,git 提供了一个方法来记录你的每一次命令。

1
git reflog

结果:

1
2
3
4
aca3fe6 HEAD@{0}: reset: moving to aca3f
90eea04 HEAD@{1}: reset: moving to HEAD^
aca3fe6 HEAD@{2}: commit: jj
90eea04 HEAD@{3}: commit (initial): aa

在前方仍然显示了版本号,你仍然可以找到。仍然可以利用的 reset 命令来还原。 注意: A 工作区和暂存区的名词区别 工作区:就是你在电脑里能看到的目录 暂存区:在.git 文件夹下存在一个暂存区 stage 和好多个分支比如 master 当执行 git add 命令时,工作区的内容便会到 stage 暂存区中,当执行 git commit 命令时暂存区的内容便会提交到分支里面。 B “Git 管理的是修改”的意思 比如第一次修改 readme.txt,然后执行 git add 到暂存区,然后再修改 readme.txt,然后执行 git commit 到分支。 结果调用 git status 时发现现在仍然有一个 modified 文件,这是因为我们没有把新修改的文件提交到暂存区,所以导致分支中的文件和在工作区的原文不匹配。所以我们需要重新 add 和 commit。这说明 git 管理的是”修改”,而不是”文件”本身。 7.撤销修改

1
git checkout -- filename

比如 git checkout — readme.txt 它的作用如下: 把 readme.txt 文件在工作区的修改全部撤销,这里有两种情况: 一种是 readme.txt 自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态; 一种是 readme.txt 已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。 总之,就是让这个文件回到最近一次 git commit 或 git add 时的状态。 那么上面的这个情况是我们提交或者没提交到暂存区之后又对源文件做的修改。 还有另一种情况,我们提交之后放到了暂存区,我们想把暂存区里面的文件撤销回来。 就用以下命令:

1
git reset HEAD readme.txt

就是将刚才的 git add 命令撤销,把暂存区中的内容撤销回到工作区。 当然,如果你不但 add 了,并且又 commit 了,那就只能进行版本回退了。在上面已经说过了。 总结: 场景 1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令 git checkout — file。 场景 2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令 git reset HEAD file,就回到了场景 1,第二步按场景 1 操作。 场景 3:已经提交了不合适的修改到版本库时,想要撤销本次提交,进行版本回退,不过前提是没有推送到远程库。 8.删除文件 假如现在你新建了一个 hello.txt 文件,你已经 add 并 commit 到了本地分支之中。 现在你想删除,如果直接执行

1
rm hello.txt

则是只把工作区中的文件删除了,本地分支中没有删除,现在你执行 git status 则会提示当前工作区已删除了一个文件,本地分支仍然存在,就存在了工作区和本地分支不同步的问题,现在我们如果想恢复一下,就利用下面的命令

1
git checkout -- hello.txt

将本地的文件一键还原。 假如我们真的是想将本地分支中的一个文件删除,那么我们就执行下面的方法。

1
git rm hello.txt

执行了这个命令之后,我们执行 git status 之后就会提示 你现在需要 commit 一下确认删除。 并且执行完这个命令之后,我们执行 ls 命令之后发现本地的文件也已经不存在了。 如果有很多个文件在本地被删除掉了,暂存区和工作区的文件完全不一样了,工作区删除掉了很多个文件,就会出现

1
2
3
Changes not staged for commit:
deleted: a.txt
deleted: b.txt

如果一个个地删除文件肯定特别麻烦,所以我们可以用下面的命令来

1
git add -A

它等同于 git add . 和 git add -u

1
git add . 保存所有新文件和改动的文件,不包括删除的文件
1
git add -u  保存所有改动的文件和删除的文件,不包括新的文件

git add -A 和 git add -u 会把我们未通过 git rm 删除的文件全部 stage 使用过以后运行 git status 便会出现 changes to be committed … 说明已经都经过 git rm 删除了. 综上,我们想删除分支中的文件时就需要两条命令合起来使用

1
2
git rm hello.txt
git commit -m 'rm hello.txt'

要小心的是,执行 git rm 方法之后工作区和本地分支中的文件已经都不存在了。所以如果你已经在远程仓库存在备份的话,你就不用担心误删了。否则你就要小心了,会丢失这个文件的。 对比修改的文件

1
git diff

结果:

1
2
3
4
5
6
7
diff --git a/readme.txt b/readme.txt
index 9c58532..8ce5f7e 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1 +1 @@
-git is grea
+hello is grea

-号开头的语句代表这句话删除掉了 +号开头的语句代表这句话为新增语句 9.分支 新建本地分支

1
git branch dev

切换到 dev 分支

1
git checkout dev

创建并切换到该分支

1
git checkout -b dev

查看本地分支

1
git branch

比如此命令会输出 * master hello 代表当前已经选中了 master 分支,存在本地两个分支 master 和 hello 合并分支

1
2
git branch master
git merge hello

这样我们就把 master 分支合并到了 hello 分支了。 接下来我们就可以删除本地分支了。 既然分支合并这么简单,它可不可能出现什么问题呢?当然有,当然会出现分支合并冲突的问题。 比如我切换到了 hello 分支并修改了一个文件 add 并且 commit,然后我切换回了 master 分支 同样修改了这个文件,add 并且 commit。现在我们如果执行 git merge hello 则会报一个提示说 分支合并冲突。 我们查看刚才修改的文件发现已经发生了变化,我们需要手动修改完了之后,然后继续 add 和 commit 才可以。如果没有 add 和 commit,那么我们无法切换回原来的分支的。 add 和 commit 之后,原来的 hello 分支仍然保持了原来不变,只不过是我们的 master 分支改变了。下面示意图则清楚地表示出了如下关系,图中的 feature1 相当于 hello 分支。 合并之后,我们就可以进行删除分支了,可以删除掉 hello 分支。 0 其实上面的一系列操作 从 merge 到修改 然后 add 然后 commit 其实可以利用一条命令来修改,这个方法叫禁用 Fast Forward 模式 刚才的一系列命令如下

1
2
3
4
5
git checkout master
git merge hello
vi file.txt
git add file.txt
git commit -m 'merge master'

那么利用下面的语句同样可以达成同样的效果

1
2
git checkout master
git merge --no-ff -m 'merge master' hello

因为本次合并要创建一个新的 commit,所以加上 -m 参数,把 commit 描述写进去。 Git 就会在 merge 时生成一个新的 commit,这样,从分支历史上就可以看出分支信息。 结束之后我们照样可以删除 hello 分支。 删除本地分支

1
git branch -d hello

查看远程分支

1
git branch -r

查看本地和远程分支

1
git branch -a

现在遇到一个问题,我们正在工作的一个分支还没有做完,不能 add 或者 commit,但是现在有一个 bug 需要在另一个分支上去修复,那么我们就需要暂时存储当前的分支。所以就要用到下面的命令

1
git stash

当我们处理完其他的事情之后,再切换回来此分支。 先使用

1
git stash list

再取出 stash 列表中的内容

1
git stash pop

上面的方法既取出了 list 内容,并且把 list 中的元素删除掉。 强行删除分支

1
git branch -D new-branch

10.多人协作 多人协作的工作模式通常是这样: 首先,可以试图用

1
git push origin branch-name

推送自己的修改; 如果推送失败,则因为远程分支比你的本地更新,需要先用 git pull 试图合并; 如果合并有冲突,则解决冲突,并在本地提交; 没有冲突或者解决掉冲突后,再用

1
git push origin branch-name

推送就能成功! 如果 git pull 提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令

1
git branch --set-upstream branch-name origin/branch-name

这就是多人协作的工作模式,一旦熟悉了,就非常简单。 11.添加远程地址别名

1
git remote add origin git@github.com

删除远程地址别名

1
git remote rm origin

此方法删除掉 origin 这个地址别名 查看远程地址别名

1
git remote -v

推送到远程分支 我们在 github 上新建一个项目 添加远程仓库

1
git remote add origin  git@github.com:cqcre/gittest.git

推送上去

1
git push -u origin master

加上了 -u 参数,Git 不但会把本地的 master 分支内容推送的远程新的 master 分支,还会把本地的 master 分支和远程的 master 分支关联起来,即相当于推送到了一个默认的分支,在以后的推送或者拉取时就可以简化命令。 那么以后我们就不需要关联了,以后推送的话我们只需要输入

1
git push origin master

克隆远程仓库 假设现在已经存在了一个远程仓库,我们需要把这个仓库克隆到本地,我们需要使用下面的方法

1
git clone git@github.com:cqcre/test.git

这样我们就把远程的一个仓库取到了本地了。 12.强制操作 强制覆盖本地分支内容

1
2
git fetch --all
git reset --hard origin/master

强制覆盖远程内容

1
git push origin master --force

13.修改 commit 的备注 有时候我们 commit 的备注写错了,需要重新修改,可以利用如下命令

1
git commit --amend

14. .gitignore 的使用 在 git 中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改根目录中 .gitignore 文件的方法(如无,则需自己手工建立此文件)。这个文件每一行保存了一个匹配的规则例如:

1
2
3
4
5
*.a # 忽略所有 .a 结尾的文件
!lib.a # 但 lib.a 除外
/TODO # 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
build/ # 忽略 build/ 目录下的所有文件
doc/*.txt # 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt

规则很简单,不做过多解释,但是有时候在项目开发过程中,突然心血来潮想把某些目录或文件加入忽略规则,按照上述方法定义后发现并未生效,原因是.gitignore 只能忽略那些原来没有被 track 的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore 是无效的。那么解决方法就是先把本地缓存删除(改变成未 track 状态),然后再提交:

1
2
3
git rm -r --cached .
git add .
git commit -m 'update .gitignore'

15. 打 tag 在发布版本的时候,经常会用到打标签的方法。 增加一个标签

1
git tag -a "v1.0.0" -m "Version 1.0.0"

删除一个标签

1
git tag -d v1.0.0

删除远程标签

1
git push --delete origin v1.0.0

推送所有标签

1
git push origin --tags

16. 删除未监视文件

1
2
3
4
5
6
7
8
9
10
11
12
git clean -f

# 连 untracked 的目录也一起删掉
git clean -fd

# 连 gitignore 的untrack 文件/目录也一起删掉 (慎用,一般这个是用来删掉编译出来的 .o之类的文件用的)
git clean -xfd

# 在用上述 git clean 前,墙裂建议加上 -n 参数来先看看会删掉哪些文件,防止重要文件被误删
git clean -nxfd
git clean -nf
git clean -nfd

17. 子模块

1
2
3
4
5
git clone <repository> --recursive 递归的方式克隆整个项目
git submodule add <repository> <path> 添加子模块
git submodule init 初始化子模块
git submodule update 更新子模块
git submodule foreach git pull 拉取所有子模块

PHP

视频大小适配是个头疼的问题。之前利用了Advanced Responsive Video Embedder 这个插件结果发现还是手机端显示有些问题,不能正常播放,这下我们利用FitVids来做到电脑和手机适配。已经完美解决 这次我们不用加任何插件,完全可以用JS代码来实现。首先,我们需要在主题的js目录下创建一个js文件,名字叫做 jquery.fitvids.js 加入如下代码,然后保存。

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/*global jQuery */
/*jshint browser:true */
/*!
* FitVids 1.1
*
* Copyright 2013, Chris Coyier - http://css-tricks.com + Dave Rupert - http://daverupert.com
* Credit to Thierry Koblentz - http://www.alistapart.com/articles/creating-intrinsic-ratios-for-video/
* Released under the WTFPL license - http://sam.zoy.org/wtfpl/
*
*/

(function( $ ){

'use strict';

$.fn.fitVids = function( options ) {
var settings = {
customSelector: null,
ignore: null
};

if(!document.getElementById('fit-vids-style')) {
// appendStyles: https://github.com/toddmotto/fluidvids/blob/master/dist/fluidvids.js
var head = document.head || document.getElementsByTagName('head')[0];
var css = '.fluid-width-video-wrapper{width:100%;position:relative;padding:0;}.fluid-width-video-wrapper iframe,.fluid-width-video-wrapper object,.fluid-width-video-wrapper embed {position:absolute;top:0;left:0;width:100%;height:100%;}';
var div = document.createElement("div");
div.innerHTML = '<p>x</p><style id="fit-vids-style">' + css + '</style>';
head.appendChild(div.childNodes[1]);
}

if ( options ) {
$.extend( settings, options );
}

return this.each(function(){
var selectors = [
'iframe[src*="player.vimeo.com"]',
'iframe[src*="youtube.com"]',
'iframe[src*="youtube-nocookie.com"]',
'iframe[src*="kickstarter.com"][src*="video.html"]',
'object',
'embed'
];

if (settings.customSelector) {
selectors.push(settings.customSelector);
}

var ignoreList = '.fitvidsignore';

if(settings.ignore) {
ignoreList = ignoreList + ', ' + settings.ignore;
}

var $allVideos = $(this).find(selectors.join(','));
$allVideos = $allVideos.not('object object'); // SwfObj conflict patch
$allVideos = $allVideos.not(ignoreList); // Disable FitVids on this video.

$allVideos.each(function(){
var $this = $(this);
if($this.parents(ignoreList).length > 0) {
return; // Disable FitVids on this video.
}
if (this.tagName.toLowerCase() === 'embed' && $this.parent('object').length || $this.parent('.fluid-width-video-wrapper').length) { return; }
if ((!$this.css('height') && !$this.css('width')) && (isNaN($this.attr('height')) || isNaN($this.attr('width'))))
{
$this.attr('height', 9);
$this.attr('width', 16);
}
var height = ( this.tagName.toLowerCase() === 'object' || ($this.attr('height') && !isNaN(parseInt($this.attr('height'), 10))) ) ? parseInt($this.attr('height'), 10) : $this.height(),
width = !isNaN(parseInt($this.attr('width'), 10)) ? parseInt($this.attr('width'), 10) : $this.width(),
aspectRatio = height / width;
if(!$this.attr('id')){
var videoID = 'fitvid' + Math.floor(Math.random()*999999);
$this.attr('id', videoID);
}
$this.wrap('<div class="fluid-width-video-wrapper"></div>').parent('.fluid-width-video-wrapper').css('padding-top', (aspectRatio * 100)+'%');
$this.removeAttr('height').removeAttr('width');
});
});
};
// Works with either jQuery or Zepto
})( window.jQuery || window.Zepto );

接下来我们要修改functions.php文件咯 加入如下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
function add_fitvids() {
wp_register_script('jquery_fitvids', get_template_directory_uri(). '/js/jquery.fitvids.js', array('jquery'), '2.0.110526' );
wp_enqueue_script('jquery_fitvids');
add_action('wp_head', 'add_fitthem');
function add_fitthem() { ?>
<script type="text/javascript">
jQuery(document).ready( function() {
jQuery('.video').fitVids();
});
</script><?php
}
}
add_action('wp_enqueue_scripts', 'add_fitvids');

这段代码就是引入了上面我们放入的js文件,并在WordPress模板加载的时候进行初始化设置。 然后我们加入一段代码对某些模仿器进行适配。 针对YouTube或Vimeo等支持oembed的视频源,我们再在functions.php加入如下代码来进行控制

1
2
3
4
5
function add_embed_filter( $html ) {
$return = '<div class="video">' . $html . '</div>';
return $return;
}
add_filter('oembed_dataparse', 'add_embed_filter');

对于国内的一些视频网站,视频源为embed,我们再在functions.php加入如下代码来控制

1
2
3
4
5
6
7
function add_oembed_filter( $html ) {
$return = '<div class="video">' . $html . '</div>';
return $return;
}
add_filter('embed_youku', 'add_oembed_filter');
add_filter('embed_56com', 'add_oembed_filter');
add_filter('embed_tudou', 'add_oembed_filter');

我们在发布视频时只需要在外面套2行代码就行啦。 比如我的一个视频是从土豆获取来的HTML代码,源代码为

1
<embed src="http://www.tudou.com/v/bL4ioykS6ho/&amp;resourceId=0_05_02_99/v.swf" type="application/x-shockwave-flash" width="300" height="150"></embed>

那么我们在发布时只需要在外面套一层div就OK了

1
2
3
<div class="video">
....
</div>

最后的代码如下

1
<div class="video"><embed src="http://www.tudou.com/v/bL4ioykS6ho/&amp;resourceId=0_05_02_99/v.swf" type="application/x-shockwave-flash" width="300" height="150"></embed></div>

在文章中的HTML代码编辑器中插入如上代码即可实现手机端和电脑端的视频完美适配。 以上就是利用Fitvids来对视频进行适配操作的全部过程。

个人展示

2013年3月底,我的大一,我的轮滑社团,我的江南之行,我的所见所想,我的心灵感悟。

C/C++

大家好,本节为大家带来在Eclipse下配置Winpcap环境,欢迎大家收看。 首先,配置Winpcap环境的前提是你必须配置好了Eclipse下的C/C++环境。如果你还没有配置,欢迎大家收看上节内容进行配置。 链接地址:Eclipse配置C/C++环境 若链接失效,请自行查看上一篇文章或者百度其他文章。 废话不多说啦,开始我们的Winpcap的配置。 1.Winpcap的下载 Winpcap官网:Winpcap官网 Winpcap目前最新版为4.1.3,首先你要下载exe文件并安装,直接双击运行安装即可。 下载地址:Winpcap4.1.3.exe 然后你需要下载开发包,首先必须注意的是,目前最新版本是没有开发包的,最新的开发包为4.1.2,先见下图 下面的红色框说明了目前没有提供Winpcap4.1.3的开发包,最新版本的开发包是4.1.2,他可以与4.1.3的Winpcap配套使用。 所以下载4.1.2的开发包。 下载地址:Winpcap Developer’s Pack 4.1.2 2.Eclipse中的相关配置 首先新建一个C 的项目,具体的建立过程可以参见上一节的内容。 我们加入一个测试代码如下:

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#define WIN32
#define HAVE_REMOTE

#include <stdio.h>
#include "pcap.h"
#include "Win32-Extensions.h"

void gen_packet(unsigned char *buf,int len);

/*生成数据包*/
void gen_packet(unsigned char *buf,int len)
{
int i=0;

//设置目标MAC地址为01:01:01:01:01:01
for (i=0;i<6;i++)
{
buf[i]=0x01;
}

//设置源MAC地址为02:02:02:02:02:02
for (i=6;i<12;i++)
{
buf[i]=0x02;
}

//设置协议标识为0xc0xd,无任何实际意义
buf[12]=0xc;
buf[13]=0xd;

//填充数据包的内容
for(i=14;i<len;i++)
{
buf[i]=i-14;
}
}


int main()
{
pcap_if_t *alldevs;
pcap_if_t *d;
int inum;
int i=0;
pcap_t *adhandle;
char errbuf[PCAP_ERRBUF_SIZE];
int ret=-1;

/* 获取本机网络设备列表 */
if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1)
{
fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);
exit(1);
}

/* 打印网络设备列表 */
for(d=alldevs; d; d=d->next)
{
printf("%d. %s", ++i, d->name);
if (d->description)
printf(" (%s)\n", d->description);
else
printf(" (No description available)\n");
}

if(i==0)
{
printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
return -1;
}

/*选择网络设备接口*/
printf("Enter the interface number (1-%d):",i);
scanf("%d", &inum);

if(inum < 1 || inum > i)
{
printf("\nInterface number out of range.\n");
/* 释放设备列表 */
pcap_freealldevs(alldevs);
return -1;
}

/* 跳转到选中的适配器 */
for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);

/* 打开设备 */
if ( (adhandle= pcap_open(d->name, // 设备名
65536, // 65535保证能捕获到数据链路层上每个数据包的全部内容
PCAP_OPENFLAG_PROMISCUOUS, // 混杂模式
1000, // 读取超时时间
NULL, // 远程机器验证
errbuf // 错误缓冲池
) ) == NULL)
{
fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n", d->name);
/* 释放设备列表 */
pcap_freealldevs(alldevs);
return -1;
}

/*在选中的设备接口上发送数据*/
printf("\nsending on %s...\n", d->description);

/* 发送数据包*/
//生成数据报
int packetlen=100;
unsigned char *buf= (unsigned char *)malloc(packetlen);
memset(buf,0x0,packetlen);
gen_packet(buf,packetlen); //获得生成的数据包,长度为packetlen
//开始数据包发送
if ( (ret=pcap_sendpacket(adhandle,buf,packetlen))==-1)
{
printf("发送失败\n");
free(buf);
pcap_close(adhandle);
pcap_freealldevs(alldevs);
return -1;
}

/*释放资源*/
free(buf);
pcap_close(adhandle);
pcap_freealldevs(alldevs);

return 0;
}

把代码拷贝到你的项目程序里面,可以发现现在是编译错误,有些对象根本无法识别,截图如下: 接下来就需要我们对类库进行配置啦。 首先解压你下载的开发包,随便放硬盘的某个位置,我放在了D盘的eclipse_plugins文件夹中,当然你可以随便放哪里都行。 接下来配置Eclipse,右键项目->属性->C/C++常规->项目和符号。 首先添加你的include库,在包含这个选项卡中添加你的库,点击添加->选择文件系统->选择你刚才的开发库的include文件夹,按照图中的顺序来 点击确定添加,同理在库路径选项卡中进行库路径的配置,这次添加的是lib文件夹。按照图片中的顺序来做 点击确定添加。 然后在库的选项卡中添加wpcap和Packet两个库,注意这次不能选择文件系统了,因为你指定了库路径之后它会自动搜索路径中库的名字,这次你 只需要指定库的名字就好了。我之前添加的是文件系统,然后它总是提示找不到这个库,所以一定要直接填写这两个库的名字。如图所示: 添加完毕之后,出现这个样子: 好啦,点击确定,全部配置已经完毕啦。 重新构建项目,运行即可。 注意,构建过程可能出现如下问题:

  • error C2065: “PCAP_SRC_IF_STRING”: 未声明的标识符
  • error C3861: “pcap_findalldevs_ex”: 找不到标识符
  • error C2065: “PCAP_OPENFLAG_PROMISCUOUS”: 未声明的标识符
  • error C3861: “pcap_open”: 找不到标识符

因为新的版本里WinPcap支持远程数据包获取,所以还应当添加一个头文件remote-ext.h ,即#include “remote-ext.h”(记住这条语句要放在#include “pcap.h”之后,否则会出错!) 好了,一切问题都解决了,运行成功啦! 运行结果如下: 再附测试代码一例:

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
#define WIN32
#define HAVE_REMOTE

#include <stdio.h>
#include "pcap.h"

int main()
{
pcap_if_t *alldevs;
pcap_if_t *d;
int i=0;
char errbuf[PCAP_ERRBUF_SIZE];

//获取本地机器设备列表
if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL , &alldevs, errbuf) == -1){
//获取设备列表失败,程序返回
fprintf(stderr,"Error in pcap_findalldevs_ex: %s\n", errbuf);
exit(1);
}

//打印设备列表
for(d= alldevs; d != NULL; d= d->next) {
printf("%d. %s", ++i, d->name);
if (d->description)
printf(" (%s)\n", d->description);
else
printf(" (No description available)\n");
}

if (i == 0){
//没找到设备接口,确认WinPcap已安装,程序退出
printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
return -1;
}

//不再需要设备列表了,释放它
pcap_freealldevs(alldevs);

return 0;
}

运行结果:

1
2
3
4
5
1. rpcap://\Device\NPF_{5AC72F8D-019C-4003-B51B-7ABB67AF392A} (Network adapter 'Microsoft' on local host)
2. rpcap://\Device\NPF_{33E23A2F-F791-409B-8452-A3FB5A78B73E} (Network adapter 'Qualcomm Atheros Ar81xx series PCI-E Ethernet Controller' on local host)
3. rpcap://\Device\NPF_{DCCF036F-A9A8-4225-B980-D3A3F0575F5B} (Network adapter 'Microsoft' on local host)
4. rpcap://\Device\NPF_{D62A0060-F424-46FC-83A5-3394081685FD} (Network adapter 'Microsoft' on local host)
5. rpcap://\Device\NPF_{B5224A53-8450-4537-AB3B-9869158121CD} (Network adapter 'Microsoft' on local host)

PHP

网上关于七牛云存储的教程除了官网上的API文档,其他的资料太少了。研究了下API之后,现在已经能实现图片的上传和下载及上传之后的重定向。 首先本篇文章实现的功能如下: 1.利用表单上传功能,用户可以点击选择文件按钮,选择本地的一个文件,同时设定上传的图片的名称,点击上传按钮可以上传并存储到七牛云存储。 2.在点击上传时会检测文件的后缀名,限制为jpg和png格式存储。 3.上传成功后跳转到自己设定的一个URL,并传回文件信息,如文件名。而不是显示七牛白花花的json显示页面。 好啦,那我们开始吧,首先我们要有一个七牛云存储账号,如果没有的就自己去申请吧。 七牛云存储传送门:http://www.qiniu.com/ 一.SDK下载 https://github.com/qiniu/php-sdk/tags 戳这个网址下载一下SDK吧,里面封装了文件上传下载等等的方法,我们引入之后可以直接调用。 SDK之中有一个qiniu的文件夹,这是所有的SDK实货,这个是最重要的。我们首先要把这个文件夹及里面的文件放到项目文件夹中,比如我放到这里。 大家可以看到有一个qiniu文件夹。好啦,资源支持就是这样。接下来我们要实现代码咯。 二.文件的上传。 1.首先把你七牛云存储的密钥照出来,点击账号设置可以看到有一个AccessKey和SecretKey,留着备用。 2.上传凭证生成。 在这里我们首先要引入rs.php文件,自己找一对应路径,代码如下:

1
require_once(dirname(__FILE__)."/../../qiniu/rs.php");

dirname()是指的绝对路径,有时相对路径会出现问题,建议在前面加上dirname方法获取绝对路径。 require_once是引入文件,表示该文件只引入一次。 然后,传入你的AccessKey和SecretKey 代码如下:

1
2
3
$accessKey = 'Imn35KC5pRX7Ov3scxbYkvNk6oIx7zWsBRp16';  //换成你自己的密钥
$secretKey = 's29vc9tlCvs23wRh7QScYTuzCDmEroKj1ddssz'; //换成你自己的密钥
Qiniu_SetKeys($accessKey, $secretKey);

然后建一个上传策略对象,将你的bucket 传入,bucket 就是你的空间名。

1
2
$bucket = 'designpartners';
$putPolicy = new Qiniu_RS_PutPolicy($bucket);

然后调用此方法来生成上传凭证。

1
$upToken = $putPolicy->Token(null);

接下来就写一个html表单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<form method="post" action="http://up.qiniu.com" name = "form" enctype="multipart/form-data">
<ul>
<input type="hidden" id="token" name="token" value=<?php echo $upToken?>>
<li>
<label for="key">key:</label>
<input name="key" value="">
</li>
<li>
<label for="bucket">照片:</label>
<input name="file" type="file" />
</li>
<li>
<input type="submit" value="提交" >
</li>
</ul>
</form>

action 就填写 up.qiniu.com,表单提供了一个输入框key,用来输入你想保存的图片名称,上传到七牛之后就是这个名字。 然后一个文件选择,一个提交按钮。运行结果如下: 输入key值和选择照片即可实现照片的上传。哈哈哈有没有很简单。 三、文件下载 原理和文件上传功能相仿。 引入文件

1
require_once(dirname(__FILE__)."/../../qiniu/rs.php");

声明你的七牛云存储域名和两个密钥以及向下载的文件名称

1
2
3
4
$key = '00000';
$domain = 'designpartners.qiniudn.com';
$accessKey = 'IOImn35KC5p3scxbYkvNk6oIxB7zWsBRp16';
$secretKey = 's29vc9tlCvs23wCDmIbUSi4EroKj1z';

注意:1.key值即为文件名,不要加后缀 2.domain即为bucket加上qiniudn.com,例子中的designpartners就是我在上传图片时用的bucket名。 3.accessKey和secretKey换成你自己的,直接用我的不行的..因为我修改了.

1
2
3
4
5
Qiniu_SetKeys($accessKey, $secretKey);  
$baseUrl = Qiniu_RS_MakeBaseUrl($domain, $key);
$getPolicy = new Qiniu_RS_GetPolicy();
$privateUrl = $getPolicy->MakeRequest($baseUrl, null);
echo $privateUrl . "\n";

传入这四个值即可生成一样url,直接访问url即可实现图片的下载。 在引入图片时直接

1
<img src = "<?php echo $privateUrl; ?>"/>

即可引入图片咯,很简单的吧。 四、303重定向 在上面的方法中,我们上传图片成功后跳转到up.qiniu.com下,会显示白白的网页,显示一个json字符串,但是在实际网站开发中我们肯定 不能让用户看到这种网页,所以我们用到了303跳转。SDK中也为我们封装了这个方法。使用其实非常简单。在上传文件的代码中添加两行代码即可

1
2
3
$putPolicy = new Qiniu_RS_PutPolicy($bucket);
$putPolicy->ReturnUrl = site_url()."/upload/receiveInfo";
$putPolicy->ReturnBody='{"key": $(key)}';

注意:1. ReturnUrl和ReturnBody必须指定,并且首字母要大写,很多人都小写开头,这样会跳转不成功。 2.ReturnUrl必须是一个公网可以访问的网址,在本地测试是不可能通过的。比如你写成localhost,七牛服务器是定位不到的。 3.这个ReturnUrl的链接后会跟着一个?upload_ret=XXX,可以用get方法获取这个upload_ret。upload_ret的内容是base64安全编码的json形式的key值。 值的解析:比如我上传的文件名是555

1
upload/receiveInfo?upload_ret=eyJrZXkiOiAiNTU1In0=

网址后缀如上所示,把那个upload_ret复制下来,用base64解码可以出现如下结果:

1
{"key": "555"}

所以,我们要获取555这个值的代码如下,即解析代码如下:

1
2
3
4
$upload_ret = $_GET['upload_ret'];
$json_ret = base64_decode($upload_ret);
$result=json_decode($json_ret);
echo "key".$result->key;

好啦,获取到这个key值之后,你可以选择存到数据库或者进行其他的操作咯。 五、上传前文件类型的验证 我们可以用js来验证文件的后缀名, 在form的属性里加上

1
onsubmit="return isValidateFile('file');"

加上一个js方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<script>
function isValidateFile(obj) {
var extend = document.form.file.value.substring(document.form.file.value.lastIndexOf(".") + 1);
if (extend == "") {
alert("请选择头像");
return false;
}
else {
if (!(extend == "jpg" || extend == "png")) {
alert("请上传后缀名为jpg或png的文件!");
return false;
}
}
return true;
}
</script>

即可验证它的类型是否合法。 附:CI代码实现: 获取Uptoken:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function getUptoken(){
require_once(dirname(__FILE__)."/../../qiniu/rs.php");
//远程存储空间名称
$bucket = 'designpartners';
$accessKey = 'IOImn35KCRX7Ov3scvNk6oIxB7zWsBRp16';
$secretKey = 's29vc9tlCvs23wRhTuzCDmIbUSi4EroKj1z';
Qiniu_SetKeys($accessKey, $secretKey);
$putPolicy = new Qiniu_RS_PutPolicy($bucket);
echo site_url();
$putPolicy->ReturnUrl = site_url()."/upload/receiveInfo";
$putPolicy->ReturnBody='{"key": $(key)}';
$upToken = $putPolicy->Token(null);
return $upToken;
}

文件上传:

1
2
3
4
5
6
7
public function uploadPic(){

$upToken = $this->getUptoken();
$data['upToken'] = $upToken;
$this->load->view('upload',$data);

}

303重定向解析:

1
2
3
4
5
6
public function receiveInfo(){
$upload_ret = $_GET['upload_ret'];
$json_ret = base64_decode($upload_ret);
$result=json_decode($json_ret);
echo "key".$result->key;
}

文件下载:

1
2
3
4
5
6
7
8
9
10
11
12
13
public function downloadPic(){
require_once(dirname(__FILE__)."/../../qiniu/rs.php");
$key = '00000';
$domain = 'designpartners.qiniudn.com';
$accessKey = 'IOImn35KC57Ov3scxbYkvNk6oIxB7zWsBRp16';
$secretKey = 's29vc9tlCvsh7QScYTuzCDmIbUSi4EroKj1z';
Qiniu_SetKeys($accessKey, $secretKey);
$baseUrl = Qiniu_RS_MakeBaseUrl($domain, $key);
$getPolicy = new Qiniu_RS_GetPolicy();
$privateUrl = $getPolicy->MakeRequest($baseUrl, null);
echo "====> getPolicy result: \n";
echo $privateUrl . "\n";
}

表单:

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
<script>
function isValidateFile(obj) {
var extend = document.form.file.value.substring(document.form.file.value.lastIndexOf(".") + 1);
if (extend == "") {
alert("请选择头像");
return false;
}
else {
if (!(extend == "jpg" || extend == "png")) {
alert("请上传后缀名为jpg或png的文件!");
return false;
}
}
return true;
}
</script>
<form method="post" action="http://up.qiniu.com" name = "form" enctype="multipart/form-data" onsubmit="return isValidateFile('file');">
<ul>
<input type="hidden" id="token" name="token" value=<?php echo $upToken?>>
<li>
<label for="key">key:</label>
<input name="key" value="">
</li>
<li>
<label for="bucket">照片:</label>
<input name="file" type="file" />
</li>
<li>
<input type="submit" value="提交" >
</li>
</ul>
</form>

C/C++

本次为大家带来的是用Eclipse配置C/C++环境的具体步骤,希望对大家有帮助哦。 Eclipse 配置C/C++开发环境讲解如下: 1.JDK下载 如果没有安装JDK环境的小伙伴请自行去官网下载安装啦,安装之后的就可以跳过此步. 下载地址:JDK下载 JDK环境配置 2.Eclipse下载 当然,下载JDK的目的是在Eclipse下先运行起Java程序,这样才能方便我们下一步的操作,没有Eclipse的也去下载。 下载地址: Eclipse下载 上面两步我想难度都很小,而且大部分同学已经配置了,我就不一一讲解了。 想了解详情,欢迎联系发我邮箱 1016903103@qq.com 3.CDT下载 CDT是什么?它就是Eclipse的一个插件,我们需要安装了之后才可以新建C/C++项目。 注意:下载的CDT必须和Eclipse的版本对应。 下载地址:CDT下载 上面下载的Eclipse是3.7版本,在此给出适配CDT 8.0的下载链接。 下载地址:CDT 8.0下载 如果上述链接已失效,请自行百度适配你Eclipse版本的CDT进行下载。 下载之后它是一个压缩包zip格式。 不要解压直接安装即可,安装讲解如下: 打开Eclipse,进入菜单Help,选择Install New Software…,点击右边Add按钮,在Add Repository对话框中点击右下角的Archive…,浏览到你之前下载保存路径,选中cdt-master-8.0.0.zip并双击,勾选所有 CDT部件,然后点击Next>,继续Next>,选中“I accept the terms of the license agreement – Finish”,点击Finish开始安装CDT。 安装完CDT后重启Eclipse。 这样我们的Eclipse的CDT插件就安装好啦,这时你会发现可以新建C/C++项目了,但是还是不能编译运行,为什么?因为没有安装编译器。接下来我们需要下载mingw编译器。 4.mingw下载。 这是一个配套Eclipse的C/C++编译器,首先我们下载下来。 官网下载地址:mingw官网下载 现在发现最新版本下载是:mingw-get-setup.exe 双击运行,选择安装路径,我的路径为:D:\mingw,安装完成之后你会发现出现一个下载库的窗口,叫Mingw Installation Manager 注意: 1. 我的类库已经安装完毕,所以每个类库前面都显示为绿色的方框,没安装之前是白色的,你需要都勾选上,然后下载安装。在每个类库上邮件单击选择make for installation即可勾选。再点击菜单中的Installation中的Update Catalogue即可安装你所勾选的类库了。 2. 安装下载可能花费不少时间,请耐心等待。 大家可以发现最左边有Basic Steup和All Packages两个分类。 第一个Basic Steup即为必须要安装的编译类库,All Packages即为所有的类库。为了保险起见,我把所有的类库都安装了。全部安装完之后即会显示绿色。 安装完之后的目录结构如下: 5.配置 环境变量配置: 计算机– 属性 – 高级系统设置 – 环境变量 在上方的用户变量中进行如下操作: 注意:mingw的位置不同,环境变量的配置不同,可以看最底层目录比对着来配置。我的环境变量配置如下: (1)编辑PATH变量,在最后面加入 D:\mingw\bin D:\mingw\msys\1.0\bin D:\mingw\mingw32\bin (2)添加LIBRARY_PATH变量,内容为: D:\mingw\lib (3)添加C_INCLUDE_PATH变量,内容为: D:\mingw\include (4)添加CPLUS_INCLUDE_PATH变量,内容为: D:\mingw\lib\gcc\mingw32\4.8.1\include\c++ 修改: 进入D:\mingw\bin下将mingw32-make.exe复制成make.exe。因为Eclipse使用时预设是用系统里的”make”这个文件名,而不是”mingw32-make”。 Eclipse中的配置: 窗口 -> 首选项 -> C/C++ -> New CDT Project Wizard 在右边的首选工具链的右边,工具链栏目内选择MinGW GCC,确定,如图所示: 还是在原来的 New CDT Project Wizard选项卡中,展开,Makefile项目,二进制解析器,勾选PE windows解析器,确定,如图所示。 好啦,配置工作完成,我们来测试一下新C语言项目。 右键新建->项目->C项目 下一步,选择可执行文件,Hello World ANCI C Project 编译器选择 MinGw GCC 完成,如图所示: 完成之后的界面应该是如下所示,点击构建项目,图中的红色圆圈,构建完成之后,右键运行程序 运行结果: 欢呼吧小伙伴们 ! Eclipse 配置C/C++环境到此完全结束,如果有问题欢迎交流,欢迎评论交流。 我的邮箱:1016903103@qq.com 我的微博:新浪微博 腾讯微博

PHP

在SAE上搭建自己的WordPress博客之后,接下来的工作会轻松比较多。还有一些细节上的处理问题在此做一下记录 1.绑定域名 首先,你必须有一个自己的域名,建议在国外网站注册域名,首先国外的域名不需要备案的,其实按常理来说是国外域名不需要备案,但是国内的一些机构规定了是国外主机才不需要备案。建议的网站有Godaddy、name、enom、Ipower、domainsite 不过就可能比国内网站贵.所以我在新网上注册的域名,不过比较坑的是它不支持二级域名绑定。 就比如说我想直接想用域名定位到121.250.211.33/wordpress 即直接用域名代替以上内容是办不到的。但是国外网站的支持这种功能。国内的应该也有,不过没有尝试过。 那么,有了域名之后,在sae上项目绑定域名选项,他会提示: 请 把e31549a6ef.cqcre.net通过A记录解析到178.19.181.223完成域名身份验证。 域名身份验证将在SAE获取到相关DNS记录后完成(由于各地DNS Cache的影响,此过程可能需要较长时间,但一般情况下在您解析完验证域名后一天之内能完成验证)。 那么在你的DNS服务器上设置A记录和CNAME记录就好了。 2.SEO优化 超强插件 all in one seo 下载地址:http://downloads.wordpress.org/plugin/all-in-one-seo-pack.zip

做完网站怎么能不加seo优化呢?按完插件之后就设置主页标题、关键字、文章标题seo title 等等的东西咯。另外还有各种复杂的功能就不一一赘述了,seo优化还需要你做很多动作的。要不然怎么有人整天花那么多时间做seo优化呢?

3.访问之后又跳回sinaapp二级域名的解决 这个可能遇到的问题是点击一篇文章之后,又跳转到sinaapp上去了。 这是因为没有修改wordpress的url配置的缘故,只需要登录wordpress后台,在“设置-常规”里将“WordPress 地址(URL)”和“站点地址(URL)”两项修改为新域名即可。注意必须修改同时修改这两个,要不然可能还是出现同样的问题。 另外需要注意的是,这样设置之后,每次都要重新进行解析,而且走的是国外DNS线路,会耗费双倍的云豆。如果你的域名已经备案的话那么就会走国内线路了,而且速度快,云豆耗费还是原量。总是备案的好处还是多多的。 4.不备案域名提高访问速度 由于sae是通过中转境外的代理服务器来实现绑定未备案的独立域名的,访问速度会慢于直接通过二级域名访问。从网上发现这么一个插件能够实现“将资源文件通过SAE二级域名进行访问,而将网站主要文件通过主域名访问,进而加快访问速度”,理论上应该是会有些许效果的,不过没有对比测试过。 链接地址:http://www.219.me/posts/964 5.让二级域名重新定位到顶级域名 使用新域名前创建的页面可能已经被搜索引擎收录,如果希望通过这些链接访问网站时能自动跳转至新域名的话,就需要通过配置让这部分链接301永久重定向至新域名。通常是通过修改apache的.htaccess配置文件来实现url的重定向,但是sae并不支持.htaccess的配置,而是使用了自己的AppConfig配置来实现,修改wordpress根目录下的config.yaml文件即可达到效果,使用如下: 添加如下代码即可:

1
2
- rewrite: if(in_header["host"] ~ "^abc.sinaapp.com" && 
path ~ "^(.*)$"goto "www.cqcre.net$1 [L,QSA,R=301]"

其中 abc.sinaapp.com 即为原网址,www.cqcre.net即为跳转到的网址。可以根据自己的需要进行替换 6.手机端访问出现混乱的问题 大家访问之后可能出现用手机访问之后布局变得混乱,或者字体太小。因为我们本身建的站点就是为电脑或者平板访问的,所以用我们手机这种小屏幕来访问的话可能就会出现问题。 解决办法:单独加一个手机端专用主题,比如我的网站用手机和电脑访问呈现的主题是不一样的,可以尝试一下哦。 其实大家找个手机主题可以改成相仿的风格就好啦。不过如果有直接支持电脑和手机同时访问的主题那就不用咯。 在此推荐两款手机主题,大家可以在此基础上进行修改。Mobile-better 和 Mobile pack 两款都是非常简洁的主题,可扩展性较强。 另外还需要安装一个插件:Any Mobile Theme Switcher,在设置界面可以选择自己显示的主题。有好多选项,比如Android端访问的是什么主题,ipad 端访问的是什么主题,其他等等访问用的是什么主题。设置好之后,就尝试下吧。 以上是我总结的对sae上的WordPress站点的优化,欢迎大家讨论分享。

Other

我连的是MySQL数据库,但是在服务器下运行jsp文件时会出现如下的状况:

控制台报错:com.mysql.jdbc.Driver

即不能找到驱动程序,通过我的一次次试验,终于得到解决

首先我的代码编写是没有问题的,而且我已经在eclipse下的jar库中导入了jdbc驱动文件。直接运行java应用程序

运行java应用程序,结果如图所示,成功连接上数据库并打印输出了teacher表中所有数据。

jsp中的代码如图所示:即引用了该java文件并打印输出

但是通过tomcat运行程序,控制台报错:com.mysql.jdbc.Driver

可以说明没有找到该驱动程序,说明我们放在改project下的驱动程序是没有应用上的。

内部原理是:jsp文件先转化成java文件,再编译成class文件在tomcat下执行,所以调用的驱动程序应该置于tomcat根目录下。然后

我把这个jdbc驱动程序放在了tomcat的lib目录下,再次运行。

继续报错:com.mysql.jdbc.Driver

仍然没有找到驱动程序,最后发现是忘记了配置环境变量,这个很重要。

打开环境变量配置页面,在CLASSPATH中,加入

D:tomcat 6.0apache-tomcat-6.0.29libmysql-connector-java-5.0.8-bin.jar

注:读者路径不一定和我一样,我把tomcat放在了D盘

如图:

接下来运行,测试

成功!!没有报错,运行结果如图:

成功解决!有问题的可以评论,看到后我会及时回复的!希望对大家有帮助!

Other

声明:本文章参考中国派论坛,尊重版权,本文章予以整理。

一、【刷机准备】

1、备份你手机上的重要资料 2、下载MIUI刷机包 金立ELIFE E6刷机MIUI ROM

http://yun.baidu.com/s/1jGp2QQ6

3、将刷机包放进手机U盘的根目录下,保存备用。

二、【刷入第三方Recovery】 必须先刷入第三方Recovery,具体刷入教程请参看:

1、首先下载这三个文件:

刷机驱动:

http://pan.baidu.com/s/1kThZnE3

刷机工具: http://pan.baidu.com/s/1qWIwRco

金立中文恢复系统(第三方Recovery):

http://pan.baidu.com/s/1kTHRdcV

放到同一个文件夹解压备用。

2、安装驱动:

刷机驱动下载解压,打开后见下图所示

点击刷机驱动-自动安装,再点击InstallDriver安装驱动。

成功后如图所示:

3、刷机:

请注意刷机前一定要备份好自己的重要资料,联系人,短信备份,否则刷机完毕后会丢失。

然后关闭手机,取出SIM卡,以免造成损坏。先不要用USB线连接手机!下载解压刷机工

具,然后打开见下图所示,点击

Flash_tool.exe

下图是打开后的刷机界面:

按照下面的操作步骤操作,图片上标有序号.点击Scatter-loading,然后选择刚才下载的中文恢复系统文件夹,

选择图片所示文件,点击打开。

然后点击Download,这时会出现一个提示框,点击是。在此前一定不要连接手机!

上面的操作执行结束后,手机关机连接电脑即可开始识别。识别后自动开始刷入,识别过程红色进度条,刷入过程黄色进度条。

最后刷机成功后会显示绿色的圆圈。

如果你看到如下界面恭喜你刷机成功。

三、【获取超级权限(root)】

注意:这是必要的一步,刷入系统需要获取手机最高权限,好多网友会担心相机丢失和卡顿问题,此方法完全不会出现此情况,请放心使用。

也就是说这也是完美ROOT的方法。但该步操作会全部清空手机数据,请在此之前一定备份好联系人和其他重要资料!

1、成功刷入后,手机关机,然后同时按住音量上键和电源键,等待手机界面出现ELIFE时,同时松开音量上和电源键 手机进入Recovery模式如下

如下图:

2、选择第一项重启手机,进入如下界面

3、选择第一项【取消—返回】,进入如下界面,这时如果你的手机未ROOT,它会提示你是否需要ROOT,

请选择【Root device】即可,这时手机会自动重启,你的手机已成功ROOT

4、重启开机,为了使你的手机更安全,建议你手动安装超级授权管理,下载地址如下:

http://yun.baidu.com/s/1gd7PQON

导入到SD卡中,将其安装.

四、【刷入MIUI】

1、再次关机,然后同时按住音量上键和电源键,等待手机界面出现ELIFE时,同时松开音量上和电源键 手机进入Recovery模式如下如下图:

屏幕显示如下: -重启手机 -选择SD卡上的ZIP刷机包 - 从电脑从ADB刷入刷机包 -清空DATA/恢复出厂设置————————》此为双清(双W) -清空CACHE 分区 —————————》此为双清(双W) -备份和恢复 -挂载分区/U盘模式 -高级2、双清 a. 清空DATA/恢复出厂设置(音量上下键移动,电源键确定) 确认后会出现几个”NO” 与”Yes—delete all user data”组成的画面 音量下键 移动光亮条移动至Yes—delete all user data 电源键确认 b.清空CACHE 分区 具体步骤参见a 3、 双清完毕 选择第二项 选择SD卡上的ZIP刷机包 4、 点击进入后 选择第一项 从SD卡选择刷机包 5、 音量+键 找到刚才放在手机U盘的刷机包 选择Rom包 6、选择【是】 刷机开始 等待刷机完毕 请耐心等待 7.、刷机完毕 点击【返回】到如下界面

8、选择【 重启手机】 9、手机自动重启,刷机成功,到此大功告成!

五、全新的界面如下:

Other

1、首先要下载git安装

百度git,第三个git for windows就是

然后点击下载,下载最新版本就好了,这个很简单的,安装的时候直接下一步下一步就好了。不再赘述

2.首先在京东云擎上创建一个项目,我创建的PHP项目

其中域名访问是你预览项目的网址,git地址是代码保存的地址,点击复制可以复制下git地址,一会我们会用到

3.git使用

我们在电脑上创建一个文件夹用来保存项目,比如我创建了hello文件夹,如图所示,现在文件夹还是空的

我们把新建项目上的东西拉下来,在该处右击会出现选项菜单,有一个GIt Init Here,点击一下初始化该项目文件夹,点击后应该会出现.git文件夹,如果没有出现那么则是隐藏了,在控制面板调节显示隐藏文件夹就好了

再右击点击Git Bash,类似命令行的窗口就弹出来了,让我们先把网络上的项目下载到hello文件夹中,点击刚才的京东云擎,把git地址复制下来在命令行中写入

git pull https://code.jd.com/18366119732_p/jae_cqctest.git

他会提示你输入用户名和密码,输入之后会出现下列文件,说明pull成功了

打开文件查看下,这是建立项目默认的配置

我们把index文件修改下,比如修改成

继续打开Git Bash

输入git add . 把所有文件添加,然后git commit -m ‘x’ 其中commit是提交确认,-m ‘x’修改描述信息,x可以随便改,如图所示

你可以自定义路径名

git remote add origin https://code.jd.com/18366119732_p/jae_cqctest.git 添加远程仓库

也就是把这个网址保存为origin,以后就可以利用origin 来代替这个网址了,方便一些

另外

git remote -v 是查看所有定义的变量

git remote rm origin 为删除远程仓库

我们现在把刚才的网址定义为远程仓库

现在把本地文件上传

输入git push origin master,用户名密码

origin是代表远程仓库,master是分支,上传到该分支

出现如图所示界面说明成功了

刷新下原来的界面,可以看到你最近上传的东西

点击部署,一键部署

然后再点击访问就可以看到index中页面内容了

Other

1.绘制子图 subplot

1
2
3
>> subplot(1,2,1)
>> subplot(1,3,1)
>> subplot(2,3,1)

subplot 函数代表绘制子图,三个参数,第一个代表绘制一共绘制几行小图表,第二个代表绘制几列小图表,第三个代表绘制第几个小图表。此命令也可以用来选定绘制哪个图

2.注释标记 text

1
2
3
>> text(1,5,'线宽度为4')
>> subplot(1,2,1)
>> text(0.5,0.5,'线宽度为1')

text 函数用来绘制注释,三个参数,第一个是x坐标,第二个为y坐标,第三个为文字。

3.获得句柄值属性 get

1
2
3
4
5
6
7
8
9
>> get(h1)
DisplayName =
Annotation = [ (1 by 1) hg.Annotation array]
Color = [0 0 1]
LineStyle = -
LineWidth = [0.5]
Marker = none
MarkerSize = [6]
MarkerEdgeColor = auto

用来获取句柄值属性,一个参数传入句柄值即可

4.设置句柄值属性 set

1
>> set(h2,'LineWidth',4)

用来设置句柄值属性,三个参数,第一个为句柄值,第二个为属性名,第三个为属性值

5.矩阵的拼凑 [h1;h2] [h1 h2]

1
2
3
>> h1 = [2 3 4]
>> h2 = [4 5 6]
>> h = [h1;h2]

h则变为h1和h2叠成的矩阵,即h1在上h2在下

1
2
3
>> h1 = [2 3 4]
>> h2 = [4 5 6]
>> h = [h1 h2]

h则变为h1和h2左右拼接成的矩阵,即h1在左h2在右

6.二维作图 plot

(1) plot(Y)

①参数为向量:

1
>> plot([2 3 4])

作图时则

作(1,2),(2,3),(3,4)的直线

②参数为矩阵:

1
>> plot([1 2 3;4 5 6])

则作(1,1)(2,4)和(1,2)(2,5)和(1,4)(2,6)的直线

(2)plot(X,Y)

①参数为向量和向量

1
>> plot([1 2 4 ],[2 3 7])

作一条直线过(1,2)(2,3)(4,7)

②左向量右矩阵

1
>> plot([1 2 3],[2 3 4;5 6 7])

作图(1,2)(2,3)(3,4)直线和(1,5)(2,6)(3,7)直线 ,共两条

③左矩阵右向量

1
>> plot([1 2 4;3 4 1],[2 3 7])

作图(1,2)(2,3)(4,7)和(3,2)(4,3)(1,7)直线,共两条

④左矩阵右矩阵

1
>> plot([1 2.9 3;4 5 8],[2 3.5 4;5 6 7])

作图三条直线,第一个矩阵的第一列和第二个矩阵第一列为一条直线,第一个矩阵的第二列和第二个矩阵的第二列为一条直线…依次类推,共三列,故三条

(3)plot(X1,Y1,X2,Y2…)

同理,会增加X2和Y2形成的直线

(4)plot(X,Y,LineSpec,…)

可以加一些属性,其中LineSpec为属性,后面的..则为附加属性

1
2
3
>> plot(x,y,'--ro','LineWidth',4)
>> plot(x,y,'--ro','LineWidth',6)
>> plot(x,y,'--ro','LineWidth',6,'MarkerSize',12)

线型: - 实线 — 虚线 : 点线 -. 点画线

描点:. 点 o 圈 x 叉号 + 加号 * 星号 > 右三角 ^ 上三角 v 下三角 < 左三角 s 方形 d 菱形 p 五角星 h 六角星

颜色: r 红 y 黄 b 蓝 w 白 k 黑

另外的属性可以通过get 获取

7.为坐标加标签 xlabel ylabel

1
2
>> xlabel('x') %为x轴加标签
>> ylabel('y') %为y轴加标签

分别为x轴和y轴加上标签

8.图形保持功能 hold

1
2
>> hold on  %开启图形保持功能
>> hold off %关闭图形保持功能

hold on为开启图形保持功能,hold off 为关闭图形保持功能
9. 显示或隐藏坐标边框 box

1
2
>> box on    %开启坐标边框
>> box off %关闭坐标边框

box on 显示 box off 关闭 左边边框即为右侧和上方的坐标框,坐标系依然存在

10.添加或消除网格 grid

1
2
3
>> grid on      %显示网格
>> grid off %关闭网格
>> grid minor %显示次网格

11.为坐标系添加标题 title

1
2
3
4
>>title('string')     %为坐标系添加标题
>>title(...,'Property','Value') %设置标题属性
>>h = title(...) %获得句柄值
>>get(h) %获得句柄值的属性

12.添加文字标注 text

1
2
>>text(x,y,'string')
>>text(1,2,'OK') %添加标记

13.设置坐标系属性 axis

1
2
3
4
5
6
7
>> axis on %显示坐标线
>> axis off %关闭坐标线
>> v = axis %显示坐标线范围
>> axis tight %不显示多余部分
>> axis fill %坐标系充满显示框
>> axis equal %坐标纵横比相同
>> axis square %坐标区域为正方形

14. 显示图形标注框 legend

1
>> legend('string1','string2,...')  %标注各个画线代表什么

15.生成间隔向量 linspace

1
>> t = linspace(0,2*pi,60) %生成等间隔从02pi的60个元素向量

16.绘制匿名函数 fplot

1
2
>>  f = @(x)200*sin(x)/x; %声明匿名函数表达式
>> fplot(f,[-20 20]) %绘制函数

17.绘制隐函数 ezplot

1
2
>> ezplot('3*x.^2+2*x*y+4*y.^2=5') %直接输入隐函数表达式
>> ezplot('3*x.^2+2*x*y+4*y.^2=5',[-1 1]) %直接输入隐函数表达式,并加入x的范围

18.绘制饼状图 pie

1
2
3
4
>> x = [10 10 30 42 23]; %输入各个值
>> name = ['1','2','3','4','5']; %输入各个名字
>> explode = [0 0 0 0 1] %将第五个分离出来
>> pie(x,explode,name) %绘制饼状图

19.绘制柱状图 bar

1
2
3
4
5
6
>> subplot(1,2,1)
>> x = [3 4 2 1]; % 每列一个
>> bar(x)
>> subplot(1,2,2);
>> y = [4 5 2 4;6 4 1 2]; % 每列两个
>> bar(y)

Other

1.匿名函数定义

1
2
3
4
5
6
>> f = @(x)x.^2;
>> fx = f(1:10)

fx =

1 4 9 16 25 36 49 64 81 100
1
2
3
4
5
>> g = @(x,y)x.^2+y.^2;
>> gxy=g(1:10,2:11)
gxy =

5 13 25 41 61 85 113 145 181 221
1
2
3
4
5
6
7
8
9
10
11
12
13
>> g = @(a,b)@(x)a*x+b;
>> h = g(2,3);
>> h

h =

@(x)a*x+b

>> k = h(2)

k =

7

2.嵌套函数

1
2
3
4
5
6
7
8
function r =MytestFunction(input)
a = 5;
c = sin(input)+tan(input);
function y = nestedfun(b);
y = a*c+b;
end
r = nestedfun(5);
end
1
>> r = MytestFunction(5)
1
2
3
4
5
6
7
8
9
10
11
12
function r = NestFunction3(a)
b = a+1;
function x = nest1(m)
x = m+1;
function nest2
n = x+1;
end
nest2;
end
nest1(b);
r = n;
end
1
>> NestFunction3(5)

注:变量作用域范围,嵌套函数访问父函数的变量,可以在函数定义里面直接拿来用,父函数访问访问嵌套函数必须在经过调用之后才能调用.

第二重嵌套函数可以调用不包含它的第一重嵌套函数,即子函数可以求助于叔伯,但第三重函数不能调用它的第二重嵌套函数,非直系关系。

函数关系比喻成父子孙等关系,函数调用比喻成一个人求助一个人,规律如下:

父亲可以求助儿子,儿子可以求助父亲,父子可以互相求助。一个人不能求助孙子,重孙等后代,但可以求助直系祖宗如祖父曾祖父等以及和直系祖宗是亲兄弟的先人。一个人可以求助亲兄弟或者亲叔伯,不能求助侄儿。

3.求函数零点

1
2
3
4
5
6
>> f = @(x) exp(x)+x.^2+x.^(sqrt(x))-100;
>> x0 = fzero(f,3)

x0 =

4.163549956946139

fzero 函数为求零点的函数,第二个参数是基准点,即求3附近的零点.

1
2
3
4
5
6
7
8
9
>> x0 = fzero(f,[2,5])

x0 =

4.163549956946138

>> x0 = fzero(f,[2,3])
Error using fzero (line 274)
The function values at the interval endpoints must differ in sign.

另外可以规定区间如上所示

4.显式表达y关于x的隐函数

例如:(e^y+x^y)^(1/y)-x^2y =0

则可以用匿名函数表示为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>> y = @(x)fzero(@(y)(exp(y)+x^y)^(1/y)-x^2*y,1)

y =

@(x)fzero(@(y)(exp(y)+x^y)^(1/y)-x^2*y,1)

>> y1 = y(1)

y1 =

2.7779

>> y2 = y(2)

y2 =

1.1055

在外面嵌套一层 arrayfun 即可向量输入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>>  y = @(xx)arrayfun(@(x)fzero(@(y)(exp(y)+x^y)^(1/y)-x^2*y,1),xx)

y =

@(xx)arrayfun(@(x)fzero(@(y)(exp(y)+x^y)^(1/y)-x^2*y,1),xx)

>> y(1:10)

ans =

Columns 1 through 7

2.7779 1.1055 0.7759 0.6284 0.5425 0.4856 0.4446

Columns 8 through 10

0.4135 0.3889 0.3689

例如:对于a=[0,0,01,0,02,…,2],求方程f(x)=e^x+x^a+x^(sqrt(x)) = 100的x的值,并画出a和x的图像

则可以把它理解为一个隐函数关于x和y变化.

1
2
3
4
x = @(a) fzero(@(x) exp(x)+x^a+x^(sqrt(x))-100,4)
h = @(xx)arrayfun(@(a)fzero(@(x)exp(x)+x^a+x^(sqrt(x))-100,4),xx)
a = 0:0.01:2;
plot(a,h(a))

或者

1
2
3
4
5
6
7
8
>> f = @(a)@(x)exp(x)+x^a+x^(sqrt(x))-100
f =
@(a)@(x)exp(x)+x^a+x^(sqrt(x))-100
>> f(a)
ans =
@(x)exp(x)+x^a+x^(sqrt(x))-100
>> aa = 0:0.01:2;
>> plot(aa,arrayfun(@(a)fzero(f(a),4),aa))

5.创建符号对象

1
2
3
4
5
6
7
8
9
10
11
>> a = sym('5');
>> b = sym('b');
>> syms c d e;
>> whos
Name Size Bytes Class Attributes

a 1x1 112 sym
b 1x1 112 sym
c 1x1 112 sym
d 1x1 112 sym
e 1x1 112 sym

6.常用函数

vpa指定有效数字位数显示符号数值对象,如

1
>> vpa(pi,30)

求极限和导数和级数:

1
2
3
4
5
limit(f,v,a)  %求极限lim v->a f(v)
limit(f,v,a,'right') %求右极限
limit(f,v,a,'left') %求左极限
diff(f,v,n) %求f(v)的n阶导数
taylor(f,n,v,a) %求f(v)在v=a处展开到n次的泰勒级数

例子:

求极限lim n->+Inf (n^(n+1/2))/e^n*n!

1
2
3
4
5
6
>> syms n
>> limit(n^(n+1/2)/exp(n)*gamma(n+1),n,inf)

ans =

Inf
1
2
intf = int(f,v)   %求以v为自变量的函数f的不定积分
intf = int(f,v,a,b) %求以v为自变量的函数f从a到b的定积分

例如:

1
2
3
4
5
6
>> syms x
>> s = int(1/(x*sqrt(x^2+1)),x)

s =

-asinh((1/x^2)^(1/2))

求三重积分:

1
2
3
4
5
6
>> syms x y z
>> result = int(int(int((x+y)/z,z,x*y,2*x*y),y,x,2*x),1,2)

result =

(35*log(2))/6

Java

原题:

1
2
3
4
2n个人排队进电影院,票价是50美分。在这2n个人当中,其中n个人只有50美分,另外n个人有1美元(纸票子)。愚蠢的电影院开始卖票时1分钱也没有。
问: 有多少种排队方法 使得 每当一个拥有1美元买票时,电影院都有50美分找钱
注: 1美元=100美分
拥有1美元的人,拥有的是纸币,没法破成250美分

解题方法:

此题可以用递归方式求解,详细求解过程如下:

符合条件的情况必须是拥有1美元的人前方必须要有50美分的人来排队,要不然不可能找零开,即必须满足从头数50美分的人数大于1美元的人数.

我们直接求解符合条件的情况.我们先不考虑持有50美分的人的次序,仅考虑持有1美元的人的次序,最后的结果再乘以n! 就可以了.

可以转化为50美分的人已经排好,由持有1美元的人进行插空排列.

首先1美元的人是不可能插到队头的,所以可以插的空有n个.

定义一个函数f(n.m),这表示有n个1美元的人插m个空的方法数,这m个空是从队尾向前数的m个空的位置.

比如f(4,4)的求解

●1●2●3●4 黑点表示50美分的人,1234表示可以插的空

第一个空可以有0人,可以有1个人.但不可能有2个人及以上

1.当有1人的时候,这个位置4个人四选一,剩下的方式为f(3,3),故为4*f(3,3)

2.当没有的人的时候,则方式为f(4,3)

所以排列方式为f(4,4)=4f(3,3)+f(4,3)=A(4)(0)f(4,3)+A(4)(1)*f(3,3)

注:A(m)(n)在此表示m!/(m-n)! 如A(4)(2)表示4x3=12.A(5)(3)表示5x4x3=60.

再如:f(4,3)的求解

是四个人插后三个空,

● ●1●2●3 黑点表示50美分的人,123表示可以插的空

第一个空可以没人,可以1个人,可以2个人,但不能有3人及以上.

1.当有0人的时候,则只有四个人插后两个空了,即为f(4,2)

2.当有1人的时候,选其中1人,四选一,剩下的3人插2个空,方法数为4*f(3,2)

3.当有2人的时候,选其中的2人,四选二排列,剩下的2人插两个空,方法数为A(4)(2)*f(2,2)

所以排列方式为f(4,3)=f(4,2)+4f(3,2)+A(4)(2)f(2,2)=A(4)(0)f(4,2)+A(4)(1)f(3,2)+A(4,2)*f(2,2)

发现规律了吗?在此我们可以总结出递推式

所以最后的结果就简单了,我们再乘上50美分的人的全排列就是最后的结果了.

最后的答案即为A(n)(n)*f(n,n)

JAVA代码实现如下:

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
/*
* 排队问题求解
*/
import java.math.*;
public class Solve {
public static void main(String[] args) {
//n的值
int n =7;
//求得结果
System.out.println(getNumber(n,n).multiply(getResult(n,n)));
}
//即为f(n,m)函数实现
static BigInteger getNumber(int n,int m){
//当m=1返回Ann即n!
if(m==1) return getResult(n,n);
//初始化result=0
BigInteger result =new BigInteger("0");
for(int i=0;i<=n-m+1;i++){
//利用递归式子求解
result=result.add((getResult(n,i)).multiply(getNumber(n-i,m-1)));
}
return result;
}
static BigInteger getResult(int m,int n){
//求Amn
BigInteger result =new BigInteger("1");
int count=0;
//如果n为0,返回Am0即为1
if(n==0) return new BigInteger("1");
for(int i=m;;i--){
result =result.multiply(new BigInteger(""+i));
count++;
if(count==n) break;
}
return result;
}
}

利用了BigInteger求解,防止越界的出现.在main函数里可以修改n的值来计算.

PHP

1
首先贴一段示例代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
include "con_db.php";//连接数据库
$sql="select * from note order by note_date desc limit ".($index*10).",10"; //sql语句
$result=mysql_query($sql);//获得结果
$note;$i=0; //初始化变量
while($infor=mysql_fetch_array($result))
{
//把结果放到一个一维数组里
$note["id"]=$infor['note_id'];
$note["content"]=$infor['note_content'];
$note["date"]=$infor['note_date'];
$note["username"]=$infor['username'];
//放到二维数组里
$notes[$i++]=$note;
}
echo json_encode($notes );
?>

输出结果:

1
2
3
[{"id":"12","content":"u662f","date":"2014-05-24 09:31:52","username":"u532f"},
{"id":"31","content":"u642f","date":"2014-05-24 09:31:49","username":"u322f"},
{"id":"70","content":"u692f","date":"2014-05-24 09:31:48","username":"u132f"}]

你会发现应该输出的汉字变成了unicode字符集.

这时我们就要用到urlencode的方法,把汉字用urlencode方法编码,转化为json之后再用urldecode解码.看如下例子:

1
2
3
4
5
6
<?php
$h =urlencode("开心");
echo $h;
$x =urldecode($h);
echo $x;
?>

输出结果:

1
%BF%AA%D0%C4开心

这样通过中间过程的编码和解码,转化成json的过程便不会自动把汉字变成Unicode字符集了.所以最后的方法为:

1
2
3
4
5
6
7
8
9
10
11
<?php
while($infor=mysql_fetch_array($re))
{
$note["id"]=$infor['note_id'];//数字不需要编码
$note["content"]=urlencode($infor['note_content']);//汉字需要编码
$note["date"]=$infor['note_date'];
$note["username"]=urlencode($infor['username']);
$notes[$i++]=$note;
}
echo urldecode(json_encode($notes ));//转化成json之后再用urldecode解码为汉字
?>

结果如下:

1
2
3
[{"id":"22","content":"文章","date":"2014-05-24 09:31:52","username":"王"},
{"id":"21","content":"内容","date":"2014-05-24 09:31:49","username":"李"},
{"id":"20","content":"可以","date":"2014-05-24 09:31:48","username":"冯"}]

这样我们就成功地把二维数组转化成了json了.

如有问题,请在下方评论,我会及时回复的.

PHP

大家应该遇到这样一个问题,我们利用wamp做服务器运行网页的时候,网页地址栏显示的图标一直是wampserver默认的图标,想改一下怎么办呢?

问题如下:

就是这些图标,如何自定义自己的图标,而不是wamp默认图标。

首先这个图标大小像素为16x16,大家可以自己制作,也可以上传图片来制作.

最好为ico格式的,如果想要上传图片制作的话可以访问这个网址:http://www.bitbug.net/

可以为你生成一个icon图标.

比如我生成的图标命名为favicon.ico

我们需要将其放在www文件夹下,你的项目文件夹里面.

比如这样:

然后在index.php文件中插入代码如下:

保存重新刷新一下。

这下我们就会发现地址栏的图标已经更换成功啦!

C/C++

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
//    CCTransitionJumpZoom
// 作用: 创建一个跳动的过渡动画
// 参数1:过渡动作的时间
// 参数2:切换到目标场景的对象
// reScene = CCTransitionJumpZoom ::create(t , s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionProgressRadialCCW
// 作用: 创建一个扇形条形式的过渡动画, 逆时针方向
// 参数1:过渡动作的时间
// 参数2:切换到目标场景的对象
// reScene = CCTransitionProgressRadialCCW::create(t, s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionProgressRadialCW
// 作用: 创建一个扇形条形式的过渡动画, 顺时针方向
// 参数1:过渡动作的时间
// 参数2:切换到目标场景的对象
// reScene = CCTransitionProgressRadialCW::create(t,s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionProgressHorizontal
// 作用: 创建一个水平条形式的过渡动画,
// 参数1:过渡动作的时间
// 参数2:切换到目标场景的对象
// reScene = CCTransitionProgressHorizontal ::create(t,s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionProgressVertical
// 作用: 创建一个垂直条形式的过渡动画,
// 参数1:过渡动作的时间
// 参数2:切换到目标场景的对象
// reScene = CCTransitionProgressVertical::create(t, s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionProgressInOut
// 作用: 创建一个由里向外扩展的过渡动画,
// 参数1:过渡动作的时间
// 参数2:切换到目标场景的对象
// reScene = CCTransitionProgressInOut::create(t, s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionProgressOutIn
// 作用: 创建一个由外向里扩展的过渡动画,
// 参数1:过渡动作的时间
// 参数2:切换到目标场景的对象
// reScene = CCTransitionProgressOutIn::create(t, s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionCrossFade
// 作用:创建一个逐渐透明的过渡动画
// 参数1:过渡动作的时间
// 参数2:切换到目标场景的对象
// reScene = CCTransitionCrossFade::create(t, s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionPageTurn
// 作用:创建一个翻页的过渡动画
// 参数1:过渡动作持续的时间
// 参数2:切换的目标场景的对象
// 参数3:是否逆向翻页
// reScene = CCTransitionPageTurn::create(t, s, false);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionFadeTR
// 作用:创建一个部落格过渡动画, 从左下到右上
// 参数1:过渡动作持续的时间
// 参数2:切换的目标场景的对象
// reScene =CCTransitionFadeTR::create(t, s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionFadeBL
// 作用:创建一个部落格过渡动画, 从右上到左下
// 参数1:过渡动作持续的时间
// 参数2:切换的目标场景的对象
// reScene = CCTransitionFadeBL::create(t, s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionFadeUp
// 作用:创建一个从下到上,条形折叠的过渡动画
// 参数1:过渡动作持续的时间
// 参数2:切换的目标场景的对象
// reScene= CCTransitionFadeUp::create(t, s);
// CCDirector::sharedDirector()->replaceScene(s);

// CCTransitionFadeDown
// 作用:创建一个从上到下,条形折叠的过渡动画
// 参数1:过渡动作持续的时间
// 参数2:切换的目标场景的对象
// reScene = CCTransitionFadeDown::create(t, s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionTurnOffTiles
// 作用:创建一个随机方格消失的过渡动画
// 参数1:过渡动作的持续时间
// 参数2:切换的目标场景的对象
// reScene= CCTransitionTurnOffTiles::create(t, s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionSplitRows
// 作用:创建一个分行划分切换的过渡动画
// 参数1:过渡动作的持续时间
// 参数2:切换的目标场景的对象
// reScene = CCTransitionSplitRows::create(t, s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionSplitCols
// 作用:创建一个分列划分切换的过渡动画
// 参数1:过渡动作的持续时间
// 参数2:切换的目标场景的对象
// reScene = CCTransitionSplitCols::create(t, s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionFade
// 作用:创建一个逐渐过渡到目标颜色的切换动画
// 参数1:过渡动作的持续时间
// 参数2:切换的目标场景的对象
// 参数3:目标颜色
// reScene= CCTransitionFade::create(t, s, ccc3(255, 0, 0));
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionFlipX
// 作用:创建一个x轴反转的切换动画
// 参数1:过渡动作的持续时间
// 参数2:切换的目标场景的对象
// 参数3:反转类型的枚举变量 左右上下
// kOrientationDownOver kOrientationLeftOver kOrientationRightOver kOrientationUpOver
// reScene = CCTransitionFlipX::create(t, s, kOrientationRightOver);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionFlipY
// 参数1:过渡动作的持续时间
// 参数2:切换的目标场景的对象
// 参数3:反转类型的枚举变量 左右上下
// reScene = CCTransitionFlipY::create(t, s
// , kOrientationDownOver);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionFlipAngular
// 作用:创建一个带有反转角切换动画
// // 参数1:过渡动作的持续时间
// 参数2:切换的目标场景的对象
// 参数3:反转类型的枚举变量 左右上下
// reScene = CCTransitionFlipAngular::create(t, s, kOrientationLeftOver);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionZoomFlipX
// 作用:创建一个带有缩放的x轴反转切换的动画
// 参数1:过渡动作的持续时间
// 参数2:切换的目标场景的对象
// 参数3:反转类型的枚举变量 左右上下
// reScene=CCTransitionZoomFlipX::create(t, s, kOrientationLeftOver);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionZoomFlipY
// 作用:创建一个带有缩放的Y轴反转切换的动画
// 参数1:过渡动作的持续时间
// 参数2:切换的目标场景的对象
// 参数3:反转类型的枚举变量 左右上下
// reScene=CCTransitionZoomFlipY::create(t, s, kOrientationDownOver);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionZoomFlipAngular
// 作用:创建一个带有缩放 ,反转角切换的动画
// 参数1:过渡动作的持续时间
// 参数2:切换的目标场景的对象
// 参数3:反转类型的枚举变量 左右上下
// reScene=CCTransitionZoomFlipAngular::create(t, s, kOrientationRightOver);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionShrinkGrow
// 创建一个放缩交替的过渡动画
// 参数1:过渡动作的持续时间
// 参数2:切换的目标场景的对象
// reScene = CCTransitionShrinkGrow::create(t, s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionRotoZoom
// <span> </span> 创建一个旋转放缩交替的过渡动画
// 参数1:过渡动作的持续时间
// 参数2:切换的目标场景的对象
// reScene = CCTransitionRotoZoom::create(t, s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionMoveInL
// 作用:创建一个从左边推入覆盖的过渡动画
// 参数1:过渡动作的持续时间
// 参数2:切换的目标场景的对象
// reScene = CCTransitionMoveInL::create(t, s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionMoveInR
// 作用:创建一个从右边推入覆盖的过渡动画
// 参数1:过渡动作的持续时间
// 参数2:切换的目标场景的对象
// reScene = CCTransitionMoveInR::create(t, s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionMoveInB
// 作用:创建一个从下边推入覆盖的过渡动画
// 参数1:过渡动作的持续时间
// 参数2:切换的目标场景的对象
// reScene = CCTransitionMoveInB::create(t, s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionMoveInT
// 作用:创建一个从上边推入覆盖的过渡动画
// 参数1:过渡动作的持续时间
// 参数2:切换的目标场景的对象
// reScene = CCTransitionMoveInT::create(t, s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionSlideInL
// 作用:创建一个从左侧推入并顶出旧场景的过渡动画
// 参数1:过渡动作的持续时间
// 参数2:切换的目标场景的对象
// reScene =CCTransitionSlideInL::create(t, s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionSlideInR
// 作用:创建一个从右侧推入并顶出旧场景的过渡动画
// 参数1:过渡动作的持续时间
// 参数2:切换的目标场景的对象
// reScene =CCTransitionSlideInR::create(t, s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionSlideInT
// 作用:创建一个从顶部推入并顶出旧场景的过渡动画
// 参数1:过渡动作的持续时间
// 参数2:切换的目标场景的对象
// reScene =CCTransitionSlideInT::create(t, s);
// CCDirector::sharedDirector()->replaceScene(reScene);

// CCTransitionSlideInB
// 作用:创建一个从下部推入并顶出旧场景的过渡动画
// 参数1:过渡动作的持续时间
// 参数2:切换的目标场景的对象
// reScene =CCTransitionSlideInB::create(t, s);
// CCDirector::sharedDirector()->replaceScene(reScene);