摘要: 我的iPad系统是iOS4.3没有越狱,推荐下面这些免费软件给各位iPad玩家。这些软件都是通过美国app store下载来的,不用信用卡注册一个美国app store其实很简单,就是购买一个free的软件就行了。某些情况下也许需要翻墙。下面推荐的软件都是免费的,在app store中可以搜索名字找到下载。不需要越狱也不需要破解,基本上已经满足了我日常需求。先说说我觉得应该有但是现在还不够好(或者我还不知道的)软件:1)浏览器,safari无法浏览桌面版google reader,太惨了,是我最不可容忍的。Firefox或者Chrome有iOS版本么?或者有什么软件浏览google reade阅读全文
posted @ 2011-03-24 10:43 林志玲 阅读(6323) 评论(8) 编辑
摘要: 你是一个程序员初哥,刚从大学迈进公司却没有人指导,要么公司给你指定了导师,却不好意思大事小情都问他。你想提高自己的编程水平,却不知该如何下手。如果你想提升自己,成为一个合格的天天向上的程序员,这篇文章就是为你准备的。学什么?有些人对什么都感兴趣,硬盘上存着几百G的教学视频电子书破解软件,却只是仅仅保存着,没有转化成知识。有些人只知道自己刚进公司的那点东西,JDK一定要1.4.2,VC++一定要6....阅读全文
posted @ 2011-01-22 00:28 林志玲 阅读(4632) 评论(26) 编辑
摘要: 从2003年加入现在的公司,已经有了快6个年头,自己也从一个计算机软件开发方面的新兵变成了老人。在公司里也做过几个不同的项目,有一些新的同事加入项目组,会有这样那样的疑惑和问题。在这里想简单说说,一个新人如何能快速的融入一个新的开发组,让其他同事能够接受自己。首先是读文档。计算机方面有个著名的黑话叫做RTFM,什么意思呢?按字面翻译就去“去读他妈的文档”,这是在新闻组或者论坛里可能常见的回复,一些人娇滴滴的说“我是妹妹,能指导一下这个问题么”或者贱兮兮的”跪求某某问题答案”。当然,同事之间不可能搞这些,不过也经常碰到有人问一些感觉非常简单问题,这些问题实际上都在项目文档或者软件规范里就明白写着阅读全文
posted @ 2010-12-20 10:33 林志玲 阅读(2905) 评论(19) 编辑
摘要: http://sunxiunan.com/?p=1661云风最近写了一篇博客《C语言的前世今生》。作为长期使用C语言开发网络游戏服务器的程序员,云风是有理由写这样一篇文字,不过还是感觉谈的不够深入,C语言在业界使用的现状没有怎么描写,有些意犹未尽。在这里想比较系统的谈谈个人对C语言学习方式方法的理解。分别按照书籍、实验环境搭建、网络资源来分别介绍,希望能写的比较完整全面一些,给想学习C语言的朋友一...阅读全文
posted @ 2010-12-04 00:57 林志玲 阅读(47331) 评论(53) 编辑

欢迎各位Dotnet程序员回答。不需要回答出具体问题,只要标记大致程度即可。


1什么是DotNet的CLR? CLR作用是什么?

A不知道     B知道很少    C知道一些    D非常了解

2 DotNet中如何使用Win32的DLL?(没有reference可以添加)

A不知道     B知道很少    C知道一些    D非常了解

3 C#使用什么关键字实现可变个数参数(variable number parameters)?

A不知道     B知道很少    C知道一些    D非常了解

4 C#中的weak reference是什么?用于什么场合?

A不知道    B知道很少    C知道一些    D非常了解

5 C#中的using dispose模式是什么?用于什么场合?

A不知道     B知道很少    C知道一些    D非常了解

6 C#中Garbage Collection是什么?简介GC的internal工作方式(如果你是微软开发人员,如何实现GC)?

A不知道     B知道很少    C知道一些    D非常了解

7 C#中的关键字as, yield, out/ref, virtual/abstract/override?

A不知道    B知道很少    C知道一些    D非常了解

8 Strong name signature是什么?有什么用?

A不知道     B知道很少    C知道一些    D非常了解

9 字符串intern暂留机制是怎么一回事?

A不知道     B知道很少    C知道一些    D非常了解

10 Windows平台下多进程通讯方式?越多越好

A不知道     B知道很少    C知道一些    D非常了解

11 Delegate, Event, Action, Func都是什么?

A不知道    B知道很少    C知道一些    D非常了解

12 MVC, MVP, MVVM设计模式?

A不知道     B知道很少    C知道一些    D非常了解

13 除了工厂模式和单例模式,列举并且简单介绍你知道的设计模式以及应用场合?

A不知道     B知道很少    C知道一些    D非常了解

14 C#中overload和override如何实现?

A不知道     B知道很少    C知道一些    D非常了解

15 接口和抽象类有什么区别?都应用在什么场合?

A不知道     B知道很少    C知道一些    D非常了解

16 LINQ是什么?写一个简单的LINQ语句?

A不知道     B知道很少    C知道一些    D非常了解

17 C# Lambda是什么?写一个简单的lambda?

A不知道     B知道很少    C知道一些    D非常了解

18 C#中class与struct区别?

A不知道     B知道很少    C知道一些    D非常了解

19 是否听说过或者了解MEF, Unity, Prism?

A不知道     B知道很少    C知道一些    D非常了解

20 面向对象设计思想/原则有哪些?(SOLID)

A不知道     B知道很少    C知道一些    D非常了解

21 如何实现一个plugin插件可扩展系统?

A不知道     B知道很少    C知道一些    D非常了解

22 DotNet中的LinkedList与SortedList有什么不同?内部如何实现?

A不知道     B知道很少    C知道一些    D非常了解

23 设计一个字符串类(不能使用类库中的string class)?简要说明关键方法

A不知道     B知道很少    C知道一些    D非常了解

posted @ 2011-07-26 14:40 林志玲 阅读(525) 评论(2) 编辑

代码来自ILSpy分析结果,与实际代码可能有些微出入。手写版http://min.us/mqjnYB

从下面可以看到,LinkedList是双向链表,但是SortedList实际上使用的还是数组。

而SortedDictionary与SortedSet关系非常紧密。

----------------------------------------------------------

----------------------------------------------------------

LinkedList<T> 通过双向链表这种数据结构实现。

关键数据成员:LinkedListNode head;

很显然这是链表的头。每个Node会有Previous以及Next这样的property。

Find()功能通过遍历List实现,所以是O( n )

----------------------------------------------------------

----------------------------------------------------------

Queue<T> 先进先出的队列。

关键数据成员: T[] _array; 毫无疑问,是通过数组来存放数据。

_tail; _head; _size;

有头有尾有大小,基本就是这样。

关键操作Enqueue()入队列 Dequeue()出队列。

----------------------------------------------------------

----------------------------------------------------------

SortedDictionary<T> 键值对字典数据类型,接口是IDictionary<TKey, TValue>。

内部关键数据成员TreeSet< KeyValuePair<TKey, TValue> > _set;

而TreeSet继承了SortedSet,操作基本上都是通过类似这样:第一个值使用Key,第二个值使用Default(TValue) 构造产生,然后调用_set的相关操作。

----------------------------------------------------------

----------------------------------------------------------

SortedList<T> 排序列表

TKey[] keys;

TKey[] values;

_size;

Add(),通过Array.BinarySearch<TKey>找到索引位置,然后进行插入操作。O(log n)。

----------------------------------------------------------

----------------------------------------------------------

另外要说一下,这里面的比较都是使用了IComparer,这实际上使用了设计模式中的策略模式,让用户可以自己定制。默认情况下是使用Comparer<T>.Default.

----------------------------------------------------------

----------------------------------------------------------

SortedSet<T>

关键数据成员:SortedSet<T>.Node root;

插入操作为AddIfNotPresent()这个函数名字已经说明了一切。

内部构造使用的数据结构为红黑树(一种自平衡二叉搜索树),有IsBlack和IsRed,以及Left、Right这些property。

搜索、插入、删除都是O(log n)。

----------------------------------------------------------

另外要注意其中的Reverse()函数,使用了yield return xxx;以及yield break;这两种用法。

----------------------------------------------------------

----------------------------------------------------------

Stack<T>

T[] _array; 后进先出,没啥可说的。

----------------------------------------------------------

HashSet<T>

关键数据成员:

int[] m_buckets;

HashSet<T>.Slot[] m_slots;

----------------------------------------------------------

Slot的定义如下:

internal struct Slot
{
  internal int hashCode;
  internal T value;
  internal int next;
}

搜索或者是插入算法基本上是这个路子:

----------------------------------------------------------

int num = this.InternalGetHashCode(value);
for (int i = this.m_buckets[num % this.m_buckets.Length] - 1; i >= 0; i = this.m_slots[i].next)
{
   //if (this.m_slots[i].hashCode == num && this.m_comparer.Equals(this.m_slots[i].value, value))

}

----------------------------------------------------------

这里是搜索,先算出一个哈希值,然后判断在那个桶中,拿到桶里面第一个元素(this.m_slots[i])。

然后通过next这个成员变量来获取下一个索引位置,然后对hash代码以及通过comparer比较。

(图片来自http://en.wikipedia.org/wiki/Hash_table

----------------------------------------------------------

插入操作也差不多,在这里面有一个this.m_freeList(一个int整数)保存了空闲列表位置,

然后把要插入的元素放在这个列表位置,再把m_freelist设置为这个列表位置的next。

因为空间可能不是连续的,所以我们使用的m_freelist这个位置与next未必是紧挨着的关系。

这个空闲列表的next关系维护,是由IncreaseCapacity()函数完成。其实C语言中的malloc函数也可以这样简单实现(当然实际中malloc肯定是复杂的多得多得多)。

----------------------------------------------------------

----------------------------------------------------------

ILSpy是个好东西,最新版本在这里下载http://www.ilspy.net/

posted @ 2011-07-21 22:37 林志玲 阅读(1030) 评论(1) 编辑

在”传智播客DotNet面试宝典(改).pdf“有这样一道非常有意思,也比较有深度的题目。

String s = new String("xyz");创建了多少个String实例?

传智的老师告诉同学们:答案是两个,一个是"xyz",一个是指向"xyz"的引用对象。

貌似很正确,很有道理。没错,"xyz"是一个字符串,而DotNet字符串(其实Java也是)有驻留intern这样一种机制。

抱歉的是,传智的老师没有料到,问这个问题的同学或者是公司太坏了。这道题的题目是错的,答案也不对。

大家手头有visualstudio的可以建立一个console程序试试看,能不能编译通过?!

至于答案为什么也不对,看看这篇非常详细的解释吧,虽然作者解释的是针对Java语言。

http://www.iteye.com/topic/774673

为什么Java能这样写?因为Java有这种构造函数String(String original)而DotNet中的String类没有。

稍微修改让它能够编译

        static void Main(string[] args)
        {
            char[] chars = { 'w', 'o', 'r', 'd' };
 
            String s2 = new String(chars);
            String s3 = new String(chars);
            int i = s2.Length;
            int j = s3.Length;
            Console.WriteLine(i + j);
        }

如果我们用ILSpy看,结果如下,注意,其中只调用了两次newobj,分别是针对s2和s3。

.method private hidebysig static
void Main (
string[] args
) cil managed
{
// Method begins at RVA 0x2058
// Code size 57 (0x39)
.maxstack 3
.entrypoint
.locals init (
  [0] char[] chars,
  [1] string s2,
  [2] string s3,
  [3] int32 i,
  [4] int32 j
)
IL_0000: ldc.i4.4
IL_0001: newarr [mscorlib]System.Char
IL_0006: dup
IL_0007: ldtoken field int64 '<PrivateImplementationDetails>{06FAE1C3-0E45-4AE7-A401-B8A7D1EFF5D6}'::'$$method0x6000001-1'
IL_000c: call void [mscorlib]System.Runtime.CompilerServices.RuntimeHelpers::InitializeArray(class [mscorlib]System.Array, valuetype [mscorlib]System.RuntimeFieldHandle)
IL_0011: stloc.0


IL_0012: ldloc.0
IL_0013: newobj instance void [mscorlib]System.String::.ctor(char[])
IL_0018: stloc.1

IL_0019: ldloc.0
IL_001a: newobj instance void [mscorlib]System.String::.ctor(char[])
IL_001f: stloc.2

IL_0020: ldloc.1
IL_0021: callvirt instance int32 [mscorlib]System.String::get_Length()
IL_0026: stloc.3

IL_0027: ldloc.2
IL_0028: callvirt instance int32 [mscorlib]System.String::get_Length()
IL_002d: stloc.s j

IL_002f: ldloc.3
IL_0030: ldloc.s j
IL_0032: add
IL_0033: call void [mscorlib]System.Console::WriteLine(int32)
IL_0038: ret
} // end of method Program::Main

posted @ 2011-07-21 20:48 林志玲 阅读(523) 评论(0) 编辑

我在推上发了一些牢骚,有些朋友来面试,基础不是很扎实,理由是自己一直做对日外包,没有机会提升自己,掌握一些基础内容。

另外一个理由是公司只用了某某技术,没有用某某技术,只用了2.0,所以我不知道3.5、4.0等等。

这都不是理由。

这都不是理由!

这时候我假设自己是一个对日外包企业的程序员,吃完饭后老婆在看电视,我拿起Thinkpad笔记本,登录进著名的MSDN,开始继续自我提升的步骤。

坚持每天抽出半小时到一小时学习,足够你提升自己的水平!

这次也不推荐书了,只要能上网,就每天看一段MSDN的文章或者代码。保证能提高自己!

首先要知道自己缺少什么,有一个评估很有意思也很容易评估自己需要提升哪些地方:《程序员能力矩阵》http://static.icybear.net/%5BCN%5DProgrammer%20competency%20matrix.htm 这里假定我想提升Windows平台上DotNet、CSharp开发。

这里有一系列链接可以学习,每天一篇或者几天一篇应该没问题。其实比较好的办法是买本书系统学习,但我这里想说的是,资料到处都是,书籍唾手可及。

没用心不努力才是水平差基础薄弱的最大原因!

下面的链接没有什么系统性,如果有一两年经验了,看这些东西问题不大。

http://msdn.microsoft.com/en-us/library/3bwa4xa9.aspx Using Objects That Encapsulate Resources

这一篇要着重提一下,很多四五年经验的C#开发者,不知道using关键字的这种用法,怎么说呢,说你不求甚解好呢?还是说你不够努力好呢?

http://msdn.microsoft.com/en-us/library/dd642420.aspx Visual Studio 2010 Visual Basic and Visual C#

http://msdn.microsoft.com/en-us/library/618ayhy6.aspx C# Reference

http://msdn.microsoft.com/en-us/library/67ef8sbd.aspx C# Programming Guide

http://msdn.microsoft.com/en-us/library/dd460655.aspx Programming Concepts

http://msdn.microsoft.com/en-us/library/w0x726c2.aspx .NET Framework 4

http://msdn.microsoft.com/en-us/library/w0x726c2%28VS.90%29.aspx .NET Framework 3.5

http://msdn.microsoft.com/en-us/library/ff921347.aspx EnterpriseLibrary Unity MEF Prism这些概念,至少知道它们是什么

http://msdn.microsoft.com/zh-cn/magazine/default.aspx MSDN杂志

http://msdn.microsoft.com/en-us/library/orm-9780596516109-03.aspx C# 3.0 Cookbook, Third Edition: More than 250 solutions for C# 3.0 programmers

http://msdn.microsoft.com/en-us/library/orm-9780596527730-01.aspx C# 3.0 Design Patterns: Use the Power of C# 3.0 to Solve Real-World Problems

http://msdn.microsoft.com/en-us/library/k5532s8a.aspx .NET Framework 4 CLR Managed Execution Process

http://msdn.microsoft.com/en-us/library/f144e03t.aspx Automatic Memory Management (GC)

http://msdn.microsoft.com/en-us/library/ee787088.aspx Fundamentals of Garbage Collection

http://msdn.microsoft.com/en-us/library/ms404247.aspx Weak References

http://msdn.microsoft.com/en-us/library/ms172334.aspx Reflection and Generic Types

http://msdn.microsoft.com/en-us/library/a4a92379.aspx Accessing Custom Attributes

http://msdn.microsoft.com/en-us/library/ff519622.aspx Observer Design Pattern Best Practices

http://msdn.microsoft.com/en-us/library/sd10k43k.aspx Interoperating with Unmanaged Code

http://msdn.microsoft.com/en-us/library/hyz69czz.aspx Managed Threading Basics

http://msdn.microsoft.com/en-us/library/ms973850.aspx Microsoft .NET Framework FAQ

http://msdn.microsoft.com/en-us/library/ms973837.aspx Garbage Collector Basics and Performance Hints

http://msdn.microsoft.com/en-us/library/bb985748.aspx Displaying Metadata in .NET EXEs with MetaViewer

http://msdn.microsoft.com/en-us/library/ms973858.aspx Writing High-Performance Managed Applications : A Primer

http://msdn.microsoft.com/en-us/magazine/cc164086.aspx Implementing Coroutines for .NET by Wrapping the Unmanaged Fiber API

http://msdn.microsoft.com/en-us/library/aa479866.aspx Generics FAQ: .NET Framework

http://msdn.microsoft.com/en-us/library/aa479858.aspx Generics FAQ: Best Practices

http://msdn.microsoft.com/en-us/library/aa479859.aspx Generics FAQ: Fundamentals

http://msdn.microsoft.com/en-us/library/aa302329.aspx Improving String Handling Performance in .NET Framework Applications

http://msdn.microsoft.com/en-us/library/ms973880.aspx The Microsoft Shared Source CLI Implementation Refresh

http://msdn.microsoft.com/en-us/library/bb985613.aspx Migrating Native Code to the .NET CLR

http://msdn.microsoft.com/en-us/magazine/cc164123.aspx Calling Win32 DLLs in C# with P/Invoke

http://msdn.microsoft.com/en-us/magazine/cc164139.aspx The CLR’s Thread Pool

http://msdn.microsoft.com/en-us/magazine/cc164094.aspx Introducing Generics in the CLR

http://msdn.microsoft.com/en-us/library/ms973893.aspx Object Serialization in the .NET Framework

http://msdn.microsoft.com/en-us/library/ms973872.aspx An Overview of Managed/Unmanaged Code Interoperability

http://msdn.microsoft.com/en-us/library/ms973838.aspx Performance Considerations for Run-Time Technologies in the .NET Framework

http://msdn.microsoft.com/en-us/library/ms973839.aspx Performance Tips and Tricks in .NET Applications

http://msdn.microsoft.com/en-us/library/aa302338.aspx Primary Interop Assemblies (PIAs)

http://msdn.microsoft.com/en-us/library/bb264782.aspx Profiler Stack Walking in the .NET Framework 2.0: Basics and Beyond

http://msdn.microsoft.com/en-us/library/aa302324.aspx Using the .NET Framework SDK Interoperability Tools

http://msdn.microsoft.com/en-us/library/ms973826.aspx Using the ECMA Standards: An Interview with Miguel de Icaza

posted @ 2011-07-13 00:32 林志玲 阅读(4153) 评论(25) 编辑

博客园cnblogs不知为何最近开始渐有C语言开发重启的迹象,不少人开始写一些C语言的教程。

其中看到一段有趣的留言,提到这个写法:if (p == NULL),

有人说这是不好的~,经典不提倡的~,会写错出问题的~,华为都禁止的~。

我倒是有些不同的看法。

首先这种写法是有问题,一般来讲对于空指针可以这样写

if ( p )

或者反义是这样 if ( !p )

既简单,还节省字数。

如果是想写的比较容易懂,那么if (p == NULL) 是我提倡的方式。

你可以很简单的读成“如果p等于空值”,反过来的方式NULL==p就有些别扭,不是给人看的。

有人提到p==NULL很容易写成p=NULL,代码出错啦!会有bug啦!

好吧,我承认这是一种可能性,在早期编译器不完善的时候的确如此。那时候还提倡用匈牙利命名法,因为编译器对类型识别支持不好,很容易写出胡乱转型的代码(当然现在的C语言也容易)。但是针对正在使用的编译器以及将来更先进的编译器,在条件判断中使用p==NULL不是问题。

做一个很简单的实验,使用VC2010,项目设置为compile as C,注意关键一点“把warning级别提高到最高级别4”,这时候if (p=NULL )会得到如下警告:

1>purec.cpp(10): warning C4706: assignment within conditional expression

很简单吧,不需要你使用那种反人类常识的代码规范。

使用GCC(v4.5.2 in Ubuntu11.4)也很容易,它有一个编译选项-Wall,警告信息如下:

/home/sun/foobar-sample/main.c:24:2: warning: suggest parentheses around assignment used as truth value

如果工具支持,为何不使用一种更为合乎阅读习惯的方式呢,BTW,我查找了一下经典的K&R,其中==的使用都是我提到的p==0这种方式,其它更为经典的(有么?)我就不知道了。

posted @ 2011-07-05 20:57 林志玲 阅读(1235) 评论(8) 编辑
摘要: 代码放在https://gist.github.com/921076 上了,看不到的请留言。第一个心得,是我看某本书提到,IList用起来要比ArrayList快。这里面用到了我上一篇博客提到的高精度计时器(在这里能看到代码 http://sunxiunan.com/?p=1829 )在开始定义了两个类。//--------------------- // public class List : IList, ICollection, IEnumerable, IList, ICollection, IEnumerable class CFromList : List{} // public 阅读全文
posted @ 2011-04-15 23:55 林志玲 阅读(2283) 评论(18) 编辑
摘要: 最近CoolShell连续发了两篇文字,《如何学习C语言》以及《如何学习C++》。我在twitter发了一些牢骚,因为我也曾经写过一篇《漫谈C语言及如何学习C语言》http://sunxiunan.com/?p=1661 ,文字写的还算用心,可惜反响不是很热烈。最近C++社区最大的新闻,毫无疑问就是最新标准终于Final Draft了,C++2011终于有望实现。可是,谁会关心呢?国内C++译作圈比较出名的就这几个人,刘未鹏PongBa,自从进入微软以后好像更加关注心智方面的研究,关于C++的文字几乎就没了。孟岩http://blog.csdn.net/myan 也是很久没有新博客文字,也少见阅读全文
posted @ 2011-03-31 11:29 林志玲 阅读(2823) 评论(10) 编辑
摘要: 我的iPad系统是iOS4.3没有越狱,推荐下面这些免费软件给各位iPad玩家。这些软件都是通过美国app store下载来的,不用信用卡注册一个美国app store其实很简单,就是购买一个free的软件就行了。某些情况下也许需要翻墙。下面推荐的软件都是免费的,在app store中可以搜索名字找到下载。不需要越狱也不需要破解,基本上已经满足了我日常需求。先说说我觉得应该有但是现在还不够好(或者我还不知道的)软件:1)浏览器,safari无法浏览桌面版google reader,太惨了,是我最不可容忍的。Firefox或者Chrome有iOS版本么?或者有什么软件浏览google reade阅读全文
posted @ 2011-03-24 10:43 林志玲 阅读(6323) 评论(8) 编辑
摘要: hanselman这篇文章很有意思,尽管不是每个问题都很值得作为面试问题出现,但是很多都值得去仔细想想。一个优秀的面试问题,尤其是针对Senior Engineer的面试问题,不应该仅仅是问某个api的用法,某个很容易从帮助中找到的内容。有发散性,可以基于问题进行扩展的问题才是一个比较好的问题。下面是一个非常长的问题列表,主要是关于面向对象设计,设计模式,以及一些实际工程中会用到概念,都是比较基本的,但是也非常能考察一个高级工程师的水平,因为会牵涉到非常多方面。另外要说明的是下面很多概念性问题可以直接从wiki维基百科上找到答案。另外我会标记出个人觉得比较值得问的问题。原文在这里 http:/阅读全文
posted @ 2011-02-23 23:35 林志玲 阅读(3637) 评论(4) 编辑
摘要: Node.js现在非常活跃,相关生态社区已经超过Lua(基本上比较知名的功能都有nodejs模块实现)。但是我们为何要使用Node.Js?相比传统的webserver服务模式,nodejs有什么优点优势?Node.Js是基于javascript语言,建构在google V8 engine以及Linux上的一个非阻塞事件驱动IO框架。nodejs是单进程单线程,但是基于V8的强大驱动力,以及事件驱动模型,nodejs的性能非常高,而且想达到多核或者多进程也不是很难(现在已经有大量的第三方module来实现这个功能)。这里主要不是介绍nodejs具体应用代码,而是想介绍一下事件驱动编程。在这篇文章阅读全文
posted @ 2011-02-01 18:43 林志玲 阅读(2823) 评论(7) 编辑