摘要:虽然网卡是接入RoCE网络,但其实问题本身是单纯路由相关的,所以看的时候,不用关注RoCE,只当做一个独立子网就行了
本文分享自华为云社区《<跟唐老师学习云网络> - RoCE多网卡时,报文可以过去,但是回不来》,作者: tsjsdbd 。
一台机子,接入2个子网,一个普通通信的,一个高速通信的。并且接入高速通信子网,有8张网卡。如下图:
本文描述的问题,只关注高速子网这一部分。为帮助理解问题,网络可以简化为:
每个网卡,都有分配该子网的一个IP。如下:
A只能通B里面的一个IP,其余7个IP都不通。下图为A--->B 的结果:
图示:只有1个IP能通
反过来也一样,后面只讲一个方向的(A-->B)。
如果都不能到B,说明网络接的有问题。如果到了B,但是不回来,说明路由配置可能有问题。
Ping不通的ip(228)时,在主机B上面进行抓包分析(228对应的网卡名是enp80s0f0,所以这里监听这个网卡):
tcpdump -i enp80s0f0 -n arp listening on enp80s0f0, link-type EN10MB (Ethernet), capture size 262144 bytes 17:02:23.720556 ARP, Request who-has 29.28.195.228 tell 29.28.204.80, length 46 17:02:24.758954 ARP, Request who-has 29.28.195.228 tell 29.28.204.80, length 46 17:02:25.782954 ARP, Request who-has 29.28.195.228 tell 29.28.204.80, length 46 17:02:26.807063 ARP, Request who-has 29.28.195.228 tell 29.28.204.80, length 46 ^C
可以看到,报文能到B。
于是我们来看看,当B要给A回消息时,路由怎么走的?
查看路由表:
ip route default via 192.168.0.1 dev enp218s0 proto dhcp metric 104 29.28.192.0/20 dev enp137s0f1 proto kernel scope link src 29.28.201.211 metric 105 29.28.192.0/20 dev enp137s0f0 proto kernel scope link src 29.28.193.28 metric 106 29.28.192.0/20 dev enp80s0f1 proto kernel scope link src 29.28.204.230 metric 107 29.28.192.0/20 dev enp106s0f0 proto kernel scope link src 29.28.194.199 metric 108 29.28.192.0/20 dev enp106s0f1 proto kernel scope link src 29.28.195.31 metric 109 29.28.192.0/20 dev enp80s0f0 proto kernel scope link src 29.28.195.228 metric 110 29.28.192.0/20 dev enp234s0f1 proto kernel scope link src 29.28.197.165 metric 111 29.28.192.0/20 dev enp234s0f0 proto kernel scope link src 29.28.195.75 metric 112
根据以前学的router知识,可以看到,(排除default路由外)应该是会匹配到 第1条(标红)规则。
注:metric表示路由代价,目的子网都匹配的情况下,会选代价最低的那一条。
即 B-->A给A回消息时,报文要从 网卡enp137s0f1 发出去,并且发出去的报文源地址要设为29.28.201.211。
难怪不通,因为答非所问了嘛(回arp报文,内容对不上)。
再看为什么211这个ip能通?
因为 211 是该子网路由选择,所对应的IP,所以刚好能通。
这就解释了为什么刚好1个IP能通,另外7个不通。
往外发报文,根据源地址来选择网卡(注意这里的源是指 主机B,因为回报文是往外发),这种场景可以称之为「源地址路由」,而要实现源地址路由,就需要用到「ip rule 路由策略」这种高级路由配置。
在配置「源地址路由」规则前,我们需要先补充一点基础知识。
以前我们学的 route -n 路由表,其实属于“新手村”,即系统默认使用这张路由规则表。但就像《剑来》里面说的那样,在新手村外还有很多其他“境界”。Linux新版本(2.x之后)为实现更复杂的路由能力,将原来的“新手村”,复制了很多的“副本”。
Ps:这种增加“副本”的思路,在咱们IT领域非常常见,比如我们之前学到的各种namespace。
当前系统总的“副本”数量,在 /etc/iproute2/rt_tables 这个文件中。
255 local 254 main 253 default 0 unspec
我们之前学的 route -n 新手村表,就是其中的 254 这个副本号,名字叫做 main。
要增加副本,可以如下这么操作:
echo "$id $table" >> /etc/iproute2/rt_tables
就行了。
为了确认使用哪个“副本”,在前面补了一个 rule 规则。
条件基本就是:源IP,目的地址,收到网口这些。
具体见:http://www.computerhope.com/unix/ip.htm
所以现在流程变成了:
比如,我们希望某个源IP为 29.28.201.211 的报文,走独立的“路由副本”策略:
echo "200 table0" >> /etc/iproute2/rt_tables
ip rule add from 29.28.201.211 table table0
ip route add 29.28.192.0/20 dev eth0 table table0
ip route show table table0 29.28.192.0/20 dev eth0 scope link
这样,我们就可以控制更复杂的路由规则了。
在知道路由表可以有很多“副本”之后,我们再回头看看原来那个“新手村”。
从 /etc/iproute2/rt_tables 文件内容可以知道,咱们“新手村”对应的那个路标表名字叫做main。
所以查询这个表的内容:
root@tsjsdbd:/# ip route show table main default via 172.17.0.1 dev eth0 172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.2
这个和我们平时看到的路由,是一样的:
root@tsjsdbd:/# ip route default via 172.17.0.1 dev eth0 172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.2
也就是,我们平时敲的 route -n 看到的列表,其实就是 main 这张表里面的内容。
其余表(0-local,253-default,255-local)的内容,一般不用关注。
在rule规则表里面,很多记录的时候,匹配优先级是怎么定的?答案是每一条记录,它有个优先级的字段。如下:
[root@tsjsdbd]# ip rule 0: from all lookup local 32766: from all lookup main 32767: from all lookup default
最前面的数字,就是优先级。数字越小,优先级越高,也就是会先进行匹配,同时也代表这条规则可以排的更靠前。
在 rule add 添加规则的时候,是可以指定“优先级的”。如:
ip rule add from 192.168.1.0/24 table table0 pri 333
就可以指定
在不指定优先级的情况下,会默认加到当前最小值前面(即,不指定优先值时,会加一条优先级较高的rule)。
如下:
[root@tsjsdbd]# ip rule add from 192.168.1.0/24 table table0 pri 333
上面这条会加一条333优先级的rule
[root@tsjsdbd]# ip rule add from 192.168.2.0/24 table table0
这条没指定优先级,就会加一条优先级332的(因为当前rule里面最小的是333)。
可以查询确认:
[root@tsjsdbd]# ip rule 0: from all lookup local 332: from 192.168.2.0/24 lookup table0 333: from 192.168.1.0/24 lookup table0 32766: from all lookup main 32767: from all lookup default
删除rule的话,有几种便捷的指定方式:(优先级、条件、table)
ip rule del pri 333 ip rule del from 192.168.2.0/24 ip rule del table table0
最后注意,添加或修改了rule规则后,不会立即生效,需要 ip route flush cache 后才生效(官方文档是这么说的,自己验证的时候注意下就行)。
再回到问题上来,8个网卡,哪个口收到,要求使用该口的ip回去。可以通过8个路由table实现(因为大家的目标网段是一样的,所以在同一个table表里面话,不好写规则)。
于是,可以把8个路由规则,分散到8个“世界”中,然后通过 rule 分散后,各自进行匹配。
事实上,「源地址路由」的实现,一般都是这种套路:
ip rule add from 192.168.1.2 table 100
ip route add 172.25.2.0/24 via 192.168.1.5 table 100
最终解决8个RoCE网卡可以互通的路由设置如下:
/root # cat /etc/iproute2/rt_tables 200 table0 201 table1 202 table2 203 table3 204 table4 205 table5 206 table6 207 table7
/root # ip rule 0: from all lookup local 32758: from 29.28.197.165 lookup table7 32759: from 29.28.195.75 lookup table6 32760: from 29.28.201.211 lookup table5 32761: from 29.28.193.28 lookup table4 32762: from 29.28.195.31 lookup table3 32763: from 29.28.194.199 lookup table2 32764: from 29.28.204.230 lookup table1 32765: from 29.28.195.228 lookup table0 32766: from all lookup main 32767: from all lookup default
/root # ip route show table table5 29.28.192.0/20 dev enp137s0f1 scope link src 29.28.201.211
以上3步行为,通过一个脚本来完成。
最后我们来看看,网络有问题的时候,与设置完「源地址路由」后的区别:
查询“以xx为源ip,以yy为目的ip,路由选择结果是什么”方式,
可以使用ip route get 命令。
设置前:
# ip route get 29.28.204.80 from 29.28.201.211 29.28.204.80 from 29.28.201.211 dev enp137s0f0 uid 0
设置后:
# ip route get 29.28.204.80 from 29.28.201.211 29.28.204.80 from 29.28.201.211 dev enp137s0f1 table table5 uid 0
可以看到,是按照我们的目标“哪个口来,哪个口回去”的方式运行的。
注:虽然网卡是接入RoCE网络,但其实问题本身是单纯路由相关的,所以看的时候,不用关注RoCE,只当做一个独立子网就行了。
点击关注,第一时间了解华为云新鲜技术~
VSLAM前端:双目极线搜索匹配一、极线搜索匹配1.1最小化图像块重投影误差步骤: 1.假设我们知道第k-1帧中特征点位置以及它们的深度; 2.已知I_{k-1}帧中的某个特征在图像平面的位置(u,v),以及它的深度d,将该二维特征投影到三维空间p_{k-1},该三维空间的坐标系是定义在I_{k-1}摄像机坐标系的。所以,我们要将它投影到当前帧I_k中,需要位姿转换T_{k,k-1},得到该点在当前帧坐标系中的三维坐标p_k。最后通过摄像机内参数,投影到I_k的图像平面(u',v'),进行重投影; 3.对于空间中同一个点,被相邻两帧拍到,亮度值变化很小。但由于位姿是假设的一个值,所以重投影的点不准确,导致投影前后的亮度值是不相等的,不断进行迭代优化。1.2极线搜索确定匹配点 假设参考帧I_r中确定一个特征点的二维图像坐标,假设它的深度值在\begin{bmatrix}d_{min},d_{max}\end{bmatrix}之间,根据这两个端点深度值,能够计算出他们在当前帧I_r中的位置,即图中圆圈中的线段。确定了极线位置,则可以进行特征搜索匹配。如果极线段很短,小于
译者注 与MySQL设置innodb_buffer_pool_size=80%左右的系统内存相比,也就是将操作系统大部分内存分配给Innodb的bufferpool的缓存管理机制不同,Postgresql采用数据库采用实例buffer和操作系统buffer双缓存(effective_cache_size)的工作模式,这一点两者还是有着比较本质上的差异的。 缓存作为数据库的一个核心组件,shared_buffers决定了数据库实例层面的可用内存,而文件系统缓存的大小是effective_cache_size决定的,effective_cache_size不仅是缓存经常访问的数据,它同时帮助优化器确定实际存在多少缓存,指导优化器生成最佳执行计划。 以下几篇文章都比较好地解释了SharedBuffers和操作系统层面文件缓存(oscache)之间的关系,可作为参考 https://www.cybertec-postgresql.com/en/effective_cache_size-what-it-means-in-postgresql/https://wiki.postgresql.or
选自arXiv作者:GuangdaHuzhang、Zhen-JiaPang、YangYu等机器之心编译参与:Panda用验证集来测试算法性能、挑选模型是一种常见操作,在电商领域也是如此。但阿里巴巴与南京大学的一篇论文指出,对于在线推荐排序这种具有决策因素的环境,验证集评估得到的性能与真实的在线性能会出现很大的出入,验证集效果好的方法真实性能可能更差。「这意味着,这一方向的研究可能已经被验证集评估带歪了。」针对这一问题,他们提出了一种新的评估器-生成器方法,可显著提升商品排序的有效性。 论文链接:https://arxiv.org/pdf/2003.11941.pdf学习排名(LTR/Learning-to-rank)是网络搜索引擎和推荐系统的核心问题,直接关乎这些业务的利润。之前的很多LTR方法都假设一项商品(或文档)存在固有的查询相关性,这些方法希望能基于有标注的数据集准确习得这种相关性。这些标签通常是通过消费者隐性反馈所收集的,可在许多方法中被用作训练模型的基本真值(ground-truth)。在上述设置中,关注基于数据的排名指标是合理的,比如被广泛采用的曲线下面积(AUC)和归一
使用Java打印字符串表格(中英文内容不乱)需求最近在学习使用java来编写cli应用,但是在信息展示上碰到了难题。原因是没有很好工具来展示一个由字符串组成的表格。在git上搜到阿里巴巴有一个叫做text-ui的开源项目可以用,但是这个工具在制作表格的时候如果表格内容是中英文混合的,表格就会乱掉。于是就自己写了一个工具类来打印一个字符串组成的表格。这个工具满足一下使用要求:可以设置标题可以设置表格中数据的左右边距可以设置表格由什么符号组成可以设置表格数据最大长度代码TextFormpackagecom.hebaibai.ascmd.text; importorg.apache.commons.lang3.StringUtils; importjava.util.*; importjava.util.regex.Matcher; importjava.util.regex.Pattern; publicclassTextForm{ /** *左边距 */ protectedintpaddingL=1; /** *右边距 */ protectedintpaddingR=1; /
前言上一篇,我们了解了SVG以及静态Vector图像使用,坐标地址如下:聊聊有关SVG那些事儿而今天,我们了解一下有关使用动态Vector使用的那点事儿。PS:主要注意的是,动态Vector图像只能在Api21以上使用,So,如果想要低版本也使用的话,必须做兼容,否则直接奔溃了~So,一起来看本文目标。本文目标通过举例说明如何使用动态Vector图像以及如何兼容低版本,从而让你不经意间学会使用要领。实现效果Comeon,baby~首先,我们生成一个原图,也就是我们的小星星,我们设置宽高按照400等份平分,其次,设置我们中心点坐标为200,也就是正好一半,而动画的执行也就是从图像的中心点进行运动,而具体动画又可以具体到某个Path,也就是说,假设我们的静态Vector图像是由俩个Path组成,我们可以根据设置不同的name去区别对待(设置不同的动画效果),具体代码如下:<?xmlversion="1.0"encoding="utf-8"?> <vectorxmlns:android="http://schemas.and
SortArrayByParityGivenanarrayAofnon-negativeintegers,returnanarrayconsistingofalltheevenelementsofA,followedbyalltheoddelementsofA.Youmayreturnanyanswerarraythatsatisfiesthiscondition.Example1:Input:[3,1,2,4] Output:[2,4,3,1] Theoutputs[4,2,3,1],[2,4,1,3],and[4,2,1,3]wouldalsobeaccepted. 说明这个题目的意思是,将一个数列中的顺序调整为:前半部分为偶数,后半部分为奇数。除此之外,数列不必有序。我用了快速排序的思路,从头和尾两边对数列进行遍历。从左边开始,遇到奇数就停止遍历;然后从右边开始进行遍历,遇到偶数就停止遍历。最后将这两个数交换顺序。两边的遍历指针相遇的时候,整个工作结束。MySolutionclassSolution2 { public: vector<int>sortArrayByB
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/details/28230345 简单了解了一下C#之后,很快就要开始重构机房收费系统了,有人选择用C#来实现,不过还是想好好了解一些VB.net,用它来实现。 有了VB和面向对象基础,学习VB.NET是极易上手的。学习了几种语言的我们都有一种体会,编程语言就是一门语言,一个工具,通过它来实现某些功能。假如我们之前学过C++,C#等任何一门OO语言,通过这些语言了解了OOP,现在让你来学习VB.NET,肯定会特别容易,虽然他们的语法不一样,但其中的思想都是一样的,都有类、构造函数、属性…… VB.net和C#一些关键字的比较:C#关键字VB.net关键字usingImportsthisMevoidsubbaseMyBaseabstractMustlnheritsealedNotOverrideablevirtualMustOverrideswitchSelectinternalFriendstaticsh
文章来源:Python数据分析目录:DIKW模型与数据工程科学计算工具Numpy数据分析工具PandasPandas的函数应用、层级索引、统计计算Pandas分组与聚合数据清洗、合并、转化和重构数据清洗是数据分析关键的一步,直接影响之后的处理工作数据需要修改吗?有什么需要修改的吗?数据应该怎么调整才能适用于接下来的分析和挖掘?是一个迭代的过程,实际项目中可能需要不止一次地执行这些清洗操作处理缺失数据:pd.fillna(),pd.dropna()1.数据连接(pd.merge)pd.merge根据单个或多个键将不同DataFrame的行连接起来类似数据库的连接操作示例代码:importpandasaspd importnumpyasnp df_obj1=pd.DataFrame({'key':['b','b','a','c','a','a','b'], 'data1':np.random.randint(0
SIXnetwork由两方创办OOKBEEU创始人为Moo先生Moo先生是一个科技创业者,拥有超过18年的创办、资助和管理科技公司的经验。他是拥有东南亚最大UGC社区之一的Ookbee公司的创始人兼首席执行官,其中包括书籍、漫画、音乐等等。Ookbee在过去4年里从包括腾讯和英图克控股在内的各类投资者募集了3000多万美元。Moo先生同时也是”创业500“公司的创业合伙人,这家投资公司管理者1500万美元的微型基金“500tuktuks”,专注于泰国和东南亚创业公司。该基金的投资组合包括Omise(2015年”tuktuk”的第一次投资),Pomelo(京东190万美元的后续投资),T2P,以及在该地区在过去2年内投资的50多家创业公司 Computerlogy与Yello数码营销(YDMG)Yello集团是韩国创业公司中的领导者,拥有诸多子公司公司市值为40亿美元左右Computerlogy是由Gak先生创办,是一家领先于社交媒体行业的新兴公司。位于泰国Sriracha,这家公司专注于社交媒体分析,指挥中心,聊天机器人等工具。2016年,Gak先生退出了他的第一家创业公司并加入了YD
作者:陈业贵华为云享专家51cto(专家博主明日之星TOP红人)阿里云专家博主 文章目录什么是防盗链?代码:效果:什么是防盗链?盗链是指在自己的页面上展示一些并不在自己服务器上的内容。 整体来说,盗链是获得他人服务器上的资源地址,绕过别人的资源展示页面,直接在自己的页面上向最终用户提供此内容。 通过盗链的方法可以减轻自己服务器的负担,因为真实的空间和流量均是来自别人的服务器。代码:<style> body{ background:#ccc; } </style> <html> <head><title>fristpage</title></head> <body> <formaction="cyg.php"method="post"> message<inputtype="text"name="name"value="123456"></input> <
WebViewJavascriptBridge项目介绍 在Obj-C和WKWebView,UIWebView中的Javascript之间传送信息的桥梁。 项目地址 如何使用 Javascript的介绍 <script> window.onerror=function(err){ log('window.onerror:'+err) } //下面的方法是必备 functionsetupWebViewJavascriptBridge(callback){ if(window.WebViewJavascriptBridge){ returncallback(WebViewJavascriptBridge); } if(window.WVJBCallbacks){ returnwindow.WVJBCallbacks.push(callback); } window.WVJBCallbacks=[callback]; varWVJBIframe=document.createElement('iframe'); WVJBIframe.style.display='none'; WV
目录附录附录A计数系统A.1十进制数A.2八进制整数A.3十六进制数A.4二进制数A.5二进制和十六进制附录BC++保留字B.1C++关键字B.2替代标记B.3C++库保留名称B.4有特殊含义的标识符附录CASCII字符集附录D运算符优先级附录E其他运算符E.1按位运算符E.1.1移位运算符E.1.2逻辑按位运算符E.1.3按位运算符的替代表示对于几种按位运算符,C++提供了替代表示,如表E.4所示。它们适用于字符集中不包含传统按位运算符的区域。 表E.4 按位运算符的替代表示 标准表示 春代表示 bitand &= andeq 0req compl xrE.1.4几种常用的按位运算符技术E.2成员解除引用运算符includeE.3alignof(C++11)E.4noexcept(C++11)附录F模板类stringF.113种类型和一一个常量F.2数据信息、构造函数及其他F.2.1默认构造函数F.2.2使用C-风格字符串的构造函数F.2.3使用部分C-风格字符串的构造函数F.2.4使用左值引用的构造函数F.2.5使用右值引用的构造函数(C++11)F.2.6使用一个字符的n
原文:https://www.runoob.com/java/java-operators.html 计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量。我们可以把运算符分成以下几组: 算术运算符 关系运算符 位运算符 逻辑运算符 赋值运算符 其他运算符 一、算术运算符 算术运算符用在数学表达式中,它们的作用和在数学中的作用一样。下表列出了所有的算术运算符。 表格中的实例假设整数变量A的值为10,变量B的值为20: 操作符描述例子 + 加法-相加运算符两侧的值 A+B等于30 - 减法-左操作数减去右操作数 A–B等于-10 * 乘法-相乘操作符两侧的值 A*B等于200 / 除法-左操作数除以右操作数 B/A等于2 % 取余-左操作数除以右操作数的余数 B%A等于0 ++ 自增:操作数的值增加1 B++或++B等于21(区别详见下文) -- 自减:操作数的值减少1 B--或--B等于19(区别详见下文) 实例 下面的简单示例程序演示了算术运算符。复制并粘贴下面的Java程序并保存
对于app端的专项测试,Android端我们可以用adb或者一些三方工具进行(例如itest)进行实时的性能监控,iOS端的话也可以用用一些三方的工具,但是需要嵌入到我们的项目当中,今天来介绍下Xcode11下的apple提供的基于XCTest对app耗电量和性能的全新框架。 资料来源:https://developer.apple.com/videos/play/wwdc2019/417/ app耗电量 app耗电量和它的性能体现是息息相关的,那么app中哪些性能项会影响耗电量呢? CPU memory storage clockandOSSignpost customMetrics network Wi-Fi Bluetooth Location iOS端进行性能调优的工具 1.Xcode Xcode本身就自带了一些工具来进行性能方面的监控,例如在Xcode的导航区就有DebugNavigator,我们可以看到应用的cpu,memory,disk,network还有耗电量的情况,在测试的过程中就可以实时监控,如果进行某些
元祖变成字符串采用这种方式: 字符串中替换部分字符串 fromstringimportTemplate s=Template('hello,${name}howareyou,thisis${point},welcometoyou') d=s.substitute(name='tom',point='beijing') printd 输出:hello,tomhowareyou,thisisbeijing,welcometoyou复制 #enumberate可以找到字符串,列表,元祖的的索引和值f='helloworld' fori,tinenumerate(f): if(i==3): printt 输出:索引3对应的值是:l a=['aa','bb','cc','dd'] fori,tinenumerate(a): if(t=='bb'): print'bb的索引是:',i 输出:bb的索引是:1 c=('ee','ff','gg','hh') fori,tinenumerate(c): if('gg'==t): print
Hi,eveyone.I'mnewhere! I'msogladtobeamemberofthisplace. AlthoughIamaJuruo,IthinkIcanmakeprogresswithmyhardwork. NowI'malittlelonely,doanyonewantstomakefriendswithme? MyQQnumberis910935974,andIdon'twanttotellyoumyphonenumber! InfactI'maChinese,Idon'tknowwhyIwritethispassageinEnglish! hopeeveryonecan AKIOI. #include<cstdio> usingnamespacestd; intmain() { while(1) printf("IAKIOI!\n"); return0; }复制
awk'BEGIN{system("/bin/sh"))’处理文件之前去执行命令打开一个shell)awk-F:"(print$1}/etc/passwd输出文件:前面的第—列bash-i反弹一个交互式对话框python-c"importpty,pty.spawn("/bin/bashygroups查看当前组sudo-l查看可以sudo的用户help查看用户可以执行的命令 3、Linux下的花式读取文件; cat和tac//第一行最后显示,最后一行先显示more和lessj都是分屏显示head和tail//显示开头和末尾的若干行nl//和cat-n类似。显示行号curlfile://home/1.txt需要绝对路径wgetfile://fvar/www/html/key.phpcalt1.txt 系统信息 arch显示机器的处理器架构uname-m显示机器的处理器架构uname-r显示正在使用的内核版本dmidecode-q显示硬件系统部件–(SMBIOS/DMI)hdparm-i/dev/hda罗列一个磁盘的架构特性hdparm-tT/dev/sda在磁盘上执行测试性读取操作 c
题意:给定区间[a,b]求出区间里面的所有回文质数 解法: 最简单的做法是枚举所有的数字,判断两个条件,但在第9组数据的时候时间会爆 看了一下HINT,题目提示预先产生所有的回文数,将遍历所有数组的时间将为常数时间产生数组, HINT给出的回文数产生方法更为巧妙,采用这样的思路大幅降低了运行时间 /* ID:lsswxr1 PROG:pprime LANG:C++ */ #include<iostream> #include<vector> #include<map> #include<list> #include<set> #include<deque> #include<stack> #include<queue> #include<algorithm> #include<cmath> #incl
1usingSystem; 2usingSystem.Collections.Generic; 3usingSystem.ComponentModel; 4usingSystem.Data; 5usingSystem.Drawing; 6usingSystem.Linq; 7usingSystem.Text; 8usingMicrosoft.Office.Interop.Word; 9 10namespaceQHRMS//根据自己需要修改命名空间 11{ 12publicclassCreateWordHelper 13{ 14private_ApplicationwordApp=null; 15private_DocumentwordDoc=null; 16public_ApplicationApplication 17{ 18get 19{ 20returnwordApp; 21} 22set 23{ 24wordApp=value; 25} 26} 27public_DocumentDocument 28{ 29get 30{ 31returnwordDoc; 32} 33set