西昌2016卫星发射计划:支少爷的剑 的日志 — Windows Liveiop

来源:百度文库 编辑:九乡新闻网 时间:2024/05/03 05:25:56
设置全屏Symbian C++应用程序
有几种不同的方式可以设置全屏程序
1、覆盖system panes
这个方法主要用在传统的view架构中,当view不是全屏时,可以通过调用CCoeControl::SetExtentToWholeScreen()方法来获取全屏。不过应该在MyView::ConstructL中调用ActivateL()之前调用。如下:
Code:
void CHelloWorldPlusAppView::ConstructL(const TRect& aRect)
{
// Create a window for this application view
CreateWindowL();
// Set the window size
SetRect(aRect);
// This view is a full-screen view.
SetExtentToWholeScreen();
// Activate the window, which makes it ready to be drawn
ActivateL();
}
当应用程序为skinned时是不推荐使用这个函数的(从Series60 2nd Edition向后,查看配置)。不管怎么说,全屏程序也不需要这个设置,因此这个应该不是问题:)
2、隐藏
status pane可通过在AppUi中设置进行隐藏:
Code:
#include
#include
StatusPane()->MakeVisible(EFalse);
Softkeys可以通过在AppUi进行如下设置来隐藏:
Cba()->MakeVisible(EFalse);
这将启动空softkeys,而确省的softkeys将不起任何作用。为了响应选项菜单和后退键,我们应该自己处理这些按键事件。可以通过处理HandleKeyEventL()方法来解决:
Code:
TKeyResponse  CHelloWorldPlusAppUi::HandleKeyEventL(
const TKeyEvent& aKeyEvent,TEventCode aType)
{
// Left or right softkey pressed
if (aType==EEventKeyDown && (aKeyEvent.iScanCode == EStdKeyDevice0 ||
aKeyEvent.iScanCode == EStdKeyDevice1))
{
Cba()->MakeVisible(ETrue);
}else
{
Cba()->MakeVisible(EFalse);
}
}
return EKeyWasNotConsumed;
}
这样处理后,你将能看到全屏的程序
3、这里再提供一种方法
iContainer = CYourContainer::NewL(AppUi()->ApplicationRect(), *this);
这样你的控件将被全屏绘制:)
20:06 |固定链接 |S60开发-CW篇
处理应用程序的焦点事件
一、获得、失去焦点
应用程序获得、失去焦点时,Series60框架通过调用CAknAppUi::HandleForegroundEventL(TBool aForeground) 通知应用程序。获得焦点时参数aForeground值为ETrue ,否则为EFalse。
通常下列事件将导致当前应用程序失去焦点:
另一个应用程序启动
弹出系统消息对话框。如通知“电量不足,请充电”的dialog
用户切换到桌面
收到新的信息或来电
如果应用程序需要对获得、失去焦点做出特别的响应,必须重载上面的函数。如下面的例子:
// Handle any change of focus
void CFocusEventAppUi::HandleForegroundEventL(TBool aForeground)
{
if(!aForeground)
{
// 失去了焦点
}
else
{
// 获得了焦点
}
// 调用默认基类方法
CAknAppUi::HandleForegroundEventL(aForeground);
}
二、改变焦点
应用程序还可以主动请求改变其焦点(一般用于视图架构)。方法是:TApaTask::SendToBackground() 和TApaTask::BringToForeground().
下面的代码将演示如何使用它们:(代码来自http://www.newlc.com/article.php3?id_article=141)
void CMyAppUi::BringToForeground()
{
// Construct en empty TApaTask object
// giving it a reference to the Window Server session
TApaTask task(iEikonEnv->WsSession( ));
// Initialise the object with the window group id of
// our application (so that it represent our app)
task.SetWgId(CEikonEnv::Static()->RootWin().Identifier());
// Request window server to bring our application
// to foreground
task.BringToForeground();
}
下面的代码经我的测试是可行的
// Bring the application "theApp" to background
TApaTaskList tasklist(iCoeEnv->WsSession());
TApaTask     task(tasklist.FindApp(_L("theApp")));
task.SendToBackground();  // or BringToForeground()
三、总结
本文演示了AppUi的HandleForgroundEventL ()方法和应用程序主动请求改变Foucs的方法
20:03 |固定链接 |S60开发-CW篇
关于Symbian中的位图操作
Symbian中的位图操作有点和Windows SDK的相似,有Context有Device,下面具体说说:
Bitmap graphics context
由CBitmapContext类提供了一个Graphics context(CGraphicsContext)的位图graphics的实现.它提供了以下特性:
1、清除和拷贝矩形区域;
2、位图的块传输(block transfer);
3、设置pen色彩和灰度;
4、设置shadow mode;
5、将GC的设置reset到缺省值
Window Server Client端的API提供了一个实现:CWindowGc,这主要是用于屏幕绘图的,另一个实现是CFbsBitGc,这主要是用于in-memory位图的绘制,这些都各有用处:)
参见下图

Bitmap graphics device
由CBitmapDevice类提供了一个Graphics device(CGraphicsDevice)的位图graphics实现。
这里Window Server Client端的API提供了一个实现,CWsScreenDevie,用于屏幕绘制。另一个实现是CFbsBitmapDevice,用于绘制一个in-memory位图,还有一个是CFbsScreenDevice,主要是用来(很少用)直接访问屏幕,跳过了window server的中介。
参见下图

位图的操作维系在CFbsBitmap,它可以表示一个被font和bitmap server所管理的位图。 它提供位图的生成,加载和存储。相关的还有一个TBitmapUtil类,这个类提供
给用户很多函数来操作位图的bits(!),呵呵,是不是很实用啊。
位图一般根据其大小被存储在两个不同的堆中,大尺寸位图(这里有个限度值,为4KB)的存储位置和小尺寸位图是不同的,存储大尺寸位图的堆可以自动进行碎片整理以优化其空间:)
每个位图都有寸有两个尺度单位,一个是twip大小,这是所见即所得的真实世界大小尺寸,还有一个是象素尺寸。
如果要要更直接的操作位图,可以使用CFbsBitmap::DataAddress(), 它可以获得位图加载到内存中的地址,以次来操作位图bit,恐怕是最快的方法了,不过很烦,呵呵,注意了,这里如对RGB进行操作,要注意到色彩的差别,一般概念上的是0xXXXXXX,用6位来表示RGB值,这成为24-bit色彩,但3650/7650的是4094色,即12bit色彩(4KColor),因此操作时,我们要在两者之间转换,我们可以使用TRgb::Color4K进行转换,注意了,其参数是TInt值,不要写*Address样式,否则在模拟器上能通过,手机上就会报告Kern-Exec 3错误了,很头疼:)
20:00 |固定链接 |S60开发-CW篇
Symbian开发中文字符的使用
1、 在RSS资源文件中使用中文

编译器报错是正常的,如果没有报错说明你使用了2nd Edition FP1以上的S60的中文版SDK。注意SDK的定语有三个(2nd Edition FP1以上&S60&中文),所以需要解决的问题仍然不少,编译器报错的原因在于其它版本的SDK只能编译ANSI格式的RSS文件,在这里一个比较高效的解决之道就是把RSS的代码和UTF8中文字串分开处理。

再来看一下chinese.lan文件中诸如"鏉$爜涓婄綉"的UTF8字符是如何获取的,打开UltraEdit,切换至十六进制显示模式,注意在用NOTEPAD保存UTF8文件的时候,WINDOWS在UTF8文件前面自动加了3个bit的UTF8标识——[FF FE FB]。那么FF FE FB后面的字符串就是“移动频道”的UTF8编码了。Ctrl+C&V至chinese.lan即可。

这样介绍是为了大家看着清晰直观,在实际开发中网上可以找到很多GBK<—>UTF8互转的工具。转换之后直接Ctrl+V即可顺利编译。前面介绍的写入中文另存UTF8方式个人认为不很可取,为了确保不同版本SDK之间的兼容性,建议直接使用后一种方式。在这一点上S60和UIQ没有任何区别。
2、  在代码中使用中文
NOKIA forum提供的Chinese_Display sample 的代码片断

3、  在控制台程序中显示中文&读取文件中的中文
以下是根据S60提供的WriteToFile的sample改写而来的一段代码。注意Symbian在写入文件时是不需要Convert的,不管使用的是TBuf8或TBuf16。读取的时候也一样

4、  在安装过程中提供中文支持

Language definitions选项中的&ZH代表简体中文,如果希望为程序提供国际化支持,只要编译出多个不同的语言包,并在PKG文件中写入即可。SIS file header中的UTF8与RSS文件中一样处理即可.
19:48 |固定链接 |S60开发-CW篇
用Carbide和S60 SDK构建Symbian C++开发环境
网上有很多介绍用VC++ 6.0和VS 2003搭建Symbian开发环境的文章。本文将给你另外一种选择:Carbide。如果你比较熟悉Eclipse那么Carbide将是你的不二之选。
Carbide分三个版本:
Carbide.j是Symbian平台下的J2ME开发工具。
Carbide.c++是基于Eclipse的Symbian C++开发工具。
Carbide.vs是一个Visual Studio 的插件,用来在Visual Studio里开发Symbian C++。
地址:http://www.forum.nokia.com/main/0,6566,1_84,00.html
本文主要讲述Carbide.c++。
Carbide.c++是Nokia和Eclipse基金会合作的产物。所以把Carbide理解成Eclipse+CDT+Nokia plug-in也是可以的。只是Nokia把这几个组合进行了打包,免去了一些繁琐的安装配置过程。Eclipse是用Java开发的新一代IDE工具,需要Java平台支持。而Carbide已经内置了一个 JRE,所以,安装Carbide是非常方便的。
另外,要搭建一个Symbian C++的开发环境我们还需要J2SDK,Perl和Nokia SDK的支持。主要是SDK用到了J2SDK和Perl。J2SDK的下载地址在:http://java.sun.com,Perl可以在http://www.activestate.com/下载。Symbian SDK的选择比较麻烦。我们使用的是S60 Platform SDKs for Symbian OS, for C++。
S60 Platform SDK for Symbian OS, for C++有多个不同的版本,而且不同的IDE支持也不同。在我写这片文章的时候,我们选择2nd Ed. FP 2,CodeWarrior这个版本。不知道因为什么原因Carbide很难支持Nokia官方声称支持的SDK for 2nd Edition, FP 2这个版本。下载地址:http://www.forum.nokia.com/main/0,,034-4,00.html
到这里,只需要把相关软件顺序安装就可以了,先是J2SDK和Perl,然后是2nd Ed. FP 2,CodeWarrior,让后安装Carbide.c++。
启动Carbide.c++,是不是很熟悉呢?其实就是Eclipse。选择新建工程试试吧。Symbian c++开始。
19:42 |固定链接 |S60开发-CW篇
在Series 60设备上进行调试
安装系统
1、在你的手机上安装gdbsudb.sis。这个文件被NOKIA SDK放在这个默认目录里
C:\Symbian\\6.1\Series60\Epoc32\Release\armi\urel\
2、关掉手机,启动FExplorer或你的文件管理程序来创建一个名为c:\gdbstub的目录。上传包含下列内容的gdbstud.ini文件到我们新建立的目录。
[COMMSERV]
PDD=EUART%d
LDD=ECOMM
CSY=IRCOMM
PORT=0
RATE=115200
3、在PC端创建C:\yyy并创建一个c:\yyy\gdb.ini文件,把下面的内容Ctrl+V进去:
symbol-file //c/symbian/6.1/series60/epoc32/release/armi/udeb/xxx.sym
epoc-exec-file c:\system\apps\xxx\xxx.app
target epoc com2
break NewApplication
source //c/symbian/6.1/shared/epoc32/gcc/share/epoc-des.ini
4、用适当的内容来代替xxx和yyy。将你的IrDA端口变成com2.你可能需要在电脑上装一个可以把IrDA映射为COM的软件(例如IrCOMM2k)
编译
abld build armi udeb
如果连接失败是因为它找不到库(第一次通常都是这样),只要把epoc32/release/armi/urel下所有的内容复制到epoc32/release/armi/udeb就OK了。
打包并安装应用程序到手机上。
开始调试
gdb.exe -nw
启动FExplorer并运行c:\ system\programs\gdbstub.exe.IrDA(红外线)连接指示灯将开始闪烁。注意不不需要用connection/IrDA/activate来做这些事,因为gdbstub将会自动打开红外连接。把手机放在PC的红外范围之内,随后打开PC的DOS窗口。进入C:\yyy并键入下列命令
将会出现下列信息:
GNU gdb 4.17-psion-98r2
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This version of GDB has been modified by Symbian Ltd. to add EPOC support.
Type "show epoc-version" to see the EPOC-specific version number.
This GDB was configured as "--host=i686-pc-cygwin32 --target=arm-epoc-pe".
Breakpoint 1 at 0x(some adress): file
NewApplication>
(gdb) *prompt*
点击”run”(gdb),将出现下列内容:
Starting program: warning: Application started but no document specified. The application may panic at some point if it is document based and if there is no existing default document. Breakpoint 1 0x(some adress): file NewApplication> Breakpoint 1, NewApplication () at file Current language: auto; currently c++
如果你的gdb显示出”Starting program”,但在接下来没有发生别的事,那么你失败了.我有时就会遇到这样的问题,只能通过重启手机(和PC)来解决.如果这样仍然没有解决的话,或许你的IrDA红外线设备有问题。
使用BlueTooth进行设备调试
文/Peter Jiang(译自newlc.com)
1、 安装gdbstud.sis到手机上。这个文件在NOKIA SDK中的默认路径为:C:\Symbian\7.0s\Series60_v20\Epoc32\Release\armi\urel\.
2、 创建gdbstub.ini
你应该在目标上创建一个C:\gdbstub.并在这个目录中使用记事本创建一个gdbstub.ini文件,文件中包含如下内容:
标准
蓝牙
[COMMSERV]
[COMMSERV]
PDD=EUART%d
PDD=EUART1
LDD=ECOMM
LDD=ECOMM
CSY=IRCOMM
CSY=BTCOMM
PORT=0
PORT=0
RATE=115200
RATE=9600
3、 创建gdb.ini
在你的PC上创建一个目录C:\bbb并把gdb.ini文件放进去。以下是gdb.ini的内容。
symbol-file //c/symbian/7.0s/series60_v20/epoc32/release/armi/udeb/aaa.sym epoc-exec-file c:\system\apps\aaa\aaa.app target epoc com3 break NewApplication source //c/symbian/7.0s/shared/epoc32/gcc/share/epoc-des.ini
注:用你的程序的名字来代替aaa和bbb
检查第三行的端口号并用合适的端口号来代替
com口编号只能在1到4之间
4、 编译
应用程序应使用armi udeb进行调试:
abld build armi udeb
如果提示错误或警告,拷贝epoc32/release/armi/urel的所有内容到epoc32/release/armi/udeb中即可。
5、 更新pkg文件
现在转向你的应用程序xxx.pkg文件并改变所有路径以便从armi\udeb目录获取编译后的代码。
6、 开始调试
① 在手机上安装FExplorer软件(杂志附加工具包中已提供)。
② 通过FExplorer软件进入C:\system\programs\gdbstub.exe
③ 检查在C:\system\libs\下的gdbseal.dll和gdbseng.dll文件
④ 在手机上启动gdbstub.exe。
⑤ 在PC的DOS提示符状态进入c:\bbb目录并运行下列命令
gdb.exe -nw
将会出现下列信息
GNU gdb 4.17-psion-98r2
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or
Breakpoint 1 at 0x(some adress): file
NewApplication>
gdb>
然后在gdb提示中,键入run,将会出现下列信息
Starting program:
warning: Application started but no document specified.
The application may panic at some point if it is document based and if there is no existing default document.
Breakpoint 1 0x(some adress): file
NewApplication>
Breakpoint 1, NewApplication ()
at file
Current language: auto; currently c++
系统需求
I硬件
1、 PC
2、 蓝牙/红外适配器
3、 Symbian手机
II软件
PC
1、 Symbian SDK
2、 VC++6.0
3、 蓝牙驱动
4、 Gdb.ini
Symbian手机
1、 gdbstub.sis
2、 gdbstud.ini
3、 fexplorer.sis
1. 安装 gdbstub
在电话上安装gdbstub.sis。这个文件由Nokia SDK在默认下在以下路径中安装:C:\Symbian\7.0s\Series60_v20\Epoc32\release\armi\urel\.
2. 创建 gdbstub.ini
你应该创建一个文件夹 C:\ gdbstub。并且在这个文件中使用记事本,创建一个包含以下内容的文件gdbstub.ini。
General
Bluetooth
[COMMSERV]
[COMMSERV]
PDD=EUART%d
PDD=EUART1
LDD=ECOMM
LDD=ECOMM
CSY=IRCOMM
CSY=BTCOMM
PORT=0
PORT=0
RATE=115200
RATE=9600
3. 创建 gdb.ini
在计算机中创建一个目录并且一定要在c:\ bbb,把gdb.ini放入这个文件夹。Gdb.ini文件内容如下:
symbol-file //c/symbian/7.0s/series60_v20/epoc32/release/armi/udeb/aaa.sym
epoc-exec-file c:\system\apps\aaa\aaa.app
target epoc com3
break NewApplication
source //c/symbian/7.0s/shared/epoc32/gcc/share/epoc-des.ini
用适当的名字替换所有的bbb和aaa
注意: 请检查你正在使用通道数,在线路3中放入适当的com 数到它中,不包括:infra=2,Bluetooth=3
注意: com数通常不大于4并且大于1。
4. 编辑
程序的调试将会使用armi udeb:
abld创建armi udeb
如果有任何错误或警告,就把epoc32/release/armi/urel中的复制到epoc32/release/armi/udeb。
5. 更新pkg文件
现在找到程序的xxx.pkg文件然后改变所有的路径以便在目录armi\ udeb下编译。
然后创建sis文件并而安装
6.启动调试器
1.你应该有一个叫做FExplorer的程式,或者下载它并安装它。、
2.通过这个程式到目录 : c:\ system\program\gdbstub.exe
3.检查为dll文件在c:\ system\lib\ :下的gdbseal.dll 和 gdbseng.dll
4.启动gdbstub.exe 。
5.在你的计算机DOS中, 在目录c:\ bbb下并且运行gdb.exe-nw
(gdb.exe将与Symbian SDK一起并且确定它在系统路径之中)
以下信息将会出现:
GNU gdb 4.17-psion-98r2
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or
Breakpoint 1 at 0x(some adress): file NewApplication>
gdb>
然后在gdb提示下,键入run。将会出现以下信息:
Starting program:
warning: Application started but no document specified.
The application may panic at some point if it is document based and if there is no existing default document.
Breakpoint 1 0x(some adress): file NewApplication>
Breakpoint 1, NewApplication ()
at file

Current language:  auto; currently c++
注意 : 在gdb指令中检查Symbian SDK 文件从而得到更多的帮助。
清单
:
I硬件:
1. PC机
2. 兼容的Bluetooth / InfraRed
3. Symbian电话
II软件:
PC :
1. Symbian SDK(可以免费的从Symbian/Nokia站点得到)
2. VC++6.0
3. Bluetooth驱动程序(可以在CD与Bluetooth得到)
4. gdb.ini
Symbian 电话:
1. gdbstub.sis
2. gdbstub.ini
3. fexplorer.sis
19:40 |固定链接 |S60开发-CW篇
Symbian内存管理的二十二条军规
1、C类必须有析构函数,这是CBase的一个虚函数。
2、C类的构造函数和ConstructL()必须为protect或private类型的成员函数
3、在C class中必须有一个NewLC()函数,除非它是嵌套类。NewL()是可选的,并且总是根据NewLC()来实现。
4、NewL()和NewLC()在c class中必须是static函数。
5、C类通过指针和引用来传递。
6、拷贝构造函数在symbian中没有用。
7、不要一定在析构函数中删除类的成员对象。(生命期结束即可删除)
8、析构函数中必须对对象进行if检查。即
if(iObject) delete iObject;iObject = NULL;
9、R类没有明确的构造、析构或拷贝构造函数以及赋值操作。
10、delete a;a=NULL;a=b;标准重新分配过程。
11、任何可能导致异常退出的函数皆加L后缀。
12、不要删除非拥有对象(也就是,那些仅仅只使用的对象)
13、分配动态数组前定义一个合适粒度。
14、把new换成new(ELeave).
15、if(函数不能异常退出&&要自己处理错误时)使用TRAP&&不要过多嵌套。
16、if(aObject被一个自动变量指针引用&&将进行一个可能在aObject生存期内Leave的操作)
CleanupStack::PushL(aObject);
17、决不能把一个i前缀的成员变量PushL入清理栈。
18、构造函数决不能Leave,把可能异常退出的语句放到ConstructL()中去。
19、Symbian的默认栈容量为8k,小心使用递归。
20、TBuf的长度最好不超16,必要的情况下用HBufC代替TBuf.
21、使用__UHEAP_MAEK 宏来检测你的内存状况。
22、尽可能早的删除一切失去使用价值的东西,不要等到函数尾部(自动变量)或在析构函数中才删除(成员变量)。
19:38 |固定链接 |S60开发-CW篇
Symbian资源文件浅析
一、何为资源文件:
在symbian应用程序中,资源文件指的是后缀名为.rss的文件,每个应用程序至少要有一个与之关联的资源文件。资源编译器rcomp编译资源文件后,生成一个.rsc二进制文件和一个相伴的头文件(.rsg)。这样在应用程序框架启动应用程序时,会打开这个二进制文件,借助在.rsg文件中创建的资源标志符,根据需要把各个资源加载到C++代码中。
二、资源文件的作用:
在资源文件中指定用户界面的布局,如常用组件菜单、对话框、列表等在界面上的排列样式,另外还可以在其中指定界面上用户可见的文本信息。当然,这些可见文本并不一定通过字符串在.rss资源文件中定义,我们一般在.loc本地文件中定义,而只需在.rss资源文件中将.loc本地文件引入(include)即可。
三、与资源文件有关的系统头文件及其他文件:
在资源文件中,往往会引入许多头文件,这包括系统头文件和用户自定义的头文件。其中系统头文件的目录为:“SDK目录\ Epoc32\include\”,以#inlude <   >形式引入;用户头文件的目录为“工程目录\inc\”,以#include  ”   ”形式引入。比如HelloWorld.rss中的引入文件如下:
#include
#include "HelloWorld.hrh"
#include "HelloWorld.loc"
#include
#include
#include
可以看出,资源文件中引入的文件的扩展名一般不是.h。
那么这些头文件在资源文件起到什么作用呢?
经查看它们的源文件得出:
eikon.rh、avkon.rh还有uikon.rh:这些系统头文件主要用于定义一些资源的结构,即在其中定义了许多的STRUCT,在这些STRUCT中,有的项在给出声明的同时进行了默认初始化值,而有的仅仅是给出了声明。eikon.rh主要是一些通用的STRUCT,如STRUCT POINT TIME CLOCK等;uikon.rh主要是一些基本的组件STRUCT定义;avkon.rh主要是S60特有的组件STRUCT定义。
扩展名比较特殊的系统头文件:
avkon.rsg:这个文件里全是define语句,比如:
#define R_AVKON_MENUPANE_EMPTY                    0x8cc0002
#define R_AVKON_MENUPANE_EXIT                     0x8cc0003
#define R_AVKON_MENUPANE_APP_DEFAULT              0x8cc0004
#define R_AVKON_MENUPANE_VIEW_DEFAULT             0x8cc0005
#define R_AVKON_MENUPANE_FEP_DEFAULT              0x8cc0006
#define R_AVKON_MENUPANE_EDITTEXT_DEFAULT         0x8cc0007
#define R_AVKON_MENUPANE_LANGUAGE_DEFAULT         0x8cc0008
像是一些资源标志符的定义,用16进制数对avkon里面的所有资源进行定义。跟编译.rss资源文件时生成的.rsg文件一个扩展名。
avkon.mbg:这个文件只定义了一个枚举变量TmbmAvkon,如下:
enum TMbmAvkon
{
EMbmAvkonQgn_graf_tab_21,
EMbmAvkonQgn_graf_tab_21_mask,
EMbmAvkonQgn_graf_tab_22,
EMbmAvkonQgn_graf_tab_22_mask,
EMbmAvkonQgn_graf_tab_31,
EMbmAvkonQgn_graf_tab_31_mask,
。。。
}
HelloWorld.hrh:这是一类具有代表性的资源头文件,有用户自定义的,也有系统的。这类文件可以包含enum定义,意味着可以在资源文件.rss和C++源文件.cpp之间共享一个只包含enum定义的头文件,这是定义在两种类型的文件间共享的值的常用方法。内容如下:
#ifndef HELLOWORLD_HRH
#define HELLOWORLD_HRH
enum ThelloWorldCommandIds  //为菜单命令定义枚举值
{
EHelloWorldCmdAppTest = 1
};
#endif      // HELLOWORLD_HRH
HelloWorld.loc:.loc 文件用于放置本地化的语言文字,比如你可以分别为中文和英文创建一个 .loc 文件,一个用于存放英文文本,一个用于存放中文文本。内容如下:
// LOCALISATION STRINGS
#define qtn_appl_test "YanHaitao"
// menu exit
#define qtn_appl_exit "Exit"
// example caption strings for app
#define qtn_app_caption_string "YanHaitao"
#define qtn_app_short_caption_string "YanHaitao"
// Localized string for r_message_text
#define R_MESSAGE_TEXT_STRING "Hello World!"
这其中的qtn_appl_test等变量,都能在.rss文件中找到,这个文件是对这些变量的赋值。
本地文件如果要使用中文,那么使用CHARACTER_SET UTF8指定资源字符集,另外需要注意的是,rss文件和loc等相关文件也需要保存为UTF-8格式,具体的使用Windows的记事本,EditPlus都可以。
四、资源文件的结构:
介绍完与资源文件相关的文件后,我们来看看一个资源文件的具体结构:
它由两部分构成,分别称为头部和主体。
1、头部:含有前面我们所说的包含语句和一些资源文件标准信息。
(1)名字:用NAME语句定义,该语句必须是资源文件中第一个有意义的行,即除去注释和空白语句,也就是说,这条语句要位于include包含语句之前,后面没有分号。该语句指定一个由1到4个字符组成的名字,并建议使用大写字符。如果应用程序使用了多个资源文件的话,那么可以通过它进行区分。
如:NAME HELL
(2)include包含语句:允许使用其他地方定义的符号和结构。
(3)签名:它的内容实际上被忽略,但必须有这条语句,否则加载资源时便报错。一般将实际内容置为空,如:RESOURCE RSS_SIGNATURE { } ,后面没有分号。
(4)文档名缓冲:指定应用程序默认文档名的TBUF资源。大部分程序不使用文档,但仍然必须包含此资源,否则加载资源失败。不需指定文件的扩展名,因为S60本地文档不使用扩展名。如:RESOURCE TBUF { buffer=”HelloWorld”;}
在这里的文件名将作为参数传递给CAknDocument类的OpenFileL(TBool aDoOpen, const TDesC& aFilename, RFs& aFs)方法。这允许一个应用程序在运行时打开一个默认的文档。如果这里的值为空那么程序默认文档名和应用程序名一致。
(5)应用程序信息资源:这个资源比较重要。EIK_APP_INFO资源为应用程序指定各种标准控件。如状态面板等,通常会创建一个为状态面板指定新内容的资源,然后使用EIK_APP_INFO资源的status_pane字段引用它。如:
RESOURCE EIK_APP_INFO
{
hotkeys = r_HelloWorld_hotkeys;
menubar = r_HelloWorld_menubar;
cba = R_AVKON_SOFTKEYS_OPTIONS_BACK;
}
注意:头部中定义的各种资源都没有资源名。
2、主体:
定义了应用程序中将要使用的资源。
它的定义格式如下:
RESOURCE STRUCTNAME resource-name
{
resource-initializer-list
}
在这里STRUCTNAME应替换为具体的资源结构类型,而这些资源结构类型就在我们前面提到的eikon.rh、uikon.rh、avkon.rh中进行定义的。
资源名resource-name必须小写,通常以r_开头,而在C++文件中使用他们时必须大写,这和资源编译器工作方式有关。
例如:
RESOURCE HOTKEYS r_HelloWorld_hotkeys
{
control =
{
HOTKEY { command = EAknCmdExit; key='e'; }
};
}
下面具体研究一下,具体资源的定义方法和过程。
初始化字段有三种不同方式:简单初始化器、数组初始化器、结构初始化器。
如下:
RESOURCE STRUCT r_my_example_struct
{
simple=EeikCtLabel;  //简单初始化器,分配单个值或字符串
array={1,2,3};             //数组初始化器,大括号,元素用逗号隔开
structmember=OTHERSTRUCT   //结构初始化器,编译器不进行类型检查,要小心
{
simple1=”hello”;
simple2=”goodbye”;
}
}
针对具体资源定义的说明:
(1)字符串资源:
可以使用TBUF资源将字符串包含在资源文件中。通常,会在一个.loc文件中或是在指定语言的.lxx文件中定义字符串文字,而不是在.rss文件中定义它们,只需在.rss文件中将.loc文件包含进来即可。
.lxx文件中的xx应该替换为e32std.h中的Tlanguage枚举定义的两位数字区域设置码,之后按照.mmp项目文件中设置的当前生成区域设置把.lxx文件包含到.loc文件中。看一个定义了.lxx文件的.loc文件实例:
#ifdef LANGUAGE_01
#include “MyApp.101”
#endif
#ifdef LANGUAGE_02
#include “MyApp.l02”
#endif
最后,.101和.102文件以各自的语言定义字符串,比如:
#define  STR_HELL0   “Hello World”
为了确保编译资源时将使用正确的字符串,应该在.mmp文件中包含一行或多行LANG语句,导致生成两个二进制资源文件:.r01和.r02。
LANG 01
LANG 02
(2)标点:介绍如何使用标点符号
a、所有赋值语句之后都应该有分号
b、列表中的元素以逗号分隔
c、资源定义后以及列表中最后一个元素之后不应有分号
举例:
RESOURCE AVKON_VIEW r_myapp_view
{
menubar=r_myapp_menubar;//赋值语句后有分号
cba=r_myapp_cba;//赋值,需要分号
}                                 //资源定义结尾,无需分号

RESOURCE TAB_GROUP r_myapp_tabgroup
{
tab_width=EaknTabWidthWithTwoTabs;
active=0;
tabs={
TAB   //列表中的第一个TAB STRUCT
{
id=EnavigationPaneTab1;
txt=TAB1_TEXT;
},   //列表元素之间用逗号分隔
TAB
{
id=EnavigationPaneTab2;
txt=TAB2_TEXT;
}   //列表结尾无需分号
};       //将列表赋值给tabs,需要分号。
}
(3)创建资源结构:
RESOURCE语句用于创建特定资源的实例,而STRUCT语句则用于定义资源类型,创建的所有STRUCT定义都应改保存在一个扩展名为.rh的文件中。
注意:STRUCT的名字必须全部为大写,不能含有空格,且必须以字母字符开始。
常用STRUCT字段类型:
BYTE、WORD、LONG、DOUBLE、TEXT、LTEXT、BUF、BUF8、BUF、LINK、LLINK、SRLINK、STRUCT等
除简单字段外,还可以把字段定义为一个由相同类型的值组成的数组,在字段名后添加一对方括号即可。如:
STRUCT MENU_PANE
{
STRUCT items[ ];
LLINK extension=0;
}
19:36 |固定链接 |S60开发-CW篇
Symbian程序框架研究
S60应用程序的运行依赖于大量的OS组件,例如屏幕绘图和应用程序数据持久性等,可以直接使用OS的窗口服务器或者文件服务器即可。应用程序框架由一套核心类组成,这些类是所有应用程序框架的基础。这些类组成了所有应用程序的架构,并且它们也封装了应用程序和所需OS服务器之间的相互作用。

第一层:CBase和CActive两个基类,其中CActive也是派生于CBase,而CActive又被第二层的CConEnv派生
第二层:包含两个基本组件:AppArc和CONE。AppArc代表“应用程序架构”,这些类提供了基本的应用程序结构、将系统信息提交到应用程序的机制,以及使用文件服务器持久化数据。其中的类在命名时都带有前缀“*Apa”。CONE是控制环境的缩写,在这个组件中的类提供用于处理用户输入并创建用户界面的机制--这些类主要用于和窗口服务器进行交互,其中的类在命名时都带有前缀“*Coe”。这一层中的许多类都是抽象类,仅仅定义了一个API的接口。
第三层:Uikon组件。这是具有丰富功能、非抽象框架类的一般性设备无关实现,并且提供了一个在所有symbian OS上公用的UI库层。一些具体的UI控件(比如列表框和滚动条等)都可以在该层创建,这些控件有时也被称为Eikon控件。UIkon组件中的类在命名时都带有前缀“*Eik”。添加了一个公共的symbian OS实现,和其他Symbian OS UI平台共享。
第四层:由Avkon类组成,这些类提供了核心的S60 UI功能,例如菜单支持。Avkon控件的类在命名时都带有前缀“*Akn”。在框架上添加S60特有的实现。
第五层:针对应用程序的层,设计自己的应用程序,添加自定义应用程序实现。
19:30 |固定链接 |S60开发-CW篇
2006/9/15
使用CW前的感言
为什么网上开发S60使用的都是Microsoft的IDE呢?呵呵,我看除了不用破解外,应该是我们用惯了的原因吧
Nokia推荐使用CW开发S60的
CW的最新版本3.1在官方下载后15天限制,在google上查找crack CodeWorrior 3.1找到Crack便可以使用
以前在MAC上开发C++过的朋友一定使用过CW,大家Try一下吧
Note:Microsoft的VC6还是不错的,但是现在.Net就不敢恭维了,商业味道太重,而且生成的EXE运行时候及其占资源
10:37 |固定链接 |S60开发-CW篇
2006/9/14
CMWAP和CMNET 的主要区别与适用范围
如果你希望对CMWAP和CMNET有一个详细的了解,那么就读完全篇吧;如果你对这个问题有所研究的话,还请不吝赐教,解开仍旧困惑我的几个疑问。
(1) 为什么会有两个接入点?
在网上查阅大量资料后并经过反复的尝试与探索后,我大致对中国移动提供的这两种接入方式有了初步了解。
在国际上,通常只有一种GPRS接入方式,为什么在中国会有CMWAP和CMNET两兄弟呢?(彩信之所以单独配置接入点是因为彩信服务需要连接专用的服务器,在这里不作探讨。)
其实,CMWAP 和 CMNET 只是中国移动人为划分的两个GPRS接入方式。前者是为手机WAP上网而设立的,后者则主要是为PC、笔记本电脑、PDA等利用GPRS上网服务。它们在实现方式上并没有任何差别,但因为定位不同,所以和CMNET相比,CMWAP便有了部分限制,资费上也存在差别。
(2) 什么是WAP?
WAP只是一种GPRS应用模式,它与GRPS的接入方式是无关的。WAP应用采用的实现方式是“终端+WAP网关+WAP服务器”的模式,不同于一般Internet的“终端+服务器”的工作模式。主要的目的是通过WAP网关完成WAP-WEB的协议转换以达到节省网络流量和兼容现有WEB应用的目的。
WAP网关从技术的角度讲,只是一个提供代理服务的主机,它不一定由网络运营商提供。但据我所知,中国移动GPRS网络目前只有唯一的一个WAP网关:10.0.0.172,有中国移动提供,用于WAP浏览(HTTP)服务。有一点需要注意,WAP网关和一般意义上的局域网网关是有差别的,标准的WAP网关仅仅实现了HTTP代理的功能,并未完成路由、NAT等局域网网关的功能。这就决定了它在应用上所受到的限制。
(3) 中国移动对CMWAP的限制
为了从应用中区别两者的定位,中国移动对CMWAP作了一定的限制,主要表现在CMWAP接入时只能访问GPRS网络内的IP(10.*.*.*),而无法通过路由访问Internet。(少数地区的移动网络可能不存在这一限制。)我们用CMWAP浏览Internet上的网页就是通过WAP网关协议或它提供的HTTP代理服务实现的。
说到这里,就让我自然而然的联想到我们公司的网络,相信不少工作的朋友都有类似的体会。公司的网络在网关上不提供路由和NAT,仅仅提供一个可以访问外网的HTTP代理。这样,我们就无法直接使用QQ、MSN等非HTTP协议的应用软件了(好在它们还提供的有HTTP代理的连接方式)。CMWAP也正是
(4) 适用范围
适用范围才是大家最关心的问题。CMNET拥有完全的Internet访问权,这里就不多说了,主要让我们来看看CMWAP。因为有了上面提到的限制,CMWAP的适用范围就要看WAP网关所提供的支持了。目前,中国移动的WAP网关对外只提供HTTP代理协议(80和8080端口)和WAP网关协议(9201端口)。(据有的网友提到1080端口也是开放的,但无法连接。这也许是移动内部使用的一个Socks后门吧^_^)。
因此,只有满足以下两个条件的应用才能在中国移动的CMWAP接入方式下正常工作:
1. 应用程序的网络请求基于HTTP协议。
2. 应用程序支持HTTP代理协议或WAP网关协议。
如何辨别一个应用程序的网络请求是否基于HTTP协议?
这个问题还真不好回答,要完全做到这一点需要通过拦截应用程序的通信数据包进行分析。这里提供几个简单的方法给广大菜鸟朋友:从表现上看,如果它的网络请求是网址(URL)的形式,那么通常是基于HTTP协议的,如Web浏览器;如果它连接的服务器端口是80,那么它可能是基于HTTP协议的。如果确实无法准确判断,那么请直接看下一个条件。(满足第二个条件的应用一定是基于HTTP协议的)
如何区别一个应用程序支持HTTP代理协议还是WAP网关协议呢?
首先看它的设置中有没有代理服务器的选项(通常在S60上未特别说明的代理都是特指HTTP代理),如果有则表示它支持HTTP代理协议。如果没有,则需要按照以下步骤测试:
在GPRS接入点设置的高级设置里去掉代理服务器的设置项:Server Address 和 Server Port(,如果应用程序可以正常工作,那么它是基于WAP网关协议,如Java程序、S60内置的浏览器。如果在此状态下不能正常工作,而恢复GPRS接入点高级设置中的代理服务器设置后能够正常工作,则应用程序支持HTTP代理协议(代理设置从系统中读取)。如果仍不能正常工作,那么这个应用程序一般来说是不支持HTTP代理协议或WAP网关协议的。
这里需要特别说明的是JavaQQ,它有Socket和HTTP两种版本。现在网上流传的可用于CMWAP的JavaQQ就是基于HTTP协议的。就拿那个JavaQQ 2004来说,启动画面中就明确的写着“KJava QQ HTTP”。而SIS版的QQ和AgileMessenger(S60的MSN客户端)因为是采用的普通的Socket连接方式,因此无法用于CMWAP。
总结一下CMWAP下可以使用的常见软件的工作方式:
(1) 手机内置的浏览器:WAP网关协议
(2) Opera 浏览器:HTTP代理协议(有代理设置)
(3) Java 程序:WAP网关协议
(4) AvantGo:HTTP代理协议(有代理设置)
比较奇怪的是AvantGo虽然支持HTTP代理,但在我的测试中发现AvantGo同步时并没有使用代理服务器。难道它在连接主服务器是用的Socket方式?不解
15:46 |固定链接 |WAP开发
2006/9/11
网站生成静态页面,及网站数据采集的攻、防原理和策略
本文从一个ASP程序员的角度用大量实例祥细介绍了动态网站如何生成静态页面原理,又从一个采集程序开发者的角度去祥细介绍了网站数据采集的原理及功防策略。
关于网站生成静态页面,为了让本文读者容易理解,文内列举了目前常用的多种生成静态页面的方法,其中用了很多的实例代码进行说明。
关于网站数据采集攻防,作者本身是一个采集程序的开发者,同时作者也收集研究了多种采集程序,列举了目前国内比较流行的几种防采集策略,并对每种策略作了简单客观的分析评价,希望能给广大站长们提供一些帮助。此章节也把作者原创的防采集方法奉献给大家,目地是为了让大家了解,防采集,不防搜索引擎,是可行的,有效的。
声明:希望各位朋友转载时,不要把原有作者版权去掉,谢谢合作。
由于本人写作水平有限,写的不好的地方,还请大家多多包涵,如要批评或意见,请加我QQ。目前很多人都开始注重动态页面生成HTML页了,但选择哪种生成HTML的方法和防采集却不防搜索引擎的问题却经常困扰大家。解决此问题则是本文产生的原因。
首先祥细说一下常用的几种生成HTML的方法:
生成HTML方法主要步骤只有两个:
一、获取要生成的html文件的内容
二、将获取的html文件内容保存为html文件
我在这里主要说明的只是第一步:如何获取要生成的html文件的内容:
目前常用获取html文件的内容的方法有几下几种:
1、
CODE:
[Copy to clipboard]
str="内容"
str=str&"内容数据库读取内容........."
这种方法与是在脚本内写要生成的html内容,不太方便预览生成页面的内容,无法可视化布局页面,更改html模板时会更加复杂。
用这种方法的人很多,但我感觉这种方法是最不方便的。
2、
制作单独的HTML模板页,动态的内容用特定的字符作为标记(如:有人用$title$标记为网页标题),用ADODB.Stream或者Scripting.FileSystemObject将其模板内容载入,然后再用替换方法把原先定好的标记替换为动态内容(如:Replace(载入的模板内容,"$title$",rs("title" ) ) )。
3、
用XMLHTTP或serverXMLHTTP获取动态页所显示的HTML内容,
CODE:
[Copy to clipboard]
我常用的生成html文件的实例:
'-----------------翟振恺(小琦)
'weburl是要获取的动态页地址
'getHTTPPage(weburl)是获取动态页内容的函数
weburl="http://"&Request.ServerVariables("SERVER_NAME")&"/contact.asp?id="&rs("id")&""‘指定动态页地址
body=getHTTPPage(weburl)'用函数取到动态页地址的内容
'-----------------翟振恺(小琦)
此方法最大的好处就是不用费力气专门去写静态的模板页面,只是将原来就有的动态页面转换为HTML静态页面,但生成速度不是太快。
我常用的生成HTML的方法就是第3种:用XMLHTTP获取动态页生成的HTML内容,再用ADODB.Stream或者Scripting.FileSystemObject保存成html文件。
第二步是生成文件的方法:
ASP里常用的有用ADODB.Stream生成文件和Scripting.FileSystemObject生成文件两种
1、
Scripting.FileSystemObject生成文件方法:
CODE:
[Copy to clipboard]
'-----------------翟振恺(小琦)
Set fso = CreateObject("Scripting.FileSystemObject")
File=Server.MapPath("要生成文件路径和文件名.htm")
Set txt=fso.OpenTextFile(File,8,True)
data1="文件内容"用WriteLine方法生成文件
txt.WriteLine data1
data2="文件内容"'用Write方法生成文件
txt.Write data2
txt.Close
txt.fso
'-----------------翟振恺(小琦)
2、
ADODB.Stream生成文件方法:
CODE:
[Copy to clipboard]
'-----------------翟振恺(小琦)
Dim objAdoStream
set objAdoStream = Server.createObject("ADODB.Stream")
objAdoStream.Type = 1
objAdoStream.Open()
objAdoStream.Write("文件内容")
objAdoStream.SaveToFile 要生成文件路径和文件名.htm,2
objAdoStream.Close()
'-----------------翟振恺(小琦)
再说一下我对HTML防采集却不防搜索引擎蜘蛛的一些经验:
我开发过几个采集程序,也研究过很多采集程序代码,所以对采集程序的原理还算是稍微有些了解。
先说一下采集原理:
采集程序的主要步骤如下:
一、获取被采集的页面的内容
二、从获取代码中提取所有用的数据
一、获取被采集的页面的内容
我目前所掌握的ASP常用获取被采集的页面的内容方法:
1、用serverXMLHTTP组件获取数据
CODE:
[Copy to clipboard]
Function GetBody(weburl)
'-----------------翟振恺(小琦)
'创建对象
Dim ObjXMLHTTP
Set ObjXMLHTTP=Server.CreateObject("MSXML2.serverXMLHTTP")
'请求文件,以异步形式
ObjXMLHTTP.Open "GET",weburl,False
ObjXMLHTTP.send
While ObjXMLHTTP.readyState <> 4
ObjXMLHTTP.waitForResponse 1000
Wend
'得到结果
GetBody=ObjXMLHTTP.responseBody
'释放对象
Set ObjXMLHTTP=Nothing
'-----------------翟振恺(小琦)
End Function
调用方法:
GetBody(文件的URLf地址)
2、或XMLHTTP组件获取数据
CODE:
[Copy to clipboard]
Function GetBody(weburl)
'-----------------翟振恺(小琦)
'创建对象
Set Retrieval = CreateObject("Microsoft.XMLHTTP")
With Retrieval
.Open "Get", weburl, False, "", ""
.Send
GetBody = .ResponseBody
End With
'释放对象
Set Retrieval = Nothing
'-----------------翟振恺(小琦)
End Function
调用方法:
GetBody(文件的URLf地址)
这样获取的数据内容还需要进行编码转换才可以使用
CODE:
[Copy to clipboard]
Function BytesToBstr(body,Cset)
'-----------------翟振恺(小琦)
dim objstream
set objstream = Server.CreateObject("adodb.stream")
objstream.Type = 1
objstream.Mode =3
objstream.Open
objstream.Write body
objstream.Position = 0
objstream.Type = 2
objstream.Charset = Cset
BytesToBstr = objstream.ReadText
objstream.Close
set objstream = nothing
'-----------------翟振恺(小琦)
End Function
调用方法:BytesToBstr(要转换的数据,编码)'编码常用为GB2312和UTF-8
二、从获取代码中提取所有用的数据
目前我掌握的方法有:
1、用ASP内置的MID函数截取需要的数据
CODE:
[Copy to clipboard]
Function body(wstr,start,over)
'-----------------翟振恺(小琦)
start=Newstring(wstr,start)
'设置需要处理的数据的唯一的开始标记
over=Newstring(wstr,over)
'和start相对应的就是需要处理的数据的唯一的结束标记
body=mid(wstr,start,over-start)
'设置显示页面的范围
'-----------------翟振恺(小琦)
End Function
调用方法:body(被采集的页面的内容,开始标记,结束标记)
2、用正则获取需要的数据
CODE:
[Copy to clipboard]
Function body(wstr,start,over)
'-----------------翟振恺(小琦)
Set xiaoqi = New Regexp'设置配置对象
xiaoqi.IgnoreCase = True'忽略大小写
xiaoqi.Global = True'设置为全文搜索
xiaoqi.Pattern = "”&start&“.+?”&over&“"'正则表达式
Set Matches =xiaoqi.Execute(wstr)'开始执行配置
set xiaoqi=nothing
body=""
For Each Match in Matches
body=body&Match.Value '循环匹配
Next
'-----------------翟振恺(小琦)
End Function
调用方法:body(被采集的页面的内容,开始标记,结束标记)
采集程序祥细思路:
1、取得网站的分页列表页的每页地址
目前绝大部分动态网站的分页地址都有规则,如:
动态页
第一页:index.asp?page=1
第二页:index.asp?page=2
第三页:index.asp?page=3
.....
静态页
第一页:page_1.htm
第二页:page_2.htm
第三页:page_3.htm
.....
取得网站的分页列表页的每页地址,只需要用变量替代每页地址的变化的字符即可如:page_<%="&page&"%>.htm
2、获取被采集网站的分页列表页内容
3、从分页列表代码中提取被采集的内容页面的URL连接地址
绝大部分分页页面里的内容页连接也有固定规则,如:
连接1

连接2

连接3

用以下代码就可以获得一个URL连接集合
CODE:
[Copy to clipboard]
'-----------------翟振恺(小琦)
Set xiaoqi = New Regexp
xiaoqi.IgnoreCase = True
xiaoqi.Global = True
xiaoqi.Pattern = ””“.+?”““
Set Matches =xiaoqi.Execute(页面列表内容)
set xiaoqi=nothing
url=""
For Each Match in Matches
url=url&Match.Value
Next
'-----------------翟振恺(小琦)
4、取得被采集的内容页面内容,根据”提取标记“从被采集的内容页面分别截取要取得的数据
因为是动态生成的页面,大多数内容页面内都有相同的html标记,我们可以根据这些有规则的标记提取需要的各个部分的内容。
如:
每个页面都有网页标题网页标题,用我上面写的MID截取函数就可以获得之间的值,也可以用正则表达式来获得。
例:body("网页标题","","")
介绍完采集器的祥细原理后,就开始说一下防采集的策略。
目前防采集的方法有很多种,先介绍一下常见防采集策略方法和它的弊端及采集对策:
一、判断一个IP在一定时间内对本站页面的访问次数,如果明显超过了正常人浏览速度,就拒绝此IP访问
弊端:
1、此方法只适用于动态页面,如:asp\jsp\php等...静态页面无法判断某个IP一定时间访问本站页面的次数
2、此方法会严重影响搜索引擎蜘蛛对其收录,因为搜索引擎蜘蛛收录时,浏览速度都会比较快而且是多线程。此方法也会拒绝搜索引擎蜘蛛收录站内文件
采集对策:只能放慢采集速度,或者不采
建议:做个搜索引擎蜘蛛的IP库,只允许搜索引擎蜘蛛快速浏览站内内容。搜索引擎蜘蛛的IP库的收集,也不太容易,一个搜索引擎蜘蛛,也不一定只有一个固定的IP地址。
评论:此方法对防采集比较有效,但却会影响搜索引擎对其收录。
二、用javascript加密内容页面
弊端:此方法适用于静态页面,但会严重影响搜索引擎对其收录情况,搜索引擎收到到的内容,也都是加密后的内容
采集对策:建议不采,如非要采,就把解密码的JS脚本也采下来。
建议:目前没有好的改良建议
评论:建议指望搜索引擎带流量的站长不要使用此方法。
三、把内容页面里的特定标记替换为”特定标记+隐藏版权文字“
弊端:此方法弊端不大,仅仅会增加一点点的页面文件大小,但容易反采集
采集对策:把采集来的含有隐藏版权文字内容的版权文字替掉,或替换成自己的版权。
建议:目前没有好的改良建议
评论:自己感觉实用价值不大,就算是加上随机的隐藏文字,也等于画蛇添足。
四、只允许用户登陆后才可以浏览
弊端:此方法会严重影响搜索引擎蜘蛛对其收录
采集对策:目前落伍已经有人发了对策文章 ,具体对策就看这个吧《ASP小偷程序如何利用XMLHTTP实现表单的提交以及cookies或session的发送》
建议:目前没有好的改良建议
评论:建议指望搜索引擎带流量的站长不要使用此方法。不过此方法防一般的采集程序,还是有点效果的。
五、用javascript、vbscript脚本做分页
弊端:影响搜索引擎对其收录
采集对策:分析javascript、vbscript脚本,找出其分页规则,自己做个对应此站的分页集合页即可。
建议:目前没有好的改良建议
评论:感觉懂点脚本语言的人都能找出其分页规则
六、只允许通过本站页面连接查看,如:Request.ServerVariables("HTTP_REFERER")
弊端:影响搜索引擎对其收录
采集对策:不知道能不能模拟网页来源。。。。目前我没有对应此方法的采集对策
建议:目前没有好的改良建议
评论:建议指望搜索引擎带流量的站长不要使用此方法。不过此方法防一般的采集程序,还是有点效果的。
从以上可以看出,目前常用的防采集方法,要么会对搜索引擎收录有较大影响,要么防采集效果不好,起不到防采集的效果。那么,还有没有一种有效防采集,而又不影响搜索引擎收录的方法呢?那就请继续往下看吧,精彩的地方马上呈献给大家。
下面就是我的防采集策略,防采集而又不防搜索引擎
从前面的我讲的采集原理大家可以看出,绝大多数采集程序都是靠分析规则来进行采集的,如分析分页文件名规则、分析页面代码规则。
一、分页文件名规则防采集对策
大部分采集器都是靠分析分页文件名规则,进行批量、多页采集的。如果别人找不出你的分页文件的文件名规则,那么别人就无法对你的网站进行批量多页采集。
实现方法:
我认为用MD5加密分页文件名是一个比较好的方法,说到这里,有人会说,你用MD5加密分页文件名,别人根据此规则也可以模拟你的加密规则得到你的分页文件名。
我要指出的是我们加密分页文件名时,不要只加密文件名变化的部分
如果I代表分页的页码,那么我们不要这样加密
page_name=Md5(I,16)&".htm"
最好给要加密的页码上再跟进一个或多个字符,如:page_name=Md5(I&"任意一个或几个字母",16)&".htm"
因为MD5是无法反解密的,别人看到的会页字母是MD5加密后的结果,所以加人也无法知道你在 I 后面跟进的字母是什么,除非他用暴力****MD5,不过不太现实。
二、页面代码规则防采集对策
如果说我们的内容页面无代码规则,那么别人就无法从你的代码中提取他们所需要的一条条内容。
所以我们要的这一步做到防采集,就要使代码无规则。
实现方法:
使对方需要提取的标记随机化
1、定制多个网页模板,每个网页模板里的重要HTML标记不同,呈现页面内容时,随机选取网页模板,有的页面用CSS+DIV布局,有的页面用table布局,此方法是麻烦了点,一个内容页面,要多做几个模板页面,不过防采集本身就是一件很烦琐的事情,多做一个模板,能起到防采集的作用,对很多人来说,都是值得的。
2、如果嫌上面的方法太麻烦,把网页里的重要HTML标记随机化,也可以。
做的网页模板越多,html代码越是随机化,对方分析起内容代码时,就越麻烦,对方针对你的网站专门写采集策略时,难度就更大,在这个时候,绝大部分人,都会知难而退,因为这此人就是因为懒,才会采集别人网站数据嘛~~~再说一下,目前大部分人都是拿别人开发的采集程序去采集数据,自己开发采集程序去采集数据的人毕竟是少数。
还有些简单的思路提供给大家:
1、把对数据采集者重要,而对搜索引擎不重要的内容用客户端脚本显示
2、把一页数据,分为N个页面显示,也是加大采集难度的方法
3、用更深层的连接,因为目前大部分采集程序只能采集到网站内容的前3层,如果内容所在的连接层更深,也可以避免被采集。不过这样可能会给客户造成浏览上的不便。
如:
大多网站都是 首页----内容索引分页----内容页
如果改成:
首页----内容索引分页----内容页入口----内容页
注:内容页入口最好能加上自动转入内容页的代码
CODE:
[Copy to clipboard]

其实,只要做好防采集的第一步(加密分页文件名规则),防采集的效果就已经不错了,还是建议两条反采集方法同时使用,给采集者增加采集难度,使得他们知难页退。
至此,全文完,欢迎大家在此讨论与此相关技术,谢谢!
作者:翟振恺(小琦)
希望大家转载时,不要把作者版权去掉,谢谢合作!
16:37 |固定链接 |软件技术
2006/7/24
Visual C++ .NET编程:托管C++概述
2000年6月,Microsoft推出了“Microsoft.NET下一代互联网软件和服务战略”,引起IT行业的广泛关注。2000年9月,Microsoft在旧金山发布了Enterprise 2000。同月,Microsoft原总裁兼首席执行官鲍尔默来到中国就“下一代互联网”的主题进行演讲,在中国掀起了一股“.NET旋风”。2000年11月,Microsoft在Comdex计算机大展上发布了Visual Studio.NET软件,并展示了其.NET发展战略的框架体系和开发工具的相关特性,全面加速了Microsoft以.NET技术进军市场的步伐。
Microsoft的.NET战略意味着:Microsoft以及在Microsoft平台上的开发者将会制造服务,而不是制造软件。在未来几年之内,Microsoft将陆续发布有关.NET的平台和工具,用于在因特网上开发Web服务。那时,工作在.NET上的用户、开发人员和IT工作人员都不再购买软件、安装软件和维护软件。取而代之的是,他们将定制服务,软件会自动安装,所有的维护和升级也会通过互联网进行。“Microsoft.NET 代表了一个集合、一个环境、一个可以作为平台支持下一代Internet的可编程结构。”这就是鲍尔默对.NET的描述。
作为.NET的最新特性组成部分,Microsoft .NET Framework是一个用于构建,部署和运行Web服务及应用程序的平台。它为将现有投资与下一代应用程序和服务的集成提供了高产的,基于标准的,多语言环境,同时它还用于解决Internet级应用程序的部署和操作问题。.NET框架包含三个主要部分:通用语言运行时,一组层次化的统一的类库,及组件化版本的动态服务器主页(称为ASP.NET)。
用于开发.NET Framework的语言有Visual C#、VB.NET和C++托管扩展(Managed Extensions for C++)。其中C#是开发.NET的元语言,而C++托管扩展是在C++基础上建立起来的,用来为Visual C++程序员开发.NET框架应用程序而设计。为叙述方便,我们将C++托管扩展就称之为“托管C++”。
为了帮助C/C++以及Visual C++程序员或爱好者快速使用托管C++开发.NET Framework程序,我们将陆续推出相关的一系列文章。
本篇“托管C++概述”主要讲述了什么是托管C++、开发.NET Framework(框架)的项目类型以及与标准C++之间的区别。
1、什么是托管C++?
在回答这个问题,首先要搞清楚什么是“托管”(Managed)。托管是.NET的一个专门概念,它是融于通用语言运行时(CLR)中的一种新的编程理念,因此我们完全可以把“托管”视为“.NET”。那么什么是“通用语言运行时”?通用语言运行时是.NET 框架应用程序的执行引挚。它提供了许多服务,其中包括:代码管理(装入和执行)、类型安全性验证、元数据(高级类型信息)访问、为管理对象管理内存、管理代码,COM对象和预生成的DLLs(非管理代码和数据)的交互操作性、对开发人员服务的支持等等。
也就是说,使用托管C++意味着,我们的代码可以被CLR所管理,并能开发出具有最新特性如垃圾自动收集、程序间相互访问等的.NET框架应用程序。
由托管概念所引发的C++应用程序包括托管代码、托管数据和托管类三个组成部分。
(1) 托管代码:.Net环境提供了许多核心的运行(RUNTIME)服务,比如异常处理和安全策略。为了能使用这些服务,必须要给运行环境提供一些信息代码(元数据),这种代码就是托管代码。所有的C#、VB.NET、JScript.NET默认时都是托管的,但Visual C++默认时不是托管的,必须在编译器中使用命令行选项(/CLR)才能产生托管代码。
(2) 托管数据:与托管代码密切相关的是托管数据。托管数据是由公共语言运行的垃圾回收器进行分配和释放的数据。默认情况下,C#、Visual Basic 和 JScript.NET 数据是托管数据。不过,通过使用特殊的关键字,C# 数据可以被标记为非托管数据。Visual C++数据在默认情况下是非托管数据,即使在使用 /CLR 开关时也不是托管的。
(3) 托管类:尽管Visual C++数据在默认情况下是非托管数据,但是在使用C++的托管扩展时,可以使用“__gc”关键字将类标记为托管类。就像该名称所显示的那样,它表示类实例的内存由垃圾回收器管理。另外,一个托管类也完全可以成为 .NET 框架的成员,由此可以带来的好处是,它可以与其他语言编写的类正确地进行相互操作,如托管的C++类可以从Visual Basic类继承等。但同时也有一些限制,如托管类只能从一个基类继承等。需要说明的是,在托管C++应用程序中既可使用托管类也可以使用非托管类。这里的非托管类不是指标准C++类,而是使用托管C++语言中的__nogc关键字的类。
21:06 |固定链接 |软件技术
2006/7/23
Symbian和C++ SDK入门之开发工具
发Series 60项目的时候你可以使用的各种选项总结在表1-1中。Symbian、Nokia和开发工具厂商Borland、Metrowerks正在提供更多的选择。但是,好像微软开发工具,尽管它目前可行并被广泛地使用,在可预见的未来无法受到支持。
在微软、Borland和Metrowerks的多种IDE的功能之间目前有一些值得注意的差别。对后两种开发环境的增强正在进行之中。 EMCC软件有限公司把所有的三种厂商的IDE都作为自己开发活动的基础。我们也每天使用命令行工具——并不是因为我们原意,而是由于我们目前只能这样做。这是为目标设备建立程序和自动化通宵编译过程的基本操作。C++BuilderX和CodeWarrior IDE现在可以用于为目标设备建立程序——但并不是所有的基本的建立操作都受到全部IDE的支持。
在写作本文的时候,开发任何Series 60项目的最容易的和最通用的出发点是定义一对bld.inf和.mmp项目文件。在EMCC软件公司,这些文件用于任何特定IDE项目文件的生成过程,并且可以在任何需要的命令行建立过程中使用。这种方法也是Symbian和Nokia在它们的SDK和文档中提供的每个简单的项目目前所采用的方法。在目前情况不断变化的情况下使用专用的IDE是不可行的。各种情况很快就会发生变化,而这正式Symbian OS和Series 60开发人员的真实生活。

在本文的剩余部分中,我们使用HelloWorld示例项目来演示Series 60模拟器的开发、调试和部署过程的所有步骤。
我们也提供了示例应用程序需要的其它的所有文件——例如头文件(.h)、源文件(.cpp)和用户界面资源文件(.rss)。
你可以使用Series 60模拟器测试该应用程序,或者在某个IDE中启动它,或者从命令行提示符上运行它。但是,在模拟器上调试应用程序必须在IDE内部进行。
在模拟器上开发、运行、测试和调试应用程序之后,一般你都希望在目标设备上建立和运行该程序。因此我们还演示了如何为目标设备建立示例应用程序,如何部署它,并在目标Series 60硬件上运行它。
Series 60模拟器
Series 60应用程序的开发、调试和最初的测试一般都在PC模拟器上进行,该模拟器提供了一种基于微软Windows的Series 60设备的实现。在大多数情形中你会发现基于模拟器的开发过程与在真实的设备上运行的应用程序的操作是非常相似的;因此你的主要工作在硬件设备可以使用之前就可以进行了。模拟器的精确界面与提供的图形会有很大的不同,它依赖于你使用的目标平台、Series 60的版本和所选择的IDE。此外,还可能添加或删除一些按钮或其它的操作元素以模拟现实的设备的配置。同样,模拟器上可以使用的应用程序也依赖于平台的版本和设备厂商的选择。
模拟器和真实的设备之间有些差异无法避免。真实的Series 60设备可能带有硬件附件(例如照相头)和其它特性(例如后台振动)。因此有时候硬件对于开发和测试是必要的。此外,基于PC的模拟器不能精确地模拟精确计时、应用程序性能和内存管理的问题。
对于基于PC的开发,编辑/编译/建立周期是基于微软Windows开发工具集的。但是,与依赖Win32或MFC类库进行链接和建立不同,开发者将依赖于Series 60 SDK安装的头文件和PC格式的类库来进行链接和建立。作为结果的Windows格式的二进制可执行文件就可以在以PC的模拟器上运行了。
在开发过程中,特定IDE的项目文件管理着所有的链接和建立细节信息。它同时确保了建立操作的所有输出和其它需要的资源文件(例如应用程序资源文件)都被放到了适当的位置以供在模拟器环境下进行运行和调试。
根据图1-2,Series 60显示屏逻辑上被分成三个区域:状态块、主块和控制块。

图1-2. Series 60模拟器
状态块是屏幕顶部的刻度条(在模拟器上是蓝色的)加上它上面的区域。主块是屏幕中间的,位于状态条和屏幕底部之间的软按键(soft key)标签之间的部分。控制块是紧接着主快,包含了软按键标签。
状态块可以显示当前应用程序的信息和设备的一些普通信息(例如信号强度和电池情况)。它在大多数情形中是可视的,但是有时候是隐藏的。例如很多游戏就使用了整个屏幕。
主块是屏幕的主要区域,应用程序可以在这儿显示数据。典型情况下,这个区域作为客户端矩形引用,它通常被应用程序的数据显示所填满。
控制块占据了屏幕的下部,它显示了与两个软按键相关的标签,并根据需要显示滚动条。与状态块类似,控制块有时候也可以隐藏。在这种情况下,在 Series 60中样式指导假定用户可以使用Options菜单(左边的软按键的默认的标签),即使它是不可视的(请参考Series 60 SDK文档提供的“Nokia Series 60游戏UI样式指导”)。
控制块下面的两个按钮分别是左和右软按键,用于选择当前关联的Options菜单或标记的操作。四路导航按键可以上下左右滚动,如果按下(点击)中间就可以进行选择。
你可以通过PC鼠标或光标按键在显示屏上的对象之间进行导航,从而与模拟器交互操作。我们可以直接地使用鼠标点击来选择文件夹或其它显示的对象,而不需要使用四路导航按键(仅仅在模拟器上可行)。我们可以使用PC键盘进行数据输入,或者通过点击模拟器上的12位键区来输入。因此与模拟器的交互操作是类似于、但并不是完全与使用真实的Series 60一样的——在真实的设备上没有笔输入,因此所有的移动和选择都是通过光标导航完成的。
16:11 |固定链接 |软件技术
2006/7/20
MSNP9协议分析(MSN6.0)
前 言
MSN Messenger 是Microsoft开发的聊天工具,目前在国内拥有很大的用户群。使用MSN Messenger可以与他人进行文字聊天,语音对话,视频会议等即时交流,还可以通过此软件来查看联系人是否联机等。该软件的最新版本是6.1。
1999年,Microsoft向IETF提交了一份"MSN Messenger Service 1.0 Protocol"草案,这是最初版本的MSN Messenger协议。在以后几年,该公司不再公开有关MSN Messenger协议的升级、修改细节的官方文档。但无论是开发第三方的聊天客户端软件(如Gaim, MyIM等),还是做协议分析,必须对其通信协议有深入了解。正因为如此,有一些民间人士对这些协议开展了研究(见本文的"相关资源"一节)。
当我们还在感叹"这世界,变化快"的时候,MSN Messenger的协议已经到了第10版,简称MSNP10,对应于MSN Messenger 6.1。MSN Messenger 6.0则使用MSNP9。现在Microsoft强迫MSN Messenger用户升级到6.0或6.1版,因为服务器对MSNP8以下的版本不再支持。本文及后续文章所描述的MSN Messenger协议主要针对MSNP9/MSNP10。
1. 连 接
MSN Messenger协议建立在TCP/IP之上。除了文件传输和语音聊天是直接的"点对点"通信之外,其它所有的情形全部通过服务器进行。
在逻辑上,一共有三种类型的服务器,各司其职:
派遣服务器(Dispatch Server, DS) - 客户端最初连接的服务器。负责给客户端分配合适的通知服务器。域名是messenger.hotmail.com,标准服务端口是1863。完成派遣任务后,切断TCP连接。
通知服务器(Notification Server, NS) - 客户端需要一直保持连接的服务器。很多任务要在这个会话内完成,包括登录、改变状态、获取用户列表、修改用户信息、发起聊天、接受呼叫、邮件通知、退出等等。服务端口由派遣服务器指定,通常也是1863。
接线服务器(Switchboard Server, SS) - 客户端之间聊天使用的中转服务器。每开一个聊天窗口,客户端和服务器就建立一个TCP会话。当客户端之间需要进行文件传输或语音聊天时,发送系统消息,建立"点对点"会话通道(可能转为使用UDP)。服务端口通常也是1863。"点对点" 通信使用的端口由客户端自动协商决定,如文件传输通常使用6891端口。
2. 命 令
MSN Messenger命令使用纯ASCII码。对非ASCII码字符使用URL编码。命令的语法是
XXX[TrIDPARAM1PARAM2…]
其中,是空白字符,是回车换行,XXX是一个3字符的命令串,TrID是一个流水号,PARAMx是参数,[ ]内是可选项。最简单的命令没有流水号和参数。为了方便起见,下面讨论时用" "代表,"\r\n"代表,"\x??"代表一个值为0x??字节。红色表示由客户端发出,蓝色表示由服务器发出。一个MSN Messenger命令的例子如下:
USR 18 TWN I example@hotmail.com\r\n
3. 错 误
无论是由于客户端发出的命令无效,参数无效,还是其他什么原因,服务器可以返回一个错误。格式为
XXX[TrID]
其中,XXX是一个3位数字的串。如
ADD 21 AL non_existent@passport.com non_existent@passport.com\r\n 205 21\r\n
上例中,non_existent@passport.com是一个不存在的账号。
4. 消 息
MSN Messenger消息符合MIME 1.0标准,由消息头与消息体组成。通常使用UTF-8编码,消息头中也需要URL编码格式,消息体则直接用二进制数据。
一个MSN Messenger消息的例子如下:
MIME-Version: 1.0\r\n Content-Type: text/plain; charset=UTF-8\r\n X-MMS-IM-Format: FN=%E5%AE%8B%E4%BD%93; EF=; CO=0; CS=86; PF=0\r\n \r\n bhw98\xE4\xBD\xA0\xE5\xA5\xBD\xEF\xBC\x81
经简单分析可知,"%E5%AE%8B%E4%BD%93"是"宋体"的UTF-8加URL编码,而"bhw98\xE4\xBD\xA0\xE5\xA5\xBD\xEF\xBC\x81"是"bhw98你好!"的UTF-8编码。
命令一览
命令 来源 去向 说明 备注
ACK SS Client 确认,做出肯定回答。 acknowledgement
ADD Client NS 发出添加新联系人到列表的请求。 add user
NS Client 返回添加新联系人请求的应答。
ADG Client NS 发出添加新联系人组请求。 add group
NS Client 返回添加新联系人组请求的应答。
ANS Client SS 接受聊天连接请求。 answer
BLP Client NS 设置对尚未列入明确允许/禁止的联系人列表的保密策略。 block list privacy
NS Client 返回设置保密策略请求的应答。
BYE SS Client 通知客户端结束会话。 bye
CAL Client SS 发出建立聊天连接的请求。 call
SS Client 返回建立聊天连接请求的应答。
CHG Client NS 发出改变状态的请求。 change state
NS Client 返回改变状态的应答。
CHL NS Client 服务器发出验证要求。 challenge
SS Client
CVR Client NS 发出客户端的OS、语言、MSN Messenger版本等信息。 client version
Client SS
NS Client 返回推荐的MSN Messenger版本、升级软件需要的下载地址等信息。
SS Client
FLN NS Client 通知有联系人列表中的用户下线。 off-line
GTC Client NS 设置当有联系人列表中的用户状态改变时给出的提示。 greeting to changes?
NS Client 返回设置请求的应答。
INF Client NS 询问服务器所支持的认证方式。 information?
Client SS
NS Client 返回服务器所支持的认证方式。
SS Client
ILN NS Client 当客户端登录或添加联系人到列表时,通知列表中的联系人的状态。 initial online state
IRO SS Client 当有新用户加入聊天连接时,通知客户端该连接中的用户名单。 initial roster information
JIO SS Client 通知客户端已经同另外的用户建立了聊天连接。 jion
LSG Client NS 发出获取联系人组列表的请求。 list groups
NS Client 返回获取联系人组列表请求的应答。
LST Client NS 发出获取联系人列表的请求。 list
NS Client 返回获取联系人列表请求的应答。
MSG Client SS 发送消息到其他用户(聊天对象)。 message
NS Client 传递服务器(系统) 的消息到客户端。
SS Client 传递其他用户(聊天对象)的消息到客户端。
NAK SS Client 做出否定回答。 negative acknowledgement
NLN NS Client 通知客户端联系人上线或改变状态。 on-line
OUT All All 结束客户端-服务器的连接。 out
PNG Client NS 测试TCP连接状态。 ping
Client SS
PRP Client NS 发出设置个人电话号码的请求。 personal phone number
NS Client 返回设置请求的应答
PNG Client NS 测试TCP连接状态。 ping
Client SS
QNG NS Client 返回测试TCP连接状态的应答。 quiz ping?
SS Client
QRY Client NS 客户端回答服务器的验证要求。 quiz reply?
Client SS
REA Client NS 发出修改用户昵称的请求。 rename nickname
NS Client 返回修改用户昵称请求的应答。
REG Client NS 发出修改联系人组的请求。 rename group
NS Client 返回修改联系人组请求的应答。
REM Client NS 发出从联系人列表中删除用户的请求。 rename user
NS Client 返回删除用户请求的应答。
RMG Client NS 发出删除联系人组的请求。 remove group
NS Client 返回删除联系人组请求的应答。
RNG NS Client 通知客户端有人要建立聊天连接。 ring
SYN Client NS 客户端-服务器同步。 synchronization
NS Client
URL Client NS 发出获取MSN服务URL的请求。 URL
NS Client 返回获取URL请求的应答。
USR All All 声明、传递、鉴别用户身份。 user
VER Client DS 协商MSN Messenger协议版本。 version
Client NS
DS Client
NS Client
XFR DS Client 向客户端分配NS(通知客户端转向连接指定的NS)。 transfer
Client NS 发出分配SS的请求。
NS Client 返回分配SS请求的应答。
MSN Messenger协议--错误代码一览
代码 含义 可能的命令 错误示例 备注
200 非法命令   ABC 18\r\n
200 18\r\n
201 非法参数   CHG 19 FLN 0\r\n
201 19\r\n
ADD 20 AL aaa@bbb@ccc aaa@bbb@ccc\r\n
201 20\r\n
205 用户不存在 ADD ADD 21 AL none@hotmail.com none@hotmail.com\r\n
205 21\r\n
206 缺少域名
207 已经登录 USR USR 20 TWN I example@hotmail.com\r\n
207 20\r\n
USR 21 TWN S 8d30fc782aa25ec9e1293fdda13cab42\r\n
207 21\r\n
208 非法用户名 CAL CAL 2 @@hotmail.com\r\n
208 2\r\n
209 非法用户昵称 REA REA 18 one@hotmail.com kill%20microsoft\r\n
209 18\r\n
210 用户太多 ADD ADD 23 FL one@hotmail.com one@hotmail.com 0\r\n
210 23\r\n 最大150
215 用户已在列表中 ADD ADD 36 FL one@hotmail.com one@hotmail.com 2\r\n
ADD 36 825 FL one@hotmail.com one@hotmail.com 2\r\n
ADD 37 FL one@hotmail.com one@hotmail.com 2\r\n
215 37\r\n
CAL CAL 5 two@hotmail.com\r\n
CAL 5 RINGING 213697\r\n
CAL 6 two@hotmail.com\r\n
215 6\r\n
216 用户不在列表中 REM REM 14 FL three@hotmail.com\r\n
216 14\r\n
REA REA 48 three@hotmail.com three\r\n
216 48\r\n
CAL CAL 2 three@hotmail.com\r\n
216 2\r\n
217 用户不在线 CAL CAL 2 two@hotmail.com\r\n
217 2\r\n
218 已在指定模式 BLP BLP 17 BL\r\n
BLP 17 151 BL\r\n
BLP 18 BL\r\n
218 18\r\n
GTC GTC 19 A\r\n
GTC 19 152 A\r\n
GTC 20 A\r\n
218 20\r\n
219 用户已经在相反的列表中 ADD ADD 15 AL four@hotmail.com four@hotmail.com\r\n
ADD 15 AL 56 four@hotmail.com four\r\n
ADD 16 BL four@hotmail.com four@hotmail.com\r\n
219 16\r\n
223 用户组太多 ADG ADG 28 new%20group 0\r\n
223 28\r\n 最大30
224 非法组号 ADD RMG 24 3\r\n
RMG 24 11506 3\r\n
ADD 25 FL five@hotmail.com 3\r\n
224 25\r\n
REM RMG 24 3\r\n
RMG 24 11506 3\r\n
REM 25 FL five@hotmail.com 3\r\n
224 25\r\n
REG RMG 24 3\r\n
RMG 24 11506 3\r\n
REG 25 3 New%20Name 0\r\n
224 25\r\n
RMG RMG 24 3\r\n
RMG 24 11506 3\r\n
RMG 25 3\r\n
224 25\r\n
225 用户不在组中 REM REM 26 FL six@hotmail.com 3\r\n
225 26\r\n
229 组名太长 ADG ADG 27 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 0\r\n
229 27\r\n 最大60
230 不能删除组0 RMG RMG 28 0\r\n
230 28\r\n
300 缺少必要的参数
302  尚未登录
500 服务器内部错误
540 验证应答错误
600 服务器忙
707 无法建立连接
910 服务器忙
911 身份验证失败
过去的MSN Messenger版本(MSNP8以下),简单地使用MD5等Hash算法对用户身份进行认证。MSNP9/MSNP10使用一种TWN(Tweener)认证方式,通过SSL/TLS连接到login.passport.com和loginnet.passport.com等服务器,借助于HTTP协议输入账号和密码,认证通过后,才能取得“入场券”。
真正意义上的身份认证,发生在客户端与通知服务器(NS)之间。客户端登陆NS时,首先交换版本信息。双方均支持MSNP8以上版本时,才能进行认证过程。如果客户端版本较低,不支持TWN,咋办?服务器会将你一脚揣出去,信不信?
好了,废话少说,现在拿一个成功认证的例子看看。在下面的例子中,账号是“example@passport.com”,密码是“password”。
VER 4 MSNP10 MSNP9 CVR0 \r\n
VER 4 MSNP9 CVR0 \r\n
CVR 5 0x0804 winnt 5.0 i386 MSNMSGR 6.1.0203 MSMSGS example@passport.com \r\n
CVR 5 6.0.0602 6.0.0602 5.0.0527 http://download.microsoft.com/download/d/4/f/d4f560d5-6dc6-4901-b149-a568415561d7/SETUPNT.EXE http://messenger.msn.com/cn \r\n
USR 6 TWN I example@passport.com \r\n
USR 6 TWN Slc=1033,id=507,tw=40,fs=1,ru=http%3A%2F%2Fmessenger%2Emsn%2Ecom,ct=1073355862,kpp=1,kv=5,ver=2.1.0173.1, tpf=ed1c2f217a21c191c61251eb8b73bb60 \r\n
(此时通过SSL进行身份认证,获得“入场券”)
USR 7 TWN S t=4m1wWfEupDgUNb53qys5gJdw8OTJEtT82fcuDbS3U672gTymOOs6cgKeafj7WjgZNcufAQggxqHRRXko02DoflZA$$ &p=4QXNnX9rFDDgki9ZqvqPZGDGJa2Mrd5H13Zfl0NNjh4I78qPyfpzmkZPZEe0nxJTkzZSNDYtk!57cVqiYVfO86KgCRYWhi2kudS0M !7bdi82EDA1FYp3WboHD!sCQ17OZh7lPQI7fozrgsSMZwgSzRi2FNTPxf13oDNIfDCKCG!2guDvZKEpk78A$$ \r\n
USR 7 OK example@passport.com example@passport.com 1 0 \r\n
第一回合(TrID=4),双方协商MSN版本号。客户端说“我能支持MSNP9和MSNP10”,NS说“行,就MSNP9吧”。
第二回合(TrID=5),客户端报告本机信息:OS = Windows 2000 (NT 5.0), 语言 = 简体中文,MSN Messenger版本 = 6.1.0203, 账号 = example@passport.com。NS给出了推荐的版本号,能够使用的最老的版本号,新版本下载地址,官方网站地址等信息。
第三回合(TrID=6),客户端要求身份认证(I = Initial),NS则给出所需要的一长串信息(S = Subsequent)。其中tpf相当于challenge,参与Hash运算,能保证每次认证返回的串是不同的。
第四回合(TrID=7),客户端出示从认证服务器得到的“入场券”,NS放行(OK)。
第三、四回合之间,通过SSL的认证过程如下:
首先在HTTPS端口443向login.passport.com发送一个GET请求,将账号、密码和NS给定的一长串信息送出
GET /login2.srf HTTP/1.1 \r\n
Authorization: Passport1.4 OrgVerb=GET,OrgURL=http%3A%2F%2Fmessenger%2Emsn%2Ecom,sign-in=example%40passport.com,pwd=password, lc=1033,id=507,tw=40,fs=1,ru=http%3A%2F%2Fmessenger%2Emsn%2Ecom,ct=1073355862,kpp=1,kv=5,ver=2.1.0173.1, tpf=ed1c2f217a21c191c61251eb8b73bb60 \r\n
Host: login.passport.com \r\n \r\n
根据情况,会重定向到不同的URL。本例中,重定向到"https://loginnet.passport.com/login2.srf?lc=1033",服务器应答
HTTP/1.1 302 Found \r\n Server: Microsoft-IIS/5.0 \r\n
Date: Mon, 22 Dec 2003 21:10:05 GMT \r\n
PPServer: H: LAWPPLOG5C006 \r\n
Connection: close \r\n
Content-Type: text/html \r\n
Expires: Mon, 22 Jun 2003 21:09:05 GMT \r\n
Cache-Control: no-cache \r\n
cachecontrol: no-store \r\n Pragma: no-cache \r\n
P3P: CP="DSP CUR OTPi IND OTRi ONL FIN" \r\n
Authentication-Info: Passport1.4 da-status=redir \r\n
Location: https://loginnet.passport.com/login2.srf?lc=1033 \r\n
\r\n ... ...
然后,重新向指定的URL发出请求,得到如下响应
HTTP/1.1 200 OK \r\n
Server: Microsoft-IIS/5.0 \r\n
Date: Mon, 22 Dec 2003 21:10:07 GMT \r\n
PPServer: H: LAWPPIIS6B061 \r\n
Connection: close \r\n Content-Type: text/html \r\n
Expires: Mon, 22 Dec 2003 21:09:07 GMT \r\n
Cache-Control: no-cache \r\n
cachecontrol: no-store \r\n
Pragma: no-cache \r\n
P3P: CP="DSP CUR OTPi IND OTRi ONL FIN" \r\n
Set-Cookie: ... ... \r\n
Authentication-Info: Passport1.4 da-status=success,tname=MSPAuth,tname=MSPProf,tname=MSPSec, from-PP='t=4m1wWfEupDgUNb53qys5gJdw8OTJEtT82fcuDbS3U672gTymOOs6cgKeafj7WjgZNcufAQggxqHRRXko02DoflZA$$ &p=4QXNnX9rFDDgki9ZqvqPZGDGJa2Mrd5H13Zfl0NNjh4I78qPyfpzmkZPZEe0nxJTkzZSNDYtk!57cVqiYVfO86KgCRYWhi2kudS0M !7bdi82EDA1FYp3WboHD!sCQ17OZh7lPQI7fozrgsSMZwgSzRi2FNTPxf13oDNIfDCKCG!2guDvZKEpk78A$$', ru=http://messenger.msn.com \r\n
Content-Length: 0 \r\n
\r\n
开始时直接向loginnet.passport.com发出正确的请求,也是可以的。不难看出,在服务器认证成功的返回信息中,Authentication-Info字段的from-PP串值,就是所谓的“入场券”。
如果认证失败,服务器返回401错误
HTTP/1.1 401 Unauthorized \r\n ... ...
这样,就无法拿到“入场券”,自然不能在第四回合中输入合法的串。
20:18 |固定链接 |软件技术
2006/7/8
几款搜索引擎优化检测工具
Google链接广泛度检测器(Google Backlink Checker):http://www.webconfs.com/google-backlink-checker.php 输入你的网站URL,程序将搜索到Google中有哪些网站链接了你的站点,以及链接所用的文本标题。由于不支持中文字符,中文文本内容是乱码,但链接的URL一目了然。
搜索引擎抓取内容模拟器(Search Engine Spider Simulator):http://www.webconfs.com/search-engine-spider-simulator.php 输入你要查询的URL,获知Google可以抓取到的该页文本内容和链接。不妨对比测试一下使用大量文本和大量图片的页面所获得的内容悬殊的抓取结果。网络营销人也可以利用此工具来检测优化后的页面质量。支持中文字符。
搜索引擎抓取页面数量统计器(Search Engine Saturation):http://www.marketleap.com/siteindex/ 输入你的网站URL和随机显示的进入代码,你将获得搜索引擎Alltheweb、AltaVistaGoogle/AOL、HotBot/Inktomi所抓取到的你的网站页面数量。你也可以同时输入3个竞争对手网站URL以进行对比,了解自己在竞争中所处地位。
链接广泛度检测器(Link Popularity Check):http://www.marketleap.com/publinkpop/ 输入你的网站URL和随机显示的进入代码,你将获知在搜索引擎Alltheweb AltaVista Google/AOL HotBot/Inktomi MSN 中有哪些网站链接了你的网站,以及同一URL在Dmoz、Excite、iWon、Lycos、Overture等搜索引擎中的详细链接资料。你也可以同时输入5个竞争对手网站URL以进行对比,了解自己在竞争中所处地位。 同样的工具还有http://www.trafficzap.com/linkpopularit
y.php,可检测网站在Yahoo、Google、MSN、Lycos和Altavista的链接总数和具体链接的网站。 Google排名监测工具(Free Monitor for Google):http://www.cleverstat.com/google-monitor.htm 需要下载使用。该工具可以报告你的网站以某关键词在Google中的排名情况,以及同一关键词下排名前N位(自己设定位数)的网站URL。
相似页面检测器(Similar Page Checker):http://www.webconfs.com/similar-page-checker.php 众所周知,Google会对拷贝页面内容进行排名惩罚。该工具可以检验两个页面的相似度,来判断是否会受到惩罚。如http://www.sitepronews.com/freebooks.html 和http://www.allbusinessnews.com/freebooks.html,相似度达到80%,后者在Google中的PageRank排名值通过工具栏显示为0.
14:31 |阅读评论 (1) |固定链接 |SEO
Google PageRank 算法解析
什么是PageRank?
PageRank是Google衡量网页重要性的工具,测量值范围为从1至10分别表示某网页的重要性。在Google工具栏可以随时获得某网页的PageRank值。在这里我们将透视PageRank的一些特殊之处,从而对其能够获得较为深入的了解,使广大用户能够更好的使用和了解Googel。
网站排名的历史渊源
上世纪90年代早期网络刚刚兴起之时,每天都有大量的含有特别行业内容的站点发布于网上。网上冲浪者却没有相应的工具定位这些他们认为存在的,但是却没有办法找到域名或网址的站点。到了1993年,雅虎诞生了。雅虎的诞生为网民减轻了这些烦恼。雅虎最初将每一个它所找到的网站,按照所属的分类目录进行划分组织,建立起一个整洁的、可以逐级查找的数据库,雅虎同时也在网站上置入一个 搜索引擎可以根据数据库中存在的“关键词”搜索到网站。接着其他搜索引擎如Altavista ,Excite, Lycos等也相继推出供用户使用的搜索工具。他们中的大多数是根据找到的元标识中的关键词来识别网站的相关性。
事情好像发展地很顺利,但是当站主及网管意识到可以在元标识中插入行业关键词或其他站点代码,就可以巧妙的得到搜索结果页面上的较高的位置的时候问题来了。有一段时间,搜索引擎的结果被这些垃圾网站搞得乱七八糟,他们用某些相关的关键词充斥于网站的各个角落,可是展现在用户面前的实际内容确实糟糕透顶。那些信用较高、地位重要的搜索引擎开始受到挑战,他们必须采取更好的措施精确为用户输出的搜索结果。
Google网页级别祥解
Google意识到了传统搜索引擎所面临的这种问题。如果相关性有网管来控制的话,那么排名结果必将被他们人为安排的大量相关关键词所污染,掩蔽了真正的相关性。
网络的本质就是超链接。我们从逻辑上分析,每个人都让自己的网站与某些重要的站点相链接,那么,本质上,这个站点就投了对方的一票。当上百上千个站点链接到这个站点时,我们认为这个站点是一个很好的很重要的站点也就非常符合逻辑了。
就是在这样的逻辑推理下,Google的两位创始人Sergey Brin及Larry Page建立了一个搜索引擎算法公式,即将排名比重转移到了网页意外的因素上。他们的公式被命名为“PageRank”(以创建人Larry Page的名字命名)。Google就是利用这一公式计算链接到某一网页的网站数量,然后按照从1-10分别给予表示重要度的分数。链接到网页的站点越多,PageRank的分数越高。
Sergey Brin和Larry Page在1998年把PageRank技术配置进Google一同推出。结果出乎的成功。Google这种难以认为控制的算法公司得出的出众的相关结果大大超过了竞争对手。这种新的算法不仅有助于提供出权威的高质量的信息,而且使得站主即网管很难利用作弊手段取得较高排名。
Google的PageRank之所以如此重要,就是因为影响网页排名的因素主要是依赖于网页意外的因素,而非能够认为操纵的因素。
Google对PageRank的解释
在Google网站上有一个专门的域名介绍PageRank(http://www.Google.com/technology/)
PageRank完全依靠的是网络的民主特性,利用大量的链接结构表明某个单独页面的价值。本质上来说,Google把链接转换为一次投票,当从网页 A 链接到网页 B 时,Google 就认为“网页 A 投了网页 B 一票”。 Google 也不是纯粹考虑投票的数量,还对投票的网页进行分析。本身很重要的网页的投票有助于增强其他对方网页的重要度。
重要的是,Google会记录每次的搜索行为,高质量的网站能够获得较高的PageRank分值。当然,重要的网页如果不能匹配你的查询就没有任何价值。所以,Google把PageRank技术及文本匹配技术进行结合从而搜索出既重要又相关的的结果。Google的匹配技术不是只考虑词条在网页上的出现次数,而是检查网页内容(及链接网页的内容)的所有方面,从而决定该网页是否匹配你的查询。
更多信息访问Google PageRank介绍:
搜索引擎排名与PageRank的关系
虽然每个搜索引擎都严格保密各自的明确的搜索算法,但是搜索引擎分析人士相信搜索引擎结果(排名列表)是“Page Relevance”与“PageRank”因素综合承继的结果。
Ranking = (Page Relevance) x (PageRank)
PageRank逻辑算法无疑是具有重大意义的,而且这种算法不能够被网管人员轻易操纵。Google的搜索结果能够显示出如此高的相关性无疑也是它能够获得彻底成功的重要原因之一。大多数其他搜索引擎已经完全采用同类模式作为自己的搜索算法,而有的搜索引擎将这种算法在决定结果排名中的重要程度进行定义后应用与自己的搜索结果中。
自网络发展的初期,搜索引擎就一直不断的努力试图开发出可以排列相关网页的搜索算法。大多数搜索引擎重视于“链接流行度”(link popularity),作为评价网页重要度及用于索引的标准
Google 工具栏
Google工具栏供人免费下载安装,除了某些有用的功能外,比较显著的一个特点就是它可以告诉用户目前正在访问的每个网页的PageRank值。
下载后的Google工具栏位于浏览器窗口下部,可随时随地进行网上搜索。工具栏显示出每个页面从1-10不等的PageRank分值。对于Google未索引的网页,工具栏不会显示出该页的PageRank分值。需要提醒的是,该分值是针对网页而言,而非网站。
注:PR值越高,说明营销人员要针对相应的搜索词条获得较高的排名位置就有更多的竞争。所以,我们建议根据关键词优化你的网页PR值。
什么是链接流行度?
“链接流行度”系统是基于网页获得的链接的数量及质量而定的。也就是说,指向你的网页的链接数量越多,你的网页将被搜索引擎认为越重要。数量并不是决定网站重要度的唯一因素,重要度还取决于其他因素,包括被链接到本站点的站点的质量、他们的内容的质量及与本站点的行业相关性等。
链接到本站点的网页会把PageRank的部分分值分配到本站点。所以链接页面的PageRank分值越高,分配给本站点的分值也就越高。
PageRank也会被链接页面商店所有导出链接所瓜分。譬如,同样PR为5的链接网页,导出链接只有15个的网页会比导出链接为100个的网页分配给你更多的分值。
所以重要的是要从PR值较高并且总体导出链接数量较少网页才能获得安全链接。
如何检测链接流行度
最简单的检测网站流行度的方法就是利用Google搜索,方法如下:
link:www.yoursite.com
其它主要搜索引擎在搜索你的链接流行度时都有不同的规则。
建立链接流行度提高PageRank
建立链接流行度是搜索引擎营销的一个重要方面。尽管认为的提高PageRank不是意见容易的事,但是你通过改善链接流行度就可以不难做到。通过长期不懈的关注建立链接的工作,你就会提高站点的PageRank,大大改善自己的站点排名。
就在不久前,Google及其他搜索引擎配制了某些类似与PageRank的算法成分(如TSPR”Topic Sensitive PageRank”,Hilltop“Links from expert documents”),进一步将决定排名的比重放置在页面以外因素上。
随着页面以外因素在网站排名中受到重视,所以提高加强这些因素的重视就变得越来越重要。当越来越多的网管意识到PageRank及链接流行度的重要性时,就不难在同行业中与其他站点进行链接交换了。
14:23 |固定链接 |SEO
2006/6/27
MSN 机器人开发说明
前段时间研究了一下MSN的交互协议,在此和大家共享一下:
1、连接服务器
现在我们使用的协议是MSN8以后的,以前的版本可以用如下交互方式连接:
Connect: messenger.hotmail.com 1863
用TCP/IP协议,连接messenger.hotmail.com的1863端口,连接上后发送如下字符串命令:
VER 0 MSNP7 MSNP6 MSNP5 MSNP4 CVR0
发送成功后,MSN服务器会返回所支持的协议类型,如:
VER 0 MSNP7 MSNP6 MSNP5 MSNP4 CVR0
然后发送INF命令,从服务器上获取认证信息
INF 1
服务器返回一个MD5加密的信息,用此信息进行登录:NF 1 MD5
然后开始登录:
USR 2 MD5 Iexample@passport.com
服务器返回:
XFR 2 NS 207.46.106.145:1863 0 207.46.104.20:1863
即告诉我们关闭当前连接,连接服务器:207.46.106.145:1863
从MSN8以后,连接从INF那个地方开始就修改了,如果还是发送INF,则我们的连接将立刻被关闭,正确的过程如下:
一开始连接还是连接messenger.hotmail.com 1863
然后发送查询服务器支持什么协议:
VER 0 MSNP10 MSNP9 MSNP8 CVR0
服务器会返回支持的协议:
VER 0 MSNP10 MSNP9 MSNP8 CVR0
发送:
CVR 2 0x0409 win 4.10 i386 MSNMSGR 5.0.0544 MSMSGSexample@passport.com\r\n
接收:
CVR 2 6.0.0602 6.0.0602 1.0.0000http://download.microsoft.com/download/8/a/4/8a42bcae-f533-4468-b871-d2bc8dd32e9e/SETUP9x.EXEhttp://messenger.msn.com\r\n
发送:
USR 3 TWN Iexample@passport.com\r\n
接收:
XFR 3 NS 207.46.106.35:1863 0 207.46.104.20:1863\r\n
连接:207.46.106.35, port 1863
发送:
VER 1 MSNP8 CVR0\r\n
接收:
VER 1 MSNP8 CVR0\r\n
发送:
CVR 2 0x0409 win 4.10 i386 MSNMSGR 5.0.0544 MSMSGSexample@passport.com\r\n
接收:
CVR 2 6.0.0602 6.0.0602 1.0.0000http://download.microsoft.com/download/8/a/4/8a42bcae-f533-4468-b871-d2bc8dd32e9e/SETUP9x.EXEhttp://messenger.msn.com.\r\n
发送:
USR 3 TWN Iexample@passport.com\r\n
接收:
USR 3 TWN S lc=1033,id=507,tw=40,fs=1,ru=http%3A%2F%2Fmessenger%2Emsn%2Ecom,ct=1062764229,kpp=1,kv=5,ver=2.1.0173.1,tpf=43f8a4c8ed940c04e3740be46c4d1619\r\n
发送登陆信息:
USR 4 TWN S t=53*1hAu8ADuD3TEwdXoOMi08sD*2!cMrntTwVMTjoB3p6stWTqzbkKZPVQzA5NOt19SLI60PY!b8K4YhC!Ooo5ug$$&p=5eKBBC!yBH6ex5mftp!a9DrSb0B3hU8aqAWpaPn07iCGBw5akemiWSd7t2ot!okPvIR!Wqk!MKvi1IMpxfhkao9wpxlMWYAZ!DqRfACmyQGG112Bp9xrk04!BVBUa9*H9mJLoWw39m63YQRE1yHnYNv08nyz43D3OnMcaCoeSaEHVM7LpR*LWDme29qq2X3j8N\r\n
返回:
USR 4 OKexample@passport.com example%20friendlyname 1 0\r\n
其中用户的登录验证信息是通过HTTPS协议从https://nexus.passport.com/rdr/pprdr.asp获取到的。
时间关系写的比较粗,待续..............
17:03 |固定链接 |软件技术
2006/6/15
做WEB2.0网站可以参考的十九条规则
一、首先是原创,是内容的提供,让用户成为网站的主人而不是网站的客户;
(一)原创网站:不以复制和粘贴为网站内容的基本获取手段,只在前期和特定栏目及特定时间发布部分内容,但也需依照事前确定的网站规则进行。
(二)资源网站:我们不以服务或者具体产品为主要模式,而是以资源供应商和资源生产组织者(非集成)的身份开展合作、运营相关的推广和收益拓展等,其中内容是资源的一部分。
(三)用户网站:网站的宗旨是办用户自己的网站(非主页)而不是办自己的网站,尽管从法权角度属于开办人的财产,但是具体的应用、功能和服务上要淡化开办人的地位和影响,建立用户平等的网络环境(包括开办人也是用户,后台仅仅是技术控制)。
二、固定某一群体的原创,延伸出门户的概念,并代表着一种特定的视角和视野;
(一)群体:针对人群,根据其特点和需要,安排网站的结构、应用和功能,建立开放性平台以聚集具有这一群体的差异化和多元化特征的人群。
(二)门户:门户这里的意义是覆盖所有的相关人群,根据其不同的特点来定义和丰富门户下的频道、栏目、内容、应用和相关产品和服务的框架(非产品和服务本身)。
(三)媒体:媒体的核心在于视角与视野,打造媒体而不只是XX群的媒体,从媒体本身代表的是一种声音和语言来传播和影响群体参与者。
三、草根参与与具有地位或者社会标签性质的参与如何去进行区别;
(一)草根:草根与非草根的区别在于不同的社会标签产生的权利差别,即资源的分享和享受差异,真正的草根不是从其来源上来区分,而且应该淡化这一色彩,也不是具体某人的,而是草根环境和非标准化的人群。
(二)身份标签:与实名对应的网络标识,我们不是为完成实名任务而是形成实名机制,以此建立网络身份系统和标识,并将其作为独立系统来进行开发作为以后与其他平台互通的技术。
四、互动的实质是交流,而网络作为交流的促进手段还是其中的一项含义,怎么去界定和体现;
(一)互动平台:网络作为技术手段,其物理性质决定了它丰富、迅速和多样的特点,但多元化的网络应用使得网络互动可以作为互动的手段,有可以是其他交流或者行为的辅助。(定位)
(二)网络互动:网络交流是独立的交流方式,存在的价值有其他方式没有的或者根本不可能实现的,这是网站本身应该不断挖掘的地方。(拓展)
(三)交往接口:我们坚持交流是网络交友的前奏,最终也必然与交友联系起来,通过网站持续的交流形成彼此相对稳定的联系,进而促成交往和长久的关联,完善网络交流的机制。(应用)
五、人的社会性与个性之间的需求怎么通过合适的方式来融合而不是冲突或者是相互隔离,又或者是貌似神离;
(一)个性导入:从个人的标志、信息内容、获取和发布方式、以及交流的方式和特性在进行导入,突显个人的偏好和选择,但个性的定位应该是社会性的多样化选择而不是另行一套,平台的中立性质也为个性导入建立积极的环境。
(二)社会输出:以个人的圈子、讨论交流、参与退出等行为为起点,将个性的东西通过群体社会的角度来展示和体现,并将其延展,始终围绕社会的中心来做输出。
六、提供的平台或者技术,又或者是种应用,而这归根结底是满足用户怎样的需要,在之中有那些创新能够引发变革,而又能和具体的商业价值联系起来;
(一)随需应变:根据人群确定平台的定位,根据平台的定位来组织应用,根据人群的需要发展技术应用,根据应用的成熟度来升级平台。
(二)商业原则:做学生资源而不是学生市场,启动资源的是群体而不是开办人,开办人是通过平台建设来吸引资源再将资源包装以各种形式和类型推出去,而针对资源的开发是另一行为。
七、内容的多元化如何满足不同的需求层次,降低书写及查询成本,更好的提供服务;不同人群的需求到底这不同如何是划分去区别;
(一)内容多元:提倡学生在线生活的理念,从起学习、生活、消费、娱乐到就业、培训等全方位的内容信息和在线应用。
(二)全面满足:不同层次的人,不同背景的人我们都需要去满足,首页完成的是共性信息,而内页则是注重个性群体的信息提供。
(三)书写与查询成本:依靠组织而不是个人,依靠机构而不是个体,借鉴现有的资源信息而不是完全独立,增加收入来提高收益,随时随地的方便的接入与服务,个性化的安排与设定、追踪。
八、所谓网站的底层结构是怎么样实现革新的,技术模式与应用模式的价值是什么;
(一)应用说明:所有的都以应用服务为主导,通过能做什么,满足什么,怎么满足和怎么使用来完成网站功能的描述与拓展。
(二)效果追踪:技术在于构建底层,根据实际的应用需要来调整,而用户的需要则转化为具体的应用,实际效果则直接对应用户的需要。
九、“鼠标用户”与“键盘用户”的区别是什么,如何进行上下人群的分析,以此确定服务模式,网站本身到底扮演一个怎样的角色;
(一)参与贡献:贡献可以通过写文章、评论文章,上传资源等方式也可以是点击率、投票率、选择率、推荐率、引用率。
(二)服务模式:线下的载体,包括书面载体、活动载体、人员载体、组织载体、关系载体和实物载体等。
(三)中立价值:网站的中立包括不参与评判、建立规则,引导租组织进而引导和督促个人,彰显平台的价值。
(四)服务连接:根据上行服务人群组织资源的表现形式,根据下行的被服务人群选择具体的应用形式,并将两者有机的联系起来,并不断整合完善。
十、分类广告与C2C到底是应该怎么去理解去实际的操作与应用;
(一)分类广告:分类的价值在于栏目清晰、定义明确、细分得当,通过个人门户以及SNS系统可以将信息的及时性与真实性表述清晰,同时根据分类广告建立用户的激励机制,促进发展。
(二)C2C交易:限定交易买方,建立支付帐户,要求卖方按照交易规则进行,并且将本地化服务从中区分开来,实行另一种服务模式,并通过建立线下服务队伍来促进相关交易,其中分类信息与之有交叉也有不同。
十一、个人门户无论是入口还是接口其真正的意义是什么?点告模式的应用价值如何去看待;
(一)入口问题:定位在个人信息门户的意义在于发布与接受,这里我们定位的重点应该是接口定位而不是入口;
(二)点告模式:通过点击、回复、加入、做答、引用、推荐、收藏、沟通、购买、申购、等方式运作点告模式,并将其作为基础。
十二、如何去贯穿一种集体或者说团队的精神,让网络本身更具有积极意义;如何去引导是培育一种创造和创新的精神,并在一个群体的氛围下实践;将竞争的意识尤其是成就感的培育大于压力本身的实现;
(一)群组管理:个人的约束则通过建立制度,具体通过群组来实现完成,通过同类人群的彼此影响和互动交流来改变个人的行为环境,同时以群组的名义出现,加强其内部的管理,依靠团队的力量来承担任务和责任,培养团队意识。
(二)创新氛围:创新在于自由、自主、团队、感恩的精神,再辅助以外界的期待与支持,在适当的时候社会资源的匹配才能成就创新实践,通过这些要件打造这种氛围。
(三)平台延展:创新不仅仅依靠打造氛围、资源优选,还需要操作平台和凝聚的空间,以平和的心境,竞争的态势去促进发展,促成实践。
十三、将媒体的意义不再停留在主流与非主流的区分上而是不同视角的交流;
(一)媒体特点:媒体以其传播性质涉及到的相对应人群来产生其价值,至少包括三点:传播者、媒介、受众,我们媒体的特点在于传播者确定、媒介特殊、受众固定以及传播者与受众合一。
(二)媒体价值:群体的视角,多重的影响,媒介的多样化,以此形成的聚合力与深度影响力。
十四、一个社会需要制度,需要从底层去思考它的根基及其存续的基础,无论是制约还是激励都有;
(一)网络社会:网络社会是现实社会的多面体,是独立的一部门,也是原有部分的升华或者辅助,也可能是现实社会的翻版,正是这种多面体的特征使得其发展呈现出难以整齐化一的现象,需要区别对待。
(二)网络制度:作为基本的网络行规,结合网络社会的特点,来建立一套基本的规范约束网络社会的主体,从而在自由、分享和交流的主题下实现其应用,满足需要,但这套制度应该以现实社会的原则来进行。
十五、网络的眼球或者说兴奋点从短暂转为持久,从集中转为分散;分享作为交流的表现而更高层次是分享应该是种升华,知识的沉淀;
(一)分散眼球:要全面的满足各类人群的需要,唯一的办法就是分散,在以原创为主题的前提下,将个人人吸引在固定的信息分享或者共享组织里,在从眼球形成的角度寻求共性,做聚合效应。
(二)知识沉淀:键盘用户代表的是参与,而参与留下的是记录,其中可以形成的是知识,要将其个人的参与轨迹保留下来,并加以组织和传播,为其进行回顾,为其他开展分享,以碰撞火花。
十六、相信群众的力量、相信知识的来源、相信更适应的标准在于群众、相信群众的分辨与是非能力;
(一)组织约束:将个人的管理的权利下放给其所在的组织,所以让每个人都参与到各种组织里是前提,通过组织的管理来约束其具体的网络行为,而组织的管理可以是具体的制度也可以是舆论。
(二)评价体系:建立一个标准形成的评价体系,是非善恶美丑都有参与者来评定和认可,相信越多的参与,信息越充分,信息越充分就越准确。
(三)标准建立:建立一套可以执行的网络行走规范,明确各类主体的权利和义务,通过相应的激励机制来完成基本制度的运行,确定网络标准。
十七、低龄化的网民特点;解决信息分散性与爆炸性的途径;宽频与移动如何成为未来的趋势;
(一)低龄问题:低龄问题引发的是网络版本及适度应用的问题,第一强调应用和效果而不是技术;第二要解决好引导的问题;第三要充分挖掘资源,发现现有模式中未来的机会。
(二)信息有效性:有效信息越多越好,有效在于对用户有用,而且是对用户有价值的信息,坚持对用户有用的信息,越多越好,为独家越好,用户找起来越方便越好,读起来越简单越好,最好再有利用工具和办法。
十八、互联网的个人应用与企业应用的区别;如何与整个行业的应用趋势相融合而不是竞争或者冲突;
(一)应用组合:不严格的区分网站是企业应用还是个人应用,只需要一个了连接点,企业应用看的是消费资源,根据这点我们组织好资源,个人应用看重应用需求,我们组织好应用与功能。
(二)适应环境:可以涉猎广泛但不处处受敌,合作与独立虚实之间,平台战略就是不树立,但也面临本身做平台的对手,基本原则是在技术上适应他,在合作运动之间寻找机会,不做技术的前沿,只做应用的先锋。
十九、看到两年到三年的世界而不是五年后的世界;应用本身是独立还是融合,彼此应该有的界限是什么,融合的接线问题;
(一)防止泡末:看好用户当前的应用阶段,从最低级的应用服务开始去做,并且从地域的方式去拓展,再遵循群体特殊性,立足于渐进式的发展,以及规模型的应用,而不是基于未来的假设。
(二)融合底层:应用的独立是其创新的动力之一,融合可以创新但也必然导致限制,会引起连锁性的反映,因此融合底层是基本方向,具体来说,以用户为基础,以其基本的网络元素为根基,不断的应用延展。
如何是去形成一套比较体系的关于web2.0的概念体系;
(一)技术概念
(二)应用概念;
(三)产品服务概念
(四)模式定位概念
14:38 |固定链接 |计算机与 Internet
2006/6/6
MSN Messenger的用户管理
MSN其实有四个列表:
ForwardList,AllowedList,ReverseList,跟BlockedList。 我们平时看到的联系人列表其实只是:ForwardList而已。 当我们看到ForwardList中的联系人上线的时候,MSN服务器便允许我们向这些联系人发送讯息。 我们平时指的MSN150个好友的上限,便是指这个ForwardList只能够有150个联系人了。 ReverseList则是表示将我们加为联系人的MSN用户。 我们添加了某个联系人之后,其实就是将我们添加到了对方的ReverseList当中。我们是无法修改ReverseList这个列表的。这个列表是没有联系人上线的。所以,虽然我们只能够有150人的好友,但是,是可以有无数个人添加我们为好友的。 AllowedList则是表示可以查看我们的状态以及向我们发送讯息的MSN用户列表。这个列表也是没有上限的。 所以,有些人即使不在我们的ForwordList/朋友列表里面,他们还是可以给我们发送讯息。 AllowedList中能够有的又不仅是某个MSN用户,它还可以有“所有其他用户”这个特殊的东西。也就是说,如果我们添加“所有其他用户”的话,所有的MSN在默认情况下都可以向我们发送讯息。他们不需要将我们加为朋友,不需要把我们加入到他们的ForwardList里面。 BlockedList则是保存我们“阻止”的MSN用户列表了。一个用户一但被我们放到
BlockedList里面,他无论如何都是无法查看我们的状态或者是发送讯息了。同样的这个列表也是可以有“所有其他用户”这个特殊的玩意。 --------------------------------------------------------------------------------
早期的MSN,“所有其他用户”是默认在AllowedList里面的,所以,我们只要知道对方的MSN帐号,便可以立即向对方发送讯息,如果对方在线的话。 后来,应该是搞骚扰的人多了,“所有其他用户”默认被放到BlockedList里面了,所以,我们现在一般只能够通过添加对方为自己的联系人才能够与其对话。 一般情况下,我们添加一个联系人的时候,对方会同时进入我们的ForwardList以及AllowedList里面。 但是,我们删除已有的联系人,却只是将其从我们的ForwardList里面删除,对方的帐号还是会在我们的AllowedList里面,对方还是可以看到我们的帐号状态,以及跟我们说话。 除非,我们在删除的时候,同时阻止了对方,也就是说,将对方加入到我们的BlockedList里面。 这便出现了一个问题……AllowedList似乎会是永远增长的。MSN Messenger并没有提供任何手段让我们修改这个List。只要是在这里面出现过的帐号,要么就永远在AllowedList里面,要么就会被扔到BlockedList里面。 BlockedList里面名单也是没有办法消除了。 我是说,只要我们曾经添加过某个联系人。那么他的帐号便似乎永远都会在这四个列表里面。 很奇怪很奇怪。 --------------------------------------------------------------------------------
事实上,还是可以直接修改这ForwardList/AllowedList/BlockedList三个列表中的名单的。只是,我们无法直接通过MSN Messenger来做这个操作而已;至少,MSN Messenger 6.2不行。 微软似乎也从来没有想要让普通用户知道ReverseList/AllowedList/BlockedList这三个列表的存在。 还有其他一些奇妙的事情。 如果A在B的ForwardList里面,也就是说A是B的联系人、是B的朋友、B想要跟A说话。 但是B并不在A的AllowedList里面。那么B是无法即时查看A的状态的。 如果“所有其他用户”是在A的AllowedList里面的话,那么,B是可以直接跟A说话的。 也就是说,可以出现跟“不在线”的MSN联系人对话的情况。 呼呼……刚刚忘了截屏了,真是遗憾。 --------------------------------------------------------------------------------
我再继续说清楚一些…… 其实,所谓的“所有其他用户”并不是一个特殊的MSN用户,而是一个MSN隐私设定而已。 所谓的AllowedList,虽然决定了我们ReverseList中的人是否能够查看我们的状态以及向我们发送讯息;但是,它其实只是决定他们能否查看我们的状态而已。 别人不是不能够向我们发送讯息,而是如果他们不在我们AllowedList里面的话,他们不能够确定我们是否在线,既然他们不知道我们是否在线,他们便不能够通过普通的方式向我们发送讯息了。 同样的,如果他们不在我们的AllowedList跟ForwardList里面,我们也是没法通过普通方式跟对方发送讯息。 并且,在这样的情况下,别人要给我们发送讯息,要比我们给他们发送讯息简单。 是的,没有错。前者比后者简单。至于简单、复杂在哪些地方,偶这里就先不说了;因为,我自己也不是很确定。 否则,我们便可以通过无限制的AllowedList跟ReversedList来突破ForwardList的150个人的限制了。 很奇妙的……MSN背后的协议是很复杂的……且不论它的技术实现,光这四个List的设定便是很耐人寻味了…… --------------------------------------------------------------------------------
仔细想想,微软搞这么四个List,是有它的道理的……奇妙的MSN…… 呼呼……也许,我有心情的话,会继续写blog来说“风中之猪”以及DotMSN的使用。 到目前为止,似乎国内还是没有人介绍如何调用DotMSN。国外的,我没有Google。 不知道QQ、ICQ等又是怎么处理用户列表的……