2013 年度总结

时光荏苒,如果从大三时候在北京开始实习算起,这已经是我作为一个程序员的第四个年头了。重读加入现在公司以来的年终总结,感受自己的变化还是挺大的。在这里晒晒自己的心路历程,欢迎吐槽。

这是刚毕业那年刚来公司时候的总结(2013)。

 

2013 年度总结

20131231

1 回首往事

2013年就要过去了,对于我来说这可能是到目前为止经历过的最波折、最重要,也是最精彩的一年。这一年充满了迷茫与抉择,但它也给我留下了希望和回忆。从选择放弃以前的工作到返回大连,从学校毕业到待业,从海投简历到加入XX。回首过去,我希望能从中学到一些东西,发现一些问题和遗忘了的目标,然后为明天努力。

一年前的今天,当我坐在办公室的电脑前准备2012年的年终总结时,我在想,这究竟是不是一份我所热爱的工作。在那里,我感觉缺少了一些可以为之奋斗并点燃自己热情的东西,我感觉不到动力。我总在想那缺少的东西究竟是什么,那可能是自由,可能是激励,可能是希望,也可能是那里太过拥挤。那时候,我需要的也许就是一个理由,有了这个理由,我就会选择离开。

在那之后,我一边实习,一边开始学习JavaScript、MongoDB和C#,我为我的毕业设计选择了这些技术。我希望能做好我的毕设,让人生最美好的四年有个好点的结局。同时,我也真的为这些技术感到着迷。我觉得技术也是可以代表思想的,走不同的技术路线其实也是在践行自己的理想。虽然那时候我的工作是基于C++的开发,但是与C++的死气沉沉相比,我感觉到的是它们的活力,我觉得用它们可以实现自己的想法,而不是被令人厌烦的礼法所约束。所以,在那个时候,我希望有机会能找一份与之相关的工作。

再后来,到了7月,我毕业了。我的女朋友跟我一样,也不希望再回到北京。于是,我终于得到了那个理由,我离开了以前的公司,回到大连,然后从毕业陷入失业。我开始在网上选工作,但是没有任何回音。那可能是因为我不会日语,也可能是因为我毕业的学校不够响亮。总之,那段时间我体会到了因为找不到工作而天天在家过周末的绝望。但这也真的算是对我的当头棒喝,让我回到了现实,就像新闻里分析就业难的原因一样,是我自己的要求和期望太高了,我应该做的是沉下心,老实点。我开始海投简历,然后开始天天祈求上天能给我一个机会,我跟自己说,我没有白白浪费那四年,可为什么会穷途末路到连工作都没有的程度呢。直到一个月以后,XX给我打来了笔试电话。我非常努力的准备笔试,虽然我所准备的东西全都没考。一周后,我加入了公司,开始了全新的旅程。感谢上天,在这儿我不光得到了工作,还有我曾经期待的一切。

Continue reading

LISP的本质 (THE NATURE OF LISP)

作者 Slava Akhmechet
译者 Alec Jang
出处: http://www.defmacro.org/ramblings/lisp.html
简介

最初在web的某些角落偶然看到有人赞美Lisp时, 我那时已经是一个颇有经验的程序员。
在我的履历上, 掌握的语言范围相当广泛, 象C++, Java, C#主流语言等等都不在话下,
我觉得我差不多知道所有的有关编程语言的事情。对待编程语言的问题上, 我觉得自己不
太会遇到什么大问题。其实我大错特错了。

我试着学了一下Lisp, 结果马上就撞了墙。我被那些范例代码吓坏了。我想很多初次接触
Lisp语言的人, 一定也有过类似的感受。Lisp的语法太次了。一个语言的发明人, 居然不
肯用心弄出一套漂亮的语法, 那谁还会愿意学它。反正, 我是确确实实被那些难看的无数
的括号搞蒙了。

Continue reading

C#: 一个方法执行超时 timeout 检查的实现

我们经常有这样的需求:如果一个方法的执行,超过了一个设定时间(timeout)就需要立即返回不再继续,这里我利用 C# 异步委托的 AsyncWaitHandle 来尽量简便的实现这一需求。

具体实现如下。注意,这里需要被调用的方法遵守 delegate TR TimeOutDelegate(T param); 形式的方法签名,如有其他需要,可以自行定制也很方便。

namespace TimeOutHelper
{
    #region using directives

    using System;
    using System.Collections.Generic;
    using System.Globalization;
    using System.Linq;
    using System.Threading;

    #endregion using directives

    internal class Program
    {
        public delegate TR TimeOutDelegate<in T, out TR>(T param);

        private static void Main()
        {
            Dictionary<Guid, string> result;
            Console.WriteLine(TimeoutFunction.Execute(Test, "Hello, World!", out result, TimeSpan.FromSeconds(3)));
            Console.WriteLine("Hello, World!");
            Console.ReadKey();
        }

        public static Dictionary<Guid, string> Test(string sourceString)
        {
            var result = sourceString.ToDictionary(
                character => Guid.NewGuid(),
                character => character.ToString(CultureInfo.InvariantCulture));
            Thread.Sleep(4000);
            return result;
        }

        public static class TimeoutFunction
        {
            /// <summary>
            ///     Execute a method with timeout check
            /// </summary>
            /// <typeparam name="T">Target method parameter type</typeparam>
            /// <typeparam name="TR">The result type of execution</typeparam>
            /// <param name="timeoutMethod">Target method</param>
            /// <param name="param">Target method parameter</param>
            /// <param name="result">The result of execution</param>
            /// <param name="timeout">Set timeout length</param>
            /// <returns>Is timeout</returns>
            public static Boolean Execute<T, TR>(
                TimeOutDelegate<T, TR> timeoutMethod, T param, out TR result, TimeSpan timeout)
            {
                var asyncResult = timeoutMethod.BeginInvoke(param, null, null);
                if (!asyncResult.AsyncWaitHandle.WaitOne(timeout, false))
                {
                    result = default(TR);
                    return true;
                }
                result = timeoutMethod.EndInvoke(asyncResult);
                return false;
            }
        }
    }
}

IE 无法正常打开,刚启动就关闭

如果你的电脑出现了 IE 无法正常启动,总是刚一点击就自动关闭的情形。那么你可以通过以下步骤进行修改,开始 -> 运行 -> regedit ,进入注册表,在其中找到:

HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer

的 Main 主键,右键单击Main主键,选择“权限”,在弹出的权限设置对话框里点“高级”按钮,在高级窗口里点击下面的“启用继承”按钮,即可。

PowerShell: 隐藏明文密码

本文描述如何加密 PowerShell 中的敏感信息,从而避免敏感信息(诸如密码)在代码中被显式的展现出来。这里我们使用 ConvertFrom-SecureString 命令来完成加密操作,需要注意的是,如果我们没有指定Key,那么,将采用基于 Windows 内置的 DPAPI 进行数据的加密。这种情况下,原文的加密和解密必须在同一台机器上,且基于同一个User去进行。

ConvertFrom-SecureString [-SecureString] <SecureString> [[-SecureKey] <SecureString> ] [ <CommonParameters>]

你可以从这里了解该命令的更多信息。

* If no key is specified, the Windows Data Protection API (DPAPI) is used to encrypt the standard string representation.
Your secret was automatically encrypted by the built-in Windows data protection API (DPAPI), using your identity and your machine as encryption key. So only you (or any process that runs on your behalf) can decipher the secret again, and only on the machine where it was encrypted.
Continue reading

Memo: 关于 Windows 10 使用的几个小提示

前几个月把单位和家里的电脑都升级到了 Windows 10 ,升级很顺利,使用起来也非常流畅。这里有几个小提示大家可以参考下:
(个人十分建议执行全新安装,通过近2个月的使用,升级版的 Windows 10 还是会出现一些奇葩问题的,比如过了一段时间 Windows Explorer 和 Microsoft Edge 经常性的自动重启,Skype、百度输入法莫名卡死等问题,但是全新安装的版本,并没有出现过这一类的问题)

1 如果是从Windows 7/8 升级至 Windows 10 ,希望删除系统盘中旧版本Windows的文件(Windows.old),可以执行如下操作:
(1) 打开“这台计算机(This PC)”, 在C:盘上点击右键,选择属性
(2) 在常规页下,点击“磁盘清理(Disk Cleanup)”,稍等片刻后,点击新页面中的”清理系统文件(Clean up system files)”按钮
(3) 勾选中“以前版本的Windows安装(Previous Windows installation(s))”,点击确认,即可。

2 在使用Windows 10的过程中,如果希望快速切换多任务桌面,可以使用快捷键
Ctrl + Win + ←/→
也可以通过
Ctrl + Win + D 来新建 多任务桌面
或者使用
Ctrl + Win + F4 来关闭 多任务桌面
Continue reading

PowerShell: 远程调用

通过本地程序调用 PowerShell 自定义脚本,我们可以有周期、计划性的执行一些扩展的操作,这在一定程度上提高了本地程序自身逻辑的扩展性。而在编写一段 PowerShell 脚本的过程中,也难免会遇到需要一段脚本在另一台计算机上远程执行的情形。例如,我们在执行一段 PowerShell 脚本时,需要向某个 AD Group 中添加一个 AD User,而这一操作需要在域控机器上才能执行,而此时,我们就会用到 PowerShell 远程调用执行代码。

在调用之前,我们需要保证 PowerShell 的远程调用设置是开启的。
1 启用远端计算机的 Windows Remote Management (WS-Management) service.
(1) 通过 services.msc 启动服务管理器
(2) 在其中找到 Windows Remote Management (WS-Management) 这一项
(3) 确定该项服务正处于运行状态,并且启动类型被设置为 Automatic

2 设定本地组策略.
(1) 通过 gpedit.msc 开启本地组策略编辑器
(2) 找到 Computer Configuration > Administrative Templates > Windows Components > Windows Remote Management (WinRM) > WinRM
Service
(3) 在右侧的项目中,双击 “Allow remote server management through WinRM”
(4) 在新弹出的窗口中,选择Enabled,从而启用策略,然后再Options的设置区域,位IPv4和IPv6 filter添加规则”*”,从而使所有IP都不受到过滤器的限制。当然,这里也可以根据具体的环境进行配置,相关配置可参考下图。
Continue reading

C#: 字符串连接 (+=) 与 StringBuilder 效率分析

在 C# 或 Java 中,我们可以使用诸如 StringBuilder, StringBuffer 等方式对大量字符串进行拼接操作。当然,我们也可以直接使用 字符串连接 (+=) 的方式进行拼接操作。但是,两种主要方式在效率上有何区别呢?我们是否需要针对这两类方式进行区别场景的使用呢?针对于此,我做了如下测试,以证明两种不同方式连接字符串的效率临界值。(关于Java中StringBuilder和StringBuffer的区别,可以参阅这篇文章

测试方法是:重复连接字符串 “Hello World!” 1次到40次,在每次连接的过程中都分别采用 String Connection (+=) 和 StringBuilder 的 Append()方法进行1000次,并分别计算出两种方法在这1000次运算过程中的获胜比率。通过多次试验,得到如下统计:

第一次:
StringBuilder Efficiency Test 1
Continue reading

SQL Server: 删除 XML 字段的某个节点

针对于 SQL Server 中的 XML 列,如何删除其中的一个 XML 节点呢?这里有两种方法。

方法1 直接通过SQL语句将目标节点设置为 null即可,直截了当,非常容易。

方法2 如下,查询后进行修改(相关操作我封装成了一个存储过程来演示,如下存储过程会从不同位置读取数据,并通过游标寻找并处理由 Guid 格式标明的目标数据)
Continue reading

ADFS 概念与基本开发介绍 (1)

(如您转载本文,必须标明本文作者及出处。如有任何疑问请与我联系 me@nap7.com

ADFS 相关开发技术的中文资料相对匮乏,之前在弄这个东西的时候搞的比较辛苦,因此总结此文档,以解后人之忧。

本文会首先介绍与联合身份验证有关的概念及相关的系统设计意图,随后会对 ADFS 联合身份验证的配置过程、结构及处理流程进行阐述。然后会基于已有的系统提出一个支持多 ADFS 联合身份验证的改进实例,并对其结构及处理流程进行阐述。最后会对开发过程中所遭遇的一些问题进行介绍。真诚希望本文能够帮助读者较快地了解联合身份验证的相关知识。

一 ADFS 基本概念与设计意图

1 基本概念阐述

1.1 联合身份验证

联合身份验证(Federated Identity)是一种用户身份的验证方式,这种验证方式通过把用户身份的验证过程与被该用户访问的服务提供商(SP,Service Provider,如我们自己的站点)进行逻辑分离,在保证用户身份信息被隔离在用户所属系统的内部的同时,为受信任的服务提供商提供所需要的用户信息。
当服务提供商需要对用户的身份进行验证时,会将相关的验证过程转交给身份验证提供方(IdP,Identity Provider,如AvePoint域的 AD FS 验证服务),当用户经由身份验证提供方成功登录后,身份验证提供方会将用户的身份验证凭据和用户相关的信息返还给服务提供商,从而实现服务提供商对于用户身份的验证,以及对于用户信息获取。
常见的联合身份验证的实现有SAML、OAuth、OpenID等方式,本文主要介绍的是基于Claims和SAML 2.0的 AD FS 联合身份验证。在基于Claims的联合身份验证的过程中,当身份验证提供方完成对于用户身份的验证,返还用户的相关信息时,其数据信息实体被称之为令牌(Token),其中的相关信息字段被称为声明(Claims)。令牌保证了用户身份的真实性,并包含了实用信息,其结构如下图所示。

ADFS_Claims
Continue reading

C#: 双检锁 (Double Checked Locking)

以下内容是我在公司作为新人培训讲师时对于作业的一次评价,简单介绍了双解锁的作用,可以作为一个简单的参考。

大家可以思考这样一个问题,一个程序可以对应多少个日志文件?对于我们这个小程序来说1个就够了,很多同学在设计Logger类的时候都是在构造方法或初始化方法中生成日志文件的,也就是说,这基本上等价于一个Logger的实例对应一个新的日志文件(或重新对同一文件重新开启流)。

Logger myLogger = new Logger(@“D:my.log”);

如何才能阻止Logger被随意的new出实例呢?我们可以修改Logger的构造方法,让构造方法成为private的,这样就能实现谁都不能new出Logger实例的目的了。但是,访问修饰符(如private)只是影响类之外的使用,对于Logger类的内部,是不会受到private的影响的,也就是说,我们依然可以在Logger类中使用new来创建实例,这正是我们想要的,我们可以为用户提前创建好一个实例,并作为这个类的静态成员存在,从而得到这样一个Logger类:
Continue reading

黑夜的路上,远处的车灯让光与物交织成一只发光的矫捷白猫,映在墙上。而让我不得知的是那白猫究竟是想躲藏于黑暗之中,还是想将自己殆尽来代替那些黑色?

Office Delve 初窥 – What is Office Delve?

在此鸣谢 Ted 对于资料的协助/整理。

1 什么是Delve

Office Delve (codename Oslo) 是由微软于2014年7月发布的Office 365的最新成员,它为Office 365用户提供了方便的搜索和邮件、会议、联系人、社交网络等管理功能,并通过用户的行为以及与内容、主题和联系人的关系生成一组分析结果。Delve在具体的实现中,应用了机器学习和人工智能技术,我们可以把它当做一个整合了Office 365各类数据信息源的商务智能搜索工具。同时,Office Delve也是第一款采用Office Graph技术的产品(Delve 背后的大脑就是 Office Graph,当我们通过Office 365工作时,Office Graph在后台会收集和分析用户发送的信息)。在2015年4月,微软为Office 365的订阅用户发布了移动版本(iPhone and Android)的Office Delve,目前还没有本地版本Office Delve的消息
Continue reading

How-to: 百度结构化数据插件 Checkurl 请求失败

WordPress 在安装百度结构化数据插件后,能又快又全的向百度提交论坛网页及内容,帮助百度 Spider 收录我们的站点,对于优质的数据资源,可应用结构化摘要样式优化网站在百度搜索结果页的展现。
我们可以从下方地址下载该插件:
http://zhanzhang.baidu.com/dataplug/index

安装的过程,我们可以参考月光博客的这篇文章,安装过程非常简单,但是在安装并启用百度结构化数据插件后,我们需要对站点进行验证。这一过程经常会出现 Checkurl 请求失败 或 验证 sign 检测失败 等问题,这都是由于 WordPress 内建缓存或第三方缓存插件引起的问题,我们需要在通过验证前,将这些缓存机制临时停止。
Continue reading

(转载) 程序员都应遵守的 11 条规则

转载地址:http://www.oschina.net/translate/11-rules-all-programmers
原文地址:http://dotnet.dzone.com/articles/11-rules-all-programmers

我是一个倾向于生活在规则下的人。
现在,这些规则大部分是我本人为自己设立的-但它们依然是规则。
我发现为自己创建规则可以让我过得更好,因为这样做可以提前决定一些事情,而不是要在匆忙中做出所有的决定。
我今天早上应该去健身房吗?
我的规则告诉我说我要在周三前往健身房,今天是周三,因此我要去健身房,就这么办了!
这周,当我正在思考那些对我施加有影响的规则时,我想到了去制定一系列软件开发者都应该遵守的规则,我认为这可能是一个好主意。
Continue reading

SQL Server: 创建 XML 索引 提升查询效率

Scenario: 最近在工作中遇到一个问题,客户访问公司产品的某报表功能时,速度极慢,在客户环境甚至达到15+分钟的页面载入时间。经分析,问题的原因是多方面的,其中最主要的一项是产品数据库(SQL Server)的一个核心字段采用了XML类型存储,先不讨论其设计的优劣,但大量的XML查询确实大大的影响到了产品体验。
Continue reading

维瓦尔第 —— 巴洛克音乐的传奇

Antonio Lucio Vivaldi

Antonio Lucio Vivaldi

安东尼奥 · 维瓦尔第 (Antonio Lucio Vivaldi) (1678-1741) —— 巴洛克时期意大利著名作曲家、小提琴家、神父。他出生在威尼斯一个普通乐师的家庭里,昵称红发神父,后人也有称他为“协奏曲之王”,他最著名的作品为《四季》。

* 巴洛克文化

巴洛克(Baroque)一词来源于西班牙语,意指形态不够圆或不完美的珍珠,最初是建筑领域的术语。巴洛克文化最早起源于意大利,与反对宗教改革有关,其为宗教服务。巴洛克时期主要是指1600年-1750年间的150年的时期,在1300-1500年(14-16世纪)文艺复兴时期之后,巴洛克时期来到,这受到文艺复兴支持者的反对,这两个时期的艺术方面区别极大。文艺复兴时期强调人文主义(humanism,指社会价值取向倾向于对人的个性的关怀,注重强调维护人性尊严,提倡宽容,反对暴力,主张自由平等和自我价值体现的一种哲学思潮与世界观),而巴洛克时期是一种缓冲,是一种由过度的凸显人文主义向宽松和奢华过度。

巴洛克风格的特征是精致细腻的装饰以及华丽的风格,造成这种现象的主因,是因为巴洛克时期是贵族掌权的时代,富丽堂皇的宫廷里奢华的排场正是新的文化以及艺术的发展中心。巴洛克文化极具奢华,既有宗教特色又有享乐主义色彩。打破宁静的艺术,具有浓郁的浪漫主义色彩,强调运动和想象力。

巴洛克特点:复杂、奢侈、浮夸、宗教、浓郁、浪漫、动态。
Continue reading