Fournoas 评论《张作霖为什么要用最残忍的方式杀害李大钊》:

穷则国际主义,达则境外势力

Fournoas 说:

问:中国大陆获得过诺贝尔奖的共有几位?

答:反华分子说有四位,分裂主义者说有三位,而我们是辩证地看待这个问题——抛开和平奖不谈,有两位。

Fournoas 评论《被指为信访人提供帮助 湖南一信访局干部遭双开》:

樊喜华也被指为徇私利,多次为信访人撰写或修改信访报告材料,违规操作或怂恿、唆使部分信访人进行频繁、重复网上信访,扰乱正常的信访工作秩序,严重损害中共和政府的形象和公信力;利用职务便利,为信访人提供帮助,并非法收受信访人财物。

莫非这就是常听人提起的“帮信罪”吗?

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

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

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

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

……

Fournoas 说:

想不花一分钱使用微软的渠道分发新软件难度很大。

  1. 提交到 Winget 社区库虽然不用花钱,但是新软件安装包大概率会被 SmartScreen 拦截,那么提交就不会被通过。如果要避免拦截,需要购买证书,大概每年要花费几百美元。
  2. 提交到微软应用商店需要注册 Partner Center 账号。个人用户要支付一次性注册费 $19 美元(¥119 人民币)。
窗口托盘最小化工具从 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 对象替代全局对象。

……

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

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

……