博客首页|TW首页| 同事录|业界社区
2011-03-29

最近开始写一些ActionScript的代码,因为是基于 pureMVC ,所以 经常看到一处代码突然又sendNotification去通知处理另外的动作, 看了看处理的逻辑,很多竟然是有副作用的。于是想到了最初学习 程序语言时,书中云Goto语句是程序的一大罪恶来源,当时并不理解, 也不知道各个语言大师为何如何痛恨,今天当自己面对这个问题,才 更加贴切地理解了这里面的痛苦,也就明白了为什么当下主流的现代语言 都去掉了Goto语句。

本文就想探讨下类似于Goto语句这样的跳转对于程序会带来什么后果,特别 会讨论具有副作用的跳转语句。

在讨论之前,我们先定义下 程序的副作用, 根据 wikipedia 中的定义为:

In computer science, a function or expression
is said to have a side effect if, in addition to producing a value,
it also modifies some state or has an observable interaction
with calling functions or the outside world.

也就是说:

一个函数或者一段代码除了返回值外,还会更改程序的状态或与调用函数
或者外部世界有明显的交互。

简单地说就是一段代码改变了程序的状态或者调用函数的状态。举个例子,在下面的 伪代码中,

a = 10;
do_something_with_side_effect(a, other_args);
handle(a);

如果在第二行的代码中对a作了一定的修改,则在第三行的代码中总是会依赖于这次更改, 从而导致你必须了解do_something_with_side_effect这个函数究竟做了什么,会对a有什么 影响等,从而丧失了程序的封装性(即无须了解函数的细节)。

下面我想说说这种具有副作用的程序流程跳转会对整个程序和程序员带来哪些影响。

对程序的影响

副作用的代码对于程序本身的影响通常是出现运行时的错误,或者不符合我们预期的结果。 因为程序流程的改变,而这种改变又会影响到程序的状态,所以在编译时很难预估出准确的 程序结果,或者预估错误。

当然, 程序只会做程序员让它做的事 所以最终的结果对于计算机而言,也只是忠实地去 实现既定的逻辑和跳转,至于其中是否有副作用,就像牛看见林志玲与凤姐一样的感觉。

对程序员的影响

对程序员的影响是显而易见的,而且对程序员的影响是这种跳转最令人诟病的所在。程序员也是人, 当他在读取代码时,他没法像计算机那样轻易的设置断点,进入另一个上下文,继而返回断点继续 当前的上下文,程序员只能靠记忆或者简单的书签,但因为记忆的驻留性会导致这种断点的切换成本 非常高,继而导致程序员对这些代码的理解产生偏差甚至错误。久而久之,程序员在经历若干次这种 错误后,会变得对于这些代码只是试图打补丁,而不是从本质或者更深层次理解优化,从而这段代码 便成了人人不敢动的legacy code.

程序是写给程序员而不是电脑的 这是一个合格程序员基本的意识,所以程序的功能和性能相比于可读性, 大多时候后者是更重要的,特别是如今CPU的进步以及我们通常应用场景的普通。

教训

那么我想程序员在进步和成长过程中总是会面对这样类似的问题,例如从喜欢全局变量的强大性到 痛恨全局变量的不可维护性,从追求代码的trick到追求代码的易读,我们总是在不断学习和进步。

那么具体到这一点,我的想法是:

  1. 让子程序(例如跳转,函数等)无副作用(参考上面对副作用的定义)
  2. 减少导致程序出现流程异常跳转的可能(如Goto语句)
  3. 减少具有副作用的代码

当然,上面的三条是逐条递近的,当达到上述的几点时,维护你的程序的程序员他会打心眼里感谢你的。

2011-03-21

PureMVC 是大量使用于flash开发的一个框架,它很好地对处理对象进行了 最常见的MVC模式划分,清晰的逻辑和功能使得开发者能够很好地开发 新的功能,阅读旧的功能等,所以很多的flash的前端代码都是基于 PureMVC 开发的.

最近因为工作上的需要,我开始学习 PureMVC ,之前也简单地学习过,也按照 官方的教程完成过一个示例,并且也仔细阅读过 相关的教程 ,但是对于 PureMVC 的理解还是相对粗浅,这次在之前理解的基础上做出了一个最简单的 Hello World式的教程,希望加深自己对于这个框架的理解的同时,也能够帮助到 其他人.

PureMVC Hello World

这个示例的主要场景如下:

  1. 在UI上显示一个登录用的表单
  2. 表单上有name, password,和登录的按钮(代码中使用的还是TextField)
  3. 点击登录后,如果name,password匹配则显示登录成功,否则显示登录失败

基于上面的描述,再根据 PureMVC 的框架,我们大致可分为如下几个部分:

  1. 启动用的单例AppFacade

  2. Proxy:

    • LoginProxy: 用于验证用户提交的表单是否合法
  3. Command:

    • StartUpCommand: 用于启动整个应用的Command, 也兼做一些初始化的工作
    • initMVCCommand: 用于初始化并注册相关的MVC,如mediator, proxy等
    • LoginCommand: 用于处理Login时的逻辑,如调用LoginProxy来进行验证
  4. Mediator:

    • ViewMediator: 用于UI的显示

整个应用的流程为:

AppFacade(register command, send notification to start)-> StartUpCommand(execute) -> initMVCCommand(execute, register MVC)
-> ViewMediator(construtor, init the UI)

ViewMediator(Login Button Clicked) -> Login(Notification) -> LoginCommand(verfiy login using LoginProxy) -> Login_Succ/Login_Fail
-> ViewMediator(show the login result message)

那么下面我们分别看下重要的几个模块.

AppFacade

这是用于启动和关联整个 PureMVC 通信过程的辅助性类,单例的. 在这个类中主要注意,初始时的notification发送,注册初始时的Command等即可.

具体代码见: https://github.com/topman/blog_code/blob/master/HelloPureMVC/src/AppFacade.as

Proxy

Proxy主要功能是处理数据相关的信息,也即Domain logic(域逻辑),通常它只处理数据,保证数据的正确,完整性等. 而与此不同的是Command,它处理的是Business logic(业务逻辑),它更加关注应用所在业务的相关逻辑.

参考 Business Logic和Domain Logic的区别.

在示例中的Proxy, 它的主要功能是提供相关的数据, 因为登录验证是一个非常常见的功能,在实际的登录验证中, 通常是后端进行验证,返回一个成功或者失败即可,所以此例中将验证也放入了Proxy的逻辑中.

具体代码见: https://github.com/topman/blog_code/blob/master/HelloPureMVC/src/model/LoginProxy.as

Command

Command是处理应用的Business Logic(业务逻辑),与Proxy的区别参考上面Proxy的部分. 本例中的Command主要是包括三个,即:

  • StartUpCommand: 应用启动的命令,调用其它的初始化命令即initMVCCommand
  • initMVCCommand: 用于初始化整个MVC,注册MVC各个部分
  • LoginCommand: 用于处理登录逻辑的命令

具体的代码见: https://github.com/topman/blog_code/tree/master/HelloPureMVC/src/controller

注意在 PureMVC 中命令有MacroCommand和SimpleCommand两类,前者调用后者,后者则实现具体的业务逻辑.

当然所有的逻辑都可以使用SimpleCommand来完成,但是通常MacroCommand命令可以简化整个代码结构,使得 逻辑更加清晰易读.

Mediator

由于示例比较简单所以只有一个Mediator来处理相关的UI显示, Mediator通常的功能是显示, 接收UI的事件, 响应来自业务逻辑的UI变动等.

示例中主要是两个功能,一个是初始化时显示登录对话框,一个是对于Login_Succ和Login_Fail事件的响应. 相应的代码参考:https://github.com/topman/blog_code/blob/master/HelloPureMVC/src/view/ViewMediator.as

结语

我个人之前更多的是做后端开发,没有系统地接触过前端的开发,如Javascript, flash等. 第一次使用和了解 PureMVC , 发现其理念与后端的MVC框架是一致的,只是在更细层面进行了MVC的划分, 例如一个项目前端是flash,后端是 DjangoDjango 本身是MVC,而 PureMVC 又是在 Django 的V层上进行了更加细致的MVC划分.

Django 的MVC是简洁,清晰和优美的,了解 PureMVC 后,同样的特征也适用,我想在后续开发中可以比较熟练地加以应用, 也能够更加顺手地控制工作的进展,不至于项目的进展完全驱动于自己不熟悉的前端.

2011-03-19

Google Contact是大家最常用的通信录之一,而我所有的通信录都 是使用Google来管理的,并且使用于Gmail, 手机等通信录客户端。

那么经常会遇到下面的需求,就是将其它格式的通信录导入到Google Contact中, 当然Google Contact已经提供了常见的导入界面,很方便操作,但是对于程序控制 下的导入,则需要相关的脚本来完成,而我写的这个脚本就是为了这个目的。

相关的代码可以在 https://github.com/towerjoo/shared_contact 下载或者checkout, 目前的主要功能包括:

  1. 支持导入
  2. 支持导出
  3. 支持删除

注意:

  1. 只支持Google的Domain用户
  2. 24小时后才能在通信录和发邮件时的自动补齐中出现
  3. 具体说明参考代码库的文档(可使用 sphinx 来生成文档)

实现方面

主要是基于已有的 http://code.google.com/p/google-shared-contacts-client/ ,使用 fields mapping(映射)的思路来完成。

To Do

  1. 增加对Gmail的支付(非Domain)
  2. 增加常用Contact的映射模板,如outlook等
2011-03-17

当你Google这个 标题 时, 你能看到很多有价值的讨论和信息,这里也不再赘述和引用. 本文旨在从一个用户的角度来分析两者的差别和低劣势.

作为 StackOverflow 的重度用户,主要是因为它其上能够提供给我很多有价值的信息, 当遇到一个需要了解方法,思路的问题,我也总是首选尝试在其中搜索来获得答案.

Quora 用得稍微晚点,目前还没有拿到注册码,不过这也不防碍我从中查看一些问题答案的快乐.

因为后来基于 StackOverflow 成熟的模型,它的创始人又组建了类似的其它领域的QA站点,从而 组成了一个QA的基于领域的矩阵 StackExchange ,所以在下文中不会区分 StackExchange 与 StackOverflow , 都是指StackExchange 的整个QA矩阵.

Quora 的官方说明如下(http://www.quora.com/about):

Quora is a continually improving collection of questions and answers created, edited,
and organized by everyone who uses it. The most important thing is to have each question
page become the best possible resource for someone who wants to know about the question.

One way you can think of it is as a cache for the research that people do looking things up
on the web and asking other people. Eventually, when you see a link to a question page on Quora,
your feeling should be: "Oh, great! That's going to have all the information I want about that."
It's also a place where new stuff--that no one has written about yet--can get pulled onto the web.

StackExchange 的官方说明如下(http://stackexchange.com/about)

Stack Exchange is a fast-growing network of 47 question and answer sites on diverse topics
from software programming to cooking to photography and gaming.
We are an expert knowledge exchange: a place where physics researchers can ask each other
about quantum entanglement, computer programmers can ask about JavaScript date formats,
and photographers can share knowledge about taking great pictures in the snow.

基于过去一段时间的使用,我想说说我个人的一些体会和看法.

比较点 StackExchange Quora
问题 通常是相关领域的从业人员的提问, 问题的暴光率和回答率取决于问题本身的 质量,传播等.在整个问题的生命周期里, 管理员会作一些质量的控制. 相关从业人员
问题质量控制 质量参差不齐,流量大了后,问题水的比较 多.问题的质量控制主要由相关的管理员 来完成.编辑会重新编辑问题等. 质量相对较高,因为是邀请式的加入(可以从http://quora.com/hackernews注册),增加了门 槛同时也增加了问题的质量,如何能够控制住 开放后时的问题质量,值得关注.
答案质量控制 答案的质量由所有的注册人员来投票和提问 者来完成, 得票高的人的答案会在前,被提问 者接纳的答案会出现在第一个. 关系和投票两大因素决定答案的排次.关系是指 与这个问题相关的社会关系,而投票是由用户来 投票完成.
信任机制 提问和回答都会得到reputation,高的 reputation会在社区中有更高的地位, 相应其问题和答案有更好的响应. 与答案相关的社会关系是非常重要的信任来源, 现场的作用对于事实的复现具有最高的价值. 类似于一个真实的环境,每个提问者和回答者 都具有与现实相同的社会关系,所以他自身在现 实中的信任体系也同样会带来社区中来.
问题内容 不欢迎主观性问题,鼓励客观性问题,也就是 有确定答案的问题. 相反,更多的是主观性的,发散性的问题,有更多 的发挥空间
获取信息 通常有明确的目标,搜索直达,偶尔会看投票 最多的问题 通常可能你心中并没有带着问题去,而是有期待 地查看,来拓展自己的知识

当然, StackExchange 依旧是我获取相关信息的重要途径,特别是程序相关的,但是一个程序员的成长 需要了解的不只是所谓的硬知识(程序技术相关),很大一部分也是软知识(非程序),所以我最近也在常常访问 Quora ,从中获知了很多的信息如一些技术公司的典故(技术选型的依据,为什么myspace的员工持股不值一文等).

我的想法是 Quora 建立起的基于社会关系的问答具有更大的市场和更高的包含度,也就是长远来看, Quora 的问题和答案能够包含 StackExchange ,而基于自身机制的限制 StackExchange 则很难形成 Quora 这样的 良性发展氛围.

当然技术也是二者发展的一个重要因素,在流量巨大时,如何能够减少质量低,重复问题,如何能够提供更加准确的搜索和答案, 如何能够提供更好的用户体验,这些都是左右二者发展的巨大考验.

基于问答的应用也是有很多可以畅想的,如类似于 linkedin 的职业类网站, 当然 StackExchange 已经开始尝试.

P.S. 经过确认后,Quora可以从http://quora.com/hackernews注册。

2011-03-09

接着 上文 的内容,本文将基于自己的理解尝试回答 上文 中研究列表中的3和4,即:

  1. 理解和分析Admin系统的设计和代码书写值得学习和注意的问题
  2. 总结

理解和分析Admin系统的设计和代码书写

Admin系统具有多种特征,首先它是一个普通的 Django 应用,其次它又承担 作为各个其它Djago应用的基础应用而存在,所以我们可以从上面两个方面 来加以分析。

作为一个普通的应用

Django 本身是一个基于MVC的web框架,各个层次非常清楚,当然在 Django 中,更多地被 称为MTV,即Model, Template, View,对应于MVC的Model, View, Controller。 其中Template和View的衔接是通过url映射完成,而url映射也是 Django 架构中最为巧妙的 地方。

http://towerjoo.blog.techweb.com.cn/wp-content/blogs.dir/14215/files/blog/django_layers.png对于一个 Django 的应用,我们通常可以从url映射入手,找到url处理的函数,和渲染出的页面, 从而理清整个的应用逻辑。

Django 的Admin应用的url映射大致如下:

# sites.py
urlpatterns = patterns('',
    url(r'^$',
        wrap(self.index),
        name='index'),
    url(r'^logout/$',
        wrap(self.logout),
        name='logout'),
    url(r'^password_change/$',
        wrap(self.password_change, cacheable=True),
        name='password_change'),
    url(r'^password_change/done/$',
        wrap(self.password_change_done, cacheable=True),
        name='password_change_done'),
    url(r'^jsi18n/$',
        wrap(self.i18n_javascript, cacheable=True),
        name='jsi18n'),
    url(r'^r/(?P<content_type_id>\d+)/(?P<object_id>.+)/$',
        'django.views.defaults.shortcut'),
    url(r'^(?P<app_label>\w+)/$',
        wrap(self.app_index),
        name='app_list')
    )

# Add in each model's views.
for model, model_admin in self._registry.iteritems():
    urlpatterns += patterns('',
        url(r'^%s/%s/' % (model._meta.app_label, model._meta.module_name),
                include(model_admin.urls))
    )

从上面的代码,我们可以看到,Admin应用的landing page,登出,密码修改等相应的逻辑, 重点查看最后几行代码,将已经注册的应用的model(数据库的表)相应url映射指向了其自身的方法。

我们来看model_admin.urls这个逻辑:

urlpatterns = patterns('',
    url(r'^$',
        wrap(self.changelist_view),
        name='%s_%s_changelist' % info),
    url(r'^add/$',
        wrap(self.add_view),
        name='%s_%s_add' % info),

    # added by Tower Joo At 2011/2/27
    # have to be ahead of change_view unless it will be overrided
    url(r'^export/$',
        wrap(self.export),
        name='%s_%s_export' % info),
    url(r'^aggregate/$',
        wrap(self.aggregate),
        name='%s_%s_aggregate' % info),

    url(r'^(.+)/history/$',
        wrap(self.history_view),
        name='%s_%s_history' % info),
    url(r'^(.+)/delete/$',
        wrap(self.delete_view),
        name='%s_%s_delete' % info),
    url(r'^(.+)/$',
            wrap(self.change_view),
            name='%s_%s_change' % info),
    )

从上面的url映射来看,已经包含了增加记录,删除记录,修改记录等操作,当然上面也包含了 在 上文 中我做的一些url映射的修改。

看过上面的url映射后,心里就会有数,知道整个Admin系统大致有多少个页面,各个页面的作用是什么。

然后,我们可以通过url映射知道处理这个url的函数,例如,处理/add/的self.add_view函数。 通过阅读self.add_view函数的代码,除了相比于我们通常的逻辑更多的边界和条件处理外,其它的 也是相同的,例如数据库的操作,页面渲染所需要的数据准备等。

最后,我们看到的是页面渲染所需要的Template, change_form.html,查看对应的代码,则与通常的
Django 的Template并无二异。

其它的逻辑也相同。相比于我们自己的 Django 应用,这个逻辑中有更多的边界条件的处理和异常的处理 等,你可能会说它过于复杂,这也就引入了我们接下来要说明的第二个问题。

作为其它应用的通用基础应用

作为一个基础的应用,它就需要适应所有基于其上的其它应用的需要。 通用性通常意味着更多的复杂性,我们来看 Django 是如何有效且优美地处理这个问题的。

  1. 充分使用Python的内省,也即model的元数据,如app_label, module_name等,使得动态地构造url映射 和合适的显示成为可能
  2. admin = AdminSite()是一个全局的变量,来维护所有的注册应用的列表
  3. 两级的处理结构:admin site级和table级,分别由两个类来处理,并完成相应的url映射
  4. 可配置性:对于其上层的应用,都提供了完善的可override的属性,如list_display,list_filter等等
  5. 使用类而非 Django 默认推荐的函数作为view的处理,这样就提供了用户基于Admin系统建立自己的Admin系统的可能

总结

Admin系统可谓是 Django 最强大的功能了,它也大大方便了数据库驱动的应用的开发难度,为应用的数据输入,管理等 提供了一个稳定,可靠,方便的管理界面.

从 上文 和本文的介绍中,我们可以从中学习到一些 Django 常用的开发技巧:

  1. 基于类的view实现(当然在 Django 已经完全支持class view了, 参考 Class-based generic views )
  2. 分级的数据处理
  3. 可配置性
  4. 灵活性

会使用 Django 的Admin系统那可以让你的工作时间节省30%以上(基于数据库的应用),如果能够弄清楚 Django Admin 的实现原理并从中学习到可用于自己实际开发的经验与方法,则可运筹帷幄,谈笑风生地写代码了.

2011-03-08

最近看了小说 笑傲江湖 和电视剧 你是我的兄弟 ,喜欢之余,发现了一个共有的特征, 也就是 无论主题是否凝重,喜剧元素是很重要的亮点. 例如,在 笑傲江湖 中, 贯穿整个小说的桃谷六仙,或者是 你是我的兄弟 中的蒙山三兄弟.在阅读或者观看 过程中,这些喜剧元素总是能够平和我的心情,或者总是在心中萦绕着,有一种期待, 甚至一种乐见的愿望.或许这就是所谓的”喜闻乐见”.

扩展开来,还有很多的文学作品或者电影电视也都有类似的手法,例如西游记中的八戒, 水浒中的李逵、鲁智深,三国演义中的张飞等等. 总是有个别的喜剧人物在那儿帮衬着 主题,让主题更加丰满,或者让爱众更多的情感选择与缓冲.

不仅是中国,国外作品也类似,如哈利波特中的 Rubeus Hagrid 等,他们不时插科打诨,或者 不影响主题地让你发笑,让你能够缓和自己的心情使得主题更容易接受.

所以说喜剧元素的效果和作用也是明显的,但是,个人认为它又不能越权去影响整个主题的 阐释,所以必须要注意几点:

  1. 适可而止
  2. 不能越权
  3. 合适的时机(受众感到压抑,或者很累,或者凝重等)

当然,一部分文学作品也可归作是娱乐产业,电影和电视那也自不用说.当我们放大到娱乐产业时, 社交游戏自然也隶属其中,社交游戏的创意是否也能够从这个有效的方式中学习些经验呢?这想 这是一个很好的出发点,在未来的几个产品中,我会考虑将这个理念尝试溶入到产品的设计中去.

2011-03-02

术语是一个细分领域的语言,对于行外人而言,它就像英语之于母语的汉语,所以 进入一个领域了解相关的术语是重要的,也能够保证你知道关注什么,用什么来沟通, 因为通常术语就包含了这个领域中最重要的一些概念,思路和研究方法.

社交游戏 是我目前所处的领域,它是一个新生的行业,它有传统游戏所关注的ARPU等, 也有自身所关注的ARPPU等,所以让我不妨看看这个领域有哪些术语值得我们关注和理解.

下面的内容是翻译自 GLOSSARY OF ONLINE GAMES 这篇文章,英语好的不妨直接看原文.

另外所引文的网站也 社交游戏 领域非常值得关注的内容来源,十分推荐.

下面是内容:

同游戏行业一样, 广告行业也充满了容易混淆的术语. 因为游戏发行和游戏营销已经非常紧密地联系在一起,所以 非常容易产生术语的混淆.

下面的内容是我从 如何发布游戏 这本书中摘取出来. 一旦后续有新的被业界接收的术语术语,我也会将它增加到下面 的列表中. 如果下面的列表中没有你期望的术语,请来信告诉我.

A/B testing 也称为对比测试.A/B测试通过对线上网站或者游戏分别进行 再次小改动后的对比测试,来确定哪个改动更加有益.
Ad Server 例如OpenX或者DoubleClick的动态广告报告与目标定位这样的web工具, 能够智能地发布连续的广告活动.
Affiliate marketing Affiliates是通过自己的网站来将用户引导到你的站点来取得收入的 第三方网站(基于CPC或者CPA).它们通常由Affiliates联盟来管理,这样 的联盟例如Commission Junction或者TradeDoubler.如果你将你的玩家 引导到Amazon或者iTunes来出售自己的游戏,那么你可以注册并且自己 本身成为affiliate,通过向这些网站导入流量获得生额外的收入 (通常有5%-10%的额外收入)
App 现在的意思是针对iPhone或者Android这样的智能手机的应用, 以区别于通过移动手机来访问网页.
App Store 针对iPhone的苹果在线应用商店
ARPU 每个用户的收入.从移动行业引进的指标,这个指标表明一个用户 平均花费,通常是针对一个月而不是一年的数据.应该与ARPPU区别. (Averge Revenue Per User)
ARPPU 每个支付用户的平均收入.ARPU和ARPPU之间很容易混淆.在一个免费的 游戏中(指的玩是免费,例如大多数的社交游戏),通过都有数百万的用户 数,但是只有百分之一的用户来支付.大多数游戏公司更多使用ARPPU, 而许多人通过将ARPU和用户数来计算出总收入.为了计算总收入,或者 将ARPPU乘以支付用户数,或者ARPPU乘以总用户数再乘以转化率. (Averge Revenue Per Payment User)
CAC 新用户开发成本,也叫CPA (Customer Acquisition Cost)
CANSPAM 2003年美国的一项法律,用于规范在美国发送商业邮件.
Churn 客户流失率,通常指一月或者一年用户的流失百分比
CPA 每个新用户的开发成本.一种在线的广告模型,在这个模型中,当媒体网 站成功地将一个客户引入到广告投放商的网站并且客户执行了某些特定 的行为,此时广告投放商向广告媒体网站支付每次支付一定的现金. 特定的行为,可能是填写一个表格或者注册为会员,但是最常见的行为是 进行一次支付.例如,EVE Online会向成为订阅者而支付7美元.这个指标 也学用户于游戏开发者或者媒体网站,来作为一个关键的指标以衡量他 们从各种营销来源中获得一个客户的成本. (Cost Per Acquisition)
CPC 每次点击的成本.一种在线的广告模型,在这个模型中,广告投放商会为 每次用户的点击来付费.Google的AdSense程序是基于CPC的. (Cost Per Click)
CPI 每次安装的成本.一种在线的广告模型,当前只是局限在iPhone平台上, 其中开发者或者发布者为每次成功的安装进行付费. (Cost Per Install)
CPM 每千次的成本.所有媒体(包括电视,广播,印制,和网络)上的广告的主要 量度.这个指标衡量的是一个广告每千次浏览的成本.如果单指网络, 则指的是对于单条广告的一千次浏览.(Cost Per Mille)
CPT 每千次的成本,同CPM.(Cost Per Thousand)
DAUs 日活跃用户数.(Daily Active Users)
DLC 可下载内容.通常我认为这个指的是已经被下载的任意内容.实际中,它 指的是针对打包好的物品可以被下载的额外内容(免费或者支付). (****able Content)
eCPM 每千次的有效成本.用于比较针对标准的CPM活动和CPC/CPA活动的方法. 通过聚合CPC/CPA收入的总数,并除以广告被浏览的次数,可以计算出 有效的CPM.(Effective Cost Per Mille)
EIS 企业投资模式,为了鼓励对于早期创业的投资英国政府推出的一项创新 模式. (Enterprise Investment Scheme)
F2P 免费玩.(Free to Play). 同Freemium.
Freemium 一种商业模型,在这个模型中,核心游戏是免费可玩的,通过对虚拟 物品或者高级服务进行收费.
Free To Play 也叫F2P,同Freemium.
GaaPy 游戏作为产品.(game as a product)
GaaSy 游戏作为服务.(game as a service)
Geo-targeting 仅对一个特定的国家的人展示内容(通常是广告)
Impression 在线广告的基本单位.当一个用户看见一个广告,则计作一个impression
IP 知识产权.或者网络协议. (Intellectual Property/Internet Protocol)
Match Three 一种游戏玩法,也就是当用户将三个或者更多个类似对象连在一起从而 让它们消失的玩法.钻石迷阵是一个经典的Match Three游戏.
MAUs 月活跃用户数.(Monthly Active Users)
Metacritic 用于对游戏,电影或者音乐的评价得分进行聚焦并给出一个混合的 “平均分”的网站.权重计算的算法并不公开,但是Metacritic是对于 游戏很好的反应指标.
Meta tag meta tag是位于一个网页<head>部分的标签,它包含这个网页的内容. 通常与有效的SEO相关,但是已经不再像之前那么有效.有一个很好的 “关键字”和”描述”非常重要,但是对于SEO而言高质量的页面设计比 修改meta tags更加重要.
MMO 大型多人在线游戏.(Massively-multiplayer **** game)
PSN PlayStation网络.(Play Station Network)
Publishers 在游戏领域,”在未来数字产品发布中无立足之地的吸血鬼”(摘自David Lau-Kee).在网络广告领域,发布商通常是指网站,例如与广告发布商 讲述他的基于浏览器的游戏的开发者,也通常认为是发布商.
Registered users 在线领域常常提到但没有用处的指标.一个成功的网站需要活跃用户, 而它是由独立用户来衡量的.
Remnant 以较低的收费出售的广告,典型的例如通过网络.之所以称作”remnant”, 是因为从网络购买广告的广告投放商并不能确切地知道他们的广告会 在哪些网站上展示,因此他们支付一个较低的CPM或者CPC费用.
Smartphone 新一代先进移动扶持设备,例如iPhone,Palm Pre或者Android操作系统
SEM 搜索引擎营销.为出现在搜索结果排名支付费用,例如Google,Yahoo 或者MSN. (Search Engine Marketing)
SEO 搜索引擎优化.通过将一些关键的搜索词组包含到自己的网站中来达到 通过搜索引入更多的的流量到自己网站的过程.
Triple A 一种高级的营销主题,目标通常不少于1百万个单位.
Unique user(visitor) 独立用户或者独立访客是网站的一种标准的流量衡量指标.通常指的是 一个用户在过去30天里访问一个网站,无论它访问多少次,都计做一次. 一些网站使用不同的时间区间,例如2周,3个月等.
UGC UGC即用户创造内容,是指一个游戏或者网站中由用户创造的内容. 小巨星中创造的等级,基于第二人生创建的内容,第一人称射击游戏中 用户自己创造的增强程序等,都是UGC. (User Generated Content)
XBLA Xbox Live上的一项游戏下载服务. (Xbox Live Arcade)
XBLIG Xbox独立制作游戏. (Xbox Live Indie Games)

最后生成一个术语大全图供大家查看方便(点击查看大图):

2011-03-01

原文链接: http://www.mifengtd.cn/articles/why-we-lack-of-self-discipline.html

今天在看google reader时读到这篇文章,一些话语正好触动了自己心里最脆弱的地方, 所以转在此处以鞭策自己,不时提醒自己,如何才能够更加自律,更加出色.

原文如下(去掉了部分链接):

自律就是在该做的时候,不管喜不喜欢,都去做你应该做的亊情的一种能力。

——艾伯特·哈伯得

自律是时间管理的催化剂,它是支持时间管理持续执行的基石。塞缪尔·斯迈尔斯在他的《品格的力量》中说到:“自律是品格的精髓,美德的基础。”自律更是人们远离陋习,战胜自我的保障。在《圣经》中,赞誉并不是给予那些“攻城掠池”的骑士,而是给予那些“主宰自己灵魂”的人们。缺少自律的人将会一事无成。那么,在现实生活中我们为什么会缺少自律呢?

没有目标

生活、工作、事业必须有目标,人生必须有计划。在建立事业计划同时设立个人与组织的重要工作目标,为例行工作建立完成标准。在我们不能自己控制自己或要偷懒时,想想自己的目标和达到目标时所带来的一切。当每次一想到“成功的喜悦”就有使不完的劲。

没有计划与优先顺序

欠缺自律的第二种表现形式是忍不住要做一些与目标无关或关系不大的事情,做自己喜欢的事情而不是应该做的事情。在遇到这种情况时,耍安排优先顺序,将心力集中于最有成效的部分,这样可以保证所完成的工作一定是最重要的工作,而未完成的工作则是最不重要的事项。

拓展阅读: 《做真正重要的事》

没有设定完成期限

即使领导没有给我们设定完成期限,我们也要自己定一个期限。还可以把工作分成若干部分,每个部分都设定一个完成期限。强迫自己严格按照设定的日期完成工作,绝不更改完成期限。同时,在授权时,也要要求别人排定完成期限。这样可以带给人一种“紧迫感”,它可以强迫我们约束自己。

拓展阅读: 《如何利用期限来完成任务》

没有追踪进度

千万不要把计划当作一种形式,一定要实施它,监控工作进展程度。

没有运用随手可得的工具与技巧

运用褪墨介绍或使用你自己的工具和技巧:每日计划、每周计划、完成期限、待办事项清单、工作日记等。

对工作缺少兴致

漠不关心,对工作缺少兴致,是效率的大敌。重新检讨工作态度,认清漠不关心的态度更难形成自律。设立简单的目标,在达成目标以后奖励一下自己,促使自己对工作产生兴趣。

做事拖延

找出容易拖延的工作和决定,安排切合实际的完成期限,向别人宣布这些期限,请别人帮我们监视成果。当我们完成工作时,给自己一番奖励。

拓展阅读: 《防止拖延的积极步骤》

不良习惯

以好习惯取代坏习惯,尽量自主自发地采取有用的行动,使自己有多余的心思去做更有生产力的工作。要养成某个新习惯,就要尽量意志坚强加以练习,向别人宣称自己正在培养新习惯,以免自己故态复萌。在这习惯变得根深蒂固以前,绝不要让任何例外发生,抓住能表现自己决心的第一个机会。最后一定要记住:“形成新的工作习惯或者情感一般要用30天”。

拓展阅读: 《一个月培养一个好习惯》

富兰克林认为,自律体现了人类的勇气,是人类所有高尚品格的精髓。如果一个人完全由本能和激情来支配,那么他就会完全丧失道德上的行动能力和良心的自由,就会沦为欲望的奴隶。

所有的成功都来源于自律,要想尽快的养成自律,首先,要想象自己已经变成一个有纪律的人了,然后要像一个有纪律的人一样思考、行动,最后持之以恒。

推荐阅读: 《学会自律系列总结》