0%

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);