0%

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 比如你就可以在此处输入你自己定义的二级域名加备案号。比如我的输入qiniu.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)