面试角度的前端学习路线

1.CSS两栏、三栏布局

我知道是columns属性,不过试验了一下没有生效。郁闷😒。为什么MDN的例子是正常的,我自己写一个p标签加上columns属性不生效呢?

两个元素对比
效果对比

很玄学吧,前端就是玄学,遇到这种问题真没啥好说的,只能慢慢排查,可能是浏览器,也可能是代码字符的问题。

但是最后的结果让我惊呆了。原来是我输入的字符串没有空格,导致排版时被当作一个单词处理,因而无法形成分栏。那么我是否可以结合word-break属性(break-all:单词断行和break-word:一行显示不下才断行,否则换行)呢?可以,并且在这里是一样的。

2.CSS水平垂直居中

这个方法比较多。

方法一(推荐):使用单行flex布局,设定justify-content(x轴)与align-items(y轴)等于center

方法二:使用百分比定位,calc(50% + 固定值)使元素居中。

方法三:margin:0 auto实现水平居中,再利用定位垂直居中

关于内存和空间的几件事

类型系统

大部分静态类型语言的类型在编译时检查,编译后的机器语言并没有类型概念,取而代之的是对某个内存地址的字节/字等操作。

初始化变量

一般来说,主动分配的在堆空间,全局与静态变量在堆空间。所以声明char c*='hello'同时占用了栈空间与堆空间。

栈、堆

机器语言层面只会操作内存地址与字,所以栈堆是库函数或者操作系统提供的一种抽象。

只声明结构体,会占用内存吗

描述信息会占用存储空间,但没有实例化不会占用内存空间。

高性能计算简要复习

1、概念

集群

PVP:Player VS Player PVP拥有多个高性能向量处理器,有向量寄存器和指令缓冲,不用高速缓存,共享内存。

SMP:对称多处理机,拥有多个完全相同处理器,共享内存,拥有高速缓存。

MPP:大规模并行处理机。有多个内存不共享的节点。

DSM:分布共享存储多处理机。虽然物理上独立,但逻辑上共享内存。

Cluster:每个节点拥有小于16个的处理器,由网络整合。(MPP和DSM用特别设计的网络,Cluster用普通网络)

Constellation:每个节点拥有大于等于16个处理器,由自定或普通网络整合。

存储模型

UMA:Uniform Memory Access,均匀存储访问模型。物理存储器被所有处理器共享(不位于处理器中),任意处理器访问任意内存单元时间相同,处理器可带高速缓存。

NUMA:非均匀存储访问模型。存储器分布在处理器中,因而访问不同存储空间时间不同,处理器可带高速缓存。

CC-NUMA:Coherent-Cache Not Uniform Memory Acess,高速缓存一致性非均匀存储访问模型。由多个SMP机器组成,基于目录保持高速缓存一致。实际上是DSM。由于高速缓存一致性,程序员无需特别分配数据。

COMA:Cache-Only Memory Access,全高速缓存存储访问,NUMA的特例,只有高速缓存组成的内存。

NORMA:No-Remote Memory Access,非远程存储访问模型。所有存储器私有,不支持远程访问存储器。

学科

HPC:高性能计算。并行计算、超级计算。

HPCC:高性能计算与通信。配合高速网络的使用。

Distribute Computing:分布式计算。比起性能更注重功能。

Cloud Computing:云计算。按需提供资源,使计算像电力一样提供。

2、SMP/MPP/Cluster比较

SMP使用共享变量(单地址空间),而MPP和Cluster依赖消息传递通信(多地址空间)。

SMP的访问模型是UMA,其他两者是NORMA。

SMP使用总线、交叉开关连接,其余两者用网络。

3、常用静态网络/动态网络/标准互联网

静态网络

节点度:节点最多连接几个节点。

对剖宽度:最少拆去多少条边能让网络只剩一半。

链路数:边数。

网络直径:任意两点之间最长距离(两点间如果有两个距离,距离短的才是距离)。

名称规模节点度网络直径对剖宽度对称链路数
线性阵列N2N-11/N-1
环形N2双向N/22N
二叉树N32(logN - 1)1N-1

动态网络

不懂这一块。w和f是什么意思啊。

总线系统:硬件复杂度n+w,每个处理器宽带wf/n到wf之间。

多级互联网络:w*n*(logk n),每个处理器宽带wf。

交叉开关:硬件复杂度w*n^2,每个处理器宽带wf。

标准互联网

HiPPI、SCI、Myrinet、Ethernet、Infiniband

(更多…)

Hashcat使用秘籍

hashcat   /Users/guo/Downloads/file/file3.txt  -a 3 -m 20  -O  -i --increment-max 6 --increment-min 6  -o /Users/guo/Downloads/file/f3.txt -1 '?l?d?u' '?1?1?1?1?1?1'  

-a 3 是掩码暴力破解模式

-m 20 salt.md5的格式

-i 规定长度

-1是用户自定义匹配模式 ldu包括了大小写字母和数字

?1?1... 是匹配模式,这里6位数都可能是大小写字母和数字

nodejs控制台传输、接收文件

我一边查官网文档一边写的,虽然有send方法,但不知道receive方法在哪,最终还是用emit。

ReceiveService.js

//功能:发送请求并接受文件、保存 
const io = require('socket.io-client');
socket = io('http://localhost:3000')
const fs = require('fs')

//绑定用户终端输入
const readline = require('readline');
const interface = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});
let count=0;

socket.on('recFile', function (data, filename) {
    count++;
    console.log('响应'+count, data)
    fs.writeFileSync('./Client/' + filename, data)
})
interface.on('line', function (input) {
    console.log('input',input)
    console.log('您请求了\'' + input + "\'文件。");

    socket.emit('fileReq', input)

})
interface.on('close', function () {
    console.log('程序已退出!')
})

FileServer.js

//功能:响应请求并发送文件
const fs = require('fs');


//建立web服务器
const app = require('http').createServer(handler)
app.listen(3000);
console.log(app)
const io = require('socket.io')(app)
function handler(req, res) {
    fs.readdir('./Server', function (err, files) {
        if (err) {
            console.log(err)
            res.end('err')
        }
        console.log(files)
        res.end('<meta charset="utf-8">你可以请求这些内容:' + files.toString())
    })
    //res.end('File Server')
}
let count=0;
io.on('connection', function (socket) {
    socket.on('fileReq', function (filename) {
        console.log(filename)
        fs.open('./Server/' + filename, 'r', function (err, fd) {
            if (err) {
                socket.emit('recFile', 'fail')
                return;
            } else {
                fs.stat('./Server/' + filename, function (err, stats) {
                    if (err) {
                        return;
                    }
                    console.log(stats.size)
                    let buf = new Buffer.alloc(stats.size);
                    fs.read(fd, buf, 0, buf.length, 0, function (err, bytes) {
                        console.log(fd)
                        count++;
                        console.log(count)
                        socket.emit('recFile', buf, filename);
                    })
                })

            }
        })

    })
})

Diffle-Hellman密钥交换

数学基础

计算离散对数很困难。

离散对数

素数n的本原根a满足,a的1次方到a的n-1次方 mod n结果不同并且对应1到n-1。(换句话说是1到p-1的置换序列)

对于y=a^x mod p,已知a、x、p计算y容易,但已知y、a、 p ,计算x困难,x被称为离散对数。

至于为什么困难,涉及到相应算法的时间复杂度。计算a的有限次方还行,但猜x的话,就需要遍历了。

算法

借助数学特性,现在我们公开y与a,也就是素数和它的本原根。

用户A随机选择一个秘密的Xa,作为x计算出Ya。用户B同理计算出Yb。

用户A通过计算Yb^Xa mod q产生密钥。用户B同理计算出密钥。

那么,这两个密钥是相同的。

为什么相同呢?毕竟Yb^Xa mod q=(a^Xb mod q)^Xa mod q,也就是a^(Xb*Xa)mod q。

上面的等式我试了一下成立,但还没有理解,先求个余数再乘n次方居然也可以保持结果相同,数学真有意思。

就这样,用户AB都自己随便凑了个数,得到了相同密钥,中间人监听也得不到有用信息。不过,如果中间人假冒A与B,同时拿两份密钥,DH算法一样可以被攻破。

对于踩Mbti捧大五人格的现象的评论

Low Low爆了 看了几篇批判Mbti的文章就开始胡言乱语。Mbti的科学性我没有发言权,但it works。即使测量会有不准确的情况,但分类的思想本身是没有问题的,只不过精度受限,准确度受限。我也发现Mbti不同时期测量结果可能不稳定,但大五人格也出现了不稳定的现象(仅针对我搜索到的16personalities和aspek网站测试题)。受限于条件无法给出统计学数据,但是踩Mbti捧大五人格的人,他们的行为很搞笑,说的话也可笑(可以自行去知乎搜索相关问题,我就不贴了)。我实在不懂,踩Mbti对他们有什么好处,即使是踩Mbti的文章,也不至于全盘否定,而踩Mbti的评论真是贻笑大方。

网络上一直有踩一个捧一个的现象,有的还用词激烈,这群人吃饱了没事干啊。