在 Docker Compose 中写多行文本

heredoc

之前列举过 在 Taskfile 中写多行文本,在 Docker Compose 中也有写 heredoc 的需要

services:
  first:
    image: alpine
    entrypoint:
      - /bin/sh
      - "-c"
      - |
        echo hello
        echo goodbye
  second:
	image: alpine
	entrypoint: /bin/sh -c
    command:
      - |
	    echo hello
	    echo goodbye

而在 Dockerfile 中呢,是这样 Introduction to heredocs in Dockerfiles | Docker

RUN <<EOF
apt-get update
apt-get upgrade -y
apt-get install -y ...
EOF

向 Docker Compose 服务传递主机上 certbot 管理的证书

使用 Init Container 预先使用主机上的证书和私钥填充 volume,传递给以非特权身份运行的服务容器,解决有的服务在容器中自行 useradd,以非 root 身份运行应用进程,无法读取到私钥的问题。

services:
  main:
    image: openlistteam/openlist:latest
    volumes:
      - app-certs:/certs:ro
    depends_on:
      cert:
        condition: service_completed_successfully
 
  cert:
    image: alpine
    volumes:
      - /etc/letsencrypt/live/list.home.kokomi.site:/etc/letsencrypt/live/list.home.kokomi.site:ro
      - /etc/letsencrypt/archive/list.home.kokomi.site:/etc/letsencrypt/archive/list.home.kokomi.site:ro
      - app-certs:/certs
    entrypoint:
      - /bin/sh
      - -c
      - |
        cp -L /etc/letsencrypt/live/list.home.kokomi.site/fullchain.pem /certs/fullchain.pem
        cp -L /etc/letsencrypt/live/list.home.kokomi.site/privkey.pem /certs/privkey.pem
        chown 1001:1001 /certs/*.pem
        chmod 600 /certs/*.pem
 
volumes:
  app-certs:

通达信 PLAYSOUND 函数

股票软件

PLAYSOUND1 函数在每根 K 线只会触发一次,所以在日 K 上很难触发。但分时图(1 分钟线)甚至更低的 5 秒线,以及每次加载新的旧数据也会触发。

需要有实际输出,且值为 1 才能触发,例如:A:C>0,PLAYSOUND1,但 A:=C,PLAYSOUND1 就不行

不能添加到 DRAWICON 后缀上,否则不会绘制图标

通达信在分时图中取昨日最高价

股票软件

这些文章提出了一些方式:

它们在 K 线图上是有效的,但在分时图上需要 Alt + 3多显示几天分时图才能计算,而且各有各的问题

  1. SUMBARS 在多日分时图缺少前一根 K 线,会回退到今日开盘价,行为完全错误
  2. BARSLAST 需要前一根 K 线,所以多日分时图的第一天无法计算
REF(CLOSE, SUMBARS( DATE<>REF(DATE, 1), 1));
REF(CLOSE, BARSLAST(DATE<>REF(DATE, 1)) + 1);

另外我还探索出这种方法,效果与 BARSLAST 相同。

VALUEWHEN(DATE<>REF(DATE, 1), REF(CLOSE, 1));

附赠一个昨日开盘价作为副产物

VALUEWHEN(DATE<>REF(DATE, 1), CLOSE);

应对依赖前一 K 线的缺陷,可以用跨周期引用来解决。不过此方法首先需要用通达信的“盘后数据下载”把数据补充完整(目前没有公式手段能检测数据完整,仅能依靠软件打开时的提示),然后定义两个公式,分别写上:

上一收盘价:REF(CLOSE, 1);
昨收盘价:分时价格.上一收盘价#DAY;

最终版本是这样:

公式:昨收盘价
最后一日:=DATE==CONST(DATE);
最先一日:=DATE==CONST(REF(DATE,TOTALBARSCOUNT-1));
 
日首根线:=DATE<>REF(DATE,1);
图中天数:=CONST(COUNT(日首根线, 0));
每日线数:=CONST(TOTALBARSCOUNT/图中天数);
当日线数:=BARSLAST(日首根线)+1;
当日进度:=当日线数/每日线数;
 
上一日期:=分时价格.上一日期#DAY;
当前日期:=分时价格.当前日期#DAY;
数据有效:=当前日期 - 上一日期 == 1;
 
全局最高:=CONST(HHV(H, 0));
全局最低:=CONST(LLV(L, 0));
全局中间:=CONST((全局最高+全局最低)/2);
 
昨收盘价:=
  IF(最后一日, DYNAINFO(3),
  IF(数据有效, 分时价格.上一收盘价#DAY,
  IF(最先一日, DRAWNULL,
  VALUEWHEN(DATE<>REF(DATE, 1), REF(C, 1)))));
 
DRAWTEXT(NOT(数据有效)
         AND(最先一日 AND NOT(最后一日))
         AND 当日进度 == 0.45, 全局中间, '日线数据不足'),COLORYELLOW;
公式:分时价格
上一收盘价:REF(C, 1);
上一日期:REF(DATE,1);
当前日期:DATE;

这里我加了一大段逻辑就是为了避免因为忘记下载 K 线数据,系统自动回退到更旧的有的数据上,造成的结果失真。
因为分时图取不到 1MIN 线的 OPEN 值,如果还需要稳定的当日开盘价数据,还是必须下载 K 线。所以两者都需要的情况,只用跨周期引用就足够了。

关闭 Powershell 的 Script Block Logging

今日检查 Windows 时间查看器时,注意到每次启动 Powershell 7 便会在 PowerShellCore/Operational 中留下几条日志:

信息	2026-02-12 18:42:51	PowerShellCore	40961	PowerShell Console Startup
信息	2026-02-12 18:42:51	PowerShellCore	40961	PowerShell Console Startup
信息	2026-02-12 18:42:51	PowerShellCore	53504	PowerShell Named Pipe IPC
信息	2026-02-12 18:42:51	PowerShellCore	53504	PowerShell Named Pipe IPC
信息	2026-02-12 18:42:51	PowerShellCore	40962	PowerShell Console Startup
信息	2026-02-12 18:42:51	PowerShellCore	40962	PowerShell Console Startup
信息	2026-02-12 18:42:52	PowerShellCore	40961	PowerShell Console Startup
信息	2026-02-12 18:42:52	PowerShellCore	53504	PowerShell Named Pipe IPC
信息	2026-02-12 18:42:52	PowerShellCore	40962	PowerShell Console Startup
警告	2026-02-12 18:42:52	PowerShellCore	4104	Execute a Remote Command

大部分是记录:启动了一个 Session。比较让我在意的是代号为 4104Execute a Remote Command 记录,内容是 PowerShell Profile 中的 ProfileAsync 脚本。另外执行 PSFzf.psm1 模块做 fzf 初始化也会产生几条。

查了下可以关闭

对于代码中含有 InvokeMember / OpenProcess 等调用的脚本,会触发到 HasSuspiciousContent 也会产生记录。

可以在组策略关闭,也可以靠注册表:

PowerShell7 的组策略需要单独安装 about_Group_Policy_Settings - PowerShell | Microsoft Learn
Windows 组件 | Windows PowerShell | 打开 PowerShell 脚本块日志记录 配置项是旧版的。

Windows Registry Editor Version 5.00
 
[HKEY_CURRENT_USER\Software\Policies\Microsoft\PowerShellCore]
 
[HKEY_CURRENT_USER\Software\Policies\Microsoft\PowerShellCore\ModuleLogging]
"EnableModuleLogging"=dword:00000000
 
[HKEY_CURRENT_USER\Software\Policies\Microsoft\PowerShellCore\ScriptBlockLogging]
"EnableScriptBlockLogging"=dword:00000000

现在日志里就只有几条启动消息了,这几条不改代码还去不掉。