Objective-C规范注释心得——同时兼容appledoc(docset、html)与doxygen(html、pdf)的文档生成

作者:zyl910

  手工写文档是一件苦差事,幸好现在有从源码中抽取注释生成文档的专用工具。对于Objective-C来说,目前最好用的工具是appledoc和doxygen。可是这两种工具对于注释的要求略有区别。于是我经过一番摸索,找到了一套能同时兼容这两种工具的注释写法。

  工具简介——
appledoc:简单方便,适于生成apple风格的html文档,及直接集成到xcode帮助(docset)。官网 http://gentlebytes.com/appledoc/ 。
doxygen:功能强大,适于生成html文档与pdf文档。官网 http://www.stack.nl/~dimitri/doxygen/index.html 。

  系统环境——
Mac OS X Lion 10.7.5
Xcode 4.6.2
appledoc 2.1
doxygen 1.8.4
MacTeX-2012

一、注释写法

  提示:这一章主要是参考性内容,比较枯燥。请根据需要来阅读——
对于想简单学一下注释写法的,读前4节就行了;
对于想全面学习appledoc与doxygen均兼容的注释写法的,读前6节就行了;
对于既想使用appledoc,又想使用doxygen增强效果的,请阅读所有的节。

1.1 注释形式

  标准C/C++的注释形式有“//”形式的单行注释 与“/* */”形式的多行注释这两种。
  而appledoc与doxygen的文档化注释是它们的变种,有多种形式。例如appledoc与doxygen均兼容的注释形式有以下7种——

/// Single line comment.

/// Single line comment spreading
/// over multiple lines.

/** Single line comment. */

/** Single line comment spreading
 * over multiple lines.
 */

/** Single line comment spreading
 over multiple lines. No star.
 */

/*! Single line comment. */

/*! Single line comment spreading
 over multiple lines.
 */

 

  虽然appledoc与doxygen都支持。但在平时编写代码时,为了避免风格杂乱的视觉污染,应该固定使用注释形式。

1.1.1 单行注释

  在很多时候只需写一个简要描述就够了,这时最好使用单行注释。推荐格式为——

/// 简要描述.

 

  appledoc与doxygen均会将单行的“///”注释识别为简要描述。兼容性非常高。

  备注——
1) 文本最好统一以英文句号(.)结尾。这样做有助于代码阅读,明确地得知该段文本已经结束,而且有助于避免乱码时的换行符丢失问题。
2) 不要连续多行使用“///”。doxygen在默认情况下,会将多行的“///”当作详细描述,而没有简要注释. 虽然可以修改doxygen的配置以解决上述问题,但多行“///”本身是违背“简要描述”这个初衷的.

1.1.2 多行注释

  当需要写详细描述时,这时就需要使用多行注释了。推荐格式为——

/** 简要描述.
 *
 * 详细描述或其他.
 */

 

  对于appledoc与使用了JAVADOC_AUTOBRIEF参数的doxygen来说,它们均会将注释中的第一段识别为简要描述,然后将后面的段识别为详细描述.

  其实doxygen的标准多行注释为——

/**
 * @brief 简要描述.
 *
 * 详细描述或其他.
 */

 

  可惜appledoc对@brief指令的支持存在缺陷——@brief不能出现类、协议的注释中,会导致后续内容丢失。 @brief多行注释仅能安全的用在属性、方法的注释中。

  备注——
1) 多行注释存在“段”的概念,以内容为空的行作为分段依据。如果没有空行隔开的话,会将连续有内容的行连接起来组成一段.
2) 如果省略中间各行行首的星号(*),appledoc与doxygen也能识别。当考虑到注释缩进、美观性、兼容性,还是建议不要省略行首星号。

1.1.3 行尾注释(仅doxygen)

  在对枚举、结构体等类型的成员进行注释时,为了使内容更加紧凑,我们一般喜欢在行尾写注释。
  可惜目前仅有doxygen支持行尾注释,而appledoc不支持。

  doxygen支持以下4种行尾注释——

/**< 行尾注释1. appledoc不支持会变为下一项的注释, doxygen 支持, 根据英文句号自动切分简要描述与详细描述. */
/*!< 行尾注释2. appledoc不支持会变为下一项的注释, doxygen 支持, 会全部当作详细描述, 而缺少简要描述. */
///< 行尾注释3. appledoc不支持会变为下一项的注释, doxygen 支持.
//!< 行尾注释4. appledoc不支持会会忽略, doxygen 支持.

 

  为了避免appledoc误将行尾注释当作下一项的注释,故推荐第4种注释——既以“//!<”开头的注释。


1.2 类(协议、分类)的注释

  对于类(协议、分类)来说,一般只需要写简要描述就行了,这时可以使用单行注释——

/// 文档A.
@interface DocA : NSObject

 

  当需要留下详细描述时,可换成多行注释——

/** 文档B.
 *
 * 文档B的详细描述.
 */
@interface DocB : NSObject

 


1.3 属性的注释

  对于属性来说,本来使用行尾注释是最好的,能使内容更加紧凑。可惜目前appledoc不支持行尾注释。只好退而求其次,选择单行注释了——

/// 数值属性.
@property (nonatomic,assign) NSInteger num;

 

  当需要留下详细描述时,可换成多行注释——

/**
 * @brief 字符串属性.
 *
 * 属性的详细描述.
 */
@property (nonatomic,strong) NSString* str;

 


1.4 方法的注释

  对于没有参数、返回值的简单方法,可以使用单行注释——

/// 简单方法.
- (void)someMethod;

 

  若方法具有参数或返回值,这时就得使用多行注释了——

/**
 * @brief 带整数参数的方法.
 *
 * @param  value 值.
 *
 * @return 返回value.
 */
- (int)someMethodByInt:(int)value;

 

  指令说明——
@param : 参数描述.
@return : 返回值描述.

  由于方法注释需要填写的内容较多(参数列表与返回值等),所以现在有很多插件可以帮忙生成方法的注释,而这些插件一般是使用@brief多行注释的。例如参考文献中的《Xcode4快速Doxygen文档注释 — 简明图文教程(3分钟后爽歪歪)》.

  在某些时候,我们还需要在方法注释种填写异常、参见、警告 等信息——

/**
 * @brief 带字符串参数的方法.
 *
 * @param  value 值.
 *
 * @return 返回value.
 *
 * @exception NSException 可能抛出的异常.
 *
 * @see someMethod
 * @see someMethodByInt:
 * @warning 警告: appledoc中显示为蓝色背景, Doxygen中显示为红色竖条.
 * @bug 缺陷: appledoc中显示为黄色背景, Doxygen中显示为绿色竖条.
 */
- (NSString*)someMethodByStr:(NSString*)value;

 

  指令说明——
@exception : 异常描述.
@see : 参见. 具体用法详见 1.5.2 @see、@sa(参见) .
@warning : 警告.
@bug : 警告.


1.5 appledoc、doxygen均支持的指令

  指令一般以“@”开头,也可以使用“\”等符号开头。 若想在文本中使用“@”、“\”等符号,可使用“\”转义符,例如“\@”、“\\”等。

1.5.1 指令列表

  指令在appledoc中被称作“Directive”,而在doxygen中被称作“Command”。
  appledoc没有专门指令参考文档,仅在《Comments formatting style》中给了几个简单示例。
  而doxygen有详细的指令参考文档,详见《Special Commands》。

  经过测试,我发现下列指令在appledoc与doxygen中均是有效的——
@brief : 简要注释. appledoc中仅对属性、方法有效,对类、协议 无效,会造成后续内容解析失败.<br>@param <name> <description>: 参数描述.<br>@return <description>: 返回值描述.<br>@exception <name> <description>: 异常描述.<br>@see <name>: 参见.<br>@sa <name>: 参见. 同@see.<br>@warning <text>: 警告.<br>@bug <text>: 警告.<br>@name <title>: 组名. 用于给成员们分组, 既文档中Tasks区的子类别.</p> <h3><br>1.5.2 @see、@sa(参见)</h3> <p>  参见指令的格式为——<br>@see <name><br>@sa <name></p> <p>  在保证appledoc与doxygen均兼容的情况下,<name>可为——<br>1) 当前类(或协议)中的属性或方法。(注意Objective-C方法签名的写法,一般为“方法名:参数1:参数2:⋯⋯”的格式)<br>2) 类(或协议)名。(注意appledoc不支持当前类)</p> <p>  虽然appledoc与doxygen都支持参见“其他类或协议中的成员”,可惜它们的写法不同,而且相互不兼容——<br>appledoc:使用Objective-C消息语法,既“[类 成员]”格式。<br>doxygen:使用传统的对象成员访问语法,既“类.成员”格式。</p> <p>  注意本指令与@brief指令存在同样的问题——appledoc中仅对属性、方法有效,对类、协议 无效,会造成后续内容解析失败。 这时有两种处理策略——<br>1) 将参见指令放在注释的最后面,避免内容丢失,且能保证在doxygen中的效果.<br>2) 使用链接来代替参见。详见 1.6.4 链接。</p> <h2><br>1.6 appledoc、doxygen均支持的排版格式</h2> <p>  无格式的纯文本看起来比较费劲,得进行格式排版,以提高文档的组织性与表现力。appledoc与doxygen均有自己的一套约定——<br>appledoc可参考《Comments formatting style》。<br>doxygen可参考《Markdown support》。</p> <p>  本节将会介绍appledoc与doxygen均支持的排版格式。</p> <h3>1.6.1 代码文本</h3> <p>  有时需要在一段话中引入一小段代码,这时可以用重音符(`)将那一段代码给包起来。例如——</p> <div class="cnblogs_code"> <pre><span style="color: #008000;">/*</span><span style="color: #008000;">* * 引用短代码, 如 `someMethodByStr:` . </span><span style="color: #008000;">*/</span></pre> </div> <p> </p> <h3><br>1.6.2 代码块</h3> <p>  代码块适用于需要在注释中放置多行代码的情况。具体办法是在每行内容的前面加一个tab字符,例如——</p> <div class="cnblogs_code"> <pre><span style="color: #008000;">/*</span><span style="color: #008000;">* * 示例代码: * * int sum=0; * for(int i=1; i<=10; ++i) { * sum += i; * } </span><span style="color: #008000;">*/</span></pre> </div> <p> </p> <p> </p> <p>  因为空格与Tab字符均显示为空白,不易区分。于是用<space>、<tab>表达空格与tab字符,上述注释实际为——</p> <div class="cnblogs_code"> <pre><span style="color: #008000;">/*</span><span style="color: #008000;">* <space>*<space>示例代码: <space>* <space>*<space><tab>int sum=0; <space>*<space><tab>for(int i=1; i<=10; ++i) { <space>*<space><tab><tab>sum += i; <space>*<space><tab>} <space></span><span style="color: #008000;">*/</span></pre> </div> <p> </p> <p>  因每行注释开始的星号(*)与内容之间必须用空白型字符隔开,所以平时用空格或tab字符都行。但在使用代码块时,为了避免对Tab字符的误判,内容最好严格以“<space><tab>”开头(既每行以“<space>*<space><tab>”开头)。</p> <p>  备注——<br>1) 注意段的概念,代码块与前后文本之间应该空开一行。<br>2) appledoc与doxygen还支持将4个空格当作一个tab字符。但4个字符的录入、维护起来会更费力一些,不推荐使用。</p> <h4>1.6.2.1 xcode中输入代码块</h4> <p>  在xcode中,按下Tab键时,会自动整合前面的空格字符,导致代码块排版失效。所以建议先在多行注释中粘贴代码,然后在行前输入“*<space><tab>”。范例如下——</p> <p>  首先,最初的注释是这样的——</p> <div class="cnblogs_code"> <pre><span style="color: #008000;">/*</span><span style="color: #008000;">* * @brief 简要描述. * * 详细描述或其他. </span><span style="color: #008000;">*/</span></pre> </div> <p> </p> <p>  第一步,在多行注释中粘贴代码,注意xcode会自动对新粘贴内容进行排版,在每一行的前面加一个空格——</p> <div class="cnblogs_code"> <pre><span style="color: #008000;">/*</span><span style="color: #008000;">* * @brief 简要描述. * * 详细描述或其他. int sum=0; for(int i=1; i<=10; ++i) { sum += i; } </span><span style="color: #008000;">*/</span></pre> </div> <p> </p> <p>  第二步,补齐行首。复制“*<space><tab>”,对于先前所粘贴的那段代码,在每一行的第二个字符处粘贴,以形成“<space>*<space><tab>”开头的代码块格式——</p> <div class="cnblogs_code"> <pre><span style="color: #008000;">/*</span><span style="color: #008000;">* * @brief 简要描述. * * 详细描述或其他. * int sum=0; * for(int i=1; i<=10; ++i) { * sum += i; * } </span><span style="color: #008000;">*/</span></pre> </div> <p> </p> <p>  第三步,修尾。增加空行,增加“代码:”行,提示下面是代码——</p> <div class="cnblogs_code"> <pre><span style="color: #008000;">/*</span><span style="color: #008000;">* * @brief 简要描述. * * 详细描述或其他. * * 代码: * * int sum=0; * for(int i=1; i<=10; ++i) { * sum += i; * } </span><span style="color: #008000;">*/</span></pre> </div> <p> </p> <h3><br>1.6.3 列表</h3> <h4>1.6.3.1 无序列表</h4> <p>  在内容的每一行开头使用“-”、“+”或“*”字符,可创建无序列表。例如——</p> <div class="cnblogs_code"> <pre><span style="color: #008000;">/*</span><span style="color: #008000;">* * 无序列表: * * - abc * - xyz * - rgb </span><span style="color: #008000;">*/</span></pre> </div> <p> </p> <h4>1.6.3.2 有序列表</h4> <p>  使用数字与小数点,可创建有序列表。例如——</p> <div class="cnblogs_code"> <pre><span style="color: #008000;">/*</span><span style="color: #008000;">* * 有序列表: * * 1. first. * 2. second. * 3. third. </span><span style="color: #008000;">*/</span></pre> </div> <p> </p> <h4>1.6.3.3 多级列表</h4> <p>  使用tab字符配合使用无序列表或多级列表,可创建多级列表。例如——</p> <div class="cnblogs_code"> <pre><span style="color: #008000;">/*</span><span style="color: #008000;">* * 多级列表: * * - xyz * - x * - y * - z * - rgb * - red * 1. first. * 1. alpha. * 2. beta. * 2. second. * 3. third. * - green * - blue </span><span style="color: #008000;">*/</span></pre> </div> <p> </p> <h4><br>1.6.4 链接</h4> <p>  链接有三种形式——<br>1) 直接链接。格式为 <link>。会将链接地址直接作为文本来显示。<br>2) 文本链接。格式为 [text](<link>)。使用自定义的文本作为链接名。<br>3) 交叉引用链接。比较复杂,且难以兼容appledoc与doxygen,故本文不讨论。</p> <h4>1.6.4.1 Url</h4> <p>  在注释中直接写上url便会自动创建链接,例如——</p> <div class="cnblogs_code"> <pre><span style="color: #008000;">/*</span><span style="color: #008000;">* * </span><span style="color: #008000; text-decoration: underline;">http://appledoc.gentlebytes.com/</span><span style="color: #008000;"> : 直接写url链接. </span><span style="color: #008000;">*/</span></pre> </div> <p> </p> <p>  还可以使用文本链接形式——</p> <div class="cnblogs_code"> <pre><span style="color: #008000;">/*</span><span style="color: #008000;">* * [Doxygen](</span><span style="color: #008000; text-decoration: underline;">http://www.stack.nl/</span><span style="color: #008000;">~dimitri/doxygen/) : 为链接提供文本 . </span><span style="color: #008000;">*/</span></pre> </div> <p> </p> <h4>1.6.4.2 类与协议</h4> <p>  在注释中直接写上类(或协议)名,并注意左右两侧留空格,appledoc与doxygen便会自动生成指向该类(或协议)的链接。例如——</p> <div class="cnblogs_code"> <pre><span style="color: #008000;">/*</span><span style="color: #008000;">* * DocA : 类. </span><span style="color: #008000;">*/</span></pre> </div> <p> </p> <p>  但对于文本链接来说,appledoc与doxygen的写法不同——</p> <div class="cnblogs_code"> <pre><span style="color: #008000;">/*</span><span style="color: #008000;">* * - [文档B](DocB) : 类的链接文本.(仅appledoc) * - [文档B](@ref DocB) : 为\@ref链接提供文本 (仅doxygen. appledoc会把\@ref当作文本而生成错误的链接). </span><span style="color: #008000;">*/</span></pre> </div> <p> </p> <p>  建议还是使用直接链接吧。</p> <h4>1.6.4.3 属性与方法(仅appledoc)</h4> <p>  如果注释中出现了 [类 成员],appledoc会自动的为其创建链接,但doxygen不支持此功能。</p> <p>  如果注释中出现当前类的属性或方法名,appledoc会自动的为其创建链接,但doxygen不支持此功能。而且appledoc还存在Bug——如果在同一片注释中出现了[类 成员],那么当前类的的属性或方法的链接会失效。</p> <p>  这么不稳定的功能还是暂时别用吧。</p> <h2><br>1.7 常用的doxygen注释示例</h2> <p>  doxygen的注释功能多的令人眼花缭乱,这里还是介绍几种常用写法吧。</p> <h3>1.7.1 文件头</h3> <p>  一般格式为——</p> <div class="cnblogs_code"> <pre><span style="color: #008000;">/*</span><span style="color: #008000;">* * @file MyDocViewController.h * @brief 主页面. * @author [zyl910](</span><span style="color: #008000; text-decoration: underline;">http://www.cnblogs.com/zyl910/</span><span style="color: #008000;">) * @version 1.0 * @date 2013-06-07 * * # update (更新日志) * * [2013-06-07] <zyl910> v1.0 * * + v1.0版发布. * </span><span style="color: #008000;">*/</span></pre> </div> <p> </p> <p>  指令说明——<br>@file [<name>]:文件名.<br>@author <list of authors>:作者. 这里我使用了链接,详见 1.6.4 链接 .<br>@version <version number>:版本号.<br>@date <date description>:日期.</p> <p>  以井号(#)开头的行表示是标题。如果有1个井号(#),表示是一级标题。如果有2个井号(##),表示是二级标题,以此类推。</p> <h2>1.7.2 枚举、结构体、联合体与typedef</h2> <p>  对于枚举、结构体、联合体等类型,一般可选用单行注释或多行注释。对于其中的成员,推荐使用行尾注释。例如——</p> <div class="cnblogs_code"> <pre><span style="color: #808080;">///</span><span style="color: #008000;"> Objective-C 文档工具枚举 (枚举, 仅Doxygen).</span> typedef <span style="color: #0000ff;">enum</span><span style="color: #000000;"> _ObjCDocToolEnum{ ObjCDocToolEnumAppleDoc </span>= <span style="color: #800080;">1</span>, <span style="color: #008000;">//</span><span style="color: #008000;">!< AppleDoc. </span><span style="color: #008000; text-decoration: underline;">http://appledoc.gentlebytes.com/</span><span style="color: #008000;"> .</span> ObjCDocToolEnumDoxygen, <span style="color: #008000;">//</span><span style="color: #008000;">!< Doxygen. </span><span style="color: #008000; text-decoration: underline;">http://www.stack.nl/</span><span style="color: #008000;">~dimitri/doxygen/ .</span> <span style="color: #000000;">}ObjCDocToolEnum; </span><span style="color: #008000;">/*</span><span style="color: #008000;">* 整数矩形 (结构体, 仅Doxygen). * * 结构体的详细描述. </span><span style="color: #008000;">*/</span><span style="color: #000000;"> typedef </span><span style="color: #0000ff;">struct</span><span style="color: #000000;"> _RectInt { </span><span style="color: #0000ff;">int</span> x; <span style="color: #008000;">//</span><span style="color: #008000;">!< 横坐标.</span> <span style="color: #0000ff;">int</span> y; <span style="color: #008000;">//</span><span style="color: #008000;">!< 纵坐标.</span> <span style="color: #0000ff;">int</span> width; <span style="color: #008000;">//</span><span style="color: #008000;">!< 宽度.</span> <span style="color: #0000ff;">int</span> height; <span style="color: #008000;">//</span><span style="color: #008000;">!< 高度.</span> }RectInt, *PRectInt; <span style="color: #008000;">//</span><span style="color: #008000;">!< 整数矩形的指针.</span> typedef <span style="color: #0000ff;">const</span> RectInt* PCRectInt; <span style="color: #008000;">//</span><span style="color: #008000;">!< 整数矩形的常量指针.</span> <span style="color: #808080;">///</span><span style="color: #008000;"> 浮点数的字节(联合体, 仅Doxygen).</span> <span style="color: #000000;">typedef union _FloatByte { </span><span style="color: #0000ff;">float</span> f; <span style="color: #008000;">//</span><span style="color: #008000;">!< 单精度浮点数.</span> unsigned <span style="color: #0000ff;">char</span> bytes[<span style="color: #800080;">4</span>]; <span style="color: #008000;">//</span><span style="color: #008000;">!< 4个字节.</span> } FloatByte;</pre> </div> <p>   注意行尾注释是对前一项的注释,所以一定要使用分号(;)或逗号(,)标明本项成员定义好后,再写行尾注释。包括最后一个成员。</p> <p>  在定义结构体时,一般还需要定义其相关的指针类型与常量指针类型——<br>定义指针类型时,可以跟结构体的定义写在一起,利用行尾注释的特点来注释。<br>定义常量指针类型时,需要单独写一行typedef,并使用行尾注释。</p> <h3><br>1.7.3 宏</h3> <p>  对于常量形式的简单宏,推荐使用行尾注释。例如——</p> <div class="cnblogs_code"> <pre><span style="color: #0000ff;">#define</span> BUFSIZE 100 <span style="color: #008000;">//</span><span style="color: #008000;">!< 缓冲区大小 (简单宏, 仅Doxygen).</span></pre> </div> <p> </p> <p>  对于带参数的宏,可参考“方法的注释”写多行注释。例如——</p> <div class="cnblogs_code"> <pre><span style="color: #008000;">/*</span><span style="color: #008000;">* * @brief 最小值 (参数宏, 仅Doxygen). * * @param a 值a. * @param b 值b. * * @return 返回两者中的最小值. </span><span style="color: #008000;">*/</span> <span style="color: #0000ff;">#define</span> min(a,b) ( ((a)<(b)) ? (a) : (b) )</pre> </div> <p> </p> <h3><br>1.7.4 函数指针与块函数(Block Objects)</h3> <p>  对于函数指针与块函数,也可参考“方法的注释”写多行注释。例如——</p> <div class="cnblogs_code"> <pre><span style="color: #008000;">/*</span><span style="color: #008000;">* * @brief 动作回调函数. * * @param sender 发送者. * @param userdata 自定义数据. </span><span style="color: #008000;">*/</span><span style="color: #000000;"> typedef </span><span style="color: #0000ff;">void</span> (*ActionCallback)(<span style="color: #0000ff;">void</span>* sender, <span style="color: #0000ff;">void</span>*<span style="color: #000000;"> userdata); </span><span style="color: #008000;">/*</span><span style="color: #008000;">* * @brief 动作块函数. * * @param sender 发送者. * @param userdata 自定义数据. </span><span style="color: #008000;">*/</span><span style="color: #000000;"> typedef </span><span style="color: #0000ff;">void</span> (^ActionHandler)(<span style="color: #0000ff;">id</span> sender, <span style="color: #0000ff;">id</span> userdata);</pre> </div> <p> </p> <h3>1.7.5 成员变量</h3> <p>  对于成员变量,推荐使用行尾注释。例如——</p> <div class="cnblogs_code"> <pre><span style="color: #0000ff;">@interface</span><span style="color: #000000;"> MyDocViewController : UIViewController { </span><span style="color: #0000ff;">@private</span> <span style="color: #0000ff;">int</span> _privateInt; <span style="color: #008000;">//</span><span style="color: #008000;">!< 私有成员变量 (仅Doxygen具有EXTRACT_PRIVATE标识时, 会被归类为“Private 属性”).</span> <span style="color: #0000ff;">@protected</span> <span style="color: #0000ff;">int</span> _protectedInt; <span style="color: #008000;">//</span><span style="color: #008000;">!< protected成员变量 (仅Doxygen, 会被归类为“Protected 属性”).</span> <span style="color: #0000ff;">id</span><MyDocDelegate> _delegate; <span style="color: #008000;">//</span><span style="color: #008000;">!< 委托变量.</span> <span style="color: #000000;"> @package </span><span style="color: #0000ff;">int</span> _packageInt; <span style="color: #008000;">//</span><span style="color: #008000;">!< 包内成员变量 (仅Doxygen, 会被归类为“Protected 属性”).</span> <span style="color: #0000ff;">@public</span> <span style="color: #0000ff;">int</span> _publicInt; <span style="color: #008000;">//</span><span style="color: #008000;">!< 公开成员变量 (仅Doxygen, 会被归类为“Public 属性”).</span> }</pre> </div> <p> </p> <h2><br>二、编码演练</h2> <p>  前面说了很多理论知识,现在创建一个项目来演练一下吧。</p> <p>  打开Xcode,新建一个名为“MyDoc”的“Single View Application”的iOS项目。<br><a href="http://img.e-com-net.com/image/info8/e08a3f901a794fcaaa8724297717e156.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/e08a3f901a794fcaaa8724297717e156.jpg" alt="Objective-C规范注释心得——同时兼容appledoc(docset、html)与doxygen(html、pdf)的文档生成_第1张图片" width="650" height="439" style="border:1px solid black;"></a></p> <p>  然后打开MyDocViewController.h,在里面练习注释。<br>  全部代码——</p> <div class="cnblogs_code"> <img id="code_img_closed_77c22d87-0979-4df0-a1bb-0ea9c43d9372" class="code_img_closed" src="http://img.e-com-net.com/image/info8/2b246dbcfe82488397e9aa432bbc4e31.gif" alt="" width="0" height="0"> <img id="code_img_opened_77c22d87-0979-4df0-a1bb-0ea9c43d9372" class="code_img_opened" style="display: none;" src="http://img.e-com-net.com/image/info8/118a089070624154b4c3dd9bad0bd075.gif" alt="" width="0" height="0"> <div id="cnblogs_code_open_77c22d87-0979-4df0-a1bb-0ea9c43d9372" class="cnblogs_code_hide"> <pre><span style="color: #008000;">/*</span><span style="color: #008000;">* * @file MyDocViewController.h * @brief 主页面. * @author [zyl910](</span><span style="color: #008000; text-decoration: underline;">http://www.cnblogs.com/zyl910/</span><span style="color: #008000;">) * @version 1.0 * @date 2013-06-07 * * # update (更新日志) * * [2013-06-07] <zyl910> v1.0 * * + v1.0版发布. * </span><span style="color: #008000;">*/</span> <span style="color: #0000ff;">#import</span> <UIKit/UIKit.h> <span style="color: #0000ff;">#define</span> BUFSIZE 100 <span style="color: #008000;">//</span><span style="color: #008000;">!< 缓冲区大小 (简单宏, 仅Doxygen).</span> <span style="color: #008000;">/*</span><span style="color: #008000;">* * @brief 最小值 (参数宏, 仅Doxygen). * * @param a 值a. * @param b 值b. * * @return 返回两者中的最小值. </span><span style="color: #008000;">*/</span> <span style="color: #0000ff;">#define</span> min(a,b) ( ((a)<(b)) ? (a) : (b) ) <span style="color: #808080;">///</span><span style="color: #008000;"> Objective-C 文档工具枚举 (枚举, 仅Doxygen).</span> typedef <span style="color: #0000ff;">enum</span><span style="color: #000000;"> _ObjCDocToolEnum{ ObjCDocToolEnumAppleDoc </span>= <span style="color: #800080;">1</span>, <span style="color: #008000;">//</span><span style="color: #008000;">!< AppleDoc. </span><span style="color: #008000; text-decoration: underline;">http://appledoc.gentlebytes.com/</span><span style="color: #008000;"> .</span> ObjCDocToolEnumDoxygen, <span style="color: #008000;">//</span><span style="color: #008000;">!< Doxygen. </span><span style="color: #008000; text-decoration: underline;">http://www.stack.nl/</span><span style="color: #008000;">~dimitri/doxygen/ .</span> <span style="color: #000000;">}ObjCDocToolEnum; </span><span style="color: #008000;">/*</span><span style="color: #008000;">* 整数矩形 (结构体, 仅Doxygen). * * 结构体的详细描述. </span><span style="color: #008000;">*/</span><span style="color: #000000;"> typedef </span><span style="color: #0000ff;">struct</span><span style="color: #000000;"> _RectInt { </span><span style="color: #0000ff;">int</span> x; <span style="color: #008000;">//</span><span style="color: #008000;">!< 横坐标.</span> <span style="color: #0000ff;">int</span> y; <span style="color: #008000;">//</span><span style="color: #008000;">!< 纵坐标.</span> <span style="color: #0000ff;">int</span> width; <span style="color: #008000;">//</span><span style="color: #008000;">!< 宽度.</span> <span style="color: #0000ff;">int</span> height; <span style="color: #008000;">//</span><span style="color: #008000;">!< 高度.</span> }RectInt, *PRectInt; <span style="color: #008000;">//</span><span style="color: #008000;">!< 整数矩形的指针.</span> typedef <span style="color: #0000ff;">const</span> RectInt* PCRectInt; <span style="color: #008000;">//</span><span style="color: #008000;">!< 整数矩形的常量指针.</span> <span style="color: #808080;">///</span><span style="color: #008000;"> 浮点数的字节(联合体, 仅Doxygen).</span> <span style="color: #000000;">typedef union _FloatByte { </span><span style="color: #0000ff;">float</span> f; <span style="color: #008000;">//</span><span style="color: #008000;">!< 单精度浮点数.</span> unsigned <span style="color: #0000ff;">char</span> bytes[<span style="color: #800080;">4</span>]; <span style="color: #008000;">//</span><span style="color: #008000;">!< 4个字节.</span> <span style="color: #000000;">} FloatByte; </span><span style="color: #008000;">/*</span><span style="color: #008000;">* * @brief 动作回调函数. * * @param sender 发送者. * @param userdata 自定义数据. </span><span style="color: #008000;">*/</span><span style="color: #000000;"> typedef </span><span style="color: #0000ff;">void</span> (*ActionCallback)(<span style="color: #0000ff;">void</span>* sender, <span style="color: #0000ff;">void</span>*<span style="color: #000000;"> userdata); </span><span style="color: #008000;">/*</span><span style="color: #008000;">* * @brief 动作块函数. * * @param sender 发送者. * @param userdata 自定义数据. </span><span style="color: #008000;">*/</span><span style="color: #000000;"> typedef </span><span style="color: #0000ff;">void</span> (^ActionHandler)(<span style="color: #0000ff;">id</span> sender, <span style="color: #0000ff;">id</span><span style="color: #000000;"> userdata); </span><span style="color: #808080;">///</span><span style="color: #008000;"> 文档A.</span> <span style="color: #0000ff;">@interface</span><span style="color: #000000;"> DocA : NSObject </span><span style="color: #0000ff;">@end</span><span style="color: #000000;">; </span><span style="color: #008000;">/*</span><span style="color: #008000;">* 文档B. * * 文档B的详细描述. </span><span style="color: #008000;">*/</span> <span style="color: #0000ff;">@interface</span><span style="color: #000000;"> DocB : NSObject </span><span style="color: #0000ff;">@end</span><span style="color: #000000;">; </span><span style="color: #808080;">///</span><span style="color: #008000;"> Objective-C 文档委托.</span> <span style="color: #0000ff;">@protocol</span> MyDocDelegate <NSObject> <span style="color: #0000ff;">@end</span> <span style="color: #008000;">/*</span><span style="color: #008000;">* 主页面. * * 主页面的详细描述. * * 引用短代码, 如 `someMethodByStr:` . * * 示例代码: * * int sum=0; * for(int i=1; i<=10; ++i) { * sum += i; * } * * 无序列表: * * - abc * - xyz * - rgb * * 有序列表: * * 1. first. * 2. second. * 3. third. * * 多级列表: * * - xyz * - x * - y * - z * - rgb * - red * 1. first. * 1. alpha. * 2. beta. * 2. second. * 3. third. * - green * - blue * * 以下是仅doxygen可见内容. 因为appledoc不支持类型注释中的\@see标签(但支持在属性、方法中使用),会导致后续内容丢弃. * * @see str * @see someMethodByStr: * @see MyDocAppDelegate * @see [MyDocAppDelegate window] // 仅 appledoc. doxygen仅能识别出左边的类名. * @see [MyDocAppDelegate someMethodByFloat:] // 仅 appledoc. doxygen仅能识别出左边的类名. * @see MyDocAppDelegate.window // 仅 doxygen. appledoc仅能识别出左边的类名. * @see MyDocAppDelegate.someMethodByFloat: // 仅 doxygen. appledoc仅能识别出左边的类名. * * end. * </span><span style="color: #008000;">*/</span> <span style="color: #0000ff;">@interface</span><span style="color: #000000;"> MyDocViewController : UIViewController { </span><span style="color: #0000ff;">@private</span> <span style="color: #0000ff;">int</span> _privateInt; <span style="color: #008000;">//</span><span style="color: #008000;">!< 私有成员变量 (仅Doxygen具有EXTRACT_PRIVATE标识时, 会被归类为“Private 属性”).</span> <span style="color: #0000ff;">@protected</span> <span style="color: #0000ff;">int</span> _protectedInt; <span style="color: #008000;">//</span><span style="color: #008000;">!< protected成员变量 (仅Doxygen, 会被归类为“Protected 属性”).</span> <span style="color: #0000ff;">id</span><MyDocDelegate> _delegate; <span style="color: #008000;">//</span><span style="color: #008000;">!< 委托变量.</span> <span style="color: #000000;"> @package </span><span style="color: #0000ff;">int</span> _packageInt; <span style="color: #008000;">//</span><span style="color: #008000;">!< 包内成员变量 (仅Doxygen, 会被归类为“Protected 属性”).</span> <span style="color: #0000ff;">@public</span> <span style="color: #0000ff;">int</span> _publicInt; <span style="color: #008000;">//</span><span style="color: #008000;">!< 公开成员变量 (仅Doxygen, 会被归类为“Public 属性”).</span> <span style="color: #000000;">} </span><span style="color: #0000ff;">#pragma</span> mark - property <span style="color: #808080;">///</span><span style="color: #008000;"> 数值属性.</span> <span style="color: #000000;">@property (nonatomic,assign) NSInteger num; </span><span style="color: #008000;">/*</span><span style="color: #008000;">* 字符串属性. * * 属性的详细描述. </span><span style="color: #008000;">*/</span><span style="color: #000000;"> @property (nonatomic,strong) NSString</span>*<span style="color: #000000;"> str; </span><span style="color: #008000;">//</span><span style="color: #008000;"> 测试行尾注释.</span> @property (nonatomic,strong) NSString* strend1; <span style="color: #008000;">/*</span><span style="color: #008000;">*< 行尾注释1. appledoc不支持会变为下一项的注释, doxygen 支持, 根据英文句号自动切分详细描述与详细描述. </span><span style="color: #008000;">*/</span><span style="color: #000000;"> @property (nonatomic,strong) NSString</span>* strend2; <span style="color: #008000;">/*</span><span style="color: #008000;">!< 行尾注释2. appledoc不支持会变为下一项的注释, doxygen 支持, 会全部当作详细描述, 而缺少详细描述. </span><span style="color: #008000;">*/</span><span style="color: #000000;"> @property (nonatomic,strong) NSString</span>* strend3; <span style="color: #808080;">///</span><span style="color: #808080;">< 行尾注释3. appledoc不支持会变为下一项的注释, doxygen 支持. </span><span style="color: #008000;">@property (nonatomic,strong) NSString* strend4; //!</span><span style="color: #808080;">< 行尾注释4. appledoc不支持会会忽略, doxygen 支持. </span><span style="color: #008000;">@property (nonatomic,assign) int dummy; </span><span style="color: #808080;">///</span><span style="color: #008000;"> 枚举的属性.</span> <span style="color: #000000;">@property (nonatomic, assign) ObjCDocToolEnum docTool; </span><span style="color: #808080;">///</span><span style="color: #008000;"> 结构体的属性.</span> <span style="color: #000000;">@property (nonatomic, assign) RectInt rectInt; </span><span style="color: #808080;">///</span><span style="color: #008000;"> 结构体常量指针的属性.</span> <span style="color: #000000;">@property (nonatomic, assign) PCRectInt prectInt; </span><span style="color: #808080;">///</span><span style="color: #008000;"> 联合体的属性.</span> <span style="color: #000000;">@property (nonatomic, assign) FloatByte floatByte; </span><span style="color: #808080;">///</span><span style="color: #008000;"> 委托.</span> @property (nonatomic, strong) <span style="color: #0000ff;">id</span><MyDocDelegate> <span style="color: #0000ff;">delegate</span><span style="color: #000000;">; </span><span style="color: #008000;">/*</span><span style="color: #008000;">* 链接测试. * * 链接: * * - </span><span style="color: #008000; text-decoration: underline;">http://appledoc.gentlebytes.com/</span><span style="color: #008000;"> : 直接写url链接. * - [Doxygen](</span><span style="color: #008000; text-decoration: underline;">http://www.stack.nl/</span><span style="color: #008000;">~dimitri/doxygen/) : 为链接提供文本 . * - MyDocDelegate : 接口. * - DocA : 类. * - [文档B](DocB) : 类的链接文本.(仅appledoc) * - [文档B](@ref DocB) : 为\@ref链接提供文本 (仅doxygen. appledoc会把\@ref当作文本而生成错误的链接). * - @ref DocB : \@ref链接 (仅doxygen. appledoc会把\@ref当作文本). * * @see str * @see someMethodByStr: * @see MyDocAppDelegate * @see [MyDocAppDelegate window] // 仅 appledoc. doxygen仅能识别出左边的类名. * @see [MyDocAppDelegate someMethodByFloat:] // 仅 appledoc. doxygen仅能识别出左边的类名. * @see MyDocAppDelegate.window // 仅 doxygen. appledoc仅能识别出左边的类名. * @see MyDocAppDelegate.someMethodByFloat: // 仅 doxygen. appledoc仅能识别出左边的类名. </span><span style="color: #008000;">*/</span><span style="color: #000000;"> @property (nonatomic,strong) NSString</span>*<span style="color: #000000;"> alink; </span><span style="color: #008000;">/*</span><span style="color: #008000;">* 本地链接测试1 (仅appledoc). * * 链接: * * - str : 自身属性. * - someMethodByStr: : 自身方法. * - MyDocViewController : 自身类. // appledoc无法识别. * - MyDocAppDelegate : 外部类. </span><span style="color: #008000;">*/</span><span style="color: #000000;"> @property (nonatomic,strong) NSString</span>*<span style="color: #000000;"> alinklocal1; </span><span style="color: #008000;">/*</span><span style="color: #008000;">* 本地链接测试2 (仅appledoc). * * 只要出现了 \[ 类 成员 \] 形式的链接, 本地链接便会实效. * * 链接: * * - str : 自身属性. * - someMethodByStr: : 自身方法. * - MyDocViewController : 自身类. // appledoc无法识别. * - MyDocAppDelegate : 外部类. * - [MyDocViewController str] : 自身属性. </span><span style="color: #008000;">*/</span><span style="color: #000000;"> @property (nonatomic,strong) NSString</span>*<span style="color: #000000;"> alinklocal2; </span><span style="color: #008000;">/*</span><span style="color: #008000;">* 本地链接测试3 (仅appledoc). * * 只要出现了 \[ 类 成员 \] 形式的链接, 本地链接便会实效. * * 链接: * * - str : 自身属性. * - someMethodByStr: : 自身方法. * - MyDocViewController : 自身类. // appledoc无法识别. * - MyDocAppDelegate : 外部类. * - [MyDocAppDelegate window] : 外部类属性. * - [MyDocAppDelegate someMethodByFloat:] : 外部类方法. </span><span style="color: #008000;">*/</span><span style="color: #000000;"> @property (nonatomic,strong) NSString</span>*<span style="color: #000000;"> alinklocal3; </span><span style="color: #0000ff;">#pragma</span> mark - method <span style="color: #808080;">///</span><span style="color: #008000;"> 简单方法.</span> - (<span style="color: #0000ff;">void</span><span style="color: #000000;">)someMethod; </span><span style="color: #008000;">/*</span><span style="color: #008000;">* * @brief 带整数参数的方法. * * @param value 值. * * @return 返回value. </span><span style="color: #008000;">*/</span> - (<span style="color: #0000ff;">int</span>)someMethodByInt:(<span style="color: #0000ff;">int</span><span style="color: #000000;">)value; </span><span style="color: #008000;">/*</span><span style="color: #008000;">* * @brief 带字符串参数的方法. * * @param value 值. * * @return 返回value. * * @exception NSException 可能抛出的异常. * * @see someMethod * @see someMethodByInt: * @warning 警告: appledoc中显示为蓝色背景, Doxygen中显示为红色竖条. * @bug 缺陷: appledoc中显示为黄色背景, Doxygen中显示为绿色竖条. </span><span style="color: #008000;">*/</span> - (NSString*)someMethodByStr:(NSString*<span style="color: #000000;">)value; </span><span style="color: #008000;">/*</span><span style="color: #008000;">* * @brief 取得静态变量值的类方法. * * @return 返回_classInt静态变量的值. </span><span style="color: #008000;">*/</span> + (<span style="color: #0000ff;">int</span><span style="color: #000000;">)classInt; </span><span style="color: #0000ff;">@end</span> <span style="color: #808080;">///</span><span style="color: #008000;"> 主页面的动作相关操作.</span> <span style="color: #0000ff;">@interface</span><span style="color: #000000;"> MyDocViewController (Action) </span><span style="color: #008000;">/*</span><span style="color: #008000;">* * @brief 调用动作回调函数 * * @param sender 发送者. * @param userdata 自定义数据. * @param handler 处理函数. * * @see callActionHandler:userdata:handler: </span><span style="color: #008000;">*/</span> - (<span style="color: #0000ff;">void</span>)callActionCallback:(<span style="color: #0000ff;">void</span>*)sender userdata:(<span style="color: #0000ff;">void</span>*<span style="color: #000000;">)userdata handler:(ActionCallback)handler; </span><span style="color: #008000;">/*</span><span style="color: #008000;">* * @brief 调用动作块函数. * * @param sender 发送者. * @param userdata 自定义数据. * @param handler 处理函数. * * @see callActionCallback:userdata:handler: </span><span style="color: #008000;">*/</span> - (<span style="color: #0000ff;">void</span>)callActionHandler:(<span style="color: #0000ff;">id</span>)sender userdata:(<span style="color: #0000ff;">id</span><span style="color: #000000;">)userdata handler:(ActionHandler)handler; </span><span style="color: #0000ff;">@end</span></pre> </div> <span class="cnblogs_code_collapse">MyDocViewController.h</span> </div> <p> </p> <p>  代码写好后,便可以使用appledoc或doxygen生成文档了,详见下面两章。</p> <h1>三、使用appledoc生成文档(docset、html)</h1> <h2>3.1 安装appledoc</h2> <p>  安装appledoc十分简单。打开终端,输入以下命令——</p> <div class="cnblogs_code"> <pre>git clone git:<span style="color: #008000;">//</span><span style="color: #008000;">github.com/tomaz/appledoc.git</span> <span style="color: #000000;">cd appledoc </span><span style="color: #0000ff;">sudo</span> <span style="color: #0000ff;">sh</span> <span style="color: #0000ff;">install</span>-appledoc.<span style="color: #0000ff;">sh</span></pre> </div> <p> </p> <h2>3.2 生成docset</h2> <p>  对于最新版本的appledoc来说,它默认时是生成docset文档并集成到xcode。<br>  在终端中使用cd命令进入项目的文件夹,然后执行下列命令——</p> <div class="cnblogs_code"> <pre>appledoc --output ./doc --project-name objcdoc --project-company <span style="color: #800000;">"</span><span style="color: #800000;">zyl910</span><span style="color: #800000;">"</span> --company-<span style="color: #0000ff;">id</span> <span style="color: #800000;">"</span><span style="color: #800000;">cn.com.zyl910</span><span style="color: #800000;">"</span> .</pre> </div> <p>  注——<br>--output ./doc:设置输出目录为“./doc”。<br>--project-name objcdoc:设置项目名为“objcdoc”。<br>--project-company "zyl910":设置公司名为“zyl910”。<br>--company-id "cn.com.zyl910":设置公司id为“cn.com.zyl910”。<br>.:当前目录。<br><a href="http://img.e-com-net.com/image/info8/0a61bb643a9d43afb3fcf0ca8d3768c0.png" target="_blank"><img src="http://img.e-com-net.com/image/info8/0a61bb643a9d43afb3fcf0ca8d3768c0.png" alt="Objective-C规范注释心得——同时兼容appledoc(docset、html)与doxygen(html、pdf)的文档生成_第2张图片" width="587" height="368" style="border:1px solid black;"></a></p> <p>  当该命令完成后,打开xcode中的Organizer - Documentation,会发现其中新增了帮助文档——<br><a href="http://img.e-com-net.com/image/info8/137376fa3eea4bf592643a0c23097095.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/137376fa3eea4bf592643a0c23097095.jpg" alt="Objective-C规范注释心得——同时兼容appledoc(docset、html)与doxygen(html、pdf)的文档生成_第3张图片" width="650" height="408" style="border:1px solid black;"></a></p> <h2><br>3.3 生成html</h2> <p>  当需要html文档时,可以加上“--no-create-docset”——</p> <div class="cnblogs_code"> <pre>appledoc --no-create-docset --output ./doc --project-name objcdoc --project-company <span style="color: #800000;">"</span><span style="color: #800000;">zyl910</span><span style="color: #800000;">"</span> --company-<span style="color: #0000ff;">id</span> <span style="color: #800000;">"</span><span style="color: #800000;">cn.com.zyl910</span><span style="color: #800000;">"</span> .</pre> </div> <p><a href="http://img.e-com-net.com/image/info8/160564ca88014268bda6714155184e8e.png" target="_blank"><img src="http://img.e-com-net.com/image/info8/160564ca88014268bda6714155184e8e.png" alt="Objective-C规范注释心得——同时兼容appledoc(docset、html)与doxygen(html、pdf)的文档生成_第4张图片" width="587" height="368" style="border:1px solid black;"></a></p> <p>  当该命令完成后,使用浏览器打开doc/html/index.html——<br><a href="http://img.e-com-net.com/image/info8/b8b25bbc11e14df19111e3caa692811c.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/b8b25bbc11e14df19111e3caa692811c.jpg" alt="Objective-C规范注释心得——同时兼容appledoc(docset、html)与doxygen(html、pdf)的文档生成_第5张图片" width="650" height="504" style="border:1px solid black;"></a></p> <h1>四、使用doxygen生成文档(html、pdf)</h1> <h2>4.1 安装doxygen</h2> <p>  doxygen支持源码编译安装与dmg安装。想省事的话,可以选择dmg安装。去doxygen官网(http://www.stack.nl/~dimitri/doxygen/download.html)下载最新的dmg。<br>  dmg下载下来后,双击加载dmg,然后把.app文件拖入应用程序文件夹,便完成了安装。</p> <h2>4.2 生成html</h2> <p>  doxygen有图形界面,可通过Launchpad打开。</p> <p>  在step 1中选择好项目的路径。<br>  step 2默认是Wizard->Project页面,在其中——<br>1) 在“Project name”中填写项目名。<br>2) 勾选“Sacn recursively”,扫描所有的子文件夹。<br>3) 在“Destination directory”中填写好文档的输出目录。这里我填的是“docs”。<br><a href="http://img.e-com-net.com/image/info8/521d012af30746ddb441e48b0583a0bb.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/521d012af30746ddb441e48b0583a0bb.jpg" alt="Objective-C规范注释心得——同时兼容appledoc(docset、html)与doxygen(html、pdf)的文档生成_第6张图片" width="650" height="507" style="border:1px solid black;"></a></p> <p>  点击中间的“Expert”切换Expert->Project页面,在其中——<br>1) 将“OUTPUT_LANGUAGE”设为“Chinese”,使用简体中文。<br>2) 勾选“JAVADOC_AUTOBRIEF”,自动将注释的第1段识别为简要描述。<br><a href="http://img.e-com-net.com/image/info8/52b6e69ee97f4cd290ebc866737ee608.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/52b6e69ee97f4cd290ebc866737ee608.jpg" alt="Objective-C规范注释心得——同时兼容appledoc(docset、html)与doxygen(html、pdf)的文档生成_第7张图片" width="650" height="507" style="border:1px solid black;"></a><br><a href="http://img.e-com-net.com/image/info8/2bc305e5b8ee46d7a9ba9c1d4bf9ca45.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/2bc305e5b8ee46d7a9ba9c1d4bf9ca45.jpg" alt="Objective-C规范注释心得——同时兼容appledoc(docset、html)与doxygen(html、pdf)的文档生成_第8张图片" width="650" height="507" style="border:1px solid black;"></a></p> <p>  点击中间的“Run”切换Run页面,然后点击“Run doxygen”按钮生成文档。<br><a href="http://img.e-com-net.com/image/info8/7762e3f221204888936673152aa8af54.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/7762e3f221204888936673152aa8af54.jpg" alt="Objective-C规范注释心得——同时兼容appledoc(docset、html)与doxygen(html、pdf)的文档生成_第9张图片" width="650" height="507" style="border:1px solid black;"></a></p> <p>  当文档生成完毕后,使用浏览器打开docs/html/index.html——<br><a href="http://img.e-com-net.com/image/info8/72709f221738481b919570f2bf870b03.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/72709f221738481b919570f2bf870b03.jpg" alt="Objective-C规范注释心得——同时兼容appledoc(docset、html)与doxygen(html、pdf)的文档生成_第10张图片" width="650" height="504" style="border:1px solid black;"></a></p> <h2><br>4.3 生成pdf</h2> <p>  doxygen默认会为生成pdf做好准备。切换到Wizard->Project,会发现它自动勾选了“LaTex”与“as intermediate format for hyperlinked PDF”。<br><a href="http://img.e-com-net.com/image/info8/2c9f70034a714825b5085e060d2e05ff.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/2c9f70034a714825b5085e060d2e05ff.jpg" alt="Objective-C规范注释心得——同时兼容appledoc(docset、html)与doxygen(html、pdf)的文档生成_第11张图片" width="650" height="507" style="border:1px solid black;"></a><br>  doxygen本身并不能直接输出pdf文件,而是生成了latex目录,其中有一个 makefile 文件。若系统中装好了pdflatex,可在latex目录中运行“make”命令来生成pdf文件。<br>  怎样才能装好pdflatex呢?mac平台可安装MacTeX。打开 http://www.tug.org/mactex/ ,下载  MacTeX.pkg (约2.1GB)。MacTeX.pkg下载好后,可双击运行,根据向导来安装。</p> <p>  环境装好之后,当在latex目录中运行“make”命令来生成pdf文件时,你会发现——纯英文文档能顺利生成pdf;而含有中文时,不能顺利生成pdf文件。</p> <p>  对于latex排版,doxygen其实已经做了很多准备,比如——源文件是UTF-8编码,并默认使用了utf8 package。理论上是支持多国语言的。<br>  可对于中文来说,还需要加载 CJKutf8 package,并配置好CJK环境。这才能顺利的使用中文。</p> <p>  用文本编辑器打开docxygen生成的latex目录中的refman.tex。找到“\begin{document}”这一行,将其修改为——</p> <div class="cnblogs_code"> <pre><span style="color: #000000;">\usepackage{CJKutf8} \begin{document} \begin{CJK}{UTF8}{gbsn}</span></pre> </div> <p>  然后再找到“\end{document}”这一行,将其修改为——</p> <div class="cnblogs_code"> <pre><span style="color: #000000;">\end{CJK} \end{document}</span></pre> </div> <p>  保存并关闭refman.tex。<br>  然后打开终端,使用cd命令进入latex目录,然后执行“make”命令。<br><a href="http://img.e-com-net.com/image/info8/06cf4b0893e84f2bad7939057fa81dbe.png" target="_blank"><img src="http://img.e-com-net.com/image/info8/06cf4b0893e84f2bad7939057fa81dbe.png" alt="Objective-C规范注释心得——同时兼容appledoc(docset、html)与doxygen(html、pdf)的文档生成_第12张图片" width="587" height="368" style="border:1px solid black;"></a></p> <p><br>  执行完毕后后,该目录中会出现“refman.pdf”——<br><a href="http://img.e-com-net.com/image/info8/42b835de79e94c579cf5ab4f324d046e.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/42b835de79e94c579cf5ab4f324d046e.jpg" alt="Objective-C规范注释心得——同时兼容appledoc(docset、html)与doxygen(html、pdf)的文档生成_第13张图片" width="650" height="589" style="border:1px solid black;"></a></p> <p><br>参考文献——<br>[appledoc]《Comments formatting style》. Gentle Bytes. http://gentlebytes.com/appledoc-docs-comments/<br>[doxygen]《Markdown support》. doxygen. http://www.stack.nl/~dimitri/doxygen/manual/markdown.html<br>[doxygen]《Special Commands》. doxygen. http://www.stack.nl/~dimitri/doxygen/manual/commands.html<br>《Amazing Apple-like Documentation》. 2011-11-29. http://www.cocoanetics.com/2011/11/amazing-apple-like-documentation/<br>《使用Objective-C的文档生成工具:appledoc》. 唐巧, 2012-02-01. http://blog.devtang.com/blog/2012/02/01/use-appledoc-to-generate-xcode-doc/<br>《关于查看自已写的方法的“描述”(AppleDoc)》. Rainbird, 2012-11-25. http://blog.cnrainbird.com/index.php/2012/11/25/guan_yu_cha_kan_zi_yi_xie_de_fang_fa_de_miao_shu_appledoc/<br>《用Doxygen为Objective-C代码生成文档》. Seven's, 2011-11-20. http://www.dreamingwish.com/dream-2011/use-doxygen-to-generate-documentation-Objective-C-code.html<br>《Xcode4快速Doxygen文档注释 — 简明图文教程(3分钟后爽歪歪)》. chukong-inc, 2012-05-16. http://blog.chukong-inc.com/index.php/2012/05/16/xcode4_fast_doxygen/<br>《使用doxygen生成中文pdf文档》. zyl910, 2013-06-02. http://www.cnblogs.com/zyl910/archive/2013/06/02/doxygen_pdf_chinese.html</p> <p><br>源码下载—— <br>http://files.cnblogs.com/zyl910/objcdoc.zip</p> <p> </p> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1283334312556511232"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(Objective-C规范注释心得——同时兼容appledoc(docset、html)与doxygen(html、pdf)的文档生成)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1950233451282100224.htm" title="python 读excel每行替换_Python脚本操作Excel实现批量替换功能" target="_blank">python 读excel每行替换_Python脚本操作Excel实现批量替换功能</a> <span class="text-muted">weixin_39646695</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E8%AF%BBexcel%E6%AF%8F%E8%A1%8C%E6%9B%BF%E6%8D%A2/1.htm">读excel每行替换</a> <div>Python脚本操作Excel实现批量替换功能大家好,给大家分享下如何使用Python脚本操作Excel实现批量替换。使用的工具Openpyxl,一个处理excel的python库,处理excel,其实针对的就是WorkBook,Sheet,Cell这三个最根本的元素~明确需求原始excel如下我们的目标是把下面excel工作表的sheet1表页A列的内容“替换我吧”批量替换为B列的“我用来替换的</div> </li> <li><a href="/article/1950233199242178560.htm" title="x86-64汇编语言训练程序与实战" target="_blank">x86-64汇编语言训练程序与实战</a> <span class="text-muted">十除以十等于一</span> <div>本文还有配套的精品资源,点击获取简介:汇编语言是一种低级语言,与机器代码紧密相关,特别适用于编写系统级代码及性能要求高的应用。nasm编译器是针对x86和x86-64架构的汇编语言编译器,支持多种语法风格和指令集。项目Euler提供数学和计算机科学问题,鼓励编程技巧应用,前100个问题的答案可共享。x86-64架构扩展了寄存器数量并引入新指令,提升了数据处理效率。学习汇编语言能够深入理解计算机底层</div> </li> <li><a href="/article/1950233167633903616.htm" title="男士护肤品哪个牌子好?十大男士护肤品排行榜" target="_blank">男士护肤品哪个牌子好?十大男士护肤品排行榜</a> <span class="text-muted">高省APP珊珊</span> <div>很多男生意识到护肤的必要性,开始着手护肤,但不知道该选哪个男士护肤品品牌使用好。目前市面上很多男士护肤品品牌,可谓琳琅满目,让人眼花缭乱。男士挑选护肤品时,根据自己皮肤需求去正规渠道挑选合适的知名护肤品比较放心靠谱。高省APP,是2021年推出的平台,0投资,0风险、高省APP佣金更高,模式更好,终端用户不流失。【高省】是一个自用省钱佣金高,分享推广赚钱多的平台,百度有几百万篇报道,也期待你的加入</div> </li> <li><a href="/article/1950233072825856000.htm" title="三菱PLC全套学习资料及应用手册" target="_blank">三菱PLC全套学习资料及应用手册</a> <span class="text-muted">good2know</span> <div>本文还有配套的精品资源,点击获取简介:三菱PLC作为工业自动化领域的核心设备,其系列产品的学习和应用需要全面深入的知识。本次资料包为学习者提供从基础到进阶的全方位学习资源,包括各种型号PLC的操作手册、编程指南、软件操作教程以及实际案例分析,旨在帮助用户系统掌握PLC的编程语言、指令系统及在各类工业应用中的实施。1.三菱PLC基础知识入门1.1PLC的基本概念可编程逻辑控制器(PLC)是工业自动化</div> </li> <li><a href="/article/1950233040592629760.htm" title="2022-10-20" target="_blank">2022-10-20</a> <span class="text-muted">体力劳动者</span> <div>不因感觉稍纵即逝就不加记录。在女儿睡觉后我记下今天的小故事。接手新班级后,今天是第二次收到家长的感谢信(微信)。是我表扬次数最多的两位学生家长致来的感谢,他们明显感受到孩子自信、阳光了不少,写作业由被动变为了主动,家庭氛围也由鸡飞狗跳变成了其乐融融。在被顽皮的学生气得头晕之后,我感到了久违的价值感,责任感甚至使命感,我回复家长这样一句话:我们也需要家长的反馈好让我们的教育工作更有劲头。我也认识到,</div> </li> <li><a href="/article/1950232912192401408.htm" title="程翔授《评价一篇记叙文》" target="_blank">程翔授《评价一篇记叙文》</a> <span class="text-muted">行吟斯基</span> <div>桂林十一中高一2中学生自读程老师学生文章板书课题师巡看。看完举手。问:它是记叙文。不商量。独立打分。学生评价打分。师:高低都正常,不受干扰。师巡,略评。打完举手。调查:分层次举手——高分先举手。最低分。最高95分。最低45分。女:差距太大!师:同一篇,相差55分。若是你的文章,愿落谁手?男:身临其境感觉。师:你有此经历?没也没关系。女:不优美……,结尾无升华……无感悟……师:辞藻不美?(师追问)男</div> </li> <li><a href="/article/1950232910862807040.htm" title="《玉骨遥》:大司命为什么不杀朱颜?原因没那么简单" target="_blank">《玉骨遥》:大司命为什么不杀朱颜?原因没那么简单</a> <span class="text-muted">windy天意晚晴</span> <div>《玉骨遥》里,朱颜就是时影的命劫之人。重明与时影早就知道,他们一直瞒着大司命,如今大司命也知道了真相。可是大司命却没有杀朱颜,而是给朱颜下了诛心咒,还说时影的命劫已经破了,真的如此吗?1、计划总是赶不上变化的大司命从目前剧情来说,大司命还不如时影,他信心十足的事情总会有纰漏。他不让时影见命劫之女,结果时影还是遇上了。他想让时影走火入魔,一心复仇,结果时影在朱颜的劝说下放下了仇恨。大司命让时影开山收</div> </li> <li><a href="/article/1950232820773351424.htm" title="移动端城市区县二级联动选择功能实现包" target="_blank">移动端城市区县二级联动选择功能实现包</a> <span class="text-muted">good2know</span> <div>本文还有配套的精品资源,点击获取简介:本项目是一套为移动端设计的jQuery实现方案,用于简化用户在选择城市和区县时的流程。它包括所有必需文件:HTML、JavaScript、CSS及图片资源。通过动态更新下拉菜单选项,实现城市到区县的联动效果,支持数据异步加载。开发者可以轻松集成此功能到移动网站或应用,并可基于需求进行扩展和优化。1.jQuery移动端解决方案概述jQuery技术简介jQuery</div> </li> <li><a href="/article/1950232782412247040.htm" title="日更006 终极训练营day3" target="_blank">日更006 终极训练营day3</a> <span class="text-muted">懒cici</span> <div>人生创业课(2)今天的主题:学习方法一:遇到有用的书,反复读,然后结合自身实际,列践行清单,不要再写读书笔记思考这本书与我有什么关系,我在哪些地方能用到,之后我该怎么用方法二:读完书没映像怎么办?训练你的大脑,方法:每读完一遍书,立马合上书,做一场分享,几分钟都行对自己的学习要求太低,要逼自己方法三:学习深度不够怎么办?找到细分领域的榜样,把他们的文章、书籍、产品都体验一遍,成为他们的超级用户,向</div> </li> <li><a href="/article/1950232783670538240.htm" title="自律打卡第四天:比昨天进步一点点" target="_blank">自律打卡第四天:比昨天进步一点点</a> <span class="text-muted">花儿的念想</span> <div>今天新闻我们县城又确诊了一例,截止目前已经确诊的三例了,打开,看了一篇简友写的武汉的真实情况,有病住不了院,还没等到床位已经去世的消息,心里更加的难受,武汉尚且这样,如果是我们这没有高速没有火车的十八线的小县城发生这种情况,那情况将是更加的不堪设想,不敢想,唯有祈求灾难早点快去,平安才是最大的福气。突然觉得我的自律打卡,比昨天进步一点点。更希望疫情战争每一天都要比昨天好一点,希望一觉醒来听到的是好</div> </li> <li><a href="/article/1950232781174927360.htm" title="15个小技巧,让我的Windows电脑更好用了!" target="_blank">15个小技巧,让我的Windows电脑更好用了!</a> <span class="text-muted">曹元_</span> <div>01.桌面及文档处理第一部分的技巧,主要是围绕桌面的一些基本操作,包括主题设置、常用文档文件快捷打开的多种方式等等。主题换色默认情况下,我们的Win界面可能就是白色的文档界面,天蓝色的图表背景,说不出哪里不好看,但是就是觉得不够高级。imageimage说到高级感,本能第一反应就会和暗色模式联想起来,如果我们将整个界面换成黑夜模式的话,它会是这样的。imageimage更改主题颜色及暗色模式,我们</div> </li> <li><a href="/article/1950232316974526464.htm" title="(二)SAP Group Reporting (GR) 核心子模块功能及数据流向架构解析" target="_blank">(二)SAP Group Reporting (GR) 核心子模块功能及数据流向架构解析</a> <span class="text-muted"></span> <div>数据如何从子公司流转到合并报表的全过程,即数据采集→合并引擎→报表输出,特别是HANA内存计算如何优化传统ETL瓶颈。SAPGroupReporting(GR)核心模块功能及数据流向的架构解析,涵盖核心组件、数据处理流程和关键集成点,适用于S/4HANA1809+版本:一、核心功能模块概览模块功能关键事务码/FioriApp数据采集(DataCollection)整合子公司财务数据(SAP/非SA</div> </li> <li><a href="/article/1950232316408295424.htm" title="9、汇编语言编程入门:从环境搭建到简单程序实现" target="_blank">9、汇编语言编程入门:从环境搭建到简单程序实现</a> <span class="text-muted">神经网络酱</span> <a class="tag" taget="_blank" href="/search/%E6%B1%87%E7%BC%96%E8%AF%AD%E8%A8%80/1.htm">汇编语言</a><a class="tag" taget="_blank" href="/search/MEPIS/1.htm">MEPIS</a><a class="tag" taget="_blank" href="/search/GNU%E5%B7%A5%E5%85%B7%E9%93%BE/1.htm">GNU工具链</a> <div>汇编语言编程入门:从环境搭建到简单程序实现1.数据存储介质问题解决在处理数据存储时,若要使用MEPIS系统,需确保有其可访问的存储介质。目前,MEPIS无法向采用NTFS格式(常用于Windows2000和XP工作站)的硬盘写入数据。不过,若硬盘采用FAT32格式,MEPIS就能进行写入操作。此外,MEPIS还能将文件写入软盘和大多数USB闪存驱动器。若工作站连接到局域网,还可通过FTP协议或挂载</div> </li> <li><a href="/article/1950232275262173184.htm" title="月光下的罪恶(5)" target="_blank">月光下的罪恶(5)</a> <span class="text-muted">允歌玖沐</span> <div>5.被孤立顾纨是转校过来的,进入学校后,回头率很高“诶诶诶,你看那女生,哪个系的?”“不知道没见过。”“看那样,一看就是个胆小的货。”顾纨当做没听到,更狠的话她都听过,更何况女生们耍心眼?“他爸爸是做黑生意的,估计女儿也不是什么好的,你以后离他一家子远点。”她走向自己要上课的教室,一进门,所有人的目光看向她,顾纨若无其事的走进教室,开始上课。下课,一群人站起来,但是很显然,她周围的一圈人都不愿意和</div> </li> <li><a href="/article/1950232190038110208.htm" title="day15|前端框架学习和算法" target="_blank">day15|前端框架学习和算法</a> <span class="text-muted">universe_01</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a> <div>T22括号生成先把所有情况都画出来,然后(在满足什么情况下)把不符合条件的删除。T78子集要画树状图,把思路清晰。可以用暴力法、回溯法和DFS做这个题DFS深度搜索:每个边都走完,再回溯应用:二叉树搜索,图搜索回溯算法=DFS+剪枝T200岛屿数量(非常经典BFS宽度把树状转化成队列形式,lambda匿名函数“一次性的小函数,没有名字”setup语法糖:让代码更简洁好写的语法ref创建:基本类型的</div> </li> <li><a href="/article/1950231640819167232.htm" title="贝多芬诞辰250周年纪念" target="_blank">贝多芬诞辰250周年纪念</a> <span class="text-muted">万千星河赴远方</span> <div>就算不是古典音乐爱好者,你也一定听说过贝多芬。作为古典音乐史上最伟大的音乐家之一,他不仅是古典主义风格的集大成者,同时也是浪漫主义风格的开创者。贝多芬肖像画(1813年)贝多芬的一生共创作了9部交响曲、36首钢琴奏鸣曲、10部小提琴奏鸣曲、16首弦乐四重奏、1部歌剧及2部弥撒曲等等。数量虽然不及前辈海顿、莫扎特多,但他几乎改造了当时所有的音乐表达形式,赋予了它们全新的价值,对后世音乐的发展产生了极</div> </li> <li><a href="/article/1950231513744338944.htm" title="IK分词" target="_blank">IK分词</a> <span class="text-muted">初心myp</span> <div>实现简单的分词功能,智能化分词添加依赖配置:4.10.4org.apache.lucenelucene-core${lucene.version}org.apache.lucenelucene-analyzers-common${lucene.version}org.apache.lucenelucene-queryparser${lucene.version}org.apache.lucenel</div> </li> <li><a href="/article/1950231508648259584.htm" title="三件事—小白猫·雨天·八段锦" target="_blank">三件事—小白猫·雨天·八段锦</a> <span class="text-muted">咸鱼月亮</span> <div>1.最近楼下出现一只非常漂亮的粘人小白猫,看着不像是流浪猫,非常亲人。眼睛比蓝球的还大,而且是绿色的,很漂亮。第一次遇到它,它就跟我到电梯口,如果我稍微招招手,肯定就跟我进电梯了。后来我喂过它几次,好可惜不能养它,一只蓝球就是我的极限了。2.下雨天就心烦,好奇怪。明明以前我超爱看窗外的雨和听雨声,看来近来的心情不够宁静了。3.最近在练八段锦,从第一次就爱上了这个运动,很轻松缓慢,但是却出汗。感觉可</div> </li> <li><a href="/article/1950231509906550784.htm" title="25-1-2019" target="_blank">25-1-2019</a> <span class="text-muted">树藤与海岛呢</span> <div>hello八月来报道了今天看到了一篇文章就只想记下那两句话:良田千顷不过一日三餐广夏万间只睡卧榻三尺大概的意思就是要珍惜当下不要等来不及的时候才珍惜分享今天的两餐最近没有时间运动呢下个月补回好了说完了哈哈goodnight图片发自App图片发自App</div> </li> <li><a href="/article/1950231381485350912.htm" title="《极简思维》第三部分" target="_blank">《极简思维》第三部分</a> <span class="text-muted">小洋苏兮</span> <div>整理你的人际关系如何改善人际关系?摘录:因为人际关系问题是人们生活中不快乐的主要原因。感想:感觉这个说的挺对,之前我总是埋头学习,不管舍友不管自己的合作伙伴的一些事情,但实际上,这学期关注了之后好多了摘录:“亲密关系与社交会让你健康而快乐。这是基础。太过于关注成就或不太关心人际关系的人都不怎么快乐。基本上来说,人类就是建立在人脉关系上的。”感想:但是如果有时想的太多就不太好,要以一个开放的心态跟别</div> </li> <li><a href="/article/1950231308781285376.htm" title="力扣热题100-------54. 螺旋矩阵" target="_blank">力扣热题100-------54. 螺旋矩阵</a> <span class="text-muted">海航Java之路</span> <a class="tag" taget="_blank" href="/search/%E5%8A%9B%E6%89%A3/1.htm">力扣</a><a class="tag" taget="_blank" href="/search/leetcode/1.htm">leetcode</a><a class="tag" taget="_blank" href="/search/%E7%9F%A9%E9%98%B5/1.htm">矩阵</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>给你一个m行n列的矩阵matrix,请按照顺时针螺旋顺序,返回矩阵中的所有元素。示例1:输入:matrix=[[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]示例2:输入:matrix=[[1,2,3,4],[5,6,7,8],[9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]提示:m==matrix.lengthn</div> </li> <li><a href="/article/1950231254427299840.htm" title="我不懂什么是爱,但我给你全部我拥有的" target="_blank">我不懂什么是爱,但我给你全部我拥有的</a> <span class="text-muted">香尧</span> <div>因为怕黑,所以愿意陪伴在夜中行走的人,给他一点点的安全感。因为渴望温柔与爱,所以愿意为别的孩子付出爱与温柔。因为曾遭受侮辱和伤害,所以不以同样的方式施于其他人。如果你向别人出之以利刃,对方还了你爱与包容,真的不要感激他,真的不要赞美他。每一个被人伤害过的人心里都留下了一颗仇恨的种子,他也会想要有一天以眼还眼,以牙还牙。但他未让那颗种子生根发芽,他用一把心剑又一次刺向他自己,用他血荐仇恨,开出一朵温</div> </li> <li><a href="/article/1950230873060208640.htm" title="你要记住,最重要的是:随时做好准备,为了你可能成为更好的自己,放弃现在的自己。" target="_blank">你要记住,最重要的是:随时做好准备,为了你可能成为更好的自己,放弃现在的自己。</a> <span class="text-muted">霖霖z</span> <div>打卡人:周云日期:2018年11月09日【日精进打卡第180天】【知~学习】《六项精进》0遍共214遍《通篇》1遍共106遍《大学》2遍共347遍《坚强工作,温柔生活》ok《不抱怨的世界》104-108页《经典名句》你要记住,最重要的是:随时做好准备,为了你可能成为更好的自己,放弃现在的自己。【行~实践】一、修身:(对自己个人)1、坚持打卡二、齐家:(对家庭和家人)打扫卫生,接送孩子,洗衣做饭,陪</div> </li> <li><a href="/article/1950230804957294592.htm" title="SpringMVC执行流程(原理),通俗易懂" target="_blank">SpringMVC执行流程(原理),通俗易懂</a> <span class="text-muted">国服冰</span> <a class="tag" taget="_blank" href="/search/SpringMVC/1.htm">SpringMVC</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/mvc/1.htm">mvc</a> <div>SpringMVC执行流程(原理),通俗易懂一、图解SpringMVC流程二、进一步理解Springmvc的执行流程1、导入依赖2、建立展示的视图3、web.xml4、spring配置文件springmvc-servlet5、Controller6、tomcat配置7、访问的url8、视图页面一、图解SpringMVC流程图为SpringMVC的一个较完整的流程图,实线表示SpringMVC框架提</div> </li> <li><a href="/article/1950230678696161280.htm" title="C++ 计数排序、归并排序、快速排序" target="_blank">C++ 计数排序、归并排序、快速排序</a> <span class="text-muted">每天搬一点点砖</span> <a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a> <div>计数排序:是一种基于哈希的排序算法。他的基本思想是通过统计每个元素的出现次数,然后根据统计结果将元素依次放入排序后的序列中。这种排序算法适用于范围较小的情况,例如整数范围在0到k之间计数排序步骤:1初始化一个长度为最大元素值加1的计数数组,所有元素初始化为02遍历原始数组,将每个元素值作为索引,在计数数组中对应位置加13将数组清空4遍历计数器数组,按照数组中的元素个数放回到元数组中计数排序的优点和</div> </li> <li><a href="/article/1950230114205757440.htm" title="现在发挥你的优势" target="_blank">现在发挥你的优势</a> <span class="text-muted">爱生活的佑嘉</span> <div>来和我做咨询的一些朋友,涉及到定位的,都会说,我不知道我的优势是什么,你能不能帮我看看?还有一些朋友,喜欢做各种测试来了解自己,测试过后,然并卵。今天,我想来聊聊优势,如何能了解自己的优势是什么。首先,我们要知道,如果要成为“不一般”的人,我们所做的事情,就要基于自身的优势。我做管理者十多年,看到每个员工都有不同的特长,有的擅长数字,有的擅长人际,有的擅长写作。这些知道自己优势并且在这方面刻意练习</div> </li> <li><a href="/article/1950229985633562624.htm" title="2023-11-02" target="_blank">2023-11-02</a> <span class="text-muted">一帆f</span> <div>发现浸润心田的感觉:今天一个机缘之下突然想分享我的婆媳关系,我一边分享一边回忆我之前和儿媳妇关系的微妙变化,特别是分享到我能感受到儿媳妇的各种美好,现在也能心平气和的和老公平等对话,看到自己看到老公,以己推人以人推己自然而然的换位思考,心中有一种美好的能量在涌动,一种浸润心田的感觉从心胸向全身扩散,美好极了……我很想记住这种感觉,赶紧把它写下来以留纪念,也就是当我看见他人的美好,美好的美妙的浸润心</div> </li> <li><a href="/article/1950229986984128512.htm" title="贫穷家庭的孩子考上985以后会怎样?" target="_blank">贫穷家庭的孩子考上985以后会怎样?</a> <span class="text-muted">Mellisa蜜思言</span> <div>我出生在一个贫穷的农村家庭,据我妈说,我出生的时候才4斤多,而她生完我以后月子里就瘦到70斤。家里一直很穷,父母都是在菜市场卖菜的,家里还有几亩地种庄稼的。我很小开始就要去帮忙,暑假的生活就是帮忙去卖菜和割稻谷,那时候自己对于割稻谷这种事情有着莫名的恐惧,生怕自己长大以后还是每年都要过着割稻谷这种日子。父母因为忙于生计无暇顾及我的学习,幸好我因为看到他们这样子的生活,内心里有深深的恐惧感,驱使着我</div> </li> <li><a href="/article/1950229922647699456.htm" title="实时数据流计算引擎Flink和Spark剖析" target="_blank">实时数据流计算引擎Flink和Spark剖析</a> <span class="text-muted">程小舰</span> <a class="tag" taget="_blank" href="/search/flink/1.htm">flink</a><a class="tag" taget="_blank" href="/search/spark/1.htm">spark</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/kafka/1.htm">kafka</a><a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a> <div>在过去几年,业界的主流流计算引擎大多采用SparkStreaming,随着近两年Flink的快速发展,Flink的使用也越来越广泛。与此同时,Spark针对SparkStreaming的不足,也继而推出了新的流计算组件。本文旨在深入分析不同的流计算引擎的内在机制和功能特点,为流处理场景的选型提供参考。(DLab数据实验室w.x.公众号出品)一.SparkStreamingSparkStreamin</div> </li> <li><a href="/article/1950229040682037248.htm" title="48. 旋转图像 - 力扣(LeetCode)" target="_blank">48. 旋转图像 - 力扣(LeetCode)</a> <span class="text-muted">Fiee-77</span> <a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E7%BB%84/1.htm">数组</a><a class="tag" taget="_blank" href="/search/leetcode/1.htm">leetcode</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E7%BB%84/1.htm">数组</a> <div>题目:给定一个n×n的二维矩阵matrix表示一个图像。请你将图像顺时针旋转90度。你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。示例1:输入:matrix=[[1,2,3],[4,5,6],[7,8,9]]输出:[[7,4,1],[8,5,2],[9,6,3]]示例2:输入:matrix=[[5,1,9,11],[2,4,8,10],[13,3,6,</div> </li> <li><a href="/article/71.htm" title="Linux的Initrd机制" target="_blank">Linux的Initrd机制</a> <span class="text-muted">被触发</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a> <div>Linux 的 initrd 技术是一个非常普遍使用的机制,linux2.6 内核的 initrd 的文件格式由原来的文件系统镜像文件转变成了 cpio 格式,变化不仅反映在文件格式上, linux 内核对这两种格式的 initrd 的处理有着截然的不同。本文首先介绍了什么是 initrd 技术,然后分别介绍了 Linux2.4 内核和 2.6 内核的 initrd 的处理流程。最后通过对 Lin</div> </li> <li><a href="/article/198.htm" title="maven本地仓库路径修改" target="_blank">maven本地仓库路径修改</a> <span class="text-muted">bitcarter</span> <a class="tag" taget="_blank" href="/search/maven/1.htm">maven</a> <div>默认maven本地仓库路径:C:\Users\Administrator\.m2 修改maven本地仓库路径方法:     1.打开E:\maven\apache-maven-2.2.1\conf\settings.xml     2.找到        </div> </li> <li><a href="/article/325.htm" title="XSD和XML中的命名空间" target="_blank">XSD和XML中的命名空间</a> <span class="text-muted">darrenzhu</span> <a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a><a class="tag" taget="_blank" href="/search/xsd/1.htm">xsd</a><a class="tag" taget="_blank" href="/search/schema/1.htm">schema</a><a class="tag" taget="_blank" href="/search/namespace/1.htm">namespace</a><a class="tag" taget="_blank" href="/search/%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4/1.htm">命名空间</a> <div>http://www.360doc.com/content/12/0418/10/9437165_204585479.shtml http://blog.csdn.net/wanghuan203/article/details/9203621 http://blog.csdn.net/wanghuan203/article/details/9204337 http://www.cn</div> </li> <li><a href="/article/452.htm" title="Java 求素数运算" target="_blank">Java 求素数运算</a> <span class="text-muted">周凡杨</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E7%B4%A0%E6%95%B0/1.htm">素数</a> <div>网络上对求素数之解数不胜数,我在此总结归纳一下,同时对一些编码,加以改进,效率有成倍热提高。 第一种:   原理: 6N(+-)1法         任何一个自然数,总可以表示成为如下的形式之一: 6N,6N+1,6N+2,6N+3,6N+4,6N+5 (N=0,1,2,…)   </div> </li> <li><a href="/article/579.htm" title="java 单例模式" target="_blank">java 单例模式</a> <span class="text-muted">g21121</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>想必单例模式大家都不会陌生,有如下两种方式来实现单例模式:   class Singleton { private static Singleton instance=new Singleton(); private Singleton(){} static Singleton getInstance() { return instance; }</div> </li> <li><a href="/article/706.htm" title="Linux下Mysql源码安装" target="_blank">Linux下Mysql源码安装</a> <span class="text-muted">510888780</span> <a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a> <div>1.假设已经有mysql-5.6.23-linux-glibc2.5-x86_64.tar.gz (1)创建mysql的安装目录及数据库存放目录       解压缩下载的源码包,目录结构,特殊指定的目录除外:           </div> </li> <li><a href="/article/833.htm" title="32位和64位操作系统" target="_blank">32位和64位操作系统</a> <span class="text-muted">墙头上一根草</span> <a class="tag" taget="_blank" href="/search/32%E4%BD%8D%E5%92%8C64%E4%BD%8D%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/1.htm">32位和64位操作系统</a> <div>32位和64位操作系统是指:CPU一次处理数据的能力是32位还是64位。现在市场上的CPU一般都是64位的,但是这些CPU并不是真正意义上的64 位CPU,里面依然保留了大部分32位的技术,只是进行了部分64位的改进。32位和64位的区别还涉及了内存的寻址方面,32位系统的最大寻址空间是2 的32次方= 4294967296(bit)= 4(GB)左右,而64位系统的最大寻址空间的寻址空间则达到了</div> </li> <li><a href="/article/960.htm" title="我的spring学习笔记10-轻量级_Spring框架" target="_blank">我的spring学习笔记10-轻量级_Spring框架</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/Spring+3/1.htm">Spring 3</a> <div>一、问题提问:     → 请简单介绍一下什么是轻量级?     轻量级(Leightweight)是相对于一些重量级的容器来说的,比如Spring的核心是一个轻量级的容器,Spring的核心包在文件容量上只有不到1M大小,使用Spring核心包所需要的资源也是很少的,您甚至可以在小型设备中使用Spring。  </div> </li> <li><a href="/article/1087.htm" title="mongodb 环境搭建及简单CURD" target="_blank">mongodb 环境搭建及简单CURD</a> <span class="text-muted">antlove</span> <a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/Install/1.htm">Install</a><a class="tag" taget="_blank" href="/search/curd/1.htm">curd</a><a class="tag" taget="_blank" href="/search/NoSQL/1.htm">NoSQL</a><a class="tag" taget="_blank" href="/search/mongo/1.htm">mongo</a> <div>一 搭建mongodb环境 1. 在mongo官网下载mongodb 2. 在本地创建目录 "D:\Program Files\mongodb-win32-i386-2.6.4\data\db" 3. 运行mongodb服务 [mongod.exe --dbpath "D:\Program Files\mongodb-win32-i386-2.6.4\data\</div> </li> <li><a href="/article/1214.htm" title="数据字典和动态视图" target="_blank">数据字典和动态视图</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%AD%97%E5%85%B8/1.htm">数据字典</a><a class="tag" taget="_blank" href="/search/%E5%8A%A8%E6%80%81%E8%A7%86%E5%9B%BE/1.htm">动态视图</a><a class="tag" taget="_blank" href="/search/%E7%B3%BB%E7%BB%9F%E5%92%8C%E5%AF%B9%E8%B1%A1%E6%9D%83%E9%99%90/1.htm">系统和对象权限</a> <div>数据字典(data dictionary)是 Oracle 数据库的一个重要组成部分,这是一组用于记录数据库信息的只读(read-only)表。随着数据库的启动而启动,数据库关闭时数据字典也关闭   数据字典中包含   数据库中所有方案对象(schema object)的定义(包括表,视图,索引,簇,同义词,序列,过程,函数,包,触发器等等) 数据库为一</div> </li> <li><a href="/article/1341.htm" title="多线程编程一般规则" target="_blank">多线程编程一般规则</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/thread/1.htm">thread</a><a class="tag" taget="_blank" href="/search/%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">多线程</a><a class="tag" taget="_blank" href="/search/java%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">java多线程</a> <div>       如果两个工两个以上的线程都修改一个对象,那么把执行修改的方法定义为被同步的,如果对象更新影响到只读方法,那么只读方法也要定义成同步的。        不要滥用同步。如果在一个对象内的不同的方法访问的不是同一个数据,就不要将方法设置为synchronized的。 </div> </li> <li><a href="/article/1468.htm" title="将文件或目录拷贝到另一个Linux系统的命令scp" target="_blank">将文件或目录拷贝到另一个Linux系统的命令scp</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/unix/1.htm">unix</a><a class="tag" taget="_blank" href="/search/scp/1.htm">scp</a> <div>一.功能说明        scp就是security copy,用于将文件或者目录从一个Linux系统拷贝到另一个Linux系统下。scp传输数据用的是SSH协议,保证了数据传输的安全,其格式如下:        scp 远程用户名@IP地址:文件的绝对路径</div> </li> <li><a href="/article/1595.htm" title="【持久化框架MyBatis3五】MyBatis3一对多关联查询" target="_blank">【持久化框架MyBatis3五】MyBatis3一对多关联查询</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/Mybatis3/1.htm">Mybatis3</a> <div>以教员和课程为例介绍一对多关联关系,在这里认为一个教员可以叫多门课程,而一门课程只有1个教员教,这种关系在实际中不太常见,通过教员和课程是多对多的关系。   示例数据:   地址表:   CREATE TABLE ADDRESSES ( ADDR_ID INT(11) NOT NULL AUTO_INCREMENT, STREET VAR</div> </li> <li><a href="/article/1722.htm" title="cookie状态判断引发的查找问题" target="_blank">cookie状态判断引发的查找问题</a> <span class="text-muted">bitcarter</span> <a class="tag" taget="_blank" href="/search/form/1.htm">form</a><a class="tag" taget="_blank" href="/search/cgi/1.htm">cgi</a> <div>先说一下我们的业务背景: 1.前台将图片和文本通过form表单提交到后台,图片我们都做了base64的编码,并且前台图片进行了压缩 2.form中action是一个cgi服务 3.后台cgi服务同时供PC,H5,APP 4.后台cgi中调用公共的cookie状态判断方法(公共的,大家都用,几年了没有问题) 问题:(折腾两天。。。。) 1.PC端cgi服务正常调用,cookie判断没</div> </li> <li><a href="/article/1849.htm" title="通过Nginx,Tomcat访问日志(access log)记录请求耗时" target="_blank">通过Nginx,Tomcat访问日志(access log)记录请求耗时</a> <span class="text-muted">ronin47</span> <div>一、Nginx通过$upstream_response_time $request_time统计请求和后台服务响应时间 nginx.conf使用配置方式: log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_r</div> </li> <li><a href="/article/1976.htm" title="java-67- n个骰子的点数。 把n个骰子扔在地上,所有骰子朝上一面的点数之和为S。输入n,打印出S的所有可能的值出现的概率。" target="_blank">java-67- n个骰子的点数。 把n个骰子扔在地上,所有骰子朝上一面的点数之和为S。输入n,打印出S的所有可能的值出现的概率。</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div> public class ProbabilityOfDice { /** * Q67 n个骰子的点数 * 把n个骰子扔在地上,所有骰子朝上一面的点数之和为S。输入n,打印出S的所有可能的值出现的概率。 * 在以下求解过程中,我们把骰子看作是有序的。 * 例如当n=2时,我们认为(1,2)和(2,1)是两种不同的情况 */ private stati</div> </li> <li><a href="/article/2103.htm" title="看别人的博客,觉得心情很好" target="_blank">看别人的博客,觉得心情很好</a> <span class="text-muted">Cb123456</span> <a class="tag" taget="_blank" href="/search/%E5%8D%9A%E5%AE%A2/1.htm">博客</a><a class="tag" taget="_blank" href="/search/%E5%BF%83%E6%83%85/1.htm">心情</a> <div>   以为写博客,就是总结,就和日记一样吧,同时也在督促自己。今天看了好长时间博客:    职业规划:    http://www.iteye.com/blogs/subjects/zhiyeguihua      android学习:    1.http://byandby.i</div> </li> <li><a href="/article/2230.htm" title="[JWFD开源工作流]尝试用原生代码引擎实现循环反馈拓扑分析" target="_blank">[JWFD开源工作流]尝试用原生代码引擎实现循环反馈拓扑分析</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C%E6%B5%81/1.htm">工作流</a> <div>     我们已经不满足于仅仅跳跃一次,通过对引擎的升级,今天我测试了一下循环反馈模式,大概跑了200圈,引擎报一个溢出错误      在一个流程图的结束节点中嵌入一段方程,每次引擎运行到这个节点的时候,通过实时编译器GM模块,计算这个方程,计算结果与预设值进行比较,符合条件则跳跃到开始节点,继续新一轮拓扑分析,直到遇到</div> </li> <li><a href="/article/2357.htm" title="JS常用的事件及方法" target="_blank">JS常用的事件及方法</a> <span class="text-muted">cwqcwqmax9</span> <a class="tag" taget="_blank" href="/search/js/1.htm">js</a> <div>事件 描述 onactivate 当对象设置为活动元素时触发。 onafterupdate 当成功更新数据源对象中的关联对象后在数据绑定对象上触发。 onbeforeactivate 对象要被设置为当前元素前立即触发。 onbeforecut 当选中区从文档中删除之前在源对象触发。 onbeforedeactivate 在 activeElement 从当前对象变为父文档其它对象之前立即</div> </li> <li><a href="/article/2484.htm" title="正则表达式验证日期格式" target="_blank">正则表达式验证日期格式</a> <span class="text-muted">dashuaifu</span> <a class="tag" taget="_blank" href="/search/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/1.htm">正则表达式</a><a class="tag" taget="_blank" href="/search/IT%E5%85%B6%E5%AE%83/1.htm">IT其它</a><a class="tag" taget="_blank" href="/search/java%E5%85%B6%E5%AE%83/1.htm">java其它</a> <div> 正则表达式验证日期格式 function isDate(d){ var v = d.match(/^(\d{4})-(\d{1,2})-(\d{1,2})$/i); if(!v) { this.focus(); return false; } } <input value="2000-8-8" onblu</div> </li> <li><a href="/article/2611.htm" title="Yii CModel.rules() 方法 、validate预定义完整列表、以及说说验证" target="_blank">Yii CModel.rules() 方法 、validate预定义完整列表、以及说说验证</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/yii/1.htm">yii</a> <div>public array rules () {return} array 要调用 validate() 时应用的有效性规则。 返回属性的有效性规则。声明验证规则,应重写此方法。 每个规则是数组具有以下结构:array('attribute list', 'validator name', 'on'=>'scenario name', ...validation </div> </li> <li><a href="/article/2738.htm" title="UITextAttributeTextColor = deprecated in iOS 7.0" target="_blank">UITextAttributeTextColor = deprecated in iOS 7.0</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/ios/1.htm">ios</a> <div>In this lesson we used the key "UITextAttributeTextColor" to change the color of the UINavigationBar appearance to white. This prompts a warning "first deprecated in iOS 7.0." Ins</div> </li> <li><a href="/article/2865.htm" title="判断一个数是质数的几种方法" target="_blank">判断一个数是质数的几种方法</a> <span class="text-muted">EmmaZhao</span> <a class="tag" taget="_blank" href="/search/Math/1.htm">Math</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>质数也叫素数,是只能被1和它本身整除的正整数,最小的质数是2,目前发现的最大的质数是p=2^57885161-1【注1】。 判断一个数是质数的最简单的方法如下: def isPrime1(n): for i in range(2, n): if n % i == 0: return False return True 但是在上面的方法中有一些冗余的计算,所以</div> </li> <li><a href="/article/2992.htm" title="SpringSecurity工作原理小解读" target="_blank">SpringSecurity工作原理小解读</a> <span class="text-muted">坏我一锅粥</span> <a class="tag" taget="_blank" href="/search/SpringSecurity/1.htm">SpringSecurity</a> <div>   SecurityContextPersistenceFilter   ConcurrentSessionFilter   WebAsyncManagerIntegrationFilter   HeaderWriterFilter   CsrfFilter   LogoutFilter   Use</div> </li> <li><a href="/article/3119.htm" title="JS实现自适应宽度的Tag切换" target="_blank">JS实现自适应宽度的Tag切换</a> <span class="text-muted">ini</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/html5/1.htm">html5</a> <div>效果体验:http://hovertree.com/texiao/js/3.htm   该效果使用纯JavaScript代码,实现TAB页切换效果,TAB标签根据内容自适应宽度,点击TAB标签切换内容页。 HTML文件代码: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"</div> </li> <li><a href="/article/3246.htm" title="Hbase Rest API : 数据查询" target="_blank">Hbase Rest API : 数据查询</a> <span class="text-muted">kane_xie</span> <a class="tag" taget="_blank" href="/search/REST/1.htm">REST</a><a class="tag" taget="_blank" href="/search/hbase/1.htm">hbase</a> <div>hbase(hadoop)是用java编写的,有些语言(例如python)能够对它提供良好的支持,但也有很多语言使用起来并不是那么方便,比如c#只能通过thrift访问。Rest就能很好的解决这个问题。Hbase的org.apache.hadoop.hbase.rest包提供了rest接口,它内嵌了jetty作为servlet容器。   启动命令:./bin/hbase rest s</div> </li> <li><a href="/article/3373.htm" title="JQuery实现鼠标拖动元素移动位置(源码+注释)" target="_blank">JQuery实现鼠标拖动元素移动位置(源码+注释)</a> <span class="text-muted">明子健</span> <a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a><a class="tag" taget="_blank" href="/search/js/1.htm">js</a><a class="tag" taget="_blank" href="/search/%E6%BA%90%E7%A0%81/1.htm">源码</a><a class="tag" taget="_blank" href="/search/%E6%8B%96%E5%8A%A8/1.htm">拖动</a><a class="tag" taget="_blank" href="/search/%E9%BC%A0%E6%A0%87/1.htm">鼠标</a> <div>欢迎讨论指正!   print.html代码: <!DOCTYPE html> <html> <head> <meta http-equiv=Content-Type content="text/html;charset=utf-8"> <title>发票打印</title> &l</div> </li> <li><a href="/article/3500.htm" title="Postgresql 连表更新字段语法 update" target="_blank">Postgresql 连表更新字段语法 update</a> <span class="text-muted">qifeifei</span> <a class="tag" taget="_blank" href="/search/PostgreSQL/1.htm">PostgreSQL</a> <div>下面这段sql本来目的是想更新条件下的数据,可是这段sql却更新了整个表的数据。sql如下: UPDATE tops_visa.visa_order SET op_audit_abort_pass_date = now() FROM tops_visa.visa_order as t1 INNER JOIN tops_visa.visa_visitor as t2 ON t1. </div> </li> <li><a href="/article/3627.htm" title="将redis,memcache结合使用的方案?" target="_blank">将redis,memcache结合使用的方案?</a> <span class="text-muted">tcrct</span> <a class="tag" taget="_blank" href="/search/redis/1.htm">redis</a><a class="tag" taget="_blank" href="/search/cache/1.htm">cache</a> <div>公司架构上使用了阿里云的服务,由于阿里的kvstore收费相当高,打算自建,自建后就需要自己维护,所以就有了一个想法,针对kvstore(redis)及ocs(memcache)的特点,想自己开发一个cache层,将需要用到list,set,map等redis方法的继续使用redis来完成,将整条记录放在memcache下,即findbyid,save等时就memcache,其它就对应使用redi</div> </li> <li><a href="/article/3754.htm" title="开发中遇到的诡异的bug" target="_blank">开发中遇到的诡异的bug</a> <span class="text-muted">wudixiaotie</span> <a class="tag" taget="_blank" href="/search/bug/1.htm">bug</a> <div>今天我们服务器组遇到个问题: 我们的服务是从Kafka里面取出数据,然后把offset存储到ssdb中,每个topic和partition都对应ssdb中不同的key,服务启动之后,每次kafka数据更新我们这边收到消息,然后存储之后就发现ssdb的值偶尔是-2,这就奇怪了,最开始我们是在代码中打印存储的日志,发现没什么问题,后来去查看ssdb的日志,才发现里面每次set的时候都会对同一个key</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>