[blog]WordPress 2.8 RC 及中文包发布

mikel阅读(664)

伴随着WordPress 2.8 Release Candidate 1的发布,WordPress 2.8已经基本完成了,如果不出意外,这周三,也就是6月10号,WordPress 2.8将正式发布。 

欢迎大家积极测试,有问题可以留言,老生常谈的一句话:这个版本的程序主要是完成了WordPress主题的后台搜索、预览、安装。

WordPress 2.8 RC1下载地址:http://wordpress.org/wordpress-2.8-RC1.zip
Wopus版:WordPress 2.8 RC1的中文包

[Flex]Flash Builder 4 / Flash Catalyst 下载

mikel阅读(1101)

         6月1日,Adobe在今天中午发布了Flash Builder 4 Beta1和Flash Catalyst Beta1。

        需要特别说明的是Flash Builder 即原先的Flex Builder。名称的更改是Adobe方面希望统一开发软件名称的一个方式,即他们都基于FLASH平台。至于FLEX SDK/ framework 依然是以FLEX命名,FLEX的开发工作并不是只能用Flash Builder不可,所以该软件的更名对FLEX本身没有任何影响。

        在Flash Builder 4安装前会提示选择语言,该版本种包含了简体中文。建议选择,更便于日后的中文软件学习和交流。

        而Flash Catalyst之前的开发代号为Thermo。这是一个为FLEX设计师准备的软件,通过Catalyst,设计师与程序员可以更好的搭配之间的工作。目前airia正在编写Catalyst的入门教程。关于Catalyst更多的信息可以查看这里

 

官方主页:

Flash Builder 4 主页       Flash Catalyst 主页

下载地址:

Flash Catalyst    [ 下载地址一 for windows ]  序列号 1395-1003-6369-7619-0587-6556

Flash Builder 4    [ 下载地址一  for windows ]

更多相关下载:

for Eclipse  Download Flash Builder 4 Plugin for Windows (EXE, 314 MB)

AIRIA论坛跟进:

Flash Catalyst 开版   http://bbs.airia.cn/FlashCatalyst/list-1.aspx

Flash Builder 4 软件应用专版   http://bbs.airia.cn/Flash_Builder_4/list-1.aspx

新版 入门教程进入撰写阶段

 

 

新增功能:
Flex SDK
* 引入一个全新的功能强大的组件皮肤框架,叫做Spark。
* 基于Spark框架进行初始化的组件可以与Flex3中的Halo组件集合混合和匹配使用。
* 支持声明化的,动态的MXML图形,以及FXG格式的图形。
* 全新的Spark默认外观,支持全新的样式集合。
* 更强大的布局支持,包括支持MXML图形元素,增强对于翻转和其他变形的支持,支持指定自定义的布局,增强z轴管理。
* 一些新的和增强的特效,包括支持MXML图形元素的动画,通过自定义的动画修改,更多易用的API调用方式,更多的自动化的交互行为。
* 3D特效支持
* Flash动画滤镜,包括Pixel Bender。
* 更多高级字体支持。基于Flash Text 引擎和Text布局框架,也支持CFF(Compact Font Format)。
* 编译器性能提升。
* 新的MXML语言功能,包括MXML 2009命名空间,声明,库和标签定义。
* CSS增强,包括支持命名空间,继承选择器,ID选择器,更多的类选择器和针对组件状态的伪选择器支持。
* 语法增强和状态states增强。
* 方便的数据双向绑定语法。
* ASDoc支持在mxml文件里的组件。
* 增强的HTML模板,基于SWFObject。
* adobe.com存放 SDK运行时共享库RSL。
* 额外的本地化支持,更好的开发本地化应用。
Flash Builder新功能
* 一个面向创建数据服务应用的新工作流(包括CF,PHP,Java,WebServices)。
* 支持由Flash Catalyst创建的FXG项目
* 一个全新的Network监控,帮助诊断客户端和服务器段的通讯问题
* Flex 单元测试整合。
* 自动生成getter和setter。
* ASDoc支持在MXML和AS中显示ASDoc注释
* 自定义文件模板支持MXML,AS和CSS文件。
* 自动生成事件处理函数结构。
* 调试器增强。
* Profiler增强。
* Refactoring增强
* 新的Component kit for Flash CS4
* 新支持命令行构建执行方式。
* 导入和应用Flex主题新用户界面。
* 新的Flex类包浏览器替代Flex Navigator面板。

[SQL] SQL2008中"阻止保存要求重新创建表的更改" 的处理

mikel阅读(811)

当用户在在SQL Server 2008企业管理器中更改表结构时,必须要先删除原来的表,然后重新创建新表,才能完成表的更改,如果强行更改会出现以下提示: 不允许保存更改。您所做的更改要求删除并重新创建以下表。您对无法重新创建的标进行了更改或者启用了“阻止保存要求重新创建表的更改”选项。

如果要去掉此提示,打开SQL 2008 在最上面

工具-〉选项-〉左侧有个 设计器-〉表设计器和数据库设计器 -> 阻止保存要求重新创建表的更改(右侧) 把钩去重新启动2008即可

[Flex]谈Flash Builder、Flash Catalyst与Flash Platform

mikel阅读(900)

原文链接:http://www.k-zone.cn/zblog/post/flash-buidler-flash-catalyst-flash-platform.html

之前写了一篇叫做《为什么国内的公司都不敢使用Flex作为产品的平台与主要开发语言》 的文章,其中有一个观点:名称混淆,其中描述了Flash、Flex Builder、Flex SDK、Flash IDE(CS4)等产品的名称非常的模糊,不利于初学者掌握和使用。举个最简单的例子,我跟其他人称呼我是Flex开发人人员?ActionScript 开发人员的时候,不懂的朋友都会反问我,你是搞Flash的吗?(-.-)=3
5月16日Adobe发布了一个重磅级的消息,下一代Flex Builder,即Flex Builder 4.0(是IDE,而非SDK),将改名为Flash Builder。截止到现在基本上已经时隔将近一周的时间,那么我来谈谈我对这次改名事件的看法。
我们得知Flex Builder → Flash Builder,但是不变的是Flex SDK的名称,仍旧叫做Flex SDK。相对与Adobe来说,这只是一个技术层面的修正。
而从更高的层面看待Adobe的产品,不难可以发现如下的一些信息。
Adobe CS(4) 套装:包含了Photoshop、Dreamweaver、Fireworks、Flash IDE等一些常用的设计工具,而这些工具基本上是面向设计人员的,可以称之为设计工具。

Flex SDK、MXML、ActionScript 3.0、AIR:这些产品无须质疑,全部都是面向开发人员的,可以称之为编程语言、框架。
BlazeDS、LCDS、FMS等:同样无须质疑的是,这些产品都是面向服务器端的产品,可以称之为服务器端。
okay,让我们看一下下面这个例图:

从上图可以看到,目前来说Adobe有了设计工具、有了自己的编程语言、框架类、也有了服务端的产品,但是似乎它们之间的产品联系少了一些,尤其是工具类的使用之与服务器端、框架类的使用人员的联系少了一些。
因此Adobe提出了Flash Catalyst的概念,而Flash Catalyst是针对于交互设计师的工具。
Adobe的想法:

1、让Flash Catalyst来读取Photoshop、Fireworks等设计工具的设计资源,然后在其中完成交互部分的工作。
2、Flash Catalyst可以导出为Flash Builder 4可以理解和解析的内容。
3、最终由开发人员使用Flash Builder 4等工具来完成主要的逻辑功能部分。
4、最终也可以搭载Adobe的服务器端产品:BlazeDS、LCDS、FMS。
因此Flash Catalyst的作用不仅仅在于交互设计,而是将Adobe的这三种相对于孤立的产品形成一个体系。
请看下图: 

 

 

通过上图,很容易可以看出Flash Catalyst让Adobe产品更像是一个整体。而这一切,其实已经被Adobe定义成了一个平台级别的产品:Flash Platform。

让我们再回头看一下Flash Builder的真正含义。

这次改名事件可以让Flash Platform的产品更加的明确化。例如一提到CS系列,则会让人马上想到的是Photoshop等设计工具,提到Flash Catalyst则让人想到的是交互工具。提到BlazeDS、LCDS、FMS则会想到服务器端产品。

未改名前的话,会出现什么情况呢?提到Flex,那么它到底代表的是SDK、还是IDE呢?因为SDK、IDE都叫做Flex XXXX,更莫名其 妙的是AIR的IDE也称之为Flex XXXX,这就真的让人头大了。而无论是 Flex SDK(Framework)、XMML、ActionScript 3.0、AIR其实本质上都是swf,也就是都是Flash。

因此如果我们把Flex Builder改名为Flash Builder的话,这个系列的产品则更加的清晰。

例如:提到Flex,则指的就是Flex SDK(Framework)、提到MXML、ActionScript 3.0则指代的就是编程语言、提到AIR,则指代就是AIR Framwork。而提到Flash Builder,则会马上知道它是IDE,即可以编写、编译、运行、MXML、ActionScript 3.0。同时也是Flex、AIR的编写IDE。

也就是说,Flex被定义成了框架的名字,这样一来,就与AIR的概念是一样的。那么大家记住,Flex是一个框架,是什么框架呢?就是Flash的一种框架,看这样是不是很清晰了呢!

改名的另外一个好处则是:

1、当有人问我的时候,我可以说自己是Flash开发人员,那么这些人就会知道我会使用Flex、AIR、MXML、ActionScript 3.0这些内容。

2、如果使用Flash CS(4)的朋友可以称之为Flash设计人员。

3、如果使用Flash Catalyst的朋友,则可以称之为产品交互人员。

看,这样多清晰:)你说对吗?

最后一图(Flash Platform):


最后再猜测一点:
Flash Platform战略慢慢浮出水面,是与Microsoft的WPF与Silverlight战略是息息相关的。:)

[Flex]学习资料总汇:Flash Builder 4、Flex 4 SDK 以及 Flash C

mikel阅读(706)

[PJBlog]PJBlog转WordPress

mikel阅读(835)

PJBlog转WordPress
PJBlog是个非常好的ASP单用户blog程序,用户非常之多。台湾还有好多呢。我曾经就是PJBLOG的用户。后来转到WP。几乎是新建了一个。这几天搜集了一下PJBLOG转WordPress程序。总结如下:
有两个方法。utom的和aw的。AW是在UTOM的基础上改写的。转换更为彻底。推荐使用。因为主要代码是抽取UTOM的。所以转换步骤跟UTOM的是一样的。特别注意,导入时用Linux系统,Win主机的朋友可以Linux的朋友帮下忙,导入后再将数据转出。转换方法如下:
1。先下载AW的转换程序并解压;
2。打开文件编辑数据库的位置;
3。上传到PJBlog根目录;
4。运行此程序并保存内容到本地;
5。编辑内容删掉第一行。保存为UTF-8模式;
6。WP登陆后台->导入-> Movable Type。 并上传之前保存在本地的内容;
Note: 能导入日志及评论。非Linux的服务器导入会出现一些小问题。 请登陆wp相关论坛进行求解。 如能导入少量内容并出错请刷新当前页面;
以上转自:utombox 以下转自:AW’S blog
总结。PJBlog到Word Press容易出问题的关键细节:
一、时间月份问题。这个我的fix已经解决了。
二、导入时用Linux系统。具体原因不太清楚……在Win32下面强制刷新也可以。但我有洁癖。不希望出现FatalError(为此我花了N个小时装Ubuntu……)Linux跑Apache/PHP/MySQL就是牛逼
三、用户名不得含有中文。目前我没有什么好方法解决。应该跟WP的表构造有关。懒得仔细看了。

版权声明

作者:dupola
原文标题:PJBlog转WordPress
原文链接:http://dupola.com/post/60
(C) dupola 版权所有,转载时必须以链接形式注明作者和原始出处及本声明

[CSS]css文字重复ie bug导致文字的奇怪复制

mikel阅读(878)

当多个浮动的元素彼此跟随,中间加注释的时候,最后一个浮动元素内的文本偶尔会复制到最下面去。学名Duplicate Characters Bug

程序代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "//www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="//www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>多了一只猪</title>
</head>
<body>
<div style="width:400px">
<div style="float:left"></div>
<!– –>
<div style="float:right;width:400px">↓这就是多出来的那只猪</div>
</div>
</body>
</html>

可以通过以下的办法来解决:
   1、不放置注释。最简单、最快捷的解决方法
   2、注释不要放置于2个浮动的区块之间。
    3、将文字区块包含在新的<div></div>之间,如:<div style="float:right;width:400px"><div>↓这就是多出来的那只猪</div>& lt;/div>。
   4、去除文字区块的固定宽度,与3有相似之处。
   5、有的人在猪后加一个<br />或者空格,但只是消除现象。
   6、不要给浮动元素设置多宽度,使其不会到达包含元素的底部,或者对最后一个元素设置margin-right: -3px;或者更小。
   7、注释可以这样写:<!–[if !IE]>Put your commentary in here…<![endif]–>

[Flex]Flex与.NET互操作(十二):基于FluorineFx.Net的及时通信应用(Rem

mikel阅读(1095)

      远程共享对象(Remote Shared Objects) 可以用来跟踪、存储、共享以及做多客户端的数据同步操作。只要共享对象上的数据发生了改变,将会把最新数据同步到所有连接到该共享对象 的应用程序客户端。FluorineFx所提供的远程共享对象(Remote Shared Objects)和FMS的共享对象的功能是一样,对于熟悉FMS开发的朋友来说,学习FluorineFx的远程共享对象是非常简单的。

      共享对象可以在服务器端创建,也可以在客户端创建。在客户端创建共享对象的方法和使用FMS开发是一样的,创建一个 NetConnection对象,通过该对象的connect()方法连接到服务器,然后通过SharedObject.getRemote()方法就可 以在客户端创建一个远程共享对象。如下实例代码:

private function connectionServer():void
{
    var nc:NetConnection 
= new NetConnection();
    nc.connect(
"rtmp://localhost:1617/SOAPP","username","password")
    nc.addEventListener(NetStatusEvent.NET_STATUS,onStatusHandler);
    nc.client 
= this;
}
private function onStatusHandler(event:NetStatusEvent):void
{
    
if(event.info.code == "NetConnectin.Connect.Success")
    {
        createSharedObject();
    }
}
private function createSharedObject():void
{
    var so:SharedObject 
= SharedObject.getRemote("OnLineUsers",nc.uri,false);
    so.addEventListener(SyncEvent.SYNC,onSyncHandler);
    so.connect(
this.nc);
    so.client 
= this;
}
private function onSyncHandler(event:SyncEvent):void
{
  
//..do other
}

 

      在FluorineFx的服务器端创建远程共享对象和FMS有很大的区别,FluorineFx的 ISharedObjectService接口提供了专门用于创建远程共享对象的方法 CreateSharedObject(),ApplicationAdapter实现了此接口方法。定义如下:

 

public bool CreateSharedObject(IScope scope, string name, bool persistent)
{
      ISharedObjectService service 
= (ISharedObjectService)ScopeUtils.GetScopeService(scope, typeof(ISharedObjectService));
      
return service.CreateSharedObject(scope, name, persistent);
}

 

      如果要在服务器端创建远程共享对象,直接调用ApplicationAdapter类中的CreateSharedObject()方法就可以。如下在FluorineFx服务器端创建远程共享对象的代码块:

ISharedObject users_so = GetSharedObject(connection.Scope, "OnLineUsers");
if (users_so == null)
{
       
//创建共享对象
        CreateSharedObject(connection.Scope, "OnLineUsers"false);
        users_so 
= GetSharedObject(connection.Scope, "OnLineUsers");
}

 

      要想更新共享对象里的数据客户端还是使用setProperty()方法,而FluorineFx的服务器更新共享对象的方法则与 FMS不一样,使用的是FluorineFx.Messaging.Api.IAttributeStore接口提供的SetAttribute()和 RemoveAttribute()方法来更新共享对象里的数据。

      陆续介绍了这么多,下面通过一个案例来看看该这么去应用远程共享对象。比如做IM、视频聊天、视频会议等及时通信类型的应用中,用户上线下线的频率非常高,这时候我们就可以使用远程共享对象去做在线用户的数据同步。 

      首先建立FluorineFx服务库,并建立一个应用类继承于ApplicationAdapter,通过重写ApplicationAdapter的相关方法来实现应用程序的不同需求,详细如下代码块:

using System;
using System.Collections.Generic;
using System.Text;
using FluorineFx.Messaging.Adapter;
using FluorineFx;
using FluorineFx.Messaging.Api;
using System.Diagnostics;
using FluorineFx.Messaging.Api.SO;
using FluorineFx.Exceptions;
using FluorineFx.Context;
using FluorineFx.Messaging.Api.Service;
using System.Collections;
using Fx.Adapter.DTO;
namespace Fx.Adapter
{
    
/// <summary>
    
/// 自定义ApplicationAdapter
    
/// </summary>
    [RemotingService]
    
public class MyApp : ApplicationAdapter
    {
        
/// <summary>
        
/// 应用程序启动
        
/// </summary>
        
/// <param name="application"></param>
        
/// <returns></returns>
        public override bool AppStart(IScope application)
        {
            Trace.WriteLine(
"应用程序启动");
            
return true;
        }
        
/// <summary>
        
/// 房间启动
        
/// </summary>
        
/// <param name="room"></param>
        
/// <returns></returns>
        public override bool RoomStart(IScope room)
        {
            Trace.WriteLine(
"房间启动");
            
if (!base.RoomStart(room))
                
return false;
            
return true;
        }
        
/// <summary>
        
/// 接收客户端的连接
        
/// </summary>
        
/// <param name="connection"></param>
        
/// <param name="parameters"></param>
        
/// <returns></returns>
        public override bool AppConnect(IConnection connection, object[] parameters)
        {
            
string userName = parameters[0as string;
            
string password = parameters[1as string;
            
if (password == null || password == string.Empty)
                
throw new ClientRejectedException(null);
            connection.Client.SetAttribute(
"userName", userName);
            
//获取共享对象(OnLineUsers)
            ISharedObject users_so = GetSharedObject(connection.Scope, "OnLineUsers");
            
if (users_so == null)
            {
                
//创建共享对象
                CreateSharedObject(connection.Scope, "OnLineUsers"false);
                users_so 
= GetSharedObject(connection.Scope, "OnLineUsers");
            }
            
//更新共享对象
            users_so.SetAttribute(userName, userName);
            
return true;
        }
        
/// <summary>
        
/// 加入房间
        
/// </summary>
        
/// <param name="client"></param>
        
/// <param name="room"></param>
        
/// <returns></returns>
        public override bool RoomJoin(IClient client, IScope room)
        {
            Trace.WriteLine(
"加入房间 " + room.Name);
            
return true;
        }
        
/// <summary>
        
/// 离开房间
        
/// </summary>
        
/// <param name="client"></param>
        
/// <param name="room"></param>
        public override void RoomLeave(IClient client, IScope room)
        {
            Trace.WriteLine(
"离开房间 " + room.Name);
            
base.RoomLeave(client, room);
        }
        
/// <summary>
        
/// 用户退出
        
/// </summary>
        
/// <param name="connection"></param>
        public override void AppDisconnect(IConnection connection)
        {
            
string userName = connection.Client.GetAttribute("userName"as string;
            ISharedObject users_so 
= GetSharedObject(connection.Scope, "OnLineUsers");
            
if (users_so != null)
            {
                
//从共享对象中移除当前退出系统用户
                users_so.RemoveAttribute(userName);
            }
            
base.AppDisconnect(connection);
        }
    }
}

 

      开发好了ApplicationAdapter,还需要对此ApplicationAdapter进行通信配置,在FluorineFx的应用程序目录中添加app.config并进行如下配置:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    
<application-handler type="Fx.Adapter.MyApp"/>
</configuration>

 

      另外还需要配置一个客户端方法的通信通道,通过FluorineFx网站下的WEB-INF/flex/service-config.xml配置:

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

      <channels>

          <channel-definition id="my-rtmp" class="mx.messaging.channels.RTMPChannel">
               
<endpoint uri="rtmp://{server.name}:1617" class="flex.messaging.endpoints.RTMPEndpoint"/>
          </channel-definition>

      </channels>

</services-config>

 

      如上便完成了服务器端的开发,在flash/felx客户端通过NetConnection去连接应用,并根据当前的连接去连接服务器端的远程共享对象,最后通过异步事件来实现数据同步更新。如下程序运行截图:

             

 

      此时开多个浏览器窗口测试,不同窗口使用不同的用户名登录,可以很清楚的看到,我们已经实现了在线用户的数据同步功能,可以及时的反映用户上线离线,可以及时的同步在线用户列表的数据。

 

      另外远程共享对象还有一个功能非常强大的特性方法,就是连接到共享对象的客户端之间可以直接广播消息(客户端调用客户端的方法)。就以 上面在线用户的案例为例,用户成功登陆服务器我需要广播一条消息,用户退出了我也需要广播一条消息,要实现这个功能就需要通过远程共享的客户端呼叫 (send()方法)来实现,如下代码块:

private function onCallClient(message:String):void
{
    so.send(
"onSayMessage",message);
}

      

      远程共享对象的send()方法调用了onSayMessage这个客户端方法来实现对连接到共享对象上的所有客户端广播消息,那么我们的在定义一个onSayMessage方法,如下:

/**
 * 接受客户端呼叫—此方法必须是public修饰
 
*/
public function onSayMessage(message:Object):void
{
    traceWriteln(message.toString());
}

private function traceWriteln(param:String):void
{
   txtTraceArea.htmlText += param + "\n";
   txtTraceArea.validateNow();
   txtTraceArea.verticalScrollPosition = txtTraceArea.maxVerticalScrollPosition;
}

 

            

      如果想实现用户退出广播,可以通过服务器端RPC的方法调用客户端的方法来实现,关于RPC请查看《Flex与.NET互操作(十一):基于FluorineFx.Net的及时通信应用(Remote Procedure Call)(二) 》有详细介绍。下面是Flex客户端的完整代码:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"  
    width
="530" height="378" backgroundGradientAlphas="[1.0, 1.0]" 
    backgroundGradientColors
="[#000000, #686868]" fontSize="12">
    
<mx:Script>
        
<![CDATA[
            import mx.controls.Alert;
            import dotnet.fluorinefx.VO.UserInfo;
            
            
private var nc:NetConnection;
            
private var so:SharedObject;
            
private var info:UserInfo;
            
            
private function connectionServer(event:MouseEvent):void
            {
                info 
= new UserInfo();
                info.UserName 
= this.txtUserName.text;
                info.Password 
= this.txtPassword.text;
                
                nc 
= new NetConnection();
                nc.connect(
"rtmp://localhost:1617/SOAPP",info.UserName,info.Password);
                nc.addEventListener(NetStatusEvent.NET_STATUS,onStatusHandler);
                nc.client 
= this;
                
                
this.txtUserName.text="";
                
this.txtPassword.text="";
                
this.txtUserName.setFocus();
            }
            
            
private function onStatusHandler(event:NetStatusEvent):void
            {
                
this.connStatus.text = "连接状态:" + event.info.code;
                
if(event.info.code == "NetConnection.Connect.Success")
                {
                    
//连接远程共享对象
                    so = SharedObject.getRemote("OnLineUsers",nc.uri,false);
                    
if(so)
                    {
                        so.addEventListener(SyncEvent.SYNC,onSyncHandler);
                        so.connect(nc);
                        so.client 
= this;
                    }
                    onCallClient(
"用户【 <font color=\"#4100b9\">"+info.UserName+"</font>】登陆了系统!");
                }
            }
            
            
private function onSyncHandler(event:SyncEvent):void
            {
                var temp:Array 
= new Array();
                
for(var u:String in so.data)
                {
                    
//traceWriteln("异步事件->共享对象:" + u + ":" + so.data[u]);
                    temp.push(so.data[u]);
                }
                
this.userList.dataProvider = temp;
            }
            
            
private function traceWriteln(param:String):void
            {
                txtTraceArea.htmlText 
+= param + "\n";
                txtTraceArea.validateNow();
                txtTraceArea.verticalScrollPosition 
= txtTraceArea.maxVerticalScrollPosition;
            }
            
            
private function onCallClient(message:String):void
            {
                so.send(
"onSayMessage",message);
            }
            
/**
             * 接受客户端呼叫
             
*/
            
public function onSayMessage(message:Object):void
            {
                traceWriteln(message.toString());
            }
        ]]
>
    
</mx:Script>
    
<mx:Label x="24" y="134" id="connStatus" width="288" color="#FFFFFF"/>
    
<mx:List x="342" y="10" height="347" width="160" id="userList" >
    
</mx:List>
    
<mx:Form x="24" y="10" width="236">
        
<mx:FormItem label="用户名:" color="#FFFFFF">
            
<mx:TextInput id="txtUserName" width="130" color="#000000"/>
        
</mx:FormItem>
        
<mx:FormItem label="密  码:" color="#FFFFFF">
            
<mx:TextInput id="txtPassword" width="130" 
                color
="#000000" displayAsPassword="true"/>
        
</mx:FormItem>
        
<mx:FormItem label="">
            
<mx:Button label="登陆服务器" click="connectionServer(event)" 
                enabled
="{this.txtUserName.text.length&gt;0?true:false}" color="#FFFFFF"/>
        
</mx:FormItem>
    
</mx:Form>
    
<mx:TextArea x="24" y="174" width="288" height="153" alpha="1.0" 
        backgroundColor
="#F2D2D2" backgroundAlpha="0.26" color="#FFFFFF" 
        id
="txtTraceArea" borderColor="#FFFFFF"/>
</mx:Application>

 

版权说明

  本文属原创文章,欢迎转载,其版权归作者和博客园共有。  

  作      者:Beniao

 文章出处:http://beniao.cnblogs.com/  或  http://www.cnblogs.com/

 

[手机开发]Windows Mobile 6.5 开发者工具包

mikel阅读(759)

    在一段时间的等待之后,Microsoft终于在其下载中心开放了《Windows Mobile 6.5 开发者工具包》的下载。这对于广大Windows Mobile爱好者来说,无疑是一个好消息,就当是一个迟到的儿童节礼物吧。

      Windows Mobile 6.5 Developer Tool Kit包括的组件:

说明文档

示例代码

头文件和库文件

模拟器镜像

Visual Studio中创建Windows Mobile 6.5应用的工具

      Windows Mobile 6.5 Developer Tool Kit包含Professional版本和Standard版本。目前,模拟器镜像的语言有6种,包括CHS(简体中文)、USA(英语)、GER(德语)、FRA(法语)、ITA(意大利语)和ESN(西班牙语)。Windows Mobile 6.5 Developer Tool Kit包括的模拟器镜像种类(主要是平台和分辨率的区别,和安装的Professional版本和Standard版本相关):

Windows Mobile 6.5 Professional Square Emulator

Windows Mobile 6.5 Professional QVGA Emulator

Windows Mobile 6.5 Professional WQVGA Emulator

Windows Mobile 6.5 Professional VGA Emulator

Windows Mobile 6.5 Professional WVGA Emulator

Windows Mobile 6.5 Standard Square Emulator

Windows Mobile 6.5 Standard QVGA Emulator

    对于广大开发人员来说,最具吸引力的应该就是其中的Windows Mobile 6.5 Gesture API,这可以在开发包中找到相关的例程,在”%"Windows Mobile 6.5 Developer Tool Kit"Samples" folder”目录下。当然,这个Gesture API也只是支持Windows Mobile Classic Professional平台,因为大家知道,Classic是不支持触摸的。

    我下载了一个中文的Windows Mobile 6.5 Developer Professional Tool Kit,尝试使用了一下Windows Mobile 6.5 Professional Emulator,截了一些图片上来。

     第一次启动模拟器的时候,占用的资源还不小,如下图1所示:

1:启动模拟器占用的资源

    开始菜单,的确和我现在在使用的6.0有比较大的区别:

2:开始菜单

      MyphoneMarketplace应用:

3:MyphoneMarketplace应用

    Home界面

4:Home界面

    设备信息:

5:设备信息界面

相关链接:

下载地址:Windows Mobile 6.5 开发者工具包

Windows Mobile Team Blog

Windows Mobile Developer Center

What's New for Developers in Windows Mobile 6

[Lucene]多个TermQuery或一个MultiFieldQueryParser多条件查询

mikel阅读(1481)

 import java.io.IOException;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;

/**
 * 与或非布尔查询——Lucene中的BooleanQuery
 * @author USER
 *
 */
public class TestBooleanQuery {
   /**
    * 主函数,运行测试程序
    * @param args
    * @throws Exception
    */
 public static void main(String[] args) throws Exception {   
     //建索引
  createIndex();   
      
  //多个TermQuery构建BooleanQuery检索
      searchIndex4TermQuery();
    
     //一个MultiFieldQueryParser构建BooleanQuery多个域的检索
     searchIndex4MultiFieldQueryParser();
   }   
    
 /**
  * 建索引
  * @throws Exception
  */
   public static void createIndex() throws Exception {   
     Document doc1 = new Document();   
     Field field = null;   
     field = new Field("name", "word1 word2 word3", Field.Store.YES,   
         Field.Index.TOKENIZED);   
     doc1.add(field);   
     field = new Field("title", "doc1", Field.Store.YES, Field.Index.TOKENIZED);   
     doc1.add(field);   
   
     Document doc2 = new Document();   
     field = new Field("name", "word4 word5", Field.Store.YES,   
         Field.Index.TOKENIZED);   
     doc2.add(field);   
     field = new Field("title", "doc2", Field.Store.YES, Field.Index.TOKENIZED);   
     doc2.add(field);   
   
     Document doc3 = new Document();   
     field = new Field("name", "word1 word2 word6", Field.Store.YES,   
         Field.Index.TOKENIZED);   
     doc3.add(field);   
     field = new Field("title", "doc3", Field.Store.YES, Field.Index.TOKENIZED);   
     doc3.add(field);   
   
     /**
      * 为测试MultiFieldQueryParser而添加的文档
      */
     Document doc4 = new Document();   
     field = new Field("name", "word1 word2 word3", Field.Store.YES,   
          Field.Index.TOKENIZED);   
     doc4.add(field);   
     field = new Field("title", "doc1 word1", Field.Store.YES, Field.Index.TOKENIZED);   
     doc4.add(field);
    
     /**
      * 对MultiFieldQueryParser更深理解
      */
     Document doc5 = new Document();   
     field = new Field("title", "北京2008年奥运会", Field.Store.YES,   
          Field.Index.TOKENIZED);   
     doc5.add(field);   
     field = new Field("name", "这是一届创造奇迹、超越梦想的…….", Field.Store.YES, Field.Index.TOKENIZED);   
     doc5.add(field);
    
     Document doc6 = new Document();   
     field = new Field("title", "北京2008年奥运会", Field.Store.YES,   
          Field.Index.TOKENIZED);   
     doc6.add(field);   
     field = new Field("name", "这是一届创造奇迹、超越梦想的奥运会…….", Field.Store.YES, Field.Index.TOKENIZED);   
     doc6.add(field);
    
     IndexWriter writer = new IndexWriter("e:\\java\\index",   
         new StandardAnalyzer(), true);   
     writer.addDocument(doc1);   
     writer.addDocument(doc2);   
     writer.addDocument(doc3);
    
     writer.addDocument(doc4);
    
     writer.addDocument(doc5);
     writer.addDocument(doc6);
    
     writer.close();   
   } 
  
   /**
    * 由TermQuery和BooleanQuery构建的多个域检索
    * @throws Exception
    */
   public static void searchIndex4TermQuery() throws Exception{
    TermQuery query1 = null;   
      TermQuery query2 = null;   
      TermQuery query3 = null;   
      TermQuery query4 = null;   
      TermQuery query5 = null; 
      TermQuery query6 = null; 
      BooleanQuery bquerymain = null;   
      BooleanQuery bquery1 = null;   
      BooleanQuery bquery2 = null;   
      BooleanQuery bquery3 = null;   
      Hits hits = null;   
    
      IndexSearcher searcher = new IndexSearcher("e:\\java\\index");   
    
      query1 = new TermQuery(new Term("name", "word1"));   
      query2 = new TermQuery(new Term("name", "word2"));   
      
      query3 = new TermQuery(new Term("name", "word3"));
     
      query4 = new TermQuery(new Term("name", "word4"));   
      query5 = new TermQuery(new Term("name", "word5"));   
         
      query6 = new TermQuery(new Term("name", "word6"));   
         
         
    
      // 构造布尔查询(可根据你的要求随意组合)   
      bquerymain = new BooleanQuery();   
      bquery1 = new BooleanQuery();   
      bquery2 = new BooleanQuery();   
      bquery3 = new BooleanQuery();   
    
      bquery1.add(query1, BooleanClause.Occur.MUST);   
      bquery1.add(query3, BooleanClause.Occur.MUST);   
         
      bquery2.add(query3, BooleanClause.Occur.MUST);   
      bquery2.add(query4, BooleanClause.Occur.MUST);   
         
      bquery3.add(query5, BooleanClause.Occur.MUST);
      bquery3.add(query6, BooleanClause.Occur.MUST_NOT);
         
      bquerymain.add(bquery1, BooleanClause.Occur.SHOULD);   
      bquerymain.add(bquery2, BooleanClause.Occur.SHOULD);   
      bquerymain.add(bquery3, BooleanClause.Occur.MUST); 
     
      /**
       * 根据你的要求建一个BooleanQuery对象,然后来查询
       */
      hits = searcher.search(bquery3);   
      printResult(hits, bquery1.toString());   
    
   }
   
   /**
    * 由MultiFieldQueryParser和BooleanQuery构建的多个域检索
    * @throws Exception
    */
   public static void searchIndex4MultiFieldQueryParser() throws Exception{
      Hits hits = null;   
    
      IndexSearcher searcher = new IndexSearcher("e:\\java\\index");   
    
      // 构造布尔查询(可根据你的要求随意组合) 
      BooleanClause.Occur[] flags = new BooleanClause.Occur[] {
     BooleanClause.Occur.MUST, BooleanClause.Occur.MUST};
    
      Query query = MultiFieldQueryParser.parse("word1", new String[] {
     "name", "title"}, flags, new StandardAnalyzer());
    
    /*  //加深对MultiFieldQueryParser的理解(注意看建索引的文档doc5,doc6与检索后的结果)
      Query query = MultiFieldQueryParser.parse("北京 奥运会", new String[] {
     "name", "title"}, flags, new StandardAnalyzer());    */
   
      hits = searcher.search(query);   
      printResult(hits, query.toString());   
    
   }
  
   /**
    * 打印输出检索出的文档,并输出检索的布尔语句
    * @param hits
    * @param key
    * @throws Exception
    */
   public static void printResult(Hits hits, String key) throws Exception {   
     System.out.println("查询 " + key);   
     if (hits != null) {   
       if (hits.length() == 0) {   
         System.out.println("没有找到任何结果");   
       } else {   
         System.out.println("找到" + hits.length() + "个结果");   
         for (int i = 0; i < hits.length(); i++) {   
           Document d = hits.doc(i);   
           String dname = d.get("title");   
           System.out.print(dname + "   ");   
         }   
         System.out.println();   
         System.out.println();   
       }   
     }   
   }   
}