列表分类是指在Word文档中使用不同格式排序的列表,来帮助我们一目了然地表达出一段文字的主要内容。比如,当我们描述了某个主题的若干点,就可以用列表把它们一一表达出来,而不是写成完整的段落形式。同时,列表也可以帮助我们做出精确的计算和比较,简洁有效地表示出不同部分之间的关系。在Word文档中创建列表可以便于人们去检索资料方便定位,其中总共有四种不同类型的列表:编号列表、项目符号列表、多级编号列表和多级混合类型列表。本文就将详细为您介绍如何使用C++在Word文档中创建编号列表、项目符号列表和多级列表。
有两种方法可以将 Spire.Doc for C++ 集成到您的应用程序中。一种方法是通过 NuGet 安装它,另一种方法是从我们的网站下载包并将库复制到您的程序中。通过 NuGet 安装更简单,更推荐使用。您可以通过访问以下链接找到更多详细信息。
如何将 Spire.Doc for C++ 集成到 C++ 程序中
您可以使用ListStyle类创建编号列表样式或项目符号样式。然后,可以使用Paragraph->GetListFormat()->ApplyStyle() 方法将列表样式应用于段落。创建编号列表的步骤如下。
C++
#include "Spire.Doc.o.h"; using namespace Spire::Doc; using namespace std; int main() { //创建一个Document对象 intrusive_ptr<Document> document = new Document(); //添加一个节 intrusive_ptr<Section> section = document->AddSection(); //创建编号列表样式 intrusive_ptr<ListStyle> listStyle = new ListStyle(document, ListType::Numbered); listStyle->SetName(L"numberedList"); listStyle->GetLevels()->GetItem(0)->SetPatternType(ListPatternType::DecimalEnclosedParen); listStyle->GetLevels()->GetItem(0)->SetTextPosition(20); document->GetListStyles()->Add(listStyle); //添加一个段落 intrusive_ptr<Paragraph> paragraph = section->AddParagraph(); paragraph->AppendText(L"完整的论证要素:"); paragraph->GetFormat()->SetAfterSpacing(5); //添加段落并对其应用编号列表样式 paragraph = section->AddParagraph(); paragraph->AppendText(L"论题"); paragraph->GetListFormat()->ApplyStyle(L"numberedList"); paragraph->GetListFormat()->SetListLevelNumber(0); //再添加四个段落,并将编号列表样式应用于特定段落 paragraph = section->AddParagraph(); paragraph->AppendText(L"论点"); paragraph->GetListFormat()->ApplyStyle(L"numberedList"); paragraph->GetListFormat()->SetListLevelNumber(0); paragraph = section->AddParagraph(); paragraph->AppendText(L"论据"); paragraph->GetListFormat()->ApplyStyle(L"numberedList"); paragraph->GetListFormat()->SetListLevelNumber(0); paragraph = section->AddParagraph(); paragraph->AppendText(L"论证方式"); paragraph->GetListFormat()->ApplyStyle(L"numberedList"); paragraph->GetListFormat()->SetListLevelNumber(0); //将文档保存为Word文件 document->SaveToFile(L"FE编号列表.docx", FileFormat::Docx2019); document->Dispose(); }
创建项目符号列表的过程与创建编号列表的过程类似。不同之处在于,创建列表样式时,必须将列表类型指定为“项目符号”,并为其设置项目符号。以下是详细步骤。
C++
#include "Spire.Doc.o.h"; using namespace Spire::Doc; using namespace std; int main() { //创建一个Document对象 intrusive_ptr<Document> document = new Document(); //添加一个节 intrusive_ptr<Section> section = document->AddSection(); //创建项目符号列表样式 intrusive_ptr<ListStyle> listStyle = new ListStyle(document, ListType::Bulleted); listStyle->SetName(L"bulletedList"); listStyle->GetLevels()->GetItem(0)->SetBulletCharacter(L"\u00B7"); listStyle->GetLevels()->GetItem(0)->GetCharacterFormat()->SetFontName(L"Symbol"); listStyle->GetLevels()->GetItem(0)->SetTextPosition(20); document->GetListStyles()->Add(listStyle); //添加一个段落 intrusive_ptr<Paragraph> paragraph = section->AddParagraph(); paragraph->AppendText(L"常用的六种论证方法:"); paragraph->GetFormat()->SetAfterSpacing(5); //添加段落并对其应用项目符号列表样式 paragraph = section->AddParagraph(); paragraph->AppendText(L"举例论证"); paragraph->GetListFormat()->ApplyStyle(L"bulletedList"); paragraph->GetListFormat()->SetListLevelNumber(0); //再添加五个段落,并将项目符号列表样式应用于特定段落 paragraph = section->AddParagraph(); paragraph->AppendText(L"道理论证"); paragraph->GetListFormat()->ApplyStyle(L"bulletedList"); paragraph->GetListFormat()->SetListLevelNumber(0); paragraph = section->AddParagraph(); paragraph->AppendText(L"对比论证"); paragraph->GetListFormat()->ApplyStyle(L"bulletedList"); paragraph->GetListFormat()->SetListLevelNumber(0); paragraph = section->AddParagraph(); paragraph->AppendText(L"比喻论证"); paragraph->GetListFormat()->ApplyStyle(L"bulletedList"); paragraph->GetListFormat()->SetListLevelNumber(0); paragraph = section->AddParagraph(); paragraph->AppendText(L"引用论证"); paragraph->GetListFormat()->ApplyStyle(L"bulletedList"); paragraph->GetListFormat()->SetListLevelNumber(0); paragraph = section->AddParagraph(); paragraph->AppendText(L"因果论证"); paragraph->GetListFormat()->ApplyStyle(L"bulletedList"); paragraph->GetListFormat()->SetListLevelNumber(0); //保存结果文档 document->SaveToFile(L"FE项目符号列表.docx", FileFormat::Docx2019); document->Dispose(); }
多级列表至少由两个不同的级别组成。嵌套列表的每个级别都可以使用ListStyle->GetLevels()->GetItem(index) 方法进行访问。通过ListLevel对象,您可以设置某个级别的编号类型和前缀。以下是在Word中创建多级编号列表的步骤。
C++
#include "Spire.Doc.o.h"; using namespace Spire::Doc; using namespace std; int main() { //创建一个Document对象 intrusive_ptr<Document> document = new Document(); //添加一个节 intrusive_ptr<Section> section = document->AddSection(); //创建编号列表样式,指定每个级别的编号前缀和图案类型 intrusive_ptr<ListStyle> listStyle = new ListStyle(document, ListType::Numbered); listStyle->SetName(L"nestedStyle"); listStyle->GetLevels()->GetItem(0)->SetPatternType(ListPatternType::Arabic); listStyle->GetLevels()->GetItem(0)->SetTextPosition(20); listStyle->GetLevels()->GetItem(1)->SetNumberPrefix(L"%1."); listStyle->GetLevels()->GetItem(1)->SetPatternType(ListPatternType::Arabic); listStyle->GetLevels()->GetItem(2)->SetNumberPrefix(L"%1.%2."); listStyle->GetLevels()->GetItem(2)->SetPatternType(ListPatternType::Arabic); document->GetListStyles()->Add(listStyle); //添加一个段落 intrusive_ptr<Paragraph> paragraph = section->AddParagraph(); paragraph->AppendText(L"这是一个多级编号列表:"); paragraph->GetFormat()->SetAfterSpacing(5); //添加段落并对其应用编号列表样式 paragraph = section->AddParagraph(); paragraph->AppendText(L"水果"); paragraph->GetListFormat()->ApplyStyle(L"nestedStyle"); paragraph->GetListFormat()->SetListLevelNumber(0); //再添加五个段落,并将编号列表样式应用于特定段落 paragraph = section->AddParagraph(); paragraph->AppendText(L"蔬菜"); paragraph->GetListFormat()->ApplyStyle(L"nestedStyle"); paragraph->GetListFormat()->SetListLevelNumber(0); paragraph = section->AddParagraph(); paragraph->AppendText(L"根菜类"); paragraph->GetListFormat()->ApplyStyle(L"nestedStyle"); paragraph->GetListFormat()->SetListLevelNumber(1); paragraph = section->AddParagraph(); paragraph->AppendText(L"叶菜类"); paragraph->GetListFormat()->ContinueListNumbering(); paragraph->GetListFormat()->ApplyStyle(L"nestedStyle"); paragraph = section->AddParagraph(); paragraph->AppendText(L"小白菜"); paragraph->GetListFormat()->ApplyStyle(L"nestedStyle"); paragraph->GetListFormat()->SetListLevelNumber(2); paragraph = section->AddParagraph(); paragraph->AppendText(L"谷物"); paragraph->GetListFormat()->ApplyStyle(L"nestedStyle"); paragraph->GetListFormat()->SetListLevelNumber(0); //保存结果文档 document->SaveToFile(L"FE多级编号列表.docx", FileFormat::Docx2019); document->Dispose(); }
多级列表可以是编号列表和项目符号列表的组合。要创建混合类型列表,只需要创建编号列表样式和项目符号列表样式,并将它们应用于不同的段落。具体步骤如下。
C++
#include "Spire.Doc.o.h"; using namespace Spire::Doc; using namespace std; int main() { //创建一个Document对象 intrusive_ptr<Document> document = new Document(); //添加一个节 intrusive_ptr<Section> section = document->AddSection(); //创建编号列表样式 intrusive_ptr<ListStyle> numberedListStyle = new ListStyle(document, ListType::Numbered); numberedListStyle->SetName(L"numberedStyle"); numberedListStyle->GetLevels()->GetItem(0)->SetPatternType(ListPatternType::Arabic); numberedListStyle->GetLevels()->GetItem(0)->SetTextPosition(20); numberedListStyle->GetLevels()->GetItem(1)->SetPatternType(ListPatternType::LowLetter); document->GetListStyles()->Add(numberedListStyle); //创建项目符号列表样式 intrusive_ptr<ListStyle> bulletedListStyle = new ListStyle(document, ListType::Bulleted); bulletedListStyle->SetName(L"bulletedStyle"); bulletedListStyle->GetLevels()->GetItem(2)->SetBulletCharacter(L"\u002A"); bulletedListStyle->GetLevels()->GetItem(2)->GetCharacterFormat()->SetFontName(L"Symbol"); document->GetListStyles()->Add(bulletedListStyle); //添加段落 intrusive_ptr<Paragraph> paragraph = section->AddParagraph(); paragraph->AppendText(L"这是一个多级混合列表:"); paragraph->GetFormat()->SetAfterSpacing(5); //添加段落并对其应用编号列表样式 paragraph = section->AddParagraph(); paragraph->AppendText(L"水果"); paragraph->GetListFormat()->ApplyStyle(L"numberedStyle"); paragraph->GetListFormat()->SetListLevelNumber(0); //再添加五个段落,并对其应用不同的列表样式 paragraph = section->AddParagraph(); paragraph->AppendText(L"瓜果类"); paragraph->GetListFormat()->ApplyStyle(L"numberedStyle"); paragraph->GetListFormat()->SetListLevelNumber(1); paragraph = section->AddParagraph(); paragraph->AppendText(L"浆果类"); paragraph->GetListFormat()->SetListLevelNumber(1); paragraph->GetListFormat()->ApplyStyle(L"numberedStyle"); paragraph = section->AddParagraph(); paragraph->AppendText(L"蔓越莓"); paragraph->GetListFormat()->ApplyStyle(L"bulletedStyle"); paragraph->GetListFormat()->SetListLevelNumber(2); paragraph = section->AddParagraph(); paragraph->AppendText(L"覆盆子"); paragraph->GetListFormat()->ApplyStyle(L"bulletedStyle"); paragraph->GetListFormat()->SetListLevelNumber(2); paragraph = section->AddParagraph(); paragraph->AppendText(L"蔬菜"); paragraph->GetListFormat()->ApplyStyle(L"numberedStyle"); paragraph->GetListFormat()->SetListLevelNumber(0); //保存结果文档 document->SaveToFile(L"FE多级混合类型列表.docx", FileFormat::Docx); document->Dispose(); }
—本文完—
大家好,又见面了,我是你们的朋友全栈君。在Ubuntu上安装svn服务器(a)检查是否已安装 svn(b)若安装需要卸载 sudoapt-getremove--purgesubversion(c)安装 sudoapt-getupdate sudoapt-getinstallsubversion(d)安装后查看版本,确认是否安装成功 svnserve--version 若安装成功,如下图显示版本信息 (e)创建svn版本库生成以下路径: /usr/svn/repository/ cd/usr sudomkdirsvn cd/svn sudomkdirrepository给/repository赋予权限 chmod-R777repository创建svn仓库 svnadmincreate/usr/svn/repository 执行完该命令后,repository下将会生成以下文件 对db设置权限 chmod-R777db(f)设置访问权限修改repository下的配置文件/conf/svnserve.conf 如下图 添加访问用户,修改文件/conf/passwd userName=pa
最近笔者在阅读《深入浅出Node.js》,结合查阅的相关资料,本文算是一篇Node.js笔记。Node.js是基于ChromeV8引擎的JavaScript运行时环境。在Node.js出现之前,JavaScript只能在浏览器中使用。而Node.js的出现打破了这个局面。以下为Chrome浏览器和Node.js的组件构成。在Node.js中不需要处理UI,所以不需要关注webkit引擎、HTML、显卡等UI技术,从而能够更加“放手大胆”去做。它使用了GoogleV8引擎,V8引擎是采用C++书写的,将JavaScript代码编译成机器码。Node.js采用了V8引擎,并且在其基础上增加了处理本地文件等功能。但在浏览器中,出于安全考虑,你是无法访问浏览器的文件系统的。所以你可以理解Node中的V8引擎是增强后的版本。浏览器和Node.js的结构是相似的,比如它们都是通过事件驱动的异步架构,浏览器通过事件驱动来完成界面UI交互,Node.js通过事件驱动完成服务I/O。通过Node.js,JavaScript不仅仅可以写在浏览器端,我们可以在我们的电脑中直接执行JavaScript,也是完
大家好,又见面了,我是你们的朋友全栈君。连接:mysql-h主机地址-u用户名-p用户密码(注:u与root可以不用加空格,其它也一样)创建授权:grantselecton数据库.*to用户名@登录主机identifiedby\”密码\”修改密码:mysqladmin-u用户名-p旧密码password新密码删除授权:revokeselect,insert,update,deleteom*.*fromtest2@localhost;显示数据库:showdatabases;显示数据表:showtables;显示表结构:describe表名;创建表:createtable表名(字段设定列表);删除表:droptable表名;修改表:altertablet1renamet2查询表:select*from表名;清空表:deletefrom表名;备份表:mysqlbinmysqldump-h(ip)-uroot-p(password)databasenametablename>tablename.sql恢复表:mysqlbinmysql-h(ip)-uroot-p(password)dat
一论文题目:Dissectingandpredictingdifferenttypesofbindingsitesinnucleicacidsbasedonstructuralinformation论文摘要:DNA和RNA的生物学功能一般依赖于它们与其他分子的相互作用,如小配体、蛋白质和核酸。然而,我们对不同相互作用对的核酸结合位点的了解非常有限,识别这些关键的结合区域并非易事。在此,文章对这两类核酸中结合位点和非结合位点以及不同类型的结合位点进行了综合比较。从结构上看,RNA可以通过形成结合袋与配体相互作用,利用突出的表面与蛋白质和核酸接触,而DNA则可以通过靠近链中部的区域与其他分子接触。基于结构信息,充分利用不同机器学习算法、特征空间和样本空间之间的相互作用,建立基于特征的集成学习分类器来识别结合位点。同时,利用结构守恒设计了一个基于模板的分类器。这两个分类器之间的互补性帮助建立了一个综合的框架来提高预测性能。此外,文章还利用基于随机游走算法的处理过程进一步校正综合预测。统一的预测框架为不同的结合位点提供了良好的结果,并优于现有的方法。论文链接:https://academic.
最开始就有这个问题,但是一直没有管他。这次因为概况页面UI改版,所以开始着手处理。最开始以为是参数设置的问题,于是就找到了官方示例代码,把官方的一些参数加入到之前的代码里面发现不起作用。于是就把整个官方代码原封不动拷贝到项目中进行尝试,然后发现还是没有显示极地图中间的线条。然后我怀疑是版本的问题,看了一下项目中highcharts使用的版本是v7.1.2,而官方实例是用的最新版的v8.2.2,于是我把官方的版本下载下来放到项目中使用,果然新版的线条出来了。但是我想,之前的版本也不可能不能显示line啊?应该是有什么参数没设置正确。然后我就在网上搜索这个版本polar不显示线的问题,然后找到这篇讨论:https://www.highcharts.com/forum/viewtopic.php?t=42099大意就是有个开发者也遇到相同的问题,当时的最新版就是v7.1.2也不显示line,不过作者没有复现,但是作者强调:Pleaseconfirmthateveryscriptwhichyouhaveattachedisfromoneversion,toavoidcollisionlikei
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。解题思路当n=1时,只有一种跳法 当n=2时,有两种跳法 跳n阶台阶,可以先跳1阶台阶,再跳n-1阶台阶;或者先跳2阶台阶,再跳n-2阶台阶。而n-1和n-2阶台阶的跳法可以看成子问题,该问题的递推公式为: publicclassSolution{ publicintJumpFloor(inttarget){ if(target<=2) returntarget; intpre1=1,pre2=2; inttemp=0; for(inti=3;i<=target;i++){ temp=pre1+pre2; pre1=pre2; pre2=temp; } returnpre2; } }复制
前言当需要进行大规模查询时(比如目前遇到的情形:查询某个省所有发债企业的YY评级分数),人工查询显然太过费时,那就写个爬虫吧。由于该爬虫实在过于简单,就只简单概述下。一、请求端通过观察YY评级的网页信息,如下图(F12或右击进入检查,点击network—XHR—headers)。红色框表明是个get请求(其实这种网页基本都是Ajaxget,需要总结实际url的规律的)。绿色框即为实际URL,通过分析该URL,其由两部分组成。前半部分为“ https://web.ratingdog.cn/v1/search?”,后半部分为黄色框内内容用“&”符号连接后的结果。黄色框内的内容,只有企业名称为变量,且为已知变量,那URL即可据此确定了。另外需注意,YY评级需要登录才可查询数据,在构建头部信息进行访问时,一定要提前登录,并在头部信息中放入登录信息和登录状态。二、响应端通过观察网页的响应信息(F12或右击进入检查,点击network—XHR—response),如下图。响应信息及其简单,我们所需要的YY评级分数安详地躺在那里,简单到一个正则表达式就可以提取出该数据。正则如下:“msg”.
在上次的文档中,我说自己要用python实践一下网络上流传的筹码分布算法,后边我做了,但是感觉计算量比较大,我假设一个周期是120天,也就是120天的话,基本所有持仓的人都会卖出自己手中的筹码。然后我选择要展示的是最近的120,因此在计算的时间窗口上,我采用240天,也就是前边的120天是仅仅是为保证最近的120的数据不会有大的出入。除此之外还实现了论文2中的算法,相对来说比较简单。对于基于行为金融学中的算法,我选择了放弃,因为每次都要从股票上市的哪天进行计算,计算量比较大。通过对后边两种算法的实现,发现网上流传的筹码分布算法和各种软件上筹码分布图非常类似,差别很小。这里贴出我的实践结果。 1.其中K线图中红线是论文一种的筹码成本线,绿线是网络上流传的炒股软件的移动成本线,最底下的灰线是100日均线。2.K线中的点黄点表示趋势正常(这块还需要好好思考,会有假点存在)黑点表示买入机会(也需要详细思考,目前是基于均线来做的,有假点的存在)黑色的加号表示减仓消息,蓝色的乘号表示加仓消息。3.最底下的是成交量分布4.最右侧是筹码分布图,单位事当前价格*100.红线表示当日的平均成本。5.下边的
mixins介绍官方链接说人话就是vue给我们提供了一种更加灵活的实现业务实现逻辑的方式。mixins局部使用和使用同名钩子函数的执行顺序看源码:<template> <divclass="hello"> <inputv-model="name"/> <button@click="func_name()">点击</button> </div> </template> <script> //验证调用先后顺序 varwatchcount={ //验证调用的先后顺序 updated(){ console.info(this.count+"我是mixins的updated方法"); } }; exportdefault{ name:"HelloWorld", data(){ return{ count:0, name:"" }; }, mixins:[watchcount], u
背景分析EasyNVR整套方案的架构中,涉及到前端设备(摄像机IPC、硬盘录像机NVR、编码器等)、流媒体服务端(EasyNVR)、客户端终端设备(PC、浏览器、Android、iOS、微信)。在保证EasyNVR和前端设备之间网络相通的基础条件下,EasyNVR通过获取数字网络摄像机视频流完成音视频的采集,然后由EasyNVR内部实现流媒体协议转换、转码和流媒体分发工作,最终可以分发出RTMP、HTTP-FLV和HLS流,EasyNVR自身也可以对实时视频流进行存储和管理,同时EasyNVR自身也会提供一套可供各种平台、开发语言进行二次开发的HTTP接口,这样可以更加方便地与客户的业务系统相结合,达到更加丰富的管理功能。加上自身拥有简洁、大方的前端界面,EasyNVR完全可以作为一个独立的视频直播平台部署使用。如何确认EasyNVR服务的启动/关闭状态提出问题在众所周知,EasyNVR属于轻量型部署的软件,解压后即可安装。最近有用户反馈,当关闭EasyNVR服务时,服务仍会在后台运行,导致内存的消耗。此时我们需要确认,当关闭EasyNVR服务时,是否确实关闭了EasyNVR的后台运行
尝试在博客利用InstantClick和Hexo的两个插件hexo-service-worker、hexo-filter-optimize让博客快如闪电⚡。注意:最新版本的NexT已经集成了PJAX的功能,因此对于处理起来比较麻烦的InstantClick,可不需。另外,ServiceWorker请查看我新写的利用Workbox实现博客的PWA。InstantClick介绍请看官网,先下载我修改后的instantclick.js(浏览器右键保存为),再放到~/blog/themes/next/source/js/src/下,然后添加代码:1 2 3 4 5 6<!--文件位置:~/blog/themes/next/layout/_layout.swig--> +<scripttype="text/javascript"src="/js/src/instantclick.js"data-no-instant></script> +<scriptdata-no-instant>InstantClick
一、Docker镜像的创建方法 docker镜像是除了docker的核心技术之外,也是应用发布的标准格式。一个完整的docker镜像可以支撑一个docker容器的运行,在docker的整个使用过程中,进入一个已经定型的容器之后,就可以在容器中进行操作,最常见的操作就是在容器中安装应用服务,如果要把已经安装的服务进行迁移,就需要把环境及搭建的服务生成新的镜像。创建镜像的方法有三种,分别是基于已有镜像创建、基于本地模板创建及基于dockerfile创建。1、基于已有镜像创建 基于已有镜像创建主要使用dockercommit命令,其实质就是把一个容器里面运行的程序及该程序的运行环境打包起来生成新的镜像。命令格式:dockercommit[选项]容器ID/名称仓库名称:[标签] 常用选项 -m:说明信息; -a:作者信息; -p:生成过程中停止容器的运行;启动一个镜像,在容器里做修改,然后将修改后的容器提交为新的镜像,需要记住该容器的ID号[root@test/]#dockerps-a#查看当前容器 CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
本文由葡萄城技术团队于博客园原创并首发转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。最近公司要引入API测试工具,经过调查和了解,最终决定在SoapUI和Postman两种工具之间做一个选择,两种工具在业界都很有名,相信很多人两种工具也都曾使用过。SoapUISoapUI是一个开源测试工具,通过soap/http来检查、调用、实现WebService的功能/负载/符合性测试。该工具既可作为一个单独的测试软件使用,也可利用插件集成到Eclipse,maven2.X,Netbeans和intellij中使用。SoapUIPro是SoapUI的商业非开源版本,实现的功能较开源的SoapUI更多。PostmanPostman是由PostdotTechnologies公司打造的一款功能强大的调试HTTP接口的工具,它最早是Chrome中最受欢迎的插件之一,现已扩展到Mac,Windows和Linux客户端。软件功能非常强大,界面简洁明晰、操作方便快捷,设计得很人性化。Postman分免费版和收费版本。下面我们对这两个工具通过多种维度进行对比,相信通过这
在软件开发中,有时候为了完成一项较为复杂的功能,一个类需要和多个其他业务类交互,而这些需要交互的业务类经常会作为一个完整的整体出现,由于涉及的类比较多,导致使用时代码较为复杂,此时,特别需要一个类似服务员一样的角色,由他来负责和多个业务类进行交互,而使用这些业务类的类只需要和该类进行交互即可。外观模式通过引入一个新的外观类来实现该功能,外观类充当了软件系统中的“服务员”,它为多个业务类的调用提供了一个统一的入口,简化了类与类之间的交互。外观模式(Facade)学习难度:★☆☆☆☆使用频率:★★★★★一、文件加密模块设计1.1需求背景M公司想要开发一个用于多个软件的文件加密模块,该模块可以对文件中的数据进行加密并将加密后的数据存储在一个新文件中,具体的流程包括3个部分,分别是读取源文件、加密、保存加密之后的文件。其中,读取文件和保存文件使用流来实现,加密操作通过求模运算实现。这3个操作相对独立,为了实现代码地独立重用,让设计更加符合单一职责原则,这3个操作的业务代码封装在3个不同的类中。 1.2初始设计 M公司开发人员独立实现了这3个具体业务类:FileReader用于读取文件,Cip
Hadoop运行模式包括:本地模式、伪分布式模式以及完全分布式模式。 Hadoop官方网站:http://hadoop.apache.org/ 一、本地运行模式 1、官方Grep案例 1、创建在hadoop-2.7.2文件下面创建一个input文件夹 [root@centos7hadoop2.7]#mkdirinput 2、将Hadoop的xml配置文件复制到input [root@centos7hadoop2.7]#cpetc/hadoop/*.xmlinput 3、执行share目录下的MapReduce程序 [root@centos7hadoop2.7]#bin/hadoopjarshare/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jargrepinputoutput'dfs[a-z.]+' 4、查看输出结果 [root@centos7hadoop2.7]#catoutput/*复制 2、官方WordCount案例 1、创建在hadoop-2.7.2文件下面创建一个wcinput文件夹 [root@cen
Stringstream stringsteam用于进行数据类型转换,<sstream>库定义了三种类:istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。 接下来举一个栗子,通过这道题我们来介绍下从int转化为string的过程 DigitsSequence(EasyEdition) 这道题是一道很水的题,我们通过这道题来介绍下\(streamstring\) 我们可以考虑把每一个字符都压入\(s\),最后输出第\(n-1\)项即可 总体来说,streamstring和string的使用极为相似 stringstream:\(s.str().size()\)(取长)。 string:取长就不必多说了 有没有发现区别就是中间多了个\(.str()\) 接下来就是一点也不激动人心的代码了: #include<bits/stdc++.h>//Forever_chen #defineRTregister usingnamespacestd; template<classt>
本文列举了是十个免费工具,可以用来进行Web的负载/压力测试的。这样你就可以知道你的服务器以及你的WEB应用能够扛得住多少的并发量,以及网站性能。 0. Grinder – Grinder是一个开源的JVM负载测试框架,它通过很多负载注射器来为分布式测试提供了便利。支持用于执行测试脚本的Jython脚本引擎HTTP测试可通过HTTP代理进行管理。根据项目网站的说法,Grinder的主要目标用户是“理解他们所测代码的人——Grinder不仅仅是带有一组相关响应时间的‘黑盒’测试。由于测试过程可以进行编码——而不是简单地脚本化,所以程序员能测试应用中内部的各个层次,而不仅仅是通过用户界面测试响应时间。 1. Pylot -Pylot是一款开源的测试webservice性能和扩展性的工具,它运行HTTP负载测试,这对容量计划,确定基准点,分析以及系统调优都很有用处。Pylot产生并发负载(HTTPRequests),检验服务器响应,以及产生带有metrics的报表。通过GUI或者shell/console来执行和监视t
Vue-Quill-Editor 主流富文本编辑器对比 前言:vue中很多项目都需要用到富文本编辑器,在使用了ueditor和tinymce后,发现并不理想。所以果断使用vue-quill-editor来实现。 wangEditor(国产,基于javascript和css开发的web富文本编辑器,开源免费)优势:轻量简介,最重要的是开源且中文文档齐全。缺点:更新不及时。没有强大的开发团队支撑。 UEditor(百度)优势:插件多,基本曼度各种需求,由百度web前端研发部开发。缺点:插件提交较大,网页加载速度相对就慢了些。使用复杂。属于前后端不分离插件。在使用时需要配置后端的一些东西,使用不便。 Kindeditor()优势:文档齐全,为中文,阅读方便。缺点:图片上传存在问题,上传历史过多,会全部加载,导致浏览器卡顿。 补充:Tinymce也是一款不错的富文本编辑器,种植,各有优势和劣势,关键是选择一款最适合的就好。因为笔者在开发vue,所以直接使用vue-quill-editor较为方便些。具体看情况使用。 vue-quill-editor基本配置 npminst
VPS(VirtualPrivateServer虚拟专用服务器)技术,将一台服务器分割成多个虚拟专享服务器的优质服务。实现VPS的技术分为容器 [1] 技术,和虚拟化技术 [2] 。在容器或虚拟机中,每个VPS都可分配独立公网IP地址、独立操作系统、实现不同VPS间磁盘空间、内存、CPU资源、进程和系统配置的隔离,为用户和应用程序模拟出“独占”使用计算资源的体验。VPS可以像独立服务器一样,重装操作系统,安装程序,单独重启服务器。VPS为使用者提供了管理配置的自由,可用于企业虚拟化,也可以用于IDC资源租用。 IDC资源租用,由VPS提供商提供。不同VPS提供商所使用的硬件VPS软件的差异,及销售策略的不同,VPS的使用体验也有较大差异。尤其是VPS提供商超卖,导致实体服务器超负荷时,VPS性能将受到极大影响。相对来说,容器技术比虚拟机技术硬件使用效率更高,更易于超卖,所以一般来说容器VPS的价格都高于虚拟机VPS的价格。 这些VPS主机以最大化的效率共享硬件、软件许可证以及管理资源。每个VPS主机都可分配独立公网IP地址