November 4th, 2008 by 张磊
继续昨天的文章。昨天做了一个可以从网上下载图片数据并存储的GAE应用,今天的部分,我们将在昨天的基础上做出一些改进。比如增加一个校验的部分,这样可以避免别人恶意使用;加入memcached支持,可以把经常用到的图片数据放到内存里;最后,再用ruby写一个客户端。 首先增加一个验证的部分,这里采用类似支付宝支付网关的验证方式:服务器端和客户端用一个相同的screct key,每次在提交请求的时候,把请求的参数加上screct key得到的字符串md5一下。把md5加密后的字符串作为校验的参数,一起包含在一个Get请求中提交给服务器。比如screct key是”blogkid”,请求的参数是”url=http://otho.douban.com/pics/logosmall.gif&uuid=douban“。在计算校验码的时候,先把screct key加在最后,比如写成”url=http://otho.douban.com/pics/logosmall.gif&uuid=douban&auth=blogkid“,之后计算整个字符串的md5结果,得到”ffdf712f7f69da41938bc14a0bf49207“。把这个结果加在get请求参数后面,最后就是”url=http://otho.douban.com/pics/logosmall.gif&uuid=douban&auth=ffdf712f7f69da41938bc14a0bf49207“,然后服务器端使用相同的方法进行验证。 客户端用ruby来写: require ‘digest/md5′ require ’net/http’ require ’uri’ REMOTE_STORE_TOKEN = "#YOUR_PRIVATE_SECRECT_KEY#" class RemoteStore def initialize remote_addr @remote_addr = remote_addr end def put hash hash[:auth] = Digest::MD5.hexdigest hash.map{|k,v| k.to_s+"="+v}.join("&")+"&auth="+REMOTE_STORE_TOKEN Net::HTTP.get(URI.parse(@remote_addr+hash.map{|k,v| k.to_s+"="+v }.join("&"))) end end 真正put的方法,只有两行(ruby就是简洁呐)。 而服务器端的校验,需要改写我们昨天的ImportHandler: import md5 auth_code = "#YOUR_PRIVATE_SECRECT_KEY#" class ImportHandler(webapp.RequestHandler): [...]
November 3rd, 2008 by 张磊
GAE出来有段时间了,我浏览了一下Google的App Gallery,大多数应用都侧重在客户端。当然,也有牛人开发了一个极像WP的blog应用micoblog。 我想自己整一个GAE应用,用Google的服务器来保存我一个网站上的图片。现在的图片都是引用自卓越、当当,现在想保存到自己的地盘。如果能放在Google服务器上,一方面可以节约流量,另一方面也能使服务器不被一大堆小文件给拖累。毕竟有几十万个图片呐。思考一下,GAE上有urlFetch的API,完全可以满足需求。 新建一个文件夹,弄一个app.yaml的配置文件。 application: your_app_name version: 1 runtime: python api_version: 1 handlers: – url: .* script: main.py 因为需求很简单,所以用一个main.py,来处理所有请求。之后新建一个main.py。为了导入图片,需要先定义一个Photo的类(Photo这个名字其实不太合适)一个ImportHandler: from google.appengine.ext.webapp.util import run_wsgi_app from google.appengine.ext import db from google.appengine.ext import webapp from google.appengine.api import urlfetch class ImportHandler(webapp.RequestHandler): ”’Import Pictures”’ def get(self): global auth_code uuid = self.request.get(‘uuid’) [...]
October 19th, 2008 by 张磊
昨晚打算试用一下火车头,从卓越亚马逊抓一些信息过来。遇到个问题就是需要从一堆文本里把链接地址提取出来,原来的文本是类似这样的: </li><li><a href=”http://www.amazon.cn/mn/browseApp?nodeid=287340&uid=168-3018119-0353823″>计算机结构、设计与制造</a> </li><li><a href=”http://www.amazon.cn/mn/browseApp?nodeid=287341&uid=168-3018119-0353823″>计算机数学</a> </li><li><a href=”http://www.amazon.cn/mn/browseApp?nodeid=287342&uid=168-3018119-0353823″>综合</a> … 现在只想要每个链接的地址,别的都是多余。大概有几百条这样的文本,人肉处理显然不现实,后来就想到用python来搞定。 把待处理的文本保存到文件,比如1.txt;然后在命令行里用python,可以进入交互模式。先把文件内容载入进来并用split方法在每个双引号的地方隔开: >>> r = open(“1.txt”).read().split(‘”‘) 这时r就是一个拆分之后的list,从第二个元素开始,每隔一个元素,其内容就是我们想要的链接地址。获得这些元素后再用join的办法把它们组成一个字符串,最后写入文件: >>>open(“final.txt” , “w+”).write(“\n”.join(r[1::2])) 打开final.txt,里面就都是提取出来的链接了。这个例子其实根本没有用到正则表达式这些高级的东西,但用python,只要两句话,就轻轻松松在交互模式解决了问题。
August 30th, 2007 by 张磊
今天在做Camel的时候,对ZF中的Cache的一些初始化选项觉得有些疑惑,于是找来了官方的文档看了看。不看不知道,一看之下才发觉自己之前对ZendCache的使用简直太浅薄了。现在的ZendCache可以对页面某一部分做Cache,也可以对整个页面进行Cache,Cache的保存方式也多种多样,真的很强大。之前我自己对Cache的思考,和他们所做的工作比起来,可以说是微不足道了。 所以牛扑还需要更大的改动。今天我一度动摇,想用Python来重写牛扑,但很快就打消了这个念头。牛扑的架构需要进行更改,我打算大量地使用ZF框架中的组件。这个假期还有些遗憾就是,没有把足够的时间花在看Lucene上。智勇说牛扑啥都搜不出来,这是因为没用全文检索阿。记得那时Tiny还说要送我一个他们在这方面的产品,可那我也得会用阿。 不过,现在做Web开发会觉得顺手很多,因为网络上流行的框架有一大堆,总能找到适合你的一款。若不,说明你已经高超到该自己去写框架了。牛扑几乎所有的方面都需要改进,用户界面、全文检索、缓存算法、数据库结构……回头看自己之前的项目总会觉得千疮百孔。不过,一个一个来吧,我打算把这个拿来做我的毕业设计。 晚上还花了十来分钟,给机器人在互联网的某个角落,安了一个小小的开关。以后机器人掉线,就不需要爬上服务器去改了。只要对那个开关说一个暗语,机器人就会被重新打开。想着你说机器人不见了时可爱的表情,我忍不住就把这个秘密泄漏给了你。
August 4th, 2007 by 张磊
智勇说最瞧不起做技术的,总是做一些没用的东西。我昨天就突发奇想,打算做一个机器人,用来记录gtalk上不停变换的签名。 现在已经实现的功能是连接服务器,如果接到了消息,就把相同的内容发送回去。比如我对它说:“我是张磊”,他也会告诉我,“我是张磊”。呵呵,一点都不好笑。 实现的过程大概花了半个小时,用Python写的。下一步得让他自动接受聊天邀请,然后监视签名档并记录。可是,我的本子突然就坏掉了。
May 23rd, 2007 by 张磊
一个朋友昨天写了篇文章(在这里),其中提到了国内经常被提及的“抄袭”。碰巧这次去参加阿里的网络工程师大会,所参与的话题也都是开源方面的东西。所以想写这一篇文章谈谈自己的想法。 首先是谷歌抄酷讯这件事,明眼人一看就知道是这个小网站赶到了谷歌的压力,只能出此下策炒作自己。让我想起那时候电脑爱好者上头条登了一个很无耻的购物论坛的软文,里面把很多业内人士谈BuyRen论坛的部分都改成了描写他们自己网站的内容。炒作无罪,但是通过这些下三烂的手段,实在是让人鄙视的。 话说回来,今天我们聊的是开源。在网络工程师大会上,我听了PHP之父Rasmus的演讲,感触最深的是他说:“Even I started the project, I am a contributer. ”意思是说虽然他创造了PHP并开发了早期的版本,但他现在的身份也不过是这个项目的贡献者之一。他认为要让一个项目持久地发展下去,作为创始人,应该放弃对它的控制。 他自己说,“I am a tech guy.”在国外做技术的人和国内地位是不一样的。我所了解的在国内大家都羞于说自己是做技术的。一些长辈们也告诉我将来可以先写两年程序然后去公司的管理层XX。这彰显的是国内人们浮躁的心态。在Google就有一些资深的工程师,他们的待遇比副总裁还要高,他们不会涉足公司的管理,因为他们不适合做这个东西。但放到国内的话如果你35岁还在写程序恐怕在家里老婆也会看不起你。 还有一点就是国外人很有钱,所以一些NB的Geek可以从事自己喜欢的事情,然后通过Paypal会得到不少捐助。一些开源的项目也是这样,比如CakePHP。在国内大家一方面对技术并不重视,另一方面大部分人对在网上花钱还是比较害怕的。不过最近好像有了些起色,周曙光不算一个Geek,但是她的所作所为得到了很多人的认可,他现在的三星相机就是通过捐助获得的。 开源是一种精神。在开源社区诞生的一系列产品支撑起了整个互联网。比如Google,比如Yahoo,还有很多大大小小的网站,一群充满热情的人们持久地为开源项目贡献着力量,而并不谋取什么回报。我们看到了一个又一个优异的产品:PHP,Python,Mysql,Ubuntu… 昨天的沙龙由Alone谈了一下Ubuntu,以后的沙龙我们会加入更多开源方面的东西。Lupa社区该不该给我们些活动的经费呢,呵呵。 最后,要感谢Fenng大哥帮我要到了参加网络工程师大会的入场券。希望他工作不要太累,照顾好自己。
May 12th, 2007 by 张磊
要不是Alone去V2Read发书评,我还不知道V2Read因为数据库结构的小变化产生了很多问题。匆匆忙忙地查缺补漏,等到终于松了一口气了,却发现数据库中最关键的表挂了。提示的信息是:”Table ‘./zllp/zl_subject’ is marked as crashed and last (automatic?) repair failed ( 144 )”。从来没见过这种错误,只好发一封英文的邮件给DH的客服。 然后就是SIFE。下周四即将参加比赛了,但我们的准备工作还差很远。下周四能到上海见到一群上次遇见的朋友们,特别是几个很漂亮的MM。和SIFE几个核心成员谈了一个小时,大家也纷纷觉得最近太紧张了,于是走出来闲聊一会儿。 不谈工作一下就觉得轻松了很多,我最近已经有很长一段时间没有接电话了,不敢接啊,一接就是推不掉的事情。闲聊的时候俊圣给我们推荐爱情、婚姻方面的书,才意识到SIFE的大部分成员都还是单身呢。 回到寝室已经快12点了。看到了Dreamhost回复的解决数据库问题的邮件,Quick work! 虽然在写这篇文章的时候我还没有手动把数据库恢复回来,但只是时间问题了。昨天一个朋友,我使用的这套Wordpress主题的汉化者和我打听关于Dreamhost的信息,别的不说,我对它们的技术支持真的太满意了,虽然有半天左右的时差,但24小时内一般都能得到解决。说实话,这次”crash”我本以为需要很长时间才能解决的。200G的空间,每周增加1G,还有2T的流量,也在不断增加中。提供LinuxShell,可以在服务器上进行各种操作——这样的一台服务器一年只要花费不到200块钱就够了,支持Ruby,支持Python,当然也支持PHP。注册时在PromoteCode那里填入blogkid可以为你节省95$,也就是说只需要24$就可以买下来了,用支持美金支付的信用卡就可以付款。 如果还有这方面的问题,也可以发邮件到zhanglei909#gmail.com给我。 V2Read还有很多需要完善的地方,但我不愿意把它作为一个任务来做,我是不是越来越懒了? 其实服务器经常出点小毛病也好, 可以有很多机会通过写英文邮件和老外打交道。呵呵,刚出来的期中考试我的英语成绩是79分。
April 22nd, 2007 by 张磊
提示:近期Dreamhost已经更改了他们的主机配置,最新的介绍请看这里。 最近不少朋友们对我们买的服务器感兴趣,所以写篇blog简单说一下。我是3月中旬和Alone,popo,鲶鱼一起在Dreamhost购买的服务器。 我们买的是两年期的L1 Plan,服务器的配置是200G空间(每周增加1G)用于文件和数据库——估计超过了我们所能使用的极限了。还有2T流量(每周增加16G),也支持多种Web程序: PHP(这就不用说了吧),Ruby,JSP,Python等等。提供Shell,可以自己在服务器上做很多事情(实际上,我每天都会登录到服务器上开着shell)。支持CronJob,可以自己在服务器上定时运行程序。 一个服务器可以最多支持75个用户帐号,开通3000个Email帐号(估计这个不大用得到)。会自动进行文件和数据库的备份(可以省不少心)。服务器速度还可以,不过某些地方的朋友们可能会访问起来比较慢。Dreamhost的服务器是放在主干网上的,连接速度的瓶颈应该不在服务器端。我用wget在服务器上下载文件时,最快曾经达到每秒10M。 在服务器上可以不限数量地绑定域名和子域名,也可以开通泛域名的支持,服务器同时支持流媒体技术。更多更详细内容可以看一下这里(英文)。 使用一个多月来,没出过什么问题,速度一直不错。前些日子V2Read上线以后,数据库因为我的不恰当操作慢下来了,那边的技术人员反应很快,帮我更换了数据库服务器。每次发邮件过去基本上能在24小时内得到回复,解决得也相当满意。 更重要的是,这样一台服务器,你只需要20多美金就可以用上一年,没开玩笑。我注册以后顺便建立了一个折扣最大的折扣码”BLOGKID”,可以使所以原本要120$的Plan打折到20多美刀。只需要在注册的时候在”Promo Code or email of who referred you: “填入”BLOGKID“就可以了。我用招商银行的学生卡就可以付款。 如果想一次购买两年,也比较优惠。我们寝室就是这样的。“BLOGKID”优惠码可以省下97$。所以我们4个人一共只花了190.8-97=93.8$。也就是分担到每个人头上只用了180多元就得到了这台服务器两年的使用权。 不过话又说回来,如果网站已经做得比较大,DH的Shared Server毕竟是和别的用户共享着APACHE进程,就不一定适合继续放下去了。
February 3rd, 2007 by 张磊
昨天晚上实在太失败了。和z聊到很晚,给她推荐了Python。自己却遇到了问题: 本意是想写一个自动读取大量网页并保存的程序,Python读取URL和写入文件都很方便。没想到在构造URL上出了问题。地址里有个ID是六位的,不足补零。我用很笨的办法加上了,却发现不字符串和数字不能连接(PHP做多了,甚至觉得脚本语言这么做理所当然)。找了很多资料,但是昨天很晚了,没解决掉。对于Python字符串的处理,太不熟悉了。 后来想到用C#,但感到读取信息写入文件都很麻烦(坦白说我还没有成功用C#写入过文本文件)。然后又想到了Delphi,很好的一个东西,保存成文本文件只要一句话——可是打开以后我发现,连Delphi的语法都记得不确切了。 难道还让我用老不死的PHP?虽然一开始我就打算用PHP的。 通过这件事,我深刻认识到了把一样东西学精通的重要性。贪多嚼不烂啊。