Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Tutorial

~ updateDate: 2025-01-22

Windows-Software

目录


Windows


@ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

Nodejs

Nodejs常用库

查寻npm包

Windows二进制文件(.zip)安装方式

下载解压

nodejs下载解压目录 例: D:\Develop\node\node-v18.16.1-win-x64\

配置环境

  1. 安装目录下新建两个文件

    文件名目录
    node_globalD:\Develop\node\node-v18.16.1-win-x64\node-global
    node_cacheD:\Develop\node\node-v18.16.1-win-x64\node-cache
  2. 命令设置

    #设置全局安装路径
    npm config set prefix "D:\Develop\node\node-v18.16.1-win-x64\node-global"
    
    #设置缓存路径
    npm config set cache "D:\Develop\node\node-v18.16.1-win-x64\node-cache"
    
    ##查看npm配置
    npm config list
    
  3. 环境变量

    变量名变量值
    NODE_PATH(新增)D:\Develop\node\node-v18.16.1-win-x64
    Path(追加)%NODE_PATH%
    %NODE_PATH%\node-global
  4. nrm换源管理

    #安装nrm换源管理模块 - 全局
    npm install nrm -g
    
    #查看可选的源 带*号的是当前使用的源
    nrm ls
    
    #切换到taobao源
    nrm use taobao
    

Command


#初始化 package.json
npm init

#安装模块
npm install <package>

#卸载模块
npm uninstall <package>

~ updateDate: 2025-05-29

Android-Software

目录


Android


@ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

Termux + QEMU + linux_alpine + Docker

准备工作

  1. Termux [Github][F-Droid]

  2. Alpine Linux系统镜像

    Small. Simple. Secure. Alpine Linux is a security-oriented, lightweight Linux distribution based on musl libc and busybox. (来自https://alpinelinux.org/)

    使用Alpine的原因:

    • 体积占用小,完全安装后的镜像不到1gb
    • 安装快 (废话)
    • 内存占用小,idle状态仅占用30多MB内存

    传送门:

    virtual-x86_64: alpine-virt-3.10.1-x86_64.iso(v3.10.1, OfficialSite)

详细过程

  1. 安装依赖

    在Termux中:

    
    pkg install x11-repo unstable-repo
    
    pkg install qemu-utils qemu-common qemu-system-x86_64
    
    
    
  2. 创建虚拟镜像(硬盘)

    在Termux中:

    
    qemu-img create -f qcow2 alpine.img 8G
    
    
    

    参数中8G代表创建一个最大容量为8G的镜像,可调节,最少2g以保证docker能正常安装。

  3. 下載Alpine Linux系统镜像

    在Termux中:

    
    mkdir alpine && cd $_
    wget http://dl-cdn.alpinelinux.org/alpine/v3.10/releases/x86_64/alpine-virt-3.10.1-x86_64.iso
    
    
    
  4. Alpine安装到虚拟硬盘

    在Termux中:

    
    qemu-system-x86_64 -machine q35 -m 1024 -smp cpus=2 -cpu qemu64 \
        -drive if=pflash,format=raw,read-only=on,file=$PREFIX/share/qemu/edk2-x86_64-code.fd \
        -netdev user,id=n1,hostfwd=tcp::2222-:22 -device virtio-net,netdev=n1 \
        -cdrom alpine-virt-3.10.1-x86_64.iso \
        -nographic alpine.img
    
    

    可另存为setup.sh, 赋予权限chmod +x setup.sh, 调用./setup.sh

    参数解释:

    • -hda : 启动的虚拟硬盘
    • -cdrom : 启动的光盘镜像文件(相当于用光盘安装windows)
    • -boot : 启动槽位,选d (我也不是太清楚)
    • -m : 内存大小,单位mb
    • -nographic : 无图像模式,直接在控制台输出
    • --vnc :1 : 以vnc为图像模式输出到”显示器”,并占用vnc 1端口
  5. 使用root帳號登入,啟用網路卡

    在Termux > alpine 中:

    
    setup-interfaces
    
    #Available interfaces are: eth0.
    
    #Enter '?' for help on bridges, bonding and vlans.
    
    #Which one do you want to initialize? (or '?' or 'done') [eth0]
    
    #Ip address for eth0? (or 'dhcp', 'none', '?') [dhcp]
    
    #Do you want to do any manual network configuration? [no]
    
    ifup eth0
    
    
    

    在Termux > alpine 中:

    
    #在alpine中,可使用vi编辑器,查看网络配置
    vi /etc/network/interfaces
    
    #重启网络
    /etc/init.d/networking restart
    
    #修复默认dns服务器异常 将10.0.2.3改为8.8.8.8即可
    vi /etc/resolv.conf
    
    
    
  6. 安装配置Alpine

    在Termux > alpine 中:

    
    setup-alpine
    
    
    

    详细配置:

    • Select keyboard layout: cn (选择CN键盘布局)
    • Select variant (cn)
    • Enter system hostname: demohostname (输入hostname名称,随意)
    • Which one do you want to initialize? (or '?' or 'done') [eth0]
    • Ip address for eth0? (or 'dhcp', 'none', '?') [10.0.2.15] dhcp (选dhcp)
    • Changing password for root (修改root用户密码)
    • Which timezone are you in? ('?' for list) [UTC] Asia/Shanghai (时区填Asia/Shanghai)
    • HTTP/FTP proxy URL? (e.g. 'http://proxy:8080', or 'none') [none] (代理地址,默认none)
    • Enter mirror number (1-47) or URL to add (or r/f/e/done) [f]: 14 (选择软件源,14(清华源:http://mirrors.tuna.tsinghua.edu.cn/))
    • Which SSH server? ('openssh', 'dropbear' or 'none') [openssh] (SSH服务器,选择openssh(默认))
    • Which disk(s) would you like to use? (or '?' for help or 'none') [none]sda (安装在何处,选sda)
    • How would you like to use it? ('sys', 'data', 'lvm' or '?' for help) [?] sys (安装方式,选sys)
    • WARNING: Erase the above disk(s) and continue? [y/N]: y (清除整个硬盘,y(是))

    安装完成,关闭虚拟机

    在Termux > alpine 中:

    
    #讓開機時能輸出訊息
    sed -i -E 's/(local kernel_opts)=.*/\1="console=ttyS0"/' /sbin/setup-disk
    
    poweroff
    
    
  7. 启动Alpine

    在Termux中:

    
    qemu-system-x86_64 -machine q35 -m 2048 -smp cpus=2 -cpu qemu64 \
        -drive if=pflash,format=raw,read-only=on,file=$PREFIX/share/qemu/edk2-x86_64-code.fd \
        -netdev user,id=n1,hostfwd=tcp::2222-:22,hostfwd=tcp::8081-:80 -device virtio-net,netdev=n1 \
        -nographic alpine.img
    #m是分配2GB記憶體,cpu是2核CPU,hostfwd則是把手機8081通訊埠轉發到虛擬機的80通訊埠。
    
    
    

    可另存为run.sh, 赋予权限chmod +x run.sh, 调用./run.sh

    参数解释:

    • -hda : 启动的虚拟硬盘
    • -boot : 启动槽位,选c (我也不是太清楚)
    • -m : 内存大小,单位mb
    • -netdev : 网络配置,详情请看 QEMU_Wiki:Documentation/Networking
    • -device : 设备配置(当前指向网络设备)
    • -nographic : 无图像模式,直接在控制台输出
    • --vnc :1 : 以vnc为图像模式输出到”显示器”,并占用vnc 1端口
  8. 配置SSHD

    在Termux > alpine 中:

    
    #修改sshd_config,取消注释PermitRootLogin并修改为yes
    vi /etc/ssh/sshd_config
    
    #重启sshd
    service sshd restart
    
    

    现在外部ssh就可以登录alpine的root账户了 在Termux中:

    
    ssh root@localhost -p 2222
    
    
  9. 安装Docker

    在Termux > alpine 中:

    
    #在alpine中,docker在其comminuty源里
    #添加community源,即取消注释comminuty源
    vi /etc/apk/repositories
    
    apk update  
    
    #安装docker
    apk add docker
    
    #使docker开机启动
    rc-update add docker
    
    #开启docker服务
    service docker start
    
    #后台启动
    setsid dockerd
    
    #测试
    docker info
    
    
  10. Docker换源

    在Termux > alpine 中:

    vi /etc/docker/daemon.json
    
    

    镜像仓库

    • Docker 官方中国区:https://registry.docker-cn.com
    • 网易:http://hub-mirror.c.163.com
    • 中国科技大学:https://docker.mirrors.ustc.edu.cn
    • 阿里云:https://pee6w651.mirror.aliyuncs.com
    {
        "registry-mirrors":["https://pee6w651.mirror.aliyuncs.com"]
    }
    
    

参考资料:

Linux-Software

目录


Software

Linux-Command

目录


Content

  • 端口

    
        #yum安装nmap
        yum install nmap -y
    
        #nmap IP地址,查看指定IP的对外暴露端口
        #语法格式
        nmap [Options] <target>
        
        -O   #激活探测操作
        -P0  #只进行扫描,不ping主机
        -PT  #是同TCP的ping
        -sV  #显示服务版本信息
        -sP  #ping扫描,仅发现目标主机是否存活
        -ps  #发送同步(SYN)报文
        -PU  #发送udp ping
        -PE  #强制执行直接的ICMPping
        -PB  #默认模式
        -6   #使用IPv6地址
        -v   #详细信息
        -d   #增加调试信息地输出
        -A   #使用所有高级扫描选项
        --resume  #恢复(继续上次)中止的扫描
        -P  #指定要扫描的端口,可以是一个端口,用逗号隔开多个端口,使用“-”表示端口范围
        -e  #在多网络接口Linux系统中,指定扫描使用的网络接口
        -g  #将指定的端口作为源端口进行扫描
        --ttl   #指定发送的扫描报文的生存期
        --packet-trace  #显示扫描过程中收发报文统计
        --scanflags     #设置在扫描报文中的TCP标志
        --send-eth/--send-ip  #使用原始以太网发送/构造指定IP发送
    
    
    
        #yum安装netstat
        yum install net-tools -y       
    
        #查看本机端口号被程序占用的情况
        netstat -anp
    
        #查看本机指定端口号被程序占用的情况
        netstat -anp | grep 端口号
    
    

    PS: linux-comm-netstat

  • 进程

    
        #显示全部进程的全部信息
        ps -ef 
    
        #过滤指定关键字进程信息
        ps -ef | grep 关键字
    
    
    • UID :进程所属的用户ID
    • PID :进程的进程号ID
    • PPID :进程的父ID(启动此进程的其他进程)
    • C :此进程的CPU占用率(百分比)
    • TTY :启动此进程的终端序号,如显示?,表示非终端启动
    • TIME :进程占用CPU的时间
    • CMD :进程对应的名称或启动路径或启动命令

    PS: linux-comm-ps

    
        #通过kill关闭进程
        #-9,表示强制关闭
        kill [-9] 进程ID
    
    

    PS: linux-comm-kill

  • 主机状态监控

    
        #系统资源监控
        top
    
    

    PS: linux-comm-top

    
        #磁盘信息监控
        #-h,更加人性化的单位显示
        df [-h]
    
    
    
        #iostat 可查看CPU、磁盘的相关信息
        #-x,显示更多信息
        #num1:数字,刷新间隔; num2:数字,刷新几次
        iostat [-x] [num1] [num2]
    
    
    
        #网络状态监控
        #-n,查看网络
        #DEV,表示查看网络接口
        #num1:数字,刷新间隔(不填即查看一次结束); num2:数字,查看次数(不填无限次数)
        sar -n DEV num1 num2
    
    

Debian[阿里云]

  • archive
    • Some user-provided 2.0, 2.1 and 2.2 images (Hamm, Slink, Potato)
    • 3.0_r0 to 3.0_r6 (Woody)
    • 3.1_r0 to 3.1_r8 (Sarge)
    • 4.0_r0 to 4.0_r9 (Etch)
    • 5.0.0 to 5.0.10 (Lenny)
    • 6.0.0 to 6.0.10 (Squeeze)
    • 7.0.0 to 7.11.0 (Wheezy)
    • 8.0.0 to 8.11.0 (Jessie)
    • 8.11.1 (Jessie LTS, for some arches only)
    • 9.0.0 to 9.13.0 (Stretch)
    • 10.0.0 to 10.13.0 (Buster)
    • 11.0.0 to ... (Bullseye)
    • 12.0.0 to ... (Bookworm)

VMware + Debian 11 Bullseye

准备工作

  1. VMware[果核]

  2. Debian

创建安装Debain的虚拟机

  1. 打开虚拟软件VMware -> 创建新的虚拟机

  2. 类型配置 -> 自定义(高级)

  3. 硬件兼容性 -> 默认

  4. 安装客户机操作系统 -> 稍后安装操作系统

  5. 选择客户机操作系统

    • 客户机操作系统 -> Linux `
    • 版本 -> Debian 11.x64 位
  6. 命名虚拟机名称

    • 虚拟机名称 -> 自定义
    • 虚拟机位置 -> 自定义
  7. 处理器配置 -> 自定义

  8. 内存配置 -> 自定义

  9. 网络配置 -> 使用桥接网络

  10. 选择I/O控制器类型 -> LSILogic(L)

  11. 选择磁盘类型 -> SCSI(S)

  12. 磁盘 -> 创建新虚拟磁盘

  13. 指定磁盘大小

    • 最大磁盘大小 -> 20GB (自定义)
    • 将虚拟磁盘存储为单个文件
  14. 选择磁盘存储位置 -> 自定义

  15. 配置自定义硬件

    • CD/DVD -> 使用ISO映像文件 -> 选择Debian镜像

安装Debian

  1. Debian GNU/Linux instatller menu (BISO mode) -> Graphical install

  2. Select a language -> 中文(简体)

  3. 地区 -> 中国

  4. 硬盘映射 -> 汉语

  5. 主机名 -> 自定义

  6. 配置域名 -> 留空

  7. root用户设置登录密码 -> 自定义

  8. 创建普通用户&密码 -> 自定义

  9. 磁盘分区方法 -> 向导 - 使用整个磁盘

  10. 选择需要分区的磁盘 -> 默认

  11. 磁盘分区方案 -> 将所有文件放在一个分区中(推荐新手使用)

  12. 结束分区设定并将修改写入磁盘

  13. 将改动写入磁盘 ->

  14. 扫描额外的安装介质 ->

  15. Debian仓库镜像所在的国家 -> 中国

  16. Debian仓库镜像 -> mirrors.tuna.tsinghua.edu.cn (清华)

  17. 代理 -> 留空

  18. 参加软件包流行度调查 ->

  19. 软件选择 (最小化安装仅选择基础系统与SSH即可)

    • SSH server
    • 标准系统工具
  20. 安装GRUB启动引导器 ->

  21. 安装启动引导器设备 -> /dev/sda

    #查看系统信息
    cat /etc/os-release 

    #查看所有开机自启动项
    systemctl list-unit-files --type=service | grep enabled

Debian 11 (bullseye) 国内软件源

  • 修改/etc/apt/sources.list文件

    国内常见镜像站点
    #阿里云镜像站 
    deb https://mirrors.aliyun.com/debian/ bullseye main non-free contrib
    deb-src https://mirrors.aliyun.com/debian/ bullseye main non-free contrib
    deb https://mirrors.aliyun.com/debian-security/ bullseye-security main
    deb-src https://mirrors.aliyun.com/debian-security/ bullseye-security main
    deb https://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib
    deb-src https://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib
    deb https://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib
    deb-src https://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib
    
    #清华大学镜像站
    deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free
    deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free
    deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free
    deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free
    deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free
    deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free
    deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free
    deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free
    
    #腾讯云镜像站
    deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free
    deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free
    deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free
    deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free
    deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free
    deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free
    deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free
    deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free
    
    #网易镜像站 
    deb https://mirrors.163.com/debian/ bullseye main non-free contrib
    deb-src https://mirrors.163.com/debian/ bullseye main non-free contrib
    deb https://mirrors.163.com/debian-security/ bullseye-security main
    deb-src https://mirrors.163.com/debian-security/ bullseye-security main
    deb https://mirrors.163.com/debian/ bullseye-updates main non-free contrib
    deb-src https://mirrors.163.com/debian/ bullseye-updates main non-free contrib
    deb https://mirrors.163.com/debian/ bullseye-backports main non-free contrib
    deb-src https://mirrors.163.com/debian/ bullseye-backports main non-free contrib
    
    #华为镜像站 
    deb https://mirrors.huaweicloud.com/debian/ bullseye main non-free contrib
    deb-src https://mirrors.huaweicloud.com/debian/ bullseye main non-free contrib
    deb https://mirrors.huaweicloud.com/debian-security/ bullseye-security main
    deb-src https://mirrors.huaweicloud.com/debian-security/ bullseye-security main
    deb https://mirrors.huaweicloud.com/debian/ bullseye-updates main non-free contrib
    deb-src https://mirrors.huaweicloud.com/debian/ bullseye-updates main non-free contrib
    deb https://mirrors.huaweicloud.com/debian/ bullseye-backports main non-free contrib
    deb-src https://mirrors.huaweicloud.com/debian/ bullseye-backports main non-free contrib
    
  • 修改之后再运行apt update更新索引

Debian Linux root用户启用SSH登录

  1. 要首先配置SSH服务器。

    • 安装完成后SSH服务默认开启
    • 手动启动:
      systemctl start ssh.service
      
      
  2. 切换用户

    1. 先由普通用户登录Debian服务器,su root切换到root用户
          #安装vim
          apt-get install vim
      
      
  3. 利用vim打开并修改/etc/ssh/sshd_config文件

    • PermitRootLogin设置为yes, PasswordAuthentication设置为yes即可,:wq保存退出即可
  4. 重启SSH服务器

        /etc/init.d/ssh restart
    
    

参考资料:

Docker

Docker安装

  • docker[Docker Hub]
  • tech-shrimp/docker_installer[Github] - Docker官方安装包,用来解决因国内网络无法安装使用Docker的问题

Docker换源

  • 修改/etc/docker/daemon.json文件
    {
        "registry-mirrors": [
            "https://docker.m.daocloud.io",
            "https://docker.1panel.live"
        ]
    }
    
  • 重启docker
    systemctl daemon-reload
    systemctl restart docker
    

Docker常用命令

# 从Docker Hub查找镜像
docker search [OPTIONS] TERM
# OPTIONS说明:
# --automated :只列出 automated build类型的镜像;
# --no-trunc :显示完整的镜像描述;
# -f <过滤条件>:列出收藏数不小于指定值的镜像。

#获取镜像
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]

#列出镜像
docker image ls

#镜像体积
docker system df

#删除本地镜像
docker image rm [选项] <镜像1> [<镜像2> ...]

#列出容器
docker container ls -a

#启动终止状态的容器
docker container start [container ID or NAMES]

#重新启动正在运行的容器
docker container restart [container ID or NAMES]

#获取容器的输出信息
docker container logs [container ID or NAMES]

#终止容器
docker container stop [container ID or NAMES]

#删除容器
docker container rm [container ID or NAMES]

#进入容器
docker exec -it [container ID or NAMES] bash

参考资料:

~ updateDate: 2025-02-03

docker-software

目录


Software

  • 面板类

  • 网盘类

  • 脚本类

  • 下载类

  • 影音类

  • 工具类

    • SpeedTest[GitHub] - 自托管速度测试

    • OpenSpeedTest[GitHub][Docker] - Free & Open-Source HTML5 Network Performance Estimation Tool.

    • dkTurbo[Docker] - Docker 镜像加速器

    • CFnat[GitHub][Docker] - CFnat 是为优化 Cloudflare 数据中心性能而设计的 Docker 镜像,支持多架构,通过实时筛选并连接低延迟 IP,适用于网络加速与高效流量转发场景。

      docker-compose
      • bash

        
        # 创建目录
        mkdir -p /DATA/cfnat
        
        # 进入该目录
        cd /DATA/cfnat
        
        # 上传docker-compose.yml文件
        # TODO: 上传docker-compose.yml文件
        
        # Running
        docker compose up -d
        
        # Update and Restart
        docker compose pull && docker compose up -d
        
        
      • docker-compose.yml

        # version: '3'
        
        services:
            cfnat1:
                    container_name: cfnat1
                    image: cmliu/cfnat:latest
                    environment:
                        - colo=HKG  # 筛选数据中心例如 HKG,SJC,LAX.电信/联通 推荐 SJC,LAX.移动/广电 推荐 HKG (多个数据中心用逗号隔开,留空则忽略匹配)
                        - delay=300  # 有效延迟(毫秒),超过此延迟将断开连接 (default 300)
                        - ips=6  # 指定生成IPv4还是IPv6地址 (default "4")
                        - port=443  # 转发的目标端口 (default 443) http_port: 80,8080,8880,2052,2082,2086,2095 https_port: 443,8443,2053,2083,2087,2096
                        # - tls=true  # 是否为 TLS 端口 (default true)
                        # - random=true  # 是否随机生成IP,如果为false,则从CIDR中拆分出所有IP (default true)
                        # - ipnum=10  # 提取的有效IP数量 (default 20)
                        # - num=10  # 目标负载 IP 数量 (default 10)
                        - task=33  # 并发请求最大协程数 (default 100)
                        # - code=200  # HTTP/HTTPS 响应状态码 (default 200)
                        # - domain=cloudflaremirrors.com/debian # 响应状态码检查的域名地址 (default "cloudflaremirrors.com/debian")
                    ports:
                        - "1234:1234"  # 将主机的 1234 端口映射到容器的 1234 端口
                    restart: always
                    networks:
                        - net
        
            cfnat2:
                    container_name: cfnat2
                    image: cmliu/cfnat:latest
                    environment:
                        - colo=SJC,LAX  # 筛选数据中心例如 HKG,SJC,LAX.电信/联通 推荐 SJC,LAX.移动/广电 推荐 HKG (多个数据中心用逗号隔开,留空则忽略匹配)
                        - delay=300  # 有效延迟(毫秒),超过此延迟将断开连接 (default 300)
                        - ips=6  # 指定生成IPv4还是IPv6地址 (default "4")
                        - port=443  # 转发的目标端口 (default 443) http_port: 80,8080,8880,2052,2082,2086,2095 https_port: 443,8443,2053,2083,2087,2096
                        # - tls=true  # 是否为 TLS 端口 (default true)
                        # - random=true  # 是否随机生成IP,如果为false,则从CIDR中拆分出所有IP (default true)
                        # - ipnum=10  # 提取的有效IP数量 (default 20)
                        # - num=10  # 目标负载 IP 数量 (default 10)
                        - task=34  # 并发请求最大协程数 (default 100)
                        # - code=200  # HTTP/HTTPS 响应状态码 (default 200)
                        # - domain=cloudflaremirrors.com/debian # 响应状态码检查的域名地址 (default "cloudflaremirrors.com/debian")
                    ports:
                        - "2234:1234"  # 将主机的 2234 端口映射到容器的 1234 端口
                    restart: always
                    networks:
                        - net
                    
            cfnat3:
                    container_name: cfnat3
                    image: cmliu/cfnat:latest
                    environment:
                        - colo=SIN  # 筛选数据中心例如 HKG,SJC,LAX.电信/联通 推荐 SJC,LAX.移动/广电 推荐 HKG (多个数据中心用逗号隔开,留空则忽略匹配)
                        - delay=300  # 有效延迟(毫秒),超过此延迟将断开连接 (default 300)
                        - ips=6  # 指定生成IPv4还是IPv6地址 (default "4")
                        - port=443  # 转发的目标端口 (default 443) http_port: 80,8080,8880,2052,2082,2086,2095 https_port: 443,8443,2053,2083,2087,2096
                        # - tls=true  # 是否为 TLS 端口 (default true)
                        # - random=true  # 是否随机生成IP,如果为false,则从CIDR中拆分出所有IP (default true)
                        # - ipnum=10  # 提取的有效IP数量 (default 20)
                        # - num=10  # 目标负载 IP 数量 (default 10)
                        - task=33  # 并发请求最大协程数 (default 100)
                        # - code=200  # HTTP/HTTPS 响应状态码 (default 200)
                        # - domain=cloudflaremirrors.com/debian # 响应状态码检查的域名地址 (default "cloudflaremirrors.com/debian")
                    ports:
                        - "3234:1234"  # 将主机的 3234 端口映射到容器的 1234 端口
                    restart: always
                    networks:
                        - net
        
        networks:
            net:
                enable_ipv6: true
                driver: bridge
                driver_opts:
                    com.docker.network.enable_ipv6: "true"
                ipam:
                    config:
                        - subnet: 172.23.0.0/16
                        gateway: 172.23.0.1
                        - subnet: "240e:3b1:f185:c8d0:4000::/66"
                        gateway: 240e:3b1:f185:c8d0:4000::1
        
        
        
      docker-compose CasaOS
          
      name: cfnat
      services:
          cfnat1:
              cpu_shares: 90
              command: []
              container_name: cfnat1
              deploy:
                  resources:
                      limits:
                          memory: "3768582144"
              environment:
                  colo: HKG
                  delay: "300"
                  ips: "6"
                  port: "443"
                  task: "33"
              hostname: cfnat1
              image: cmliu/cfnat:latest
              labels:
                  icon: https://cdn.jsdelivr.net/gh/cmliu/CFnat-Windows-GUI@refs/heads/master/favicon.ico
              networks:
                  net: null
              ports:
                  - mode: ingress
                  target: 1234
                  published: "1234"
                  protocol: tcp
              restart: always
          cfnat2:
              cpu_shares: 90
              command: []
              container_name: cfnat2
              deploy:
                  resources:
                      limits:
                          memory: "3768582144"
              environment:
                  colo: SJC,LAX
                  delay: "300"
                  ips: "6"
                  port: "443"
                  task: "34"
              hostname: cfnat2
              image: cmliu/cfnat:latest
              labels:
                  icon: https://cdn.jsdelivr.net/gh/cmliu/CFnat-Windows-GUI@refs/heads/master/favicon.ico
              networks:
                  net: null
              ports:
                  - mode: ingress
                  target: 1234
                  published: "2234"
                  protocol: tcp
              restart: always
          cfnat3:
              cpu_shares: 90
              command: []
              container_name: cfnat3
              deploy:
                  resources:
                      limits:
                          memory: "3768582144"
              environment:
                  colo: SIN
                  delay: "300"
                  ips: "6"
                  port: "443"
                  task: "33"
              hostname: cfnat3
              image: cmliu/cfnat:latest
              labels:
                  icon: https://cdn.jsdelivr.net/gh/cmliu/CFnat-Windows-GUI@refs/heads/master/favicon.ico
              networks:
                  net: null
              ports:
                  - mode: ingress
                  target: 1234
                  published: "3234"
                  protocol: tcp
              restart: always
      networks:
          default:
              name: cfnat_default
          net:
              name: cfnat_net
              driver: bridge
              driver_opts:
                  com.docker.network.enable_ipv6: "true"
              ipam:
                  config:
                      - subnet: 172.23.0.0/16
                      gateway: 172.23.0.1
                      - subnet: 240e:3b1:f185:c8d0:4000::/66
                      gateway: 240e:3b1:f185:c8d0:4000::1
              enable_ipv6: true
      x-casaos:
          author: self
          category: self
          hostname: ""
          icon: https://cdn.jsdelivr.net/gh/cmliu/CFnat-Windows-GUI@refs/heads/master/favicon.ico
          index: /
          is_uncontrolled: false
          port_map: ""
          scheme: http
          title:
              custom: CFnat
      
      
  • LinuxServer

  • Science

    • Clash[GitHub][Wiki] 作者删库:2023-11-03

      Clash.Meta[GitHub][Wiki][Docker]

      WEB UI Dashboard

      mihomo + metacubexd + docker compose + nginx 反代教程

      docker-compose
      • bash

        
        # 创建目录
        mkdir -p /DATA/clash
        
        # 进入该目录
        cd /DATA/clash
        
        # 上传docker-compose.yml文件
        # TODO: 上传docker-compose.yml文件
        
        # Running
        docker compose up -d
        
        # Update and Restart
        docker compose pull && docker compose up -d
        
        
      • docker-compose.yml

        # version: '3'
        
        services:
            # Mihomo Dashboard
            metacubexd:
                container_name: metacubexd
                image: ghcr.io/metacubex/metacubexd
                restart: always
                ports:
                - '80:80'
        
            # Mihomo Core
            meta:
                container_name: meta
                image: docker.io/metacubex/mihomo
                restart: always
                pid: host
                ipc: host
                network_mode: host
                cap_add:
                - ALL
                volumes:
                - ./DATA/clash:/root/.config/mihomo
                - /dev/net/tun:/dev/net/tun
        
      docker-compose CasaOS
          
      name: clash
      services:
          meta:
              cap_add:
                  - ALL
              cpu_shares: 90
              command: []
              container_name: meta
              deploy:
                  resources:
                      limits:
                          memory: "3768582144"
              hostname: meta
              image: docker.io/metacubex/mihomo:latest
              ipc: host
              labels:
                  icon: https://cdn.jsdelivr.net/gh/MetaCubeX/metacubexd@main/public/pwa-192x192.png
              network_mode: host
              pid: host
              restart: always
              volumes:
                  - type: bind
                  source: /DATA/AppData/clash/DATA/AppData/clash
                  target: /root/.config/mihomo
                  bind:
                      create_host_path: true
                  - type: bind
                  source: /dev/net/tun
                  target: /dev/net/tun
                  bind:
                      create_host_path: true
          metacubexd:
              cpu_shares: 90
              command: []
              container_name: metacubexd
              deploy:
                  resources:
                      limits:
                          memory: "3768582144"
              hostname: metacubexd
              image: ghcr.io/metacubex/metacubexd:latest
              labels:
                  icon: https://cdn.jsdelivr.net/gh/MetaCubeX/metacubexd@main/public/pwa-192x192.png
              networks:
                  default: null
              ports:
                  - mode: ingress
                  target: 80
                  published: "8888"
                  protocol: tcp
              restart: always
      networks:
          default:
              name: clash_default
      x-casaos:
          author: self
          category: self
          hostname: ""
          icon: https://cdn.jsdelivr.net/gh/MetaCubeX/metacubexd@main/public/pwa-192x192.png
          index: /
          is_uncontrolled: false
          port_map: "8888"
          scheme: http
          title:
              custom: clash
      
      
      
    • v2rayA[GitHub][Docker]

      v2rayA - Docs

      docker-cli
      • Running

        
        # Running
        docker run -d \
        --restart=always \
        --privileged \
        --network=host \
        --name v2raya \
        -e V2RAYA_ADDRESS=0.0.0.0:2021 \
        -e V2RAYA_LOG_FILE=/tmp/v2raya.log \
        -e V2RAYA_V2RAY_BIN=/usr/local/bin/v2ray \
        -v /lib/modules:/lib/modules \
        -v /etc/resolv.conf:/etc/resolv.conf \
        -v /DATA/v2raya:/etc/v2raya \
        mzz2017/v2raya
        
        
      • Update and Restart

        
        # Update and Restart
        
        # 查看容器(找v2raya容器的ID)
        docker ps -a
        
        # 停止容器v2raya运行
        docker stop ID
        
        # 删除容器v2raya
        docker rm ID
        
        # 拉取最新镜像
        docker pull mzz2017/v2raya:latest
        
        # 重复Running
        # TODO: 重复Running
        
        
      docker-compose
      • bash

        
        # 创建目录
        mkdir -p /DATA/v2raya
        
        # 进入该目录
        cd /DATA/v2raya
        
        # 上传docker-compose.yml文件
        # TODO: 上传docker-compose.yml文件
        
        # Running
        docker compose up -d
        
        # Update and Restart
        docker compose pull && docker compose up -d
        
        
      • docker-compose.yml

        # version: '3'
        
        services:
            v2raya:
                container_name: v2raya
                image: docker.io/mzz2017/v2raya
                restart: always
                network_mode: host
                privileged: true
                cap_add:
                - ALL
                environment:
                - V2RAYA_ADDRESS=0.0.0.0:2017
                - V2RAYA_LOG_FILE=/tmp/v2raya.log
                - V2RAYA_V2RAY_BIN=/usr/local/bin/v2ray
                volumes:
                - /lib/modules:/lib/modules
                - /etc/resolv.conf:/etc/resolv.conf
                - /DATA/v2raya:/etc/v2raya
        

Armbian

Armbian是轻量级的Debian系统,为ARM开发板专门发行并重新编译的Debian系统(Ubuntu派生自Debian)。

X96MaxPlus搭建Armbian

准备工作

  1. 确认X96Max+版本为X96MaxPlusQ2

    • SoC:S905X3 + 4GB 内存 + 64GB 闪存+ 1000M 网口 + 2.4G/5G 双频 WiFi + 蓝牙
  2. ophub/amlogic-s9xxx-armbian[Github] 根据型号下载系统镜像

  3. balenaEtcher - Flash OS images to SD cards & USB drives

刷入镜像至U盘

  1. 打开balenaEtcher

  2. Flash from file -> Armbian_24.8.0_amlogic_s905x3_bullseye_6.6.36_server_2024.07.01.img.gz -> Select Target

  3. 选择U盘(请备份好u盘中的重要文件)

  4. Flash -> 刷完之后 弹出u盘

boot dtb 配置

  1. 插入U盘 -> boot驱动器并打开

  2. 找到并修改uEnv.txt文件的FDT参数

    • FDT参数来源于BOOT/dtb/amlogic下以.dtb 为扩展名的文件
    • 版本为X96MaxPlusQ2对应为meson-sm1-x96-max-plus-q2.dtb
    FDT=meson-sm1-x96-max-plus-q2.dtb
    
    

盒子 U盘启动

  1. 断电,插入U盘(记得插入USB3.0口,否则可能不识别)

  2. 插进AV口按下里头的复位键,不松开。(可用牙签或者较小的螺丝刀)

  3. 上电,看到X96的封面就可以松手

控制LED显示屏

  • 登录到 Armbian 系统→输入命令:

    
    armbian-openvfd
    
    

备份/恢复 EMMC 原始系统

  1. 请从 TF/SD/USB → 启动 Armbian 系统 输入命令:

    
    armbian-ddbr
    
    
  2. 根据提示输入

    • b 备份系统
    • r 恢复系统

刷入EMMC

  1. ssh或终端中运行以下命令(以root的身份)

    
    armbian-install
    
    
  2. 据盒子版本来填入ID,例如X96MaxPlusQ2版本就填入508

    详情 -> Armbian_24.8.0_amlogic_s905x3_bullseye_6.6.36_server_2024.07.01.img.g
    
        root@armbian:~# armbian-install
        [ STEPS ] Installing Armbian to internal eMMC...
        [ STEPS ] Checking dependencies...
        [ INFO ] Dependency check completed. Proceeding installation...
        [ STEPS ] Initializing the environment...
        [ INFO ] Use mainline u-boot: [ no ]
        [ INFO ] Use ampart tool: [ yes ]
        [ INFO ] Show all devices: [ no ]
        [ INFO ] Internal eMMC : [ /dev/mmcblk2 ]
        [ STEPS ] Start selecting device...
        -----------------------------------------------------------------------------------------------------
        ID    SOC        MODEL                                         DTB
        -----------------------------------------------------------------------------------------------------
        501   s905x3     X96-Max+_100Mb                                meson-sm1-x96-max-plus-100m.dtb
        502   s905x3     X96-Max+_1GB                                  meson-sm1-x96-max-plus.dtb
        503   s905x3     X96-Max+(OverClock)                           meson-sm1-x96-max-plus-oc.dtb
        504   s905x3     X96-Max+(IP1001M)                             meson-sm1-x96-max-plus-ip1001m.dtb
        505   s905x3     X96-Max+_A100                                 meson-sm1-x96-max-plus-a100.dtb
        506   s905x3     X96-Max+_2101                                 meson-sm1-x96-max-plus-2101.dtb
        507   s905x3     X96-Max+Q1                                    meson-sm1-x96-max-plus-q1.dtb
        508   s905x3     X96-Max+Q2,X96-Air-Q1000                      meson-sm1-x96-max-plus-q2.dtb
        509   s905x3     X96-Air-1Gb                                   meson-sm1-x96-air-gbit.dtb
        510   s905x3     X96-Air,X96-Max+100W,100Mb                    meson-sm1-x96-air.dtb
        -----------------------------------------------------------------------------------------------------
        511   s905x3     Tencent-Aurora-3Pro                           meson-sm1-skyworth-lb2004-a4091.dtb
        512   s905x3     HK1-Box,Vontar-X3                             meson-sm1-hk1box-vontar-x3.dtb
        513   s905x3     HK1-Box(OverClock)                            meson-sm1-hk1box-vontar-x3-oc.dtb
        514   s905x3     H96-Max-X3,Infinity-B32                       meson-sm1-h96-max-x3.dtb
        515   s905x3     H96-Max-X3(OverClock),B32                     meson-sm1-h96-max-x3-oc.dtb
        516   s905x3     Ugoos-X3                                      meson-sm1-ugoos-x3.dtb
        517   s905x3     Ugoos-X3(OverClock)                           meson-sm1-ugoos-x3-oc.dtb
        518   s905x3     TX3-1Gb                                       meson-sm1-tx3-qz.dtb
        519   s905x3     TX3-1Gb(OverClock)                            meson-sm1-tx3-qz-oc.dtb
        520   s905x3     TX3-100Mb                                     meson-sm1-tx3-bz.dtb
        -----------------------------------------------------------------------------------------------------
        521   s905x3     TX3-100Mb(OverClock)                          meson-sm1-tx3-bz-oc.dtb
        522   s905x3     A95XF3-Air-1Gb                                meson-sm1-a95xf3-air-gbit.dtb
        523   s905x3     A95XF3-Air-100Mb                              meson-sm1-a95xf3-air.dtb
        524   s905x3     X88-Pro-X3,X99-Max+,Transpeed-X3+             meson-sm1-x88-pro-x3.dtb
        525   s905x3     Whale                                         meson-sm1-x96-max-plus.dtb
        0     Other      Customize                                     Enter-custom-dtb-name
        -----------------------------------------------------------------------------------------------------
        [ OPTIONS ] Please Input ID: 508
        
    
  3. 选择分区格式 -> ext4 (即输入1)

  4. 耐心等待拷贝文件进入EMMC ,速度由u盘/sd卡内系统的大小以及u盘/sd卡读写的速度影响

  5. 写入EMMC结束 -> 先运行 poweroff 拔下u盘(sd卡)再拔插一下电源

参考资料:

H3C NX30 Pro 折腾记录

硬件配置

处理器射频芯片交换芯片存储芯片
Filogic 820 MT7981B
12nm A53 2x1.3GHz
HWNAT 2.4G&5G 基带
MT7976CN
3天线 160MHz 2402Mbps
2天线 40MHz 576Mbps
MT7931AERAM 256MB
ROM 128MB

Telnet 连接

  • IP address: 路由地址
  • Port: 99
  • Username: H3C
  • Password: 路由登录密码

开启 SSH

# 下载 dropbear.ipk
curl -o /tmp/dropbear.ipk https://downloads.openwrt.org/releases/packages-19.07/aarch64_cortex-a53/base/dropbear_2019.78-2_aarch64_cortex-a53.ipk

# 安装 dropbear.ipk
opkg install /tmp/dropbear.ipk

# 启动
/etc/init.d/dropbear enable
/etc/init.d/dropbear start

备份系统

  • WinSCP,文件协议选择 SCP

    • IP address: 路由地址
    • Port: 22
    • Username: H3C
    • Password: 路由登录密码
  • 在终端里执行这命令,将系统备份到 tmp 路径下 backup.img 文件,备份的过程比较慢,需要 1-2 分钟。文件生成后请自行备份

    dd if=/dev/mtd5 of=/tmp/backup.img
    

刷写 uboot

  • uboot.bin 文件上传自路由器 tmp 路径下

  • 写入 uboot

    mtd write /tmp/uboot.bin FIP
    

进入 uboot (FIRMWARE UPDATE)

  • 路由器断电后,先按住背后 Reset 恢复按钮不放,再插电,等待 10s 左右松开背后 Reset
  • PC IP分配 -> 手动分配
    • IP地址: 192.168.1.2
    • 子网掩码: 255.255.255.0
    • 网关: 192.168.1.1
    • DNS: 192.168.1.1
  • 浏览器打开 192.168.1.1 就能打开 uboot 后台。

H3C NX30 Pro 禁止更新

PS: 刷回官方固件后经常一觉醒来路由器自动更新,导致路由器直接不能用,又要进uboot刷回去,很烦人

# 停止更新
/etc/init.d/onlineupdate stop
/etc/init.d/onlineupdate disable

# 检查是否还在运行
ps | grep onlineupdate

参考资料:

黑炮事件.The Black Cannon Inciden.1985

黄建新导演的处女,1985年上映,时至今日仍具有次世意义的电影《黑炮事件》。

该片用黑色幽默的表现手法,讲述荒诞不禁,却有无比真实的故事,用一个象棋子冲开重重迷杖,展现80年代中国社会的乱象。

这个让人啼笑皆非,心惊胆战的故事要从1983年的雨夜讲起。

一个男人坐车赶到邮电局,行色匆匆,险些与俩大高个撞上。

他似乎有些魂不守舍,进门时又踢到地上的雨伞,赶忙道歉,从柜台买了张电报纸后,他急急忙忙写下今晚要发的电报。

柜台里的姑娘在电报稿上用圆珠笔点了一遍,惊讶的抬起头,一种很特别的眼光审视了男人一番,此时惊雷在耳边炸醒,电报简洁明了却匪夷所思,内容是:"黑炮丢失301找赵"

见此人獐头鼠目似乎不是好人,她出于谨慎一通电话打给110,而警方接到电话后高度重视,立刻成立小组,开展专案调查。

"根据目前调查的情况看 还没发现重大问题"

接收电报的人是钱如泉,江苏苏州文物收购门市部的干部。

发送电报的人是赵书信,1956年毕业于清华大学机械工程系,县委机械总厂的工程师,49岁,年轻时信奉天主教,现务党派。

公安局对两人的信息调查一番并未发现问题,于是暂时搁置,让机械总场的领导们在不激动赵书信的情况下开展秘密调查。

大家原本觉得他呆头呆脑,不像干坏事的人,也没打算真查。可就是这个节骨眼,德国专家汉斯的再度造访,引起了警觉。

去年十月,矿物局开会决定从德国引进一套最新的WD机器,并将这套机器的安装、调试、运转全部交给机械总厂来负责。

去年年底,德国专家汉斯曾来洽谈合同,赵书信负责翻译工作,两人在相处中递结了深厚的友谊,互相视对方为自己的知己。

但签订合同前,两人曾在饭馆大吵一架,拿着一张纸条争执。他们争吵的内容不得而知,却足以让厂党委书记周玉珍警觉。

而合同签好后,回国前,汉斯送给赵书记一双鞋,并提出想看古董,周玉珍不由的产生联想。

两人是背地里达成了某种交易,或许赵书信与在文物收购部门的钱如泉合作倒卖文物给汉斯,否则怎会这么巧,在汉斯再度来中负责安装WD前发送电报。

周玉珍越想越严重,瞒着赵书信,光厂党委会就开了三次,重点讨论这次汉斯来访能不能接着让赵书信负责翻译工作。

"大家看这事儿该怎么办?"

副常长李任重原先也是工程师, 与赵书信一起工作了20多年。

了解他的为人,老实巴交一心搞科研,工作也是勤勤恳恳。

”公安局这不是也没查出什么吗?仅凭一个电报说明不了什么问题?“

厂党委书记周玉珍轻轻的叹了口气,绕了个圈子阴阳怪气地说,南方某个省的老红军竟然想把自己的女儿给香港富商做小老婆。

言外之意是不能用过去的历史来证明此人现在不会有问题,而且这事很可能涉及到古董买卖,不谨慎不行,出了事谁负责。

一谈到负责,全场鸦雀无声,毕竟一旦出事可是掉脑袋的事,厂长抽了支烟,慢吞吞的说,还是调查清楚,再让老赵翻译吧。

在此之前,可以让旅游公司会德语的导游小冯给汉斯当翻译,副厂长李任重见大局一定,却还是想为赵书信争取点信任。

觉得可以把人叫来当面聊聊,问清楚所谓的黑炮究竟是什么,可书记周玉珍认为这样是在打草惊蛇,也违背了知识分子政策。

"谁也没给他下结论,调查是为了把事情弄清楚,这是真正的信任。"
"对赵工信任,我很同意,让他回避下个专家的接触,这是对他爱护。"

厂长起身和稀泥,你安排赵书信先去维修厂工作,就当放长假。

而小冯负责汉斯的翻译工作,直到WD机器安装圆满完成。

会议结束后第二天,李任重便带着小冯去机场,将汉斯接到机械总场。

而此时赵书信还没接到调任的文件,以为还是自己担任翻译,于是晚上特意去宾馆想跟汉斯聊聊对接之后安装的工作。

但是厂保卫处的陈处长守在门口,说外国专家很累,已经睡了,而且赵书信已经被暂时调到了维修厂,明天就得收拾东西出发。

即使内心非常不解,但组织的安排要服从,赵书信选择妥协。

当天晚上面收拾好东西,乘坐厂里安排的车前往维修厂工作。

然而去了以后他傻眼了,因为这里没安排任务,他没有活儿干。

"哎,赵工啊,今儿没你活儿干。"
"那我来干什么?"
"你呀,就喝喝茶,看看报纸吧。"

小冯毕竟只是个旅游翻译,很多专业术语经常出现翻译错误,比如汉斯让工人把螺丝拧松点,等安装好后,再往紧拧点。

结果小冯翻译成往死里拧,气的他当场冲上去,亲自示范。

汉斯希望身为工程师还懂德语的赵书信能再次当自己的翻译,而小冯何常想接手这个烂摊子。

还不是组织上强行安排任务,自己本来就是个旅游翻译,为什么不直接让赵书信去翻译呢。

他去找领导诉苦,可周玉珍觉得这是个小问题,努力克服就行。

"我说专业语难翻吗? 厂里给买部专业字典,大不了几十块。嗨,你呀,买得起马,配不起鞍。"

这就是懂技术的不当领导,当领导的不懂技术,必然出乱子。

到了安装阶段,小冯当翻译越来越吃力,汉斯的火气也暴露。

只要小冯稍不如他意,他就会火冒三丈,叫嚷着让赵书信来。

一次汉斯虽带着两个工人仰卧在机器下面 让小冯拿"kugei"

这个词小冯刚学过,是子弹的意思,奇怪这时候要颗子弹干啥。

但又怕问多了汉斯发火,也便没多想,让旁边的工人去找子弹。

工地上当然没子弹,工人便跑到武装部,说外国专家需要子弹,管武器弹药的人说得有领导批的条子,他又跑去找厂长开证明。

可汉斯要子弹做什么呢?

"kugei"一词在德文里指的其实是轴承,他觉得现在这种情况简直荒诞,翻译再出问题,会影响安装的。

同样身为工程师的李任重怎会不知,只能再去找厂长要赵书信,然而厂长依旧和稀泥,让他找党委书记周玉珍一起协商解决。

"你怎么把问题看得那么简单呢?"
"可你也把问题看得太严重了。"
"好,还是慎重点好,我先走了,你好好想想吧。啊!"

周玉珍这话说了跟没说一样,总之我不同意,你也不能做主。

李任重气的肺都要炸了,心里骂娘嘴上妥协,开始暗中调查。

组织之所以怀疑赵书信,是因为汉斯送鞋以及两人在饭店争吵,既然如此,只要搞明白为什么送鞋以及争吵的原因不就好了吗。

他找到当时一同负责接待的小霞,让他大致讲一下当时的情况。

这才知道赵书信和汉斯之所以争吵是因为德方给的数据有误。

但汉斯觉得自己国家的技术没问题,态度傲慢,不愿承认错误。

不过当数据算出来确实有问题,他也很谦逊,主动找赵工认错,并且把自己随身携带了一双鞋送给赵书信,根本就不是什么交易。

李任重松了口气,又觉得奇怪,他们说的德语小霞咋能听懂呢。

"你懂德语?"
"自学了一点" 
"那你怎么不早说呀?"
"说了有什么用?连赵工作都得不到信任?我自学的又能怎么样?"

李任重想反驳,却一时语塞,是呀,小霞说的又有什么错呢?

而当汉斯得知赵书信从维修厂回来,悄悄溜出来找他聊天。

赵书信原本的研究起谱,赶紧起身泡茶,欢迎这位老友到来。

他也不清楚组织在想啥,也不想多说,毕竟自己只是个小人物,在机械总场已经工作很长时间。

赵书信很清楚这里的陈规陋习,很多东西不是他这种知识分子能决定的,大事还得领导决定。

比如德国明明有更好的机器,赵书信也跟领导反馈过自己的建议。

但没人听他的,局里还是选择WD, 因为他们根本就不懂技术,赵书信刚进了汉斯一杯,没想到副厂长李任重竟然会登门拜访。

正好做起了喝两杯,三人推杯换盏,将一番愁绪或者酒下肚。

李任重注意到棋盘上有个黑色圆盒顶棋子,顿时来了兴致。

"哎,赵工,这顶什么?"
"黑炮"
"黑炮"
"上次出差的时候丢在旅馆里了"
"结果就发了个电报"
"是的,给301房间的棋友发的,请他帮我找一下那个黑炮"

被公安机关和厂党委极为看重的黑炮事件竟然只是一颗象棋。

李任重觉得又好气又好笑,决定明天一早便提议召开厂党委会,在会上他将黑炮事件的来龙去脉说了一遍,还赵书信一个清白。

而且WD的安装越到后期越重要,不容有差池,否则损失严重。

一旦小冯再翻译错误,谁来负责?所以必须赶紧让赵书信工作。

其他同志纷纷表态,觉得不该小题大做,黑炮事件搞清楚就好。

赵书信就是典型的书呆子而已,能有什么坏心,不应该排斥他,甚至有人大胆提出党委不懂技术,WD的安装的事情应该少管。

这话厂党委书记周玉珍就听不顺耳,立刻牙尖嘴力的开始反驳:

"一个象棋子值多少钱?赵书信这个在经济上计较的人为什么能换一块多钱的电报费?去寻找一颗不值钱的棋子?"

李任重气的站起来反驳,但厂长又出来和稀泥,说了一通废话。

意思是宁可信其有不可信其无,小心为好,政治问题不容小觑,过几天WD的安装便进入尾声,那个所谓的黑炮也会邮回来。

安全起见,还是先让小冯接着翻译,至于赵书信依旧是隐瞒政策,再过几年李任重要升厂长,这期间不能出事,否则会影响仕途。

这句话无疑是在敲山震虎,让本来还想说点什么呢的他变成哑巴,就跟之前的会一样,结果依旧是招书信,不能参与翻译工作。

而几天后WD的安装工作结束,那颗"黑炮"也邮回了机械总场。

周玉珍提前将之截胡拿到会议室,觉得这里面一定是个小古董。

没想到里面只是个黑炮象棋,她脑子里的阴谋论就像是一场笑话,而更严重的还是WD。

安装运转半个月后,就像害了疾病发抖,而且越抖越厉害,几乎要立刻散架摊下来,只能停机成为废铁。

局领导立刻下令检查原因,这个任务当然落在机械总场的头上。

他们将合同、安装记录、矿场各班的开机记录汇总起来大检查。

摆脱嫌疑的赵书信作为总工程师,开始一字一句的检查,找问题。

领导们都焦急的在会议室里夺圈子,抽烟喝茶,心急如焚。

"是不是德方的责任?"
"不是,看来是翻译上出现了问题。"

会议室一下子寂静无声,领导干部们都在寻思接下来该怎么办。

损失几十万的原因究竟在哪里这笔账应该挂在谁的名下,赵书信忐忑不停的缩着脑袋坐着,仿佛他是罪魁祸首似的。

但谁才是或跟别人不清楚,伟大的周玉珍同志怎能不清楚?

可她心里还是有个疑问,为什么要花一块钱找一个破棋子?

赵书信看着领导突然撩开重要的WD来追问他打的电报,似乎也明白了他那份电报和WD的损坏的责任似乎有什么联系。

"买一副新象棋也要不了多少钱啊"
"是啊,以后我再也不下棋了"

这是黄建星导演1985年上映的处女座《黑炮事件》,题材之大胆,讽刺之犀利,即使放到现在,也让人遭受惊叹,而这部电影在当年不光上映,还拿下了第六届中国电影金鸡奖。

40年前可以拍的内容现在却不能拍现实,同样是场黑色幽默。

在80年代中期以张艺谋、陈凯歌等为代表的第五代导演,携带着有关黄土地的寻根民族乡土主题横空出世。

黄健兴和《黑炮事件》却另辟蹊径,聚焦于工业区和城市,在黑色幽默外衣下笼罩的是对传统文化的反思和批判,以及对现实社会知识分子处境的心理尴尬、荒诞全面展示。

作为中国知识分子的一个典型缩影,赵书信可爱可怜又可悲,各种反差构成了他作为知识分子暧昧和浮动的能指意义。

"赵书信"成为80年代知识分子尴尬无奈境遇的一个符号。

在历次政治运动中,知识分子群体总是波及最大的重灾区。

特别是十年动乱时期,他们遭受了极大的禁锢摧残扭曲。

即便在波乱反正的新时期,极"左"思想的余毒仍根深蒂固。

在现实社会体制的磨练下,他们逐渐依来顺受,甚至麻木。

赵书信的性格悲剧不仅属于个人、时代,还属于民族和历史。

而李任重这一人物如同一把尖刀,刨开了当时的社会问题。

他作为懂技术的工程师担任副厂长,成为领导班子里的一员。

每天却要疲于应付流于形式的文山会海,权力则被屡屡钳制。

厂党委书记周玉珍顽固不化,厂长则和稀泥,力求无功无过。

李任重想半件实事那么难,WD安装的问题又得跟着背锅。

这是当时也是现在的普遍问题,领导不懂技术,胡乱做决定,懂技术的当不了领导,即使当了,也会受到排挤没有实权。

"不用专家、瞎指挥、内耗高、低效率"依然存在于各个行业。

不过黄建新导演采用了黑色幽默的方式,加深了这种荒诞性,一堆正儿八经的领导干部严肃的对待一件无足轻重的事情。

结果造成WD项目损失达几十万,这事越荒诞,便越讽刺。

信任重视知识分子才是发展社会生产力,实现现代化之所依。

但我觉得这还不是最可怕的,最可怕的是思维和行为的固化。

一个像棋子确实不值钱,但丢了就找回来,又有什么奇怪的呢?

究竟是知识分子太天真,还是那群搞政治的人太不天真呢。

当年的黄建新导演找不到答案,现在的黄建新不想找答案。

当年的知识分子看不懂,现在的知识分子看懂了却不敢说。

以后再也不下棋不是解决方式,却也只能成为解决方式好了。

我们都无法成为大人.ボクたちはみんな大人になれなかった.2021

当一个日本女孩莫名问你是否认出她的样子,你是该坦诚不止,还是谎称记得她的名字。

"你认得我的长相吗?"
"我已经出了六张DVD"

尴尬的伊藤没有多说一字,他只是带着女孩一同离开,离开那个看似热闹实质人均冷漠的位置。

我们每天只有二十四小时,却有太多未完成的事,以至于我们总是尽力用最快捷的方式处理最复杂的事。

就如我们的情感,过去爱情如盛宴,你总是舍不得浪费,情愿花时间细嚼慢咽。

如今爱情如快餐,你只关注食材是否新鲜,卖相是否鲜艳,而后便是一通狼吞虎咽落的一身狼藉,却只为省下那一分时间。

就如伊藤和女孩,今夜之前仍是陌生,今夜之后却成情人。

远处东京铁塔亮着灯,那一抹霓虹却吸引了亲吻中的两人,她拿出相机想要拍下,但就在她按下快门的那瞬间,铁塔的灯熄灭了,她也难过了。

她问伊藤,你小时候有想过变成现在的样子吗?

伊藤沉默了,他不知道该如何回答这个莫名其妙的问题。

如我们不知道为什么千百次期待成为的人,最后却变得无比陌生,陌生到当我们遇到了期待成为的他们时,我们却无法激起自己心里曾有过同样的人。

一开始我们都在追逐一盏灯,而后变成期待有人为自己留一盏灯,到最后我们再也找不到那盏灯,也找不到心里那扇门。

午夜十分没有入睡的伊藤,就如习惯晚睡的我们,尽管深知熬夜伤神,但孤独而又空虚的我们,却更恐惧双眼闭合间便是弹指一生。

此时伊藤的手机响起那意图不明的铃声,爱理不理的他却形象的表现出我们对铃声的又爱又恨。爱是因为铃声告诉我们被需要,恨是因为消息显示的从来只是毫无感情瓜葛的寻找。

点开消息,那是来自于前任的好友申请,当过去的人蹦出回忆,原因或许跟同学聚会相差无几,怀念是借口,展现是缘由,纵使声情并茂,却难掩目的与需求。

伊藤一夜夜翻看着他的日子,就如一夜夜的诵读着他的过去,曾经的他总是标新立异,曾经的他总是到处猎奇,磨平棱角的成熟被她睥睨,循序渐进的婚姻沦为她眼里平庸的证据。

而今,曾经愤世嫉俗的他,却同样遭遇现实的洗涤,洗掉了尖刺,也洗掉了歧义。

就如我们曾经一再希望成为特别的自己,而今却偏偏沦为人群中同样普通的生存工具与旁人无异。

或许雨天总会衬托别离,当伊藤回到家,女友却早早的等在这里。

"你曾打算跟我结婚吗?"

他没有说出一字一句,脸上却明显流露出一丝厌气。

"一切都是谎言吧?"
"把我的时间还给我"

情人要伊藤归还时间的损失,但又有谁归还伊藤爱的流失。

或许我们的心曾满载,一段感情是一盆盆栽,一开始我们用心灌溉,而后盆栽枯萎爱却渐衰,盆栽不断更迭而我们却早已用尽最后一点爱。

情人总怪我们糟蹋盆栽,但谁又明白我们内心干涸的无奈。

2011的日本布满阴霾,有人选择分开却有更多人携手未来,不是越难越爱,而是你无法知道,明天和意外到底谁先来。

藤本应在这天向丈人承诺与女友的将来,但灾难后的忙碌却让他不得不提前离开,追出门外的女友问他。

"你结婚后也会这样吗?"
"不,我现在真的很忙,是不可能马上结婚的"
"你都这样拖延下"
"抱歉抱歉,我知道了我知道了,我们明天再三个人一起吃午餐,我会去预约其他餐厅"
"明天我一定会好好表现"
"好..好.."

或许两人都没有想明白,如果爱,他会恐惧你的漫长等待;如果爱,他不会吝啬承诺让你的家人释怀。

忙碌是缘由,但忙碌不应成为拖延的借口。

如果当时两人明智分开,或许谁都无需经历长久难耐。

女友的离开没有让伊藤产生一丝不快。

此刻的他却怀念起那个给予他明信片的女孩。

与女孩的相遇源自于一份登有交友信息的报纸 ,伊奴卡拉是她使用的名字,就如我们常用歌名作为我们的代名词,我们总期待能通过歌名找到世上另一个自己的样子 ,也期待有人能读懂歌名背后的意思。

伊藤主动写信给了这位特别的女子,而女子的回信,开始了这段关于青春的故事。

或许年少时的我们依然带着不谙世事的童稚,缺乏金钱没有未知,唯有全心的爱意,肆意挥霍的用时 ,所以当时的我们更易遇到灵魂契合的爱人,也更容易看到爱情应有的样子 。

书信往来的两人 ,没有成年人的务实,就如那个年纪下的我们,天马行空的说着 ,期待又极致无聊的讲述周遭。

距离总如此,两人礼貌相处便只能站在需要礼貌维持的位置,两人肆无忌惮才能莽撞撕开隔在彼此面前的那层纸 ,越走越近的两人相约走进现实。

一人一个记认的袋子,而后便是一场四目相对关于羞涩与陌生的对峙。

女孩的名字叫香织,与她的笔名伊奴卡拉一样,香织的心里总是装着青春的天马行空和故作深邃的说辞 。

她问伊藤:

"你的人生过的如何?"
"高中时,我每天都会在月历上画一个叉,记录自己今天也没有犯罪,很奇怪吧?"
"我觉的很有趣"

成熟让我们失去了表露幼稚的心思,偏偏我们又最期待有人欣赏自己犯傻时的样子 ,见面后的两人靠着一根电话线维持。

过去我们没有微信没有手机,一件乐事需要存进心里,现在到处无线,人均手提,分享只在意兴之际。

时代改变了情感传递的速率,却偏偏快进了一段感情变化的时间 ,又拉远两人之间的距离 。

电话线中的两人相约酒店相见,那个满布星光的房间,成了两人水乳交融相互慰藉的据点,他们在房里互诉衷肠度过漫长岁月 ,这家角落的酒店记载着这对情侣九年的便迁。

香织总是向往未知的世界 。

她会在某夜,走在街头临时起看看印度的昼夜 ,而后便会消失于伊藤的身边,只在长久之后寄回一张明信片 。

她会在某天清晨,租上小车拉上伊藤让他把工作放到一边,只为了离开城市感受一次有你有我的瞬间 。

她告诉伊藤:

"宫泽贤治...直到死前都没有到远方过,他明明有大半的人生都在东北的乡下农村度过,却在银河旅行过,不觉得很疯狂吗?"
"重点不是去哪里,而是跟谁去"

或许旅途中的美景从来不是我们的目的 ,我们远行的原因或者只是希望身边那个人是你,年岁带走了两人青春的气息 ,在他们脸上逐渐刻画岁月的痕迹 。

伊藤和香织走了一段长久的距离,自然希望与她转一个弯继续走下去 ,只是当伊藤说出心中所想,香织却告诉他。

"我们要不要一起住?"
"什么?"
"我也会跟你的父母打声招呼"
"这个嘛..."
"总觉得..."
"真的很普通"

他们在合适的时间相遇对方 ,最后却在适合转折的时间失散。

第二天香织与他用着最普通的方式道别,却再也没有像过往分别一样如常再见。

"下次会带CD过来"

离开的初恋总如离开的凶手 ,他在我们心里插进一把刀之后却再也没有拔出便逃走 。

直到经年之后,下一个她告诉我们身上仍有疼痛的源头 ,但习惯与尖刀共处的我们却不再介意那个流血的伤口。

女孩告诉一个小时前吻在一起的伊藤:

"这里...是我的工作房"
"什么工作"
"我跟客人...在这里发生关系"

2000年的某个晚上他们吻在了一起,2000年的某个白天他们失散于人海里 。

没有千丝万缕的情感问题 ,只是广阔浩瀚的人生让彼此生活分崩离析。

他们相遇在那家热闹非凡却没有生气的酒吧里。

伊藤是过客,小苏是侍应。就如路人与明星的相遇,陌生才最符合剧情,一起便是奇遇 。

若不是伊藤的灰埋散落一地,若不是小苏的眼里一片死寂 ,或许谁都不会停在各自心里。

两人的相识是在那不满失落烟蒂的空地。

小苏问出一句:

"我很擅长找到绝望的人"

就如女生更易看出哪个女生表里如一,绝望的人更易发现别人绝望的踪迹 。

从那天起,两人便徘徊在各自生活里,直到那个送小苏回家的夜里。

放慢脚步的两人玩起了跳砖游戏,你踩着空格,我追随着脚印,明明童真却暧昧不已,而后重叠的两人相拥一起也吻在一起 。

来到小苏家的两人本应有着理所当然的后续,但此时的电话却带来一段插曲 ,小苏告诉伊藤。

"这里...是我的工作房"
"什么工作"
"我跟客人...在这里发生关系"
"等工作结束后...我再打给你"

就如我们总用"再联系"结束这次相遇,而后消失在人海里 。

当小苏说出那一句 ,她便不敢期待两人能再聚。

直到完事的她看到楼下静待的伊藤,惊喜的她便冲出门外与伊藤抱在一起 ,惊的是有人把自己的话放在心里 ,喜的是自己没被嫌弃。

"我什么都没有,就算每天都是这样,好像也不讨厌"

或许当你一无所有,也并没有什么值得被厌弃。

直到某个早晨,新闻传出小苏老板被捕的消息 ,担心小苏的伊藤不断联系。

但就如那沉默不语的手机 ,小苏的身影连同那暧昧的房间一同消失无声无息 。

伊藤没有言语没有情绪,或许就跟众多普通的成年人一样 ,不悲不喜才更符合普通的这个群体 ,他慢慢明白香织那句普通的意义 ,或许成长总会让你在旅途中丢失一些属于自己的怪异 。

2020的东京街头寂静无声街上空无一人,疫情改变了每个人的人生 ,也让孤独的人更孤独 ,陌生的人更陌生 。

走在大街的伊藤遇到了曾经遗落的故人,看着如今落魄的他,伊藤不禁想问 。

"你为什么把酒吧关了?"
"我受不了跟交情不好的人装作像朋友般聊天,客人想回去就回去,但我无处可逃"

我们每个人都总入小丑一般,明明妆后一脸泪容,妆前却从来只能挂着一成不变的笑容 ,僵硬疲惫你亦只能苦笑一通。

有人坚持我们夸他成熟,有人不屑我们却笑他幼稚。

浩瀚银河,每颗都是闪耀的明星 。

慢慢人海,却不纵容异样的光明。

两人一路酒醉一路同行 ,伊藤话语热落却难掩成人冰冷的内心 ,故人忍不住骂出一句。

"你真的变成了龌龊的大人呢"

曾经故人总说世上的人,百分之70是垃圾 ,百分之30是人渣 ,但伊藤总认为世上的好人至少还有百分之一,故人却告诉他 。

"那些人并不是好人,只是一群不谙世事的人"

善人做恶,恶人行善, 从不稀奇。这世上从没有绝对的好人也没有绝对的正义 ,你相信绝对的好坏是因为现实仍未褪去你不谙世事的外衣。

走到路口,故人告诉伊藤。

"真希望我没有遇到你"
"我...倒是很庆幸能遇到你"

而后两人各自分别,一个坐进车里 ,一个独步街头 。

就如与香织分别的那一天 ,同样没说再见 ,或许也无法再见。

计程车经过一个个似曾相识的街头 ,如倒带般将回忆回放于心头 ,难以平静的伊藤下了车。

走到那与香织分别的路口 ,一走到那如回忆录般的酒店门口 。

"在这里的时候就感受不到时间的流逝"
"像只有这里的时间停下来了"
"明明大家都慢慢长大,就只有我们保持不变"

那一句句熟悉的话 ,那一个个遗落的人,仿似不断的碰撞交织陈述着伊藤的半生 。

"你结婚后也会是这样吗?"
"把我的时间还给我"
"恭喜你出狱了"
"我什么都没有"
"就算每天都是这样,好像也不讨厌"
"快过来"
"你的身体...也充满看尚未成佛的词语"
"我在高兴时,会觉得很难过"
"你就永远窝在这里吧"
"我们要结婚了"
"想要变成现在的自己吗?"

为什么电影叫《我们都无法成为大人》 ?

因为纵然我们努力向着成熟与普通紧靠,

纵然年岁在我们脸上留下一道又一道疤痕 ,

我们却始终无法并且心中尚存的一丝稚嫩 ,

我们仍会幻想重于某个时刻某个地点某个人,

我们仍会相信谁的清纯谁的美好谁的童真会伴其一生 ,

我们都在往前奔跑 ,

但我们都想过在过去的某时某刻停靠,

因为那里曾遗落一颗糖 ,

我们一直念念不忘 。

"WAVE袋子"
"WAVE袋子"
"你是伊努卡拉小姐?"
"听到你这么叫我,觉得有点害羞"
"真的...很普通"

Publish a Website with mdBook and GitHub Pages

mdbook init

mdbook[Github][文档]

$ mkdir mdbook-site
$ cd mdbook-site
$ mdbook init

Do you want a .gitignore to be created? (y/n)
y
What title would you like to give the book?
my-book
2022-05-21 17:50:25 [INFO] (mdbook::book::init): Creating a new book with stub content

All done, no errors...
$ tree -a
.
├── .gitignore
├── book
├── book.toml
└── src
    ├── SUMMARY.md
    └── chapter_1.md

Add GitHub Workflow

$ mkdir .github
$ cd .github
$ mkdir workflows
$ cd workflows
$ vim PublishMySite.yml
name: PublishMySite

# Controls when the action will run. 
on:
  # Triggers the workflow on push or pull request events but only for the main branch
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  # This workflow contains a single job called "build"
  build:
    # The type of runner that the job will run on
    runs-on: ubuntu-latest

    # Steps represent a sequence of tasks that will be executed as part of the job
    steps:
      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
      - uses: actions/checkout@v2

      # Build markdown files to a static site.
      - name: Setup mdBook
        uses: peaceiris/actions-mdbook@v1
        with:
          mdbook-version: "latest"
      - run: mdbook build . --dest-dir ./book # --dest-dir is relative to <dir>
      
      # Publish the static site to gh-pages branch.
      - name: Deploy
        uses: peaceiris/actions-gh-pages@v3
        with:
          github_token: ${{ secrets.GITHUB_TOKEN}}
          publish_dir: ./book
          publish_branch: gh-pages
$ tree -a
.
├── .github
│   └── workflows
│       └── PublishMySite.yml
├── .gitignore
├── book.toml
└── src
    ├── SUMMARY.md
    └── chapter_1.md

Git and GitHub

git init

$ git init
$ git add .
$ git commit -m "init"

GitHub - New Repository

GitHub > New Repository

GitHub > Repository > Settings > Actions > General >

  • Actions permissions: Allow all actions and reusable workflows
  • Workflow permissions: Read and write permissions
  • Click Save
$ git remote add origin git@github.com:Yang-Xijie/mdbook-site.git # change to your github repo
$ git branch -M main
$ git push -u origin main

GitHub > Repository > Settings > Pages > Source > gh-pages > Click Save