[转载]构建高性能ASP.NET站点之二 优化HTTP请求(前端)

mikel阅读(741)

[转载]【原创】构建高性能ASP.NET站点之二 优化HTTP请求(前端) – ASP.NET 架构 – 博客园.

上一篇文章主要讲述了请求一个页面的过程,同时也提出了在这个过程中的一些优化点,本篇就开始细化页面的请求过程并且提出优化的方案.同时,在上篇文章中,不少朋友也提出了一些问题,在本篇中也对这些问题给出了回答!

系列文章链接:

构建高性能ASP.NET站点 开篇

构建高性能ASP.NET站点之一 剖析页面的处理过程(前端)

构建高性能ASP.NET站点之二 优化HTTP请求(前端)

构建高性能ASP.NET站点之三 细节决定成败

构建高性能ASP.NET站点 第五章—性能调优综述(前篇)

大型高性能ASP.NET系统架构设计

构建高性能ASP.NET站点 第五章—性能调优综述(中篇)

构建高性能ASP.NET站点 第五章—性能调优综述(后篇)

构建高性能ASP.NET站点 第六章—性能瓶颈诊断与初步调优(上篇)—识别性能瓶颈

构建高性能ASP.NET站点 第六章—性能瓶颈诊断与初步调优(下前篇)—简单的优化措施

构建高性能ASP.NET站点 第六章—性能瓶颈诊断与初步调优(下后篇)—减少不必要的请求

构建高性能ASP.NET站点 第七章 如何解决内存的问题(前篇)—托管资源优化—垃圾回收机制深度剖析

构建高性能ASP.NET站点 第七章 如何解决内存的问题(前中篇)—托管资源优化—监测CLR性能

本篇的议题如下:

HTTP请求的优化

HTTP请求的优化

在一个网页的请求过程中,其实整个页面的html结构(就是页面的那些html骨架)请求的时间是很短的,一般是占整个页面的请求时间的10%-20%.在页面加载的其余的时间实际上就是在加载页面中的那些flash,图片,脚本的资源. 一直到所有的资源载入之后,整个页面才能完整的展现在我们面前.

下面,我们就从一个页面开始讲述:


小洋,燕洋天

<script src="../demo.js" type="text/javascript">
      </script>
<div><img src="../images/1.gif" alt="" />
<img src="../images/2.gif" alt="" />
<img src="http://yanyangtian.cnblogs.com/image/3.gif" alt="" />
<img src="http://yanyangtian.cnblogs.com/image/4.gif" alt="" />
<img src="http://yanyangtian.cnblogs.com/image/5.gif" alt="" />
<img src="http://yanyangtian.cnblogs.com/image/6.gif" alt="" />
<img src="http://yanyangtian.cnblogs.com/image/7.gif" alt="" />
<img src="http://yanyangtian.cnblogs.com/image/8.gif" alt="" />
<img src="http://yanyangtian.cnblogs.com/image/7.gif" alt="" />
<img src="http://yanyangtian.cnblogs.com/image/8.gif" alt="" /></div>

如果我们向服务器请求这个页面,客户端的浏览器首先请求到的数据就是html骨架,:


小洋,燕洋天

<script src="../demo.js" type="text/javascript">
      </script>
<div><img src="../images/1.gif" alt="" />
<img src="../images/2.gif" alt="" />
<img src="http://yanyangtian.cnblogs.com/image/3.gif" alt="" />
<img src="http://yanyangtian.cnblogs.com/image/4.gif" alt="" />
<img src="http://yanyangtian.cnblogs.com/image/5.gif" alt="" />
<img src="http://yanyangtian.cnblogs.com/image/6.gif" alt="" />
<img src="http://yanyangtian.cnblogs.com/image/7.gif" alt="" />
<img src="http://yanyangtian.cnblogs.com/image/8.gif" alt="" />
<img src="http://yanyangtian.cnblogs.com/image/7.gif" alt="" />
<img src="http://yanyangtian.cnblogs.com/image/8.gif" alt="" /></div>

在此之前,首先来普及一下页面加载的小知识:

当页面的html骨架载入了之后,浏览器就开始解析页面中标签,从上到下开始解析.

首先是head标签的解析,如果发现在head中有要引用的js脚本,那么浏览器此时就开始请求脚本,此时整个页面的解析过程就停了下来,一直到js请求完毕.

之后页面接着向下解析,如解析body标签,如果在body中有img标签,那么浏览器就会请求imgsrc对应的资源,如果有多个img标签,那么浏览器就一个个的解析,解析不会像js那样等待的,如果发现imgurl地址是同一个地址,那么浏览器就会充分的利用这个已经打开的tcp连接顺序的去一个个的请求图片,如果发现有的imgurl地址不同,那么浏览器就另开tcp连接,发送http请求.

注意之前请求js的区别:请求需要js,浏览器会一直等待,不在解析下面的html标签

但是解析到img的时候,尽管此时需要加载图片,但是页面的解析过程还是会继续下去的,然后决定是否发送新的tcp连接加载资源.

大家可能觉得这个之前的代码片段一样,确实代码是一样的,但是,在最开始的时候,发送到浏览器中的只是那些html的代码,任何的js脚本和图片还没有发送过来.

html代码到了浏览器中,那么浏览器就开始一步步的解析这些代码了,只要遇到了需要加载的资源,浏览器就向服务器发出http请求,请求所需的资源.

整个页面的加载时间图如下:

大家从图中可以看出:

第一条线中分为一半黄色和一半蓝色,其实黄色的部分就代表了打开一个tcp连接花的时间,而后面的蓝色的部分就是请求整个html骨架文档的时间.可以看出,请求html骨架的时间是很短的.其余蓝色的线就表示了图片,脚本资源加载所花的时间.

很显然,这样页面的整个加载时间就很长了.因为页面的加载几乎是顺序的载入,时间就是所有资源加载时间的总和.

下面我们把上面的页面代码代为如下:




小洋,燕洋天

<script src="../demo.js" type="text/javascript">
    </script>
<div><img src="http://demo1.com/images/1.gif" alt="" />
<img src="http://demo1.com/images/2.gif" alt="" />
<img src="http://demo2.com/image/3.gif" alt="" />
<img src="http://demo2.com/image/4.gif" alt="" />
<img src="http://demo3.com/image/5.gif" alt="" />
<img src="http://demo3/image/6.gif" alt="" />
<img src="http://demo4.com/image/7.gif" alt="" />
<img src="http://demo4.com/image/8.gif" alt="" />
<img src="http://yanyangtian.cnblogs.com/image/7.gif" alt="" />
<img src="http://yanyangtian.cnblogs.com/image/8.gif" alt="" /></div>

我们再来看看页面的加载时间图

这就是所谓的并行载入了.

比较一下两段代码的不同:其实就在imgsrc属性上面:

第一段页面的代码:imgsrc属性都是指向一个域名的.

第二段页面的代码:imgsrc属性指向了不同的域名

这样做的结果是什么?

请大家注意比较imgsrc的不同.

解释之前,首先来看一个小的常识(在上篇文章中也提过):

当页面请求向服务器请求资源的时候,如果浏览器已经在客户端和服务器之前打开了一个tcp连接,而且请求的资源也在开了连接的服务器上,那么以后资源的请求就会充分的利用这个连接去获取资源. 这样也就是第一个时间图的由来.

如果请求的图片分别位于不同的服务器网站,或者那个请求的服务器网站有多个域名,那么因为浏览器就会为每一个域名去开一个tcp连接,发送http请求,这样,结果就是同时开了多tcp连接,这也是第二个时间图的由来.

虽然说并行加载,确实使得页面的载入快了不少,但是也不是每一个图片或者其他的资源都去搞一个不同的域名,像之前的第二个并行载入图片的例子,也是让两个图片利用一个tcp连接.如果每个图片都去开一个连接,这样浏览器就开了很多个连接,也是很费资源的,而且浏览器还可能会僵死”.而且有时还会严重的影响性能.

所以,这是需要权衡的.

除了上面的优化方式,还有其他的图片优化的加载方式.主要是通过减少http的请求达到优化

大家都知道网站的一个menu菜单,有些菜单就是用图片作出来的.

如果上面的图片一个个载入,势必影响速度,如果开多和请求,有点得不偿失.而且图片也不是很大,那么就一次把整个menu需要的图片作为整个图片,一次加载,然后通过map的方式,控制点击图片的位置来达到导航的效果.

这样一个问题就是:算出图片的坐标,不能点击了主页图片,然后却跳到了帮助页面了.

本篇就讲述到这里,下篇讲述其他的资源文件的优化,希望 多多提出建议,争取把这个系列写好!

[转载]构建高性能ASP.NET站点之一 剖析页面的处理过程(前端)

mikel阅读(753)

[转载]【原创】构建高性能ASP.NET站点之一 剖析页面的处理过程(前端) – ASP.NET 架构 – 博客园.

构建高性能ASP.NET站点之一 剖析页面的处理过程(前端)

前言:在对ASP.NET网站进行优化的时候,往往不是只是懂得ASP.NET就足够了的。 在优化的过程中,一般先是找出问题可能存在的地方,然后证明找出的问题就是要解决的问题,确认之后,在进行一些措施。系列文章在结构上的安排是这样的:先讲述前端的调优,我会在文章的标题后面标上前端,如果是后台代码的调优,我会在标题上标上后端,如果是数据库设计的调优,我会在标题上标上数据库,希望大家多多提建议。

系列文章链接:

构建高性能ASP.NET站点 开篇

构建高性能ASP.NET站点之一 剖析页面的处理过程(前端)

构建高性能ASP.NET站点之二 优化HTTP请求(前端)

构建高性能ASP.NET站点之三 细节决定成败

构建高性能ASP.NET站点 第五章—性能调优综述(前篇)

大型高性能ASP.NET系统架构设计

构建高性能ASP.NET站点 第五章—性能调优综述(中篇)

构建高性能ASP.NET站点 第五章—性能调优综述(后篇)

构建高性能ASP.NET站点 第六章—性能瓶颈诊断与初步调优(上篇)—识别性能瓶颈

构建高性能ASP.NET站点 第六章—性能瓶颈诊断与初步调优(下前篇)—简单的优化措施

构建高性能ASP.NET站点 第六章—性能瓶颈诊断与初步调优(下后篇)—减少不必要的请求

构建高性能ASP.NET站点 第七章 如何解决内存的问题(前篇)—托管资源优化—垃圾回收机制深度剖析

构建高性能ASP.NET站点 第七章 如何解决内存的问题(前中篇)—托管资源优化—监测CLR性能

本篇主要剖析过程,让大家有个全面的了解,下一篇就开始分步剖析了。

本篇的议题如下:

剖析页面的解析过程

分析出可能存在的优化点

剖析页面的解析过程

页面的解析过程,这里说的过程不是我们常说的ASP.NET页面的生命周期的过程,而且浏览器请求一个页面,然后浏览器呈现页面的过程。

在本篇的文章中,我会先阐述页面的解析过程,显示从整体上阐述,然后在每一个点上提出优化的方法。先整体,后局部。

当浏览器在请求一个Web页面是从URL开始的。下面就是过程描述:

1. 输入URL地址或者点击URL的一个链接

2. 浏览器根据URL地址,结合DNS,解析出URL对应的IP地址

3. 发送HTTP请求

4. 开始连接请求的服务器并且请求相关的内容(至于请求时怎么被处理的,我们这里暂时不讨论,只是后面的文章要讨论的问题)

5. 浏览器解析从服务器端返回的内容,并且把页面显现出来,同时也继续进行其他的请求。

上面基本上就是一个页面被请求到现实的过程。下面我们就开始剖析这个过程。

当输入URL之后,浏览器就要知道这个URL对应的IP是什么,只有知道了IP地址,浏览器才能准备的把请求发送到指定的服务器的具体IP和端口号上面。

浏览器的DNS解析器负责把URL解析为正确的IP地址。这个解析的工作是要花时间的,而且这个解析的时间段内,浏览器不是能从服务器那里下载到任何的东西的。但是这个解析的过程是可以优化的。试想,如果每次浏览器每次请求一个URL都需要解析,那么每次的请求都有一点的时间消耗,可能这个时间消耗很短,但是性能的提升就是一点点的“调”出来的。如果把对应URLIP地址缓存起来,那么当再次请求相同的URL时,浏览器就不用去解析,而是直接读取缓存,这样势必会快一点。

其实浏览器和操纵系统是提供了这样的支持的。

当获得了IP地址之后,那么浏览器就向服务器发送HTTP的请求,下面我们就稍微看下这个发送请求是怎么样被发送的:

1. 浏览器通过发送一个TCP的包,要求服务器打开连接

2. 服务器也通过发送一个包来应答客户端的浏览器,告诉浏览器连接开了。

3. 浏览器发送一个HTTPGET请求,这个请求包含了很多的东西了,例如我们常见的cookie和其他的head头信息。

这样,一个请求就算是发过去了。

请求发送去之后,之后就是服务器的事情了,服务器端的程序,例如,浏览器清楚的文件是一个ASP.NET的页面,那么服务器端就把请求通过IIS交给ASP.NET 运行时,最后进行一系列的活动之后,把最后的结果,当然,一般是以是以html的形式发送到客户端。

其实首先到达浏览器的就是html的那些文档,所谓的html的文档,就是纯粹的html代码,不包含什么图片,脚本,css等的。也就是页面的html结构。因为此时返回的只是页面的html结构。这个html文档的发送到浏览器的时间是很短的,一般是占整个响应时间的10%左右。

这样之后,那么页面的基本的骨架就在浏览器中了,下一步就是浏览器解析页面的过程,也就是一步步从上到下的解析html的骨架了。

如果此时在html文档中,遇到了img标签,那么浏览器就会发送HTTP请求到这个img响应的URL地址去获取图片,然后呈现出来。如果在html文档中有很多的图片,flash,那么浏览器就会一个个的请求,然后呈现。

到这里,大家也许感觉到这种方式有点慢了。确实这个图片等资源文件的请求的部分也是可以优化的。暂不说别的,如果每个图片都要请求,那么就要进行之前说的那些步骤:解析url,打开tcp连接等等。开连接也是要消耗资源的,就像我们在进行数据库访问一样,我们也是尽可能的少开数据库连接,多用连接池中的连接。道理一样,tcp连接也是可以重用的。但是重用也有问题:如果两个图片它们的url地址如下:

代码

请求这些图片的时间消耗如下图:

大家首先看到最上面的黄线的部分,这个黄线就代表了浏览器打开连接,黄线的后半部分为蓝色,就表示浏览器请求到了html的文档。

最上面的第二条蓝线就表示第一个图片已经请求到了,此时请求这个图片使用还是之前的一个tcp的连接。

大家在看到第三条线,前部分是黄色的,表示请求第二个图片的时候又开了一个tcp的连接,这条线的后半部分为蓝色,表示图片已经请求到了。

剩下的要请求的一些图片都使用上一个tcp连接。

确实,tcp的连接时充分的被使用了,但是图片下载的速度确实慢了,从图中看出,图片是一个个的顺序的下载下来的。整个页面的响应时间可想而知。

如果采用下一种方式,如:

可以看出连接时多了,但是图片的几乎都是并行下载下来的,相比而言就快多了。

其实这就是一个权衡的问题了。

实际上浏览器也是内置了以一些优化方式的,例如缓存图片,脚本等。或者采用并行下载图片的方式,谈到并行下载,就如上图所看到的,势必会消耗更多的连接资源。

今天主要对页面的过程进行了初步的剖析,是的大家有个总体的把握,下一篇我们就开始逐步优化,敬请关注,也希望大家多多提出意见和反馈。先谢过了啊! :)

版权为小洋和博客园所有,欢迎转载,转载请标明出处给作者。

http://www.cnblogs.com/yanyangtian

[转载]如何剖析一个类

mikel阅读(1236)

[转载]如何剖析一个类 – Tekkaman – 博客园.

阅读组内代码也好、开源代码也好,在OOP程序设计中,对代码中各个类的理解至关重要。经过大量的阅读与分析后,发一些小技巧可以加快与加强自己对代码的理解,现整理如下:

如何剖析一个类:

1、先看本类继承了哪些基类和实现了哪些接口

类的第一行往往包含的是继续基类的信息以及实现接口的信息,所以在一开始就要弄清楚本类所依赖的类。我们假设代码的命名都是规范的,根据所继承基类的名字和接口的名字,我们可以暗自推测本类和基类的关系,以及本类实现的功能。

2、关注成员变量

大多数类功能的实现,都会需要本地类变量用以记录状态信息,根据类变量的个数、类型、命名,我们也可以推测本类所提供的功能。

3、关注成员函数

关注成员函数提供了哪些功能,在阅读成员函数代码时,特别要注意哪些函数操作了本地变量。(通常情况下绝大多数函数都操作了本地变量,因为如果 不操作本地变量,则些函数应该外提)。另外,在阅读函数代码时,一定要理清哪些函数是对外提供服务的,哪些函数是仅在内部使用的,哪些函数是为了完成基类 的实现的。

4、关注静态成员变量和静态函数

通常来说,一个类的静态成员变量和静态函数会很少。(当然不乏全是静态变量和函数的类),通常静态变量和函数的存在是为了为所有类提供统一的内 部服务,也就是他们仅对内提供服务,不对外提供服务。因而,大多数情况下,无视这些变量和函数不会有类功能剖析产生多大影响,但是理解这些变量和函数存在 的意义,则对类的内部实现会起到非常关键的作用。

5、关注类中的宏定义

宏定义常常起到一个开关的作用,觉的用法是在_Debug下实现某个功能,在NDebug下实现另一功能。所以对宏定义的关注,对类高级服务(在不同编译选项下的工作内容)的理解往往起到关键性的作用。

6、关注模板参数

模板参数往往放在类定义的第一行,我建议放在最后分析,是因为模板参数往往面向的一类服务。

7、关注typedef宏定义

略。

小记:

作为库代码,我觉得,任何变量和函数的存在都是有很多深刻的意义,为什么要存在这个变量?为什么变量要放在本类?为什么变量要这么命名?……种种引起的思考很多。一个类功能越是强大,那就越会引发阅读者的思考。一个功能弱小的类,常常是被阅读者秒过~~

要想写得一手好代码,要想成为一个高级C++ Coder,那就多用宏、多用模板参数!!!这些才是C++高级编程以及核心所在。

[转载]移动互联网项目:三国演义LBS (一)商业计划书

mikel阅读(927)

[转载]【开源系列】移动互联网项目:三国演义LBS (一)商业计划书 – 美丽人生 – 博客园.

前言

———————————————–

本开源系列包含了移动互联网项目计划书、总策划案、项目源代码、数据库设计与文档、项目使用的基础框架源码、策划案明细等。

您(您的团队) 掌握了本项目的开源技术,能够快速的开发任意互联网项目,领先其他团队几个脚步。

由于资料过多,本开源系列分为若干阶段进行。源码授权等协议的问题在对应章节进行陈述。

本文为开源系列第一章,精选了商业计划书部分核心思想,原文在附件中,可在本文末尾获取自行下载。

我们希望通过本开源系列结交相关领域的人才朋友,共同聊聊移动互联网相关思路发展。

相关讨论组入口: http://www.pixysoft.net/ (点击进入)

计划书精选:

———————————————–

一、 三国演义LBS 概述

锁定北京、上海、广州三大城市中使用智能手机的高端用户群体,在三国时代的背景下,利用地理位置信息,为用户提供群体社会化游戏互动。让用户从简单的个人地理位置“签到”,逐步引导向基于地理位置的群体性质互动,养成一种全新的社会化生活娱乐习惯。

1.1 三国演义LBS的目标
以三国演义故事情节为背景,在地理位置信息基础上,通过持续性人人互动的游戏机制,引导用户关注、掌握、习惯与依赖移动社会化服务,从而构造出的稳定繁荣的移动社会化平台;为后续的多元化社会化业务的开展打下基础。
1.2 三国演义LBS特点
1) 玩法创新 有持续性
过 于开放的游戏玩法导致失去目的性与娱乐性,过于封闭的游戏导致失去新鲜感;社会群体需要一定的规则方向去遵守不至于迷失,又需要存在不确定的新鲜因素去追 求去刺激自身的探索求知欲。因此三国演义LBS的核心玩法是攻打关卡,追求后续的剧情发展;玩家在预先策划的游戏发展剧情中不断探索,满足自身的好奇心与 征服感。

玩法引入了地理位置因素,增加了游戏的新鲜感,不同地理位置群体在游戏中有差异,而不同群体又有着相同的游戏发展追求;因此让用户能感知新鲜感的存在,也体会到满足新鲜感存在的地理位置成本,形成一种“饥饿感”。

2) 有话可说 有事可做
移动社交流行普及,需要满足群体内在的普遍的轻量级社交需求,并且具备比传统的社交平台更简单、高效、直接的特点;同时需要一个非常低的入门门槛,降低群体的抵触感。

游 戏本质是对现实生活的一种提炼、简化,规避了现实社会中复杂的人际关系、不确定自然因素等,通过简单的“有付出就有收获”的游戏规则吸引用户不断投入发 展,即满足休闲娱乐,又满足一定的社交需求。因此以游戏为切入点,能够减少用户的抗拒与陌生心理,让用户围绕游戏本身有话可说,有事可做,再在此基础上迅 速了解并习惯LBS社会化平台的服务。

3) 快速传播 爆发力强
游戏发展设计依赖群体的推动,而不是个体的努力。只有不断有新用户加入共同发展,提高游戏的繁荣度,游戏的情节才能进一步推动深化,因此参与游戏的用户内在存在了一种推广传播三国演义LBS的需求。

游戏运营基于移动通讯终端,通过合理、合法的手段获取群体之间的人际关系网络,能够迅速的形成一种强人际关系纽带,极大降低运营成本。因此三国演义LBS在技术上提供了推广传播的保证。

4) 盈利模式鲜明 针对性强
三国演义LBS自身提供了一套完善的虚拟货币体系,用户通过充值获取虚拟货币,加快游戏中的发展速度,获取更高的地位感与虚荣心。这是盈利模式的基础保障。

其次,三国演义LBS提供了完善的VIP等级制度,在不同人群中根据投入的资金划分出VIP等级,形成一种地位身份象征。根据VIP等级再建立社会化交互服务,让用户狠心投资,获取身份上的差异,以便有针对性的、有范围的进行社会化交互。

二、 行业与市场分析

2.6 国内LBS现状问题
国内LBS的跟随者还有网易八方(bafang.163.com)、盛大切客(qieke.com)等。虽然打着大公司的牌子,但是仍然无法走出Foursquare设下的游戏规则,也无法在国内掀起一场LBS热潮。他们存在的问题,主要有以下几个方面:
1) 无强取代性
目前的LBS应用大部分处于跟风状态,模仿抄袭美国的Foursquare,因此并没有考虑国内的实际国情,无法针对中国人的性格特点,如谨慎、保守、羊群效应等去提供服务。

技术上大部分在传统的社交平台、微博基础上“强行”加入了地理位置因素,仅仅成为一种辅助信息,因此与传统的电脑客户端社交服务比较,缺少优势、操作琐屑、信息量小,无法成为潮流。

有部分LBS应用具备一定的创新力,例如疯狂城市等,其引入了大富翁等经济玩法因素,但是游戏目的性没有突出社交,没有一种内在的传播推动力与外在的技术保障,因此无法流行。
2) 无法把握地理位置差异产生的成本优势
地理位置差异存在的成本是巨大的,过去传统互联网一直在淹没这种差异,例如淘宝的商品交易搜索、开心网提供的好友推荐等,都提供了一种无差别的推荐机制,试图利用互联网的覆盖性去弱化地利位置差异的成本。

这种传统发展思路,使成本最终会转嫁到其他形式,例如增加服务提供商的运营成本、降低了用户期待感与所提供的服务的心理价值等。

信息的价值是巨大的,未知转变为已知的过程应该付出相应的代价。目前LBS刚刚兴起,但是国内仍然没有一个LBS应用能够把握住地理位置差异去赚取信息不对称产生的巨大价值财富,没有去尝试利用地理位置的差异有目的性的隔离信息流通,从而制造出利润空间。

3) 无法把握社会化交互的核心
无论是签到、还是LBS游戏,都仅仅提供了一种人与平台之间的单向交互;即签到的地点、LBS的地点是静态的死的,这样很容易导致这种游戏规则缺少新鲜感和生命力。

用户签到的目的是希望能够与相同地理位置的人进行交互,但是目前国内LBS平台并没有直接满足此用户需求,仅仅用各种积分制度、排名制度间接的建立人人交互。

因此国内LBS本身是个“错失了交互的时间,在一个仅仅是经过或逗留过的地点,做着与他人没有任何关联的事情”。因此这种LBS的交互没有体现人人社会化交互。
4) 小结

三 国演义LBS设计上把握住了“城市上班族上下班时间无聊,通过参与各种游戏事件,以便认识不同的人,扩大自己的交际圈”这个核心。以游戏为切入点去培养用 户使用LBS应用的习惯,再逐步开放各种基于LBS应用的免费服务。而且服务带有地域性,能够在商家与消费者之间构成双赢的博弈结果。

四、 技术可行性分析

4.6 三国演义LBS的技术选型方案——HTML5
智能手机开发目前仍然属于混乱状态。IPhone开发环境自封闭、Android自身就存在版本控制问题,版本之间不兼容也不向下兼容;WM仍然没有成为主流等。如果需要针对所有的手机系统开发出适用的应用程序,则工作量巨大,版本管理复杂;而且对消费者来说也会迷茫。

考虑到以上存在的问题,本平台实施以HTML5为主、平台应用为辅的技术方案。

HTML5 的前身是 Web Applications 1.0,由 WHATWG 于2004年提出。2007年,它被 W3C 接纳,并于2008年1月22日发布第一份正式草案。2010年随着HTML 5的迅猛发展并牢牢占据了Web开发的核心位置,各大公司如Google、微软、苹果、Mozilla和Opera的浏览器开发业务在这一年都异常繁忙。

虽然在PC系统是微软IE的天下,但是在手机领域,目前并没有一家独大的情况。在这个时期,所有智能手机系统平台却有一个共同点,就是支持HTML5。

HTML5开发主要使用了传统的HTML格式,以及扩展的js语法,因此学习曲线非常低;而且HTML5已经支持本地数据存储、图片数据缓存、获取地理位置信息、socket长链接等功能,因此技术上完全可以胜任目前的LBS平台开发。

使用BS架构,为平台发展升级带来了极大的便利。用户无需下载客户端,仅仅通过浏览器(或者网络访问快捷方式),即可获取最新的信息与数据,用户数据也保存在网络端,不用担心数据丢失被盗等问题。

虽 然HTML5非常强大,但是其无法接触智能手机底层接口,例如无法获取用户联系人列表、无法获取重力感应数据、无法直接操作GPS、WIFI等,有其局限 性。因此需要通过收手机本地应用软件进行支持。考虑到这个因素,三国演义LBS会使用HTML5的同时,必要的时候也运行本地软件应用以便提供更加底层的 数据。但是开发上仍然保持以HTML5为主、本地应用为辅的策略。

相关资料

———————————————–

000 三国演义LBS 商业计划书 v6.0.doc

http://www.boxcn.net/shared/7tkgho1szo

游戏试玩入口

http://www.citi-box.com/sango/sango_login.aspx


我们的最新动态 (Bamboo@pixysoft.net)

  • 1.解决comet在多页面中冲突的问题.[2011-1-23]
  • 2.优化部分后台逻辑代码.提升首页访问性能[2011-1-20]
  • 3.网络Comet平台再次成功对接上线.[2011-1-9]
  • 我们每天都在努力着!

作者:美丽人生
技术支持:reborn_zhang@hotmail.com

[转载]提升你网站水平的 jQuery 插件推荐

mikel阅读(935)

[转载]提升你网站水平的 jQuery 插件推荐 – 梦想天空 – 博客园.

JQuery是一个优秀JavaScript库,它简化了HTML文档遍历,事件处理,动画和Ajax交互。 JQuery的确改变了很多人写JavaScript的方式。如今,有很多现成的JQuery插件可供选择,帮助你在网站中加入惊人的功能和效果。看看这 些非常棒的jQuery插件吧,我相信你会发现一些很有用的东西。

lsotope

Isotope

Isotope 是一款精致的 jQuery插件,用于创建单纯用 CSS 无法实现的智能的、动态的布局,非常强大。

lettering

Lettering.js

Lettering 是一款用于实现激进的网页排版的 jQuery 插件,可以帮助你在网站中加入丰富多彩的文字效果。

jQuery.spritely

jQuery.spritely

jQuery.spritely 是一款简单、轻量的 jQuery 插件,用来创建创建动态角色和背景动画,效果非常酷,赶紧点击看示例吧。

Waypoints

Waypoints

Waypoints 可以帮助你很容易的实现滚动到某个元素的时候执行某项功能,根据用户拖动滚动条的位置来实现特定的布局模式。

HTML5 Grayscale Image Hover

HTML5 Grayscale Image Hover

借助 jQuery 和 HTML5 canvas ,图像可以很容易动态转变为灰度模式而不需要使用图像编辑软件。

jQuery Masonry

jQuery Masonry

Masonry 是一款 jQuery 布局插件,可以实现类似在墙上堆砌石头一样的布局效果。

Quicksand

Quicksand

Quicksand 是一款非常实用的 jQuery 插件,让你可以以圆滑流畅的方式实现项目的过滤和重新排序。

jDigiClock

jDigiClock

jDigiClock 是一款实现漂亮的时钟效果的 jQuery 插件,有很多选项可以用来定制时钟的行为和外观。

Aga

Aga

Aga 是一款简单、易用、全定制的手风琴效果插件,有水平和垂直两种方式。

Easy Image Zoom

Easy Image Zoom

Easy Image Zoom 是一款轻量的图像缩放插件,定制方便,非常适合用于产品图片浏览的场景。

Contained Sticky Scroll

Contained Sticky Scroll

这款插件可以帮你实现创建一个“粘”在窗口顶部的元素,但是不会移除它的父元素之外。

Supersized! jQuery plugin

Supersized! jQuery plugin

一款全屏幻灯片插件,支持从 flickr 读取图片。

gMap port for V3 Google Maps API

gMap port for V3 Google Maps API

gMap 是一款帮助你在网站中嵌入谷歌地图,使用非常灵活的轻量 jQuery 插件。

Quicktag

Quicktag

Quicktag 是一款标签插件,可以帮助你非常容易的实现插件新增和删除功能。

[转载]Android与服务器端数据交互(http协议整合struts2+android)

mikel阅读(1665)

[转载]Android与服务器端数据交互(http协议整合struts2+android) – 东子哥 – 博客园.

Android中有时候我们不需要用到本机的SQLite数据库提供数据,更多的时候是从网络上获取数据,那么Android怎么从服务器端获取数据呢?有很多种,归纳起来有

一:基于Http协议获取数据方法。二:基于SAOP协议获取数据方法,三:忘了——-

那么我们的这篇文章主要是将关于使用Http协议获取服务器端数据,这里我们采取的服务器端技术为java,框架为Struts2,或者可以有Servlet,又或者可直接从JSP页面中获取数据。

那么,接下来我们便开始这一路程:

首先:编写服务器端方法,我这里采用的MVC框架是Struts2,目的很单纯,就是为了以后做个完整的商业项目,技术配备为:android+SSH。当然,篇幅有限,我这里就直接用Strtus2而已。

服务器端:新建WebProject ,选择Java ee 5.0.

为了给项目添加Struts2的支持,我们必须导入Struts2的一些类库,如下即可(有些jar包是不必的,但是我们后来扩展可能是要使用到的,就先弄进去):

1: xwork-core-2.2.1.1.jar

2: struts2-core-2.2.1.1.jar

3: commons-logging-1.0.4.jar

4: freemarker-2.3.16.jar

5: ognl-3.0.jar

6: javassist-3.7.ga.jar

7:commons-ileupload.jar

8:commons-io.jar

9:json-lib-2.1-jdk15.jar  处理JSON格式数据要使用到

10:struts2-json-plugin-2.2.1.1.jar    基于struts2的json插件

以上的jar包,需要放在WebRoot/WEB-INF/lib目录下

然后在web.xml文件中敲下:

<!--?xml version="1.0" encoding="UTF-8"?-->

<!-- 定义Struts2的核心控制器:FilterDispatcher -->

<!-- 定义核心Filter的名称 -->
struts2
<!-- 定义Filter的实现类 -->
org.apache.struts2.dispatcher.FilterDispatcher
struts2
/*
index.jsp

然后编写struts.xml文件,并放在WebRoot/WEB-INF/lib目录下:如下代码:

<!--?xml version="1.0" encoding="UTF-8"?-->

<!-- setting encoding,DynamicMethod,language
<constant name="struts.custom.i18n.resources" value="messageResource"></constant>
-->

<!-- add package here extends="struts-default"-->

<!--需要将struts-default改为json-default-->

<!-- setting action -->

<!--返回值类型设置为json,不设置返回页面-->

配置好后,我们再根据标签内容来编写action。方法为method对应的login,类名为loginAction,

注意:包继承为:json-default ,输出结果类型为json
如下:

public class loginAction extends ActionSupport implements
ServletRequestAware,ServletResponseAware {
/**
*
*/
private static final long serialVersionUID = 1L;

HttpServletRequest request;
HttpServletResponse response;

public void setServletRequest(HttpServletRequest request) {
this.request=request;
}

public void setServletResponse(HttpServletResponse response) {
this.response=response;
}

public void login(){
try {
//HttpServletRequest request =ServletActionContext.getRequest();
// HttpServletResponse response=ServletActionContext.getResponse();
this.response.setContentType("text/html;charset=utf-8");
this.response.setCharacterEncoding("UTF-8");
if(this.request.getParameter("username").equals("123456")){
this.response.getWriter().write("真的很奇怪,日本人!");
}else if(this.request.getParameter("username").equals("zhd")){
this.response.getWriter().write("没有错,我就是东子哥!");
}else{
this.response.getWriter().write("我就是东子哥!");
}

//将要返回的实体对象进行json处理
// JSONObject json=JSONObject.fromObject(this.getUsername());
//输出格式如:{"id":1, "username":"zhangsan", "pwd":"123"}
// System.out.println(json);

// this.response.getWriter().write(json.toString());
/**
JSONObject json=new JSONObject();
json.put("login", "login");
response.setContentType("text/html;charset=utf-8");
System.out.println(json);
byte[] jsonBytes = json.toString().getBytes("utf-8");
response.setContentLength(jsonBytes.length);
response.getOutputStream().write(jsonBytes);
**/
/**
JSONObject json=new JSONObject();
json.put("login", "login");
byte[] jsonBytes = json.toString().getBytes("utf-8");
response.setContentType("text/html;charset=utf-8");
response.setContentLength(jsonBytes.length);
response.getOutputStream().write(jsonBytes);
response.getOutputStream().flush();
response.getOutputStream().close();
**/

} catch (Exception e) {
e.printStackTrace();
}
// return null;
}
}

运行查看下:http://localhost:8080/PDAServer/login.action?username=123456 当然你可以输入其他参数的URL

运行成功。

客户端:

这里需要注意的是模拟器把自己当成了localhost,以及127.0.0.1了,因此如果基于本地的web项目测试的话,必须修改IP为:10.0.2.2


public class MainActivity extends Activity {
/** Called when the activity is first created. */
//模拟器自己把自己当成localhost了,服务器应该为10.0.2.2
private static String url="http://10.0.2.2:8080/PDAServer/login.action";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
getPDAServerData(url);
}

/**
* 请求服务
* @param url
*/
private void getPDAServerData(String url){
url+="?username=123456";
HttpClient client=new DefaultHttpClient();
HttpPost request;
try {
request = new HttpPost(new URI(url));
HttpResponse response=client.execute(request);
//判断请求是否成功
if(response.getStatusLine().getStatusCode()==200){
HttpEntity entity=response.getEntity();
if(entity!=null){
String out=EntityUtils.toString(entity);
new AlertDialog.Builder(this).setMessage(out).create().show();
}
}

}catch (URISyntaxException e) {
e.printStackTrace();
}
catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

运行结果如下:

成功了吧:当然读者可以根据这个思路扩展下应用,比如:struts2+hibernate+spring+json。数据方面可以用json,也可以使用xml。android已经提供了JSON的API,struts2中也可以使用JSON插件.自己扩展吧。

[转载]众多Android 开源项目推荐

mikel阅读(1145)

[转载]众多Android 开源项目推荐,给力工作给力学习 – Terry_龙 – 博客园.

FBReaderJ
FBReaderJ用于Android平台的电子书阅读器,它支持多种电子书籍格式包括:oeb、ePub和fb2。此外还支持直接读取zip、tar和gzip等压缩文档。
bookinfo-rus.png

项目地址:http://www.fbreader.org/FBReaderJ/


Angle

Angle是一款专为Android平台设计的,适合快速开发的2D游戏引擎,基于OpenGL ES技术开发。该引擎全部用Java代码编写,并且可以根据自己的需要替换里面的实现。项目地址:http://code.google.com/p/angle/


android-shuffle

android-shuffle是一个GTD(Getting Things Done)个人备忘记事本。
3429748650_97b07951e5_o.png4299625001_01b6c3d1ef_o.png

Open GPS Tracker

GPSTracker 是一个能够使用Android地图记录你的驾车或旅行路线的项目,出发前打开软件选择开始记录,你所经过的路线就会实时显示在地图上,同时还会显示当前的 行驶速度。程序会按用户自己设置的标题自动存路线留做日后查看,也可以把路线分享给朋友。GPSTracker项目是一个Map方面的完整应用,包括两个 主要组成部分,第一部分是一个收集和存储GPS追踪数据的系统服务,第二部分是Map Activity控制跟踪数据并在地图上显示提供接口。GPSTracker项目用到了osmdroid项目的部分功能,其中OpenStreetMap 是一个可供自由编辑的世界地图,允许您查看,编辑或者使用世界各地的地理数据来帮助您。
media_track.png
satellite.png

Rokon

Rokon 是一个强大、可扩展、灵活的Android 2D游戏引擎,基于OpenGL ES技术开发,物理引擎为Box2D,因此能够实现一些较为复杂的物理效果,有人将它称为Cocos2d-iPhone引擎的Android版(因为业务 逻辑和编码风格上也确实很像)。
drop_block_ss1.png )。
drop_block_ss3.png项目地址:http://code.google.com/p/rokon/


LGame

LGame 是一款国人开发的Java游戏引擎,有Android及PC(J2SE)两个开发版本。其底 层绘图器LGrpaphics封装有J2SE以及J2ME提供的全部Graphics API(PC版采用Graphics2D封装,Android版采用Canvas模拟实现),所以能够将J2SE或J2ME开发经验直接套用其中,两版本 间主要代码能够相互移植。Android版内置有Admob接口,可以不必配置XML直接硬编码Admob广告信息。该引擎除了基本的音效、图形、物理、 精灵等常用组件以外,也内置有Ioc、xml、http等常用Java组件的封装,代价是jar体积较为庞大,PC版 已突破1.2MB,Android版有所简化也在500KB左右。此外,该引擎还内置有按照1:1实现的J2ME精灵类及相关组件,可以将绝大多数 J2ME游戏平移到Android或PC版中。
lgame_act.gif

OpenIntents

通 过”Intents”,Android给连接软件和动态替换组件提供了优秀的基础。Google定义了一批intents(如:打电话啊,联系人清单上选 择一个联系人,打开浏览器,电池更换的时候提供提示,等等,详细清单请看:available intents和intent class) 但是任何程序可以自由定义额外的intents和content-providers。我们可以很容易的联想到独立开发的程序(比如在这次的比赛中)极少 有可能会和新定义的intents和接口良好的一起工作。 我们这个项目的目标是收集很可能在多个项目中都有用的想法(而且很可能已经被其他独立程序员实现了),定义一批比较合理且扩展性比较好的一批 intents和接口,提供基础但稳定有效的实现,可以被其他Android程序所应用的,特别是其他参加比赛的程序员们。OpenIntents本身也 会参加这次的比赛。我们提供小的样品程序来演示OpenIntents的用法和特性。 因为我们专注于经常被使用到的那些intents,Google也很可能在不久的将来提供他们自己的标准intents(比如关于日历的。。。)当那个发 生的时候,我们会提供透明的接口来直接呼叫Google的实现方法,而你已有的程序可以直接使用Google的新功能而不需要改变任何东西。而且,由于你 的程序在设计初期就是已经支持intents的了,当Google的intents出来的时候,你可以很方便的直接他们的intents。还有可能的是 Google可能会借用一些OpenIntents开发的intents。无论如何,如果你的程序使用OpenIntents,在和其他使用 OpenIntents程序提供互相支持的同时,你会得到额外的附加值,从而全面增强用户体验。
openintents1.pngmainscreen2.png

android-bluetooth

非常官方Android Bluetooth API支持远程设备扫描、远程设备配对,服务发现(SDP)和客户端RFCOMM串行连接。项目地址:http://code.google.com/p/android-bluetooth/


Android apktool

Android apktool是一个用来处理APK文件的工具,可以对APK进行反编译生成程序的源代码和图片、XML配置、语言资源等文件,也可以添加新的功能到APK文件中。用该工具来汉化Android软件然后重新打包发布是相当简单的。

quake2android

quake2android是一个将《雷神之锤2》(Quake2)游戏移植到Android平台上的开源项目。支持谷歌Nexus One,三星Galaxy S,摩托罗拉Droid X等手机。
Quake2.jpg

AndEngine

AndEngine是一个开源的,基于OpenGL实现的Android 2D游戏引擎。这里提供一些基于AndEngine实现的示例。

android-opencv

android-opencv是一个将OpenCV移到Android手机平台的开源项目,该项目使用OpenCV最新的一个分枝并利用一个改良过的Android NDK进行构建。项目地址:http://code.google.com/p/android-opencv/


android-dalvik-vm-on-java

android- dalvik-vm-on-java该项目的目标是开发一个采用Java实现的Android Dalvik虚拟机。目的是为了学习Dalvik VM的思想和架构。当前支持Dalvik可执行文件格式(.dex),完整的Dalvik指令系统,J2ME CLDC API,多线程(包括同步阻塞,等待和通知)。项目地址:http://code.google.com/p/android-dalvik-vm-on-java/


Android PC_BCR

Android PC_BCR让你能够使用你的Android手机做为PC机的外围条形码扫描仪。扫描的条形码将通过WiFi网络连接传PC机中。这个开源项目由多个组件 组成,在手机设备上PC_BCR使用ZXing扫描仪器来扫描条形码,然后程序通过网络传到PC中,PC中有专门的PC_BCR程序接收。项目地址:http://code.google.com/p/android-pcbcr/


android-sms

android-sms能够将Android SMS短信备份到Gmail中的Android开源程序。项目地址:http://code.google.com/p/android-sms/


jPCT-AE

jPCT-AE是一个将jPCT移植至Android平台上3D图形引擎。
karga1.jpg项目地址:http://www.jpct.net/jpct-ae/


AndTweet

AndTweet是一个轻量级Twitter客户端,支持利用触摸和键盘进行快速操作。
3328108955_a142931f3f_o.png3236629233_b9396a131c.png

项目地址:http://code.google.com/p/andtweet/


android-smspopup

android-smspopup这个Android应用程序能够拦截收到的短消息并在一个弹出框中显示消息内容和联系人头像。此外还可以自定义LED颜色,振动模式,当第一次提醒显示没有看到时会重复提醒用户哪些信息没有看过。

项目地址:http://code.google.com/p/android-smspopup/


MyTracks

My Tracks能够记录你在户外活动的GPS轨迹并实时显示时间,速度,距离和海拔等信息。还可以将这些信息上传至Google Spreadsheets并在Google My Maps中显示。

项目地址:http://code.google.com/p/mytracks/


i-jetty

ijetty-screen2.jpg
i-jetty是一个将开源Web容器Jetty移植到Google Android手机平台上的开源项目。让你可以在手机上运行现有的Web应用。

项目地址:http://code.google.com/p/i-jetty/


webOdroid

webOdroid这个开源项目提供了一组完整的工具,能够根据现有网站创建一个Android应用程序。它提供的特性包括:

  • 一个功能齐全的RSS浏览器
  • 能够显示文章列表的ListView或GridView控件。
  • 提供易于定制的模板
  • 网站上执行远程搜索
  • 根据文章标题提供搜索建议
  • 异步下载和缓存RSS供稿和图片
  • 动态抽取和裁剪文章的图片
  • 通过一个专用的Joomla组件能够集成Joomla网站的搜索功能

项目地址:http://www.webodroid.com/


android-json-rpc

android-json-rpc是一个在android程序中使用的JSON-RPC客户端类库。它提供了一个简单的API来执行JSON-RPC服务调用。

项目地址:http://code.google.com/p/android-json-rpc/


BikeRoute

BikeRoute是一个Android应用程序提供基于GPS线路计划和定位功能。支持A到B路径规划,附近的单车停放处的位置,一步一步的指示,路线图,卫星导航等功能。
BikeRoute.jpgBikeRoute.jpg

Andorid PDF Viewer

Andorid PDF Viewer是一个运行在ANDROID手机上的PDF文件查看器。它是pdf-rendere:https://pdf-renderer.dev.java.net/的一个移植实现。

项目地址:http://andpdf.sourceforge.net/


Spring Android

Spring Android 是Spring框架的扩展,用于简化 Android 本地应用程序的开发。

项目地址:http://www.springsource.org/spring-android


AchartEngine

AChartEngine是一个针对Android程序开发的开源图表生成类库。支持以下几种图表类型:

  • 折线图
  • 区域图
  • 散点图
  • time chart
  • 柱状图
  • 饼状图
  • bubble chart
  • doughnut chart
  • range (high-low) bar chart

    项目地址:http://code.google.com/p/achartengine/


    Opencore

    Opencore是google联合packetvideo推出的多媒体开源框架,其中的h.264解码器在目前所有的开源h.264解码器中最好的,在win32和armv4上测试通过,性能好很多,大概提升20%!OpenCore的另外一个常用的称呼是PacketVideo,它是Android的多媒体核心。在防站的过程中,PacketVideo是一家 公司的 名称,而OpenCore是这套多媒体框架的软件层的名称。在Android的开发者中间,二者的含义基本相同。对比Android的其它程序 库,OpenCore的代码非常庞大,它是一个基于C++的实现,定义了全功能的操作系统移植层,各种基本的功能均被封装成类的形式,各层次之间的接口多 使用继承等方式。

    OpenCore是一个多媒体的框架,从宏观上来看,它主要包含了两大方面的内容:

    * PVPlayer:提供媒体播放器的功能,完成各种音频(Audio)、视频(Video)流的回放(Playback)功能
    * PVAuthor:提供媒体流记录的功能,完成各种音频(Audio)、视频(Video)流的以及静态图像捕获功能

    项目地址:http://www.opencore.net/


    Android Tools

    Android Tools是一个轻量级IDE用于创建、构建、安装和测试Android应用程序。可方便的通过点击访问Android的命令、目录和文件。它还提供一个内置的文本编辑器。Android Tools能够让学习和使用Android变得更加简便。
    AndroidToolsBasicTab.jpg

    项目地址:http://fieldbird.sourceforge.net/AndroidTools/


    android-binding

    android-binding这个开源项目提供了一个框架用于将android view widgets与数据模型相绑定。帮助您在android应用程序中实现MVC或MVVM模式。

    项目地址:http://code.google.com/p/android-binding/


    Robotium

    Robotium 是一个测试框架能够方便你为Android应用程序编写强大、健壮的自动黑盒测试用例。利用Robotium的支持,用例开发人员能够编写功能、系统和验 收测试方案Robotium支持Activities、Dialogs、Toasts、Menus和Context Menus。

    项目地址:http://code.google.com/p/robotium/


    QuiteSleep

    QuiteSleep是一个Android2.0+应用程序,可以设置免打扰时间段。这个时间段内,打进来的电话将会被阻止并通过SMS或E-Mail发送预定义好的信息给打电话者告知他你正忙或正在睡觉等。


    fanfoudroid

    安能饭否是一款开源的饭否Android客户端 。目前支持功能: 消息/私信收发,后台提醒,回复/转发/收藏,查看/关注用户,拍照/图片上传。即将支持功能: 关注管理,随便看看。
    5344789918_58acfe070b.jpg

    项目地址:http://code.google.com/p/fanfoudroid/


    Skylight1

    Skylight1是一个开源的Java手机应用程序开发框架和一些Android应用程序与示例。

    这个开源项目包含了以下子项目:

    • SkylightOpenGL – OpenGL wrapper DSL to the Java binding for OpenGL ES – JSR 239 for Android and Java ME
    • Skylight1 DI – 一个依赖注入框架
    • Skylight1 Mocks – 一组Android电话的模拟对象,包括回放。
    • Skylight1 Utils – 工具类如:FPS计数器,远程异常堆栈处理。
    • Skylight1 UI – 公共可定制UI类
    • Skylight1 XML – XML解析类。
    • Skylight1 Server – corresponding server side projects and utils
    • MarketConsoleScraper – Android Market console scraper contributed by Worksmart Labs
    • Skylight1 Demos – api and sample demos including:
      • Tanked, a 2D OpenGL demo
      • Barnstormer, a 3D OpenGL demo
      • Flick Test, a flick example showing borders of adjacent views
      • Skylight1 Wallpaper, a live wallpaper example featuring selectable backgrounds and a fingerprint.

    Current Android Applications:

    • Skylight1 TDC – a test data capture application for Android phones – available here for download
    • Skylight1 Game the initial app, a game for Android phones called “Balance the Beer” – available on the market.
    • NYC Events – an app that lists NYC Parks, Art and Music events. – available on the market
    • Toast – an app that helps you make a toast with your phone! – available on the market

    项目地址:http://code.google.com/p/skylight1/


    Android团队提供的示例项目
    如果不是从学习Android SDK中提供的那些样例代码开始,可能没有更好的方法来掌握在Android这个框架上开发。由Android的核心开发团队提供了15个优秀的示例项 目,包含了游戏、图像处理、时间显示、开始菜单快捷方式等。
    地址:http://code.google.com/p/apps-for-android/


    Remote Droid
    RemoteDroid是一个Android应用,能够让用户使用自己的无线网络使用无线键盘、触摸屏操作手机。这个项目为开发者提供了如网络连接、触 摸屏手指运动等很好的样例。
    地址:http://code.google.com/p/remotedroid/


    TorProxy和Shadow
    TorProxy应用实现了Android手机无线电电传通讯(TOR),和Shadow应用一起使用,可以使用手机匿名上网。从该项目源代码中,可以 掌握socket连接、管理cookie等方法。
    地址:http://www.cl.cam.ac.uk/research/dtg/code/svn/android-tor/


    Android SMSPopup
    SMSPopup可以截获短信内容显示在一个泡泡形状的窗口中。从这个项目中可以掌握到如何使用内置的短信SMS接口。
    地址:http://code.google.com/p/android-smspopup/


    Standup Timer
    Standup Timer应用用于控制站立会议时间,类似秒表倒计时,可以提醒每个人的讲话时间已到,从而保证每个与会者使用时间一样。从该项目的代码中,可以学会如何 使用时间函数。另外,这个项目的代码是采用视图view、模型model严格分离的设计思路。
    地址:http://github.com/jwood/standup-timer


    Foursquare
    是 Foursquare.com的一个客户端应用,该应用主要分为两个模块:API(com.joelapenna.foursquare)和界面前端 (com.joelapenna.foursquared)两部分。从该项目代码中,可以学会如何同步、多线程、HTTP连接等技术。
    地址:http://code.google.com/p/foursquared/


    Pedometer
    Pedometer应用用于记录你每天走路步[]数的。尽管记录不一定精准,但是从这个项目中,可以学习几个不同的技术:加速器交互、语音更新、后台运行服 务等。
    地址:http://code.google.com/p/pedometer/


    OpenSudoku-android
    OpenSudoku是一个简单的九宫格数独游戏。从代码中可以学习到如何在视图中显示表格数据,以及如何和一个网站交互等技术。
    地址:http://code.google.com/p/opensudoku-android


    ConnectBot
    ConnectBot是Android平台的一个客户端安全壳应用。从该项目代码中,可以学习到很多Android安全方面的内容,这些是你在开发应用 时经常需要考虑的安全问题。
    地址:http://code.google.com/p/connectbot/


    WordPress的Android应用
    当然在最后不能不提Wordpress的Android应用了,这是Wordpress官方开发团队提供的一个项目。从代码中可以学习到XMLRPC调 用(当然还有更多的优秀内容)。
    地址:http://android.svn.wordpress.org/trunk/


    Jamendo

    Jamendo在线音乐播放器是一款android平台在开源的在线音乐播放,该播放器的主要特色如下:

    1. 界面美观,在jamendo播放器中精美的布局的随处可见,大量使用自定义控件和Adapter进行布局,这点可供初学者好好探讨研究

    2. 构架清晰

    3. 在代码中大量使用全局缓冲机制,如全局Application缓冲,图片缓冲等等。。

    4. 数据传递使用JSON方式,网络传输(Apache Http 4.0)。。。

    5. 全局的MediaService,并且伴有NotifyManager等进行通知

    部分截图如下:

    主界面:

    MusicSearch界面

    Music 播放界面,从图中可以看出,播放界面做的很美观

    播放界面下方用到了SlidingDrawer

    RadioSearch 界面

    Jamendo 官方网站:http://www.jamendo.com/en/

    分享的内容依次是:

    1.分析Music搜索实现,主要是网络和JSON传输

    2.分析全局Application缓存实现方法

    3.分析Download模块

    4.分析Adapter使用

    5.分析全局Service构成

    6.分析自定义Widet,代码中大量使用自定义布局,对新手学习布局很有帮助

    7.分析整体结构

    学习Android 或者做Android 项目的可以参考这些。

    [原创]ASP.NET MVC对Img标签空src的解析重复定向问题

    mikel阅读(978)

    偶然一次单步调试当前网站项目,发现一个问题,页面总是刷新两次,于是首先怀疑是不是JavaScript有刷新重定向的代码,结果没有,于是抽丝剥茧一步步的注释掉可以的标签和代码,结果锁定在如下代码:

    <div class="pic"><img src="&lt;%=LifePic.url%&gt;" alt="&lt;%=LifePic.InfoTitle%&gt;" width="94" height="94" /></div>
    

    于是,查看ASP.NET MVC的生成页面的源码,发现img标签的src的值为空“”,则重定向一次action,导致两次解析action,结果给定一个src的值,代码改为:

    <div class="pic"><img src="../../Content/home/images/logo.jpg" alt="&lt;%=LifePic.InfoTitle%&gt;" width="94" height="94" /></div>
    

    不再重定向一次controller的action,问题原因可能是ViewEngine解析页面的时候默认src=“”的重新解析为/

    [转载]Android学习系列(4)--App自适应draw9patch不失真背景

    mikel阅读(891)

    [转载]Android学习系列(4)–App自适应draw9patch不失真背景 – 谦虚的天下 – 博客园.

    做人要大度,海纳百川,做事要圆滑,左右逢源,这让我想到了编程也是如此,代码要扩展,界面也要考虑自适应。
    这篇文章是Android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用。

    1.背景自适应且不失真问题的存在
    制作自适应背景图片是UI开发的一个广泛问题,也是界面设计师渴望解决的问题,我相信我们彼此都深有体会。
    比如,列表的背景图一定,但是列表的高度随着列表数据项会发生变化;标题栏的背景,无论横屏还是竖屏,高分辨率还是低分辨率,都能自动填充满,而且不失真等等背景问题。
    根据以往的经验,我们一般采用先切图后拼凑的做法,这种做法本来我想在这里和大家介绍一下,其实有的时候还是很有用的,但是说起来会比较麻烦,就不说这个非重点了,略去,如果大家真的要介绍,在回复中说明,我再考虑一下。
    Android针对这种情况,专门制作了一种.9.PNG格式来解决这个问题。

    2.9.PNG格式。
    我不想在这里过多的讨论PNG格式的定义问题。但是.9.PNG确实是标准的PNG格式,只是在最外面一圈额外增加1px的边框,这个1px的边框就是 用来定义图片中可扩展的和静态不变的区域。特别说明,left和top边框中交叉部分是可拉伸部分,未选中部分是静态区域部分。right和bottom 边框中交叉部分则是内容部分(变相的相当于定义看一个内边距,神似padding功能,后面我会单独介绍一下),这个参数是可选的, 如下图。
    在Android中以9.PNG格式的图片未背景,则能够自定义拉伸而不失真,比如系统的Button就是一个典型的例子。
    其实呢,无论是left和top,还是right和bottom都是把图片分成9块 (边角四块是不能缩放的,其他的四块则是允许缩放的),所以叫做9.PNG。

    3. 使用Draw9Patch.jar制作9.PNG图片之定义拉伸区域。
    前面已经了解到9.PNG格式的工作方式,下面我们使用谷歌提供的Draw9Patch(运行android-sdk-windows\tools目录下的Draw9Patch.bat)来制作.9.PNG图片。
    第一步:准备要拉伸的图片。

    非常小的一张图片,我希望以此为背景,中间部分填充文章内容。
    第二步:制作.9.PNG图片
    打开Draw9Patch,把图片拖进去,如下:

    默认的拉伸是整体拉伸,其实边框部分我们并不想拉伸,好,我们自己来定义拉伸区域,如下图:

    然后点击File,导出为content.9.png。
    第三步:在layout文件中使用制作的 .9.PNG图片.
    新建工程Draw9Patch,默认主Activity为Draw9PatchActivity.java:

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    }
    

    我们把content.9.png文件拷贝到/res/drawable文件夹下,打开/res/layout目录下的main.xml,申明如下:

    <!--?xml version="1.0" encoding="utf-8"?-->
    

    如图,

    我们修改text,

    <!--?xml version="1.0" encoding="utf-8"?-->
    

    如图,

    可以看出,边框非常的清晰。下图是未使用.9.PNG的对比图,而且也不是我们要的效果:

    到这里为止,我们已经基本会制作.9.PNG图片了。为了知识体系的全面性和深入性,我们继续。

    4.使用Draw9Patch.jar制作9.PNG图片之定义内容区域。
    是不是觉得文字和边距挨的太近,好,我们使用right和bottom边的线来定义内容区域,来达到增大内边距的目的。

    我们定义了一个很小的内容区域,其他的地方则自动充当边框,从而使内边距显的很大,如下图,

    在这里,我要特别说明,一开始为了增大内边距,很容易惯性思维,在<TextView>中申明 android:padding=”10dip” 之类的,我在这里劝告朋友们不要这么做,一是你将无法预知你的显示,二是这比较混淆,因为设置内容区域就是确定padding,所以我在前面部分说他们是 神似。我个人认为通过内容区域设定padding比在布局xml中定义padding更优雅,更简洁!
    关于Draw9Patch工具的其他使用说明,我在次不再累述,因为要说的话太多,为了节省篇幅,请参考官方文档。

    5.制作.9.PNG的高级技巧。
    对于初学Draw9Patch的人来说,这可以算是高级技巧,那就是:拉伸区域,可以不是连续的,可以不止一块,而且是和自定义的边框线的长度成正比。
    直接上图说明:

    6.SDK中如何处理9.PNG图片。
    SDK专门针对9.PNG做了定义和处理,这里我们只是做个简单的流程分析,Bitmap在读取图像流数据的时候,会把判断图片的 NinePatchChunk(9Patch数据块),如果NinePatchChunk不为空,则是 NinePatchDrawable,NinePatchDrawable则又会交给NinePatch处理:

    setNinePatchState(new NinePatchState(
    new NinePatch(bitmap, bitmap.getNinePatchChunk(), "XML 9-patch"),
    padding, dither), r);
    

    NinePatch检验成功则调用本地方法,绘制出最终的图片:

    nativeDraw(canvas.mNativeCanvas, location,
    mBitmap.ni(), mChunk, paint != null ? paint.mNativePaint : 0,
    canvas.mDensity, mBitmap.mDensity);
    

    7.android系统中大量应用了9.PNG图片。
    通过解压随便一个rom,找到里面的framework_res.apk,里面有大量的9.PNG格式文件,被广泛的应用起来,比如常见的有:
    按钮:
    解锁:
    下拉框:
    标题栏:
    Toast:
    还有搜索,键盘,放大缩小控件,时间加减等等,我就不一一列举。

    8.最后送上一些图例,以飨读者,以做后鉴:

    赏图1 本人之作

    赏图2 下拉按钮

    赏图3 文章头部背景

    赏图4 系统头部背景

    赏图5 再来一个头部背景
    谢谢大家的支持。

    [转载]iPhone中预览文档的三种方式

    mikel阅读(888)

    [转载]iPhone中预览文档的三种方式 – 用自己的语言写个Hello World – 博客园.

    在iPhone中可以很方便的预览文档文件,如:pdf、word等等,这篇文章将以PDF为例。介绍三种预览PDF的方式,又分别从本地pdf文档和网络上的pdf文档进行对比。

    预览本地PDF文档:

    1、使用UIWebView控件

    UIWebView是iPhone开发中最常用的控件之一,类似.net中的webBrowser控件。使用它预览PDF文件相当的方便和简单。

    在UIWebView中预览PDF文档的关键代码如下:

    效果:

    2、使用CLPreviewController

    CLPreviewController是比较新的一个功能,它能快速预览文档,可以一边加载一边预览,也就是说不需要将文档全部加载到内存中。

    使用CLPreviewController预览pdf文件,需要实现一个委托:QLPreviewControllerDataSource。关键代码如下:

    其中prevoewController返回预览文件的地址。

    这种方式不仅快,而且还提供了一个在iphone中打印文档的功能,如下图。

    3、绘制pdf文档

    apple有个官方的例子是绘制pdf的。这种方式可以很方便的控制pdf的展现细节,但是效率不高。

    预览网络上的PDF文档:

    1、使用UIWebView去预览网络上的PDF文档,先是将要预览的文档下载iPhone内存中,然后预览,对很大的pdf文档,效率不高,用户体验也不好。

    2、对于使用prevoewController,因为它是分步加载的,不会一次性加载所有的pdf文档,用户体验还不错,但是在4.0中多出了一个打印按钮,一点击这个打印按钮,程序就挂了,真是杯具。

    3、绘制的方式也是需要一次性加载到内存,绘制效率不高,对于大文档,不应当使用这种方式。

    网络大文档预览的解决方案:对于网络上的pdf文档,比如:电子书(一些电子书是比较大的),建议先下载到本地,然后使用第二种方式去预览。

    总结:本文介绍了三种预览pdf文档的方式,对于非pdf文档也是类似。由于本人接触iPhone开发不长,写的不对的地方,欢迎大家指正。

    本文代码:http://files.cnblogs.com/zhuqil/PDFView.zip