[转载]Android-opencv之CVCamera

mikel阅读(866)

[转载]Android-opencv之CVCamera – hellogv的专栏 – CSDN博客.

本文来自http://blog.csdn.net/hellogv/ ,引用必须注明出处!

Android-opencv是opencv在Android手机上的移植版,而CVCamera是这个移植版的一个sample。本文主要介绍android-opencv的安装和使用。

  • android-opencv的安装

opencv基于C++,因此android-opencv也必须依赖NDK(android-ndk-r4-crystax)来编译。PS:关于android-ndk-r4-crystax和CYGWIN的安装和使用,本文不再唠叨,详见http://blog.csdn.net/hellogv/archive/2010/12/23/6094127.aspx

安装步骤具体如下:

  1. 确保在系统Path中包含了D:\cygwin\bin;D:\cygwin\android-ndk-r4-crystax;(存放目录自己决定,Path中必须包含cygwin的bin和android-ndk-r4-crystax的路径)
  2. 再拷贝android-ndk-r4-crystax到\cygwin\home\GV\android-ndk-r4-crystax,编译android-opencv时需要,编译成功之后可以删除这份拷贝。
  3. 运行cygwin,来到opencv目录下,输入sh build.sh进行编译,编译成功的话会在\opencv\android\libs\生成armeabi和armeabi-v7a两个文件夹,里面都包含libandroid-opencv.so。

PS:编译的时候提示缺少文件的话,从网上搜索下载。

  • android-opencv的使用
  1. 打开eclipse ,Import Opencv这个工程,工程位于\opencv\android\ 。PS:如果也提示缺少文件,也需要从网上搜索下载
  2. Opencv这个工程编译通过之后,就可以Export它,选择JAVA的JAR file,导出时去掉[obj]和[libs]这两个文件夹,AndroidManifest.xml和default.properties,输出文件名为Opencv.jar,Export设置如下图:
  3. 下载swigwin-1.3.39,在系统path中加入D:\cygwin\swigwin-1.3.39(存放位置自定),重启
  4. 打开cygwin,去到\samples\CVCamera\,输入sh build.sh,开始编译CVCamera的JNI,成功编译之后会生成libcvcamera.so
  5. 把 \opencv\android\libs 复制到\samples\CVCamera\,因为CVCamera同时需要libandroid-opencv.so和libcvcamera.so
  6. Import CVCamera这个工程,加入Opencv.jar 这个Libraries
  7. 编译CVCamera这个工程,生成CVCamera.apk(有6.06MB大小)

CVCamera程序运行截图如下:

[转载]android系统中使用ksoap2-android客户端库操作Asp.net WebService

mikel阅读(778)

[转载]android系统中使用ksoap2-android客户端库操作Asp.net WebService – 网络渔夫 – 博客园.

在java中使用的PC版WebService客户端库非常丰富,例如,Axis2、CXF等,但这些开发包对于Android来说过于庞大,也未必很容 易移植到Android上。适合手机的WebService客户端SDK也有一些。本例使用了比较常用的KSOAP2。读者可以从如下的地址下载 Android版的KSOAP2。

http://code.google.com/p/ksoap2-android/wiki/HowToUse?tm=2

将下载下来的包引用到android项目后就可以使用了,在引用jar包后可能会抛出警告”warning: Ignoring InnerClasses attribute for an anonymous inner class that doesn’t come with an associated EnclosingMethod attribute. (This class was probably produced by a broken compiler.)”,在网上搜索了一下,这可能是因为版本的问题,但是不影响使用。好了废话不多说,直接上代码。

服务器端的webservice文件Demo.asmx

<%@ WebService Language="C#" Class="Demo" %>

using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
//若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
// [System.Web.Script.Services.ScriptService]
public class Demo  : System.Web.Services.WebService {
[WebMethod]
public string HelloWorld() {
return "Hello World";
}

[WebMethod]
public string Add(int x, int y) {
int z = x + y;
return z.ToString();
}
}

下面就是我测试用的手机端的代码了,首先来看我们的xml布局文件 demo.xml

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

Demo.java,在下面的代码中,如果你的WebService方法没有参数,可以把step2省略掉。

package com.studio.basf.android;

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class Demo extends Activity {
private String NameSpace = "http://tempuri.org/";
private String MethodName = "Add";
private String url = "http://192.168.1.93/services/Demo.asmx";
private String soapAction = NameSpace + MethodName;
private TextView tv;

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.demo);

tv = (TextView) findViewById(R.id.tv);
tv.setText(ws());
}

public String ws() {
String result = "";
try {
//step1 指定WebService的命名空间和调用的方法名
SoapObject request = new SoapObject(NameSpace, MethodName);

//step2 设置调用方法的参数值,这里的参数名称不一定和WebService一致
request.addProperty("x", 5);
request.addProperty("y", 6);

//step3 生成调用WebService方法的SOAP请求信息,并指定SOAP的版本
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
//设置是否调用的是dotNet下的WebService
envelope.dotNet = true;
//必须,等价于envelope.bodyOut = request;
envelope.setOutputSoapObject(request);

//step4 创建HttpTransportSE对象
HttpTransportSE ht = new HttpTransportSE(url);
//step5 调用WebService
ht.call(soapAction, envelope);

//step6 使用getResponse方法获得WebService方法的返回结果
if(envelope.getResponse()!=null){
SoapPrimitive response = (SoapPrimitive) envelope.getResponse();
result = response.toString();
}

} catch (Exception e) {
result = e.getMessage();
}
return result;
}
}

运行结果如下

[转载]移动互联网开源三国演义LBS (二)游戏策划案

mikel阅读(780)

[转载]【移动互联网开源】三国演义LBS (二)游戏策划案 – 美丽人生 – 博客园.

前言

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

本随笔包含了游戏策划案总案(明细案将在讨论群内发放)、界面设计案。文档在本文末尾可以下载。

所有文档我都写的很认真辛苦,所以各位一定要捧场哈!

下期将开放客户端源代码下载,请朋友们关注,谢谢!

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

三国演义LBS 游戏策划总案

———————————————

一、 游戏概述

1.1 游戏背景

东汉末年黄巾之乱,民不聊生,在这个时代,需要一群有志之士能够带领苦难的百姓逃离苦海。玩家作为一名普通的村民,通过参加起义军,与黄巾贼战斗、 与乱军贼党战斗、与强大的敌国军队战斗,过程中不断壮大,最终成为“吴国、蜀国、魏国”一国中的一员猛将,目睹三国鼎立的盛况。

1.2 游戏成长主线

游戏主线围绕着用户内城发展与战斗过关卡两部分展开。

1) 用户通过内城建设、武将招募与训练、资源占领、招兵买马、科技研究、贸易、装备升级不断壮大实力;

2) 用户通过参与固定关卡战斗(PVE)、同国籍用户之间资源抢夺与征服(PVP)、异国籍用户之间PK(PVP)、用户组团攻打关卡战斗(RVE)、军团战与地区战(RVR),不断成长,最终成为三国中的一名猛将,实现三国鼎立的壮举。

1.3 游戏玩点规划:
游戏玩点 玩点说明 等级规划
装备提升 提高武将战斗力 1-100
武将培训 提升等级、战斗力 1-100
游戏任务 主线任务、每日任务,获取奖励 1-100
关卡战斗 获取军魂与装备,获取锦旗快速提升武将等级 1-100
科技研发 提升资源、战斗力 10-100
军团 提升内城资源生产力、参与军团战 10-100
农田、银矿争夺 获取粮食、银币资源 10-100
同国俘虏战斗 获取银币收入贡献 30-100
异国PK战斗 获取大量声望 30-100
用户贸易 获取大量银币 40-100
军团战斗 获取资源点,额外资源 40-100(军团等级10-99
战役系统 强调实时性,要求在一定时间内攻击一定位置的关卡。获取资源与特殊武器原料 40~100
地区战斗 获取地区占有度,影响贸易 60-100
市场交易 出售商品 80-100

1.4 用户游戏成长规划:

用户等级 游戏时长/ 概述 游戏玩点规划
1-10 1

l 熟悉游戏背景、基本操作

l 掌握游戏发展方法与方向

l 单人游戏为主,群体之间短信息交互为辅。

l 将领训练、升级

l 武器购买、强化

l 过关卡获取奖励(PVE

l 过关卡获取武将(PVE

11-20 2

l 三国概念、地区观念形成,了解到整个游戏版图。

l 出现人人之间的交互,体会到竞争与合作。

l 出现资源消耗的概念,了解到银币、粮食的稀缺性。

l 出现科技研发概念,体会到内城建设发展的重要。

l 出现声望概念,了解到游戏最重要的属性是声望

l 银矿、良田的占领(PVP

l 军团关卡(RVE

l 科技研发

l 内城巡视

l 军团

l 声望与头衔

21-40 30~60

l 融入游戏主线情节发展,体会到游戏乐趣

l 感受到游戏装备的乐趣

l 感受到武将技能的乐趣

l 出现区域迁移概念,开始感知区域经济体系与异国之间的矛盾关系

l 区域低向高迁移

l 同国征服战斗

l 异国攻击战斗

l 装备合成与装备属性

41~60 60~120

l 出现市场系统,开始进行区域贸易。

l 出现军团资源与军团战

l 通商

l 区域平级迁移

l 军团战(RVR

61~80 60~120

l 出现地区战、地区繁荣度、地区物价指数

l 出现装备交易

l 区域战(RVR

l 资源消耗达到最大

80~100 30~60

l 游戏主线剧情发展到高潮

l 多场著名关卡战斗出现(赤壁等)

l 最终实现三国鼎立。

l 开放最高级别区域

l 开放双训练场

l 开放双农田、银矿占领

l 三国鼎立,游戏结束

游戏时长:180~360天
游戏注册人数预计:1000万人
1.5 游戏战斗设计概述

战斗是本游戏的核心玩点,战斗包括了PVE、PVP、RVE、RVR四种形式。

1) PVE战斗

主要表现为地图普通关卡、精英关卡、将领关卡、无人占领的良田与银矿。属于单人游戏形式玩法。玩家可以选择任意时间攻打关卡,关卡有攻打次数限制。战斗奖励为军魂、装备、武将。

2) PVP战斗

主要表现为有人占领的良田银矿抢夺、同国籍用户征服、异国籍用户攻击。玩家可以选择任意时间进行PVP战斗,无需人人交互。战斗奖励为声望。

3) RVE战斗与RVR战斗

主要表现为军团战关卡、无人占领的军团资源点争夺。发动RVE战斗必须进过战斗准备、战斗进行、战斗结束三个步骤,属于中小型战斗。

战斗准备时间根据RVE类型从30分钟~3个小时不等,在战斗准备时间,需要玩家之间协商战斗发起时间、队伍人数、战斗位置等。
战斗进行中,需要根据战斗提示进行简单的协作与策略调配。
战斗结束,所有用户获取军魂、装备、锦旗。
4) 战斗表现

战斗过程中以一对一的形式表现,普通战斗过程以文字描述;特殊战斗效果以图片表现。

三国演义LBS 界面设计总案

———————————————

首页

玩家基本数据信息

等级 金币 银币 军令
粮草 兵力 军魂 声望

玩家所处的区域图片信息,图片包含:

l 显示地理位置对应当前地区(sectionserialcode

l 显示地区类型(sectiontypecode

l 显示地图繁荣度(scaletypecode

l 使用合成技术生成,canvas

玩家所处区域周边信息

l 点击区域图片,切换至周边信息。

l 包含上下、左右周边地区名称。

l 包含玩家当前所处的位置。(圆点表示)

l 区域类型通过颜色区分。

游戏主功能入口

主城 将领训练

如果不属于自己区域,则不显示

征战 普通:准备打的地图名

RVE:关卡名、战斗准备时间

军团 普通:军团名 军团职位
地区 普通:当前地区名称
世界 普通:所属地区名称

RVR:攻击点、战斗准备时间

其余界面设计图请查看附件文档。

附件下载

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

002 三国演义LBS 游戏策划总案.doc

http://www.boxcn.net/shared/zibny84dm9

200.三国演义LBS 界面设计案 总案 v2.doc

http://www.boxcn.net/shared/c8zlja89g3

102 三国志LBS策划案 角色.doc
103.三国志LBS策划案 内城.doc
104.三国志LBS策划案 将领.doc
105.三国演义LBS策划案 装备.doc
107.三国志LBS策划案 军团.doc
108.三国演义LBS策划案 社会化系统.doc
110 三国演义LBS策划案 任务系统.doc
113.三国演义LBS策划案 RVE系统.doc
114.三国演义LBS策划案 PVE系统.doc
115.三国演义LBS策划案 RVR系统.doc

116.三国演义LBS策划案 数值系统.doc

http://qun.qq.com/air/#95755843/share

[转载]简单实现编写自己的jQuery插件

mikel阅读(1043)

[转载]简单实现编写自己的jQuery插件 – 浅水鱼 – 博客园.

用了这长时间的JQuery,一直也没怎么写过JQuery插件,今天简单实现俩个插件,已巩固下基础知识。

这里只阐述如何编写自己的插件,至于要实现什么功能,要因人而异了…好了,下面开始…

jQuery插件主要分为三种

1、封装对象方法的插件

2、封装全局函数的插件

3、扩展选择器的插件

这里只编写前俩种,即比较常见的..

大多数插件都是已这种形式编写的:

(function ($) {

/*  这里放置代码 */

})(jQuery);

这样的好处是函数内部依然可以使用$作为jQuery的别名,而不影响到其他库使用$

jQuery提供了俩个扩展用于编写插件

$.fn.extend({});用于扩展第一种

$.extend({});用于扩展第二种

以下为实现效果截图和代码


<!--

li  { border: 1px solid #000; cursor: pointer; width: 200px; display: block; }

-->

<script src="../Scripts/jquery-1.4.1.min.js" type="text/javascript"></script> <script type="text/javascript">// <!&#91;CDATA&#91;
        (function ($) {      

    $.fn.extend({    

      "chgSC": function (options) {               

            options = $.extend({ FontSize: "100px", Color: "red" }, options);   //这里用了$.extend方法,扩展一个对象

                           return this.hover(function () {   //return为了保持jQuery的链式操作

                   $(this).css({ "fontSize": options.FontSize, "color": options.Color });

            }, function () {               

                              $(this).css({ "fontSize": "", "color": "" });  

            });               

                          }           

                });

            $.extend({  

        "urlParam": function () {                 

            var pageUrl = location.search;               

                if (pageUrl != "")     

                             return pageUrl.slice(1);         

                    else                     

                         return "没有参数";  

            }  

        });

        })(jQuery);

        $(function () {           

    $("li").chgSC({ FontSize: "130px" });     

         alert($.urlParam());     

        });
// &#93;&#93;></script>
<ul>
	<li>1</li>
	<li>2</li>
	<li>3</li>
	<li>4</li>
	<li>5</li>
</ul>

[转载]11值得关注的TechStars初创企业

mikel阅读(1775)

[转载]SocialBeta » Blog Archive » 11值得关注的TechStars初创企业—-社会化媒体|社会化媒体营销|社会化设计|社区型网站运营|社会化媒体相关资源分享|We dream of being a Mashable in China..

在孵化器TechStars近日组织的活动中,有不少优秀的初创企业亮相,下面的这11家就是从600多个申请者中脱颖而出的,不少有着很酷的创意

Nestio:减少找公寓的烦恼

Nestio is eliminating apartment search headaches

创始人:
Caren Maio – CEO, Mike O’Toole – CTO, Matt Raoul – COO

目标:
Nestio想在一个清爽有序的界面上帮你摆脱寻找公寓的烦恼

实现方法:
每年有4000万纽约人寻找住所,为此要花费16亿小时:包括把收集打印资料、频繁的与室友和中介机构联系、翻看Craigslist上众多的帖子。

Nestio通过让用户简便地记录房屋信息来简化这个流程。在“对比图”应用中,用户可以同时比较多个房源的信息。其移动应用允许用户在任何地方拍 摄图片、记录下房屋信息并上传至平台。另外,合住的室友也可以添加到用户的Nestio账户中,他们可以看到房屋信息并加以评论。

ThinkNear:利用优惠券帮商家在淡季吸引顾客

ThinkNear drives customers to local merchants when business is slow by blasting people nearby with coupons

创始人:
Eli Portnoy – CEO, John Hinnegan – CTO

目标:
生意总有忙时与闲时之分,ThinkNear 希望通过优惠券让商家在生意不那么景气的时间段获得更多消费者。

实现方法:
ThinkNear的API能捕捉到商户生意繁忙和不景气的时间信息,然后与天气、交通等宏观信息结合,从而指出什么样的优惠券能最有效的将顾客吸引到商家来,并随后发送手机优惠券。自从2周前开放API之后,已经有了25个基于其开发的应用。

Immersive:将《少数派报告》带入现实

Immersive brings Minority Report to life by using facial recognition technology to make OOH ads relevant

创始人:
Jason Sosa, Alessio Signorini, and Christopher Piekarski

目标:
在2002年的科幻片《少数派报告》中,片中汤姆克鲁斯路经一排数字标牌,标牌扫描了一下他的视网膜就展出了他可能喜欢产品的全息图。而Immersive利用人脸识别技术,展示了一个男人在看向一副卫生巾的数字广告牌时,广告牌自动更换至百威淡啤的场景。

实现方法:
Immersive的人脸识别技术可以判断出广告观众的年龄区间和性别,然后计算出并展示最有效的广告。Immersive也能够知道顾客看广告的时间,然后把时间值和人口统计资料发送给广告主。

“数字标牌和户外广告是35亿美金的生意,”Sosa说,这是仅次于互联网广告的增长最快的广告机会。到2016年,户外广告预计将达到60亿美元。.

而这家公司可以将整个行业中的浪费降至最低。Sosa说这项技术已经被商家试用,而顾客花在观看数字广告上的时间增加了60%。

Friendslist:协助你帮助你的朋友

Friendslist creates social listings. It puts

创始人:
Jonathan Wegener,Benny Wong

目标/实现方法:
你可能知道哪些朋友需要室友,哪些朋友正在找房子。做中间人将双方连接起来并不是件轻松的事。

Friendslist希望移除中间人的角色,通过朋友关系创建分类广告的社交网络。

OnSwipe:帮内容出版商甩掉App

OnSwipe makes publishers' content attractive across all mobile platforms without creating multiple=

创始人:
Jason Baptiste,Andres Barreto

目标:
“App是垃圾”, Baptiste 说,“昂贵,而且在iPad, iPhones, Android系统上是割裂的。”而App的唯一优点是漂亮的设计。OnSwipe 希望能够“帮助任何内容出版商在不制作App的情况下,高度美化其网页在移动设备上的展示”。

实现方法: 创建OnSwipe账户需要不到5分钟,之后用户连接到类似于wordpress或更加定制化的内容管理系统中,并会看到数以千计的设计方案。出版商仅仅需要复制粘贴网址,选择设计方案,一切就做好了。

在体验OnSwipe所制作出的网页时,用户可以随意点击分享或者保存正在阅读的文章,也能看到朋友们正在读什么。OnSwipe相信这将是一个巨 大的市场,“我们位于两种巨大的变革中”, Baptiste说,“从印刷到数字,从点击到触摸设备。我们有机会改写游戏规则。”

CrowdTwist:找出公司忠实用户并奖励他们

CrowdTwist shows companies who their loyal users are and rewards them for promoting companies

创始人:
Irving Fain, Mike Montero, Josh Bowen

目标:
大多数公司都不清楚他们的忠实用户是谁。CrowdTwist帮助这些公司找到并奖励他们,通过社交网络提升品牌。

实现方法:
CrowdTwist 白标平台为用户提供一系列在各种社交网络上赚取积分的方法。它同时提供对每次社交交互的分析统计,从用户参与度到人口统计学,以便客户分析活动效果。演出公司Live Nation在使用了该服务后,用户参与度提升了900%,票务收入提高了一倍。

Migration Box :帮所有人迁移到云端

Migration Box wants to help everyone move to the cloud

创始人:
Eduardo Fernandez,Carlos Cabanero

目标/实现方法:
Migration Box帮助人们把电子邮件、联系人信息、文档、约会记录等一切东西迁移到云端。据Fernandez说,目前只有5%的网民将有价值的信息放在了云端,而 截至2014年,这个数据将达到70%。Migration Box 是一个平台,用户可以使用多种服务将信息无缝的、轻松的放在云端。

ToVieFor:为设计师品牌组织拍卖

ToVieFor holds auctions for designer brands so users can bid on prices

创始人:
Melanie Moore,Eric Jennings

目标:
大多数商品最终给都将被甩卖,有时候它们会被估值过低,以至于顾客感觉自己是在抢劫。这种情况下,其实顾客可以接受更高的价格,但商家无法知道这一点。ToVieFor希望能够通过拍卖使商品的售价和实际价值和出售价格更加接近。

实现方法:
“在这里,女人买到包只需两步,”Melanie Moore说,“决定参与拍卖后,立刻就可以出价,如果成为出价最高者,就可以赢得商品。”Moore说在 ToVieFor上,零售商获得的毛利率会比传统的网上甩货方式高出50-55%。

上线10天以来,ToVieFor拥有5000个用户,15000美金收入,51%的毛利率。要知道时尚电子商务是个300亿美金的大市场,甚至比整个在线广告市场都要大。

Red Rover:为大公司提供p2p学习平台

Red Rover helps large companies eliminate wasted time by providing a peer-to-peer learning platform

创始人:
Kevin Prentiss, Tom Krieglstein,Dan Storms

目标:
Red Rover为企业提供p2p学习平台,减少时间的浪费

实现方法:
雇员为公司创造价值同时也是公司最大的成本之一。他们在试图自己克服困难时,会浪费许多时间。而一个有经验的人会帮他们迅速的解决问题。但是在许多大公司里,不是所有雇员都能认识并了解对方。

Red Rover可以导入LinkedIn、Twitter等社交网络中的信息,将公司中的每个雇员统计进在线目录中,帮助彼此不熟悉的雇员进行更多的专业交流。

Shelby.tv:基于朋友推荐的个性定制化频道

Shelby.tv creates customized video channels based on friends' recommendations

创始人:
Reece Pacheco, Dan Spinosa, Henry Sztul ,Joe Yevoli

目标:
Shelby.tv 能收集你朋友在社交网络上的视频分享链接,并将其转化为一个定制化的频道。实现方法: 每天上百万个在线视频被观看,人们观看视频的地方也很多,例如不同朋友的推荐会将你带向YouTube, Facebook等网站。而利用Shelby.tv,你不再需要打开不同的视频播放网站,就能了解朋友的所有推荐。Shelby.tv上的视频也能进行进 一步的社交分享。 到目前为止,Shelby.tv的每个用户每天会在网站上花上15分钟。

Veri:在线游戏竞赛,使学习变得有趣

Veri wants to take all of the world's content and turn it into an online trivia game.

创始人:
Lee Hoffman, Brian Tobal, Angela Kim

目标:
Veri 希望能通过用户获取世界上所有内容,将其转化为在线游戏竞赛

实现方法:

“不是我们建立Veri,是用户”,Hoffman说,“他们创建问题,提交链接,想出答案。”用户可以将其问题分享到社交网络上,大家共同竞争以 在网站上获得更高排名。当用户答对问题时,他们的总排名将会上升。如果答错了,用户将来到“学习时间”,阅读到相关的文章或观看视频。Veri使得学习变 得更富竞争性、更有趣、更有吸引力。用户在该网站上的平均浏览时间为超过27分钟。

本文链接:http://www.socialbeta.cn/articles/the-11-promising-techstar-startups.html
原文链接http://www.businessinsider.com/the-11-promising-techstar-startups-that-beat-out-600-other-applicants-2011-4#nestio-is-eliminating-apartment-search-headaches-1
译者:@符星辰

转载请保留以上信息和链接,违者必究。

[转载] 12个值得关注的LBS营销案例

mikel阅读(1542)

[转载]SocialBeta » Blog Archive » 12个值得关注的LBS营销案例—-社会化媒体|社会化媒体营销|社会化设计|社区型网站运营|社会化媒体相关资源分享|We dream of being a Mashable in China..

最近在微博上看到不少lbs相关的产品和营销案例,本文就整理了最近一段时间的一些lbs方面营销案例,各位如果对lbs感兴趣,可以关注下面这些分享案例的微博,也欢迎大家继续分享这方面的优秀案例。

@Hawk-yin:《波斯王子》是游戏界一个非 常响亮的名字。在DOS年代,她就已经成名。由其改编的电影已经上映。如你还不了解她,没有关系。掏出你的手机,用GPRS定位到其海报灯箱前。你会发现 神秘美丽的塔米娜公主出现在你的屏幕上,如果你可以答对她所提出的问题,你将赢得在movieminutes.com上50分钟的电影观看权。

李伟Nelson:Starbucks 太牛了。新推出Mobile Pour服务:你在路上走着,突然想喝咖啡,通过Mobile Pour APP,允许星巴克知道你的位置,点好你要的咖啡,然后你就接着走你的,走啊走,不一会儿一个星巴克小伙子或者大姑娘就会踩着滑轮车给你送一杯来。目前已 经在美国7个大城市开始。我看过的LBS最佳商业应用。

扩展阅读:http://www.starbucks.com/blog/introducing-starbucks-mobile-pour/987

红杉殷明:iButterfly,属于日本人的浪漫,是我看过的将AR(延伸现实)和LBS(位置服务)结合的最完美的应用,国内的开发者加油啊,可以给大城市里长大的孩子们创造一个更美好的童年。 http://t.cn/hbxAFd

新浪第一互动:【每日营销案例】LBS营销:比利时知名啤酒Stella Artois结合AR与LBS技术,做了一个APP#Le Bar Guide#.开启摄像头对着街道,显示离自己最近的酒吧,包括地址名称。最特别的是,将手机往地上拍摄,还会出现箭头符号,引导一步步走到酒吧.如果喝醉了,APP提供叫车服务http://t.cn/htJbo3

http://v.youku.com/v_show/id_XMjUwOTU4NjI0.html

LBS观景台#LBS营销案例# 伦敦博物馆手机行销案例“时光机器”。这是伦敦博物馆推出的基于iPhone的应用程式。用户可以使用GPS定位,然后把手机对准当前所在的位置,那么系统会帮你匹配当前位置几十年前的样子。LBS的互动营销可以借鉴。http://t.cn/htFl08

LBS观景台:走进一家杂货店,手机响了,提醒你 这家店现正提供的优惠券,结账时向收银员出示接收到的手机优惠券即可,你可以自行订制接收哪些商户的提醒,定制触发提示的条件。你会动心吗?采用 Location Labs旗下产品Sparkle平台的手机优惠券应用Cellfire正开始将地理位置服务引入人们的日常生活。www.cellfire.com

陈亮途Hugo#分享#Mini 设计了一个GPS定位地图的程式,显示了一部虚拟的Mini、你的和其他用户的位置。只要你到了虚拟车的50米内,你可以得到那部车。假如别的用户在你 50米内,又可以抢了你的车。假如你能够保管你的Mini一周,你就可以得到真的Mini一部!推广期间,上千瑞典人在街头奔跑!http://t.cn/hq0ru7

陈亮途Hugo#分享##LBS#美 国密尔沃基只有400个Foursquare的用户,当地餐厅AJ Bombers发起了一个Party,就是假如有50个人在某一个时间同时出现在该餐厅,大家就可以拿到一个蜂群徽章(Swarm Badge),可以优惠价吃大餐。这消息在推特上被转发了。结果在约定时间160人到达了餐厅,餐厅赚了本来3天才能有的生意!

扩展阅读:http://blog.steffanantonas.com/case-study-how-to-use-foursquare-to-draw-a-crowd-into-your-restaurant.htm

bjfangyan:SCVNGR将商家优惠活动引入LBS社交游戏 http://t.cn/hBThSi 位置游戏公司SCVNGR新推出的LevelUp平台把基于地理位置的游戏引入到优惠活动领域。你使用LevelUp越多,你就可以越早进入某个特定商家的新“级别”,从而获得更好的优惠。

SCVNGR将商家优惠活动引入LBS社交游戏

唐寅Jacob:【大众汽车】为即将到来的上海车展特别制作了一款手机App,是基于LBS 位置服务的游戏,在上海,苏州,杭州三个城市收集虚拟徽章,就可以免费获得上海车展门票,并且有机会获得限量版大众汽车车模。欢迎下载体验!http://t.cn/hBjej1

派代网官方:【#派代资讯#】《凡客诚品试水LBS营销 已有万人参与》据凡客诚品方面透露,凡是冒泡网的用户,即可利用冒泡网的地理位置服务(LBS)方式,在北京主要公交站点和北京各地铁站等站牌广告位置使用手机“签到”,活动推出当日即吸纳上万人参与。http://t.cn/hbw7sV

麻省理工科技创业:BreezeLiving:基于AR和LBS的周边优惠服务http://t.cn/hBMDar 渣打银行 (中国) 也赶时髦啦。

[转载]Android与服务器端数据交互(基于SOAP协议整合android+webservice)

mikel阅读(1088)

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

上一节中我们通过http协议,采用HttpClient向服务器端action请求数据。当然调用服务器端方法获取数据并不止这一种。WebService也可以为我们提供所需数据,

那么什么是webService呢?,它是一种基于SAOP协议的远程调用标准,通过webservice可以将不同操作系统平台,不同语言,不同技术整合到一起。

我们在PC机器java客户端中,需要一些库,比如XFire,Axis2,CXF等等来支持访问WebService,但是这些库并不适合我们资源有限 的Android手机客户端,做过JAVA ME的人都知道有KSOAP这个第三方的类库,可以帮助我们获取服务器端webService调用,当然KSOAP已经提供了基于Android版本的 jar包了,那么我们就开始吧:

首先下载KSOAP包:ksoap2-Android-assembly-2.5.2-jar-with-dependencies.jar包

然后新建android项目:并把下载的KSOAP包放在android项目的lib目录下:右键->build path->configure build path–选择Libraries,如图:

以下分为七个步骤来调用WebService方法:

第一:实例化SoapObject 对象,指定webService的命名空间(从相关WSDL文档中可以查看命名空间),以及调用方法名称。如:

//命名空间
private static final String serviceNameSpace="http://WebXml.com.cn/";
//调用方法(获得支持的城市)
private static final String getSupportCity="getSupportCity";

//实例化SoapObject对象
SoapObject request=new SoapObject(serviceNameSpace, getSupportCity);

第二步:假设方法有参数的话,设置调用方法参数

request.addProperty(“参数名称”,”参数值”);

第三步:设置SOAP请求信息(参数部分为SOAP协议版本号,与你要调用的webService中版本号一致):

//获得序列化的Envelope
SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.bodyOut=request;

第四步:注册Envelope,

(new MarshalBase64()).register(envelope);

第五步:构建传输对象,并指明WSDL文档URL:

//请求URL
private static final String serviceURL="http://www.webxml.com.cn/webservices/weatherwebservice.asmx";
//Android传输对象
AndroidHttpTransport transport=new AndroidHttpTransport(serviceURL);
transport.debug=true;

第六步:调用WebService(其中参数为1:命名空间+方法名称,2:Envelope对象):

transport.call(serviceNameSpace+getWeatherbyCityName, envelope);

第七步:解析返回数据:

if(envelope.getResponse()!=null){
return parse(envelope.bodyIn.toString());
}

/**************
* 解析XML
* @param str
* @return
*/
private static List parse(String str){
String temp;
List list=new ArrayList();
if(str!=null &amp;&amp; str.length()&gt;0){
int start=str.indexOf("string");
int end=str.lastIndexOf(";");
temp=str.substring(start, end-3);
String []test=temp.split(";");

for(int i=0;i if(i==0){
temp=test[i].substring(7);
}else{
temp=test[i].substring(8);
}
int index=temp.indexOf(",");
list.add(temp.substring(0, index));
}
}
return list;
}

这样就成功啦。那么现在我们就来测试下吧,这里有个地址提供webService天气预报的服务的,我这里只提供获取城市列表:

//命名空间
private static final String serviceNameSpace="http://WebXml.com.cn/";
//请求URL
private static final String serviceURL="http://www.webxml.com.cn/webservices/weatherwebservice.asmx";
//调用方法(获得支持的城市)
private static final String getSupportCity="getSupportCity";
//调用城市的方法(需要带参数)
private static final String getWeatherbyCityName="getWeatherbyCityName";
//调用省或者直辖市的方法(获得支持的省份或直辖市)
private static final String getSupportProvince="getSupportProvince";

然后你可以在浏览器中输入地址(WSDL):serviceURL,你会看到一些可供调用的方法:

我们选择获取国内外主要城市或者省份的方法吧:getSupportProvice,然后调用,你会发现浏览器返回给我们的是xml文档:

<!--?xml version="1.0" encoding="utf-8" ?-->
-
直辖市
特别行政区
黑龙江
吉林
辽宁
内蒙古
河北
河南
山东
山西
江苏
安徽
陕西
宁夏
甘肃
青海
湖北
湖南
浙江
江西
福建
贵州
四川
广东
广西
云南
海南
新疆
西藏
台湾
亚洲
欧洲
非洲
北美洲
南美洲
大洋洲

我们可以用 listview来显示:

那么下面我将给出全部代码:

public class WebServiceHelper {

//WSDL文档中的命名空间
private static final String targetNameSpace="http://WebXml.com.cn/";
//WSDL文档中的URL
private static final String WSDL="http://webservice.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl";

//需要调用的方法名(获得本天气预报Web Services支持的洲、国内外省份和城市信息)
private static final String getSupportProvince="getSupportProvince";
//需要调用的方法名(获得本天气预报Web Services支持的城市信息,根据省份查询城市集合:带参数)
private static final String getSupportCity="getSupportCity";
//根据城市或地区名称查询获得未来三天内天气情况、现在的天气实况、天气和生活指数
private static final String getWeatherbyCityName="getWeatherbyCityName";

/********
* 获得州,国内外省份和城市信息
* @return
*/
public List getProvince(){
List provinces=new ArrayList();
String str="";
SoapObject soapObject=new SoapObject(targetNameSpace,getSupportProvince);
//request.addProperty("参数", "参数值");调用的方法参数与参数值(根据具体需要可选可不选)

SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet=true;
envelope.setOutputSoapObject(soapObject);//envelope.bodyOut=request;

AndroidHttpTransport httpTranstation=new AndroidHttpTransport(WSDL);
//或者HttpTransportSE httpTranstation=new HttpTransportSE(WSDL);
try {

httpTranstation.call(targetNameSpace+getSupportProvince, envelope);
SoapObject result=(SoapObject)envelope.getResponse();
//下面对结果进行解析,结构类似json对象
//str=(String) result.getProperty(6).toString();

int count=result.getPropertyCount();
for(int index=0;index provinces.add(result.getProperty(index).toString());
}

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return provinces;
}

/**********
* 根据省份或者直辖市获取天气预报所支持的城市集合
* @param province
* @return
*/
public List getCitys(String province){
List citys=new ArrayList();
SoapObject soapObject=new SoapObject(targetNameSpace,getSupportCity);
soapObject.addProperty("byProvinceName", province);
SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet=true;
envelope.setOutputSoapObject(soapObject);

AndroidHttpTransport httpTransport=new AndroidHttpTransport(WSDL);
try {
httpTransport.call(targetNameSpace+getSupportCity, envelope);
SoapObject result=(SoapObject)envelope.getResponse();
int count=result.getPropertyCount();
for(int index=0;index citys.add(result.getProperty(index).toString());
}

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return citys;
}

/***************************
* 根据城市信息获取天气预报信息
* @param city
* @return
***************************/
public WeatherBean getWeatherByCity(String city){

WeatherBean bean=new WeatherBean();

SoapObject soapObject=new SoapObject(targetNameSpace,getWeatherbyCityName);
soapObject.addProperty("theCityName",city);//调用的方法参数与参数值(根据具体需要可选可不选)

SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet=true;
envelope.setOutputSoapObject(soapObject);//envelope.bodyOut=request;

AndroidHttpTransport httpTranstation=new AndroidHttpTransport(WSDL);
//或者HttpTransportSE httpTranstation=new HttpTransportSE(WSDL);
try {
httpTranstation.call(targetNameSpace+getWeatherbyCityName, envelope);
SoapObject result=(SoapObject)envelope.getResponse();
//下面对结果进行解析,结构类似json对象
bean=parserWeather(result);

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return bean;
}

/**
* 解析返回的结果
* @param soapObject
*/
protected WeatherBean parserWeather(SoapObject soapObject){
WeatherBean bean=new WeatherBean();

List&gt; list=new ArrayList&gt;();

Map map=new HashMap();

//城市名
bean.setCityName(soapObject.getProperty(1).toString());
//城市简介
bean.setCityDescription(soapObject.getProperty(soapObject.getPropertyCount()-1).toString());
//天气实况+建议
bean.setLiveWeather(soapObject.getProperty(10).toString()+"\n"+soapObject.getProperty(11).toString());

//其他数据
//日期,
String date=soapObject.getProperty(6).toString();
//---------------------------------------------------
String weatherToday="今天:" + date.split(" ")[0];
weatherToday+="\n天气:"+ date.split(" ")[1];
weatherToday+="\n气温:"+soapObject.getProperty(5).toString();
weatherToday+="\n风力:"+soapObject.getProperty(7).toString();
weatherToday+="\n";

List icons=new ArrayList();

icons.add(parseIcon(soapObject.getProperty(8).toString()));
icons.add(parseIcon(soapObject.getProperty(9).toString()));

map.put("weatherDay", weatherToday);
map.put("icons",icons);
list.add(map);

//-------------------------------------------------
map=new HashMap();
date=soapObject.getProperty(13).toString();
String weatherTomorrow="明天:" + date.split(" ")[0];
weatherTomorrow+="\n天气:"+ date.split(" ")[1];
weatherTomorrow+="\n气温:"+soapObject.getProperty(12).toString();
weatherTomorrow+="\n风力:"+soapObject.getProperty(14).toString();
weatherTomorrow+="\n";

icons=new ArrayList();

icons.add(parseIcon(soapObject.getProperty(15).toString()));
icons.add(parseIcon(soapObject.getProperty(16).toString()));

map.put("weatherDay", weatherTomorrow);
map.put("icons",icons);
list.add(map);
//--------------------------------------------------------------
map=new HashMap();

date=soapObject.getProperty(18).toString();
String weatherAfterTomorrow="后天:" + date.split(" ")[0];
weatherAfterTomorrow+="\n天气:"+ date.split(" ")[1];
weatherAfterTomorrow+="\n气温:"+soapObject.getProperty(17).toString();
weatherAfterTomorrow+="\n风力:"+soapObject.getProperty(19).toString();
weatherAfterTomorrow+="\n";

icons=new ArrayList();
icons.add(parseIcon(soapObject.getProperty(20).toString()));
icons.add(parseIcon(soapObject.getProperty(21).toString()));

map.put("weatherDay", weatherAfterTomorrow);
map.put("icons",icons);
list.add(map);
//--------------------------------------------------------------

bean.setList(list);
return bean;
}

//解析图标字符串
private int parseIcon(String data){
// 0.gif,返回名称0,
int resID=32;
String result=data.substring(0, data.length()-4).trim();
// String []icon=data.split(".");
// String result=icon[0].trim();
// Log.e("this is the icon", result.trim());

if(!result.equals("nothing")){
resID=Integer.parseInt(result.trim());
}
return resID;
//return ("a_"+data).split(".")[0];
}
}

以及帮助类:

public class WebServiceUtil {

//命名空间
private static final String serviceNameSpace="http://WebXml.com.cn/";
//请求URL
private static final String serviceURL="http://www.webxml.com.cn/webservices/weatherwebservice.asmx";
//调用方法(获得支持的城市)
private static final String getSupportCity="getSupportCity";
//调用城市的方法(需要带参数)
private static final String getWeatherbyCityName="getWeatherbyCityName";
//调用省或者直辖市的方法(获得支持的省份或直辖市)
private static final String getSupportProvince="getSupportProvince";

/*************
* @return城市列表
*************/
public static List getCityList(){
//实例化SoapObject对象
SoapObject request=new SoapObject(serviceNameSpace, getSupportCity);
//获得序列化的Envelope
SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.bodyOut=request;
(new MarshalBase64()).register(envelope);
//Android传输对象
AndroidHttpTransport transport=new AndroidHttpTransport(serviceURL);
transport.debug=true;

//调用
try {
transport.call(serviceNameSpace+getWeatherbyCityName, envelope);
if(envelope.getResponse()!=null){
return parse(envelope.bodyIn.toString());
}

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return null;
}

public static List getProviceList(){
//实例化SoapObject对象
SoapObject request=new SoapObject(serviceNameSpace, getSupportProvince);
//获得序列化的Envelope
SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.bodyOut=request;
(new MarshalBase64()).register(envelope);
//Android传输对象
AndroidHttpTransport transport=new AndroidHttpTransport(serviceURL);
transport.debug=true;

//调用
try {
transport.call(serviceNameSpace+getWeatherbyCityName, envelope);
if(envelope.getResponse()!=null){
return null;
}

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return null;
}

/*************
* @param cityName
* @return
*************/
public static String getWeather(String cityName){

return "";
}

/**************
* 解析XML
* @param str
* @return
*/
private static List parse(String str){
String temp;
List list=new ArrayList();
if(str!=null &amp;&amp; str.length()&gt;0){
int start=str.indexOf("string");
int end=str.lastIndexOf(";");
temp=str.substring(start, end-3);
String []test=temp.split(";");

for(int i=0;i if(i==0){
temp=test[i].substring(7);
}else{
temp=test[i].substring(8);
}
int index=temp.indexOf(",");
list.add(temp.substring(0, index));
}
}
return list;
}

/*********
* 获取天气
* @param soapObject
*/
private void parseWeather(SoapObject soapObject){
//String date=soapObject.getProperty(6);
}
}

以上就是我所作的查询天气预报的全部核心代码了,读者可以根据注释以及本文章了解下具体实现,相信很快就搞明白了,运行结果如下:

到此结束,下一节主要是socket通信了。

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

mikel阅读(765)

[转载]【原创】构建高性能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性能

本章的议题如下:

性能调优的一般过程

利用分析工具分析页面加载信息

利用分析工具分析性能瓶颈

利用分析工具分析加载页面信息

站点的优化说到底还是站点每一个页面的优化,即使得站点的页面更快的呈现在用户的眼前。所以在此之前,我们首先来看看一个web页面的组成部分:

1. Html文件:ASP.NET中,Html文件通常是通过解析.aspx页面而产生的。而这个解析过程在服务端进行,同时这个过程也消耗了服务端的大部分资源。

2. 图片和flash文件:一个站点往往包含很多这样的的文件。

3. Jscss文件:这些文件可以阻止页面的呈现。

清楚了页面的组成部分之后,我们可以把使得页面加载变慢的因素分为如下几类:

1. 服务端的花费大量时间解析.aspx,也就是说服务端产生html文本的时间过长(导致这个问题的原因很多,例如数据库查询很慢,影响了页面的生成)。

2. 在服务端和浏览器之间,传递html文本花费大量的时间(例如,页面中的Viewstate很大,网络很慢等)。

3. 图片和flash文件的加载花费大量的时间。

4. Jscss的加载花费大量的时间。

为了使得一个页面的加载变快,那么我们就得知道:是以上哪一个过程影响了速度(本系列的后续文章会详细讲述)。一旦知道了是那类问题导致了性能问题,那么我们就可以对症下药。

下面我们就通过一些工具来简单的查看和分析站点的性能,目的让大家快速的了解如何进行简单的性能分析。

我们用瀑布图来分析页面的每个组成部分加载所花的时间,例如下面就是博客园首页加载的分析图(部分的截图)。

我们可以通过图中的“时间线“长短来知道每个文件加载的时间。时间线长越长,那么加载该文件的时间越长,反之。

看完了上面的图之后,大家应该很想知道:上面的图是如何生成的,那么下面就介绍一些生成页面加载瀑布图的工具。

我们首先来看看:Firefox+Firebug

Firefox下载地址:http://www.mozilla.com/en-US/firefox/

Firebug下载地址:http://getfirebug.com/

下面就开始演示如何生成页面加载的瀑布图(如果熟悉这个流程的朋友可以跳过此段)

1. 打开Firefox,然后按下F12,就看到如下的画面:

2. Firebug中,在选择“网络”下拉框中选择“启用”。

OK,下面我们就来详细的看看在瀑布图中一些数据和图示的意义。

1. 请求和响应的相关信息

在瀑布图中,点击每一行的”+”如下:

符号展开之后,我们可以看到所有的请求和响应头,如下:

2. 时间线的相关信息

当我们把鼠标移到着色的时间线bar上面的时候,我们就可以看到请求该文件所花的时间的详细信息,如下:

我们用一个表格来讲述每个时间段的含义:

域名解析 寻找请求的文件所在的服务器的IP地址所花的时间
建立连接 打开客户端到服务端的TCP链接所花的时间
发送请求 浏览器发送请求所花的时间。大家可能有点奇怪:为什么发送请求还要等待,难道不是打开连接就发送了请求吗?

其实浏览器会把要请求的文件的请求放在请求队列中,队列的长度一般都是有限制的,如果页面需要请求的文件很多,如果队列达到了最大的限制数量,那么后续的文件请求会等待。

等待响应 客户端发送请求一直到接受服务端的第一个字节所花的时间
接受数据 接受整个请求文件或者数据所花的时间
‘DOMContentLoaded’ 事件 从该请求开始进行DNS寻址到整个页面的DOM被下载下来所花的时间。注意:此时只是页面的骨架被下载下来了,其中的一些资源(如果图片,js等)没有下载下来。当页面的DOM下载下来了之后,用户就可以看到了页面了,但是有些资源还在陆续的下载中。
‘load’ 事件 从该请求开始进行DNS寻址到整个页面全部(包括资源)下载下来所花的时间。

3. 页面级的请求信息

也就是整个页面的请求的一些汇总信息。

OK,今天就基本讲述这些,下一篇就开始讲述利用分析工具分析性能瓶颈,用上面的瀑布图来分析一些常见的性能问题,这些性能问题会在后续文章中一个个的给出解决方案,敬请关注! :)

[转载]大型高性能ASP.NET系统架构设计

mikel阅读(981)

[转载]【转】大型高性能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性能

大型动态应用系统又可分为几个子系统:

Web前端系统

负载均衡系统

数据库集群系统

缓存系统

分布式存储系统

分布式服务器管理系统

代码分发系统

Web前端系统

为了达到不同应用的服务器共享、避免单点故障、集中管理、统一配置等目的,不以应用划分服 务器,而是将所有服务器做统一使用,每台服务器都可以对多个应用提供服务,当某些应用访问量升高时,通过增加服务器节点达到整个服务器集群的性能提高,同时使他应用也会受益。

Web前端系统基于IIS/ASP.NET等的虚拟主机平台,提供PHP程序运行环境。服务器对开发人员是透明的,不需要开发人员介入服务器管理。

负载均衡系统

负载均衡系统分为硬件和软件两种。硬件负载均衡效率高,但是价格贵,比如F5等。软件负载均衡系统价格较低或者免费,效率较硬件负载均衡系统低,不过对于流量一般或稍大些网站来讲也足够使用,比如lvs,nginx。大多数网站都是硬件、软件负载均衡系统并用。

数据库集群系统

由于Web前端采用了负载均衡集群结构提高了服务的有效性和扩展性,因此数据库必须也是高可靠的才能保证整个服务体系的高可靠性,如何构建一个高可靠的、可以提供大规模并发处理的数据库体系?

我们可以采用如上图所示的方案:

1)使用SQL数据库,考虑到Web应用的数据库读多写少的特点,我们主要对读数据库做了优化,提供专用的读数据库和写数据库,在应用程序中实现读操作和写操作分别访问不同的数据库。

2)使用同步机制实现快速将主库(写库)的数据库复制到从库(读库)。一个主库对应多个从库,主库数据实时同步到从库。

3)写数据库有多台,每台都可以提供多个应用共同使用,这样可以解决写库的性能瓶颈问题和单点故障问题。

4)读数据库有多台,通过负载均衡设备实现负载均衡,从而达到读数据库的高性能、高可靠和高可扩展性。

5)数据库服务器和应用服务器分离。

6)从数据库使用BigIP做负载均衡。

缓存系统

缓存分为文件缓存、内存缓存、数据库缓存。在大型Web应用中使用最多且效率最高的是内存缓存。最常用的内存缓存工具是Memcachd。使用正确的缓存系统可以达到实现以下目标:

1、使用缓存系统可以提高访问效率,提高服务器吞吐能力,改善用户体验。

2、减轻对数据库及存储集服务器的访问压力。

3Memcached服务器有多台,避免单点故障,提供高可靠性和可扩展性,提高性能。

分布式存储系统

Web系统平台中的存储需求有下面两个特点:

1) 存储量很大,经常会达到单台服务器无法提供的规模,比如相册、视频等应用。因此需要专业的大规模存储系统。

2) 负载均衡cluster中的每个节点都有可能访问任何一个数据对象,每个节点对数据的处理也能被其他节点共享,因此这些节点要操作的数据从逻辑上看只能是一个整体,不是各自独立的数据资源。

因此高性能的分布式存储系统对于大型网站应用来说是非常重要的一环。(这个地方需要加入对某个分布式存储系统的简单介绍。)

分布式服务器管理系统

随着网站访问流量的不断增加,大多的网络服务都是以负载均衡集群的方式对外提供服务,随之集群规模的扩大,原来基于单机的服务器管理模式已经不能够满足我们的需求,新的需求必须能够集中式的、分组的、批量的、自动化的对服务器进行管理,能够批量化的执行计划任务。

在分布式服务器管理系统软件中有一些比较优秀的软件,其中比较理想的一个是Cfengine。它可以对服务器进行分组,不同的分组可以分别定制系统配置文件、计划任务等配置。

它是基于C/S 结构的,所有的服务器配置和管理脚本程序都保存在Cfengine Server上,而被管理的服务器运行着 Cfengine Client程序,Cfengine Client通过SSL加密的连接定期的向服务器端发送请求以获取最新的配置文件和管理命令、脚本程序、补丁安装等任务。

有了Cfengine 这种集中式的服务器管理工具,我们就可以高效的实现大规模的服务器集群管理,被管理服务器和 Cfengine Server可以分布在任何位置,只要网络可以连通就能实现快速自动化的管理。

代码分发系统

随着网站访问流量的不断增加,大多的网络服务都是以负载均衡集群的方式对外提供服务,随之集群规模的扩大,为了满足集群环境下程序代码的批量分发和更新,我们还需要一个程序代码发布系统。

这个发布系统可以帮我们实现下面的目标:

1) 生产环境的服务器以虚拟主机方式提供服务,不需要开发人员介入维护和直接操作,提供发布系统可以实现不需要登陆服务器就能把程序分发到目标服务器。

2) 我们要实现内部开发、内部测试、生产环境测试、生产环境发布的4个开发阶段的管理,发布系统可以介入各个阶段的代码发布。

3) 我们需要实现源代码管理和版本控制,SVN可以实现该需求。

这里面可以使用常用的工具Rsync,通过开发相应的脚本工具实现服务器集群间代码同步分发。

[转载]SQL点滴9—使用with语句来写一个稍微复杂sql语句

mikel阅读(880)

[转载]SQL点滴9—使用with语句来写一个稍微复杂sql语句 – Tyler‘s DoNet – 博客园.

今天偶尔看到SQL中也有with关键字,好歹也写了几年的SQL语句,居然第一次接触,无知啊。看了一位博主的文章,自己添加了一些内容,做了 简单的总结,这个语句还是第一次见到,学习了。我从简单到复杂地写,希望高手们不要见笑。下面的sql语句设计到三个表,表的内容我用txt文件复制进 去,这里不妨使用上一个随笔介绍的建立端到端的package的方法将这些表导入到数据库中,具体的就不说了。

从这里下载文件employees.txt,customers.txt,orders.txt

参考文章:http://www.cnblogs.com/wwan/archive/2011/02/24/1964279.html

使用package导入数据:http://www.cnblogs.com/tylerdonet/archive/2011/04/17/2017471.html

简单的聚合

从orders表中选择各个年份共有共有多少客户订购了商品

第一种写法,我们可以写成这样

select YEAR(o.orderdate) orderyear,COUNT(distinct(custid)) numCusts
from Sales.Orders o
group by YEAR(o.orderdate)
go

要注意的是如果把group by YEAR(o.orderdata)换成group by orderyear就会出错,这里涉及到sql语句的执行顺序问题,有时间再了解一下
第二种写法,

select orderyear,COUNT(distinct(custid))numCusts
from (select YEAR(orderdate) as orderyear,custid from sales.orders) as D
group by orderyear
go

在from语句中先得到orderyear,然后再select语句中就不会出现没有这个字段的错误了
第三种写法,

select orderyear,COUNT(distinct(custid)) numCusts
from (select YEAR(orderdate),custid from sales.orders) as D(orderyear,custid)
group by orderyear
go

在as D后面加上选择出的字段,是不是更加的清楚明了呢!
第四种写法,with出场了

with c as(
select YEAR(orderdate) orderyear, custid from sales.orders)
select orderyear,COUNT(distinct(custid)) numCusts from c group by orderyear
go

with可以使语句更加的经凑,下面是权威解释。
指定临时命名的结果集,这些结果集称为公用表表达式 (CTE)。该表达式源自简单查询,并且在单条 SELECT、INSERT、UPDATE、MERGE 或 DELETE 语句的执行范围内定义。该子句也可用在 CREATE VIEW 语句中,作为该语句的 SELECT 定义语句的一部分。公用表表达式可以包括对自身的引用。这种表达式称为递归公用表表达式。

—-MSDN



第五种写法,也可以借鉴第三种写法,这样使语句更加清楚明了,便于维护

with c(orderyear,custid) as(
select YEAR(orderdate),custid from sales.orders)
select orderyear,COUNT(distinct(custid)) numCusts from c group by c.orderyear
go

上面5中写法都得到相同的结果,如下图1:图1
添加计算

现在要求要求计算出订单表中每年比上一年增加的客户数目,这个稍微复杂

with yearcount as(
select YEAR(orderdate) orderyear,COUNT(distinct(custid)) numCusts from sales.orders group by YEAR(orderdate))
select cur.orderyear curyear,cur.numCusts curNumCusts,prv.orderyear prvyear,prv.numCusts prvNumCusts,cur.numCusts-prv.numCusts growth
from yearcount cur left join yearcount prv on cur.orderyear=prv.orderyear+1
go

这里两次使用到with结果集。查询得到的结果如下图2

图2

复杂的计算

查找所有美国雇员掌握的所有至少有一个订单的客户的客户id,查询语句如下

with TheseEmployees as(
select empid from hr.employees where country='USA'),
CharacteristicFunctions as(
select custid,
case when custid in (select custid from sales.orders as o where o.empid=e.empid) then 1 else 0 end as charfun
from sales.customers as c cross join TheseEmployees as e)
select custid,min(charfun) from CharacteristicFunctions group by custid having min(charfun)=1
go

这里嵌套with语句,第with语句查找美国雇员的id,第二个语句使用这个结果和拥有客户的客户id和拥有关系标识做笛卡尔积运算。最后从这个笛卡尔积中通过标识找到最终的custid。
结果如下图3

图3

这里只有简单地介绍,没有深入,高手们不要见笑啊。