C++读取文件内容

很多题都会要求读取txt作为输入。

头文件

fstream

打开文件

ifstream inputData("/cpp/input.txt");
    if (!inputData.is_open())
    {
        cout << "open failed" << endl;
    }

...
inputData.close();

读取一行的内容

string temp;
getline(inputData, temp);

分隔一行的内容(split)

char a[65];
strcpy(a, temp.c_str());//temp是string类型,需要转换成const char*
char *w = strtok(a, " ");//第一个参数char*,第二个参数是分隔符
char *h = strtok(NULL, " ");//第一次以后,第一个参数传NULL即可获取下一段字符串

//如果内容是数字,atoi(w)与atoi(h)可将char*转换成int

分布式计算(1)

网格计算,云计算与分布式计算的区别

网格计算强调资源共享,使用者同时也是资源共享者,用于计算集中性服务(不便扩展 )。云计算的服务提供者少数而集中,资源专有,便于自动化扩展(其中对等计算更便于扩展,即每个节点拥有对等的服务,可以互相使用数据),使用者无需贡献资源。

分布式计算指将大型任务划分成部分,分配给其他计算机,并将计算结果组合的解决方案,包括云计算与网格计算。而并行计算虽然类似,但并行的单位是处理器,执行并行计算的单位是单机。

CAP理论

Consistency(一致性):不同节点上的同一份数据在同一时间是否一致。

Availability(可用性):集群中一部分节点故障后(包括分区同步信息时),集群整体是否还能处理客户端的更新请求。

Partition tolerance(分区容忍性):是否允许数据分区,即不同区域间在一定时间内无法通信。

CAP理论认为三点至多只能满足两点,比如满足CA的关系型数据库无法做到数据分区并且及时响应( 如果分区,那么在分区同步信息时,系统无可用性,如果仍然提供服务,不同区域的服务器数据将不同),而满足CP的数据库在分区同步信息时无法提供服务,如果cp数据库没有多份数据,那么节点故障后即无法提供服务。对于AP数据库,由于数据同步时提供服务,必然会造成数据不一致。

IPC范型

ipc即interprocess communication,从上层到下层分别是RPC,socket API与data transmission。Remote Procedure Call或Remote method call是最高层次抽象,数据作为参数和返回值。下面的socket api允许应用程序使用名为socket的逻辑结构交换数据,每一方建立一个socket,待发送数据被写入socket,在另一端的应用从socket中提取数据。

最底层的IPC抽象层利用并行或串行机制传输二进制信息,对应OSI传输层及以下(socket本身处于传输层与应用层间)。

分布式计算范型

消息传递范型

A发送请求消息,B接收并应答,并可能继续触发A应答。

客户-服务器范型

服务器被动响应客户端请求。

peer to peer范型

每个节点责任相同,即充当服务器又作为客户端。

消息系统

消息系统充当独立进程的中介,进程间不耦合,而是通过消息系统异步交换信息。消息系统分为两种:point to point与发布-订阅模型。point to point即一个节点向另一个节点发送消息;发布订阅模式中每条消息都与事件有关,感兴趣的应用程序可以订阅事件,事件被触发时将可以收到消息,因此很适合用于广播和组播。

远程过程调用

A向B发送请求并携带参数,接收B的返回值。

分布式对象

和rpc类似,但存在远程对象,对象除了可以使用方法,还拥有自己的数据。

网络服务

服务请求者发送请求到目录服务器,目录服务器返回方法的引用,因此可以使用更多的远程方法。

移动代理

发送请求的主机发送一个代理,代理沿着路径传播,在路径上使用各种服务并最终返回到请求主机。

云服务模型

Iaas,Paas,Saas。

Infrastructure as a service,即提供虚拟化的基础硬件,如云服务器。

Platform as a service,即提供开发、计算平台的服务,如App Engine。

Software as a service,即提供软件作为服务,一般就是B/S模式。

计算机安全(1)

少量概念

CIA

即Confidentiality(保密性)、Integrity(完整性)、Availability(可用性)

TCSEC、ITSEC、CC

计算机安全的标准,按时间排序,TCSEC最先提出了TCB(可信计算基)与访问控制机制,ITSEC提出了CIA,CC即现行的信息技术安全评估通用准则。

符号

P:Plain Text,即明文。

C:Cipher Text,即密文。

E:Encrypt,即加密。C=E(P)

D:Decrypt,即解密。P=D(C)

一个密码系统必须满足P=D(E(P))

分类

经典密码

即对称加密,加密与解密的密钥相同或能相互推导。包括DES、AES等。

公开密钥算法

非对称加密,加密使用公开的Pulic Key,解密使用私有的Private Key。包括RSA等,支持实现数字签名。

密码分析

包括穷举、统计分析、数学分析。

安全性

仅一次一密能达到无条件安全,但只要解密成本大于信息价值,或解密时间超过信息有效期即达到安全目的。

经典密码

替换技术

将明文替换成密文,可以用单表或多表,也可以替换单个字符或连续字符。

多字母替代:playfair

双字母作为一个单元,遇到连续的字母需要添加分隔符X,如果字符串长度是奇数补一个Q,然后对照5x5的密码表(英文有26个字母,所以将i、j视为同一字母),同行的字母右移,同列的字母下移,其他字母取形成的矩形的另外两角。

如密钥为gojam(密钥不能有重复字母),可以制成如下密码表:

g o j a m

b c d e f

h k l n p

q r s t u

v w x y z

现在加密明文“HeEatApple”,首先添加分隔符X,变成“HeXEatApXple”,刚好可以分为六组HE XE AT AP XP LE。

HE对应BN。(我默认了左下角对应左上角,右上角对应右下角)

XE对应DY。

AT对应EY。

AP对应NM。

XP对应LZ。

LE对应DN。

因此密文为BNDYEYNMLZ。

解密过程与加密过程相反,聪明的你一定可以解出来。

多字母替代:Hill Cipher 希尔密码

基于矩阵的线性变换,将m个连续字符转为m个密文。密钥K是m*m的矩阵,在模26运算中可逆,即K*K^-1=I(mod 26)。

加密时m个连续明文作为行向量与密钥K相乘并mod26,解密时m个连续密文与K^-1相乘并mod26。

矩阵乘法

a行b列的a*b矩阵与b行c列的b*c矩阵相乘,最终得到的矩阵a行c列。(即第一个矩阵的宽应该与第二个矩阵的高相同,否则可能无法相乘)

得到的a*c矩阵中,用C[i,j]表示第i行第j列元素,用A[i,j]与B[i,j]表示前两个矩阵的第i行第j列元素,有以下关系:

C[i, j]=A[i, 0]*B[0, j]+A[i,1]*B[1,j]+A[i,2]*B[2,j]+...+A[i, b]*B[b, j]

例如C[0,0]=A[0,0]*B[0,0]+A[0,1]*B[1,0] +A[0,2]*B[2,0]+...+A[0,b]*B[b,0]

也就是第一个矩阵的第一行乘以第二个矩阵的第一列,第一个矩阵的第一行乘以第二个矩阵的第二列,依次这样。

代数余子式

对矩阵A中的元素A(i,j),将第i行与第j列从矩阵A中移去,余下的部分作为行列式的值再乘以(-1)^(i+j)得到的数叫A[i,j]的代数余子式。

以A=[[3,2],[1,1]]作为例子,A(0,0)的代数余子式为1*(-1)^(0+0)即1。同理A(0,1)=-1,A(1,0)=-2,A(1,1)=3。

伴随矩阵

像上面由各个位置的代数余子式构成的矩阵被称为伴随矩阵,A的伴随矩阵A*=[[1,-1],[-2,3]]。

求逆矩阵

逆矩阵A^-1=A*/|A|,其中|A|代表A的行列式,等于3*1-2*1=1。

A*是转置后的伴随矩阵,因此A*=[[1,-2],[-1,3]]。

因此逆矩阵A^-1=[[1,-2],[-1,3]]。验证A乘以A^-1=[[1,0],[0,1]],即单位矩阵(对角线全是1,其余部分全是0)。

加密/解密

以上2*2矩阵作为例子,如明文为XD,即[23,3](26字母从0开始,25结束),乘以A等于[23*3+3*1,23*2+3*1]=[72,49],然后mod26=[20,23],即UX。

解密时[20,23]乘以A^-1,等于[20*1-23,20*(-2)+23*3]=[-3,29],mod26后等于[23,3]。

这种加密方式能够防止只有密文的统计学攻击,因为密钥矩阵本身包含了信息,不同频率的字符被分散到了不同密文。但如果有很多明文-密码对,或者攻击者可以获取各种明文的密码,那么密钥K很容易被计算出来。

置换技术

传统密码的两个要点,即替换与置换,交换位置能更好地保密信息。

QQ互联的注意事项

业务逻辑

最近试了一下用QQ登陆联系原有的账户体系,由于用了LeanCloud提供的后台服务,我只用关心QQ互联的部分。

首先,它的业务逻辑是:你先设置一个按钮,要跳转到QQ登陆页面,登陆完成后跳转到回调页面。回调页面即可以是用户主页也可以是一个中间页面用于跳转。

在PC上,曾经常见的模式是弹出QQ登陆小窗,登陆后原页面收到登陆成功的回调更新登陆状态。

但以上的方式如果在移动端使用,由于没有回调地址,唤起QQ登陆后无法跳转到用户界面,并且原页面也不会收到回调。

所以现在有一个模式,就是点击QQ登陆后原页面直接跳转到QQ登陆页面,登陆成功后回调地址收到accessToken与openId,之后再处理业务逻辑。

OAuth 2.0

A->B->C->D->E
先获取Code,然后再获得Token,重定向URI必须保持一致

现在你可以用他们的API来实现以上功能,比如QQ互联提供了QQ登陆地址的格式,通过Authorization获取AccessToken,通过AccessToken获取openId的接口,以及getUserInfo等api的接口。但我尝试后发现这些api没有设置跨域头,如果直接在前端获取会被浏览器拦截,因此我选择用他们的PHP SDK。

PHP SDK

SDK使用虽然很方便,但还是没有设置跨域头,你需要在页面输出前设置Access-Allow-Control-Origin。还没完,PHP SDK使用了session,不能像官方的获取用户信息的api一样直接请求,你还需要设置Access-Alllow-Control-Credentials,在前端请求时如果用AXIOS,也要加上withCredentials的配置。

由于我习惯把不涉及安全业务逻辑放到前端,所以我在callback.php里将AccessToken与OpenId传给前端的Login组件,由前端请求后判断是否是新用户等等。(也由于使用了LeanCloud,php并不能直接查数据库,所以干脆放在前端)

JS SDK

QQ互联我花了不少时间,主要是理解它的业务逻辑,还有跨域的问题。我开始用的是JS SDK,但似乎它已年久失修(12年更新过),而且它要求用script标签引入,我在前端还要检查SDK对象是否已加载完成,让我的代码很混乱,加上还是要后端协助解决跨域,所以还是不用了。

PHP&CURL 小插曲

其实还有一个小插曲,PHP SDK需要curl,但我安装的php 7.3 似乎并编译不上,而且php7.2-curl都是有的,但php7.3-curl还没有。。。只好换成7.2。

计算机网络笔记(6)

基本数据链路层协议

协议1:一个乌托邦式的单工协议

单工协议即数据只能单向传输。这个协议假设信道永远不会丢失或损坏帧,接收方的处理能力足够快,缓冲区足够大。

发送程序无限循环,接受程序响应事件,协议1中不包含流量控制和纠错功能。

协议2:无错信道上的单工停-等式协议

发送方的速度如果过快,接收方会被淹没,除了增强接收方的处理能力,可以让接收方给发送方发送反馈,发送方收到后才可以发送下一帧。

发送程序无限循环并等待接收方确认,接受程序响应事件后发送确认帧。

协议3:有错信道上的单工停-等式协议

有错信道上传输数据需要增加校验,接收方仅在数据正确时发送确认帧。但在确认帧丢失的情况下(超时),发送方将重发。接收方难以判断帧是重发还是新发,因此帧前加上序号以区分。

重复的帧也会收到确认帧,以便发送方决策。

Java: No enclosing instance of type xxx is accessible

public class KMeans {
	class point{
		double x;
		double y;
		point(double x,double y){
			this.x=x;
			this.y=y;
		}
	}
	public static void main(String args[]) throws IOException {
		point p=new point(1,1);
	}
}

上面这段代码会遇到No enclosing instance of type xxx is accessible(xxx类型的装入实例不可用)报错,原因在于编译运行KMeans类的时候,并没有产生实例(你看main也是静态方法);而KMeans下包含的point内部类是非静态的,只有实例对象才能使用它。外部类是直接被加载到内存了,而内部非静态类就需要一个实例对象来包含它。

知道了这一点,就可以得出结局方案,可以把point改为静态类,也可以新建KMeans实例后再使用point类。

我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=1q1xzkj9mydbq