0%

[TOC]

1.插入排序

场景

前端导出按钮点击,下载从后端返回的Excel文件

方案

  1. 后端返回的是二进制文件的话,Window.open(req.url?param=x)可以直接下载

这种方式的缺点是,不能针对后端返回情况做处理。

  1. 使用blob对象处理后端返回数据,如下:
    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
    this.$ajax({
    url:'reqUrl',
    method:'get', //post
    responseType: 'blob' //这里必须指明响应类型
    }).then(ret=>{
    if(ret.data.type == 'application/json'){
    //todo
    }else{
    let filename = ret.headers['content-disposition']
    .split(';')[1]
    .split('filename=')[1]
    .split('.xlsx')[0]
    //后端给的文件名可能带有中文,到前端会自动编码(URI),这里解码一下
    this.exportExcel(ret.data, decodeURI(filename))
    }
    })
    // 模仿自动下载
    exportExcel(blobData, filename) {
    const link = document.createElement('a')
    let blob = new Blob([blobData], {
    type:
    'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
    })
    link.style.display = 'none'
    link.href = URL.createObjectURL(blob)
    console.log(link.href)
    link.download = filename
    document.body.appendChild(link)
    link.click()
    document.body.removeChild(link)
    }

1.DNS

​ DNS (Domain Name System) 域名系统,是一个层次化、分散化的Internet连接资源命名系统。DNS维护着一个包含域名与对应资源例如IP地址的列表.

​ DNS最突出的功能是将易于记忆的域名(例如mozilla.org)翻译成为数字化的IP地址(例如151,106,5,172).这一从域名到IP地址的映射过程被成为DNS查询(DNS lookup),与之对应,DNS反向查询(rDNS)用来找到与IP地址对应的域名.

2.DNS解析过程

1.跨域问题

(1)同源策略[浏览器安全策略]

​ 所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源。同源策略限制localStorege、IndexDB和Cookies访问。参考MDN

(2)跨域

​ 协议、域名、端口任一不同则为跨域。跨域是浏览器行为,实际上请求已经到达服务器,只不过在返回的时候被浏览器限制了。

2.跨域问题解决方案

  • 代理转发

    例如使用 nginx 服务器代理

  • CORS

    可以使用 CORS 来允许跨源访问。CORS 是 HTTP 的一部分,它允许服务端来指定哪些主机可以从这个服务端加载资源。

1.数据类型

(1)七种基本数据类型 Boolean null 一个表明 null 值的特殊关键字 undefined 表示变量未定义时的属性 Number 整数或浮点数 BigInt 任意精度的整数,可以安全地存储和操作大整数 String Symbol 实例是唯一且不可改变的数据类型

(2)引用类型

阅读全文 »

1.切片引用问题

1
2
3
4
a := []int{1,2}
a = a[:1]
a[1] = 9
fmt.Println(a)

❌:panic: runtime error: index out of range [1] with length 1

2.图的表示

  • 邻接矩阵
  • 邻接表

3.make & new

  • make 的作用是初始化内置的数据结构,如map、slice、channel
  • new 的作用是根据传入的类型分配一片内存空间并返回指向这片内存空间的指针

通常使用make 初始化一以下三种基本类型:

1
2
3
slice := make([]int, 0, 100)
hash := make(map[int]bool, 10)
ch := make(chan int, 5)

与make 相比,new 的功能就很简单了,它只能接收一个类型作为参数然后返回一个指向该类型的指针:

1
2
3
4
5
i := new(int)

var v int
i := &v
以上两种对i的初始化方式等价,它们都会创建一个指向 int 零值的指针

4.GO并发编程

(1)runtime包

  • runtime.Gosched()

    让出CPU时间片,重新等待安排任务

  • runtime.Goexit()

    退出当前协程

  • runtime.GOMAXPROCS

​ Go运行时的调度器使用GOMAXPROCS参数来确定需要使用多少个OS线程来同时执行Go代码。默认值是机器上的CPU核心数。

(2)sync包

  • sync.WaitGroup 等待组,实现并发任务的同步

    方法 功能
    Add(delta int) 计数器+delta
    Done() 计数器-1
    Wait() 阻塞直到计数器变为0
  • sync.Once (进阶)只执行一次,加载配置

  • sync.Map 并发安全的map,开箱即用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    var m = sync.Map{}

    func main() {
    wg := sync.WaitGroup{}
    for i := 0; i < 20; i++ {
    wg.Add(1)
    go func(n int) {
    key := strconv.Itoa(n)
    m.Store(key, n)
    value, _ := m.Load(key)
    fmt.Printf("k=:%v,v:=%v\n", key, value)
    wg.Done()
    }(i)
    }
    wg.Wait()
    }
  • sync.Mutex 互斥锁

  • sync.RWMutex 读写互斥锁,读写锁非常适合读多写少的场景

    (3)select 多路复用

    (4)协程、进程、线程

思考什么时候把参数设置为T 和 *T?

  • 如果不想变量被函数或方法修改 -> T ,反之 *T
  • 如果变量是一个大的 struct 或者数组,考虑性能选择类型 *T,只创建指针
阅读全文 »

1.常用激活函数

  • Sigmoid 函数

\[ \sigma (x) = \frac{1}{1+e^{-x}} \]

  • 双曲正切函数 \[ tanhx =\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}} \]

  • ReLU函数(Rectified Linear Unit) \[ relu(x)=max(0,x) \]

阅读全文 »

问题

以手写数字识别为例,将一张图片中每个像素的浓度排成一排,形成一个在M维空间\((x_{1},x_{2},\cdots ,x_{M})\)的一个空间向量,将这个空间划分为 \(0\)\(9\)\(10\) 个区域,求给定图片落在这些空间的概率。

阅读全文 »