ufw

概览

参考
由于Linux原始的防火墙工具iptables过于繁琐,所以ubuntu默认提供了一个基于iptable之上的防火墙工具ufw。
ubuntu 系统默认已安装ufw。ubuntu 9.10默认的便是UFW防火墙,它已经支持界面操作了。在命令行运行ufw命令就可以看到提示的一系列可进行的操作。
注意,主机上某些服务需要外部对本机的访问,例如图床服务,必须使用ufw对外开放端口,以minio图床为例

1
2
sudo ufw allow 9090
sudo ufw allow 9000

1.安装

1
2
sudo apt-get install ufw
sudo ufw enable #启用ufw,代替iptables,默认

sudo apt-get install ufw

2.启用

sudo ufw enable
sudo ufw default deny
运行以上两条命令后,开启了防火墙,并在系统启动时自动开启。关闭所有外部对本机的访问,但本机访问外部正常。

apt-get install ufw
ufw enable
ufw default deny

阅读更多

teamspeak 教程

安装

下载地址
下载TS3 Client,WINDOWS对应的版本

一路安装就行了,安装路径自己选一个

安装完成后直接运行软件,出来一个协议需要同意

之后会要你登录一个账号,不用管,直接$X$掉

汉化

确保teamspeak没有启动,再进行汉化.
下载Chinese_Translation_zh-CN.ts3_translation
打开你的安装路径位置,将Chinese_Translation_zh-CN.ts3_translation放到文件目录下

使用TeamSpeak程序目录下的 package_inst.exe 来打开汉化包 Chinese_Translation_zh-CN.ts3_translation
安装


界面就变成中文力

连接

连接到ts.l4rk.cn,没有密码,昵称自己定

连接成功

设置

阅读更多

team speak搭建

汉化包
主要教程参考
按照教程就行,没什么问题.

唯一的困难在于环境不一样,我的ubuntu在虚拟机上,直接访问ip不行

ikuai上部署了ddns还有端口映射,所以可以将ts用到的端口映射到外网
三个9987,10011,30033三个必须映射,其他随意

端口 协议 使用说明 是否必须
9987 UDP 默认语音服务端口
10011 TCP ServerQuery raw 端口
10022 TCP ServerQuery SSH 端口(3.3.0 以上版本服务端)
10080 TCP WebQuery(HTTP)
10443 TCP WebQuery(HTTPS)
30033 TCP 文件传输端口(上传每个房间的头像这个端口就必须开)
41144 TCP TSDNS服务端口
阅读更多

scoop

参考

Scoop介绍

Scoop是一款适用于Windows平台的命令行软件(包)管理工具,这里是Github介绍页。简单来说,就是可以通过命令行工具(PowerShell、CMD等)实现软件(包)的安装管理等需求,通过简单的一行代码实现软件的下载、安装、卸载、更新等操作。其灵感来源于macOS的Homebrew,Mac用户可以去了解了解。

当然如果用过Linux系统,使用apt-get工具安装过软件,或者用过Python,知道pip工具用于管理Python各种依赖包,那么理解Scoop就比较容易,这些工具的设计理念与使用方法都非常类似。

Scoop一般用来管理绿色软件,即是一种通过解压压缩包即可就地使用的软件,对于比较专业软件(比如Office、Adobe等)支持不好
windows的包管理工具

设置PowerShell权限

为了让PowerShell可以执行脚本,首先需要设置PowerShell执行策略,通过输入以下命令Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser即可。(如果之前已开启,可忽略。)

安装Scoop

通过以下命令,可以将Scoop安装到默认目录(C:\Users\<username>\scoop):

1
Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh')
阅读更多

bazel

转载自
什么是Bazel—教程、实例和优势
作者:方石剑
链接:https://juejin.cn/post/7120840097863303199
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Bazel是一个开源的构建工具,由谷歌开发,用于自动化大规模软件的构建过程。Pinterest、Adobe、SpaceX、Nvidia和LinkedIn等公司都使用它。在本教程中,你将了解什么是Bazel,它如何工作,以及它的重要好处。你还会学到如何为你的monorepo项目生成Bazel构建。

你为什么要使用Bazel?

Bazel的工作原理与MakeMavenGradle等其他构建工具类似。然而,与其他工具不同的是,Bazel是为具有多语言依赖性的项目量身定做的。

例如,你可以有一个Rust或Go的服务器,一个flutter的移动客户端,和一个Angular的网络客户端。在这种情况下,如果你要手动编写自己的构建文件,以迎合每种语言的生态系统,这可能是一项艰巨的任务。幸运的是,Bazel为你完成了所有繁重的工作:

bazel tutorial, bazel build

Bazel最吸引人的特点之一是你可以轻松地将它与你的项目的CI/CD挂钩。这可以帮助你提高团队的生产力,因为你可以产生更可靠的构建,定期和严格地测试你的软件。因此,你也可以很容易地出货和发布更强大的构建。

然而,Bazel不仅仅是处理多语言的依赖关系。让我们来探讨一些使它如此强大的好处。

Bazel有哪些优点?

以下是使Bazel成为出色的构建工具的关键优势。

阅读更多

hw2

在屏幕上画出一个实心三角形.
相较于hw1,多了一些内容,需要好好看下框架.

判断$(x,y)$对应的pixel否在三角形内部.

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
static bool insideTriangle(int x, int y, const Vector3f* _v)

{
// TODO : Implement this function to check if the point (x, y) is inside the triangle represented by _v[0], _v[1], _v[2]
Vector2f vertex2p[3], vertex2vertex[3];
int i;
//储存顶点到测试点的向量
for (i = 0;i < 3;i++) {
vertex2p[i] << x - _v[i].x(), y - _v[i].y();
}
//储存顶点到顶点之间的向量
for (i = 0;i < 3;i++) {
vertex2vertex[i] << _v[(i + 1) % 3].x() - _v[i].x(), _v[(i + 1) % 3].y() - _v[i].y();
}
//计算叉乘法.
int result[3];
for (i = 0;i < 3;i++) {
result[i] = vertex2vertex[i].x()*vertex2p[i].y()
-vertex2vertex[i].y()*vertex2p[i].x();
}
if(result[0]>0 && result[1]>0 && result[2]>0){
return true;
}
else if(result[0]<0 && result[1]<0 && result[2]<0){
return true;
}
else{
return false;
}

}

先限定下founding box范围,提高效率

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
void rst::rasterizer::rasterize_triangle(const Triangle& t) {
auto v = t.toVector4();

// TODO : Find out the bounding box of current triangle.
// iterate through the pixel and find if the current pixel is inside the triangle
float xmin,ymin,xmax,ymax;
xmin=std::min(std::min(v[0].x(),v[1].x()),v[2].x());
ymin=std::min(std::min(v[0].y(),v[1].y()),v[2].y());
xmax=std::max(std::max(v[0].x(),v[1].x()),v[2].x());
ymax=std::max(std::max(v[0].y(),v[1].y()),v[2].y());
xmin=std::floor(xmin);
xmax=std::ceil(xmax);
ymin=std::floor(ymin);
ymax=std::ceil(ymax);

for(int x=xmin;x<=xmax;x++){
for(int y=ymin;y<=ymax;y++){
if(insideTriangle(x+0.5,y+0.5,t.v)){
// If so, use the following code to get the interpolated z value.
auto[alpha, beta, gamma] = computeBarycentric2D(x, y, t.v);
float w_reciprocal = 1.0/(alpha / v[0].w() + beta / v[1].w() + gamma / v[2].w());
float z_interpolated = alpha * v[0].z() / v[0].w() + beta * v[1].z() / v[1].w() + gamma * v[2].z() / v[2].w();
z_interpolated *= w_reciprocal;
// TODO : set the current pixel (use the set_pixel function) to the color of the triangle (use getColor function) if it should be painted.
if (z_interpolated<depth_buf[get_index(x,y)]){
set_pixel(Vector3f(x,y,z_interpolated),t.getColor());
depth_buf[get_index(x,y)]=z_interpolated;
}
}
}
}

阅读更多

hw1

总的来说,hw1是比较简单的.
本次作业的任务是填写一个旋转矩阵和一个透视投影矩阵,只要记得上课时候给的公式,写进去就行.

  • 旋转矩阵
    注意,cos,sin等,需要的参数为弧度制(rad),而不是角度制
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Eigen::Matrix4f get_model_matrix(float rotation_angle) {
    Eigen::Matrix4f model = Eigen::Matrix4f::Identity();

    // TODO: Implement this function
    // Create the model matrix for rotating the triangle around the Z axis.
    // Then return it.
    rotation_angle = rotation_angle / 180 * MY_PI;
    Eigen::Matrix4f rotate;
    rotate << cos(rotation_angle), -sin(rotation_angle), 0, 0,
    sin(rotation_angle), cos(rotation_angle), 0, 0, 0, 0, 1, 0, 0, 0, 0, 1;
    model = rotate * model;
    return model;
    }

先进行挤压,再进行正交投影得到结果

  • persp2ortho

    • 透视投影到正交投影的变化矩阵
  • ortho

    • 正交矩阵
      projection = ortho * persp2ortho * projection;
      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
      Eigen::Matrix4f get_projection_matrix(float eye_fov,
      float aspect_ratio,
      float zNear,
      float zFar) {
      // Students will implement this function

      Eigen::Matrix4f projection = Eigen::Matrix4f::Identity();

      // TODO: Implement this function
      // Create the projection matrix for the given parameters.
      // Then return it.
      Eigen::Matrix4f persp2ortho = Eigen::Matrix4f::Identity();
      Eigen::Matrix4f ortho = Eigen::Matrix4f::Identity();

      float top = abs(zNear) * tan(eye_fov / 2 / 180 * MY_PI);
      float bottom = -top;
      float right = top * aspect_ratio;
      float left = -right;

      persp2ortho << zNear, 0, 0, 0, 0, zNear, 0, 0, 0, 0, zNear + zFar,
      -zNear * zFar, 0, 0, 1, 0;

      ortho << 2 / (right - left), 0, 0, -(right + left) / (right - left), 0,
      2 / (top - bottom), 0, -(top + bottom) / (top - bottom), 0, 0,
      2 / (zNear - zFar), -(zNear + zFar) / (zNear - zFar), 0, 0, 0, 1;

      projection = ortho * persp2ortho * projection;
      return projection;
      }

最后得到的结果与官方答案不同,图形倒转了.这是zNear值导致的.
根据课上的内容,看向的是Z轴负半轴,Z<0; 而代码中,看向Z正半轴,Z>0;

小问题懒得修改了.

顺便学习了一下cmake的相关知识
[[07archive/tech/cmake|cmake]]

阅读更多

102

Lec1 课程介绍

GAMES:Graphics And Mixed Environment Symposium

101偏渲染
201偏动画
102偏建模

图像是由像素表达的离散的点
图形是具有数学表达的几何对象,矢量图

光栅化

文字都是矢量图,不论怎么放大都是清晰的
储存的是点线的坐标,在经过重新计算之后,会清晰的呈现出来

渲染

光的计算科学

  1. 光源
  2. 几何
  3. 纹理
  4. 材质

仿真

阅读更多