构建自己的知识体系结构¶
知识是个很奇妙的东西,它和时间相关,长年累月的积累是必须的,这些累积起来的知识点就如同一棵棵珍珠,只把它们串成线,织成网,才得以彰显其最大价值,要熟练的在这张网上劳作并持之以恒并不是件容易的事情。
需要一些工具和方法来解决这个难题,我用记事本或 VIM 写reStructuredText格式的文本文档,记录我感兴趣的事,用 SPHINX 管理索引知识结构,写作过程则用 GIT 做版本管理。
简单来说这就是个笔记本,它记录了文本,图象,声音…… ,一切的一切。
Contents¶
reStructuredText入门¶
本节简要介绍了reStructuredText (reST)的概念和语法,旨在提供足够的信息来高效地编写文档。因为reST是一个简单的,不显眼的标记语言,这不会花费太长时间来入门。
See also
权威的 reStructuredText用户文档。
段落¶
段落(原文参考)是reST文档中最基本的块。段落是由一个或多个空白行分离的简单的文本块。在Python中,缩进在reST中是具有重要意义,所以同一段落的所有行必须左对齐而且是同一级缩进。
这是一个段落。他非常短。
这个段落将导致一个文本缩进块, 通常用于引用其他的文本。
这是另外一个段落。
要包含一大段原始格式的, 完全不更改的文本代码块(原文参考), 可让前面的段落以"::"结尾, 原始块在文本达到到其前一段落相同的缩进后结束。例如:
空格, 新行, 空行, 和各种标记(如 *这个* 或 \这个 :: )
都在文本块种保留.
看这里, 我把缩进降级了
(但还不够远)
例子结束
注意,如果一个段落仅仅包括"::", 他就会从结果种去除:
这是一个原始文本, 上面
的"::" 段落将被去除
也可以用行块元素 (原文参考) 来保留文本行原样的格式:
These lines arebroken exactly like inthe source file.
章节¶
章节头 (原文参考) 是用特殊的标点符作为章节标题的下划线来创建的(上划线是可选的),标题是一个单行文本(一个或者多个词),但是附带了修饰:
- 只有一个下标线、或同时有一个下标线和上标线;
- 修饰可使用 破折号"-----", 等号"======", 波浪号"~~~~~~" 或者任何其他你喜欢的非字母的字符``= - ` : ' " ~ ^ _ * + # < >``。
- 一个下标线修饰和使用相同字符的上/下标线修饰区别很明显。
- 上标线和下标线至少要和文本的长度相同。
- 他们是一致的,因为所有使用相同修饰风格的章节被认为处于相同的级别(如果出现新的修饰风格,则表示降低一级标题).
第一章 标题
==========
第1.1节 标题
-----------
第1.1.1子节 标题
~~~~~~~~~~~~~~~
第1.2节 标题
-----------
第二章 标题
===========
#
with overline, for parts*
with overline, for chapters=
, for sections-
, for subsections^
, for subsubsections"
, for paragraphs
当然,您可以自由使用自己的标记字符(参看reST文档),并使用一个更深层次的嵌套级别,但请记住,大多数的目标格式(HTML,LaTeX)有限地支持嵌套深度。
列表¶
在枚举或说明要点时,或在做名词解释时,我们常常会使用列表的方式来书写, 他可以有任意多的子段落、子列表等, 直至段落或者其他的左边和列表项中文本的第一行对齐,列表的实质就是语义相关的文本块在文章中的表达。
reST列表标记(原文参考) 是自然的:只要在段落开头放置一个星号, 列表必须从一个新的段落开始 (也就是说,必须在一个空行后出现), 对于带编号的列表同样适用,它们也可以通过使用标志 #
自动编号:
- This is a bulleted list.
- It has two items, the second item uses two lines.
- This is a numbered list.
- It has two items too.
- This is a numbered list.
- It has two items too.
嵌套列表是可能的,但要知道,它们必须由空行从父列表中分隔:
- this is
- a list
- with a nested list
- and some subitems
- and here the parent list continues
名词解释风格的列表 (原文参考) 可以这样创建:
- term (up to a line of text)
Definition of the term, which must be indented
and can even consist of multiple paragraphs
- next term
- Description.
请注意,term 不能有一个以上的文本行。
这种名词解释风格和引用段落很相似(原文参考) 它的实现也是通过比周围的段落更缩进来创建。
还有其它几个特殊的功能块:
表格¶
格子表格 (原文参考),必须自己“画”自己的单元格。它们看起来像这样:
Header row, column 1 (header rows optional) Header 2 Header 3 Header 4 body row 1, column 1 column 2 column 3 column 4 body row 2 ... ...
简单表格 (原文参考) 更容易书写,但是有限制:表格必须是两行以及以上,而且第一列不能包含多行。它们看起来像这样:
A B A and B False False False True False False False True False True True True
链接¶
使用 `Link text <http://example.com/>`_
来实现内嵌的网页链接。如果链接文本是Web地址,你一点都不需要特殊标记,解析器可以识别在普通的文本的链接和邮件地址。
你也可以把链接和目标定义(原文参考)分开,像这样:
This is a paragraph that contains `a link`_.
.. _a link: http://example.com/
内部链接则是通过Sphinx提供的一个特殊的reST role来实现的, 详见原文。
可以使用 [#name]_
标注在脚注的位置,在文档的最后的 .. rubric:: Footnotes
后添加脚注的内容,像这样:
Lorem ipsum [#f1]_ dolor sit amet ... [#f2]_
.. rubric:: Footnotes
.. [#f1] Text of the first footnote.
.. [#f2] Text of the second footnote.
你也可以明确用数字标注脚注或者通过不指定 name
使用自动数字标记脚注([#]_
)。
Sphinx支持标准reST引文(原文参考),增加了所有引文是“全局的”的特性,即:所有的文件可以使用所有的引文。这样使用它们:
Lorem ipsum [Ref]_ dolor sit amet.
.. [Ref] Book or article reference, URL or whatever.
引文用法是类似的脚注的用法,但带标签不是数字,或以``#``开始。
图片¶
reST支持图片标识(原文参考),可以像这样使用它:
.. image:: gnu.png
(options)
在Sphinx中使用图片标识,文件名前面的路径必须是相对于源文件,或者是绝对的但是相对于顶部的源目录,例如,在 sketch/spam.rst
文件中可以使用图片 images/spam.png
,也可以使用 ../images/spam.png
或者 /images/spam.png
, Sphinx将会自动将图像文件拷贝到输出目录中(例如HTML格式输出,会拷贝到 _static
目录中。)
对于图片尺寸选项( width
和 height
)的解释如下:如果大小没有单位或单位是像素,那图片大小将会被那些支持像素的输出格式关心(LaTeX格式就不在乎这种情况的图片大小)。HTML和LaTeX输出格式使用其他的单位(像 pt
表示像素点)。
Sphinx扩展了标准的docutils的功能,允许文件扩展名为星号:
.. image:: gnu.*
Sphinx搜索所有的图片匹配提供的模式,并确定其类型。每个生成器会从所有的候选者中选择最佳的图片。比如,如果给出 gnu.*
这样的文件名以及源代码树中存在 gnu.pdf
和 gnu.png
这两个文件,LaTeX 生成器会选择前者,HTML生成器则会选择后者。
文本样式¶
段落和其它正文的内部,你可对文字添加附加的标记,标准的行内标记相当简单:使用
- 单星号:
*text*
强调 (斜体), - 双星号:
**text**
重点强调 (粗体),以及 - 反引号:
``text``
代码示例。
如果星号或反引号出现在文本会对行内标记分隔符引起混淆,他们必须用一个反斜杠进行转义。
注意行内标记一些限制:
- 不能嵌套,
- 文本不能以空格开始或者结束:
* text*
是不正确的, - 必须由空格从周围的文本中分离出来。可以通过使用转义的空格来规避这个限制,例如:thisisoneword。
docutils以后的版本可能会取消以上列出的这些限制。
reST也允许自定义“文本解释role”,用来说明所包含的文本应以一种特定的方式解释, 一般的语法格式是 :rolename:`content`
。
标准的reST提供了如下些roles:
- emphasis -- 来替代
*emphasis*
- strong -- 代替
**strong**
- literal -- 代替
``literal``
- subscript -- 下标文本
- superscript -- 上标文本
- title-reference -- 书,期刊,以及其他材料的标题
Sphinx用它定义了语义标记和交叉引用的标识符。添加的roles请见 inline-markup。
显式标记¶
"显式标记" (ref) 在reST中是用于需要进行特殊处理的结构,比如脚注,特别突出的段落,注释,和通用指令(标识符)。
显式标记块的第一行是以 ..
开始,接着是紧随着空格,被结束于同样层级缩进的下一段落。(显式标记和正常的段落之间需要有一个空行。当你写它的时候,可能听起来有点复杂,但它是直观的。)
指令(标识符)¶
指令或者标识符(ref)是一个通用的显式标记块。除了roles,指令或者标识符是reST的扩展机制,Sphinx大量地使用了它。
Docutils支持如下的指令(标识符):
- 警告: attention, caution, danger, error, hint, important, note, tip, warning 以及 admonition。
- 图片:
- 其它内容元素:
- contents (一个局部的,即只对当前文件的,内容表)
- container (具有特定类的容器,用于HTML生成
<div>
) - rubric (一个与文件章节无关的标题)
- topic, sidebar (特别强调了内容元素)
- parsed-literal (支持行内标记的文字块)
- epigraph (带有属性行的块引用)
- highlights, pull-quote (带自己的类属性的块引用)
- compound (组合段落)
- 特色表格:
- table (带标题的表格)
- csv-table (由逗号分开的值生成的表格)
- list-table (由一系列列表生成的表格)
- 特色指令(标识符):
- HTML特性:
- Influencing markup:
- default-role (设置一个新的默认role)
- role (创建一个新的role)
请 不要 使用指令(标识符) sectnum, header 以及 footer。
Sphinx自己增加的指令(标识符)是在 sphinxmarkup 中描述的。
基本上,指令(标识符)由一个名称,参数,选项和内容组成。(请记住这些术语,它被用来在接下来的章节描述了自定义指令或者标识符。)请看例子,:
.. function:: foo(x)
foo(y, z)
:module: some.module.name
Return a line of text input from the user.
function
是指令(标识符)的名称。在这里它有两个参数,第一行其余的部分以及第二行,还有一个选项 module
(正如可以看到的,选项是在参数的下一行以及以冒号开始以冒号结束)。选项必须跟指令的内容缩进到相同的水平。
指令(标识符)的内容与选项之间空一行,需要相对于指令(标识符)的首行缩进(以指令的首行为缩进的对照点)。
替换¶
reST支持“替换”(ref),这是文本和/或标记在文中 |name|
提到。它们是像脚注用显著的标记块,像这样:
.. |name| replace:: replacement *text*
或者,这样:
.. |caution| image:: warning.png
:alt: Warning!
细节请看 reST reference for substitutions。
如果你想在所有文件使用中一些替换,把它们写入 :confval:`rst_prolog` 或把它们放到一个单独的文件,要使用它们的所有文件中包含它,通过使用 include
指令或者标识符。(务必使得include文件扩展名与其他的源文件不同,以免让Sphinx把它作为一个独立的文件。)
Sphinx自定义了一些默认的替换, 请看 default-substitutions。
评论¶
不是一个有效的标记结构(如上述的脚注)的每一个明确的标记块被视为一条评论(ref)。例如:
.. This is a comment.
您可以缩进文本在注释开始后,这样可以形成多行注释:
..
This whole indented block
is a comment.
Still in the comment.
源文件编码¶
由于包括特殊字符如在reST中的破折号或版权标志,最简单的方法是直接写为Unicode字符,指定编码。Sphinx假定源文件默认情况下是使用UTF-8编码;你可以改变 :confval:`source_encoding` 这一配置值。
陷阱¶
这有些问题通常发生在编写reST文档的时候:
- 分离的内嵌标记: 正如上面所说,行内标记的跨度必须用由非单词字符把周围的文字分开,可以使用转义的空格来避免。详情请看 the reference。
- 没有嵌套内联标记: 像
*see :func:`foo`*
是不可能存在的。
Footnotes
[1] | 当默认域包含一个 class 指令(标识符),该指令将被隐藏。因此,Sphinx将它转为 rst-class 。 |
Sphinx入门¶
这是Sphinx文档生成器的说明书,Sphinx是一个工具,它能够把一组 reStructuredText 格式的文件转换成各种输出格式,而且自动地生成交叉引用,生成目录等。也就是说,如果有一个目录,里面包含一堆reST格式的文档(可能子目录里面也同样存在reST格式的文档),Sphinx能够生成一个漂亮的组织结构以及便于浏览和导航的HTML 文件(这些文件在其他的文件夹中)。当然对于同样的来源文件(reST格式),它也能够生成一个能够被编译(生成)PDF版本的LaTeX格式的文件,或者直接使用 rst2pdf 生成PDF文件。
Sphinx注重的是人工的文档,而不是自动生成的API文档。尽管Sphinx或多或少地也支持自动生成的API文档,如果需要纯粹的API文档,可以看看 Epydoc (Epydoc也支持reST格式)。
Sphinx是一个工具,她能够轻易地创建智慧和优雅的文档,她是出自Georg Brandl之手,在BSD许可证下授权, Sphinx具有如下的特点:
- 输出格式: 超文本标记语言 (包括Windows HTML帮助),LaTeX (可打印的PDF版本),手册页,纯文本
- 丰富的交叉引用: 语义标记以及针对函数,类,引用,词汇表(术语)和相似的信息块的自动链接
- 层次结构: 简单的文本树定义,就能自动地链接到同层(兄弟姐妹)、上一层(父母)以及下一层(子女)的文本位置
- 自动生成目录: 通用索引以及语言模块的目录
- 代码高亮: 代码自动高亮,通过使用 Pygments
- 扩展功能: 自动测试的代码片段,包括从Python模块(API文档)的文档字符串
Sphinx 使用 reStructuredText 作为她的标记语言,她的优点大部分是来自于reStructuredText 以及reStructuredText 的解析和转换工具(套件) Docutils 的强大以及简单明了。
转换其他文件系统¶
她最初是为了新版的 python文档, 因此在python项目的文档具有完美的特性,但是同样支持c/c++,目前正在计划增加对其他的语言的支持。 理所当然,本页面也是使用Sphinx创造自reStructuredText格式源!
本节的目的是为给那些从其他文件系统迁移到reStructuredText/Sphinx上的人提供一些有用的提示。
- Gerard Flanagan写了一个从纯html格式到reST格式的脚本;这个脚本能在 Python Package Index 上被找到。
- 为了转换旧的Python文档到Sphinx,“转换器”在 the Python SVN repository 上。它包含了从python文档形式的LaTeX标记到Sphinx reST的代码。
- Marcin Wojdyr写了一个从Docbook到带有Sphinx标记的reST;它位于 Google Code。
- Christophe de Vienne 写了一个从Open/LibreOffice文件到Sphinx的转换工具: odt2sphinx。
- 为了转换不同的标记,Pandoc 是一个很有用的工具。
安装先决条件¶
- 对于Python 2,需要 Python 2.4 (或者以上版本)
- 对于Python 3,需要 Python 3.1 (或者以上版本)
- docutils_ (0.7或者SVN上的trunk版本) 和 Jinja2
- Pygments (如果需要代码高亮)
- uuid (如果使用 Python 2.4 )
绿色的箭头指定“详细信息”链接,这些链接指向了关于描述的功能的高级话题的章节。
设置文档来源¶
一个文档集合的根目录被称为 源目录。源目录 包含Sphinx配置文件 conf.py
,在配置文件里面可以配置Sphinx如何读取源文件以及如何生成文件等等各方面。 [1]
Sphinx提供了一个脚本 sphinx-quickstart,该脚本能够设置一个源目录以及通过几个简单的问答设置一个默认的配置文件 conf.py
。只需要运行:
$ sphinx-quickstart
接着回答问题。(务必选择"autodoc"扩展。)
Sphinx提供的"API documentation"生成器称为 sphinx-apidoc;更详细的内容参看 invocation-apidoc。
定义文档结构¶
假设你已经执行了 sphinx-quickstart。它创建了一个包含 conf.py
以及主文件 index.rst
(如果你接受了默认选项)的文件夹。master document 的主要作用是一个欢迎页面以及包含了树状内容表的“根”(或者 toctree)。
连接多个文件到单个层次结构的文件的方式是Sphinx增强了reStructuredText的主要事情之一。
toctree指令(标识符)最初是空的,看起来像这样:
.. toctree::
:maxdepth: 2
你可以添加文档列表在指令(标识符)中的*内容*位置:
.. toctree::
:maxdepth: 2
intro
tutorial
...
上面就是包含toctree的文件实际的样子。被包含的文档是以 文件名s 给出,简而言之,你可以脱离文件名扩展而直接使用斜线作为目录分隔符。
|more| 更详细的内容请见 toctree 指令(标识符)。
现在,您可以创建你列在toctree中的文件,并添加内容,章节的标题会被插入(至多到“最大深度”的层次)到toctree指令(标识符)标识的位置。当然,Sphinx知道你的文件的顺序以及层级结构。(他们可能会包含 toctree
指令(标识符)本身,这意味着你可以创建深层嵌套的层次结构,如果必要的话。)
添加内容¶
在Sphinx的源文件中,你可以使用标准reStructuredText的大部分功能。Sphinx也增加一些新的功能。例如,你可以通过使用可移植的方式(适应于所有的输出类型)-- ref
来实现跨文件间的引用。
举个例子,如果您正在查看的HTML版本,你可以看看这个文件的源代码 - 在侧边栏使用“显示源代码”的链接。
|more| 请参看 rst-primer 更加详细地学习reStructuredText,可以访问 sphinxmarkup 了解Sphinx增加的标记(标识符)列表。
运行构建¶
现在,你已经添加了一些文件和内容,让我们来做第一个文件构建。构建是由 sphinx-build 程序开始的,像如下调用:
$ sphinx-build -b html sourcedir builddir
上面提到的 sourcedir 是指 源目录,builddir 是指你想放置的生成文件的位置。-b
选择了生成器;在本例中Sphinx将会生成HTML格式的文件。
|more| invocation 中列出了 sphinx-build 所支持的选项。
因为 sphinx-quickstart 生成了 Makefile
和 make.bat
文件,这些文件能够减少不少工作:有了它们你就可以运行
$ make html
生成HTML文件在制定的目录。执行无参数的 make
可以看到哪些目标文件(makefile文件)可用。
怎样生成PDF文件?
make latexpdf
运行 LaTeX builder
,实际上是调用pdfTeX工具元件。
文档对象¶
注:在这里domain翻译成域,可以理解成不同的编程语言的集合对象,像python domain, java domain, C/C++ domain等。
Sphinx一个主要目标是在任何 域 中简单的 objects 文档(从非常笼统的意义上说)。域 是指一个集合对象类型属于一个整体,完整的标记来创建和引用这些对象的描述。
Python是最突出的域。如记录python的内建函数 enumerate()
,你只需要添加如下的内容到源文件中:
.. py:function:: enumerate(sequence[, start=0])
Return an iterator that yields tuples of an index and an item of the
*sequence*. (And so on.)
会呈现出(在文档中会显示):
-
enumerate
(sequence[, start=0])¶ Return an iterator that yields tuples of an index and an item of the sequence. (And so on.)
指令(标识符)的参数就是描述对象的 说明(签名),内容是它的文档。允许多个说明(签名),单独成行(每个独立一行)。
Python是默认的域,所以不需要在域名前标记前缀:
.. function:: enumerate(sequence[, start=0])
...
做了同样的工作如果你保持默认的域以及它默认的设置。
Sphinx提供了许多其他的指令(标识符)为了标识python对象的其他的类型,例如:py:class
or py:method
。还设有一个为每个这些对象类型的交叉引用 角色。 下面的内容会创建一个到 enumerate()
文档的链接:
The :py:func:`enumerate` function can be used for ...
这就是结果: 链接到 enumerate()
.
再次提醒,如果使用默认域,py:
是可以不用添加的。不用关心真正包含 enumerate()
的文档的文件;Sphinx能够找到以及为它建立链接。
每个域对说明(签名)样式有着特点的规定,并格式化输出显得漂亮些,或者增加些特性如链接到参数类型,像在C/C++域。
|more| 请查看 domains 获取所有可用的域以及指令(标识符)/角色。
基本配置¶
前面我们提到了 conf.py
文件控制着Sphinx如何处理文档。该文件,作为Python源文件执行,你可以在文件中赋予的配置值。 对高级用户:因为文件是通过Sphinx执行,用户可以做一些不平凡的任务,像增加 sys.path
的值或者导入一个模块找出记录文档的版本。
你可能需要修改的配置值是已经通过 sphinx-quickstart 写入到 conf.py
中并且注释起来(使用标准python语法: #
在行的开头)。如果要定制配置值而不是使用 sphinx-quickstart 生成的值,只需要增加额外的赋值。
请记住,配置文件使用的是Python的字符串,数字,列表等语法。文件默认情况下是以UTF-8的格式保存,在文件的首行声明编码格式。如果需要使用non-ASCII格式,需要使用python的Unicode字符串*(像 project = u'Exposé'
)。
|more| 所有可用的配置值请参看 build-config 。
Autodoc¶
注:无法找到合适的词语来表示autodoc,直接用英文代替。
在记录python源代码的时候,通常需要在源文件,文档字符串中加入大量的记录(文字)。Sphinx支持直接使用python自身模块的文档字符创通过使用称为"autodoc"的 extension。(这个扩展是python的一个模块,为Sphinx项目提供额外的特性。)
为了能够使用autodoc,你需要通过在配置文件 conf.py
中加入字符串 'sphinx.ext.autodoc'
到 :confval:`extensions` 列表中来激活。接着,你就有一些额外的指令(标识符)可以任由支配了。
例如,为了记录函数 io.open()
,从源文件中读取它的说明(签名)以及文档字符串,你可以这些写:
.. autofunction:: io.open
当然你也能自动地记录整个类或者模块,使用自动的指令(标识符)的member选项,像:
.. automodule:: io
:members:
autodoc需要导入模块以便提取文档字符串。因此,必须在配置文件 conf.py
中添加模块所在的路径到 sys.path
。
|more| autodoc更多的特性请参考 sphinx.ext.autodoc
。
无线电¶
First post!¶
This is your first post! If you can see this with a web-browser, then it's likely that everything's working nicely!
Plone不同工作流的详细说明¶
工作流是完成一项任务的业务流程。比如,写博客时,先保存草稿,待修改满意再发布。这个简单的工作流有两个状态:草 稿,发布。有一个转换:从草稿状态到发布状态。在草稿状态时,只有博主能够查看,修改,同时可以随时发布。在发布状态,博主可以更新,删除,任何人都可以 浏览。
从上面的例子可以看出,工作流由两部分组成:状态和转换。 而每个状态下又包括不同用户的访问权限控制。 其实工作流可以看做是一个状态转移图。 Plone中的对象操作链就是由工作流管理的。关联工作流到特定的内容类型是由portal_workflow管理的。它包含了protal的工作流的定 义。
在Plone里,当创建一个内容对象后,它的状态是“保密”,同时在下拉菜单里会看到两个转换:“发布”,“提交发布”。选择“提交发布”后,状态就变成 “待审”,或者选择“发布”,状态就变成“已发布”。这是Plone的默认工作流。
要查看或修改Plone的工作流,在Plone控制面板中选择“类型”,可以看到当前的默认工作流是简单发布工作流(simple publication workflow)。
简单发布工作流¶
简单发布工作流有三个状态:
- 保密(private)
- 待审(pending)
- 已发布(published)
四个状态转移:
- 提交(submit)
- 发布(publish)
- 打回(reject)
- 召回(retrac)
创建新的内容对象时初始状态为保密状态。 在保密状态下,内容创建者可以修改内容,提交内容给审核者,或者直接发布。发布后创建者仍可修改。 提交内容后,对象状态变为“待审”。这时创建者可以“召回”,即取消提交,而审核者会在工作台的审批清单里看到这个请求,审核者可以“发布”,也可以“打 回”。待审状态时文件不可修改。 创建者“召回”或审核者“打回”,文件状态都恢复到“保密”。 审核者“发布”待审对象,则对象状态变为“已发布”。这时任何人都可以看到了。 简单发布工作流的状态图如下所示:

其他工作流简介¶
在“新的工作流”下拉菜单里可以选择使用其他工作流。 Plone还提供了5种工作流:
- 文件夹社区工作流(folder_workflow)
- 文件夹内部工作流(intranet_folder_workflow)
- 内外网工作流(intranet_workflow)
- 单一状态工作流(one_state_workflow)
- 社区工作流(plone_workflow)
文件夹社区工作流¶
有三个状态:
- 公开草案(visible)
- 保密(private)
- 已发布(published)
四个状态转换:
- 隐藏(hide)
- 发布(publish)
- 召回(retract)
- 变为草案(show)
创建内容后初始状态为公开草案。此后内容拥有者可以隐藏内容使变为保密状态,或者发布草案。 保密状态时可以发布,可以变为草案。 已发布状态时可以召回,变为公开草案,亦可以隐藏,变为保密状态。 没有待审状态,创建者可以直接发布而不需审核。 状态转移图如下:

文件夹内部工作流¶
文件夹内部工作流比较简单,只有两种状态,通常和内外网工作流一起使用:
- 内部草案(internal)
- 保密(private)
两个状态转换:
- 隐藏(hide)
- 内部显示(show_internally)
创建内容后初始状态为内部草案。此后内容拥有者可以隐藏内容使变为保密状态。 保密状态下可以内部显示,从而变为公开草案。 状态图如下:

内外网工作流¶
内外网工作流比较复杂,有5种状态:
- 内部草案(internal)
- 保密(private)
- 待审(pending)
- 内部发布(internally_published)
- 公开(external)
同时有7种状态转换:
- 隐藏(hide) 成员使其变为保密
- 公开发布(publish_externally) 审核者使外部可见
- 内部发布(publish_internally) 审核者内网发布
- 驳回(reject) 打回
- 收回(retract) 收回提交
- 内部显示(show_internally) 转到内部草案状态
- 提交(submit) 提交送审
创建内容后初始状态为内部草案,此时可以隐藏到保密状态,可以提交送审,管理员可以直接内部发布。 保密状态时可以内部显示为内部草案,可以内部发布。 待审状态时可以内部发布,可以公开发布,可以打回,可以被创建者召回。 内部发布状态时可以打回或被创建者召回到内部草案。可以公开发布。 公开状态时,内容创建者可以召回到内部草案状态。 内外网工作流的状态转移图如下所示:

社区工作流¶
社区工作流,又叫Plone工作流,有四个状态:
- 公开草案(visible)
- 保密(private)
- 待审(pending)
- 已发布(published)
六种状态转换:
- 隐藏(hide)
- 发布(publish)
- 驳回(reject)
- 召回(retract)
- 变为草案(show)
- 提交(submit)
创建内容后初始状态为公开草案。 可以隐藏使变为保密状态,可以提交送审,可以直接发布。 保密状态时,只能变为公开草案。 待审状态时可以隐藏到保密状态,可以驳回或召回到公开草案状态,可以发布。 已发布状态时可以驳回或召回到公开草案状态。 内容可以被创建者或管理员提交待审。审核者可以发布或打回内容,而内容拥有者也可以收回内容。在待审期间,任何人都可以阅读。 发布后,只有管理员才能收回。 状态图如下:

如何设置Excel单元格为只读¶
大家在使用 Excel 时有时会希望把某些单元格锁掉,这样的不会造成误删、误改某些数据。原先就听说可以把某些单元格设置成“只读”的。这个怎么操作呢?
我们看一下下面这个例子,“总合”这一栏是计算所得的,所以这一列上的数据都不需要直接输入或修改。我们可以把这一列锁起来: .. image:: 01.png
先选定任意一个单元格,点右键,选设置单元格格式。

点开保护选项卡,我们会发现这里的锁定默认情况下就选中了。

也就是说在默认情况下,一旦锁定了工作表,所有的单元格就锁定了。
所以,我们选中所有的单元格(Ctrl+A),点右键,选设置单元格格式。然后在保护选项卡上把锁定勾去掉。 然后选中需要保护的单元格,在这个例子中是整个“总合”这一列(因为这一列是自动计算出来的),把它的锁定勾上。
易宝典提示:为方便起见,你也可以只把需要编辑的那部分单元格的锁定取消掉。 在我们设好了哪些单元格需要锁定后,现在我们可以把锁定功能打开了。 点开审阅选项卡,点保护工作簿。

在允许此工作表的所有用户进行下面,可以选用户可以做哪些操作。一般留着默认选项即可,然后按确定。

注:如果在这里设置了密码,以后解开锁定时就要输入密码。密码一般可以不设。 我们尝试编辑“总合”一栏中的数据,会弹出一个消息说不能编辑内容。

虽然这个单元格锁定了,但是并不影响它数据更新。比方说,这个是“总合”栏,我们把单独数据(源数据)改了,总合还是会自动计算的。
如果需要解除锁定,在审阅选项卡上点撤销工作表保护。

How to recover SA password on Microsoft SQL Server 2008 R2¶
When you are using MS SQL Server in mixed mode, it is very important that you know your SA password.
There can be different reasons you lost the password
- Person who installed the SQL Server knows the password but has left the building.
- You did not write down the password in your password file
- Password file is lost
- …
Steps to recover the SA password¶
- Start SQL Server Configuration Manager

- Stop the SQL services

- Edit the properties of the SQL Service

- Change the startup parameters of the SQL service by adding a –m; in front of the existing parameters


- Start the SQL services. These are now running in Single User Mode.
- Start CMD on tthe SQL server
- Start the SQLCMD command. Now you will see following screen

Now we create a new user. Enter following commands
CREATE LOGIN recovery WITH PASSWORD = ‘TopSecret 1′ (Remember SQL server has default strong password policy
Go
- Now this user is created
Now we grant the user a SYSADMIN roles using the same SQLCMD window.
- sp_addsrvrolemember ‘recovery’, ‘sysadmin’
- go
Stop the SQL service again
Change the SQL service properties back to the default settings

- Start the SQL service again and use the new created login (recovery in my example)
- Go via the security panel to the properties and change the password of the SA account.

- Now write down the new SA password.
Indices and tables¶
网上的免费编程中文书籍索引¶
- 国外程序员在 stackoverflow 推荐的程序员必读书籍,中文版 。
- stackoverflow 上的程序员应该阅读的非编程类书籍有哪些? 中文版
- github 上的一个流行的编程书籍索引 中文版