2026年3月

我发现在职场里当牛马久了,思维就会被固化,死守着自己的一亩三分地,希望自己不要失业,希望老板可以发发善心,多发点奖金。

当一场变革来临,我们希望不要被 AI 替代,不要因此而失业。我们会用 AI 帮自己多写点代码,让自己能成一个高产的牛马。

更可怕的是,当我清楚上述的道理,我还是会有上述的想法,希望自己不要被 AI 替代,不要失业。拿 AI 除了多写点代码,不知道做什么

原帖地址:去攀枝花玩碰到个特别喜欢的女生,好不容易加上微信,请大家祝福我一下了

  • 接原帖,这几天都在跟她聊天,她一直说她的情况有些复杂,但是还没想跟我说,昨天晚上(星期三)我们聊天,可能她也是下决心了,我们打电话的时候跟我说了
  1. 她结过婚,然后离婚了。
    1.1 说实话这点我感觉无所谓吧,现在有的人谈恋爱同居麻的跟结婚也没啥区别了。
    1.2 再一个我是这么想的,我喜欢的是现在的她,那么她也是由以前的她的经历慢慢变成这样子的,所以这点其实还好。

  2. 她十几岁的时候就生娃了,并且是个男娃,现在都 8 岁了,不过孩子不是她在带,偶尔要见一下。
    2.1 不是,这么复杂吗?其实她前面说的时候我都已经要接受了,一开始没说孩子的性别,我在想是女孩子?女孩子的话也不是很大的影响,后面结束谈话以后我就问“是男孩女孩?”她说是男孩,这就很难受了,完全没法接受了,像多尔衮都搞不定的事,兄弟哪能搞定

  • 主要就是这两点问题,其他的什么经济啊,家里面不是很富裕啊这些,都不是啥大问题吧。
  • 唉,有缘无分吧,这个我是真喜欢,不过确实有硬性的没法接受的原因。
  • 她怎么说呢,长得是我喜欢的类型,是可爱型的然后就感觉有种很坚韧的感觉,所以我真的 get 到了这股美,好家伙原来这股韧性是这么来的,人是没有任何问题的我觉得,还廷为别人着想,性格也好,在此也祝她幸福,可惜我搞不定。
  • 有兄弟说我编故事,wtf ,我要是编故事我把 b 电脑塞我屁股里

ARC 浏览器现在除了更新 chromium 内核,功能都不怎么更新了。遇到些问题有几个版本也没修复。
大家有啥替换的对象么?
试了下 Firefox 内核的 Zen Browser ,跟 ARC 是挺像的,就是挺多网页现在都不适配火狐了,小问题太多了,有点忍不了。

需要竖版的标签栏和左上角的常驻收藏的功能

Java NIO零拷贝

在 Java NIO 中的通道(Channel)就相当于操作系统的内核空间(kernel space)的缓冲区,而缓冲区(Buffer)对应的相当于操作系统的用户空间(user space)中的用户缓冲区(user buffer)。

  • 通道(Channel)是全双工的(双向传输),它既可能是读缓冲区(read buffer),也可能是网络缓冲区(socket buffer)。
  • 缓冲区(Buffer)分为堆内存(HeapBuffer)和堆外内存(DirectBuffer),这是通过 malloc() 分配出来的用户态内存。

堆外内存(DirectBuffer)在使用后需要应用程序手动回收,而堆内存(HeapBuffer)的数据在 GC 时可能会被自动回收。因此,在使用 HeapBuffer 读写数据时,为了避免缓冲区数据因为 GC 而丢失,NIO 会先把 HeapBuffer 内部的数据拷贝到一个临时的 DirectBuffer 中的本地内存(native memory),这个拷贝涉及到 sun.misc.Unsafe.copyMemory() 的调用,背后的实现原理与 memcpy() 类似。 最后,将临时生成的 DirectBuffer 内部的数据的内存地址传给 I/O 调用函数,这样就避免了再去访问 Java 对象处理 I/O 读写。

内存映射文件

内存映射文件 I/O 是一种读和写文件数据的方法,它可以比常规的基于流或者基于通道的 I/O 快得多。

向内存映射文件写入可能是危险的,只是改变数组的单个元素这样的简单操作,就可能会直接修改磁盘上的文件。修改数据与将数据保存到磁盘是没有分开的。

下面代码行将文件的前 1024 个字节映射到内存中,map() 方法返回一个 MappedByteBuffer,它是 ByteBuffer 的子类。因此,可以像使用其他任何 ByteBuffer 一样使用新映射的缓冲区,操作系统会在需要时负责执行映射。

MappedByteBuffer mbb = fc.map(FileChannel.MapMode.READ_WRITE, 0, 1024);

MappedByteBuffer

MappedByteBuffer 是 NIO 基于内存映射(mmap这种零拷贝方式的提供的一种实现,可以减少一次数据拷贝的过程。它继承自 ByteBuffer。FileChannel 定义了一个 map() 方法,它可以把一个文件从 position 位置开始的 size 大小的区域映射为内存映像文件。抽象方法 map() 方法在 FileChannel 中的定义如下:

public abstract MappedByteBuffer map(MapMode mode, long position, long size)
        throws IOException;
  • mode:限定内存映射区域(MappedByteBuffer)对内存映像文件的访问模式,包括只可读(READ_ONLY)、可读可写(READ_WRITE)和写时拷贝(PRIVATE)三种模式。
  • position:文件映射的起始地址,对应内存映射区域(MappedByteBuffer)的首地址。
  • size:文件映射的字节长度,从 position 往后的字节数,对应内存映射区域(MappedByteBuffer)的大小。

MappedByteBuffer 相比 ByteBuffer 新增了 fore()、load() 和 isLoad() 三个重要的方法:

  • fore():对于处于 READ_WRITE 模式下的缓冲区,把对缓冲区内容的修改强制刷新到本地文件。
  • load():将缓冲区的内容载入物理内存中,并返回这个缓冲区的引用。
  • isLoaded():如果缓冲区的内容在物理内存中,则返回 true,否则返回 false。

下面给出一个利用 MappedByteBuffer 对文件进行读写的使用示例:

private final static String CONTENT = "Zero copy implemented by MappedByteBuffer";
private final static String FILE_NAME = "/mmap.txt";
private final static String CHARSET = "UTF-8";
  • 写文件数据:打开文件通道 fileChannel 并提供读权限、写权限和数据清空权限,通过 fileChannel 映射到一个可写的内存缓冲区 mappedByteBuffer,将目标数据写入 mappedByteBuffer,通过 force() 方法把缓冲区更改的内容强制写入本地文件。
@Test
public void writeToFileByMappedByteBuffer() {
    Path path = Paths.get(getClass().getResource(FILE_NAME).getPath());
    byte[] bytes = CONTENT.getBytes(Charset.forName(CHARSET));
    try (FileChannel fileChannel = FileChannel.open(path, StandardOpenOption.READ,
            StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING)) {
        MappedByteBuffer mappedByteBuffer = fileChannel.map(READ_WRITE, 0, bytes.length);
        if (mappedByteBuffer != null) {
            mappedByteBuffer.put(bytes);
            mappedByteBuffer.force();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}
  • 读文件数据:打开文件通道 fileChannel 并提供只读权限,通过 fileChannel 映射到一个只可读的内存缓冲区 mappedByteBuffer,读取 mappedByteBuffer 中的字节数组即可得到文件数据。
@Test
public void readFromFileByMappedByteBuffer() {
    Path path = Paths.get(getClass().getResource(FILE_NAME).getPath());
    int length = CONTENT.getBytes(Charset.forName(CHARSET)).length;
    try (FileChannel fileChannel = FileChannel.open(path, StandardOpenOption.READ)) {
        MappedByteBuffer mappedByteBuffer = fileChannel.map(READ_ONLY, 0, length);
        if (mappedByteBuffer != null) {
            byte[] bytes = new byte[length];
            mappedByteBuffer.get(bytes);
            String content = new String(bytes, StandardCharsets.UTF_8);
            assertEquals(content, "Zero copy implemented by MappedByteBuffer");
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

下面介绍 map() 方法的底层实现原理map() 方法是 java.nio.channels.FileChannel 的抽象方法,由子类 sun.nio.ch.FileChannelImpl.java 实现,下面是和内存映射相关的核心代码:

public MappedByteBuffer map(MapMode mode, long position, long size) throws IOException {
    int pagePosition = (int)(position % allocationGranularity);
    long mapPosition = position - pagePosition;
    long mapSize = size + pagePosition;
    try {
        addr = map0(imode, mapPosition, mapSize);
    } catch (OutOfMemoryError x) {
        System.gc();
        try {
            Thread.sleep(100);
        } catch (InterruptedException y) {
            Thread.currentThread().interrupt();
        }
        try {
            addr = map0(imode, mapPosition, mapSize);
        } catch (OutOfMemoryError y) {
            throw new IOException("Map failed", y);
        }
    }

    int isize = (int)size;
    Unmapper um = new Unmapper(addr, mapSize, isize, mfd);
    if ((!writable) || (imode == MAP_RO)) {
        return Util.newMappedByteBufferR(isize, addr + pagePosition, mfd, um);
    } else {
        return Util.newMappedByteBuffer(isize, addr + pagePosition, mfd, um);
    }
}

map() 方法通过本地方法 map0() 为文件分配一块虚拟内存,作为它的内存映射区域,然后返回这块内存映射区域的起始地址。

  • 文件映射需要在 Java 堆中创建一个 MappedByteBuffer 的实例。如果第一次文件映射导致 OOM,则手动触发垃圾回收,休眠 100ms 后再尝试映射,如果失败则抛出异常。
  • 通过 Util 的 newMappedByteBuffer (可读可写)方法或者 newMappedByteBufferR(仅读) 方法方法反射创建一个 DirectByteBuffer 实例,其中 DirectByteBuffer 是 MappedByteBuffer 的子类。

map() 方法返回的是内存映射区域的起始地址,通过(起始地址 + 偏移量)就可以获取指定内存的数据。这样一定程度上替代了 read()write() 方法,底层直接采用 sun.misc.Unsafe类的 getByte()putByte() 方法对数据进行读写。

private native long map0(int prot, long position, long mapSize) throws IOException;

上面是本地方法(native method)map0 的定义,它通过 JNI(Java Native Interface)调用底层 C 的实现,这个 native 函数(Java_sun_nio_ch_FileChannelImpl_map0)的实现位于 JDK 源码包下的 native/sun/nio/ch/FileChannelImpl.c这个源文件里面。

JNIEXPORT jlong JNICALL
Java_sun_nio_ch_FileChannelImpl_map0(JNIEnv *env, jobject this,
                                     jint prot, jlong off, jlong len)
{
    void *mapAddress = 0;
    jobject fdo = (*env)->GetObjectField(env, this, chan_fd);
    jint fd = fdval(env, fdo);
    int protections = 0;
    int flags = 0;

    if (prot == sun_nio_ch_FileChannelImpl_MAP_RO) {
        protections = PROT_READ;
        flags = MAP_SHARED;
    } else if (prot == sun_nio_ch_FileChannelImpl_MAP_RW) {
        protections = PROT_WRITE | PROT_READ;
        flags = MAP_SHARED;
    } else if (prot == sun_nio_ch_FileChannelImpl_MAP_PV) {
        protections =  PROT_WRITE | PROT_READ;
        flags = MAP_PRIVATE;
    }

    mapAddress = mmap64(
        0,                    /* Let OS decide location */
        len,                  /* Number of bytes to map */
        protections,          /* File permissions */
        flags,                /* Changes are shared */
        fd,                   /* File descriptor of mapped file */
        off);                 /* Offset into file */

    if (mapAddress == MAP_FAILED) {
        if (errno == ENOMEM) {
            JNU_ThrowOutOfMemoryError(env, "Map failed");
            return IOS_THROWN;
        }
        return handle(env, -1, "Map failed");
    }

    return ((jlong) (unsigned long) mapAddress);
}

可以看出 map0() 函数最终是通过 mmap64() 这个函数对 Linux 底层内核发出内存映射的调用, mmap64() 函数的原型如下:

#include <sys/mman.h>

void *mmap64(void *addr, size_t len, int prot, int flags, int fd, off64_t offset);

下面详细介绍一下 mmap64() 函数各个参数的含义以及参数可选值:

  • addr:文件在用户进程空间的内存映射区中的起始地址,是一个建议的参数,通常可设置为 0 或 NULL,此时由内核去决定真实的起始地址。当 + flags 为 MAP_FIXED 时,addr 就是一个必选的参数,即需要提供一个存在的地址。
  • len:文件需要进行内存映射的字节长度
  • prot :控制用户进程对内存映射区的访问权限

    • PROT_READ:读权限
    • PROT_WRITE:写权限
    • PROT_EXEC:执行权限
    • PROT_NONE:无权限
  • flags:控制内存映射区的修改是否被多个进程共享

    • MAP_PRIVATE:对内存映射区数据的修改不会反映到真正的文件,数据修改发生时采用写时复制机制
    • MAP_SHARED:对内存映射区的修改会同步到真正的文件,修改对共享此内存映射区的进程是可见的
    • MAP_FIXED:不建议使用,这种模式下 addr 参数指定的必须的提供一个存在的 addr 参数
  • fd:文件描述符。每次 map 操作会导致文件的引用计数加 1,每次 unmap 操作或者结束进程会导致引用计数减 1
  • offset:文件偏移量。进行映射的文件位置,从文件起始地址向后的位移量

下面总结一下 MappedByteBuffer 的特点和不足之处:

  • MappedByteBuffer 使用是堆外的虚拟内存,因此分配(map)的内存大小不受 JVM 的 -Xmx 参数限制,但是也是有大小限制的。 如果当文件超出 Integer.MAX_VALUE 字节限制时,可以通过 position 参数重新 map 文件后面的内容。
  • MappedByteBuffer 在处理大文件时性能的确很高,但也存内存占用、文件关闭不确定等问题,被其打开的文件只有在垃圾回收的才会被关闭,而且这个时间点是不确定的。
  • MappedByteBuffer 提供了文件映射内存的 mmap() 方法,也提供了释放映射内存的 unmap() 方法。然而 unmap() 是 FileChannelImpl 中的私有方法,无法直接显示调用。因此,用户程序需要通过 Java 反射的调用 sun.misc.Cleaner 类的 clean() 方法手动释放映射占用的内存区域
public static void clean(final Object buffer) throws Exception {
    AccessController.doPrivileged((PrivilegedAction<Void>) () -> {
        try {
            Method getCleanerMethod = buffer.getClass().getMethod("cleaner", new Class[0]);
            getCleanerMethod.setAccessible(true);
            Cleaner cleaner = (Cleaner) getCleanerMethod.invoke(buffer, new Object[0]);
            cleaner.clean();
        } catch(Exception e) {
            e.printStackTrace();
        }
    });
}

DirectByteBuffer

DirectByteBuffer 的对象引用位于 Java 内存模型的堆里面,JVM 可以对 DirectByteBuffer 的对象进行内存分配和回收管理,一般使用 DirectByteBuffer 的静态方法 allocateDirect() 创建 DirectByteBuffer 实例并分配内存。

public static ByteBuffer allocateDirect(int capacity) {
    return new DirectByteBuffer(capacity);
}

DirectByteBuffer 内部的字节缓冲区位在于堆外的(用户态)直接内存,它是通过 Unsafe 的本地方法 allocateMemory() 进行内存分配,底层调用的是操作系统的 malloc() 函数,因此DirectByteBuffer 使用的是操作系统内存。

DirectByteBuffer(int cap) {
    super(-1, 0, cap, cap);
    boolean pa = VM.isDirectMemoryPageAligned();
    int ps = Bits.pageSize();
    long size = Math.max(1L, (long)cap + (pa ? ps : 0));
    Bits.reserveMemory(size, cap);

    long base = 0;
    try {
        base = unsafe.allocateMemory(size);
    } catch (OutOfMemoryError x) {
        Bits.unreserveMemory(size, cap);
        throw x;
    }
    unsafe.setMemory(base, size, (byte) 0);
    if (pa && (base % ps != 0)) {
        address = base + ps - (base & (ps - 1));
    } else {
        address = base;
    }
    cleaner = Cleaner.create(this, new Deallocator(base, size, cap));
    att = null;
}

使用 DirectByteBuf 将堆外内存映射到 jvm 内存中来直接访问使用

  • 这块内存不受 jvm 垃圾回收的影响,因此内存地址固定,有助于 IO 读写
  • java 中的 DirectByteBuf 对象仅维护了此内存的虚引用,内存回收分成两步

    • DirectByteBuf 对象被垃圾回收,将虚引用加入引用队列
    • 通过专门线程访问引用队列,根据虚引用释放堆外内存
  • 减少了一次数据拷贝,用户态与内核态的切换次数没有减少

除此之外,初始化 DirectByteBuffer 时还会创建一个 Deallocator 线程,并通过 Cleaner 的 freeMemory() 方法来对直接内存进行回收操作,freeMemory() 底层调用的是操作系统的 free() 函数。

private static class Deallocator implements Runnable {
    private static Unsafe unsafe = Unsafe.getUnsafe();

    private long address;
    private long size;
    private int capacity;

    private Deallocator(long address, long size, int capacity) {
        assert (address != 0);
        this.address = address;
        this.size = size;
        this.capacity = capacity;
    }

    public void run() {
        if (address == 0) {
            return;
        }
        unsafe.freeMemory(address);
        address = 0;
        Bits.unreserveMemory(size, capacity);
    }
}

由于使用 DirectByteBuffer 分配的是系统本地的内存,不在 JVM 的管控范围之内,因此直接内存的回收和堆内存的回收不同,直接内存如果使用不当,很容易造成 OutOfMemoryError。

说了这么多,那么 DirectByteBuffer 和零拷贝有什么关系?前面有提到在 MappedByteBuffer 进行内存映射时,它的 map() 方法会通过 Util.newMappedByteBuffer() 来创建一个缓冲区实例,初始化的代码如下:

static MappedByteBuffer newMappedByteBuffer(int size, long addr, FileDescriptor fd,
                                            Runnable unmapper) {
    MappedByteBuffer dbb;
    if (directByteBufferConstructor == null)
        initDBBConstructor();
    try {
        dbb = (MappedByteBuffer)directByteBufferConstructor.newInstance(
            new Object[] { new Integer(size), new Long(addr), fd, unmapper });
    } catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
        throw new InternalError(e);
    }
    return dbb;
}

private static void initDBBRConstructor() {
    AccessController.doPrivileged(new PrivilegedAction<Void>() {
        public Void run() {
            try {
                Class<?> cl = Class.forName("java.nio.DirectByteBufferR");
                Constructor<?> ctor = cl.getDeclaredConstructor(
                    new Class<?>[] { int.class, long.class, FileDescriptor.class,
                                    Runnable.class });
                ctor.setAccessible(true);
                directByteBufferRConstructor = ctor;
            } catch (ClassNotFoundException | NoSuchMethodException |
                     IllegalArgumentException | ClassCastException x) {
                throw new InternalError(x);
            }
            return null;
        }});
}

DirectByteBuffer 是 MappedByteBuffer 的具体实现类,也就是基于底层操作系统的 mmap 技术。实际上,Util.newMappedByteBuffer() 方法通过反射机制获取 DirectByteBuffer 的构造器,然后创建一个 DirectByteBuffer 的实例,对应的是一个单独用于内存映射的构造方法:

protected DirectByteBuffer(int cap, long addr, FileDescriptor fd, Runnable unmapper) {
    super(-1, 0, cap, cap, fd);
    address = addr;
    cleaner = Cleaner.create(this, unmapper);
    att = null;
}

因此,除了允许分配操作系统的直接内存以外,DirectByteBuffer 本身也具有文件内存映射的功能,这里不做过多说明。我们需要关注的是,DirectByteBuffer 在 MappedByteBuffer 的基础上提供了内存映像文件的随机读取 get() 和写入 write() 的操作。

  • 内存映像文件的随机读操作
public byte get() {
    return ((unsafe.getByte(ix(nextGetIndex()))));
}

public byte get(int i) {
    return ((unsafe.getByte(ix(checkIndex(i)))));
}
  • 内存映像文件的随机写操作
public ByteBuffer put(byte x) {
    unsafe.putByte(ix(nextPutIndex()), ((x)));
    return this;
}

public ByteBuffer put(int i, byte x) {
    unsafe.putByte(ix(checkIndex(i)), ((x)));
    return this;
}

内存映像文件的随机读写都是借助 ix() 方法实现定位的, ix() 方法通过内存映射空间的内存首地址(address)和给定偏移量 i 计算出指针地址,然后由 unsafe 类的 get() 和 put() 方法和对指针指向的数据进行读取或写入。

private long ix(int i) {
    return address + ((long)i << 0);
}

FileChannel

FileChannel 是一个用于文件读写、映射和操作的通道,同时它在并发环境下是线程安全的,基于 FileInputStream、FileOutputStream 或者 RandomAccessFile 的 getChannel() 方法可以创建并打开一个文件通道。FileChannel 定义了 transferFrom() 和 transferTo() 两个抽象方法,它通过在通道和通道之间建立连接实现数据传输的。

  • transferTo():通过 FileChannel 把文件里面的源数据写入一个 WritableByteChannel 的目的通道。
public abstract long transferTo(long position, long count, WritableByteChannel target)
        throws IOException;
  • transferFrom():把一个源通道 ReadableByteChannel 中的数据读取到当前 FileChannel 的文件里面。
public abstract long transferFrom(ReadableByteChannel src, long position, long count)
        throws IOException;

下面介绍 transferTo() 和 transferFrom() 方法的底层实现原理,这两个方法也是 java.nio.channels.FileChannel 的抽象方法,由子类 sun.nio.ch.FileChannelImpl.java 实现。transferTo() 和 transferFrom() 底层都是基于sendfile的方式实现数据传输的,其中 FileChannelImpl.java 定义了 3 个常量,用于标示当前操作系统的内核是否支持 sendfile 以及 sendfile 的相关特性。

private static volatile boolean transferSupported = true;
private static volatile boolean pipeSupported = true;
private static volatile boolean fileSupported = true;
  • transferSupported:用于标记当前的系统内核是否支持 sendfile() 调用,默认为 true。
  • pipeSupported:用于标记当前的系统内核是否支持文件描述符(fd)基于管道(pipe)的 sendfile() 调用,默认为 true。
  • fileSupported:用于标记当前的系统内核是否支持文件描述符(fd)基于文件(file)的 sendfile() 调用,默认为 true。

来分析一下其中原理:

  • transferTo()方法直接将当前通道内容传输到另一个通道,没有涉及到Buffer的任何操作,NIO中的Buffer是JVM堆或者堆外内存,但不论如何他们都是操作系统内核空间的内存。也就是说这种方式不会有内核缓冲区和用户缓冲区之间的拷贝问题。
  • transferTo()的实现方式就是通过系统调用sendfile()(当然这是Linux中的系统调用),根据我们上面所写说这个过程是效率远高于从内核缓冲区到用户缓冲区的读写的。
  • 同理transferFrom()也是这种实现方式。

下面以 transferTo() 的源码实现为例。FileChannelImpl 首先执行 transferToDirectly() 方法,以 sendfile 的零拷贝方式尝试数据拷贝。如果系统内核不支持 sendfile,进一步执行 transferToTrustedChannel() 方法,以 mmap 的零拷贝方式进行内存映射,这种情况下目的通道必须是 FileChannelImpl 或者 SelChImpl 类型。如果以上两步都失败了,则执行 transferToArbitraryChannel() 方法,基于传统的 I/O 方式完成读写,具体步骤是初始化一个临时的 DirectBuffer,将源通道 FileChannel 的数据读取到 DirectBuffer,再写入目的通道 WritableByteChannel 里面。

public long transferTo(long position, long count, WritableByteChannel target)
        throws IOException {
    // 计算文件的大小
    long sz = size();
    // 校验起始位置
    if (position > sz)
        return 0;
    int icount = (int)Math.min(count, Integer.MAX_VALUE);
    // 校验偏移量
    if ((sz - position) < icount)
        icount = (int)(sz - position);

    long n;

    if ((n = transferToDirectly(position, icount, target)) >= 0)
        return n;

    if ((n = transferToTrustedChannel(position, icount, target)) >= 0)
        return n;

    return transferToArbitraryChannel(position, icount, target);
}

接下来重点分析一下 transferToDirectly() 方法的实现,也就是 transferTo() 通过 sendfile 实现零拷贝的精髓所在。可以看到,transferToDirectlyInternal() 方法先获取到目的通道 WritableByteChannel 的文件描述符 targetFD,获取同步锁然后执行 transferToDirectlyInternal() 方法。

private long transferToDirectly(long position, int icount, WritableByteChannel target)
        throws IOException {
    // 省略从target获取targetFD的过程
    if (nd.transferToDirectlyNeedsPositionLock()) {
        synchronized (positionLock) {
            long pos = position();
            try {
                return transferToDirectlyInternal(position, icount,
                        target, targetFD);
            } finally {
                position(pos);
            }
        }
    } else {
        return transferToDirectlyInternal(position, icount, target, targetFD);
    }
}

最终由 transferToDirectlyInternal() 调用本地方法 transferTo0() ,尝试以 sendfile 的方式进行数据传输。如果系统内核完全不支持 sendfile,比如 Windows 操作系统,则返回 UNSUPPORTED 并把 transferSupported 标识为 false。如果系统内核不支持 sendfile 的一些特性,比如说低版本的 Linux 内核不支持 DMA gather copy 操作,则返回 UNSUPPORTED_CASE 并把 pipeSupported 或者 fileSupported 标识为 false。

private long transferToDirectlyInternal(long position, int icount,
                                        WritableByteChannel target,
                                        FileDescriptor targetFD) throws IOException {
    assert !nd.transferToDirectlyNeedsPositionLock() ||
            Thread.holdsLock(positionLock);

    long n = -1;
    int ti = -1;
    try {
        begin();
        ti = threads.add();
        if (!isOpen())
            return -1;
        do {
            n = transferTo0(fd, position, icount, targetFD);
        } while ((n == IOStatus.INTERRUPTED) && isOpen());
        if (n == IOStatus.UNSUPPORTED_CASE) {
            if (target instanceof SinkChannelImpl)
                pipeSupported = false;
            if (target instanceof FileChannelImpl)
                fileSupported = false;
            return IOStatus.UNSUPPORTED_CASE;
        }
        if (n == IOStatus.UNSUPPORTED) {
            transferSupported = false;
            return IOStatus.UNSUPPORTED;
        }
        return IOStatus.normalize(n);
    } finally {
        threads.remove(ti);
        end (n > -1);
    }
}

本地方法(native method)transferTo0() 通过 JNI(Java Native Interface)调用底层 C 的函数,这个 native 函数(Java_sun_nio_ch_FileChannelImpl_transferTo0)同样位于 JDK 源码包下的 native/sun/nio/ch/FileChannelImpl.c 源文件里面。JNI 函数 Java_sun_nio_ch_FileChannelImpl_transferTo0() 基于条件编译对不同的系统进行预编译,下面是 JDK 基于 Linux 系统内核对 transferTo() 提供的调用封装。

#if defined(__linux__) || defined(__solaris__)
#include <sys/sendfile.h>
#elif defined(_AIX)
#include <sys/socket.h>
#elif defined(_ALLBSD_SOURCE)
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/uio.h>

#define lseek64 lseek
#define mmap64 mmap
#endif

JNIEXPORT jlong JNICALL
Java_sun_nio_ch_FileChannelImpl_transferTo0(JNIEnv *env, jobject this,
                                            jobject srcFDO,
                                            jlong position, jlong count,
                                            jobject dstFDO)
{
    jint srcFD = fdval(env, srcFDO);
    jint dstFD = fdval(env, dstFDO);

#if defined(__linux__)
    off64_t offset = (off64_t)position;
    jlong n = sendfile64(dstFD, srcFD, &offset, (size_t)count);
    return n;
#elif defined(__solaris__)
    result = sendfilev64(dstFD, &sfv, 1, &numBytes);    
    return result;
#elif defined(__APPLE__)
    result = sendfile(srcFD, dstFD, position, &numBytes, NULL, 0);
    return result;
#endif
}

对 Linux、Solaris 以及 Apple 系统而言,transferTo0() 函数底层会执行 sendfile64 这个系统调用完成零拷贝操作,sendfile64() 函数的原型如下:

#include <sys/sendfile.h>

ssize_t sendfile64(int out_fd, int in_fd, off_t *offset, size_t count);

下面简单介绍一下 sendfile64() 函数各个参数的含义:

  • out_fd:待写入的文件描述符
  • in_fd:待读取的文件描述符
  • offset:指定 in_fd 对应文件流的读取位置,如果为空,则默认从起始位置开始
  • count:指定在文件描述符 in_fd 和 out_fd 之间传输的字节数

在 Linux 2.6.3 之前,out_fd 必须是一个 socket,而从 Linux 2.6.3 以后,out_fd 可以是任何文件。也就是说,sendfile64() 函数不仅可以进行网络文件传输,还可以对本地文件实现零拷贝操作。

其它的零拷贝实现

Netty零拷贝

Netty 中的零拷贝和上面提到的操作系统层面上的零拷贝不太一样, 我们所说的 Netty 零拷贝完全是基于(Java 层面)用户态的,它的更多的是偏向于数据操作优化这样的概念,具体表现在以下几个方面:

Netty 通过 DefaultFileRegion 类对 java.nio.channels.FileChannel 的 tranferTo() 方法进行包装,在文件传输时可以将文件缓冲区的数据直接发送到目的通道(Channel)

ByteBuf 可以通过 wrap 操作把字节数组、ByteBuf、ByteBuffer 包装成一个 ByteBuf 对象, 进而避免了拷贝操作 ByteBuf 支持 slice 操作, 因此可以将 ByteBuf 分解为多个共享同一个存储区域的 ByteBuf,避免了内存的拷贝 Netty 提供了 CompositeByteBuf 类,它可以将多个 ByteBuf 合并为一个逻辑上的 ByteBuf,避免了各个 ByteBuf 之间的拷贝 其中第 1 条属于操作系统层面的零拷贝操作,后面 3 条只能算用户层面的数据操作优化。

RocketMQ和Kafka对比

RocketMQ 选择了 mmap + write 这种零拷贝方式,适用于业务级消息这种小块文件的数据持久化和传输;而 Kafka 采用的是 sendfile 这种零拷贝方式,适用于系统日志消息这种高吞吐量的大块文件的数据持久化和传输。但是值得注意的一点是,Kafka 的索引文件使用的是 mmap + write 方式,数据文件使用的是 sendfile 方式。

选择其他模型提示不在服务区

另外,composer 模型非常愚蠢,最近反复地、重复地跟它强调功能都没有一次性给你实现的

这玩意还能用吗?

最近某音的一个博主路飞老师写了一份人选天选论,非常有意思。讲到了一些听上去很难理解的概念。比如他认为世界上的一切发生,是在宇宙爆发的时候就写好的,时间只是我们翻阅这本书的顺序而已。又比如他会说即使是这样,我们仍然要有选择的权利和动力。(插一句,这个理论我在某个训练 AI 的大神那里也听过类似的,看来世界是殊途同归的)

又比如他将人的精神世界比作河流世界:

河流元素 对应含义

河里的水 时刻流动的思想
水源 外界持续涌入的信息
河床 天性、经历、性格底色
河底的石头 藏在内心的贪婪与恐惧
河的宽度 知识的广度
水的深度 知识的密度
水流的速度 思考的速度
河岸 知道自己不知道的知识边界
水面的波纹 借口、理由、自洽和表层情绪

因此引申出了,我做的这个工具,这个工具就是为了帮助你看清楚你的这条河 : https://renxuantianxuan.com/
帮你每天记录你的石头,训练自己用更高维的方式思考问题。总之这种思维方式让我很受用。不知道各位怎么看待?评论来讨论吧

StockTracker (潜行盯盘工具 - 大 A 定制版)

StockTracker 是一款专为 A 股定制的极致隐蔽、智能高效的潜行盯盘利器。它在保持水印级 UI 设计的同时,内置了深度适配大 A 盘口特征的“智测量化引擎”,助你在办公环境下低调、智能地洞察实时行情异动。

📸 GIT 地址

  1. 点击前往:StockTracker (点击前往)


✨ 核心特性

1. 极致隐蔽的沉浸式 UI

  • 无感存在:无标题栏、无边框、不在系统任务栏显示图标,彻底杜绝被“瞄一眼”发现的风险。
  • 水印级显示:采用半透明黑色背景与深灰色字体,文字粗细经过调优,使其在深色编辑器背景上如同“系统水印”一般存在。
  • 交互极简:鼠标左键即可随意停放位置,右键呼出控制核心。

2. 智能防呆交互

  • 纯数字输入:添加股票时仅需输入 6 位数字代码。引擎会自动补全前缀( sh/sz/bj )并识别所属板块(主板/创业板/科创板)。
  • 本地持久化:自选股列表实时加密保存在本地 stocks.txt,重启即恢复。

3. “智测”量化引擎 2.0 (Deep-A Logic)

程序每 3 秒刷新一次实时盘口,并进行实时预判:

  • **⏳ 动态量比归一化 (Annualized Ratio)**:根据当前交易时间(排除午休)动态计算预估全天量级,彻底解决早盘量比失真的行业痛点。
  • 📊 动态多板块阈值:自动识别主板 (10%)、科创/创业板 (20%)、北交所 (30%) 涨跌停限制。
  • **📈 趋势感应 (Trend-Aware)**:引入最近 5 日趋势斜率分析,有效区分“超跌反弹”与“趋势主升”。
  • 📉 多维 K 线形态:复现“仙人指路”、“金针探底”、“避雷针”等 A 股经典盘口语境,并加入十字星过滤逻辑。


📝 预测状态词典 (Dictionary)

智能引擎会根据当前盘口自动给出以下 20 余种深度解析:

🟢 强势/看多区间

状态词 盘口含义
爆量打板(分歧大/防炸) 封板瞬间量能过大,需防范“炸板”风险。
极度控盘(缩量一字) 极小量能封死涨停,筹码高度锁定,后续空间大。
强势封板 稳健的多头绝对掌控。
震荡试盘(仙人指路) 阳线长上影+趋势向上,主力拉升前的火力试探。
金针探底(爆量承接) 底部放量长下影,下跌动能衰竭,主力进场信号。
爆量主升 直线拉升,配合大成交量,多头情绪最高点。
缩量逼空 价格持续走高但卖盘枯竭,典型的主力高度控盘形态。
多头掌控 稳态上涨,趋势良好。

🟡 震荡/观察区间

状态词 盘口含义
回踩确认(洗盘结束) 价格缩量回调至 5 日线附近获得支撑。
高位滞涨 价格不涨但成交量剧增,需警惕主力派发。
缩量洗盘 波动收窄,量能萎缩,进入洗盘阶段。
震荡攀升 贴合 5 日均线温和上行。
蓄势震荡 成交量温和,主力在当前价位进行筹码交换。

🔴 弱势/看空区间

状态词 盘口含义
抛压巨大(避雷针) 高位放量长上影线,主力暴力出货,极大概率见顶。
恐慌跌停(放量杀跌) 恐慌性砸盘,尚未见底。
情绪雪崩(无量跌停) 毫无承接的单边下跌。
破位杀跌 跌破关键均线支撑且伴随放量。
阴跌不止 成交量极小但价格重心不断线下,买盘严重不足。
弱势反抽 均线下方的无量脉冲,通常是离场时机。
反弹受阻 上攻伴随长上影,缺乏多头合力。


🚀 部署与运行

编译单文件绿色版 (推荐)

直接在项目根目录下执行:

dotnet publish -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -o publish

完成后,在 publish 文件夹提取 StockTracker.exe 即可。


🛠 技术栈

  • 语言:C# 13.0
  • 运行时:.NET 9.0 (Windows x64)
  • 底层驱动:Windows Forms (WinForms)
  • 数据流:Sina API (GB2312 编码适配)

🧠 智测计算规则 (Algorithm Rules)

“智测”系统基于实时行情与历史 K 线数据,采取以下多维度算法进行综合识别:

  1. 五日均线 (MA5) 判定


    • 算法:(前 4 日收盘价总和 + 当前价) / 5
    • 作用:识别当前股价相对于短期平均成本的位置(乖离率)。
  2. **动态量比 (Dynamic Volume Ratio)**:


    • 算法:(当日成交量 / 前 4 日均量) / 当日已交易时间占比
    • 修正:根据 A 股开盘时间( 9:30-11:30, 13:00-15:00 )动态计算时间进度,确保早盘量比的准确性。
  3. **近期趋势 (Trend Analysis)**:


    • 算法:分析前 4 个交易日的收盘价斜率。
    • 作用:识别是“超跌反弹”还是“顺势波段”。
  4. **K 线形态识别 (Pattern Detection)**:


    • 避雷针:长上影线 + 股价处于高位 + 阴线。
    • 仙人指路:长上影线 + 处于上升通道 + 价格回踩 MA5 + 缩量。
    • 金针探底:长下影线 + 低位爆量承接。
  5. 涨跌停阈值识别


    • 根据股票代码(主板 10%,创业板/科创板 20%,北交所 30%)自动适配涨跌停监控阈值,识别“一字板”或“爆量炸板”。
  6. 核心逻辑速查表


    • **[看多]**:爆量主升、缩量逼空、多头掌控、震荡攀升、仙人指路、金针探底。
    • **[观察]**:强势回落、弱势抵抗、震荡洗盘、数据不足。
    • **[看空]**:破位杀跌、阴跌不止、情绪雪崩、恐慌跌停。


🚀 快速开始 (Quick Start)

直接运行 (Recommended):

  1. 下载最新的绿色免安装版:StockTracker.exe (点击下载)
  2. 双击运行即可。程序将在同级目录下自动生成 stocks.txt 配置文件。


在使用本工具前,请务必阅读以下声明:

  1. 非投资建议:本软件提供的“智测”结果、预测术语及各类行情分析仅作为技术逻辑的实验性展示,基于历史数据和特定数学模型,不构成任何买入、卖出或持有股票的投资建议
  2. 数据局限性:由于网络延迟、API 刷新频率( 3 秒)及算法模型的固有随机性,软件展示的数据可能与实际成交盘口存在偏差。
  3. 盈亏自负:证券市场具有极高风险。用户依据本软件信息进行交易所产生的任何形式的资产损失(包括但不限于本金亏损、利润损失等),作者及软件开发者不承担任何直接或间接的法律责任
  4. 版权说明:本软件仅供学习交流使用。禁止用于任何非法金融活动或违反相关证券从业监管规定。

股市有风险,入市需谨慎。

显卡电源灯亮
风扇不转
无画面显示
有维修的必要吗
回收好像也不值钱

如题,

楼主最近用 codex 多,于是抽时间,

把 grafana , rancher 查询日志,

jenkins 部署,gitlab 创建 merge request , 提交代码

等等一系列自动化跑通了(原理很简单,把他们的 API 封装成 SKILL ,让 codex 自己编排)


曾经也是小学初中就热爱计算机,最后大学学的计算机,

到今天觉得自己已经没什么不可替代性(赚不到钱)

现在很迷茫,

唯一能做的就是早点睡觉,早上早点起床跑步

(虽然晚上愁得睡不着)

现在 openclaw 有多少变体、发行版了?除了QClaw、KimiClaw、JVSClaw、WorkBuddy、ArkClaw 还有什么?

OpenClaw变体全整理对比表

OpenClaw(昵称 “小龙虾”)作为 2026 年爆火的 AI 智能体框架,已经衍生出了超多不同定位的变体,覆盖了从个人到企业、从本地到云端、从桌面到嵌入式的各种场景,下面是全网最全的变体对比表,帮你快速找到适合自己的版本!

OpenClaw 全变体对比表

名称开发者 / 出品方核心特色技术栈资源占用适用场景
OpenClaw(原版)Peter Steinberger功能最全,生态成熟,本地优先,支持多模型多平台TypeScript内存 > 1GB,启动慢(0.8GHz 下 > 500s)桌面 / 服务器,生产环境,技术爱好者
QClaw腾讯支持微信直接对话,主打个人社交场景,内测中适配 OpenClaw 生态中等微信用户,个人社交场景
KimiClaw月之暗面内置 Kimi K2.5 模型,40GB 个人云存储,跨设备记忆云端集成云端托管,本地无占用长任务处理,跨设备同步使用
JVSClaw阿里云独立 APP / 网页版,AI 应用商店,内测需邀请码适配 OpenClaw中等个人 / 企业智能体,阿里云生态用户
WorkBuddy腾讯全场景 AI 智能体,深度打通企业微信和 QQ兼容 OpenClaw 技能中等企业办公,社交协同场景
ArkClaw火山引擎开箱即用 SaaS 版,云上快速部署,无需本地配置云原生云端托管企业级应用,云上快速落地
IronClaw社区开发者Rust 完全重构,极致安全,Wasm 沙箱,防提示词注入Rust+Wasm+PostgreSQL内存占用低,启动快高安全需求场景,隐私敏感用户
Lobster AI网易有道教育 / 办公场景优化,擅长文档处理和 RPA 自动化适配 OpenClaw中等教育学习,办公自动化场景
Coze(扣子)字节跳动适配 OpenClaw 协议,可快速发布 Agent 到豆包 / 飞书字节生态集成字节生态用户,多平台 Agent 部署
PicoClawSipeedGo 语言重写,单文件部署,嵌入式友好Go内存 < 10MB树莓派、RISC-V 开发板等嵌入式设备
EasyClaw猎豹移动图形化界面,一键部署,零技术门槛封装 Node.js/Docker中等非技术用户,快速上手使用
MaxClawminimax10 秒部署,全托管云 Agent,成本降低 90%云原生云端托管成本敏感用户,高频任务场景
NullClaw社区开发者678KB 单二进制,零依赖,极致轻量化Zig内存~1MB,冷启动 < 2msIoT 网关、嵌入式系统,资源极度敏感场景
OpenFang社区开发者Rust 生产级 Agent OS,零人工干预自主运行Rust生产级自主运行场景,无人值守任务
CoPaw阿里云通义实验室一键部署,魔搭集成,每天 2000 次免费模型调用阿里云生态个人用户,零成本试错体验
OpenClawChinese社区全汉化版,零语言障碍,中文用户友好基于 OpenClaw 修改同原版中文用户,快速入门学习
ClawPhone社区二手安卓机 DIY 改造,本地部署 AI 智能体安卓系统适配低(二手安卓机即可)移动设备本地智能体,低成本 DIY
NanoClaw/Nanobot社区(Gavriel Cohen)极简 Python 版,仅 4000 行代码,安全隔离Python内存低开发者学习研究,底层逻辑探索
ZeroClaw社区极致性能,启动 < 10ms,全硬件覆盖,功能接近原版Rust内存 7.8MB嵌入式设备,低配 VPS,预算有限开发者
TinyClaw社区运维监控专用,轻量监控 Agent轻量架构极低服务器运维监控,轻量任务场景
TrustClaw君同未来可信审计版,安全审计,可视化管控界面基于 OpenClaw中等可信 AI 场景,需要审计的个人 / 企业用户
VibeClaw社区浏览器沙箱运行,无需安装,一秒启动浏览器 JS浏览器内存快速体验,无需部署的用户

整理不易,收藏关注不迷路,后续分享更多 AI 工具干货!

点赞 + 关注 + 收藏 = 学会了

💡整理了一个 NAS 专属玩法专栏,感兴趣的工友可以戳这里关注 👉 《NAS邪修》

UPage 是一款开源的 AI 生成式网页构建工具。只需输入一段描述,它就能利用大模型能力帮你搓个静态网页出来。

打开飞牛的「文件管理」,在 docker 文件夹下创建 upage 目录。

upage 内递归创建以下三个子文件夹:

  • /docker/upage/data
  • /docker/upage/logs
  • /docker/upage/storage

打开「Docker」应用,切换到 Compose 面板,新增项目:

  • 项目名称:upage
  • 路径:/docker/upage
  • 来源:创建docker-compose.yml

输入以下代码:

services:
  upage:
    image: halohub/upage:latest
    container_name: upage
    ports:
      - 3456:3000 # 3456 这个端口可以自定义
    environment:
      - LLM_PROVIDER=OpenAI
      - PROVIDER_BASE_URL=https://api.longcat.chat/openai/v1
      - PROVIDER_API_KEY=your_api_key_here # 请替换为你申请的 API Key
      - LLM_DEFAULT_MODEL=LongCat-Flash-Thinking-2601
      - LLM_MINOR_MODEL=LongCat-Flash-Lite
    volumes:
      - ./data:/app/data
      - ./logs:/app/logs
      - ./storage:/app/storage
    restart: unless-stopped

⚠️ 关键参数说明:

volumes 里的3个值分别对应在第一步创建的文件夹。

environment 里配置大模型的相关参数:

  • LLM_PROVIDER:大模型提供商。现在很多模型都兼容 OpenAI 规范,所以我选了 OpenAI
  • PROVIDER_BASE_URL:大模型提供商的 API 地址。我用了美团的 LongCat,因为它每天提供5500万 token,相当大方。你也可以选择其他提供商的。
  • PROVIDER_API_KEY:API Key,去对应的服务商后台申请后贴入。
  • LLM_DEFAULT_MODEL:主模型名称。我使用 LongCat 的 LongCat-Flash-Thinking-2601 这个模型。
  • LLM_MINOR_MODEL:次要模型名称。

项目构建成功后,在浏览器打开 NAS_IP:3456 就可以访问 UPage 了。

在输入框输入你的需求,Upage 就会帮你做个静态网页出来。

网页写好后,点击右上角的“下载代码”可以把源码下载下来。

如果觉得生成的页面不满意,可以重写提示词,或者点击右侧预览面板直接修改页面文本内容。


以上就是本文的全部内容啦,你有好玩的镜像推荐吗?欢迎在评论区留言讨论!

想了解更多NAS玩法记得关注《NAS邪修》👏

往期推荐:

点赞 + 关注 + 收藏 = 学会了

荣耀 Magic V6 发布

3 月 10 日,荣耀在国内正式发布折叠屏旗舰手机 Magic V6,提供赤兔红、旭日金、雪域白、绒黑色四款配色,折叠态厚度 8.75mm,展开态厚度 4.0mm,整机重量 219g;屏幕采用自研至臻黑钻屏,外屏应用 5600 层氮化硅堆叠技术,内屏搭载超韧 UTG 玻璃,折痕改善 44%,内外均通过德国莱茵 TÜV 全局护眼认证;核心搭载满血八核第五代骁龙 8 至尊版处理器,标配 120W 氮化镓快充,首发新一代青海湖刀片电池,容量达 7150mAh,硅含量 32%,能量密度 985Wh/L;影像系统配备 6400 万像素潜望长焦镜头,拥有 1/2 英寸大底及 CIPA 6.5 级防抖;机身采用 2800MPa 盾构钢铰链,支持 IP68 与 IP69 级防尘防水及北斗卫星短信;软件搭载 MagicOS 10,支持 Mac 一碰传及苹果 iWork 套件兼容。

荣耀 Magic V6 提供 12GB+256GB、12GB+512GB、16GB+512GB、16GB+1TB 四个版本,售价 8999 元起,将于 3 月 13 日 10:08 正式开售。来源


OPPO 宣布上调部分机型售价

3 月 10 日,OPPO 宣布受 DRAM 与 NAND 闪存等核心存储组件成本上升及供应短缺影响,将于 3 月 16 日 0:00 起调整部分已发售产品的官方零售价。此次调价范围涵盖 OPPO A 系列、K 系列以及一加品牌机型;OPPO Find 系列、Reno 系列及 OPPO Pad 系列平板电脑暂不在此次调价范围内。来源


Sonos 发布便携音箱 Play 及 Era 100 SL

3 月 10 日,Sonos 宣布推出定位介于 Roam 2 与 Move 2 之间的中尺寸便携音箱 Sonos Play,以及去麦克风版本的固定音箱 Era 100 SL。其中 Sonos Play 重约 3 磅,机身尺寸为 7.6 x 4.4 x 3 英寸;声学结构由两个 90 度夹角高音单元、一个中低音单元及两个新增的被动辐射器组成;支持 Wi-Fi、蓝牙、AirPlay 2 及 Spotify Connect 连接,具备 IP67 级防水防尘性能。该产品还引入了蓝牙组网功能(可与 Move 2 联动)及可拆卸挂环设计,内置 USB-C 接口支持线入、以太网扩展及反向充电,标配无线充电底座(不含充电头)。Era 100 SL 则在保留 Era 100 全部声学架构的基础上移除了麦克风组件,主打入门级市场。

Sonos Play 定价 299 美元,Era 100 SL 定价 189 美元,两款新品均于今日开启预售,计划于 3 月 31 日正式发货。来源


英特尔推出酷睿(第二代)性能核 Bartlett Lake 12P 处理器

英特尔于 3 月 9 日正式推出代号 Bartlett Lake 12P 的酷睿(第二代)性能核处理器,面向嵌入式和边缘工作负载,至高提供 12 个 P 核且无 E 核。该系列处理器采用 Intel 7 制程工艺,包含 125W / 65W / 45W 三档 TDP,单核睿频至高可达 5.9GHz、全核睿频值高可达 5.3GHz。在最大 PCIe 延迟、确定性响应时间、确定性性能的表现上优于 AMD 的锐龙 7 9700X,支持 H610 (E)、Q670 (E)、R680E、W680 主板,其中在 W680 上支持内存超频。来源


Meta 收购 Moltbook

3 月 10 日,Meta 宣布收购由 Matt Schlicht 与 Ben Parr 创办的类 Reddit 社交网络 Moltbook,并将其并入 Meta 超级智能实验室。Moltbook 是一个基于 OpenClaw 的社交平台,在 OpenClaw 走红后曾以「智能体的 Reddit」这一平台定位走红,也以智能体加密语言、智能体宗教等社交平台话题引发过舆论关注,同时有安全研究机构证实该平台存在重大安全漏洞,包括数据库凭据长期公开未加密、人类用户可伪造智能体身份发布内容等。

Meta 首席技术官 Andrew Bosworth 此前表示,相较于智能体模拟人类对话,Meta 更关注人类通过系统漏洞介入该网络的行为逻辑。目前该交易的具体金额及细节尚未披露。来源


Google Workspace 新增 Gemini AI 功能

3 月 10 日,Google 宣布为 Docs、Sheets、Slides 及 Drive 推出多项 Gemini 驱动的 AI 功能。其中 Docs 新增「帮我创建(Help me create)」工具,支持调取 Gmail、Chat 和 Drive 信息生成初稿,并提供「匹配写作风格」与「匹配格式」功能以统一文档语调,或参照特定模板填充航司及酒店信息;Sheets 支持根据单一指令(如整理搬家清单)跨平台提取数据并生成格式化表格,同时新增「使用 Gemini 填充(Fill with Gemini)」功能,支持自动分类数据或调取 Google 搜索实时信息补全表格;Slides 支持根据文件、邮件和网页上下文生成符合演示文稿主题的单页幻灯片,并计划未来实现单条指令生成完整演示稿;Drive 引入「AI 概览(AI Overview)」和「与 Gemini 对话」功能,用户可通过自然语言搜索、获取文件摘要,或针对跨文档、邮件、日历的复杂问题(如税务咨询建议)获取基于私有数据的详细解答。

上述功能即日起面向全球 Google AI Ultra 和 Pro 订阅用户开启英文版 Beta 测试(Drive 仅限美国地区)。来源


ChatGPT 新增 Shazam 音乐识别功能

OpenAI 于 3 月 10 日宣布与 Shazam 合作,为 ChatGPT 添加音乐识别功能,在 ChatGPT 客户端设置里的 Apps 界面手动搜索并添加 Shazam 后,用户只需输入类似「Shazam,现在正在播放什么歌曲?」这样的提示词即可调出 Shazam 网页版,搜索到音乐后 Shazam 会在回复框中提供音乐卡片,无需离开 ChatGPT 应用即可识别歌曲并预览音乐片段。来源


Adobe 推出 Photoshop AI 助手

3 月 10 日,Adobe 宣布 Photoshop AI 助手正式开启网页版与移动端 Beta 测试,并同步升级了 Firefly 媒体创作工具。Photoshop AI 助手支持通过自然语言指令执行 Photoshop 编辑指令,付费用户在 4 月 9 日前可享受无限次生成次数,免费用户初始配额为 20 次;同时 Firefly 新增 AI 标记(AI markup)测试功能,允许用户通过手绘标记触发 AI 进行对象转换或背景修改。来源


不妨一看的简讯

  • 智谱于 3 月 10 日宣布上线 AutoClaw,预置 50+ 热门 Skills,支持一键接入飞书等即时通讯工具,支持 macOS 和 Windows 平台,提供一定的智谱免费额度以及第三方 Coding Plan 和 API 支持。来源
  • 彭博社援引 Mark Gurman 的消息称,传闻已久的 Apple 智能家居显示器将推迟至今年 9 月发布,Apple 目前仍在等待新版 Siri 的最终交付,以便为新品提供完整的智能生态体验。来源
  • 3 月 10 日,卡普空总监通过视频短片宣布,旗下新作《生化危机 9:安魂曲》的剧情 DLC 正在开发当中,后续除持续修复性能漏洞外,也将上线「拍照模式」、小游戏等游戏内容更新。来源


少数派的近期动态

  • 少数派年度征文投稿窗口最后一周!古法手搓大战人工智能,你会是哪条赛道的大赢家?参与一下


你可能错过的文章


> 下载 少数派 2.0 客户端、关注 少数派公众号,解锁全新阅读体验 📰

> 实用、好用的 正版软件,少数派为你呈现 🚀

    编者按: 在 AI 智能体赛道竞争白热化的今天,为何巨头们会突然放弃私有壁垒,共同拥抱同一套技术标准?

    我们今天为大家带来的文章,作者的观点是:Agent Skills 之所以能在 90 天内从私有功能演变为行业标准,关键在于其“渐进式披露”的架构设计解决了 Token 经济学痛点,以及“一次编写,处处运行”的可移植性打破了平台壁垒。

    文章详细回顾了 2025 年 10 月至 12 月间,Anthropic 如何通过简单的 Markdown 文件格式推出 Agent Skills,并迅速获得 OpenAI 和 Microsoft 的跟进支持。文中深入剖析了技能加载的“渐进式披露”机制如何大幅降低 Token 消耗,对比了其与微调、Custom Instructions 等方案的优劣,并展示了开发者生态在三周内从 0 爆发至 25,000 个技能的惊人增长。此外,文章还探讨了巨头背后的战略博弈,以及企业应如何布局技能治理与基础设施。

    标准化往往是生态成熟的前奏,当定制 AI 能力不再受制于平台锁定时,真正的智能体应用规模化落地才刚刚开始。

    作者 | Han HELOIR YAN, Ph.D.

    编译 | 岳扬

    2025 年 12 月 18 日,AI 行业发生了一件不同寻常的事:OpenAI 宣布将采用由其主要竞争对手 Anthropic 制定的一项标准。短短几小时内,Microsoft 也迅速跟进,把同样的技术标准格式集成到了 GitHub Copilot 和 VS Code 中。而 Google 其实早在两个月前就已推出了类似的系统。到那周结束时,一个开源社区平台上已经列出了超过 25,000 个该新标准的实现方案。

    这并非一次新模型的发布。没有基准测试排行榜上的刷分大战,也没有“碾压 GPT-5”之类的标题党新闻。这是一件更具深远意义的事件:一种用于教会 AI 智能体执行专业工作流的通用格式正式诞生。Anthropic 将其称为“Agent Skills”,而在 2025 年 10 月到 12 月这 90 天里,这项技术迅速从一项私有功能演变为事实上的行业标准。

    这件事的关键在于:为什么一家并没有最强模型的公司,却能主导整个行业定制 AI 的方式?如果你正在构建 AI 智能体、交付 AI 驱动的产品,或是设计未来需要对接多家 AI 服务供应商的系统架构,那么这件事的重要性,远超过你今年能看到的任何一次基准测试分数提升。

    01 2025 年 10 月 16 日:低调发布

    Anthropic 于 2025 年 10 月 16 日面向 Claude 用户推出了 Agent Skills 功能。官方公告言简意赅: “Skills 就是一个包含指令、脚本和资源文件的文件夹,Claude 可以在需要时加载它们。”

    其技术架构刻意保持简单。每个 Skill 对应一个目录,其中必须包含一个 SKILL.md 文件,该文件采用 YAML 前置元数据与 Markdown 指令说明相结合的格式。

    真正的创新在于其加载机制。 启动时,Claude 会扫描所有可用的 Skills,但只将它们的元数据(Skill 名称和 Skill 描述)加载到系统提示词中。这些元数据相当于一个索引目录,每个 Skill 大约消耗 30–50 个 token。当用户请求匹配到某个 Skill 的应用领域时,Claude 才会通过文件系统访问加载完整的指令内容。假如一个代码库中有 100 个 Skills,那么初始只需约 5,000 个 token 存储元数据,而每个 Skill 的完整内容(通常 2,000–5,000 个 token)仅在真正需要时才加载。

    Anthropic 在工程博客中将这种设计称为 “渐进式披露”(progressive disclosure) 。这一模式借鉴自信息架构领域,核心思想是只在必要时才引入复杂内容。对 AI 智能体而言,它解决了一个实际痛点:如何让智能体访问大量程序性知识,又不至于在开始工作前就耗尽上下文窗口?

    开发者兼 AI 研究员 Simon Willison 在 10 月 16 日写道:“Skills 的概念极其简单:一个 Skill 就是一个 Markdown 文件,告诉模型如何完成某项任务,还可以附带额外文档和预先写好的脚本。关于 Skills 的设计,有一点我非常喜欢,它没有任何限制阻止这些 Skills 被其他模型使用。”

    他预测道:“我预计我们将看到 Skills 的寒武纪大爆发,相比之下,今年的 MCP 热潮都会显得平淡无奇。”

    最初的反响积极但较为克制。GitHub 上的 anthropic/skills 仓库起初只包含 Anthropic 提供的一个示例:用于为 DOCX、PPTX、XLSX 和 PDF 文档创建 Skills。这些并不是仅供演示的简单示例,它们正是 Claude 在生产环境中驱动文档生成功能所使用的 Skills。

    02 11 月:悄然增长阶段

    在 11 月期间,有趣的事情发生了。开发者们在没有营销推动或激励计划的情况下,开始自发地构建 Skills。Skills 仓库的示例数量增长到 50 多个,覆盖创意设计、技术开发和企业沟通等多个领域。

    早期的企业试点项目陆续出现。云内容管理公司 Box 构建的 Skills,能将存储的文件自动转换为符合组织标准的格式化文档。日本电商巨头 Rakuten 部署了用于财务操作的 Skills,此前这类操作需要跨部门人工协调。Canva 则集成了用于品牌合规设计工作流的 Skills。

    通过实际使用,Skills 在 token 效率方面的优势逐渐显现。GitHub MCP server 是一种比较流行的将 AI 智能体连接到 GitHub 仓库的方式,仅其工具定义和上下文就消耗约 15,000–30,000 个 tokens。而一个提供类似 GitHub 工作流指导的 Skill,元数据仅需 50 个 tokens,完整加载时也只需 3,000–4,000 个 tokens,token 效率提升了 5–10 倍。

    更重要的是,Skills 在 Claude 可用的所有场景都能运行:claude.ai 网页界面、Claude Code(Anthropic 的命令行编码智能体)以及 Claude API。编写一次 Skill,即可立即在所有平台上使用。对于投资 AI customization(即为自身需求专门定制 AI 功能)的企业而言,这种可移植性至关重要。

    03 2025 年 12 月 18 日:开放标准正式发布

    2025 年 12 月 18 日,三项公告几乎同时发布:

    1)Anthropic 在 agentskills.io 上将 Agent Skills 规范作为开放标准发布,包含完整文档、参考版 Python SDK,以及对跨平台可移植性的明确承诺。

    2)OpenAI 为其 Codex CLI 和 ChatGPT 采用了完全相同的 SKILL.md 格式。OpenAI 的开发者文档已同步更新,展示对 Skills 的支持,文件结构与 YAML frontmatter 与 Anthropic 保持一致。放置在 ~/.codex/skills/ 目录下的 Skills 会被自动发现并加载使用。

    3)Microsoft 与 GitHub 宣布在整个 Copilot 生态中支持 Agent Skills:涵盖 GitHub Copilot、VS Code、Copilot CLI,以及 JetBrains、Eclipse 和 Xcode 等主流 IDE 中的 agent 模式。

    与此同时,Anthropic 推出了 Skills Directory —— 这是一个 Skills 精选市场,汇集了 Notion、Figma、Atlassian、Canva、Stripe、Ramp 和 Sentry 等合作伙伴打造的专业级 Skills。

    面向 Team 与 Enterprise 套餐的企业客户,Anthropic 新增了组织级别的管理功能。管理员可为整个团队统一配置 Skills、设定默认启用项,并追踪使用情况。

    其战略影响不言自明:Anthropic 的主要竞争对手 OpenAI,竟在该标准开源发布后数小时内便迅速采用;而 Microsoft 当时已有 23 万家企业使用 Copilot Studio(覆盖《财富》500 强中的 90%),正将 Skills 深度集成至其整套开发者工具链中。

    04 12 月 19–31 日:市场爆发期

    开放标准发布后 24 小时内,社区驱动的 Skills 市场平台如雨后春笋般涌现。独立社区项目 SkillsMP(Skills Marketplace)上线,通过自动抓取 GitHub 公共仓库实现了 Skills 索引自动化。

    其增长轨迹令人瞩目:

    • 第 1 周(12 月 19–25 日):约 8,000 个 Skills 被索引
    • 第 2 周(12 月 26–31 日):约 17,000 个 Skills 被索引
    • 截至 2026 年 1 月 9 日:超过 25,000 个 Skills 被编目

    这些并非重复或低质量内容。SkillsMP 设置了质量过滤机制,要求至少 2 个 GitHub stars 和近期更新记录,并扫描其基础质量指标。平台将 Skills 分为四大类:开发与技术类(占总量 40%)、文档类(25%)、企业与沟通类(20%),以及创意与设计类(15%)。

    到 2025 年 12 月底,Skills 从 Anthropic 的私有功能演变为跨平台的行业标准,整个过程恰好历时 90 天。

    05 技术实况核查:不绕弯子的拆解

    5.1 架构本质:Markdown、YAML 与 Progressive Disclosure(渐进式披露)

    Agent Skill 的核心设计极其简单:一个文件夹,内含一个带 YAML frontmatter 的 Markdown 文件,外加可选的资源文件。

    其创新之处在于加载机制。渐进式披露通过三阶段加载机制实现:

    • 第一阶段 — 启动时:智能体将所有 Skill 的元数据加载到系统提示词中。一个典型 Skill 的描述约 50 个词,消耗 40–50 个 tokens;100 个 Skills 的元数据总计约 4,000–5,000 个 tokens。
    • 第二阶段 — 匹配时:处理用户请求过程中,智能体扫描 Skill 描述,识别相关匹配项。
    • 第三阶段 — 加载时:匹配成功后,智能体通过文件系统工具读取完整的 SKILL.md 文件。此时完整内容才进入上下文窗口,根据复杂度消耗 2,000–5,000 个 tokens。

    这种架构使得 Skill 库理论上可以无限扩展。一家企业可维护 1,000 个 Skills,元数据仅占用约 50,000 个 tokens,相当于 Claude Sonnet 4 20 万 token 上下文窗口的 25%。

    5.2 Token 经济学:这才是它真正重要的原因

    上下文窗口是有限且昂贵的资源。理解其中的 token 经济学,才能明白为什么 Skills 能成功,而其他方案却步履维艰。

    5.3 Skills 无法做到的事情(坦诚环节)

    • 无法获取实时的外部数据:Skills 是静态文件。若无 MCP 服务器或直接的 API 工具集成,无法拉取实时数据。
    • 调用的非确定性:模型是否调用某个 Skill,是基于语义匹配的概率性决策,无法保证一定触发。
    • 调试过程不透明:当 Skill 未被触发或执行指令出错时,往往难以完全追溯原因。
    • 依赖代码执行环境:包含脚本的 Skills 需要代码执行环境支持(如 Claude Code 或 GitHub Copilot)。
    • 平台差异:虽然格式已标准化,但各平台在实现细节上仍有差异(例如文件发现路径)。

    5.4 Skills 与其他方案对比 —— 为什么 Skills 能成,而其他方案都失败了

    现在来回溯一下 Skills 崛起的前两年究竟发生了什么。

    1)Custom Instructions 时代:过于简单

    2024 年 7 月,OpenAI 为 ChatGPT 引入 Custom Instructions。你可以设置“始终用 Python 写代码”或“我是资深工程师,跳过基础解释”。适合个人偏好,但面对复杂场景完全无能为力。

    问题在于:你只能设置一套指令,始终加载、无法共享。试着在一个限制为 1500 个字符的文本框里解释你们公司 47 步的代码审查流程。然后看着你的同事手动重复这一过程,因为他们无法访问你的指令。

    2)GPT Store 时代:虽接近但仍差一步

    2024 年 11 月,OpenAI 推出 Custom GPTs,终于能构建带知识文件的专用智能体并分享出去。GPT Store 于 2025 年 1 月上线,到 6 月已积累 300 万个 GPTs。

    那些拥有企业级需求的用户一开始很兴奋,但很快就撞墙了。

    平台不互通:你的“API 安全审查 GPT”只能在 ChatGPT 里用,你们团队用 Claude,运维团队用 GitHub Copilot。恭喜,同一套逻辑你得维护三份副本。

    上下文窗口不够用:GPTs 会预先加载全部知识。给 GPTs 塞 20 个示例文档?用户还没输入,上下文已吃掉 40,000 个 tokens。想维护 50 个供整个团队使用的 GPTs?上下文窗口直接宣告死亡。

    缺乏治理:人人都能创建 GPTs,没有审批流程,没有版本控制。某天安全团队发现有人搭了个“SQL 查询助手”,而它把所有数据库凭证都记录了 —— 好戏就开始了。

    到 2025 年年中,拥有企业级需求的那些用户都有一股挫败感:方向是对的,但这条路走不通。

    3)2025 年 10 月:Skills 找对了路子

    Anthropic 看清了哪些要素行之有效(GPTs 的专业化能力),什么行不通(其他所有尝试),然后将其简化到最本质的内容:

    一份 Markdown 文件。仅此而已。

    没有绑定平台 —— 随处可用。没有预加载成本 —— 用时才付费。天然适配 Git —— 像普通代码一样做版本控制。具备在中大型企业环境中规模化、安全、合规地部署和使用的能力 —— 安全团队能直接审查文件内容。

    Skills 的采用曲线说明了一切:第一周 8,000 个 Skills,第三周突破 25,000 个。标准发布后 48 小时内,Microsoft 和 OpenAI 相继采纳了这一格式。

    当你的竞争对手立刻照搬你的东西时,你就已经赢了。

    5.5 关于 MCP,人人都问错了问题

    人们总在问:“我该用 Skills 还是 MCP?”

    这个问题本身就错了。它们干的是完全不同的事。

    MCP 负责连接外部系统 —— 它是智能体的“手”,能伸进 Slack、拉取数据库、调用 API。没有 MCP,智能体就被困在自己的上下文窗口里,寸步难行。

    Skills 用于指导工作流 —— 它是智能体的“训练手册”,告诉它如何做代码审查、什么算好的 API 设计、何时该升级问题。没有 Skills,智能体虽能访问一切,却对你的业务流程一无所知。

    5.6 实际应用中是这样的

    销售团队问:“我们的 pipeline 里有哪些卡住的单子?”

    仅用 MCP:

    • 智能体通过 MCP 连接 Salesforce
    • 返回:47 条 JSON 格式的订单记录
    • 用户手动逐条审查
    • 耗时 30 分钟

    仅用 Skills:

    • 智能体无法访问 Salesforce
    • 用户手动导出数据
    • 智能体用 Skills 中的规则分析
    • 耗时 20 分钟

    两者结合:

    • 智能体通过 MCP 连接 Salesforce
    • 自动加载 "pipeline-review" Skill
    • 关联 Slack 中的相关对话
    • 生成卡单的 Markdown 表格
    • 标记出 3 个需立即跟进的订单
    • 建议具体的跟进步骤
    • 耗时 3 分钟

    这正是 Notion 为其“Meeting Intelligence”Skill 搭配 MCP 连接的原因:MCP 抓取日历、相关文档和近期的 Slack 讨论;Skill 则懂得如何将这些信息整合成符合你公司标准的会议准备模板。

    这套组合的 token 消耗约 18,000。数字听着不少,但你得意识到,你的助手刚用 30 秒干完了原本要花 45 分钟的活。

    5.7 微调 与 Skills 之争

    这里正是资金浪费重灾区。

    微调方案是通过训练改变模型的权重。你喂给它示例数据,跑昂贵的计算任务,等上好几天,最终得到一个专用模型。单次训练成本在 500 到 5,000 美元之间。

    Skills 则只是在运行时注入指令。编辑一份 Markdown 文件,5 分钟搞定,成本几乎为零。

    陷阱在于,很多团队总以为需要微调,其实用 Skills 就够了。

    如果医疗初创公司希望智能体理解肿瘤学术语,微调确实是合理的,因为你是在教它基础模型原本不懂的专业语言。

    但如果你的团队只想让智能体遵循代码审查流程?那该用 Skill。模型本身已经懂代码审查,你只是在指定你们团队的特定标准。

    5.8 二八定律

    现代基础模型(Claude Sonnet 4、GPT-4o、Gemini 2.0)开箱即用的能力已相当惊人。对大多数团队而言:

    • 80% 的需求:一个 Skill 就能搞定
    • 20% 的边缘场景:或许才需要微调

    真正需要微调的场景:

    • 涉及专业术语的医疗报告
    • 有特定引用格式的法律文书
    • 充斥着领域专业术语的科研论文
    • 对速度有极致要求的高吞吐任务

    Skills 完全够用的场景:

    • 遵循公司内部流程
    • 应用标准与模板
    • 正确使用内部工具
    • 基于既定规则做决策

    关键差异:Skills 可即时更新。API 标准变了?改个文件,重启即可。微调则每次变更都得重新训练。按季度重新训练,一年光维持更新就要烧掉 12,000 美元。

    06 多家科技巨头围绕 AI 智能体定制化标准展开的战略博弈

    6.1 12 月 18 日的妙手

    2025 年 12 月 18 日,三家公司几乎在同一时间发布声明。如果你眨眼了,你就会错过今年 AI 基础设施领域最精彩的一场权力博弈。

    太平洋时间 9:00:Anthropic 发布 agentskills.io —— 一套带有参考实现、示例 Skills 和完整文档的开放标准,完全免费。

    太平洋时间 11:30:OpenAI 更新开发者文档。Codex CLI 正式支持 SKILL.md 格式。没有新闻稿,只有一条静默的 changelog。

    太平洋时间 14:00:Microsoft 为 GitHub Copilot 和 VS Code 增加 Skills 支持。同样悄无声息,某天打开编辑器,它就在那儿了。

    三家竞争对手在五小时内集体采用同一套格式?这绝非偶然。

    6.2 Anthropic 的布局

    来看看 Anthropic 的布局,以及它为何能够奏效。

    10月16日:将 Skills 作为 Claude 的私有功能推出,让企业用户上钩。Box 用它自动化文档处理流程,Rakuten 用它简化财务运营流程。

    11月:坐观使用量极速增长。Skills 从内部工具演变为生产依赖组件。此时,企业用户已与之深度绑定。

    12月18日:将该技术作为开放标准发布。所有人构建的 Skill 依然可用,但现在它们无处不在。

    这正是 Anthropic 在 Model Context Protocol(MCP)上用过的同一套打法:

    • 2024 年 11 月:为 Claude 推出 MCP
    • 12 个月:社区共建生态
    • 2025 年 12 月 9 日:捐赠给 Linux Foundation,成为开放标准

    作为私有功能发布 → 生态培育 → 开放开源。这正逐渐成为 Anthropic 的标志性策略。

    6.3 为何 OpenAI 立刻采用了这一技术

    12 月 18 日,OpenAI 面临两个选择:

    • 选项 A:无视 Skills,全力推 GPT Store 和 AgentKit,靠平台绑定留住用户。
    • 选项 B:采纳 Skills,放弃差异化,以执行能力而非生态壁垒竞争。

    他们不到三小时就选了 B。

    这正是耐人寻味之处。

    OpenAI 正同时执行两套看似矛盾的策略:

    私有化路线: 带收入分成的 GPT Store、面向复杂多智能体系统的 AgentKit、定制语音模式 —— 这些是竞争对手难以复制的护城河。

    开放标准路线: 2025 年 12 月采纳 MCP,同日拥抱 Skills,积极参与共享基础设施建设。

    这正是“Android 策略” —— 在采纳开放标准的领域共建生态,同时在平台层构建差异化。OpenAI 清楚:开发者不会为锁定单一供应商的定制方案投入资源。

    他们的算盘是:与其独占一个小市场,不如在一个大市场里占据三成份额。

    事实印证了这一点:截至 2026 年 1 月,Skills 已可在 ChatGPT 桌面端、Codex CLI 和 API 集成中运行,OpenAI 团队还深度参与了 Skills 标准的后续讨论 —— 他们不只是采用这一技术,而是在共同开发。

    6.4 Microsoft 的选择:拥抱并集成

    Microsoft 拥有 23 万家企业用户使用 Copilot Studio,覆盖《财富》500 强中的 90%。当 Anthropic 开放 Skills 时,Microsoft 本是最可能受损的一方。他们花了数年时间搭建 Copilot 的知识连接器、自定义指令、插件体系,一整套企业级基础设施。

    他们本可以筑墙自守,却选择了搭桥互通。

    12月18日:Skills 支持覆盖整个 Copilot 生态 —— VS Code、GitHub Copilot、Copilot Studio,以及所有主流 IDE。

    策略很清晰:“用我们的执行环境,带你的 Skills 来”。Microsoft 不再试图掌控定制层,而是押注规模效应:更多开发者、更多推理请求、更多 Azure 算力消耗。

    这是 Microsoft 云战略在 AI 领域的复制。还记得他们开源 .NET、拥抱 Linux 吗?这是同一套逻辑。当你是基础设施提供商时,你是通过增加总使用量获胜,而非通过锁定格式。

    效果立竿见影:对 Skills 的支持直接推动了已投入 Claude Skills 的企业加速采用 Copilot。

    6.5 Google 的静默反制

    当其他厂商纷纷采纳 SKILL.md 时,Google 走了另一条路。

    2025 年 10 月 8 日:Gemini CLI 推出 Extensions。不是 Skills,是 Extensions。不是 SKILL.md,是 GEMINI.md。

    二者的结构相似:YAML 头部、Markdown 主体、渐进式加载。但差异足以造成互不兼容。

    到 12 月:70+ 个 Gemini Extensions,超 100 万开发者,独立市场平台成型。

    所有人都在问:这是格式战争,还是和平共存?

    乐观派:两种格式都能存活。格式转换极其简单 —— SKILL.md 转 GEMINI.md 基本是查找替换。多格式支持终将成为标配。

    悲观派:Google 看到 Skills 势头太猛,急需差异化筹码。宁可掌控一个小生态,也不愿在他人的地盘当配角。

    现实情况是:截至 2026 年 1 月,尚无融合迹象。Gemini Extensions 与 Agent Skills 服务于重叠但有差异的场景 —— Extensions 更深度绑定 Google Workspace,Skills 则保持更强的平台无关性。

    结局可能如同 IDE 扩展格式之争 —— VS Code 与 JetBrains 各自以不兼容的格式蓬勃发展。也可能最终迫使行业走向统一标准。现在下结论,为时过早。

    6.6 Skills 开放标准发布后,开发者生态爆发式增长

    当巨头们在谈判桌上运筹帷幄时,开发者们已全速行动。

    12 月 19 日:SkillsMP 上线 —— 首个独立的 Skills 市场平台。

    12 月 31 日:8,000 个 Skills 可用。

    2026 年 1 月 9 日:25,000 个 Skills。三大市场平台同台竞争。各细分品类头部作品开始涌现。

    这才是真正赢得格式战争的关键。不是企业战略——而是生态势能。

    当 25,000 个 Skills 同时在三大主流平台上运行,网络效应便进入自我强化循环:

    • 开发者构建 Skills,因为有分发渠道
    • 平台支持 Skills,因为有内容供给
    • 用户期待 Skills,因为它们无处不在

    Google 的 GEMINI.md 拥有 70+ 个扩展,这已相当可观。但 Skills 的数量是它的 350 倍。网络效应就是如此残酷。

    6.7 这对 2026 年意味着什么

    战略格局已然清晰:

    Anthropic:赢下了标准化之战,通过放弃独占性,收获整个生态。这笔交易是刻意为之,他们相信:在足够大的市场中做最好的执行者,远胜于在小池塘里做唯一的主人。

    OpenAI:完美对冲。在关键处保留私有功能(GPT Store、语音),在生态系统重要的领域拥抱开放标准(MCP、Skills)。在执行质量上竞争。

    Microsoft:走量策略。只要所有推理都跑在 Azure 上,谁的格式胜出并不重要。

    Google:两线作战 —— GEMINI.md 对抗 SKILL.md,Gemini 对抗 Claude/GPT-4。处境虽艰难,但并非没有希望。

    6.8 真正的赢家

    真正的赢家是开放格式。

    在 AI 智能体开发的历史上,你首次能够构建一套定制方案,随处运行。你的代码审查 Skill 能在 Claude、ChatGPT、Copilot 乃至(稍作修改后)Gemini 上运行。

    这在 AI 工具史上从未发生过。此前每一代方案,从 Custom GPTs 到插件再到 Actions,都因平台绑定而消亡。

    Skills 或许真能长久存在,恰恰因为没人独占它。

    07 Skills 市场平台的爆发

    7.1 三周内从 0 到 25,000

    12月18日:公开市场中 0 个 Skills。

    12月19日:SkillsMP 上线,首发 127 个 Skills。

    12月26日:8,000 个 Skills。

    1月9日:25,000 个 Skills。

    而 Chrome 扩展花了两年才达到 10,000 个;VS Code 扩展用了 18 个月达到 8,000 个。Skills 仅用一周便达成。

    这是 AI 工具史上生态增长最快的一次。

    7.2 为何爆发得如此之快

    开发者早已在等待这样的方案。

    GPTs 过于封闭,微调成本太高,自定义指令又太过局限。Skills 是那个“刚刚好”的方案 —— 强大到足以干实事,简单到一下午就能构建,可移植性又足以产生影响。

    此外,每家已经构建了 Claude Skills 的公司都能立即发布它们。Box 的文档转换 Skills?发布了。Rakuten 的财务自动化?发布了。房地产定价分析?发布了。

    到 12 月 20 日,Skills 市场平台已被真实企业用户贡献的生产级内容迅速填满。

    7.3 人们究竟构建了什么 Skills

    细分如下:

    40% 开发工具类 —— 代码审查、API 设计、安全扫描、测试生成。每个工程团队都有自己那一套想自动化的流程。

    赢家:"API Standards Enforcer" —— 17,000 次下载。在 PR 审查阶段自动检查 OpenAPI 规范是否符合标准。某团队每周节省 8 小时。

    25% 文档处理类 —— 会议纪要、合同分析、技术写作。遵循固定模式的知识工作。

    赢家:"Meeting Intelligence" —— 12,000 次下载。由 Notion 开发,聚合日历、文档与 Slack 讨论,自动生成会议准备材料。每场会议节省 30 分钟。

    20% 企业运营类 —— 销售漏斗审查、财务分析、合规检查。融合多数据源的业务流程。

    赢家:"Sales Pipeline Analyzer" —— 9,000 次下载。在销售团队察觉前标记即将停滞的订单。报告称成交率提升 15%。

    15% 创意与内容类 —— 博客结构、内容复用、品牌一致性。营销自动化场景。

    赢家:"Technical Blog Factory" —— 6,000 次下载。研究笔记 → 大纲 → 初稿,首稿撰写提速 60%。

    7.4 质量问题

    到 1 月,三大 Skills 市场平台共收录 25,000+ 个 Skills,问题随之浮现:

    寻找优质项目困难:搜索“code review”返回 400 个结果,半数是重复,四分之一无法运行,另四分之一已过时。

    缺乏质量信号:不像 npm 或 Chrome 扩展,没有下载量、用户评分等指标,选择如同盲人摸象。

    文档混乱:部分 Skills 附带完整示例与测试,另一些仅写“Reviews code. Use for reviewing.” —— 感谢,真帮大忙了。

    “版本地狱” :Skills 本质是仓库中的文件,作者可能无声推送具有破坏性的内容变更,导致两周前还能用的 Skill 突然失效。

    市场平台迅速响应 —— 引入用户评分、下载计数、认证徽章、精选合集。到 1 月中旬,质量信号初具雏形,但距离 npm 这类成熟生态仍有巨大差距。

    7.5 利润来源与商业价值所在

    大多数 Skills 免费开放。25,000 个中约 21,000 个采用 MIT 或 Apache 许可证。

    部分采用免费增值模式:基础版免费,专业版收费。“API Standards Enforcer” 对“无限次检查”权限与自定义规则收取 49 美元/月。

    但真正的利润藏在 Skills 周边的企业级基础设施中。

    企业不为单个 Skills 付费,而是为以下能力买单:

    • 带权限控制的私有仓库
    • 全组织范围的部署能力
    • 治理与合规支持
    • 定制化与技术支持

    Box 为 2,000 名员工部署了 40+ 个内部 Skills。他们并未从市场购买,而是自建了管理基础设施。

    SkillsMP 看清了这一点,采用免费市场平台,对企业级功能收费:

    • 私有团队仓库:200 美元/月
    • 企业级管理后台:1,000 美元/月
    • 可被企业以自身品牌重新包装并私有化部署的市场平台服务:5,000 美元/月
    • 支持 SLA:10,000 美元/月

    他们卖的不是 Skills,而是基础设施。

    7.6 下一步将发生什么

    到 2026 年年中:

    市场洗牌:三大市场将收敛为一个市场主导平台和一个专注于企业客户的平台。历史将不断重演,npm 战胜 Bower,Chrome 商店胜过 Firefox 附加组件。

    质量门槛提升:缺乏文档、测试或维护的 Skills 将被淘汰,专业级作品成为主流。

    企业工具成熟:公司在 Skill 管理上的投入将超过 Skills 本身。出现类似 Artifactory 的内部 Skill 仓库。

    垂直领域深化:医疗、金融、法律等行业的专用 Skills 成为利润高地。

    格式升级:现行 SKILL.md 将增加版本控制、依赖管理、安全元数据。GitHub 与 Anthropic 已启动 v2 规范讨论。

    爆发期即将结束,专业生态系统阶段正在开启。

    关键是,从杠杆率最高的工作流切入。严格衡量成效。放大有效实践。果断淘汰无效尝试。

    08 你需要知道的关键信息

    我们刚刚见证了 AI 基础设施史上最快的普及进程:三周内从 0 到 25,000 个 Skills。五小时内四家巨头向同一标准收敛;整个生态在多数人还在忙着节日购物时悄然成型。

    下面说重点。

    8.1 战略层面的真相

    Skills 能赢,恰恰因为它比较无聊。

    没有区块链,没有复杂运行时,没有私有协议。就是 Git 仓库里能被任何智能体读取的 Markdown 文件。2025 年最具颠覆性的 AI 基础设施,本质上不过是一种文本文件格式。

    真正能被广泛采纳的基础设施,靠的不是炫目的技术革命,而在于能否降低整个生态的协作成本。HTTP 战胜了 Gopher,JSON 战胜了 XML,REST 战胜了 SOAP,Markdown 在文档领域碾压一切。

    Skills 再次证明:在开发者工具领域,无聊的方案反而更容易胜出。

    8.2 这对你意味着什么

    如果你在用AI智能体构建产品:

    在 AI 工具领域,标准化问题长期无解 —— 过去每家平台都筑起围墙,定制化方案换个地方就得重写一遍。如今,Skills 首次真正破局:一次编写,处处运行。你的 Skill 写完后,无需修改即可在 Claude、ChatGPT 和 Copilot 间无缝流转。这种可移植性将直接重塑你的架构决策。

    如果你是架构师,Skills 现在已是非选不可的基础设施,不再是锦上添花。你需要一套策略来应对:

    • 如何管理内部 Skills(自建仓库?)
    • 如何审核第三方 Skills(安全审查流程?)
    • 如何治理(谁批准新 Skill?)
    • 如何与现有工具集成(CI/CD、监控?)

    2025 年初想清楚这些问题的公司,将比 2026 年才起步的对手领先整整一年。

    如果你是技术负责人,这是个自研还是采购的决策 —— 无论你是否意识到,你已经在做选择了。

    • 自研:针对公司特有的工作流构建内部 Skills —— 企业标准、合规规则、领域专长。这才是你的竞争优势。
    • 采购:管理 Skills 的基础设施 —— Skill 仓库、安全扫描、部署系统。别自己造轮子,通用基础设施交给专业厂商。

    预算参考:

    • Skill 开发:中型团队每年 $50K–$200K
    • Skill 基础设施:每年 $100K–$500K

    投资回报率高得离谱 —— 某家房地产公司通过 8 个自动化房产分析工作流的 Skills,每年节省了 200 万美元。你的数据可能没这么夸张,但哪怕只有十分之一,几个季度就能回本,不用等上好几年。

    8.3 接下来会发生什么

    爆发阶段已经结束,专业生态系统阶段正在开启。到 2026 年年中,预计 Skills 市场平台将出现整合、Skills 质量门槛将会提高、企业级工具将成熟,并出现垂直领域专业化(医疗 Skills、金融 Skills、法律 Skills)。

    格式本身也会演进。现行 SKILL.md 将增加版本控制、依赖管理和安全元数据。GitHub 与 Anthropic 已启动 v2 规范讨论。但核心概念 —— 带 YAML frontmatter 的 Markdown 文件,会继续保持“无聊”。而这正是它能长久存在的原因。

    END

    本期互动内容 🍻

    你所在的公司或团队,已经开始整理自己的“Skills仓库”了吗?如果还没有,你觉得最大的阻碍是认知不足、工具缺失,还是根本用不上?

    原文链接:

    https://ai.gopubby.com/how-agent-skills-became-ais-most-impor...

    KPI 里面每年都有几篇专利,我一个 App 开发根本不知道怎么去写,有啥好写的呀

    一切都是假的,只有痛苦是真的。明明对被拒绝的结果有预期,为什么还是这么痛。心率都在颤动,眼泪不自觉的就流了下来。多么无奈,长大之后我甚至连好好哭一场都不会了。

    在企业数字化营销的日常工作中,电商运营、品牌市场、活动策划、HR 等业务侧人员,始终绕不开一个核心痛点:移动端营销 H5 的制作与落地。提需求给设计开发团队,往往面临排期长、改稿沟通成本高的问题,极易错过营销热点与活动窗口期;自己上手制作,又常被工具操作门槛高、功能适配性差、视觉效果不达预期、页面加载性能拉胯等问题困住。
    RollCode 作为一款聚焦企业移动端营销落地页场景的低代码开发工具,正是瞄准了业务侧人员的核心需求,以「可视化组件搭建 + 开放式代码嵌入」为技术内核,搭建了一套兼顾零代码操作门槛、全场景适配能力与灵活扩展空间的解决方案,让非技术出身的业务人员,也能自主完成从 H5 创意设计到上线发布的全流程。

    重构低代码协作逻辑,让运营与开发各司其职
    市面上多数低代码平台,始终没能解决一个核心问题:将页面渲染与数据模型配置捆绑,催生出了 “非运营、非开发” 的复合工作形态,既让业务人员觉得操作晦涩、学习成本高,又让开发人员觉得拓展受限、维护困难。
    RollCode 跳出了传统低代码的固有框架,创新采用了View = Render(Data) + Embedding的全新设计模式,将视图拆解为静态数据渲染与灵活代码嵌入两大核心部分,把需求拆解为运营侧与开发侧两个独立的工作模块,形成了逻辑清晰的 1+1 协作模式 —— 既没有创造全新的工作内容,也没有打破两类角色的固有工作习惯,真正实现了 “让运营驱动设计,让灵活归于开发”。

    其中,Embedding 提供了组件级、页面级、外链级三个层级的嵌入方案,全方位覆盖不同场景的开发诉求:运营人员负责页面可视化搭建、内容填充与效果优化,开发人员则通过代码嵌入解决动态数据、个性化功能的拓展需求,二者互不干扰,又能有机整合,彻底解决了传统低代码平台 “运营用不顺、开发用不爽” 的核心痛点。
    零代码可视化搭建,把 H5 制作门槛降到最低
    对于绝大多数没有专业编码能力的业务人员来说,工具的上手难度直接决定了使用效率。RollCode 编辑器深度融合了设计软件的操作逻辑,采用清晰的左中右布局,以 “所见即所得” 为核心原则,核心操作均通过拖拽组件完成,搭配实时预览效果,无需理解代码逻辑,就能完成页面 UI 搭建。
    针对业务人员高频的布局调整需求,平台对布局容器做了全方位优化,水平容器与网格容器支持任意嵌套组合,可自由设置对齐方式、平分最大宽度、行列间隙等核心属性,哪怕是多列商品展示、复杂的活动信息排版,也能通过简单的参数调节实现,无需手动适配不同设备的显示效果。

    同时,编辑器还打磨了大量提升效率的细节功能:数值输入框支持 option/alt + 鼠标拖拽的快捷调节方式,大幅提升参数调整效率;资源属性设置器集成了上传、裁剪、校验功能,一站式完成图片、视频等资源处理,省去了业务人员在设计软件与 H5 工具之间反复切换的麻烦;组件与页面均可另存为模板,实现跨项目复用,比如 HR 团队的招聘 H5、电商团队的大促活动页,只需将标准化的页面结构存为模板,后续活动仅需修改文案、图片等核心信息,就能快速生成新页面,彻底告别重复搭建的无效劳动。
    AI 海报 + 全场景模板库,兼顾创意效率与视觉质感
    营销 H5 的核心竞争力,除了上线效率,更在于视觉呈现与内容创意。很多业务人员能搞定页面结构,却卡在海报设计、视觉优化环节,最终只能做出效果平平的页面。
    RollCode 新增的 AI 海报组件,直接补齐了这一短板。业务人员只需输入海报的主标题、副标题、正文内容,补充风格关键词与画面描述,就能快速生成符合需求的图文海报。更实用的是,生成的海报并非一张不可修改的图片,平台会自动将海报内容拆解为可独立编辑的组件,大到主标题、背景图案,小到装饰元素、祥云纹理,都能单独选中修改。
    既可以直接替换文案,也能通过自然语言指令修改画面元素,甚至支持去除冗余文字、将图片内容转换为文字组件,完全满足营销活动的个性化修改需求,无需借助 PS 等专业设计工具,就能实现一站式的海报设计与页面嵌入,点击确定即可自动解析图文内容为组件并插入页面中,无需手动排版。

    同时,平台整理并精选了数十个覆盖全行业的项目案例与模板,涵盖电商促销、活动推广、企业招聘、教育课程、新品发布、节日营销、金融营销等核心商业化场景,完全匹配业务侧人员的日常工作需求。无论是电商运营要做商品促销页、市场人员要做品牌新品发布页、活动策划要做线下活动报名页,还是 HR 要做招聘简章,都能直接一键创建同款项目,无需从零搭建,快速完成页面制作与上线。
    灵活的扩展能力
    对于业务人员偶尔遇到的动态数据更新需求,RollCode 新增了数据修改器功能,无需复杂的代码开发,就能自由改写组件数据,实现接口数据对接与动态渲染。比如电商大促期间,商品的价格、库存、主讲教师信息变动,只需通过简单的代码修改,就能批量更新页面内容,且不影响原有的静态数据,可自由开启或关闭,既满足了动态数据的更新需求,又不会给业务人员带来过高的操作门槛。
    而对于有开发能力的团队,平台还单独新增了自定义组件开发调试页面,实现与真实页面数据隔离,左侧栏可一次性展示开发者所有的普通组件、页面组件,输入本地组件的调试地址后即可进行调试。开发者可通过自定义组件、自定义页面、RollCode 模式三大核心模块,自由编写代码拓展功能,无需受到平台限制,彻底打破传统低代码平台的能力天花板,充分释放开发者的创造力与生产力。

    针对多站点、多区域运营的企业,平台还支持项目内容的导入与导出(私有化部署版本可用),可将成熟的项目完整导出为压缩包,跨平台、跨私有化版本复用,彻底解决多项目重复开发的问题。
    SSG 静态发布
    对于营销活动来说,页面的上线速度、加载性能,直接影响最终的转化效果。业内研究数据显示,页面加载每延迟 1 秒,用户跳出率便会显著攀升。为从根源规避白屏、加载缓慢等问题,RollCode 打破传统 “JSON + 固定 SPA” 的渲染模式,创新性采用 SSG 静态发布方案,通过按需构建、代码分割、路由预加载等多种技术手段,大幅缩减了打包产物的体积,实现了加载速度的跨越式提升。
    在模拟 4G 网络环境、无痕模式下的对比测试中,RollCode 优化后的 SSG 页面,加载性能远优于传统 SPA 模式,用户访问时可直接获取已预渲染完成的页面,不仅能大幅提升访问体验、降低用户跳出率,更能显著优化 SEO 表现,为营销活动转化提供坚实支撑。
    平台的发布流程也做了极简优化,页面制作完成后,一键即可完成构建发布,自动生成可直接访问的链接;同时支持页面代码导出,生成的生产级代码可直接部署至企业自有服务器或 OSS,充分满足企业对数据安全、自主部署的需求,适配各类企业的部署场景。
    归根结底,RollCode 并非一款单纯的页面搭建工具,而是给企业业务侧与开发侧双向赋能的协作工具。它让原本依赖设计、开发团队的 H5 制作工作,变成了业务人员可自主掌控的流程,把业务人员从冗长的排期、反复的沟通改稿中解放出来,同时又为开发人员保留了充足的灵活扩展空间,真正实现了 “简单页面搭建更简单,复杂页面开发更灵活,开发和运营的协作更自然”。

    我让龙虾去帮我运维一下服务器,删个东西,结果把我整个服务器都清空了,库也被删了,现在正在想办法恢复,把我软件都整下线了。吃一堑长一智,以后要颗粒化配置权限了。

    15077.png
    15076.png

    📰 今日新闻精选:

    • 今年前 2 月我国进出口总值 7.73 万亿元,同比增 18.3%,创同期新高,其中出口增长 19.2%,进口增长 17.1%
    • 2026 年全国一般公共预算安排国防支出 1.94 万亿元,比上年执行数增长 6.9%
    • 春节后,多家农商行、村镇银行等中小银行下调存款利率,最高降幅达 30 基点
    • 成都拟出台住房公积金新政:阶段性取消贷款次数限制,无公积金贷款余额就按首套执行
    • 江苏无锡一地推出 “赘肉换牛肉” 减重挑战赛, 1 斤赘肉换 1 斤牛肉,多减多得,网友称:太会了
    • “龙虾补贴” 密集出炉:龙岗、合肥、常熟、无锡等地相继发布专项扶持政策,最高补贴 1000 万
    • 国家互联网应急中心发布风险提示:“小龙虾” 已出现四大严重安全风险;工信部专家:审慎使用 “龙虾” 等智能体
    • 6G 网要来了上热搜:下载 1 部 4K 电影不到 1 秒,宽带可以达到 5G 的 10 倍以上
    • 中朝国际旅客列车 3 月 12 日起双向开行,车票已开始线下发售
    • 加拿大正式撤销关闭 TikTok 当地业务的决定,TikTok 回应:期待投资新项目
    • 美英气象机构预测:地球或将迎 “超级厄尔尼诺” 现象,明年夏季气温可能创历史新高
    • 加媒:加拿大警方称美国驻多伦多领事馆遭枪击,建筑正面可见多个弹孔
    • 外媒:消息称伊朗新任最高领袖 “在袭击中受伤”,未公开发表讲话,官方回应:新任领袖状况良好,届时会发表讲话
    • 外媒:特朗普称有可能有条件同伊朗谈判;伊朗提出停火首要条件,伊外长称新任最高领袖不会与美国进行任何谈判
    • 外媒:美军称已损失总价值 3.3 亿美元的 “死神” 无人机;美防长称将对伊朗发起 “最高强度” 的军事打击

    📅 今日信息:

    • 公历:2026-03-11 星期三 双鱼座
    • 农历:二〇二六年正月廿三
    • 下一节气:2026-03-20,春分
    • 今年进度:19.18%(已过 70 天,剩余 294 天)

    🌟 历史上的今天

    • 2011 年:日本东北地区发生 9.0 级大地震,引发海啸和福岛核事故,全球关注。
    • 1985 年:苏联领导人米哈伊尔·戈尔巴乔夫就任,开启了改革和开放的新时代。

    今天是 2026 年 3 月 11 日,一个普通的日子,但历史总在提醒我们,平凡中藏着不平凡。愿你在忙碌中找到一点小确幸,比如一杯热茶或窗外的好天气。

    别人搜不到我的微信,我主动加人才发现被风控了?要下载一个国家网络身份认证 app 做认证

    关键这 app 竟然要手机 nfc 刷身份证,现在没多少人会随身带身份证吧。。而且好像只能 nfc 刷,没有其它认证方式,我要是手机没 nfc 是不是不配有身份了。。现在证也没带只能回去再试了。

    搜了下帖子去年就有这玩意了,我算是后知后觉的。微信这风控也没明显提示的,只有添加朋友的时候才会让你认证,所以提醒下和我一样用微信少的去试试,提前认证好,别像我一样在外面尬住了

    Claude 在封号的时候 是拉黑你的邮箱?手机号?信用卡号?还是全封?

    我想请朋友帮我开一下 CC 具体想了解下 用同一个手机号/信用卡给不同账号付款 有没有连累他被封的风险?