为什么要做这款插件?

在豆瓣上查看一本书的时候,页面的右侧会显示哪些网站可以购买该书以及各自的价格。
比如这本《乡关何处》,页面右侧显示了亚马逊,京东,当当等网站的购买链接。

乡关何处

但是豆瓣只会提供纸质书的购买链接,不提供电子书的。除非该书豆瓣自己有售。
所以我写了个Chrome的插件来解决这个问题。

这款插件怎么用?

这款插件会在每个图书页面上添加正版电子书的购买链接及其价格。您只需点击链接去购买就好了。

阅读全文 »

测试发布文章

测试修改

再次修改

好久没用了,还能更新吗?test

is it fixed 10?

本文翻译自 Jon Skeet 的系列博文”Edulinq”。

本篇原文地址:

http://msmvps.com/blogs/jon_skeet/archive/2010/12/29/reimplementing-linq-to-objects-part-12-defaultifempty.aspx

上次实现 First / Last的时候写了大量的代码,相比起来,今天要讲的 DefaultIfEmpty 就轻松多了。

DefaultIfEmpty是什么?

这个操作符虽然简单,但是还是有 两个重载

阅读全文 »

本文翻译自 Jon Skeet 的系列博文”Edulinq”。

本篇原文地址:

http://msmvps.com/blogs/jon_skeet/archive/2010/12/29/reimplementing-linq-to-objects-part-11-first-single-last-and-the-ordefault-versions.aspx

今天我实现了六个操作符,每个操作符都有两个重载。我一开始以为这些操作符的实现会很相似,但是最后发现每个都稍微有些不同…

今天实现了哪些操作符?

以下三个集合的排列 {First, Last, Single}, { 带有 / 不带有 OrDefault }, { 带有 / 不带有谓词
} ,其结果是十二个不同的方法签名:

阅读全文 »

本文翻译自 Jon Skeet 的系列博文”Edulinq”。

本篇原文地址:

http://msmvps.com/blogs/jon_skeet/archive/2010/12/27/reimplementing-linq-to-objects-part-9-selectmany.aspx

我们接下来要实现的这个操作符是LINQ 中最重要的操作符。大多数(或者是全部?)其他的返回一个序列的操作符都可以通过调用 SelectMany
来实现,这是后话按下不表。现在我们首先来实现它吧。

SelectMany 是什么?

SelectMany 有四个重载,看起来一个比一个吓人:

阅读全文 »

本文翻译自 Jon Skeet 的系列博文”Edulinq”。

本篇原文地址:

http://msmvps.com/blogs/jon_skeet/archive/2010/12/27/reimplementing-linq-to-objects-part-8-concat.aspx

上文讲的 Count 和 LongCount 返回的是数值类型,本文我们讲的 Concat 返回的是一个序列。

Concat 是什么? Concat

只有一种签名形式,这让它使用起来很简单:

阅读全文 »

本文翻译自 Jon Skeet 的系列博文”Edulinq”。

本篇原文地址:

http://msmvps.com/blogs/jon_skeet/archive/2010/12/26/reimplementing-linq-to-objects-part-7-count-and-longcount.aspx

今天的文章要介绍两个 LINQ 操作符,因为它们实在是太类似了,所以放到一起来讲。 Count 和 LongCount
的实现非常相像,不同的只是方法名,返回值类型和几个变量。

Count 和 LongCount 是什么呢? Count LongCount
各自有两个重载:一个重载接受谓词,另一个不接受。下面是这四个方法的签名:

1
2
3
4
5
6
7
public static int Count < TSource > (this IEnumerable < TSource > source)

public static int Count < TSource > (this IEnumerable < TSource > source, Func < TSource, bool > predicate)

public static long LongCount < TSource > (this IEnumerable < TSource > source)

public static long LongCount < TSource > (this IEnumerable < TSource > source, Func < TSource, bool > predicate)
阅读全文 »

本文翻译自 Jon Skeet 的系列博文”Edulinq”。

本篇原文地址:

http://msmvps.com/blogs/jon_skeet/archive/2010/12/24/reimplementing-linq-to-objects-part-6-repeat.aspx本文的主题是个无关紧要的方法, Repeat 。关于 Repeat ,值得讨论的内容比 Empty
还要少。写这篇博文只是为了保证这个系列的完整性。

Repeat 是什么? Repeat 是一个静态的泛型方法,不是扩展方法,它只有一个签名形式:

1
public  static  IEnumerable<TResultRepeat<TResult>(TResult element,int  count)

它返回一个序列,该序列中反复的包含“ count ”个指定的元素,。 Repeat 只需要一个参数校验:检验“ count ”不是负数。

阅读全文 »

本文翻译自 Jon Skeet 的系列博文”Edulinq”。

本篇原文地址:

http://msmvps.com/blogs/jon_skeet/archive/2010/12/24/reimplementing-linq-to-objects-part-5-empty.aspx这一篇继续讲非扩展方法。这次我们要讲的是 Empty ,它有可能是最简单的 LINQ 操作符了。

Empty 是什么?

Empty
是一个泛型的,静态的方法,它只有一个签名形式,不接受任何参数:

public static IEnumerable Empty()

阅读全文 »

本文翻译自 Jon Skeet 的系列博文”Edulinq”。

本篇原文地址:

http://msmvps.com/blogs/jon_skeet/archive/2010/12/24/reimplementing-linq-to-objects-part-4-range.aspx

本篇博文较短,接下来的几篇估计也会比较短。我觉得只有 很相似的几个 LINQ 操作符才适合放到同一篇博文里面,比如 Count 和
LongCount 就比较适合放在一起讲。不过我也要采纳读者的意见,如果你喜欢“肥胖”一点的博文的话,请留言说明。

本文将要讲解 Range 操作符。

Range 操作符是什么?

阅读全文 »

本文翻译自 Jon Skeet 的系列博文”Edulinq”。

本篇原文地址:

http://msmvps.com/blogs/jon_skeet/archive/2010/12/23/reimplementing-linq-to-objects-part-3-quot-select-quot-and-a-rename.aspx

距离上次写完本系列博文的 第一篇 第二篇 已经有一段日子了,希望接下来的进度会快一些。

现在我给本项目在 Google Code 上建立了源码管理
,现在就无需每篇博文包含一个 zip 文件了。创建项目时,我给它取了个显而易见的名字,叫做 Edulinq 。我修改了代码中的命名空间,而且现在
这一系列博文的 tag 也修改为了
Edulinq 了。好了,闲话少叙 … 我们来开始重新实现 LINQ 吧,这次要实现 Select 操作符。

Select 操作符是什么?

阅读全文 »

本文翻译自 Jon Skeet 的系列博文”Edulinq”。

本篇原文地址:

http://msmvps.com/blogs/jon_skeet/archive/2010/09/03/reimplementing-linq-to-objects-part-2-quot-where-quot.aspx

提示:本篇文章较长。虽然我选择了一个比较简单的操作符来在本文中实现,不过我们还是会遇到一些特例以及一些与 LINQ
相关的原则。因为我还在试着找出表现本文内容的最佳方式,所以本文的排版方式暂时是实验性的。

我们将要实现“ Where ”子句(也可以说是方法或操作符)。 Where 在总体上来说比较容易理解,但是涉及到延迟执行和流式处理的部分会有些麻烦。
Where 方法是泛型的,不过只有一个类型参数(在我看来这很重要,因为我觉得一个方法的泛型参数越多就越令人难以理解)。哦,对了,我们将在本文开始涉及查询表
达式,这算是本文的一点额外猛料。

Where 是什么?

阅读全文 »

本文翻译自 Jon Skeet
的系列博文“Edulinq”。

本篇原文地址: http://msmvps.com/blogs/jon_skeet/archive/2010/09/03/reimplementing-linq-to-objects-part-1-introduction.aspx

大约一年半之前,我在 DDD
的活动日上做了一次演讲。我当时试图去重新实现LINQ to
Objects,在一小时内能实现多少算多少。根据会后的反馈信息来看,我当时做得太快了…而且我还是远远没有实现完整。不过无论如何我还是觉得重新实现LINQ
to Objects是一个很有趣的练习,所以我觉得我应该用且行且博、不徐不疾方式来再做一遍。

这一系列的博文都会标上 “Edulinq”的标签
,你可以用这种方式过滤出这一系列博文。

总体思路

我的计划是要完整的重新实现LINQ to Objects,用每篇博客来解释一个方法(或者是一组方法)。我将会尽力把代码写的达到生产质量,但是我不会写任何XML文档注释 -
既然我已经在写博客来解释了,那我就不想在代码中再重复一次了。我将在适当的情况下做一些优化,但愿会 比LINQ to Objects本身的实现做得更好

阅读全文 »

原文地址: http://www.imaginativeuniversal.com/blog/post/2010/12/09/WP7-Tip-disabling-the-Pivot-Control-swipe-gesture.aspx

原文作者: James Ashley

在WP7社区中一个经常被问到的问题就是:在Pivot中放置了可以接受滑动手势的控件(比如说一个Slider)时,如何禁用Pivot控件本身内置的“用手指滑动
来切换视图”的功能呢?

对此问题,微软标准的答案是:你不应该这么做。这是“不好的做法”(Bad Practice),会造成用户体验的混淆。这种说法的前提是假设用户不会自己根据上下文
去思考,而总是预期“滑动”这一手势会在任何页面中都有一样的作用。这种答案听起来还不错,而且对于Pivot中内置Slider这种例子来说也很合理。况且,我们还
是可以把Slider纵向的放置在Pivot内的,那这个答案就显得更有道理了。

话又说回来,在WP7的TextBox中,我们可以用“按住并滑动”这一手势来操作光标在文本框内的位置。那么在Pivot控件中放置TextBox算不算是造成了不
好的用户体验呢?算不算是“不好的做法”(Bad
Practice)呢?我是不是应该想办法把TextBox也纵向放置呢?还有,ToggleSwitch控件(此控件来自于Silverlight for
Windows Phone Toolkit )又该怎么办呢?

滑动这一手势对于手机来说是很常用的。很多针对WP7的新控件都会用到它。如果所有这些即将面世的新控件都不能放置在Pivot控件中的话,那就太可惜了。

阅读全文 »

恰好赶上这个月的十一号GearBox要在Duke Nukem北美发售之前搞一个Community
Day,就在达拉斯。作为一个八流的FPS爱好者一定要去凑凑热闹。

去往达拉斯的路上,透过车窗随便拍了一张

到达现场,室内很暗。摆了一些GearBox出品的其他游戏的海报。

这次来点干货,丢大爷的玉照

阅读全文 »

再访红河谷

紧接着上次去红河谷骑越野车的一周之后,再次造访此地,体验肾上腺素的急剧分泌。

这是刚进门的地方,很多人都是开着汽车,挂着拖车,载着摩托车来的

骑过了一大片坑坑洼洼的泥水地,前面就是红河,德克萨斯州和俄克拉荷马州的交界之处。

前面转弯后完全是豁然开朗的景象。一半流水一半沙,满目葱绿满目花。(其实是没有花儿的,只是为了凑个韵脚)

阅读全文 »

书接上回,这是公司楼下湖里的一条鳄鱼,到了中午鳄鱼头上还趴着一只晒暖儿的老龟

WP_000035

鳄鱼只是雕塑,从侧面比较容易看出来

WP_000036

WP_000037

中午去吃饭的时候经常走的一条小路,旁边有初生的小兔子

阅读全文 »

这是从成都起飞时候在飞机上照的,灰蒙蒙的,什么都看不清楚。

WP_000006

飞行中途没怎么开手机,所以也没怎么拍照,下面是到了公司之后的照片。

这是公司进门之后墙上挂的的东西

WP_000008

MS合作ISV的牌子,2010-2011,是金的

阅读全文 »

[翻译]List为什么实现了那么多接口?

原文地址: http://blogs.msdn.com/b/ericlippert/archive/2011/04/04/so-many-interfaces.aspx

原作者: Eric Lippert

Eric Lippert是微软员工,C#编译器的主要开发人员之一。

今天,我在 StackOverflow
上回答了一个问题。按照以往的习惯,我把它以对话体的形式整理成一篇博客。

MSDN的文档中说List是这样声明的:

阅读全文 »

上一篇博文
中提到了“可选参数”这个C# 4.0中新增的语言特性,但是写过之后还是不满足,心里还是有一些疑问没有得到解释。于是又做了一些探索,过程中竟然发现这么一个小小
的语言特性背后隐藏着的有趣问题还真不少。这次就把探索过程中的发现和疑问记录下来。

“可选参数”的实现

Cnblogs上有一篇 蒋金楠的文章
中提到一句:“缺省参数最终体现为两个特殊的自定义特性OptionalAttribute和DefaultParameterValueAttribute
”。为了验证这个说法的正确性,我自己做了一些试验。

要研究语言特性的实现原理最好的方法莫过于反编译出IL代码来一探究竟了。所以,那就顺着这条线索走吧。

首先用C#代码写一个很简单的测试方法:

public void TestMethod(string str = "A")
{
}
阅读全文 »

前几天推荐一个同事用“可选参数”,推荐完了我还画蛇添足的说这是.Net 4中的新特性。但是事后才发现这个新特性是C# 4.0的语言特性,与.Net
4无关。其实也不只这一次,我平时也经常把语言、框架、运行时,有时甚至还有开发工具混为一谈。于是今天就总结一下C#中我感兴趣的几个语言特性是从何而来的。

** 1.可选参数 **

可选参数是C# 4.0中的新特性,其作用在于在调用者不提供参数值时给参数一个默认值,用起来是这样的:

static void Main(string[] args)


{


    TestMethod();


    TestMethod(10);


 


    Console.ReadLine();


}


 


public static void TestMethod(int parameter = 5)


{


    Console.WriteLine(parameter);


}

以上的代码在第一次调用TestMethod时输出5,第二次输出10,也就是在没有给TestMethod提供参数值时,会自动以5作为参数值。

该特性的实现依赖于OptionalAttribute和DefaultParameterValueAttribute这两个attribute,也就是说Test
Method这个方法完全可以声明为这样:

阅读全文 »

从名字就可以看出来,Words Via Subtitle是用来通过字幕学单词的辅助工具。它通过解析美剧或者电影的字幕文件把其中的生词取出,用网络上提供的开放
API或者本地词库解释生词。另外,程序还可以提供单词读音(机器发音),可以播放一个单词在剧中出现的语境,可以把所有生词串起来像幻灯片一样连续播放,也就是说显
示一个单词及其解释,然后用机器发音读该单词,然后播放该单词在剧中出现的句子,然后切换到下一个生词再重复这一过程。

这个程序去年就写过一个雏形,最近断断续续的重写了。这次主要的改进是将字幕的分析和单词的解释从主程序中抽出来做成插件,也就是说主程序部署到一台机器之后如果想要
增加对一种字幕格式的支持就只需要写一个插件拷到部署的机器上去就ok了,无需把整个程序重新编译、重新部署。同样,如果想要增加一种单词解释器也可以通过添加一个插
件完成,比如说现在只有一个很小的本地词库和一个网络释义,之后有人想给这个程序增加一个Google词典的解释器就可以写一个插件来完成。这次重写用了WPF、ME
F,以及Ribbon Controls等最近接触的新东西,不过在这儿暂时不介绍程序是怎么写,也不说字幕解析插件和解释提供器插件如何编写,先简单介绍一下各功能
的使用吧。对代码感兴趣的朋友可以去CodePlex上去搜索WVS(Words Via Subtitle的简写),我把这个程序作为一个开源项目上传到那儿了
,用的MS-PL协议,完全开源哈。

下面就开始说一下大概怎么用这个程序吧。

运行程序,用左上角的Open按钮(
2010-10-24_15-15-25](/images/attachment/201010/24/0_12879076954nrG.gif)
)打开一个字幕文件(现在可以支持srt和ass格式的,当然以后可以通过插件来添加对更多种类的字幕的支持)。

2010-10-24_15-12-10 ](/images/attachment/201010/24/0_1287907700gCeG.gif)

上图中右下角可选的文件格式会随着插件的增多而增多。

阅读全文 »