2024.4.10 开发小记

做了一晚上实验,又写了一坨屎

在写WinForm程序,因为加载时间过长,决定做个动画。
好消息:动画做出来了 虽然很糙
坏消息:动画播完Form才开始加载
想法:搞个Panel,把Form分到Panel里,然后在新层播动画,处理好两个层的前后关系。让新的Form发完成信号。

C#命名规范 for Uni

C#命名规范

该文是作者对微软文档的见解,更多详细信息请参照原文档

标识符 (变量)

· 标识符必须以字母或下划线(_)开头

· 标识符可以包含 Unicode 字母字符、十进制数字字符、Unicode 连接字符、Unicode 组合字符或 Unicode 格式字符。

· 你可以在关键字前加'@',声明一个与关键字相同的变量,例如:@if 是变量 if。我个人不太建议这么做。

命名约定

在介绍命名约定之前,我将先介绍Pascal Case 和 Camel Case

Pascle Case

形如 DataChecker, ValueCoordinate 之类的命名。将单词间空格删去,所有首字母大写,即是Pascle Case

Camel Case

Camel Case,又称驼峰法,与Pascal Case及其类似,只是第一个字母不在大写,例如dataChecker, valueCoordinate

True 命名约定

public interface IMyInterface               //接口使用I作为开头,其余部分使用Pascle命名法
{
    public void MyMethod();                 //方法使用Pascle命名法
}

public class MyAttribute : Attribute { }    //特性使用Attribute结尾,其余部分使用Pascle命名法

public class MyClass : IMyInterface
{
    private readonly int _myVal = 256;      //私有变量以_开头,其余部分使用Camel命名法

    public void MyMethod()
    {
        const int MyVal = 1024;             //常量使用Pascle命名法
        int localVar = MyVal+_myVal;        //局部变量使用Camel命名法
    }

    public int AnotherMethod(int firstParameter) => firstParameter+_myVal;    //方法参数使用Camel命名法
}

在充分理解以上约定的基础上,清晰胜于简洁

记录一下突然想到的一个点子

udp打洞 这个技术有一段历史了 但是它有一些基本问题
最大的问题就是丢包
我在想一个基础协议,封装整个udp打洞过程 最后做成一个局域网 把打洞目标放进去
这件事远远超过我的能力 此处仅是记录 待来日有能力实现

小纪

于我而言,思考遗忘竟如此形影不离。

补档 Uni运维小记

运维

运维的主要任务有:部署代码,配置和维护服务器上的nginx,Docker和mariaDB服务。还有背锅
运维技术路线:

Docker

学习Docker会是你的第一课。几乎全部的后端代码都运行在Docker中,Docker提供了服务管理,自动化部署和端口映射功能你需要学习的有关知识有:
Image、Container的概念及相关操作
从Image构建Container,端口映射相关配置
导出Container Log, 进入运行的Container进行检查
从 DOCKERFILE 文件构建Container
从 DockerCompose 构建Container

nginx

nginx维护的关键是:看懂学长留下的配置文件。然后在其基础上堆上自己的文件,同时保持nginx不崩
目前笔者nginx技术有限。不过多赘述

mariaDB

mariaDB和Mysql语法略有区别。但大部分都是一致的。作为运维,你需要为后端代码建立所需的数据库。建立数据库,配置用户并不困难。去bing或者谷歌花点时间就能做好。
但是关键是,把带有帐号,密码,地址的字符串传递给后端代码。我将在后续提到。

Azure

你有很大概率在Azure中看到这份指导文件,但你大概率还不会使用Azure进行代码管理和部署配置。
这里不会讲Commit PR 或是 Branch相关的概念。如果你不了解,你需要去学习Git相关知识。在很大程度上,Azure和Github类似,只是这里不会从搜索引擎中搜到。接下来,我会假设你了解相关概念。
这里主要讲Azure Pipelines的配置
在左侧,你能找到Pipelines。你可以右键,在新窗口中打开。这样就可以不退出本指导。
你可以看到很多Pipeline在其中。排在前面的可能是IWutApi,或是其他什么东西。它们在进行自动化部署的工作。每个Pipeline都在持续监测某个仓库的的某个分支,如果发生改变,它会把代码传到制定的服务器,构建,运行。这样,后端开发者就能在第一时间对最新的代码进行测试,并且把最新的代码上线,供用户使用。
这一近乎神奇的操作的关键,是仓库中的一个yml文件,它通常被命名为 *-pipeline.yml
关于yml文件的配置,我的建议是:抄

trigger:
  - main

resources:
  - repo: self

variables:
  projectName: iwut-api-prod

stages:
  - stage: Deploy
    displayName: 部署到服务器
    jobs:
      - deployment: VMDeploy
        displayName: 部署到Uni服务器
        environment:
          name: JP-tencent
          resourceType: VirtualMachine
        strategy:
          runOnce:
            deploy:
              steps:
                - checkout: self
                  fetchDepth: 1
                  displayName: 切换到目标仓库分支
                - bash: |-
                    docker compose -p $(projectName) -f docker-compose.yml up --build -d
                  env:
                    DeployPort: 5003
                    ConnectionStrings__App: $(ConnectionStrings__App)
                  displayName: 运行 docker compose 命令

这是目前正在运行的一份pipeline文件。我们来简单分析一下,如果要改在其他工程上,需要改什么。
trigger:规定正在监测的分支名字是什么
projectName:项目名字,改成对应的
stages里,第一个可能要改的是environment,你要部署到哪个服务器。在Pipeline-Environments中,可以看到现在可用的服务器。这个大概率会有人告诉你。但以防万一,这里简单叙述目前的情况。
如果你要部署的是一个需要Debug,后端还在开发的代码,放在uni-tencent上,并且只部署dev分支。
如果你要上线一个供用户使用的新功能,那么JP-tencent是更好的选择,只部署main(或master?)分支
下一个要改的是steps中的bash 这是一行从Docker-Compose启动docker container指令,关于Docker Container创建和端口转发,在Docker-Compose文件中。
然后是env, DeployPort和ConnectionStrings__App
env是环境变量,这里创建了两条环境变量,部署端口和连接字符串。

这里容我粘贴DockerCompose.yml(也能在仓库找到)文件,插入的讲解一下

version: '3.8'

services:
  iwut-api: #目标Contaienr 名字
    image: iwut-api:prod #镜像名字 
    build:
      context: .
      dockerfile: IWutApi/Dockerfile #DockerFile文件位置,需要修改
      args:
        BuildConfig: Release #发行环境
    environment:
      TZ: Asia/Shanghai
      ASPNETCORE_ENVIRONMENT: Production #发行环境
      ConnectionStrings__App: ${ConnectionStrings__App:?} #数据库连接串
    ports:
      - ${DeployPort}:80 #端口
    extra_hosts:
      - "host.docker.internal:host-gateway"

这个文件中,发行环境可能会改成Debug或Development,这个看后端需求。
你可以看到 数据库连接串和端口使用了${something} 的形式,这里就是在读取环境变量。

回到之前的Pipeline文件,端口没什么说的了,现在聊聊ConnectionStrings_App
该环境变量 在构建Pipeline过程中加入,如图。Screenshot_2024-03-25-15-29-23-111_com.realvnc.viewer.android.jpg
右侧添加名字和值,由于该字符串包括密码,所以需要勾上Keep this value secret
问题出现了,你 ,一个刚准备接锅的运维, 怎么知道这个值怎么填,因为过往的Pipeline这里都是**
两个办法:
如果是新的项目,直接问后端,直接问他怎么填,要个示例。
如果是老项目
还记得之前Docker要求你学习怎么进入容器内部吗?

docker exec -it (DockerID) bash
echo $ConnectionStrings__App

当然还有第三个办法,反正代码就在这,不如发挥主观能动性,学习后端。
祝你好运