基于 C# 中的 Trace 实现一个简单的日志系统

最近在做的项目进入中期阶段,因为在基本框架结构确定以后,现阶段工作重心开始转变为具体业务逻辑的实现,在这个过程中我认为主要有两点,即保证逻辑代码的正确性和容错性、确定需求文档中隐性需求和逻辑缺陷。为什么我说的这两点都和用户需求这个层面息息相关呢?或许这和我这段时间的感受有些关系吧,我觉得当我们在面对用户提出的需求的时候,一个非常让我们不爽的一个地方是,我们总是需要花费大量的时间来和用户确定某些细节,而这些细节无论在 BRD 或者 PRD 中都无从体现。固然从用户层面上来讲,我们无法要求用户提供,详尽到每一个细节的需求文档。可我觉得这是一个修养的问题,我们习惯于宽以律己、严以待人,可是如果我们连自己都说服不了,我们该如何尝试去说服别人呢?我不认为我们就应该被用户限制自由,我们共同的目的都是想要好做一件事情,所以我们的关系应该是平等的伙伴的关系,这种上下级的、命令式的主仆关系让我感觉受到了侮辱。

当黑客遇见画家

其实一直想读《黑客与画家》这本书,所以在我买了 Kindle 以后,这本书就成为我读完的第一本书。本书作者是美国互联网界举足轻重、有“创业教父”之称的哈佛大学计算机博士保罗·格雷厄姆 (Paul Graham ),而这本书是由他的思考整理而成的一本文集,虽然这本书的名字叫做《黑客与画家》,可实际上作者在这本书中观点,并非局限于黑客与画家本身,相反地它涉及编程、软件、创业、财富、设计、研究等等多个领域。我认为这本书带给我的,更多的是一种思想上的提升,当我们沉迷在代码中无法自拔的时候,我们其实应该意识到,这个世界原本是由理性和感性两种认识混合而成的。当科技与人文发生碰撞进而共鸣,这本书会告诉你这一切是如此的美妙。

像诗人一样睿智,像天才一样疯狂

我不知道大家如何定义程序员这个工作,在我看来,在某种意义上,程序员和艺术家们具有相同之处,我们都是创作者,和诗人、画家、作家等等这些职业相近,我们都在试图创作出优秀的作品,我们借助编程语言来重构我们对这个世界的认识、借助抽象的概念来创造这个世界上不存在的东西,所以我们对自由和创造的渴望,来源自我们在这个世界上写下的第一行代码,或许这像是一个充满理想主义的臆想,可这并不重要,重要的是你如何看待这个世界、如何看待你自己,我更喜欢将程序员视为造梦者,就像每一个孩子在搭积木的时候,都有一个建筑师的梦一样,你可以选择让代码简洁、优雅,你同样选择让代码肮脏、丑陋,你相信什么,你执着什么,它就会是什么,所以为什么不给我们自己更多创造的机会。

你了解爱的艺术吗?

或许我不是一个懂得如何去爱人的人,我时常陷入一种自我否定的焦虑当中,当我发觉自己喜欢上一个人的时候,从某种意义上它会让我身上的缺点被无情地放大,我并不畏惧在喜欢的人面前暴露这些缺点,因为这就是真实的我,因此我从来不喜欢去塑造别人,让别人成为我心目中期待的样子,可是我会忍不住去塑造我自己,尤其是在和别人相处的过程中,发现我身上的缺点或者问题的时候,我习惯了对自我严格,虽然我知道这个过程注定痛苦,可是你能告诉我,爱到底是什么吗?如果爱不足以让我们改变,我们喜欢的究竟是一个怎样的自己、怎样的别人?

一个关于概率的问题的思考

最近需要给公司内部编写一个随机生成人员名单的小工具,在解决这个问题的过程中,我认识到这是一个概率相关的问题,即使在过去我曾经设计过类似转盘抽奖这样的应用程序,可我并不认为我真正搞清楚了这个问题,所以想在这篇文章中说说我对概率问题的相关思考。首先,我们来考虑这个问题的背景,我们需要定期在内部举行英语交流活动,可是大家的英语水差异悬殊,所以如果按照常规的思路来解决这个问题,即认为每个人被选中的概率是相等的话,实际上对英语不好的人是显得不公平的。其次,作为一个内部活动它需要的是营造一种氛围,让每个人参与到其中,所以它要求英语好的人有一个相对高的优先级,这样能够方便在活动开始前“破冰”,可是同时它需要让英语不好的人能够参与其中,所以这个问题该如何解决呢?这就是我们今天想要讨论的话题!

一见钟情,无疾而终

昨天下午,当她从公司办理完离职手续的时候,她在内部聊天工具上告诉我:“师父,我在公司的离职手续都办理完了,我要走了”。在那一瞬间,我突然非常平静地走过去对她说:“那就走吧”。我不知道她是不是想让我在她离开之前做些什么,或许这完全就是我的一厢情愿,因为她在此之前就明确地告诉我,她不喜欢我,所以这注定是一个悲伤的故事。一个月前,当她的同学从公司离职的时候,她就告诉我或许某一天她就离开这里了,当时我说我会想她的,而当她真正要离开的时候,我甚至都想不明白自己为什么会如此平静。下班路上同事 Kent 若有所思的告诉我,在我这个年龄“一见钟情”这种满足初恋情结的机会会越来越少,与其在感情的创伤中持续失落不如努力去争取一段新的开始。我惊诧于他突然间发现我隐藏在心底的秘密,我更加纠结于我丧失了喜欢一个人的能力。

浅析 WPF 中 MVVM 模式下命令与委托的关系

各位朋友大家好,我是 Payne,欢迎大家关注我的博客,我的博客地址是http://qinyuanpei.com。最近因为项目上的原因开始接触 WPF,或许这样一个在现在来讲显得过时的东西,我猜大家不会有兴趣去了解,可是你不会明白对某些保守的项目来讲,安全性比先进性更为重要,所以当你发现银行这类机构还在使用各种“复古”的软件系统的时候,你应该相信这类东西的确有它们存在的意义。与此同时,你会更加深刻地明白一个道理:技术是否先进性和其流行程度本身并无直接联系。由此我们可以推论出:一项不流行的技术不一定是因为它本身技术不先进,或许仅仅是因为它无法满足商业化的需求而已。我这里的确是在说 WPF,MVVM 思想最早由 WPF 提出,然而其发扬光大却是因为前端领域近年来比较热的 AngularJS 和 Vue.js,我们这里表达的一个观点是:很多你以为非常新潮的概念,或许仅仅是被人们重新赋予了新的名字,当你理清这一切的来龙去脉以后,你会发现这一切并没有什么不同。这符合我一贯的主张:去发现问题的实质、不要被框架束缚、通过共性来消除差异,所以在今天这篇文章里,我想说说 WPF 中 MVVM 模式下命令与委托的关系。

在 Unity3D 中使用 uGUI 实现 3D 旋转特效

各位朋友大家好,欢迎大家关注我的博客,我是 Payne,我的博客地址是http://qinyuanpei.com。最近一位朋友问我,如何在 Unity 引擎中实现类似《英雄联盟》中选择皮肤时的 3D 滚动视图效果,虽然我非常不喜欢这个游戏,可是大学四年在宿舍里被周围同学们耳濡目染,对这个游戏中常见英雄的口头禅还是颇为熟悉的,曾经在周围同学的“硝烟”和“噪杂”中熬夜编程,此时此刻想起来大概是最能让我怀念和骄傲的记忆了。剑圣说“你的剑就是我的剑”,伊泽瑞尔说“是时候表演真正的技术了”,杰斯说“为了更美好的明天而战”……或许曾经的某一瞬间,我们曾经有过类似的让你我疯狂着迷的人生信条,可是不管怎样,我希望我们可以将这些永远地铭刻在心里,如同心中栽种下一棵红莲,在黑夜中静静地等待开放,这样当此去经年亦或时过境迁的时候,我们不会说是时光抹去了你我年轻的棱角,因为我相信真正的棱角会因为磨砺而变得更加明亮,绝对不会因为此刻的苟且就变的麻木甚至迷茫。好了,喝完我这碗心灵鸡汤,下面我们来一起学习如何在 Unity3D 中使用 uGUI 实现 3D 滚动视图效果。

Unity3D 游戏开发之在 uGUI 中使用不规则精灵制作按钮

各位朋友大家好,欢迎关注我的博客,我的博客地址是http://www.qinyuanpei.com。最近因为受到工作上业务因素影响,所以博主在 Unity 引擎上的研究有所停滞。虽然目前的工作内容和 Unity3D 没有直接的关联,可是我觉得工程师应该有这样一种情怀,即工作和兴趣是完全不同的两个概念。编程对我而言,首先是一种兴趣,其次是一份工作。所以我宁愿在每天下班以后继续研究自己感兴趣的东西,而非为了取悦这个世界、为了加班而加班。最近广电总局让整个游戏行业都坐立不安了,因为其新发布的一系列规定,让中国的独立游戏开发者怨声载道。可是我们更应该看到积极的一面是,无数的小游戏公司会在最近数月内大量消失,或许对中国野蛮生长的游戏行业这是一次“形式”上的整顿,可对我们开发者来说,在这个过程中努力提升自我、巩固基础永远比追求时髦、流行的技术或者框架有意义的多,因为热闹的从来都是昙花一现般的璀璨,而永恒的永远都是历久弥新的真理。好了,闲言少叙,今天我们的话题是在 uGUI 中使用不规则精灵制作按钮。

使用 C#开发 HTTP 服务器系列之更简单的实现方式

各位朋友大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是http://qinyuanpei.com。到目前为止,我已经发布了 3 篇 HTTP 服务器开发的系列文章。对我个人而言,我非常享受这个从无到有的过程,或许我现在写的这个 Web 服务器有各种不完美的因素,可是当有一天我需要一个轻量级的服务器的时候,我在无形中是不是比别人多了一种选择呢?我们常常提到“不要重复造轮子”,可事实上这并不能成为我们“不造轮子”的理由,虽然我们有各种各样的服务器软件、有各种各样的服务端框架可以供我们选择,可是在动手写这个系列文章前,我对 Web 服务器的印象无非是因为我是用 LAWP(Linux + Apache + MySQL + PHP)搭建过 Wordpress 博客而已。虽然在对动态页面(如.aspx、.jsp、.php 等)的处理上,可能会和静态页面有所不同,但是我庆幸我了解了这个过程以及它的内部原理,这种跨语言、跨平台的设计思路是任何框架或者标准都无法告诉我的。或许有人会问我,为什么不在最开始的时候就选择更简单的实现方法,那么在这篇文章中你将会找到答案。

使用 C#开发 HTTP 服务器系列之静态页面

各位朋友大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是http://qinyuanpei.com。在这个系列文章的第一篇中,我们着重认识和了解了 HTTP 协议,并在此基础上实现了一个可交互的 Web 服务器,即当客户端访问该服务器的时候,服务器能够返回并输出一个简单的“Hello World”。现在这个服务器看起来非常简陋,为此我们需要在这个基础上继续开展工作。今天我们希望为这个服务器增加主页支持,即当我们访问这个服务器的时候,它可以向我们展示一个定制化的服务器主页。通常情况下网站的主页被定义为 index.html,而在动态网站技术中它可以被定义为 index.php。了解这些将有助于帮助我们认识 Web 技术的实质,为了方便我们这里的研究,我们以最简单的静态页面为例。

使用 C#开发 HTTP 服务器系列之实现 Get 和 Post

各位朋友大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是http://qinyuanpei.com。在我们这个 Web 服务器有了一个基本的门面以后,我们是时候来用它做点实际的事情了。还记得我们最早提到 HTTP 协议的用途是什么吗?它叫超文本传输协议啊,所以我们必须考虑让我们的服务器能够接收到客户端传来的数据。因为我们目前完成了大部分的工作,所以对数据传输这个问题我们这里选择以最简单的 GET 和 POST 为例来实现,这样我们今天的重点就落实在 Get 和 Post 的实现这个问题上来。而从原理上来讲,无论 Get 方式请求还是 Post 方式请求,我们都可以在请求报文中获得其请求参数,不同的是前者出现在请求行中,而后者出现在消息体中。例如我们传递的两个参数 num1 和 num2 对应的数值分别是 12 和 24,那么在具体的请求报文中我们都能找到类似“num1=12&num2=24”这样的字符结构,所以只要针对这个字符结构进行解析,就可以获得客户端传递给服务器的参数啦。

使用C#开发HTTP服务器系列之构建RESTful API

 各位朋友大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是http://qinyuanpei.com。到目前为止,“使用C#开发HTTP服务器”这个系列系列文章目前已经接近尾声了,虽然我们在服务器功能的完整性(如支持并发、缓存、异步、Htts等)上没有再继续深入下去,可是我们现在已经具备了一个基本的服务器框架啦,所以更多深层次的问题就需要大家根据自己的需要来扩展了,因为写博客更多的是一种“记录-输出-反馈”的一个过程,所以我更希望大家在看完我的博客后能对我有所反馈,因为抄博客上的代码实在是太无聊啦!好了,保持愉悦的心情我们下面来引出今天的话题:构建RESTful API。RESTful API,这个概念或许你曾经听说过,可能它和我们所熟悉的各种Web息息相关,甚至在某种意义上来讲它并不是一种新的技术,而这一切的一切归根到底都是在问一个问题,即网站真的是Web的唯一形态吗?

使用 C# 开发 HTTP 服务器系列之 Hello World

各位朋友大家好,我是秦元培,欢迎大家关注我的博客。从今天起,我将开始撰写一组关于 HTTP 服务器开发的系列文章。我为什么会有这样的想法呢?因为人们对 Web 技术存在误解,认为网站开发是 Web 技术的全部。其实在今天这样一个时代,Web 技术可谓是无处不在,无论是传统软件开发还是移动应用开发都离不开 Web 技术,所以在我的认识中,任何使用了 HTTP 协议实现数据交互都可以认为是 Web 技术的一种体现,而且当我们提及服务器开发的时候,我们常常提及 Java 或者 PHP。可是这些重要吗?不,在我看来服务器开发和语言无关,和 IIS、Tomcat、Apache、Ngnix 等等我们熟知的服务器软件无关。Web 技术可以像一个网站一样通过浏览器来访问,同样可以像一个服务一样通过程序来调用,所以在接下来的时间里,我将和大家一起见证如何使用 C# 开发一个基本的 HTTP 服务器,希望通过这些能够让大家更好的认识 Web 技术。

扫描二维码在移动设备上浏览响应式页面

最近想尝试对一个 Ghost 博客主题进行移植,因为对一个后端程序员来说,进行前端方面的工作实在是个不小的挑战,而我对 CSS 更是有种与生俱来的恐惧感,所以我是非常喜欢Bootstrap和Materilize这种对后端程序员友好的前端框架。现在前端技术如火如荼,而前端技术作为最有可能实现跨平台技术的技术形态,相对原生技术有着更为灵活的适应性和扩展性,因此以响应式设计为代表的 Web 技术,能够让 Web 页面在不同尺寸屏幕上都有着相近的体验,因为目前软件开发基本都是在计算机设备上来完成的,这样我们在制作 Web 页面的时候就需要在不同的设备上进行调试,如果每次都将 Web 页面部署到远程服务器上,这样将浪费大量的时间而且容易将测试阶段的问题暴露给用户,因此本文将采用一种扫描二维码的方式来实现在移动设备上浏览响应式页面。

Built with Hugo v0.110.0
Theme Stack designed by Jimmy
已创作 267 篇文章,共计 1008057 字