Welcome to MSDN Blogs Sign in | Join | Help

Technical Account Manager

很多人,包括很多微软的同事,都不知道Technical Account ManagerTAM)是具体干什么的。有时候只好简单地解释:售后的技术服务。这个解释能给别人一些印象,但具体的呢,我们来看看。

 

官方对于TAM工作的解释是:

 

The job holder is responsible for delivering professional technical consulting, supporting and trouble-shooting to Microsoft’s premier customers, achieving high availability, reliability and manageability on customer critical information system, satisfying user experience on Microsoft platform.

 

TAM的工作就是帮助使用微软产品的高级客户解决困难,提供技术顾问,解决具体问题,让客户更好地使用微软的产品。

 

或者更具体地说,TAM的工作就是为了客户更好地使用微软的产品,提供售后的基本全部技术服务(有些产品技术因为种种限制,可能无法提供),有时也会提供一些售前的支持。当然,TAM不是超人,什么都能做。但TAM背后,有全球技术中心几百位技术专家,以及各个身怀绝技的现场工程师,还有微软内部所有技术力量的支持。

 

所以,实际上TAM可以被称为“大客户经理”,只是,这个客户经理负责的是技术服务方面的事务,而不是软件销售方面的业务。

 

顺带贴个广告,对于有兴趣加入TAM这一队伍,服务于广大企业级客户的同志,这个职务的需求是:

 

l  Strong technical background on IT system design, deployment, trouble-shooting, performance tuning etc.

l  Be familiar with Microsoft Back-office products, e.g. Windows Server, Exchange server, SQL server etc. and master at least one server relevant knowledge in depth.

l  Good interpersonal/communication/presentation skill. Prior experience communicating with customers with good problem solving ability to work in a team environment.

l  Quick learner, love challenges under pressure.

l  Fluent in both oral and written English.

l  MCSE or MCSD or MCDBA will be preferred.

l  University degree in Computer Science or Electronic Engineering or equivalent experience.

 

其实简单地说,需求就是:

 

l  为人踏实,待人接物诚恳大方。对于TAM,技术是很重要的一个方面,但不是唯一的方面。TAM是第一线直接和企业客户打交道的,所以为人处事的方式也是非常重要的。

l  很好的交流能力,包括口头,书面和演讲等。

l  技术方面,精通微软的平台,不管是运维,例如ADExchange,或是开发,例如.NET,皆可。最好有一技之长。

l  肯学习,能学习。没有人什么都懂,不懂没有关系,但要能快速学习。微软的风格就是把你直接放在枪口前,自己去快速学习吧,没有时间,也没有人会来慢慢培训你。内部的资料到处都是,能不能快速学会,成为专家,就是你的能力了。

 

有意者,可以直接联系我。

Posted by oliverlu | 1 Comments
Filed under:

拿到PMP证书了

其实好几年前就想考了,但一直拖拖拉拉的,同时也是因为没有实际的需求。但换了工作以后,确实觉得PMP的证书对自己是有用的,当然更重要的是学会PMP中的理念和方法,而且大老板也强制大家一定要通过。所以还是一鼓作气考了出来。

 

要通过PMP考试,还是要多做题,扭转过来一直以来的传统观念的。毕竟这些观念都是老美的观念,和我们平时的做事方式都是相悖的。但其中很多系统的方法,对于真正管理起项目来,还是很有用的。

 

拿到了证书,好像没有什么感觉。还是努力在平时的工作中,使用PMP的理念和方法吧。

Posted by oliverlu | 0 Comments
Filed under:

Click Once

Click OnceVisual Studio 2005中,专门用于部署/更新Windows程序的一项新技术。简单的说,原理就是:

 

Visual Studio 2005中,可以把写好的程序发布到FTP,文件共享或者网页上,用户点击安装,就可以直接把程序安装上。相比较传统的安装模式,其中的区别是:

 

·         文件并不是被安装到\Program Files目录下面,而是被拷贝到了每个用户的配置文件中,也就是\ Documents and Settings\<username>目录下面去了,所以对于一台机器上的每一个用户,都需要安装一次。

·         安装的时候,不需要管理员的权限,普通用户就可以安装。

 

以后对程序作了改动,可以重新发布。客户端会自动检查程序的更新,并且来更新程序。可以指定更新的策略,例如程序启动的时候检查更新,或是程序运行的时候再检查。

 

这项技术还是挺吸引人的。但也有一些限制,例如:

 

·         只能更新Windows程序,对于服务就不能更新了

·         只能更新托管代码编写的程序

 

如果对Click Once感兴趣,也可以看看下面的资料:

 

ClickOnce Deployment for Windows Forms Applications  

http://msdn2.microsoft.com/en-us/library/wh45kb66(VS.80).aspx

Posted by oliverlu | 3 Comments
Filed under:

Code Snippets

以前有人说:“天下程序一大抄”。绝对了一些,但有一点道理。有一些常用的功能,我们往往会去网上找一些示例程序,直接拿来用。有时候想想,如果在Visual Studio里面敲入“打开我的文件夹中的文件”,或者类似“从剪贴版中获取图片”,Visual Studio能够聪明地把代码自动生成,那是一件多么美好的事情。

 

Code Snippets”就是实现这种需求的一个功能。Code Snippets就是一些代码片断,也就是一些常用功能的代码。在安装了Code Snippets以后,在Visual Studio里面先按Ctrl+K,然后再按Ctrl+X,就可以选择需要的代码片断了。很酷,也很强大,快去试试。

 

Visual Studio 2005 Code Snippets下载的地址为:

http://msdn.microsoft.com/vstudio/downloads/codesnippets/default.aspx

 

如果要补习Code Snippets,可以看看下面的信息:

 

Code Snippets (C#)

http://msdn2.microsoft.com/en-us/library/f7d3wz0k(VS.80).aspx

 

How to: Use Code Snippets (C#)  

http://msdn2.microsoft.com/en-us/library/z4c5cc9b(VS.80).aspx

Posted by oliverlu | 0 Comments
Filed under:

MSDN杂志中的资源

今天在察看一些新的东东时,发现MSDN杂志中的一些栏目的RSS。相信很多人都已经知道了,但觉得这些资料对于学习.NET 2.0等一些新技术还是非常有帮助的,所以选了一些贴在下面:

 

Advanced Basic

http://msdn.microsoft.com/msdnmag/rss/rss.aspx?Sub=Advanced%20Basics

 

CLR Inside Out

http://msdn.microsoft.com/msdnmag/rss/rss.aspx?Sub=CLR%20Inside%20Out

 

Cutting Edge

http://msdn.microsoft.com/msdnmag/rss/rss.aspx?Sub=Cutting%20Edge

 

Data Point

http://msdn.microsoft.com/msdnmag/rss/rss.aspx?Sub=Data%20Points

 

另,.Net太广博了,只能学到皮毛了。欢迎大家一起来讨论,共享学习的心得。

Posted by oliverlu | 0 Comments

建议使用LCS2005

LCS也就是Live Communications Server,简单地说,就是一个企业内部的MSN

 

微软原来推两套IM工具外部的MSN和内部的Windows MessengerWindows Messenger的开发速度,总是比MSN慢一个版本,后来内部都很少使用Windows Messenger了。但在LCS2005和客户端Office Communicator 2005推出来以后,大家的感受是这个东西非常cool,也非常好用。

 

简单地说,MSN提供的功能,Communicator基本都能提供,而且,Communicator可以直接打电话给其他用户--可以拨别人的计算机,也可以从AD用户信息中直接得到电话号码,拨别人的电话分机。Communicator可以和外部的MSNYahooAOL(这个好像美国以外的用户很少)直接通讯。而且,Communicator可以和SPSOffice 2003直接整合起来。同时,使用Communicator来共享文件时,速度飞快,感觉比直接的文件共享还要快。

 

Communicator还会对通讯加密,这更适合企业内部使用。对于信息部门来说,LCS还有一个很大的好处就是,投入不大,但产生的效果非常好。像AD,邮件服务器这些基础设施,投入很大,但领导很难看到效果。但LCS,一下子就给人很深的印象。^_^

 

现在有些不足的,就是不能自动保存谈话记录,不过可以在服务器上统一保存。同时,也不提供离线留言的功能。

 

 

因为换了一个部门,这一阵子也一直没有更新这个Blog。作为一名顾问,现在看问题的角度可能不再是纯技术的,以后在这个Blog上可能也会有所体现。同时,中国大陆的用户,特别是北方区的用户,如果对微软的服务感兴趣,可以随时联系我Lu.Ming@microsoft.com . :-)

Posted by oliverlu | 0 Comments

一个SPS2003应用的例子

SPS2003中的个人网站是可以被备份和恢复的。这样在我们把个人网站恢复到其他服务器上以后,文档等数据不会丢失。

但个人网站上的连接,以及订阅,却是没有办法保留的。如果是把个人网站搬到新的服务器上也就算了,但在下面这种情况下,可能会觉得有些冤:

我们在一台SPS服务器上建立了个人网站,然后又打开了“共享服务”,把个人网站放到另一台服务器上。此时,会发现所有的个人网站都被重建了,连结和订阅也都丢失!

这种情况下,我们可以尝试下面的代码。下面的代码仅供参考,有何建议可以随时给我发信。当然,请使用英文,此Blog的email不支持中文。

应用程序源代码:

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Portal;
using Microsoft.SharePoint.Portal.Topology;
using Microsoft.SharePoint.Portal.UserProfiles;
using Microsoft.SharePoint.Portal.Alerts;

using System.Runtime.Serialization.Formatters.Soap;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace mysiteinfo
{
/// <summary>
/// Summary description for Form1.
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.Button button1;
private System.Windows.Forms.TextBox origportal;
private System.Windows.Forms.TextBox newportal;
private System.Windows.Forms.TextBox domaintext;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.Button button2;
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;

public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();

//
// TODO: Add any constructor code after InitializeComponent call
//
}

/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.origportal = new System.Windows.Forms.TextBox();
this.newportal = new System.Windows.Forms.TextBox();
this.domaintext = new System.Windows.Forms.TextBox();
this.label1 = new System.Windows.Forms.Label();
this.label3 = new System.Windows.Forms.Label();
this.label4 = new System.Windows.Forms.Label();
this.button2 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// button1
//
this.button1.Location = new System.Drawing.Point(32, 200);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(88, 40);
this.button1.TabIndex = 0;
this.button1.Text = "Save";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// origportal
//
this.origportal.Location = new System.Drawing.Point(64, 104);
this.origportal.Name = "origportal";
this.origportal.Size = new System.Drawing.Size(168, 20);
this.origportal.TabIndex = 2;
this.origportal.Text = "http://servername/";
//
// newportal
//
this.newportal.Location = new System.Drawing.Point(64, 152);
this.newportal.Name = "newportal";
this.newportal.Size = new System.Drawing.Size(168, 20);
this.newportal.TabIndex = 3;
this.newportal.Text = "http://servername:90/";
//
// domaintext
//
this.domaintext.Location = new System.Drawing.Point(64, 24);
this.domaintext.Name = "domaintext";
this.domaintext.Size = new System.Drawing.Size(72, 20);
this.domaintext.TabIndex = 4;
this.domaintext.Text = "domainname";
//
// label1
//
this.label1.Location = new System.Drawing.Point(8, 24);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(48, 23);
this.label1.TabIndex = 6;
this.label1.Text = "domain";
//
// label3
//
this.label3.Location = new System.Drawing.Point(8, 104);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(56, 32);
this.label3.TabIndex = 8;
this.label3.Text = "Original Portal";
//
// label4
//
this.label4.Location = new System.Drawing.Point(8, 152);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(56, 24);
this.label4.TabIndex = 9;
this.label4.Text = "New Portal";
//
// button2
//
this.button2.Location = new System.Drawing.Point(136, 200);
this.button2.Name = "button2";
this.button2.Size = new System.Drawing.Size(88, 40);
this.button2.TabIndex = 10;
this.button2.Text = "Add";
this.button2.Click += new System.EventHandler(this.button2_Click);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(292, 273);
this.Controls.Add(this.button2);
this.Controls.Add(this.label4);
this.Controls.Add(this.label3);
this.Controls.Add(this.label1);
this.Controls.Add(this.domaintext);
this.Controls.Add(this.newportal);
this.Controls.Add(this.origportal);
this.Controls.Add(this.button1);
this.Name = "Form1";
this.Text = "MySiteInfo";
this.ResumeLayout(false);

}
#endregion

/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}

private void button1_Click(object sender, System.EventArgs e)
{
string origstrUrl = origportal.Text;
TopologyManager tm = new TopologyManager();
PortalSite ps = tm.PortalSites[new Uri(origstrUrl)];
PortalContext pc = PortalApplication.GetContext(ps);
AlertManager am = new AlertManager(pc);
UserProfileManager upm = new UserProfileManager(pc);

IEnumerator itr=upm.GetEnumerator();
Stream file=File.Create("c:\\atest.xml");
SoapFormatter serializer = new SoapFormatter();
Hashtable aTable=new Hashtable();
while(itr.MoveNext())
{
UserProfile u=((UserProfile)itr.Current);
QuickLinkManager qlm = u.QuickLinks;
AlertCollection ac = u.Alerts;
LoadEntry aEntry=new LoadEntry();
string name=u.PersonalSite.Owner.LoginName;
saveUserProfile(u,aEntry);
aTable.Add(name,aEntry);
}
serializer.Serialize(file,aTable);
file.Close();
}
private void saveUserProfile(UserProfile aUserProfile,LoadEntry aEntry)
{
UserProfile u = aUserProfile;
QuickLinkManager qlm = u.QuickLinks;
AlertCollection ac = u.Alerts;

foreach (QuickLink ql in qlm)
{
LoadQLinks myqlinkload = new LoadQLinks();
myqlinkload.Title = ql.Title.ToString();
myqlinkload.URL = ql.URL.ToString();
myqlinkload.Group = ql.Group.ToString();
if(aEntry.Links==null)aEntry.Links=new ArrayList();
aEntry.Links.Add(myqlinkload);
}
foreach(Alert a in ac)
{
LoadAlert myalertload = new LoadAlert();
myalertload.TypeId = a.Type.TypeId.ToString();
myalertload.Name = a.Name.ToString();
myalertload.ObjectDisplayName = a.ObjectDisplayName.ToString();
myalertload.ObjectUrl = a.ObjectUrl.ToString();
myalertload.ConditionText = a.ConditionText.ToString();
myalertload.Query = a.Query.ToString();
if(aEntry.Alerts==null)aEntry.Alerts=new ArrayList();
aEntry.Alerts.Add(myalertload);
}
}

private void button2_Click(object sender, System.EventArgs e)
{

TopologyManager tm = new TopologyManager();

string newstrUrl = newportal.Text;
PortalSite newps = tm.PortalSites[new Uri(newstrUrl)];
PortalContext newpc = PortalApplication.GetContext(newps);
UserProfileManager newupm = new UserProfileManager(newpc);
Stream file=File.OpenRead("c:\\atest.xml");

SoapFormatter deserializer=new SoapFormatter();
try
{
Hashtable aTable=(Hashtable)deserializer.Deserialize(file);
IEnumerator itr=aTable.Keys.GetEnumerator();
while(itr.MoveNext())
{
string sAccount = (string)itr.Current;
if (!newupm.UserExists(sAccount))
newupm.CreateUserProfile(sAccount);
UserProfile newu = newupm.GetUserProfile(sAccount);
LoadEntry aEntry=(LoadEntry)aTable[sAccount];
ReLoadUesrProfile(newu,aEntry);
}
}
catch
{
}
}
public void ReLoadUesrProfile(UserProfile newu,LoadEntry aEntry)
{
SoapFormatter deserializer = new SoapFormatter();


QuickLinkManager newqlm = newu.QuickLinks;
AlertCollection newac = newu.Alerts;


LoadQLinks myqlinkload = new LoadQLinks();
LoadAlert myalertload = new LoadAlert();
for(int i=0;i<aEntry.Links.Count;i++)
{
myqlinkload = (LoadQLinks)aEntry.Links[i];
newqlm.Add(myqlinkload.Title.ToString(), myqlinkload.URL.ToString(), myqlinkload.Group.ToString(), true);
}
for(int i=0;i<aEntry.Alerts.Count;i++)
{
myalertload = (LoadAlert)aEntry.Alerts[i];
Alert newalert;
switch(myalertload.TypeId.ToLower())
{
case "list":
newalert = newac.CreateAlert("Microsoft.SharePoint.Portal.Alerts.Types.ListAlertType");
FillAlertProp(myalertload,newalert);
break;
case "search":
newalert = newac.CreateAlert("Microsoft.SharePoint.Portal.Alerts.Types.SearchAlertType");
FillAlertProp(myalertload,newalert);
break;
case "area":
newalert = newac.CreateAlert("Microsoft.SharePoint.Portal.Alerts.Types.AreaAlertType");
FillAlertProp(myalertload,newalert);
break;
case "document":
newalert = newac.CreateAlert("Microsoft.SharePoint.Portal.Alerts.Types.DocumentAlertType");
FillAlertProp(myalertload,newalert);
break;
case "listing":
newalert = newac.CreateAlert("Microsoft.SharePoint.Portal.Alerts.Types.ListingAlertType");
FillAlertProp(myalertload,newalert);
break;
case "alistitem":
newalert = newac.CreateAlert("Microsoft.SharePoint.Portal.Alerts.Types.ListitemAlertType");
FillAlertProp(myalertload,newalert);
break;
case "person":
newalert = newac.CreateAlert("Microsoft.SharePoint.Portal.Alerts.Types.PersonAlertType");
FillAlertProp(myalertload,newalert);
break;
case "siteregistry":
newalert = newac.CreateAlert("Microsoft.SharePoint.Portal.Alerts.Types.SiteRegistryAlertType");
FillAlertProp(myalertload,newalert);
break;
default:
break;
}
}
}
public void FillAlertProp(LoadAlert myalertload,Alert newalert)
{
newalert.Name = myalertload.Name.ToString();
newalert.ObjectDisplayName = myalertload.ObjectDisplayName.ToString();
newalert.ObjectUrl = myalertload.ObjectUrl.ToString();
newalert.ConditionText = myalertload.ConditionText.ToString();
newalert.Query = myalertload.Query.ToString();
newalert.DeliveryChannels.Add(new PortalChannelSettings());
newalert.Commit();
newalert.Activate ();
}
}
}


调用的类的源代码:

using System;
using Microsoft.SharePoint.Portal.Alerts;
using Microsoft.SharePoint.Portal;
using System.Collections;

namespace mysiteinfo
{
/// <summary>
/// Summary description for Load.
/// </summary>
[Serializable]
public class LoadQLinks
{

public string Title;
public string URL;
public string Group;
}

[Serializable]
public class LoadAlert
{
public string TypeId;
public string Name;
public string ObjectDisplayName;
public string ObjectUrl;
public string ConditionText;
public string Query;
}
[Serializable]
public class LoadEntry
{
public ArrayList Links;
public ArrayList Alerts;
}
}
 

Posted by oliverlu | 0 Comments
Filed under:

人格测试

很多人对这个评测的结果还是肯定的。所以,有兴趣的话可以试一下。

http://www.chinahrd.net/renliziyuan_yjh/qu_MBTI.asp


我的测试结果是:


您的人格类型是: ISFJ(内向,感觉,情感,判断)

您的工作中的优势:
  ◆ 能够很好地集中精力,关注焦点
  ◆ 很强的工作伦理,工作努力而且很负责任
  ◆ 良好的协作技巧,能和别人建立和谐友好的关系
  ◆ 讲求实效的工作态度,办事方法切实可行
  ◆ 十分关注细节,能够准确把握事实
  ◆ 乐于助人,给同事和下属职员的工作提供支持和帮助
  ◆ 了解公司(或者组织)的经历,能够很好地维护公司的传统
  ◆ 杰出的组织才能
  ◆ 愿意在传统的机构中工作,而且兢兢业业,不遗余力
  ◆ 能够连续工作,对于相同的工作不会感到厌倦
  ◆ 非常强的责任意识,别人可以信赖
  ◆ 喜欢运用固定的办事程序,尊重别人的地位和能力
  ◆ 通情达理,视角现实

您工作中可能存在的不足:
  ◆ 可能会低估自己的能力,难于坚持维护自己的需要和利益
  ◆ 不愿意尝试新的和未经考验的观点和想法
  ◆ 对反对意见过于敏感,在紧张的环境中容易感到压抑
  ◆ 可能只关注眼前的细节,而对整体和未来不太重视
  ◆ 倾向于同时投入到过多的工作任务中去
  ◆ 难以适应新的情况,或者在不同工作任务中间来回切换时有困难
  ◆ 易于被需要同时解决太多的任务或者项目时会弄得无所适从
  ◆ 如果自己得不到充分的重视和赞赏,可能会感到灰心丧气
  ◆ 一旦做出决定,就不愿意从头考虑同一个问题

只是,其实对自己大致已经了解了。所以,看到结果,也不会有很大的惊奇。

Posted by oliverlu | 2 Comments
Filed under:

Windows SharePoint Services 中文网站模板

新鲜出炉的12款WSS的中文网站模板,貌似很有中国特色。^_^大家可以下载来试试看。

具体地址为:
http://office.microsoft.com/zh-cn/assistance/HA011929182052.aspx

 

Posted by oliverlu | 2 Comments
Filed under:

怎样修改SPS2003中的Alert邮件格式

一个老问题,看到网上有链接,添加到这里来:

Managing Alerts
http://www.microsoft.com/resources/documentation/wss/2/all/adminguide/en-us/stsf13.mspx


这篇文章中提到的是WSS,对于SPS2003,XSL文件存放的文件夹稍有不同,具体是:

\Program Files\SharePoint Portal Server\DATA\Alerts\<LCID>

还有,发现了网上的WSS管理员手册,以后也可以不用下载了:

Administrator's Guide for Windows SharePoint Services
http://www.microsoft.com/resources/documentation/wss/2/all/adminguide/en-us/default.mspx

Posted by oliverlu | 1 Comments
Filed under:

Windows SharePoint Service的Service Pack 2推出来了

具体的下载地址为:

Windows SharePoint Services Service Pack 2
http://www.microsoft.com/downloads/details.aspx?FamilyID=9c552114-dc9a-43ee-9281-b080b7c280b4&DisplayLang=en


至于具体在Windows SharePoint Services Service Pack 2中有哪些改进,可以看看下面的文章:

Description of Windows SharePoint Services Service Pack 2
http://support.microsoft.com/kb/887624


还有在Windows SharePoint Services Service Pack 2中修复的问题列表:

Issues that are fixed in Windows SharePoint Services by Windows SharePoint Services Service Pack 2
http://support.microsoft.com/?id=906336

Posted by oliverlu | 3 Comments
Filed under:

SPS2003的两个新的资源

SharePoint Portal Server 2003 Word Breaker Update
http://www.microsoft.com/downloads/details.aspx?FamilyId=A0CCCB0D-D8A3-4EFA-81AE-C666E50707A1&displaylang=en


SPS2003的一个重要功能就是搜索,而搜索面临的一个问题就是“断词”。如果所有的语言都象英语一样,每个单词之间都有空格,那么这个问题也就不存在了。但是很多语言,就像中文一样,当中都是没有空格的,所以“断词”是很重要的。

SPS2003本身支持对很多语言的断词功能,例如中文,法文……同样,产品组也发布了上面的一个更新,主要包括的语言有:

Czech            捷克语
Danish           丹麦语
Greek            希腊语
Hebrew          希伯来语
Hungarian       匈牙利语
Norwegian      挪威语
Portuguese     葡萄牙语



Microsoft Office SharePoint Portal Server 2003 Discovery Kit
http://www.microsoft.com/downloads/details.aspx?FamilyID=03607516-cbec-4724-b4a4-aa7f09304ba5&displaylang=en


这是一个非常不错的更新,里面包含了好几个指导性的实验手册,可以跟着一步步来尝试。同时,对于其中用到的例子,还列出了具体的代码。共同学习,回头有心得的话再和大家一起共享。

Posted by oliverlu | 0 Comments
Filed under:

乱弹@2005/7/18

学习ASP.NET 2.0

ASP.NET 2.0 Beta 2已经推出来一段时间了。至于学习的资料,建议看看下面的一份:

http://beta.asp.net/guidedtour/


还有另外的一个站点:

http://msdn.microsoft.com/asp.net/beta2/default.aspx


祝大家学习ASP.NET 2.0快乐!


SharePoint Utility Suite v2

http://www.microsoft.com/sharepoint/downloads/components/detail.asp?a=724


SharePoint Utility Suite的更新版本,更新和添加了一些内容。值得好好学习一下。

Posted by oliverlu | 0 Comments
More Posts Next page »
 
Page view tracker