0%

Go编程语言是Google中一些大牛(尤其是有着plan9前科的大牛们)如Rob Pike,Ken Thomason这两位赫赫有名的程序高手、技术作于2007年9月开始建造。 Pike指出,Go代码的编译基本上可以达到C语言的速度,几乎可以在瞬间完成,“就像是在使用交互式语言”。现有的语言都没有针对多核心处理器 进行优化,为了解决此类编程问题,Google工程师们开发了Go语言。从源文件的copyright可以看到,很多基础代码来自plan9. Go 已在Google公司内部测试过,现在已经发布 Go 1 RC1 版本。Google开放Go的代码,希望籍此帮助Go语言的发展。首席软件工程师Rob Pike说:我们开发Go,是因为近10年左右开发程序之难让我们有点沮丧。Google两年前开始开发Go,1年前开始有一只团队专职于此。目前只支持 unix平台, windows平台的支持由于资源的原因,需要更多的参与者来移植。 Go的定位 是系统编程,比如Web服务器、存储系统和数据库等,但也欢迎在其它方面的应用。 Go 语言官方网站

java 和 go,谁才是最终答案
java优势:

  • 1.1 比较强大的地方是那个jvm,他让你有一些字节码增强的技,jvm层面的语言自带的aop。
  • 1.2 有泛型。
  • 1.3 有annotation技术,这个貌似是java5才出来的。
  • 1.4 面向对象语言。
  • 1.5 有threadlocal技术

go的优势:

  • 1.1 go有多协程的能力,有select和channel让协程能通讯。
  • 1.2 可以定义对象为指针还是对象本体,如果返回对象本体则肯定不会出现空指针。而且go的空对象调用方法也不一定会npe,因为空对象本身不是真的空,是有类型的空对象。
  • 1.3 面向接口的语言,有些面向对象的设计模式不太好写,不过不是重点。
  • 1.4 方法能返回多个对象,编程不会再创建这么多class去包对象了。
  • 1.5 异常处理机制比较特别,go官方建议大家每个函数返回err,这样当你调用方法的时候,会强制让你回答:”如果这个方法异常,你应该怎么做”。不像java,都是throw出去,所以go编程的异常case会少一些。不过这样也让代码很臃肿,到处都是if err!= nil 。

队列的特点是先进先出,以C#的Queue为例

1
2
3
4
5
6
7
8
9
10
11
Queue<string> numbers = new Queue<string>();
// 进
numbers.Enqueue("one");
numbers.Enqueue("two");
numbers.Enqueue("three");
numbers.Enqueue("four");
numbers.Enqueue("five");
// 出
Console.WriteLine("\nDequeuing '{0}'", numbers.Dequeue()); // Dequeuing 'one'
Console.WriteLine("\nQueue Size '{0}'", numbers.)
Console.WriteLine("\nDequeuing '{0}'", numbers.Dequeue()); // Dequeuing 'one'

队列不能直接操作任意指定位置元素 必要时转换为Array

search for topic: Awesome xxx

1
pnpm add -D gh-pages
1
2
3
4
5
6
{
"scripts": {
"build": "vite build",
"deploy": "npm run build && gh-pages -d dist"
}
}

无意在网上看到了编程语言的鄙视链,我anyscript(ts)位列末端,Rust以其编码效率和执行效率、面向现代化,没有历史包袱的优点成为鄙视链上高于C/C++的存在

关于webassembly的开发需求 LLM建议我从原本薄弱的C++路径直接转到Rust上

C++基础薄弱,想要写出能在浏览器安全、高效运行的 Wasm 代码,需要补齐的短板太多. 挑战 Wasm 80% 的精力花在“如何不写崩内存”和“如何配通编译环境”上,而不是业务逻辑。Rust 的设计初衷就包含了内存安全和现代工具链,这与 Wasm 的需求完美契合

Rust学习曲线陡峭 所有权和生命周期概念确实比 C++ 难懂 好在 Rust 一旦通过编译,代码大概率就是正确的

《Rust and WebAssembly》

Rust 在图形学领域(尤其是涉及 WebAssembly、现代 API 如 Vulkan/Metal、以及引擎开发)已经展现出了独特的、甚至超越 C++ 的优势

维度 C++ 传统路线 Rust 现代路线
入门门槛 低(语法简单),但上手难(内存管理陷阱多) 高(概念如所有权、生命周期较难理解),但上手稳(编译报错即修复)
调试难度 极高(崩溃往往是随机且难以复现的) 较低(编译器会告诉你哪里错了,极少运行时崩溃)
图形库生态 极其丰富 (OpenGL, Vulkan, DirectX, SDL2) 快速增长 (wgpu, winit, bevy, cgmath)
Web 集成 需通过 Emscripten 编译,体积大,启动慢 原生支持 Wasm,体积小,启动快,JS 互操作友好
社区趋势 存量巨大,维护旧项目必备 增量巨大,新引擎(如 Bevy, Godot 4+)首选

Start up

1
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

windows 下载Rust

Crate

Rust中 Crate是编译单元 可以理解成一个代码包 每个Crate都是一个独立项目 可以是一个二进制可执行文件或一个库。
使用 Rust 编译器,也就是 rustc 来编译

1
2
3
$ rustc hello.rs
$ ./hello
Hello, world!

Cargo

Rust包管理器 在 Windows 上,下载并运行 rustup-init.exe。它将在控制台中启动安装

强制开发模式下使用全面优化编译策略

1
2
3
[profile.dev]
opt-level = 2 # 默认是 0,改为 2 表示全面优化
debug = true # 建议保留调试信息,否则无法调试

Trait

在 Rust 语言中,Trait(特质) 是极其核心且灵魂的一个概念。简单来说,它定义了类型必须具备的行为(即“能做什么”),而不是描述类型包含的数据(即“是什么”) 可以把它类比为:

  • Java / C# 中的 接口(Interface)
  • C++ 中的纯虚函数 / 抽象类

所有权系统和借用检查器

1
2
3
4
5
6
7
8
9
10
fn main() {
let s = String::from("hello"); // s拥有这个字符串的所有权
println!("s: {}", s);
let s1 = s; // s的所有权转移到s1
println!("s1: {}", s1);
// 这里s已经不再有效,不能再使用它
// 下面这行代码会报错,因为s已经不再有效
// println!("{}", s);
let r1 = &s1; // 不可变引用
let r2 = &s1; // 多个不可变引用是允许的

Rust Wasm

1
2
cargo install wasm-pack
cargo new --lib hello_wasm
1
2
3
4
5
6
7
8
9
10
[package]
name = "hello_wasm"
version = "0.1.0"
edition = "2021"

[lib]
crate-type = ["cdylib"]

[dependencies]
wasm-bindgen = "0.2"
1
wasm-pack build --target web

无间

刘邦被围

安史之乱潼关失守

设置RichText以使文本中的样式生效

1
2
3
4
5
6
Label {
textFormat: Text.RichText;
text: "<style>a:link { color: " + Theme.highlightColor + "; }</style>" +
"<a href=https://together.jolla.com/'>Jolla2Gether</a>";
}
}

AP(Access Point)

通常说的是无线AP,即无线网络接入点,无线路由器的天线就是AP,其作用是收发网络数据信号,在网络中相当于交换机,家装中做全屋网络覆盖会安装AP设备 (因为常常是商用,其功能不如路由器售价却比路由器贵很多)

AC(Access Controller)

接入控制器,集中化控制局域网内可控的无线AP, 应用场景如商场的不同区域AP,统一连接到AC,使得顾客从一个区域到另一个区域,始终连接统一网络

安装TensorFlow Object Detection API

参考PaddleX准备anaconda和cuda

参考安装Tensorflow2

1
2
3
conda create -n tensorflow python=3.10
conda activate tensorflow
pip install tensorflow

pip自动安装最新release版本 2.0之后不再区分cpu和gpu版本

测试安装,在python中引用tensorflow, 对一个随机张量的求和

1
2
python -c "import tensorflow as tf;print(tf.reduce_sum(tf.random.normal([1000, 1000])))"
# 结果形如tf.Tensor(-1082.7711, shape=(), dtype=float32)

install the TensorFlow Object Detection API:
下载模型库 新建一个Tensorflow目录并将模型库clone/解压到目录下
TensorFlow/
└─ models/
├─ community/
├─ official/
├─ orbit/
├─ research/
└── …
根据Readme的提示安装official library
1
2
3
4
# 将model路径添加到PYTHONPATH环境变量
set PYTHONPATH=%PYTHONPATH%;C:\Users\qqqst\Documents\TensorFlow\models
# 安装requirements
pip3 install --user -r models/official/requirements.txt


下载protobuf添加到环境变量path,对于windows下载 protoc---win64.zip并解压,注意protobuf--.zip是source code 添加路径如D:\Software\protoc-25.1-win64\bin到path

使用protoc编译模型的python版本(与.proto一一对应的.py文件)

1
2
# cmdline in TensorFlow/models/research
for /f %i in ('dir /b object_detection\protos\*.proto') do protoc object_detection\protos\%i --python_out=.

install pycocotools (依赖vc++ 2015)

1
2
pip install cython
pip install git+https://github.com/philferriere/cocoapi.git#subdirectory=PythonAPI

看到Object Detection for TensorFlow 2.0的setup script

Install the Object Detection API

1
2
3
# From within TensorFlow/models/research/
cp object_detection\packages\tf2\setup.py .
python -m pip install .

调用test脚本以测试安装
1
2
# From within TensorFlow/models/research/
python object_detection/builders/model_builder_tf2_test.py

</del>