cmake

CMake

前言

  • CMake是一个跨平台的安装编译工具,可以用简单的语句来描述所有平台的安装(编译过程)。
  • CMake可以说已经成为大部分C++开源项目标配

1 Cross-platform development

Let’s assume you have some cross-platform project with C++ code shared along different platforms/IDEs. Say you use Visual Studio on Windows, Xcode on OSX and Makefile for Linux:

What you will do if you want to add new bar.cpp source file? You have to add it to every tool you use:

To keep the environment consistent you have to do the similar update several times. And the most important thing is that you have to do it manually (arrow marked with a red color on the diagram in this case). Of course such approach is error prone and not flexible.

CMake solve this design flaw by adding extra step to development process. You can describe your project in CMakeLists.txt file and use CMake to generate tools you currently interested in using cross-platform CMake code:

Same action - adding new bar.cpp file, will be done in one step now:

Note that the bottom part of the diagram was not changed. I.e. you still can keep using your favorite tools like Visual Studio/msbuild, Xcode/xcodebuild and Makefile/make!

阅读更多

前端

前段语言串讲

  1. HT

ML
骨架

  1. CSS
    表现
    1. JavaScript
      行为
      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
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      75
      76
      77
      78
      79
      80
      81
      82
      83
      84
      85
      86
      87
      88
      89
      90
      91
      92
      93
      94
      95
      96
      97
      98
      99
      100
      101
      102
      103
      104
      105
      106
      107
      108
      109
      110
      111
      112
      113
      114
      115
      116
      117
      118
      119
      120
      121
      122
      123
      124
      125
      126
      127
      128
      129
      130
      131
      132
      133
      134
      135
      136
      137
      138
      139
      140
      141
      142
      143
      144
      145
      146
      147
      148
      149
      150
      151
      152
      153
      154
      155
      156
      157
      158
      159
      160
      161
      162
      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <title>My first web</title>
      </head>
      <body>
          my article
          <hr>
          <!-- 标题标签 -->
          <h1>head 1</h1>
          <h2>head 2</h2>
          <!-- 换行标签 -->
          this is (强制换行) <br> body <br>
          <!-- crtl + / 注释快捷键 -->
          分割线
          <hr>
          test
          <p>段落标签p1</p>
          <p>段落标签p2</p>
          <!-- 段落之间会有一个段落间距的空白 -->
      <b>加粗</b> <strong>强调加粗</strong>
      <u>下划线</u> <ins>强调下划线</ins>
      <i>斜线</i> <em>强调斜线</em>
      <s>删除线</s> <del>强调删除线</del>
      <hr>
      <h1>image tags</h1>
      <!-- width 与 height 会自适应 -->
      <img src="https://p.sda1.dev/12/bab6341cd5c384fbf70077b146d29da9/image.png" alt="load failed" title="it's a note and it appears when you put the cursor on the img" width="1920" height="800">
      <h1>audio tags</h1>
      <audio src="C:\Users\28763\Videos\Captures\这是27岁的老将枪法?绝境美队一滴血极限四杀1v4!_哔哩哔哩bilibili_精彩集锦 - Google Chrome 2023-03-19 00-11-16.mp4" controls >  </audio>
      <!-- autoplay 自动播放 loop 循环播放  仅仅支持MP3.Wav.Ogg-->
      <h1>video tags</h1>
      <video src="C:\Users\28763\Videos\Captures\这是27岁的老将枪法?绝境美队一滴血极限四杀1v4!_哔哩哔哩bilibili_精彩集锦 - Google Chrome 2023-03-19 00-11-16.mp4" controls autoplay muted></video>
      <!-- autoplay 自动播放(在chrome中要配合muted) loop 循环播放 MP4,WebM,Ogg-->
      <br>
      <h1>超链接</h1>
      <!-- a anchor -->
      <b><a href="https://www.bilibili.com" target="_blank">霹雳霹雳</a> </b>
      <br>
      <a href="./balnk.html" target="_self">跳转到blank.html</a>
      <br>
      <a href="#">空链接</a>
      <h1>列表</h1>
      <h2>有序</h2>
      <ol>
          <li>有序1</li>
          <li>有序2</li>
      </ol>
      <h2>无序</h2>
      <ul>
          <li>无序1</li>
          <li>无序2</li>
      </ul>
      <h2>自定义列表 definition list</h2>
      <dl>
          <dt>主题</dt>
          <dd>part1</dd>
          <dd>part2</dd>
      </dl>
      <h1>表格标签</h1>
      <table border="1">
          <caption>test</caption>
          <tr>
              <th>x\y</td>
              <td>y=1</td>
              <td>y=2</td>
          </tr>
          <tr>
              <td>x=1</td>
              <td>1,1</td>
              <td>1,2</td>
          </tr>
          <tr>
              <td>x=2</td>
              <td>2,1</td>
              <td>2,2</td>
          </tr>
      </table>
      <table border="1">
          <caption>test</caption>
          <thead>
              <td>x\y</td>
              <td>y=1</td>
              <td>y=2</td>
          </thead>
          <tbody>
          <tr>
              <td>x=1</td>
              <td>1,1</td>
              <td>1,2</td>
          </tr>
          <tr>
              <td>x=2</td>
              <td>2,1</td>
              <td>2,2</td>
          </tr>
      </tbody>
      <tfoot>
          <tr>
          <td>last line</td>
          <td>last line</td>
          <td>last line</td>
          </tr>
      </tfoot>
      </table>
      <br>
      <h1>input </h1>
      <h2>常规</h2>
      <p><input placeholder="请输入"> </p>
      <p><input type="text"> </p>
      <p><input type="date" min="2023-1-1"> </p>
      <p><textarea name="hello" id="world" cols="30" rows="10" >hello world </textarea> </p>
      <h2>多选</h2>
      <label ><input type="checkbox">option1</label>
      <label ><input type="checkbox">option2</label>
      <h2>单选</h2>
      <!-- 是通过name相同实现的 -->
       <input type="radio" name="sport">option1
       <input type="radio" name="sport">option2
       <!-- 无提示选择 -->
       <p>
          <select name="" id="">
              <option value="">op1</option>
              <option value="">op2</option>
          </select>
      </p>
      <p>
          <!-- 有提示选择 -->
          <input list="countries">
          <datalist> id="countries"
              <option value="">UK</option>
              <option value="">USA</option>
              <option value="">CN</option>
          </datalist>
      </p>
      <h1>引用</h1>
      <!-- 有 block ,cite , q ,code-->
      <!-- block 长引用 -->
      <!-- cite 章节 作品名称 -->
      <!-- q 具体的话 会有引号-->
      <!-- code 代码引用 -->
      <blockquote cite="https://www.huxley.net/bnw/four.html">    
          <p>
              Words can be like X-rays, if you use them properly—they’ll go through anything. You read and you’re pierced.
              <p>
                  <q>
                      test
                  </q>
              </p>
              <p>
                  <code lang="C">
                      i=10;
                      i=i++;
                  </code>
              </p>
          </p>
          <footer>—Aldous Huxley, <cite>Brave New World</cite></footer>
      </blockquote>
      </body>
      </html>s

      前端入门 - 基础语言篇

      HTML

      hyper text markup language hyper text 指的是图片标题链接表格 markup language指的是标记语言
      语义化的html语言
  • html中的元素,属性以及属性值都有某些含义

    CSS

    cascading style sheets 层叠样式

    引入方式

  1. 嵌入式 写在head标签的style标签中
  2. 外链式 写在单独的css中,用 link标签引入
  3. 内联式 经常配合div使用,直接在标签里面写
    同时存在内联与外联的情况下,还是能够同时生效。谁在后面,谁决定结果

    选择器

    渲染规则


    种类

  • 标签选择器/类型选择器
    1
    2
    3
    4
    5
    6
    7
     p{
                color: red;
                font-size: 30px;
                background-color: aqua;
                width: 100px;
                height: 300px;
            }
  • id选择器
    1
    2
    3
    4
    5
    6
    7
    8
    #first {
                color: black;
            }
    <body>
        <p id="first">
            test
        </p>
    </body>
  • 类选择器(class)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <style>
        .done {
                text-decoration: line-through;
            }
    </style>
    <body>
    <ul>
            <li class="done">task1</li>
            <li class="done">task2</li>
        </ul>
    </body>
  • 属性选择器
    1
    2
    3
    4
    5
    6
    7
    8
    <style>
      a[href$=".jpg"]{
                color: blue;
            }
    </style>
    <body>
     <a href="a.jpg">this is a jpg</a>
    </body>
  • 状态伪类
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    /* 对于a不同的状态进行选择 */
    a:link{
                color: blue;
            }
            a:visited{
                color: cornflowerblue;
            }
            a:hover{
                color: bisque;
            }
            a:active{
                color: orange;
            }
  • 结构伪类
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
            /* 结构伪类 */
            li{
                border-bottom: 1px solid;
            }
            li:first-child{
                color: antiquewhite;
            }
            li:last-child{
                padding: 0.5em;
                border-bottom: none;
            }
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
    </ul>
  • 组合选择器
    image.png
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<article>
<h1>拉森火山国家公园</h1>
<p>拉森火山国家公园是位于...</p>
<section>
<h2>气候</h2>
<p>因为拉森火山国家公园...</p>
<p>高于这个高度,气候非常寒冷...</p>
</section>
</article>
<style>
/*article 中的所有子p*/
article p {
color: black;
}
/*article直接的p标签*/
article > p {
color: blue;
}
/*h2紧跟的p标签*/
h2 + p {
color: red;
}
</style>
  • 选择器组
    1
    2
    3
    4
     /* 选择器组 */
            h1 , h2{
                font: 100;
            }

    特异度

  • 计算规则
    选择器生效的情况是看选择器的特异度(specificity),特异度高决定css样式
    (A,B,C)
    A:ID选择器 B:类选择器、属性选择器和伪类 C:类型选择器和伪元素
    优先级的计算,从A级开始到C级结束,如果到C级是两个选择器的优先级还是相等的那么有限选择靠后的选择器
选择器 优先级 (A, B, C)
.class.class (0, 2, 0)
.class (0, 1, 0)
阅读更多

remote ssh 配置

安装并配置

本教程仅仅适用于:本来就在windows主机与实验室linux主机上用git生成过密钥,且windows主机能够通过ssh登录到linux主机上

  • 在windows主机上安装好remote ssh插件,
  • 配置remote ssh设置!
  • 自定义配置路径,remote-ssh.config内容如下
    1
    2
    3
    4
    5
    6
    Host 10.1.21.164
    HostName 10.1.21.164
    User yzh
    Port 22
    IdentityFile "C:\Users\28763\.ssh\id_rsa"
    ForwardAgent yes
    解释:
    1
    2
    3
    4
    5
    6
    Host <远程主机名称> 
        HostName <远程主机IP
        User <用户名> 
        Port <ssh端口,默认22
        IdentityFile <本机SSH私钥路径> 
        ForwardAgent yes <VSCode 自己添加的,不用管> 
  • 在 linux 主机的.ssh 文件夹下,新建 authorized_keys 文件;
  • 将 id_rsa.pub 文件中的内容全部复制到 authorized_keys 文件即可;
  • 重启vscode,点击remote ssh插件,即可连接成功

    排除报错

    暂时没有
阅读更多

openwrt

Luci是什么

Luci简介:
lua是一个小巧的脚本语言,容易嵌入其他语言。轻量级LUA语言的官方版本只包含一个精简的核心和最基本的库,使lua体积小、启动速度快,从而适合嵌入在别的程序里。

what is luci

科学上网

三大插件SSRPlus、PassWall、OpenClash

  • SSRPlus:简称:酸酸乳Plus,使用简单,主流玩法,兼容大多数资源网站,建议新手使用。
  • PassWall:支持 SS/SSR/V2ray,选项多使用灵活自由度高,支持DNS,支持简单分流,建议新手使用。
  • OpenClash:简称:小猫咪,支持众多协议,有高级策略分流,自定义项目多,不是每个资源网站都提供服务,但有转换协议方案,上手不太顺手。

本来选择了openclash,但鉴于clash内核已经删库跑路,转用v2ray
v2ray有点难搞啊,教程太少,换成ssr Plus
参考
轻松搞定

不知道为什么ssr plus有点问题

ip测试还是我本地的ip,而不是vps的ip.和dns有关系应该

暂时有点搞定不了换passwall试试
非常完美passwall好用多了

奇怪了,passwall犯病了,不知道为什么上不去github.com,代理规则里面也写了github走代理.
用v2ray代理,选用相同的节点,没有任何问题.应该是passwall本身出毛病了.
还有steamcommunity.com和store.steampowered.com也都不行.之前还是好好的.

阅读更多

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;
}
}
}
}

阅读更多

配置环境

环境配置

难绷,论坛上给的虚拟机是ubuntu18 并且是virtual box的版本.
想用vmware虚拟机跑.将vdi格式转化为vmdk,并创建对应的虚拟机.
问题在于VMware tools安装失败.每次安装完成之后,再reboot,就会变成没有VMware tools…搞不懂.
还是在windows上配置环境算了…

看了下windows配置eigen和opencv有点麻烦,选择换成虚拟机ubuntu20.04LTS自己配置


更新
breaking news!
官方给的虚拟机,转换为vmware之后,vmwaretools安装成功了…
直接用就行了.配置环境结束.

ubuntu具体设置

参考

遇上vscode编译时候报错

1
/usr/bin/gcc -fdiagnostics-color=always -g /home/l4rk/games101/pa0.c -o /home/l4rk/games101/pa0 /usr/bin/ld: /tmp/ccjPHxdQ.o: in function `main': /home/l4rk/games101/pa0.c:6: undefined reference to `sin' collect2: error: ld returned 1 exit status

阅读更多

公网ipv4访问内网

环境:
学校电信提供公网ipv4:60.176.40.164
ikuai检测到的外网地址,只要拨号没有掉,ip地址就是确定的
使用ikuai的端口映射功能

内网ip有其对应的远程访问端口
例如openwrt,内网端口要设置为80才能访问,外网端口随意
image.png

ikuai的外网访问直接在系统设置-登陆管理修改

还要找到Ubuntu,pve端口
pve:8006
ubuntu ssh端口:22
虽然获得了公网IP地址,但是,这个IP地址是动态发放的,不是一直保持不变的,每次我们重启光猫或者重新拨号后,电信会重新给我们一个公网IP,每次的IP地址都是不一样的。也就是说每次我们外网访问的时候都要重新查询到这个新的公网IP地址,加上端口号才能进行访问,就比较麻烦了,要么在家的时候查看,要么让家里人查看。要解决这个问题就需要DDNS 动态域名服务了,可以把变化的 IP 自动动态地映射到域名上,通过不变的域名访问变化 IP 的主机。
不想依靠外网ip,靠ip地址做解析 已依靠ddns解决.

参考:
https://www.youtube.com/watch?v=KWHZhcbOOYI

阅读更多