。
生成发布文档
上面我们使用DocBook创建了SampleBook文档及其相关文档,这些文档仅仅是根据DocBook 5的规范通过XML记载了内容,现在,我们需要将其转换为HTML文档及PDF文档。将使用DocBook书写的内容转换成其他形式的文档,既是我们的目的,也是最精彩、最激动人心、最令人热血澎湃的过程。
生成HTML文档
使用DocBook样式表生成HTML文档
我们使用Mac OS X的默认脚本语言Bash来自动生成HTML文档。
打开一个终端,运行以下脚本:
cd /Users/sarkuya/Documents/My\ DocBook\ Books/My\ First\ Book touch GenHTML.sh chmod u+x GenHTML.sh
记得将上面的路径换成您的路径。第一行使用“cd”命令将当前路径切换至“My First Book”下面。由于上面的路径名称出现了空格,因此使用“\ ”来转义空格(也可以将整个路径名用半角的""括起来,这样无需转义)。第二行的“touch”命令新建一个空白的“GenHTML.sh”文件,第三行的“chmod”命令将该脚本文件的运行权限赋予当前用户。
在Mac OS X的Finder中将GenHTML.sh文件拖至NetBeans的编辑器窗口中,这样,NetBeans将自动打开并可编辑该文件。输入以下的内容。
#!/bin/bash export XML_CATALOG_FILES="file:///usr/share/xml/docbook/catalog.xml" xsltproc --xinclude --output Product/SampleBook.html docbook.xsl Content/SampleBook.xml
因为UNIX系统中允许存在并同时运行多个shell脚本,上面代码的第一行指定了使用Bourne-Again shell。
默认情况下,xsltproc会自动根据环境变量“XML_CATALOG_FILES”的内容在“/etc/xml/catalog”路径下查找catalog.xml文件,因此,如果我们将上面的catalog.xml文件放在“/etc/xml/catalog”的路径下,第二行可以省略。正如上面代码所示,我们可以通过export命令设置环境变量“XML_CATALOG_FILES”从而达到改变默认状态的效果。
代码第三行中,源文件为Content路径下面的SampleBook.xml,套用docbook.xsl所指定的格式后,将在Product路径下面生成SampleBook.html文档。
需注意的是,上面的docbook.xsl是从何而来?我们并未创建此文件。回顾上面创建catalog.xml文件一节的内容,该文件中有一行内容如下:
......
uri标签将“docbook.xsl”的标识符与“/usr/share/xml/docbook/docbook-xsl-1.76.1/html/docbook.xsl”相映射。这样,当xsltproc遇到“docbook.xsl”的标识符时,便会自动调用后者。这样做的好处是,当以后我们安装了docbook-xsl新的版本,只需修改catalog.xml文件的该行即可。这是使用Catalog来部署的一大好处。
由于在上一节中,我们使用了XInclude,因此,xsltproc需要添加“--xinclude”的参数。并且,在xsltproc中,我们只需指定主干文档SampleBook.xml,而无需指定chapter1.xml或chapter2.xml。
在终端中,在GenHTML.sh文件所在路径下,运行下面的命令:
./GenHTML.sh
在Product路径下面,双击SampleBook.html,您就会看到所生成的SampleBook.html的效果图。
可以看出,相对于我们所编写的内容比较简单的SampleBook.xml,这个自动生成的网页为我们提供了一些额外的排版功效:
文章标题下有一条点缀横线。
dedication部分加上了题词的标题,chapter部分自动加上了第几章的序号。
分别为全书及各章加上了目录及相应的链接。
分别为标题、内容设置了对应大小的字体。
Oh My God! 这些信手拈来的界面效果,如果让我来排版,真不知从何下手!(边框除外,这是通过用于Safari的wiget - Web Clip实现的)
故事固然精彩,但还远未到结束的时候。我们还可以通过自己的CSS来让这个网页锦上添花。
广告诗词之后,故事更加精彩。:◃)
“使用DocBook, 杜撰内容高深枯涩的文字,你......来! [左手指向对方,边抖,来字顿收。毕恭毕敬] 排版的苦力活,我......来! [拍几下胸脯,延隔了少许秒。义无反顾] 两人联手,天--下--无--贼! [左手作握手姿态,平伸而出,肘微曲;右手五指张开,做朝天而抓状;头仰天。豪气冲天]”
猜猜看,猜猜看,我上面的大鼻子笑脸使用了哪个字符实体?
好,让我们回到演播现场,继续演绎我们精彩的故事。
使用自定义样式表生成HTML
首先,在"My First Book"目录下面新建一个“XSL”目录,并在里面新建一个名为“html.xsl”的文件。内容如下:
之前我们使用docbook-xsl来生成HTML文档,没有太多自主权。要调用自定义的CSS,我们需要一个入口。这个入口就是用以取代docbook-xsl的html.xsl。首先,它导入了原来的docbook-xsl作为基础,然后指定了调用css路径下面的style.css文件来继续排版。转换的目标是HTML文件,编码为UTF-8,格式缩进。接着,设置制作目录的级数为2级,章下面的节采用自动编号的形式,且该编号自动包括上级编号。
现在,可以准备CSS文件了。在"My First Book"目录下面新建一个“CSS”目录,并在里面新建一个名为“style.css”的文件。内容如下:
html { background: -webkit-gradient(linear, left top, left bottom, from(#00abeb), to(#fff)); } body { background-color: #333; margin: 1em; padding: 1em; -webkit-border-radius: 6px; -webkit-box-shadow: 0 0 14px #123; } h1.title { color: #cb6c8a; } h2.title { color: #cb6c8a; } div.section h2.title { color: #82a4bb; } p { color: #bfbbaf; text-indent: 2em; } a:link { color: #7a8a39; } a:hover { color: palegreen; } body div.titlepage h1.title { text-align: center; } div.chapter { margin-top: 5em; } div.chapter h2.title { border-bottom: 1px solid grey; } div.section h2.title { border-bottom-width: 0; } div.toc p { text-indent: 0; color: #ccc; } div.toc { border: 1px dashed gray; padding: 0.5em; margin-left: 2em; } div.toc dl dd dl { margin-top: 0px; }
下面看到实际网页效果后,再来解释CSS。
接下来,我们修改GenHTML.sh文件的内容。
#!/bin/bash export XML_CATALOG_FILES="file:///usr/share/xml/docbook/catalog.xml" rm -r Product mkdir -p Product/{css,images} cp CSS/style.css Product/css xsltproc --xinclude --output Product/SampleBook.html XSL/html.xsl Content/SampleBook.xml
我们的网页不再孤独,它还需要CSS文件,以后可能还需要图片美化。CSS文件及图像文件都需要随同SampleBook.html文件一起发布。因此,我们需要规划Product的内容了。由于Product用于存放自动生成的文档,为避免与上一次的生成结果混在一起,rm命令先将此目录及所有子目录全部删除。之后,在其下面创建了css及images这两个并行的目录。然后,将CSS路径下的style.css复制到Product目录下的css目录下。
xsltproc这次不再调用docbook-xsl,而是调用我们上面所创建的存放于XSL路径下面的html.xsl文件。通过xsltproc,我们把上面所生成的所有文件都组成了一条生产线。
再次运行GenHTML.sh,您将看到以下的效果。
有点像使用iPad 2的感觉吧?呵呵。
在style.css中,我用到了Safari所支持的webkit引擎的圆角及背景色渐变的功能。调色方案使用的是ColorBurn的Troubadour High Score方案。应指出,在编辑CSS过程中需选择各个元素时,我借助于Safari的“检查元素”功能,多快好省地达到了目标。Safari已经成为我目前钟意的浏览器了。
除了界面上与上次不同之外,一个重要的不同之处是章下面的节出现了自动数字序号。这是使用DocBook的一大重要原因:你来写,我来实时编号。
生成由多个网页组成的HTML
目前为止,我们的书确实很短。但如果我们的书很长呢?将一本1000页的书的内容全部放在一个网页中,会不会让读者感到很累?如果能将整本书像连续剧一样分集,只要链接与索引做得好,读者肯定很欢迎。
DocBook支持这种将整本书分成多个单独的网页,并自动在网页间做好相应的链接。我们的书虽短,但有多个章节,可以实现此目标。
在往下走之前,我们先思考2个问题。
是否需要同时生成单页面的HTML文件及多页面的HTML文件?
如果需要同时生成,单页面的HTML文件及多页面的HTML文件应否共享CSS及图像?
我的建议是,最好同时生成。且为了发布时方便,不应共享CSS及图像。这样可满足各种不同需求的场合。
我们需要保留原来生成单网页的HTML的指令,但对Product的路径应做适当调整如下。
pdf路径为将来生成的PDF文件预留。html分为chunk及single两个路径,分别存放多网页及单网页的HTML文档。这两个路径下面均带有自己的css及images子目录。
现在可以修改GenHTML.sh了。
#!/bin/bash export XML_CATALOG_FILES="file:///usr/share/xml/docbook/catalog.xml" rm -r Product mkdir -p Product/{html/{chunk/{css,images},single/{css,images}},pdf} cp -r CSS/ Product/html/chunk/css cp -r CSS/ Product/html/single/css xsltproc --xinclude --output Product/html/single/SampleBook.html XSL/html.xsl Content/SampleBook.xml
这次的cp命令将CSS路径下面的内容,包括子路径及所有的文件全部复制。注意CSS之后的“/”。在基于GNU的UNIX系统中,不管路径后面是否有“/”,都一样地将该路径及其下面所有路径及文件都复制。而在基于BSD的UNIX系统中,没有“/”,连同该路径一起复制,若有“/”,则只复制其下面的路径和文件,但不包括该路径。Mac OS X是基于FreeBSD及NetBSD的UNIX系统,因此,在cp命令中源路径名后面是否带有“/”含义不一样。由于源路径名是大写的“CSS”,而目标路径名是小写的“css”,显然我们不需要复制源路径本身。因此需要在源路径“CSS”后面加上“/”。
生成多网页的HTML文档的方法并不复杂。将XSL路径下面的html.xsl复制为chunk.xsl,并修改chunk.xsl的内容如下:
在GenHTML.sh文件中添加生成多网页的HTML的内容。
...... xsltproc --xinclude --output Product/html/single/SampleBook.html XSL/html.xsl Content/SampleBook.xml xsltproc --xinclude --output Product/html/chunk/SampleBook.html XSL/chunk.xsl Content/SampleBook.xml
运行GenHTML.sh,在相应路径下检查是否已经同时生成单网页及多网页的HTML,并看看多网页的HTML的效果。
由于原来的CSS的采用了黑色作为背景色,新生成的多网页HTML部分字体偏暗,因此需对style.css做适当修改。
...... a:link, a:visited { color: #7a8a39; } ...... div.navheader table th, div.navfooter table td { color: #bfbbaf; }
再次运行GenHTML.sh,可依序看到下面的页面效果(iPad之后,再送您5个iPhone)。
“Oh My God!”
“Shut up! Not any more!”
“OK... ... 我的主啊,此乃神作,非人可为也!”
如果查看所生成网页的源代码,就会发现,即使是神作,也是有问题的。一是charset为ISO-8859-1,而不是UTF-8;二是源代码没有自动断行。原来html.xsl中相应的配置对多网页HTML不起作用。修改chunk.xsl的内容如下:
注意 : xsl:param中的select,如果值不是数值型,而是字符串型,需在“”中另加''来括起来。
再查看网页的源代码,问题已经解决。
加入图标
上面生成的HTML由于没有图标,因此还不够生动。docbook-xsl已经内置了几项图标服务:
警示图标,如使用note, tip, warning, caution, important等标签时
导航图标,如上一页,下一页使用的图标
注解说明中出现的数字图标
现在我们开始看看docbook-xsl对警示图标的支持。编辑chapter1.xml,加入以下内容:
...... ...... HTML的重要性 如何评估HTML的重要性都不为过。 当然是往高评估。
为看清新加的内容,修改style.css:
...... div.note { color: #999; border: 1px solid gray; }
观察自动生成的ch01s02.html及其源代码,多了“注意”两个字,但没有图标出现。
修改chunk.xsl:
......
上面语句将警示的图标功能打开。重新运行GenHTML.sh,再观察ch01s02.html。
两个发现。一个是有了图标的占位符,但没有图标出现。二是尽管我们上面已经修改了style.css中div.note的元素,但字体颜色还是变黑了。如果您使用的浏览器是Safari,用鼠标刷黑“注意”两字,按右键,选“检查元素”,您会发现div.note下面插入了一个table,图标及文字均放在此表中了。
修改style.css:
...... div.note table { color: #999; border: 1px solid gray; width: 100%; }
放在表格中的内容加上外框后如果太短不美观,因此将其长度调为100%。
再观察生成的源代码中img标签:
生成的网页期待有一个note.png的图像文件放在images路径下面。到哪找note.png?docbook-xsl已经为我们提供了包括note.png在内的日常所需图标,就放在docbook-xsl-1.76.1/images路径下面。
我们不应仅仅使用docbook-xsl的图标,还应有自己的图片。因此,先在“My First Book”路径下新建一个“IMAGES”目录,用于存放自己创建的图片。这些图片连同docbook-xsl的图标一起,在发布时均要复制到Product的相应路径下面。现在,我们需要重新规划Product下面的路径了。
主要是在各个images路径下面均分为custom及docbook两种,分别存放我们自己创建的和docbook自带的图片。这样的部署,不相混杂,维护方便。另外也为pdf目录做了提前准备。
修改GenHTML.sh:
#!/bin/bash export DOCBOOK_DIR="/usr/share/xml/docbook" export XML_CATALOG_FILES="$DOCBOOK_DIR/catalog.xml" export DOCBOOK_XSL_DIR="$DOCBOOK_DIR/docbook-xsl-1.76.1" rm -r Product mkdir -p Product/{html/{chunk/{css,images/{custom,docbook}},single/{css,images/{custom,docbook}}},pdf/images/{custom,docbook}} cp -r CSS/ Product/html/chunk/css cp -r CSS/ Product/html/single/css cp -r IMAGES/ Product/html/chunk/images/custom cp -r $DOCBOOK_XSL_DIR/images/ Product/html/chunk/images/docbook cp -r IMAGES/ Product/html/single/images/custom cp -r $DOCBOOK_XSL_DIR/images/ Product/html/single/images/docbook cp -r IMAGES/ Product/pdf/images/custom cp -r $DOCBOOK_XSL_DIR/images/ Product/pdf/images/docbook xsltproc --xinclude --output Product/html/single/SampleBook.html XSL/html.xsl Content/SampleBook.xml xsltproc --xinclude --output Product/html/chunk/SampleBook.html XSL/chunk.xsl Content/SampleBook.xml
这次的改动比较大。首先,设置了DOCBOOK_DIR、XML_CATALOG_FILES、DOCBOOK_XSL_DIR等几个环境变量,删除Product目录,按上面规划的路径分别创建目录,再将CSS文件及图像文件分别复制到相应的路径下面。最后两行的xsltproc命令保持不变。
注意DOCBOOK_DIR的设置方式与之前不同了。以前使用“file://”的文件协议方式,这种方式xsltproc可以认识,但cp命令不认识。因此改变路径方式后,双方都能接受。
现在还剩一个问题。如前所述,自动生成的HTML期待着图片在images目录下面,我们改动了这种设置,因此需要将此改动告诉DocBook。同时修改XSL目录下的chunk.xsl及html.xsl文件:
......
参数admon.graphics.path告诉DocBook,这些警示图片放在“images/docbook/”下面,注意后面必须带有“/”。参数admon.graphics.extension设置为“.png”,DocBook将查找note.png,这是默认设置。可以改为“.gif”,DocBook将查找note.gif。可看看dookbook-xsl的images目录下面都有哪些图标文件。如果需要使用自己创建的图标文件,只需将此规则命名并放在dookbook-xsl的images目录中替换掉原来的就行了。当然还需注意文件尺寸大小问题。
参数admon.textlabel控制应否出现“注意”的标题。这里因美观的原因将其屏蔽掉了。读者可设为“1”值看看效果。
运行GenHTML.sh。
比较好玩,是吧?还有更好玩的。如前所述,还有导航栏的图标呢?因为只有多网页的HTML才需要导航栏,因此,这次只修改chunk.xsl。
......
原理如前所述,只是改由参数navig.graphics及navig.graphics.path来分别控制。
挂上导航图标后,眼球、手感都立即有了不一样的感受,当然还包括幸福指数。
DocBook, do you really know how much I love you?
Shut......
OK, OK......
“您不是说过注解说明中也会有数字图标吗?怎样实现?”
Well, well...那是一个比较较劲的问题,与本文作为一个DocBook快速入门的格调不相符合,会与其他内容组成一个专题,放在另外文章中专述。
好了,自动生成HTML的故事就暂讲到这里。下一节,我们来研究另一个更激动人心的问题 ── 如何自动生成PDF文档。
生成PDF文档
初识FOP
要将DocBook的文档转换为PDF,需经两个步骤,第一步是将DocBook文档转换为.fo文档,第二步再将此.fo文档转换为.pdf文档。FOP甚至可以将此两步合为一步,直接将DocBook文档转换为PDF文档。
对于将DocBook文档转换为.fo文档的第一步,不仅FOP能完成,xsltproc也能完成。由于xsltproc的速度比FOP要快,因此,本文先使用xsltproc转换为.fo文档后,再用FOP将其转换为PDF文档。
修改catalog.xml:
...... ......
增加了fop.xsl的引用,供xsltproc调用。
在“My First Book”下面,将GenHTML.sh文件复制为GenPDF.sh文件,修改后者内容如下:
#!/bin/bash export DOCBOOK_DIR="/usr/share/xml/docbook" export XML_CATALOG_FILES="$DOCBOOK_DIR/catalog.xml" export DOCBOOK_XSL_DIR="$DOCBOOK_DIR/docbook-xsl-1.76.1" export FOP_DIR="$DOCBOOK_DIR/fop-1.0" clear xsltproc --xinclude --output Product/pdf/SampleBook.fo --stringparam fop1.extensions 1 fop.xsl Content/SampleBook.xml $FOP_DIR/fop Product/pdf/SampleBook.fo -awt
xsltproc中的fop.xsl即为刚在catalog.xml中增加的uri名称,因此,它实际调用了docbook-xsl下面的fo/docbook.xsl来将SampleBook.xml转换为SampleBook.fo文件。字符串参数fop1.extensions表示按照FOP所要求的格式来创建。例如,若将fop1.extensions设为1,则生成的PDF文档带有书签。若不设,则PDF文档没有书签。FOP V0.93及其之后版本用此参数,之前的版本用fop.extensions。
$FOP_DIR/fop调用了FOP路径下面的fop这个UNIX可执行文件,该文件负责将上一步生成的SampleBook.fo转换为PDF文档,但选项awt告诉FOP,不生成实际的PDF文档,而是直接显示出来。FOP将打开自带的一个软件来显示所创建的PDF文档。共创建了6页,下面显示的是其中有代表性的两页。
可以看出,目录部分与正文部分的页码编号采用了不同的数字。但没有节的自动编号,没有警示图标。
创建实实在在的PDF文档
水中望月,雾里观花。一会您就明白为什么了。现在,我们创建真实存在、触手可摸的PDF文档。只需改修改GenPDF.sh的最后一行。
...... $FOP_DIR/fop Product/pdf/SampleBook.fo Product/pdf/SampleBook.pdf
Oh My God! 这回您不让我叫,我跟您急!Oh My God!
第一个OMG是因为FOP自动生成了漂亮的PDF书签。第二个OMG是因为除了书签,书籍其他地方凡是应该出现中文的地方均出现了“洋文”。
原因说来话长,但长话短说就是,每个系统的字体都不一样,PDF作为一种强调可移植性的文档,正常情况下PDF文件应自带内嵌字体。FOP作为生成PDF的工具,仅自带了14种字体,远远不能满足非英文环境的需求。因此,上面生成的PDF文档在正文中凡是出现中文的地方都因为没有内嵌字体的支持而以“#”号代替。原因明白了,解决的办法也出来了,找到中文字体,嵌到其中就是。
FOP以前要嵌个字体,要自己制作比较繁琐的XML font metrics文件配置。但现在,除了这种方式之外,FOP还支持扫描特定路径的字体,以及查找系统安装字体的方式。本文使用后者。
可能是因为Mac OS X的字体规范的原因,Mac OS X中的很多中文字体不能很好地嵌入PDF文件。因此,本文中只使用到2种字体,一种是黑体,用于标题,另一种是宋体,用于正文等部分。黑体需从Windows中将simhei.ttf复制过来,这是由北京中易中标电子信息技术有限公司设计的,版权归其所有。宋体字则在Mac OS X中已有,且可正常工作,因此用它。
在Mac OS X中双击simhei.ttf,即可安装它,一般是安装到/Users/[your_name]/Library/Fonts下面,但只要安装了,就成了系统字体,而不管其安装路径。
安装完simhei.ttf后,需要让FOP来查找系统字体。在fop-1.0的conf目录下,有一个“fop.xconf”配置文件,做好备份后,将其拖至NetBeans中修改。
...... ...... ...... ......
只需在fonts标签中加入auto-detect即可。
与生成HTML文档一样,由于我们需要指定字体等定制工作,因此最好有自己的xsl转换文件。在XSL目录下将之前的html.xsl复制为pdf.xsl,并在NetBeans中编辑。
SimHei SimSun Product/pdf/images/docbook/
陌生的内容比较多。xml:fo是定制FO时经常需要用到的,虽然本文用不上,但也在此挂上了。xsl:imprt导入的方式与前面不一样了,这里使用了URI的方式。前面的html.xsl及chunk.xsl均通过绝对路径的方式来导入的,这种硬编码的方式,如果以后使用了新版的docbook-xsl之后不好维护。而使用URI,配合Catalog的配置,可以地实现缓存与维护的两相宜。这里虽然指向了网络地址,但只要在catalog.xml中进行重新导向,xsltproc就能到本地去查找fo/docbook.xsl。为达到此目的,catalog.xml内容修改如下:
...... ......
rewriteURI的工作原理是,当发现以uriStartString开始的URI时,将使用经与xml:base整合之后的rewritePrefix的字符串来代替,从而实现将网络地址重新导向到本地文件的缓存效果。这样,pdf.xsl文件中的网络地址上的fo/docbook.xsl文件,实际上被导向至本地目录下了。目前为止,包括配置给NetBeans使用的之内,我们已经使用catalog.xml来实现了4种不同的导向了,读者可慢慢体会。由见可见Catalog在XML应用中的重要性。这样改变了catalog.xml的配置后,之前的html.xsl及chunk.xsl也均可使用了这种缓存机制了。
回到pdf.xsl上。xsl:include插入了一个sharedparts.xsl文件的内容。还记得上面的html.xsl及chunk.xsl的内容吗?有许多内容是一样的,却要多次重复配置。累得不说,如果以后在一个文件中进行了修改,还得在另一个文件中重复相应的修改。很容易忘记进行同步。因此,将相同的部分抽取出来放进一个单独的文件,需要时使用xsl:include包含进来,维护时只在一处修改就好方便。
sharedparts.xsl的内容是什么?看看。
2 1 1 1 .png 1
哈哈,全是上面已经讲过的。由于这些部分,不管是html.xsl,还是chunk.xsl,或是pdf.xsl均要使用,因此就放在此共享文件中了。
html.xsl及chunk.xsl又已经改成什么样了?在此全晾出来。
先是html.xsl的内容。
xsl:import中也使用了重新导向的缓存机制。只剩下一个其独享的xsl:output了。上面又包含了一个sharedparts_html文件,顾名思义,就是所有的html的xsl文档都应共享的部分,晾完chunk.xsl内容后再晾它。chunk.xsl的内容:
除了shareparts_html.xsl,也均剩下只对chunk起作用的配置了。再看shareparts_html.xsl的内容:
它包含了sharedparts.xsl的内容,剩下的两项,均是对html.xsl及chunk.xsl有效的配置。简而言之,pdf.xsl、html.xsl及chunk.xsl均用得上的配置,放在sharedparts.xsl中,而仅对html.xsl及chunk.xsl起作用的配置,放在sharedparts_html.xsl中,最后,仅对自己有效的配置,则给自己独享。
请原谅我的这种倒插花的讲述方式。在开发过程中进行重构是非常重要而有必要的。这种讲述方式虽在接受知识效果方面略逊一筹,但它讲清了重构前的缺点,重构的过程,以及重构的最终效果,读者不仅得到了最终的成果,也从中体会到了重构的魅力及必要的技巧。
不再倒插花了,再次回到pdf.xsl上来。title.font.family指定了标题使用SimHei,即黑体字,body.font.family使用SimSun,即宋体字。运行Mac OS X中的字体册程序,点击已经安装的字体,其Postscript名称就是SimHei及SimSun的由来。
pdf.xsl虽像html.xsl及chunk.xsl一样,均共同使用admon.graphics.path,但其查找方式与另外二者不一致,是由FOP来根据GenPDF.sh的路径作为起始点来查找的,因此这项配置专门放在了pdf.xsl中。
好,繁琐的配置终于完成,开始发指令了。修改GenPDF.sh:
#!/bin/bash export DOCBOOK_DIR="/usr/share/xml/docbook" export XML_CATALOG_FILES="$DOCBOOK_DIR/catalog.xml" export DOCBOOK_XSL_DIR="$DOCBOOK_DIR/docbook-xsl-1.76.1" export FOP_DIR="$DOCBOOK_DIR/fop-1.0" clear rm Product/pdf/*.fo Product/pdf/*.pdf # xsltproc --xinclude \ # --output Product/pdf/SampleBook.fo \ # --stringparam title.font.family "SimHei" \ # --stringparam body.font.family SimSun \ # --stringparam admon.textlabel 1 \ # --stringparam admon.graphics 1 \ # --stringparam admon.graphics.path "Product/pdf/images/docbook/" \ # --stringparam header.rule 1 \ # --stringparam fop1.extensions 1 \ # fop.xsl \ # Content/SampleBook.xml xsltproc --xinclude \ --output Product/pdf/SampleBook.fo \ --stringparam fop1.extensions 1 \ XSL/pdf.xsl \ Content/SampleBook.xml $FOP_DIR/fop -c $FOP_DIR/conf/fop.xconf Product/pdf/SampleBook.fo Product/pdf/SampleBook.pdf
中间以“#”开始的部分被注释掉了,不会执行,在此说明很多参数都可以放在xsltproc的命令行中设置,与在pdf.xsl中设置的结果一样,但内容多了以后,还是建议放在pdf.xsl中设置。最后一行的fop,选项c指定了使用上面修改的fop.xconf文件中的配置来生成PDF,这样就可把查找到的字体嵌进来。
运行GenPDF.sh。
长征路漫漫,总差一步半。枝头幸运鸟,何时来伴伴。
宋体字一切正常。目录的黑体字正常。但章节部分,在应出现空格的地方,出现了“#”号。还有一个特点,即出现错误的地方,都是有自动生成内容的部分。看来是在转换文档的过程中,在需要生成新内容的地方,使用了不该使用的字符。此外,“1.1.”不规范,应为“1.1 ”。我不是事后诸葛亮,解决这些问题总会花去大量的时间,现在,求求您就让我迫不及待地直接告诉您答案吧。修改pdf.xsl文件:
......
local.l10n.xml专管本地化的工作。读取文档后,对于自动生成编号的标题,在chapter及section部位,输入符合需求的内容。%n代表数字,%t代表标题。之间的空格,采用最原始的暴力输入——使用键盘上的空格键。看来制作docbook-xsl的专家,这个老美的键盘一定是特制的。
谢幕,黯然退场。
参考资源
Filesystem Hierarchy Standard, by Rusty Russell, Daniel Quinlan, Christopher Yeoh, Filesystem Hierarchy Standard Group:http://www.pathname.com/fhs/pub/fhs-2.3.html
DocBook 5: The Definitive Guide V1.0.3 for DocBook V5.0, by Norman Walsh, XML Press:http://www.docbook.org/tdg5/en/html/docbook.html
DocBook XSL: The Complete Guide 4th Ed. by Bob Stayton, Sagehill Enterprises:http://www.sagehill.net/docbookxsl/index.html
Apache FOP 字体配置, The Apache XML Graphics Project: http://xmlgraphics.apache.org/fop/1.0/fonts.html
List of Unix utilities, Wikipedia: http://en.wikipedia.org/wiki/List_of_Unix_programs
xsltproc命令行参数, xmlsoft.org: http://xmlsoft.org/XSLT/xsltproc.html
XML 1.0 Recommendation, World Wide Web Consortium (W3C): http://www.w3.org/TR/2008/REC-xml-20081126/
w3schools.com: http://www.w3schools.com/
Entity Declarations, Attributes and Expansion, by Norman Walsh, O'REILLY xml.com:http://www.xml.com/pub/a/98/08/xmlqna2.html
HTML Paramter Refernce, DocBook XSL Stylesheets: Reference Documentation, by Norman Walsh, The DocBook Project:http://docbook.sourceforge.net/release/xsl/current/doc/html/
Fo Paramter Refernce, DocBook XSL Stylesheets: Reference Documentation, by Norman Walsh, The DocBook Project:http://docbook.sourceforge.net/release/xsl/current/doc/fo/
附录
附录A 字符实体符号表 [进度:7 / 19]
iso-amsa.ent [56个表示关系的箭头符号]
实体名称
实体符号
cularr
↶
curarr
↷
dArr
⇓
darr2
⇊
dharl
⇃
dharr
⇂
lAarr
⇚
Larr
↞
larr2
⇇
larrhk
↩
larrlp
↫
larrtl
↢
lhard
↽
lharu
↼
hArr
⇔
harr
↔
lrarr2
⇆
rlarr2
⇄
harrw
↭
rlhar2
⇌
lrhar2
⇋
lsh
↰
map
↦
mumap
⊸
nearr
↗
nlArr
⇍
nlarr
↚
nhArr
⇎
nharr
↮
nrarr
↛
nrArr
⇏
nwarr
↖
olarr
↺
orarr
↻
rAarr
⇛
Rarr
↠
rarr2
⇉
rarrhk
↪
rarrlp
↬
rarrtl
↣
rarrw
↝
rhard
⇁
rharu
⇀
rsh
↱
drarr
↘
dlarr
↙
uArr
⇑
uarr2
⇈
vArr
⇕
varr
↕
uharl
↿
uharr
↾
xlArr
⇐
xhArr
↔
xharr
↔
xrArr
⇒
iso-amsb.ent [42个表示二进制操作符的符号]
实体名称
实体符号
amalg
∐
Barwed
⌆
barwed
⊼
Cap
⋒
Cup
⋓
cuvee
⋎
cuwed
⋏
diam
⋄
divonx
⋇
intcal
⊺
lthree
⋋
ltimes
⋉
minusb
⊟
oast
⊛
ocir
⊚
odash
⊝
odot
⊙
ominus
⊖
oplus
⊕
osol
⊘
otimes
⊗
plusb
⊞
plusdo
∔
rthree
⋌
rtimes
⋊
sdot
⋅
sdotb
⊡
setmn
∖
sqcap
⊓
sqcup
⊔
ssetmn
∖
sstarf
⋆
timesb
⊠
top
⊤
uplus
⊎
wreath
≀
xcirc
○
xdtri
▽
xutri
△
coprod
∐
prod
∏
sum
∑
iso-amsc.ent [9个表示分界的符号]
实体名称
实体符号
rceil
⌉
rfloor
⌋
rpargt
urcorn
⌝
drcorn
⌟
lceil
⌈
lfloor
⌊
ulcorn
⌜
dlcorn
⌞
iso-amsn.ent [59个表示不等的数学符号]
实体名称
实体符号
gnap
gne
≩
gnE
≩
gnsim
⋧
gvnE
≩
lnap
lnE
≨
lne
≨
lnsim
⋦
lvnE
≨
nap
≉
ncong
≇
nequiv
≢
ngE
≱
nge
≱
nges
≱
ngt
≯
nle
≰
nlE
≰
nles
≰
nlt
≮
nltri
⋪
nltrie
⋬
nmid
∤
npar
∦
npr
⊀
npre
⋠
nrtri
⋫
nrtrie
⋭
nsc
⊁
nsce
⋡
nsim
≁
nsime
≄
nsmid
nspar
∦
nsub
⊄
nsube
⊈
nsubE
⊈
nsup
⊅
nsupE
⊉
nsupe
⊉
nvdash
⊬
nvDash
⊭
nVDash
⊯
nVdash
⊮
prnap
⋨
prnE
prnsim
⋨
scnap
⋩
scnE
scnsim
⋩
subne
⊊
subnE
⊊
supne
⊋
supnE
⊋
vsubnE
vsubne
⊊
vsupne
⊋
vsupnE
⊋
iso-amso.ent [18个数学符号]
实体名称
实体符号
ang
∠
angmsd
∡
beth
ℶ
bprime
‵
comp
∁
daleth
ℸ
ell
ℓ
empty
∅
gimel
ℷ
image
ℑ
inodot
ı
nexist
∄
oS
Ⓢ
planck
ℏ
real
ℜ
sbsol
﹨
vprime
′
weierp
℘
iso-amsr.ent [84个表示关系的数学符号]
实体名称
实体符号
ape
≊
asymp
≍
bcong
≌
bepsi
∍
bowtie
⋈
bsim
∽
bsime
⋍
bump
≎
bumpe
≏
cire
≗
colone
≔
cuepr
⋞
cuesc
⋟
cupre
≼
dashv
⊣
ecir
≖
ecolon
≕
eDot
≑
esdot
≐
efDot
≒
egs
⋝
els
⋜
erDot
≓
fork
⋔
frown
⌢
gap
≳
gsdot
⋗
gE
≧
gel
⋛
gEl
⋛
ges
≥
Gg
⋙
gl
≷
gsim
≳
Gt
≫
lap
≲
ldot
⋖
lE
≦
lEg
⋚
leg
⋚
les
≤
lg
≶
Ll
⋘
lsim
≲
Lt
≪
ltrie
⊴
mid
∣
models
⊧
pr
≺
prap
≾
pre
≼
prsim
≾
rtrie
⊵
samalg
∐
sc
≻
scap
≿
sccue
≽
sce
≽
scsim
≿
sfrown
⌢
smid
smile
⌣
spar
∥
sqsub
⊏
sqsube
⊑
sqsup
⊐
sqsupe
⊒
ssmile
⌣
Sub
⋐
subE
⊆
Sup
⋑
supE
⊇
thkap
≈
thksim
∼
trie
≜
twixt
≬
vdash
⊢
Vdash
⊩
vDash
⊨
veebar
⊻
vltri
⊲
vprop
∝
vrtri
⊳
Vvdash
⊪
iso-box.ent [40个画边框线的符号]
实体名称
实体符号
boxh
─
boxv
│
boxur
└
boxul
┘
boxdl
┐
boxdr
┌
boxvr
├
boxhu
┴
boxvl
┤
boxhd
┬
boxvh
┼
boxvR
╞
boxhU
╧
boxvL
╡
boxhD
╤
boxvH
╪
boxH
═
boxV
║
boxUR
╘
boxUL
╛
boxDL
╕
boxDR
╒
boxVR
╟
boxHU
╨
boxVL
╢
boxHD
╥
boxVH
╫
boxVr
╠
boxHu
╩
boxVl
╣
boxHd
╦
boxVh
╬
boxuR
╙
boxUl
╜
boxdL
╖
boxDr
╓
boxUr
╚
boxuL
╝
boxDl
╗
boxdR
╔
符号很多,不可能在一个XML文档中全部都用上,可根据实际需要进行取舍。
你可能感兴趣的:(DocBook 5 快速起步教程)
QQ群采集助手,精准引流必备神器
2401_87347160
其他 经验分享
功能概述微信群查找与筛选工具是一款专为微信用户设计的辅助工具,它通过关键词搜索功能,帮助用户快速找到相关的微信群,并提供筛选是否需要验证的群组的功能。主要功能关键词搜索:用户可以输入关键词,工具将自动查找包含该关键词的微信群。筛选功能:工具提供筛选机制,用户可以选择是否只显示需要验证或不需要验证的群组。精准引流:通过上述功能,用户可以更精准地找到目标群组,进行有效的引流操作。3.设备需求该工具可以
2020-01-25
晴岚85
郑海燕坚持分享590天2020.1.24在生活中只存在两个问题。一个问题是:你知道想要达成的目标是什么,但却不知道如何才能达成;另一个问题是:你不知道你的目标是什么。前一个是行动的问题,后一个是结果的问题。通过制定具体的下一步行动,可以解决不知道如何开始行动的问题。而通过去想象结果,对结果做预估,可以解决找不着目标的问题。对于所有吸引我们注意力,想要完成的任务,你可以先想象一下,预期的结果究竟是什
element实现动态路由+面包屑
软件技术NINI
vue案例 vue.js 前端
el-breadcrumb是ElementUI组件库中的一个面包屑导航组件,它用于显示当前页面的路径,帮助用户快速理解和导航到应用的各个部分。在Vue.js项目中,如果你已经安装了ElementUI,就可以很方便地使用el-breadcrumb组件。以下是一个基本的使用示例:安装ElementUI(如果你还没有安装的话):你可以通过npm或yarn来安装ElementUI。bash复制代码npmi
谢谢你们,爱你们!
鹿游儿
昨天家人去泡温泉,二个孩子也带着去,出发前一晚,匆匆下班,赶回家和孩子一起收拾。饭后,我拿出笔和本子(上次去澳门时做手帐的本子)写下了1\2\3\4\5\6\7\8\9,让后让小壹去思考,带什么出发去旅游呢?她在对应的数字旁边画上了,泳衣、泳圈、肖恩、内衣内裤、tapuy、拖鞋……画完后,就让她自己对着这个本子,将要带的,一一带上,没想到这次带的书还是这本《便便工厂》(晚上姑婆发照片过来,妹妹累得
理解Gunicorn:Python WSGI服务器的基石
范范0825
ipython linux 运维
理解Gunicorn:PythonWSGI服务器的基石介绍Gunicorn,全称GreenUnicorn,是一个为PythonWSGI(WebServerGatewayInterface)应用设计的高效、轻量级HTTP服务器。作为PythonWeb应用部署的常用工具,Gunicorn以其高性能和易用性著称。本文将介绍Gunicorn的基本概念、安装和配置,帮助初学者快速上手。1.什么是Gunico
《策划经理回忆录之二》
路基雅虎
话说三年变六年,飘了,飘了……眨眼,2013年5月,老吴回到了他的家乡——油城从新开启他的工作幻想症生涯。很庆幸,这是一家很有追求,同时敢于尝试的,且实力不容低调的新星房企——金源置业(前身泰源置业)更值得庆幸的是第一个盘就是油城十路的标杆之一:金源盛世。2013年5月,到2015年11月,两年的陪伴,迎来了一场大爆发。2000个筹,5万/筹,直接回笼1个亿!!!这……让我开始认真审视这座看似五线
Long类型前后端数据不一致
igotyback
前端
响应给前端的数据浏览器控制台中response中看到的Long类型的数据是正常的到前端数据不一致前后端数据类型不匹配是一个常见问题,尤其是当后端使用Java的Long类型(64位)与前端JavaScript的Number类型(最大安全整数为2^53-1,即16位)进行数据交互时,很容易出现精度丢失的问题。这是因为JavaScript中的Number类型无法安全地表示超过16位的整数。为了解决这个问
高级编程--XML+socket练习题
masa010
java 开发语言
1.北京华北2114.8万人上海华东2,500万人广州华南1292.68万人成都华西1417万人(1)使用dom4j将信息存入xml中(2)读取信息,并打印控制台(3)添加一个city节点与子节点(4)使用socketTCP协议编写服务端与客户端,客户端输入城市ID,服务器响应相应城市信息(5)使用socketTCP协议编写服务端与客户端,客户端要求用户输入city对象,服务端接收并使用dom4j
今日联对0306
诗图佳得
自对联:烟销皓月临江浒,水漫金山荡塔裙。一一肖士平2020.3.6.1、试对肖老师联:烟销皓月临江浒,夜笼寒沙梦晚舟。耀哥求正2、试对萧老师联:烟销浩月临江浒,雾散乾坤解汉城。秀霞习作请各位老师校正3、自对联:烟销皓月临江浒,水漫金山荡塔裙。一一肖士平2020.3.6.4、试对肖老师垫场联:烟销皓月临江浒,雾锁寒林缈葉丛。小智求正[抱拳]5、试对肖老师联:烟销皓月临江浒;风卷乱云入峰巅。一一五品6
每日一题——第八十一题
互联网打工人no1
C语言程序设计每日一练 c语言
打印如下图案:#includeintmain(){inti,j;charch='A';for(i=1;i<5;i++,ch++){for(j=0;j<5-i;j++){printf("");//控制空格输出}for(j=1;j<2*i;j++)//条件j<2*i{printf("%c",ch);//控制字符输出}printf("\n");}return0;}
每日一题——第八十四题
互联网打工人no1
C语言程序设计每日一练 c语言
题目:编写函数1、输入10个职工的姓名和职工号2、按照职工由大到小顺序排列,姓名顺序也随之调整3、要求输入一个职工号,用折半查找法找出该职工的姓名#define_CRT_SECURE_NO_WARNINGS#include#include#defineMAX_EMPLOYEES10typedefstruct{intid;charname[50];}Empolyee;voidinputEmploye
《小满细雨轻湿尘》
快乐的人ZZM
图片发自App《小满细雨轻湿尘》文/快乐的人zzm小满细雨轻湿尘石榴花开落纷纷落红不是无情物坠入泥土育养根2018-5-23
Python中os.environ基本介绍及使用方法
鹤冲天Pro
# Python python 服务器 开发语言
文章目录python中os.environos.environ简介os.environ进行环境变量的增删改查python中os.environ的使用详解1.简介2.key字段详解2.1常见key字段3.os.environ.get()用法4.环境变量的增删改查和判断是否存在4.1新增环境变量4.2更新环境变量4.3获取环境变量4.4删除环境变量4.5判断环境变量是否存在python中os.envi
腾讯云技术深度探索:构建高效云原生微服务架构
我的运维人生
云原生 架构 腾讯云 运维开发 技术共享
腾讯云技术深度探索:构建高效云原生微服务架构在当今快速发展的技术环境中,云原生技术已成为企业数字化转型的关键驱动力。腾讯云作为行业领先的云服务提供商,不断推出创新的产品和技术,助力企业构建高效、可扩展的云原生微服务架构。本文将深入探讨腾讯云在微服务领域的最新进展,并通过一个实际案例展示如何在腾讯云平台上构建云原生应用。腾讯云微服务架构概览腾讯云微服务架构基于云原生理念,旨在帮助企业快速实现应用的容
情殇——(5)压抑的小木匠放纵了自己。
石疯聊情感故事
木讷的小木匠,其实只是不苟言笑。其实内心深处也是挣扎着,由于性格内敛,不喜形于色,给人的感觉非常的木讷。其实小木匠情商智商都不低。他为人扎实,非常的务实。他的爱是既深沉又宽容。可是是一个男人,都会对妻子出轨的事儿,不会忘怀!只是压抑在心底,为了某种考量或许是真爱。小木匠对于丽影和别人私奔又重回家庭,表面上并没有,天翻地覆,暴风骤雨,其内心深处也是经历了,痛苦的挣扎。。。再一次酒后,他和一个离家多年
怎么起诉借钱不还的人?怎样起诉欠款不还的人?
影子爱学习
怎么起诉借钱不还的人?怎样起诉欠款不还的人?如果遇到难以解决的法律问题,我们可以匹配专业律师。例如:婚姻家庭(离婚纠纷)、刑事辩护、合同纠纷、债权债务、房产(继承)纠纷、交通事故、劳动争议、人身损害、公司相关法律事务(法律顾问)等咨询推荐手机/微信:15633770876【全国案件皆可】借钱不还起诉对方需要哪些资料起诉欠钱不还的,一般需要的材料包括以下这些:借据、收据、欠条、付款凭证等证据,以及向
第四天旅游线路预览——从换乘中心到喀纳斯湖
陟彼高冈yu
基于Google earth studio 的旅游规划和预览 旅游
第四天:从贾登峪到喀纳斯风景区入口,晚上住宿贾登峪;换乘中心有4路车,喀纳斯①号车,去喀纳斯湖,路程时长约5分钟;将上面的的行程安排进行动态展示,具体步骤见”Googleearthstudio进行动态轨迹显示制作过程“、“Googleearthstudio入门教程”和“Googleearthstudio进阶教程“相关内容,得到行程如下所示:Day4-2-480p
linux sdl windows.h,Windows下的SDL安装
奔跑吧linux内核
linux sdl windows.h
首先你要下载并安装SDL开发包。如果装在C盘下,路径为C:\SDL1.2.5如果在WINDOWS下。你可以按以下步骤:1.打开VC++,点击"Tools",Options2,点击directories选项3.选择"Includefiles"增加一个新的路径。"C:\SDL1.2.5\include"4,现在选择"Libaryfiles“增加"C:\SDL1.2.5\lib"现在你可以开始编写你的第
Python教程:一文了解使用Python处理XPath
旦莫
Python进阶 python 开发语言
目录1.环境准备1.1安装lxml1.2验证安装2.XPath基础2.1什么是XPath?2.2XPath语法2.3示例XML文档3.使用lxml解析XML3.1解析XML文档3.2查看解析结果4.XPath查询4.1基本路径查询4.2使用属性查询4.3查询多个节点5.XPath的高级用法5.1使用逻辑运算符5.2使用函数6.实战案例6.1从网页抓取数据6.1.1安装Requests库6.1.2代
相信相信的力量
孙丽_cdb3
孙丽中级十期坚持分享第345天有一个特别有哲理的故事:有一只老鹰下了蛋,这个蛋,不知怎的就滚到了鸡窝里去了,鸡也下了一窝蛋,然后鸡妈妈把这些蛋全都浮出来了,孵出来之后等小鸡长大一点了,就觉得鹰蛋孵出来的那只小鹰怪模怪样,这些小鸡都嘲笑它,真难看,真笨,丑死了,那只小鹰觉得自己真是谁也不像,真是不好看,后来鸡妈妈也不喜欢他,我怎么生出你这样的孩子来了?真烦人,后来这群小鸡和小鹰一起生活,有一天,老鹰
linux中sdl的使用教程,sdl使用入门
Melissa Corvinus
linux中sdl的使用教程
本文通过一个简单示例讲解SDL的基本使用流程。示例中展示一个窗口,窗口里面有个随机颜色快随机移动。当我们鼠标点击关闭按钮时间窗口关闭。基本步骤如下:1.初始化SDL并创建一个窗口。SDL_Init()初始化SDL_CreateWindow()创建窗口2.纹理渲染存储RGB和存储纹理的区别:比如一个从左到右由红色渐变到蓝色的矩形,用存储RGB的话就需要把矩形中每个点的具体颜色值存储下来;而纹理只是一
PHP环境搭建详细教程
好看资源平台
前端 php
PHP是一个流行的服务器端脚本语言,广泛用于Web开发。为了使PHP能够在本地或服务器上运行,我们需要搭建一个合适的PHP环境。本教程将结合最新资料,介绍在不同操作系统上搭建PHP开发环境的多种方法,包括Windows、macOS和Linux系统的安装步骤,以及本地和Docker环境的配置。1.PHP环境搭建概述PHP环境的搭建主要分为以下几类:集成开发环境:例如XAMPP、WAMP、MAMP,这
基于社交网络算法优化的二维最大熵图像分割
智能算法研学社(Jack旭)
智能优化算法应用 图像分割 算法 php 开发语言
智能优化算法应用:基于社交网络优化的二维最大熵图像阈值分割-附代码文章目录智能优化算法应用:基于社交网络优化的二维最大熵图像阈值分割-附代码1.前言2.二维最大熵阈值分割原理3.基于社交网络优化的多阈值分割4.算法结果:5.参考文献:6.Matlab代码摘要:本文介绍基于最大熵的图像分割,并且应用社交网络算法进行阈值寻优。1.前言阅读此文章前,请阅读《图像分割:直方图区域划分及信息统计介绍》htt
509. 斐波那契数(每日一题)
lzyprime
lzyprime博客(github)创建时间:2021.01.04qq及邮箱:2383518170leetcode笔记题目描述斐波那契数,通常用F(n)表示,形成的序列称为斐波那契数列。该数列由0和1开始,后面的每一项数字都是前面两项数字的和。也就是:F(0)=0,F(1)=1F(n)=F(n-1)+F(n-2),其中n>1给你n,请计算F(n)。示例1:输入:2输出:1解释:F(2)=F(1)+
使用 FinalShell 进行远程连接(ssh 远程连接 Linux 服务器)
编程经验分享
开发工具 服务器 ssh linux
目录前言基本使用教程新建远程连接连接主机自定义命令路由追踪前言后端开发,必然需要和服务器打交道,部署应用,排查问题,查看运行日志等等。一般服务器都是集中部署在机房中,也有一些直接是云服务器,总而言之,程序员不可能直接和服务器直接操作,一般都是通过ssh连接来登录服务器。刚接触远程连接时,使用的是XSHELL来远程连接服务器,连接上就能够操作远程服务器了,但是仅用XSHELL并没有上传下载文件的功能
18-115 一切思考不能有效转化为行动,都TM是扯淡!
成长时间线
7月25号写了一篇关于为什么会断更如此严重的反思,然而,之后日更仅仅维持了一周,又出现了这次更严重的现象。从8月2号到昨天8月6号,5天!又是5天没有更文!虽然这次断更时间和上次一样,那为什么说这次更严重?因为上次之后就分析了问题的原因,以及应该如何解决,按理说应该会好转,然而,没过几天严重断更的现象再次出现,想想,经过反思,问题依然没有解决与改变,这让我有些担忧。到底是哪里出了问题,难道我就真的
郎朗大婚娶公主:所有光环的背后,都是十年如一日的自律
简小尘
近日,关于郎朗大婚的新闻上了热搜,看了新娘的照片,既有天使般的面容,更有魔鬼般的身材,关键是人家还身世好,又有才华,这真的是让所有男人羡慕嫉妒恨哪。有些人不禁会想,“凭什么郎朗的人生就象开挂了一样,可我却每天都活得这么狼狈!”其实,每个开挂的人生背后,都是苦行僧般的自律。01欲戴王冠,必承其重。练琴不能只靠兴趣,更需要自律!我们先来看一下朗朗在小时候的作息时间表:早晨5:45起床,练琴1小时。中午
《中华小厨师》单行VS爱藏:姜是老的辣,书是新的好
cicoky
《汉书·郦食其传》有曰:“王者以民为天,而民以食为天。”自古以来,吃饱饭是每一个人的基本要求,而吃好饭却是每一个人的最终追求。于是,厨师这一职业孕育而生,其渊源之久,甚至可追溯到4000年前的奴隶时代。职业本身无贵贱,但职业能力却有高低之分。所以一家餐馆生意好不好,厨师的水平决定一切,而站在所有厨师顶端的就被称之为“特级厨师”。今天要说的就是一个关于“特级厨师刘昴星”的故事。连载历程1995年第4
读《人世间》有感
一0一
这个寒假,就如同朋友圈中的一段话:一闭眼,一睁眼假期还有5天,在一闭眼一睁眼假期还有12天;再一闭眼一睁眼假期还有20天;不敢睡,不敢睡啊……受疫情影响,这个假期变得漫长又煎熬,我也无时无刻不关注着疫情的变化。当然这样的一个假期,我还真得要感谢周翔,因为他有个爱看书的习惯,所以家里有不少他看过的书,可以让我随意挑选,因此也让我的假期不至于那么无所事事。这次我选了一本梁晓声的《人世间》,作为一名语文
四章-32-点要素的聚合
彩云飘过
本文基于腾讯课堂老胡的课《跟我学Openlayers--基础实例详解》做的学习笔记,使用的openlayers5.3.xapi。源码见1032.html,对应的官网示例https://openlayers.org/en/latest/examples/cluster.htmlhttps://openlayers.org/en/latest/examples/earthquake-clusters.
深入浅出Java Annotation(元注解和自定义注解)
Josh_Persistence
Java Annotation 元注解 自定义注解
一、基本概述
Annontation是Java5开始引入的新特征。中文名称一般叫注解。它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联。
更通俗的意思是为程序的元素(类、方法、成员变量)加上更直观更明了的说明,这些说明信息是与程序的业务逻辑无关,并且是供指定的工具或
mysql优化特定类型的查询
annan211
java 工作 mysql
本节所介绍的查询优化的技巧都是和特定版本相关的,所以对于未来mysql的版本未必适用。
1 优化count查询
对于count这个函数的网上的大部分资料都是错误的或者是理解的都是一知半解的。在做优化之前我们先来看看
真正的count()函数的作用到底是什么。
count()是一个特殊的函数,有两种非常不同的作用,他可以统计某个列值的数量,也可以统计行数。
在统
MAC下安装多版本JDK和切换几种方式
棋子chessman
jdk
环境:
MAC AIR,OS X 10.10,64位
历史:
过去 Mac 上的 Java 都是由 Apple 自己提供,只支持到 Java 6,并且OS X 10.7 开始系统并不自带(而是可选安装)(原自带的是1.6)。
后来 Apple 加入 OpenJDK 继续支持 Java 6,而 Java 7 将由 Oracle 负责提供。
在终端中输入jav
javaScript (1)
Array_06
JavaScript java 浏览器
JavaScript
1、运算符
运算符就是完成操作的一系列符号,它有七类: 赋值运算符(=,+=,-=,*=,/=,%=,<<=,>>=,|=,&=)、算术运算符(+,-,*,/,++,--,%)、比较运算符(>,<,<=,>=,==,===,!=,!==)、逻辑运算符(||,&&,!)、条件运算(?:)、位
国内顶级代码分享网站
袁潇含
java jdk oracle .net PHP
现在国内很多开源网站感觉都是为了利益而做的
当然利益是肯定的,否则谁也不会免费的去做网站
&
Elasticsearch、MongoDB和Hadoop比较
随意而生
mongodb hadoop 搜索引擎
IT界在过去几年中出现了一个有趣的现象。很多新的技术出现并立即拥抱了“大数据”。稍微老一点的技术也会将大数据添进自己的特性,避免落大部队太远,我们看到了不同技术之间的边际的模糊化。假如你有诸如Elasticsearch或者Solr这样的搜索引擎,它们存储着JSON文档,MongoDB存着JSON文档,或者一堆JSON文档存放在一个Hadoop集群的HDFS中。你可以使用这三种配
mac os 系统科研软件总结
张亚雄
mac os
1.1 Microsoft Office for Mac 2011
大客户版,自行搜索。
1.2 Latex (MacTex):
系统环境:https://tug.org/mactex/
&nb
Maven实战(四)生命周期
AdyZhang
maven
1. 三套生命周期 Maven拥有三套相互独立的生命周期,它们分别为clean,default和site。 每个生命周期包含一些阶段,这些阶段是有顺序的,并且后面的阶段依赖于前面的阶段,用户和Maven最直接的交互方式就是调用这些生命周期阶段。 以clean生命周期为例,它包含的阶段有pre-clean, clean 和 post
Linux下Jenkins迁移
aijuans
Jenkins
1. 将Jenkins程序目录copy过去 源程序在/export/data/tomcatRoot/ofctest-jenkins.jd.com下面 tar -cvzf jenkins.tar.gz ofctest-jenkins.jd.com &
request.getInputStream()只能获取一次的问题
ayaoxinchao
request Inputstream
问题:在使用HTTP协议实现应用间接口通信时,服务端读取客户端请求过来的数据,会用到request.getInputStream(),第一次读取的时候可以读取到数据,但是接下来的读取操作都读取不到数据
原因: 1. 一个InputStream对象在被读取完成后,将无法被再次读取,始终返回-1; 2. InputStream并没有实现reset方法(可以重
数据库SQL优化大总结之 百万级数据库优化方案
BigBird2012
SQL优化
网上关于SQL优化的教程很多,但是比较杂乱。近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充。
这篇文章我花费了大量的时间查找资料、修改、排版,希望大家阅读之后,感觉好的话推荐给更多的人,让更多的人看到、纠正以及补充。
1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2.应尽量避免在 where
jsonObject的使用
bijian1013
java json
在项目中难免会用java处理json格式的数据,因此封装了一个JSONUtil工具类。
JSONUtil.java
package com.bijian.json.study;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
[Zookeeper学习笔记之六]Zookeeper源代码分析之Zookeeper.WatchRegistration
bit1129
zookeeper
Zookeeper类是Zookeeper提供给用户访问Zookeeper service的主要API,它包含了如下几个内部类
首先分析它的内部类,从WatchRegistration开始,为指定的znode path注册一个Watcher,
/**
* Register a watcher for a particular p
【Scala十三】Scala核心七:部分应用函数
bit1129
scala
何为部分应用函数?
Partially applied function: A function that’s used in an expression and that misses some of its arguments.For instance, if function f has type Int => Int => Int, then f and f(1) are p
Tomcat Error listenerStart 终极大法
ronin47
tomcat
Tomcat报的错太含糊了,什么错都没报出来,只提示了Error listenerStart。为了调试,我们要获得更详细的日志。可以在WEB-INF/classes目录下新建一个文件叫logging.properties,内容如下
Java代码
handlers = org.apache.juli.FileHandler, java.util.logging.ConsoleHa
不用加减符号实现加减法
BrokenDreams
实现
今天有群友发了一个问题,要求不用加减符号(包括负号)来实现加减法。
分析一下,先看最简单的情况,假设1+1,按二进制算的话结果是10,可以看到从右往左的第一位变为0,第二位由于进位变为1。
 
读《研磨设计模式》-代码笔记-状态模式-State
bylijinnan
java 设计模式
声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/
/*
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类
状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况
把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化
如果在
CUDA程序block和thread超出硬件允许值时的异常
cherishLC
CUDA
调用CUDA的核函数时指定block 和 thread大小,该大小可以是dim3类型的(三维数组),只用一维时可以是usigned int型的。
以下程序验证了当block或thread大小超出硬件允许值时会产生异常!!!GPU根本不会执行运算!!!
所以验证结果的正确性很重要!!!
在VS中创建CUDA项目会有一个模板,里面有更详细的状态验证。
以下程序在K5000GPU上跑的。
诡异的超长时间GC问题定位
chenchao051
jvm cms GC hbase swap
HBase的GC策略采用PawNew+CMS, 这是大众化的配置,ParNew经常会出现停顿时间特别长的情况,有时候甚至长到令人发指的地步,例如请看如下日志:
2012-10-17T05:54:54.293+0800: 739594.224: [GC 739606.508: [ParNew: 996800K->110720K(996800K), 178.8826900 secs] 3700
maven环境快速搭建
daizj
安装 mavne 环境配置
一 下载maven
安装maven之前,要先安装jdk及配置JAVA_HOME环境变量。这个安装和配置java环境不用多说。
maven下载地址:http://maven.apache.org/download.html,目前最新的是这个apache-maven-3.2.5-bin.zip,然后解压在任意位置,最好地址中不要带中文字符,这个做java 的都知道,地址中出现中文会出现很多
PHP网站安全,避免PHP网站受到攻击的方法
dcj3sjt126com
PHP
对于PHP网站安全主要存在这样几种攻击方式:1、命令注入(Command Injection)2、eval注入(Eval Injection)3、客户端脚本攻击(Script Insertion)4、跨网站脚本攻击(Cross Site Scripting, XSS)5、SQL注入攻击(SQL injection)6、跨网站请求伪造攻击(Cross Site Request Forgerie
yii中给CGridView设置默认的排序根据时间倒序的方法
dcj3sjt126com
GridView
public function searchWithRelated() {
$criteria = new CDbCriteria;
$criteria->together = true; //without th
Java集合对象和数组对象的转换
dyy_gusi
java集合
在开发中,我们经常需要将集合对象(List,Set)转换为数组对象,或者将数组对象转换为集合对象。Java提供了相互转换的工具,但是我们使用的时候需要注意,不能乱用滥用。
1、数组对象转换为集合对象
最暴力的方式是new一个集合对象,然后遍历数组,依次将数组中的元素放入到新的集合中,但是这样做显然过
nginx同一主机部署多个应用
geeksun
nginx
近日有一需求,需要在一台主机上用nginx部署2个php应用,分别是wordpress和wiki,探索了半天,终于部署好了,下面把过程记录下来。
1. 在nginx下创建vhosts目录,用以放置vhost文件。
mkdir vhosts
2. 修改nginx.conf的配置, 在http节点增加下面内容设置,用来包含vhosts里的配置文件
#
ubuntu添加admin权限的用户账号
hongtoushizi
ubuntu useradd
ubuntu创建账号的方式通常用到两种:useradd 和adduser . 本人尝试了useradd方法,步骤如下:
1:useradd
使用useradd时,如果后面不加任何参数的话,如:sudo useradd sysadm 创建出来的用户将是默认的三无用户:无home directory ,无密码,无系统shell。
顾应该如下操作:
第五章 常用Lua开发库2-JSON库、编码转换、字符串处理
jinnianshilongnian
nginx lua
JSON库
在进行数据传输时JSON格式目前应用广泛,因此从Lua对象与JSON字符串之间相互转换是一个非常常见的功能;目前Lua也有几个JSON库,本人用过cjson、dkjson。其中cjson的语法严格(比如unicode \u0020\u7eaf),要求符合规范否则会解析失败(如\u002),而dkjson相对宽松,当然也可以通过修改cjson的源码来完成
Spring定时器配置的两种实现方式OpenSymphony Quartz和java Timer详解
yaerfeng1989
timer quartz 定时器
原创整理不易,转载请注明出处:Spring定时器配置的两种实现方式OpenSymphony Quartz和java Timer详解
代码下载地址:http://www.zuidaima.com/share/1772648445103104.htm
有两种流行Spring定时器配置:Java的Timer类和OpenSymphony的Quartz。
1.Java Timer定时
首先继承jav
Linux下df与du两个命令的差别?
pda158
linux
一、df显示文件系统的使用情况,与du比較,就是更全盘化。 最经常使用的就是 df -T,显示文件系统的使用情况并显示文件系统的类型。 举比例如以下: [root@localhost ~]# df -T Filesystem Type &n
[转]SQLite的工具类 ---- 通过反射把Cursor封装到VO对象
ctfzh
VO android sqlite 反射 Cursor
在写DAO层时,觉得从Cursor里一个一个的取出字段值再装到VO(值对象)里太麻烦了,就写了一个工具类,用到了反射,可以把查询记录的值装到对应的VO里,也可以生成该VO的List。
使用时需要注意:
考虑到Android的性能问题,VO没有使用Setter和Getter,而是直接用public的属性。
表中的字段名需要和VO的属性名一样,要是不一样就得在查询的SQL中
该学习笔记用到的Employee表
vipbooks
oracle sql 工作
这是我在学习Oracle是用到的Employee表,在该笔记中用到的就是这张表,大家可以用它来学习和练习。
drop table Employee;
-- 员工信息表
create table Employee(
-- 员工编号
EmpNo number(3) primary key,
-- 姓