文章

程序员的爱情

在吃饭的时候看完了《程序员的爱情》,心里总觉得想写点什么,却没有明确的主题。 故事主人公陈旭,大学毕业后去了一家不错的公司,结识了老员工张朝阳。两年后认识了杨若依,两人在一起三年,计划结婚——陈旭已经买了房。突然有一天,杨若依告诉他全家要移民加拿大。这段感情就此终结。后来一次醉后,陈旭与邻居青青在一起。结尾是张朝阳车祸去世,陈旭听从母亲的要求,准备与青青结婚。 故事没有跌宕起伏的情节,唯一突兀的就是杨若依的突然离开。很多场景描写似乎埋下伏笔却没有后续发展。张朝阳的突然死亡也很唐突。 然而作者想,这就是生活——以真实原型为基础,写的很真诚。生活本就是混乱的、没有理性的。大团圆结局是每个人的梦想,却很难成为现实。 房子 那个西班牙《世界报》的评论说的很好:中国的高房价毁灭了年轻人的爱情,也毁灭了年轻人的想象力。在 20 到 30 岁事业刚起步的阶段,需要承担社会和家庭的重任。一个男人无力给自己爱的女人一个温暖的家,无论如何都会愧疚。 爱情 作者曾憧憬真正的爱情,却从未真正感受过书中描述的那种芬芳。杨若依的离开原因从未说明。这就是现实中的爱情——充满了毫无道理的不可确定性。 理想 陈旭刚参加工作时很有热情——加班很快乐,经理的表扬、客户的认可都让他高兴。后来他变成了一个瘦子,没时间陪女朋友购物,与房东周旋,买一套 80 平两居室需要三年不吃不喝才够首付。理想只有在进入社会后还能保持刚入行时的心态,才算数。 婚姻 书中给了一个精妙的比喻:爱情就像小时候的理想,给了人生活的希望;而婚姻好比现在的工作,满足了日常需求,却谈不上宏大。张朝阳说他结婚就是为了结婚,不知道为什么结婚。 作者最后说:这本书标题只是代号。这只是普通人的爱情,包含激情、浪漫以及悲剧色彩。

2014年2月5日 · 1 分钟 · 736 字

配合HtmlAgilityPack获取页面中所有图片

解析 HTML 的 DOM 结构乍一看并不是多难的事情,但现实中的 HTML 有很多兼容性问题。HtmlAgilityPack 这个开源库可以很好的帮我们处理这些问题。 核心步骤: 使用 HttpClient 获取页面源码 将 HTML 载入 HtmlDocument 对象 使用 XPath(//img)配合 SelectNodes 查找所有 标签 遍历节点输出 src 属性 示例代码片段: csharp var doc = new HtmlDocument(); doc.LoadHtml(html); var images = doc.DocumentNode.SelectNodes("//img"); foreach (var img in images) { Console.WriteLine(img.GetAttributeValue("src", "")); } HtmlAgilityPack 已经帮我们把最恶心的工作做完了。解析 HTML 本身不需要自己去实现,用现成的库即可。

2014年2月5日 · 1 分钟 · 482 字

Microsoft Windows是怎么处理I/O操作的

同步 I/O 当程序调用 FileStream.Read 时: 线程切入到用户模式本地代码,内部调用 Win32 ReadFile ReadFile 构建 I/O 请求包(IRP),包含文件句柄、偏移量、缓冲区地址和长度 IRP 被传递到 Windows 内核,内核将其路由到对应设备的 IRP 队列 设备驱动将 IRP 送到物理硬件 调用线程被挂起休眠——浪费了用户模式栈、内核模式栈、线程环境块(TEB)等资源 GUI 应用会直接失去响应 硬件完成后,Windows 唤醒线程,沿调用链返回结果 异步 I/O 使用 FileStream.ReadAsync 配合 FileOptions.Asynchronous: 前 4 步一样(构建并传递 IRP) 但线程不阻塞,立即沿原路返回 方法返回一个 Task 对象,而不是实际数据 硬件完成 IRP 后,将结果放入 CLR 线程池 线程池稍后执行 continuation 代码完成任务 性能对比 以木桶原理来看:10 个请求 × 5 秒每个 = 同步需要 50 秒,异步只需要 5 秒(总时长等于最长的单个操作)。 Silverlight 和 Windows Store 应用强制要求使用异步 I/O,以防止 GUI 线程阻塞。 ...

2013年10月10日 · 1 分钟 · 542 字

单例模式以及在C#中的使用

GoF《设计模式》中这样描述单例模式:保证一个类仅有一个实例,并且要提供一个全局访问点来访问这个实例。 基本实现 csharp public class Singleton { private static Singleton _instance; private Singleton() { } public static Singleton GetInstance() { if (_instance == null) _instance = new Singleton(); return _instance; } } 线程安全问题 当两个线程同时调用 GetInstance() 时,可能产生多个实例。使用双检锁(double-check locking)解决: csharp private static readonly object syncObject = new object(); public static Singleton GetInstance() { if (_instance == null) { lock (syncObject) { if (_instance == null) _instance = new Singleton(); } } return _instance; } ...

2013年2月5日 · 2 分钟 · 1036 字