普通视图

发现新文章,点击刷新页面。
昨天以前OurBlogs
  • ✇懋和道人
  • 纯净主题的几个东西的备份
    一,关于新增分页模板的include.php修改,纯净主题每加个自定义模板如haowu,则改之function tpure_DefaultTemplate(&$template) {     global $zbp;     if($template->GetTags('type') == 'index' && $template->GetTags('page') != '1'){         switch($zbp->Config('tpure')->PostINDEXSTYLE){             case "1":                 $template->SetTemplate('forum');                 break;             case "2":                 $template->SetTemplate('album');                 break;             case "3":             
     

纯净主题的几个东西的备份

2025年3月28日 22:41

一,关于新增分页模板的include.php修改,纯净主题每加个自定义模板如haowu,则改之

function tpure_DefaultTemplate(&$template)
{
    global $zbp;
    if($template->GetTags('type') == 'index' && $template->GetTags('page') != '1'){
        switch($zbp->Config('tpure')->PostINDEXSTYLE){
            case "1":
                $template->SetTemplate('forum');
                break;
            case "2":
                $template->SetTemplate('album');
                break;
            case "3":
                $template->SetTemplate('sticker');
                break;
            case "4":
                $template->SetTemplate('hotspot');
                break;
            case "5":
                $template->SetTemplate('haowu');
                break;
            default:
                $template->SetTemplate('catalog');
        }
    }
if(($template->GetTags('type') == 'category' && $template->GetTags('category')->Template != 'forum' && $template->GetTags('category')->Template != 'album' && $template->GetTags('category')->Template != 'sticker' && $template->GetTags('category')->Template != 'hotspot' && $template->GetTags('category')->Template != 'haowu') ||
    ($template->GetTags('type') == 'tag' && $template->GetTags('tag')->Template != 'forum' && $template->GetTags('tag')->Template != 'album' && $template->GetTags('tag')->Template != 'sticker' && $template->GetTags('tag')->Template != 'hotspot' && $template->GetTags('tag')->Template != 'haowu') || $template->GetTags('type') == 'date'){
    $template->SetTemplate('catalog');
}
if($template->GetTags('type') == 'author' && $template->GetTags('author')->Template != 'catalog' && $template->GetTags('author')->Template != 'forum' && $template->GetTags('author')->Template != 'album' && $template->GetTags('author')->Template != 'sticker' && $template->GetTags('author')->Template != 'hotspot' && $template->GetTags('author')->Template != 'haowu'){
    $template->SetTemplate('author');
}
}

第二部分

function tpure_JudgeListTemplate($listtype)
{
    global $zbp;
    $listtype = $zbp->Config('tpure')->PostSEARCHSTYLE;
    switch($listtype)
    {
        case 1:
            $template = 'forum';
            break;
        case 2:
            $template = 'album';
            break;
        case 3:
            $template = 'sticker';
            break;
        case 4:
            $template = 'hotspot';
            break;
        case 5:
            $template = 'haowu';
            break;    
        default:
            $template = '';
    }
    return $template;
}

二,由于纯净主题的IP归属地数据库不太理想,所以用的插件替代,如

<div class="cmtsname">{if $comment.Author.HomePage}<a href="{$comment.Author.HomePage}" rel="nofollow" target="_blank">{$comment.Author.StaticName}</a>{else}{$comment.Author.StaticName}{/if}{if $comment.Author.ID >= 59 && $comment.Author.ID <= 95}&nbsp;<i class="bi bi-robot"></i>&nbsp;{/if}{if $zbp->Config('tpure')->PostCMTIPON == '1'}<em>IP:{tpure_ipLocation($comment.IP)}</em>{/if}&nbsp;<em>{$comment.CommentUA['browser']['title']}</em>
            &nbsp;<em>{$comment.CommentUA['platform']['title']}</em></div>

三,评论处添加自定义提示,如commentpost.php,comment.php等

<textarea name="txaArticle" id="txaArticle" rows="3" tabindex="1" placeholder="请输入您的评论。点击“评论”按钮后,如果信息无误会自动刷新页面,即评论成功。因为缓存、CDN等因素,新评论将延时展示,并不能第一时间看到自己的评论。"></textarea>

四,纯净主题的文章页面在新版本的略缩图不可用,上传自定义略缩图无效,保存文章直接500;

五,纯净主题的文章页面的音乐播放与修改后的模板某些地方js冲突,只能优先使用拓源的mp3插件;

六,纯净主题暂不支持PHP8.*,故每次更新需要覆盖plugin/phpmailer;

七,每次更新要注意footer.php内版权信息的更新。

其他需要注意的地方

右侧的作者统计,数字展示已经更改

https://www.dao.js.cn/new/2025020511594.shtml

暂时没有任何办法强制评论邮箱、网址、用户名均为必填,故如下

https://www.dao.js.cn/new/2024092011436.shtml

文章页面新增的ai摘要,每次升级需注意添加

https://www.dao.js.cn/new/2024121611540.shtml

文章页面新增的时间因子,每次升级需要注意添加

https://www.dao.js.cn/new/2024090311412.shtml

  • ✇懋和道人
  • 升级拓源纯净主题tpure的注意事项
    由于站点已经是PHP高版本,每次升级主题的时候,需要重新下载纯净主题PHP7.4~PHP8邮件通知组件,不然的话整个网站评论会提示没有each函数。一定要长记性,长记性。目前主题的离线IP数据是没有IPv6的数据库的,所以我还是只能用插件替代。
     

升级拓源纯净主题tpure的注意事项

2025年3月22日 21:48

由于站点已经是PHP高版本,每次升级主题的时候,需要重新下载纯净主题PHP7.4~PHP8邮件通知组件,不然的话整个网站评论会提示没有each函数。

69e2e92ddac09a7f154656ebe06b336f.png

一定要长记性,长记性。目前主题的离线IP数据是没有IPv6的数据库的,所以我还是只能用插件替代。

  • ✇皓子的小站
  • 从沉默展柜到时代回响:731部队罪证陈列馆参访手记HowieHz
    参观指南 先去“侵华日军第七三一部队罪证陈列馆”微信公众号免费预约,入馆仅需身份证。(此为 2025.3.21 状态。后续可能有变化,请通过微信公众号联系工作人员了解。建议提前关注微信公众号获取最新展馆开放时间) 带耳机,扫码可以听免费讲解,讲解的很到位。 建议一个人按自己的节奏走,跟着讲解参观全馆
     

从沉默展柜到时代回响:731部队罪证陈列馆参访手记

作者 HowieHz
2025年3月22日 12:03
参观指南 先去“侵华日军第七三一部队罪证陈列馆”微信公众号免费预约,入馆仅需身份证。(此为 2025.3.21 状态。后续可能有变化,请通过微信公众号联系工作人员了解。建议提前关注微信公众号获取最新展馆开放时间) 带耳机,扫码可以听免费讲解,讲解的很到位。 建议一个人按自己的节奏走,跟着讲解参观全馆
  • ✇刑辩人在路上
  • 该让机器人交社保吗?
    两会期间,忘了在哪看到一则新闻,说有人大代表提议,要工厂里的“机器人”也交社保。新闻一出,网络立即一片哗然。民间一直以来都有这样一种声音,认为社保是一种“税”。这种“税”既增加了企业负担,也减少了劳动者实际到手收入。对于现代社保制度,他们也有不同的看法,认为现代社保制度是一项不可持续的制度,它建立在经济持续发展,社会生产力不断增长的假设之上。而这个假设本身,很有可能是错误的。这种质疑的声音不仅仅针对我国的社保制度,而是对全世界所有国家现行的社保制度都提出了同样的质疑。前段时间,以刘强东主导的京东为首,发出了“算法不能成为压榨底层兄弟工具”的时代强音,同样引出了同样的质疑声音。质疑的理由千奇百怪,但归根结底,并没有在前人的基础上更进一步,还是加重企业负担,减少劳动者到手收入,这样的老调重弹。只不过,质疑的烈度远较之前为甚,直接表达了对社保基金蛋糕分配的不满。比如有声音直接称:“那些每月领一两万甚至更高退休金的人,当初交社保了吗?是不是现在社保池子没钱了,才想起外卖员小哥来了?”更有甚者,更加直言不讳:“不是外卖小哥需要社保,而是社保需要外卖小哥。”在这种社会普遍思潮下,人大代表此言一出,
     

该让机器人交社保吗?

2025年3月24日 20:43

两会期间,忘了在哪看到一则新闻,说有人大代表提议,要工厂里的“机器人”也交社保。

新闻一出,网络立即一片哗然。

民间一直以来都有这样一种声音,认为社保是一种“税”。这种“税”既增加了企业负担,也减少了劳动者实际到手收入。

对于现代社保制度,他们也有不同的看法,认为现代社保制度是一项不可持续的制度,它建立在经济持续发展,社会生产力不断增长的假设之上。而这个假设本身,很有可能是错误的。这种质疑的声音不仅仅针对我国的社保制度,而是对全世界所有国家现行的社保制度都提出了同样的质疑。

前段时间,以刘强东主导的京东为首,发出了“算法不能成为压榨底层兄弟工具”的时代强音,同样引出了同样的质疑声音。

质疑的理由千奇百怪,但归根结底,并没有在前人的基础上更进一步,还是加重企业负担,减少劳动者到手收入,这样的老调重弹。

只不过,质疑的烈度远较之前为甚,直接表达了对社保基金蛋糕分配的不满。比如有声音直接称:“那些每月领一两万甚至更高退休金的人,当初交社保了吗?是不是现在社保池子没钱了,才想起外卖员小哥来了?”更有甚者,更加直言不讳:“不是外卖小哥需要社保,而是社保需要外卖小哥。”

在这种社会普遍思潮下,人大代表此言一出,会遭受何样的网络质疑,可想而知。

手伸到人身上还不够,现在连机器人也不愿放过了?

对于这样质疑的声音,不能一味苛责求全。养老社会保险制度,是全人类对自身命运的一项全新探索,至今不过百余年历史,就连顶层设计者们对这项制度,也是边探索边建设,边学习边推进。

要理解人大提议背后的深层次考量,就要首先结合人类,或者指代的更明确一点,“智人”现在所面临的生存现状。

小米的汽车工厂,如今年产量已经逼近40万台,但整个工厂系统只有2000人。整个工厂流水线,几乎完全不需要“智人”手工操作。工厂车间甚至都不用开灯,是名副其实的“黑灯工厂”。

可以这么说,智人正大步迈向彻底沦为“无用之物”的文明发展“奇点”。

不管是流水线打螺丝的蓝领工人,还是办公室做PPT的白领员工,都正在已他们自己都无法想象、不曾预料的速度加速被科技取代,被时代抛弃。

生产力与生产关系必须相匹配,过于发达的生产力,需要更先进的生产关系与之匹配。否则,落后的生产关系也必将反过来拖累生产力的进一步发展。

小米的黑灯工厂一年能产接近四十万辆汽车,而且产能还在以肉眼可见的速度爬坡,却只解决了2000人的就业。

哪怕这两千人各个年入百万,他们的消费能力全部释放出来,也最多不过能消化掉2000辆su7 ultra的产能。

随着科技的进一步发展,黑灯工厂会越来越多,智人历史上从未出现过的,无法从历史中习得任何经验的一幕将出现:一方面社会能够提供的有效就业越来越少,另一方面,社会有效就业越少,社会生产力反而越高。

资本主义经济制度下,生产力的提高有一个先决条件,那就是必须要有有效的需求拉动。

工厂生产出来的产品有销路,资本才能赚取利润,资本家才愿意投资,工人才有工作岗位。工人有工作,才能赚取工资,工厂生产出来的产品才有销路。整个经济循环才能打通。

中学政治课本上讲述过一个美国大萧条期间的故事,并以此为例批判资本主义制度。

寒冬,又冷又饿的小男孩问矿工父亲:为什么家里不买些煤来取暖?

父亲答,因为工厂倒闭,自己失业了,没有钱买煤。

小男孩又问,为什么工厂会倒闭?

父亲答,因为煤生产的太多了。

我在整个中学时期,都完全不能理解这个故事。弄懂故事背后的蕴含的经济规律已经要到大学上经济学课程的时候,而理解其更深刻的哲学内涵,则要等到后来又读研究生专攻马克思主义的时候了。

出于这样或那样的复杂原因,现在谁要是在公开场合一板一眼严肃的谈论马克思主义,仿佛谁就是食古不化的疯子一般。

但事实上,美国大萧条,正是资本主义制度内生矛盾的一次“小爆发”,而美国走出大萧条的应对措施,也完全是社会主义式的。

国内的教科书,提起美国如何在罗斯福领导下开展新政,往往只会介绍其进行大基建,拆分资本寡头,至多再提一嘴二战“及时”爆发,为美国国内的巨大产能找到了释放途径,但对于罗斯福新政的“社会主义改造”部分,往往讳莫如深,无人提及。

我前段时间通读了《炉边谈话》,该书收录了罗斯福总统在就任期间通过广播向全美的发表的一系列30余次演讲,其中近三分之一的演讲,均涉及到大萧条期间的国内政策应对。

罗斯福的经济政策,大体上可以概括为“两手抓两手都要硬”:一手抓创造基础就业岗位,这也是国内教科书上进行了通识教育的部分,兴修水利,大搞基建;另一手抓防内卷,通过制定法令,强行推进八小时工作制,改善工人阶级福利待遇。

很多人看今天的美国人自由散漫,就想当然认为他们“自古以来”便是如此。其实这种刻板印象大错特错,美国在资本主义早期的黄金时代中,人民的工作热情(内卷程度)远超今天中国的996、007福报社畜。国内最起码还没有出现大范围的童工,而在大萧条前夕的美国,有近175万名16岁以下的儿童在工作,一些儿童甚至从6、7岁就开始打螺丝。资本家热衷于雇佣童工,因为童工的“性价比”更高,能创造更大的利润。而童工们的家庭,也正等着童工挣回家去的“救命钱”。

虽然我经常口头戏谑“工贼”,但劳动者无序内卷现象的根本原因,还是在于原子化的个体在资本面前缺乏议价能力,最终只能被资本逐个击破,陷入“你不干有的是人干”的互害怪圈。罗斯福的新政,一方面通过政府法令,另一方面通过对工会赋权,改变了劳动者面对资本家单打独斗的被动局面,为劳动者在资本家面前拥有议价权铺就了道路。

罗斯福总统号召美国不要加班,因为与其让两个人加班干三个人的活,不如让三个人都充分就业。多一份就业,就能让多一个家庭体面的生活下去。多一份就业,你所生产出来的产品才有人购买。才不会陷入商品价格虽然一落千丈,但市场上已经没有人有钱消费的荒诞泥淖。最超出我认知的是,直到二战初期,美国开始全面爆产能之际,罗斯福依旧在号召美国人民不要加班,以便将工作机会留给更多的人。

今天的世界,正在一场烈度远超美国大萧条的经济危机前夜。这次危机,很可能将是决定智人未来命运的一次危机。罗斯福时代,生产力的维系与发展,至少还依赖无数个普通个体的辛勤劳动。也正因为此,深处金字塔基的普罗大众,才获得了那么丁点儿“统战价值”。最终美国通过对自身制度的有限社会主义修正,成功度过了危机,智人也随之整体迎来了战后黄金时代,享受了半个多世纪由基础科技发展所带来的生产力飞跃红利。

然而今日,智人似乎正在迎来被自己亲手埋葬的命运。如果生产力的维系与发展不再以最大多数人的必要劳动为先决条件,智人社会当前的经济运转体系,毫无疑问将不可避免的走向彻底崩溃。

道理很简单,近一个世纪前的罗斯福已经说的很明白。

每个人都同时具备“生产者”与“消费者”的双重身份。只有当市场上存在足够的适格消费者时,你作为生产者的努力才有价值。否则,就必将陷入煤产得越多,价钱就越低,价钱越低,反而越没有人能买起的怪圈。

机器人是创造了巨大的生产力,但这是以数以万计十万计百万计的产业工人失去工作丧失收入来源为代价达成的。

短期来看,资本能够从这个看似“产业升级”的过程中获利,但站在全社会角度看,这种获利绝不会是可持续的良性发展。

之所以现在还能够获利,是因为市场上还有足够的存量消费能力。机器全面取代人力,已经是一个不可能被逆转的历史趋势。这种取代会以我们每个人想象不到的速度,取代绝大多数有效就业岗位。当社会上的存量消费能力消耗殆尽之际,请问,你黑灯工厂造的汽车还能卖给谁?

我们很可能已经正站在文明的十字路口。

智人社会必须创造出一套能够维系经济有效循环的新制度,刻不容缓。如果不能“创造”出机器价值向人类进行有效转移的社会制度,那整个智人社会都将很快走向彻底崩溃。

智人的命运,究竟是像马克思所描述的共产主义社会那样,过上物质极大丰富,人人都能按照自己的意愿实现全面而自由发展的生活,还是像《the matrix》(电影,中文名《黑客帝国》,这个中文译名可能很叫座,但完全无法体现电影对智人命运的哲学思考,所以我列上英文名)里那样,沦为被机器奴役的“算力芯片”,很可能最终取决于,究竟是人能够驾驭机器,还是机器最终反过来奴役了人类。

能问出“机器人该不该社保“这个问题,我认为是一个好的开始,它是我们探索新的社会分配制度,成功驾驭机器的第一步。

80后刑事律师的办案手记,专注无罪辩护,反抗者的灵魂从未远去。联系方式:liuchen8916@foxmail.com

继续阅读《该让机器人交社保吗?》的全文内容...

分类: 日记随想 | Tags: 社会主义大萧条罗斯福新政经济危机分配制度, | 添加评论(5)


最新评论:

  • 2025-03-27 17:57:28 PM,sugar : 首先资产比率和‘没有活人税率’就不好设计,其次,如果开始收‘没有活人税’,那么势必有些企业会养一堆‘死侍’
  • 2025-03-26 15:01:29 PM,李白拿酒来 : 可以,让机器人赚多少吐出来多收哈哈
  • 2025-03-26 15:00:37 PM,李白拿酒来 : 不好整啊,资本操纵了舆论,绝大多数劳动者对自己的危险处境一无所知
  • 2025-03-25 12:00:56 PM,大致 : 哪里用那么麻烦。只要雇员数跟固定资产的比率低于某个数值,收“没有活人税”就行了。
  • 2025-03-25 10:02:48 AM,obaby : 以为全面 ai 是解放了劳动力,多数人也想不到是革了劳动者的命。 等老了,我要么去跳大神,当神婆。要么,学门焊接手艺,给机器人养老送终。

相关文章:

This message is used to verify that this feed (feedId:48270853499278344) belongs to me (userId:69553665730701312). Join me in enjoying the next generation information browser https://follow.is.
  • ✇刑辩人在路上
  • 警察邢志强:三十年前击发的子弹,正中三十年后自己的眉心
    警察邢志强改判了。从原来的犯故意杀人罪判无期徒刑,大幅减刑以故意伤害罪改判为四年有期徒刑。根据新京报的报道,1995年某日傍晚,邢志强与朋友携带一非制式步枪到水库旁射击,看到被害人孟永清骑摩托车路过,认为孟的摩托车可能是盗窃所得而上前拦截。二人发生争执,邢志强被孟永清持刀刺伤,邢志强开枪射击孟永清背部。孟永清被击中后摔倒并逃跑,躲藏两天后就医,抢救无效死亡。(https://mp.weixin.qq.com/s/W7Z3--Czvir1lOthUu4nHA)# 案件之所以大幅改判,主要因为以下几个原因:一是根据警察法规定,人民警察在非工作时间,遇有其职责范围内的紧急情况,应当履行职责,认定邢志强之行为具有相当的履职正当性,是在履行公务。包括韩旭在内的很多大咖为此站台,称:法院的此次判决结果是警察在执行公务时的尺度导向,不应该判得太重,否则以后警察可能不敢为了我们的公共安全去维护社会秩序,既要给他们适度的空间,同时也不能限制太死了。二是被害人孟永清的身份特殊,其是服刑人员,案发时一个因患腰椎间盘突出请假回家治疗。邢志强自我辩解时称,听说有个叫“小黑头”的犯人越狱脱逃,而这个孟永清就是跟“
     

警察邢志强:三十年前击发的子弹,正中三十年后自己的眉心

2025年3月21日 14:50

警察邢志强改判了。

从原来的犯故意杀人罪判无期徒刑,大幅减刑以故意伤害罪改判为四年有期徒刑。

根据新京报的报道,1995年某日傍晚,邢志强与朋友携带一非制式步枪到水库旁射击,看到被害人孟永清骑摩托车路过,认为孟的摩托车可能是盗窃所得而上前拦截。二人发生争执,邢志强被孟永清持刀刺伤,邢志强开枪射击孟永清背部。孟永清被击中后摔倒并逃跑,躲藏两天后就医,抢救无效死亡。(https://mp.weixin.qq.com/s/W7Z3--Czvir1lOthUu4nHA)

# 案件之所以大幅改判,主要因为以下几个原因:

一是根据警察法规定,人民警察在非工作时间,遇有其职责范围内的紧急情况,应当履行职责,认定邢志强之行为具有相当的履职正当性,是在履行公务。包括韩旭在内的很多大咖为此站台,称:法院的此次判决结果是警察在执行公务时的尺度导向,不应该判得太重,否则以后警察可能不敢为了我们的公共安全去维护社会秩序,既要给他们适度的空间,同时也不能限制太死了。

二是被害人孟永清的身份特殊,其是服刑人员,案发时一个因患腰椎间盘突出请假回家治疗。邢志强自我辩解时称,听说有个叫“小黑头”的犯人越狱脱逃,而这个孟永清就是跟“小黑头”一伙的,这更加让他坚定了孟永清“有问题”的判断。但该辩解并未经依法查实,判决书记载:经审理查明,在案证据未证实孟永清曾帮助任永利(“小黑头”)脱逃,也未证实案发时公安机关布置过抓捕孟永清的任务。

三是邢志强存在正当防卫情节。早在案发当年的1995年,邢志强所在的公安局就出具了一份红头文件,载明:孟永清刺伤我局干警邢志强案已侦查终结,邢志强在实施盘查、追捕孟永清过程中的全部行为属于正当防卫。但诡异的是,当年已经侦查终结的全部卷宗材料早已不翼而飞,本案所有的口供都是在近三十年后补录的。

四是孟永清之死亡与邢志强开枪射击间的因果关系不唯一。孟永清中枪后,没有第一时间到医院治疗,而是自行用玻璃碎片取出体内弹头,进而导致继发感染。孟永清异常的就医处理,不仅扰乱了因果关系,同时还放大了其本身行迹高度可疑的怀疑,某种程度上加强印证了邢志强关于自己开枪行为正当性的辩解。

五是孟永清方没有“苦主”,原被告双方力量对比严重不均衡。我这里之所以采“原被告”的说法,就是取其老百姓所通常理解的本意。检察院虽然代表国家进行公诉,但其与直接发起形式控告的“苦主”在实际立场上有很微妙的区别。一些因民间纠纷而引起的刑事案件中,常见公诉人照本宣科念完起诉书便“原地躺平”,而被害人及其代理律师义愤填膺慷慨激昂,原因便在于此。案发当年,孟永清刚刚21岁,而此时的他已经入狱近六年时间。该人既未娶妻,更无子嗣。目前所有的网络报道中,只有其大嫂作为近亲属接受了采访,其他亲属均未出面。按正常生育年龄计,孟父孟母三十年前即已至少将近五十岁岁,如今时间又过去30年,目前是否还在人世,要打上一个问号。不管什么原因,一个很可能素未谋面(孟十五六岁即已入狱),基本谈不上什么深厚感情基础的大嫂,能不能扮演好“苦主”角色,能在多大程度上对案件施加案外影响,可想而知。而反观邢志强方面,阵容豪华,家属律师记者齐上阵,喊冤声早已响彻云霄。

# 我对案件的质疑主要有以下几点:

第一,孟永清犯法了吗?

基本上所有认为邢志强无罪的文章,都会花浓墨重彩描绘孟志强的服刑人员身份,暗示其系盗窃惯犯,所骑摩托车就是偷来的。因为只有在这个大前提下,邢志强所有的行为才可能具有正当性基础。

但综合所有公开报道,我没有发现任何指向孟永清涉嫌犯罪的线索信息。

孟永清是服刑犯人不假,孟永清是盗窃重犯也不错,但一个人偷过东西,显然不能等同于一个人所有的东西都是偷来的。

邢志强辩解称怀疑其所骑摩托车是偷来的,这不仅没有被查明,而且也不符合常理。90年代,摩托车是大件商品,珍贵程度比今天的家庭小汽车更甚。是不是偷来的,很好查。出了命案后,公安局当时就展开过调查。如果查证属实摩托车确系盗窃赃物,那这么好的证明自家民警挺身而出捍卫人民利益的事情,为什么没有记录在材料里呢?

有人会说,你孟永清说不清楚摩托车来源,那摩托车就极有可能是偷的。我想反问持这种观点的人一句,邢志强的非制式步枪是哪里来的?能说清楚嘛?如果说不清,难道也算是偷的?

如果摩托车确系盗窃赃物,公安局当时直接给邢志强出个拘捕击毙的材料不就行了?还用得着拐弯抹角论证什么正当防卫?

第二,邢志强的拦截盘问追捕行为有正当性?

案发时,邢志强的状态很有意思。他持“非制式步枪”“着警服”与“朋友”到水库附近“射击”。

我很同情记者,邢志强当时的状态过于异常,难以找到更加温和、不刺激神经的用语来描述。

行将日暮,空无一人的水库,枪响声不时惊起几只飞鸟。

这邢志强,怎么看都更像是穿着警服带着朋友到野外“打猎”来了。

穿着警服打枪耍帅还不够,还要在朋友面前进一步逞威风。你看见骑摩托车那小子了吗?我让他停下来他立马得停下来给咱让烟你信不信?

反正都是证据缺失,由着一张嘴说嘛。不过是占着死人不会说话的光罢了。

人家正常骑辆摩托车路过,你凭啥说人家形迹可疑?我还说就是你为发泄情绪,寻找刺激,随意拦停呢?

现有的对邢志强随意拦截追捕行为是否具有正当性的辩解,完全建立在事后复盘的上帝视角,结合孟永清特殊身份所作出的片面性、倾向性、误导性解读。

站在当时的时间点,孟永清仅仅是一个骑摩托车路过的普通人。邢志强仅凭个人主观臆断,对路人“持枪”(还是非制式的土枪)随意拦截盘问,无论在任何时间任何场景,都不可能具备正当性。

如果按这个逻辑,那任何一个警察可以在任意时间任意地点任意拦停盘问任何一个公民。公民必须对警察的随意拦停行为无限度配合,稍有抵牾,就会被认为有重大作案嫌疑,可以径行“正当防卫”,轻则上铐,重则就地击毙。

这对吗?

就连“枪击每一天”的“自由美利坚”,警察权也没有大到这个地步吧?

第三,邢志强的行为有防卫性?

事实上,根据目前网络公开报道,邢志强究竟与孟永清有没有发生过打斗,都高度存疑。

新京报的报道中提到两份目击者证言。一份是:前面有一辆摩托车在跑,后面有两个人骑着一辆摩托车追,坐在后面的人手里还端着一把枪。

另一位证人不仅做了笔录,还出了庭:邢志强没有下摩托车,也没有举枪挥舞格挡。

法院判决书对两份证言作了综合评判,认为:李肖关于在枳芨滩村载邢志强追赶孟永清时,邢志强将枪架在李肖肩上的证言与上述目击者的证言能够相互印证,能够证明邢志强处于准备射击的状态,且与孟永清后背中枪的客观结果相吻合。

按照这两份证言,邢志强根本就不是在与孟永清打斗状态下开的枪。而是坐在摩托车上,持枪将孟射杀。这场景像极了猎人追逐猎物,也是整个案件中最令我感到恐惧的场景。

既然枪击根本不是在打斗过程中发生的,又谈何正当防卫?

第四,枪击后的第一时间发生了什么?

孟永清在遭受枪击后,没有到正规医院就医,而是用玻璃碎片,自行取出了弹头,并因此引发感染,并于两日后才由其母亲送医,最终医治无效身亡。

一个非常确定的事实是,孟永清在中枪当场,并没有立即死亡。

抛开邢志强之前处置手段的合法性不论,在孟永清已经明确中弹,丧失行动能力及反抗能力后,至少也应当将孟永清及时送医,并同步启动正式的刑事司法程序。

而邢志强仅仅是将孟永清射倒在地,没有进行任何善后处理。

如果说邢志强之前的行为,还能拿担忧危险分子流窜进入社会面辩解,那其之后的处置行为则完全与自己所作的辩解完全无法相洽。

现实中的中弹,跟影视作品中鲜血四溅、血肉横飞完全不一样。对小威力弹药命中非致命部位,往往需要上前进一步查验后才能确认中弹与否。

邢志强有没有去确认自己是否击中?如果没有上前确认,那他就不怕自己没击中,丧心病狂的(他眼中的)犯罪分子诈伤后继续流窜作案,危害社会?

如果邢志强上前确认孟永清中弹后,依旧没有采取任何有效的处置措施,那这种行为的性质是什么,根本不必多言。

第五,当年的证据卷宗飞哪儿去了?

卷宗肯定不会凭空消失,如果说卷宗丢了,那一定是有人把他给故意搞丢了。

那是谁会去故意搞丢这样一份陈年积案的卷宗呢?

分析谁最可疑,就看谁最能从卷宗丢失中获益。

毫无疑问,还是邢志强自己。

1995年的枪击事件发生后,邢志强依旧一直在同一个公安局工作,直至近三十年后案发时,已经官至副局长。在这三十年漫长的时光中,邢志强官越当越大,根越扎越深,他有充足的能力搞丢这份卷宗。

接下来是动机。

邢志强有没有动机呢?换言之,这些卷宗,究竟是对他有利的内容居多呢?还是对他不利的内容居多呢?

对这个问题,依据现有的零星信息,同样不难得出答案。

如前所述,哪怕是三十年后重新采集证据,依旧有两名证人栩栩如生的描绘了他们目睹的案发现场情景。

不敢想象,这份被消失的卷宗中,类似的证言还有多少份。邢志强很清楚,这些证言躺在档案室里,就是一枚随时会把他炸得粉身碎骨的定时炸弹。他必须将这个炸弹拆掉。

肯定会有人说,这些都是你单方面的猜测。

那么换一种思考方式吧。

假如这些材料对邢志强有利,那邢志强作为一个副局长,作为切身命运与卷宗死绑的当事人,是会穷尽一切手段保护它们不被消失呢?还是更希望看到它消失呢?

换作任何一个人是邢志强,他理性的做法,如果不能抗拒更强大的非让卷宗消失的力量(如果有的话),至少要去复制一份材料出来,以留作证明自己清白的关键证据。但邢志强却什么也没有做,这根本解释不通。

唯一合理的解释,只能是邢志强自己就是那个让卷宗消失的人。

# 回思

世界上真会有完美犯罪吗?

邢志强差一点就做到了。

因为这一枪,邢志强一辈子谨小慎微。监察委于2020年对其留置,查了两年愣是没查出经济问题。这才翻出这起尘封三十年的陈年旧案。最终最高检于2022年,正式核准对邢志强涉嫌故意杀人罪进行追诉。

当年那一枪,让他老实了三十年,最后还是打在自己眉心。

邢志强案不能得到合理解释的地方太多,仅仅是浏览阅读网络公开报道的只言片语,就让我毛骨悚然,感受到深深的恐惧。这不是一起普通的刑事案件,它事关警察权行使的边界,事关公民自由权利的基本保障。

对邢志强案的追问与思考,不应当止步于个案中的“疑罪从无”“存疑利益归于被告人”这种肤浅的沾沾自喜,更要及时回应社会对公平正义的深度追求,考量由判例所创立的司法规则可能导致的警察权恶性无序扩张对社会运转的长远影响。

80后刑事律师的办案手记,专注无罪辩护,反抗者的灵魂从未远去。联系方式:liuchen8916@foxmail.com

继续阅读《警察邢志强:三十年前击发的子弹,正中三十年后自己的眉心》的全文内容...

分类: 时评杂文 | Tags: 邢志强案警察权边界卷宗丢失司法公正警察履职正当性, | 添加评论(6)


最新评论:

相关文章:

This message is used to verify that this feed (feedId:48270853499278344) belongs to me (userId:69553665730701312). Join me in enjoying the next generation information browser https://follow.is.
  • ✇宇阳 - 花有重开日, 人无再少年
  • 突破瓶颈,月薪过万
    # 突破瓶颈,月薪过万 哈哈,又消失了一段时间 在去年 `12` 月 `24` 日老板让我们研发一款跨境支付系统,项目周期为 `3` 个月,在此期间每天无偿加班 `3` 小时,单休,`996` 工作制。项目完成后老板承诺涨薪 + 5万奖金。 这段时间忙得不可开交,每天敲 `12` 个小时代码,一下班就困得要死,一睁眼就是上班,每天彻底失去了个人时间,现在想想都不知道怎么熬过来的。 经过 `3` 个月的开发,目前项目已经在测试阶段了,计划着本周发布上线。 我的领导看到了我的付出,帮我提交涨了涨薪申请,我最开始觉得也就涨一两千的样子,没想到一次性涨了 `3k` ,这让我无比震惊,算是突破了月薪过万的瓶颈。当然还有后续的 `5` 万奖金也会在这两周内发放 现在这艰难的大环境,我深知以我这学历能找到工作就已经是万幸了,即使找到了工作,可能也需要 `3` 年的沉淀才能突破到 `10k` 这个瓶颈,而如今仅工作半年就突破到了这个境界。说真的我很感谢我的领导,我知道我能走到这一步是因为有了我领导的帮助,他一直在帮我争取涨薪的机会并想方设法帮我完成了 `2` 次涨薪,对我算得上有知遇
     

突破瓶颈,月薪过万

# 突破瓶颈,月薪过万 哈哈,又消失了一段时间 在去年 `12` 月 `24` 日老板让我们研发一款跨境支付系统,项目周期为 `3` 个月,在此期间每天无偿加班 `3` 小时,单休,`996` 工作制。项目完成后老板承诺涨薪 + 5万奖金。 这段时间忙得不可开交,每天敲 `12` 个小时代码,一下班就困得要死,一睁眼就是上班,每天彻底失去了个人时间,现在想想都不知道怎么熬过来的。 经过 `3` 个月的开发,目前项目已经在测试阶段了,计划着本周发布上线。 我的领导看到了我的付出,帮我提交涨了涨薪申请,我最开始觉得也就涨一两千的样子,没想到一次性涨了 `3k` ,这让我无比震惊,算是突破了月薪过万的瓶颈。当然还有后续的 `5` 万奖金也会在这两周内发放 现在这艰难的大环境,我深知以我这学历能找到工作就已经是万幸了,即使找到了工作,可能也需要 `3` 年的沉淀才能突破到 `10k` 这个瓶颈,而如今仅工作半年就突破到了这个境界。说真的我很感谢我的领导,我知道我能走到这一步是因为有了我领导的帮助,他一直在帮我争取涨薪的机会并想方设法帮我完成了 `2` 次涨薪,对我算得上有知遇之恩
  • ✇游钓四方的博客
  • 注册 Chrome Web Store 开发者游钓四方的博客
    年前曾尝试过 Chrome 扩展开发,《写一个Chrome表单自动化插件》,但是由于没有注册 Chrome Web Store 开发者,无法上传到 Chrome 应用商店。 注册 WildCard Chrome 注册开发者需要五美元,由于我没有境外信用卡就一直卡在这,2022 年我在杭州办过一张中信的双币卡,年费很高,后来经济紧张时注销了,现在急着用外币还挺麻烦,折腾一圈,最终无脑选择了 WildCard,尽管网上对它负面评论铺天盖地。 WildCard 开卡费用是 10.99 美元/年,实际付款 79.71 人民币,按照今天的市场汇率 7.23,实际多付了 0.24,而且这只是开卡费用,充值另算。 开卡后我充值了 10 美元,支付宝付款 75.07,到账金额 10 美元: \[\frac{2.77}{75.07} \times 100\% \approx 3.69\%\] 四个点我能接受(接不接受都要受着),这个开卡费不便宜,毕竟钱不是大风刮来的,所以注册时,我创建了两个号,推荐注册返现两美金… 注册 Chrome Web Store 开发者
     

注册 Chrome Web Store 开发者

2025年3月20日 00:03

年前曾尝试过 Chrome 扩展开发,《写一个Chrome表单自动化插件》,但是由于没有注册 Chrome Web Store 开发者,无法上传到 Chrome 应用商店。

注册 WildCard

Chrome 注册开发者需要五美元,由于我没有境外信用卡就一直卡在这,2022 年我在杭州办过一张中信的双币卡,年费很高,后来经济紧张时注销了,现在急着用外币还挺麻烦,折腾一圈,最终无脑选择了 WildCard,尽管网上对它负面评论铺天盖地。

WildCard 开卡账单

WildCard 开卡费用是 10.99 美元/年,实际付款 79.71 人民币,按照今天的市场汇率 7.23,实际多付了 0.24,而且这只是开卡费用,充值另算。

开卡后我充值了 10 美元,支付宝付款 75.07,到账金额 10 美元:

\[\frac{2.77}{75.07} \times 100\% \approx 3.69\%\]

四个点我能接受(接不接受都要受着),这个开卡费不便宜,毕竟钱不是大风刮来的,所以注册时,我创建了两个号,推荐注册返现两美金…

注册 Chrome Web Store 开发者

Chrome Web Store 账单

注册账号就很容易了,Google 绑卡付钱就行。但是如果要销售发布就很麻烦:

个人交易者声明

  • 您需要提供一个手机号码以验证是您本人在操作
    • 您将通过手机接收代码
  • 用于证明是您本人的身份证件
  • 可接受的文件包括:
    • 驾照
    • 护照
    • 州身份证明
    • 绿卡
  • 您需要提供一份显示您的姓名和当前地址的文件
  • 可接受的文件包括:
    • 由政府签发的文件或带照片的身份证件
    • 公共事业缴费单或话费账单(日期在过去 60 天内)
    • 银行对账单(日期在过去 60 天内)
    • 租赁合同或抵押贷款合同

因为 Google 已退出中国市场,不支持交易。而我是美国 Visa 卡,面对这样的要求不容易做到。

日后再说吧,往后这段时间,我打算把博客评论表单自动填充插件重构一下,然后上架 Chrome 应用商店。

  • ✇游钓四方的博客
  • 空腹骑行75公里游钓四方的博客
    周六 最近郑州天气突然转冷,骑行频率也降了下来,周六正好赶上休息,实在是憋坏了!今天不管刮风下雨,必须出去骑一趟 原计划直接奔开封,结果路过龙湖就停了下来。好久没来了,上次来还是鹅毛大雪天,如今雪没了,只剩下鹅 周六的公园人满为患,没法骑。我推着车沿湖边缓行,遥望着远处炸水的不知名鱼,不由自主的想蹲下摸摸湖水,真的很想钓鱼,自到郑州以来,我连最爱的路亚竿都没摸过 此时正值中午,小孩在沙滩上牵着风筝奔跑,大人排队买小吃,顿时勾起了不少儿时回忆,我也好想光着脚奔跑在沙滩上… 在龙湖公园出来后,我关掉了导航线瞎跑,根本不认识路,不知道自己在哪,扫大街呗 话说现在骑车很少拍照,不是不爱拍,而是懒得下车,即使趴到腰酸,感觉腰快要断了,也不想停下来 周日 拍这张照片时,已经快饿晕了,周六晚上吃得少,周日早上又空腹出门,体力消耗得厉害… 周日早晨睡到自然醒,一看表,我整个人都快立正了,居然八点半了。着急忙慌洗漱后,脱下内衣裤直接换上骑行服,背上包,拿了五块巧克力出发了。因为周一要上班,所以今天必须放纵一下,出发前大致算了算,来回返程再加上逛街的时间,早饭根本来不及吃
     

空腹骑行75公里

2025年3月12日 15:36

周六

最近郑州天气突然转冷,骑行频率也降了下来,周六正好赶上休息,实在是憋坏了!今天不管刮风下雨,必须出去骑一趟

原计划直接奔开封,结果路过龙湖就停了下来。好久没来了,上次来还是鹅毛大雪天,如今雪没了,只剩下鹅

倒挂白鹅

周六的公园人满为患,没法骑。我推着车沿湖边缓行,遥望着远处炸水的不知名鱼,不由自主的想蹲下摸摸湖水,真的很想钓鱼,自到郑州以来,我连最爱的路亚竿都没摸过

龙湖·北岸

此时正值中午,小孩在沙滩上牵着风筝奔跑,大人排队买小吃,顿时勾起了不少儿时回忆,我也好想光着脚奔跑在沙滩上…

龙湖·人工沙滩

在龙湖公园出来后,我关掉了导航线瞎跑,根本不认识路,不知道自己在哪,扫大街呗

STRAVA 74.6km  爬升313m  时间4h 19m

话说现在骑车很少拍照,不是不爱拍,而是懒得下车,即使趴到腰酸,感觉腰快要断了,也不想停下来

周日

拍这张照片时,已经快饿晕了,周六晚上吃得少,周日早上又空腹出门,体力消耗得厉害…

周日早晨睡到自然醒,一看表,我整个人都快立正了,居然八点半了。着急忙慌洗漱后,脱下内衣裤直接换上骑行服,背上包,拿了五块巧克力出发了。因为周一要上班,所以今天必须放纵一下,出发前大致算了算,来回返程再加上逛街的时间,早饭根本来不及吃…哎…

大约骑了25公里,在中石化买了瓶宝矿力水特。又骑行了二三十公里到了贾鲁河桥,饿的没劲,更别说爬坡了,挂上小盘,我慢悠悠到了桥中间,休息了几分钟,把五块巧克力补给全吃了

郑州·贾鲁河桥

就这样空腹骑到了开封郊区,此时的里程已经来到了 75.38公里,用时3小时23分钟

到达开封后,心里那股坚持的信念瞬间消失了,又渴又饿,高德帮我找了最近一家名为三不炒(开封总店)的小炒店,我把车子靠着门店随便一放,就去买葡萄糖了

就去买葡萄糖了

买完水出来发现要排队,人还不少,我是真的饿得快走不动了,但还是懒得换地方,抱着水坐在外面等了半小时。饿得快虚脱了,感觉此时此刻,就算把馒头挂我脖子上都能饿死

我前面排了八个人

排队加吃饭花了一个半小时,吃得太撑,骑上车都趴不下去,推着车穿过老巷子走到了湖边

对面就是清明上河园

御河桥洞下

御河桥洞下

正在乐钓的五星开封好市民

STRAVA 164.1km  爬升417m  时间8h 5m

回到家已经八点半了,这条郑开大道路线真心推荐,毕竟二刷了,虽然沿途风景平平,但对于郑州来说,已经是顶级骑行路线了,一个人骑行在郑开大道,握着下把位,不用担心刹车,不用担心前方有没有人,听着歌,摇着车,也不枉来郑州走一遭

  • ✇游钓四方的博客
  • 利用 Go + COS + GitHub 重构 RSS 爬虫游钓四方的博客
    之前我写过一篇《利用Go+Github Actions写个定时RSS爬虫》来实现这一目的,主要是用 GitHub Actions + Go 进行持续的 RSS 拉取,再把结果上传到 GitHub Pages 站点 但是遇到一些网络延迟、TLS 超时问题,导致订阅页面访问速度奇慢,抓取的数据也不完整,后来时断时续半个月重构了代码,进一步增强了并发和容错机制 在此感谢 GPT o1 给予的帮助,我已经脱离老本行很多年了,重构的压力真不小,有空就利用下班的时间进行调试,在今天凌晨 03:00 我终于写完了 1. 为什么要重构 旧版本主要基于 GitHub Actions 的定时触发,抓取完后把结果存放进 _data/rss_data.json 然后 Jekyll 就可以直接引用这个文件来展示订阅,但是这个方案有诸多不足: 网络不稳定导致的抓取失败 由于原先的重试机制不够完善,GitHub Actions 在国外,RSS 站点大多在国内,一旦连接超时就挂,一些 RSS 无法成功抓取 单线程串行,速度偏慢 旧版本一次只能串行抓取
     

利用 Go + COS + GitHub 重构 RSS 爬虫

2025年3月12日 03:26

之前我写过一篇《利用Go+Github Actions写个定时RSS爬虫》来实现这一目的,主要是用 GitHub Actions + Go 进行持续的 RSS 拉取,再把结果上传到 GitHub Pages 站点

但是遇到一些网络延迟、TLS 超时问题,导致订阅页面访问速度奇慢,抓取的数据也不完整,后来时断时续半个月重构了代码,进一步增强了并发和容错机制

在此感谢 GPT o1 给予的帮助,我已经脱离老本行很多年了,重构的压力真不小,有空就利用下班的时间进行调试,在今天凌晨 03:00 我终于写完了

1. 为什么要重构

旧版本主要基于 GitHub Actions 的定时触发,抓取完后把结果存放进 _data/rss_data.json 然后 Jekyll 就可以直接引用这个文件来展示订阅,但是这个方案有诸多不足:

  1. 网络不稳定导致的抓取失败

    由于原先的重试机制不够完善,GitHub Actions 在国外,RSS 站点大多在国内,一旦连接超时就挂,一些 RSS 无法成功抓取

  2. 单线程串行,速度偏慢

    旧版本一次只能串行抓取 RSS,效率低,数量稍多就拉长整体执行时间,再加上外网到内地的延时,更显迟缓

  3. 日志不够完善

    出错时写到的日志文件只有大概的错误描述,无法区分是解析失败、头像链接失效还是RSS本身问题,排查不便

  4. 访问速度影响大

    这是主要的重构原因!在旧版本里,抓取后的 JSON 数据是要存储到 Github 仓库的,虽然有 CDN 加持,但 GitHub Pages 的定时任务会引起连锁反应,当新内容刷新时容易出现访问延迟,极端情况下网页都挂了

    重构后,在此基础上进行了大幅重构,引入了并发抓取 + 指数退避重试 + GitHub/COS 双端存储的能力,抓取稳定性和页面访问速度都得到显著提升

2. 主要思路

2.1 整体流程

先看个简单的流程图

        +--------------------------+
        | 1. 读取RSS列表(双端可选)  |
        +------------+-------------+
                     |
                     v
           +---------------------+
           | 2. 并发抓取RSS,限流   |
           |  (max concurrency)  |
           +-------+-------------+
                   |
                   v
        +------------------------------+
        | 3. 指数退避算法 (重试解析失败)  |
        +------------------------------+
                   |
                   v
           +-------------------+
           | 4. 结果整合排序    |
           +--------+----------+
                    |
                    v
        +-------------------------+
        | 5. 上传 RSS (双端可选)   |
        +-------------------------+
                    |
                    v
           +--------------------+
           | 6. 写日志到GitHub   |
           +--------------------+
  1. 并发抓取 + 限流
    通过 Go 的 goroutine 并发抓取 RSS,同时用一个 channel 来限制最大并发数

  2. 指数退避重试
    每个 RSS 如果第一次抓取失败,则会间隔几秒后再次重试,且间隔呈指数级递增(1s -> 2s -> 4s),最多重试三次,极大提高成功率

  3. 灵活存储
    RSS_SOURCE: 可以决定从 COS 读取一个远程 txt 文件(里面存放 RSS 列表),或直接从 GitHub 的 data/rss.txt 读取
    SAVE_TARGET: 可以把抓取结果上传到 GitHub,或者传到腾讯云 COS

  4. 日志自动清理
    每次成功写入日志后,会检查 logs/ 目录下的日志文件,若超过 7 天就自动删除,避免日志越积越多

2.2 指数退避

上一次写指数退避,还是在养老院写PHP的时候,时过境迁啊,这段算法我调试了很久,其实不难,也就是说失败一次,就等待更长的时间再重试,配置如下:

  • 最大重试次数: 3
  • 初始等待: 1秒
  • 等待倍数: 2.0

也就是说失败一次就加倍等待,下次若依然失败就再加倍,如果三次都失败则放弃处理

// fetchAllFeeds 并发抓取所有RSS链接,返回抓取结果及统计信息
//
// Description:
//
//   该函数读取传入的所有RSS链接,使用10路并发进行抓取
//   在抓取过程中对解析失败、内容为空等情况进行统计
//   若抓取的RSS头像缺失或无法访问,将替换为默认头像
//
// Parameters:
//   - ctx           : 上下文,用于控制网络请求的取消或超时
//   - rssLinks      : RSS链接的字符串切片,每个链接代表一个RSS源
//   - defaultAvatar : 备用头像地址,在抓取头像失败或不可用时使用
//
// Returns:
//   - []feedResult         : 每个RSS链接抓取的结果(包含成功的Feed及其文章或错误信息)
//   - map[string][]string  : 各种问题的统计记录(解析失败、内容为空、头像缺失、头像不可用)
func fetchAllFeeds(ctx context.Context, rssLinks []string, defaultAvatar string) ([]feedResult, map[string][]string) {
	// 设置最大并发量,以信道(channel)信号量的方式控制
	maxGoroutines := 10
	sem := make(chan struct{}, maxGoroutines)

	// 等待组,用来等待所有goroutine执行完毕
	var wg sync.WaitGroup

	resultChan := make(chan feedResult, len(rssLinks)) // 用于收集抓取结果的通道
	fp := gofeed.NewParser()                           // RSS解析器实例

	// 遍历所有RSS链接,为每个RSS链接开启一个goroutine进行抓取
	for _, link := range rssLinks {
		link = strings.TrimSpace(link)
		if link == "" {
			continue
		}
		wg.Add(1)         // 每开启一个goroutine,对应Add(1)
		sem <- struct{}{} // 向sem发送一个空结构体,表示占用了一个并发槽

		// 开启协程
		go func(rssLink string) {
			defer wg.Done()          // 协程结束时Done
			defer func() { <-sem }() // 函数结束时释放一个并发槽

			var fr feedResult
			fr.FeedLink = rssLink

			// 抓取RSS Feed, 无法解析时,使用指数退避算法进行重试, 有3次重试, 初始1s, 倍数2.0
			feed, err := fetchFeedWithRetry(rssLink, fp, 3, 1*time.Second, 2.0)
			if err != nil {
				fr.Err = wrapErrorf(err, "解析RSS失败: %s", rssLink)
				resultChan <- fr
				return
			}

			if feed == nil || len(feed.Items) == 0 {
				fr.Err = wrapErrorf(fmt.Errorf("该订阅没有内容"), "RSS为空: %s", rssLink)
				resultChan <- fr
				return
			}

			// 获取RSS的头像信息(若RSS自带头像则用RSS的,否则尝试从博客主页解析)
			avatarURL := getFeedAvatarURL(feed)
			fr.Article = &Article{
				BlogName: feed.Title,
			}

			// 检查头像可用性
			if avatarURL == "" {
				// 若头像链接为空,则标记为空字符串
				fr.Article.Avatar = ""
			} else {
				ok, _ := checkURLAvailable(avatarURL)
				if !ok {
					fr.Article.Avatar = "BROKEN" // 无法访问,暂记为BROKEN
				} else {
					fr.Article.Avatar = avatarURL // 正常可访问则记录真实URL
				}
			}

			// 只取最新一篇文章作为结果
			latest := feed.Items[0]
			fr.Article.Title = latest.Title
			fr.Article.Link = latest.Link

			// 解析发布时间,如果 RSS 解析器本身给出了 PublishedParsed 直接用,否则尝试解析 Published 字符串
			pubTime := time.Now()
			if latest.PublishedParsed != nil {
				pubTime = *latest.PublishedParsed
			} else if latest.Published != "" {
				if t, e := parseTime(latest.Published); e == nil {
					pubTime = t
				}
			}
			fr.ParsedTime = pubTime
			fr.Article.Published = pubTime.Format("02 Jan 2006")

			resultChan <- fr
		}(link)
	}

	// 开启一个goroutine等待所有抓取任务结束后,关闭resultChan
	go func() {
		wg.Wait()
		close(resultChan)
	}()

	// 用于统计各种问题
	problems := map[string][]string{
		"parseFails":   {}, // 解析 RSS 失败
		"feedEmpties":  {}, // 内容 RSS 为空
		"noAvatar":     {}, // 头像地址为空
		"brokenAvatar": {}, // 头像无法访问
	}
	// 收集抓取结果
	var results []feedResult

	for r := range resultChan {
		if r.Err != nil {
			errStr := r.Err.Error()
			switch {
			case strings.Contains(errStr, "解析RSS失败"):
				problems["parseFails"] = append(problems["parseFails"], r.FeedLink)
			case strings.Contains(errStr, "RSS为空"):
				problems["feedEmpties"] = append(problems["feedEmpties"], r.FeedLink)
			}
			results = append(results, r)
			continue
		}

		// 对于成功抓取的Feed,如果头像为空或不可用则使用默认头像
		if r.Article.Avatar == "" {
			problems["noAvatar"] = append(problems["noAvatar"], r.FeedLink)
			r.Article.Avatar = defaultAvatar
		} else if r.Article.Avatar == "BROKEN" {
			problems["brokenAvatar"] = append(problems["brokenAvatar"], r.FeedLink)
			r.Article.Avatar = defaultAvatar
		}
		results = append(results, r)
	}
	return results, problems
}

2.3 并发抓取 + 限流

为避免一下子开几十上百个协程导致阻塞,可以配合一个带缓存大小的 channel

maxGoroutines := 10
sem := make(chan struct{}, maxGoroutines)

for _, rssLink := range rssLinks {
    // 启动 goroutine 前先写入一个空 struct
    sem <- struct{}{}
    go func(link string) {
        // goroutine 执行结束后释放 <-sem
        defer func() { <-sem }()
        fetchFeedWithRetry(link, parser, 3, 1*time.Second, 2.0)
        // ...
    }(rssLink)
}

3. 对比旧版本的改进

  1. 容错率显著提升

    遇到网络抖动、超时等问题,能以10路并发限制式自动重试,很少出现直接拿不到数据

  2. 抓取速度更快

    以 10 路并发为例,对于数量多的 RSS,速度提升明显

  3. 日志分类更细

    分清哪条 RSS 是解析失败,哪条头像挂了,哪条本身有问题,后续维护比只给个403 Forbidden方便太多

  4. 支持 COS

    可将最终 data.json 放在 COS 上进行 CDN 加速;也能继续放在 GitHub,视自己需求而定

  5. 自动清理过期日志

    每次抓取后检查 logs/ 目录下 7 天之前的日志并删除,不用手工清理了

4. Go 生成的 JSON 和日志长啥样

4.1 RSS

抓取到的文章信息会按时间降序排列,示例:

{
  "items": [
    {
      "blog_name": "obaby@mars",
      "title": "品味江南(三)–虎丘塔 东方明珠",
      "published": "10 Mar 2025",
      "link": "https://oba.by/2025/03/19714",
      "avatar": "https://oba.by/wp-content/uploads/2020/09/icon-500-100x100.png"
    },
    {
      "blog_name": "风雪之隅",
      "title": "PHP8.0的Named Parameter",
      "published": "10 May 2022",
      "link": "https://www.laruence.com/2022/05/10/6192.html",
      "avatar": "https://www.laruence.com/logo.jpg"
    }
  ],
  "updated": "2025年03月11日 07:15:57"
}

4.2 日志

程序每次运行完毕后,把抓取统计和问题列表写到 GitHub 仓库 logs/YYYY-MM-DD.log:

[2025-03-11 07:15:57] 本次订阅抓取结果统计:
[2025-03-11 07:15:57] 共 25 条RSS, 成功抓取 24 条.
[2025-03-11 07:15:57] ✘ 有 1 条订阅解析失败:
[2025-03-11 07:15:57] - https://tcxx.info/feed
[2025-03-11 07:15:57] ✘ 有 1 条订阅头像无法访问, 已使用默认头像:
[2025-03-11 07:15:57] - https://www.loyhome.com/feed

5. 照葫芦画瓢

如果你也想玩玩 LhasaRSS

  1. 准备一份 RSS 列表(TXT):

    格式:每行一个 URL
    如果 RSS_SOURCE = GITHUB,则可以放在项目中的 data/rss.txt
    如果 RSS_SOURCE = COS,就把它上传到某个 https://xxx.cos.ap-xxx.myqcloud.com/rss.txt

  2. 配置好环境变量:

    默认所有数据保存到 Github,所以 COS API 环境变量不是必要的

     env:
         TOKEN:                    ${{ secrets.TOKEN }}                    # GitHub Token
         NAME:                     ${{ secrets.NAME }}                     # GitHub 用户名
         REPOSITORY:               ${{ secrets.REPOSITORY }}               # GitHub 仓库名
         TENCENT_CLOUD_SECRET_ID:  ${{ secrets.TENCENT_CLOUD_SECRET_ID }}  # 腾讯云 COS SecretID
         TENCENT_CLOUD_SECRET_KEY: ${{ secrets.TENCENT_CLOUD_SECRET_KEY }} # 腾讯云 COS SecretKey
         RSS:                      ${{ secrets.RSS }}                      # RSS 列表文件
         DATA:                     ${{ secrets.DATA }}                     # 抓取后的数据文件
         DEFAULT_AVATAR:           ${{ secrets.DEFAULT_AVATAR }}           # 默认头像 URL
         RSS_SOURCE                ${{ secrets.RSS_SOURCE }}               # 可选参数 GITHUB or COS
         SAVE_TARGET               ${{ secrets.SAVE_TARGET }}              # 可选参数 GITHUB or COS
    


  3. 部署并运行

    只需 go run . 或在 GitHub Actions workflow_dispatch 触发 运行结束后,就会在 data 文件夹更新 data.json,日志则写进 GitHub logs/ 目录,并且自动清理旧日志

注:如果你依旧想完全托管在 COS 上,需要把 RSS_SOURCE 和 SAVE_TARGET 都写为 COS,然后使用 GitHub Actions 去调度

相关文档

Cloudflare/Vercel项目推荐(4)

作者 LiuShen
2025年3月20日 21:52
很久没有推荐项目啦,之前的三次项目分享反馈都很好,涵盖了很多领域的项目,大家也很喜欢那些项目,近期我又收集了一些,数量达到了,那就再来分享一些吧!项目很难找的QAQ!

脚本分享:CDN 流量触顶后自动切换至 Cloudflare

作者 HowieHz
2025年3月19日 23:10
方案价值与应用场景 防御性场景 - DDoS 攻击流量过载保护 当你的 CDN 被恶意攻击,触发流量封顶限制。程序会将 DNS 指向 Cloudflare,保证站点访问的同时利用 Cloudflare 的防火墙功能抵御攻击。 当你做好 IP 屏蔽,重新启用 CDN 时,程序会自动恢复原本的国内外分流

官方 BUG 快薅!Halo 永久/买断用户可额外获得一份买断许可

作者 HowieHz
2025年3月19日 19:05
本文是 限时特惠!1¥ 立即解锁 1Panel 专业版全功能 61 天 的补充说明 2。 不仅限于 1Panel 永久授权/买断许可证!如果你先前已经有 Halo 永久授权/买断许可证,你可以也再领取一份当前在售的版本买断产品。 官方说明原话是:永久授权、版本买断许可无法续期,二者都将获赠当前在售的

老用户专享!已有 1Panel 永久授权/买断许可用户可再领免费买断许可证!

作者 HowieHz
2025年3月18日 20:17
本文是 限时特惠!1¥ 立即解锁 1Panel 专业版全功能 61 天 的补充说明。 如果你先前已经有 1Panel 永久授权/买断许可证,你可以再领取一份当前在售的版本买断产品。 直接从流程的第五步开始即可。 活动截止到 2025-03-31,不要错过了。

限时特惠!1¥ 立即解锁 1Panel 专业版全功能 61 天

作者 HowieHz
2025年3月18日 18:19
前言 活动缘由:1Panel 推出了个官方 APP,已结束公测,进入正式版本。但是这个官方 APP 只有 1Panel 专业版可用,所以 1Panel 官方推出了这个活动。 (这个 APP 对于我个人来说用处不大,毕竟手机浏览器本来就可以完全控制) 1¥ 解锁 1Panel 专业版 61 天全流程

五周年的一些感悟

作者 hmao
2025年2月22日 09:26
不知不觉,「hmao的日记」即将迎来五周年纪念(从2020年12月开始记录,虽然2020年不计入完整年份,但2 […]
  • ✇刑辩人在路上
  • 成功案例:贪污、受贿、滥用职权罪,无罪辩护意见部分采纳,检察院撤回对滥用职权罪指控
    成功案例:职务犯罪案件有效辩护,被告人涉贪污、受贿、滥用职权罪,无罪辩护意见部分采纳,检察院撤回对滥用职权罪指控。法律文书: 80后刑事律师的办案手记,专注无罪辩护,反抗者的灵魂从未远去。联系方式:liuchen8916@foxmail.com继续阅读《成功案例:贪污、受贿、滥用职权罪,无罪辩护意见部分采纳,检察院撤回对滥用职权罪指控》的全文内容...分类: 成功案例 | Tags: 职务犯罪,变更起诉,撤回起诉,无罪辩护,有效辩护,贪污受贿,滥用职权, | 添加评论(0)还没有评论,您来说两句?相关文章:成功案例:贪污一审十年,二审发回重审 (2023-07-18) 绝对权力 (2023-06-08) 成功案例:故意杀人一审轻判十年 (2023-07-18) 看守所里的母亲,最大的心愿是给女儿报一个舞蹈班 (2023-09-06) 高科技“考成”下的刑事辩护 (2024-08-06) This message is used to verify that this feed (feedId:48270853499278344) belongs to me (userId:6
     

成功案例:贪污、受贿、滥用职权罪,无罪辩护意见部分采纳,检察院撤回对滥用职权罪指控

2025年3月3日 10:46

成功案例:职务犯罪案件有效辩护,被告人涉贪污、受贿、滥用职权罪,无罪辩护意见部分采纳,检察院撤回对滥用职权罪指控。

法律文书:

成功案例:贪污、受贿、滥用职权罪,无罪辩护意见部分采纳,检察院撤回对滥用职权罪指控  职务犯罪 变更起诉 撤回起诉 无罪辩护 有效辩护 贪污受贿 滥用职权 第1张

80后刑事律师的办案手记,专注无罪辩护,反抗者的灵魂从未远去。联系方式:liuchen8916@foxmail.com

继续阅读《成功案例:贪污、受贿、滥用职权罪,无罪辩护意见部分采纳,检察院撤回对滥用职权罪指控》的全文内容...

分类: 成功案例 | Tags: 职务犯罪变更起诉撤回起诉无罪辩护有效辩护贪污受贿滥用职权, | 添加评论(0)

还没有评论,您来说两句?

相关文章:

This message is used to verify that this feed (feedId:48270853499278344) belongs to me (userId:69553665730701312). Join me in enjoying the next generation information browser https://follow.is.
❌
❌