前段时间SAE开始分发python的内测名额,一时手慢,错过机会。不过倒看到SAE可以申请开发者证书。申请资格中写有开源作者可以申请高级开发者证书。由于错过内测名额,所以就有啥拿啥吧。
感觉SAE的这次营销策划想法非常的好。可以花很少的钱就可以做到不错的推广效果,最重要的是还能得到一个皆大欢喜的结果。
PS:
申请一个SAE证书还是有些好处的。申请成高级开发者后,每年可以有¥1800的免费SAE资源可以使用。
分类目录归档:vicalloy的庄家
二手数码控的pagerank为3
将博客切换到主域名的重要原因之一是博客的pagerank居然为0。虽说pagerank只是浮云,但考虑到我的博客已经存在了这么久,0这个数字多少有些让人难以接受。将博客切换到主域名,希望pagerank能有所提高(至少别继续维持在0了)。看网上说pagerank每三个月更新一次,先耐心的等待了。
今天忽然发现二手数码控的pagerank居然有3。有些太没天理。网站才上线几天,即无人来,也没有啥外链,pagerank居然也能到3。
Django标准化项目dj-scaffold
由于Django没有象rails一样指定项目的目录结构规范,很多人都对django项目的目录结构要如何组织而感到困惑。为此我又新创建了一个开源项目dj-scaffold(django的脚手架)。这个项目用于自动生成一个标注化的django项目和app。
项目地址:https://github.com/vicalloy/dj-scaffold
安装
已经发布到了pypi,所以你可以用pip或easy_install 来进行安装。
pip install dj-scaffold
easy_install dj-scaffold
使用
dj-scaffold主要提供了两个命令,dj-scaffold.py和lbstartapp。
dj-scaffold.py
该脚本用于取代django的startproject命令。使用方式如下:
dj-scaffold.py projectname
在该命令执行后,将创建项目projectname。在项目的scripts目录中提供了脚本create_env.py和env.rc。
- create_env.py 执行该脚本将自动初始化python虚拟环境。新生成的python虚拟环境在env目录。
- env.rc 该脚本用户启动python虚拟环境(source env.rc)。该脚本同时为python manage.py设置了快捷方式$mg。你可以在任何目录调用$mg来执行django命令。比如你用$mg runserver来启动测试服务器。
项目对应的目录结构如下:
注:文件太多,去掉了部分不重要的文件
dj-scaffold.py projectname
|+docs/ #用于存放项目的相关文档
|+env/ #python虚拟环境,由脚本自动生成
|~requirements/ #第三方依赖包的存放位置
| `-requirements.pip #pip的依赖说明文件
|~scripts/ #系统相关的脚本
| |-create_env.py #创建python虚拟环境(env目录)
| `-env.rc #进入python虚拟环境。同时提供python manger.py的快捷方式$mg。可在任意目录使用$mg。
|~sites/ #Django的项目文件。在settings文件中增加了部分默认配置。如数据库默认使用sqlite,设置项目的模板以及静态文件目录。
| |+media/ #项目静态文件(用户上传)
| |+static/ #项目静态文件(css、js等)
| `+templates/ #项目模板
|+tools/ #一些项目依赖的第三方工具包。如python虚拟环境初始化脚本等。
`~wsgi/ #项目部署用的wsgi文件
`-dj_scaffold.wsgi
lbstartapp
lbstartapp作为django的扩展命令提供。将dj_scaffold加到INSTALLED_APPS后即可使用该命令。该命令将生成一个标准的app,相比django自带的startapp,lbstartapp将那些不太常用的app默认目录也都给生成了出来。对应目录结构如下:
|+management/ #命令目录
|+static/ #静态文件目录
|+templates/ #模板目录
|+templatetags/ #tag目录
|-__init__.py
|-admin.py #admin管理后台的models配置文件
|-forms.py
|-models.py
|-settings.py #app自己的settings文件
|-tests.py
|-urls.py #urls配置文件
`-views.py
NOTE
- 项目的大多代码来自:https://github.com/lincolnloop/django-startproject
- 类似项目:https://github.com/mozilla/playdoh 个人觉得这个项目还可以。不过我个人觉得自己写的更符合自己的习惯。
- “摒弃魔法”是Django的哲学之一。为此Django没有为用户提供太多的默认操作,它希望一切对用户都是显示可见的。这本没太大的问题,但在我看来“no magic”并不代表连规范都不要。Django实在是太缺乏一些必要的规范。
把二手数码控的代码放到github托管
项目地址:https://github.com/vicalloy/scnews
对目录结构做了些调整,并将代码托管到github。
虽说对互联网行业比较感兴趣,工作却一直和互联网没多少关系,说起来也是叶公好龙。这世界大多人都是“说,天下无敌。做,无心无力”。于是想,整个简单的项目做个实践吧。
因为这是业余时间的一个实践,为不妨碍自己的工作与业余生活,这个项目必定会是一个非常简单的项目。
网站定位
现有二手交易网站的问题
每个人都会有些食之无味,弃之可惜的东西。目前交易二手货的主要途径有:淘宝、58等同城网站、专业论坛(如苹果产品的weiphone等)。
- 淘宝 对普通用户的二手交易有诸多限制,发布二手信息非常的不方便,也不容易被其他用户找到。通常用户在淘宝发布二手信息后,还需到专业论坛发帖宣传。
- 同城网站 信息确实非常的多,信息的真实性方面就没多少保证了。无用信息过多,用户想过滤出有效信息的成本过大。 同城网站发布的信息按照城市区分。我认为这是一个过时的做法。在物流业高度发达的今天,很多二手交易已经不再受到同城的局限。
- 专业论坛 就目前而言专业论坛是完成二手交易的最佳地点。首先论坛ID本身就具备一定的信誉。其次,既然是专业论坛,信息的精准性比较有保证。论坛的最大问题是,论坛的数量众多,而且也会有不少同质性的论坛。如果想更有效的找到自己所需要的东西,你可能得同时关注好几个论坛。
我希望做成怎么样
在众多的二手物品中,数码产品有其特殊性。
- 量多 数码产品的更新速度越来越快。潮人们,喜新厌旧,很多数码产品在卖相很好的时候就已被打入冷宫。二手数码产品买、卖需求都不少。
- 物流成本低 如果是家居,物流成本高,这些东西基本上只能做同城交易了。数码产品一般都比较轻,物流成本低,通常不受同城的限制。
网站形式
- 以数码产品的交易为主题,网站形式类似现在广泛存在的同城网站。
- 因为数码产品的交易大多不受同城的限制,因此取消同城的设置。
- 信息发布方面,尽量简单。用户发布信息时,只需要填写简单的物品描述信息即可,和论坛发帖类似。
- 只能发布二手信息,不可发布求购信息。
- 加强SNS功能。在个人信息页面中尽量提供个人主页、douban、facebook等信息,以ID作为信誉保证。
为啥最终作成了数据挖掘网站
做个简单的二手交易网站的工作量并不大。但没基础的核心用户,网站基本上无法正常运作起来。若是为了提供基础数据,让系统从其他网站抓起数据来滥竽充数,则无法形成网站的“文化”。既然如此,倒不如先做个数据挖掘的网站。若该网站能积累一定的基础用户,则可考虑启动下一步的工作,启动二手交易网站方面的工作。
二手数码控功能规划
二手数码控特指数据挖掘网站,二手交易部分的功能至少在短期内是不在议程之内的。考虑到今天太晚,这部分的内容留在下次再写。
二手数码控,论坛二手信息汇聚网站
二手数码控 是一个论坛二手数码信息的聚合网站。目的是想将各大论坛中的二手数码信息汇聚起来。这个网站会有些类似论坛二手信息的搜索引擎。
目前这个网站还非常的简单,只是简单的将一些数码论坛二手区的rss汇聚了起来(使用feedparser做rss解析)。日后会增加搜索功能,并仿造googlereader的做法提供帖子的摘要信息。RSS以及移动终端的支持也是要的。数据源方面会对未提供rss输出的论坛提供支持,初步计划用pyquery做数据分析。
考虑到网站代码非常简单,且比较乱也懒得整理,所以就不开源了。
simple-todo (Django 版)
项目地址:https://github.com/vicalloy/django-simple-todo
缘起
simple-todo最早是web.py一个中文教程的例子。后来Uliweb的作者limodou 认为这个教程很不错,于是有了Uliweb版的simple-todo。接着又有了Bottle版和Flask版。这俨然成了一个FrameworksShow项目。既然是FrameworksShow, 那Django的总不应当缺了吧。
simple-todo: 一个简易的 todo 程序
http://simple-is-better.com/news/309
Simple Todo (Uliweb 版本) 教程 by @limodou
http://simple-is-better.com/news/312
Simple-TODO Bottle 实现版 by @zoomquiet
http://simple-is-better.com/news/509
Simple-TODO Flask实现版 by @wyattwang
http://simple-is-better.com/news/524
运行需求
Django>=1.3
安装及运行
初始化数据库: python manage.py syncdb
启动: python manage.py runserver
使用: 在浏览器中打开 http://127.0.0.1:8000/
Django Admin: 在浏览器中打开 http://127.0.0.1:8000/admin/
项目开发记录
- 创建django project和app:
django-admin.py startproject simple_todo_site cd simple_todo_site/ python manage.py startapp simpletodo
- 编辑settings.py完成数据库、模板、静态文件等配置,主要配置条目:
#注:我认为django应当加更多的默认设置,这些配置改的挺烦 DATABASES INSTALLED_APPS STATIC_ROOT STATICFILES_DIRS TEMPLATE_DIRS
- 编辑urls.py把django admin和static文件url配置加上。
- 编辑simpletodo/models.py,完成数据模型:
from django.db import models from django.contrib import admin class Todo(models.Model): title = models.CharField( max_length=255) finished = models.IntegerField(default=0) def __unicode__(self): return self.title
- 创建数据库:
python manage.py syncdb
- 跑起来,进django admin看看先:
python manage.py runserver #http://127.0.0.1:8000/admin/
- 接下来,略…
LBForum新主题V2EX发布
V2EX主题演示地址: http://vik.haoluobo.com/lbforum2/
项目地址: https://github.com/vicalloy/LBForum
站点工程地址: https://github.com/vicalloy/lbforum-site
LBForum原始界面(http://vik.haoluobo.com/lbforum/)用的是FluxBB的模板。
在V2EX出来后很喜欢V2EX的UI,一直想再做套V2EX的SKIN,直到最近才真在开始动手。
V2EX的设计思想和传统的论坛还是有些不同,有些地方和LBForum的设计不太兼容,针对V2EX的模板添加了部分设置。
lbforum-site项目默认用的是FluxBB的主题,如果希望切换到V2EX的主题只需要新创建一个配置文件local_settings.py,并在其中加上SETTINGS = ‘v2ex_settings’即可。
Snake Challenge算法思路
Snake Challenge是GuruDigger推出的一个活动。游戏脱胎于经典的贪吃蛇,双方用程序控制snake,在规定步数内吃到最长的为获胜方。该平台的SDK以及范例放在BitBucket上,部署好的比赛平台在 http://pythonvsruby.org 。比赛平台上4四个房间,可以任意选择一个房间开始比赛(访问速度好像很悲催,我的snake一直掉线)。
我的AI程序在:https://bitbucket.org/vicalloy/snake-challenge 对应的目录为:snake-challenge/examples/vicalloy
下面简单的介绍一下主要的算法思路:
地图的表示
简单的说就是将地图上的障碍物实物等标记出来,这是整个程序中最简单的一部分。地图可以简单的用二维数组(python中实际为list)表示,数组中的值代表地图上的物品,如 0:BLANK 10:EGG 20:WALL。
查找目标食物
选择哪个食物
服务端会返回所有的egg和gem信息,要找到食物是很容易的,真正的问题是具体要选那个。
我们当然希望去吃最近的食物,或扎堆的食物(虽然远点,不过食物多),只是在真实环境下问题会非常多。如何才是最近,有些食物虽然看起来近,但算上绕过障碍物的距离就不近了。扎堆的食物看起来不错,问题是你没等你到那里,食物已经被别人给吃光了。如果想做到最优,那绝对不是一件容易的事。
既然不管怎么做都很难做到最优,倒不如简单些,直接选择忽略障碍物后距离最近的食物。
面对顺道的食物该怎么办
snake challenge中食物是会慢慢增加的,可能走到一半,你发现身边有个食物离得更近。这时候是否应优先去吃更近的?首先,我们说的更近都是忽略障碍物的情况下,虽然看上去近,但不一定真的近。其次原先的食物,虽然看上去更远,但不少路程已经探索过了,绕过新食物的路径是完全没有探索过的,更换目标也并不见得更好。路边的野花还是等下来采吧。
绝对不能吃的食物
有些食物刚好放在了陷阱里,吃完后无论如何都逃不出去。根据上面一条不吃野食的规定,你会绕着食物团团转,死不了也活不了。
我们加个步数的限制,如果食物距离5步以内,但你已经走了15步都没能将食物吃到,这时候还是换个目标吧。
寻路算法
寻路,就是如何才能最快的到达目的地。寻路算法中听的最多的就是A*算法。A*算法的核心思想是:
- 查看下一步能去的位置(去除障碍物等)
- 从下一位置中剔除已经走过的位置
- 算出所有:下一位置到起始位置的距离+下一位置到起始位置到目的地位置的具体
- 选择总距离最短的位置
- 将当前位置加入已经走过的位置列表
- 没看明白的自行google吧
对我们的贪吃蛇来说,可以将A*算法做到非常的简化。首先snake无法走斜线,无法后退,snake能去的位置只有三个,而且离当前位置的距离都为1。因此,我们只需要计算3个位置中那个位置离食物最近即可。在计算到食物的距离时,延续查找最近食物的方法,忽略障碍物。
除障碍物外,地图上还会有些危险物品,敌方的食物或是已经走路。
地方的食物,吃过后会变短,但还不至于挂掉。已经走过的路,虽然尽量不要走,但无路可走的时候,反倒也是个选择。
我们根据地图属性,给位置打分,然后选择得分最高的位置。
空(远离目标): -9
空(靠近目标):9
空(不变):0
敌方食物:-20
已经走过的路: -40
墙:-999
蛇:-888
陷阱
地图上总会有些小陷阱,进去后发现是个死胡同,怎么都出不来。
做个递归,查看N步内是否有解,如果没解,那这步就别走了。
lbplayer第一个版本发布了
项目地址:https://github.com/vicalloy/lbplayer
什么是lbplayer
lbplayer是一个基于WEB的音乐播放器。使用方式和单机的mp3播放器差不多,唯一的区别是音乐都在服务器上。
适用范围是局域网(注:当然如果你愿意,单机使用也是可以的)。
在局域网内搭建好这么一个服务,将音乐目录共享出去,大家将音乐统一拷到服务器上。
然后使用该播放器进行播放了。
怎么跑起来
如果你想将程序部署到服务器上,还是需要对django应用的部署有些了解的,但如果你只是想用django的测试服务器跑起来,那就简单的多了。
- 先确保你机器上具备基础的运行环境:python>=2.5、django=1.3
- 进入lbplayer_prj目录,执行 python manage.py runserver
- 范例音乐在 lbplayer_prj\static\music 这个目录下
注:
这个版本的出发点是可以满足自己的最基础需要,让程序先跑起来。
至于代码的质量大家就不用太去纠结了。
基于WEB的音乐播放器
目前正在做的一个东西,基于网页的音乐播放器。最终效果会谷歌音乐类似,可以在线选歌然后播放。因为是自己用,所以功能方面会比较简单。歌曲列表直接遍历硬盘目录生成一个带checkbox的树,然后在树上进行选择。为了找歌方便,还需要提供一个搜索功能。playlist的保存功能也应当有一个,不然每次都要重新选歌会让人崩溃。
或许有人会问,这个东西有啥用。你可以在局域网内开这么一个服务,然后就不用费劲的将音乐复制来复制去了。另外采用WEB方式还可以扩展出很多有意思的功能,比如你可以臭屁的将自己的歌单共享出去。
在线音乐播放用的是jplayer,代码也直接是在jplayer的demo上改的。不知是否是我对jplayer的理解有问题,感觉jplayer的demo的代码写的并不是太好,DOM模型的设计也有些问题。
最后,这个播放器的名字叫lbplayer(注:已经决定了,为了避免命名的困扰,日后我写的东西都用LB开头)。