Becomin' Charles

算法 | LNMP | Flutter | Mac

Becomin' Charles

因为工作的关系,最近参与的一个项目中,我目睹了 ExtJS 在项目中发挥出来的强大的生产力,以及在 Web 界面方面强大的表现力,另一方面又很喜欢 js 这个语言,所以,下决心学习以下 Ext JS,正好新版 4.1 发布了,可以学新技术了。本文章为系列文章,内容或来自翻译,或来自自己的学习感悟,属于理解、记忆、融会贯通的一个辅助,也希望对诸君有利。

阅读全文 »

这是一个非常老生常谈的问题了,毕业找工作的时候,我就研究过很多的模板,然后自己找工作时候,非常认真的准备,最近工作了一两年,看老大、组长面试前打印出来的各种简历,帮各种同学、朋友走内部推荐,着实看到了一些简历,所以,我还是谈谈我对简历的一般看法,写这篇文章,主要是给以后找我推荐岗位的童鞋看的,大部分找我推荐岗位的人,都是拖了几层关系拖到我这里,然后把简历发过来,我既然要帮你推荐,那你的简历至少得过我这关,我得对公司负责,得对自己的信誉负责。所以,准备这么篇东西,如果我推荐你来看这篇文章,意味着你的简历不合格,需要改进,但是不代表我对你个人能力有任何看法,只是从形式上看,你的简历不合格。

阅读全文 »

什么是OAuth?

简单来说,OAuth就是一种协议。这种协议的作用是,授权第三方使用你在某服务商处储存的私人数据,但是并不需要告诉第三方你的密码。OAuth并不是一个新发明的协议,而是已有的各种解决方案的一个去芜存菁,融合了当时所有解决方案(Google AuthSub, AOL OpenAuth, Yahoo BBAuth, Upcoming API, Flickr API, Amazon Web Services API, 等等)的优点。OAuth协议的研发始于2006年11月,2007年10月3日,OAuth Core 1.0最终草案发布,其1.0版本发布于2007年12月,并迅速成为业界标准,2008年6月修复了一个安全漏洞,发布了OAuth 1.0 Revision A(OAuth 1.0a),2010年4月,OAuth 1.0作为RFC5849发布。

OAuth与互联网开放

OAuth协议虽说不是一个通过认证的国际标准协议,但是它是事实上的互联网公认的标准。现今,开放已经成为了互联网的主流,而OAuth在其中扮演了不可或缺的角色,可以说OAuth是互联网开放的基石。各种平台服务商,都通过OAuth协议,部分开放了自己的用户数据,使得新兴的互联网服务,可以更加方便地访问到用户在各种网络服务中存储地私人数据,从而更加便利而且快捷地提供更为优质、有针对性地服务。这种用户数据的开放,是建立在安全和授权的基础上的,也即,只有用户亲自授权,其存储于某互联网服务的数据才可以被第三方调用,这种授权可以精确指定,比如用户只希望授权访问自己地照片,但是不可以查看自己照片底下的评论,此外,用户在授权第三方访问自己的私有数据时,不需要告知其自己的密码是什么,这也就保护了用户的密码不备泄漏和篡改。

在以上机制的保障下,任何网络服务,都可以使用OAuth协议,开放用户数据的访问,也可以请求用户访问其位于其他网络服务,如大型平台服务,社区服务提供的数据。在安全保障下的开放与共享,促进了互联网的进一步繁荣。

各种知名网络平台、服务提供商采用的OAuth协议

服务商

OAuth版本

文档

Google

OAuth 2.0

文档

Facebook

OAuth 2.0

文档

Twitter

OAuth 1.0a

文档

新浪微博

OAuth 2.0

文档

腾讯微博

OAuth 1.0a

文档

豆瓣

OAuth 1.0a

文档

回到家已经超过23点了,想想也做不了什么事情了,那就把路上跟同事讨论的问题,拿出来写一写。又是一个老生常谈的问题,就是到底是面向对象还是面向过程?其实关于这个问题,本不该有什么疑惑的,但是随着最近一个项目的经验,我又产生了一些新的看法。

阅读全文 »

虽然Mac OS 提供了令人目眩神驰的界面效果,但是,我觉得我的最爱始终是终端,这到不是因为我有什么geek的癖好,而是因为到了*NIX系统上后,使用终端得心应手,就好像使用Windows,你喜欢点开开始菜单,或者习惯性打开资源管理器,是一个道理。

Mac的终端是连接的使系统底层的Unix系统,名字叫Darwin,这个终端也支持许多的快捷键,记录下来,希望对大家有点帮助。

快捷键

功能

Ctrl + a

移动到开头

Ctrl + e

移动到结尾

Ctrl + b

向左移动一个字符(助记back)

Ctrl + f

向右移动一个字符(助记forward)

Option + Left

向左移动一个单词

Option + Right

向右移动一个单词

Ctrl + h

向左删除一个字符

Ctrl + w

向左删除一个单词

Ctrl + k

向右删除到行尾

Ctrl + t

交换行尾两个字符顺序

Esc + t

交换行尾两个单词顺序

Ctrl + l

清屏

Ctrl + d

相当于退出、logout、exit等命令

Shift + Cmd + 鼠标双击

快速选中路径

还有些别的东西,大家可以看看这个: http://qingbo.net/blog/post438.html

个人觉得set -o vi 是神器

周日闲来无事,打开Yii的源代码学习一下,今天主要看的代码都是base包里面的,也就是框架根目录下的base目录里的代码。这个目录里的代码不多,但是类很多,而且这些类对整个框架来说至关重要,都是非常基本的组件。老实说,这里面的代码,我已经看了无数次了,但是总觉得常看常新,转念一想,这也实属正常,毕竟这是原作者数年框架开发经验的结晶,岂是我这等工作一两年的菜鸟能随便吃透的?

最近又玩了两次Visual Paradigm这个软件,觉得自己操作水平又有进步,甚感欣喜,所以今天既然分析源代码,就正好再练练手,于是乎,我开始用VP UML开始画base包里的类,得图如下。(说明:这个图是基于Yii的1.1.8版本,另外这里面少了两个类,因为这两个类的功能比较特殊,我没有细看,所以也就没有画在图里,看后面是不是有兴致再来专门画一张,缺失的两个类是CSecurityManager和CStatePersister。)

阅读全文 »

想学学怎么写jQuery的插件,结果发现举步维艰,于是想通过研究插件代码的案例,来积累经验,结果看到第一行,我就郁闷了,天下间最郁闷的事情莫过于你出门去约会,结果刚打开门,就摔个狗吃屎,现在我就那个感觉。看代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

//第一种“包装盒”
(function($){
// to do things here, I like use this way
})(jQuery);

//第二种“包装盒”
(function(window, undefined){
// this is the wrapper of jquery
})(window);

//第三种“包装盒”
(function($, undefined){
// this is the wrapper of jquery ui components
}(jQuery));

闭包是个好东西啊,自打初窥门径后,我干什么都喜欢在外面套个闭包,我把这个称为是打包盒,而且这个盒子很神奇,里面看得到外面,但是外面看不到里面。好处很多,比如可以放心大胆地命名变量啊,不用担心污染全局空间,也不用担心被全局空间的其他变量污染,还有像上面片段里,第一种那种写法,可以非常安全地去使用$符号代表的jQuery对象。因为在全局空间里,如果一个页面上引入多个类库的话,$符号很可能代表的不是jQuery对象,而用了第一种写法后,$符号变得很安全了。

翻开jQuery和其各类插件的源代码,你会发现,它们都被安放在一些“打包盒”里面,不禁有种英雄所见略同的感觉,但是不要感觉太好,为什么人家用的,跟我用的不太一样呢?看第二种,是jQuery用的“打包盒”。乍看跟第一种很像,但是那两个形参,简直匪夷所思。第一个是window,这明显是地球人都知道的全局变量啊,第二个是undefined,这更加神了@#$%^&。淘宝UED有篇文章解释了这个问题。文章观点大体是,将window由全局变量变为形参,可以在后期代码最小化时候,通过对局部变量名的替换,来大幅度减小代码体积,这算是一个优化吧,undefined那个同理。另一点文中提到的是,undefined可以被重新定义成自定义的值,也即可能被污染,使用这种方式,会得到真正的一个undefined。当然,我的眼光和专业程度也止于此了,但是我还是觉得,还有可能有一些额外的好处,如果看官童鞋你知道,请不吝赐教。

第三种的话,看过了两种,基本上已经有点差不多全懂了,但是仔细一看,还差那么一点的。$形参,和undefined形参不多解释了。请大家关注那个不同点,就是最后一个闭合小括号的位置,发现了吧,最后闭合小括号,为什么是放在最后面了呢?由此我也发现了一个特性,就是在小括号里面的匿名函数,如果在函数结束的大括号后面,直接跟一对小括号的话,会使那个匿名函数立刻执行。如果离开了外面那对小括号,匿名函数是不能生存的,如果是具名函数呢,在闭合大括号后,跟一对小括号,也无法实现对函数的立即调用,反倒会有语法错误。但是还是来看最关键的那个不同,如下:

1
2
3
4
5
6
7
8
9
10
11

//写法A
(function($, undefined){
// this is the wrapper of jquery ui components
}(jQuery));

//写法B
(function($, undefined){
// this is the wrapper of jquery ui components
})(jQuery); //不用找茬了,这行不一样,看“)”的位置

这两种“包装盒”到底有何不同?第一种比第二种有什么特别的好处么?

开始学习写Python,写了一两个小脚本后,就产生了非常奇怪的感觉,我怎么觉得Python看着这么混乱呢?

一个是没有大括号了,代码那种段落感没了,第二个是没有分号了,觉得一行总是没完似的。靠缩进来流程控制,觉得非常难受,总是习惯性地搞不清楚一个if和一个for的结束在什么地方,为啥不像pascal和VB那样,加个关闭之类的东西,也让人看着舒服点。代码说完,再说说文档,去官网查文档,感觉那文档视觉效果跟代码一样,没有括号,分号这样分块,断句的地方。那文档就是秘密麻麻一片,从上到下,页面长长的一串,而且还太宽,连个索引也没有,还得不停地ctrl+F来找函数。排版也忒鹾了吧?

目前都还只是视觉上的别扭吧。估计Python的粉要来嘲我了。再往后学学吧~

要给一个朋友的服务器上架设ftp,一看,这哥们的服务器装的是RHEL AS4,看到这个发行版的名字,我就发怵了,果不其然,么有包管理器,我简直寸步难行,什么软件都没法装,各种依赖,太难解决了!!

看了一下已经安装的软件列表,发现已经装了vsftpd,就用这个吧,man了半天,最后配好了,但是一连,发现死活连不上,百思不得其解,各种google,各种百度,也不知道过了多少天,才发现问题的症结在iptables,原来,要使用passive mode登陆ftp,必须开一个范围的端口,而系统默认的iptables规则,不允许对这些端口的访问,导致ftp连不上。怎么开放iptables的端口呢?又是各种google,各种百度,搜到一个iptables的tutorial,竟然有290页之厚,太难用了。

几经周折又找到了一个图形化系统界面可以配置防火墙规则的,system-config-securitylevel-tui,通过这个东西,很容易就可以开放一个端口,但是这个东西也有问题,我要开10000号段的端口100个,就麻烦了,虽然网上说,用格式形如10000-10100:tcp这样的写法可以开放一个系列的端口,但是实际上,这么写是不管事的,也不知道是不是软件的版本的问题。

最后,知道这个ui界面生成的规则被写到了/etc/sysconfig/iptables文件里面,然后又看了一下man,研究了一下如果手动配置规则的话,端口范围的写法(–dport 10000:10100),先用ui工具生成一条一个端口的规则,然后手动改文件,将端口改成范围,一重启,发现终于一切都按照预期的搞定了,真是累死我了。

在RHEL下面,启动,重启,关闭,查询iptables状态的方法:

Usage: /etc/init.d/iptables {startstoprestartcondrestartstatuspanicsave}

本文要讲的,就是如何简化从Mac登录Linux主机的操作步骤,提高效率。所谓的“免登陆”其实是不存在的,只是说,从验证密码的登录方式,改为公私钥对的登录验证方式。使用后者的方式,每次会由ssh客户端自动发送验证信息,所以就免去了人工输入密码,看起来好像“免登陆”一样。

关于这么做的原理,大家可以自己去Google,关键词是“非对称加密”,“RSA算法”,“基于ssh密钥对的自动登录”,等等,我就不多解释了。我直接说操作步骤吧:

  1. 生成密钥对
  2. 用密码登录远程主机,将公钥拷贝过去
  3. done

怎么样,无敌简单吧?

生成密钥对

执行命令 ssh-keygen -t rsa
执行结果如下:

charles@mac:~ > ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/charles/.ssh/id_rsa):
Created directory ‘/Users/charles/.ssh’.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/charles/.ssh/id_rsa.
Your public key has been saved in /Users/charles/.ssh/id_rsa.pub.
The key fingerprint is:
c8:4b:85:87:90:7c:1a:67:b6:71:f5:51:0c:9d:a2:89 charles@TCMBP.local
The key’s randomart image is:
+–[ RSA 2048]—-+
… .. o=..
+.*o. …+
Bo+o. o..
…+E o

  • S
    . .
    .

+—————–+

注意:提示enter passphrase的时候,不要输入,因为你本来就想少打一次密码的,这里如果设置了用密码保护私钥,那登录的时候还是要输密码,就白做了。

做完这个步骤后,cd ~/.ssh,你就可以看到你刚才生成的密钥对,id_rsa是私钥,id_rsa.pub是公钥。下一步,就是把公钥拷贝到目标主机上。

将公钥拷贝到目标主机

用ssh登录到目标主机,然后cd /.ssh目录,如果目录不存在,那么要自己创建mkdir -p ~/.ssh。你今后要用哪个帐户登录主机,就在哪个帐户的home目录下操作,如果要免登陆root,就要去/root下操作。使用比较好,不用多想了。

有了.ssh目录后,进去,然后把id_rsa.pub传过去,可以用scp命令,这里要做的一个主要操作,就是将id_rsa.pub,的文件内容,写到一个叫authorized_keys的文件中去,如果目标主机的相应用户名下已经有了.ssh目录和authorized_keys文件,那你操作要小心一点,可能别人也做过免登陆的设置,这个时候你要小心不要把别人的设置给覆盖了。如果没有的话,就创建文件touch ~/.ssh/authorized_keys,然后执行cat id_rsa.pub >> authorized_keys,将你的公钥写入到authorized_keys中,公钥文件.pub里面只有一行信息,上面的命令相当于把那一行信息追加到authorized_keys文件最后一行。

如果.ssh目录是你主机刚刚创建的,那么可能还需要改变一下这个目录的权限,将权限放低,chmod -R 0600 ~/.ssh,到此,所有设置就算做完了,你可以退出登录,在自己的主机上试一下了,现在再敲入ssh命令后,不用密码就可以登录主机了。