<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_智慧掩盖真相我的微博</title><subtitle type="text">天之道，不争而善胜。</subtitle><id>http://feed.cnblogs.com/blog/u/18611/rss</id><updated>2012-04-09T09:30:49Z</updated><author><name>Birdshover</name><uri>http://www.cnblogs.com/birdshover/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/birdshover/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/18611/rss"/><entry><id>http://www.cnblogs.com/birdshover/archive/2010/12/17/1909375.html</id><title type="text">C# Socket 编程之 TcpListener</title><summary type="text">以下是Server的代码，最近在学习网络编程，一直在思考如何开发出高并发的服务器端。经常听说对服务器描述为同时10000个连接，就在想能否用C#写个这样的服务器出来呢。同步编程模型就不考虑了，来看看TcpListener的异步编程模型能否满足需求。以下是Client的代码：Client模拟多线程并发：从这个编程模型可以看出，高并发的服务器不光需要满足有多少个并发连接数，每秒创建多少个连接数也是个重要指标～～实际运行上看看，TcpListener每秒大概能创建两个连接，其他的连接会被拒绝，保持的长连接数1000的样子。很明显，TcpListener要被咔嚓掉了～～注意，以上代码仅仅是用来测·试连</summary><published>2010-12-17T07:59:00Z</published><updated>2010-12-17T07:59:00Z</updated><author><name>Birdshover</name><uri>http://www.cnblogs.com/birdshover/</uri></author><link rel="alternate" href="http://www.cnblogs.com/birdshover/archive/2010/12/17/1909375.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/birdshover/archive/2010/12/17/1909375.html"/><content type="html">&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;以下是Server的代码，最近在学习网络编程，一直在思考如何开发出高并发的服务器端。经常听说对服务器描述为同时10000个连接，就在想能否用C#写个这样的服务器出来呢。同步编程模型就不考虑了，来看看TcpListener的异步编程模型能否满足需求。&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="cnblogs_Highlighter"&gt;&lt;pre class="brush:csharp;collapse:true;;gutter:false;"&gt;public partial class COMService {private int maxLink = 100000;private int currentLinked;private ManualResetEvent tcpClientConnected = new ManualResetEvent(false);public void Start() {Thread thread = new Thread(new ParameterizedThreadStart(ShowStat));thread.IsBackground = true;thread.Start();TcpListener server = new TcpListener(new System.Net.IPEndPoint(0, 8090));server.Start(100);tcpClientConnected.Reset();IAsyncResult result = server.BeginAcceptTcpClient(new AsyncCallback(Acceptor), server);tcpClientConnected.WaitOne();}private void ShowStat(object o) {while (true) {lock (typeof(COMService)) {Console.WriteLine("当前连接数:" + currentLinked + "/" + maxLink);}Thread.Sleep(2000);}}private void Acceptor(IAsyncResult o) {TcpListener server = o.AsyncState as TcpListener;Debug.Assert(server != null);TcpClient client = null;try {client = server.EndAcceptTcpClient(o);System.Threading.Interlocked.Increment(ref currentLinked);} catch {}IAsyncResult result = server.BeginAcceptTcpClient(new AsyncCallback(Acceptor), server);if (client == null) {return;} else {Thread.CurrentThread.Join();}Close(client);}private void Close(TcpClient client) {if (client.Connected) {client.Client.Shutdown(SocketShutdown.Both);}client.Client.Close();client.Close();System.Threading.Interlocked.Decrement(ref currentLinked);}}}&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下是Client的代码：&lt;/p&gt;&lt;p&gt;&lt;div class="cnblogs_Highlighter"&gt;&lt;pre class="brush:csharp;collapse:true;;gutter:false;"&gt;public class ClientPool {private static List&amp;lt;TcpWork&amp;gt; clients = new List&amp;lt;TcpWork&amp;gt;();private static int freeCount;private static int workCount;private static int maxAllowed =2;private static int minClients = 2;/// &amp;lt;summary&amp;gt;/// create new instance/// &amp;lt;/summary&amp;gt;private ClientPool() {}private static ClientPool instance;private static readonly object syncInstanceObj = new object();public static ClientPool Singleton {get {if (instance == null) {lock (syncInstanceObj) {if (instance == null) {instance = new ClientPool();}}}return instance;}}private static readonly object syncObj = new object();public TcpWork GetClient() {try {TcpWork work = new TcpWork();work.Connect("127.0.0.1", 8090);work.LingerState = new LingerOption(false, 3);work.IsWork = true;work.Expired = false;workCount++;lock (syncObj) {clients.Add(work);}Console.WriteLine(workCount);return work;} catch (Exception ex){Console.WriteLine(ex.Message);return null;}}}&lt;/pre&gt;&lt;/div&gt;Client模拟多线程并发：&lt;/p&gt;&lt;p&gt;&lt;div class="cnblogs_Highlighter"&gt;&lt;pre class="brush:csharp;collapse:true;;gutter:false;"&gt;class Program {static void Main(string[] args) {for (int i = 0; i &amp;lt; 1000; i++) {ThreadPool.QueueUserWorkItem(new WaitCallback(Work), null);}Console.ReadKey();}private static void Work(object o) {ClientPool.Singleton.GetClient();}}&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;从这个编程模型可以看出，高并发的服务器不光需要满足有多少个并发连接数，每秒创建多少个连接数也是个重要指标～～&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;实际运行上看看，TcpListener每秒大概能创建两个连接，其他的连接会被拒绝，保持的长连接数1000的样子。很明显，TcpListener要被咔嚓掉了～～&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;注意，以上代码仅仅是用来测&amp;middot;试连接用的，这种写法会导致服务器端的连接无法释放~~~~&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/birdshover/aggbug/1909375.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/birdshover/archive/2010/12/17/1909375.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/birdshover/archive/2010/12/02/1894703.html</id><title type="text">选择结构(if..else..,switch,try..catch..)的拆分</title><summary type="text">编程中经常遇到很多条件，以及条件套条件的情况，以至于一个方法会写得非常地长。有多种方法可以规避这个问题。比如反射，策略模式，表驱动等等。先抛开这些方法不讲，从根本需求来探索这个过程。</summary><published>2010-12-02T09:17:00Z</published><updated>2010-12-02T09:17:00Z</updated><author><name>Birdshover</name><uri>http://www.cnblogs.com/birdshover/</uri></author><link rel="alternate" href="http://www.cnblogs.com/birdshover/archive/2010/12/02/1894703.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/birdshover/archive/2010/12/02/1894703.html"/><content type="html">&lt;p&gt;编程中经常遇到很多条件，以及条件套条件的情况，以至于一个方法会写得非常地长。有多种方法可以规避这个问题。比如反射，策略模式，表驱动等等。先抛开这些方法不讲，从根本需求来探索这个过程。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;一个switch结构可能是这样：&lt;/p&gt;&lt;p&gt;swicth(case)&lt;/p&gt;&lt;p&gt;case 1:&lt;/p&gt;&lt;p&gt;//do1&lt;/p&gt;&lt;p&gt;break;&lt;/p&gt;&lt;p&gt;case 2:&lt;/p&gt;&lt;p&gt;//do2&lt;/p&gt;&lt;p&gt;break;&lt;/p&gt;&lt;p&gt;.....&lt;/p&gt;&lt;p&gt;这里注释的do部分代码可能会是很多很多行，以及嵌套switch,if结构。&lt;/p&gt;&lt;p&gt;进一步，这个模型演化成&lt;/p&gt;&lt;p&gt;swicth(case)&lt;/p&gt;&lt;p&gt;case 1:&lt;/p&gt;&lt;p&gt;do1();&lt;/p&gt;&lt;p&gt;break;&lt;/p&gt;&lt;p&gt;case 2:&lt;/p&gt;&lt;p&gt;do2();&lt;/p&gt;&lt;p&gt;break;&lt;/p&gt;&lt;p&gt;.....&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;do1(){}&lt;/p&gt;&lt;p&gt;do2(){}&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;也就是将里面的代码模块化。这个方法有效的减小了一个方法的代码长度。实际上这就是一个映射关系的调用。建立映射关系，用Hash结构和delegate就可以避免使用switch了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;delegate void funtionptr();&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Dictionary&amp;lt;int, funtionptr&amp;gt; dict = new Dictionary&amp;lt;int, funtionptr&amp;gt;();&lt;/p&gt;&lt;p&gt;dict.Add(1,do1);&lt;/p&gt;&lt;p&gt;dict.Add(2,do2);&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;int&amp;nbsp;parm = 0;&lt;/p&gt;&lt;p&gt;if(dict.ContainKey(parm)){&lt;/p&gt;&lt;p&gt;dict[parm].Invoke();&lt;br /&gt;}&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;do1(){}&lt;/p&gt;&lt;p&gt;do2(){}&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;这个方法实际上就是表驱动，因为C#中一般不用指针，因此用delegate代替了指针的作用。而java中既没有指针也没有delegate怎么办呢?那就用接口模拟指针。&lt;/p&gt;&lt;p&gt;(这里就用C#的语法了，不使用JAVA了)&lt;/p&gt;&lt;p&gt;interface FactionFace{&lt;/p&gt;&lt;p&gt;void do();&lt;br /&gt;}&amp;nbsp;&lt;/p&gt;&lt;p&gt;class&amp;nbsp;FactionFaceImpl1 :&amp;nbsp;FactionFace{&lt;/p&gt;&lt;p&gt;public void do(){}&lt;br /&gt;}&amp;nbsp;&lt;/p&gt;&lt;p&gt;class&amp;nbsp;FactionFaceImpl2 :&amp;nbsp;FactionFace{&lt;/p&gt;&lt;p&gt;public void do(){}&lt;br /&gt;}&amp;nbsp;&lt;/p&gt;&lt;p&gt;Dictionary&amp;lt;int,&amp;nbsp;FactionFace&amp;gt; dict = new Dictionary&amp;lt;int,&amp;nbsp;FactionFace&amp;gt;();&lt;/p&gt;&lt;p&gt;dict.Add(1,new FactionFaceImpl1());&lt;/p&gt;&lt;p&gt;dict.Add(2,new&amp;nbsp;FactionFaceImpl2());&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;int&amp;nbsp;parm = 0;&lt;/p&gt;&lt;p&gt;if(dict.ContainKey(parm)){&lt;/p&gt;&lt;p&gt;dict[parm].do();&lt;br /&gt;}&amp;nbsp;&lt;/p&gt;&lt;p&gt;可以看出，实际上，上面的代码就是策略模式的简单实现了。（OH~~原理策略模式这么就来的～～）&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;可以看出，这里实际上是依靠一个字典来维护条件和调用的关系的。那如果没有这个字典来维护怎么办呢？代码再次演化：&lt;/p&gt;&lt;p&gt;interface FactionFace{&lt;/p&gt;&lt;p&gt;void do();&lt;br /&gt;}&amp;nbsp;&lt;/p&gt;&lt;p&gt;class&amp;nbsp;FactionFaceImpl1 :&amp;nbsp;FactionFace{&lt;/p&gt;&lt;p&gt;public void do(){}&lt;br /&gt;}&amp;nbsp;&lt;/p&gt;&lt;p&gt;class&amp;nbsp;FactionFaceImpl2 :&amp;nbsp;FactionFace{&lt;/p&gt;&lt;p&gt;public void do(){}&lt;br /&gt;}&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;string parm = "FactionFaceImpl2";&lt;/p&gt;&lt;p&gt;FactionFace ff =&amp;nbsp;Type.GetType(parm) as&amp;nbsp;FactionFace;&lt;/p&gt;&lt;p&gt;ff.do();&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;OH~~这就是简单的反射了。再复杂一些就可以搞成工厂模式，插件模式了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000;"&gt;可以看出，用字典来维护映射关系就可以避免使用反射。（这个是不是一般规律，贫道没本事证明，起码这里是适应的。）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;再来看try...catch...&lt;/p&gt;&lt;p&gt;delegate void forException(Exception ex);&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;public void forAException(Exception ex) {Console.WriteLine("AException");}&lt;br /&gt;public void forAAException(Exception ex) {Console.WriteLine("AAException");}&lt;br /&gt;public void forBException(Exception ex) {Console.WriteLine("BException");}&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;public void test() {&lt;/p&gt;&lt;p&gt;Dictionary&amp;lt;int, forException&amp;gt; dict = new Dictionary&amp;lt;int, forException&amp;gt;();&lt;/p&gt;&lt;p&gt;dict.Add(0, forAException);&lt;/p&gt;&lt;p&gt;dict.Add(1, forAException);&lt;/p&gt;&lt;p&gt;dict.Add(11, forAAException);&lt;/p&gt;&lt;p&gt;dict.Add(2, forBException);&lt;/p&gt;&lt;p&gt;try {&lt;/p&gt;&lt;p&gt;throw new AAException();&lt;/p&gt;&lt;p&gt;} catch (Exception ex)&amp;nbsp;&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;if (ex is OException) {&lt;/p&gt;&lt;p&gt;OException eex = ex as OException;&lt;/p&gt;&lt;p&gt;if (dict.ContainsKey(eex.Index)) {&lt;/p&gt;&lt;p&gt;　dict[eex.Index].Invoke(ex);&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;public class OException : Exception {public virtual int Index { get { return 0; } }}&lt;br /&gt;public class AException : OException {public override int Index {get {return 1;}}}&lt;br /&gt;public class AAException : AException {public override int Index {get {return 11;}}}&lt;br /&gt;public class BException : OException {public override int Index {get {return 2;}}&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;这里为啥要有个Index属性呢？其实就是建立个对应的关系，而不是靠名字去维护。去掉这个属性，直接使用ex.GeType()然后获取名字类名也一样可以建立对应关系。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/birdshover/aggbug/1894703.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/birdshover/archive/2010/12/02/1894703.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/birdshover/archive/2010/06/25/1764828.html</id><title type="text">该省代码的地方要省，反之亦然。</title><summary type="text">意大利输球了，睡不着阿！现在就剩下德国和阿根廷是比较喜欢的球队了。还是聊聊代码上的事情吧。什么地方该省代码？在我参与、开发和接触到的很多项目中，曾经都很喜欢在开始阶段做一个设计。这本身没有错，问题在于，经常在还没有用户或者网站总用户才几十万的场景下，去考虑高并发，去考虑高负载，去设计能够跑在N台服务器上的架构。现在想来这都没有错，不去尝试，不去思考就不会进步。当然，所考虑绝不是仅仅这一个问题，而是...</summary><published>2010-06-24T17:46:00Z</published><updated>2010-06-24T17:46:00Z</updated><author><name>Birdshover</name><uri>http://www.cnblogs.com/birdshover/</uri></author><link rel="alternate" href="http://www.cnblogs.com/birdshover/archive/2010/06/25/1764828.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/birdshover/archive/2010/06/25/1764828.html"/><content type="html">&lt;p&gt;意大利输球了，睡不着阿！现在就剩下德国和阿根廷是比较喜欢的球队了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;还是聊聊代码上的事情吧。什么地方该省代码？在我参与、开发和接触到的很多项目中，曾经都很喜欢在开始阶段做一个设计。这本身没有错，问题在于，经常在还没有用户或者网站总用户才几十万的场景下，去考虑高并发，去考虑高负载，去设计能够跑在N台服务器上的架构。现在想来这都没有错，不去尝试，不去思考就不会进步。当然，所考虑绝不是仅仅这一个问题，而是言必谈扩展性。积极地去考虑扩展性的问题，我一直认为是个好事情，假如我是老板，我一定会适当放松项目周期，以期让开发人员有更多的思考。事实上在我以期考虑这些问题的时候，我经常会把下班时间也用上，对公司其实并不一定吃亏。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;但现在想来是一个极端的表现。现在想来应该是当时对使用到的技术的各个方面：比如I/O吞吐能力、线程并发能力、网络并发能力、事物处理等等，对他们都一知半解或者干脆就不了解。另外两个最重要的方面在于对需求定位不清，以及总想一步到位。不要试图说你对需求的定位很清晰，实际上需求方都不一定完全把握。就比如项目的生命周期，整个项目组真的清楚了么？对使用的技术缺乏整体上的理论理解，才会让人不之所措，以至于过分关注性能等问题。出现性能问题也不能立刻把握瓶颈。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;跑题了，继续说说我对省代码和多写代码的理解。我认为，开发任何一个项目，只要不是一锤子买卖，都需要从整体进行把握。不但能有效地进行业务的后期扩展，也可以在协同中少走很多弯路。我认为只要不是自己能够把握的代码，都可以能省则省。那什么是自己不能把握的代码？举个离子，我开发一个项目需要用到B部门开发的一个系统，那么调用B部门系统的方式就是我不能把握的代码。更极端地说，如果B部门的系统还要依赖C部门开发的组件，那B不能都不能把握给我调用的方式，那自然我就更加不好把握。这种情况，就需要和需求方多沟通，让需求方于B、C部门保持沟通才能让我在开发时更加省力。这种情况一般把B给你的接口和你实际的调用方式分开更好。可以根据需求方的业务要求，制定自己需要的接口，然后再拿自己定义的接口和B部门提供的接口做适配。这样做有两个好处，没有他们的系统你也可以很方便地模拟数据进行单元测试，或者说是即便没有他们的系统，你的系统依然可以运行，只是不能用而已。另外一个好处是如果B部门的接口不影响你的接口调用的方式，就可以隔离掉对你的系统的影响。这样就将对B部门系统的依赖降到最低。一定要把整个过程当成两件事情，当整个团队确定要做一件事情，那先要保证你的事情做好了，然后再去看别人的事情做好没有。当然如果需求方在保持沟通过程中发现事情根本不能做，大家都放弃，那是最坏的打算。但不能因为这个理由而拖延项目的开发，以致项目延期。在这种场合就要多做设计，多写点代码，哪怕最后没用上都没关系。我做过的项目，没有中途不变更的，所以还是先考虑设计要紧。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;刚才说了不要过分关注对未来的扩展，因为你也不能保证你的设计就能符合未来的场景。但是有一些设计还是可以做的，比如，可以将你认为会影响性能的地方抽象化，先做简单的实现。如果在项目上线后发现确实是这里拖了后腿，改动的化也只要改实现而不用重新架构项目。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;那什么时候可以省代码呢？对那样根本不要重用或者很难重用的东西，可以考虑省代码，省设计。比如一个页面要以5种样子显示，老老实实地做5个页面就行了，不用过分地去设计。A页面显示10条数据3个字段，B页面显示.....如果做抽象设计会绕进去，我尝试过很多次，没有做到一个可以让我满意的方案出来。当然你也可以去尝试，我做不出不代表你做不出，呵呵。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;一般来说不需要做多种解决方案的也不要过渡地去设计。比如做个日志，你不是要把日志存储到N种设备上就不用考虑设备相关。诚然，做得象log4j那样确实很牛，但common-logging中也提供的简单的实现。一般来说，一个团队形成的积累不用过渡考虑你们根本用不上的场景，那只是增加负担。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/birdshover/aggbug/1764828.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/birdshover/archive/2010/06/25/1764828.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/birdshover/archive/2010/03/21/1691090.html</id><title type="text">dell笔记本的Broadcom 802.11b/g 无线网卡ubuntu 9.10下安装</title><summary type="text">本本的无线网卡驱动一直安装不上，搞的很不方便。查阅了大量资料，dell和broadcom官方都没有提供linux下的驱动。现有的驱动是b43,参考http://linuxwireless.org/en/users/Drivers/b43不过说明都是英文的不说，按照上面的方式安装最后出现了问题。汗~~~~~~~~反正就是没搞定.............这下没辙了。又仔细查看了自己的网卡芯片类型：$s...</summary><published>2010-03-21T10:29:00Z</published><updated>2010-03-21T10:29:00Z</updated><author><name>Birdshover</name><uri>http://www.cnblogs.com/birdshover/</uri></author><link rel="alternate" href="http://www.cnblogs.com/birdshover/archive/2010/03/21/1691090.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/birdshover/archive/2010/03/21/1691090.html"/><content type="text">本本的无线网卡驱动一直安装不上，搞的很不方便。查阅了大量资料，dell和broadcom官方都没有提供linux下的驱动。现有的驱动是b43,参考http://linuxwireless.org/en/users/Drivers/b43不过说明都是英文的不说，按照上面的方式安装最后出现了问题。汗~~~~~~~~反正就是没搞定.............这下没辙了。又仔细查看了自己的网卡芯片类型：$s...</content></entry><entry><id>http://www.cnblogs.com/birdshover/archive/2010/03/16/1687301.html</id><title type="text">四步完成跨平台调用——thrift的开发应用</title><summary type="text">一、安装thrift首先，你要有个Linux平台，反正安装好了就行，用不着太多的东西。thrift这个东东可以在http://www.thrift-rpc.org/下载。具体在http://www.thrift-rpc.org/?p=thrift.git;a=shortlog;h=refs/misc/instant，一般点第一个snapshot就行了，这是最新的。版本几个小时更新一个，太牛叉了。接...</summary><published>2010-03-16T07:48:00Z</published><updated>2010-03-16T07:48:00Z</updated><author><name>Birdshover</name><uri>http://www.cnblogs.com/birdshover/</uri></author><link rel="alternate" href="http://www.cnblogs.com/birdshover/archive/2010/03/16/1687301.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/birdshover/archive/2010/03/16/1687301.html"/><content type="text">一、安装thrift首先，你要有个Linux平台，反正安装好了就行，用不着太多的东西。thrift这个东东可以在http://www.thrift-rpc.org/下载。具体在http://www.thrift-rpc.org/?p=thrift.git;a=shortlog;h=refs/misc/instant，一般点第一个snapshot就行了，这是最新的。版本几个小时更新一个，太牛叉了。接...</content></entry><entry><id>http://www.cnblogs.com/birdshover/archive/2010/03/12/1684439.html</id><title type="text">facebookde 的 NoSQL数据库cassandra的配置与调用(java&amp;amp;&amp;amp;c#)</title><summary type="text">上次说了安装的问题，可以参考《VirtualBox 虚拟机 Debian系统上安装Cassandra步骤及遇到的问题》。当然，在windows下也可以使用，但是要设置JAVA_HOME参数，然后启动目录bin里的cassandra.bat。编辑cassandra.bat看到if NOT DEFINED CASSANDRA_HOME set CASSANDRA_HOME=%CD%改成if NOT D...</summary><published>2010-03-12T08:08:00Z</published><updated>2010-03-12T08:08:00Z</updated><author><name>Birdshover</name><uri>http://www.cnblogs.com/birdshover/</uri></author><link rel="alternate" href="http://www.cnblogs.com/birdshover/archive/2010/03/12/1684439.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/birdshover/archive/2010/03/12/1684439.html"/><content type="text">上次说了安装的问题，可以参考《VirtualBox 虚拟机 Debian系统上安装Cassandra步骤及遇到的问题》。当然，在windows下也可以使用，但是要设置JAVA_HOME参数，然后启动目录bin里的cassandra.bat。编辑cassandra.bat看到if NOT DEFINED CASSANDRA_HOME set CASSANDRA_HOME=%CD%改成if NOT D...</content></entry><entry><id>http://www.cnblogs.com/birdshover/archive/2010/03/10/1682837.html</id><title type="text">VirtualBox 虚拟机 Debian系统上安装Cassandra步骤及遇到的问题</title><summary type="text">本文记录一下我在VirtualBox 虚拟机 Debian系统上安装Cassandra步骤及遇到的问题。</summary><published>2010-03-10T10:51:00Z</published><updated>2010-03-10T10:51:00Z</updated><author><name>Birdshover</name><uri>http://www.cnblogs.com/birdshover/</uri></author><link rel="alternate" href="http://www.cnblogs.com/birdshover/archive/2010/03/10/1682837.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/birdshover/archive/2010/03/10/1682837.html"/><content type="text">本文记录一下我在VirtualBox 虚拟机 Debian系统上安装Cassandra步骤及遇到的问题。</content></entry><entry><id>http://www.cnblogs.com/birdshover/archive/2010/02/10/1667244.html</id><title type="text">大道化简，重构的艺术</title><summary type="text">这个题目貌似很大，有成为标题党人的嫌疑。其实我想说的是一些小事，就是我小时候经常去小渠里抓鱼。而抓鱼的方式也很简单，就是拿砖块，泥巴把小渠的两头堵起来，然后把中间的水舀出去。软件为什么要重构？那是因为你感觉不够好。之所以感觉不够好，原因可能会很多。我想，最严重的一个可能就是设计混乱。设计混乱牵扯的方面很多，有依赖上的，有调用上的。也有根本实现不了目的，或者很难扩展。有很多人重构时候干脆就是把代码重...</summary><published>2010-02-10T11:10:00Z</published><updated>2010-02-10T11:10:00Z</updated><author><name>Birdshover</name><uri>http://www.cnblogs.com/birdshover/</uri></author><link rel="alternate" href="http://www.cnblogs.com/birdshover/archive/2010/02/10/1667244.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/birdshover/archive/2010/02/10/1667244.html"/><content type="text">这个题目貌似很大，有成为标题党人的嫌疑。其实我想说的是一些小事，就是我小时候经常去小渠里抓鱼。而抓鱼的方式也很简单，就是拿砖块，泥巴把小渠的两头堵起来，然后把中间的水舀出去。软件为什么要重构？那是因为你感觉不够好。之所以感觉不够好，原因可能会很多。我想，最严重的一个可能就是设计混乱。设计混乱牵扯的方面很多，有依赖上的，有调用上的。也有根本实现不了目的，或者很难扩展。有很多人重构时候干脆就是把代码重...</content></entry><entry><id>http://www.cnblogs.com/birdshover/archive/2010/02/08/1665972.html</id><title type="text">读自己的书，走自己的路</title><summary type="text">本文只是阐述我自己的想法。而我在思考，如何寻求编程的道理，而不是仅仅掌握技术。在我的观点中，术是最初级的东西，由术形成学，而最终总是能反映为道。道是什么东西？在我看来，道并不复杂。术要远比道复杂。目前讲各种各样技术的书籍非常多，相信没有一个人全部读过。但是这些书说阐述的道却不是太多，也有可能根本就没有讲到道。各种各样从入门到精通之类的书籍就不说了，这些书籍很少涉及到道，基本上全部是讲术。是教你如何...</summary><published>2010-02-08T08:20:00Z</published><updated>2010-02-08T08:20:00Z</updated><author><name>Birdshover</name><uri>http://www.cnblogs.com/birdshover/</uri></author><link rel="alternate" href="http://www.cnblogs.com/birdshover/archive/2010/02/08/1665972.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/birdshover/archive/2010/02/08/1665972.html"/><content type="text">本文只是阐述我自己的想法。而我在思考，如何寻求编程的道理，而不是仅仅掌握技术。在我的观点中，术是最初级的东西，由术形成学，而最终总是能反映为道。道是什么东西？在我看来，道并不复杂。术要远比道复杂。目前讲各种各样技术的书籍非常多，相信没有一个人全部读过。但是这些书说阐述的道却不是太多，也有可能根本就没有讲到道。各种各样从入门到精通之类的书籍就不说了，这些书籍很少涉及到道，基本上全部是讲术。是教你如何...</content></entry><entry><id>http://www.cnblogs.com/birdshover/archive/2010/02/07/1665570.html</id><title type="text">厨师炒菜与网站反爬虫问题</title><summary type="text">上周部门同事中午一起吃饭时，有同事提到一个问题。具体这个问题干啥的忘记了，只记得是要你设计一个餐馆的工作流程。工作流程就啥也不说了，只是那天中午，我想到到的是合并炒菜。合并炒菜就是指，当某段时间内，如果有人要了同样的菜，那个这个菜就优先炒。当时就想，这在编程中和连接池很相似。而12月份在公司的挖宝任务中，就有一个关于反某IP在单位时间内访问次数的任务。当时想到的方法是在内存中建立一个列表，每次访问...</summary><published>2010-02-07T14:47:00Z</published><updated>2010-02-07T14:47:00Z</updated><author><name>Birdshover</name><uri>http://www.cnblogs.com/birdshover/</uri></author><link rel="alternate" href="http://www.cnblogs.com/birdshover/archive/2010/02/07/1665570.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/birdshover/archive/2010/02/07/1665570.html"/><content type="text">上周部门同事中午一起吃饭时，有同事提到一个问题。具体这个问题干啥的忘记了，只记得是要你设计一个餐馆的工作流程。工作流程就啥也不说了，只是那天中午，我想到到的是合并炒菜。合并炒菜就是指，当某段时间内，如果有人要了同样的菜，那个这个菜就优先炒。当时就想，这在编程中和连接池很相似。而12月份在公司的挖宝任务中，就有一个关于反某IP在单位时间内访问次数的任务。当时想到的方法是在内存中建立一个列表，每次访问...</content></entry></feed>
