-
操作系统-PA0
教程 git可视化教程: https://onlywei.github.io/explain-git-with-d3/ C语言教程: https://akaedu.github.io/book/ https://www.romsgames.net/nintendo-rom-mario-bros/
-
编译器-PL0语法分析
本文主要按照笔者逻辑思考的顺序进行语法分析部分的说明。如有不明白的部分请见谅。(完整代码在文章最后,时间紧张可直接跳到文章末尾 ❤️) Parser 主要框架搭建 在拿到词法分析部分的一个又一个的 Token 时,庞大的语法分析让我无法下手,我不知道如何利用这些 Token,也不知道将 PL/0 语言用上下文无关文法描述出来有什么用,但这并不妨碍我们先将上下文无关文法写出来(看懂)😎 上下文无关文法 上下文无关文法描述的 PL/0 语言: Program → Block . Block → [ConstDecl][VarDecl][ProcDecl] Stmt 程序块的基本结构是:常量定义、变量定义、过程定义、语句 ConstDecl → const ConstDef {, ConstDef} ; 常量定义 ConstDef → ident = number VarDecl → var ident {, ident} ; 变量定义 ProcDecl → procedure ident ; Block...
-
计算机网络-Wireshark探索Ethernet
Capture a Trace 首先用电脑终端试了一下 ping 命令,获取到远程主机返回的消息。 之后启动 Wireshark 进行相关的设置。并再次进行 ping 操作,发现 Wireshark 捕获到了一些数据。 Inspect the Trace 首先点击一行数据,查看相关的各层次的数据。 Ethernet II 说明是 DIX Ethernet 而不是 IEEE 802.3。 没有发现前导码,开头就是目的地址,然后接着源地址,分析地址我们可以得到,一个地址由 12 个 16 进制数组成,所以对应 48 位,也就是 6 字节,所以该地址为 MAC 地址。之后跟着的 Type 字段说明该链路层的上层协议为 IP 协议且是 IPv4。 因为帧长超过了 64 所以没有 Pad 填充,而且在最后也没有发现校验和字段。 单位:byte 目的地址 源地址 Type...
-
计算机网络-Wireshark探索802.11
Fetch a Trace 直接捕获无线局域网的流量有两个难题,一是有些系统(windows)不支持直接收集 802.11 frames,而第二个问题就是需要两台电脑互相发送流量。基于上述两点,推荐直接使用现成的数据包。 Inspecet the Trace 首先整体看看全部的数据帧,从 info 栏中我们可以看到 802.11 frame 有不同的类型,Beacon,Data,Ack,分别对应管理帧、数据帧和控制帧三种帧的类型。 下面重点研究数据帧。 根据 802.11,我们可以知道,这是一个无线局域网里的数据帧,而且最下面也标记了帧的字节数为 1539。 该字段记录了帧长、帧数以及一些时间信息。 Radiotap 包括头部以及 body 记录了物理层的相关参数,包括信号长度、调制信息等。 然后是 IEEE 802.11 Data,它是 802.11 中的数据帧,共占据 24 字节。 最后是最大的数据,占据了 1478 字节。 然后我们详细的分析 IEEE 802.11 Data 部分 Frame Control Version: IEEE 802.11 标准版本。 Type: Data frame Subtype:...
-
计算机网络-利用Socket进行网络通信
以下的通信无论是利用 UDP Socket 还是 TCP Socket 都是从客户端获取一串字符串,然后在服务端全部转为大写,之后返回客户端。 TCP Client from socket import * server_name = "10.27.138.11" server_port = 12000 client_socket = socket(AF_INET, SOCK_STREAM) client_socket.connect((server_name, server_port)) sentence = input("input lowercase sentence:") client_socket.send(sentence.encode()) modified_sentence = client_socket.recv(1024) print(modified_sentence.decode()) client_socket.close() UDP Client from socket import * server_name = "10.27.138.11" server_port = 12000 clientSocket =...
-
计算机网络-使用Socket完成一个简易Web服务器
实验内容 在本实验中,您将学习 Python 中 TCP 连接的套接字编程的基础知识:如何创建套接字,将其绑定到特定的地址和端口,以及发送和接收 HTTP 数据包。您还将学习一些 HTTP 首部格式的基础知识。 您将开发一个处理一个 HTTP 请求的 Web 服务器。您的 Web 服务器应该接受并解析 HTTP 请求,然后从服务器的文件系统获取所请求的文件,创建一个由响应文件组成的 HTTP 响应消息,前面是首部行,然后将响应直接发送给客户端。如果请求的文件不存在于服务器中,则服务器应该向客户端发送“404 Not Found”差错报文。 代码 在文件下面你会找到 Web 服务器的代码框架。您需要填写这个代码。而且需要在标有# Fill in start 和 # Fill in end的地方填写代码。另外,每个地方都可能需要不止一行代码。 运行服务器 将 HTML 文件(例如 HelloWorld.html)放在服务器所在的目录中。运行服务器程序。确认运行服务器的主机的 IP 地址(例如 128.238.251.26)。从另一个主机,打开浏览器并提供相应的 URL。例如: http://128.238.251.26:6789/HelloWorld.html “HelloWorld.html”是您放在服务器目录中的文件。还要注意使用冒号后的端口号。您需要使用服务器代码中使用的端口号来替换此端口号。在上面的例子中,我们使用了端口号 6789. 浏览器应该显示 HelloWorld.html 的内容。如果省略“:6789”,浏览器将使用默认端口...
-
电脑配置-MacBook
关闭和开启 SIP 关闭 SIP M 系列芯片关机后,长按电源键直到进入恢复模式,在终端中输入csrutil disable 开启 SIP 进入恢复页面,实用工具里选择启动安全性实用工具,选前两个安全性选项都能打开 翻译配置 《柯林斯双解》for macOS 苹果电脑用得好,英语学习没烦恼(视频) 显示器问题 one-key-hidpi 开发环境配置 Vscode C/C++ Mac 用 Visual Studio Code 编写 C/C++ Mac 在vs code中使用vim,长按j无法一直向下移动,解决办法:defaults write -g ApplePressAndHoldEnabled -bool false,禁用长按重音字符 配置文章:https://zhuanlan.zhihu.com/p/711413895 Docker 中使用 Ubuntu 安装 Docker 官方网站:https://www.docker.com 下载 Ubuntu 镜像 可在 https://hub.docker.com/_/ubuntu 找到相应镜像,以及安装命令。 // 下载镜像 docker...
-
操作系统-从零开始编写
教程:https://github.com/ruiers/os-tutorial-cn 01-引导扇区 02-引导打印 mov ah, 0x0e ; 设置功能号为 0x0E,TTY 模式输出字符 mov al, 'H' ; 将字符 'H' 的 ASCII 码加载到 AL 寄存器 int 0x10 ; 调用 BIOS 中断 0x10,显示字符 mov al, 'e' int 0x10 mov al, 'l' int 0x10 int 0x10 ; 'l' is still on al, remember? mov al, 'o'...
-
Docker-安装完整Ubuntu
在 Docker 里的 Ubuntu 使用 man 命令时,总是提示: This system has been minimized by removing packages and content that are not required on a system that users do not log into. To restore this content, including manpages, you can run the 'unminimize' command. You will still need to ensure the 'man-db'...
-
OpenCV-制作视频红蓝3D效果
这个代码生成的视频,透过红色镜片会看到蓝色部分发黑,导致观感不好。 import cv2 import numpy as np # 输入和输出视频文件路径 input_video_path = 'input_video.mp4' output_video_path = 'output_video.mp4' # 打开输入视频 cap = cv2.VideoCapture(input_video_path) # 获取视频属性 frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) fps = int(cap.get(cv2.CAP_PROP_FPS)) frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) # 设置输出视频编码和属性(MJPG 编解码器) fourcc = cv2.VideoWriter_fourcc(*'MJPG') # 更改为 MJPEG 编解码器 frame_width_out = frame_width - 10 #...