[转载]Android获取已安装应用信息(图标,名称,版本号,包)

mikel阅读(901)

[转载]Android获取已安装应用信息(图标,名称,版本号,包) – MainRoad – 博客园.

Android 菜市场上有一款应用较 ShareApp,可以显示,管理,分享Android手机上安装的应用。

但比较不爽的是,它把很多系统自带的应用程序也都显示了出来。这些程序往往是无法卸载的,更无法分享,让“已安装应用程序”的列表显的非常凌乱。

我在手机上运行了一下,结果Gtalk,DRMService这些系统应用都显示出来了..比较不爽。

于是自己写了个程序,看看能不能只显示用户自己安装的程序。

程序大概分成三个部分:

1.获取手机已安装的所有应用package的信息(其中包括用户自己安装的,还有系统自带的);

2.滤除系统自带应用;

3.通过列表显示出应用程序的图标(icon),和其他文字信息(应用名称,包名称package name,版本号等等)

首先,我们定义一个数据结构,来保存应用程序信息(icon,name,packageName,versionName,versionCode,等)

public class AppInfo {
public String appName="";
public String packageName="";
public String versionName="";
public int versionCode=0;
public Drawable appIcon=null;
public void print()
{
Log.v("app","Name:"+appName+" Package:"+packageName);
Log.v("app","Name:"+appName+" versionName:"+versionName);
Log.v("app","Name:"+appName+" versionCode:"+versionCode);
}

}

然后我们通过PackageManager 来获取已安装的应用包信息。

ArrayList appList = new ArrayList(); //用来存储获取的应用信息数据
List
packages = getPackageManager().getInstalledPackages(0);

for(int i=0;i
PackageInfo packageInfo = packages.get(i);
AppInfo tmpInfo = new AppInfo();
tmpInfo.appName = packageInfo.applicationInfo.loadLabel(getPackageManager()).toString();
tmpInfo.packageName = packageInfo.packageName;
tmpInfo.versionName = packageInfo.versionName;
tmpInfo.versionCode = packageInfo.versionCode;
tmpInfo.appIcon = packageInfo.applicationInfo.loadIcon(getPackageManager());
appList.add(tmpInfo);

}
//好啦 这下手机上安装的应用数据都存在appList里了。

那么如何判断一个应用是否为系统应用呢?

if((packageInfo.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM)==0)
{
//非系统应用
}
else
{
//系统应用
}

所以如果只需要获取到非系统应用信息,代码如下:

ArrayList appList = new ArrayList(); //用来存储获取的应用信息数据
List
packages = getPackageManager().getInstalledPackages(0);

for(int i=0;i PackageInfo packageInfo = packages.get(i);
AppInfo tmpInfo = new AppInfo();
tmpInfo.appName = packageInfo.applicationInfo.loadLabel(getPackageManager()).toString();
tmpInfo.packageName = packageInfo.packageName;
tmpInfo.versionName = packageInfo.versionName;
tmpInfo.versionCode = packageInfo.versionCode;
tmpInfo.appIcon = packageInfo.applicationInfo.loadIcon(getPackageManager());
//Only display the non-system app info
if((packageInfo.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM)==0)
{
appList.add(tmpInfo);//如果非系统应用,则添加至appList
}

}

最后,我们可以自定义一个app_row.xml的layout 文件,用来显示appList中的数据

是不是看着利索多了~~~(我在每行里只显示了icon 和 appName,你也可以修改app_row.xml 和 AppAdapter 部分后显示更多的信息)

大家可以参考我的源码:

源码下载地址:
http://www.everbox.com/f/cV98GFipIUHV34WOmXNdemQ6Vm

我的联系方式:

twitter: @mainroadlee

talkbox id:mainroadlee


参考:

1. [Android分享] Android 得到已安装的应用程序信息

http://www.eoeandroid.com/thread-67948-1-1.html

该文中描述了如何获取Android 已安装应用信息,但关于系统应用的判断部分存在错误。

2. Android中级篇之区分系统程序和安装程序

http://blog.csdn.net/y13872888163/archive/2011/05/20/6435618.aspx

[转载]Android Market排名算法及规则

mikel阅读(810)

[转载]Android Market排名算法及规则 – deaboway – 博客园.

(Just one blogger _guess_ how Google rates apps on Android market. For reference only)

http://www.mobile20.com.cn/android-market-ranking-rules/

众所周知,做搜索出身的Google,旗下的Market的排名肯定是依据一个形同( A×a% + B×b% + C×c%)的公式计算出来的数值,进行排名的。开发者可根据其排名规则,对自己的产品设计和研发以及推广进行指导。

1. 排名公式里有哪些指标?

指标A、B、C到底是什么?权重a、b、c究竟是多少?这些问题的答案,应该是每个App开发者和运营者都渴望了解的。知道了这个答案之后,有些“聪 明”的人就会像当年SP的从业者一样,去刷那些权重大的指标、从而拉升产品的排名了。网上关于此问题的讨论很多都是不了了之、无疾而终。相对较深入的一篇 文章《Android Market App Rankings》,也只是在猜想是基于“安装量”的增长和留存。可惜,该作者离正确答案就差一步了……

也 许你已经等得不耐烦了,哈哈。现在就说说我的结论吧。指标A=“总安装/总下载”,即下载转安装的转换率;B=“评分/5”,即产品得分比上Market 的满分;C=“留存安装/总安装”,即安装的留存率。不要急着问我a、b、c等于多少,准确数值只有Google知道、而且可以调,我只能告诉你它们加起 来等于100,还有就是b>max(a,c)(为什么?下面耐心看)。

依据这个推断公式,就是说如果每个下载的用户都安装了、而且都给了5分、并且一直都没有卸载——OK.不论a、b、c是多少,你的产品得了满分,它就是No.1!

2. 为什么是它们?

在告诉你为什么是A、B、C之前,我先告诉你为什么不是D、E、F……

先看个数据,Android Market-通信-免费-TOP25:

去掉了产品名称,我们可以看到更纯的数据。

首先,我 们可以肯定的排除排名是按“下载次数”排序的,下载次数1万+的产品(第9位)居然排到了下载次数500万+(第11位)的前面。试想第11位的产品在 喊:“这是为什么?它哪点比我好???”——答案:请看“评分”。啊?它是5分!没错,第9位的产品评分得了满分。哦,排除了D的同时,我们收获了B。

其次,我们可以排除“评分人数”。原因就是,在“下载次数”和“评分”都同等量级的情况下,比对了若干样本,都无章可循——实在跟“评分人数”不相干。E被干掉了。

再次,要 排除的是“加速度”。很多人在猜测会有一个“加速度”指标,或者新增下载的、或是新增安装的。大家的这种猜测是源自于“鼓励新产品”,但是这是一种过于激 进的想法。Market这么大盘子是要鼓励推陈出新的,但“保护”新产品的同时也得“爱护”那些确实有实力的老产品。过大的用户基数,肯定会拖慢老牛产品 的“加速度”,如果这么做的话每天的TOP10都是面目全非的(App Store的排名规则里就有“加速度”,所以TOP榜天天易容)。所以,“加速度”也不是真正的公平。

排除了D、E、F,收获了B。那A和C是从哪来的?

休息一下,问个题外话?我们一般是怎么评判一个物品的“好”“坏”的?是不是有以下部分组成?有一样东西摆在你面前,勾起了你试用的欲望。试用之后,你 可能爱不释手,继续用吧。路遥知马力,又用了一段时间,你又有了新的评判。如果这个东西实在是太好了,那你就会与它形影不离……回归到我们判断一个物品的 标准的本质,无非就是是否“接受它”、是否“肯定它”、是否“留着它”。

言 归正传,用户是否“接受”一个App——下载只是“抬头”,安装才是“点头”。如果单以“安装”为指标,又会让老产品滚雪球,有失公平。所以,A(下载转 安装的转化率)浮出水面了。“安装”做分母,“下载”做分子。一方面,排名在前的产品下载量越高、安装量就有可能越高的同时,如果产品不够好“下载量”越 高就可能成了拖后腿的那个分母,上面举例的第11位产品就是个例子(庞大的下载量下,安装量无法保持同步增长,所以让其难堪重负,排名下落——剧透下,第 11位是曾经“通信”下排名第1的产品KakaoTalk)。另一方面,只要A(还有B、C)足够好,也让一些新产品可以冒出头来。

B(评分)刚才已经分析到了,这里需要补充一点的是:评分不是一次性的。我们会发现在Market里“评分”是可以多次修改的,这样的目的就是鞭策产品 要持续的“好”,用户一直掌握着产品的“生杀大权”。另外,就是为什么前文说到b大于a和c,原因就是纵观TOP100,评分低于4分的只有两 个;TOP25,评分低于4的是零个;TOP10,评分低于4.5的只有一个(避免出现App Store里《小姐日记》这样低分却长期占据高排位的现象)——一言以蔽之:要想在前排就坐,产品首先得让用户觉得“好”。

该说说C(安装留存率)的出处。说白了就是控制流失率,如果“总安装”很高、但是“留存安装”很少,那也不能称之为“好”产品。所以,安装留存率就是另一个全面衡量产品优劣的指标。

3. 它们到底是多少?

前文已经说到b比a和c都大,那a和c孰大孰小呢?这个取决于Android Market的策略,如果“a比c大”意味着“更看重新增”(任何一个店铺先开张的时候,都会最看重这个)、如果“c比a大”意味着“更看重留存”(对于 一个已经把客流吃透的老店,会更看重这个)——所以,这个真是可以调的,取决于Android Market发展到哪个阶段和运营管理者的自我认识。

4. 感言

Android Market如果真是我想象的这样排名,可谓新老兼顾,攻防兼备。

说它新老兼顾,是因为它让新鲜的好的新产品既能快速冒出来、也能让它经得起时间的推敲,或昙花一现或源远流长。说它攻守兼备,是因为这样会把盘子越做越 大,而且也防止了“刷”(能刷上去,但是刷上去之后如果产品不够好,会让产品跌得更惨),把盘子越做越牢。这样公平的规则,也为Android Market的应用量新增速度已超过App Store提供了另一个有力的支持。高!实在是高!

Android Market排名规则这个隐形的裁判告诉我们:持续地把产品做好,才是正道!

[转载]ASP.NET MVC在IIS6下部署的小技巧

mikel阅读(786)

[转载]ASP.NET MVC在IIS6下部署的小技巧 – P_Chou – 博客园.

通常在IIS6下部署ASP.NET MVC应用程序的时候,都是直接设置把所有请求都交由ASP.NET的ISAPI处理。MVC是基于ASP.NET的,框架默认对于任何请求都会优先检查物理路径是否存在物理文件,如果存在的话就不通过MVC的路由机制,否则才走路由。因此,如果在不考虑控制静态资源权限的情况下,可以设置静态资源不通过ASP.NET的ISAPI,而直接由IIS处理,通过这种方式提升一些性能。本文围绕这个主题,详解部署过程。


0.在设计MVC网站的时候,把静态资源统一放在一个文件夹下,建议目录结构使用小写字母

1.把web应用程序发布到某个路径下(略)(顺便提一句,MVC2功能上比MVC3弱一些,用到的组件很少,可以直接私有部署System.Web.Mvc;但是MVC3因为功能增加,而且引入了Razor引擎,依赖的组件增多,建议在部署的时候直接安装MVC3)

2.创建一个web站点(略)

3.右击创建的web站点,选择属性,切换到Home Directory页

clip_image001

4.点击Configuration,在Wildcard application maps中,点击Insert,添加C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll,取消Verify that file existsg的勾选。(如果使用MVC2的话,可以到2.0下去找这个dll。这里去掉对静态文件的验证是关键,这使得asp.net处理所有的请求)

clip_image001

5.点OK

clip_image001[6]

6.允许ASP.NET 4.0扩展

clip_image002

7.content目录是静态资源放置的目录,设置content目录下请求直接由IIS处理以提高性能。右击content,属性

clip_image001[6]

8.点击create,再点击configuration,移除Wildcard application maps下的内容。点击OK。这里利用了IIS的一个bug,把目录设置成虚拟目录,删除Wildcard application maps的设置,这样这个虚拟目录的请求就直接由IIS处理了。

clip_image001[8]

9. 再点击Remove,把虚拟目录恢复成普通目录。这样只有这个目录下的文件会受到IIS的“眷顾”

clip_image001[10]

10.设置AppPool权限。点击站点使用的AppPool的属性,切换到Identity,选择Local System。这是偷懒的设置方法,以避免出现应用程序本身对系统的访问权限不够

clip_image001[14]

11.设置匿名访问权限。右击站点,选择权限。点击Add…,在弹出的对话框中输入IUSR_XXX(XXX为机器名)。

clip_image001[16]

点击OK,便可添加一个Internet Guest Account,保持默认的只读权限即可。

clip_image001[18]

12.最后注意,如果是首次安装.NET 4.0,不要忘了注册

clip_image001[12]

深入理解ASP.NET MVC(2)中,讨论过MVC框架的路由机制,其中提到“可以通过设置RouteCollection的RouteExistingFilestrue,使得路由不匹配静态文件(注意true是不匹配,这个命名和奇怪)。”因此,我们可以这样设置,以使得MVC不对静态文件进行检查,这样又可以提高一点性能。最终请求会像下图那样被serve

image

[转载]用C#编写一个抓网页的应用程序

mikel阅读(932)

[转载]用C#编写一个抓网页的应用程序 – 临河羡鱼 – 博客园.

C#.NET提供的类来轻松创建一个抓取网页内容源代码的程序 。HTTPWWW进行数据访问最基本的协议之一,在.NET的基本类型库类中提供了两个对象类:HTTPWebRequestHTTPWebResponse,分别用来向某资源发送请求和获得响应。为了得到一个资源的内容,我们先指定一个想要抓取的URL地址,用HTTPWebRequest对象进行请求,用HTTPWebResponse对象接收响应的结果,最后用TextStream对象来提取我们想要的信息,并在控制台打印出来。
下面就是看看如何实现这样的功能:

第一步:打开VS.NET,点文件”-“新建”-“项目,项目类型选择“Visual C#项目,模板选“Windows应用程序
第二步:在Form1里加入Label1Button1,TextBox1,TextBox2四个控件,TextBox2Multiline属性改为True,
第三步:在Form1窗体上点击右键,选查看代码,button1的Click事件代码:

using System.IO;
using System.Net;
using System.Text;
private void button1_Click(object sender,
System.EventArgs e)
{
byte[] buf = new byte[38192];
HttpWebRequest request = (HttpWebRequest)
WebRequest.Create(textBox1.Text);
HttpWebResponse response = (HttpWebResponse)
request.GetResponse();
Stream resStream = response.GetResponseStream();
int count = resStream.Read(buf, 0, buf.Length);
textBox2.Text = Encoding.Default.GetString(buf, 0,
count);
resStream.Close();

}

第四步:点“Save all”按钮,按“F5”运行应用程序,在请输入URL地址:后面的单行文本框里输入http://www.cnblogs.com/atun/archive/2011/05/22/2053847.htmlhttp://lucky.myrice.com/down.htm,点击得到 HTML 代码按钮,就可以看到该地址的代码了!

下面,我们就对上面的程序做一个分析:

上面的这个程序的功能是抓取网页http://lucky.myrice.com/down.htm的内容,并在多行文本框里显示出HTML代码,由于返回的数据是字节类型的,因此,我们创建一个名为buf的字节类型的数组变量来存储请求返回来的结果,其中数组的大小与我们要请求返回的数据大小有关系。首先,我们实例化HttpWebRequest对象,使用WebRequest类的静态方法Create(),该方法的字符串参数就是我们要请求页面的URL地址,由于Create()方法返回的是WebRequest类型的,我们必须对它进行造型(即类型转换)成HttpWebRequest类型,再赋给request变量。一旦我们建立了HttpWebRequest对象,就可以使用它的GetResponse()方法来返回一个WebResponse对象,然后再造型成HttpWebResponse对象赋给response变量。现在,就可以使用response对象的
GetResponseStream()方法来得到响应的文本流了,最后用Stream对象的Read()方法把返回的响应信息放到我们最初创建的字节数组buf中,Read()3个参数,分别是:要放入的字节数组,字节数组的开始位置,字节数组的长度。最后把字节转换成字符串,注意:这里采用的采用的是Default编码,它使用默认的编码方式,我们就不用再进行字符编码之间的转换了。也可以利用WebRequestWebResponse实现以上的功能,代码如下:

WebRequest request = WebRequest.Create(textBox1.Text);
WebResponse response =request.GetResponse();

输入其它的URL看看是不是很方便!

[转载]开源腾讯QQ登录 .Net SDK v1.0 beta (Qzone OAuth Client For Asp.Net )

mikel阅读(929)

[转载]开源腾讯QQ登录 .Net SDK v1.0 beta (Qzone OAuth Client For Asp.Net ) – Hunter.Wei – 博客园.

开源地址:http://qzoneoauth.codeplex.com

示例:http://www.sl8.so

腾讯社区开发平台:http://opensns.qq.com/

腾 讯开放了QQ登录功能,对广大网民是一件大喜事。用户可以从注册、记录杂七杂八的用户名密码中解脱,站长们也可以方便的共享到腾讯的用户。这一天,我们等 你等的好苦:(。第一时间为Silverlight吧申请了QQ登录,但现在腾讯却没提供封装好的.Net SDK,没办法,自己动手,衣丰食足。开发过程中遇到了大大小小的问题,现在的结论要坚信一个真理:腾讯的服务没问题,问题只在我们的程序。即使是返回 12000-13000(服务器出错联系管理员)这类问题,但请相信,服务器正常着呢。为了这个问题,我一度怀疑腾讯服务器咨询腾讯企业QQ,后来千呼万 唤,在我要放弃时得到回复,是我加密有问题,继续Coding,调试。。终成正果。现在已经封装成了组件开源,让后来人在繁琐的认证过程解脱。

  • 封装功能

我们知道腾讯QQ登录要经如下7个步骤:

  1. 请求临时token
  2. 生成未授权的临时token
  3. 引导用户到Qzone的登录页
  4. Qzone引导用户跳转到第三方应用
  5. 请求access token
  6. 生成access token
  7. 访问或修改空间受保护的资源

过程还是比较繁杂的,每个步骤都需要细心,尤其是加密字段的生成。

使用封装好的 QzoneOAuth .Net SDK,你只需如下三个步骤即可完成(确切的说只有两步),无需关注认证的过程。

  1. 配置 Web.config HttpHandler
  2. 调用登录方法
  3. 访问资源

接下来就看看我们如何使用此SDK。

  • 环境准备

开源地址:http://qzoneoauth.codeplex.com

.Net Framework 版本:2.0

  • 使用步骤

SDK里提供了 两个方法和一个属性:

Qzone.OAuth.Utility.Login(string appid, string appkey, string qqcallbackurl, string onSuccessRedirectUrl, string onFailRedirectUrl)

说明:使用腾讯OAuth登录

string Qzone.OAuth.Utility.GetUserInfo(DataFormatEnum format)

说明:获取用户信息

Qzone.OAuth.Utility.OpenId

说明:和QQ号码一一对应的OpenId

1. 配置Web.config

在httpHandlers配置头处理文件地址

<httpHandlers>
<add verb=”*” path=”*/login.axd” type=”Qzone.OAuth.TencentOAuthCallBackHandler, Qzone.OAuth” validate=”false”/>

</httpHandlers>
其中 */login.axd 是可以自由设定的,这个值在登录方法里手工传值(即参数 qqcallbackurl)。

2. 调用登录方法

Qzone.OAuth.Utility.Login(string appid, string appkey, string qqcallbackurl, string onSuccessRedirectUrl, string onFailRedirectUrl)

参数:

appid:即申请QQ登录后分配的app id,六位数字。

appkey:即申请QQ登录后分配的app key,一长串字符串。

qqcallbackurl:用户在登录成功后,由腾讯调转到的地址。就是第一步我们配置的地址:*/login.axd,这里你无需关注,照着写就行了。

onSuccessRedirectUrl:登录完成后调转到网站的地址,这时,从 Qzone.OAuth.Utility.OpenId 属性,你可以得到用QQ号码对应的OpenId,一个号码对应一个OpenId。接下来你就可以自动的在你网站建立对应的用户或者绑定以前的用户了。

onFailRedirectUrl:登录失败调转的地址,此地址用来失败处理提示用户,该地址后附件错误代码,方便查询。

Silverlight吧中的示例:

public partial class tencentlogin : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Qzone.OAuth.Utility.Login(“000000”, “aaaaaaaaaaaaaaaaaaaaaaaaaaaaa”, http://www.sl8.so/login.axd”, “tencentloginsuccess.aspx”, “tencentloginfail.aspx”);
}
}

3.获取用户相关资源

由于其它资源需要认证,现在仅提供获取用户信息方法,此方法不需要进一步认证。

string Qzone.OAuth.Utility.GetUserInfo(DataFormatEnum format)

参数:

format:返回的数据类型,对应xml或者json,具体查看腾讯的看法文档。http://connect.opensns.qq.com/wiki/

在 调转到腾讯的登录界面后,发现它会刷新我们浏览器窗口的大小,说明腾讯在这个步骤是提倡我们用弹出窗口的方式登录的,所以最后是在window.open 里打开登录地址。一句话,现在你需要做的就是:主界面弹出登录窗口—>登录窗口的页面调用Login方法—>在成功后调转的页面绑定用户等操 作、再关掉弹出的窗口并刷新主界面。

  • 后记

1. 请求过程中,在生成oauth_signature参数签名值时,URL编码一定要用大写。

如:GET&http%3a%2f%2fopenapi.qzone…. 要写成 GET&http%3A%2F%2Fopenapi.qzone….

2. 生成oauth_signature的base64编码后需再次URL编码。

3. 请求用户信息后得的的头像是QQ空间的头像,而不是QQ的用户头像。

4. 为了测试的方便,可以修改系统的 hosts 文件。因为腾讯在跳转时,是调转到网站申请的域名,通过修改hosts 文件可以隐射的本机。

如:http://www.sl8.so

hosts 文件:

127.0.0.1 www.sl8.so

当浏览器调转到 http://www.sl8.so/login.axd 时,其实已经隐射到了127.0.0.1本机了。

[转载]Asp.net MVC初次加载时为什么会很慢

mikel阅读(1106)

[转载]Asp.net MVC初次加载时为什么会很慢 – zhoujie – 博客园.

ASP.NET MVC是一个不错的框架,最近开发一直使用。可是最近发现一个问题:MVC初次加载时很慢,有时我在默念计时到6,页面才显示出来,感觉上就比 ASP.NET慢。因为以前的程序都是ASP.NET开发的,两相对比,感觉很明显。不过这只限于第一次,后续访问感觉上又比asp.net快,我想这是 MVC输出的HTML简洁的缘故。

也许你会说,这不成问题,我自己充当第一个访问者就行了。可是问题在于公司的IIS服务器会定期回收应用程序池,一段时间后,又要经历第一次了。

昨天花了点时间翻了一下MVC2的源代码,最后Trace到如下代码是性能瓶颈:位于WebFormViewEngine.cs中的FileExits函数。

protected override bool FileExists(ControllerContext controllerContext, string virtualPath) {
try {
controllerContext.HttpContext.Trace.Write("FileExists");

object viewInstance = BuildManager.CreateInstanceFromVirtualPath(virtualPath, typeof(object));
controllerContext.HttpContext.Trace.Write("FileExistsEnd");

return viewInstance != null;
}
catch (HttpException he) {
if (he.GetHttpCode() == (int)HttpStatusCode.NotFound) {
// If BuildManager returns a 404 (Not Found) that means the file did not exist
return false;
}
else {
// All other error codes imply other errors such as compilation or parsing errors
throw;
}
}
catch {
return false;
}
}

一下是Trace截图:

如果是第一次修改后编译运行,就会收到一个2.46秒的等待!有时会更长,因为我测试的View和Controller都很简单。

原因分析:

ASP.NET MVC 默认其实还是动态编译的,第一次时间都浪费在编译加载上了。

解决方法:

改为预编译。对于IIS定期回收的,还是没有好办法。我只能编个程序每隔20分钟访问一次,让MVC时刻保持活力!哈哈!

如何预编译MVC?

Q: Is there a way to precompile MVC application including code and views for deployment?
A: You need to install the Visual Studio Web Deployment add-in (see http://www.microsoft.com/downloads/details.aspx?FamilyId=0AA30AE8-C73B-4BDD-BB1B-FE697256C459&displaylang=en)  In your MVC solution, right click on the MVC project and select “Add Web Deployment Project…” (thanks to Jacques) — running the command line utility using aspnet_compiler will also do the job. The command line is:(framework directory)\aspnet_compiler -v /virtualDirName outputdirectoryName

[转载]非常流行的十款 jQuery 插件推荐

mikel阅读(1073)

[转载]非常流行的十款 jQuery 插件推荐 – 梦想天空(山边小溪) – 博客园.

本文列举了10款最流行的 JQuery 插件,有验证用户输入的,有以真正用户友好的方式显示多媒体和图像的,有使数据以可视化的图形和图表的形式展示的等等。相信这十大流行的 JQuery 插件将有助于你的开发项目。

validate

1. Validate

这个 jQuery 插件让琐碎的客户端验证变得简单,提供了大量的定制选项,捆绑了很多有用的验证方法。

EasySlider

2. EasySlider

一款滑动插件,包含自动滑动,连续滑动,首页和末页按钮,垂直互动等,支持在一个页面放置多个滑动。

FancyBox
3. FancyBox

FancyBox 是一个以Mac风格的“lightbox”效果显示图片和其它HTML内容的插件,可自定义Ajax请求和导航。

Progressbar

4. Progressbar

一款很不错的进度条插件,可灵活设置。

Nyro Modal

5. Nyro Modual

NyroModal 是一个基于 jQuery 开发的可以灵活定制的模式弹窗插件。

Pirobox

6. Pirobox

pirobox 是一款可以制作出lightbox效果的jQuery插件。

Flot

7. Flot

Flot 是一个很棒的 jQuery 绘图插件。

Map Hi light

8. Map Hilight

maphilight 是一个高亮显示鼠标悬停区域地图的插件。

Super Fish

9. Super Fish

Superfish 是一个制作 Suckerfish风格菜单的 jQuery 插件。

Accordion

10. Accordion

Accordion 是一款用于制作手风琴效果菜单的 jQuery 插件。

(编译来源:梦想天空 原文来自:10 of the most popular jQuery plugins

[转载].NET实现之(ActiveX插件开发)

mikel阅读(1035)

[转载].NET实现之(ActiveX插件开发) – 南京.王清培 – 博客园.

在打算讲这篇文章之前我深思一个下午,打算分两篇来讲的,但是又怕读者看着嫌烦;其实稍 微了解一点ActiveX插件的朋友都能知道,这样一扯可能出现一堆问题;但是我还是决定通过简单的方式尽量让初学者少接触底层的东西包括OLE(对象连 接与嵌入)、COM(组件对象模型)之类的概念,但是ActiveX插件在开发上有很高的技术要求,虽然.NET为我们封装了很好的实现途径,但是我们也 总不能停留在,知自然而不知其所以然的层面上;今天这篇文章我大概构思了一下,我主要会由浅入深的去逐层的讲解,对一些概念性的东西,我会给出参考资料供 大家去学习,由于它的发展历史我也就不去讲解了,主要是实现为主;如果喜欢刨根问底的朋友可以去查询相关的文章或者看一些关于OLE、COM方面的书籍, 就算我们不从事相关开发,但是对于我们进行.NET互操作方面还是很有帮助的,也不至于让我们觉得.NET的局限性;本人向大家推荐一本OLE方面的好 书:《OLE 2高级编程技术》

其实说起ActiveX插件大家都会想起Flash插件,对Flash插件就是一个很典型的COM组件,宿主在以OLE为容器的Web浏览器应用程 序中,我们把这个OLE容器称为复合文档应用,复合文档应用程序在微软的系统到处可见如:Office就是一个很强大的复合文档应用程序,为什么要称为复 合文档应用程序呢,是因为以容器为宿主的时候,可以进行任何应用集成开发,在office里面我们可以进行图表的编辑、Excel的编辑等等;在这个 OLE中使用的对象严格意思上讲都是COM组件,对COM不了解的朋友可以去看一下《COM本质论》也是一本很好的书籍,其实COM就是组件对象模型,是 二进制的组件,在任何平台任何语言之间都能使用;它是一套组件规范一套开发标准,大家都去遵守这个约定,才能使不同厂商生产的组件互相调用;而 ActiveX插件就是一个COM组件,在早期的开发中对COM的开发是一种望而生畏的感觉,也许我们做.NET开发的程序的感觉开发组件DLL可能并没 有多大难度,不需要去了解一些操作系统底层的东西比如:函数在编译过后重新编码对调用产生的影响,不同操作系统对可执行文件的内存分配回收等等问题,都需 要开发组件的人了如指掌之后才能开发出出色的COM组件,然而在今天我们站在.NET这艘航母上,不需要害怕这些复杂的技术难题,微软为我们打开一扇通往 平坦大道的大门,用最简单的方式去开发最复杂的东西,从某种角度讲是好事,坏事就是让我们越来越远离核心的东西; 这就要看每个人对技术的追求目标了;

由于.NET开发出来的东西都是属于托管的,所以不是正真意义上的二进制标准,这就牵扯到.NET平台调用的技术P/Invoke和互操作 Interop技术,但是我们不了解也没关系,这不影响我们开发ActiveX插件,我只是给大家指一个方向;用.NET开发出来的东西要想完全替代 COM组件,因为OLE容器只接受COM组件才能使用,所以我们的托管DLL文件怎样才能被OLE容器调用呢,就是通过.NET互操作COM来实现,我们 开发的ActiveX插件要被浏览器这么一个大强的复合文档程序加载和使用的,所以我们得将托管的组件包装成非托管的等价的COM组件才行,.NET提供 了CCW(COM可调用包装)的机制,将我们的ActiveX插件通过中间转换一下就可以使用了,理论的东西我就到此结束,我们开始动手做一个 ActiveX插件吧;先看一下ActiveX插件的运行图:

1:

这是系统在运行过程中要经历的过程调用步骤,有助于我们下面的开发讲解;首先是浏览器接受到远程服务器返回的HTML文本,然后浏览器将HTML转 换成DOM对象在通过GDI或者GDI+进行绘制渲染等界面呈现工作,发现在HTML中包含了对本地机器上的COM组件调用,通常也就是我们HTML中的 object标签所定义的说明;在标签中会包含COM组件的唯一标识符GUID(全局唯一ID),在我们机器存在着成千上万个COM组件,只有通过 GUID才能确定是哪一个组件,浏览器通过GUID到注册表中去查找这个COM组件在本机注册时的地址,得到地址后在将其COM组件加载到内容运行;这个 过程被我细化了,只要能说明原理就行了;

下面我们进入到VisualStudio工具进行ActiveX插件开发,我们要新建一个项目这个项目必须得以DLL文件的形式存在,但是要是ActiveX插件必须得有界面啊;所以我们新建一个Windows窗体控件库项目:

2:

新建后会出现一个默认的用户自定义控件我们随便放一个按钮就行了,然后写点测试代码;

3:

每一个ActiveX插件都有一个入口地址,这就是COM入口地址;我们就拿我们上面的这个测试界面作为入口地址;我们切换到代码视图;

4:

我们在这个类的上面添加了两个特性,ComVisible是否对COM公开,这个特性的意思就是说我们的组件是否能用于COM组件的相关调用查找; 如果没有这个特性我们的组件是不能用作COM调用的;GUID特性就是用来为我们的这个类型确定一个部署到客户机器的唯一标识符;这个GUID可以通过 VisualStudio工具栏中的功能自动创建;我们还差一步就成功完成了这么一个庞大的工程了,我们右击项目选择属性会出来下面这个界面:

5:

将为COM互操作注册勾选上,作用就是为了能与COM等组件进行相互调用了,在我们程序目录中会生成一个和组件名称一样的tlb文件,必须有这个文 件我们才能使用这个插件,tlb文件是一个类型库文件,作用就是将托管DLL文件的所有信息导出成COM规范的接口文件,在这个tlb文件中定义了COM 的调用约定;由于COM和.NET组件无法直接交互所以只能通过tlb文件来确定我们的托管的DLL文件中定义哪些东西;我们编译一下;我们还差一个 HTML文件,这个文件随便是来自哪里都可以,这个HTML文件里面要定义调用我们这个ActiveX插件才行;

6:

我红色箭头标记的地方就是Object标记所定义的调用代码,ID就是为调用的ActiveX插件起的一个名字便于在页面中通过JS进行互操 作;CLASSID是要调用的ActiveX插件在用户机器上的GUID唯一标识符;CODEBASE如果用户机器上没有安装这个插件则让浏览器帮忙下载 的URL地址;其他的标记就是和普通的HTML一样的了;在此我穿插一下,所有的HTML标记最终都会被转换成实实在在的对象,而不是我们所谓的HTML 纯文本;

我们保存HTML文件,并且打开这个文件就能看见ActiveX插件被加载运行了;

7:

我这里之间简单的讲解了一下ActiveX插件的基本创建过程,其实ActiveX插件的功能很强大,对B/S一些的功能只能通过插件来解决如:大 文件上传、视频采集、照片动态采集等等;插件在部署的时候一定要注意,部署到用户机器上的时候,在属性栏中有一个文件注册方式,一定要选择为COM注册这 样才能在注册表中添加相应的节点;ActiveX插件开发大概就讲完了;希望讲的还算清晰明了;

[转载]实现软键盘的几个关键技术

mikel阅读(1106)

[转载]实现软键盘的几个关键技术 – eaglet – 博客园.

作者:eaglet

转载请注明出处

在嵌入式应用和一些安全软件中经常需要不通过物理键盘输入,虽然微软提供了也一个软键盘,但这个软件盘不能定制界面不能自动感应当前光标是否处于输入状态,所以有时候我们还是需要自己来实现这个软键盘。本文将讲解自己实现软键盘时涉及到的几个关键技术。

一、浮动窗体的实现

软键盘的窗体和普通窗体不一样,这个窗体在成为当前窗体时,不会影响其它进程的窗体的光标焦点。也就是说虽然这个窗体现在为当前激活的前台窗体,但光标仍然停在其他进程的窗体上。

image

如上图所示,虽然软键盘在记事本的前面,但光标仍然在记事本上。

要实现这个技术,我们必须要把当前窗体设置为浮动工具条才行。这里我给出 C# Winform 的实现方法:

        private const int WS_EX_TOOLWINDOW = 0x00000080;
        private const int WS_EX_NOACTIVATE = 0x08000000;

        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                cp.ExStyle |= (WS_EX_NOACTIVATE | WS_EX_TOOLWINDOW);
                cp.Parent = IntPtr.Zero; // Keep this line only if you used UserControl
                return cp;

                //return base.CreateParams;
            }
        }

如上代码就是将 Winform 指定为浮动工具条窗体。只要在winform 的类中重载 CreateParams 函数,并按上述代码编写就可以了。

二、如何检测当前处于输入状态

在一些嵌入式设备中,我们没有物理键盘,所有的输入都是通过触摸屏和软键盘输入。那么这个时候,我们必须要做到只有处于输入状态时才弹出软键盘,否则如果软键盘一直在界面上,既不美观也妨碍其他程序的正常使用。

要实现这个功能,我们能想到的最直接的方法是 windows 是否会在当前处于输入状态下时发一个什么事件,或者通过什么钩子程序来实现。但我研究了很久,没有找到这种方法。如果哪位知道这种方法,不妨在回复中告诉我。

我目前找到的方法是定时询问 windows 的当前窗体是否处于输入状态。

            IntPtr hWnd = GetForegroundWindow();

            uint processId;
            uint threadid = GetWindowThreadProcessId(hWnd, out processId);

            GUITHREADINFO lpgui = new GUITHREADINFO();
            lpgui.cbSize = Marshal.SizeOf(lpgui);

            if (GetGUIThreadInfo(threadid, ref lpgui))
            {
                if (lpgui.hwndCaret != 0)
                {
                    return hWnd;
                }
            }

如上面代码所示

首先我们通过  GetForegroundWindows API 得到当前窗体的句柄。然后我们再通过 GetGUIThreadInfo 得到当前窗体的一些属性。这些属性在 GUITHREADINFO 中定义

        public struct GUITHREADINFO
        {
            public int cbSize;
            public int flags;
            public int hwndActive;
            public int hwndFocus;
            public int hwndCapture;
            public int hwndMenuOwner;
            public int hwndMoveSize;
            public int hwndCaret;
            public System.Drawing.Rectangle rcCaret;
        }

上面是  GUITHREADINFO  结构。我们可以通过这个信息得到当前窗体中当前焦点的子窗口句柄,当前获得光标的子窗口句柄,当前正激活的子窗体句柄等等。这里我们只要用到当前获得光标 的子窗口句柄,就是 hwndCaret 。如果hwndCaret 不为0,则表示当前窗体处于可输入状态。

相关API函数的 C# 定义如下:

        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool GetGUIThreadInfo(uint idThread, ref GUITHREADINFO lpgui);
        [DllImport("user32.dll")]
        public static extern IntPtr GetForegroundWindow();
        [DllImport("user32.dll", SetLastError = true)]
        static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);

三、模拟键盘输入

模拟键盘输入比较简单,.Net 提供了一个静态函数来模拟键盘输入

System.Windows.Forms.SendKeys.Send

这个函数很简单,而且微软的帮助也很全面了,我这里就不多说了。

另外我们还可以用更加底层的 API 函数来模拟键盘的输入

        [DllImport("user32.dll")]
        static extern void keybd_event(byte bVk, byte bScan, uint dwFlags,
           int dwExtraInfo);

这个函数是 keybd_event,关于这个函数的使用,微软的帮助也写的很清楚,这里也不重述了。

[转载]Python 和 PyGame 的一些示例

mikel阅读(1198)

[转载]Python 和 PyGame 的一些示例 | 酷壳 – CoolShell.cn.

看到一个网页收集了很多使用Python和PyGame写游戏的示例,分享给大家。(注:我不知道用Python/PyGame写游戏其性能会怎么样,但是一些小游戏应该是没有问题的)

这个网页同时给了一本介绍Python和PyGame的电子书(PDF),下面的这些例子就是这本书的示例。所有的这些示例可以打包下载

基础 Python 示例

Pygame 图形示例

pygame_base_template.py – 开启一个黑的 pygame 窗口。当你要写一个新的代码时,你可以使用这个示例的代码初始化你的程序。
simple_graphics_demo.py – 作图,画一些简单的图形。 simple_graphics_demo_thumb.png

functions_and_graphics.py – 图一些雪人。
animating_snow.py – 下雪动画。 Animating Snow
move_keyboard.py – 使用键盘移动一个图形move_mouse.py – 使用鼠标移动一个图形

move_game_controller.py – 使用游戏手柄移动一个图形

bitmapped_graphics.py – 显示一些图片(png, jpb),并加入一些声音。
array_backed_grid.py – 一个网格,可以用来开发一些棋类的游戏。

Pygame 示例

sprite_collect_blocks.py – 使用鼠标移动一个小点
sprite_collect_circle.py – 和上面的示例一样,只不过是圆点。
sprite_collect_graphic.py – 和上面的示例一样,只不过是图片。
move_sprite_mouse.py – 用鼠标移动一个点move_sprite_keyboard_jump.py – 用键盘移动一个点(跳动式的)

move_sprite_keyboard_smooth.py – 用键盘移动一个点(平滑式的).

move_sprite_game_controller.py – 用游戏手柄移动一个点

move_with_walls_example.py – 移动一个点,但是会被墙阻止。

游戏示例

bounce_ball_with_paddle.py – 两个玩家玩对碰球游戏,需要两个手柄。
breakout_simple.py – 一个简单的游戏,显示 “Game Over” 信息.
一个学生的作业. Spring 2011
另一个学生的作业. Fall 2010Download games – .

创建一个安装包

Python Pygame 安装包教程

搜索和排序示例

文件示例

high_score.py – Example that shows how to read and write a high score to the disk so that it persists between program runs.

其它信息