• Re: 张小北就不配拥有幸福么?

    他怎么天天负能量了?他不是因时制宜的代表的吗?

    【 在 SuperMan999 的大作中提到: 】

    : 幸福是靠经营出来的,张小北扣扣索索,天天负能量给伴侣,跟他在一起就是坐牢,除非有人喜欢受虐,不然难有人愿意跟他在一起

    09月14日
  • Re: 忍不住想骂linux 一个难点/槽点

    不然怎么适应全世界的各种应用场景?

    【 在 zhanghaoX 的大作中提到: 】

    : 那些个配置文件都是一个例子接一个例子,各种杂七杂八的缩写满天飞,那些要配,那些不要配,配的值有哪些选项,艹,文档说明一个没有,

    : 就说网卡配置那个interface,  lo iface inet 都tm啥啊,

    : ...................

    09月13日
  • Re: 人民警察可以在平民不同意的情况下强行扣留私人物品作为证

    如果是可以吃的,扣了吃掉都不违法?

    09月13日
  • Re: 孙俪和罗晋将因为一部电视剧被钉在耻辱柱上

    建议你回去清朝

    09月13日
  • 张小北就不配拥有幸福么?

    他根本一点错都没有!

    09月13日
  • [版面建设] 想要招个助理版主

    我对助理版主的理解:

    ① 助理版主是一个有学术性的追求的人,他(她)有独立思考和判断的能力,通常应该有较好的学历或学术品味,对版面的建设和发展能够起推动性的、支撑性的作用;

    ② 在具体的为水木社区的用户们服务的性质上,他(她)并不是一个依靠耍弄特权而获得社区地位的人,而是通过精湛的版面管理、良好的学理修养、持续的业绩积累等等,赢得相关阅读群的尊重;

    ③ 他(她)有较好的逻辑组织能力和必要的输出能力,尊重水木社区站务和本版版主的权威,好学好问善于质疑地采取恰当的措施协助本版的宗旨和有关任务的落实;

    ④ 头脑灵活,要客观看待版务发展和各种事项之间的关系,不能搞“顺应时势”“因时制宜”“火了”那一套;

    当前助理版主的工作要求:

    ① 最大的要求是能开展对本版精华区的整理和编辑。我们准备用“编年精选”的方式整理一下这将近二十年来本版的发言,这个工作还未完成;

    ② 由于各种原因,一开始先采取无署名的方式参与精华区整理和编辑,待时机成熟了再申请正式版主。

    ③ 我们不希望版务变成一个庞大的,管理人员大于使用人员的团体。所以这可能还是一个比较寂寞的、一般人不太会注意到的事情,需要耐得住寂寞并且自己能够做能产生价值的事。

    ④ 精华区的整理和编辑是有方向的,这就是要在整理和编辑的过程中发现我国软件工程(和软件供给)同世界软件工程(和软件供给)的趋势或规律。具体的疑问和不解可由版主说明或提出学理性的质疑。

    那些人可能对助理版主感兴趣呢?我认为这些人可以考虑一下:

    ① 有一定的闲暇时间的人。这就是说愿意牺牲玩游戏、发呆摸鱼、无所事事、看书看新闻刷各种应用程序等等的时间;

    ② 有服务精神和相关能力的人。要相信自己能够通过精准的眼光和敏锐的观察力从版务中创造价值、贡献气力,而不是向社会掠夺价值、消费价值。

    ③ 有较好的自律能力又积极与时俱进的人。这就是说能把自己准确地、恰当地安排到版务的事情中来。

    我们不太确定是否能有合适的人选,在能够快速进入相关上下文的情况下,参与时间每周大概1小时,每月大概2小时左右,主要的工作方式和内容是调研整理编辑内外部的文件、进行讨论、审定相关文件,要使用微信、QQ等即时通讯软件。

    最低的底线是要能看懂本版早期的帖子的大概内容,并且能够提出一些精华区整理、版面发展的建议、框架。

    这不是一个很有时效性的工作,但这里真的需要你!

    09月12日
  • Re: [供给侧]一个开源项目(xserver)18年前的一次重构 (转载)

    就是应该少读代码多想想

    【 在 eggcar 的大作中提到: 】

    : 代码读得少,想得太多

    09月06日
  • Re: [供给侧]一个开源项目(xserver)18年前的一次重构 (转载)

    Javascript 的 constructor 似乎应该视为已经冲破了 lisp 因为他重新定义了什么是“定义”

    【 在 xiaoju 的大作中提到: 】

    : 与时俱进版应该改成javascript

    09月02日
  • Re: [供给侧]一个开源项目(xserver)18年前的一次重构 (转载)

    我的标题就说了这是18年前的一次重构!!

    18年前!

    18年前!

    18年前!

    18年前!

    2003年的xserver的一次重构!

    2003年的xserver的一次重构!

    2003年的xserver的一次重构!

    2003年的xserver的一次重构!

    【 在 alextooter 的大作中提到: 】

    : 所以没啥奇怪的,为什么你跟发现新大陆似的

    : 这是很早以前的通用写法

    09月01日
  • Re: [供给侧]一个开源项目(xserver)18年前的一次重构 (转载)

    没有没有,没有跟你说的东西比的意思。。

    主要觉得对 xserver 这个项目来说,有标志性的意义……

    【 在 DoorWay 的大作中提到: 】

    : 你这个史诗级,是红军二万五千里的史诗,还是敏捷开发里的epic?

    : 这个被把握的问题,是“Plugin”即插即用的架构设计吗?

    : 没懂你为何这么拔高。

    09月01日
  • Re: [供给侧]一个开源项目(xserver)18年前的一次重构 (转载)

    这个说法有点问题……

    应该是“都会抽象到涉及到数学群、对称、可分性、关系”这些数学上还在努力的概念……

    Common Lisp 当然能够实现这些,但是其实在 feature positioning 上面 lisp 非常的乱的……

    【 在 tgfbeta 的大作中提到: 】

    : "格林斯潘第十定律"(Greenspun's Tenth Rule):

    :     "任何C或Fortran程序复杂到一定程度之后,都会包含一个临时开发的、只有一半功能的、不完全符合规格的、到处都是bug的、运行速度很慢的Common Lisp实现。"

    09月01日
  • Re: [供给侧]一个开源项目(xserver)18年前的一次重构 (转载)

    这就是十八年前的代码啊 = = 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

    【 在 alextooter 的大作中提到: 】

    : 十几年前C项目里面也是这样写的。

    : 这个很稀奇吗?当年一堆书介绍过这种写法,什么c oop, c interface之类的

    09月01日
  • Re: [供给侧]一个开源项目(xserver)18年前的一次重构 (转载)
    2508618 (1012.7 K)

    反正我写不出来。。

    源码有个文档的,感觉可以看一下……

    由于需求已经梳理了,肯定比他们当年从0开始简单。。但是没有机器学习啥的,主要是熟悉各种硬件软件的接口,然后健壮性和兼容性怎么能搞好……

    反正我现在做不出来……

    跟设计模式没啥关系,就算知道全部设计模式了,也就是有了个框架,其他的不懂还是一行都写不了……

    【 在 hgoldfish 的大作中提到: 】

    : 弱问。重写一个 xserver 难吗?

    08月31日
  • Re: [供给侧]一个开源项目(xserver)18年前的一次重构 (转载)

    这里是史诗级的重构的原因在于,这次重构标志着他们对 xserver 这样子一个项目的理解接近承认,其内部的功能已经被认为是清晰的(不然无法改成数据结构)

    这跟那种一上来先搞一套“数据结构+算法”没有太大关系。主要的意义在于面向过程和面向对象的关系如何被把握,这个被把握的问题才是“史诗级”的前提。

    简单来说,这里体现了一种深邃的辩证法,作为结果的代码的变革的背后的思想的变化才是我评价的关键,不是设计模式的“应用”的问题,而是“设计模式”的原理的问题。

    08月31日
  • Re: [供给侧]一个开源项目(xserver)18年前的一次重构 (转载)

    其实不能一概而论的。。

    这里涉及到 xserver 的实现思路,总得来说他们好像是不断地扩充了“插件”的内涵,直到当年已经有一大堆了。。然后估计他们意识到性质变了,已经不是 hello windows, hello mac , hello linux 那种事了。。

    a series of order 也有优点的,尤其是一些完整性是内聚的不能“扩展”的场合,保持 a series of order 甚至是正确性和算法可以结束的基础。(一时半会我也说不出来)

    【 在 DoorWay 的大作中提到: 】

    : 你说的对。

    : 我也在尽量避免混淆,引用了其中一句,“将过程转化为数据结构”

    : a series of order —> data structure  (and the algorithm that operates them)

    : ...................

    08月31日
  • Re: [供给侧]一个开源项目(xserver)18年前的一次重构 (转载)

    小朋友,我劝你谦虚一点

    【 在 xieyf 的大作中提到: 】

    : 无语,一把重构了了事,这点破事还整出一次“史诗级”重构

    08月31日
  • SoftEng版 申请变更[中文名称修改为“软件工程和软件供给”] (

    申请版面英文名:

    SoftEng

    申请何种属性变更:

    中文名称修改为“软件工程和软件供给”

    申请变更原因(大于 20 字):

    经过许多年的发展,我国软件工程实践已经逐渐在软件构建领域有了较多实践经验的积累,已经从一般时过渡到进行时。明确将软件供给问题和软件工程并列提出,有利于提高软件工程的深度和话语能力,为更广泛的软件产业和软件工程交流提供舞台。

    申请人是否了解相关站规并已完成相应流程?

    08月29日
  • SoftEng版 申请变更[中文名称修改为“软件工程和软件供给”]

    申请版面英文名:

    SoftEng

    申请何种属性变更:

    中文名称修改为“软件工程和软件供给”

    申请变更原因(大于 20 字):

    经过许多年的发展,我国软件工程实践已经逐渐在软件构建领域有了较多实践经验的积累,已经从一般时过渡到进行时。明确将软件供给问题和软件工程并列提出,有利于提高软件工程的深度和话语能力,为更广泛的软件产业和软件工程交流提供舞台。

    申请人是否了解相关站规并已完成相应流程?

    08月29日
  • [供给侧]一个开源项目(xserver)18年前的一次重构 (转载)

    (1) 这个项目的简要信息(参考)

    =================================

    维毒百科:

    ** Graphical User Interface **

    The graphical user interface (GUI jee-you-eye or) is a form of user interface that allows users to interact with electronic devices through graphical icons and audio indicator such as primary notation, instead of text-based user interfaces, typed command labels or text navigation. GUIs were introduced in reaction to the perceived steep learning curve of command-line interfaces (CLIs), which require commands to be typed on a computer keyboard.

    ** X.Org Server **

    X.Org Server is the free and open-source implementation of the X Window System display server stewarded by the X.Org Foundation. Implementations of the client side of the protocol are available e.g. in the form of Xlib and XCB.

    简单来说, xserver 是开源业界广泛使用的一套图形用户界面解决方案,特别的,是一种广泛使用、历史悠久的基础设施级别的一个跨硬件、跨硬件体系架构、跨操作系统平台、面向不同的图形化用户应用程序的整体解决方式。

    (2) 这次重构的相关代码

    =========================

    这里只讨论一点,即 mi/miinitext.c 中的 InitExtensions 函数的实现。

    这次重构并没有改变 InitExtensions 的在C语言中的“声明”,仍然是:

    void

    InitExtensions(argc, argv)

    int        argc;

    char    *argv[];

    但是他们具体的实现方式改变了。在重构之前:

    https://gitlab.freedesktop.org/xorg/xserver/-/blob/9508a382f8a9f241dab097d921b6d290c1c3a776/mi/miinitext.c#L153

    在重构之后:

    https://gitlab.freedesktop.org/xorg/xserver/-/blob/d568221710959cf7d783e6ff0fb80fb43a231124/mi/miinitext.c#L507

    具体是这样子的:

    ① 在重构之前, void InitExtensions(argc, argv) 的函数本体主要大概是这个样子的:

    ```

    InitExtensions(argc, argv) {

    #ifdef Extension_A_MACRO

    Extension_A_Init();

    #endif

    #ifdef Extension_B_MACRO

    Extension_B_Init();

    #endif

    ...

    }

    ```

    这是“指令序列”(A series of Order)

    ② 重构之后:

    重构引入了一个静态化的结构体数组 staticExtensions :

    ```

    static ExtensionModule staticExtensions[] = {

    #ifdef Extension_A_MACRO

    { Extension_A_Init_FUNPTR, "Extension_A_Named",  Extension_A_settings... },

    #endif

    #ifdef Extension_B_MACRO

    { Extension_B_Init_FUNPTR, "Extension_B_Named",  Extension_A_settings... },

    #endif

    ...

    }

    ```

    并且通过迭代这个数组来具体调用 Extension_α_Init 了:

    ```

    void

    InitExtensions(argc, argv)

    int        argc;

    char    *argv[];

    {

    int i;

    ExtensionModule *ext;

    static Bool listInitialised = FALSE;

    if (!listInitialised) {

    /* Add built-in extensions to the list. */

    for (i = 0; staticExtensions[i].name; i++)

    LoadExtension(&staticExtensions[i], TRUE);

    /* Sort the extensions according the init dependencies. */

    LoaderSortExtensions();

    listInitialised = TRUE;

    }

    for (i = 0; ExtensionModuleList[i].name != NULL; i++) {

    ext = &ExtensionModuleList[i];

    if (ext->initFunc != NULL &&

    (ext->disablePtr == NULL ||

    (ext->disablePtr != NULL && !*ext->disablePtr))) {

    (ext->initFunc)();

    }

    }

    }

    ```

    是不是有点“多态”、“封装”的感觉?

    这种实现方式实际上是通过定义一个声明式的链表,然后通过将这个链表作为数据结构,然后建立算法。

    (3) 一些结论

    ==============

    -- 这次重构将指令序列改成了声明式链表及相关函数

    -- 这次重构之后代码更长了,但可读性提高了,而且函数中的“过程”被转化为了“数据结构”

    我认为这个重构非常切合 xserver 这样子的软件,极大地提高了其可维护性。

    堪称一次史诗级的重构!

    08月29日
  • [供给侧]一个开源项目(xserver)18年前的一次重构 (转载)

    (1) 这个项目的简要信息(参考)

    =================================

    维毒百科:

    ** Graphical User Interface **

    The graphical user interface (GUI jee-you-eye or) is a form of user interface that allows users to interact with electronic devices through graphical icons and audio indicator such as primary notation, instead of text-based user interfaces, typed command labels or text navigation. GUIs were introduced in reaction to the perceived steep learning curve of command-line interfaces (CLIs), which require commands to be typed on a computer keyboard.

    ** X.Org Server **

    X.Org Server is the free and open-source implementation of the X Window System display server stewarded by the X.Org Foundation. Implementations of the client side of the protocol are available e.g. in the form of Xlib and XCB.

    简单来说, xserver 是开源业界广泛使用的一套图形用户界面解决方案,特别的,是一种广泛使用、历史悠久的基础设施级别的一个跨硬件、跨硬件体系架构、跨操作系统平台、面向不同的图形化用户应用程序的整体解决方式。

    (2) 这次重构的相关代码

    =========================

    这里只讨论一点,即 mi/miinitext.c 中的 InitExtensions 函数的实现。

    这次重构并没有改变 InitExtensions 的在C语言中的“声明”,仍然是:

    void

    InitExtensions(argc, argv)

    int        argc;

    char    *argv[];

    但是他们具体的实现方式改变了。在重构之前:

    https://gitlab.freedesktop.org/xorg/xserver/-/blob/9508a382f8a9f241dab097d921b6d290c1c3a776/mi/miinitext.c#L153

    在重构之后:

    https://gitlab.freedesktop.org/xorg/xserver/-/blob/d568221710959cf7d783e6ff0fb80fb43a231124/mi/miinitext.c#L507

    具体是这样子的:

    ① 在重构之前, void InitExtensions(argc, argv) 的函数本体主要大概是这个样子的:

    ```

    InitExtensions(argc, argv) {

    #ifdef Extension_A_MACRO

    Extension_A_Init();

    #endif

    #ifdef Extension_B_MACRO

    Extension_B_Init();

    #endif

    ...

    }

    ```

    这是“指令序列”(A series of Order)

    ② 重构之后:

    重构引入了一个静态化的结构体数组 staticExtensions :

    ```

    static ExtensionModule staticExtensions[] = {

    #ifdef Extension_A_MACRO

    { Extension_A_Init_FUNPTR, "Extension_A_Named",  Extension_A_settings... },

    #endif

    #ifdef Extension_B_MACRO

    { Extension_B_Init_FUNPTR, "Extension_B_Named",  Extension_A_settings... },

    #endif

    ...

    }

    ```

    并且通过迭代这个数组来具体调用 Extension_α_Init 了:

    ```

    void

    InitExtensions(argc, argv)

    int        argc;

    char    *argv[];

    {

    int i;

    ExtensionModule *ext;

    static Bool listInitialised = FALSE;

    if (!listInitialised) {

    /* Add built-in extensions to the list. */

    for (i = 0; staticExtensions[i].name; i++)

    LoadExtension(&staticExtensions[i], TRUE);

    /* Sort the extensions according the init dependencies. */

    LoaderSortExtensions();

    listInitialised = TRUE;

    }

    for (i = 0; ExtensionModuleList[i].name != NULL; i++) {

    ext = &ExtensionModuleList[i];

    if (ext->initFunc != NULL &&

    (ext->disablePtr == NULL ||

    (ext->disablePtr != NULL && !*ext->disablePtr))) {

    (ext->initFunc)();

    }

    }

    }

    ```

    是不是有点“多态”、“封装”的感觉?

    这种实现方式实际上是通过定义一个声明式的链表,然后通过将这个链表作为数据结构,然后建立算法。

    (3) 一些结论

    ==============

    -- 这次重构将指令序列改成了声明式链表及相关函数

    -- 这次重构之后代码更长了,但可读性提高了,而且函数中的“过程”被转化为了“数据结构”

    我认为这个重构非常切合 xserver 这样子的软件,极大地提高了其可维护性。

    堪称一次史诗级的重构!

    08月29日