2014年8月10日 星期日 晴

这两天中午都没吃饭,昨天是出去看房了,今天想着的是家里无人适合一个人安静地写代码,总之一方面是清除胃里的积食,二是为了减肥吧。走路看房四小时和连续写代码四小时哪个耗费的能量大,我不太确定。

种种原因吧,由于胃不舒服、时间问题、要出去看房、要带帅帅学习和玩,一个抄袭的口算网站写了月都没写完,今天终于痛下决心了结了,不能再拖了。

下面是开发总结: 一、SVN历史记录 网站是用python,Tonador下的,部署在SAE上,看了一下svn的历史记录: 20130416:代码初始化,从别的地方拷贝了一份之前的基础代码,配置新浪微博登录和QQ登录。 20130801:加入了微信的支持。 20130802:加入结巴分词,当天改用SAE自带的分词;加入订阅功能 20130806:修改回复的文字 20130808:支持淘宝Auth登录 20130813:调试淘宝相关 20130814:修改SAE的Storage,SAE官方改了接口 20130814-20130901:开发完成多个淘宝商家辅助功能,主要是卖家自用。 20140609-20140810:废弃淘宝功能(我有其他自研网站替代了),开发完成口算功能,拖的够久的了。

二、网站介绍

  1. 参考的网站:http://www.mliwa.com

我在上海eddu上看到的这个网站,前台主要是Bootstrap,后台主要是Django,口算题有RESTful的API。作者在上海,小孩上小学吧,然后在eduu上分享了他写的网站。他应该是混迹python邮件列表,在几个城市漂泊过,现在应该定居上海,我似乎还看过他之前的博客和一些照片。

  1. 我写的网站:http://toy06.sinaapp.com 主要用途:学习;给帅帅学习自用。 主要功能跟参考网站差不多,前台css和js页面基本是抄袭人家的,我没有写好前台页面的能力,只有抄袭的能力。后台用的是Tornado。由于js抄了人家的,所以RestAPI主要是高仿人家的。

  2. 开发工具:主要是Firefox(Firebug)、Ulipad,调试基本靠print在后台看。我一般写代码比较顺,不怎么调试。在公司写代码也无法看后台,无法打log调试。

  3. 开发时间:主要是在公司偶尔偷偷写,周六趁帅帅出门写,周日趁帅帅睡着写,开发时间碎片化,不连续。

三、主要遇到的难点

主要有两处,其他的地方就不值一提了。

  1. PDF的生成 主要是中文字体问题吧。害得我调试了两三天,之前有写过一篇《用xhtml2pdf 生成pdf文件

  2. 口算题的生成 跟Pdf相比,我由于一开始太激进,看到别人网站就开始写了,没想好,结果走了很多弯路。这篇主要是想谈一下开发走的弯路。

口算题是在后台生成的,前台有一个js配合显示和打印,我沿用了mliwa的js,所以,我必须写跟mliwa一样的Restful输出才行。

(1)每种题目都自己写一遍 有几十到上百种类型的题目,每种题目,我都自己手工写符合别人算法的函数出来。 我主要用到了random函数,随机输出。 真的写死我了,我写函数输出的时候,觉得不是在考小学生,真的是在考我。

上一段代码吧,下面代码片段只是其中一道题。每次我都得先用firebug看看别人的restful是怎么输出的,然后我再参考着写。 [code]
elif op1type == 4: for loop in xrange(qcount): caldict = {} caldict[“id”] = loop + 1

ca = random.randint(0,1) if ca: caldict[“ca”] = True else: caldict[“ca”] = False if etsi == 10: caldict[“op1”] = 1 else: caldict[“op1”] = random.randint(1, 2)

if caldict[“op1”] == 1:

? - 3 = 2

if etsi == 10 or etsi == 37: caldict[“ans”] = maxnum else: caldict[“ans”] = (random.randint(maxnum + 1, 100000)) % (maxnum + 1) caldict[“opd1”] = random.randint(maxnum + 1, 100000) % (caldict[“ans”] + 1) caldict[“opd2”] = caldict[“ans”] - caldict[“opd1”] else: caldict[“opd1”] = (random.randint(maxnum + 1, 100000)) % (maxnum + 1) caldict[“opd2”] = random.randint(maxnum + 1, 100000) % (caldict[“opd1”] + 1) caldict[“ans”] = caldict[“opd1”] - caldict[“opd2”] caldict[“opp1”] = 2 caldict[“op2”] = None caldict[“opp2”] = None caldict[“opd3”] = None caldict[“cq”] = True questions.append(caldict) [/code]

最后,我耗费着我的时间和耐心,我真的写完了,还整理归纳了一下,给pdf和在线打印也沿用了。我才发现,mliwa每做完一次题目,都可以查看结果,结果中有每道题的结果和算出来的答案是什么,如果答错了有高亮出来。看到这里,我知道我前面的做法是不可能做出这样的结果的,因为我的题目是随机的。我的caldict[“id”]是递增的,每次对应的题目是随机的,而mliwa的是固定的一个数字,mliwa是根据id来知道题目的。

(2)随机生产自己的题目 好吧,那我也做一下我的题库好了。我又不假思索地写了,我觉得很简单。是的,比之前的1来说,我随机生成题目真的很简单,比如5以内的加法。我写了几道题的算法,生成了题目库,却为10000以内的加减法发愁了,这个能随机生成多少组合啊。

(3)抓取别人的题库 我最终的解决方法是,写一个脚本,把mliwa的restfulAPI都抓取下来。他的API一次可以抓300道题,一种类型300道题够用了。

我一开始是写在本地的两个字典里,一个文件里就是一个字典,通过import来调用。一个是记录一种类型的题目id,索引是etsi(类型编号);另一个是记录这个题目的答案,索引是题目id。

import的时候,网站是巨慢的,所以我把题目答案导到SAE的KVDB了,速度增快很多。

(4)如果不怕mliwa关站或者停用服务的话,其实可以直接用mliwa的Restful API,我是不敢的。

四、未来的使用 我看到mliwa的网站有几个月了,大概用户累计做了5700道题吧。他还有每日竞赛,但我很少看到有人做。总之,这个网站用户是不多的,换成是我来推广,可能也好不了到哪里去。

我的思考: 如果要我来继续运营的话:

  1. 我看好答题类的应用,简单、不费时间。
  2. 微信朋友圈的传播。
  3. 微信订阅号:每日一题

总结:可以做答题类网页,在微信朋友圈中转发、微信订阅号订阅获取流量。