April 2008 - Posts
【原文地址】April 28th Links: ASP.NET, ASP.NET AJAX, ASP.NET MVC, Silverlight
【原文发表日期】 Monday, April 28, 2008 10:35 PM
这是我的链接系列的最新篇。也请参阅我的ASP.NET 技巧,诀窍和教程网页和Silverlight教程网页里(中文版)我以前写的众多很受欢迎的文章的链接。
ASP.NET
ASP.NET AJAX
ASP.NET MVC
Silverlight
希望本文对你有所帮助,
Scott
【原文地址】
Silverlight FlickR Example 【原文发表日期】
25 April 08 11:23 在这个示例中,我将示范在Silverlight客户端通过一个非常简单的调用去访问FlickR的REST API。最终我们将得到一个应用程序,它看上去是这样的:
第一部分,定义部分Silverlight用户界面
第二部分,展示对本机的“打开文件”对话框的支持
第三部分,调用FlickR的服务并找到图片
第四部分,使用隔离存储(IsolatedStorage)在多次运行中保持某些本地设置的值
第五部分,为用户界面添加皮肤
同时欢迎你们获取完整的例子和示例文件。
第一部分,定义部分Silverlight用户界面
开始部分的创建,你可以回头看看我的这篇帖子End to End Silverlight Application post。在Blend里添加一个TextBox和一个Button到窗口中,并如下图所示摆放。
确认你在属性窗口中为它们取了有意义的名称,以便稍后我们以编程的方式访问它们。我给它们起的名字是searchTermTextBox和button。
把一张图片拖入窗口中,我们就有了操作的对象了。(你可以使用SilverlightFlickRDemoFiles压缩包中的cow.jpg)
确认你也为这张图片命名了……我起的名字是searchResultsImage
第二部分,本机的“打开文件”对话框
为了测试一下我们的排版,让我们添加一项功能,弹出“打开文件”的对话框并让它操作客户端的图片。这一点如今你已经可以通过Ajax\HTML轻易地实现。
在page.xaml中,添加一个Click事件处理器
<Button x:Name="button" Width="100" Height="50"
Content="Go"
Click="button_Click"
在page.xaml.cs文件中,实现这个按钮的click事件,调用“打开文件”的对话框。
private void button_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "JPEG Files (*.jpg;*.jpeg)|*.jpg;*.jpeg | All Files (*.*)|*.*";
ofd.FilterIndex = 1;
if (ofd.ShowDialog() == DialogResult.OK) {
Stream stream = ofd.SelectedFile.OpenRead();
BitmapImage bi = new BitmapImage();
bi.SetSource(stream);
searchResultsImage.Source = bi;
stream.Close();
}
}
这段代码会打开系统的“打开文件”对话框,允许用户选择某个磁盘上的文件。开发者只具有保存这个文件的权限(仅指保存到应用程序中,而非文件的实际路径)。注意我们是如何操作这张客户端图片的。
现在你可以上传一个文件到服务器,或者使用Isolated Storage将它存到本地。不过这已经有些超出了这个示例的范围了,我们要做的仅仅是在flickr中查找一张图片……
第三部分,调用FlickR的服务并找到图片
重头戏现在开始了。我们需要将查询关键字发送到FlickR REST API,并显示查询结果的图片。当用户点击图片时,我们能够显示出结果中的下一张图片。
首先我们需要调用FlickR REST API。为此你需要一个键值(key),你可以免费从FlickR获得……
接着我们要在Silverlight客户端调用这个REST API,让我们定义一个helper方法来完成它。
void LoadPhotos(string topic)
{
string apiKey = "<<get your own >>";
string secret = "<<get your own >>";
string url = String.Format("http://api.flickr.com/services/rest/?method=flickr.photos.search&api_key={1}&text={0}",
topic, apiKey, secret);
WebClient flickRService = new WebClient();
flickRService.DownloadStringCompleted += new DownloadStringCompletedEventHandler(flickRService_DownloadStringCompleted);
flickRService.DownloadStringAsync(new Uri(url));
searchTermTextBox.Text = "Calling FlickR...";
}
接下来我们要解析查询结果,你可以查看http://flickr.com/services/api/explore/以了解结果的格式。基本上,结果看上去类似这样:
<?xml version="1.0" encoding="utf-8" ?>
<rsp stat="ok">
<photos page="1" pages="32769" perpage="100" total="3276843">
<photo id="2436622217" owner="22956152@N04" secret="6c8293bb5c" server="2070" farm="3" title="IMG_3492_resize" ispublic="1" isfriend="0" isfamily="0" />
<photo id="2437437876" owner="41848473@N00" secret="97a7e1a066" server="2303" farm="3" title="Eric & Dog" ispublic="1" isfriend="0" isfamily="0" />
</photos>
</rsp>
为此,我们需要做一些Xml解析的工作。所幸有LinqToXml的支持,在Silverlight中实现这一点非常简单,只需添加一个对System.Xml.linq.dll程序集的引用。
现在让我们实现flickRService_DownloadStringCompleted方法。我们首先要做的是一些错误检查……这能够极大地帮助我们确认对FlickR的所有调用都是正确的。
XDocument xmlPhotos = XDocument.Parse(e.Result);
if (e.Error != null ||
xmlPhotos.Element("rsp").Attribute("stat").Value == "fail"){
string results = e.Result;
searchTermTextBox.Text= "Error! (" + results + ")";
return;
}
else {
searchTermTextBox.Text = "It worked!";
}
现在我们只需要调用LoadPhotos方法。
private void button_Click(object sender, RoutedEventArgs e)
{
LoadPhotos(searchTermTextBox.Text);
}
运行应用,如果你看到的是这样的信息,请回头检查一下你的API键值。
如果看到这个,说明一切顺利,已经准备好进入下一步了。
现在,我们需要解析这个Xml结果集,并取出图片的URL。我们将使用Linq的强大功能处理所有这些丑陋的Xml解析工作。所有要做的就是定义一个.NET类,将XML元素映射到它。
public class FlickRPhoto
{
public string Id { get; set; }
public string Owner { get; set; }
public string Secret { get; set; }
public string Server { get; set; }
public string Farm { get; set; }
public string Title { get; set; }
}
随后,让我们为这个类添加一个属性,它将遵守FlickR的URL规则以建立图片对应的URL
public string ImageUrl
{
get
{
return string.Format("http://farm{0}.static.flickr.com/{1}/{2}_{3}.jpg",
Farm,Server,Id,Secret);
}
}
现在,我们需要一段Linq代码将Xml元素映射到这个类。
Photos = from photo in xmlPhotos.Element("rsp").Element("photos").Descendants().ToList()
select new FlickRPhoto
{
Id = (string)photo.Attribute("id"),
Owner = (string)photo.Attribute("owner"),
Secret = (string)photo.Attribute("secret"),
Server = (string)photo.Attribute("server"),
Farm = (string)photo.Attribute("farm"),
Title = (string)photo.Attribute("title"),
};
让我们定义一个类字段Photos,以便稍后访问它。
IEnumerable<FlickRPhoto> Photos;
现在我们要做的只是显示图片,只需从返回的结果集中选取第一条数据并显示它!
FlickRPhoto p = Photos.First();
this.searchResultsImage.SetValue(Image.SourceProperty, p.ImageUrl);
searchTermTextBox.Text = p.Title;
这很棒,但我还想看其它的图片……一个简单的方式是在点击图片时改变它的内容。为此定义一个事件处理器
<Image MouseLeftButtonDown="searchResultsImage_MouseLeftButtonDown"
x:Name="searchResultsImage"
然后实现它。我在开头部分做了些错误检查,并用一个叫做ImageNumber的类字段来跟踪当然显示的是哪一张图片。
private void searchResultsImage_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (Photos == null) return;
if (ImageNumber >= Photos.Count()) ImageNumber = 0;
FlickRPhoto p = Photos.Skip(ImageNumber).First();
this.searchResultsImage.SetValue(Image.SourceProperty, p.ImageUrl);
ImageNumber++;
}
现在当你点击图片时,它就会在结果集中循环显示所有图片。
第四部分,使用隔离存储(IsolatedStorage)在多次运行中保持部分本地设置的值
现在,让我们尝试在多次运行时保持部分状态的值。
首先,让我们在“Go”按钮被按下时,记录下textbox的结果。
private void button_Click(object sender, RoutedEventArgs e)
{
LoadPhotos(searchTermTextBox.Text);
ApplicationSettings.Default["searchTerm"] = txtBox.Text;
ApplicationSettings.Default.Save();
}
在图片改变时,也是依样画葫芦
private void searchResultsImage_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (Photos == null) return;
if (ImageNumber >= Photos.Count()) ImageNumber = 0;
FlickRPhoto p = Photos.Skip(ImageNumber).First();
this.searchResultsImage.SetValue(Image.SourceProperty, p.ImageUrl);
searchTermTextBox.Text = p.Title;
ApplicationSettings.Default["imageNumber"] = ImageNumber;
ApplicationSettings.Default.Save();
ImageNumber++;
}
随后在应用再次启动时,我们就可以找到最近一次的状态值,并用它初始化应用。
public Page() {
InitializeComponent();
if (ApplicationSettings.Default.Contains("searchTerm")){
this.txtBox.Text = (string)ApplicationSettings.Default["searchTerm"];
button_Click(null, null);
}
if (ApplicationSettings.Default.Contains("imageNumber")){
ImageNumber = (int)ApplicationSettings.Default["imageNumber"];
}
}
在你第一次运行它的时候,因为没有任何状态值被记录,会自动使用默认值。但当你再次运行它的时候,你就会注意到它将使用你上次所保留的值!
第五部分,添加皮肤
现在,让我们给它一个好看的皮肤。我将再次使用Corrina那个风格粗犷的皮肤。
只需从Corrina的示例中剪切、粘贴<ApplicationResources>这一部分到你的App.Xaml中
并添加样式
<Button Style="{StaticResource buttonStyle}"
<TextBox Style="{StaticResource textBoxStyle}"
就大功告成了!
同时欢迎你们获取完整的例子和示例文件。
[原文发表地址]:Hotfix access on Code Gallery
[原文发表时间]:Wednesday, April 23
大概一年前,我们决定挑选一些需求量较大的热修复程序,把它们放在Connect网站上。我们这一决定得到了不错的反馈,但和任何一个新项目一样,我们同时发现在有些方面我们可以做得更好。
我们正在对这一服务进行更新,利用最近引进的MSDN代码图库,给客户提供更容易发现、易于使用、self-serve的热修复程序。
如何使这些热修复程序更容易被发现,这是我们需要解决的问题之一。在代码图库,所有的VS和.NET产品的更新都放置在同一个地点。以前的访问限制现在已经不复存在。访问和下载热修复程序也无需登陆。这次升级提供了另一个有用的功能,即搜索功能。所有的下载都可以附加多个标签,而这些标签可以帮助你更容易地通过搜索定位到相关的热修复程序。更重要的,你还可以通过代码图库的论坛,直接对热修复程序提交反馈。
Namaste!
周五在San Francisco举行的Web 2.0 Expo上,Microsoft正式公布了新的Live Mesh平台。Live Mesh不仅仅是一个用户平台,也更是一个开发者平台。而借此,Microsoft也第一次大声地喊出:PC不再是计算的中心了,而Services才是平台的中心。
对于用户,现在IT的趋势是个人拥有越来越多的终端:手机,PDA,笔记本电脑,台式机,XBox,iPod,等等。而另一方面,各个终端上的社会网络和信息资源又很难保持一致或进行整合。手机上有一堆号码,笔记本上有一堆会议记录,台式机上有一堆照片,XBox上有一堆网友。但如果你什么时候想在开会的时候偷个空看看哪些XBox的玩友正好在线呢,Oops,不好意思,做不到,因为事先没有把这部分内容同步过来。
而对于开发者,他们希望他们所写的应用程序不但能在常用的计算平台上运行,也希望当用户在使用移动设备或者有网络能力的娱乐设备的时候,同样能使用他们的应用程序。设想,如果你开发了一个共享照片的服务,在台式机或者笔记本上运行的好好的,但你是否也希望当你的用户手边只有一个手机的时候,他同样可以轻松地使用你的程序的mobile版本来下载他所想要的照片呢。写个用户界面是小事,难的地方是在于如何在手机平台上无缝地获取存储在cloud (cloud as in cloud computing)中的资料。而Live Mesh就是想为开发者提供解决这样问题的平台,而不是让每个人绞尽脑汁地开发如此底层又吃力不讨好的服务。
Live Mesh的核心概念在于以下几点:
1. 服务是平台的中心,而不是终端(PC也好,手机也罢,服务应该是独立于硬件的)。
2. 统一的API集。无论你的程序是运行在离线的客户端,还是作为浏览器的plug-in,还是作为一个动态网页(后台连接Live Mesh的cloud storage),还是一个连线的桌面程序,所有的模式需要使用的API应该是一致的。
3. 开放的可扩展的数据模型。
4. 弹性的应用程序模型。开发者可以写仅支持连线状态的程序,也可以写同时支持离线和连线状态的程序,也可以写仅作为浏览器插件的程序,等等。Live Mesh不强制某一种应用程序模型,一切完全由开发者决定他们想支持的用户场景(user scenario)。
CNET上有一些报道可以帮助有兴趣的朋友开始了解Live Mesh:
Live Meshing on the Gillmor Gang
Microsoft Live Mesh platform takes on Google, Adobe
而这里有Ori Amiga的介绍Mesh程序开发的视频:
Ori Amiga: Programming the Mesh
============================================================================================================
这半年经历了很多人事变动,周围的事一直不是很安定,希望以后的一段时间能安静地做些技术。关于Live Mesh我还有不少想写的,虽然对它的某些内容我还有自己的看法,但总体来说这是一个好方向。这次微软推出Live Mesh后收到的评价也颇为正面,和以往一出来什么东西都被口诛笔伐得一文不值大为异趣。可见群众的眼光还是雪亮的,大家并不针对你这个人/公司来评价你的产品,Google做得不好的要批评,Microsoft做得好的也可以表扬。做技术的本来就该如此,政治还是留给别人去搞吧。
【原文地址】Slides from my ASP.NET Connections Orlando Talks
【原文发表日期】 Sunday, April 27, 2008 9:51 PM
上星期,我在奥兰多举行的ASP.NET Connections 大会上做了演讲。星期一我做了一个主题演讲,那天稍后,我还做了2个分会场讲座。你可以在下面下载我的讲义和示范例程:
主题演讲
我主题演讲的讲义可以在这里下载。
在演讲中,我示范了如何调试 .NET 框架源码。你可以在这里了解如何在VS 2008中做配置。
我还示范了如何使用新的ASP.NET动态数据支持来建造网站,你可以在这里了解有关ASP.NET动态数据的详情。我还示范了如何使用新的ASP.NET MVC框架,你可以在这里了解有关ASP.NET MVC的详情。
我还展示了使用Silverlight 2建造的新Hard Rock Memorabilia网站。你自己可以在这里把玩一下Hard Rock应用,你可以在我这里的链接网页了解到Silverlight的详情(中文版)。
使用Silverlight建造.NET 应用
Silverlight分会场讲座的讲义和示范例程可以在这里下载。
你可以在我这里的链接网页(中文版)上了解到有关Silverlight的详情。特别地,我建议你阅读一下我这里 和这里的教程贴子。
ASP.NET MVC
我的ASP.NET MVC讲座的讲义和示范例程可以在这里下载。
你可以在这里了解到最新的 ASP.NET MVC源码更新版的详情。 Stephen Walther 刚在这里贴出了一套他在大会后做的ASP.NET MVC讲座的讲义和示范例程,非常之棒。
希望本文对你有所帮助,
Scott
CSDN 网友 zswang 组织了一个编程游戏比赛。划拳机器人比赛。类似“Robocode” 的游戏。
比赛相关帖子如下:
【编程游戏】编写一个会划拳的机器人参加擂台赛,规则内详。
http://topic.csdn.net/u/20080421/17/6a4d1c20-e1d1-4e9d-99ae-d648cb422ca6.html
【编程游戏】划拳机器人,前面一贴的机器人都集中来了,继续PK。谨慎路过。
http://topic.csdn.net/u/20080423/21/cda52758-a06d-49e1-9db0-eda2b009da8c.html
很有意思的,为了让更多人能参与到这个很有趣的 .NET 编程比赛中来,我转了下面的内容:
划拳介绍
划拳又叫豁拳、猜枚、猜拳、拇战,即饮酒时两人同时伸出手指并各说一个数,谁说的数目跟双方所伸手指的总数相符,谁就算赢,输的人喝酒。此乃我国
古传至今仍时尚流行的饮酒游戏,它增添酒兴,烘托喜庆,是一种民间的酒令。 其技巧性颇强,给玩者留有神机斗智的余地,且因玩时须喊叫,易让人兴奋,极富竞争性。
两人同时伸出一只手,用攥起的拳头和伸出一到五个手指,表示从零到五这几个数字,与此同时,嘴里喊出从零到10的数字,如果两人伸出的手指表示的数字相加与其中一个人嘴里喊出的数字相同,那么这个人就算赢了这一拳。举例说明:比如一个人伸出了三个手指,另一个人伸出了四个手指,一个人喊了七,另一个喊了六,那么这个人喊七的人就赢了;如一个人伸出攥紧的拳头(表示零),嘴里喊出了三,而另一个恰好伸出了三个手指可嘴里喊的七,那么喊三的就赢了。就这么简单。当然,如果自己喊的是“八仙过海”, 而自己仅伸出了一个手指,那么对方即使伸出五指也不可能凑成八,这种拳就叫臭拳,如果不是事先约定,是要罚酒的。
划拳规则看完了,那我们就开始写一个会划拳的机器人吧!
那么一个会划拳的机器会做什么事情呢?其实就是两件:
第一件、出拳,即:自己出几个手指?自己猜合计是多少。
第二件、知道划拳的结果,即:对方出几个手指,对方猜合计是多少,是否获胜还是平局还是其他。
只要继承Drunkard这个类,重载Come()和Outcome()方法那么你就拥有了一个会划拳的机器人,参与这个游戏了!
【游戏规则】
1、比赛共1000局,即:出现胜负算一局,如出拳100次没有结果也算一局并双方均不得分;
2、赢一局得1分、输不扣分;
3、机器人执行中每出现一次异常,扣100分、对方加1分、记一局;
4、机器人执行中反应超时1000毫秒直接判负,每超时100毫秒,扣1分,超时10次以上直接判负;
5、自己得分高于对手并大于600分判胜;
6、自己得分为正数对手得分为负数判胜;
7、其他情况则判平。
具体执行的过程,算法的过程请参考Drunkery <T1, T2>类的实现
【入门提示】
1、机器人的命名建议是: <自己的id> + <第几个> + "号",如:Zswang一号、Zswang二号,当然你也可以用“长江七号”
2、不允许修改Drunkard和Drunkery <T1, T2>;
3、机器人必须从Drunkard继承;
4、分析擂主代码是战胜擂主的关键;
5、打擂容易守擂难,大家自由发挥吧!
【擂台赛规则】
1、第一个打败擂主的机器人奖励20分,并成为新的擂主;
2、自己不能挑战自己编写的机器人;
3、最后一个擂主获得200专家分,发帖另付;
4、其余分数酌情散掉。
标准代码和比赛规则有什么不妥或者建议欢迎讨论,谢谢关注
(调试代码参考后面两帖,-_-!!!代码有点多,先别抢沙发。。。。)
由于空间有限, 这里就不贴调试代码了, 调试代码,以及基类代码看上面给的两个帖子的链接。
[原文发表地址] Helping you develop world-ready applications
[原文发表时间] Friday, April 18, 2008 7:18 PM
全世界越来越多的开发人员想要创建全球化的应用程序。这种想法要求.NET框架和基础类库提供各种不同类型的支持,比如能够支持不同文化和不同语言之间的转换,或者与输入编辑器(IME)进行交互。
我们时常从客户那里得到反馈,要求在我们的产品中加入更多的全球化的支持。最近发布的Visual Studio 国际语言包(International Pack)1.0就是为满足某些客户的这些需求而设计的。我们希望它所提供的功能特性能使开发人员更方便的创建出国际化的应用程序,从而满足他们全球不同客户的需求。
所发布的1.0版本的国际语言包提供了以下七种功能。
-
东亚语系数值字符串格式化类库(East Asia Numeric Formatting Library)——该类库提供四种不同的格式,可将数值数据格式转换成繁体中文、简体中文、日文和韩文的大写数值字符串。
-
日语假名罗马字转换类库(Japanese Kana Conversion Library)——这个类库可以将日语假名字符集转换为平假名、片假名、半角片假名和日文罗马字等日文表示。
-
日语文字对齐类库(Japanese Text Alignment Library)——该类库提供以日文特有的对齐方式生成“合理分布”的字符串。
-
日语Yomi输入自动完成类库(Japanese Yomi Auto Complete Library)——为了在文字输入域中提供自动完成的功能,应用程序必须根据已经输入的文字预测用户想要输入的文字。虽然在英文中这个看起来十分自然,但在日语或者其他东亚语言IME中却很难实现。自动完成功能根据用户通过IME输入的文字笔画来预测单词。日语Yomi输入自动完成类库提供了API,以及一个支持日文IME输入自动完成功能的Textbox控件。
-
韩语输入自动完成TextBox控件(Korean Auto Complete TextBox Control)——该控件提供了韩文输入法的自动完成功能以及韩文智能感应功能。
-
简体中文拼音转换类库(Simplified Chinese to Pin-Yin Conversion Library)——这个类库使开发人员能够得到简体中文字符的多音字、同音字、拼音、笔画数等属性。
-
中文繁简转换类库及Visual Studio插件工具(Traditional Chinese to Simplified Chinese Conversion Library and Add-In Tool)——这个转换类库将繁体中文字符和简体中文字符进行相互转换。与Win32 API提供的字符到字符的转换不同,这个类库基于词语到词语对中文进行转换。除了类库的支持,这个组件还提供了Visual Studio上的一个插件工具,可将资源字符串在简繁体中文之间转换。
Visual Studio国际语言包共有5种语言(日文、韩文、繁体中文、简体中文,以及英文),可以在微软下载中心下载。我们现在正在计划国际语言包的2.0版本。我们欢迎您通过vsintlpk@microsoft.com 发送您对国际语言包1.0的反馈意见以及对2.0版本的建议。
Namaste!
[原文发表地址] Visual C++ 2008 Feature Pack shipped
[原文发表时间] Monday, April 07, 2008 11:50 AM by Somasegar
在1月上旬, 我们发布了Visual C++2008功能包的beta版本, 现在我非常高兴的宣布,Visual C++ 2008功能包正式发布!
这个功能包为C++开发者提供了一些激动人心的新功能, 比如对MFC的重大更新和TR1的实现. 使用功能包中所提供的MFC组件, 开发者可以创建出和微软最受欢迎产品的感官效果一样的应用程序, 比如像 Microsoft Office, Visual Studio 和IE浏览器. 新的组件包括Office 2007的工具条菜单, Visual Studio的扩展坞和自动隐藏窗口, Vista主题的支持, 浮动菜单和工具栏定制, 内核管理类库和很多其他的功能. 我们对TR1的实现包含了很多重要的功能, 比如:智能指针, 正则表达式解析, 容器(Tuple, 数组, 无序集合等等) 和复杂的随机数生成器.
Visual Studio 2008 标准版或以上版本的客户都可以免费下载到这个产品,并得到完整的微软标准支持.
你也许想看一下MFC和TR1的在线文档并且预览一下这些新功能, 这些MFC文档给你提供了一些非常好的内容,帮助你快速熟悉并使用这些新组件.
Namaste!
原文发表地址]Community Localization: Brazilian version of VS 2008 and .NET FX 3.5
[原文发表时间] Monday, April 14, 2008 8:35 AM
我们渴望我们的产品能够探及来自世界各地的顾客。取决于您身在何处,人们使用不同的语言。为了方便人们用自己所喜爱的语言来使用我们的产品,我们的产品和文档提供了多种语言的本地化版本。我以前一直说,随着规模的扩大,无论投入多少精力和资源都会面临问题。对我来说,为了真正达到规模,让社区本地化到自己喜爱的语言,无疑会使我们的产品被世界各地的用户更广泛的使用。
社区本地化结合机器翻译和社区成员的后期编辑,来推广Visual Studio和.NET 架构到新的语言和地区。完全社区本地化的Visual Studio包括两大支柱-一个Visual Studio的软件语言包,以及一个MSDN的文档翻译Wiki。
我很高兴地向大家宣布,到今天为止,在我希望可以提供这样的社区本地化产品中,巴西是第一个做到的。
今年3月,我们发布了第一款Visual Studio 2008 Express Editions 巴西语语言包。该语言包是一项免费的安装在英文版之上的插件产品,有约70 %的用户界面被翻译成巴西葡萄牙语。
今天,我们宣布发布了MSDN Translation Wiki v2 巴西葡萄牙语版,用户可以编辑机器翻译内容,为在Visual Studio 2008及.NET框架3.5文档中添加注释,代码片断或内容提供了基础。这是设于MSDN2
上的服务 ,因此它是完全可以通过Visual Studio 2008集成开发环境的 F1在线帮助来获得。这也提供了一种简便,内嵌的语句级编辑体验,来使得用户的编辑传导到整个网站。
有了MSDN Translation wiki V2和Visual Studio语言包,我们为那些希望用母语来使用Visual Studio和阅读相关文档的开发者提供了一个完全的整合的解决方案。
我很高兴看到我们跟微软最有价值专家( MVP )和一些巴西最负盛名的学术机构在这些社区本地化项目方面的合作: MVPs通过一个社区词汇论坛,帮助我们定义核心的Visual Studio术语; Pontifícia Universidade Católica 和Instituto Tecnologico de Aeronautica这些大学计算机专业的学生通过技术审查那些机器翻译的内容以及后期编辑那些机器翻译的最热门话题来提高部分内容的质量。Universidade de São Paulo的学生参与翻译和测试了Visual Studio 语言包的部分工作。MVPs和微软学生合作伙伴和其他社区成员,将作为翻译Wiki站点的版主来帮助我们,审查和批准翻译编辑和建议。
我很高兴看到在巴西取得如此大的进展。我的国际化研究小组现正研究扩大这些本地化工作到新的语言环境的解决方案,使得下一版的Visual Studio能够扩展到其他几个市场 。如果你有兴趣参加这些社区本地化项目,并协助翻译成您的母语,请联络Cristina Nardini of the Community Localization Team。
Namaste!
[ 原文地址:]Dynamic Language DSL vs Xml Configuration
申明:仅代表个人观点,非其他人的,非官方的。我不应该说这些,但是历史告诉我,我应该说。P.S.我并不是一个DSLs和动态语言的专家;)
这个星期,我参加了一个John Lam关于IronRuby的访谈,他亮出了Uncle Ben的名句“能力越大,责任越大”。当然,他指的是动态语言像Ruby的力量。
我被他另外一句话吸引了。他说如果他阅读使用metaprogramming技术写的ruby 代码几小时,他的脑袋会乱成一团。要理解在meta以及meta-meta层次上写的代码来运行时操纵并重写代码,需要花费很大的精力。也许这就是为什么c#将在近期继续是主要语言,而我尽力让我的大脑在更高层次运作。;)
然而,我认为他指的代码类型是用于实行DSL自身的代码。一旦写了一个DSL,位于那个DSL代码在它之上的代码必须是可读的。在它成为主要语言之前,我已经开始使用IronRuby。我能够看到我自己时不时的创建并使用mini-DSLs作为配置的替代品。
AHhh...配置。有时候我觉的这是一个误称。至少在java和.net社区中将配置运用与实践上时是的。从我们将什么东西都塞进xml配置时就有了这种趋势。
所以人们经常要求我们向那些我认为应该与单元测试一起被设置在代码中的配置特性提供XML。我们已经把XML变成一个程序语言,而且是一个蹩脚的。Ayende 谈论一个issue,在一个工具下清除大量的XML配置。这不是一个棘手的问题,但它吐出了一个事实,XML是代码,但这个代码的外在胜于内涵。要理解我说的外表和内涵强看 Ending Legacy Code In Our Lifetime.
用asp.net mvc 项目时,我们使用了代码第一,配置第二的方法。你可以从我们的URL Routing中看到这一点。你在代码中第一路径,而我们也许在将来的版本中提供配置的方法。
用这个方法,你可以为你的路径定义写单位测试,这是一件好事!Routes将URL转变成一个方法的形式,你为什么不想为它写测试呢?
我写这个文章的原因是,最近我一直在用IronRuby,想写一些在自己的时间里做的一些有趣的事情。这个帖子告诉了大家我为什么要研究IronRuby,除了它很有趣,以及贯穿Hack的研究精神。
不算文章,随便动动笔,记下这两天试验的一些结果
- BizTalk 在Visual Studio 里那个Add Sql Adapter Meta Data 功能很不好用,不如直接在BizTalk 建一个SQL Receive Location 然后直接Send 到File,再从Xml File 生成Schema。
- 如果需要Disassemble 消息,MSDN上 有个不错的WalkThrough。几个关键点如下:
- Envelope Schema 和 Document Schema Share same namespace。
- 要为Envelope Schema 设置Body XPath。
- <Any> Node in Envelope Schema 需要设置属性 namespace ##any and Process Context = Lax
- Envelope Schema 在Visual Studio里 Validate Instance 是必然会失败的。
- 不需要Import Document schema to Envelope Schema
- 不需要创建Customize Pipeline, Building 的XmlReceive Pipeline 就够了
- BizTalk 里的XmlReceive Pipeline 不需要做任何特殊设置。
顺便问问,有人玩这个吗?
比如我们有下面的需求:
三台电脑:A,B,C。
我们在 B 和 C 上部署了同样的一个服务,电脑 A 需要根据客户端的选择,自动的切换到底是调用B的服务,还是C的服务。
要实现这个需求,核心就在客户端的调用上。下面我们用一个简单的演示这个功能的代码来说明如何实现。
首先:服务器段
服务器段逻辑,这是非常简单的,我们按照之前的.net编写规范,编写代码即可。熟悉.net Remoting 的完全可以跳过这部分。
下面是一段简单的服务器段逻辑代码
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
namespace MyServiceComponent
{
public class MyComponent : MarshalByRefObject
{
public string GetString(short s)
{
// 返回信息中包含服务器IP,这样我们就知道客户端调用的是哪个服务器
if (s <= 10)
return string.Format("<=10 {0}", GetIP());
else
return string.Format("大于10 {0}", GetIP());
}
protected string GetIP() //获取本地IP
{
IPHostEntry ipHost = Dns.GetHostEntry(Dns.GetHostName());
IPAddress ipAddr = ipHost.AddressList[0];
return ipAddr.ToString();
}
}
}
服务器段的配置
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.runtime.remoting>
<application>
<service>
<wellknown mode="Singleton" type="MyServiceComponent.MyComponent, MyServiceComponent"
objectUri="HongjunguoRemotingService" />
</service>
<channels>
<!-- 这里的配置方法,请参看MSDN中 远程处理安全通道技术示例 -->
<channel ref="tcp" port="8088" secure="true" impersonate="true"
protectionLevel="EncryptAndSign" />
<serverProviders>
<formatter href="binary" typeFilterLevel="Full"/>
</serverProviders>
</channels>
</application>
<!--
只有把 customErrors 配置成 Off ,服务器端的详细错误异常,才能传递到客户端
默认是不传递完整的错误异常的。
-->
<customErrors mode ="Off" />
</system.runtime.remoting>