🏠

晓东 - 持续改进

综合

整体

综述
  • 核心:记忆留痕(照片、源码等)、自用工具改进、SEO+ASO改造、服务器成本控制、App按需求演进、广告联盟优化。
  • 更多:最常用或反直觉技术操作、GAE免费资源利用、云平台(谷歌云、AWS、OCI等)免费产品探索。
  • 基础设施: 发邮件、传文件、消息推送(MQTT)、ICE 打洞、对象存储(首选HNS)
    高级能力: Quarkus(省内存/AI用SSE)、Jetty(H3)、Open Liberty(LRA/SAGA)
    技术探索: 服务器(IPv6/低延迟)、联盟链(Hyperledger Fabric/年约1万元)、向量搜索/全文检索(纯Lucene能向量/Nutch/OpenSearch)
    其他: JMX/CDN/Ehcache
  • 实战必用:
    名称 描述 其他
    电脑
    浏览器分屏/拆分窗口:右键点链接选“在右侧视图中打开链接”。
    实时字幕+翻译: 设置 -> 无障碍(chrome://settings/accessibility)。
    管道文本行匹配: echo $HOME | grep "e"  在 Windows 则 echo $HOME | Select-String "e"
    压缩/解压缩: tar -c x.tar 等同 --create; tar -x -f x.tar 等同 --extract, --get
      zip -r x.zip dir/; unzip x.zip; 只在 macOS 有内置,故首选 tar。
    播放器:树莓派用 ffplay x.mp3;macOS 用 afplay *.mp3。
    购买:编程用键盘要带翻页键 Page Up、Page Down。
    Chrome 登陆 Google 账号后,才能对密码框自动填充。
    QQ 邮箱弹框不允许复制链接,可鼠标拖拽至其他浏览器即可。
                                                    
    Windows 系统重装: 系统 -> 恢复 -> 重置此电脑 -> 删除所有内容(不会动系统盘外数据)-> 本地重新安装 -> 确定
      默认行为即“仅删除 Windows 驱动器中的文件”。
    提升日常效率
    网络 代理:日常用 Xray,类库客户端(GCP 等) 用 HTTP CONNECT Proxy;非 HTTP 协议(SSH 等)方走 SOCKS5。
    编程 概念分类
    • 基本语法、IO/Network、其他Other。
    命名约定
    • 路径首选全小写加横杠分隔(利于终端智能感知/文档则用首字母大写 Capitalize):my-project。
    • 项目描述放 README.md 或 build.gradle.kts,至少写下 API 主调方(Caller)和被调方(Callee)。
    • 术语 - 通配符(Wildcard Character)不能叫“统配符”;0.0.0.0、:: 均叫通配 IP 或全零地址。
    OOP 面向对象
    • 海量对象的轻量化、连续化:
      • Java 对象头紧凑化 -XX:+UseCompactObjectHeaders
      • Java 用 JEP 401 的 value class,需特供版 JDK 23+ 并启用 --enable-preview;C# 用 readonly struct。
      • CDI - @Singleton 单例比自己实现(volatile + 双重检查锁 + synchronized)省个 getInstance();
        @ApplicationScoped 可懒加载; @Observes 事件、@RequestScoped+@Inject。
    IDE
    • NetBeans 中运行时会注入该环境变量 System.getenv("NETBEANS_USERDIR");
      NetBeans 无法看到源码包:
        build.gradle.kts 顶部块儿注释中的“/*”必须用“*/”关闭,像 /* libs/*.jar */ 这种。
        或 java { toolchain { languageVersion = JavaLanguageVersion.of(25) } } 感知不到指定版本时,还未配置 settings.gradle.kts
          底部自动下载插件 plugins { id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" } 的情况。
    编程语言
    • 基本功 - OOP。
    • 杀手锏 - 编程语言专有特性和能力。
        可观察:
          Java - 注意:必须指定主机名且不能通配 ❌ -Djava.rmi.server.hostname=0.0.0.0
            动态启停(jcmd 无参列出 PID)  jcmd 1 ManagementAgent.start jmxremote.port=12345 jmxremote.rmi.port=12345 jmxremote.authenticate=false jmxremote.ssl=false
              未支持的需程序加参 -Djava.rmi.server.hostname=example.com
      
            或程序加参  -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.rmi.port=12345 \
              -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=example.com"
      
            开启后,可用 Swing 工具 jconsole 连上查看 MBean:
              example.com:12345;注册 MBean:ManagementFactory.getPlatformMBeanServer().registerMBean(myMBean, new ObjectName("test:type=User"));
      
            jcmd 1 ManagementAgent.status  用完就关(防止外人操作)  jcmd 1 ManagementAgent.stop  其他 ManagementAgent.start_local
      
        缓存/CDN:
          Java - Caffeine、落盘用 Ehcache,自建 CDN 用 httpclient5-cache。
      
        GC 省内存:
          Java - 加参 -XX:+UseSerialGC 能用 STW 停顿换取少占内存。
          C# - <ServerGarbageCollection>false</ServerGarbageCollection>
      
        安全:
          Java 27+ 将“TLS 1.3 协商密钥”默认算法改为了“后量子混合密钥交换(X25519MLKEM768)”,.NET 则 OS 决定,应对“先收集,后解密(HNDL/Harvest Now, Decrypt Later)”。
          注意 - X25519MLKEM768 不直接作用于待加密内容,而是先基于对外公开的公钥来生成一个 AES 密钥和一个“Encapsulated Key”,然后用该密钥对内容进行加密,
            最终将“Encapsulated Key”和加密数据交给对应的 X25519MLKEM768 私钥来解密。
          .NET 10+ - 算法类 MLKEM.GenerateKey(MLKEMAlgorithm.MLKEM768);
          Java 24+ - 算法类 KEM.getInstance("ML-KEM");
      
        字段级延迟初始化:
          Java 27+ - static final LazyConstant<Obj> obj = LazyConstant.of(Obj::new);
          C# - private static readonly Lazy<string> _config = new Lazy<string>(() => Method());
    软件工程
    • 本机存储:
        不落盘写入(占内存) /dev/shm/,落盘但短期写入 /tmp/,月度有效写入 /var/tmp/;程序退出即失效时,可用 deleteOnExit() 清理。
        走网络API但省掉网络封包:
          var addr = UnixDomainSocketAddress.of(Path.of("/dev/shm/x.sock"));
          ServerSocketChannel.open(StandardProtocolFamily.UNIX).bind(addr);
      
      对象存储 - 首选通过“动态子树分区”实现 HNS 目录树方案,专用库 google-cloud-storage-control;
        自建方案有 CephFS、MinIO、JuiceFS;
        gcsfuse 挂载方式的 API 读写,比 Client API 方式消耗更多,前者适合用在托管的 GAE、Cloud Run。
    • 数据库 - 小项目或 CI/DI 可使用 SQLite 或基于 Java 的 H2 嵌入式(jdbc:h2:~/mydb)数据库(或jdbc:h2:mem:mydb),
      正式项目则首选 MariaDB(或MySQL);长字段记录可十个逐批查询。
      连接池 max-lifetime(默认永久?) 应小于防火墙 TCP Idle Timeout,否则抛异常,三分钟或200秒最保险,或测出真实值。
    • API - 若是不想用数据库,可以走 REST 请求响应 JSON 方式。
    • Web - 爬虫不少是HTTP/1.1 故网站最好也兼容下 curl -I --http1.1 https://congci.com
    节省内存
    AI 轻量用(Gemini 问答归属 Gen AI 而非总目 Agent Platform[原名 Vertex AI]) - https://gemini.google.com
    深度用 - 离线大模型+Tool Calling
    服务器
    注意 - 国内 IPv6 按量计费,应经常检查免费额度,且尽量走 IPv4 传出数据。
      可观察性(Observability/O11y)- 自写、Netdata;数据存储首选 VictoriaMetrics(比 Prometheus 省内存)。
    
      防火墙控制 IPv4 和 IPv6 的规则是分开的,前者填 0.0.0.0/0,而后者则填 ::/0。
      curl -4 ifconfig.me
    
      对象存储客户端 - Cyberduck(Java/S3-like/more搜ap-tokyo-1)、或 WinSCP。
        亲测“Path style”可用,Virtual-hosted 方式无法列出桶内项。
        OCI Object Storage Endpoint - https://[真实值].compat.objectstorage.ap-tokyo-1.oci.customer-oci.com
          Identity & Security -> Customer Secret Keys: s3-like(显示用/非key名)。
    
      云服务适用 - 云函数(JVM 非 AOT)跑图片、音视频转码。
      云实例自建 - AOT 网站,跑 FFmpeg。
    
      VPN - 丢包率(Packet Loss)比延迟(Latency)更重要;将已知 VPS 服务器 IP 都添加为直连。
      VPS - 海外带宽 1Gbps(除8=125MB/s) 起步。
      开启 BBR + fq 队列:
        echo "net.core.default_qdisc=fq" | sudo tee -a /etc/sysctl.conf
        echo "net.ipv4.tcp_congestion_control=bbr" | sudo tee -a /etc/sysctl.conf
        sudo sysctl -p
        [生效否] sysctl net.ipv4.tcp_congestion_control
    
      文件格式 - 图片首选无损优于 *.avif 的 *.jxl;音频首选 *.opus(继任者*.oac/aomedia.org);视频首选 *.webm(存在 fWebM 切片版)。
        音频达到 16bit 44kHz 就已覆盖人耳极限了,后期剪辑才可能用到 24bit。
        播放列表用 *.xspf(无时长) 或 *.m3u8、*.mpd,前俩都支持无容器音频。
        将切片喂给 MSE 相关库 - dash.js 库和可定制 UI 的 Shaka Player 库,MSE 用 *.webm 容器而非 *.ogg、*.mp3。
    
      SEO - robots.txt 之外还应自链接下全站页面至“孤岛页(Orphan Page)”。
        每个页面最多存在一个 <h1>h1</h1> 标签,至少一个引荐链接及 sitemap.xml。
        为了使动态网站静态化时,不从无斜杠路径跳转,故统一用斜杠结尾;API 路径则不带。
    经验 长连接 - SSE open 事件触发后,提问 API 不负责解除执行按钮的置灰状态,而应在 SSE onmessage 中根据 "isFinish":true 决定,
    最后一次响应累计 1 分钟也解除置灰。
    外语 Developer 缩写为 Dev;Infrastructure 缩写 Infra;Request/Response 缩写 ReqResp。
    Object storage - 区别于文件存储。
  • 技术:
      新 - WebGPU、k0s(K8s单文件/树莓派可用)、k3s(精简版K8s)
                                    
    技术点 描述 其他
    网络访问 代理/加速、建站/裸域(SVCB) Proxy、VPN、GFW
    建站域名 域名/网址:
    • 自用或维护性域名直接用裸域,比如 https://xiaodo.ng,SVCB/HTTPS 记录已解决 CNAME 覆盖 MX 问题。
      对外服务正式域名首选 https://www.congci.com,并让裸域名通过 301 永久跳转过来。
      若不想让裸域名的Cookie不传递到CDN子域名,可使用跟裸域完全不同的域名,比如 https://example-cdn.com
      重要网站域名 SNI 证书应专门隔离出来,避免因共享证书而暴露更多攻击面。
      首页内联 - 图标logo.svg、关键样式表homepage.css。
    • SEO、URL 网址规划、非大陆服务用不允许备案域名(*.passed.app)。
    • 域名 DNS:
        Nameservers - 用域名自带面板或自建。
          多个 A 记录会轮询给客户端,但自带面板至少给你个按运营商智能解析(解析请求来源: 电信、联通、移动、境外)。
          自建 GeoDNS 的工具有:CoreDNS、BIND9 等,加上 MaxMind GeoLite2 免费 GeoIP 数据库。
    OS 操作系统 Linux 用 apt install iputils-ping 安装程序;macOS 用 brew install mas;Windows 用 winget install Microsoft.PowerShell Git.Git
    约定:$HOME、Linux 的 $XDG_DATA_HOME=$HOME/.local/share 和 $XDG_CONFIG_HOME=/home/runner/.config
    程序:app/bin/auto-detect.exe -> app/bin/x64/x.exe
    Web(HTML/JS/CSS)
    HTTP/2 明文协议 H2C 部署简单,使用 WebTransport 则必须 HTTP/3。
    fetch node.before('插入本节点前边/尾部用after'); 父节点用.prepend("或取代了appendChild的append");
    clamp() 控制 vw (Viewport Width) 边界 - 基于百分比的vw,比基于font-size的rem更适合响应式布局
    Emoji最长匹配(Extended_Pictographic)、阿拉伯文词间连写、按句拆分:
      var it = new Intl.Segmenter("cmn-Hans-CN",{ granularity: "word" }).segment("你好,世界。👨‍👩‍👧‍👦晚安!");
      Iterator.from(it).forEach(console.log); // 按词拆分用 word,按句用 sentence,默认按字。
                                                    
    Web开发常用
    DevOps(Shell) 网络访问、下载 - 首选装机量高的 cURL(Client and URL/libcurl);未内置再考虑 wget(wget2 方支持 HTTP/2)。
    断点续传 curl -O -C - https://www.gov.cn/images/gtrs_logo_lt.png
    参数 -O 即直接取网址尾段为文件名,小写 -o 则可指定文件名.png。
    参数 -C - 启用断点续传,后跟横杠指从上次断处接续,或换为 offset 数值。
    SSH 文件收发 - SFTP比SCP多个断点续传,故首选跨平台的FileZilla,WinSCP则备用。
    Github Actions 试验场
    Actions 入门模板
    Android 编程 分区存储(Scoped Storage):即App产生的文件会随着自身的卸载而统一删掉,类似 iOS App Sandbox(应用沙盒)。
    Android 玩法 Termux proot-distro 跑完整 Linux 系统;将丰富的 Linux 程序(libc)带入 Android 系统(bionic)。
    Termux 中 CPU 内存操作是原生速度,但大量小文件 IO 则会变慢。
    Android 目录结构不利于 clang 编译环境,
    故可通过 Termux 装 aarch64 版 Linux 改善。
    iPhone 玩法 侧载 - 第三方应用市场 AltStore PAL、Epic Games Store 仅在欧洲和日本放开。
    C/C++(clang、NDK) C/C++ AARCH64 Android NDK 原生构建
  • 省钱:
    名称 描述 其他
    综合
    在用 云服务:
    • 将额度摊匀到每天里,别短时间内非要用超。
      
      GCS:
        原则 - 节省读写次数,减少操作算力。
        gcsfuse 挂载比纯 GCS API 耗费更多读写次数。
        以 Content-Encoding: gzip 上传的 *.gz 文件会节省容量,响应时会由浏览器解压为原始文件。
        最多 32 个文件的 Compose API:
          tar 命令能解压多个 *.tar 文件的拼接,故可用 GCS Compose 组合成 final.tar;多个 *.zip 不行,*.txt、*.log 则可以。
          gzip 命令能解压多个 *.gz 文件的拼接,故可用 GCS Compose 组合成 final.gz;但 Java GZIPInputStream 遇 EOF 报错。
      
      Transcoder 转码:
        原则 - 无免费额度,只能临时用用;OCI Media Services 则试用一个月。
        分辨率、HLS 和 DASH 均按输出流收费,故单用 HLS 或只生成一两种清晰度。
    • Other:
        临时存储时优先用 /var/tmp/,而非重启就清的 /tmp,清理规则在 /usr/lib/tmpfiles.d/tmp.conf。
实战(冗余不分类)
  • 发文章、维护专题;网页加或改description、规范化URL;有改动则要重新测试上传下载等API的速率。

    网址规范化:
    名称 描述 其他
    软件升级 应用标识:Android 用包名、Windows 用数字签名。
    通过应用标识来升级的配置文件 URL(大陆镜像)
    ...
    国家地区 俄罗斯(国旗)、大陆省市县(JSON) ...
  • 持续提升大陆和环大陆间的网络连通性和延迟。
    说明 - 首先用JS主线程之外的Worker对象,同时发出大陆(TSC域)和环大陆(ABC域)2条测速请求URL,至Nginx端直接return响应不走代理,哪个快就设置为对应环境,后续请求均以此进行分支。
  • 更多:上架App改善;游戏策划改造。
常识
生活
  • 外出:
      身份证 - 大陆外出住店或上网吧,均需亮明身份证原件。
      网纹袋 - 身份证或信用卡跟手机放一起容易磨损,故带个小手袋。
  • 经济:
      商店 - 周边常去超市应办理下会员卡(贾台报卡号293/年底清零?),积分换小商品(纸巾或垃圾袋等)。
    
      信用卡年费规则:
        免年费条件 - 每年使用信用卡消费满5次或12次,比如在超市或网上购物,但不包括取现;信用卡买服务器也能减免。
  • 健康:
      身体 - 眼药水(不含防腐剂/鼓楼世安堂聚乙烯醇26元/促修复的玻璃酸钠28元),扭盖时瓶口朝上,避免药水粘盖儿上。
        非疲劳情况的眼白发红,可能是发炎了,可购买4元的妥布霉素滴眼液用几天。
    
      日常 - 手机放枕头边,易招灰尘毛发,买个支架悬空在床头。
    
      入口 - 饮具最好带盖儿,曾亲见蚂蚁、蟑螂爬进茶碗中补水;垃圾桶也要带盖,避免招来飞虫,湿垃圾或饮料瓶应挂在屋外。
        食品级(PE聚乙烯材质)保鲜袋或保鲜膜比透明塑料袋健康些,将不易冷藏的食品包裹住,放阴凉干燥避光处。
        不宜隔绝空气:有氧呼吸的蔬果。
    
      冰箱 - 每月清理下冰箱内部!
        鸡蛋最多冷藏 30 天,先倒进小碗或锅勺里,闻下不发臭再下锅。
        不宜放冷藏:馒头(2天)、面包(5天)、皮蛋(俩月),存放时应隔绝空气。
    
      厨房 - 案板、炊具挂起来可避免滋生细菌。
    
      空调 - 每3个月清洗下空调滤网!
    
      通风 - 门上应装个防蚊虫磁吸式软纱门(尺寸220x90cm/约15元),窗户固定面可用较硬的金刚网(100元/个),防儿童撞坠,临时用就买魔术贴磁吸纱窗吧;或一步到位上蚊帐。
    
      小活 - 菜园种植、门窗改造。
    
    饮食:
      早餐 - 豆浆+面包、馒头或水煮蛋,按 1:10 比例用 85° 热水泡开,可混合咖啡一起泡。
      咖啡 - 比含糖饮料健康,按 1:16 用 85° 热水泡开,凉至室温前喝完,否则显苦,提神为主,口味为辅。
      正餐 - 除非没煮锅,否则就尽量吃现做湿面、鲜湿面(袋装)或挂面;方便面高盐油差,粉包用量应减半。
  • 其他:
      无。
工具
自用
赚钱
Web和App广告
  • 广告联盟:
      AdSense - 赚取网站广告费。
      AdMob - 赚取手机应用广告费。
      Google Ad Manager - 赚取AdSense、AdMob和第三方广告联盟及直销商的广告费;必须拥有AdSense账号(必须关联吗?)。
      Ads - 花钱给谷歌打广告。
    
      百度联盟 - 赚取网站广告费。
  • 投资理财:
      股票 - 暂小资金进行训练,熊市减仓、牛市加仓。
                                    

技术

原则
  • 开发环境 Windows防火墙安全设置
    
    服务器间网络通讯应经常检查,避免丢包、ping值高或无法连接等情况。
      注意 - 通常去程丢包率跟回程差不多,但部分服务器(如Vultr东京)则还应加测回程丢包情况,严重影响nginx反向代理大陆服务器。
最常用或反直觉
  • 综合
    浏览器超链接文字部分选中 - 按住Alt键不松并拖动鼠标。
    远程桌面顶侧操作条支持缩小移动,可通过拖拽来避免阻挡程序窗口标题。
    Servlet:
      quarkus-undertow-3.13.2 最高支持 Servlet 4.0 (Undertow路线图);而 Open Liberty 则最高支持 Servlet 6.0
SEO
编程指导
  • Java:
      快速启动可采用基于CRIU的Open Liberty InstantOn,原理是构建镜像时将内存中的Java程序直接快照化。
      镜像 FROM open-liberty:beta-java17 认为JDK17,而 FROM icr.io/appcafe/open-liberty:beta 则默认为JDK21。
      优化内存占用可采用基于GraalVM的Quarkus,原理是编译时会转译为本地原生程序。
  • Java相关:
      解决 - Java 8 date/time type `java.time.OffsetDateTime` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling
        // implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.17.2")
        ObjectMapper om = JsonMapper.builder().addModule(new JavaTimeModule()).build();
  • Java Vs. C#:
      类型转换 - 均支持(NewObj)OldObj;候选转换(仅单层括号):Java用NewObj.class.cast(OldObj).x(); C#用(OldObj as NewObj).x();
      方法覆盖和隐藏 - Java子类存在父类同名方法即覆盖;执行实际对象的方法;而C#同名(或new修饰的方法)则是隐藏方法,即根据声明类型而决定执行谁的方法,且覆盖方法必须存在关键词 父virtual+子override 。
  • Gradle:
      为了方便统一构建,可用上gradle默认任务(./gradle时无需任务名,可写至build.gradle首行) - defaultTasks("clean","run");
  • Godot:
      必须在【编辑器设置→导出→Android】中指定 Java17 版本(版本不能高也不能低) java_sdk_path = E:/java/jdk-17_windows-x64_bin/jdk-17.0.12 和 android_sdk_path = C:\Users\person\AppData\Local\Android\Sdk
      shader_cache超长路径报 Safe save failed,临时解决:编辑器设置->文件系统->保存时->勾掉 Safe Save...。
      定位玩家应首选Godot场景唯一节点: GetNode<Node3D>("%Player") // Player节点右键点"% Access as Unique Name"
      工作流:
        资源导入导出 - 总体原则是实现直接导入,但不进行额外设置,且也不能破坏在用属性值,解决办法是通过动画树隔离下:
          AnimationTree.TreeRoot(AnimationNodeBlendTree等).AddNode("动画名", AnimationNodeAnimation(必须UseCustomTimeline=true时属性LoopMode方生效)) 。
技术点
  • async/await
    说明:
      作用 - 阻塞当前方法块儿至完成状态,但不阻塞方法调用处,利用一轮轮分配的CPU时间片进行计算。
      async方法并不阻塞当前线程,可通过 ConcurrentHashMap<String, Semaphore> 来防止重入。
生产环境
  • 观察
    GAE曾被1秒数次访问的抓取工具冲垮: 故应判断userAgent为"Go-http-client/1.1"时跳过请求。
场景解决方案
  • 资源
    说明:
      非UGC图片,可直接放页面同级子目录(images)内;UGC图片或视频应传至云端存储(GCS、OSS、COS等)。
    数据库
    说明:
      MainImage 字段前缀用 https:// 或 data:image/svg+xml,<svg ...>...</svg>。
    分页
    说明:
      Java可选用 https://mybatis.io/ ; 或 Jakarta Data 的 Page<Model> 。
    限流、幂等、防盗刷
    ...
    上传
    模板:开箱即用 fetch API
    说明:
      按大陆宽带上行速率30Mbps(3.75MB/s)算,50MiB文件及以下大小上传时等待业务做完再响应,GAE取30MiB;大于50MiB至150MiB则上传后返回文件网址,接着再传入新请求做业务;大于150MiB的则分块儿上传。
      按nginx默认1分钟响应超时算,亲测100MiB上传至GCS用时46秒,中转时会有损耗,故50MiB至100MiB就要返回网址。
      GCS“可续传上传”仅指按序断点续传,并不是各分片同时无序上传的“并行复合上传”。
    
    文件选取:document.getElementById("file").files[0]或window.showOpenFilePicker()
    
    上传大小限制及响应超时:
      避免上传中断的重传耗时 - 分片上传+断点续传
        数据块大小至少8MiB起;可续传有效期为7天。
        前端分片: document.getElementById('fileInput').files[0].slice(start, start + chunkSize);
        后端合并: FileChannel.open(path).write(bb); // 性能超RandomAccessFile
    
        GCS可续传上传的做法分为: 
          单块 - 根据上次停止位置来接续。
          多块 - 根据数据块字节范围来同时上传;亲测若分片同时上传报503,依序上传则正常响应308;
            最后一块儿会响应 200 + MD5值(Etag: "e92c1cff62ac6e5662eecb292c572e06")
    
          注意 - fetch上传至SessionURI时会自动添加Origin头,但后端HttpClient则要手动添加。
          猜测:各数据块将总字节写满即判定为可续传状态为“完成”。
          参考:https://gcp.infoq.cn/details/1305.html
          Java客户端:SignUrlOption.withExtHeaders(ImmutableMap.of("x-goog-resumable", "start"));
            通过返回的signUrl换取(POST/允许CORS头x-goog-resumable)含upload_id参数的Location上传网址。
    
    服务端执行进度回报至客户端或浏览器:
      JAX-RS SSE - 长业务或大文件上传进度场景。
        @Produces(MediaType.SERVER_SENT_EVENTS) - https://openliberty.io/guides/reactive-messaging-sse.html#creating-the-sse-api-endpoint
                                            
其他
NetBeans
  • NetBeans插件能识别的属性:
      -PrunEnvironment=设置(=赋值)或移除(!前缀)空格分割的环境变量 -PrunJvmArgs=... -PrunWorkingDir=...
    
      解决NetBeans插件io.quarkus将环境变量拼接为java -jar之-D参数时报IOException: invalid null character in command(非NetBeans环境则无需该操作):
          quarkusRun -PrunEnvironment='!CUDA_PATH_V12_3 !EFC_4908'
  • ...