分类目录归档:vicalloy的庄家

LBForum后续计划

开源应当是一件很认真的事。

  • 保证持续的维护与更新,保证该项目的活力。
  • 有完善的测试用例,方便在添加功能以及merge其他人的改动后进行功能测试。保证软件的质量。
  • 完善的文档,让初次接触该项目的人可以快速的知道如何使用。

我写的一些东西基本上都是出于个人兴趣,因此有些随性,兴趣来了就写一写,兴趣过了这个项目就荒废了。
LBForum曾一度荒废,近期由于集成到公司系统,顺道做了一些更新。接下来可能还会陆陆续续做些更新。

  • 增加Python3的支持
    • 单纯的增加Python3的支持并不难。由于我的测试用例并不完善,增加Python3后测试的工作量会增加,因此一直没有做。
    • 注:现在以及可以支持Python3了。比预计的要顺利不少,只做了很少的改动就完成了Python3的支持。
  • 增加Rest接口
    • 之前的Rest接口一直都是手动实现而且也还挺方便,想试试Django REST Framework看能减少多少工作量。
  • iOS的论坛APP
    • 一直想做个移动APP,刚好用论坛来尝试一下。
    • 第一个版本应当只有浏览功能,登陆、回帖、发帖等功能将在日后逐步添加。

LBForum更新Django1.10支持

前一段时间公司需要上线一个论坛系统。公司系统采用Django开发,因此考虑集成一个论坛的App,另外出于一部分私心,最终采用了LBForum
之前LBForum很久没有维护,很多依赖包的版本已经不对,导致已无法正常运行。这次更新修正了之前的一些bug,另外对依赖进行更新。现有的依赖包都明确指定版本,避免因依赖包更新导致无法运行。

这次升级后对演示站点同步进行了更新,演示站点地址: http://lbf.haoluobo.com/

LBForum的主要更新

  • Django更新到1.10
    • 目前只测试了1.10,不确定在其他版本下是否可以正常运行
  • 出于工作量的考虑,只保留v2ex主题,不再提供FluxBB主题的支持
    • 如果你想使用FluxBB主题,可切换到v1.0分支,里面有老代码
  • 去掉django-simple-avatar,使用easy_thumbnails提供用户头像支持
  • django-helper、django-lb-attachments使用django-lbattachmentdjango-lbutils进行替代
    • 前面的两个包是我很早之前维护的工具组件,现在已不再维护。后面的是现在新维护的工具组件
  • 去掉django-onlineuser
    • 这个用户在线模块一直有些问题,在想好怎么优化前暂不增加在线用户统计功能
  • 使用django-el-pagination替代django-pagination
    • django-pagination已经近乎不维护的状态,django-el-pagination在功能以及活跃度方面都要更好一些
  • 去掉South
    • Django自带的数据库结构维护已经很成熟了
  • 使用bower管理第三方JS库
    • 使用bower,避免将大量的第三方库直接塞到代码库中。
  • 上传组件替换为jQuery-File-Upload
    • 之前的上传组件依赖Flash。在Flash越来越不流行的今天,依赖Flash不再是一个好选择。
  • 使用MediaElement增加视频支持
  • 使用Pygments提供语法高亮支持
    • 在安装Pygments后,可对代码进行语法高亮

lbforum-site的主要更新

对应的演示站点也做了相应的更新。

  • LBForumdjango-lbattachmentdjango-lbutils使用Submodule的方式导入
    • 相比采用pip方式安装,使用Submodule的方式对子模块的更新和修改起来要方便的多。
  • 使用django-allauth替代django-registration
    • django-registration老早就不再维护了。django-allauth在功能以及活跃度上都还不错。
  • 针对注册,加了一个简单的校验
    • 网络上的垃圾爬虫无处不在,之前的演示站点已成了垃圾广告的集散地。这次在注册的时候加了一个简单的校验,必须在captcha内填写captcha才可正常注册。因为刚更新,还不知道效果如何。注:现在的爬虫似乎很智能了,这个功能似乎并不太有效,还是不定期会有爬虫上去发帖。

其他一些问题

  • 一直想把文档给整“好看”一些。不过写文档并不是一件轻松的事情,面对懒癌文档的事情只能继续挂起。
  • 目前主流的Python库已经都支持Python3了,增加Python3算是挺有必要的一个工作。根据之前Python3支持的经验,要同时支持Python2和Python3还是得花费一些时间。由于我主要还是用Python2,因此也先挂起了。

大家都来开发游戏?

“flappy bird”到“2048”,再到最新流行的“don’t tap the white tile”。最近似乎一个“很普通的”休闲游戏莫名的就红了,甚至flappy bird的作者都将成功归结于运气。下一个爆红的手机游戏会是什么似乎很难预测。

面对繁荣的手游市场,即使是红的不能再红的红海(任何一个热点游戏都有成百上千的clone),也很难让人不想尝试一下。

想了几个点子,然后去搜了一下,其中一个已经有人做了,而且名字都和我想的一样。不过那个游戏的UI比较烂,下载量也一般。有人有同样的想法或许是一件好事,如果没人做过的东西或许根本就不值得做。

下面总结一下爆红的游戏都有什么特点

  • 容易上手,不需要学习,拿到就就可以开玩。
  • “极限运动”,始终有突破之前成绩的可能。
  • 触屏友好,充分利用手机的特性。注:俄罗斯方块和贪吃蛇这样的经典游戏由于非触屏友好,所以是没机会红了。
  • 碎片时间。可以随时随地的玩。

[Android]标准体重

很早之前就想写个手机APP。之前想写个类似豆瓣客户端的东西,因为我认为手机APP更多的要和网络结合才有价值。
最终写APP的事一直没有真正付诸行动。最近想还是写个最简单的好了,也算是给自己一些鼓励。

标准体重 一个计算BMI指数的应用。算是Android的开发作业,功能非常简单。代码没有写的很规范,没好意思放到GitHub。

下载地址: bmi.apk.zip

注: BMI指数(身体质量指数,简称体质指数又称体重指数,英文为Body Mass Index,简称BMI),是用体重公斤数除以身高米数平方得出的数字,是目前国际上常用的衡量人体胖瘦程度以及是否健康的一个标准。

京东夺宝岛抢拍脚本

京东的夺宝岛是京东的“瑕疵品”拍卖平台。试着拍了个物品,发现竞争还挺激烈。在拍卖即将结束的前几秒,大量买家争相出价,要想用心仪的价格抢拍到自己的物品并不是一件容易的事。
简单的分析了一下夺宝岛的页面,感觉要实现一个抢拍脚本并不麻烦。找了一下没发现现成插件,于是就自己动手了。
要实现抢拍功能,一般思路是做成浏览器插件。做浏览器插件固然不错,就是写起来稍微麻烦了些。更简单的方式是用“浏览器收藏夹”在当前页面执行脚本。将javascript:void(alert('执行当前脚本'))加入浏览器收藏夹,点击该条目时将在当前页面执行JS脚本。
利用浏览器的这一特性,我写了下面的脚本。修改脚本中的最高出价以及用户昵称,将脚本并成一行,添加到浏览器的收藏夹。进入需要抢拍的页面,点击,然后就会自动帮你出价了。

javascript:void(
  t=setInterval(function(){
    max=450;//你的最高出价,超过这个价格就不抢了
    uid='vicalloy';//你在京东的昵称(总不能和自己抢东西吧)
    did=$('.list-info>li.fore1').text().replace('夺宝编号:', '');
    url="http://auction.360buy.com/json/paimai/bid_records?pageNo=1&pageSize=1&dealId="+did;
    ct=$('.over-time>strong').text();
    if (parseInt(ct)>10) return;//在最后10秒开抢
    $.getJSON(url, function(d){
      p = parseInt(d.datas[0].price)+1;
      cuid = d.datas[0].userNickName;
      if (p>max) {
        clearInterval(t);
        return;
      }
      if (uid==cuid) return;
      $.get("http://auction.360buy.com/json/paimai/bid?dealId="+did+"&price="+p);
    });
  }, 1000))//一秒钟刷新一次价格,如果你希望提高出价的成功率,可将间隔改小。

杭州公交到站时间查询

杭州公交到站实时信息查询网站: http://hzpt.sinaapp.com/
杭州公交都开通有车辆位置跟踪功能,通过查询公交位置可以计算出车辆的大致到站时间。不少公交车站也都有车辆到站时间显示的功能,相关的APP也有些。遗憾的是我的手机还是古老的S60系统,根本就没有可用的APP。于是自己做了个简单的公交到站信息查询网站供自己的手机访问。
杭州的实时公交信息可以从在 杭州公交出行实时信息服务网站 查询到。通过对网站的分析可以拿到我们想要的数据。拿到数据后,接下来的工作就很简单了。
目前这个系统最大的问题是接口的可靠性太差,查询公交实时信息的接口经常会不可用。另外一个问题是接口返回的数据也不够准确,比如系统并未区分区间车和非区间车,在查询区间车时会查不到任何信息。下面是是系统使用说明。

  • 输入需要查询的公交车车次,比如:113。如果车辆到站信息查询接口不可用,系统会给出提示。

  • 选择你需要的车次

  • 选择你需要的站点

  • 系统查询出车辆到站信息。你可以将这个页面添加到你的收藏夹,以方便日后的访问。

DPress增加一款新主题moment

为DPress增加了一款极简的主题moment。该主题由 Hsiaoming Yang 设计,也是他个人博客所使用的主题。如果想预览这款主题的效果,可直接参考 Hsiaoming Yang 的博客

主题使用方式

创建文件setttings/pre.py,在文件里增加设置 SETTINGS = ‘theme_moment’ 。这款主题支持设置页面上下的导航菜单,具体设置参考 theme_moment.py 文件。页面的主导航菜单默认为博客分类,可将DPRESS_SHOW_CATEGORYS_NAV修改为False,禁用分类。

[django-ajax-validation]Django表单AJAX校验及提交的APP

项目地址https://github.com/vicalloy/django-ajax-validation
django-ajax-validation是一个使Django支持表单AJAX校验的第三方APP。我做了一些修改,增加了表单的AJAX提交以及twitter-bootstrap的支持。

安装

  • pip install git+git://github.com/vicalloy/django-ajax-validation.git
  • 在Django settings的INSTALLED_APPS中加上”ajax_validation”。

一个简单的使用范例

views.py

from ajax_validation.views import validate_form
from ajax_validation.utils import render_json_response
...
class TimelineForm(forms.ModelForm):
    class Meta:
        model = Book
def add_book(request):
    #创建表单并进行校验。返回表单以及校验结果。
    form, validate = validate_form(request, form_class=BookForm)
    if validate['valid']:#如果校验成功,执行保持操作
        book = form.save()
    return render_json_response(validate)//返回JSON

模板

进阶

django-ajax-validation的原始文档就写的非常糟糕,我也偷懒,所以想了解更多还是直接看代码吧。

将LBForum、“似水流年”的部署环境切换到Gunicorn+Supervisor

Gunicorn 是一个Python WSGI UNIX的HTTP服务器。Gunicorn有着不错的性能以及稳定性。Gunicorn对WSGI、Django、Paster提供了很好的支持,使用起来非常的简单。
此前 LBForum似水流年 使用apache+wsgi的方式部署在webfaction上。为了给服务器节约些内存将部署方式切换到Gunicorn。不过似乎效果并不明显。除工作进程外,Gunicorn还会另外启动一个master进程用于管理子进程。master进程加一个子进程的内存耗用量加在一起大概在40M左右。
注:在一些评测里Gunicorn的性能并不是太好。Gunicorn支持多种 worker-class ,默认的worker-class使用的是同步模式。在将worker-class切换到gevent或tornado性能会好出不少。

DPress部署到SAE

将DPress部署到SAE的简要说明。如果你在部署过程中有遇到什么问题,欢迎反馈。

  • 在SAE管理后台创建应用,开发语言选择python
  • 使用svn将应用代码更新到本地
  • 修改配置文件config.yaml
name: 你的应用名称
version: 1
libraries:
- name: django
  version: "1.4"
  • 将DPress sites目录下所有文件复制到SAE应用目录(如:dpress/1/)。
  • 在应用的根目录下创建目录libs(如:dpress/1/libs/)
  • 将virtualenv.bundle.zip复制到libs目录
  • 在服务管理中启用mysql数据库
  • 由于SAE上无法使用Django命令。需要在本地使用syncdb命令在本地mysql数据库中创建好DPress的初始数据,然后使用SAE的phpmyadmin将数据导入到SAE。
  • 在服务管理中创建Storage,并将Domain设置为base
  • 创建配置文件settings/local.py
# -*- coding: UTF-8 -*-
import sae.const
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': sae.const.MYSQL_DB,                      # Or path to database file if using sqlite3.
        'USER': sae.const.MYSQL_USER,                      # Not used with sqlite3.
        'PASSWORD': sae.const.MYSQL_PASS,                  # Not used with sqlite3.
        'HOST': sae.const.MYSQL_HOST,                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': sae.const.MYSQL_PORT,                      # Set to empty string for default. Not used with sqlite3.
    }
}
DEFAULT_FILE_STORAGE = 'saestorage.SaeStorage'
FILEBROWSER_DIRECTORY = ''
STATIC_URL = 'http://vicalloy.sinaapp.com/dpress/'#修改为你静态资源位置
DPRESS_TITLE = u'天地一沙鸥'
DPRESS_SUBTITLE = u'to be continue'
DPRESS_DESCN = ''
DISQUS_SHORTNAME = ''
GOOGLE_ANALYTICS_CODE = ''
#根据你的静态资源位置进行修改
EPIC_JS = 'http://vicalloy.sinaapp.com/dpress/dpress/epiceditor/js/epiceditor.min.js'
EPIC_BASEPATH = 'http://vicalloy.sinaapp.com/dpress/dpress/epiceditor'

  • 到这里服务已经可以跑起来了。由于没有对静态资源进行配置,将出现无法找到静态资源的情况。
  • 创建一个新的SAE应用,应用类型选择PHP,专门用于管理DPress的静态资源文件(如:dstatic.sinaapp.com)。
  • 在本地运行Django的collectestatic命令将DPress的静态资源收集到sites/collectedstatc/目录。
  • 将collectedstatc中的内容复制到新创建的站点
    • 如:static/dpress/。对应的STATIC_URL配置文件修改为 http://dstatic.sinaapp.com/static/dpress/