Total Pageviews

Wednesday, 31 December 2025

搭建基于nextjs的静态博客程序lotse

 

首先fork此项目https://github.com/marpeand/lotse,我fork后的项目地址是https://github.com/ymbrite/lotse, 
访问 https://github.com/ymbrite/lotse/blob/main/pnpm-lock.yaml删除此pnpm-lock.yaml文件
然后访问https://github.com/ymbrite/lotse/tree/main/content/posts,新建源帖fh.mdx,内容为:

---
title: "战马"
date: 2025-12-31T08:11:00
draft: false
---

此处写视频的嵌入代码

( 详见https://github.com/ymbrite/lotse/blob/main/content/posts/fh.mdx?plain=1)

 然后访问vercel.com/new ,导入项目https://github.com/ymbrite/lotse

然后,点击deploy按钮,等待部署完成,部署完成后,我得到网址https://lotse-tau.vercel.app/

 新建源帖后,博客网站2-3分钟内就会自动更新。

 项目地址:

https://github.com/marpeand/lotse

https://github.com/ymbrite/lotse

演示博客:

https://lotse-tau.vercel.app/
https://lotse-tau.vercel.app/,不支持发表180kb的长文。所以我要删除“稀奇古怪的中国经济”的源帖,博客才更新成功。
https://lotse-tau.vercel.app/fh 能显示视频
----------------------------------------------------
 
p.s.: 通过向程序作者提问-  https://github.com/marpeand/lotse/issues/1 ,得到了回复,
编辑 https://github.com/ymbrite/lotse/blob/main/app/%5Bslug%5D/opengraph-image.tsx文件,修改第5行的值为nodejs即可。
我试了一下,编辑 opengraph-image.tsx文件后,果然能成功发表长文:
 https://lotse-tau.vercel.app/ce

1961年电影《枯木逢春》插曲 -重逢

 

-这音域够宽广

Tuesday, 30 December 2025

chatgpt-web

 用 Express 和 Vue3 搭建的 ChatGPT 演示网页.


Disclaimer: This project is only published on GitHub, based on the MIT license, free and for open source learning usage. And there will be no any form of account selling, paid service, discussion group, discussion group and other behaviors. Beware of being deceived.

中文

cover cover2

Introduction

Supports dual models and provides two unofficial ChatGPT API methods

Method Free? Reliability Quality
ChatGPTAPI(gpt-3.5-turbo-0301) No Reliable Relatively stupid
ChatGPTUnofficialProxyAPI(web accessToken) Yes Relatively unreliable Smart

Comparison:

  1. ChatGPTAPI uses gpt-3.5-turbo through OpenAI official API to call ChatGPT
  2. ChatGPTUnofficialProxyAPI uses unofficial proxy server to access ChatGPT's backend API, bypass Cloudflare (dependent on third-party servers, and has rate limits)

Warnings:

  1. You should first use the API method
  2. When using the API, if the network is not working, it is blocked in China, you need to build your own proxy, never use someone else's public proxy, which is dangerous.
  3. When using the accessToken method, the reverse proxy will expose your access token to third parties. This should not have any adverse effects, but please consider the risks before using this method.
  4. When using accessToken, whether you are a domestic or foreign machine, proxies will be used. The default proxy is pengzhile's https://ai.fakeopen.com/api/conversation. This is not a backdoor or monitoring unless you have the ability to flip over CF verification yourself. Use beforehand acknowledge. Community Proxy (Note: Only these two are recommended, other third-party sources, please identify for yourself)
  5. When publishing the project to public network, you should set the AUTH_SECRET_KEY variable to add your password access, you should also modify the title in index. html to prevent it from being searched by keywords.

Switching methods:

  1. Enter the service/.env.example file, copy the contents to the service/.env file
  2. To use OpenAI API Key, fill in the OPENAI_API_KEY field (get apiKey)
  3. To use Web API, fill in the OPENAI_ACCESS_TOKEN field (get accessToken)
  4. OpenAI API Key takes precedence when both exist

Environment variables:

See all parameter variables here

Roadmap

[✓] Dual models

[✓] Multi-session storage and context logic

[✓] Formatting and beautification of code and other message types

[✓] Access control

[✓] Data import/export

[✓] Save messages as local images

[✓] Multilingual interface

[✓] Interface themes

[✗] More...

Prerequisites

Node

node requires version ^16 || ^18 || ^19 (node >= 14 needs fetch polyfill installation), use nvm to manage multiple local node versions

node -v

PNPM

If you haven't installed pnpm

npm install pnpm -g

Filling in the Key

Get Openai Api Key or accessToken and fill in the local environment variables Go to Introduction

# service/.env file

# OpenAI API Key - https://platform.openai.com/overview
OPENAI_API_KEY=

# change this to an `accessToken` extracted from the ChatGPT site's `https://chat.openai.com/api/auth/session` response
OPENAI_ACCESS_TOKEN=

Install Dependencies

For the convenience of "backend developers" to understand the burden, the front-end "workspace" mode is not adopted, but separate folders are used to store them. If you only need to do secondary development of the front-end page, delete the service folder.

Backend

Enter the folder /service and run the following commands

pnpm install

Frontend

Run the following commands at the root directory

pnpm bootstrap

Run in Test Environment

Backend Service

Enter the folder /service and run the following commands

pnpm start

Frontend Webpage

Run the following commands at the root directory

pnpm dev

Environment Variables

API available:

  • OPENAI_API_KEY and OPENAI_ACCESS_TOKEN choose one
  • OPENAI_API_MODEL Set model, optional, default: gpt-3.5-turbo
  • OPENAI_API_BASE_URL Set interface address, optional, default: https://api.openai.com
  • OPENAI_API_DISABLE_DEBUG Set interface to close debug logs, optional, default: empty does not close

ACCESS_TOKEN available:

  • OPENAI_ACCESS_TOKEN and OPENAI_API_KEY choose one, OPENAI_API_KEY takes precedence when both exist
  • API_REVERSE_PROXY Set reverse proxy, optional, default: https://ai.fakeopen.com/api/conversation, Community (Note: Only these two are recommended, other third party sources, please identify for yourself)

Common:

  • AUTH_SECRET_KEY Access permission key, optional
  • MAX_REQUEST_PER_HOUR Maximum number of requests per hour, optional, unlimited by default
  • TIMEOUT_MS Timeout, unit milliseconds, optional
  • SOCKS_PROXY_HOST and SOCKS_PROXY_PORT take effect together, optional
  • SOCKS_PROXY_PORT and SOCKS_PROXY_HOST take effect together, optional
  • HTTPS_PROXY Support http, https, socks5, optional
  • ALL_PROXY Support http, https, socks5, optional

Packaging

Use Docker

Docker Parameter Examples

docker

Docker build & Run

docker build -t chatgpt-web .

# Foreground running
docker run --name chatgpt-web --rm -it -p 127.0.0.1:3002:3002 --env OPENAI_API_KEY=your_api_key chatgpt-web

# Background running
docker run --name chatgpt-web -d -p 127.0.0.1:3002:3002 --env OPENAI_API_KEY=your_api_key chatgpt-web

# Run address
http://localhost:3002/

Docker compose

Hub address

version: '3'

services:
  app:
    image: chenzhaoyu94/chatgpt-web # always use latest, pull the tag image again to update
    ports:
      - 127.0.0.1:3002:3002
    environment:
      # choose one
      OPENAI_API_KEY: sk-xxx
      # choose one
      OPENAI_ACCESS_TOKEN: xxx
      # API interface address, optional, available when OPENAI_API_KEY is set
      OPENAI_API_BASE_URL: xxx
      # API model, optional, available when OPENAI_API_KEY is set, https://platform.openai.com/docs/models
      # gpt-4, gpt-4o, gpt-4o-mini, gpt-4-turbo, gpt-4-turbo-preview, gpt-4-0125-preview, gpt-4-1106-preview, gpt-4-0314, gpt-4-0613, gpt-4-32k, gpt-4-32k-0314, gpt-4-32k-0613, gpt-3.5-turbo-16k, gpt-3.5-turbo-16k-0613, gpt-3.5-turbo, gpt-3.5-turbo-0301, gpt-3.5-turbo-0613, text-davinci-003, text-davinci-002, code-davinci-002
      OPENAI_API_MODEL: xxx
      # reverse proxy, optional
      API_REVERSE_PROXY: xxx
      # access permission key, optional
      AUTH_SECRET_KEY: xxx
      # maximum number of requests per hour, optional, unlimited by default
      MAX_REQUEST_PER_HOUR: 0
      # timeout, unit milliseconds, optional
      TIMEOUT_MS: 60000
      # Socks proxy, optional, take effect with SOCKS_PROXY_PORT
      SOCKS_PROXY_HOST: xxx
      # Socks proxy port, optional, take effect with SOCKS_PROXY_HOST
      SOCKS_PROXY_PORT: xxx
      # HTTPS proxy, optional, support http,https,socks5
      HTTPS_PROXY: http://xxx:7890
  • OPENAI_API_BASE_URL Optional, available when OPENAI_API_KEY is set
  • OPENAI_API_MODEL Optional, available when OPENAI_API_KEY is set

Prevent Crawlers

nginx

Fill in the following configuration in the nginx configuration file to prevent crawlers. You can refer to the docker-compose/nginx/nginx.conf file to add anti-crawler methods

    # Prevent crawlers
    if ($http_user_agent ~* "360Spider|JikeSpider|Spider|spider|bot|Bot|2345Explorer|curl|wget|webZIP|qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot|ia_archiver|Tomato Bot|NSPlayer|bingbot")
    {
      return 403;
    }

Deploy with Railway

Deploy on Railway

Railway Environment Variables

Environment variable name Required Remarks
PORT Required Default 3002
AUTH_SECRET_KEY Optional Access permission key
MAX_REQUEST_PER_HOUR Optional Maximum number of requests per hour, optional, unlimited by default
TIMEOUT_MS Optional Timeout, unit milliseconds
OPENAI_API_KEY OpenAI API choose one apiKey required for OpenAI API (get apiKey)
OPENAI_ACCESS_TOKEN Web API choose one accessToken required for Web API (get accessToken)
OPENAI_API_BASE_URL Optional, available when OpenAI API API interface address
OPENAI_API_MODEL Optional, available when OpenAI API API model
API_REVERSE_PROXY Optional, available when Web API Web API reverse proxy address Details
SOCKS_PROXY_HOST Optional, take effect with SOCKS_PROXY_PORT Socks proxy
SOCKS_PROXY_PORT Optional, take effect with SOCKS_PROXY_HOST Socks proxy port
SOCKS_PROXY_USERNAME Optional, take effect with SOCKS_PROXY_HOST Socks proxy username
SOCKS_PROXY_PASSWORD Optional, take effect with SOCKS_PROXY_HOST Socks proxy password
HTTPS_PROXY Optional HTTPS proxy, support http,https, socks5
ALL_PROXY Optional All proxies, support http,https, socks5

Note: Modifying environment variables on Railway will re-Deploy

Deploy with Sealos

Environment variables are consistent with Docker environment variables

Package Manually

Backend Service

If you don't need the node interface of this project, you can omit the following operations

Copy the service folder to the server where you have the node service environment.

# Install
pnpm install

# Pack
pnpm build

# Run
pnpm prod

PS: It is also okay to run pnpm start directly on the server without packing

Frontend Webpage

  1. Modify the VITE_GLOB_API_URL field in the .env file at the root directory to your actual backend interface address

  2. Run the following commands at the root directory, then copy the files in the dist folder to the root directory of your website service

[Reference](https://cn.vitejs.dev/guide/static -deploy.html#building-the-app)

pnpm build

FAQ

Q: Why does Git commit always report errors?

A: Because there is a commit message verification, please follow the Commit Guide

Q: Where to change the request interface if only the front-end page is used?

A: The VITE_GLOB_API_URL field in the .env file at the root directory.

Q: All files explode red when saving?

A: vscode please install the recommended plug-ins for the project, or manually install the Eslint plug-in.

Q: No typewriter effect on the front end?

A: One possible reason is that after Nginx reverse proxy, buffer is turned on, then Nginx will try to buffer some data from the backend before sending it to the browser. Please try adding proxy_buffering off; after the reverse proxy parameter, then reload Nginx. Other web server configurations are similar.

from  https://github.com/Chanzhaoyu/chatgpt-web

X-BUILD

 A front-end scaffolding built on Vite + Vue3 + TypeScript. 


一款协助你快速从"零"搭建大型应用的前端脚手架。

简介

X-BUILD 基于 vue3 + typescript,使用 vite 构建项目,支持众多的开箱即用的功能和针对项目进行了不同程度的优化,初始模板打包后体积仅为 150kb / 50kb(gzip)。它的宗旨是快速创建一套纯净却具备强大基础功能的模板,协助开发者自由发挥快速搭建任何类型的项目。

文档

文档地址

如何使用?

CLI

你可以通过全局安装 X-BUILD,它本质上是一款 CLI (command-line interface,中文:命令行界面) ,提供了一系列的选项,为你生成一套适合于你的前端开发模板,这套模板已经提供了许多通用的基础功能,为你的项目打下坚实的基础。

基于 X-BUILD 打造自己的脚手架

通常情况下,每个团队的习惯不同,尽管 X-BUILD 提供了可选项辅助生成个性化模板,但不能满足所有人的需求,所以基于 X-BUILD 打造一套自己的脚手架是一个更好的选择,你可以通过 Fork 本仓库,修改成你的团队的开发习惯。

核心功能

脚手架可以快速帮你创建一份空白模板,提供了许多通用的功能:

应用

  • 基于文件的路由
  • 提供环境变量:开发环境、预生产环境、生产环境
  • 基于 Pinia 实现的全局状态管理,更好的支持 TS
  • 提供一个基于 mitt 的组件联动交互的解决方案
  • 提供实用 Hooks,更多情况下推荐使用 vueuse
  • 基于 axios 异步请求封装
  • 基于环境变量的静态资源组件
  • 自动加载 SVG 的图标组件,雪碧图打包
  • 页面登录访问权限、指令权限
  • 页面缓存(基于 keep-alive 实现)
  • 支持 gzip
  • 支持 PWA

UI

  • 布局系统
  • 可选 LessSass/Scss 预处理器
  • 根据路由与环境变量自动变化标签栏 Title
  • 静态资源加载页面
  • 页面载入进度条

规范

  • ESLint Airbnb 规范
  • Stylelint
  • husky & Commitlint

浏览器支持

本地开发:推荐使用 最新版浏览器,不支持 Chrome 80 以下版本。

生产环境:支持现代浏览器, 不支持

IE Edge Firefox Chrome Safari
not support last 2 versions last 2 versions last 2 versions last 2 versions

from  https://github.com/codexu/x-build

learn-collect

 收集在学习和提高技术过程中遇到的比较有价值的网站、文档、Blog等,方便自己查阅.

Tags

前端技术  图像  文字相关  有趣的网站  工具站  素材站


⬆️ : 点击回到Tags

前端技术

  • 电子书
  • 博客

⬆️ : 点击回到Tags

图像处理

此人不存在(无肖像权人脸)
消除背景图(比PS简单好用,抠头发神器)

⬆️ : 点击回到Tags

文字相关


⬆️ : 点击回到Tags

有意思的网站

假装升级(假装系统升级)
用户体验最糟糕的UI网站(心情不好的时候千万不要打开)

⬆️ : 点击回到Tags

工具站

Smallpdf(免费PDF转换网站,可转Word、PPT等,支持合并分割pdf)
地图生成器(可导入PPT)
Flourish(在线制作可视化数据)
白描网页版(可以提取照片文字)

⬆️ : 点击回到Tags

素材站

PPT 超级市场(完全免费的 PPT 模板下载)
from  https://github.com/mk965/learn-collect

基于nodejs的博客程序VanBlog

 

一款简洁实用优雅的个人博客系统

vanblog.mereith.com

 

VanBlog是一款简洁、实用、优雅的个人博客系统,支持全自动按需申请HTTPS证书、黑暗模式、移动端自适应和评论功能。它内置了流量统计和图床,并集成了评论系统。此外,VanBlog还具有无限的可扩展性,提供完备的后台管理面板,支持黑暗模式、移动端、一键上传剪贴板图片到图床,并带有强大的编辑器。

项目主页: vanblog.mereith.com

Demo(后台账号密码均为 demo): blog-demo.mereith.com

预览图

前台-白色

特性

  • 快到极致的响应速度,Lighthouse 接近满分。
  • 独一份的按需全自动 HTTPS,甚至不用填域名。
  • 包括完整的前后台和服务端。
  • 前台和后台都为响应式设计,完美适配移动端和多尺寸设备。
  • 前台和后台都支持黑暗模式,并可自动切换。
  • 前台为静态网页(SSG),并支持秒级的增量渲染,每次改动无需重新构建全部页面。
  • SEO 和无障碍友好,支持自定义文章路径。
  • 静态网页,CDN 友好。
  • 版本号展示和更新提醒。
  • 基于 React,项目工程化,二次开发友好。
  • 内置强大的分析功能,可统计访客等数据。并配有精美看板。
  • 内嵌评论系统。
  • 强大的 Markdown 编辑器,支持图表和数学公式,一键插入 more 标记,一键剪切板及本地图片上传,支持自定义高亮块语法,支持 Emoji 表情选取。
  • TOC、草稿、代码复制、访客数、评论数、分类、标签、搜索、加密、友链、打赏、自定义导航栏。
  • 多个布局设置,可自定义页面细节。
  • 高度定制化,可添加自定义 CSS、HTML 和 JS 代码。
  • 支持自定义页面。
  • 可添加具有指定权限的协作者。
  • 内置图床,并支持各种 OSS 图床、github 图床(外部图床基于 picgo)等
  • 支持上传图片自动添加水印,无论何种图床
  • 支持上传图片自动压缩,无论何种图床
  • 极致轻量化,没有花里胡哨。页面秒切换、图片懒加载。
  • 脚本一键部署,多种部署方式,支持 ARM 平台。
  • 支持 GA、百度分析
  • 简单易用的后台,支持数据的导出与导入。
  • 支持 RSS 订阅
  • 完善的 API,完全利用本项目后台和服务端,自己写前端或适配其他页面生成器
  • 有较完善的日志记录,后台可直接查看登录日志和 Caddy 日志。

快速上手/部署教程

一键脚本部署

curl -L https://vanblog.mereith.com/vanblog.sh -o vanblog.sh && chmod +x vanblog.sh && ./vanblog.sh

将来如果需要再次运行脚本,可以运行:

./vanblog.sh

其他部署方式

具体请移步项目文档:快速上手

反代

请参考: 反代

常见问题

备份与迁移

作者 logo 无法加载

http error

docker 镜像拉取慢

如何外部访问数据库

如何回滚

如何升级

更新后后台报错||一直加载中

开启了 https 重定向后关不掉

更多常见问题

关于更新

此项目会持续更新的,如果没有恶性 bug(有的话看到了会紧急修复),一般每周发一次新版本。

如果遇到了问题,可以先更新试试看。

交流群

说明与文档

请移步项目主页: https://vanblog.mereith.com

CHANGELOG

CHANGELOG

开发指南

谁在使用

现在可能用的人有一些了吧 - -

如果您想把自己加进来,请提一个 issue,我会尽快添加的。

TODO

  • 精简前台 js 体积,优化性能
  • 精简打包体积
  • 集成 HTTPS 和自动证书申请续期
  • 后台增加登录日志
  • 内嵌评论系统
  • 支持 ARM64
  • 支持 mermaid 语法
  • 替换编辑器为 bytemd(掘金同款)(老的编辑器有些臃肿,复制偶尔会有格式会错乱的问题)
  • 导入 md 创建文章/草稿功能
  • 标签管理
  • 黑暗模式图标样式优化
  • 内嵌评论的邮件通知和 webhook
  • 自定义 css
  • 添加自定义 script 标签
  • 添加自定义 html 代码
  • 可添加具有自定义权限的协作者
  • 自定义页面
  • RSS 订阅
  • 自定义高亮块语法支持
  • Emoji 表情选择器
  • 自定义导航栏
  • 后端性能优化一期(减少不必要的查询, ISR 防抖等)
  • Token 管理
  • picgo 插件安装
  • 忘记密码
  • 分类加密
  • 自定义文字路径
  • 系统日志查看
  • 快捷分享按钮
  • 完善可自定义上传文件的自定义页面功能(现在的自定义页面有潜在的 css 污染问题)
  • 图片上传自动添加水印
  • 迁移到 pnpm,使用 workspace
  • 增加在特定事件后触发执行自定义代码或 webhook 的扩展能力
  • 上传图片自动压缩功能
  • 批量操作文章草稿
  • 插件系统
  • 自定义主题(前端渲染器)系统
  • 浏览器消息通知
  • 文章/草稿的历史版本管理
  • 精简配置项,尽可能移动到运行时配置
  • 增加 ORM 层,适配更多数据库
  • 增加一些 e2e 测试,集成到 CI
  • 国际化

问题反馈

请提 issue ,如无特殊情况会在一天内解决。

from  https://github.com/Mereithhh/vanblog

Monday, 29 December 2025

ClashX

 ClashX 是一个以Clash为内核的MAC系统翻墙工具.

A rule based proxy For Mac base on Clash. 原作者删库。

ClashX 旨在提供一个简单轻量化的代理客户端。使用教程

注意

  • ClashX / ClashX Pro 只是一个代理工具,不提供任何代理服务器。如果服务器不可用或与服务器续费有关的问题,请与您的提供商联系。
  • ClashX / ClashX Pro 目前并没有创建官网。凡是声称是 ClashX / ClashX Pro 官网的一定是骗子。

Features

  • HTTP/HTTPS and SOCKS protocol
  • Surge like configuration
  • GeoIP rule support
  • Support Vmess/Shadowsocks/Socks5/Trojan
  • Support for Netfilter TCP redirect

Install

ClashX Pro With enhanced mode and other clash premium feature

ClashX Pro版本,支持增强模式以及更多Clash Premium Core特性。

You can download from Release page

Build

Download deps

bash install_dependency.sh
  • Build and run.

Config

The default configuration directory is $HOME/.config/clash

The default name of the configuration file is config.yaml. You can use your custom config name and switch config in menu Config section.

Checkout SS-Rule-Snippet for Clash for more detail.

Advance Config

修改代理端口号

  1. 在菜单栏->配置->更多设置中修改对应端口号

Change your status menu icon

Place your icon file in the ~/.config/clash/menuImage.png then restart ClashX

Change default system ignore list.

  • Change by menu -> Config -> Setting -> Bypass proxy settings for these Hosts & Domains

URL Schemes.

Using url scheme to reload current config.

clash://update-config

Get process name

You can add the follow config in your config file, and set your proxy mode to rule. Then open the log via help menu in ClashX.

script:
  code: |
    def main(ctx, metadata):
      # Log ProcessName
      ctx.log('Process Name: ' + ctx.resolve_process_name(metadata))
      return 'DIRECT'

FAQ

  • Q: How to get shell command with external IP?
    A: Click the clashX menu icon and then press Option-Command-C

关闭ClashX的通知

  1. 在系统设置中关闭 clashx 的推送权限
  2. 在菜单栏->配置->更多设置中选中减少通知

Note:强烈不推荐这么做,这可能导致clashx的很多重要错误提醒无法显示。

全局快捷键

  • 在菜单栏配置->更多配置中,自定义对应功能的快捷键。(需要1.116.1之后的版本)
  • 使用AppleScript设置, 详情点击 全局快捷键

from  https://github.com/bannedbook/ClashX

  • Make sure have python3 and golang installed in your computer.

  • Install Golang

    brew install golang
    
    or download from https://golang.org
    
  • Using url scheme to import remote config.

    clash://install-config?url=http%3A%2F%2Fexample.com&name=example
    
  • Encryptionbox


    EncryptionBox is online tool which gives you 64 different type of encryption. How to make it it useful? First clone the git http://encryptionbox.wingcompiler.me/ and after that upload the code in your web server and open the file which the config.php which is in the includes folder of the code. In config.php file you can add the discription of the website.

    from  https://github.com/gunjeetbawa10/Encryptionbox

    空難唯一倖存者,8天7夜絕境求生,一場震撼世人的極限生存-Annette

    -专注当下,靠喝雨水为生。

    搭建基于nextjs的静态博客程序lncb


    首先fork此项目https://github.com/Insaneninjan/next-custom-blog,我fork后的项目地址是https://github.com/ymbrite/lncb, 

    ---
    title: "战马"
    date: "2025-12-28"
    ---

    此处写视频的嵌入代码

    ( 详见https://github.com/ymbrite/lncb/blob/main/data/fh.md?plain=1)

     然后访问vercel.com/new ,导入项目https://github.com/ymbrite/lncb

    然后,点击deploy按钮,等待部署完成,部署完成后,我得到网址https://lncb-seven.vercel.app/

     新建源帖后,博客网站2-3分钟内就会自动更新。

     项目地址:

    https://github.com/Insaneninjan/next-custom-blog

    https://github.com/ymbrite/lncb

    演示博客:

    https://lncb-seven.vercel.app/

    https://lncb-seven.vercel.app/posts/fh ,此帖子本来并不显示视频,解决办法:访问

     https://github.com/ymbrite/lncb/blob/main/lib/post.js,修改第46行的.use(html)

     .use(html, { sanitize: false })

     2分钟后,再访问https://lncb-seven.vercel.app/posts/fh,发现能显示视频了。

    博客的 帖子是按字母顺序排列:

    https://lncb-seven.vercel.app/posts/ce

     https://lncb-seven.vercel.app/posts/fh

     https://lncb-seven.vercel.app/posts/o-test

     https://lncb-seven.vercel.app/posts/prerendering-about

    搭建基于nextjs的静态博客程序mmm(支持分页)


    首先fork此项目https://github.com/mk965/mengke.me,我fork后的项目地址是https://github.com/ymbrite/mmm, 
    访问 https://github.com/ymbrite/mmm/blob/main/package.json,在第7行的next dev的后面加上 --webpack
    在第8行的 next build的后面加上 --webpack
    把第40行的next的值改为latest
    访问 https://github.com/ymbrite/mmm/blob/main/pnpm-lock.yaml, 点击页面的右上角的
    "...", 往下拉动弹出的下拉菜单,来到delete file这里,点击 delete file以删除此文件。
    然后访问https://github.com/ymbrite/mmm/tree/main/data/blog/202512,新建源帖fh.mdx,内容为:

    ---
    title: '战马'
    date: '2025-12-29T15:01:00'
    tags: ['Front-End', 'Job', 'Wlb']
    draft: false
    summary: '这是一篇文章'
    images: ['/static/images/blog/202512/Join_Us/Join_Us.webp']
    authors: ['default']
    ---

    此处写视频的嵌入代码

    ( 详见https://github.com/ymbrite/mmm/blob/main/data/blog/202512/fh.mdx?plain=1)

     然后访问vercel.com/new ,导入项目https://github.com/ymbrite/mmm

     然后在vercel.com/new中,设置部署的命令,如下图:


     

    然后,点击deploy按钮,等待部署完成,部署完成后,我得到网址https://mmm-nine-phi.vercel.app/

     新建源帖后,博客网站2-3分钟内就会更新。

     项目地址:

    https://github.com/mk965/mengke.me/

     https://github.com/mk965/mengke.me/issues/21

    https://github.com/ymbrite/mmm

    演示博客:

     https://mmm-nine-phi.vercel.app/

     https://mmm-nine-phi.vercel.app/blog/  支持分页

     https://mmm-nine-phi.vercel.app/blog/202512/fh 不能显示视频?解决办法:

    访问https://github.com/ymbrite/mmm/blob/main/next.config.js ,在第16行的

    末尾,加上*.youtube.com  ,然后保存更改。2分钟后,再来访问https://mmm-nine-phi.vercel.app/blog/202512/fh ,发现能显示视频了。


    Sunday, 28 December 2025

    刘晓波:官权的暴力统治与杨佳的暴力复仇


    作者:刘晓波
    独立中文笔会 2008-07-25发布

    一、杀手变大侠的警示:"以民为敌"的统治必然带来"以官为仇"的民意

    北京青年杨佳闯入上海市闸北警局,连续刺杀10名警察,死6人,伤4人。其惨烈程度,堪称中共掌权后最具爆炸性的袭警案。

    令官方万万想不到的是,六个毙命于杨佳刀下的警察,非但没有得到舆论足够的同情和哀悼,反而遭遇网络民意的冷漠甚至幸灾乐祸,即便某位遇难警察的遗孀在博客上为警察鸣冤叫屈,也无法赢得网络民意的同情。有网民就说:"被杀的警察并非无辜。"而官方定义的"歹徒"或"暴徒",法律定义中的"杀人嫌犯",却在民意中变成"大侠"或"草根英雄",为杨佳叫好的网络波涛异常汹涌,有人呼吁为杨母亲募捐,为大侠树碑立传,多个版本的杨佳"列传"遍布网络。与此同时,杨佳留下的网络记录也被搜索出来,马上成为无数网民追捧的热帖。

    国内如此,海外网络舆论亦如此。据《多维新闻网》就"是否同情杨佳"进行的网络调查显示,截至7月23日的调查结果为:同情2306,占72%;不同情352,占11%;谴责562,占17%.如此悬殊的比例,凸显出民心所向。

    杨佳曾经是具有自觉维权意识的守法国民,他也曾遭到山西警察的殴打,他通过韧性的依法维权,从山西警察那里讨回的"说法"——上门道歉和三万元赔偿。对上海警方,杨佳也进行了长达十个月的依法维权,但并没有从上海警方那里讨回任何"说法",这才有杨佳的决绝:"有些委屈如果要一辈子背在身上,那我宁愿犯法。任何事情,你要给我一个说法,你不给我一个说法,我就给你一个说法。"(《南方周末》2008年7月17日)当杨佳穷尽所有合法手段而依然无效之时,他绝望了:如果不以命易命,他的冤情必将石沉大海,成为无数个有冤无处申的受害者之一,而唯其采取这种石破天惊的方式,他的冤情才能为社会所知。在此意义上,杨佳案见证了一个守法公民是如何被逼成"杀人犯"的过程,正如我的上海朋友王晓渔所言:"做不了秋菊,只能做杨佳!"

    杨佳被奉为"英雄"的网络舆论所揭示的,绝非民意的是非不分和无人性冷血,而是无权无势群体的民心所向,凸显出鲜明的爱憎。从否定的方面看,揭示了现行制度的暴虐性和极端的司法不公(如果杨佳杀的是平民,他绝不会得到民意的同情),更揭示了警察机构在民意中的恶劣形象。从肯定的方面看,杨佳与一般人的区别在于,他做了其他忍气吞声者想做而不敢做的事,他以极弱挑战极强的勇气和能力,让愤愤不平而又逆来顺受的民众获得了一种心理补偿——终于有人帮助所有的弱者挑战强大无比的官权。正如署名"和不谐"的网民所言:"杨佳杀警,以中国人的胆小逆来忍受,宁愿自杀也不反抗的性格,他自然成了英雄。当他走向刑场时,必有千千万万人在天地之间,在浸透了百姓冤仇的血路上,为他送上一碗'杀头酒',长跪送行。"

    扩而广之,在大权在握的强者与无权无势的弱者之间,敬佩敢于挑战强者的弱者,乃人之常情。何况,在中国的制度下,民众对警察是绝对的弱势,单个百姓对警察机关就是弱中之弱。与警察机构相比,杨佳是无权无势的平民,是弱中之弱。故而,他以命相拼的复仇,绝非一般的勇气,而是大勇。他与警察的对决,不是一对一的"单抠",而是以一当十;他不是偷袭大街上巡逻的警察,而是直冲堂堂的专政机关。如此作为,不仅是弱者挑战强者,而且是极弱挑战极强。试想,如果杨佳是用偷袭的方式杀掉单个民警,他至多赢得同情,但不会赢得敬佩。正因为他以极弱之地位挑战极强之机构,用自己的生命挑战强大官权,他才能赢得了"扬大侠"的美誉。

    如同火烧瓮安县县衙门大楼的群情激愤以及不相信官方信息的民意一样,"一辆自行车引发的血案"及民心所向,再次向中共当局发出警告:当局觉得冤枉或谴责网络舆论的非理性,并没有多大意义。最有意义的事情是当局的深刻自省,检讨警察执法的问题和警察制度的弊端,检讨造成杨佳案和网络舆论的制度原因。

    在基本人权得不到制度化保障的中国,国家正义或司法正义的严重匮乏便成为常态。当正义无法变成制度性安排,而国民的权利意识已经觉醒,正义就只能是民众的"经验正义"和"良心正义"。当公权力践踏人权的案例变成公共事件之时,民众的"经验正义"和"良心正义"就会自动变成公共舆论的正义诉求,要求公权力公布真相和践行司法正义,要求改变"恶法"或"恶制",要求惩罚践踏人权的官员和执法者。

    在此意义上,六名警察直接死于杨佳的暴力袭击,间接死于中国的司法不公和制度暴虐。

    在中国,极弱的民权与极强的官权的力量对比,致使官权欺民之甚可以肆无忌惮,民间自保之弱沦为投诉无门无效。当被公权力侵害的平民很难得到舆论救济和司法救济之时,投诉无门无效的受害者很容易产生对公权力的绝望,而绝望之人借以实现正义的方式就只剩下体制外反抗。这种反抗的极端方式,之于个人是原始性暴力复仇,之于群体是暴力泄愤。杨佳袭警是个体暴力复仇,瓮安民变是群体暴力泄愤,网络民意为杨佳和瓮安民众叫好是群体性言论泄愤。

    你可以批评为杀手叫好的网络暴戾之气,但在这个官权极端冷血的国度,平民的反复申诉甚至跪拜哭求都毫无效果,平民的合法合理诉求屡屡遭到警察的野蛮打压,守法的国人动辄遭到身心侵害,在如此恶劣的经验积累中,某些无权无势的民众走向暴力反抗,更多民众借此来发泄层层积累的不满,甚至进行非理性的仇恨宣泄,也就成为必然。这样的宣泄,一来可以给权势者施加舆论压力,二来虚拟网络中的言论宣泄可以成为现实中的暴力宣泄的替代品。

    官权在现实中堵死民众的合法诉求之路,已经极为愚蠢,结果是愈演愈烈的官民冲突。官权禁止网络中的宣泄,就是蠢上加蠢,堵死言论宣泄的网络之路等于开启暴力宣泄的现实之路。所以,无论是暴力复仇还是暴力泄愤,主要来自"以民为敌"和"官逼民反"。事实上,六四以来的十九年里,中共合法性的破产和民间权利意识的觉醒带来了日益高涨的民间维权,即便偶尔也有呼吁暴力革命的主张,但从理念到实践,"非暴力抗争"无疑是民间的主流,八九运动如此,今日此起彼伏的维权亦如此。而中共官权的反应仍然是十九年前的强力镇压,对"天安门母亲"为子鸣冤的诉求,对底层民众及上访群体维护经济利益的诉求,对民间宗教团体的信仰自由诉求,对政治异见人士的言论自由诉求,对开明媒体及其新闻人的新闻自由诉求,对法律界和维权律师群体的司法独立诉求,对党内民主派为赵紫阳鸣冤的诉求,对社会各界的反腐败和政治改革的诉求……从江泽民政权到胡锦涛政权,不但从来没有给予善意的回应,而且动不动就开动专政机器进行镇压,制造了难以计数的人权灾难。

    正所谓:旧债累累,新债不断。

    瓮安民变和杨佳暴力袭警,再次凸显了官权的暴虐正在消磨掉民间非暴力维权的耐心,对官权的反抗正在从和平维权走向暴力反抗,指向官府及官员的个体暴力和群体暴力越来越多,昭示出官民冲突正在向着以暴易暴的最坏方向发展。

    二、杨佳案是中国社会悲剧的缩影

    当中国的改革已经进入第三十个年头,无论对杨佳本人和他的亲人,还是对被杀警察和他们的家庭,此案都是一个大悲剧。更进一步,在整个社会对此案的高度关注中,此案的意义已经远远超出个人报复的性质,也超出了公民与警察之关系,而是中国社会悲剧的缩影——制度性的悲剧。

    我不否认,反抗暴政是受害者的天然权利,特别是当所有依法维权的途径都被堵死,受害者耗费大量个人资源并穷尽全部合法维权手段而依然无效,受害者有权利选择暴力反抗。但在中国当下的制度环境和民间生态的制约下,个人行使暴力反抗权利的正义性,首先,要区分被动自卫和主动施暴;其次,要区分反体制暴力和个人复仇暴力;最后,还要视暴力反抗的客观效果来界定。杨佳的暴力反抗是个人复仇的主动施暴,其结果又是双方的生命代价,是没有赢家的玉石俱焚,也就谈不上正义。

    从个人的角度讲,我同情杨佳,因为他是在穷尽依法维权的手段之后才选择暴力复仇的。但杨佳不是英雄或大侠,因为他结束了六个生命。我以为,对生命的珍重不必区分警民,不能仅仅因为警察的身份被杀就是活该。即便被杀警察中可能有迫害过杨佳的人,起码也是罪不当株。

    我也理解为杨佳叫好的民意,必须忍受暴虐专政机器的当下体验和源远流长的"侠客"记忆,共同塑造民众对"逼上梁山"和"绿林好汉"的高度认同。但在中国由人治走向法治的转型中,这种认同绝非中国之福,"侠客"情结背后,有公正的渴望,也有仇恨意识,更有对法外暴力的崇拜,甚至就是对杀人的崇拜。那些被"逼上梁山"的好汉们,个个都身背人命。反过来说,如果此前没杀过人,也休想成为梁山好汉。《水浒传》在中国的长盛不衰,电视剧《水浒传》主题歌的风靡一时,"该出手时就出手,风风火火闯九州"的歌词,甚至就是把杀人越货上升为匡扶正义。从逼上梁山的无奈到杀手变英雄的颂歌,诠释了一种中国式的江湖道义和暴力美学,更因这种江湖道义的对立面是堂庙规矩,针对官吏的复仇性杀人越发迸发出悲壮的美感。

    如果说,在丛林时代,个人性正义诉求,只有通过暴力复仇才能达成;政权更迭,也只有通过军事政变或暴力革命来完成。那么,当人类已经进入文明时代,达成个人正义诉求和完成制度性变革的手段已经随之文明化,非暴力手段也越来越成为主流。在第三波民主化浪潮中,无论是苏东还是亚洲,即便有罗马尼亚式的政变型变革,非暴力变革仍然是主流。

    当下中国,虽然政权的暴虐性质还没有根本改变,但后极权时代的统治已经进入理智独裁的时期,民间的自发努力也在逐渐扩展自由空间,官民博弈之路也并非只有暴力镇压与暴力反抗,持续累积的非暴力反抗所形成的压力,也会导致官权的妥协和局部制度的改革。在此情况下,民间反抗暴虐制度的勇气,不是非要通过"杨佳式复仇"才能凸显;国人的正义感,不是只有通过"言论泄愤"才能表达;国人的良心,不能只靠仇恨来喂养;因为,仇恨仅仅是人类的"初级感情",却具有巨大的破坏力,如同"人类头脑中的核武器。"(《仇恨的本质》,小拉什·多兹尔著,王江译,新华出版社2004年版)

    就拿杨佳案来说,事实上,在互联网时代的中国,杨佳的个人维权也并没有穷尽了所有非暴力手段,起码还有一条非暴力维权之路——通过在媒体上公开冤情和诉求来寻求舆论救济。传统媒体不行,他还可以利用互联网,类似杨佳的情况大概还不至于被封杀。试想,如果杨佳把他的遭遇和维权过程持续地在网上披露,说不定会引发关注而变成一个公共话题,那么杨佳本人肯定会得到网络民意的支持,鼓励他坚持依法维权,上海警方也将受到网络舆论压力,他也许就不会采取暴力复仇的极端手段。

    从古代到现代再到当代,中国独裁制度及其文化的惰性之大,似乎非有流血的革命不足以革新,正如鲁迅所言,中国的改革之难,搬一张桌子都要流血。"瓮安民变"后中共官权有所反省,"杨佳袭警案"后中共头号电视喉舌央视也做了反思性节目,7月24日中共有关部门又发布了《关于违反信访工作纪律适用〈中国共产党纪律处分条例〉若干问题的解释》和《关于违反信访工作纪律处分暂行规定》。这是中共第一次就信访工作责任追究作出系统规定,其中特别规定了"处置群体性事件滥用警力可被撤职"。以上变化,似乎为暴力抗争推动变革提供了某种合理性与立竿见影的例证。然而,在21世纪的今天,如果中共的体制性滥用暴力只有遭遇民间的暴力反抗才能有所收敛,中国的司法进步和政治进步只有靠民间暴力才能推动,那么中国从野蛮走向文明的代价也许将惨烈到难以承受的地步。

    三、消除"以官为仇"的前提是放弃"以民为敌"

    毋庸讳言,近年来中国屡屡发生震撼性的血案,凸显了中国社会日益严重的暴戾之气,但其主要根源是官权的暴虐统治。杨佳杀警的舆论效应成倍地放大了社会的暴戾气氛,上海司法机构处理杨佳案的罔顾基本程序正义与期待司法公正的民意,只能继续放大和加深这种暴戾之气。

    杨佳案所引发的民间逆反,让上海警方和被杀警察的家人觉得万分委屈,但仅仅对外表达委屈,并不足以改变民心所向。如若要改变警察在民意中的恶劣形象,消除民众对司法机关的不信任,唯有在杨佳案的审理中做到透明和公正,满足庭审直播的民意期待。

    因为上海警方没有给杨佳"一个说法",杨佳就以暴力杀警给了上海警方"一个说法"。即便惨烈的血案过后,上海警方能否给杨佳案"一个说法",至今还是未知数。"这个说法"起码包括两大要点,1,袭警前,杨佳与上海警方的冲突真相,这是揭开杨佳作案动机的关键。与此相关的焦点是杨佳母亲的下落问题。案发后,杨佳的母亲被上海警方以"协助调查"为由带走,直到半个月后的19日,杨母才在舆论的千呼万唤中出现。更为蹊跷的是,她一出现媒体上,就是按照上海官方的定调说话,她居然委托闸北区政府的法律顾问代理杨佳的案子。对此上海司法机构必须做出交代。2,杨佳能否得到公开公正的司法审判,是检验中国司法公正的试金石。现在,杨佳聘请律师的问题已经成为案发后检验中国司法公正的第一道门槛,但截至目前,上海司法部门仍然坚持指定闸北区政府法律顾问的谢有明律师代理杨佳案,并通过黑箱操作取得杨佳母亲的授权,已经跌倒在第一到门槛上。

    上海的警方、检察院和法院能否提供出既合法又服众的"说法",已经远远超出杨佳个人与上海警方之间的恩怨,而变成了中国司法能否挽回杨佳案所带来的空前信任危机,变成了上海司法能否给高度的舆论关注一个合法合理的交代,进而变成了中国司法机关能否践行司法正义的问题。平复公共舆论和化解民间的"仇官"情绪,消除信任危机和改善警察机关的公共形象,只能是"解铃还要系令人",官权必须在杨佳案的处理上达成司法正义。而达成司法正义的唯一方法,就是公布真相、解聘谢有明律师和进行异地的公开审理。

    在党主司法的现行体制下,如果上海当局仍然坚持地方利益优先的自私考虑,执意私吞杨佳案的办理,那么杨佳案的公正审判就只能寄希望北京高层的强力干预,如同2003年孙志刚案带来的局部制度改革。"6·28瓮安民变"后,贵州省政府的新闻发布会固然沦为民间笑柄,但贵州省委书记石宗源好歹还说几句"人话",承认民变背后的深层矛盾,承认当地官权的黑暗,承认动不动就把警察推向镇压第一线的野蛮。石宗源也敢于果断整顿当地吏治,连续撤掉瓮安县党政一把手和公安局长,7月21日又撤掉黔南州委书记吴廷述。随后又出台了遏制地方政权滥用警力的法规,这些举措,多少缓解了沸腾的民怨,也带了些微制度改良。

    杨佳案发生后不久,上海官方就宣布的杨佳案将在7月29日开庭。如果按照上海官方的计划开庭,必将引发新一轮舆论大潮,这是力图确保"平安奥运"的北京高层不愿见到的。现在,杨佳案开庭时间已经推迟,大概要等到奥运大戏落幕之后了。如果没有北京高层的干预,推迟开庭是不可能的。这也说明,从杨佳案发就没有平息的质疑和呼吁所形成的舆论压力,对中共高层还是起到了一定的作用。

    但基于奥运的考虑而推迟开庭,并不能解决杨佳案的公正审判问题,也化解不了民间对现行司法制度的强烈不信任。如果奥运大戏落幕,中共高层便不敢约束上海当局,默许上海司法机关拒不提供杨佳案的真相,也不对杨佳案进行公开公正的审理,那么即便上海司法机关能够从快从速的了解此案,也无法平息公共舆论对此案的穷追猛打,更让杨佳在民意中的英雄形象继续发酵,每年祭奠杨佳就可能成为民间发泄不满的方式。即便依靠时间的流逝让公共舆论渐渐消失,但中国司法制度所遭遇的信任危机,不但无法挽回,而且只能加深,进而加深民间的"仇官"、"仇警"的情绪,而仇恨就是产生暴力的最肥沃土壤。

    当政权仍然信奉暴力专政的统治方式,官民博弈中的滥用警力和司法不公也就成为必然,类似瓮安事件和杨佳案的民间暴力反抗也就不可避免。缓解暴力对抗和降低社会的暴戾之气的首要责任,必须由手握全部暴力机器的当政者来负。基于统治成本的理智计算而收敛制度暴力的滥用,还仅仅是缓解暴力对抗的权宜之计;基于执政理念的转变而放弃暴力治国,才是中国政治转型的最佳方式,中国才能以最小的代价完成从野蛮到文明的转型。

    2008年7月25日于北京家中

    【人与人权】2008年8月号

    https://zh.wikipedia.org/wiki/%E6%9D%A8%E4%BD%B3%E8%A2%AD%E8%AD%A6%E6%A1%88

    相关帖子: https://briteming.blogspot.com/2015/10/1511.html