Trade Off

supercalifragilisticexpialidocious

Haskell的学习开始了

总算是这本新书仍旧躺在图书馆的新书架上,上次看到后感觉没时间来学习,自己总是拼命追赶技术的前沿,而在这里是有难度的,虽然网络让我们和世界保持同步,但知识的追赶总还是需要时间来加冕。不知道这还算不算是技术前沿了,不过总是比其他的那些新了不少,函数式编程。

这也是我第一次阅读全英文的技术书籍,以前也曾阅读过带注释的《程序员修炼之道》,可惜没有看完,现在图书馆中也见不到了,以后有机会再找回来看看。 Haskell的不少语法规则都和已经学过的编程语言差不多,如果一种新的语言推出了极其怪异的语法而它又不能自圆其说的话,那这门语言很快就将泯灭,原因不用多讲。这样的话学习起来就能稍微简单些了。 使用的书籍叫《Real World Haskell》。

首先接触到了GHC的概念,这是个缩写,包括了三个组件:ghc、ghci、runghc。 ghc是编译器;ghci是个交互模式的命令行,类似python的那个;runghc是可以作为脚本运行haskell的东西,不用编译就可以运行了,感觉这就是个脚本解释器吧。

安装GHC平台

这里能够下载到各个系统上的haskell平台,具体的下载地址还是看这里:http://hackage.haskell.org/platform/我使用的是Mac版本的平台,下载后即可安装,但mac平台下需要先安装xcode,接着就能安装GHC了。安装过程可以参考相关文档,mac下的安装就是2步,第一是安装GHC,第二个是安装叫Haskell平台的东西,都在下载的dmg中。

帮助

在命令行中输入ghci即可使用交互式来学习haskell。 输入“:?”即可看到一串帮助信息。

基础模块

在shell中能够看到命令提示标志是一个叫“Prelude”的东西,书上讲这是haskell默认加载的一个模块,就是个基础模块吧,如果不喜欢这个名字可以这样更改掉:  

1
:set prompt "ghci >"

现在的提示符标志就变成ghci >了。

加载其他模块

1
:module + Data.Ratio

这样就加载了Data.Ratio这个模块,这个模块似乎是使用浮点数之类的东西吧,我还没有细看。具体可以参考文档。

进行一些简单计算

输入2+2啦,3+3啦这样的表达式,haskell都能计算出来,这点和python的解释器一样。书中提及了关于负号应该注意的地方:如果输入2+-3这样的表达式就不对了,加入想要得到正确结果需要这样2+(-3);再者,haskell中的函数调用没有括号,func -3这样的表达式到底是传递参数-3进去呢,还是func这个变量减去3呢?所以要多多注意!

Bool的注意

haskell中有True和False这两个(注意大小写),但和其它语言中不同的是这里的数字0、1不能和bool类型相互转化,如果输入表达式True&&1是不正确的!

运算符

说说不等号的表示方法──“/=”,像是其他语言中的x = x/y这样的,但这里看起来更象是不等号。 感叹号表示对一个变量的反,这里用not单词表示──“not True”  => False(=>是我自己为了好看而打上的符号) 乘方运算符:**或者^

优先级

使用info查看运算符的优先级:  

1
2
:info (+)
:info (*)

分别查看加号、乘号的优先级,返回的结果类似这样:  

1
2
3
4
5
class (Eq a, Show a) => Num a where
 (+) :: a -> a -> a
 ...
 -- Defined in GHC.Num
infixl 6 +

最后一样的6表示加号的优先级是6,在haskell中优先级是1~9不等,最高的是9.从这个结果中我们还能看出来如果相同的加号连接表达式的处理方法,是从左到右(在第二行中的三个a,顺次向右箭头)

几个常量

说来惭愧,我就知道一个──pi,连e都没有定义!书上教了这样定义临时常量的方法:

1
let e = exp 1

这里我们就使用了exp函数,传递参数1进去。

List

list是haskell中的一种数据结构吧,好像和python中的一样,干脆叫列表好了。定义方法很简单,就是把元素放入两个中括号中,而且药注意的是中括号中的必须是同样的类型,不能放进去整形又放进去字符串这样的混合。在书写上,[1,2,3]这样是正确的,而[1,2,]这样多余了一个逗号,虽然在其他的语言中可能正确,但在这里不行!

枚举填充列表

可以使用枚举符号来快速把一个序列填充到列表中: [1..10]

这样的列表就变成[1,2,3,4,5,6,7,8,9,10]了,最好别尝试[1..],因为书上说这样做了就必须kill掉解释器,否则会一直循环下去。

数列填充

类似枚举填充,只是多输入几个数字,让haskell知道其中的规律,然后就能构造出各种数列填充了:[10,9..1]这是一个从10到1的递减数列

注意

[1.0..1.8]这样的结果会出现:[1.0,2.0],不要感到奇怪,这是浮点数的四舍五入吧,总之使用浮点数填充的时候要多多注意这种细节。

列表的运算

[1,2,3] ++ [4,5]会得到一个[1,2,3,4,5]的列表,就是加起来而已,重复的元素也不会覆盖。  

1:[2,3] 这样会把1放入后面的列表最前面。此处需要注意的是:冒号前面必须是列表中同类的元素,而冒号后面必须是列表,所以反过来就不行了。(遵循原则,前面是个列表,后面是包含列表的列表,这样都对)

字符串

这里没什么体别,字符串就是用引号引起来的内容。在字符串中可以使用转义字符,类似\n、\t这类。 字符串就是把每一个字符一个个放入列表中实现的,所以一个空字符串──“”与一个空列表──[]是等价的。   就先到这儿吧,英文版书籍看起来也不算快,边看变查字典呢!haskell的前言中说过这是一个比较奇特的语言,会引发对软件设计的新方法,当然是因为函数式编程吧。

终于知道为何chrome浏览器中的“其他书签”为何无法去掉了

早就看着这个文件夹不顺眼,但就是无法删除,打开chrome的书签管理器发现它和“书签栏”是同级的,刚刚去研究了一番chrome的扩展程序,本以为通过chrome本身能够操控自己,但经过实践后发现这根本行不通。 建立一个chrome的扩展程序是这样的:

1.建立一个目录,随便在什么地方。

2.进入这个目录,建立一个叫manifest.json的文件,从文件名就能看出这是个json,用vi、vim、emacs等写入如下内容:  

1
2
3
4
5
6
7
8
9
10
11
12
{
 "name": "hide-other-bookmark-button",
 "version": "1.0",
 "description": "I want to hide the 'other bookmark' button in Chrome's bookmark toolbar!",
 "browser_action": {
   "default_icon": "icon.ico"
 },
 "permissions": [
    "bookmarks"
  ],
 "background_page":"index.html"
}

然后找个ico文件,命名成上面提到的icon.ico,只要和json文件中对应即可,png也行。现在这个扩展的配置文件就基本完成了,因为这是要操控bookmarks的扩展程序,所以在permissions那里药写上bookmarks以表示这个扩展要使用chrome的bookmarks的API来做一些东西。具体的API可以参考Google的文档。

3.建立上面提到的一个index.html文件,这是此扩展程序的主页面,就是一个标准的html页面。我曾经一度以为chrome的这些API到底是该怎么调用啊?用html能行么?于是我找到了一个不错的应用程序,看了它的代码,简单说,chrome的那些API就是一个JS库,和jQuery一样用,只不过chrome内置了这个库,你直接用就可以了,不用再明显声明(除了json里面的那句),我们的index中只有很简单的一句代码:(为了让人们看清楚,我完整给出index的内容)

4.那么多出来的那句代码是做什么的呢?其实我是用了上面那句,才能确定“其他书签”这个的id是2而不是别的。

从chrome自带的JavaScript控制台程序能够看到bookTree是一个Object,还能继续看它的属性,这是一个array,下面的1号object也是个array,我们能够看到他的id是2,而title就是我们渴望的“其他书签”。下面那句就是删除id为2的那个object,很可惜,返回了error,对于这个我也没办法了:

到了这里,这篇文章也就基本结束了,虽然我们没有成功,但这个过程是值得的,能够在chrome这样的大型软件中体验扩展程序也是很不错的 !

为项目搭建git版本控制

这两天一直跟随网上的各路人马学习git的使用,也就是刚刚到了能够用一点git的命令而已的地步,这个东西还是得到了具体的项目中才能慢慢熟悉了解。本来打算好好学习svn,现在看来就不必了,学习一个更加有生命力的吧! 在我的vps上搭建了git服务器环境,下面就记录一下过程: 1.安装git就不再多说了,我似乎把redhat中的一个仓库加入了rpm,直接yum install -y git安装了,不如下载源代码安装的git版本高,我这里似乎只有1.5的版本。 2.我使用了gitosis来管理所有的项目,所以:  

1
2
3
4
yum install python-setuptools
git clone git://eagain.net/gitosis.git
cd gitosis
python setup.py install

3.安装好了就可以初始化gitosis,还得先建立一个git的用户来做一些工作:  

1
2
3
4
5
useradd -m -s /bin/bash -d /home/git git
passwd git #给git用户加上密码
su - git
cd ~
gitosis-init < /tmp/id_rsa.pub #这里是你的rsa共钥路径

4.修改一些权限,据说很重要,为了安全:  

1
2
3
4
chmod 755 /home/git
chmod 700 /home/git/.ssh
chmod 644 /home/git/.ssh/authorized_keys
chmod 755 /home/git/repositories/gitosis-admin.git/hooks/post-update

5.在本地用git做最后的工作,修改gitosis的配置文件并上传:  

1
2
3
4
5
6
7
git clone ssh://git@DOMAIN:8888/gitosis-admin.git
cd gitosis-admin
vi gitosis.conf
#增加新的项目名字和相关配置
[group AWAD]#AWAD组
writable = wodeyitian_web   #仓库中的名字
members = dawncold@tianzhenmatoMacBook-Pro.local  #成员,这里的成员名字就是rsa共钥中最后的成员名字

好像和那个pub文件的名字要一样,那样的pub文件放在和这个conf文件在一起的keydir文件夹下.

6.完成这里后提交一下再push到远程服务器上即可完成:  

1
2
git commit -a -m '建立了新的项目'
git push

7.已经全部完成,在本地已经可以用了,不过还想说一下,如果做开源项目,还是放到github上比较好玩!

正在验证paypal

能够使用paypal最好了,因为那样可以隐藏自己的信用卡信息,总之支持paypal支付的国外商家还是非常多的。要开通这个功能需要在paypal上添加一张信用卡,我已经添加过一张银联卡了,验证方式是paypal给我打了两笔小额资金,真是很小,不到1毛钱!而验证信用卡就不一样了,需要扣除不到2美元的现金,而paypal这次很实在,不到2美元,扣了1.9x!!!接着就是等对账单,paypal会显示一个4位数的编号,等你看到后填写到paypal那里就算是验证成功了!但这个过程还是有点艰辛。

昨天我进行了3次添加信用卡操作,全都是失败,还被银行的客服问候了一下,今天看到美元帐户里能够支付5美元了,再尝试一下,还是失败!Google原因,了解了还需要开通境外无卡支付业务才行,我从网银的设置中看到了这个业务,但后面的开通链接处是一个灰色的!只有柜面注册卡才能在线开通关闭!我这不是柜面注册么?!好象是自己在网银的后台添加进去的~于是电话让客服MM开通,顺利完成了paypal的添加卡业务。(我在网银中还自助开通了一个VISA验证服务,这个应该不影响吧)。再等几天验证完paypal就没事了。那时候再把境外无法支付关闭,要不然危险。

含恨放弃了这本书

《深入理解计算机系统》这本书是我从《程序员》上看来的,记得有位高超的架构师吧,推荐了这本书,我就买了下来,现在放弃阅读这本书。看起来我还是能够放弃一些东西的,我并不是一个如同我描述得那样──“一个学不会放弃的人。”

我之所以放弃这本书是因为这本书前半部分讲得都是硬件相关的知识,就象是去年学习的《计算机组成原理》一样,还好比《数字逻辑电路》强了不少,因为这些知识都和计算机相关,数字逻辑简直就是在讲单纯的硬件。不过两者却都不是我所希望阅读的!以为这本书的后半部分能够提供一些编程优化相关的知识,因为看这本书的介绍是帮助程序员理解程序如何运行并且还讲解了一些实用的编程技巧,谁知根本不是这样。

在大二的上学期我们也发了一本讲解汇编的教材,只是我们班的课程与其他计算机科班不太一样,就没有讲这门课,曾经的我想一度利用空闲时间来学习汇编,并且在大一的时候我从图书馆借来了一般汇编书,自学了一小部分,但现在看来,那一切都显得过于理想化了!刚才从床底下拿出来了汇编的书,看了两眼就放回去了。我之道如果我学会了汇编一定能看完这本《深入理解计算机系统》的,可惜我没学会:(

还有不少书在手边,学会了任何一本都足以让我受益好几年,但我从未感受到这些益处,肯定是因为我没有学好,即便是这样,我竟然也能在班里排名比较靠前。似乎一切都反过来了!!!

网站开发告一段落

刚刚把一个比较大的功能完成了——日历。还有一个星期就要回去了,我这次回家拿回来的几本书还没有看完,PHP的那本书看得差不多了,还没有回头细看,可能还需要再带回去。《深入理解计算机系统》那本书没有看,打算剩下的这一个星期全看那本书,能看多少是多少,不能总和PHP为伍,毕竟回去了有不少人还是能帮我继续做网站的!

应用通过审核之后

这是第二次进行人人网的应用审核了,第一次只是把网站于人人网连接起来就草草申请审核,很快被打了回来,前天刚刚实现了发表新鲜事到人人网的功能,这次就有理由来申请了。今天下午我打开人人网,看到站内信中有开放平台发来的信件,告诉我已经上线了,至此,我的一天网站又一大功能实现了。

其实我不是很想实现与这些网站的连接,只是因为开放API的方式已经渐渐成了国内网站的主流,相信这点在国外同类网站已经做得相当成熟了,在国内,就连Tencent都喊着要开放了。实现与这些网站得对接能够利用他们已经建立的用户资源,也就是分享他们的用户,这点对于一个新兴的、不完全靠创新的网站是很有必要的。

本以为自己的点子是足够创新的,但在这个神奇的土地上,一个思想都快要变得神奇的人很难一下子突破这些禁锢达到真正创新的地步,不过我感觉现在我的这个网站还是足够创新的,至少还没大有这样做的。

国内人多,想到的点子也就丰富,虽说其中创新的并不多,但至少能有一小部分吧,由于基数比较大,所以即使比率低一些也无妨,可我们身边这些SNS、论坛之类的东西并不多。关键还在对于一个点子的运营上吧!

新的eclipse配色

本打算将php、java、android开发集成到eclipse中,因为这本来就是可以的嘛,但不知道该如何安装插件,索性就把php和java开发分开了,下载了两套eclipse,这是我找的一个eclipse配色,for java的:

在此要感谢这位作者,他的博客中有更多的图可以看!

折衷的选择

新的VPS上绝对能够承受我所有的站点,不过就是访问的时候速度不理想,在我不知到该怎么办的时候遇到了Typecho这个精简的博客程序,而且在他们的论坛上遇到了一个赞助新加坡主机的朋友,我顺利申请了他的新加坡主机,当时ping值相当高,大约到了400多,怎么比我的VPS还慢?过后再试试,只有100ms了,果断把youth2009.org搬过去吧。其实,我不买这个VPS也就可以了,只是现在能够学到一些linux下的小知识,花些钱也就能说得过去了(还是要把自己说服)。再者说了,自己的VPS毕竟能够掌握所有控制,也相对安全一些。

折衷的选择就是把原来国内的那个空间迁移到这里,看看ningxin.org还要不要动,这样就空出来了国内的垃圾空间,如果能够退款就更好了,不能的话,我也没办法了,我会一直相信一分钱一分货的!

动态验证表单也不难

一般来说现在的注册、登录的表单验证都是在浏览器这一级先做一个合法性验证,这样能够缓解服务器的压力,否则这些合法性验证都要移到服务器上,无论从性能和表现力都不及在浏览器用一些很炫的效果来验证。我使用了jQuery这个javascript库完成了表单的动态验证,核心不算难。一开始我都是参考豆瓣的注册页面,他们现在用的也是jQuery来做这块,代码看起来超长,还分了好几个js文件来组织,不是他们的前端工程师谁也看不懂(我真怀疑他们的前端工程师是不是能看懂)。 我做得很简单,不过看起来也能用: 一般有个空的div显示提醒文字,假设input的id是xxx,我们这样

1
$("input#xxx).focus(function(){$("suggestion").html(插入提示文字);});

就能够在焦点进入input的时候提示一些文字了,然后在  

1
focusout(function(){xxxxxx});

中先remove插入的文字,再添加新的文字。 一般在focusout中进行一次查询,然后进行更改文字,是能够注册还是已经被占用,在查询的时候我使用的是$.getJSON函数,用GET方式提交查询看起来比较帅,当然最好做简单的提交,因为用了getJSON的方式,返回值一定是要json,我的服务器端脚本使用的是php,看到jQuery官方例子中提及了json_encode函数,接收array,正好能够返回我的查询结果,SQL查询返回结果用fetch_assoc放进一个array了。getJSON第三个参数是个callback函数,是结果成功返回时调用的函数,更改相应提示文字就在这里面进行,这个callback有个参数data,应该就是包含json的数据吧,用点运算符取到响应结果进行操作。