有时,进步难以察觉,特别是当你正身处其中时。而对比新旧资料之间的差异,寻找那些推动变革的信息源,我们就可以清晰地看到进步的发生。在Linux(以及大部分Unix系统)中,都可以印证这一点。
Unix V7 是 Unix 操作系统的一个重要的早期版本,于 1979 年发布,是贝尔实验室最后一个广泛分发的版本。它是第一个真正可移植的 Unix 版本,被移植到了多种平台上,包括 DEC PDP-11, VAX, x86, Motorola 68000 等。Unix V7 的 VAX 移植版本,叫做 UNIX/32V,是流行的 4BSD 系列 Unix 系统的直接祖先。许多老牌的 Unix 用户认为 Unix V7 是 Unix 发展的顶峰。
Unix V7 Research Release 的源代码可以在 unix-history-repo 这个由 Diomidis Spinellis 维护的项目中找到。如果你想深入了解 Unix 的设计原理,可以参考 Maurice J. Bach 的经典著作 The Design of the Unix Operating System,并查看 Research V7 Snapshot 这个分支的代码库。
1974 年,计算机拥有一个“核心”,即中央处理单元。然而,在某些计算机中,这个“核心”已经发生了变化。不再是由多个部件(如算术逻辑单元、寄存器、顺序控制器和微码存储器)组成的设备,而是一颗单一的集成芯片,单个芯片上集成了数千个晶体管。它们被叫做“小型计算机”。
在 Unix 中,我们通过配置头文件(header file)来处理系统资源。如下图所示,这里显示了头文件中配置的默认值,数据结构是数组,所示值是相应的数组大小。如果要更改它们,则需要编辑文件,重新编译和链接内核,然后重新启动系统。
它有一个文件系统缓冲区缓存(file system buffer cache),使用 NBUF(29)个磁盘块,每个磁盘块的大小是 512 字节,用来暂时存储磁盘上的数据块和 inode,从而加速文件系统访问。另外还有一个索引节点数组(inode array),它有 NINODE (200)个条目,每个条目对应一个文件的元数据,还可以同时挂载 NMOUNT (8)个文件系统。每个用户最多可以运行MAXUPRC(25)个进程,总共有 NPROC(150)个系统进程。每个进程最多可以打开 NOFILE(20)个文件。
阅读 Bach 的著作和 V7 源代码是很有趣的,尽管它们已经完全过时。因为这些源代码中呈现出的许多核心概念更加清晰,结构更简洁,有时甚至带有古老的风格。然而,正是这些概念定义了 Unix 文件系统。V7 Unix 被写入了 POSIX 标准,之后的每个文件系统都必须遵守它。如果您想了解更多相关示例,请参考 But Is It Atomic?
Unix 文件系统的基本概念和结构来自这个系统。其中一些概念甚在现代系统中依然存在。
磁盘由一系列数据块(block)组成,从第 0 块开始,一直到第 n 块结束。在文件系统的开始部分,我们可以找到超级块(superblock)。它位于文件系统的第 1 块。超级块存储了文件系统的一些基本信息,比如文件系统的大小、空闲块的数量、空闲索引节点的数量等。当我们执行挂载(mount)系统调用时,系统会找到一个空闲的挂载结构(mount structure),并且从磁盘上读取超级块,把它作为挂载结构的一部分。
内存中的超级块(in-memory superblock)是磁盘上超级块的副本,用于加快文件系统的访问速度。它包含一个 short 类型的字段,用于存储一个索引节点数组(inode array)在磁盘上的位置。
索引节点(inode)是一个描述文件内容和属性的结构,文件内容由一系列数据块(block)组成,每个数据块的大小是固定的(通常是 512 字节或 1024 字节),文件属性包含文件名、大小、权限、时间戳等元数据(metadata)。
文件系统中的 inode 数组是一个 short 类型的计数器,它的最大值是 65535,也就是说文件系统中最多只能有 65535 个 inode。由于每个文件都需要一个 inode,因此每个文件系统最多只能容纳 65535 个文件。
每个文件具有一些固定属性:
总大小为 64 字节。
Addr 数组包含 40 个字节,但它存储了 13 个磁盘块地址,每个地址使用 3 个字节。这对于 24 位来说非常适用,或者说对应于 16 个大小为 512 字节的兆块,总文件系统大小为 8M 千字节,即 8GB。
PDP-11 RL02K磁盘盒可容纳 10.4 MB,而更新的 RA92 可存储 1.5 GB。
Addr 数组在 bmap() 函数中被使用。该函数接收一个 inode(ip)和一个逻辑块号 bn,并返回一个物理块号。也就是说,它将文件中的一个块映射到磁盘上的一个块,因此得名。
前 10 个块指针直接存储在 inode 中。例如,要访问块 0,bmap() 将在 inode 中查找 di_addr[0] 并返回该块号。
额外的块存储在一个间接块中,而间接块则存储在 inode 中。对于更大的文件,会分配一个双间接块,并指向更多的间接块,最终非常大的文件需要甚至三次间接块。
代码首先确定需要多少层间接寻址,也就是要通过多少个间接块才能找到文件内容的磁盘块。然后,获取相应的间接块。最后,代码按照适当的次数解析间接寻址,也就是根据层数依次从间接块中读取其他间接块或直接块的地址,直到找到文件内容的磁盘块。
对于越来越大的文件,原始的 Unix 文件结构采用了逐渐增加的间接访问次数。这样形成了一个压缩的数组,其中较短的文件可以直接通过 inode 中的数据进行访问,而较大的文件则需要通过越来越多的间接访问来获取数据。为了提高性能,保持间接块在文件系统缓冲区高速缓存中是至关重要的。
这种扩展性取决于块大小(早期为 512 字节,现在为 4096 字节)和块号的字节大小(最初为 3 字节,后来为 4 字节甚至 8 字节)。
文件的写入是在加锁的状态下进行的,因此它们始终具有原子性。即使是跨越多个数据块的写入操作,也是如此。这一点在 But Is It Atomic? 中有详细讨论。
这也意味着即使有多个写入进程,在单个文件上,任何时刻只能有一个磁盘写入操作处于活跃状态。这对数据库系统的开发者来说非常不便利。
目录是一个具有特殊类型和固定记录结构的文件。
一个目录条目包含一个inode号(一个无符号整数)和一个文件名,文件名的长度最多可以达到14个字节。这使得一个磁盘块可以容纳32个目录条目,而一个目录文件的直接块可以引用的10个磁盘块可以容纳320个目录条目。
下层(lower)的文件系统中充满了大量的文件。这些文件没有名称,只有编号。
上层 (upper)的文件系统使用一种特殊类型的文件,具有简单的16字节记录结构,用于为文件分配最多14个字符的名称。一个特殊的函数namei()将文件名转换为inode号。
传递给namei()的路径名具有层次结构:它们可以包含/作为路径分隔符,并以\0(NUL)作为终止符。路径名若以/开头,则遍历将从文件系统的根目录开始,形成绝对路径名;若不以/开头,则遍历将从u.u_cdir,即当前目录开始。
该函数逐个消耗路径名的各个组成部分,使用当前活动目录,并在该目录中线性搜索当前组件的名称。当找到最后一个路径名组件或在任何阶段找不到组件时,该函数结束。如果在路径中的任何目录的任何点上,我们没有 x 权限,它也会结束。
该函数按顺序逐个处理路径名的各个组成部分。它使用当前目录,并在该目录中线性搜索当前组成部分的名称。函数的结束条件有两种情况:一是找到了路径名的最后一个组成部分,二是在路径的任何目录中,出现了无法访问的情况。
挂载点是特殊条目,它会从当前节点和文件系统的目录条目切换到挂载文件系统的根inode。这使得Unix中的所有文件系统看起来像是一棵单一的树,如果要进行"硬盘修改"的操作,只需简单地切换到不同的目录。
最终,该函数将返回给定路径名的inode指针,根据需要和需求创建(或删除)inode(和目录条目)。它是目录遍历和访问权限检查的集中点。
这个早期的Unix文件系统具有许多很好的特性:
它将多个文件系统呈现为一个统一的树形结构;
文件是无结构的字节数组;
这些数组以可动态增加深度的动态数组的形式存储。它们内部使用一种逐渐嵌套的间接块系统,其中数组的元素可以是指向其他数组或数据的指针,从而形成层次嵌套的结构。这使得磁盘搜索的复杂度为O(1);
下层文件系统创建文件和上层的文件系统组织文件互相隔离,分工明确。获取inode的唯一方式是路径名遍历,并且在此过程中始终检查权限;
文件名中只有很少的特殊字符,即/和\0(空字符)。
但也有明显的限制:
文件只能有16M个块;
文件系统只能有非常有限的65535个inode。
还有一些令人讨厌的限制:
文件只能有一个正在写入的进程,这会导致并发性受限;
目录查找是线性扫描,因此对于大型目录(超过320个条目),速度变得非常慢;
没有强制文件锁定系统。但存在几种用于咨询式文件锁定的系统。
还有一些特殊情况:
在 Unix V7 系统中,没有 delete() 系统调用,而是 unlink() 系统调用,它可以删除一个文件的名字,并且那些没有任何文件名和打开文件句柄的文件会被自动清理。这会导致一些不符合预期的结果,例如,只有当一个完全没有文件名的文件被完全关闭时,它占用的磁盘空间才会被释放。许多 Unix 系统管理员都曾经问过他们的磁盘空间去哪了,当他们删除了 /var/log 目录下的日志文件,却忘记了有一些进程还在使用它;
最初没有 mkdir() 和 rmdir() 系统调用,这导致了存在可被利用的竞态条件。竞态条件是指在多线程或多进程环境中,由于操作的顺序和时机不确定性,可能导致安全漏洞或错误行为的情况。这在 Unix 的后续版本中得到了修复;
有一些操作在特定条件下具有原子性(例如write(2)系统调用),或者经过修改后具有原子性(mknod(2)和mkdir(2))。
在结构上,inode表和块和inode的空闲映射位于文件系统的开头,磁盘空间也是从磁盘的前端线性分配的。这导致了频繁的寻址操作,并且可能导致文件系统的碎片化(即文件存储在非相邻的块中)。
遍历目录结构意味着从磁盘开头读取目录的inode,然后向后移动到更远的数据块,再从磁盘开头读取下一个路径名组成部分的下一个inode,并向后移动到相应的数据块。这个过程在每个路径名组成部分上来回进行,速度并不快。
在之后的发展中,minix文件系统忠实继承了PDP-11 V7 Unix文件系统,保留了它的特性包括局限。然而,随着时间的推移,在现代的Linux系统中,由于其不再具备实用性,它已经从内核源代码中移除。
在稍后的一篇文章中,我们将会了解到关于BSD快速文件系统,如何更好地布局磁盘上的数据,如何实现更长的文件名、更多的inode,以及如何通过考虑磁盘的物理特性来加快速度。
要解决目录查找时间线性增长、单个写入者或有限的文件元数据这些问题需要更新的文件系统。
翻译自:《50 years in filesystems》 由 KRISTIAN KÖHNTOPP 撰写。
如有帮助的话欢迎关注我们项目 Juicedata/JuiceFS 哟! (0ᴗ0✿)
@Scheduled实现定时任务最近需要做一些定时任务刷数据,本着快速简单的原则,选择使用SpringBoot内置的@Scheduled实现。实现起来很简单,步骤如下:创建定时任务@Component @Slf4j publicclassTestJob{ @Scheduled(fixedDelay=5000) publicvoidexecute(){ //设置日期格式 SimpleDateFormatdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss"); longstart=System.currentTimeMillis(); log.info("开始执行:"+df.format(newDate())); log.info("执行完成:"+df.format(newDate())); } } 复制需要在类上加@Component注解,对应的方法加上@Scheduled注解。然后需要在SpringBoot主类上加@EnableScheduling注解。@SpringBootApplicati
在PowerBI五周年之际,Excel催化剂也深耕PowerBI技术领域达3年之久,从2017年PowerBI两周年时的直播PowerBI技术分享至今,因着热爱PowerBI社区,从Excel催化剂的推出,就已经将Excel与PowerBI黑科技带进了插件中。 恰逢今年7月PowerBIDeskTop官方开放了外部工具的支持,Excel催化剂也紧跟其后,将Excel催化剂中的PowerBI功能部分,分离出一款独立的工具,推出了【PBI催化剂】。 经过近三周的迭代开发,【PBI催化剂】已经拥有非常丰富全面的功能,可以入选外部工具四大巨头行列中。何为PBI催化剂,怎样才能用上它?过往的PowerBIDeskTop,它是一个独立的软件,不像Excel那样可以有二次开发的接口,但7月份更新PowerBIDeskTop后,已经开放了外部工具,单独有一个外部工具的选项卡。所以,要能够用上外部工具的功能,必须要下载最新版的202007的PowerBIDeskTop,并且需要打开下图的预览功能。如果正常的安装,最好默认安装,会出现一个本机外部工具文件夹,如下:64位的路径:C:\ProgramFile
1、数据类型 string(字符串):最基本的k-v存储,适合验证码、配置信息等list(列表):适合有序/固定的列表。比如行政区、字典表、消息队列等。set(集合):支持交集、并集、差集等操作。可以用来找共同点等。hash(哈希):类似于唯一标识,value对应详情。适合存储文章内容、商品内容等详情。zset(有序集合):增强版本增加了一个score参数,用来排序,适合排行榜类的数据存储2、优点速度快。数据存储在内存中,查找和操作的时间复杂度都是O(1)。类似于HashMap多种数据类型,应用场景丰富支持事务特性、所有操作都是原子性支持数据的持久化,可以将数据保存在磁盘中支持主-从模式的数据库备份性能高。读取速度可达到110000次/s;写81000次/秒支持publish/subcribe、通知、key过期特性3、场景举例 3.1缓存热点数据字典表行政区用户登录信息配置信息3.2计数器点赞数浏览数3.3消息队列建议采用专门的消息中间件会更可靠。3.4最新列表最新文章列表上架新品列表3.5排行榜文章排名商品排名3.6分布式锁、单线程机制电商秒杀全局增量ID3.7时效信息存储验证码5分
一、单体架构1.什么是单体架构?单体架构也可叫单体系统或单体应用,是一种把系统所有的功能模块耦合在一个应用的架构方式。2.单体架构的优缺点有哪些?(1)优点部署简单;技术单一;用人成本相对低;项目管理相对较易;测试相对简单直观;应用开发相对简单;横向扩展容易。(2)缺点项目过于臃肿,bug难以迅速定位;资源无法隔离(某个功能模块对应的接口访问量大,直接会影响整体性能);无法灵活扩展;交付周期长(需求->设计->开发->测试->现场实施部署,就传统性质的企业而言);部署消耗时间长;可靠性差;受技术栈限制;可伸缩性差;复杂度高。3.单体架构的技术选型有哪些?从Java的角度看,有Spring全家桶一站式解决方案和相关的生态比较丰富(国外有GitHub,国内有Gitee,相应的开源框架非常多)。 从PHP的角度看,PHP是Web开发中最好的语言(至于为什么说它是Web开发中最好的语言,我想原因有三个,第一个是通吃方案(网站开发、App后端、小程序等);第二个许多国内外的网站建设都是基于PHP,早期的淘宝也是如此;第三个容易上手。)所有的技术选型都离不开一个基本的原则,
html属于的前端编程中一项,接口是必须要暴露的,起码基于现在的技术框架是无法避免的,因为只要是有关html的代码只需要在浏览器里面右键点击查看源代码所有的相关的html代码都会原封不动的展示出来,所以前端页面的很多样式特效只要有一家有新的变化出来,紧接着很快就会被抄袭拷贝了,样式和风格太容易拿来使用了,所以想在加密只能在数据接口上做做文章,现在web安全已经成为一个非常热点的问题,因为随着网页应用的普及化网页安全将会越来被重视。常见的web都有哪些安全隐患,为什么要重视web安全?SQL注入:这种危害性最大,直接违背设计者的初衷,注入篡改数据库操作,再严重点直接操纵数据库服务器,网站越大数据库被拖库的可能性越大,这是各大运营网站必须要面对的实际问题。在实际操作过程中对于用户的信息一定要管控,不要由着用户输入任何可能性对数据库产生危害的操作,不要使用动态拼接SQL,尽量不要返回异常信息给用户。XSS:跨站脚本攻击向web网页注入html脚本获取cookie为主,以js注入执行为主,导航到恶意网站或者注入木马,防护规则其实也很简单在js中,过滤掉关键字:JavaScript,cookie
总第109篇前言在开始学习具体的贝叶斯参数前,你可以先看看:朴素贝叶斯详解朴素贝叶斯一共有三种方法,分别是高斯朴素贝叶斯、多项式分布贝叶斯、伯努利朴素贝叶斯,在介绍不同方法的具体参数前,我们先看看这三种方法有什么区别。这三种分类方法其实就是对应三种不同的数据分布类型。高斯分布又叫正太分布,我们把一个随机变量X服从数学期望为μ、方差为σ^2的数据分布称为正太分布,当数学期望μ=0,方差σ=1时称为标准正态分布。正太分布概率图伯努利分布又称“零一分布”、“两点分布”(即结果要么是0要么是1),是二项分布的特殊情况,之所以是特殊的二项分布,是因为二项分布是多重伯努利实验的概率分布。举个例子就是,伯努利分布是只扔一次硬币正面反面的概率,而二项分布是扔多次硬币以后得到正面反面的概率。多项式分布(MultinomialDistribution)是二项式分布的推广,二项分布是随机结果值只有两个(投硬币的结果),多项式分布是指随机结果值有多个(摇骰子的结果)。多项式模型朴素贝叶斯和伯努利模型朴素贝叶斯常用在文本分类问题中,高斯分布的朴素贝叶斯主要用于连续变量中,且假设连续变量是服从正太分布的。高斯朴素
前言申明:本次测试仅为模拟环境测试,仅作为学习用处,请勿未授权进行渗透测试,切勿用于其它用途!距离发布上一篇文章,已经过了许久,迟迟没有更新,在写之前,先给观众老爷们道个复制歉。对得起,没关系23333333.对8起(>人<;)对不起 先放一下上篇文章地址 实战|利用无线渗透加内网渗透进行钓妹子(上篇) 记得上回说到了,已经成功的拿到了妹子的热点密码,并且成功连接上了。这次,就开复制始进一步的去深入了解下。 接下来开始上主菜!!!! 我把他分为三部曲!复制Part.1知己知彼套路曲用到的工具:netdiscover,ettercap,driftnet第一步:首先查看一下自己网络ip。第二步:开始发现周围存活主机。 可以看到133的应该就是对方电脑了,然后开始进行一个ARP欺骗.第三步:中间人攻击。ARP欺骗可以做到什么呢,可以嗅探到目标机器登录网站时的密码。(注:https抓不到)当时其实是抓到一个网址的,但是忘了截屏。进行了ARP欺骗只可以抓到密码吗,回答是NO!可以利用driftnet这款工具嗅探到,对面机器在看什么图片,如果看图片了就会嗅探到。这里首先进行了ARP欺骗然后开启d
1.背景 本文基于MySQLInnoDB源码对InnoDB中非锁定一致性读是如何实现的作一些简单的探究。 2.基本概念 2.1隐藏字段 在经典之作《高性能MySQL》的1.4节中提及了MySQL中MVCC的实现,原著中提及了 InnoDBimplementsMVCCbystoringwitheachrowtwoadditional,hiddenvaluesthatrecordwhentherowwascreatedandwhenitwasexpired(ordeleted).Ratherthanstoringtheactualtimesatwhichtheseeventsoccurred,therowstoresthesystemversionnumberatthetimeeacheventoccurred.Thisisanumberthatincrementseachtimeatransactionbegins.Eachtransactionkeepsitsownrecordofthecurrentsystemversion,asofthetimeitbegan.Eachquery
前言 之前写过2篇关于读写文件和二进制相关的文章 Bit,Byte,ASCII,Unicode,UTF,Base64和 ASP.NETCore–Byte,Stream,Directory,File基础, 不过是ASP.NETCore和C#的版本.今天想介绍用Browser和JavaScript实现的读写文件. 从前写的文章 Drag&DropandFileReader 发布于 2014-12-18(8年前...) WhatisBlob,ArrayBuffer,File? Blob相等于FileStream,而ArrayBuffer相等于MemoryStream.顾名思义一个是文件(IO)的流,另一个是缓存(RAM)的流. File继承了Blob,只是多了一些属性而已. InputFile&Drag&DropFile Browser是不可以直接访问用户的文件的.没权限,必须是用户在意识清楚的情况下提供给你. 有2个方式可以让用户提供文件. InputF
这个笔记系列主要记录了在BI项目中,如何搭建环境进行源代码管理以及文档管理。 用到的产品包括: TFSExpress Sharepoint VisualStudio SQLServer 配置Sharepoint2013支持文档版本管理笔记 http://www.cnblogs.com/aspnetx/p/4523468.html 搭建代码管理环境之服务端 http://www.cnblogs.com/aspnetx/p/4523707.html 搭建代码管理环境之客户端 http://www.cnblogs.com/aspnetx/p/4524926.html 搭建代码管理环境之云端 http://www.cnblogs.com/aspnetx/p/4525439.html 文档版本管理笔记 http://www.cnblogs.com/aspnetx/p/4529389.html 搭建代码管理环境之创建团队项目 http://www.cnblogs.com/aspnetx/p/4531775
最近写html页面的时候发现顶部边界margin-top用了定位之后,IE的跟其他浏览器不同,所以用到了把IE跟其他浏览器区分开来的写法 <!--[if!IE]> <divclass="clear-30"></div> 这样写是错误的 <![endif]-->复制 像上面的写法,是错误的。正确的写法应该是这样: <!--[if!IE]><--> <divclass="clear-30"></div> 这样写才是正确的 <![endif]-->复制 此功能应用于www.weixh.net顶部导航 人闲屁事多,麻烦又啰嗦 www.pishiduo.com
很早以前就做了一遍这题,当时好像啥都不会,今天重做一下。这个题题意简单地说就是输入k、p和一个图,求图大小为k的独立集个数modp。subset1.in n=24,m=19,k=8subset2.in n=40,m=55,k=11subset3.in n=100,m=99,k=32n比较小,直接状压dp即可,细节详见集训队论文(懒得写了),跑得飞快。#include<iostream> #include<stdio.h> #include<math.h> #include<string.h> #include<time.h> #include<stdlib.h> #include<string> #include<bitset> #include<vector> #include<set> #include<map> #include<queue> #include<algorithm> #includ
闲来无事,做一套CSP-J普及组的题找找状态( 基本都是贪心和模拟题,适合热手。 1探索未知 P8584探索未知-洛谷|计算机科学教育新生态(luogu.com.cn) 模拟一下分数相加相减就行,注意负数处理。 一个\(\frac{a}{b}\)分数化为最简分数时,只需要把分子分母同除以分子与分母的最大公约数即可。 即:\(\frac{a/gcd(a,b)}{b/gcd(a,b)}\) 两个分数之间通分则先求出分母之间的最小公倍数,然后这个公倍数就是新的分母,前一个的分子乘上公倍数除以前一个的分母,后一个的分子乘上公倍数除以后一个的分母,然后相加减。 即:\(\frac{a}{b}+\frac{c}{d}=\frac{a*\frac{lcm(b,d)}{b}+c*\frac{lcm(b,d)}{d}}{lcm(b,d)}\) 用flag记录当前的数的符号。 代码 #include<iostream> usingnamespacestd; longlonggcd(longlonga,longlongb) { if(a<b) gcd(b,a); returnb?gcd(
复制 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述Michael喜欢滑雪百这并不奇怪,因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长底滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子 12345161718196152425207142322218131211109一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在上面的例子中,一条可滑行的滑坡为24-17-16-1。当然25-24-23-...-3-2-1更长。事实上,这是最长的一条。 输入第一行表示有几组测试数据,输入的第二行表示区域的行数R和列数C(1<=R,C<=100)。下面是R行,每行有C个整数,代表高度h,0<=h<=10000。后面是下一组数据;输出输出最长区域的长度。样例输入 1 55 12345 161718196 152425207 14
1.判断读取文档有多少行数据(文档最后的空行不计入其中): 首先在变量定义区域下方和执行语句前声明在程序中要被调用的GetFileN函数: 1!声明子函数2IntegerGetFileN!获取文档行数3externalGetFileN 接下来在函数外部后边写上被调用函数完整代码:(之后就可以在主函数中调用这个子函数了) 1!---------------------------------------------------------------------------- 2!自定义函数Function区域-https://www.jianshu.com/p/535db588d8a5 3!调用自定义函数前要声明。 4!自定义函数调用后会返回一个数值。 5!---------------------------------------------------------------------------- 6!判断文档共有多少行https://zhidao.baidu.com/question/1896723711901726340.html 7Intege
链接:https://ac.nowcoder.com/acm/problem/21302来源:牛客网 题目描述 给你一个长度为50的数字串,问你有多少个子序列构成的数字可以被3整除答案对1e9+7取模 输入描述: 输入一个字符串,由数字构成,长度小于等于50复制 输出描述: 输出一个整数复制 示例1 输入 复制 132复制 输出 复制 3复制 示例2 输入 复制 9复制 输出 复制 1复制 #include<bits/stdc++.h> usingnamespacestd; #definelllonglong constintmod=1000000000+7; lldp[60][5]; intmain() { stringstr; cin>>str; intn=str.length(); for(inti=0;i<n;i++) { dp[i][(str[i]-'0')%3]=1; } for(inti=1;i<=n-1;i++) { if((str[i]-'0')%3==0) { dp[i][0]
逆天SQLServer2012装的不要不要的,最后发现。。。竟然没帮助文档。。。汗啊!原来它跟vs一样要自己装帮助文档。。。好吧,官网一下载,妹的。。。报错。。。然后就让我们还原这个安装过程以及逆天是怎么排错的吧。。。1、去官网上下载离线包(http://www.microsoft.com/zh-cn/download/details.aspx?id=347) 2、解压离线包--Unzip3、打开SQLServer2012选择管理帮助设置4、选择磁盘安装内容 5、选择刚才的解压路径并选择X.msha文件6、真的怎么简单呢?那要我何用?哈哈,邪恶的笑了~~~7、咱们来查看查看(明显是X.msha文件出现问题)8、下面我们打开看一看瞧一瞧~~ 9、再试试看 10、更新吧~~哦耶 11、最后一步(重点啊,不然你装好后还以为我骗你呢,哈哈)选择使用本地帮助(默认是在线帮助)12、查查看~【小窍门:要查什么,选中你要查的按F1】 转自:SQLServer2012手动安装帮助文档+排错-毒逆天-博客园 https://www.cnblo
项目需求: 单点登录,接口调用,分布式系统,退出时需要调用接口,通过token找到sessionId,但是没有session,需要寻找session,使session失效。 解决办法: 登录时,将token 和 sessionId放入redis中,key=token value=sessionId 退出时,通过token 获取sessionId,通过sessionId删除redis里的session,就可以使session失效 一:安装Redis,哨兵模式 192.168.1.1056379主master192.168.1.1086379备slave192.168.1.1086380备slave192.168.1.10526379哨兵192.168.1.10826379哨兵192.168.1.10826380哨兵 1.主redis.confdaemonizeyesbind192.168.1.105requirepass"123456"logfile"6379.log"dbfilename"dump-6379.rdb"dir"/var/redis/