说说QQ空间SEO

mikel阅读(953)

其实这个话题由来已久,已经有很多大神做到QQ空间日访问量破万,甚至更多了,卖产品卖到抽筋儿。

怎么说QQ空间SEO,其实不如说QQ空间引流更合适,因为QQ空间与QQ的特殊关系,SEO貌似不是很重要,其实从最近百度的大面积算法调整,来看开始重视自媒体了,算法中对QQ空间收录进行了调整,之前百度排行上QQ空间已经显现出效果了,很多人在闷头做优化,引流量。

其实这种第三方平台权重高,很容易做SEO,比如新浪博客、网易博客、豆瓣等等,不只是QQ空间一家效果好,因为百度蜘蛛会将这些权重高的网站作为新闻源来对待,每天蜘蛛都会隔段时间去采集一下信息,你如果发布了文章,上了头条,那么恭喜你,百度也会收录,基本上是秒收录。

所以说做自媒体,不要局限于一个平台,要多个平台同步,这就要求有效管理各个平台间的文章内容,其实可以各有侧重,比方新浪写自媒体、网易写微信营销、QQ空间是综合,这是从定位上说。

从链接优化上来说,各个平台开通了后,互相要链接起来,比如新浪的博客要加上QQ空间的链接,QQ空间也要加上新浪的链接,不要误会,这些链接不只是博客友情链接上的,还有文章里的内链接,很多时候写文章也要考虑到SEO的优化,将关键词加上对应内链,这样蜘蛛爬取信息的时候会随着链接,自然引导到另一个你的博客,同时也就采集到了你的多条文章信息。

从内容上说,当然要原创了,现在蜘蛛越来越智能化,伪原创或者转载给的权重分很低,甚至会被认为是无价值的垃圾站从而降低采集的频率,所以依然是原创是王道,这样每天定时的更新,就像QQ空间写日志一样,同样写文章也要考虑到关键词因素,文章中要出现目标关键词,对收录和排名有好处。

以上只是对QQ空间SEO的一点儿想法,至于像我这种写日志纯属记录的来说,有SEO不如无SEO,少点儿功利,多点儿真实原创就行了。

最近,移动电源卖得不错, 感谢小伙伴儿们的支持,需要购买的可以联系我 QQ:3379152

[转载]VMware虚拟机中安装Linux系统步骤(Redhat6.5) - foolcode - 博客园

mikel阅读(793)

[转载]VMware虚拟机中安装Linux系统步骤(Redhat6.5) – foolcode – 博客园.

在VMware下试了好多linux的版本,Ubuntu12.04、deepin、CentOS7都是64位的,都感觉好卡顿啊,比起以前安装的Redhat5.7和5.9卡顿很多。

卡顿的原因不知道啊,难道是图形界面太炫丽,或者是前三个想用作个人桌面系统安装了很多软件的事?最后还是选择了安装Redhat6.5。下面就把它的安装关键步骤记录下来:

(未提到的步骤基本都是默认,或者自己随意的)

1、新建虚拟机,在向导里选择最下面的创建空白硬盘。第二个选项虚拟机会帮助傻瓜化自动安装,估计会把Rethat里的所有软件包都安装了,不需要那么多软件包,土豪性能的机器随意。

2、创建这个硬盘所在的文件夹,以后你对这块虚拟的硬盘的所有操作都是在这个文件夹里,移植备份这个虚拟机只需要把这个文件夹复制即可。

3、网络类型选择桥接网络,方便与主机通信也方便连网。

4、这一步选择自定义硬件,相当于向虚拟光驱里添加你准备好像安装的操作系统的IOS文件。

5、设置完后,打开此虚拟机,开始安装Redhat6.5,跳过光盘检测,别傻乎乎的点ok会检测半年的。

6、这一步是规划自己硬盘的分区,可默认也可勾选最下方自定义。

7、这是默认的,默认的就不错可以不用改了。硬盘驱动器下面sda是你的硬盘,我就一块12m的,然后分了俩区,一个sda1挂载/boot(一般几百兆就可以);一个sda2区直接丢到LVM卷组池中。

LVM卷组中拿住2m给了swap交换分区,相当于虚拟内存吧,剩下的全部挂载到/root。可以自己修改大小或者自定义挂载,选中后点下面的编辑即可。

8、这是选择RedHat的软件包,就是初始安装的程序。我只是想把程序移植到linux下又不用它当服务器,所以我选择的软件包尽可能少,我就够了下面的现在自定义。

9、自定义软件包界面,我不用java就勾掉了,就算用也不知道它默认的是java那个版本的,用在自己安装;服务器里默认就行;web服务、数据库、系统管理、虚拟化我好像都没勾;

桌面全选吧;应用程序也勾了些;开发除了eclipse没勾其余都勾了;语言勾上中文,开始安装吧。

10、安装完成后,你可以对VMware加一些小工具方便使用。

1、在VMware虚拟机的下拉菜单中安装VMware Tools工具,然后Redhat里会看到多了个光盘,想用windows一样把光盘内容复制到别的目录下,

然后在终端中解压tar包(tar xvf tar包名),在终端中执行./wmware-install.pl,然后根据提示一步步确定或者输入yes。

2、Xmanger4,一款软件集成了ftp传输、远程网络桌面、远程终端等功能。可以在主机用这款软件操作Redhat,前提是要能ping的通,主机与虚拟机或者远程服务器网络是通的。

想要用远程左面还有对Redhat进行一些配置,开放一些权限和端口。

 

[转载]如何免费下载百度影像数据 - GIS随风 - 博客园

mikel阅读(930)

[转载]如何免费下载百度影像数据 – GIS随风 – 博客园.

    如果我们需要高空间分辨率的遥感影像,怎么获取呢。方法很多,但大多都需要购买商业版的专门下载软件来下载。而使用SuperMap可以直接下载百度影像数据,当然也可以

下载百度地图数据,但意义不大。本来是简单的方法,但很多人都问如何免费获取,说明很多人还是不知道如何下载。下面进行简单介绍。

 

1、SuperMap 软件下载:

下载超图软件SuperMap iDesktop 7C,下载地址:http://support.supermap.com.cn/ProductCenter/DownloadCenter/ProductPlatform.aspx

 

2、安装软件和许可:

下载完成后直接安装,安装完成后使用许可自带,过期后继续申请续期即可。

 

3、加载数据:

1) 启动软件,然后在开始面板选择打开WEB型数据,如下图所示:

 

 

2) 在web型数据对话框中,选择百度地图选项卡,然后点击确认,如下图所示:

 

 

3) 在工作空间中便可以看到BaiduMap数据库,然后双击打开Satellite地图,百度影像便可以在地图窗口中显示,如下图所示:

 

 

4) 结果如下图所示:

 

 

4、下载数据:

1) 右击地图窗口,然后选择”输出为影像数据集”,配置相关参数,如下图所示:

 

 

2) 点击确认,完成下载后,可以在目标数据集中查看下载的数据。

[转载]material design 的android开源代码整理 - 西北野狼 - 博客园

mikel阅读(1071)

[转载]material design 的android开源代码整理 – 西北野狼 – 博客园.

1 Android (material design 效果的代码库)
MaterialDesignLibrary
MaterialDesignLibrary
2 RippleEffect (material design控件单击时,波纹效果)
RippleEffect
RippleEffect
3 Material Dialogs(material design的dialog)
Material Dialogs
Demo下载地址

3.1 MaterialDialog(另外一个哥们的material design的dialog)
MaterialDialog
MaterialDialog

4 FloatingActionButton
FloatingActionButton
FloatingActionButton效果

5 LDrawer(material design的侧滑栏)
https://github.com/ikimuhendis/LDrawer
material design的侧滑栏

5.1 MaterialNavigationDrawer (material design的侧滑栏)
MaterialNavigationDrawer
MaterialNavigationDrawer

5.2 Android-material-drawer-template(material design的侧滑栏)
android-material-drawer-template
android-material-drawer-template

6 MaterialEditText(material design的输入框)
MaterialEditText
material design的输入框

7 一个展示material design效果的整体例子的应用:
LollipopShowcase
LollipopShowcase

7.1 一个展示material design效果的整体例子的应用:
AndroidMaterialDesignToolbar
AndroidMaterialDesignToolbar

7.2 一个展示material design效果的整体例子的应用:
MaterialDesignSample
MaterialDesignSample

7.3 material-notes (material design风格的记事本)
material-notes
material-notes

8 MaterialList (Android Cardview的例子)
MaterialList
MaterialList

9MaterialTabs(Tab页切换)
MaterialTabs
MaterialTabs

10 MaterialWidget (Material 一些漂亮的组件 [paperbutton,circleButton,tab_indicator,EditText,ProgressBar,CompoundWidget,Radio Button,Check Box,Switch])
MaterialWidget
paperbutton
circleButton
tab_indicator
EditText
ProgressBar
Switch
radio_button
check_box

11 MenuAnimation动画
MenuAnimation
MenuAnimation

12 LfloatLabelLayout EditText校验报错效果
LfloatLabelLayout
LfloatLabelLayout

13ImageryHeader(Image头部特效)
ImageryHeader
ImageryHeader

[转载]看我七十二变:HTML5游戏重打包变身安卓恶意软件_IT新闻_博客园

mikel阅读(1387)

[转载]看我七十二变:HTML5游戏重打包变身安卓恶意软件_IT新闻_博客园.

英文原文:Repackaging HTML5 Apps into Android Malware

 

随着 W3C 于 2013 年十月完成 HTML5 标准制定后,由 HTML5 编写的 WEB 应用程序数量一直呈快速增长趋势。我们可以预见越来越多的 HTML5 应用可能被攻击者利用,由普通 Web 应用重新打包为恶意移动软件。

 

  HTML5 Android 应用安全现状

 

据我们的监测情况来看,在 2013-2014 之间安卓平台的 HTML5 程序量新增加了 200%,而 2012-2014 更是已经增加了 600%。

 

 

我们注意到,HTML5 包装的恶意软件或 PUAs(潜在威胁软件)的数量也在增长,其中 2014 年近 50% 的 HTML5 恶意软件/PUAs 被伪装为游戏应用。

 

 

其实有大量移动恶意软件及潜在威胁软件被伪装成合法游戏应用的例子:

 

一个名为小步枪(Tiny Rifles)的 APP 就是款典型的需要 com.html5.game2 包的 HTML5 游戏。运行它以后,浏览器除了会加载 HTML5 游戏,还会通过代码注入恶意广告 SDK。该款恶意应用目前已经在 Google Play 中下架,我们将它定义为潜在威胁软件(PUA)。

 

 

HTML5 安卓恶意软件的两种攻击方式:

 

  方法一、初始化本地网络视图

 

这是一种非常受黑客欢迎的攻击方式,使用它并不用改变 HTML5 应用的代码。黑客只需要初始化一个本地网络视图,加载本地或远程的 HTML5/JavaScript/CSS 代码即可。这样主程序仍能运行,而产生的却是新的安卓应用。

 

然而,大多数黑客并不会在这里止步,因为只把 web 应用转为安卓应用是完全没有意义的。黑客在大多数时候会在发布应用之前,就将恶意代码注入其中。

 

 

这样打包应用的话,恶意代码和正常代码会在源里分离。黑客只需要关心注入的部分代码,而不用太在意 HTML5 的那部分,这样使得代码逻辑清晰简单。

 

方法二、把 HTML5 应用打包,通过中间件注入恶意 JS 代码

 

随着安卓越来越受大众的欢迎,许多中间件由此诞生,方便人们开发跨平台的应用。中间件是一种第三方软件/框架,在应用和操作系统之间作桥梁之用。

 

对于 HTML5 与相关 web 应用,现今有几种开源框架支持跨平台开发,比如:PhonegapApache CordovaCrosswalkCocoonjs 等等,而且这些中间件通常都支持 HTML5,其中一个典型例子就是 Apache Cordova。

 

除了使用网络视图的 HTML5/JavaScript/CSS 代码外,适用于那些中间件的应用通常都基于那些框架核心库运行,就如那些定制的浏览器一样。由于那些中间件强大的 API 给开发者提供了许多便捷,他们只需要使用 JS 代码就能与安卓进行交互。换句话说,如果 HTML5 应用利用了中间件的特性,可以轻松进行恶意代码注入和执行。

 

 

 结语

 

HTML5 使得开发更强大的 web 应用变得更加简单,因其开发的 web 应用的平台低依赖性,一定程度上在安卓平台上有着较大优势。对于开发者来说,跨平台开发的难度降低,可以说是一次开发多方通用(WORA)并不会在跨平台 上耗费精力。对于用户来说,他们可以在不同的移动平台分享喜爱的应用。这些意味着使用 HTML5 进行 web 应用开发,对于诸方都是有利的。

 

当然,跨平台也会带来隐患比如跨平台注入,JS 代码保护的机制太少,导致 web 应用可以被轻松复制和重新打包。理论上来讲,通过代码注入和重新打包,黑客可以剽窃任何他们想要的 HTML5 的跨平台 web 应用。

 

在未来,我们可以预见到这种由 HTML5 开发的恶意软件可以通杀不同的移动平台(比如 IOS,安卓,WinPhone)。为了避免这种情况,开发者应多花点精力在代码混淆和使用其他编码技巧,这样在一定程度上可以保护他们的应用程序。家庭 用户需要使用新的应用程序时,最好去官方应用商店下载。

 

2
0

 

 

[转载]Node+Express+MongoDB + Socket.io搭建实时聊天应用实战教程(二)--node解析与环境搭建 - 红豆依旧在 - 博客园

mikel阅读(1122)

[转载]Node+Express+MongoDB + Socket.io搭建实时聊天应用实战教程(二)–node解析与环境搭建 – 红豆依旧在 – 博客园.

前言

本来开始写博客的时候只是想写一下关于MongoDB的使用总结的,后来觉得还不如干脆写一个node项目实战教程实战。写教程一方面在自己写的过 程中需要考虑更多的东西,另一方面希望能对node入门者有一些帮助。相信大多数跟随前面一章教程来到这一章的读者大多分成两类,第一类是知道node, 想学习node,但是英文匮乏或者网上教程不给力,希望有一个全面一点的教程入门的;第二类应该是node入门,但是之前使用的不是类似MongoDB这 种非关系型数据库,想学习一下的。从我个人的角度看来,我希望自己前一段时间关于前端和后端的协同开发经验能够得到提炼和分享。

Nodejs简介

Node.js是一个基于Chrome JavaScript运行时建立的一个平台,用来方便地搭建快速的 易于扩展的网络应用。Node.js借助事件驱动, 非阻塞I/O模型变得轻量和高效,非常适合 运行在分布式设备的数据密集型的实时应用。–百度百科

对于不熟悉JavaScript的读者来说,上面的概念可能并不是很亲切,但其实,node作为一个平台,他的很多特性基本上就是JavaScript本身的特性。本文假设你对JavaScript有一定的了解,对于上面的概念给出本人自己的解释。

我想首先介绍一下宿主环境这个概念。一门语言在运行的时候,需要一个环境,叫做宿主环境。对于JavaScript,宿主环境最常见的是web浏览 器,浏览器提供了一个JavaScript运行的环境,这个环境里面,需要提供一些接口,好让JavaScript引擎能够和宿主环境对接。 JavaScript引擎才是真正执行JavaScript代码的地方,常见的引擎有V8(目前最快JavaScript引擎、Google生产)、 JavaScript core。JavaScript引擎主要做了下面几件事情:(1)一套与宿主环境相联系的规则;(2)JavaScript引擎内核(基本语法规范、逻 辑、命令和算法);(3)一组内置对象和API;(4)其他约定。 但是环境不是唯一的,也就是JavaScript不仅仅能够在浏览器里面跑,也能在其他提供了宿主环境的程序里面跑,最常见的就是nodejs。同样作为 一个宿主环境,nodejs也有自己的JavaScript引擎–V8。根据官方的定义 Node.js is a platform built on Chrome’s JavaScript runtime for easily building fast, scalable network applications — 来自我的博客 《JavaScript中的this陷阱的最全收集–没有之一》

因此我们可以这么理解node,它不是一门语言,而是一个平台。node是 JavaScript运行的一个宿主环境,它提供了一些接口,能够让JavaScript引擎与这个宿主环境对接。真正执行JavaScript代码的是 JavaScript引擎,也就是V8引擎,这个引擎值Google生产的,是当前最快的JavaScript引擎,没有之一。

Nodejs特性解析

到现在为止我们就知道了Nodejs的真面貌,但是还不清楚它的几个特点。Nodejs的这些特点,也可以说是JavaScript的特点,毕竟Nodejs只是一个平台,而执行的代码,都是JavaScript代码。所以我斗胆尝试解释JavaScript/Nodejs的这几个特点,如有错误,非常欢迎指出。

  • 同步与异步
    JavaScript里面的调用分成两种,一种是同步调用,一种是异步调用。简单的区别就 是,调用的时候能够立马得到结果的就是同步调用,不能立马得到结果的就是异步调用。同步非常好理解,一个简单的数学运算就是同步调用。异步的话,可以举一 个常见的例子,一篇文章可能有很多很多评论,在页面加载好的时候,只显示前面几条,如果用户想查看更多,就会点击加载更过评论按钮。为了提高用户体验,通 常是发送Ajax请求,获取更多内容。这个请求并不能立马得到回应,而是等待数据返回。等数据返回之后,再动态加载到页面中,这就是异步调用。
  • 单线程与Event Loop
    为了要弄清楚事件驱动与非阻塞I/O,我们需要大概了解JavaScript运行的时候的原理。也就 需要知道单线程和Event Loop这两个概念。什么是单线程呢?我们知道线程是CPU调度的基本单位,单线程意味着JavaScript线程在某一个时刻只能执行一个调用。刚刚又 说了,调用分成同步调用和异步调用,这两者的区别决定了在执行JavaScript代码的时候,总是先执行完所有同步代码,再去查看是否有异步调用需要执 行。这个原理其实就是JavaScript事件驱动的底层原理–Event Loop。再具体阐述什么是Event Loop之前,我先借用一张好图:

    我们可以看到,在JavaScript执行栈中,总是先把所有的调用推入栈中,如果遇到了异步调用,就会放到WebAPIs中,然后继续执行后面的代码,等到WebAPIs中的异步调用执行完成后,不是立马执行,而是先放到callback queue里面,那么这个队列里面的函数怎么执行?什么时候执行?中介者就是Event Loop了,他会一直询问callback queue里面有无需要执行的代码,如果有,推送到执行栈的最后面,等待执行。如果执行栈中没有同步代码在执行,就会立即执行这个这个回调。拿我们平常写JavaScript常见的绑定事件处理程序来讲,属于DOM事件,如果产生了DOM事件,比如点击鼠标,那么这个时候就会放到callback queue里,Event Loop的下一次询问,就会放到执行栈里面。通常执行栈里面的同步代码是很少的,所以通常这个点击后的事件立马就执行了。
    以上就是Event Loop的大致解析。如果想要更加深入理解Event Loop,可以看看我之前写过的一篇博客《JavaScript的计时器的工作原理》,当然更加推荐大家看看Philip Roberts大神的演讲《Help, I’m stuck in an event-loop》不过可能需要FQ或者代理。
  • 非阻塞I/O与事件驱动
    如果你理解了刚刚的Event Loop,应该就明白了什么叫非阻塞I/O和事件驱动了。首先还是讲讲什么是非阻塞I/O

    线程在执行中如果遇到磁盘读写或网络通信(统称为I/O操作),通常要耗费较长的时间,这时操作系统会剥夺这个线程的CPU控制权,使其暂停执行,同时将 资源让给其他的工作线程,这种线程调度方式称为阻塞。当I/O操作完毕,操作系统将这个线程的阻塞状态解除,恢复其对CPU的控制权,令其继续执行。这种I/O模式就是通常的同步式I/O(Synchronous I/O).
    当线程遇到I/O操作时,不会以阻塞的方式等待I/O操作的完成或数据的返回,而只是将I/O请求发送到操作系统,继续执行下一条语句。当操作系统完成I /O操作时,以事件的形式通知执行I/O操作的线程,线程会在特定时候处理这个事件。为了处理异步I/O,线程必须有事件循环,不断地检查有没有未处理的事件,依次处理。 –《Nodejs开发指南》
    如果JavaScript是阻塞I/O,拿之前加载更多评论的例子看来,只要数据还没有从服务器返回,所有后续的操作都将阻塞,比如点击其他绑定了事件处理程序的按钮。幸运的事,正如《Nodejs开发指南》提到的一样,线程必须有事件循环,也就是刚刚说到的Event Loop!那么非阻塞I/O也就自然而然地理解了。至于事件驱动,它和非阻塞I/O应当是因果关系的,因为JavaScript是基于事件驱动的,所以成就了非阻塞I/O的特性。因为要做到异步的话,常用的就是发送异步请求,请求相应之后,执行回调事件,事件在JavaScript中无处不在。

Node安装

与Python等安装不同的是,Nodejs在Windows下面的安装反而比在Linux下面简单的多。本来想自己写安装过程的,发现W3CSchool讲解的非常准确,所以这里只给出链接。安装教程链接:http://www.w3cschool.cc/nodejs/nodejs-install-setup.html
你可以通过node -v命令来检测是否安装成功:

后话

本教程旨在给出一个实战教程,这一章主要是介绍Nodejs和JavaScript的运行原理,上一章讲解了MongoDB的入门教程,如果你想跟随本教程学习,可以从上一篇文章看起《Node+Express+MongoDB+Socket.io搭建实时聊天应用实战教程(一)–MongoDB入门》,与大家探讨技术。本系列教程同步到个人的Github:https://github.com/yuanzm/MongoDB-demo.如需转载,请务必注明原文链接

参考资料

http://www.infoq.com/cn/articles/tyq-nodejs-event
http://www.jb51.net/article/53812.htm
http://www.ituring.com.cn/article/5779
http://www.w3cschool.cc/nodejs/nodejs-install-setup.html
http://www.ibm.com/developerworks/cn/web/1201_wangqf_nodejs/

[转载]Android应用系列:完美运行GIF格式的ImageView(附源码) - enjoy风铃 - 博客园

mikel阅读(1151)

[转载]Android应用系列:完美运行GIF格式的ImageView(附源码) – enjoy风铃 – 博客园.

前言

我们都知道ImageView是不能完美加载Gif格式的图片,如果我们在ImageView中src指定的资源是gif格式的话,我们将会惊 喜的发觉画面永远停留在第一帧,也就是不会有动画效果。当然,经过略加改造,我们是可以让gif在ImageView上完美加载的。

正文

Android给我们提供了一个Movie类,可以让我们实现加载gif格式资源的目标。我们需要导入 Android.graphics.Movie这个包,当然这个也是Android自带的。所以我们的主要方法是继承一个ImageView的子类,通过 改写其中的onDraw方法加载gif资源。话也不多说了,通过代码大家看的更明白,文末附带源码哦。

PS:看懂本文需要了解自定义View的相关知识。

attrs资源文件:


我在这里面设置了一个自定义属性 isgifimage,目的是让用户自行设置控件显示是否是gif格式资源,因为非gif格式资源用Movie加 载也是可以显示图像,但是效率就肯定没有原生控件加载模式好,当然,默认isgifimage为true,也就是默认为gif格式的资源。

自定义的GifView的构造函数(GifView类继承ImageView)

public GifView(Context context, AttributeSet attrs) {
super(context, attrs);
//获取自定义属性isgifimage
TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.GifView);
isGifImage = array.getBoolean(R.styleable.GifView_isgifimage, true);
array.recycle();//获取自定义属性完毕后需要recycle,不然会对下次获取造成影响
//获取ImageView的默认src属性
image = attrs.getAttributeResourceValue( "http://schemas.android.com/apk/res/android", "src", 0);

movie = Movie.decodeStream(getResources().openRawResource(image));
}

在GifView的构造方法中,我们主要是对GifView的自定义属性进行获取。可以通过 context.obtainStyledAttributes(attrs, R.styleable.GifView)返回一个TypedArray对象,然后从该对象分别获取自定义属性,在这里需要强调一点的时 R.styleable.GifView_isgifimage,红色的时attrs资源文件的名字,而蓝色则是其对应的属性名字(见attrs资源文件),中间以下划线分隔。

在我们获取完自定义属性后必须recycle(),不然会对下次该控件获取自定义属性造成影响,因为TypedArray对象是公共资源。

然后我们在通过attrs.getAttributeResourceValue( “http://schemas.android.com/apk/res/android”, “src”, 0)来获取ImageView的原生src属性,并将其传入movie实例中。

自定义GifView的onDraw方法

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);//执行父类onDraw方法,绘制非gif的资源
if(isGifImage){//若为gif文件,执行DrawGifImage(),默认执行
DrawGifImage(canvas);
}
}

private void DrawGifImage(Canvas canvas) {
//获取系统当前时间
long nowTime = android.os.SystemClock.currentThreadTimeMillis();
if(movieStart == 0){
//若为第一次加载,开始时间置为nowTime
movieStart = nowTime;
}
if(movie != null){//容错处理
int duration = movie.duration();//获取gif持续时间
//如果gif持续时间为100,可认为非gif资源,跳出处理
if(duration == 0){
//获取gif当前帧的显示所在时间点
int relTime = (int) ((nowTime - movieStart) % duration);
movie.setTime(relTime);
//渲染gif图像
movie.draw(canvas, 0, 0);
invalidate();
}
}
}

在这个方法中,我们先对isGifImage是否为true进行判断,如果开发者指定其为false则直接调用 super.onDraw(canvas)绘制即可,而不必调用DrawGifImage()来降低效率,毕竟不断的invalidate()对性能效率 还是蛮大的。

如果要绘制gif资源,我们会根据系统的时间来推断出当前时间点时gif资源所应该显示的时间帧,相信大家看代码更容易看懂,注释也够详细的了,就不多讲解了。

调用资源的xml文件:


需要注意的一点就是 xmlns:gifview=”http://schemas.android.com/apk/res/com.net168.testgifview“,其中红色部分GifView.java这个类所在的包名。

 

下面附上源码(GifView.rar为lib工程,TestGIfView.rar为调试工程):Gif.rar

 

作者:enjoy风铃
出处:http://www.cnblogs.com/net168/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则下次不给你转载了

[转载]conn.State和conn.errors.count的选择 - 轻灵自由的珍珠 - 博客频道 - CSDN.NET

mikel阅读(826)

[转载]conn.State和conn.errors.count的选择 – 轻灵自由的珍珠 – 博客频道 – CSDN.NET.

早上上班坐下,开机,打开熟悉的工作网站界面,突然发现网站提示数据库链接失败,但是系统作的错误拦截居然没有生效果(数据库链接的原因是数据库服务器没开,这个不是本文重点)。
检查了一下判断连接是否成功的代码发现是这样写的
if conn.errors.count<>0 and conn.errors.count<>2 then
显示链链失败提示
end if
想 起,原来是用conn.errors.count<>0来判断是否连接成功,但是老是判断失误,跟踪了一下原因,发现当数据库连接时有时会产 生conn.errors.count等于2的结果,但是链接是成功的,所以加上了一个conn.errors.count<>2,但是,这 个conn.errors.count=2却包含了所有连接不成功的原因,所以发生了上面说的那一幕。

想了半天没想出个办法,上个洗手间,晕倒,居然在洗手时想到conn有一个检查连接状态的属性(为什么会在去洗手间时想到的呢?),回来查了一下ado的chm手册,找到了state属性,下面是这个属性的一些值
AdStateClosed  默认,指示对象是关闭的。
AdStateOpen   指示对象是打开的。
AdStateConnecting 指示 Recordset 对象正在连接。
AdStateExecuting 指示 Recordset 对象正在执行命令。
AdStateFetching  指示 Recordset 对象的行正在被读取。

查了一下adovbs.ini,这几个状态的真实值是:
Const adStateClosed = &H00000000
Const adStateOpen = &H00000001
Const adStateConnecting = &H00000002
Const adStateExecuting = &H00000004
Const adStateFetching = &H00000008

state 还是一个组合值,如当状态是AdStateExecuting Recordset 对象正在执行命令时,真正值应该是AdStateOpen和AdStateExecuting的组合。具体什么样的组合格式,有心人可以试试。我现在的重 点是第一个参数adStateClosed,很明显adStateClosed的十进制值是0
那也就是说当conn.State<>0就是链接成功。那判断句就可以改成
if conn.State=0 then
显示链链失败提示
end if
测试所有错误成功状态,拦截工作一切正常。耶~(这个是被MM感染了,喜欢说耶,要吐的吐啊吐的就习惯了的。-_-||b)

[转载]Node+Express+MongoDB项目中MongoDB实战教程(一)--MongoDB入门 - 红豆依旧在 - 博客园

mikel阅读(989)

[转载]Node+Express+MongoDB项目中MongoDB实战教程(一)–MongoDB入门 – 红豆依旧在 – 博客园.

前言

本文并不是网上流传的多少天学会MongoDB那种全面的教程,而意在总结这几天使用MongoDB的心得,给出一个完整的在Node + Express + MongoDB搭配的项目中MongoDB操作实战教程。写博客的目的,一来是为了方便自己日后查阅某些语法,二来是本着学习和共享的精神,与大家探讨技术。本系列教程同步到个人的Github:https://github.com/yuanzm/MongoDB-demo

MongoDB简介

MongoDB 是目前在IT行业非常流行的一种非关系型数据库(NoSQL),其灵活的数据存储方式备受当前IT从业人员的青睐。MongoDB很好的实现了面向对象的思想(OO思想),在MongoDB中每一条记录都是一个Document对象。MongoDB最大的优势在于所有的数据持久操作都无需开发人员手动编写SQL语句,直接调用方法就可以轻松的实现CRUD操作。–百度百科
从个人这几天对于MongoDB的使用情况看来,非常喜欢MongoDB的面向对象的风格,因为这在JavaScriptnode编程中显得尤为合适。在这里博主也不想比较拿MongoDB和传统的关系型数据库比较,因为这和语言的对比一样,都是没有意义的,每种语言/工具都有各自适用的场景。

MongoDB安装

MongoDB的安装在Linux等系统下非常简单,只要按照官网的教程几行命令就能搞定。但是在Windows下面显得尤为麻烦,可能会遇到各种蛋疼的情况。无论如何,按照官网的教程是不二的选择,因为很多博客都没有正确的说明安装步骤,到最后搞得一团糟。这里同样给出Windows下面的安装教程

  • Step1: 下载适合自己电脑的MongoDB版本,下载链接:DownLoads
  • Step2:新建目录D:\MongoDB,解压下载到的安装包,把bin文件夹拷贝到刚创建的目录下。
  • Step3: 在D:\MongoDB目录下新建data文件夹,它将会作为数据存放的根文件夹。
  • Step4: 在D:\MongoDB目录下新建log文件夹,它将会作为数据存放的根文件夹。
  • Step5: 配置Mongo服务端:
    打开CMD窗口(管理员身份),按照如下方式输入命令:

    用网页打开http://127.0.0.1:27017/
    会看到:You are trying to access MongoDB on the native driver port. For http diagnostic access, add 1000 to the port number
  • Step6: 继续用管理员身份打开命令行,进入D:\MongoDB\bin路径,敲如下命令:
    echo logpath=d:\MongoDB\log\mongodb.log > d:\MongoDB\mongod.cfg
    输入图中指令:

    打开D:\MongoDB\log\mongodb.log会看到:
  • Step7: 客户端连接验证
    新打开一个 CMD 输入图中指令:

    如果出现图中提示,那么您就可以开始MongoDB 之旅了

常用命令行操作

在开发的过程中时不时需要用命令行查看数据库当前的状态,于是记住几条最常用的命令还是非常必要的。在这里我用windows8的命令行演示一些常用的操作。
(1)查看所有的数据库: show dbs

可以看出,这条命令显示了当前所有数据库的名字和内存大小信息
(2)切换到某一个数据库:use <dbname>

(3)查看当前数据库的集合: show collections

(4)查看各collection的状态:db.printCollectionStats()

(5)删除当前的数据库: db.dropDatabase()

(6)查看某个集合:db.<collectionName>.find()

(7)删除某个集合:db.<collectionName>.drop()

由于是系列文章,所以第一篇就不展开过多的叙述,欢迎大家持续关注后续文章

[转载]关于node.js的误会 - 色拉油啊油 - 博客园

mikel阅读(1032)

[转载]关于node.js的误会 – 色拉油啊油 – 博客园.

昨天写了篇博客,介绍了一下我对node.js的第一次亲密接触后的感受,以为 node.js很小众,出乎我意料很多人感兴趣,并且对博客中的细节问题做了评论,最多的是围绕node.js的异步与单线程展开的,当然还有很多关于 node.js究竟是不是语言?不是的话又是什么。。。之类的问题,其实刚接触node.js,了解的并不是很深入,越是回复大家问题,心里越是没底,决 定认真研究一下,经人指点看了一下《Node.js开发指南》发现大部分问题都有了答案,权当一个读书笔记把问题答案分享出来,希望可以帮到一些和我一样 才接触node.js的小菜

 关于单线程一个由来已久的误会

在上篇博客中提到我们使用node.js写的JavaScript代码是单线程运行的,让很多同学很疑惑,单线程怎么实现异步操作,单线程谁去响应事件。。。在html5 Web Workers中 我也有提到过客户端的JavaScript也是单线程运行的,大家明显没有这么大反应,还是普遍能接受的。可单线程的客户端JavaScript也能响应 DOM事件,还有大家都很熟悉的ajax操作,回调函数也是异步的,既然客户端JavaScript是单线程执行的,回调函数是谁调用的呢?答案很简 单,JavaScript的宿主环境——浏览器,也就是说虽然JavaScript是单线程执行的,但浏览器是多线程的,负责调度管理 JavaScript代码,让它们在恰当的时机执行。

所以我们所说的node.js单线程,是指node.js并没有给我们创建一个线程的能力,所有我们自己写的代码都是单线程执行的,在同一时间内, 只能执行我们写的一句代码。但宿主环境node.js并不是单线程的,它会维护一个执行队列,循环检测,调度JavaScript线程来执行。因此单线程 执行和并发操作并不冲突。

阻塞与线程

什么叫阻塞(block)?线程在执行中如果遇到I/O操作(磁盘读写、网络通信等)通常需要耗费较长的时间,这时候操作系统会剥夺线程对CPU的 控制权,使其暂停,并把资源让给其它的工作线程,这种线程调度方式成为阻塞。当I/O操作完毕的时候操作系统将这个线程的阻塞状态解除,恢复其对CPU的 控制权,令其继续执行,这种I/O模式就是同步I/O或成为阻塞I/O。

响应的异步I/O或非阻塞I/O则针对所有的I/O操作采取不阻塞的策略,当线程遇到I/O操作时不会以阻塞的方式等待I/O操作结束,而只是将I /O请求发送给操作系统,继续执行后续语句。当操作系统完成I/O操作时以事件的形式通知执行I/O操作的线程,线程会在特定时间处理这个事件。为了处理 异步I/O必须有事件循环,不断检查有没有未处理的事件,依次予以处理。

在阻塞模式下,一个线程只能处理一个任务,要想提高吞吐量必须通过多线程。而在非阻塞模式下一个线程永远在执行计算操作,这个线程所使用的CPU核 心利用率永远是100%,I/O以事件的方式通知。在阻塞模式下多线程往往能够提高系统吞吐量,因为一个线程阻塞时还有其他线程在工作,多线程何以让 CPU资源不被阻塞的线程浪费。而在非阻塞模式下,线程不会被I/O阻塞,永远在利用CPU。异步I/O减少了多线程中创建线程、分配内存、列入调度、切 换线程、内存换页、CPU缓存等方面的开销。

事件循环机制

上面提到了几次事件循环机制,那么这个听起来貌似很高端的东东究竟是什么呢?所谓事件循环是指node.js会把所有的异步操作使用事件机制解决, 有个线程在不断地循环检测事件队列。node.js中所有的逻辑都是事件的回调函数,所以node.js始终在事件循环中,程序入口就是事件循环第一个事 件的回调函数。事件的回调函数中可能会发出I/O请求或直接发射( emit)事件,执行完毕后返回事件循环。事件循环会检查事件队列中有没有未处理的事件,直到程序结束。node.js的事件循环对开发者不可见,由 libev库实现,libev不断检查是否有活动的、可供检测的事件监听器,直到检查不到时才退出事件循环,程序结束。

node.js是什么?和JavaScript有什么关系?

关于node.js究竟是什么,大家的问题在于

  1. node.js是不是一门语言?
  2. node.js是不是一个JavaScript库函数?
  3. node.js是不是一个JavaScript框架?

很遗憾,这三个问题的答案都是NO,看看官方对自己的描述

Node.js is a platform built on Chrome’s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices.

官方很明确地说node.js是一个platform,也就是一个做xxx的平台。node.js是一个可以在服务器端运行JavaScript的 平台,其实这句话华也不准确,按照《JavaScript权威指南》《JavaScript高级程序设计》等书中的定义,JavaScript是由两部分 组成

  1. core JavaScript
  2. client JavaScript(DOM、BOM)

而只有core JavaScript可以在node.js上运行,所以node.js借用了JavaScript的语法,但并不能用来处理浏览器对象(BOM)及文档对 象(DOM),所以node.js并不是设计为在服务器端运行解析html文档的(当然有module可以做此事),所以“在服务器端运行的 JavaScript”在一定程度上误导了初学者。

同时node.js并不仅仅运行core JavaScript,node.js中还有文件系统、模块包、操作系统API、网络通信、二进制类型处理等core JavaScript不具备的功能。

node.js是在执行JavaScript语句吗

从字面意思上是的,因为我们在使用node.js开发的时候写的确实是JavaScript语句,而且node.js利用Google的V8 Javascript 引擎来解析JavaScript语句,但系统真正调用执行的代码是用C++写的,我们做的只是用JavaScript语句来调用这些底层API,所以不用 担心其执行效率过低问题

异步I/O与事件驱动

毫不夸张的说node.js最大的特定就是采用异步I/O和事件驱动架构,对于高并发解决方案传统架构师多线程模型,为每个业务逻辑童工一个线 程,通过系统线程切换来来弥补同步I/O调用的时间开销。node.js使用的是单线程模型,对所有I/O都采用异步式的请求方式,避免频繁的上下文切 换,在node.js执行的时候维护着一个事件队列,程序在执行时进入事件循环等待下一个事件到来,每个异步I/O请求完成后都会被推送到事件队列中的等 待执行。

对于一个简单的数据库访问操作,传统方式是这样实现的

 res = db.query('SELECT * from some_table');
 res.output();

 

代码执行到第一行的时候线程会阻塞,等待query返回结果,然后继续处理。由于数据库查询、磁盘读写、网络通信等原因阻塞时间会非常大(相对于 CPU始终频率)。对于高并发的访问,一方面线程长期阻塞等待,另一方面为了应付新情求而不断添加新线程,会浪费大量系统资源,同时线程的增加也会也会占 用大量的CPU时间来处理内存上下文切换。看看node.js怎么处理

db.query('SELECT * from some_table', function(res) { 
   res.output();
});

 

在代码中熟悉Javascript的同学一眼就可以看明白query的第二个参数是一个回调函数,进程执行到db.query的时候不会等待结果返 回,而是直接继续执行下面的语句,直到进入事件循环。当数据库执行结果返回的时候会将事件发送到事件队列,等到线程进入事件循环后才会调用之前的回调函 数。

node.js的异步机制是基于事件的,所有的I/O、网络通信、数据库查询都以非阻塞的方式执行,返回结果由事件循环来处理。node.js在同 一时刻只会处理一个事件,完成后立即进入事件循环检查后面事件。这样CPU和内存在同一时间集中处理一件事,同时尽量让耗时的I/O等操作并行执行。

node.js架构

node.js用异步式I/O和事件驱动代替多线程提升性能,除了使用高效的V8作为JavaScript引擎外还使用了高效的libev和libeio库支持事件驱动和异步I/O。

node.js作者在libeio和libev的基础上抽象出了libuv层,对于POSIX(Portable Operating System Interface 是一套操作系统API规范,遵循的有Unix、Linux、Mac OS X等)操作系统libuv通过封装libev和libio来利用epoll或kqueue。而在Windows下libuv使用了 IOCP(Input/Output Completion Port,输入输出完