《小学生十万个为什么》盗版了谁?

上世纪 80 年代末、90 年代初,黑龙江技术出版社曾出版过一套名为《小学生十万个为什么》的科普丛书。

小学生十万个为什么(第一系列)book.douban.com小博士系列丛书
小学生十万个为什么(第二系列)book.douban.com小博士系列丛书

该丛书以漫画形式进行儿童科普,在当年国内属于首创。丛书一经推出便大受欢迎,发行量很大,至今在二手书市仍可见其踪迹。书中人物画风明显属于日本漫画风格,或者更准确地说,是手冢治虫的漫画风格。

……

什么是 Windows UserChoice 保护驱动(UCPD.sys)

在社交媒体上刷到一条非常扯淡的帖子,算是典型的蛆头为了吃「爱国」流量饭,利用民粹主义,专门针对低认知的蠢货们打造的无耻谣言。冠之以「技术流分析」,实则狗屁不懂。

xhs

言归正传,这个 UCPD.sys 究竟是什么来头呢?故事还要从当年流氓软件大战说起……

早期 Windows 对文件关联(即文件默认打开程序)的管理非常简单——任何程序都可以通过修改注册表键值来修改文件关联。这导致各种流氓软件滥用该特性来霸占用户电脑,特别是国产浏览器,通过修改 http/https 协议关联程序,来劫持用户上网行为。

……

Lazarus 项目支持多语言国际化(进阶篇)

在之前的一篇文章中简单介绍了如何在 Lazarus 项目中启用多语言国际化。不过使用 DefaultTranslatorSetDefaultLang() 无法实现运行时动态切换 GUI 的语言。更准确地说,在程序中首次调用 LCLTranslator.SetDefaultLang(),并将参数 ForceUpdate 设为 True,是能够在运行时修改 GUI 语言的,但若再次调用便无效了。

查看 SetDefaultLang() 源代码:

pascalfunction SetDefaultLang(Lang: string; Dir: string = ''; LocaleFileName: string = ''; ForceUpdate: boolean = true): string;
{ Arguments:
  Lang - language (e.g. 'ru', 'de', 'zh_CN'); empty argument is default language.
  Dir - custom translation files subdirectory (e.g. 'mylng'); empty argument means searching only in predefined subdirectories.
  LocaleFileName - custom translation file name; empty argument means that the name is the same as the one of executable.
  ForceUpdate - true means forcing immediate interface update. Only should be set to false when the procedure is
    called from unit Initialization section. User code normally should not specify it.
}
var
  lcfn: string;
  LocalTranslator: TUpdateTranslator;
  i: integer;

begin
  Result := '';
  LocalTranslator := nil;
  // search first po translation resources
  try
    lcfn := FindLocaleFileName('.po', Lang, Dir, LocaleFileName, Result);
    if lcfn <> '' then
    begin
      Translations.TranslateResourceStrings(lcfn);
      LocalTranslator := TPOTranslator.Create(lcfn);
    end
    else
    begin
      // try now with MO translation resources
      lcfn := FindLocaleFileName('.mo', Lang, Dir, LocaleFileName, Result);
      if lcfn <> '' then
      begin
        GetText.TranslateResourceStrings(UTF8ToSys(lcfn));
        LocalTranslator := TDefaultTranslator.Create(lcfn);
      end;
    end;
  except
    Result := '';
    lcfn := '';
  end;

  if lcfn<>'' then
    TranslateLCLResourceStrings(Lang, lcfn);

  if LocalTranslator<>nil then
  begin
    if Assigned(LRSTranslator) then
      LRSTranslator.Free;
    LRSTranslator := LocalTranslator;

    // Do not update the translations when this function is called from within
    // the unit initialization.
    if ForceUpdate=true then
    begin
      for i := 0 to Screen.CustomFormCount-1 do
        LocalTranslator.UpdateTranslation(Screen.CustomForms[i]);
      for i := 0 to Screen.DataModuleCount-1 do
        LocalTranslator.UpdateTranslation(Screen.DataModules[i]);
    end;
  end;
end;
lcltranslator.pas

该函数首先查找本地的 .po.mo 翻译文件;然后,将程序的资源字符串翻译成本地语言;接下来,创建一个新的 TUpdateTranslator 对象替代全局对象。

……

Free Pascal Hack 之访问对象的 protected 成员

默认情况下,Free Pascal 类中 protected 成员只能被当前类、子类以及同一个 Unit 中的代码访问。然而在实践中,往往会碰到访问其他 Unit 中定义的类实例对象的 protected 成员的需求。通常我们会通过类继承以及修改原始类成员的代码来暴露 protected 成员,然而当该对象来自第三方库,甚至 FCL 和 LCL 时,情况就会比较棘手。有一种 Hack 方法可以实现这个需求,且不用修改原始 Unit 的代码,没有额外副作用。

……

修复 scoop update 后 vcpkg 无法运行的故障

系统使用的 vcpkg 是由 scoop 安装的,在某次 scoop update -a 更新后故障无法运行。通过分析发现是由于安装脚本未能正确执行导致文件缺失引起的。以下是故障分析过程。

发现问题

打开 UniGetUI 更新时发现 vcpkg 的安装源不见了。

在命令行中运行 vcpkg 提示:

Shim: Could not determine if target is a GUI app. Assuming console.
Shim: Could not create process with command '"D:\Apps\scoop\apps\vcpkg\current\vcpkg.exe" '.

运行命令 scoop list vcpkg,显示软件已安装:

Installed apps matching 'vcpkg':

Name  Version    Source Updated             Info
----  -------    ------ -------             ----
vcpkg 2025.07.25 main   2025-07-29 10:56:05

尝试修复

看起来是 scoop shim 出了问题。尝试用 scoop reset vcpkg 命令重置。再次运行 vcpkg,无响应。接着尝试卸载 vcpkg 重新安装。运行 scoop uninstall vcpkg 命令,卡在运行 uninstall script 无响应。

……

Scoop 安装 Chrome 浏览器的用户数据问题

不知道从哪个版本开始,通过 Scoop 安装的 Chrome 浏览器不再保留本地用户数据。每次更新后,用户数据都要从 Google 账户同步。

Scoop 官方的解释是因为浏览器限制导致的:

Profile might point to default location (e.g. $env:LOCALAPPDATA\Google\Chrome\User Data), when --user-data-dir point to a specified path(e.g. $dir\userdata(persist\googlechrome\userdata)).

官方的建议是:

I would recommend that you install the default/main browser by its official installer.

不过 Chrome 并不是我的主力浏览器,即便官方不支持,也还是可以补救一下的。

根据以下路径找到开始菜单里 Chrome 的快捷方式:

……

Fournoas 说:

问:图中的父亲错在哪里?

答:他不该乱扔垃圾。

Fournoas 说:

“女大学生有损国格被学校开除”事件不禁让我遥想到当年的中央苏区——来自德国的洋顾问李德提出“希望有个中国女战士陪他睡觉”。组织上为了解决洋顾问的生理问题可谓是殚心竭虑,中央局妇委主任李坚贞立即找来同乡萧月华,以“革命工作需要”为由,安排她成为李德的“妻子”。此类事件在沈容的《红色记忆》里亦有记载(如图)。

另外,根据美国国务院解密的文件记录,某国伟大领袖在 1973 年接见美国前国务卿基辛格时指出,“中国的女人太多了”、“先白送给美国几万中国女人”、“这些女人到了美国,美国人的麻烦就多了”。某国工作人员当场就指出,谈话不得记录,否则就是对中国人民的污蔑。而美帝国主义却背信弃义,言而无信地保留了谈话内容。我们应该强烈谴责美帝国主义严重损害某国国格的行为。

女性属于国家神圣不可侵犯的性资源,女性私自和洋人性交属于出卖国家资源,但如果是国家主动出口的那就没事了

Fournoas 评论《甘肃天水幼儿血铅异常来源查明 系后厨违规添加彩色颜料制作食品》:

官方公布玉米卷肠包铅含量分别为1052毫克/千克、1340毫克/千克。有网友说,食物要达到如此高的铅含量,添加的只可能是工业颜料铅铬黄。我淘宝搜了一下,铅铬黄价格大概是 42 元每斤,而食用色素日落黄价格仅为 14 元每斤。难道是我淘宝打开方式不对?

Fournoas 说:

把中国人当日本人整?醒醒,你还想享受外宾待遇?中国人从来就是被当作中国人整的