春天,常常是万物复苏的日子,是以这段时间喜欢去各种地方赏花阅景。相比起三月中旬里裹挟着清冷的青龙寺,此刻到处人山人海的景象,仿佛洋溢着某种热闹的气息。从前读朱自清的《荷塘月色》,一直不明白“热闹是他们的,我什么都没有”这句话该做何解。当你面对梨花胜雪、桃花人面的景致的时候,心中却是如灰烬一般孤独的时候,大概终于明白,为何在熙熙攘攘的人群中会感到一丝清冷,因为唯有行走在人群里的时候,你会发现原来你一个人走了这么久。天地间万事万物更迭交替,本来是自然界中最普通的规则,可是如果每年的这个时候,你都是一个人去看这山山水水,相比时空上的孤寂感,人的孤寂感会更为强烈,“良辰美景奈何天,赏心乐事谁家院”,外面的世界再纷繁多变,对你而言不过是活着的时间。
作为一个反主流的开发者,在某种程度上,我对传统关系型数据库一直有点“讨厌”,因为关系型数据库实际上和面向对象思想是完全冲突的,前者建立在数学集合理论的基础上,而后者则是建立在软件工程基本原则的基础上。虽然传统的 ORM、序列化/反序列化在一定程度上解决了这种冲突,但是软件开发中关于使用原生 SQL 语句还是使用 ORM 框架的争论从来没有停止过。可是实际的业务背景中,是完全无法脱离数据库的,除非在某些特定的场合下,考虑到信息安全因素而禁止开发者使用数据库,在主流技术中数据库是一个非常重要的组成部分。为了弥补这个技术上的短板,从这篇文章开始,我将会学习一个经典的缓存技术:Redis。我们这里将 Redis 定性为一门缓存技术,这说明 Redis 和 MySQL 等主流的数据库存在本质上的区别,那么这些区别到底在哪里呢?或许在看完这个系列文章以后,你心中自然就会有了答案。
各位朋友大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是http://qinyuanpei.com。本文是“使用 C#开发 HTTP 服务器”系列的第六篇文章,在这个系列文章中我们实现了一个基础的 Web 服务器,它支持从本地读取静态 HTML 页面,支持 GET 和 POST 两种请求方式。该项目托管在我的Github上,项目地址为https://github.com/qinyuanpei/HttpServer,感兴趣的朋友可以前往了解。其间有朋友为我提供了 HTTPS 的 PR,或许这偏离了这个系列开发 HTTP 服务器的初衷,可是我们应该认识到普及 HTTPS 是大势所趋。所以在今天这篇文章中,我将为大家带来 HTTPS 相关知识的普及,以及如何为我们的这个 Web 服务器增加 HTTPS 的支持。
或许是今年的贺岁档电影全部遭遇“滑铁卢”的缘故,在这种情况下,电影《乘风破浪》或许会成为拯救整个贺一个岁档的奇迹。同往常一样,我依然选择一个人去看电影,而庆幸的是韩寒真的没有让我们失望。虽然前期在微博上经常看到韩寒在为这部电影做宣传,但我一直想知道它会一种什么样的方式来讲述这个故事,我隐隐约约觉得徐太浪(邓超饰)、徐正太(彭于晏饰)、小花(赵丽颖饰)三个人之间的关系非同寻常,我甚至臆想这是一部俗套的三角恋的故事。可结果却是完全出人意料的,我很喜欢这个故事。
近年来函数式编程这种概念渐渐流行起来,尤其是在 React/Vuejs 这两个前端框架的推动下,函数式编程就像股新思潮一般瞬间席卷整个技术圈。虽然博主接触到的前端技术并不算深入,可这并不妨碍我们通过类似概念的延伸来理解这种概念。首先,函数式编程是一种编程范式,而我们所熟悉的常见编程范式则有命令式编程(Imperative Programmming)、函数式编程(Functional Programming)、逻辑式编程(Logic Programming)、**声明式编程(Declarative Programming)和响应式编程(Reactive Programming)**等。现代编程语言 在发展过程中实际上都在借鉴不同的编程范式,比如 Lisp 和 Haskell 是最经典的函数式编程语言,而 SmartTalk、C++和 Java 则是最经典的命令式编程语言。微软的 C#语言最早主要借鉴 Java 语言,在其引入 lambda 和 LINQ 特性以后,使得 C#开始具备实施函数式编程的基础,而最新的 Java8 同样开始强化 lambda 这一特性,为什么 lambda 会如此重要呢?这或许要从函数式编程的基本术语开始说起。
最近 Visual Studio 推出 Mac 版本的消息迅速在技术圈里刷屏,当工程师们最喜欢的笔记本电脑 Mac,邂逅地球上最强大的集成开发环境 Visual Studio 的时候,会碰撞出怎样精彩的火花呢?在微软新任 CEO 纳德拉的“移动为先、云为先”战略下,微软的转变渐渐开始让人欣喜,从.NET Core、VSCode、TypeScript 再到近期的 Visual Studio For Mac,这一系列动作让我们感觉到,微软的技术栈越来越多地向着开源和跨平台两个方向努力。我们曾经固执地认为,微软的技术栈注定永远无法摆脱 Windows 的束缚,而事实上这个世界每天都在发生着变化。或许这次 Visual Studio 推出 Mac 版这件事情,本质上是微软收购的 Xamarin 公司旗下产品 Xamarin Studio 的一次改头换面。可是这件事情说明,微软正在努力让.NET 技术栈融入更多的应用场景。对我而言,我是没有钱去买一台 Mac 的,所以在这篇文章中,我们将在 Linux 下通过 Mono 和 VSCode 来打造一个轻量级的 IDE。而据说 Mono 会和 Xamarin 一样,将来会成为.NET 基金会的一部分。
其实我一直希望 Kindle 能够成为我知识管理的一部分,我们此刻所处的这个时代实则是一个信息爆炸的时代。我们每天都不得不去面对各种各样的信息,可这些信息中有多少是我们真正需要的呢?在一个信息碎片化的时代,有人说我们要懂得如何去利用碎片化的时间,有人说我们要懂得如何去高效查找需要的信息,微信和微博这类社交产品加速了信息的碎片化,或许当我们发现自己无法再集中精力去做一件事情的时候,我们就应该停下来反思如何去做好个人知识管理,我一直希望 Kindle 可以成为我知识管理的一部分,因为 Kindle 的阅读体验完全超越主流的电子设备,而且它可以让我们更加专注地去关注内容本身,Kindle 的同步机制为了提供了良好的知识管理契机,所以这篇文章我主要想分享我在以 Kindle 作为知识管理载体这件事情上的想法,希望对大家有所启发。
最初开始读这本书的时候,并没有想到这本书会讲这样一个故事,甚至它不像一本畅销书一样让人充满期待,可是当你逐渐理清整个故事的来龙去脉以后,或许你会喜欢这个故事甚至被这个这个故事所震撼。我从未对宗教意义上的朝圣进行过深入了解,我所知道的朝圣,比如每年伊斯兰教历的第十二月,都会有数以百万计的伊斯兰教徒前往麦加参与朝觐仪式,而国内每年都会有从各地前往布达拉宫下的大昭寺朝佛的佛教信徒,而对藏传佛教信众来说“叩长头”是最为至诚的礼佛方式之一。所以朝圣是一项具有重大的道德或者灵性意义的旅程或者探寻,它关乎对信仰的思考同时注重身体力行,因为朝圣者始终相信前往一个重要的地方,能够从中获得灵性或者是得到治愈。
最近在做的项目进入中期阶段,因为在基本框架结构确定以后,现阶段工作重心开始转变为具体业务逻辑的实现,在这个过程中我认为主要有两点,即保证逻辑代码的正确性和容错性、确定需求文档中隐性需求和逻辑缺陷。为什么我说的这两点都和用户需求这个层面息息相关呢?或许这和我这段时间的感受有些关系吧,我觉得当我们在面对用户提出的需求的时候,一个非常让我们不爽的一个地方是,我们总是需要花费大量的时间来和用户确定某些细节,而这些细节无论在 BRD 或者 PRD 中都无从体现。固然从用户层面上来讲,我们无法要求用户提供,详尽到每一个细节的需求文档。可我觉得这是一个修养的问题,我们习惯于宽以律己、严以待人,可是如果我们连自己都说服不了,我们该如何尝试去说服别人呢?我不认为我们就应该被用户限制自由,我们共同的目的都是想要好做一件事情,所以我们的关系应该是平等的伙伴的关系,这种上下级的、命令式的主仆关系让我感觉受到了侮辱。
其实一直想读《黑客与画家》这本书,所以在我买了 Kindle 以后,这本书就成为我读完的第一本书。本书作者是美国互联网界举足轻重、有“创业教父”之称的哈佛大学计算机博士保罗·格雷厄姆 (Paul Graham ),而这本书是由他的思考整理而成的一本文集,虽然这本书的名字叫做《黑客与画家》,可实际上作者在这本书中观点,并非局限于黑客与画家本身,相反地它涉及编程、软件、创业、财富、设计、研究等等多个领域。我认为这本书带给我的,更多的是一种思想上的提升,当我们沉迷在代码中无法自拔的时候,我们其实应该意识到,这个世界原本是由理性和感性两种认识混合而成的。当科技与人文发生碰撞进而共鸣,这本书会告诉你这一切是如此的美妙。
我不知道大家如何定义程序员这个工作,在我看来,在某种意义上,程序员和艺术家们具有相同之处,我们都是创作者,和诗人、画家、作家等等这些职业相近,我们都在试图创作出优秀的作品,我们借助编程语言来重构我们对这个世界的认识、借助抽象的概念来创造这个世界上不存在的东西,所以我们对自由和创造的渴望,来源自我们在这个世界上写下的第一行代码,或许这像是一个充满理想主义的臆想,可这并不重要,重要的是你如何看待这个世界、如何看待你自己,我更喜欢将程序员视为造梦者,就像每一个孩子在搭积木的时候,都有一个建筑师的梦一样,你可以选择让代码简洁、优雅,你同样选择让代码肮脏、丑陋,你相信什么,你执着什么,它就会是什么,所以为什么不给我们自己更多创造的机会。
或许我不是一个懂得如何去爱人的人,我时常陷入一种自我否定的焦虑当中,当我发觉自己喜欢上一个人的时候,从某种意义上它会让我身上的缺点被无情地放大,我并不畏惧在喜欢的人面前暴露这些缺点,因为这就是真实的我,因此我从来不喜欢去塑造别人,让别人成为我心目中期待的样子,可是我会忍不住去塑造我自己,尤其是在和别人相处的过程中,发现我身上的缺点或者问题的时候,我习惯了对自我严格,虽然我知道这个过程注定痛苦,可是你能告诉我,爱到底是什么吗?如果爱不足以让我们改变,我们喜欢的究竟是一个怎样的自己、怎样的别人?
最近需要给公司内部编写一个随机生成人员名单的小工具,在解决这个问题的过程中,我认识到这是一个概率相关的问题,即使在过去我曾经设计过类似转盘抽奖这样的应用程序,可我并不认为我真正搞清楚了这个问题,所以想在这篇文章中说说我对概率问题的相关思考。首先,我们来考虑这个问题的背景,我们需要定期在内部举行英语交流活动,可是大家的英语水差异悬殊,所以如果按照常规的思路来解决这个问题,即认为每个人被选中的概率是相等的话,实际上对英语不好的人是显得不公平的。其次,作为一个内部活动它需要的是营造一种氛围,让每个人参与到其中,所以它要求英语好的人有一个相对高的优先级,这样能够方便在活动开始前“破冰”,可是同时它需要让英语不好的人能够参与其中,所以这个问题该如何解决呢?这就是我们今天想要讨论的话题!
昨天下午,当她从公司办理完离职手续的时候,她在内部聊天工具上告诉我:“师父,我在公司的离职手续都办理完了,我要走了”。在那一瞬间,我突然非常平静地走过去对她说:“那就走吧”。我不知道她是不是想让我在她离开之前做些什么,或许这完全就是我的一厢情愿,因为她在此之前就明确地告诉我,她不喜欢我,所以这注定是一个悲伤的故事。一个月前,当她的同学从公司离职的时候,她就告诉我或许某一天她就离开这里了,当时我说我会想她的,而当她真正要离开的时候,我甚至都想不明白自己为什么会如此平静。下班路上同事 Kent 若有所思的告诉我,在我这个年龄“一见钟情”这种满足初恋情结的机会会越来越少,与其在感情的创伤中持续失落不如努力去争取一段新的开始。我惊诧于他突然间发现我隐藏在心底的秘密,我更加纠结于我丧失了喜欢一个人的能力。
各位朋友大家好,我是 Payne,欢迎大家关注我的博客,我的博客地址是http://qinyuanpei.com。最近因为项目上的原因开始接触 WPF,或许这样一个在现在来讲显得过时的东西,我猜大家不会有兴趣去了解,可是你不会明白对某些保守的项目来讲,安全性比先进性更为重要,所以当你发现银行这类机构还在使用各种“复古”的软件系统的时候,你应该相信这类东西的确有它们存在的意义。与此同时,你会更加深刻地明白一个道理:技术是否先进性和其流行程度本身并无直接联系。由此我们可以推论出:一项不流行的技术不一定是因为它本身技术不先进,或许仅仅是因为它无法满足商业化的需求而已。我这里的确是在说 WPF,MVVM 思想最早由 WPF 提出,然而其发扬光大却是因为前端领域近年来比较热的 AngularJS 和 Vue.js,我们这里表达的一个观点是:很多你以为非常新潮的概念,或许仅仅是被人们重新赋予了新的名字,当你理清这一切的来龙去脉以后,你会发现这一切并没有什么不同。这符合我一贯的主张:去发现问题的实质、不要被框架束缚、通过共性来消除差异,所以在今天这篇文章里,我想说说 WPF 中 MVVM 模式下命令与委托的关系。