作者归档:vicalloy

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/

项目开发记录

  1. 创建django project和app:
    django-admin.py startproject simple_todo_site
    cd simple_todo_site/
    python manage.py startapp simpletodo
  2. 编辑settings.py完成数据库、模板、静态文件等配置,主要配置条目:
    #注:我认为django应当加更多的默认设置,这些配置改的挺烦
    DATABASES
    INSTALLED_APPS
    STATIC_ROOT
    STATICFILES_DIRS
    TEMPLATE_DIRS
  3. 编辑urls.py把django admin和static文件url配置加上。
  4. 编辑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
  5. 创建数据库:
    python manage.py syncdb
  6. 跑起来,进django admin看看先:
    python manage.py runserver
    #http://127.0.0.1:8000/admin/
  7. 接下来,略…

rework读书笔记

从城市的最西边跑到最南面。看书似乎是打发这百无聊赖时光的一个好方法。在公交车上将《REWORK》给翻了一遍。

与其说37signals是小团队,我倒更倾向于将37signals看成是微团队。37signals最求每个人的卓越,将每个人的价值都发挥到极致,用最少人人做出最优秀的产品。

如何开始

创业需要的资源远比你预期的好少。创业是一种态度,任何时候都可以开始创业。创业是一件愉快的事情,你不必为了创业拼命加班,苦大仇深。

做怎么样的产品

小公司,不可能有足够的力量和那些大公司去硬碰硬。最少的功能,最必要的功能,并做好。有自己的想法,别让外界的噪声左右你的想法。

如何推广

推广产品前,先推销自己,培养粉丝。传播自己的思想,将自己的知识教给别人。不用担心教会了徒弟没了师傅,正直精髓的东西别人没这么容易偷走的。

人力资源的最大化

用最少的人,发挥最大的价值。所有事都从亲力亲为开始。很多事在最初还没多到要专人来处理,而且只有自己做过才能真正了解。日后即使真的需要专人了,你也了解其价值。
没个人都必须上前线,团队中没有管理者,同时每个人都是管理者。

招聘

太长的学业生涯是有害的,很多人才出生草莽。
工作年限不可靠,有些人可能工作了好多年,却啥也没做过。真正可靠的人本身,要看他曾经做过什么。
注:37signals在招聘这部分和《软件随想录》中的看法有非常的分歧。
《软件随想录》中非常看重人的“聪明”部分,他们只要最聪明的学生。但37signals中强调的是这个人此前做过什么。
按照我的理解37signals只招聘过去经历证明优秀的人才,他们几乎不招应届生。招应届生的风险非常大,应届生的变数太大。37signals的小(微?)团队策略让他们对个人素质的要求非常的高。《西游记》团队只适合大公司,若招的是猪八戒或沙和尚,对37signals的危害会非常的大。

监管

对员工的监管只能保证表面上的和谐。人是很难保证长时间的专注的。即使不聊QQ,他也只是假装工作而已。

others

开阔的视野
在rework中,作者列举了很多商业上成功的例子,遍及各个行业。很多东西是共通的,开阔的视野,你可以让你更接近事实的真相。

黑客与画家

《黑客与画家》,不管这本书的内容如何,至少这个书名是吸引我的。
Hackers同画家一样,同样是创造者。不同的是画家用的是画笔,Hackers用的是Code。
如同绘画一样,具备必要的技能是必不可少的,但真正重要的不是技术,而是创造力。技术只是将想法具体化的一个手段。

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*算法的核心思想是:

  1. 查看下一步能去的位置(去除障碍物等)
  2. 从下一位置中剔除已经走过的位置
  3. 算出所有:下一位置到起始位置的距离+下一位置到起始位置到目的地位置的具体
  4. 选择总距离最短的位置
  5. 将当前位置加入已经走过的位置列表
  6. 没看明白的自行google

对我们的贪吃蛇来说,可以将A*算法做到非常的简化。首先snake无法走斜线,无法后退,snake能去的位置只有三个,而且离当前位置的距离都为1。因此,我们只需要计算3个位置中那个位置离食物最近即可。在计算到食物的距离时,延续查找最近食物的方法,忽略障碍物。

除障碍物外,地图上还会有些危险物品,敌方的食物或是已经走路。

地方的食物,吃过后会变短,但还不至于挂掉。已经走过的路,虽然尽量不要走,但无路可走的时候,反倒也是个选择。

我们根据地图属性,给位置打分,然后选择得分最高的位置。

空(远离目标): -9

空(靠近目标):9

空(不变):0

敌方食物:-20

已经走过的路: -40

墙:-999

蛇:-888

陷阱

地图上总会有些小陷阱,进去后发现是个死胡同,怎么都出不来。

做个递归,查看N步内是否有解,如果没解,那这步就别走了。

ipad中删除未下载完的应用

因为入的是二手ipad2,没有原使用者的apple id,其中几个下载到一半的app无法完成下载。

直接删删不掉,更换apple id后,同步也删不掉。几个黑乎乎的图片,放在面板上让人抓狂。

找了一圈终于找到删除的方法。

未下载完的app可以在 download目录找到 /var/mobile/Media/Downloads/*.*

当然,如果你没有越狱,自然是删不了的。下载个iPhone Folders通过PC来删除。

参考链接:http://bbs.weiphone.com/read-htm-tid-1356415.html

搭建自己的源代码托管服务

现在要找个地方托管自己的开源项目是很容易了。老牌的有SF、顶着google旗号的googlecode、使用HG的bitbucket、以及我认为目前最好用的github。

不过如果你想自己搭建一个类似的服务,也是有些资源可以选择的。

  • gitorious (ROR开发,支持GIT)
    gitorious本身就是一个类似github的服务提供商,通过它提供的程序,你可以打架自己的本地服务。这个应用是用ROR写的,所以部署起来需要了解些ROR的相关知识。关于部署方式可参考 https://github.com/TGM/deploy-gitorious
  • gitube(Django开发,支持GIT) 
    国人使用django开发的一个git仓库管理工具。应用的完成度比较低, 而且作者似乎停止开发了。决定要用的话,得做好二次开发的准备。

 

注:DVS在权限控制方面存在天生的缺陷。Gitolite为git提供了权限方面的解决方案,这里有篇关于Gitolite的中文文档 http://www.ossxp.com/doc/git/gitolite.html

lbplayer第一个版本发布了

项目地址:https://github.com/vicalloy/lbplayer

什么是lbplayer

lbplayer是一个基于WEB的音乐播放器。使用方式和单机的mp3播放器差不多,唯一的区别是音乐都在服务器上。

适用范围是局域网(注:当然如果你愿意,单机使用也是可以的)。

在局域网内搭建好这么一个服务,将音乐目录共享出去,大家将音乐统一拷到服务器上。

然后使用该播放器进行播放了。

怎么跑起来

如果你想将程序部署到服务器上,还是需要对django应用的部署有些了解的,但如果你只是想用django的测试服务器跑起来,那就简单的多了。

  1. 先确保你机器上具备基础的运行环境:python>=2.5、django=1.3
  2. 进入lbplayer_prj目录,执行 python manage.py runserver
  3. 范例音乐在 lbplayer_prj\static\music 这个目录下

注:

这个版本的出发点是可以满足自己的最基础需要,让程序先跑起来。

至于代码的质量大家就不用太去纠结了。

基于WEB的音乐播放器

目前正在做的一个东西,基于网页的音乐播放器。最终效果会谷歌音乐类似,可以在线选歌然后播放。因为是自己用,所以功能方面会比较简单。歌曲列表直接遍历硬盘目录生成一个带checkbox的树,然后在树上进行选择。为了找歌方便,还需要提供一个搜索功能。playlist的保存功能也应当有一个,不然每次都要重新选歌会让人崩溃。

或许有人会问,这个东西有啥用。你可以在局域网内开这么一个服务,然后就不用费劲的将音乐复制来复制去了。另外采用WEB方式还可以扩展出很多有意思的功能,比如你可以臭屁的将自己的歌单共享出去。

在线音乐播放用的是jplayer,代码也直接是在jplayer的demo上改的。不知是否是我对jplayer的理解有问题,感觉jplayer的demo的代码写的并不是太好,DOM模型的设计也有些问题。

最后,这个播放器的名字叫lbplayer(注:已经决定了,为了避免命名的困扰,日后我写的东西都用LB开头)。

LBForum已改造为Django的可重用APP

LBForum分裂为两个项目

  • LBForum Django的可重用APP,包含有完整的模板。该app已加入pypi,可使用easy_install lbforum进行安装。
  • lbforum-site LBForum的演示站点。完整的Django Project演示LBForum如何集成登陆注册等模块。该项目可以快速的将LBForum跑起来。

最初写LBForum的时候为降低部署的难度,将LBForum作为完整的Django站点来进行开发。
实际应用过程中,不少人需要将论坛模块集成到已有系统中。
原有的方案在集成的时候有不少的问题。
而且整站的形式也不利于他人进行协作,若改动偏向站点的定制,会给代码合并的时候带来很大的问题。
在项目拆分后,在保证易部署特性的同时解决了第三方系统集成的问题。

LBForum演示站点