新编机器猫小叮当:被盗版两次的哆啦A梦

台湾最早从 1970 年代开始引进(盗印)《哆啦A梦》漫画。彼时正值 1972 年台日断交后关系恶化,加上那个时代的漫画审查制度,盗印漫画的出版社为了方便过审,会去除漫画作品中的日本元素,进行本土化改造。当时青文出版社参照香港《儿童乐园》杂志里使用的「叮当(噹)」译名,将漫画起名为「机器猫小叮当」,并为书中角色起了中文名字。叶大雄、宜静、技安、阿福、王聪明、小叮铃等耳熟能详的译名,就在青文版里第一次出现。大雄家也从日本东京练马区月见台搬到了台湾台北县,漫画中出现的日本地名也改成了台北、台南、高雄、花莲等,而漫画中经常出现的「高井山」则变成了「阳明山」。

……

探寻向忠发被捕和变节真相

向忠发是中共成立以来仅有的一位真正出身于「工人阶级」(一说是流氓无产者)的党总书记,也是中共官方最不愿提及的一位党「傀」。1928 年,向忠发在共产国际的支持下,当上了中共党总书记(中共中央常委会主席),直到 1931 年 6 月 22 日被捕后迅速处决,在任不到三年。虽然他名义上是中共领导人,但很长时间里,中共中央的工作实际由当时任中央常委的周恩来负责。

……

假如鲁迅再活十年

前阵子是鲁迅逝世 89 周年纪念。他逝世于 1936 年 10 月 19 日,正好是中日爆发全面战争的前一年。很多人觉得,鲁迅在这个节骨眼上去世,简直是恰到好处——不但避免了很多人(包括他自己在内)的尴尬,也落得了最大的实惠。

1930年代在上海期间,鲁迅曾加入过中共领导的左翼作家联盟,不过在他过世前,左联就因为路线之争已经解散了。其被中共所钦定的文坛地位也是在他死后确立的。这也可以理解,毕竟人死后才能盖棺定论,才不会出现陈独秀、张国焘那样和组织决裂的事故。而中共在鲁迅死后将其捧上神坛,自然也就继承了其包括名望在内的所有政治遗产,这显然是合家欢喜的双赢……不对,应该是三赢的局面——天天被他喷的国民政府也松了口气吧。

……

升级 PowerToys 后无法启动 Windows Terminal

现象

上周五(10月17日)进行了 Windows 系统更新和软件升级,升级的软件并不包含 Windows Terminal。本周一(10月20日)发现 Windows Terminal 无法启动——运行后在任务栏闪现窗口,但立即退出进程。尝试多个旧版本的 Windows Terminal,依然无法运行。

原因

起初怀疑是 Windows 更新导致的问题。另外发现 GitHub 上已经有人提交了 Issue,描述也是如此。这更加深了是 Windows 更新的嫌疑。不过项目维护者表示,引起崩溃的屎山代码已经有 3 年没人动过了,应该不至于有问题。

……

通过 GitHub Actions 编译 Lazarus 项目

理论上 Lazarus 是支持交叉编译的,但官方发行的默认版本并没有打包不同平台所依赖的各组件。比如在 Windows 平台上将编译目标设为 Linux 时,编译器会报错:Can’t find unit system used by fcllaz ——缺少 Linux 平台上的预编译文件。

虽然可以使用 fpcupdeluxe (GitHub) 项目安装支持交叉编译的 Lazarus 工具链,不过这个工具似乎不支持命令行环境下的配置和安装。

……

国庆节不是祖国的生日 警惕反动势力用含情脉脉的类比潜移默化地宣扬历史虚无主义

那年的十月一日,城门楼子上庄严宣告的是:“中央人民政府今天成立了”,而不是“中国今天成立了”。真要搞什么“拟人化”修辞,那么这一天也顶多算是那个政权的生日

我们自幼接受的教育就是“中华文明源远流长,历史上下五千年”。若把中国的生命起点定在 1949 年,那这就是一种自我矮化、自我阉割。

再说那首名为《今天是你的生日》的歌曲,其歌词表面上含情脉脉,实则将中国五千年历史统统抹煞。已然是对中华文明的不敬,甚至可以认为是一种暗藏杀机的辱华。当然,我们可以认为歌词作者是政治觉悟低下,或者受人蛊惑犯下了错误,应该给予一个改过自新的机会。建议将歌词改为“今天是你的生日,我的中央人民政府”。这样才算得上尊重历史又政治正确。

……

窗口托盘最小化工具从 Traymond 进化为 Traynard

在前文《增强版 Traymond 让任意窗口最小化到系统托盘》中介绍了一款可以将任意窗口最小化到系统托盘的 Windows 桌面小工具。该工具代码 fork 自另一个同名项目,新增了一些功能并做了界面中文化。不过原项目是基于 Windows API 开发的,没有使用任何 GUI 框架,想要在此之上做进一步扩展非常麻烦,索性推倒重来。

tabris17/traynardgithub.coma Windows desktop utility for minimizing any application window to the system tray

功能介绍

新版本除了保留原来的 icon 外,已全部使用 Lazarus 重写,并在原有功能的基础上,新增了图标分组扩展窗口菜单的功能。

……

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

上世纪 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 对象替代全局对象。

……