Golang
基础数据类型
引用类型是对底层数据结构的引用, 值类型是数据结构的副本。y := x ,如果 x 是一个引用类型,那么 y 将指向与 x 相同的内存地址。但是,如果 x 是一个值类型,那么 y 将获得一个 x 的副本,而不是 x 的地址。
值类型
整数
浮点数
布尔值
数组
结构体
字符串
引用类型
指针
切片
映射
通道
接口
结构体
结构体相当于面向对象中的Class,创建不进行new或者创建实例就不能进行使用,换句话说必须进行实例化后才可以使用。
使用未初始化的结构体变量这种情况下,p 被声明为一个 Person 类型的变量。即使没有显式初始化,Go 语言会自动将其字段设置为零值。你可以安全地访问这些字段。
12345678910package mainfunc main() { var p Person // 声明但未初始化,p 是一个零值初始化的结构体实例 fmt.Println(p.Name) // 输出空字符串 "" fmt.Println(p.Age) // 输出 0}
使用 new ...
浅谈操作系统引导过程
BISO
默认启动项(Boot Loader)数据:引导代码中存储EFI文件路径
无NVRAM,启动代码和分区表存储于磁盘0柱面0扇区(512字节)
UEFI
默认启动项(Boot Loader)数据:NVRAM中存储EFI文件路径
有NVRAM,启动代码存于NVRAM
分区表存储于磁盘最开始位置到1MB空间
启动项编辑工具efibootmgr
efibootmgr可用来修改NVRAM中的数据
执行此命令会打印出在BIOS设置的启动项:
123456789$ efibootmgr BootCurrent: 0000Timeout: 1 secondsBootOrder: 0000,0001,0002,0003,0004Boot0000* Arch Linux HD(1,GPT,c8f79300-07ea-4a02-8bc6-7cb19803be54,0x800,0xfa000)/\EFI\ARCHLINUX\GRUBX64.EFIBoot0001* Mac OS HD(1,GPT ...
OpenWrt
下载ImmortalWrt
Github:immortalwrt
ImmortalWrt官方固件
虚拟机
我这里是通过ProxmoxVE虚拟机进行安装的,于是选择 x86-64-generic-ext4-combined-efi.qcow2.gz 文件
选择固件时候会带有一些名词
EFI:这是 Extensible Firmware Interface 的缩写,是一种用于启动计算机的标准接口。EFI 固件通常用于 x86 架构的计算机,支持 UEFI 启动。
QCOW2:这是一种磁盘映像文件格式,通常用于虚拟机。它支持压缩和快照功能,适用于 QEMU 和 KVM 虚拟化平台。
VDI:这是 VirtualBox Disk Image 的缩写,是 Oracle VirtualBox 虚拟机的磁盘映像格式。
VHDX:这是 Virtual Hard Disk 的缩写,是 Microsoft Hyper-V 虚拟机的磁盘映像格式
VMDK:这是 Virtual Machine Disk 的缩写,是 VMware 虚拟机的磁盘映像格式。
导入ProxmoxVE虚拟机
将此qcow2硬盘 ...
NVM
简述
NVM (Node Version Manager) Node 版本管理器
参考:
Github:nvm
Akamai:Installing and Using NVM
安装
nvm 可工作在任何 POSIX-compliant shell (sh, dash, ksh, zsh, bash), 特别是以下平台: unix, macOS, and windows WSL(Windows Subsystem for Linux).
需提前安装curl/wget
install.sh二选一执行:
1curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
1wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
安装完成后的NVM一般情况下会安装在~/.nvm
执行完成后会提示重新打开Shell或执行重载shell环境的命令,建议重新打开Shell
Arch ...
MongoDB
初识
我们可以将MongoDB看作是一个非常强大的文件存储器,类似于一个巨大的文件夹,可以存储各种各样的文档。这些文档可以是JSON格式的,就像我们在编程中使用的数据结构,其中包含键值对、数组和嵌套的子文档。
MongoDB适用于需要存储大量非结构化数据并具备高度灵活性和可扩展性的应用场景。
MongoDB的用途非常广泛,下面列举几个常见的应用场景:
Web应用程序的数据存储:MongoDB非常适合存储Web应用程序中的数据。它可以存储用户信息、文章、评论、日志等等。由于MongoDB具有灵活的数据模型,可以轻松地修改和扩展数据结构,这对于快速迭代和开发新功能非常有帮助。
实时分析和日志处理:MongoDB支持高度可扩展的数据处理能力,可以用于实时数据分析和日志处理。它可以存储大量的日志数据,并且可以使用强大的查询和聚合功能,从中提取有用的信息和统计数据。
物联网(IoT)应用程序:随着物联网的发展,越来越多的设备生成大量的数据。MongoDB可以作为物联网应用程序的数据存储解决方案,存储设备传感器数据、监控数据、设备状态等信息,并支持快速查询和实时数据处理。
缓存数据存储:Mon ...
浅谈Node-Vue-ES6-调试-编译-前端原理
引入话题
我在使用Vue2开发一个前端项目,由于在代码中经常使用console.log()打印输出某些重要的参数,不过有一个地方忘记注释掉console.log(),此时浏览器正处于开发者模式,打印输出以下数据,这些数据是前端请求后端,我进行了console.log()打印。上线环境中这种console.log()打印肯定是要注释掉的,因为浏览器打印出来的同时后面会标明
运行方式
console.log()打印输出
如果将相关index.vue:159 处的代码在VSCode中注释掉就会出现VM1634 94736:177,这是因为 index.vue:159 处的代码已经注释掉了,浏览器中的此处源代码也会注释,我还以为会剩下编译打包后的静态代码
为了验证VM1634 94736:177是否为编译打包后的静态代码,我重新打包为H5的方式,使用Python自带的HTTP服务器重新部署了一个服务
再次运行到之前的console.log()
点进pages-admin-set_conf-index.720cbcbe.js,此文件其实是由源码src/pages/admin/set_ ...
密码学
RSA
RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。RSA公开密钥密码体制是一种使用不同的加密密钥与解密密钥,“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。
加密解密原理
选取素数p、q,乘积为n
欧拉公式ꚩ(n)=n-1,由此ꚩ(p)=p-1,ꚩ(q)=q-1,z=ꚩ(pq)=ꚩ(p)ꚩ(q)=(p-1)(q-1)
选取e【公钥】,在1~z的范围选取公钥参数e,且e满足大公约数ged(ꚩ(n-1),e)=1,此时整数e用做加密钥(注意:e的选取是很容易的,例如,所有大于p和q的素数都可用)
(e*d)mod z=1,算得d【私钥】
公开整数n和e,秘密保存d【私钥】(常用作签名)
加密c=m^e mod n
解密m=c^d mod n
以上的fuding字符通过分段后一定是小于n的无符号整数类型
常见问题解答
非对称密码算法适用于哪种场合?
答:非对称 ...
Django Rest Framework
前言
Django REST Framework(简称DRF)是一个用于构建Web API的强大框架,基于Django开发。它提供了许多工具和库,使得构建和管理Web API变得简单和高效。DRF结合了Django的强大特性和灵活性,使开发人员能够轻松地创建功能强大、安全和可扩展的API。
Django REST Framework(DRF)是基于Django框架构建的,并且依赖于Django的核心功能。DRF扩展了Django,提供了用于构建Web API的额外功能和工具。要使用Django REST Framework,需要首先安装和配置Django。DRF是作为Django的一个扩展包提供的,可以在Django项目中引入DRF,以便利用其提供的API构建功能和特性。
以下是一些Django REST Framework的主要特性:
序列化:DRF提供了一个强大的序列化系统,用于将数据库模型和其他数据类型转换为JSON、XML或其他格式的数据。它使得数据的转换和传输变得简单,并且可以轻松地处理数据验证和反序列化。
视图:DRF提供了一组视图类,用于处理API请求和生成响应。它支 ...
WebSocket协议
WebSocket
WebSocket 是一种在Web应用程序中实现全双工通信的协议,建立在HTTP协议之上。
初次接触 WebSocket 的人,都会问同样的问题:我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处?
答案很简单,因为 HTTP 协议有一个缺陷:通信只能由客户端发起。
举例来说,我们想了解今天的天气,只能是客户端向服务器发出请求,服务器返回查询结果。HTTP 协议做不到服务器主动向客户端推送信息。
这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。我们只能使用“轮询”:每隔一段时候,就发出一个询问,了解服务器有没有新的信息。最典型的场景就是聊天室。
轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开)。因此,工程师们一直在思考,有没有更好的方法。WebSocket 就是这样发明的。
WebSocket 协议在2008年诞生,2011年成为国际标准。所有浏览器都已经支持了。
参考:
W3Cschool:JavaScript WebSocket
How To Use WebSocket In Java ...










