东日

有时候喜欢看些技术人员写的非技术方面的博客。看和自己一样的普通人,怀揣着梦想,徘徊与理想与现实之间,慢慢的学会长大。

东日是一个共享软件工作室的名字。与其说是工作室,倒不如说是个小的软件作坊更为贴切。据我所知,这个工作室总共只有两人,一个美工一位开发。

这是一个我比较欣赏的软件工作室,他们的作品都有很高的素质。nicrosoft还出了本《Delphi高手突破》,虽然书名中的“高手”二字很容易让人不齿,但这确实是本好书。

随着互联网的崛起,传统的桌面应用的市场逐渐衰退。所谓形势比人强。如今,当年做Delphi组件的公司基本都已关门。至于Delphi,在久经折腾后Borland终于将这个烫手山芋出手,卖给了一个默默无名的小公司。

不知如今的东日怎么样了。

通过搜索引擎找到nicrosoft的博客。迷茫的2009,2010重新出发。喜欢nicrosoft的生活态度,简单纯粹,亦可与时俱进。

ruby中的block和yield

rails的同学极力鼓吹rails的简洁高效。虽一早就认定rails不太符合我的习惯,还是经不住诱惑再多看了rails两眼。
rails中大量使用了ruby的block语法。由于此前没有系统的看过ruby语法,block还是给我带来了不小的困惑。网上不少介绍block的文章,都说的不是太清楚。在看过《Programming Ruby》后才真正的开始理解block的用法。
代码块(Blocks)是指一块代码,用大括号({})或者do…end来标明起始和结束,代码块只能跟在方法调用后边。
yield语句:在方法内部使用yield语句来占位,当方法执行到yield时,实际执行的是调用方法时跟在后边的的代码块。
|x|:变量用一对’|’包裹,在代码块中使用,用于接受yield传递的参数。yield后跟的参数会传递给代码块中用| |标志的变量。
下面通过例子来更直观的认识block。

def x
  p "=start"
  yield 'a'
  yield 'b'
  p "=end"
end
x do |a|
  p "hello", a
end

程序的运行结果为:

"=start"
"hello"
"a"
"hello"
"b"
"=end"

定义了函数x,其中两次使用yield调用block中的代码块。block代码块支持一个参数。

《卓有成效的管理者》读书笔记

若不是这书在豆瓣上的评分很高,我是不太可能会去看这本书的。有是卓有成效又是管理者的,给我一种很恶俗的感觉,就如《24小时学会XX》之类的编程书一样。

真正看下来还是感觉有些收获,更重要的是这是一本让人读起来挺舒服的书。

书中就对当前知识经济所引发的管理困境进行讨论,很容易引起共鸣。

  • 目标和绩效
    • 问题:工作没有直接输出,需要依靠别人的输出,工作效率难以评估。并不是人多力量到。
    • 解决办法:重视对外界的输出,能给公司创造什么价值。
  • 时间管理
    • 问题:管理者的工作常常会被各类事情打断,时间不被自己支配。计划经常不靠谱。
    • 解决办法
      • 记录下自己的时间怎么花出去的。查看记录你会发现很多时间花在了不产生任何价值的地方。更合理的时间安排,看哪些事情是可以不做的,哪些是可以让别人做的。
      • 零散时间的效率是不高的。尽量安排出整块的时间,期间所有琐事都尽量不管。琐事可以事后统一处理。
  • 一次只做一件事情,并做好。能同时处理好多件事情的人是非常少的。了解当前真正重要的事情是什么,并做好。
  • 全才的困境
    • 管理者所需要的知识非常多,差不多要求这个人是全才。但现代社会中全才几乎找不到。
    • 人无完人,没有全才。看中真正重要的部分,无伤大雅的问题是可以忽略的。
    • 取人之长。取下属之长,领导之长,自己之长。
  • 决策
    • 真正重要的决策并不多。
    • 慎重的决策,尽量避免临时性的决策。
    • 高标准,并适当的妥协,可行的决策才有价值。
    • 决策从想法开始,而不是真相。注:我的理解是:先忽略客观情况,看应该做成怎么样,然后再结合客观情况,看该做成怎么样。

django1.3的staticfiles

django1.3新加入了一个静态资源管理的app,django.contrib.staticfiles。在以往的django版本中,静态资源的管理一向都是个问题。部分app发布的时候会带上静态资源文件,在部署的时候你必须手动从各个app中将这些静态资源文件复制到同一个static目录。在引入staticfiles后,你只需要执行./manage.py collectstatic就可以很方便的将所用到app中的静态资源复制到同一目录。

staticfiles的引入,方便了django静态文件的管理,不过感觉staticfiles的文档写的并不是太清楚,初次使用的时候还是让我有些困惑。

下面简单的介绍一下staticfiles的主要配置:

  • STATIC_ROOT:运行manage.py collectstatic后静态文件将复制到的目录。注意:不要把你项目的静态文件放到这个目录。这个目录只有在运行collectstatic时才会用到。我最开始想当然的以为这个目录和MEDIA_ROOT的作用是相同的,致使在开发环境下一直无法找到静态文件。
  • STATIC_URL:设置的static file的起始url,这个只可以在template里面引用到。这个参数和MEDIA_URL的含义差不多。
  • STATICFILES_DIRS:除了各个app的static目录以外还需要管理的静态文件位置,比如项目公共的静态文件差不多。和TEMPLATE_DIRS的含义差不多。
  • 各个APP下static/目录下的静态文件django的开发服务器会自动找到,这点和以前APP下的templates目录差不多。
  • urls.py中加入静态文件处理的代码
    from django.contrib.staticfiles.urls import staticfiles_urlpatterns
    # ... the rest of your URLconf goes here ...
    urlpatterns += staticfiles_urlpatterns()

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