思维上还是没能真正转变为函数编程,所以这个问题一致不能自如处理。找到两篇不错的网文:

  • https://blog.codecentric.de/en/2016/04/elixir-where-is-your-state/
  • https://blog.codeship.com/statefulness-in-elixir/
  • http://work.stevegrossi.com/talks/processes-and-supervision-in-elixir

先Mark一下,回头再来写学习心得。

准备在开发中尝试scrum实践,于是了解sprint是怎么描述的,搜到两个不错的快速参考:

前者的好处是简明扼要,能快速了解从srpint规划会到燃尽图的一系列概念和活动,最重要的是——有例子。

后者的好处则是恰好的详尽,不啰嗦,实践的要点都点到了。例如下面这个项目章程模板:

项目章程模板。

1、远景

发起这个项目的缘由和项目的价值,用描述远景的句子说明项目的价值

2、需求

某个特定日期发布某个功能,例如
“8月21日发布的主要版本中,我们需要这个xxx功能。”这些才是项目的驱动因素,产品功能列表不是

3、目标

希望通过项目所达成的目标

4、成功标准

成功标准是围绕客户能基于完成的产品做什么给出的定义。成功的标准并不涉及缺陷,而只关注能力。

下面是一些成功标准实例。
1、要包括功能1、2、3,这样我们的产品就可以打入目标市场了。
2、要提升产品性能,再测出相关数值,这样我们就可以将其与竞争对手的产品进行对比,
3、在第一季度发布

项目章程是有意要设计成这么简短的,目的是帮助团队赶紧启动,足够让大家着手开展工作。 

既然叫“章程”,就是相当于宪法一类,每个项目都必须有,且成为其他项目管理工作的出发点。然后,下一个获得就是项目启动会了(我理解),于是需要发布项目规划:

项目规划模板:
1、产品意图
                简单描述产品,为什么公司要开发这个产品,它能为公司带来哪些效益
 2、历史记录
                如果是在管理某产品的后续版本,比如4.2版本后的4.3版本,就要复查之前或相关版本的历史记录。这个历史记录可以说明之前任何已知的技术债务
3、发布条件
               要详细列举出项目产品的关键可交付物。想识别出它们,不妨问一问:“要是不那么做,我们还能发布产品吗?”
要将功能、性能和质量要求都涵盖在内

4、目标
               已知的目标也许隶属于以下几类。
1、产品目标也许包括这样一些需求,它们已经被设定好优先级,但是不承诺在当前发布版本中完成。这个列表也许已存在于产品的待办事项中。
2、项目目标也许是诸如性能标准之类的目标,对它们的要求会高于一般需求,或者是“在产品交付时,要将未解决缺陷的数目从50个减少到40个” 。尤其是在管理一个工程的情形下,每个子项目的目标要特定于该项目所在的领域。项目团队要解决某些特定的技术债务,也许也可以作为项目的目标。
3、团队目标可以是“增加产品的自动化冒烟测试所占的百分比”。团队也许希望改进某个特定功能的性能或可靠性。
4、组织目标可以是“减少项目的耗费时间,以提升组织的敏捷性”。

      5、项目组织
                1、要明确说明团队在项目中的职责分配,指明项目经理如何使用生命周期组织项目工作,要采纳哪些关键实践,以及是否有决策人可以影响当前项目
2、要说明项目的一般运作方式。比如,在项目启动时加强整个项目团队意识,招聘新人,开发包括代码和文档在内的完整功能,编写所有的代码,同时检查一下(在那个时间)可以记录些什么,诸如此类的事情
      6、日程总览
                 应该创建一个日程总览,其中标有主要的里程碑,还要说明人们从这些里程碑处可以得到什么。如果使用迭代或增量式开发,要解释迭代(或增量)的持续时间,并说明在每个迭代(或增量)结束后可以预期得到哪些产出
例如:

  1.            日期     里程碑
  2.      21日    项目启动。
  3.      215日   向客户展示Web界面的原型。
  4.      230日   进行第一轮迭代开发。
  5.      315日   内部交付Web界面。
  6.      330日   发布beta版本,让客户进行试用
  7.      41日    开始beta测试。
  8.      430日   结束beta测试。
  9.      530日   系统上线。

       7、人员配备(人员曲线)
                很多项目经理不能控制项目团队的人员配备。如果在项目开始的第一天就把所有的人都召集到位了,那么出现人员变动可别吃惊。如果需要从其他组或是团队中调动人手,要在这里说清楚:要在何时需要多少、何种类型的人员

        8、建议日程
                 项目经理要根据理解程度,列出主要的里程碑
       9、风险列表
                 在项目规划中,至少要将排名前十的风险记录在案。还要经常监控这些风险,并在适当的时机更新这个列表。如果觉得项目目前的风险不到十个,不妨跟项目团队一起坐下来,进行一次头脑风暴

以上作为项目启动会的输入。那么项目启动会怎么开呢?

大约13个议程

1、欢迎和接收 

# 要确保关键利益着或代码能够在现场,远程视频,电话会议也行,向与会人员介绍参与会议的所有名单
头衔,和联络方式,向利益相关者介绍项目组的组要成员
2、介绍会议的目的 

#介绍召开的是什么项目启动会议,通过会议确保项目客户、供应商等对项目的管理方法、角色和责任、变更管理方法等认可
#安排专人进行会议纪要。和会议纪要的发送
3、介绍项目背景 

#为什么要发起这个项目,尽量用数字说明
4、说明项目的范围 

# 简单的单完整的说明项目包含什么,不包含什么,并说明主要项目产品及重要里程碑
5、说明项目利益着相关角色和责任 

#以用责任矩阵予以说明
6、介绍项目经理将采用的管理方式 

#必须强调的是 项目的管理方式必须得到所在企业和项目利益相关者的忍痛,而且特别重要的是,必须包含项目沟通方式

7、说明项目变更控制方式 

#可以使用项目变更历程图辅助说明,明确变更管理责任人,说明何时客户需要参与,说明谁有签字权
8、说明项目行动要点 

# 简单介绍项目所采用的工作方式,例如一些主要的度量和控制办法等。
9、说明客户对项目成果的接收标准 

#说明项目给客户提供何种产品,他们的质量判断标准是什么,客户将如何验收,要尽量获取客户对项目计划、管理方法、客户角色的责任、变更管理办法及其他项目工作方式方面的认同
10、说明下次会议的议题和时间 

#介绍项目会议的原则和时间
11、回答与会人员的问题 

#告诉利益相关者能够随时联系的方式。
12、对会议进行总结 

#说明本次会议取得的结果和成果,感谢大家参与,说明会议纪要的发放时间和方式。

13、结束会议 

然后要识别风险。我理解这一步是一种保全,就是以防万一需要一个针对性的步骤来避免遗漏,以及约定好“万一”的“第一反应”可以是什么。如果这时候有一个checklist来帮助你寻找那些“万一”,不仅是“没头脑”的福音,可以拉高平均分,而且checklist本身就是一种好的知识管理手段。忍不住还是抄一下这个checklist:

1、开发环境

软件工程环境支持项目组、过程及产品,但是,如果环境有缺陷,它就有可能成为重要的风险源。

下面的风险检查表中的条码标识了与开发环境相关的风险:

(1)、是否有可用的软件项目管理工具;
(2)、是否有可用的软件过程管理工具;
(3)、是否有可用的分析及设计工具;

(4)、是否有可用的测试工具;
(5)、是否有可用的软件配置管理工具;
(6)、项目组的成员是否接受过每个所使用工具的培训;
(7)、是否有专门的开发工具管理

如果对于上述问题的答案多数是否定的,则软件开发环境是薄弱的,且风险很高。

2、组织方面的风险

 

(1)、对该项目是否有足够的支持(人力支持,管理人员 、QA、测试或其他外部人员)
(2)、该项目是否是企业最大的项目
(3)、项目管理是否有明确定义流程

 

3、人员方面的风险

 

(1)、是否可以获得足够的人员
(2)、他们是否有足够的技能和经验
(3)、是否一起工作过,他们之间的配置是否合理
(4)、他们是否相信项目会成功
(5)、是否有专业领悟的专家
(6)、是否有专门人员进行客户联系
(7)、是否有最优秀的人员可用;
(8)、人员在技术上是否配套;
(9)、是否有足够的人员可用;
(10)、开发人员是否能够自始至终地参加整个项目的工作;
(11)、项目中是否有一些人员只能部分时间工作;
(12)、开发人员对自己的工作是否有正确的期望;
(13)、开发人员是否接受过必要的培训;
(14)、开发人员的流动是否仍能保证工作的连续性;

 

4、工期方面的风险

 

(1)、时间表指定的是否现实
(2)、是否可以为了满足时间表而对功能 进行规模管理
(3)、对于交付日期的要求有多严格

 

5、项目规模方面的风险

 

项目风险是直接与产品规模成正比的。下面的风险检查表中的条目标识了产品(软件)规模相关的常见风险:

(1)、项目的成功是否能够被评测
(2)、是否有关于如何评测项目成功的协议
(3)、 需求是否相当稳定并得到了充分的了解
(4)、项目规模规定不限还是不断的扩大
(5)、项目开发的时间范围是否太短,不够灵活?
(6)、是否以LOC或FP估算产品的规模;
(7)、对于估算出的产品规模的信任程度如何;
(8)、产品的用户数有多少;

 

6、技术方面的风险

 

(1)、该技术对于你的公司而言是新的吗
(2)、技术是否过时
(3)、重复使用技术是否合理
(4)、当前可用的技术框架是否合理
(5)、是否有特别苛刻的技术要求
(6)、是否依赖未经试验的新技术、服务或未被证明的硬件、软件
(7)、使用的技术是否有特别的依赖
(8)、产品的需求是否要求采用特定的用户界面;
(9)、需求中是否有过分的对产品的性能约束;
(10)、客户能确定所要求的功能是可行的吗?

 

7、外部依赖性方面的风险

(1)、改项目是否依赖其他的开发平台
(2)、改项目是否依赖外部产品或外部开发的构建
(3)、成功是否依赖与开发工具和实施技术的成功集成?是否有替代计划,是否可以在没有这些技术的情况情况下交付项目

然后,就开始需求工程了。“用户故事”是一个……看着很优雅的词汇,但是常常要不是变得干巴巴很无趣,要不然就是变得过于琐碎让人抓狂。而我最常、最爱犯的问题如下:

不要出现只对开发人员有价值的故事

例如:

1、所有的数据库连接要从连接池中获取

2、配置程序的log4j日志输出,并且配置好日志级别。

故事的编写没有能够体现对客户或用户的价值。上面的故事可以换成如下的形式:

1、这个软件,最多50位用户能使用5用户的数据库许可

2、所有的错误应该以统一的方式展现给用户并做记录

SCRUM 全员会议的目的是: 组成团队,培养团队士气,了解项目背景。(嗯,项目背景很重要,也可以扯出很多。另外,“parking lot”是一个好主意。)

Product Backlog相当简洁,至少比我想象的要简洁得多。Product Backlog在全员会议之后的“SCRUM 评估会议”中登场。主要评估工作量:

     1.  确定 Backlog 中各项的大小.
2.  确定团队在一个Sprint中能够完成多少工作。
3.  团队成员可以从会议中知道项目接下来的阶段会发生哪些事情。
4.  修整Backlog内容:以合理方式分解Backlog各个项目,从而获得更深入的理解

这个动作是整个计划可以按时完成的关键,相当于是提前大家达成共识,对每项工作要在多长时间内完成有一个“契约”。会议开多长时间也是很讲究的:

会议时间
1. 该会议时间限制为不超过 90分钟。
2. 如果 Sprint 持续时间长于一周,那么每个 Sprint 举行两次估算会议比较合适

接下来就该准备进入迭代了,这里dyllove98给了一个相当精悍而实用的议程例子:

会议进程
1. 把 Sprint 时间表公开给所有人
2. 把 Sprint 评审会议的结果公开给所有人
3. 把 Sprint 回顾会议的结果公开给所有人
4. 产品负责人向团队产品阐述产品远景
5. 产品负责人和团队一起确定 Sprint 目标
6. 从第一个 Product Backlog条目(故事)开始。
7. 讨论该 Product Backlog条目,以深入理解。
8. 分析、明确用户验收测试。
9. 找到非功能性需求(性能、稳定性……)。
10. 找到验收条件。
11. 弄清楚需要“完成”到何种水平。
12. 获得  Backlog 条目各个方面的清晰了解。
13. 绘制出所需交付物的相关图表,包括流程图、UML 图、手绘草图、屏幕 UI设计等。
14. 回到步骤 1,选取下一个Backlog条目

sprint会议可以分两次,我理解上面👆这次用来准确了解需求,下面👇这次则是用来明确设计:

会议进程
1.  从第一个 Backlog条目开始。  
确定对于客户的需求理解正确。
围绕该Backlog 条目进行设计,并基于下列类似问题:
(1)、我们需要编写什么样的接口?
(2)、我们需要创建什么样的架构?
(3)、我们需要更新哪些表?
(4)、我们需要更新或是编写哪些组件?
(5)、确保考虑到工作中所有的细节
编码
测试
代码评审
会议
学习新技术
编写文档
(6)、如果任务需时超过一天,尝试把该任务分割成几个小任务

先跳过中间的每日routine,直接看看scrum评审会议:

会议进程
1. Product Owner欢迎大家来参加Sprint 复审会议。
2. Product Owner提醒大家关于本次 Sprint的目的:Sprint目标、Scrum团队在
3. 本次Sprint中选定要开发的故事。
4. 产品开发团队展示新功能,并让最终用户尝试新功能。
5. Scrum Master 推进会议进程。
6. 最终用户的反馈将会由 Product Owner和/或Scrum Master记录
(1). 如果产品负责人想要改变功能:添加一个新问题到产品 Backlog 中
(2). 如果对功能有一个新的想法:添加一个新问题到产品 Backlog 中
(3). 如果小组报告项目遇到阻碍现在还没能解决:把该障碍加入到障碍 Backlog
7. 注意事项:
(1). 确保清晰阐述了 sprint 目标。 如果在演示上有些人对产品一无所知,那就花上几分钟来进行描述。
(2). 不要花太多时间准备演示,尤其是不要做花里胡哨的演讲。把那些玩意儿扔一边去,集中精力演示可以实际工作的代码。
(3). 节奏要快,也就是说要把准备的精力放在保持演示的快节奏上,而不是让它看上去好看。
(4). 让演示关注于业务层次,不要管技术细节。注意力放在“我们做了什么”,而不是“我们怎么做的”。 可能的话,让观众自己试一下产品。
(5). 不要演示一大堆细碎的 bug 修复和微不足道的特性。你可以提到一些,但是不要演示,因为它们通常会花很长时间,而且会分散大家的注意力,让他们不能关注更加重要的故事。

充满了最佳实践的小技巧。

补一张product backlog的样张:

自打见过这一面之后,魂牵梦系的。

最近搞“媚”和“姒”,不自主地就想起notion。就想着能不能让两方面同时发生关系。

一开始,媚啥都没有,此时有n种方式充值:手动拖动组件手工输入。这个适合notion。文件导入,这个可以设计两种方式:一种是从菜单或工具栏发起,直接充入工作区,然后再进行编辑;一种拖动“导入”组件到工作区,然后进行导入操作。显然后一种方式更notion。数据库抽取,同理“可证”。

这导入的东西一大坨,如果完全靠手工编辑肯定很崩溃。工作区如果能自动进行分拣,当然更怡人。也是两种操作方式:利用“+shift”选中要整理的部分,然后从菜单或工具栏发起整理,或者,选中部分显示操作柄,通过操作柄完成整理。另一种是工作区提供自动整理设置,凡是加入的内容都会按规则进行重新定位。后一种在手工添加的时候会比较晕菜。

新充入的内容肯定需要提交审核,在notion概念中,自然是要整个工作区一起提交的。但显然需要一定的技术处理(审批时变更必须非常醒目,甚至只有变更)。处理也很简单,最简单地就是只显示变更,其它做隐藏处理,并提示隐藏。复杂一点的,类似office类软件。

版本管理至少目前没有必要采取git模式,csv就得。这样,“媚”和“姒”被查看的时候必然是指定版本的。于是,所有的变更必然是基于批准版本之上的。那么,理论上每个具有审批权限的人只要进入工作区自然就可以看到变更并审批……也就是说,审批流程就变成:发审批通知,然后将变更对审批者可见即可。审批流程变成一个信息流+权限状态切换!并且审批状态可以直接放置在变更内容中提示。

就和notion的概念,审批信息都可以使用这样的模型:书里夹上书签,书签指明要审阅的位置。审批过程和结果都写在书签上。审批完成,书签可以归档作为书的这个版本的附件被管理。Good!

对于“姒”而言,还有一个特殊操作:要生成规则。首先规则是针对不同环境的,环境不同规则不同。所以比较简单的是把东西从环境中取出来,这样规则就可以标准化。于是,“姒”的每一项缺省都是带对应规则的,规则部分如果能自动适配出来,则紧跟在相应项之后,否则需要手工介入。介入方式相当于就是直接编辑表单了。

然后,执行规则的任务……需要一个独立的针对计划或者任务的工作区。这里的模型,用“任务控制台”和“任务监视器”之类的会比较自然一些。于是,可以从“姒”的工作区选中那些规则,然后“发送”到“控制台”来完成设置任务的操作。

然后,这个采用notion概念的工作区就变成非常神奇的存在了:不仅审批过程可以变成公文内容加入(嗯带公章的那种哦),生成的规则可以、任务可以,任务的结果日志也可以加入(嗯附录的那种耶),自然,统计图表可以加入。于是,工作区本身可以变成工作日志,兼工作界面。只需要允许工作区按不同的方式编排重组。

那么,这个notion概念的东西的本质是什么呢?它是存储吗?可能是,所有内容可以作为一份文档的内容就存储在一起。但也可以不。那么它是一个组合查询的结果聚集(mash-up)吗?mashup界面通常是不让编辑的,更何况,人家还有版本区别呢,你可以随时查看不同的版本。说到这儿,似乎都可以利用版本控制为自己生成不同的版本形成不同界面然后来回切换,版本都可以当菜单项使了(滑稽脸)。那么,它是一个界面开发工具……自助型的……吗?至少它的用户不会这么想。

Magic,不是吗。

那天关于群主负责制的消息刚刚出来,在同学群里发了几句牢骚,然后就有党员同学出来指出在微信群里存在大量的黄赌毒之类的群,只是针对这种情况来立规矩。人家也许也是调侃,我却没那么好心情,立刻怼回去:有这类情况的群毕竟少数,万分之一不到,却要给其他9999立规矩。

有句话当时没说出来:这就是黄鼠狼给鸡拜年。

结果还没等我吐槽痛快呢,另一同学冷不丁跳出来出来说:我们这是轻松愉快群……原话忘了,大概后面的意思就是,你就别自己个找不痛快了,我们不伺候。

嘿!……错愕之下,条件反射地行为艺术了一把:愤而退群。


现在想想,不该退群,而应该要去把群主角色转让给我,还大家一个畅所欲言的场所。


于是昨天下午就琢磨这个事儿。自然,很多人都不免第一时间会联想到去中心化的区块链。区块不熟。链倒是比较熟,容易展开联想。

在群里,大家的通信模式是星状的,也就是一个人发信息,同时抄送给n个人。这样就需要一个n+1人都在一起的数据结构,并且这个结构在服务器侧。但如果将模型改成“当一个发信息时,总是发给另一个人,然后之前那n个被抄送的,实际上是串成一个传递链条式的一个转另一个地直至n个人都收到消息”呢?(突然意识到这相当于特务电影里的“单线联系”)

然后,group可以作为一个令牌存在,比如依然是要建一个同学群。这时有人先抛出一个“同学群”令牌给第二人,第二人挑选一个同学传递令牌,……如果每个人的通讯录里,凡是同学的都有一个“同学”标签,那么系统可以自动通过游走,基于所有人各自的通讯录构成的联系graph上建立一个最小生成树。

这就等同于说,不是一个人事先发起组件了一个群,而是由于大家自觉的标记自然而然地凑到了一起。这样,如果要言论担责的话,总是只能找那个发言者。比如我发条消息给所有标签为“同学”的账号,任意收到的,回复着条消息给同样标签的账号……这样就消解掉这个服务器端的“群”数据结构,转变为每个人自己的通讯录的标签。

这样,除非所有人的通讯录都上传到服务器,否则服务器是无法知道同一标签都有哪些账号在一起。并且,如果你取消掉这个标签,并不能保证你不会受到“群”信息。因为你依然在别人的通讯录被标记着,但是会有一部分人因此收不到“群”信息(如果是按最小生成树为路径分发的话。这个问题当然也不是解决不了,先挂着)。

关键当然是界面上的表达。标签形成的“群”此时其实相当于是一个临时邮箱账号,每个人发的消息都是邮箱中的一条信息。在微信群的模型中,这个邮箱相当于是群主创建的。而在标签模型中,则是相当于每个人都按约定在路边立了一个同样标识的邮箱,投递员扫街看到插着同样的三色鸡毛邮箱就把鸡毛信投入。

这个小小的改变,可以将群回归到真正的群体通信行为模式中。

遇到过几次需要从youtube下载视频的情况,每次现查方法,看到哪个用哪个,一直没记录也没比较。于是到底哪种方法比较好使也不甚了了。

https://www.zhihu.com/question/54672309

这个问题底下的答案我试验了几个,相对而言,http://www.youtudownloader.com/的速度貌似比较快,支持720P感觉足够了。不过,这个网站遵守youtube版权协议的要求,有些视频下不了。

其中在youtube.com中添加“1s”成为“youtube1s.com”的方法,下载速度时快时慢,可以碰碰运气。

www.complexity.soton.ac.uk/theory/chn/_Emergence_and_Self-Organization.php

复杂形态的形成一般是很难解释说明的。除非我们首先能理解由小尺度的相互作用而产生的中间状态,然后这些中间状态又通过相互作用进而产生像完善的生态系统和城市系统这样的更高水平的复杂形态。用传统的还原式的方法来纯粹剖析单个系统元素的方法“并不能提供所有需要的信息来整合并解释说明整体形态的成因——而了解不同单元之间的相互关系才是最关键的。

自组织理论描述了突变系统内通过反馈机制——放大效应(正反馈),或抑制效应(负反馈)而形成的相互作用的关系

自组织临界理论表明,随着系统演化到更复杂状态,它将表现出更多的不依赖于尺度的变化特征。基本上,随着系统的演变将呈现出符合幂率分布法则的变化强度和频率的关系,由也就是有大量的小事件和很少的大事件组成。自组织临界理论还认为,系统演化到关键状态时,它对不起眼的小影响将变得异常敏感,尤其是在它们崩溃之前。

在复杂系统中,阈值的存在是引发非线性变化特征的主要原因。临界点具有类似的涵义,但多与系统相关:它代表了系统变化中的关键位置, 跨过临界点系统将快速的,很可能不可逆转的进入另一个完全不同的平衡状态。

瞬态是系统从一个平衡状态移动到另一个平衡状态时的中间变化状态。临界阶段通常被描述为或者假定是突然和剧烈的。但在现实世界中的临界过渡通常表现出不同的时间长度, 而这主要取决于系统的大小,驱动力的频率以及系统转变的类型。如果在一个临界转换过程中外间的干扰是频繁的,那么系统也很可能表现出一系列连续的变化。更好地了解临界转变所需要的时间长度以及决定转变时间的因素对制定相应的管理措施至关重要。

从广义上讲,连通性是现实世界复杂系统中 能量,资源,物种和社会行为在网络中交互的方式和程度的体现。

相对关联密切的系统一般的韧性能力也比较强,因为即使部分的子系统受到损害, 但其它未受影响的子系统有助于帮住恢复故障并进而更新整个连接。然而,过渡密集和高度连通的系统对干扰却相对比较脆弱,一个局部小的扰动就可能引发多米诺连锁效应而使扰动迅速蔓延到整个网络而引发系统性的故障, 比如全球的银行系统。

blog.sciencenet.cn/blog-117615-625806.html

社会问题非常复杂,但是现在却有了比较好的理论模型来研究社会问题,这些理论模型是什么呢?现在列举出如下八种:

第一,自组织系统理论;第二,混沌理论;第三,耗散结构理论;第四,系统论;第五,结构主义;第六,熵增原理,热力学第二定律和热寂说;第七,蝴蝶效应;第八,多米诺骨牌效应;第九,对称性破缺理论等。

自组织系统认为,在一个混沌体内部,可以通过自发的组织过程,把混沌体由一个无序的混乱状态演进为一个有序的自组织系统,这个系统有自己的独立性,有自己的边沿和保护机制,有自己的组织结构,系统层次,有独特的功能作用,有不可逆转的演替规律,不断向高级发展,最后产生因为不对称的演化而导致的必然死亡过程。实际上,死亡的原因也就是他产生的原因。

我们发现:自然界中生态系统、群落、景观是自组织系统;土地是自组织系统;台风、龙卷风是自组织系统;大的方面太阳系和宇宙是自组织系统;小的方面生物物种是自组织系统,无论是个体人还是民族人都是自组织系统,而人类内部的各种现象和组织都是自组织系统:例如家庭、公司、工厂、政府、军队、学校、研究所、政党、国家等等。所以这些组织都有一个自己的魔咒“死亡”。

我们发现了几个自组织系统自我修复的现象:第一,制造死亡因子扑捉系统。例如在人体中有免疫系统。第二,引进负熵。所有的生物都会引进负熵,从而减小由于内部自发运动引起的熵产生过程,从而减小内部的紊乱程度,增加组织能力和运行效率。第三,增加结构的严密性和层次性。最为常见的就是政府、军队和公司组织成了等级森严的金字塔地位结构。第四,自组织系统为了适应环境和持续演进,对于内部的紊乱,往往会采取内部的整顿、调整、改革和清理措施。第五,崩溃后组织重新组合,重新生成,在新的层次上产生新的结构,但是依然继承原有的功能。

www.jiemian.com/article/554952.html

自组织的应用主要基于企业内部的员工视角,即化员工为企业的管理者、决策者甚至是拥有者,同时自组织的创新还会涉及企业外部的利益相关者,例如化客户为企业的监督者、评判者和参与者。

如何改变企业员工这种被动的被组织的情境:

  • 去中心化
  • 去层级化
  • 发展分享:实施利润分享、特别是对员工绑定一定增长比例的激励是坚定企业物质基础、坚定员工留任信心的必要条件,也是对去层级化的有机补充。只要赋予平等、对等的权利,普通员工也会自觉、自发地成为自组织的“命运共同体”。
  • 客户管理员工:既然实施了员工自我管理,员工自我管理的效果该如何评判?既然采取了去中心化、去层级化的措施,员工自我管理的考量又应该由谁评价?易到用车将对企业“员工”的管理完全交给客户来负责,客户基于真实的使用体验,对司机服务的友好性、及时性、安全性、整洁度等给予全面客观的评价。这一结果将直接影响到对司机的评价累积和未来的招徕生意,司机往往非常重视客户的评价,珍惜自己的声誉,从而实现了“无管理者的客户自管理”。小米较之更进一步,赋予客户以“粉丝”的职能,并不断激励“米粉”参与决策,使米粉成为产品创新的推动者、评判者和参与者。

www.ziyoubaba.com/archives/606

自组织神经网络算法用于分类,利用欧式距离,不断循环迭代利用最短距离和不断缩小的步长寻找分类中心点。

www.infoq.com/cn/articles/what-are-self-organising-teams

“知识工作者必须要自我管理。他们必须有自主权”。

真正的团队有如下四个特征:

首先,共同完成一个伟大的使命;
其次,在信息流方面有着清晰的边界,与其他组织单位、资源或决策政策协同一致;
第三,在这些边界内有权自我管理;以及
第四,在某此合理安排的期限内保持稳定性。

在做团队权限范围内的决策时,必须要考虑任何组织单位都必须要履行的四种职能,考虑谁具有最佳的条件能够更好地处理这每一种职能:

  • 为团队设定方向,也就是指,设定组织的目标、主要的目的和任务,这将派生出无数更小的任务;
  • 执行单位的规划并针对这项工作做好组织支持的准备工作,也就是指,任务的结构化、决定将由谁去做这些工作,确定工作的实施标准,确保团队具有开展工作所需的资源和协助。
  • 工作过程的监控和管理,也就是指,收集并诠释工作进行中的数据,如有必要采取纠正措施;
  • 工作的执行,也就是说,使用体力或精力去完成任务。

图一:权力矩阵

按照Francis Heylighen(《自组织和自适应的科学》的作者)的说法,所有自组织系统都有以下特征:

  • 分散式的控制,也就是说与集中式的控制截然相反,
  • 不断适应改变的环境,
  • 在局部相互作用下自然浮现出来的结构,
  • 反馈,包括肯定的和否定的
  • 弹性,归结于系统修复和调整的能力。

Heylighen为了帮助我们的理解,引用了控制论专家Ross Ashby1947年在《自组织动态体制的原则》中最初的阐述,自组织是一种自然的过程,是在混乱无序的体系组件间的局部相互作用下建立起的整体秩序

Glenda H. Eoyang的文章《自组织在人类体系中的条件》颇具里程碑意义,她在这篇文章中提出了三个条件,自组织过程必须满足这三个条件才能形成浑然一体的模式:

  • 封闭(C)的边界,它锁定了体系的范围以定义它的特征。简单来说,不清晰地分离出“非我”,就没有清晰的“自我”。此类的控制依赖于组织支柱,比如清晰明确的任务、伟大的使命、富有挑战性的目标、运营指导方针和明晰的决策策略。
  • 显著差异(D),比如不同的知识、经验、教育、年龄、性别和文化背景。高效的团队知道如何认可和包容团队的差异性,知道如何以差异为基础创造不同。
  • 交流转换(E),引导团队内部及其所处环境的相互作用。按照Eoyang的说法,在相互依赖的人或单位之间的信息、精神或物质的转换是能否深入到系统级自组织模式的关键。

边界完全不是纯粹的约束,它一直都是在界定交流的时机。就其本身而言,边界对内外方向均有影响。用Margaret Wheatley的话说:“如果人们在清晰的组织特性的指导下自由地做出他们自己的决定,那么整个体系的发展会更加地协调和强劲。组织不需过多的控制却会更加有序。”

作为较大体系中的一部分,CDE模型的每个单位都依赖于一个支持环境。Hackman有一个比喻是这样讲的:“如果一个良好设计的工作团队是一棵秧苗,那么组织环境就是栽种它的土壤,环境为它提供生产和结果所需的营养。”按照Hackman不加修辞的说法,环境对于自组织团队的支持由以下四个子系统构成:

  • 信息——提供数据的团队,其成员需要胜任计划和执行的工作
  • 基础设施——合适的物理空间(很多同地协作的团队为此产生矛盾)、技术设施和金钱。
  • 教育——团队可能需要的培训、教练或技术援助
  • 奖励——针对好的团队效率提供肯定的、经济上的和象征性的奖励。

回到Eoyang的自组织模型,我们现在可以简单画一张图来说明约束、不同、转变和环境是如何在一起互相转化、影响的:

图二:展开的CDE模型

图表2的中心区域有一批不同大小、形状和颜色的元素,表示团队成员有不同的背景、优势和技能。就像连接箭头所示,成员之间是彼此连接的,他们通过倾心地交流或沟通创建了一个跨功能的团队。整个团队的交互由边界来界定,从一定程度上说明这是一个开放而非封闭的系统。它的环境绝不是一个传统的黑盒子,团队依赖于它的环境。他们需要环境的支持,也就是之前提到的基础设施、信息、教育和奖励等子系统的支持。而且,他们需要一个外部代理人(以一个雪花符号表示),它对这些支持负责。这是个顶头上司的角色。

尽管为了尽可能地简化这张图而没有画上团队间的信赖,但它在价值流、必要的客户关注点和组织奖励方面的连通性却是所有自组织流程的关键。

download.bioon.com.cn/upload/201101/17/184423615iie1oavtvoe1i.attach.doc

系统论的基本原理:
(1)整体性原理。系统是由若干要素组成的具有独立要素所没有的性质和功能的有机整体,表现出整体的性质和功能不等于各个要素性质和功能的简单叠加。

(2)层次性原理:由于组成系统的各个要素存在各种差异,系统组织在地位和作用,结构和功能上表现出具有质的差异的等级秩序性即层次性。

(3)开放性原理:系统具有不断与外界环境进行物质,能量,信息交换的性质和功能,开放性是系统演化的前提,也是系统稳定的条件。

(4)目的性原理:系统在与环境相互作用的过程中,在一定范围内系统的发展和变化几乎不受条件和途径的影响,表现出某种趋向预定状态的特性。

(5)突变性原理:系统失稳而发生状态变化是一个突变过程,是系统质变的一种基本形式。系统发展过程中存在分叉而且突变方式很多,使系统质变和发展也存在多样性。

(6)稳定性原理:开放系统能够在一定的范围内进行自我调节,保持和恢复系统原有的有序状态,功能结构,具有一定自我稳定的能力。

(7)自组织原理:开放系统由于复杂的非线性作用而使涨落得以放大,从而产生更大范围更强烈的长程相关,系统内部各个要素自发地组织起来,系统从无序向有序,从低级有序向高级有序发展。

(8)相似性原理:系统的结构功能,存在方式和演化过程具有有差异的共性,是系统统一性的一种表示。系统表现出同构和同态。系统论的基本规律是关于系统存在的基本状态和演化趋势的,稳定的,必然的,普遍的规律。

系统论的基本规律概括为:

(1)结构功能相关律:即关于结构和功能相互关联,相互转化的规律。一定的结构必然具有一定的功能并制约着随机涨落的范围,随机涨落可以引起局部功能的改变,当涨落突破系统内部调节机制的作用范围,涨落得到系统整体的响应而放大,造成系统整体结构的改变,而新的结构又制约新的随机涨落的范围。这样结构和功能动态地相互作用,系统不断地演化。

(2)信息反馈律:即信息反馈的调控作用影响系统稳定性的内在机理。负反馈强化系统的稳定性,正反馈使系统远离稳定状态,但正反馈可以推动系统的演化,因为在一定条件下,涨落通过正反馈得以放大,破坏系统的原有稳定性,使系统进入新的稳定状态。

(3)竞争协同律:即系统的要素之间,系统与环境之间存在整体统一性和个体差异性,通过竞争和协同推动系统的演化发展。自组织理论认识到在竞争基础上的协同对于系统演化的重大意义。非线性相互作用构成竞争和协同辨证关系的自然科学基础。系统中普遍存在的涨落说明系统要素之间总是处于竞争状态,涨落得到系统的响应而得以放大说明协同在发挥作用。竞争是系统演化的创造性因素,协同是系统演化确定性,目的性的因素。
(4)涨落有序律:即系统通过涨落达到有序,实现系统从无序向有序,从低级有序向高级有序发展。这种转变与对称破缺紧密相关。系统演化过程中的分叉通过涨落实现,说明必然性通过偶然性表现出来。

(5)优化演化律:即系统不断演化,优化通过演化实现,表现系统的进化发展。耗散结构理论阐述了系统优化的一些基本前提,协同学着重讨论了系统优化的内部机制,超循环理论说明超循环组织形成就是系统优化的一种形式。系统优化最重要的是整体优化,“形态越高,发展越快”是系统优化的一条基本法则。系统优化是系统演化的目的。随着系统形态的发展,复杂系统的稳定性可以通过通信能力的改善和优化来保证。耗散结构理论阐述了系统优化的一些基本前提,协同学着重讨论了系统优化的内部机制,超循环理论说明超循环组织形成就是系统优化的一种形式。

上午做了两件事儿,一是盘点了近期项目系统的整体功能,找出了短板。二是系统地写读书笔记。

下午就下了半天决心去了一趟三里屯的苹果直销店,准备把电脑彻底修一下。结果一身热汗从一楼跑到二楼,找了个店员一问,才知道这边也不是随到随给检测,也要排队。今天排队的话,要等到七点半可以轮上。店员告诉我,下载“apple支持”这款app,通过它可以预约。立刻下载,然后约了下周一下午两点十分这个看起来不错的时间。

有些人呢,像我这样,无头苍蝇一样愣愣飞过去撞墙,然后再想辙,往往日子越来越窘迫。有些人呢,能恰到好处地提前筹谋,往往人生赢家。

所以做事的习惯很重要,有个正确顺序的习惯很重要。

去三里屯之前为啥就没想到先往上查一下,或者电话问问呢?

1)自以为是是最主要的成因:想象着到了地方就能给检测,检测是自动仪器进行,所以接待量没问题,谁告诉你的?!

2)也有着想要一劳永逸的冲动。这可能是更基底的思想因素。

3)想着多走走锻炼身体了。

4)过去的经验是网上查东西不那么直接可靠,也造成一定盲区。

这样一分析,似乎想要一劳永逸才是根本原因。所以说明自己的驱动机制还是结果导向型的,而不是过程导向型的。苏菲应该是过程导向的,在想到结果的快感之前,过程的有效性是更加基础的快乐,而不是反过来。

据说:

只注重结果的人,急躁冒进,性格属于有些偏激、缺乏毅力,又独断专行,一意孤行是他的主要特征。做事成功的几率不大。

注重过程的人性情沉稳,对待事物分析的透彻,为人状态好,有毅力和耐性,有为达目标不罢休的特点。成功的几率大。

你看,性格上区别就挺大。还有人看到了更大的差别:

中国人重视结果,西方人重视过程。在东方人看来,过程不是很重要的,结果是最重要的。过程不仅仅不很重要,有时候还是不可琢磨的,或者是不愿提及的。 西方文化会把过程看得和结果同等重要, 甚至过程有时比结果还要重要。例如,交男女朋友。西方人在交往的过程中,他们很少想到会不会结婚,

而这样的性格成因,似乎……显然……可以从小时候去找事儿。于是看到一篇文章说:

在过去的10年里,斯坦福大学著名的发展心理学家卡罗尔·德韦克带领着她的团队做了这样一个实验。

首先,研究人员让孩子逐个参加第一轮智商测试。测试的题目是一个比较低的智力拼图,所有的孩子都能轻松地完成这个测试。完成测试之后,研究人员会将测试分数告诉孩子,并对孩子进行鼓励,但是鼓励有所不同。研究人员随机把孩子分为两组,对其中一组孩子的鼓励是“你的测试分数很高,真聪明”、“你在拼图方面真有天分”,而对另一组孩子的鼓励则是“你在测试的时候非常努力,所以表现得很好”。

之后,在第二轮的测试中,研究人员给孩子提供了两种难度不同的测试,让孩子自由选择。研究人员最后发现,那些被鼓励“有天分,很聪明”的孩子,大部分选择了比较简单的测试,那些被鼓励“很努力”的孩子,却有90%选择了比较困难的测试。

对第二轮测试的结果,德韦克解释道:“我们说孩子聪明时,就等于是在告诉孩子,为了保持聪明,不要去做错事,结果才最重要。”也就是说,如果夸孩子聪明,孩子会规避挑战,避免失败,不想让大人认为自己不够聪明。

紧随其后,他们又进行了第三轮测试。这次测试,所有孩子的题目都是一样的,并且非常困难,孩子基本不可能完成。结果可想而知,所有的孩子都失败了,但是,孩子的表现却有很大的差异。

那些被鼓励“很聪明”的孩子,在整个测试中都非常紧张,一直在观察其它孩子的进度,生怕自己不如别的孩子“聪明”,如果不如别的孩子,就变得十分沮丧,认为自己不够“聪明”;而那些被鼓励“很努力”的孩子,在测试中非常投入,一直在努力思考,试图解决难题,完成测试,在这些孩子看来,测试失败是因为自己不够努力。

在第四轮测试中,又让所有孩子做了一样简单的测试题,但是“聪明”的孩子表现都有所退步,“努力”的孩子进步却非常大。

从孩子在整个实验的表现来看,可以得出以下结论:

1.重视结果,会让孩子忽略过程的重要性,寻找一些所谓的“捷径”,从而缺失一些重要的解决问题的能力;

2.重视过程,让孩子感觉一切都在自己的掌控中,会想方设法解决问题;

3.重视结果会让孩子“输不起”,而重视过程使孩子敢于面对挑战。

过程比结果更重要,不要忽略了孩子在过程中的努力。

你看,就一句鼓励的话,带来的结果这么不同。心理暗示的作用有多大。

所以,要克服注重结果的毛病的第一步,看来是平时多问问自己:你有多努力?

有种说法:菜鸟注重结果,高手注重过程。这里似乎跟“努力”的暗示是更加努力而少考虑规避难度,“聪明”的暗示是规避风险而不自主地降低难度应该是有必然联系的。

但是如果注重努力的话,我今天颠颠颠地白跑一趟才显得特别努力不是吗?

嗯,狗改不了吃屎。

上午师长迟到了,应该是快十一点了才到公司。

我介绍了近期的产品思路,庆幸师长能听明白。林老师依然夸在了点子上。这些都让我觉得大家一起共事也算是一种幸运吧。

Dream的汇报也还好,就是他给出的Excel表格太缺乏条理性了。之前我没细看,坐着听他介绍的时候才发现。以后应该提前找机会跟他说,否则马后炮只会破坏团结。

汇报完毕后,又闲扯了一会会,选址分析啥的。林老师依旧表现得什么都想做……或者说是对供应链金融有执着。嗯,师长对Canvas的前景理解也是一种执着。

12:40才在我的催促下出发去穆沙。而我的头疼已经不再躲在意识之外了。东西一般,可能只是因为我状态不好。

下午挣扎做完补录界面后,早早撤了。

师长出口惊艳:我们是不是要放弃一个项目,要看是不是符合甲方的利益。

讲了个故事:某日A公司陪标,专家组评议之后,A公司产品过硬中标。A老板得知消息,立刻让前方写声明放弃,曰“自知资质不够,仅是来测试产品的市场反馈,意外中标理应退出”云云。提交后十分钟,投诉A公司资质不够的告状信叫到甲方。后甲方废标,重新招,A公司遂中标胜出。

师长接着语重心长,我们一定会遇到不得不放弃的情况,到时候大家不用着急,兄弟几个一招呼,点几个菜,喝杯小酒,没事了,只要产品过硬,我们还有别的机会,就这样。

一个甲方人士,五十好几,有此番见识,我自斟一杯二锅头。

今天写了两张片子,也不知作用几何。但总觉得进展不大,下班时才觉得是不是由于还是没有章法,几页片子都是想到哪写到哪。

仔细看第一张片子,还是有思路痕迹可寻的。我利用元模型将几大功能要点都联系在一张图上,那么下一步就可以是标记出各个功能要点,再顺藤摸瓜从要点方向摸出功能序列。然后再给出功能线之间的关联性,说明交叉点的功能要点。

接着应该先让界面轮廓先暴露出来,并给出关键细节(那些不同往常的,或者本产品特色密切关联的)。

此外,在与同事讨论过程中,CWM应该是处于技术实现的核心位置,该模型范式中的实体关联描述能力可能成为设计中的“模型驱动功能架构”的关键。

先看看大家都是怎么说的。
从维基百科开始吧。不过中文维基的纪录片词条质量似乎不过关。

一般来说,观众对一部纪录片的期待是它写实,但实际上仅仅镜头和拍摄人的在场这个事实,就可以影响被记录的情况。严谨的纪录片同时也记录下拍摄过程对被记录的情况的影响,来让观众获得一个比较客观的印象。被记录的情况的代表性也影响到一部纪录片是否写实。

——摘自维基百科

然后我们来看看百度百科的说法。

纪录片是以真实生活为创作素材,以真人真事为表现对象,并对其进行艺术的加工与展现的,以展现真实为本质,并用真实引发人们思考的电影或电视艺术形式。纪录片的核心为真实。电影的诞生始于纪录片的创作。1895年法国路易·卢米埃尔拍摄的《工厂的大门》、《火车进站》等实验性的电影,都属于纪录片的性质。

而豆瓣的这篇文章我觉得足够重磅:《什么是纪录片?——王竞》

格里尔逊后来更明确地规定这个词是指:“对现实的创造性处理”(the creative treatment of actuality)。

中国最著名的电影类百科全书是《电影艺术词典》,直接参与这本词典编纂的专家、学者就达一百八十多人;收录词条为1734个;字数约70余万,称得上中国最权威的电影辞书。然而这本词典上面竟然没有收录“纪录片”一词,相应的词条就是“新闻纪录片”。

产生这种认识的另一个原因就是人们对于某些中国电影—尤其是某些纪录片弄虚做假的反感,使得对于真实性的呼声提高了,从而促使人们要求纪录片所谓的“新闻属性”。但我们在前面已经说过了,创造性地处理现实和弄虚作假毫无关系,况且严肃的故事片创作也不能允许弄虚作假。

在知乎问题“纪录片和剧情片,最大的区别是什么?”中,润田这么说的

波兰电影导演克日什托夫·基耶斯洛夫斯基在电影学院的毕业论文中曾经极力阐述这样一个观点:“每一个人的生活中都充满故事和情节,既然现实生活中已经有了这些东西,我们又何必去编造呢?只需把它们拍下来就行了。

 

当初,正是这种想法使他在从影之初走上了拍摄纪录片的道路,但是他在拍摄了十多部纪录片之后发现:“并非每件事情都是可以描述的。这正是纪录片的最大问题。拍纪录片就好像掉进了自己设下的陷阱。你越想接近某人,那人就会躲得越远。这是非常自然的反应,谁也没有办法……我发现,当我拍摄纪录片时,我越想接近那些吸引我注意力的人物,他们就越不愿意把自我表现出来……这就是我逃避纪录片的主要原因。”

新浪博客的这篇文章《纪录片究竟是什么? ——后直接电影时期纪录片理论发展述评》,先是总结了一下90年代以来的纪录片理论研究趋势,

温斯顿在第一版《以真实的名义》中明确提出,区别纪录片与剧情片的最佳方式是看观众对它们不同的接受方式。“纪录片之不同,基础并不在于表现(这里什么都无法被保证),更多在于接受(这里什么都不需要被保证)。”

从观众接受角度界定纪录片会给纪录片表达带来极大的解放。从这一立场出发,影片内容是否是对现实的直接记录已经不再重要,唯一重要的是观众在观看影片时能够将影片内容与现实世界联系起来,确信影片内容是对现实世界的直接描述。

在一本即将出版的纪录片论文集的序言中,温斯顿对纪录片进行了重新界定。除了继续强调在文本之外,观众需要确信影片内容与现实的相关性,或者说创作者、发行者或作品标示本身要让观众确信这种相关性,影片还需要具备另外两个条件:一是影片所呈现的内容,抛开真实、准确与否不谈,一定要有相应的见证人(witness);二是影片要有叙事(narrative)。这种见证可以是直接电影所要求的摄影机的直接见证,也可以是知情人、研究者、亲历者或其他被拍摄对象的见证。

在纪录片界,人们依然相信银幕就仿佛是通向世界的窗户。通过这扇窗,人们看到的就是真实的现实世界。这是一种被某些理论家称为“幼稚现实主义”的观点。

1990年11月,俄亥俄大学(Ohio University)电影系照例举行了自己的年度研讨会。与以往不同的是,这一年的主题确定为纪录片研究。由于当时这种以纪录片为主题的研讨会并不多见,纪录片学者们都非常珍惜,重要人物悉数到场。站在今天来看,这是西方纪录片理论发展史上一次非常重要的集结。

从《纪录片理论与实践》(Documentary Theory and Practice,1976)到《纪录片的声音》(The Voice of Documentary1983),再到《表现现实》,尼科尔斯将纪录片划分为四种类型,即解释型、观察型、互动型和自我反射型。这四种类型每种类型都包含着不同的形式特征和意识形态含义。

解释型纪录片的典型代表是格里尔逊式纪录片,片中画外解说地位突出,有时具有强烈的说教色彩。画面的安排不追求时空的连贯,而采用了“证据剪辑”(evidentiary editing)的方式,即画面服从于解说,解释、说明、印证解说词。中国传统的专题片采用的正是这样一种形式。

观察型纪录片主要指的是直接电影(direct cinema),其典型作品如德鲁(Robert Drew)小组拍摄的《党内初选》(Primary,1960)、弗莱德里克·怀斯曼(Frederick Wiseman)的系列作品等。这种表现方式的技术基础是二战期间发展起来的便携式摄影机和可以同步拾音的磁带录音机。这一类型的纪录片隐匿影片创作者的存在,排斥画外解说,充分运用运动长镜头、同步录音、连贯剪辑等技术手段,以一种透明的、无中介的风格,试图对现实事件进行完整的复制。这种类型的纪录片相信客观世界里真实的存在,相信只要观察得足够细致,就可以捕捉到真实。中国1990年代新纪录片所主张的正是这样一种美学。典型作品如张元、段锦川的《广场》(1994)、段锦川的《八廓南街16号》(1997)等。

互动型纪录片对应于我们通常所说的真实电影(cinema verite),其典型作品如《夏日纪事》(Chronicle of a Summer,1960)等。在这种类型的影片里,影片创作者作为社会角色之一,主动地介入事件,展开采访或搜集信息,与其他社会角色互动。它采用和观察型纪录片相类似的技术手段,如同期声、长镜头等,完整捕捉镜头前影片创作者与他人的互动过程。与观察型纪录片不同,它不追求绝对的、未受干预的真实。它所强调的是影片创作者介入事件后,“撞击产生的真实”。 采访和口述是参与型纪录片的重要标志。在《纪录片的声音》一文中,这一类型又被称作是“采访引导”或者“基于采访”的影片类型。中国新纪录片的开山之作《望长城》(1991)就是这样的代表。

自我反射型纪录片将影片关注的重心从被拍摄对象转向了影片创作过程本身,拍摄行为和影片本身成了反思的对象。这种表现方式持有一种怀疑主义的认识论。它质疑现实主义的表现手段,也质疑媒介机构或影片本身的解释能力。这种表现方式促使观众重新审视影片本身的媒介属性和构成方式,从而令观众对影片建立起更高层次的理解和期待。中国导演雎安奇的《北京的风很大》(1999)可以归属于这一类型。

尼科尔斯在上述四种类型之后,在《模糊的边界》(1994)一书中又概括出一种新的纪录片类型,即表述行为型纪录片。这种类型纪录片最重要的一个特征是它放弃了纪实风格,强化了对于创作主体的主观体验、主观感受的传达,相信个体的主观体验是我们把握世界的可靠途径。主观镜头、印象式蒙太奇、戏剧化的灯光、煽情的音乐等等一些表现主义的元素在这里都派上了用场。中国导演张以庆的《英和白》(2001)、刘德东的《落地窗》(2012)都可算是这一类型的典例。

在接受了卡尔·普兰廷加等人的批评和迈克·雷诺夫等人的提醒之后,到了2001年,尼科尔斯再次修正了自己的分类理论。在第一版《纪录片导论》(Introduction to Documentary,2001)中,尼克尔斯新增了诗意型纪录片,并将互动型纪录片改称为参与型纪录片。按照尼科尔斯的解释,诗意型纪录片最早出现于1920年代,典型的作品如尤里斯·伊文思(Joris Ivens)的《桥》(The Bridge,1928)、《雨》(Rain,1929)等。诗意型纪录片的出现与当时先锋派艺术相关,其表现方式偏爱“片段拼贴、主观印象、不连贯的动作和松散的连接。”它强调的是情绪、气氛,而不追求叙事或劝服。中国导演黄伟凯的《现实是过去的未来》(2008)、张以庆的《听禅》(2011)都属于这种类型。

这六种纪录片类型是纪录片家族中的六个核心分支,对于纪录片形式研究来说,它们提供了一个基本的思考框架。

在第二版《纪录片导论》(2010)中,尼科尔斯撤掉了第一版中描述纪录片形式演进的图示,但补充了之前未曾详细论述过的其他媒介中存在的非虚构模型(nonfiction model),如新闻调查、人类学调查、民族志写作、历史写作等。它们与不同形式的纪录片表达构成了某种对应。如此一来,尼科尔斯就为纪录片的形式研究提供了不同于原来的“类型”(mode)的第二个范式。这是一段富有启发的阐述,尽管极其简略。当然在纪录片实践中,这样的实例从来不鲜见。比如我们身边的一位独立纪录片导演徐童,他的作品《算命》(2009)就成功地借鉴了中国传统章回体小说的结构、风格。但尼科尔斯这里是将非虚构模型作为纪录片形式研究的一般方法论提出来,值得格外关注。

在《秦丽娜—浮光纪影》的表述中,她给出自己的观点,其中一和三已经跟上文的观点很接近了,说明我国从业者也是实实在在的在进步的。

在我看来,(广义的)纪录片的判断标准不是艺术手段、技术手段或者传播方式等外在形态,而是一些内在元素。通常,我们默认必须具有一些相应的元素,这样的影片才能被称之为纪录片。
首先,纪录片的素材必须来源于自然素材。也就是说,影片讲述的必须是真人、真事、真实的物质存在,或者通过它们来讲述的抽象事物。而在表现的手段上并没有太多的限制。比如:你要讲述一种特殊的情感,那么这种情感的来源必须是真人(包括动植物等其它物质存在)和真事儿(符合当前的科学观)。至于表现手段上,实拍、扮演或者动画等等都是可以的。
其次,纪录片必须具有观点(情感)或功能。一部纪录电影肯定会表达创作者的某种观点或情感,而新闻片、宣传片或者人类学纪录片,则具有提供信息等方面功能。
第三,纪录片需要经过创作者有意识的组织。这种组织包括选题确定,前期拍摄,后期剪辑等等。总之,只有创作者通过影视导演术有意识的进行组织,影片才能表现出某种观点(情感)或功能。没有经过有效组织的影像,只能算作素材或资料,并不能被称为影片。
也就是说,纪录片除了素材来源必须自然之外,还需要通过影视导演术组织出明确的表达或作用。并不是说拍下一些真实发生的事情,剪辑出来就是一部纪录片了。比如一些私人影像(家庭录像)或者某些真人秀节目,在我看来就不能算做是纪录片。

在这篇文章(https://core.ac.uk/download/pdf/41457939.pdf)中关于事件的说明:

新闻事件报导的内容主要是由四个W、一个H 组成,即:who“谁”、when“何时”、where“何地”、what“发生什么”、how“如何发生”。

新闻片强调新闻事件的现象。而记实片表达的内容又比新闻片更为广泛,但仍是在呈现人与社会、人与自然环境间关系的表象,而不在深层地探讨事件的背景与分析社会表象之下的意涵
。纪录片则着重深入分析与探讨社会事件表象下本质性的问题。在叙事风格方面, 纪录片的创作理念从初期真实与表演的混合,演变为力求全面真实与精确,并以中立、客观的态度进行纪录片的创作。

这个视频中提及纪录片有三种类型:人物素描、活动纪事、议题探索。而在这个视频:纪录片必须掌握的三个要素,过程(能刻画整个过程的代表性片段)、互动(人与环境、人与人、人与自己)、观点(有观点才是纪录片,有了意义,否则就是供查证的录像)。

上午到得比较晚,来的时候晨会已经结束。后来问了一下,Deanna已经完成了框架的主体轮廓。

我们下午讨论了一下,我发现我的主要关注点在于是不是可以能得到一个不失灵活(即灵活+开发便利)的程序包(此谓“框架”),可以快速地开发网页单页应用和桌面应用。对于插件的开发,反而弱化了。

上午一直再改项目的方案,跟mac版的word搏斗,频繁crash。后来删掉其中一段文字,情况才好转。不知道是不是由于OS不同导致内存溢出。

中午吃饭,New一个劲跟我说要开发新版本,其实他说这话并没有意识到,其实是整个系统都要重新开发,这个工作量比他所以为的要大得多。搞得我心烦意乱,没给他好脸色。不过我们团队锻炼和培养的,不就是可以另辟蹊径成功突围吗?有挑战才有意思。

下午一点45分Hedge来电话,快三点了才到。然后一起讨论了后续工作内容,开始着手restful化之前的分析功能。

最近校友们在张罗着筹备校庆。在群里,有校友耐心地教老校长怎么改昵称。让我怦然心动,于是想起来给校长提点建议,于是有了下面这封信:

翁老师,见信好!

所谓键盘侠就是只出主意不出力的,在北京只能写封邮件跟您沟通一下我对校庆的一点思考。

我对校庆完全没有一点印象,还是问了Christine(我们那届学生会主席)才知道高中某年是有庆祝且还发了纪念册的,但她也不确定是具体哪年办的了。

也许就是因为我完全没有校庆体验,所以总觉得校庆应该是一件非常隆重的事,一旦举办必然应该要给学子留下深刻印象才好。于是不免对听说到的一些校庆情况心生惶惑:校庆到底是为什么要办呢?大张旗鼓地想达到什么效果?以致于对于在校学生来说会是一次一辈子都有较深刻印象有意义的事儿呢?

换句话说,人们会怎么评论一次校庆?或者说,校友内心里期待一次怎样的校庆?

有的校庆是年年办的,好像日本学校的校园文化祭。我只在二次元的动漫里见过,也只是意淫,以为那是由学生主导、教师辅导的校庆日,展示学校学生的精气神,或者,是展示素质教育成果。要让这样的校庆日年年不同,一般会安排竞赛评优发放奖励,激励学生求新求变。

有的校庆是校友会发起甚至承办的,往往就是学校重要纪念日,比如十年期的诞辰日。这样的校庆,主题就是庆生,既是校友表达对母校的感恩以及回馈,也是校友们相互联络感情慰藉心灵的机会。那么,如果前面说的是“文化祭”,这里就相当于是“氏家祭”。

有的校庆是校方董事会发起,目的是捐款。我们公办学校不存在这种情况。于是就有校方管理机构发起的校庆,目的……(我猜是)彪炳近期学校发展成果,制造社会影响或上层影响,吸引未来校方发展所需要的各种资源。尽管无可厚非,但有时难免要避嫌。于是,如同常常有什么黄帝陵祭、孔庙祭、泰山祭一类,把校庆适当加入宣扬建校传统内容成为“前代掌门祭”。

狗不嫌家贫。尽管我从来没有参加过二中的校庆活动,但总觉得身为二中人是足以特立独行于寰宇书生意气风发的。所以也总是中二地觉得“如果二中要办校庆的话一定是会与众不同反响深远的”。至少是可以弥补我在校时的缺憾,能给在校学生留下人生中充满意义又印象深刻且活泼有趣的一次校庆体验。

只有亲身参与其中才能做到这点,所以我们的校庆就应该是可以唤起校长、师生、校友一起共同热情参与举办的“英华毓德怀仁XX祭”。“XX”是什么词我一下子想不起来,总之就是盛大隆重恭敬活泼温情励志的意思。而“英华”“毓德”“怀仁”六个字自成叙事体,自有“精华孕育精英品行仁义感怀恩惠”等等寓意,本身就天生自带号召力,足够唤起校方/学生/校友的情绪。况且是二中前身,足够寓意深远,撑起校庆立意的旗幡。

这个“英华毓德怀仁XX祭”都可以有什么组办内容和形式呢?

在校新生的校史讲述应该成为一种传统节目,形式不限,可以编写新歌舞/排演新剧目/制作新装置……进行比赛由参加校庆的校友投票选举优胜。既是学习和传承,也是新老校友构筑共同情感家园的时刻。二三年级熟生则可以举办各种自己的庆祝活动,展示自己共建精神家园的进步和成果。学生会和社团则可以承担起校庆的统筹和通讯等组办工作,维护网站啦微博啦微信公号啦校庆新闻发布会直播啦……等等等等。

人永远是二中最为宝贵的成分,也是二中校史中最为重要的鲜活因素。每次校庆都可以是一次编修新校史的重要节点,是大家推举新的校史人物传列入二中校典(真的刻印的厚典)的发表时刻。也是添列校友轶事加入二中人物志(官网的专栏)的联谊时刻。校庆也是最便于大家传播八卦(哪怕是二中微博的投稿),集体娱乐的时刻,每次校庆都可以推选一些校友回学校讲讲有趣的经历和见闻,甚至有条件的还可以摆个个人作品展什么的,张扬二中精神的广博。

当然,也是校友捐赠建立的各种基金理事会年会的时候,自然也是颁布当届奖学金的时刻。校友参与共建二中,是对“英华毓德怀仁”办学精神的最好传承,即便是教学资金不需要校友操心,但校友还是可以有很多锦上添花的“日常”:比如参与管理“校史馆”(可以是二中官网的一个频道),参与维护“二中建校文化遗产保护目录”,参与共建助教活动,参与鼓励新教师的成长,参与发表学生暑期勤工俭学基地的发布……

写到这里,我想起来当年我在学生会的时候,确实是有一次校庆活动。当时我还构思了一番以满校园的烛光道欢迎校友返校的篝火晚会之类的疯狂方案(后来被刘佩珍老师以及高年级干部及时劝(chao)住(xiao)了)。今天利用周末时间梳理了一下前两天被感动的思绪,整理出一点意见,想来也不能对翁老师的筹备工作有实质帮助,只当是还了当年青葱懵懂年少气盛的我的一个未了心愿,又跑来跟当年的翁老师聊骚聊骚吧。

最后的最后,还是在老师面前贸然感慨一下:1917年那会儿,前人办学奠定了二中百年不凡校史。值此2017年之际,也许我辈也可以一起来做一些开风气之先的小事,共享二中再一个百年风华正茂。

90届学生 qaqabincs

敬上

2017.8.27

摘自:http://techand.coffee/2015/06/14/dynamically-calling-functions-in-elixir/
defmodule Math.Simple do
  def add(a, b) do
    a + b
  end
  def sub(a, b) do
    a b
  end
end
定义这个模块之后,
iex(12)> a = fn(x, y) -> apply(Module.concat(Math, “Simple”), String.to_atom(“add”), [x, y]) end
#Function<12.90072148/2 in :erl_eval.expr/5>
iex(13)> a.(1, 2)
3
iex(14)> s = fn(x, y) -> apply(Module.concat(Math, “Simple”), String.to_atom(“sub”), [x, y]) end
#Function<12.90072148/2 in :erl_eval.expr/5>
iex(15)> s.(2, 1)
1
即,利用
iex> apply(Math.Simple, :add, [1, 2])
3
iex> apply(Math.Simple, :sub, [2, 1])
1
iex> Module.concat(Math, Simple)
Math.Simple
以及
iex> String.to_atom(“test”)
:test
可以实现动态调用。

大多数client应用由于是native驻留,所以才采用菜单系统,将所有的功能一股脑给出(同步加载),功能入口的设计尽可能接近平面化,不惜界面堆砌各种控件,着眼于用户可以立刻开始执行核心任务,并且可以便捷地随时切换到辅助功能上。

大多数web应用由于存在网络时延,所以往往会考虑界面尽可能简洁,主界面恨不能只有一个单一核心功能。这点,各大搜索引擎是极端典型。各种工具类功能尽可能延迟加载,以便保持与用户交互的连续性,不会因为网络通信迟延而导致的交互卡顿。

简洁清晰的Dropbox主界面

保持简洁清晰的界面规划。

由于web应用厂商多数是内容或媒体出身,典型如facebook,所以延续了一些平面出版的优良传统,比如栅格化设计。此外,由于web应用多数是需要区分用户,所以往往总是从用户登录开始。但client一般不用考虑这些,上来就直接进入play状态。

如今,桌面应用正在逐渐滑向边远地带,app慢慢成为热门话题。但同样有native和remote的区别。而两者的共同点在于主任务区域的设计。而不同点在于helper类功能的入口设计,很多web类应用甚至直接砍掉了helper类功能。

我们考察notion.so视作典型。其实跟facebook、Dropbox等类似,都是左中右结构的界面分划,中间是核心功能区,左边是菜单区,但摒弃了传统菜单的hierarchy结构,直接是一个list。由于list的item有限,所以只能放常用功能。而不常用的,就隐藏+延迟加载。而且,左区通常是导航、定位的功能,右区则是常用功能。

由于client侧的限制条件较少,所以设计上也更随意一些。目前的趋势,是都往web便利方面靠。

Jackrabbit Oak is a scalable, high-performance hierarchical content
repository designed for use as the foundation of modern world-class
web sites and other demanding content applications.
——apache.org

 

Apache Jackrabbit 是由 Apache Foundation 提供的 JSR-170 的开放源码实现。jackrabbit oak是jackrabbit的下一代产品,其致力于大规模高性能的内容仓库以便满足当代世界级站点需求。
——百度百科

 

Content Repository for Java Technology API (JSR-170) 的目标就是提供这样一个接口。JSR-170 的一个主要优点是,它不绑定到任何特定的底层架构。例如,JSR-170 实现的后端数据存储可以是文件系统、WebDAV 仓库、支持 XML 的系统,甚至还可以是 SQL 数据库。此外,JSR-170 的导出和导入功能允许一个集成器在内容后端与 JCR 实现之间无缝地切换。
——oschina.net

本来买来是配苏菲的那台surface pro的,可是她嫌弃这个鼠标人体工程不够nice,一直放着没用。

之前一直不知道如何让我的macbook pro的蓝牙发现这个鼠标,今天又想起这事,网上查到这篇文章:“Q: Microsoft Designer Bluetooth Mouse is not detected in 10.10.3”,其中的回答解决了问题。

1. Shut down the mouse

2. Push the power button for more than 5 seconds (try to avoid pushing other buttons)

3. Blue light underneath starts blinking and the mouse appear on the bluetooth devices list

4. Pair it

亲测,好使。关掉鼠标电源,然后长按鼠标电源5秒以上。在蓝牙偏好设置中就出现了鼠标,点击配对,顺利接通鼠标!

耶~~✌️

鼠标正常使用中

今天早上我还真是忘了站会的事儿了。

然后一天主要时间都在憋那个9月20日演示的故事。现在回想起来,说明方法不对。没有一根明确的轴线,说明还是需要好好学习一下编剧的方法论。

顺手在知乎上搜到这个问题“新手如何学写剧本?”,其中林天木的答案信息很全面。开心地去下了他指出的几本图书,准备好好学习一下。


《电影剧本写作基础》

一个明确的定义很重要。

一部电影剧本就是一个由画面讲述出来的故事。

一个明确的原则也很重要。

它象名词(noun)──指的是一个人或几个人,在一个地方或几个地方,去干他或她的事情。所有的电影剧本都贯彻执行这一基本前提。

一个简洁的数据结构(Paradigm)是成功的基础啊。

beginning: setup
middle: confrontation
end: resolution

然后,event & eventhandler的结构决定了workflow的可用性。

应该用大约十页的篇幅来让读者明白谁是你的主要人物,什么是故事的前提,故事的情境是什么。

在第一幕结尾处要有一个情节点。所谓情节点就是一个事变或事件,它紧紧织入故事之中,并把故事转向另一方向。

一旦你给自己的人物规定出需求(need),亦即在剧本中他想要达到什么目的,他的目标是什么,你就可以为这一需求设置障碍(obstacles),这样就产生了冲突。

你的故事需要有一个有力的结尾,以便使人理解并求得完整。

然后我们跳过中间详细介绍技巧的部分,直接来看看操盘方法的部分,如何构成电影剧本。

你要按单元:第一幕、第二幕和第三幕,来构筑你的电影剧本。

取一叠3×5英寸的卡片。在每张卡片上写上你对每一场景或段落的构思,或者简要地写上说明,以便帮助你的写作。

你想用多少卡片都可以。你的故事决定你需要用多少卡片。

用卡片是极好的方法。你可以用各种方式去安排场面,和重新安排,增加几张,去掉几张。它是简单、方便而有效的方法,它可以使你以最大的灵活性去建设电影剧本。

这样一步一步、一个场面又一个场面,一直把你的故事构筑到这一幕结尾的情节点。这就象玩拼图游戏一样。

如果发现故事有些漏洞,那就可以再添写几张卡片。卡片是为你所用的。用这些卡片去构成你的故事,从而使你始终明确发展的进程。

当你搞完这些卡片之后,再重复第一幕的那个过程。从第二幕的开端到第二幕结尾的情节点Ⅱ,按顺序把卡片好好看几遍。要发挥自由联想,想出新的主意,记在卡片之上,一遍又一遍地仔细端详。

把它们摆出来,仔细研究。设计你的故事发展过程。看一看它起什么样的作用。别害怕修改什么。我曾经访问过一位电影剪辑师,他告诉我一个重要的创作原则:在故事的前后关系中“最行不通的一些段落正好告诉你应该怎样做才能行得通。”

可见,写一个软需的时候,先有一个完整的卡片式的故事梗概是更高效的工作方法。

从网上查,参考了这篇文章中的一个回答:

1. 首先可以看看迅雷是不是通過 launchd 服務開機自啟的:
a) sudo launchctl list
b) unload 掉相應服務。

2. 或者也可以:
a) id [自己的帳號名]
找出自己的 UID ;
b) sudo nano /private/var/db/com.apple.xpc.launchd/disabled.XXX.plist
此處的 XXX 為步驟 a 裡的 UID ;
3) 找到有關 thunder 的服務項,改成<false/>
我這裡找到一個 com.xunlei.Thunder-Launcher 的服務,不知道什麼時候加上去的。

3. 再看看這裡:
a) open /private/var/db/com.apple.xpc.launchd/loginitems.XXX.plist
這裡的 XXX 為 2.a 裡獲得的 UID。

4. 此外還有可能的原因:
a) launchd plist 放置在其他域的 LaunchAgents 和 LaunchDaemons 文件夾下;
b) 有其他服務項 /腳本啟動了迅雷,並不是迅雷自己開機啟動。

读取这个文件“/private/var/db/com.apple.xpc.launchd/loginitems.501.plist”,有如下内容:

<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd”>
<plist version=”1.0″>
<dict>
<key>version.com.xunlei.Thunder-Launcher</key>
<string>2892</string>
<key>com.xunlei.Thunder-Launcher</key>
<string>com.xunlei.Thunder</string>
</dict>
</plist>

删掉dict中的内容后,迅雷会无法正常启动。直接删掉dict等6行,迅雷可以打开。

<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd”>
<plist version=”1.0″>
</plist>

重启机器,迅雷不再开机自启。

问题解决。

本机为:MacOS Sierra, V10.12.6

把IO设备建模成进程,可以使Erlang虚拟机在同一个网络内的不同节点(主机)上交换文件进程,从而实现节点之间的相互读写。

摘自《Elixir IO内幕

IO模块是Elixir里读写标准输入输出(:stdio)、标准错误(:stderr)、文件和其他IO设备的主要机制。

iex> IO.puts “hello world”
hello world
:ok
iex> IO.gets “yes or no? ”
yes or no? yes
“yes\n”

IO.xxxs的第一个参数如果是原子的话,应该是:stdio或者:stderr。


File模块包含函数允许我们打开文件当做IO文件。默认地,文件以二进制模式打开,这些文件就需要开发者使用IO模式的特定函数 IO.binread/2 和 IO.binwrite/2 来读写。文件也可以用 :utf8 编码方式打开,这就告诉File模块解析从文件读取的字节为UTF-8编码的字节。

iex> {:ok, file} = File.open “hello”, [:write]
{:ok, #PID<0.47.0>}
iex> IO.binwrite file, “world”
:ok
iex> File.close file
:ok
iex> File.read “hello”
{:ok, “world”}

注意:带叹号的版本返回文件的内容而不是元组,而如果有任何错误,这个函数就抛出一个错误。当你想要用模式匹配处理不同的输出的时候,不带叹号的版本是首选:

case File.read(file) do
  {:ok, body} -> # do something with the `body`
  {:error, reason} -> # handle the error caused by `reason`
end

因此,如果你不想处理错误结果,就优先使用 File.read!/1 。

以下摘自hexdocs.pm

In order to write and read files, one must use the functions in the IO module. By default, a file is opened in binary mode, which requires the functions IO.binread/2 and IO.binwrite/2 to interact with the file. A developer may pass :utf8 as an option when opening the file, then the slower IO.read/2 andIO.write/2 functions must be used as they are responsible for doing the proper conversions and providing the proper data guarantees.

显然,需要阅读更多的elixir源码。github上这个项目(pcorey/elixir_poster)偶然看到,值得一读:

def go(ratio, final_width, final_height, code_path, image_path, out_path) do
%PosterData{
ratio: ratio,
final_width: final_width,
final_height: final_height,
code_path: code_path,
image_path: image_path,
out_path: out_path
}
|> load_code
|> load_image
|> construct_text_elements
|> construct_svg
|> save_svg
end

回北京第一天。

九点多到公司,已经找不到停车位,听到fh国际那边楼下,看架势可能会违章,想着中午来挪车位,实际上一忙就忘了,吃完饭上办公室才想起来,偷懒没立刻下去,结果下班时果然被贴条了。

一上午先跟zhh把她之前比较分析需求跟实现差异的元数据部分的功能过了一下。发现需要一个测试环境,以便她可以保持一个完整、确定的功能集。

下午chy过来了,跟他说了一下分析poi的需求,讨论一会儿。对于如何聚类,我还是没有考虑清楚。

然后就开始憋“爬山项目”的需求,没进展。

整体工作效率很低。


中午过后,王文彬过来量尺寸,讨论了一会儿活动区的布局。然后冰箱送过来了。

下午给三个运营商都打了电话,只有联通的宽带可以接。让他们明天来装,200Mpbs一年2000。

今天早上刚吃完早饭,正在沉迷于如何想象四维空间(《二维空间的封闭是圆 ,三维空间的封闭是球,四维空间的封闭是什么?》),同事Dream来电话说门禁厂商到了,于是放下咖啡杯赶紧去公司。

等我到公司时,人已经走了,不过同事学会了操作,于是体验了一下指纹识别。ZTE的产品,读说明书时,发现还有指头静脉识别的产品,原来人体手头的静脉的结构也是各不相同啊,这样的局部自然界大师就允许随机了,也隐含着一种节约能耗的用意在其中。


中午跟Dream一起吃饭,江苏人,喜欢吃饺子,也是让人有些摸不着头脑。

我先表明对咨询侧招人的态度:现在是解决有没有问题,而不是效率高不高问题,所以先尽快招入,先有,把工作先开展起来。尽管本来其实应该是没有合适就不聘用,如果我做老板的话。这里面其实隐含着一个问题:合作伙伴的能力达不到期望值时怎么处理?是不是最佳策略是“帮助他找到合适的定位”?

我尝试着分析了我们面临的局面,说了说自己的观点。在DG的方向上,我们的优势非常稀薄。突破点有两个方面:一是产品本身有特色,二是服务方面有特色。在当前市场态势下,关系营销仍然会是核心竞争力,产品再有特色,如果没有一套吸引眼球的方法论,很难吸引客户。所以我一直希望新公司可以在咨询服务方面形成一套好的solution。

同事似乎也同意我的观点,但显然对负责咨询服务的同事的能力有着更为务实的估计,完全不希望对方能在近期形成什么具有市场竞争力的咨询方案。

但让我担心的是,Dream也不能意识到执着于DG市场对于其他方面的影响。还是认为我们可以同时兼顾。

通过这一聊,我倒是意识到:1、希望强强联合只能是一厢情愿,现实就是实际上个人能力的差距太大,可以做到工作会很有限。2、所以诸事还得亲力亲为。


下午去办了电信的磅礴卡。

一大早到公司开门,结果原来预期会出现的电工迟迟不出现。在群里发声,工头说电工下午才来。

于是开始不高兴,关键是时间突然因此非常碎片,几乎一天时间又什么事儿都干不了了。

当然这不是本质原因,主要是同事自己忙私事闪了,让我来顶班,结果工作却没有安排好,让我预期落空,这就非常不爽。

于是中午饭后估计是因为郁闷得不行,困得很,干脆回家睡觉了。结果老袁给我电话的时候我正好睡着了,没接电话,错过了跟老袁见面。等我给他回电话,他已经在高铁上了。

晚上New要招聘的人过来一起吃饭。虽然记性不好,但人还算朴实。也没有兴致再了解他的工作能力,毕竟不是有余地可以挑选人的情况。

正吃饭,下起了瓢泼大雨。

上午同事发现服务器上不去了,问我。这才灵机一动想起来现在接入的数据其实挺适合给合作伙伴使用的。同事把租金先垫了。

于是两边都问了一下,都有意愿,于是扯了个群,圈一起聊。

上午刘这边呱呱介绍了自己情况,朱没响应。半晌发了一条消息说自己正在见人没时间。下午六点多了,才又出现。了解半天后,觉得应该约一下直接见面聊。

于是我去约刘。


周四约好。

周五朱牙疼,下周了。

找数据治理相关的文章,找到了“基于数据治理城市”,然后就见到CPS这个词:Cyber-Physical System。

维基百科有词条专门解释。

是一个结合电脑运算领域以及感测器和致动器装置的整合控制系统。

还是很难理解到底是个什么东西,即便是举例也显得语焉不详:

目前研发的CPS系统有MIT的Distributed Robot Garden,这个花园里有一群的机器人负责照顾番茄。这个系统结合了感测网络(每一株植物上都有感测器会去监控植物状态)、 导航、机器人控制和 无线网络

另外一个MIT正在发展的CPS系统是CarTel计划,这个计划里,有一队的计程车会搜集波士顿的即时交通资讯,路径规划就可以使用即时的交通资讯和历史资讯规划出最快的交通路径。

跟踪到cyberphysicalsystems.org

Embedded computers and networks monitor and control the physical processes, with feedback loops where physical processes affect computations and vice versa.

倒是该网站的这幅图给出一个比较到位的描述:

CPS概念图

尤其喜欢wikipedia上的这段话:

制造系统中的每一个实体都可以通过CPS在网络端产生一个“镜像模型”(Cyber Twin),对实体进行深入对称性管理。实体产生的数据通过在网络空间内的分析,能够实时更新镜像模型的状参数,使镜像模型能够实时真实地反映实体的状态。同时利用镜像模型进行数字化仿真与优化,又能够对实体模型的行为进行指导,从而实现制造系统的自省性(self-aware),自比较性(self-compare),和自重构性(self-configure),最终实现无忧的智能制造系统。

似乎是比较直观地将CPS的工作原理(或者说基本构想)给讲得比较通俗易懂。但是感觉最清晰的定义还是英文维基给出的:

cyber-physical system (CPS) is a mechanism controlled or monitored by computer-based algorithms, tightly integrated with the internet and its users. In cyber-physical systems, physical and software components are deeply intertwined, each operating on different spatial and temporal scales, exhibiting multiple and distinct behavioral modalities, and interacting with each other in a myriad of ways that change with context.

昨天在知乎上的“如何评价电影《绣春刀2:修罗战场》中杨幂的演技?”这个问题里,学到不少东西,剖受启发。

我看这部电影的时候,对于杨幂的表现,只是觉得每次她一出场就感觉在看另一部电影,别扭。但是哪里别扭,却无从分析。

从几个高票答案中,发现他们都是先从角色立论:在故事背景和情节中另行分析角色的性格、气质,再结合历史背景进一步分析人物行为举止如何能融入彼时的社会现实。

我在看电影的时候,就比较一根筋,跟着给出的镜头跑。欣赏的维度单薄到只有银幕的一层皮,甚至都没法将屏幕上正在发生的与之前2分钟、5分钟、9分钟、……的剧情联系起来思考。

这种沉浸于当下的接受模式,导致对电影的欣赏层次浅薄到……只能感觉到这个镜头是不是别扭,好吧,甚至别扭都不一定能发现。

这是过于自我代入了?

所以,欣赏一部电影,自然首先是读懂一个故事,感受角色的表演。而一个演员表现好坏,当然要看这个角色在故事中是否自然、应然。需要三次抽象思考(归纳):

  1. 角色在当下的场景中是否自然、应然,
  2. 角色在整个故事中是否自然、应然,
  3. 角色在时空背景中是否自然、应然。

比如北斋在故事的最后阶段,先是听话离去然后又折返回到吊桥之处这段情节。

在大兵压境的追杀压力和好友的声嘶力竭的催促中,心慌意乱匆匆离去。走着走着,又有什么放不下匆匆返回。从场景中看似乎应然,但演员的表演是否自然,一方面看演员的发挥,另一方面也得看导演如何设计镜头语言,以及剪辑如何衔接交待。至少我没看出有什么必要折返。

放在整个故事线里去看,北斋与搞事的一方到底什么关系,一直就交待得不够清晰(也可能是我看完就忘了)。如果是搞事一方大boss的情人,更没有理由让她牵涉到具体的行动中历险。如果行动参与者,北斋有什么技能值得被雇佣或者利用呢?既不隐蔽——说起来是个愤青很容易招致特务关注,也不够犀利——能文不能武。唯一可能的利用价值是可能有些声望,可以作为整个行动的形象代言产生一些号召力。最后这点似乎有成立的余地。所以,在已经知道不再被大boss利用的情况下,会放弃家仇国恨而蓄意返回来自杀吗?一定还需要别的理由。是啥?从角色的表演中没发觉。

作为形象代言人,放在故事背景中,作为知名画家,恐怕还得类比如今艾某,搞些行为艺术之类的,扩大宣传效果。可惜电影情节中关于这部分的交待实在太少,这可能是编剧和导演的失误,也可能是演员实在撑不起来就不画蛇添足的交叉结果?北斋会为了搞行为艺术而特意折返吗?倒是有可能。但这样的北斋应该表现有足够的虚荣的一面,角色并没有这方面的发挥。

嗯,照这样的套路,一部电影看起来,倒是嚼劲十足。

毕仔找我聊天已经是两周前的事儿了。当时我在西域,于是想着“下个周末吧”。然后也许因为戒烟的关系(从西域回来就趁着节点开始戒烟),接下来的那个周末困得一塌糊涂,特别嗜睡,一下子两天就睡过去了。昨天去公司收拾东西,于是约了上午见面。

寒暄之后,我大概说了一下我当下的现状,问我:你觉得三年了,你的产品还不能在市场上呼风唤雨的主要原因是什么?

嗯,这个问题我还真没从这个角度仔细想想。脑子一边转着找线索,一边总结。焦点不断变化是表面的,其实是一开始就想得不够透彻。想不到其实是表面的,其实是个人能力不够。铁营水兵是表面的,其实是兵没用好。没用好还是因为任务设置没有想透。

毕仔插嘴说:岗位设置能不能做到任务清晰,人员定岗之后就可以目标明确有压力受到驱动转起来,这是管理水平。

嗯,这个问题我还真没从这个角度仔细想过。过去更多的注意力放在了产品需要发展什么样的功能,实际上忽略了承担任务的人的驱动力(“目标感”)。这点在我使用几个东北仔的身上尤其明显。

方法,还是方法。

听我唠叨完,毕仔说了一句我一开始没反应过来,两秒之后一震的话:你需要换个思路做事,不能跟过去一样,因为你现在面对的状况跟过去不同了。

每天都不同,其实。

需要抓本质啊。所以主要矛盾和次要矛盾。

道理都懂,问题是如何把正确的做事方法转变成人的本能的第一反应!

毕仔带团队的方法之一是反复强调反复灌输。但这种方法对于个人自己而言,似乎不是那么有效。

这就意味着,视角首先要不同。至少可以这样:过去的视角是什么,比较容易搞清楚,然后刻意找一个不同的角度先审视一番。不行再换个角度。

这个时候,其实可能“笨”一点也许更加犀利:“为客户创造价值”,这是根本的使命啊。也就是说,在市场上混,最不能得罪的,也是市场赖以存在的,最基本规则。

只不过我们希望选择谁作为自己的客户。或者我们可以选择谁作为自己的客户。 于是,开始进入到需要拿数据说话的领域。

经营范畴内,一切以数据说话。

这是一个理想,同时也是最佳实践。是应该也可以不断逼近的极限。

某老板来北京开会,我们作陪吃饭聊天,搞了一天,身心俱疲,尽管就是坐着吃饭、聊天。

以后除非必要不再出席此类活动。


今天本来要写完usecase的,结果一个字没写。


上午跟客户面谈。说服客户尽快增单产生流水。没谈成本,准备慢慢施加成本压力。


晚上临睡了,发现几篇介绍systemd的文章,贴在这里备查。

来源:阮一峰(@ruanyf)

链接:http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html

Systemd 是 Linux 系统工具,用来启动守护进程,已成为大多数发行版的标准配置。

本文介绍它的基本用法,分为上下两篇。今天介绍它的主要命令,下一篇介绍如何用于实战。

一、由来

历史上,Linux 的启动一直采用init进程。

下面的命令用来启动服务。

$ sudo /etc/init.d/apache2 start
# 或者
$ service apache2 start

这种方法有两个缺点。

一是启动时间长。init进程是串行启动,只有前一个进程启动完,才会启动下一个进程。

二是启动脚本复杂。init进程只是执行启动脚本,不管其他事情。脚本需要自己处理各种情况,这往往使得脚本变得很长。

二、Systemd 概述

Systemd 就是为了解决这些问题而诞生的。它的设计目标是,为系统的启动和管理提供一套完整的解决方案。

根据 Linux 惯例,字母d是守护进程(daemon)的缩写。 Systemd 这个名字的含义,就是它要守护整个系统。

(上图为 Systemd 作者 Lennart Poettering)

使用了 Systemd,就不需要再用init了。Systemd 取代了initd,成为系统的第一个进程(PID 等于 1),其他进程都是它的子进程。

$ systemctl --version

上面的命令查看 Systemd 的版本。

Systemd 的优点是功能强大,使用方便,缺点是体系庞大,非常复杂。事实上,现在还有很多人反对使用 Systemd,理由就是它过于复杂,与操作系统的其他部分强耦合,违反”keep simple, keep stupid”的Unix 哲学。

(上图为 Systemd 架构图)

三、系统管理

Systemd 并不是一个命令,而是一组命令,涉及到系统管理的方方面面。

3.1 systemctl

systemctl是 Systemd 的主命令,用于管理系统。

# 重启系统
$ sudo systemctl reboot

# 关闭系统,切断电源
$ sudo systemctl poweroff

# CPU停止工作
$ sudo systemctl halt

# 暂停系统
$ sudo systemctl suspend

# 让系统进入冬眠状态
$ sudo systemctl hibernate

# 让系统进入交互式休眠状态
$ sudo systemctl hybrid-sleep

# 启动进入救援状态(单用户状态)
$ sudo systemctl rescue

3.2 systemd-analyze

systemd-analyze命令用于查看启动耗时。

# 查看启动耗时
$ systemd-analyze                                                                                       

# 查看每个服务的启动耗时
$ systemd-analyze blame

# 显示瀑布状的启动过程流
$ systemd-analyze critical-chain

# 显示指定服务的启动流
$ systemd-analyze critical-chain atd.service

3.3 hostnamectl

hostnamectl命令用于查看当前主机的信息。

# 显示当前主机的信息
$ hostnamectl

# 设置主机名。
$ sudo hostnamectl set-hostname rhel7

3.4 localectl

localectl命令用于查看本地化设置。

# 查看本地化设置
$ localectl

# 设置本地化参数。
$ sudo localectl set-locale LANG=en_GB.utf8
$ sudo localectl set-keymap en_GB

3.5 timedatectl

timedatectl命令用于查看当前时区设置。

# 查看当前时区设置
$ timedatectl

# 显示所有可用的时区
$ timedatectl list-timezones                                                                                   

# 设置当前时区
$ sudo timedatectl set-timezone America/New_York
$ sudo timedatectl set-time YYYY-MM-DD
$ sudo timedatectl set-time HH:MM:SS

3.6 loginctl

loginctl命令用于查看当前登录的用户。

# 列出当前session
$ loginctl list-sessions

# 列出当前登录用户
$ loginctl list-users

# 列出显示指定用户的信息
$ loginctl show-user ruanyf

四、Unit

4.1 含义

Systemd 可以管理所有系统资源。不同的资源统称为 Unit(单位)。

Unit 一共分成12种。

  • Service unit:系统服务
  • Target unit:多个 Unit 构成的一个组
  • Device Unit:硬件设备
  • Mount Unit:文件系统的挂载点
  • Automount Unit:自动挂载点
  • Path Unit:文件或路径
  • Scope Unit:不是由 Systemd 启动的外部进程
  • Slice Unit:进程组
  • Snapshot Unit:Systemd 快照,可以切回某个快照
  • Socket Unit:进程间通信的 socket
  • Swap Unit:swap 文件
  • Timer Unit:定时器

systemctl list-units命令可以查看当前系统的所有 Unit 。

# 列出正在运行的 Unit
$ systemctl list-units

# 列出所有Unit,包括没有找到配置文件的或者启动失败的
$ systemctl list-units --all

# 列出所有没有运行的 Unit
$ systemctl list-units --all --state=inactive

# 列出所有加载失败的 Unit
$ systemctl list-units --failed

# 列出所有正在运行的、类型为 service 的 Unit
$ systemctl list-units --type=service

4.2 Unit 的状态

systemctl status命令用于查看系统状态和单个 Unit 的状态。

# 显示系统状态
$ systemctl status

# 显示单个 Unit 的状态
$ sysystemctl status bluetooth.service

# 显示远程主机的某个 Unit 的状态
$ systemctl -H root@rhel7.example.com status httpd.service

除了status命令,systemctl还提供了三个查询状态的简单方法,主要供脚本内部的判断语句使用。

# 显示某个 Unit 是否正在运行
$ systemctl is-active application.service

# 显示某个 Unit 是否处于启动失败状态
$ systemctl is-failed application.service

# 显示某个 Unit 服务是否建立了启动链接
$ systemctl is-enabled application.service

4.3 Unit 管理

对于用户来说,最常用的是下面这些命令,用于启动和停止 Unit(主要是 service)。

# 立即启动一个服务
$ sudo systemctl start apache.service

# 立即停止一个服务
$ sudo systemctl stop apache.service

# 重启一个服务
$ sudo systemctl restart apache.service

# 杀死一个服务的所有子进程
$ sudo systemctl kill apache.service

# 重新加载一个服务的配置文件
$ sudo systemctl reload apache.service

# 重载所有修改过的配置文件
$ sudo systemctl daemon-reload

# 显示某个 Unit 的所有底层参数
$ systemctl show httpd.service

# 显示某个 Unit 的指定属性的值
$ systemctl show -p CPUShares httpd.service

# 设置某个 Unit 的指定属性
$ sudo systemctl set-property httpd.service CPUShares=500

4.4 依赖关系

Unit 之间存在依赖关系:A 依赖于 B,就意味着 Systemd 在启动 A 的时候,同时会去启动 B。

systemctl list-dependencies命令列出一个 Unit 的所有依赖。

$ systemctl list-dependencies nginx.service

上面命令的输出结果之中,有些依赖是 Target 类型(详见下文),默认不会展开显示。如果要展开 Target,就需要使用–all参数。

$ systemctl list-dependencies --all nginx.service

五、Unit 的配置文件

5.1 概述

每一个 Unit 都有一个配置文件,告诉 Systemd 怎么启动这个 Unit 。

Systemd 默认从目录/etc/systemd/system/读取配置文件。但是,里面存放的大部分文件都是符号链接,指向目录/usr/lib/systemd/system/,真正的配置文件存放在那个目录。

systemctl enable命令用于在上面两个目录之间,建立符号链接关系。

$ sudo systemctl enable clamd@scan.service
# 等同于
$ sudo ln -s '/usr/lib/systemd/system/clamd@scan.service' '
  /etc/systemd/system/multi-user.target.wants/clamd@scan.service'

如果配置文件里面设置了开机启动,systemctl enable命令相当于激活开机启动。

与之对应的,systemctl disable命令用于在两个目录之间,撤销符号链接关系,相当于撤销开机启动。

$ sudo systemctl disable clamd@scan.service

配置文件的后缀名,就是该 Unit 的种类,比如sshd.socket。如果省略,Systemd 默认后缀名为.service,所以sshd会被理解成sshd.service。

5.2 配置文件的状态

systemctl list-unit-files命令用于列出所有配置文件。

# 列出所有配置文件
$ systemctl list-unit-files

# 列出指定类型的配置文件
$ systemctl list-unit-files --type=service

这个命令会输出一个列表。

$ systemctl list-unit-files

UNIT FILE              STATE
chronyd.service        enabled
clamd@.service         static
clamd@scan.service     disabled

这个列表显示每个配置文件的状态,一共有四种。

  • enabled:已建立启动链接
  • disabled:没建立启动链接
  • static:该配置文件没有[Install]部分(无法执行),只能作为其他配置文件的依赖
  • masked:该配置文件被禁止建立启动链接

注意,从配置文件的状态无法看出,该 Unit 是否正在运行。这必须执行前面提到的systemctl status命令。

$ systemctl status bluetooth.service

一旦修改配置文件,就要让 SystemD 重新加载配置文件,然后重新启动,否则修改不会生效。

$ sudo systemctl daemon-reload
$ sudo systemctl restart httpd.service

5.3 配置文件的格式

配置文件就是普通的文本文件,可以用文本编辑器打开。

systemctl cat命令可以查看配置文件的内容。

$ systemctl cat atd.service

[Unit]
Description=ATD daemon

[Service]
Type=forking
ExecStart=/usr/bin/atd

[Install]
WantedBy=multi-user.target

从上面的输出可以看到,配置文件分成几个区块。每个区块的第一行,是用方括号表示的区别名,比如[Unit]。注意,配置文件的区块名和字段名,都是大小写敏感的。

每个区块内部是一些等号连接的键值对。

[Section]
Directive1=value
Directive2=value

. . .

注意,键值对的等号两侧不能有空格。

5.4 配置文件的区块

[Unit]区块通常是配置文件的第一个区块,用来定义 Unit 的元数据,以及配置与其他 Unit 的关系。它的主要字段如下。

  • Description:简短描述
  • Documentation:文档地址
  • Requires:当前 Unit 依赖的其他 Unit,如果它们没有运行,当前 Unit 会启动失败
  • Wants:与当前 Unit 配合的其他 Unit,如果它们没有运行,当前 Unit 不会启动失败
  • BindsTo:与Requires类似,它指定的 Unit 如果退出,会导致当前 Unit 停止运行
  • Before:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之后启动
  • After:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之前启动
  • Conflicts:这里指定的 Unit 不能与当前 Unit 同时运行
  • Condition…:当前 Unit 运行必须满足的条件,否则不会运行
  • Assert…:当前 Unit 运行必须满足的条件,否则会报启动失败

[Install]通常是配置文件的最后一个区块,用来定义如何启动,以及是否开机启动。它的主要字段如下。

  • WantedBy:它的值是一个或多个 Target,当前 Unit 激活时(enable)符号链接会放入/etc/systemd/system目录下面以 Target 名 + .wants后缀构成的子目录中
  • RequiredBy:它的值是一个或多个 Target,当前 Unit 激活时,符号链接会放入/etc/systemd/system目录下面以 Target 名 + .required后缀构成的子目录中
  • Alias:当前 Unit 可用于启动的别名
  • Also:当前 Unit 激活(enable)时,会被同时激活的其他 Unit

[Service]区块用来 Service 的配置,只有 Service 类型的 Unit 才有这个区块。它的主要字段如下。

  • Type:定义启动时的进程行为。它有以下几种值。
  • Type=simple:默认值,执行ExecStart指定的命令,启动主进程
  • Type=forking:以 fork 方式从父进程创建子进程,创建后父进程会立即退出
  • Type=oneshot:一次性进程,Systemd 会等当前服务退出,再继续往下执行
  • Type=dbus:当前服务通过D-Bus启动
  • Type=notify:当前服务启动完毕,会通知Systemd,再继续往下执行
  • Type=idle:若有其他任务执行完毕,当前服务才会运行
  • ExecStart:启动当前服务的命令
  • ExecStartPre:启动当前服务之前执行的命令
  • ExecStartPost:启动当前服务之后执行的命令
  • ExecReload:重启当前服务时执行的命令
  • ExecStop:停止当前服务时执行的命令
  • ExecStopPost:停止当其服务之后执行的命令
  • RestartSec:自动重启当前服务间隔的秒数
  • Restart:定义何种情况 Systemd 会自动重启当前服务,可能的值包括always(总是重启)、on-success、on-failure、on-abnormal、on-abort、on-watchdog
  • TimeoutSec:定义 Systemd 停止当前服务之前等待的秒数
  • Environment:指定环境变量

Unit 配置文件的完整字段清单,请参考官方文档。

六、Target

启动计算机的时候,需要启动大量的 Unit。如果每一次启动,都要一一写明本次启动需要哪些 Unit,显然非常不方便。Systemd 的解决方案就是 Target。

简单说,Target 就是一个 Unit 组,包含许多相关的 Unit 。启动某个 Target 的时候,Systemd 就会启动里面所有的 Unit。从这个意义上说,Target 这个概念类似于”状态点”,启动某个 Target 就好比启动到某种状态。

传统的init启动模式里面,有 RunLevel 的概念,跟 Target 的作用很类似。不同的是,RunLevel 是互斥的,不可能多个 RunLevel 同时启动,但是多个 Target 可以同时启动。

# 查看当前系统的所有 Target
$ systemctl list-unit-files --type=target

# 查看一个 Target 包含的所有 Unit
$ systemctl list-dependencies multi-user.target

# 查看启动时的默认 Target
$ systemctl get-default

# 设置启动时的默认 Target
$ sudo systemctl set-default multi-user.target

# 切换 Target 时,默认不关闭前一个 Target 启动的进程,
# systemctl isolate 命令改变这种行为,
# 关闭前一个 Target 里面所有不属于后一个 Target 的进程
$ sudo systemctl isolate multi-user.target

Target 与 传统 RunLevel 的对应关系如下。

Traditional runlevel      New target name     Symbolically linked to...

Runlevel 0           |    runlevel0.target -> poweroff.target
Runlevel 1           |    runlevel1.target -> rescue.target
Runlevel 2           |    runlevel2.target -> multi-user.target
Runlevel 3           |    runlevel3.target -> multi-user.target
Runlevel 4           |    runlevel4.target -> multi-user.target
Runlevel 5           |    runlevel5.target -> graphical.target
Runlevel 6           |    runlevel6.target -> reboot.target

它与init进程的主要差别如下。

(1)默认的 RunLevel(在/etc/inittab文件设置)现在被默认的 Target 取代,位置是/etc/systemd/system/default.target,通常符号链接到graphical.target(图形界面)或者multi-user.target(多用户命令行)。

(2)启动脚本的位置,以前是/etc/init.d目录,符号链接到不同的 RunLevel 目录 (比如/etc/rc3.d、/etc/rc5.d等),现在则存放在/lib/systemd/system和/etc/systemd/system目录。

(3)配置文件的位置,以前init进程的配置文件是/etc/inittab,各种服务的配置文件存放在/etc/sysconfig目录。现在的配置文件主要存放在/lib/systemd目录,在/etc/systemd目录里面的修改可以覆盖原始设置。

七、日志管理

Systemd 统一管理所有 Unit 的启动日志。带来的好处就是,可以只用journalctl一个命令,查看所有日志(内核日志和应用日志)。日志的配置文件是/etc/systemd/journald.conf。

journalctl功能强大,用法非常多。

# 查看所有日志(默认情况下 ,只保存本次启动的日志)
$ sudo journalctl

# 查看内核日志(不显示应用日志)
$ sudo journalctl -k

# 查看系统本次启动的日志
$ sudo journalctl -b
$ sudo journalctl -b -0

# 查看上一次启动的日志(需更改设置)
$ sudo journalctl -b -1

# 查看指定时间的日志
$ sudo journalctl --since="2012-10-30 18:17:16"
$ sudo journalctl --since "20 min ago"
$ sudo journalctl --since yesterday
$ sudo journalctl --since "2015-01-10" --until "2015-01-11 03:00"
$ sudo journalctl --since 09:00 --until "1 hour ago"

# 显示尾部的最新10行日志
$ sudo journalctl -n

# 显示尾部指定行数的日志
$ sudo journalctl -n 20

# 实时滚动显示最新日志
$ sudo journalctl -f

# 查看指定服务的日志
$ sudo journalctl /usr/lib/systemd/systemd

# 查看指定进程的日志
$ sudo journalctl _PID=1

# 查看某个路径的脚本的日志
$ sudo journalctl /usr/bin/bash

# 查看指定用户的日志
$ sudo journalctl _UID=33 --since today

# 查看某个 Unit 的日志
$ sudo journalctl -u nginx.service
$ sudo journalctl -u nginx.service --since today

# 实时滚动显示某个 Unit 的最新日志
$ sudo journalctl -u nginx.service -f

# 合并显示多个 Unit 的日志
$ journalctl -u nginx.service -u php-fpm.service --since today

# 查看指定优先级(及其以上级别)的日志,共有8级
# 0: emerg
# 1: alert
# 2: crit
# 3: err
# 4: warning
# 5: notice
# 6: info
# 7: debug
$ sudo journalctl -p err -b

# 日志默认分页输出,--no-pager 改为正常的标准输出
$ sudo journalctl --no-pager

# 以 JSON 格式(单行)输出
$ sudo journalctl -b -u nginx.service -o json

# 以 JSON 格式(多行)输出,可读性更好
$ sudo journalctl -b -u nginx.serviceqq
 -o json-pretty

# 显示日志占据的硬盘空间
$ sudo journalctl --disk-usage

# 指定日志文件占据的最大空间
$ sudo journalctl --vacuum-size=1G

# 指定日志文件保存多久
$ sudo journalctl --vacuum-time=1years

上一篇文章,我介绍了 Systemd 的主要命令,今天介绍如何使用它完成一些基本的任务。

一、开机启动

对于那些支持 Systemd 的软件,安装的时候,会自动在/usr/lib/systemd/system目录添加一个配置文件。

如果你想让该软件开机启动,就执行下面的命令(以httpd.service为例)。

$ sudo systemctl enable httpd

上面的命令相当于在/etc/systemd/system目录添加一个符号链接,指向/usr/lib/systemd/system里面的httpd.service文件。

这是因为开机时,Systemd只执行/etc/systemd/system目录里面的配置文件。这也意味着,如果把修改后的配置文件放在该目录,就可以达到覆盖原始配置的效果。

二、启动服务

设置开机启动以后,软件并不会立即启动,必须等到下一次开机。如果想现在就运行该软件,那么要执行systemctl start命令。

$ sudo systemctl start httpd

执行上面的命令以后,有可能启动失败,因此要用systemctl status命令查看一下该服务的状态。

$ sudo systemctl status httpd

httpd.service – The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled)
Active: active (running) since 金 2014-12-05 12:18:22 JST; 7min ago
Main PID: 4349 (httpd)
Status: “Total requests: 1; Current requests/sec: 0; Current
traffic: 0 B/sec”
CGroup: /system.slice/httpd.service
├─4349 /usr/sbin/httpd -DFOREGROUND
├─4350 /usr/sbin/httpd -DFOREGROUND
├─4351 /usr/sbin/httpd -DFOREGROUND
├─4352 /usr/sbin/httpd -DFOREGROUND
├─4353 /usr/sbin/httpd -DFOREGROUND
└─4354 /usr/sbin/httpd -DFOREGROUND

12月 05 12:18:22 localhost.localdomain systemd[1]:
Starting The Apache HTTP Server…
12月 05 12:18:22 localhost.localdomain systemd[1]:
Started The Apache HTTP Server.
12月 05 12:22:40 localhost.localdomain systemd[1]:
Started The Apache HTTP Server.

上面的输出结果含义如下。

● Loaded行:配置文件的位置,是否设为开机启动
● Active行:表示正在运行
● Main PID行:主进程ID
● Status行:由应用本身(这里是 httpd )提供的软件当前状态
● CGroup块:应用的所有子进程
● 日志块:应用的日志

三、停止服务

终止正在运行的服务,需要执行systemctl stop命令。

$ sudo systemctl stop httpd.service

有时候,该命令可能没有响应,服务停不下来。这时候就不得不”杀进程”了,向正在运行的进程发出kill信号。

$ sudo systemctl kill httpd.service

此外,重启服务要执行systemctl restart命令。

$ sudo systemctl restart httpd.service

四、读懂配置文件

一个服务怎么启动,完全由它的配置文件决定。下面就来看,配置文件有些什么内容。

前面说过,配置文件主要放在/usr/lib/systemd/system目录,也可能在/usr/lib/systemd/system目录。找到配置文件以后,使用文本编辑器打开即可。

systemctl cat命令可以用来查看配置文件,下面以sshd.service文件为例,它的作用是启动一个 SSH 服务器,供其他用户以 SSH 方式登录。

$ systemctl cat sshd.service

[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service

[Service]
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
Type=simple
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target

可以看到,配置文件分成几个区块,每个区块包含若干条键值对。

下面依次解释每个区块的内容。

五、 [Unit] 区块:启动顺序与依赖关系。

Unit区块的Description字段给出当前服务的简单描述,Documentation字段给出文档位置。

接下来的设置是启动顺序和依赖关系,这个比较重要。

After字段:表示如果network.target或sshd-keygen.service需要启动,那么sshd.service应该在它们之后启动。

相应地,还有一个Before字段,定义sshd.service应该在哪些服务之前启动。

注意,After和Before字段只涉及启动顺序,不涉及依赖关系。

举例来说,某 Web 应用需要 postgresql 数据库储存数据。在配置文件中,它只定义要在 postgresql 之后启动,而没有定义依赖 postgresql 。上线后,由于某种原因,postgresql 需要重新启动,在停止服务期间,该 Web 应用就会无法建立数据库连接。

设置依赖关系,需要使用Wants字段和Requires字段。

Wants字段:表示sshd.service与sshd-keygen.service之间存在”弱依赖”关系,即如果”sshd-keygen.service”启动失败或停止运行,不影响sshd.service继续执行。

Requires字段则表示”强依赖”关系,即如果该服务启动失败或异常退出,那么sshd.service也必须退出。

注意,Wants字段与Requires字段只涉及依赖关系,与启动顺序无关,默认情况下是同时启动的。

六、[Service] 区块:启动行为

Service区块定义如何启动当前服务。

6.1 启动命令

许多软件都有自己的环境参数文件,该文件可以用EnvironmentFile字段读取。

EnvironmentFile字段:指定当前服务的环境参数文件。该文件内部的key=value键值对,可以用$key的形式,在当前配置文件中获取。

上面的例子中,sshd 的环境参数文件是/etc/sysconfig/sshd。

配置文件里面最重要的字段是ExecStart。

ExecStart字段:定义启动进程时执行的命令。

上面的例子中,启动sshd,执行的命令是/usr/sbin/sshd -D $OPTIONS,其中的变量$OPTIONS就来自EnvironmentFile字段指定的环境参数文件。

与之作用相似的,还有如下这些字段。

● ExecReload字段:重启服务时执行的命令
● ExecStop字段:停止服务时执行的命令
● ExecStartPre字段:启动服务之前执行的命令
● ExecStartPost字段:启动服务之后执行的命令
● ExecStopPost字段:停止服务之后执行的命令

请看下面的例子。

[Service]
ExecStart=/bin/echo execstart1
ExecStart=
ExecStart=/bin/echo execstart2
ExecStartPost=/bin/echo post1
ExecStartPost=/bin/echo post2

上面这个配置文件,第二行ExecStart设为空值,等于取消了第一行的设置,运行结果如下。

execstart2
post1
post2

所有的启动设置之前,都可以加上一个连词号(-),表示”抑制错误”,即发生错误的时候,不影响其他命令的执行。比如,EnvironmentFile=-/etc/sysconfig/sshd(注意等号后面的那个连词号),就表示即使/etc/sysconfig/sshd文件不存在,也不会抛出错误。

6.2 启动类型

Type字段定义启动类型。它可以设置的值如下。

● simple(默认值):ExecStart字段启动的进程为主进程
● forking:ExecStart字段将以fork()方式启动,此时父进程将会退出,子进程将成为主进程
● oneshot:类似于simple,但只执行一次,Systemd 会等它执行完,才启动其他服务
● dbus:类似于simple,但会等待 D-Bus 信号后启动
● notify:类似于simple,启动结束后会发出通知信号,然后 Systemd 再启动其他服务
● idle:类似于simple,但是要等到其他任务都执行完,才会启动该服务。一种使用场合是为让该服务的输出,不与其他服务的输出相混合

下面是一个oneshot的例子,笔记本电脑启动时,要把触摸板关掉,配置文件可以这样写。

[Unit]
Description=Switch-off Touchpad

[Service]
Type=oneshot
ExecStart=/usr/bin/touchpad-off

[Install]
WantedBy=multi-user.target

上面的配置文件,启动类型设为oneshot,就表明这个服务只要运行一次就够了,不需要长期运行。

如果关闭以后,将来某个时候还想打开,配置文件修改如下。

[Unit]
Description=Switch-off Touchpad

[Service]
Type=oneshot
ExecStart=/usr/bin/touchpad-off start
ExecStop=/usr/bin/touchpad-off stop
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

上面配置文件中,RemainAfterExit字段设为yes,表示进程退出以后,服务仍然保持执行。这样的话,一旦使用systemctl stop命令停止服务,ExecStop指定的命令就会执行,从而重新开启触摸板。

6.3 重启行为

Service区块有一些字段,定义了重启行为。

KillMode字段:定义 Systemd 如何停止 sshd 服务。

上面这个例子中,将KillMode设为process,表示只停止主进程,不停止任何sshd 子进程,即子进程打开的 SSH session 仍然保持连接。这个设置不太常见,但对 sshd 很重要,否则你停止服务的时候,会连自己打开的 SSH session 一起杀掉。

KillMode字段可以设置的值如下。

● control-group(默认值):当前控制组里面的所有子进程,都会被杀掉
● process:只杀主进程
● mixed:主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号
● none:没有进程会被杀掉,只是执行服务的 stop 命令。

接下来是Restart字段。

Restart字段:定义了 sshd 退出后,Systemd 的重启方式。

上面的例子中,Restart设为on-failure,表示任何意外的失败,就将重启sshd。如果 sshd 正常停止(比如执行systemctl stop命令),它就不会重启。
Restart字段可以设置的值如下。

● no(默认值):退出后不会重启
● on-success:只有正常退出时(退出状态码为0),才会重启
● on-failure:非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启
● on-abnormal:只有被信号终止和超时,才会重启
● on-abort:只有在收到没有捕捉到的信号终止时,才会重启
● on-watchdog:超时退出,才会重启
● always:不管是什么退出原因,总是重启

对于守护进程,推荐设为on-failure。对于那些允许发生错误退出的服务,可以设为on-abnormal。

最后是RestartSec字段。

RestartSec字段:表示 Systemd 重启服务之前,需要等待的秒数。上面的例子设为等待42秒。

七、[Install] 区块

Install区块,定义如何安装这个配置文件,即怎样做到开机启动。

WantedBy字段:表示该服务所在的 Target。

Target的含义是服务组,表示一组服务。WantedBy=multi-user.target指的是,sshd 所在的 Target 是multi-user.target。

这个设置非常重要,因为执行systemctl enable sshd.service命令时,sshd.service的一个符号链接,就会放在/etc/systemd/system目录下面的multi-user.target.wants子目录之中。

Systemd 有默认的启动 Target。

$ systemctl get-default
multi-user.target

上面的结果表示,默认的启动 Target 是multi-user.target。在这个组里的所有服务,都将开机启动。这就是为什么systemctl enable命令能设置开机启动的原因。

使用 Target 的时候,systemctl list-dependencies命令和systemctl isolate命令也很有用。

# 查看 multi-user.target 包含的所有服务
$ systemctl list-dependencies multi-user.target

# 切换到另一个 target
# shutdown.target 就是关机状态
$ sudo systemctl isolate shutdown.target

一般来说,常用的 Target 有两个:一个是multi-user.target,表示多用户命令行状态;另一个是graphical.target,表示图形用户状态,它依赖于multi-user.target。

八、Target 的配置文件

Target 也有自己的配置文件。

$ systemctl cat multi-user.target

[Unit]
Description=Multi-User System
Documentation=man:systemd.special(7)
Requires=basic.target
Conflicts=rescue.service rescue.target
After=basic.target rescue.service rescue.target
AllowIsolate=yes

注意,Target 配置文件里面没有启动命令。

上面输出结果中,主要字段含义如下。

Requires字段:要求basic.target一起运行。
Conflicts字段:冲突字段。如果rescue.service或rescue.target正在运行,multi-user.target就不能运行,反之亦然。
After:表示multi-user.target在basic.target 、 rescue.service、 rescue.target之后启动,如果它们有启动的话。
AllowIsolate:允许使用systemctl isolate命令切换到multi-user.target。

九、修改配置文件后重启

修改配置文件以后,需要重新加载配置文件,然后重新启动相关服务。

# 重新加载配置文件
$ sudo systemctl daemon-reload

# 重启相关服务
$ sudo systemctl restart foobar

今天早上起来,苏菲的咳嗽终于转变成发烧。

当得知苏菲发烧的那一刻,我竟然有些发蒙。才发现自己其实有一个错误观念:苏菲是不会生病的。尽管其实她已经咳嗽了好多天了。

才意识到,没有带孩子去儿科门诊的经历,极大限制了我对病理知识的学习了解,削弱了看护能力。

对病因完全没有预期的病症,才是真正吓人的。


作者:冯硕
链接:https://www.zhihu.com/question/20784987/answer/203612266
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

授人以鱼不如授人以渔,我今天就传授你几招,如何挑选适合你自己的vps。

首先上神器:Best Trace

这款软件可对服务器所经过的路由进行可视化检测,并可以准确标注路由所在位置以及 AS 号。支持查询本机 IP、路由监控、批量 Ping 等。我们一般来用这个软件来测试vps线路,查看线路的ping值以及确定线路是否绕路。不过这个只能查单程。

从图上来看,我测的这个ip从北京中转广州联通出口然后才到美国的。一般来说中转越少速度越快。同时ping值是254毫秒,显然不算快,我们就可以放弃这台vps了。

其次就是测文件下载。一般商家都会在官网放一个测试页面,里面提供了机房ip和文件下载地址。把商家提供的下载文件下载下来,看看下载速度就可以了。

最后,还有一个办法,我不能在知乎明说,到我签名博客里看去吧。

顺便推荐一些我个人认为目前比较好用的vps商家,按照三大电信运营商的线路质量来区分:

一·移动用户

移动用户是最爽的,因为移动的出国端口是速度最快的。基本上是个vps拿来就能用,TCP优化算法之类的都不需要

移动用户的话,我首推DO

官网 DigitalOcean: Cloud computing designed for developers

他家的新加坡是直连中国大陆的。部分地区移动是直连,极少部分地区联通也是直连,电信全部绕路美国23333.不过目前DO的新加坡机房有问题,一部分vps开出来不是直连大陆的,记得开出机子来先用Best trace测下线路,不好就删了重建。

配置是512m内存,网口是G口(每秒1000m),到国内ping值60左右。价格是每月5刀,仅支持 paypal和信用卡付款。

这里有一个DO获得免费35刀优惠券的办法:Digital Ocean获取35美元优惠券攻略

如果嫌贵的话,也可以考虑搬瓦工

(官网 Mass VPS hosting on Enterprise equipment

价格便宜,19.99刀一年,还支持 支付宝付款。

我首推这个套餐:Bandwagon Host – Shopping Cart 512m内存,1t流量(G口),年付19.99刀,可用 支付宝付款。

这个是中国线路优化特别套餐,当然不要看到中国优化就觉得一定很快了,实际和他家的普通套餐相比,仅仅是降低了晚高峰的掉包情况。我给部分移动和电信用户安利过,对于要求不高的朋友(仅仅看个1080p视频)是没有问题的。如果配合一些优化手段,例如:搬瓦工教程之十:安装魔改版bbr,提升网速-搬瓦工vps 速度会相当惊人,当然这要求你有一定的linux基础。

搬瓦工中国优化vps测评报告:搬瓦工中国直连优化线路kvm架构测评 – VPS大全

二·联通用户

联通用户的出国端口也说的过去。我家里就是联通,我自己测试下来效果最好的是vultr

官网 Vultr: High Performance SSD Cloud.

虽然日本机房晚高峰ping值崩的厉害,但是在5刀以内的vps中,没有其他更好的选择了。vultr的日本机房走的是ntt线路,这条线路晚高峰掉包很多,需要安装netspeed进行双倍发包来降低掉包率。

顺带一说,他家的2.5刀每月的vps其实现在还会补货的,但是时间不定。5刀每月的肯定有货。

Vultr全部优惠一览表:vpsdaquan.cn/vultryouhu

双倍发包教程:Net-speed 一键安装脚本

vultr的配置是5刀每月,1024m内存,g口,单核cpu。仅支持 paypal和信用卡。

其次,没钱的我依然推荐搬瓦工,便宜好用。优化手段参看移动用户。

三·电信用户

无药可救,请放弃治疗。电信出国端口太差,目前除非你肯每个月掏20刀出来买又贵又难用的香港cn2小水管,不然没任何办法。我建议用个搬瓦工这种便宜货算了,多花钱也没啥大意义。部分沿海地区用户可以尝试Vultr,到上海电信速度还可以,但是到其他地区我不敢保证。