从此

编程开发、OOP面向对象、软件工程、信息化技术、运维工具(SFTP支持断点续传/取代SCP)

综合/最新

编程C#开发
命名:排序最靠前靠后的用词 - AbstractState(AbuildingState)/ZeroState

主要

通用
源码 Issue Tracker 中应该用 English 进行沟通,否则可能会被折叠,再不济上个机器翻译。

产品每个月1号均发布一次,避免小改动被搁置更新数月。

github.com Dependabot 可自动拉取已修复安全漏洞的依赖项。

常用符号:
  📝 - 编辑、修改、写入。
  🛒 - 购物、买东西。

局部不要吃掉异常,还应抛出相应异常,最后通过全局异常捕获来兜底。(JAX-RS用jakarta.ws.rs.ext.ExceptionMapper/安卓用Thread.setDefaultUncaughtExceptionHandler)

日期格式:2025-04-01T00:00:00+08:00 后缀 +08:00 指左侧时间显示的就是该时区本地时间,无需转换了,无后缀则为UTC时区。

死记:
  字段初始化器(field initializer)不能赋值非静态字段,比如 this 等,即使反射 this 实例也只能得到 null 值,应延至构造函数内赋值。
  将变量=null等同清除其内存地址,但如果有其他变量也指向了它的内存地址,在声明范围内连内存数据也会保留;即C#和Java类内或方法内声明局部变量并赋值个引用类型,返回前即使原对象=null,也不会释放该local variable。
  已赋值对象再次被赋值,则旧对象(String)会在下一次GC回收:var oldObj = new String(); oldObj = new Object();但如果是“追加订阅”(+=)则依然要上弱引用。
  对象置null后,字段就不可达了,故下次GC就会回收;即内存泄漏通常出现在长周期对象的字段上。
  C# 和 JavaScript 标注了 async 的方法,只有代码运行到了 await 处(若await嵌套的最终await未执行也算同步),它才会转为异步,否则全程同步,故可用 if 包住 await 调用;Java 虚拟线程则全程异步。
  Activity 窗口和 Node 场景等重量对象,必须上 WeakReference 弱引用,否则 GC 永不释放;C# 检查对象是否已经 GC(IDE调试器->孤立节点数):
    var gch = GCHandle.Alloc(obj, GCHandleType.Weak); var isAlive = gch.Target != null; // 非 null 则析构函数不会触发。

编程术语:
  Overload(重载)Override(覆盖)Overwrite(重写)
  组合优于继承 - 即前者将功能分散至接口类型的成员变量上实现,且不会像继承那样,残留用不到的方法。
    两者并不互斥,可先继承最大公约数,再组合额外需要的能力;普通规模项目两者不分伯仲;如果不在意多一些成员变量,也可以完全由组合拼凑。
  判断范围用 if else,判断确定值用 switch case。

延时任务 - 简单业务用无依赖的JDK延迟队列DelayQueue,复杂场景用MQ的DelayMessage、死信(Dead Letter)。

并发是交替用同一份资源,并行则是N个任务同时用N份资源。
协作
文件路径名不允许冒号(:),故应替换为其他符号:
  Java - Instant.now().toString().replace(":", "_");
  JavaScript - new Date().toJSON().replaceAll(":","_");
  说明 - 如果不表现时间,可换用UUID。

map、filter:
  说明 - map用来逐项转换,返回类型取决于lambda的返回值;filter则是用来筛选数据项的,通过lambda的boolean返回值决定每项的存留。
  JavaScript map例子: [1, 2, 3, 4, 5].map(num => num * 2);
  JavaScript filter例子: ["spray", "elite", "exuberant"].filter((word) => word.length > 6);
  Java List列表想用 map 和 filter 可直接 list.stream() 即可;但Java数组需要包装下:
    Stream.of(new String[]{"a", "b"}); Stream.of(1, 2, 3);
    Arrays.stream(stringArray); Intstream.of(new int[]{1,2,3});

for 嵌套计算全局索引号码:
  for (int i = 0; i < iCount; i++)
  {
    for (int j = 0; j < jCount; j++) { var globalNumber = i * jCount + j; }
  }
  
Shell
复制/拷贝:
  尽量加上-L避免软链接不可达  cp -r -L ~/x/ /tmp/ 

网址请求: 
  curl 在 Windows 中执行时,部分参数需要带上.exe后缀: curl.exe --help  或  curl.exe --help all

  上传文件: # Windows 与 Linux 用法相同
    curl -X POST "https://abc.[域名]/main/apis/more/default/public/upload-to-storage?staging&filename=x.txt" -F 'file=@x.txt'

    $hex = [BitConverter]::ToString([System.Text.Encoding]::UTF8.GetBytes("x.txt")) -replace '-'
    curl.exe -X POST "https://abc.[域名]/main/apis/more/default/public/upload-to-storage?staging&filename-hex=$hex" -F 'file=@D:\temp\x.txt'

十六进制:
  Linux - echo x.txt | hexdump -v -e '/1 "%02X "'
  Powershell - 
    [BitConverter]::ToString([System.Text.Encoding]::UTF8.GetBytes("x.txt")) -replace '-'
    .NET 5+ Use: [Convert]::ToHexString([System.Text.Encoding]::UTF8.GetBytes("x.txt"))

编程语言/OOP

异同:
  字符串包含字符 - JS 用 "abc".includes("b"); Java/C# 则用 "abc".contains("b");
  Lambda - JS/C# 用 const func = (x) => x * x; Java 则用 (x) -> x * x; C++ 用 [](int n) { return n % 2 == 0; };
  访问器属性(accessor property) - JS:  get pv() { return "方法名即属性名"; } C#: public int Pv { get => _pv; set; }  Java不支持。

运维

工具:
  SFTP支持断点续传,可取代SCP。

PowerShell:
  移除Label标头(未测-HideTableHeaders): dir | ForEach-Object {$_.Name}
Git:
  Github.com 设置某日期前通知为已读 API(清理仓库删除后残留通知) https://docs.github.com/en/rest/activity/notifications#mark-notifications-as-read
  注意 - Github 除了 Container registry 服务能匿名访问外,其他Registry(Maven、NuGet等)即使设为 Public 也要验证其邀请者,且也必须是 Github 账户。
初始化(默认master,但首选github的main分支)
git init --initial-branch=main
[错过init指定分支]分支改为main;查看生效 cat .git/HEAD;等同NetBeans->xxx->Git->Switch To Branch->Checkout as New Branch: main
git switch -c main
查看变动信息
git status
查看文件变动;无 commit 可 push 则显示 up to date 字样,否则告知提交数:... by 1 commit.
git diff project.godot
新增和变更均要add下,添加至“Changes to be committed”列表
git add .
[仅一次]提交前必须配置下email
git config --global user.email "you@example.com"
git remote add origin https://github.com/you/repo.git
提交“Changes to be committed”列表
git commit -m "msg"
撤销git add和commit
[已提交且错过初始化指定分支时]Move默认分支master至main
git branch -M master main
推送至仓库(Windows弹出“Connect to GitHub”输入Token即可 / 首次push必须加-u来告知git所关联的远程分支)
git push -u origin main
detected dubious ownership in repository
git config --global --add safe.directory "*";
Git 源码托管平台:
  Markdown 代码块儿语法 - https://docs.github.com/zh/get-started/writing-on-github/working-with-advanced-formatting/creating-and-highlighting-code-blocks
    比如Java代码高亮,就用 ```java 和结尾三个反引号裹住,未指定编程语言则只等同<pre>...</pre>效果。

  代码注释 TODO=待办、FIXME=需修复、XXX=有坑、NOTE=描述

其他

AI生成的技术文章会一本正经地胡说八道,臆造代码的垃圾内容却充斥着搜索引擎:blog.51cto.com 网站以mob64开头(mob64ca141677f9)的多个账户技术文章疑似AI生成,错误百出、乱扯一通,故应直接忽略;oryoy.com 则是全站通过AI生成。

字符:
  UTF-8中汉字字节数最少3个,且为最常用,最多4个且多为生僻字(比如“𱙁”字)。
  JS计算UTF-8字节数: new TextEncoder('utf-8').encode("你").length;

PHP 盛衰史