Tcl将说有的变量值视作字符串,并将他们作为字符串进行保存。
命令 | 描述 |
---|---|
append | 将值追加到字符串尾 |
binary | 二进制化字符串 |
format | 字符串格式化 |
regexp | 正则表达式(用于字符串模式匹配) |
regsub | 用正则表达式进行字符串模式匹配和替换 |
scan | 字符串分解 |
string options | 字符串操作和命令集 |
subst | 字符替代(替代特殊字符) |
将一段字符串连接到另外一字符串形成新的字符串,此命令对变量直接进行修改。
append varName?value?
set var1 Hello
set var2 World
append var1 $var2
=>HelloWorld
puts $var1
=>HelloWorld # var1的内容被更改
format命令和C语言中的printf和sprintf命令类似,根据一组格式说明来格式化字符串。此命令不会更改被操作字符串的原有内容
# 使用格式
format spec value1 value2.....
set res [format "%2\$s" 1 5 9]
spec包含了格式说明关键词和附加文字,使用%引入一个关键词,后跟0个或者多个修饰符,然后使用一个转换格式符结尾。("%关键词+附加文字+修饰符+格式转换符")
字符 | 说明 |
---|---|
d | 有符号整数 |
U | 无符号整数 |
i | 有符号整数,变元可以是十六进制Ox或者八进制O |
o | 无符号八进制 |
x、X | 无符号十六进制 |
C | 将整数映射到ACSII码表示的字符 |
s | 字符串 |
f | 浮点数 |
e、E | 科学计数法表示的浮点数 |
g、G | 以%f或%e来表示的浮点数 |
标志 | 说明 |
---|---|
- | 使字段左对齐 |
+ | 使字段右对齐 |
space | 在数字前加一个空格,除非数字有带前导符号。 |
0 | 用0补充空白 |
# | 前导O表示八进制,前导Ox表示十六进制数,浮点数中总要带上小数点。不删除末尾的0 |
set str [format "%3\$s %1\$s %2\$s" "are" "right" "You"]
=> You are right
format "%x" 20
=>14 # x表示无符号十六进制数
format "%8x" 20
=> 14 # 将20转变为8位十六进制数,右对齐
format "%08x" 20 # 将20转换为十六进制数,8位数据宽度,用0填补
=>00000014
format "%#08x" 20 # 将20进制转变为十六进制数,8位数据宽度,用0填补,添加前导Ox
=>0x000014
set c [format %c%e%c 40 30000 41]
=>(3.000000e+004) # C表示将整数映射为ASCII字符,40和41对应“(”,“)”
set num [scan Aa %C Var1]
=>1 # 将字符串Aa的第一个字符A转换为对应整数
# 并赋值给Var1变量,返回成功转换的个数
puts $Var1
=>65 # 字符A对应的整数
scan命令根据格式描述解析一个字符串,并将对应的值赋值给后面的变量,成功后返回成功转换的个数。
scan string format var1?var?var?var?......
scan的格式描述几乎与format相同,但不用%U。%C的作用与format中的相反,是将一个ASCII字符转换为对应的整数值。
set num [scan "abcABC" "%C%C" var1 var2]
=>2
puts "$var1 $var2"
=>97 98
set num [scan "abcABC" "%C%C"]
=>97 98
puts $num
=>97 98 # 没有制定输出变量的结果
# 格式描述说明要扫描小写a-z区间的连续字符,用到了花括号表明是一个集合。
scan "abcABC" {%[a-z]} res
=>1
puts $res
=>abc # {} 表示一个字符串 %[a-z] 相当于正则表达式
# {%正则表达式}
scan "ABCabc" {%[A-b]} res
=>1
puts $res
=>ABCab
scan "ABCabc" {%[^a-b]} res # ^是表示非的意思,%2[^a-b] 2个不是a-b
=>1
puts $res
=>ABC
scan "ABCabc" {%2[^a-b]} res
=>1
puts $res
=>AB
Tcl8.0之后支持二进制字符串。
根据数据的存储形式可以分为ASCII形式和二进制形式。
# 使用binary format对数值字符串25664进行二进制压缩,使用binary scan进行恢复
# 25664二进制数0110010001000000,需要使用两个字节进行存储
set b [binary format "s" 25664]
=>@d
puts $b
=>@d
binary scan $b "s" var
=>1
puts $var
=>25664
binary scan 1 C var
=>1
puts $var
=>49
binary format spec value1?value...?
binary scan spec var1?var2.......?
spec为格式描述字符串
根式描述模板包括类型关键字和记数值(type count)两个部分。下表总结了这些类型。表中,类型为跟在类型关键字字母后的可选计数。
类型 | 说明 |
---|---|
a | 包含count个字符的字符串,在binary format中以空白字符作为补白 |
A | 和a功能相同,使用空格符而不是空字符作为补白 |
b | 长度为count的二进制字符串,以0和1组成,按照从低到高的bit位顺序排列 |
B | 长度为count的二进制字符串,以0和1组成,按照从高到低的bit位顺序排列 |
h | 长度为count的十六进制字符串,按照从低到高的bit位顺序排列 |
H | 长度为count的十六进制字符串,按照从低到高的bit位顺序排列 |
C | 一个8位字符编码。binary scan中会从字符串中将字符转换为对应整数 |
s | 字节顺序为little-endian的16位整数。count用于指定重复特性 |
S | 字节顺序为big-endian的16位整数。count用于指定重复特性 |
i | 字节顺序为little-endian的32位整数。count用于指定重复特性 |
I | 字节顺序为big-endian的32位整数。count用于指定重复特性 |
f | 本机格式的单精度浮点数,count用于指定重复特性 |
d | 本机格式的双精度浮点数,count用于指定重复特性 |
x | 使用bianry format放置count个空字节 |
X | 回退count个字节 |
@ | 调到由count指定的绝对位置,如果count为*则调到末尾 |
智能门锁的识别技术中,密码几乎成为标配功能。相比机械按键的触控方式,电容式触控方式可以在加上一层玻璃甚至金属一体成型之后与用户进行交互,由于进行了物理性隔离,使得外壳更具完整性,物理上安全性更佳。目前做触摸方案的产商有很多,国外的有ADS、Cypress、synaptics等,国内的有合泰、海砾创、贝特莱、敦泰、泰凌微等。在电容触控方式中,分为自容、互容触控方案。自容方案:使用一个引脚,利用引脚和电源地之间电容的容量变化进行测量互容方案:利用两个电极之间的电容容量变化进行测量自容方案简单,计算量小,但速度慢;互容方案相对复杂,但可支持多点触控,速度快。智能门锁为分立式按键,因此一般采用自容式的触摸芯片方案。在触摸感应系统中所有电容的计算都符合平行板电容公式:在触摸芯片中,实现电容式感应触摸识别的常用电路主要由:驰张振荡电路、电荷转移电路、CDC电容转数字信号电路;电荷迁移电路原理以爱矽半导体科技的一款电容式触控传感架构为例,SW1关闭,SW2打开,Vtk对Cp充电;SW1打开,SW2关闭,Cp的电容向Cx放电,Cx上的电压缓慢上升;重复步骤1-2,当Cx的电压升高大于Vref时,比较器
HTTPS主要的计算环节大象为什么跳不高跑不快?因为它很重。HTTPS为什么访问比较慢为什么消耗CPU资源呢?同样也是因为它很重。HTTPS的重,体现在如下几方面:1.大量的计算。SSL的每一个字节都涉及到较为复杂的计算。即使是clientHello,也需要在握手完成时做校验。2.TLS协议的封装和解析。HTTPS所有数据都是按照TLSrecord格式进行封装和解析的。3.协议的网络交互。从TLS的握手过程可以看出,即使不需要进行任何计算,TLS的握手也需要至少1个RTT(roundtriptime)以上的网络交互。其中第2和第3点不是本文重点。本文侧重为大家分析HTTPS计算方面的原理,计算性能的测试和优化。总体来说,HTTPS主要有如下计算环节:非对称密钥交换。比如RSA,Diffie-Hellman,ECDHE.这类算法的主要作用就是根据客户端和服务端不对称的信息,经过高强度的密钥生成算法,生成对称密钥,用于加解密后续应用消息。对称加解密。服务端使用密钥A对响应内容进行加密,客户端使用相同的密钥A对加密内容进行解密,反之亦然。消息一致性验证。每一段加密的内容都会附加一个MAC消息
参考链接:C++copysign()今天在项目中检查到一个bug,程序会在某些情况下崩溃,最终认定是计算一个比值时,被除数和除数均为零,导致计算结果是个无效值,在后面的代码将使用这个无效值时导致了崩溃。需要对这个结果是否有效进行判断。 下面列出IEEE推荐的对浮点型的常用函数,包括特殊值(无穷、无效)的判断: /*ThesearealsodeclaredinMingwfloat.h;neededhereaswelltowork aroundGCCbuildissues. *//*BEGINFLOAT.HCOPY*//* *IEEErecommendedfunctions */#ifndef_SIGN_DEFINED#define_SIGN_DEFINED _CRTIMPdouble__cdecl_chgsign(double_X); _CRTIMPdouble__cdecl_copysign(double_Number,double_Sign); _CRTIMPdouble__cdecl_logb(double); _CRTIMPdouble__cdecl_nextafter(do
前言如果你的项目需要语音播报的功能,YS-M3是一个可选方案使用方法(以Arduino为例)1.准备TF卡准备一个小于16G的TF卡,格式化后创建一个名为01的文件夹,要播放的语音包分别命名为001.mp3、002.mp3、003.mp3等等...最多支持31个语音文件。mp3格式、wav格式均支持。2.单键触发方式模块有A1-A9共9个直接触发端口,分别对应9首mp3文件;可以使用第三个引脚去触发,例如我们使用一个公对母杜邦线分别连接5V和A1端口,则播放第一首歌曲。或者使用单片机IO口触发(如果是高电平触发的mp3模块,IO口输出高电平即可)。3.编码触发模式如果模块为高电平触发版本,A10端口给与高电平,系统切换为编码触发模式。其中A1-A5为5个编码端口,以二进制编码的方式,控制单片机播放指定编号的语音文件。如果是低电平触发版本,给与A10端口低电平,则以二进制编码反码的方式,控制播放;代码举例://这里使用Arduino的模拟口作为输出口,节省数字IO口voidsetup(){pinMode(A1,OUTPUT);pinMode(A2,OUTPUT);pinMode(A3,O
转载注明出处,欢迎关注微信小程序1准备Gitlab相关插件安装,参考前面文章《JenkinsGithub&Gitlab集成之安装Git插件》及《gitlaborgithub代码提交后自动构建2》安装Publishoverssh插件ManageJenkins->ConfigureSystem->PublishoverSSH配置SSH。可以只需配置密码或者是公钥,两者均可服务器配置需要指定主机地址和主机登录用户名,远程拷贝目录点击TestConfiguration可以测试是否可以连接远端服务器成功2目标和原理2.1目标当Gitlab提交了Tag时,触发自动编译、打包和自动远程部署2.2原理通过在指定Gitlab项目上添加Jenkins的webhook,然后配置提交Tag时触发钩子。从而,Jenkins执行Jenkinsfile实现自动编译、打包和自动远程部署。3Jenkins项目创建及webhook配置创建一个Pipeline项目配置项目BuildTriggers->勾选BuildwhenachangeispushedtoGitLab.GitLabwebhookU
原文:https://github.com/kubernetes/community/blob/master/contributors/design-proposals/autoscaling/vertical-pod-autoscaler.md 作者:Kgrygiel,Mwielgus 译者:余广坝编者按目前Kubernetes的Pod水平自动伸缩(HPA,HorizontalPodAutoscaler)已在业界广泛应用。但对一些特殊的Pod(如一些有状态的Pod),HPA并不能很好地解决资源不足的问题。这就引出Pod垂直自动伸缩(VPA,VerticalPodAutoscaler),本文主要介绍Kubernetes社区对Pod垂直自动伸缩组件的开发规划。VPA定义垂直自动伸缩(VPA,VerticalPodAutoscaler)是一个基于历史数据、集群可使用资源数量和实时的事件(如OMM,即outofmemory)来自动设置Pod所需资源并且能够在运行时自动调整资源基础服务。介绍背景计算资源资源服务质量准入控制器外部准入webhooks目标VPA有两个目标:通过自动配置资源请求来减
0x01,漏洞背景ApacheSolr是一个开源的搜索服务器。Solr使用Java语言开发,主要基于HTTP和ApacheLucene实现。此次漏洞出现在ApacheSolr的DataImportHandler,该模块是一个可选但常用的模块,用于从数据库和其他源中提取数据。它具有一个功能,其中所有的DIH配置都可以通过外部请求的dataConfig参数来设置。由于DIH配置可以包含脚本,因此攻击者可以通过构造危险的请求,从而造成远程命令执行。影响范围:ApacheSolr<8.2.0ApacheSolr<8.2.0并且开启了DataImportHandler模块,在默认情况下该模块不被启用,存在该漏洞。但是Solr>=8.2.0版安全。因为从Solr>=8.2.0版开始,默认不可使用dataConfig参数,想使用此参数需要将JavaSystem属性“enable.dih.dataConfigParam”设置为true。只有当Solr>=8.2.0但是主动将JavaSystem属性“enable.dih.dataConfigParam”设置为true,才存
HttpHandler介绍在Http请求处理流程一文中,我们了解了Http请求的处理过程以及其它一些运作原理。我们知道Http管道中有两个可用接口,一个是IHttpHandler,一个是IHttpModule,但在Part.1中,我并没有详细讲述如何对它们进行编程,只是轻描淡写地一笔带过。所谓学以致用,前面已经介绍了不少概念和原理。在本文中,我们通过几个范例来了解IHttpHandler,看看掌握这些原理的实际用途。IHttpHandler概述可能和我一样,很多Asp.Net开发人员都有过Asp的背景,以至于我们在开发程序的时候,通常都是在“页面级”上思考,也就是说我们现在正在做的这个页面应该有什么样的功能,是进行一个问卷调查还是一个数据库查询等等。而很少在“请求级”思考,考虑有没有办法来通过编码的方式来操控一个Http请求。实际上,Framework提供了一系列的接口和类,允许你对于Http请求进行编程,而实现这一操作的一个主要的接口,就是IHttpHandler(另一个是IHttpModule)。应该还记得第一节中我们提到过ISAPI,它根据文件名后缀把不同的请求转交给不同的处理程
JBossAS(重命名为WildFly)已被使用多年,是最有名的高效和免费的Java社区应用服务器之一。当RedHat开始为其企业版JBossEAP的对内部部署,虚拟或云提供商业支持时,吸引了更多关注。红帽还为红帽企业Linux提供商业支持,并为客户提供多种产品的庞大生态系统。许多使用Java技术的软件公司都瞄准CentOS上的WildFly堆栈,因为它支持预算有限的客户,并且还为RedHatEnterpriseLinux上的JBossEAP客户提供商业支持,从而确保他们的软件满足各种客户群。本文介绍了一种Java应用程序托管堆栈中最常见的架构,它包括:CentOS7:作为操作系统。MySQL5.6.24社区服务器:作为关系数据库。WildFly8.2Final:作为Java应用服务器。ApacheHTTP2.4.6:作为HTTP服务器,用于提供静态内容并使用mod_jk1.2.40引导对WildFly的调用(Apache作为反向代理)。在完全安装上面的堆栈之后,运行一个非常小的示例应用程序消耗了大约650MB的内存,因此您可以考虑用于小型应用程序的1GBLinode计划1或者基于您的
大型年度AI人物评选——2017中国AI英雄风云榜已于12月4日在乌镇张榜,12月18日在北京国贸三期举行颁奖典礼。榜单评选出年度技术创新人物TOP10;商业创新人物TOP10,获取完整榜单请关注网易智能公众号(ID:smartman163),回复关键词“评奖”。本文系网易智能工作室出品聚焦AI,读懂下一个大时代【网易智能讯12月15日消息】人工智能正渗透到我们现代生活的每一个角落,人工智能可以在Facebook上给你发布的图片上的朋友贴上名字的标签,或者帮你选择在Instagram上看到的图片,而材料科学家和NASA研究人员也开始使用人工智能来帮助发现新科学和太空探索。但这一技术存在一个核心问题,无论是在社交媒体上还是在火星漫游车中使用过程中,因为建造它的程序员都不知道人工智能做出每一个决定的原因。现代人工智能仍是一种新事物,在过去的5年,大型科技公司对于人工智能的投资和研究才刚刚开始。而在此之前,已有几十年历史的关于人工智能的理论最终在2012年得到了证实。受人脑的启发,一个人工神经网络依赖于“神经元”之间的成千上万个微小的连接,或者是小范围一串串的数学计算,这类似于大脑中神经元的
关注外星闻名,发现不一样的投资视角。年关之际,突然又一个微信小游戏不知不觉迅速传开——跳一跳。这又是一款极富爆款特征的小游戏:极易上手、极易操作、社交比拼、易于传播。为什么在年末微信会推出这么一个爆款小游戏?难道只是为了吸引眼球,在元旦小长假给用户一个消遣且社交的工具,从而让微信再火一把?很多好友在玩的同时都会问一句:这样的游戏火了又如何?这能赚钱吗?“跳一跳”的商业价值究竟在哪里?虽然我并没有跟腾讯微信团队交流过,但我可以相当肯定这是一款精心策划、为小程序“代言”的小游戏,而且到目前为止,可以说相当成功,应该是达到了张小龙的预期,这对于一家互联网公司来说,这个case绝对值千万元,并且将是一个日后经典的互联网产品运营案例。让我带大家沿着一个微信用户接触这款游戏的过程,来探究下它是如何为小程序代言的。我就是首先收到朋友发来的分享,第一反应就是一个普通的小程序,也没当回事,既然有人推荐就顺手一点。然后……看到这个提示,作为一个互联网产品人,我就感到异样了,正常一个主流app不到万不得已,绝不会因为版本低而必须升级才能用新功能,这可是大忌。放在微信身上,直觉告诉我,这一定是故意的,一下子好
Android性能优化之启动速度优化 Androidapp启动速度优化,首先谈谈为什么会走到优化这一步,如果一开始创建app项目的时候就把这个启动速度考虑进去,那么肯定就不需要重新再来优化一遍了。这是因为在移动互联网时代,大家都追求快,什么功能都是先做出来再说,其他的可以先不考虑,先占据先机,或者验证是否值得做。那为什么要这么做呢?我个人的观点有以下几点如果app不能快速开发出来,先放出去验证一下可行性,可能连是否值得做都不知道,如果花很长时间做了一个对用户无价值的功能,那么还不如不做如果app不能快速做出来,可能被竞争对手捕获先机,那么可能错失最佳商业时机如果一开始就规定不能影响启动速度的这个目标,那么做功能的时候就会有束缚,快不起来app初期大家都忙着开发新功能,迭代新版本,没有时间停下来做优化同类型app变多,竞争对手变多,大家才开始关注启动性能,才开始做启动速度优化(有主动出击也有被动优化)一、引起性能问题的原因 随着项目不断的快速迭代,往往会造成App启动卡慢现象,因为可能在App主进程启动阶段或者在主界面启动阶段放了很多初始化其他业务的逻辑,而这些业务落地可能一开始并不
STL源码阅读(六)(SGISTLv3.3) type_traits.h(<type_traits>C++11) 提供编译时类型信息,C++标准直到C++11才正式支持。SGItype_traits.h提供的编译时类型信息很少, 只提供了_Is_integer判断一个类型是否是整型(bool,char,signedchar,unsignedchar,wchar_t, short,unsignedshort,int,unsignedint,long,unsignedlong,longlong,unsignedlonglong), 以及提供了对是否是POD类型的判断,是否有普通的(trivial)默认构造函数,拷贝构造函数,赋值构造函数和 析构函数。 stl_function.h(<functional>) unary_function:用来创建单参数函数对象的基类。 binary_function:用来创建双参数函数对象的基类。 plus,minus,multiplies,divides,modulus,negate:算术运算函数对象。 euqal
科研小工具 给我的科研小工具们做个整理与备份 1文献 中国知网、谷歌学术、百度学术 Sci-Hub:科研学术网址导航 ... 插一句下载硕博论文pdf的方法: ①知网切换至英文模式; ②语言切换至中文繁体; ③搜索硕博论文标题; ④即可找到pdf下载通道。 想法资讯汇集 首页-科研圈内人(insiderofscience.com) 地球科学,热门类期刊,-X-MOL 2写作 变着法儿地写一个句子 ParaphrasingTool|QuillBotAI AI帮你写: SuperchargeYourWritingwithAI|Jenni 用得不是很多,但先囤着的? SCI论文写作宝典-MedSci.cn 术语在线—权威的术语知识服务平台(termonline.cn) Ludwig.guru_WriteBetterEnglish 文献插入 文献管理软件:Zotero、Endnote、Mendeley Zotero话不多说,教程见:“搭建属于自己的文献数据库”—文献管理神器Zotero教程_知乎 EndNote由科睿唯安(Clarivate)研制开发,多文献数据
IDEA全称IntelliJIDEA,是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手、代码自动提示、重构、J2EE支持、各类版本工具(git、svn、github等)、JUnit、CVS整合、代码分析、创新的GUI设计等方面的功能可以说是超常的。IDEA是JetBrains公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。它的旗舰版本还支持HTML,CSS,PHP,MySQL,Python等。免费版只支持Java等少数语言。这里我们安装旗舰版 1.进入官网下载IntelliJIDEA https://www.jetbrains.com/idea/download/#section=windows,选择收费版,下面再破解 2.点击下载进入下载页开始下载,如果没有弹出下载框,请点击图中位置 3.下载之后双击,开始安装,点击next 4.选择安装路径,最好不要安装到C盘,这里我安装到D盘IDEA文件夹,点击next 5.选择安装32位或者64位的,根据你电脑选择,点击next
题意:有一个W列H行的竞技场,机器人要从(1,1)走到(W,H)。竞技场中有一个左上坐标(L,U),右下坐标(R,D)的矩形黑洞。 机器人只能向右走或向下走,概率各为1/2。如果机器人在最后一行,则只能往右走;如果机器人在最后一列,则只能往下走。 问机器人不掉进黑洞成功到达(W,H)的概率。 数据范围: 1≤T≤100. 1≤U≤D≤H. 1≤L≤R≤W. 1≤W≤10^5. 1≤H≤10^5. 复制 分析:机器人要么从黑洞左下方绕过去,要么从黑洞右上方绕过去,时间复杂度O(n)。 注意:由于“如果机器人在最后一行,则只能往右走;如果机器人在最后一列,则只能往下走”,因此最后一行和最后一列的概率一定要单独算! #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #include<string> #include<iostream> #include<set> #
AKKa支持在runtime时hotswapped(热插拔)Actor的messageloop:在Actor中调用context.become方法。hotswapped的代码被存在一个栈中,可以被pushed(replacing或adding在顶部)和popped。become一个特别好的例子是用它来实现一个有限状态机(FSM)。Become/Unbecome特性很方便去实现有限状态转换机。 需要注意的是,当actor被它的Supervisor重新启动时,它将重置为原始行为。[1] importakka.actor.AbstractActor; importakka.actor.Props; importakka.event.Logging; importakka.event.LoggingAdapter; publicclassRequestActor6extendsAbstractActor{ protectedfinalStringname; protectedfinalLoggingAdapterlog=Logging.getLogger(context().system(),
一、AppDesigner启动 1.打开方式 (1)打开App设计工具的首页 appdesigner 复制 (2)打开现有App文件 appdesigner(filename)复制 filename: App文件的名称或路径,指定为字符向量或字符串标量。可以在文件名中包括 .mlapp。一次只能将一个文件名传递给 appdesigner 函数。 如果 filename 出现在搜索路径上的多个文件夹中,请包括该文件的路径。文件指定必须使用文件的完整路径或相对路径,或者MATLAB路径上的文件的名称。 示例: appdesigner('app1.mlapp') 示例: appdesigner("app1") 示例: appdesigner("C:\Documents\Data\watertables.mlapp") (3)菜单栏打开 新建——App 2.首页 在首页中可以创建新的空白App,或者新的具有自动调整布局功能的两栏式或三栏式App,还可以: 查看
最近组织在做一个比较大的项目,需要多人参与配合,经常会对项目文件增删查改,因此使用了SVN作为项目管理工具。但大家都很“盲”,所以搭建SVN服务器的任务就落在了我这个菜鸟身上。 工具使用TortoiseSVN,安装过程中记得把命令行工具也安装上,不然无法使用命令行提交代码。 选择一个空文件夹,比如E:\SVN,进入后鼠标右键创建一个版本库 进入conf文件夹,打开svnserve.conf文件,分别找到 anon-access=read auth-access=write password-db=passwd 复制 去掉前面的注释,并注意不要留空格。 打开同目录下的passwd文件,在[users]下添加用户名和密码,默认有两个示例: #harry=harryssecret #sally=sallyssecret 复制 左边是账号,右边是密码,供组织内不同成员登录用,但如何为每个角色赋予不同权限不太会弄,似乎需要用到hook脚本。比如要为Lucy添加一个账户,可以添加: Lucy=Lucy_123,这样Lucy就能以密码Lucy_123访问项目了。