Miscellaneous
Here are some useful courses and learning materials.
HPC
MIT 6.172 Performance Engineering of Software Systems, Fall 2018
UCB CS267 Spring 2023 - Application of Parallel Computers
CS121-Parallel Computing
Machine Learning
国立台湾大学 李宏毅 机器学习
Deep Learning Systems Course
Book - 机器学习中的概率统计
Machine Learning System
CMU 10-414/714: Deep Learning Systems
Machine Learning Compilation
Compiler & Program Analysis
Cornell CS 4120 Introduction of Compilers
Cornell CS 6120: Advanced Compilers: The Self-Guid ...
ElasticSearch 本地环境搭建
准备环境
如果 docker 容器没有 vi 命令,可以自行安装:
docker exec -it --user="root" es /bin/bashapt updateapt install
因为需要部署 kibana 容器,让 es和 kibana 容器互联,所以需要创建网络。
docker network create es-net
以安装 Elasticsearch 8.11.4 版本为例:
docker pull elasticsearch:8.11。4
接下来创建挂载点目录:
mkdir -p ~/apps/es/data ~/apps/es/config ~/apps/es/pluginschmod 777 ~/apps/es/datachmod 777 ~/apps/es/configchmod 777 ~/apps/es/plugins
部署单点es,创建es容器
执行以下命令:
docker run -d \--restart=always \--name es \--network es-net \-p 9200:9200 \-p 9300:9300 \- ...
Encoding of immediate values on AARCH64
AArch64 is an ISA with a fixed instruction width of 32-bit. This obviously means there is not enough space to store a 64-bit immediate in a single instruction. Before working with AArch64 I was only familiar with x86 where this is a bit easier since instructions can have variable-width. A 64-bit immediate on x86-64 is really just the sequence of bytes:
mov rax, 0x1122334455667788# encoded as: 0x48, 0xB8, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11
A fixed-width ISA like ARM has to treat immed ...
支配树
支配结点
每个控制流图都一定有一个没有前驱的起始结点 ,这个结点是程序(或子程序)执行的假设开始点。
如果从 到结点 的所有有向边路径都经过结点 ,那么结点 是结点 的支配结点(或必经结点), 支配 记作 。每一个结点都是自己的支配(必经)结点。
支配关系定理
在下文的引理中,默认 。 有向图的起点,亦是其所有结点的支配点;
定理 1:支配关系是自反的,反对称的,传递的。
自反性:显然,任意一个结点都是其自身的支配点。
传递性: 经过 的路径必定经过 ,经过 的路径必定经过 ,因此经过 的路径必定经过 ,即 。
反对称性: 假设 ,则任意一个到达 的路径都已经到达过 ,同时任意一个到达 的路径都已经到达过 ,矛盾。
定理 2: 在连通图中,若 , 且 ,则有 或 。
证明: 考虑一条 的路径,若 , 不存在支配关系,则一定存在一条不经过 的从 到 的路径,即存在一条 的路径,与 矛盾。
直接支配结点
我们将任意一个结点 的所有支配结点中,除自身外与自己距离最近的结点 称作 的直接支配点或直接必经结点(immediate dominator ...
What is runtime?
作者:doodlewind
链接:https://www.zhihu.com/question/20607178/answer/2133648600
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
实际上编程语境中的 runtime 至少有三个含义,这几个含义分别可以这样概括:
指「程序运行的时候」,即程序生命周期中的一个阶段。例句:「Rust 比 C 更容易将错误发现在编译时而非运行时。」
指「运行时库」,即 glibc 这类原生语言的标准库。例句:「C 程序的 malloc 函数实现需要由运行时提供。」
指「运行时系统」,即某门语言的宿主环境。例句:「Node.js 是一个 JavaScript 的运行时。」
下面简单介绍一下个人的理解。
含义一:程序生命周期中的阶段
一个程序从写好代码字符串(起点)到跑完退出(终点),有一整套标准化的生命周期(流程),可以被拆分为多个阶段。这其中编译阶段是 compile time,链接阶段是 link time,那运行起来的阶段自然就是 run time 了。如果在前面的阶段预先做了通常在后面才方便做的 ...
MacOS管理JDK环境简明教程
如果同时安装了 adoptopenjdk 11 和 adoptopenjdk 8,同时希望 8 做为默认 JDK,只需要把 /Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Info.plist里的JVMVersion的值由1.8.0_222改为 x1.8.0_222(大概第42行)。这样 MacOS 默认 JDK 就成为 adoptopenjdk-8 了。
查看 JDK 相关信息
macOS下 JDK 默认安装在 /Library/Java/JavaVirtualMachines目录下,同时提供了一个小工具/usr/libexec/java_home 帮助我们快速的查看 JDK 相关的信息。
默认情况下 MacOS 会自动选择 /Library/Java/JavaVirtualMachines目录下版本号最高的 JDK 做为默认 JDK 。
查看当前 JDK 版本
➜ ~ java -versionopenjdk 11.0.15 2022-04-19 LTSOpenJDK Runtime Environme ...
Blowing up unordered_map, and how to stop getting hacked on it
repost from https://codeforces.com/blog/entry/62393.
Blowing up unordered_map
C++ has always had the convenient data structures std::set and std::map, which are tree data structures whose operations take time. With C++11, we finally received a hash set and hash map in std::unordered_set and std::unordered_map. Unfortunately, I've seen a lot of people on Codeforces get hacked or fail system tests when using these. In this post I'll explain how it's possible to break these data structures and w ...
SSH端口转发教程
本文主要介绍什么是 SSH 隧道以及如何使用 SSH 隧道实现端口转发,包括 SSH 隧道加密数据传输以及绕过防火墙。
1. 什么是 SSH 隧道
SSH 隧道是 SSH 中的一种机制,它能够将其他 TCP 端口的网络数据通过 SSH 连接来转发,并且自动提供了相应的加密及解密服务。因为 SSH 为其他 TCP 链接提供了一个安全的通道来进行传输,因此这一过程也被叫做“隧道”(tunneling)。
SSH 隧道也可以叫做端口转发
SSH 隧道能够提供两大功能:
加密 SSH Client 端至 SSH Server 端之间的通讯数据。
突破防火墙的限制完成一些之前无法建立的 TCP 连接。
本地转发和远程转发
SSH 端口转发自然需要 SSH 连接,而 SSH 连接是有方向的,从 SSH Client 到 SSH Server 。而我们的应用也是有方向的,比如需要连接 MySQL Server 时,MySQL Server 自然就是 Server 端,我们应用连接的方向也是从应用的 Client 端连接到应用的 Server 端。如果这两个连接的方向一致,那我们就说它是本地 ...
Hadoop集群搭建详细教程
服务器存储环境准备
服务器硬件规格如下
服务器rios-cad2:7T空硬盘*1
服务器rios-cad6-121:7TB空硬盘*1。
服务器rios-cad6-122:7TB空硬盘*1。
首先需要对空硬盘进行分区、格式化文件系统、挂载。
分区
先介绍两种分区表:
MBR分区表:(MBR含义:主引导记录)
所支持的最大卷:2TB
对分区的设限:最多4个主分区或3个主分区加一个扩展分区
GPT分区表:(GPT含义:GUID分区表)
支持最大卷:18EB(1EB=1024TB)
每个磁盘最多支持128个分区
因此,当磁盘超过2TB时,我们要么将磁盘分为多个MBR分区,否则需要使用GBT分区。
Linux传统的分区工具fdisk不支持GPT分区,但可以使用另一个工具parted来对GPT磁盘操作。parted功能很强大,既可用命令行也可以用于交互式。注意:parted只可以对没有做过任何分区的空盘做分区。
这里我们只对硬盘(编号/dev/sda)分1个分区,因此我们使用parted工具来实现GPT分区。
$ sudo parted /dev/sdaNU Parted 3.1U ...
Linux动态链接中的GOT和PLT
本文主要讨论什么是延迟加载?什么是PLT与GOT表?PLT表与GOT表到底建立跳转关系的?延迟加载有好处与弊端?
GOT和PLT是什么
PLT:Procedure Link Table,程序链接表。
GOT:Global Offset Table,全局偏移表。
这两个表相互配合解决外部函数符号地址,解决运行时重定位的问题。这种方法能让函数在调用时才确定地址,进程的启动时间加快,只需一次绑定,也称为延迟绑定,接下来通过例子示意。
代码示意与分析
#include <stdio.h>void testprintf(){ printf("hello\n");}int main(){ char acTemp[100] = {0}; printf("begin\n"); testprintf(); return 0;}
上面是一段非常简单的C程序,就调一个printf函数,一个自定义的testprintf函数。其中我们知道printf是libc.so里面的函数,在默认情况下,gl ...