电子阅读”平台“之路
六 29th
【最近在公司负责做电子阅读的项目,一个向网络平台方向发展的项目, 看了些文章,有些思考便写了下来。】
在这个互联网时代如何创建一个平台?看着tencent的成功,淘宝的发展,很多人都会问这样的问题。
但是就算你去询问最成功的互联网认识,或许他们也不能给你最准确的答案。就像我们无法准确的了解金字塔是怎么建成的。
首先我们要从平台的概念来入手,发展到现代,所谓的平台更像是一个”舞台“,拥有很强的互动性,用户可以在上面,交流,学习,交易。
从这个概念来看,平台需要用户,需要核心资源,需要互动。所以如果说平台是可以创造出来的,还不如说平台是慢慢积累而成的。
就像金字塔是由无数个工人,无数块石头搭建起来的一样。
在这里虽然我无法准确的告诉你如何创建一个电子阅读领域的”金字塔“,但是我将描述一种比较好的网站发展战略——”金字塔“发展战略。
让我们从金字塔的底层开始看:
- Content(内容):
”内容为王“虽然已经是陈词滥调,但却是互联网不变的真理。就算一个网站拥有稳定的技术,华丽的界面,没有内容,那也将是一个空壳。如果已经拥有了用户真正需要的内容,那将为以后的发展打下坚实的基础。
”内容为王“不是:
包罗万象而无一精。
拷贝黏贴而无一用。
”内容为王“是:
专业于某一个领域
专注于某一群用户。
在这个互联网时代,单纯保罗万象的资源已经无法吸引用户,因为用户有Google,有Baidu。如果一个网站刚起步便以阅读平台为目标,即做电子小说又做电子杂志,甚至还有听书。结果会发现90%的栏目将无人问津,平台更是无从提起。
因为这种多样性的产品对于一个刚起步的团队来说是一种无法承受之重。
现代的互联网产品需要专注,专注是指清晰的流程,简约的设计,精致的内容,灵活的团队,从而打造出轻量级的产品。从另一方面来看专注需要我们从身边的需求出发,而不是以平台为目标打造产品。就像摄影里说的”最美的风景其实就在你身边的一公里之内“。
即使是现在的腾讯和淘宝,他们也往是朝着轻量级的方向发展。他们没有庞大的产品和服务结构,而是由若干个轻量级相关的产品组成了现在的平台。
关键词:用户需要
- Usability(可用性):
不管你的网站拥有多少精彩内容,如果无法让用户容易的找到他想要的东西那也是徒劳。就像一个优秀的工程师如果无法表达他产品的理念,即使这个产品有艺术品般的代码,也无法诞生一个伟大的产品。
特别是针对阅读网站,如何设计一个复合阅读者习惯的网站是至关重要的,就像苹果的IPad备受追捧,正是因为他在电子阅读体验上有了重大的突破。
如果你的网站现在就存在这样的问题,你可以先从这几个方面来看看:
导航是否合理,用户是否能理解?
网站布局是否合理,你是否能将用户最需要的东西放在他最容易找到的地方?
设计是否合理,是否有吸引用户注意力的图片?
为了解决这些问题你可以邀请一些目标用户进行实地测试并反馈,或使用一些用户行为分析工具,如热点图。
如果解决了这些问题那么你又向金字塔的顶端迈进了一步。
关键词:用户会用并喜欢用
- SEO(搜索引擎优化):
也许你会疑问为什么SEO不是在金字塔的底层,我们最需要的是让用户能找到我们的资源?的确是这样我们要让更多的用户找到我们的资源。但是搜索引擎是”聪明“的,或者说它是站在用户的角度去分析一个页面,从而得出用户最先想要看到的是哪个网站的页面。所以如果你有了精彩的内容,那你已经做了一个很重要的搜索引擎优化工作,当然其次你还要使用一些技巧,从关键词,页面代码结构上进行优化,使得你的网站更能取悦搜索引擎。
关键词:用户找到
- Social(社会化):
如果你的网站在内容、用户体验、SEO上都已经打下了基础,那么你可以将触角伸向社交网络平台,或者其他的终端平台(如手机、手持阅读设备、电视),并开发自己平台,因为互联网需要开发。从而让你的网站和资源有更多的曝光率,并在这个基础上进一步改进网站的内容和功能。这里的社交平台指的并不是我们自己建立的社交平台,而是如QQ空间,人人网,开心网等,我们需要允许用户将网站的资源转载到这些社交平台,或者达成更深度的网站合作,这些社交平台的信息流通速度是惊人的。
刚才已经说过互联网的产品需要专注,也没有能保罗万象的产品,腾讯也是同样的,QQ空间的读书频道来自于豆瓣的合作,而收菜游戏则来自于五分钟。下面让我们从QQ空间和豆瓣的合作来看看社会化之后带来的效果。
2009年8月QQ空间和豆瓣达成了合作,我们来看看2009年-2010年期间豆瓣注册用户总量的变化。
关键词:更多的用户
- PPC(为每次点击付费,即广告)
现在你已经接近了金字塔的顶端,你可以投入更多的宣传费用,通过付费点击广告,或者其他广告方式来巩固你的市场地位,并让你的品牌深入人心。
关键词:品牌
最后,如果你已经成功的打造了一个”金字塔“,也许平台之路也就不远了。
拍照纪念,开始使用IMac的日子
四 25th
经过漫长的等待,公司里的IMac终于到了。
接到同事的短信,抑制不住心中的激动,当晚跑去体验了一番(还好家住的离公司比较近)。
想当年为了使用苹果系统,硬在PC机上装Mac真是痛苦的经历。
到了公司,可惜原本苹果电脑上装的是Windows,买Mac装XP真的是一种“奢侈”的行为。
但是放在桌面上的苹果电脑,依旧是很有质感。
除此之外还有一台“极品”的19寸Macbook Pro,也发上来晒晒。
紧接着当然是给苹果换回苹果系统,想装雪豹。
由于这两台IMac并非新机,而且系统盘也没有,所以网上Down了一个镜像刻到硬盘上。
竟然无法安装,最后发现下载的是随机版的系统,只有零售版可以安装多台机子,一个镜像6G多又要重新下载,所以也挺折腾的。
希望大家以后安装苹果系统时注意这一点。
最后,苹果的产品真的很不错,随着IPhone,IPad,IPod这些优秀产品的出现,苹果封闭的模式慢慢会体现出优势来。
对于一个开发者,为了开发苹果的应用,你不得不购买一台苹果电脑,或许只有苹果才有这种信心设立这样的门槛。
但当你真的用了苹果电脑后,或许你会真的喜欢上苹果。
Python应用:轻量级Web框架Quixote
二 13th
缘起
Quixote是 由美国全国研究创新联合会(CNRI,Corporation for National Research Initiatives)的工程师A.M.Kuchling、Neil Schemenauer和Greg Ward开发的一个轻量级Web框架。和几乎所有的开源项目一样,Quixote也是为了满 足实际需要而出世的。
CNRI当时在进行一个名为MEMS Exchange的项目(http://www.mems-exchange.org/)。MEMS是微机电系统的缩写,制造一个MEMS设备往往需要多种制造设备,单个工厂可能无 法提供所需的所有设备。因此,MEMS Exchange项目就是要整合起多家制造厂的资源,利用互联网派单和追踪制造过程,形成一个分布式的MEMS设备制造网络。
起初,他们做了一个Java版的客户端程序提供给用户,但他们发现,没有人愿 意使用这个客户端程序,大家还是习惯性地用邮件发送加工过程。最终他们认识到,虽然客户端的表现力更强,功能也更完整,但相比起要下载一个庞大的程序,用 户更加愿意使用他们每天面对的浏览器来做事情。于是,他们决定改到Web界面上来,要做一个Web应用。但是用Java的servlets开发Web应用 是一件非常低效的事情,所以他们选择了Zope(和现在不同,在1999年,Python的Web应用框架没有什么选择的余地,基本上是Zope一家独 大)。3个月的开发之后,他们得到了一个运转良好的系统。
然而,Zope带来的快乐并没有持续多长时间。几个月后,他们想提供更加复杂 一点的界面,却发现用Zope写的代码难以维护和调试,在浏览器的文本编辑框里写代码也实在不是什么好的体验。由于当时除了Zope之外也没有什么别的 Python Web框架,他们决定:自己写一个!在2000年,编写一个新的Web框架是类似于向风车挑战一样的事情,开发团队自嘲地用堂吉诃德的名字命名这个框架:Quixote。
Quxiote的特点:
一、目录式的URL分发规则
所有的的Web框架要解决的第一件事,都是如何将用户的URL请求映射到程序上去。与ROR和Django这类基于Route和正则匹配的框架不同。Quxiote使用目录的方式逐层查找来实现的,最后请求将被映射到一个类的方法上。
假设你有一个应用是app。如果用户请求http://localhost/hello/,Quxiote将会将这个请求映射到app.hello._q_index()这个方法上,_q_index()方法是Quixote默认的根路径方法。如果用户请求http://localhost/hello/world, Quxiote将会将这个请求映射到app.hello.world()这个方法上。如果你需要为用户的访问设置权限,你只要实现相应目录下的_q_access()方法。
二、最接近Python的模板语言
Web 框架的模板一直是备受争议的环节,因为不同的模板框架提供了不同的模板标签,这提高了开发人员的学习成本。
所以Quxiote提倡用Python来写模板,最大程度的使用已有的Python编程能力。
Quxiote的模板语言叫做PTL(Python Template Language),PTL的模板文件以.ptl结尾,需要执行Quxiote的quixote.enable_ptl()之后Python才会像解析.py一样解析.ptl文件。PTL文件将html代码嵌入到Python代码中,并进行切块。这样你能在模板中随意的书写Python的代码来实现模板。这和现在比较流行的模板实现机制恰好相反。本人还是比较支持,以html作为模板文件,再用Python来解析html中的标签。这种方式更加清楚,可维护性更高。
三、显示标记,拒绝魔术
在The zen of python 中有一句话
Explicit is better than implicit. #显示的说明要比不言明的好。
所以如果你在Python命令行中输入:
import this
便可以看到有趣的提示,这便是Python编程所坚持的哲理
在Quixote中需要公布出来的路径需要配置在一个_q_exports=[]列表中。配置的内容即方法名称。
Quixote的优点:
- 简单,Quxiote的全部代码量为7000行左右,而且包含了大量的注释,如果去掉注释,则只有大约2500行代码。这也是我选择Quixote来学习Python的原因,因为你能容易通过阅读代码看到Quxiote做了什么。
- 高效,这一方面得益于Python语言本身的特点和Quxiote简单的架构,另一方面得益于用PTL模板。
- 安全,这也得益于Quxiote的简单,使得我们能很好的控制框架,并且它提供了一些HTML输出方法,保证了HTML输出的安全。
- 自由,开源就是好!
- 久经考验,历史悠久,在大量的企业应用中被证明是一个高效,灵活,稳定的框架,最著名的应用就是豆瓣(http://www.douban.com),我也是从豆瓣的架构中知道了Quxiote。
Quxiote的缺点:
- 没有内置的数据库支持和安全验证机制
- PTL适合程序员,并不适合美工参与前端代码的编写和修改
- 内置服务器不能很好的支持Debug,如果使用simple_server.py来调试虽然可以跟踪到,但是如果修改代码必须重启服务器,如果使用cgi,虽然修改代码后不用重启服务器,但是无法跟踪到代码,并且Quixote提供的Session支持会失效,除非使用Session持久化。
- 没有内置WSGI的支持,WSGI是Python PEP中提出的规范即(Web Server Gateway Interface)这个规范被广泛应用,使得Python Web Server 和 Python Web Framework能很好的兼容。
总结:
首先,对于想学习Python Web开发的人来说,通过使用Quixote将会带来很多的好处,Quxiote很接近Python,不会像Django和Pylons虽然提供了很好的开发流程,也能很快的上手,但是很难了解到这些框架到低做了什么,至少对于初学者来说,使用这些框架并不太适合。而Quixote代码量少,但包括了很多核心功能的实现,如Request,Response,Session,WebServer等。
其次,Quixote的简单使得Quixote非常灵活,也意味着你需要做更多的二次开发,所以想用Quixote做出好的网站,还需要有一定的Python基础。如数据库开发,Python多线程应用等等。
由于Quixote并没有为我们提供数据库的支持和安全验证机制,但是你同样可以使用一些已有的框架来解决这个问题,如SqlAlchemy。SqlAlchemy可以说是Python的ORM标准,就像Java中的Hibernate一样,所以是不二的选择,很多人没有选择Django,也是因为Django的ORM解决方法并不能让人满意。
另外本人并不使用Quixote的PTL,毕竟时代的发展已经有更好的技术来替代他了,比如Python的模板引擎Mako,豆瓣在新的开发中也部分使用了Mako。
SqlAlchemy和Mako的介绍以及和Quixote集成的文章也会陆续推出。
【扩展阅读】
The zend of python :http://www.python.org/dev/peps/pep-0020/
Python Web Server Gateway Interface:http://www.python.org/dev/peps/pep-0333/
Quixote White Pager:http://www.quixote.ca/overview/paper.html
QuixoteCookbook:http://www.quixote.ca/qx/QuixoteCookbook
不可忽视的DocType
二 3rd
1. doctype是什么
doctype标签 用来指定document的dtd(Document Type Definition)的,写在每个html的最前面,形如:
<!DOCTYPE RootElement Availability “URI” [declarations]>
如几种常见的doctype:
- HTML 4.01: Strict<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01//EN” “http://www.w3.org/TR/html4/strict.dtd”>
- HTML 4.01 Transitional<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd”>
- XHTML 1.1 Strict DTD<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.1 Strict//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd”>
2. doctype能做什么
有没有指定doctype, 以及指定不同的doctype都会激活不同的浏览器模式,从而产生对一些对html,css和js的影响,其中最著名的就是所谓的盒模型问题。
2.1 为什么会有多种模式
在很久很久以前还是netscape和ie争霸天下的时代,由于太强大了,浏览器模式是由浏览器自己说了算的。时光流逝,转眼到了战国群雄的时 代,大家发现如果都自己说了算的话天下就乱套了,就商量说推举个盟主吧,于是w3c就上台了。但是问题又来了,譬如IE,虽说再不能一头独大,向标准看齐 是大势所趋,但是假如浏览器只支持标准的话,之前的许多页面又会产生一些问题。
于是doctype应运而生,假如没有指定任何doctype,就采用原先的模式,被称为怪癖模式(Quirks Mode),假如指定了doctype,就遵循标准,被称为标准模式或严格模式(Standards Mode)。期间,以Mozilla为代表的几位,觉得标准模式里诸如img的解析不是很合适,就保留了一些个人意见,在指定一些特定的doctype情 况下,会采用一种准标准模式(Almost Standards Mode),具体情况请参考Activating Browser Modes with Doctype,或译文用doctype激活浏览器模式。
2.2 不同模式的具体影响
ppk大牛已经给我们 做了很好的总结,Quirks mode and strict mode。
2010年计划
一 7th
一、巩固——做项目
项目巩固自己的技术,以前更多的可能是为了技术而学习,以后希望能将技术更好的结合到实践当中,让技术真正产生更多的价值。
二、加强——再学习一种语言
暂定Python,关注它已经挺久了,就是没机会好好去用它,也没想好怎么用,学习中…
三、提升——学习计算机之外的知识
一方面,觉得自己基础知识太薄弱了,想加强一下;另一方面计算机只是个工具需要别的知识来支持它,才能做出好东西。
一本想再看一次的书,萨米尔森——微观经济学,这本大学期间的书,那时候只是过了一遍,现在想认真的再看一次。
四、旅游
想找个地方旅游一次。
回顾2009年
一 7th
换了个城市,从杭州回到温州,仿佛是种重新开始,但温州的计算机行业真的不行。
换了个工作,但依然做着自己喜爱的网络开发工作。
换了个岗位,以前不愿意做的事得做,觉得没有意义的事情也得做,当作一种磨练吧。
Oracle查询指定记录数的奇怪问题
十二 25th
首先看一段代码:
dbo.getPreparedStatement("select * from (select * from Entity_HotLink wherehotLinkSortId = ? and hotLinkStatus = ? order by hotLinkOrder ASC, lastModifiedDate DESC) where ROWNUM <= ?");
dbo.pstmt.setInt(1, hotLinkSortId);
dbo.pstmt.setInt(2, hotLinkStatus);
dbo.pstmt.setInt(3, count);
环境1:windows + oracle 10g 正常
环境2: Redhat E5.2 64bit + oracle 10g(RAC集群) 查询执行,但是返回记录数只有10条,不管你的count有多大。
改成
dbo.getPreparedStatement("select * from (select * from Entity_HotLink where hotLinkSortId = ? and hotLinkStatus = ? order by hotLinkOrder ASC, lastModifiedDate DESC) where ROWNUM <= " + count);
dbo.pstmt.setInt(1, hotLinkSortId);
dbo.pstmt.setInt(2, hotLinkStatus);
则都能正常查询记录。
此问题比较奇怪有问题再研究研究。
Python2.6.4 配置Mysql问题
十二 21st
操作系统:window xp sp3
python版本:2.6.4
mysql:5.1
MySQLdb:MySQL-python-1.2.2.win32-py2.6.exe
在Python上配置mysql会碰到以下问题:
1、ImportError: DLL load failed: 找不到指定的模块。
解决方法:下载libmmd.dll(附件)和libguide40.dll(附件)两个dll文件并复制到python安装目录的Lib\site-packages下,或者windows/system32下。
参见:http://sourceforge.net/forum/message.php?msg_id=5613887
2、DeprecationWarning: the sets module is deprecated
from sets import ImmutableSet
解决方法:
1) file “__init__”, replace:
from sets import ImmutableSet
class DBAPISet(ImmutableSet):
with
class DBAPISet(frozenset):
2) file “converters.py”, remove:
from sets import BaseSet, Set
3) file “converters.py”, change “Set” by “set” (IMPORTANT: only two places):
line 48: return set([ i for i in s.split(',') if i ])
line 128: set: Set2Str,
参见:http://sourceforge.net/forum/message.php?msg_id=5808948
资源下载:http://i.19830102.com/archives/164
FastDFS试用
十二 18th
环境:Ubuntu 9.10 64bit
FastDFS 1.21
FastDFS总体来说安装比较方便,配置简单。
安装可参照官方文档
./make.sh
./make.sh install
如果无法执行这些命令请先安装gcc
sudo apt-get install gcc
另外在Ubuntu系统上安装时需要将make.sh最后一段if去掉,否则./make.sh install时会报错。
接着新建一个数据存放的目录
sudo mkdir /data
sudo chown user:group /data
然后配置参数,分为两部分一部分是storage.conf另外是tracker.conf
文件在/etc/fdfs中
启动tracker
sudo /usr/local/bin/fdfs_trackerd /etc/fdfs/tracker.conf
重启tracker
sudo /usr/local/bin/restart.sh /usr/local/bin/fdfs_trackerd /etc/fdfs/tracker.conf
启动stroage
sudo /usr/local/bin/fdfs_storaged /etc/fdfs/storage.conf
重启stroage
sudo /usr/local/bin/restart.sh /usr/local/bin/fdfs_storaged /etc/fdfs/storage.conf
如果启动时报找不到http.conf则sudo touch /etc/http.conf再启动就好了
monitor
sudo /usr/local/bin/fdfs_monitor /etc/fdfs/storage.conf
更换storage的IP后,需要删除以前的IP信息,使用fdfs_monitor命令:
/usr/local/bin/fdfs_monitor config_file [list|delete
测试上传
/etc/fdfs/storage.conf upload /usr/include/stdlib.h
Ubuntu 9.10的163源速度很快
十二 17th
deb http://mirrors.163.com/ubuntu/ karmic main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ karmic-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ karmic-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ karmic-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ karmic-backports main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ karmic main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ karmic-security main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ karmic-updates main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ karmic-proposed main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ karmic-backports main restricted universe multiverse





最近评论