KKRT库:http://github.com/osu-crypto/BaRK-OPRF
文章:Efficient Batched Oblivious PRF with Applications to Private Set Intersection-2016
解读论文,参考:Efficient Batched Oblivious PRF -Private Set Intersection
关键词:两方PSI、ORFT、OTE
KKRT-PSI方案使用了OTE(OT扩展)、OPRF、Cuckoo哈希等技术,在大集合场景、局域网(带宽20GB/s)下运行效果最好。
方案构造思路:先设计一个OTE,进而设计一个OPRF,最后设计一个PSI
协议功能:Sender不知道Receiver的选择\(r\);Receiver只知道\(X_r\)
协议实现:有基于RSA的、基于DH的、基于ECC的等。
下面介绍的是Naor-Pinkas-OT,Naor和Pinkas通过三次公钥密码学操作实现了半诚实模型下的1-2 OT:
论文:Efficient oblivious transfer protocols-2001
参考:Naor-Pinkas茫然传输协议
其中\(E_{r,2}\)表示\(E_r\)的第二部分,若\(r=0\),则:
安全性:Sender根据\(PK_0\)不能反推出\(k\);Receiver根据\(g^a\)不能反推出\(a\)。
1-2 OT在实际应用中,每次都需使用一次,效率较低,所以下一步采用“固定数量的OT来实现任意数量的OT”,例如下图只需要使用\(k\)次1-2OT即可实现,其中\(k\)是根据安全参数决定的。
Ishai、Kilian、Nissim和Petrank于2003年提出基于矩阵变化实现少量1-2OT和对称密钥构造大量OT实例的不经意传输扩展协议。
论文:Extending Oblivious Transfers Efficiently-2003
参考:[IKNP03] Extending Oblivious Transfers Efficiently
本文提出了一种OT扩展协议,即\(k\)次1-2OT实现了\(m\)次1-OT,其中\(k<m\),,即每次有两种选择。文中给出了两种情况的协议:Receiver半诚实和Receiver恶意,下面介绍Receiver半诚实的协议:
分析:
注意:\(m_i\)表示列,\(m^i\)表示行
IKN03方案是用\(k\)次OT实现了\(m\)次1-2OT,其中\(k<<m\)。KK13方案将IKN03中的\(r\)看作一个矩阵\(R_{m*k}\)(每列都一样),计算\(T=U \oplus R\),无需使用1-2OT实现1-nOT,仅改变了\(R\),利用编码技术,实现了\(1-n\)OTE。
论文:Improved OT Extension for Transferring Short Secrets-2013
参考:KK13 OTE——Improved OT Extension for Transferring Short Secrets
用\(k\)次1-n OT传递了\(m\)个信息,每个消息是\(lbit\),且是n个中选1个,其中\(k>=n\)。
关于WH编码:
从KK13方案中,知道\(C_{WH}^k(a)\)是一种编码形式,即输入一个\(log^k\)bit的字符串\(a\),输出一个\(k\)个字符串\((c_0,...,c_{k-1})\),每个字符串为\(k\)bit,在进行隐私相等性测试时,即已知\(C_{WH}^k(a),C_{WH}^k(b)\),如何安全判断\(a\)和\(b\)是否相等,无需解码,只需比较\(C_{WH}^k(a),C_{WH}^k(b)\)是否相等即可,这里需要保证\(C_{WH}^k(a)\oplus C_{WH}^k(b)\)的汉明距离不小于计算安全参数。所以在KKRT16方案中的OTE,无需使用\(WH\)编码技术,只需要一个汉明距离不小于计算安全参数的伪随机函数即可。
发送方和接收者执行两方OPRF协议,发送方无输入,接收方输入元素\(x_i\),发送方输出密钥\(k\),接收方输出OPRF值\(F(k,x_i)\):
上面提到需使用伪随机函数,这里伪随机函数的功能相当于KK13中的哈希,即\(F=H(j,\mathbf{q}_{j}\oplus(\mathbf{c}_{r}\odot\mathbf{s}))\)。一共有\(m\)个\(r_i\),可以执行\(m\)次OPRF。另外在2019年PRTY19和2020年CM20都基于第3个属性对OPRF协议进行了进一步的改进,得到多点OPRF,实现了正常带宽下最快的PSI协议。
KKRT167中使用的OPRF由于是Batch、relaxed的,所以叫做BaRK-OPRF。
得到一个OPRF协议后,就可以很容易的构造一个PSI协议。例如下图:
但接收方需要进行\(O(n^2)\)次比较。
更多参考:http://www.cnblogs.com/pam-sh/p/16155650.html#cuckoo-hash
Cuckoo hashing分为两个存储表,一个为Cuchoo哈希表,一个称为堆存储容器。(本文协议采用的这样的容器,之后的文章有采用无堆存储容器的Cuckoo hashing)。
Cuckoo插入元素\(x\)的算法如下:
上述基于一个理想的OPRF构造了一个简单的PSI协议,但效率(计算和通信)较低。
KKRT16-PSI协议遵循了PSZZ15基于KK13-OTE构造PSI的思路,采用Cuckoo hashing算法减少了比较次数。对于128bit的字符串和足够大的集合,求交速度比PSZZ15快3.1~3.6倍,具体说只需3.8s就能求出集合大小为\(2^{20}\)的交集。
「PSZZ15」Phasing: Private set intersection using permutation-based hashing-2015
「PSZ14」Faster private set intersection based on OT extension-2014
总结了PSI协议构造的方法:基于哈希的、基于公钥加密的、基于GC的、基于OT的等。改进了「PSZ14」方案:使用置换哈希减少
bin的位长、使用哈希和安全电路计算,降低电路深度和通信消耗、使用改进的OT协议改进计算和内存消耗。
对于在bin中的数据,\(z\)表示所用的哈希函数,OPRF的输入为\(x||z\),输出为\(F(k_{h_z(x)},x||z)\);对于在stash中的数据,OPRF的输入不变,即\(x\),输出为\(F(k_{1.2n+x},x)\),所以H和S的生成为:\(\begin{gathered} H_{i} =\{F(k_{h_t(x)},x\|i)\mid x\in X\},\text{for}i\in\{1,2,3\} \\ S_{j} =\{F(k_{1.2n+j},x)|x\in X\},\text{for}j\in\{1,\ldots,s\} \end{gathered}\)。
这样PRF的值变为了\(n+ns\),且降低了OPRF的碰撞概率。
关于\(K=(k_1,....,k_{1.2n+s})\)的生成没有具体说,待补充。
环境:Centos7.6
## 下载
git clone http://github.com/osu-crypto/BaRK-OPRF.git
## 下载依赖库
cd BaRK-OPRF/thirdparty
bash all_linux.get
## 会发现有些问题,需要将makelist中的'yum -Y'改为'yum -y'
## 编译
cd ..
make
## 会发现mpir安装的有问题,原来是给的下载链接失效了,重新找了一个替换上
## mpir.get文件
wget http://sources.buildroot.net/mpir/mpir-3.0.0.tar.bz2
tar -xjf mpir-3.0.0.tar.bz2
mv mpir-3.0.0 mpir
rm mpir-3.0.0.tar.bz2
cp ./mpir_patch/mpirxx.h ./mpir/
cp ./mpir_patch/mpir.h ./mpir/
cd mpir
./configure
make
## 重新编辑,即可
make
## 测试
./Release/bOPRFmain.exe -t
# 输入数据集规模为2^{12},进行测试
./Release/bOPRFmain.exe -t
计算6种情况下的PSI,输入数据规模为(\(2^8\),\(2^{12}\),\(2^{16}\),\(2^{20}\),\(2^{24}\))。对于每种情况,运行代码10次来计算PSI。输出包括平均在线/离线/总运行时间(显示在屏幕上)和output.txt文件。
# Sener
./Release/bOPRFmain.exe -r 0
# Receiver
./Release/bOPRFmain.exe -r 1
# Sener
./Release/bOPRFmain.exe -r 0 -ip <ipAdrress:portNumber>
# Receiver
./Release/bOPRFmain.exe -r 1 -ip <ipAdrress:portNumber>
//提示函数,其中argv0指向exe
void usage(const char *argv0)
{
std::cout << "Error! Please use:" << std::endl;
std::cout << "\t 1. For unit test: " << argv0 << " -t" << std::endl;
std::cout << "\t 2. For simulation (2 terminal): " << std::endl;
;
std::cout << "\t\t Sender terminal (localhost): " << argv0 << " -r 0" << std::endl;
std::cout << "\t\t Receiver terminal (localhost): " << argv0 << " -r 1" << std::endl;
std::cout << "\t\t Sender terminal (with ip input): " << argv0 << " -r 0 -ip <ip:port>" << std::endl;
std::cout << "\t\t Receiver terminal (with ip input): " << argv0 << " -r 1 -ip <ip:port>" << std::endl;
}
int main(int argc, char **argv)
{
//有两个参数,第一个为exe,第二个为“-t”,其中第二个参数argv[1][0] == '-',argv[1][1] == 't'
if (argc == 2 && argv[1][0] == '-' && argv[1][1] == 't')
{
BopTest();
}
//有三个参数,第一个为exe,第二个为“-r”,第三个为“0”,另外atoi()能把字符串转换成整型数
else if (argc == 3 && argv[1][0] == '-' && argv[1][1] == 'r' && atoi(argv[2]) == 0)
{
BopSender("localhost:1213");
}
//有三个参数,第一个为exe,第二个为“-r”,第三个为“1”
else if (argc == 3 && argv[1][0] == '-' && argv[1][1] == 'r' && atoi(argv[2]) == 1)
{
BopRecv("localhost:1213");
}
else if (argc == 5 && argv[1][0] == '-' && argv[1][1] == 'r' && atoi(argv[2]) == 0 && argv[3][0] == '-' && argv[3][1] == 'i' && argv[3][2] == 'p')
{
//获取ip
string ipAddr = argv[4];
BopSender(ipAddr);
}
else if (argc == 5 && argv[1][0] == '-' && argv[1][1] == 'r' && atoi(argv[2]) == 1 && argv[3][0] == '-' && argv[3][1] == 'i' && argv[3][2] == 'p')
{
string ipAddr = argv[4];
BopRecv(ipAddr);
}
else
{
//跳转提示
usage(argv[0]);
}
return 0;
}
int main(int argc, char** argv)主函数中的argc代表的是参数的数量,至少为1(argv[0]即.exe文件的路径)。argv为指针表示的参数,argv[0]表示第一个参数,argv[1]表示第二个参数,以此类推。
待补充
参考:隐私集合求交
[KKRT16] 是半诚实 OT-based PSI协议,基于 OT Extension, BaRK-OPRF 和 CuckooHash。 [KKRT16] 是第一个在千万( 224224)规模,长度(128 bits)数据集上,求交时间在1分钟之内的PSI协议.
隐语 SPU PSI 中使用了 [PSZ18] 提到的 3-way stash-less CuckooHash:
编者按:本文作者系Scott(中文名陈晓辉),现任大连华信资深分析师,ORACLE数据库专家,曾就职于甲骨文中国。个人主页:segmentfault.com/u/db_perf,经其本人授权发布。今天在19c上又做了一次SqlPatch,发现上次写的在11gR2的方法总是报错,于是又看了19c的OnlineDocuments。更新了一下SqlPatch的做成方法。OracleSQL性能调优:使用SqlPatch固定执行计划(一)做成TEST用户和Table,Index。SQL>grantconnect,resource,unlimitedtablespacetotest3identifiedbytest3; 権限付与が成功しました。 SQL>grantadministersqlmanagementobjecttotest3; 権限付与が成功しました。 SQL>conntest3/test3@localhost:1521/pdb 接続されました。 SQL>createtabletab2(c1number,c2number,c3varchar2(10));
1.背景1.1简介关于正则表达式[1],相信大家并不陌生,可能平时只是粘贴下相关代码,并不了解里面所写匹配规则。这篇文章我们将介绍iOS相关正则表达式基本语法和一些实例,希望看完此文大家能有所收获;1.2工具在线匹配工具oschina[2]runoob|菜鸟工具[3]rubular[4]regexpal[5]安装包regexBuddy_Mac[6]regexBuddy_Windows[7]图形化展示工具regulex[8]eg:库Objective-CRegExCategories[9]2.认识正则表达式2.1概念正则表达式(又称规则表达式),英语为RegularExpression,常简写为regex、regexp或RE。它使用单个字符串来描述,匹配一系列符合某个句法规则的字符串。使用场景:用来批量提取或替换有规律的字符串;在高级文本编辑器中使用;在各类办公软件(office等)中使用;检测用户的输入是否合法;在各种开发语言中使用;(C#,java,JS,PHP等)网络爬虫;批量文本处理等;eg:Xcode使用场景[10]2.2初识篇正则表达式是由普通字符和特殊字符(也叫元字符或限定
参考链接:Python中的字符串的endswith1、什么是BIF? BIF就是Built-inFunctions,内置函数。为了方便程序员快速编写脚本程序,Python提供了非常丰富的内置函数,我们只需要直接调用即可,例如print()的功能是“打印到屏幕”,input()的作用是接收用户输入。注:Python3用input()取代了Python2的raw_input()。2、转移字符“\”在Python中的用法实例 (1)转移字符“\”一个默认转成两个。两个还是依旧是两个。三个默认转成4个; 另外:注意print(str)跟str直接回车的效果 (2)转移字符“\”在含有单引号or双引号在字符串中的应用 (3)如果在原始字符串c:\programfile\python\me结尾输入反斜杠,怎么处理? 3、三引号字符串 三引号字符串不赋值的情况下,通常当作跨行注释使用 4、输出多行字符串的方法 方法一:用三引号实现”’多行字符串”’ 方法二:一行写不下时,加符号’\’在每行末尾 方法三:也可用(‘多行字符串‘) 5、字符串格式化参数 (1)format参数 其中: 参数
1.第一个Mybatis程序思路:搭建环境-》导入Mybatis-》编写代码-》测试!1.1搭建环境创建数据库mybatis-study创建表user------------------------------ --Tablestructureforuser ------------------------------ DROPTABLEIFEXISTS`user`; CREATETABLE`user`( `id`int(20)NOTNULLAUTO_INCREMENT, `name`varchar(30)DEFAULTNULL, `pwd`varchar(30)DEFAULTNULL, PRIMARYKEY(`id`) )ENGINE=InnoDBAUTO_INCREMENT=4DEFAULTCHARSET=utf8; ------------------------------ --Recordsofuser ------------------------------ BEGIN; INSERTINTO`user`VALUES(1,'张三','12
作者link-web@知乎https://zhuanlan.zhihu.com/p/86441879编辑极市平台以下都在Ubuntu上面进行的调试,使用的Ubuntu版本包括14,18LST1.单机多卡并行训练1.1.torch.nn.DataParallel我一般在使用多GPU的时候,会喜欢使用os.environ['CUDA_VISIBLE_DEVICES']来限制使用的GPU个数,例如我要使用第0和第3编号的GPU,那么只需要在程序中设置:os.environ['CUDA_VISIBLE_DEVICES']='0,3'复制但是要注意的是,这个参数的设定要保证在模型加载到gpu上之前,我一般都是在程序开始的时候就设定好这个参数,之后如何将模型加载到多GPU上面呢?如果是模型,那么需要执行下面的这几句代码:model=nn.DataParallel(model) model=model.cuda()复制如果是数据,那么直接执行下面这几句代码就可以了:inputs=inputs.cuda() labels=labels.cud
2018年年底到2019年年初,一场组织变革的飓风席卷了国内各大互联网公司。阿里、腾讯、百度、京东、美团等先后拿出了几年来最大规模的组织调整计划。在这些变化中,一个值得关注的现象是,各大公司都不约而同地在组织架构中增设“中台”。1中台是什么,能解决什么问题?那么,“中台”到底是什么?跟我们熟悉的“平台”有什么关系?大家估计听过华为在几年前就提出的“平台炮火支撑精兵作战”的平台化战略,“让听得到炮声的人能呼唤到炮火”说的就是大平台赋能一线团队,快速将后台能力投送到需要支援的地方,使华为可以迅速响应瞬息万变的市场机会。(图片来源网络)在平台化战略的实践过程中,随着企业业务的发展,逐渐诞生了很多支撑前台营销场景的工具系统。这些工具系统主要面向企业的最终用户和市场营销人员,要快速响应市场需求,快速创新迭代。因此产生大量调取后台系统资源的需求。然而,很多后台系统在创建之初是为了解决特定场景下的管理效率或安全管控需求(比如财务系统、CRM系统、物流系统等),其目标并不是服务于前台的各种业务创新。所以在能力设计上,这些老后台系统大部分是封闭的,很难开放出来给前台系统调用。此时的前台和后台就像是两个不
2019年被定为“RPA机器人流程自动化”元年,当然也有人说2018年是元年,这里我就不做过多的争论了。但是对于大多数公司来说RPA(机器人流程自动化)仍然是一项全新的人工智能技术。在使用和部署方面有很多困惑,为了确保企业成功部署RPA,下面将从部署、使用、维护等方面入手,小编为大家整理出来6个评估标准作为参考。界面直观易用大多数成功的技术产品都有界面简洁易用的特性。如果该工具使用过于复杂并且需要高水平的IT技能和经验,那么无论这款软件多么优秀,也只有极少数人愿意使用它。一款成功的RPA机器人一般包含这些特征:简洁直观的流程设计界面,内置流程排错工具,拥有卓越的人工智能技术,如机器学习、OCR识别、自然语言处理等。平台独立许多企业在其IT运营中需要高灵活性和多功能性,平台独立性的RPA在部署和扩展方面将更加方便。正如全球技术咨询公司Capgemini指出的那样,使用独立平台的RPA将允许企业自动执行跨平台业务流程,包括:Web浏览器、移动应用程序和基于大型机的应用程序。部署RPA成本企业使用RPA的目的是为了减少成本支出,在部署RPA之前计算好它的成本非常有必要。一家专业的RPA供应商
PXE+dhcp+tftp+http+kickstart批量网络安装服务器转发之前写的pxe安装服务器:http://www.attacker.club/article/125服务列表dhcp:分配IP地址,指定启动文件和tftp服务地址tftp-server:传输引导文件http:将光盘iso镜像发布 pxelinux.0:系统pxe的启动文件通过安装syslinux包获得ks.cfg:通过/root/anaconda-ks.cfg定制自己的参数,如果有图形界面可以安装kickstart生成自动化文件查看分配的地址,我这里启动是vm分配的ip,可以停掉vmdhcp。生产环境可以根据mac和先后顺序找到主机并进行ssh登录。cat/var/lib/dhcpd/dhcpd.leases #客户端IP地址记录复制效果图停留界面安装过程启动主机脚本1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 4
写这篇文章的初衷,主要由于自己所负责的项目有这方面的需求,就简要提一提web安全方面的一些知识一.web安全的兴起web攻击技术经历几个阶段a.服务器端动态脚本的安全问题b.sql注入的出现c.xss的出现d.web攻击思路从服务器到客户端二.安全三要素机密性(Confidentiality)、完整性(Integrity)、可用性(Availability)。机密性:要求保护数据内容不能泄露,加密是实现机密性要求的常见手段。完整性:要求保护数据内容是完整、没有被篡改的,常用方法是数字签名。可用性:要求保护资源是“随需而得”,DOS破坏了这个规则三.安全评估的四个阶段资产等级划分、威胁分析、风险分析、确认解决方案四.微软提出的威胁建模方法STRIDE模型威胁定义对应的安全属性Spoofing(伪装)冒充他人身份认证Tampering(篡改)修改数据或者代码完整性Repudiation(抵赖)否认做过的事不可抵赖性InformationDisclosure(信息泄露)机密信息泄露机密性DenialofService(拒绝服务)拒绝服务可用性ElevationofPrivilege(提升权限
Struts2以WebWork优秀的设计思想为核心,吸收了Struts框架的部分优点,提供了一个更加整洁的MVC设计模式实现的Web应用程序框架。Struts2引入了几个新的框架特性:从逻辑中分离出横切关注点的拦截器、减少或者消除配置文件、贯穿整个框架的强大表达式语言、支持可变更和可重用的基于MVC模式的标签API,Struts2充分利用了从其它MVC框架学到的经验和教训,使得Struts2框架更加清晰灵活。 Struts2的详细交教程可以看:http://www.yiibai.com/struts_2/为什么要用Struts2:struts2其实就是为我们封装了servlet,简化了jsp跳转的复杂操作,并且提供了易于编写的标签,可以快速开发view层的代码。 过去,我们用jsp和servlet搭配,实现展现时,大体的过程是: 1jsp触发action 2servlet接受action,交给后台class处理 3后台class跳转到其他的jsp,实现数据展现 现在有了struts2,实现过程变为 1jsp触发action 2struts2拦截请求,调用后台ac
微服务到底意味着什么?它与以往的开发架构有何不同?阅读本文了解微服务的架构及优势。最近几年,越来越多的开发人员使用“微服务”一词来阐述他们的系统或应用架构,当然或许这只是他们在吹嘘自己在技术潮流中并未落伍。我认为,科技行业的人士至少要了解微服务的基础知识,因为它代表着未来的发展方向。即使对我的话半信半疑,还有SAP总裁为我背书。不过话说回来,到底什么是微服务呢?微服务架构首先,确切地说,当谈到微服务时,我们实际上是指微服务架构。这是一种独特的架构设计模式,它将是软件、web或移动应用拆分为一系列独立的服务——如微服务。这些服务仅用于某一个特定的业务功能,例如:用户管理、用户角色、电子商务购物车、搜索引擎、社交媒体登录等。此外,它们是相互独立的,这意味着它们可以采用不同的编程语言和数据存储。微服务中几乎不存在集中管理,它使用轻量级的HTTP、REST或ThriftAPI来进行内部通信。当然有些人会问:嘿,这和SOA有什么不一样?某种程度上,您可以说微服务首先实现了面向服务的架构目标。然而,两种架构之间仍然存在差异。通常经典的SOA适用于部署一体化架构应用,并且更倾向于平台驱动,而微服务必
方法重写/覆盖(override) 基本介绍: 简单来说,方法覆盖(重写)就是子类有一个方法,和父类的某个方法的名称返回类型,参数一致,那么就可以说子类的这个方法覆盖了父类的那个方法 入门: //com.edu.override_包下的Override01.java •注意事项和使用细节 方法重写也叫方法覆盖,需要满足下面的条件//Animal.javaDog.java 子类的方法的参数,方法名称,要和父类方法的参数,方法名称完全一样。 子类方法的返回类型和父类方法返回类型一样,或者是父类返回类型的子类比如父类返回类型是Object,子类方法返回类型是String publicObjectgetInfo(),publicStringgetInfo()//这里由于子类的返回类型String是父类返回类型的Object的子类,因此也可以//注意:如果把二者调换过来,子类返回Object父类返回String的话就会报错了//这是因为不符合父类的返回类型是子类返回类型的父类复制 子类方法不能缩小父类方法的访问权限 例如,前面我们学习过,public是访问权限最大的,如果父类方法采
keys 简单贪心(idy002原话) 我反正是不信的。 要点是证明选择的钥匙一定是连续的n个。 可通过三个点两个人一个办公室之间的选择优劣来进行理解。 问题是为什么输出距离最大值就可以AC? idy002老师的数据已经日渐生命之源(水)了。 忆往昔线段树0分程序5e4大样例A的飞快。 #include<cstdio> #include<queue> #include<algorithm> #defineFN"keys" constintmaxn=5000+5; constintmaxk=10000+5; constintoo=0x3f3f3f3f; inta[maxn],b[maxk]; intabs(intx){returnx<0?-x:x;} intmain(){ freopen(FN".in","r",stdin); freopen(FN".out","w",stdout); intn,k,p;scanf("%d%d%d",&n,&k,&p); for(inti=1;i<=n;i++)sc
看了无数资料,总结一下自定义View 先明白一个自定义View的三大流程 onMeasure() 测量,决定View的大小 onLayout() 布局,决定View在ViewGroup中的位置 onDraw() 绘制,画出这个View的内容 这三个方法都存在于View类中,我们自定义View需要针对这三个方法做出修改来达到我们需要的目标或功能 先来一个最基本的例子,我们单纯的画一个圆,我们只需修改onDraw()方法即可 MyCustomVew.java publicclassMyCustomViewextendsView{ publicMyCustomView(Contextcontext,AttributeSetattrs,intdefStyleAttr){ super(context,attrs,defStyleAttr); //TODOAuto-generatedconstructorstub } publicMyCustomView(Contextcontex
正常使用 <el-popoverref="popover"popper-class="wrap"effect="dark"placement="bottom-start"title="当日晚间更新,入选条件(机选)" trigger="hover"></el-popover> <imgclass="tip"src="../../static/images/icon/4.png"alt=""v-popover:popover>复制 配合表格组件使用 <el-table:data="tableData"style="width:100%"> <el-table-columnalign="center"prop="gn"label="文字"width="190"> <templateslot-scope="scope"> <el-popovereffect="dark"placement="top-start":title="scope.row.gn"trigger="hover"> &l
String对象提供的方法用于处理字符串及字符。 常用的一些方法: charAt(index):返回字符串中index处的字符。 indexOf(searchValue,[fromIndex]):该方法在字符串中寻找第一次出现的searchValue。如果给定了fromIndex,则从字符串内该位置开始搜索,当searchValue找到后,返回该串第一个字符的位置。 lastIndexOf(searchValue,[fromIndex]):从字符串的尾部向前搜索searchValue,并报告找到的第一个实例。 substring(indexA,indexB):获取从indexA到indexB的子串 toLowerCase():将字符串中的所有字符全部转换成小写 toUpperCaser():将字符串中的所有字符全部转换为大写
Description 奶牛们没钱了,正在找工作。农夫约翰知道后,希望奶牛们四处转转,碰碰运气。而且他还加了一条要求:一头牛在一个城市最多只能赚D(1<=D<=1,000)美元,然后它必须到另一座城市工作。当然,它可以在别处工作一阵后又回来原来的城市再最多赚D美元。而且这样往往返返的次数没有限制。城市间有P(1<=P<=150)条单向路径连接,共有C(2<=C<=220)座城市,编号1..C.贝希当前处在城市S(1<=S<=C)。路径i从城市A_i到城市B_i(1<=A_i<=C;1<=B_i<=C),在路径上行走不用花任何费用。为了帮助贝希,约翰让它使用他的私人飞机服务。这项服务有F条(1<=F<=350)航线,每条航线是从城市J_i飞到另一座城市K_i(1<=J_i<=C;1<=K_i<=C),费用是T_i(1<=T_i<=50,000)美元。如果贝希手中如果没有现钱,可以用以后赚的钱来付机票钱。贝希可以选择任何时候,在任何城市退休。如果在工作时间上不作限制,贝
Go语言入门(一)基础语法 写在前面 在学习Go语言之前,我自己是有一定的Java和C++基础的,这篇文章主要是基于AtourofGo编写的,主要是希望记录一下自己的学习历程,加深自己的理解 本地安装Go语言环境 关于如何安装Go语言的编程环境,我推荐大家看这篇文章 编写Hello,World 学习语言时,首先编写一个「Hello,World」已经成了程序员的习惯,这里我们也编写一个,顺便测试一下Go语言环境是否搭建成功了: 首先创建一个名为hello.go的文件,编写代码如下: packagemain import"fmt" funcmain(){ fmt.Printf("Hello,World\n") } 复制 接着我们在命令行中使用go工具运行它: $gorunhello.go Hello,World 复制 如果像上面一样看到了「Hello,World」信息,则表示我们已经迈出学习Go语言的第一步了。 关于更多Go语言的编程方法以及相应命令,我们可以看这里,它为我们清楚地介绍了Go语言的环境变量等相关设置。 在都搭建完成之后,我们就可以进入Go语言的语法学习了。 包、变量
启动第一步--加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它。这是因为BIOS中包含了CPU的相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息、PnP特性等等。在此之后,计算机心里就有谱了,知道应该去读取哪个硬件设备了。 启动第二步--读取MBR 众所周知,硬盘上第0磁道第一个扇区被称为MBR,也就是Master BootRecord,即主引导记录,它的大小是512字节,别看地方不大,可里面却存放了预启动信息、分区表信息。 系统找到BIOS所指定的硬盘的MBR后,就会将其复制到0×7c00地址所在的物理内存中。其实被复制到物理内存的内容就是BootLoader,而具体到你的电脑,那就是lilo或者grub了。 启动第三步--BootLoader BootLoader就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核做好一切准备。 BootLoader有若干种,其中Gr