Hello World
Spiga

在香港生活的初步感受

2013-09-02 10:23 by 老赵, 25703 visits
摘要:好久没有更新博客了,主要是生活产生了一些变化。我这人比较没出息,生活稳定的时候,不论是工作和学习都会有条不紊,但一旦有所动荡,则就会心神不宁,啥事都做不进去,效率也一落千丈,比如Coursera上的基本课程也拉下了。相信不少同学都知道我当年去IBM深圳的主要原因之一,就是看重这是个和JPMC的合作项目,两年后有机会可以去香港。现在已经在香港租好了房子,离完全布置好还有一段距离,先记录一下最近在香港生活的一些感受吧。 阅读全文

比较下中国大陆和香港之间的个税差异

2013-07-06 11:40 by 老赵, 18150 visits
摘要:一直听说中国大陆个税税率之高,但一直没有跟哪儿作过比较。最近听说香港的税率很低,因此也想具体比较一下到底会差多少。单从数字上看,两者简直天差地远。例如,同样是累进税率,大陆从月入8K开始的部分就要缴纳20%的税率,超过38.5K则是30%,而香港最高也就只有17%。当然,比如香港租房之贵也遥遥领先于大陆一线城市,但房租亦可作为征税前的减免。正因为如此复杂,我们还是需要进行详细的计算才能有直观的概念,这里我就来尝试一下。这里以一对夫妻为例,但只计算其中一人的薪资,以传说中阿里P8级别的上限:月入5w人民币(年入60w),即月入6.25w港币(年入75w)为标准。当然,这只是对我比较有参考意义的数字,您也可以根据自己的标准来重新计算。 阅读全文

抓取InfoQ内容的calibre脚本

2013-06-30 23:11 by 老赵, 4903 visits
摘要:两个礼拜前我公开了一个抓取今年MSDN Magazine内容的calibre脚本,这次则是针对InfoQ的。最近用Kindle Paperwhite看书一发不可收拾,自然想要更好地利用这个设备。InfoQ是一个难得的高质量站点,可惜它的RSS只输出摘要,甚至只有前十条内容,让人感到十分不方便。但这显然难不住calibre这个电子书管理神器和伟大的程序员,于是我这段时间又断断续续地编写了InfoQ站点内容的抓取脚本,各个方面细节感觉修饰地都还算不错,特此公布。至于这个脚本该怎么用,就请自行看下calibre的帮助吧。 阅读全文

使用calibre抓取2013年的MSDN Magazine

2013-06-18 23:11 by 老赵, 4335 visits
摘要:前段时间入手Kindle Paperwhite,这已经是我第三个Kindle设备了。想当年我花了四五千块钱,在亚马逊美国站上跟着老美预定,可谓是全世界第一批Kindle DX(大屏幕的那款阅读器)用户,不过用着用着后来还是去玩平板了。这次Kindle Paperwhite出了国行设备,才849元,顿觉实在是太便宜了,立即下单,第二天就拿到了这台设备。有了设备自然要用,除了官方书店里买的书以外,第三方的内容自然也必不可少,毕竟目前国内的Kindle电子书还太少(尤其是计算机方面的),还好之前也从国外买了不少mobi电子书,可以直接看。更重要的是,我发现可以使用calibre这个电子书管理神器来抓取网络上的内容,生成一本电子期刊,甚至可以利用亚马逊提供的邮箱推送服务来传送到Kindle设备上。第一个尝试的目标便是MSDN Magazine。 阅读全文

防止装箱落实到底,只做一半也是失败

2013-04-10 22:21 by 老赵, 5435 visits
摘要:.NET提供struct类型,正确使用可以减少对象数量,从而降低GC压力,提高性能。不过有时候我会发现,某些同学有这方面的意识,但是有时候一疏忽一偷懒,就没有得到相应的效果了。这里举一个真实的例子:假设我们要将一对int作为字典的键,用于映射到某些数据,那么你会怎么做?当然我们可以直接使用Tuple<int, int>,但这样就可能产生大量的对象。于是我们打算使用自定义的值类型,但简单这么做其实并不一定能满足我们的要求。 阅读全文

为什么我不喜欢Go语言式的接口(即Structural Typing)

2013-04-10 18:37 by 老赵, 6384 visits
摘要:所谓Go语言式的接口,就是不用显示声明类型T实现了接口I,只要类型T的公开方法完全满足接口I的要求,就可以把类型T的对象用在需要接口I的地方。这种做法的学名叫做Structural Typing,有人也把它看作是一种静态的Duck Typing。除了Go的接口以外,类似的东西也有比如Scala里的Traits等等。有人觉得这个特性很好,但我个人并不喜欢这种做法,所以在这里谈谈它的缺点。当然这跟动态语言静态语言的讨论类似,不能简单粗暴的下一个“好”或“不好”的结论。 阅读全文

为什么我认为goroutine和channel是把别的平台上类库的功能内置在语言里

2013-04-09 13:52 by 老赵, 4234 visits
摘要:这几天看了《Go语言编程》这本书,感觉一般,具体可见发表在图灵社区里的书评。书评里面我提到“Go语言的goroutine和channel其实是把别的语言/平台上类库的功能内置到语言里”,这句话当然单单这么说出来是没什么价值的,于是我也就趁热把它说得再详细一些。我的看法简而言之是:由goroutine和channel所带来的主要编程范式、设计思路等等,其实基本都可以在其他一些平台中配合特定的类库来实现。 阅读全文

如何在不装箱的前提下调用“显式”实现的接口方法?(答案)

2013-04-07 13:51 by 老赵, 1904 visits
摘要:其实已经有不少同学抓住了关键,那就是使用泛型,不过有些同学提出Dispose<T>(T obj) where T : IDisposable这样的做法。我们没有进行类型转化,只是让运行时可以“认识到”类型T实现了IDisposable接口,这自然可以在不装箱的情况下调用其成员。可惜的是,这种做法的“意识”到位了,却是错误的,原因在于忽视了值类型传参的特点:复制所有内容。换句话说,这个辅助方法内部所使用的obj其实是一个副本,而不是原来的参数对象。假如被调用的成员会修改自身状态——尽管这对于值类型来说是一种极差的设计——这便会产生问题,所以正确的方法应该使用ref关键字来修饰参数。 阅读全文

如何在不装箱的前提下调用“显式实现”的接口方法?

2013-03-24 21:45 by 老赵, 2017 visits
摘要:上篇文章谈了针对一个struct对象使用using语句的时候是否会装箱的问题,结论是“不会”。尽管using语句是针对IDisposable接口的,但我们在调用的时候其实已经明确了目标方法,因此根本不需要装箱(或查找虚函数表)了。后来有同学在微博上提出,这点在《CLR via C#》这本书里提到过,于是我去翻了翻,表示这跟前一篇谈的内容其实并没有太多联系。不过这也引出了一个问题,假如一个struct类型显式实现了一个接口,您有什么办法在C#里调用这个接口方法呢?当然,调用时不能在堆上产生任何对象。 阅读全文

针对struct对象使用using关键字是否会引起装箱?

2013-03-22 00:06 by 老赵, 2285 visits
摘要:说起来这是个很简单的问题,我以前肯定可以给出确切地答复,但是前几天想到这点的时候突然楞住了。把这个问题发到微博上去之后,很多人说是“会”,但要么是猜的,或是给出的原因明显不靠谱。最后我只能自己简单研究一下了,最后得到的结果是“不会”装箱。请注意,这个问题是指,对于一个实现了IDisposable接口的值类型对象使用using语句,而不是将它直接复制给一个IDisposable引用——后者显然是会装箱的,会对性能产生一定负面影响。 阅读全文

串与绳(1):.NET与Java里的String类型

2013-03-12 23:29 by 老赵, 4666 visits
摘要:话说“字符串”是我们平时最常用的数据类型之一,它表示一个字符序列。在大部分的语言中,字符串还是一个不可变(Immutable)的数据类型。“不可变”意味着要改变则只能生成新的字符串,无论是连接两个字符串,获取或是替换字符串的一部分,这对于内存和CPU都是不可避免的开销。在一般情况下,只要使用合理这些开销都不会构成大问题。不过对于某些类型的应用,例如我前段时间在工作中涉及到的编辑器(IDE那种),就会带来较多麻烦,于是便用到了一个名为Rope的数据结构。Rope其实是一种很简单,很符合直觉的树状数据结构,也常用于表达一个字符序列,不过更适合需要大量修改的场景。不过,我们还是先来回顾一下.NET与Java中的String类型吧。 阅读全文

Everpage:将Evernote的笔记展现在页面上

2013-03-07 01:00 by 老赵, 5861 visits
摘要:我这人尤其强调阅读体验,无论是作为文章的读者还是作者。假如遇到一篇格式糟糕的文章,我会完全没有耐心读完它。因此对于阅读工具的展现格式也是各种挑剔,例如字不能太小,内容不能太宽或太窄,段落间距必须大过行间距等等,例如OS X上著名的RSS阅读器Reeder无法自定义样式,我甚至钻进其App内部修改其CSS文件。Evernote也是一样,无论是其网页版还是客户端,其阅读体验在我看来都比较糟糕,于是我在愤而花了差不多半天的时间打造了Everpage这个小玩意儿。简单来说,就是把一篇Evernote笔记显示在页面上。 阅读全文

真是O(1)吗?想清楚了没?

2013-01-18 11:21 by 老赵, 5956 visits
摘要:话说写程序的时候我们会用到各种数据结构,但十有八九不会由我们自己从头写起,都会直接拿来用。于是很多人就会记住,譬如HashMap或Dictionary的存取是O(1)的操作,二分查找什么的则是O(log(N))。不过,我们在实践中直接把这些类拿来用的时候,最好也留个心眼,知道这些类内部到底做了些什么,为什么它们能够达到O(1)之类的时间复杂度。我们在了解“理论”的同时也需要注意实践上的细节,例如,其实在实践中O(log(N))其实也是个不比O(1)大多少的时间复杂度,此时可能也需要考虑下“常数”会对性能造成多大影响。 阅读全文

一个最基本的HashedLinkedList

2013-01-07 23:52 by 老赵, 2185 visits
摘要:Tmc的初衷是补充一些常用的数据结构,例如对null作为字典键的支持,以及带有一个额外Remove方法的HashDictionary。但是,其实我创建Tmc项目的“初衷”却是HashedLinkedList。.NET BCL中已经有一个LinkedList,这是一个双向链表。说起来,我之前在面试中经常会提出一系列数据结构的基础问题,其中便包含LinkedList,我会问各个操作的时间复杂度,以及如何改进它们。例如,如何将它的Remove操作优化成O(1)的时间复杂度?最容易想到的做法便是使用一个字典来记录元素到特定LinkedListNode的映射关系。这种模式实在过于常见,所以便有了个特别的名称,叫做HashedLinkedList。 阅读全文

阅读.NET源代码那些事

2013-01-06 16:32 by 老赵, 8357 visits
摘要:谁都知道.NET(的大部分组件)是不开源的,但是我不止在一个场合不止一次地强调过,“不开源”不代表你没法看代码,不代表你没法知道里面发生了什么。这里我不是在说.NET Reflector或是ILSpy这类反编译工具,当然它们在平时开发中也起到了很大的作用,不过很多时候更直接的方式便是阅读代码本身,尤其是当你像我一样时不时要“抄”点代码的时候。由于最近我在Tmc中“大张旗鼓”地使用.NET中BCL的代码,因此也再次强调一下这部分经验。 阅读全文

NullableKey:解决Dictionary中键不能为null的问题

2012-12-29 02:26 by 老赵, 2331 visits
摘要:众所周知,.NET中Dictionary的键不能为null,否则会抛出NullReferenceException,这在某些时候会显的很麻烦。与此相对的是Java中的HashMap支持以null为键,则方便许多。尽管null的确不是个好东西,但它既然已经存在,既然给我们造成了麻烦,我们就要想办法去解决它。实现一个自己的字典类自然可行,但要精心实现一个高效的字典并不是件容易的事情,例如BCL中的Dictionary.cs就有超过2000行代码。此外另一个容易想到的方法便是实现IDictionary接口,将大部分实现委托给现成的Dictionary类来完成。不过,这相比我在这里要提出的方法还是显得太复杂了。 阅读全文

不同泛型参数区分的独立类型

2012-12-03 23:11 by 老赵, 2674 visits
摘要:相对于的Java的“类型擦除”来说,.NET中的泛型可谓是真正的泛型,这让我们可以有能力区分运行时所使用的不同的具体类型,大大增强了程序设计的性能和表现能力。谁会希望如Java一样,在找出符合条件的一万个int数值的时候,必须额外创建一万个Integer对象,导致堆上增加几百上千K的空间,还有一万个对象带来的GC压力?在运行过程中,.NET运行时会(在第一次使用时)为不同的值类型创建一份不同的代码,而让所有的引用类型共享同一份代码。不过无论执行的代码是否共享,不同具体类型参数的类型都是各自独立的,它们各有各的元数据,各有各的需方法表等等,因此它们的静态成员也是各自独立的。 阅读全文

如何生成一段Typoglycemia文本(解答)

2012-11-11 23:40 by 老赵, 2015 visits
摘要:关于“生成Tygolycemia文本”这个问题,已经有许多同学给了答案。不过,似乎大部分同学都只是以“完成”作为目标,并没有在解法的效率和内存占用上做过多考虑。其实对于这种非常简单的问题,给出一个解法并没有太大意义,而是要从中获取一些经验,否则就算反复解决这类简单的问题,得到的进步依然十分有限。事实上,这样一个高效的实现也可以十分清晰而简单,可以说并没有因为追求效率而引入任何复杂度。 阅读全文

如何生成一段Typoglycemia文本?

2012-11-05 23:39 by 老赵, 3095 visits
摘要:Typoglycemia是个新词,描述的是人们识别一段文本时的一个有趣的现象:只要每个单词的首尾字母正确,中间的字母顺序完全打乱也没有关系,照样可以正常理解。要不您来试下,如何从一段正确的文本生成一段Typoglycemia文本呢?其实这题还有后续,那就是把目标反一反:从一个前后确定中间乱序的单词,找到其原始的,正确的单词。自然,我们会得到一个长长的单词列表,十万个单词吧,并保证没有两个单词仅仅是中间几个字符的顺序不同。那么,您会如何设计一个数据结构,让我们可以快速的从一个乱序后的单词找到其正确形式呢? 阅读全文

如何让您的事件支持逆变

2012-11-04 18:56 by 老赵, 2443 visits
摘要:在.NET里定义一个事件会需要一个委托类型,一般来说我们会使用.NET里自带的EventHandler类型,但它的定义其实有稍许缺陷。例如,如果您在自己的项目中编写了这样的代码,Resharper这样的工具便会提醒您“TEventArgs可以设为逆变”。让一个委托类型支持逆变只需要加上in关键字,但如果我们还是让C#编译器帮我们生成事件,则会由于Delegate.Combine方法并不支持逆变而导致失败。我们可以构造一个MulticastDelegateManager来解决这个问题,要不您也来试试看?不过请不要仅仅给出“思路”,千万要写下代码来,否则您的思路不说也罢。 阅读全文
1 2 3 4 5 6 7 8 9 ... 31 Next >
使用Live Messenger联系我