管信课上的汇报

2024-01-19
2025-05-20
进度 50%
碎碎念

把关于和兴趣贴边的课程的报告单独拎出来。

整个学期的前情提要

小组

因为之前已经把舍友们“卖”过一次了,我当时就跟他们说,管信小组我带你们。

jn 在统计学的群里发了个,“要不然管信也是这个小组?”。

但是没几秒撤回了。

很抱歉,这个真就没法带飞了,因为原来来这个组就有点“被刺”他们。

小组就是我来干活,然后挂名字。

DDDLibrary

这个得从第一次上课开始说。 当时老师说想看有人开发系统来展示,因为之前没人这么干过。

我最开始是想用 DDD (领域驱动设计)大法。 因为比较摩登,再加上可以适用于更加复杂的情况。

而且我对于经常用于实现这个设计范式的整洁架构也充满着好感(来源于未知的那种)。 所以在我搞明白之前,我一直都保持着兴趣。

从各种网站上整点实战项目,再买了本书,就叫做《领域驱动设计》。

就准备开干。

从 22 年开始,我在很多框架下,尝试了很多语言来写网络项目。 原因是 22 年的年初被一个小圈子驱逐出来了。 所以想要建一个自己的网站,不搞独裁的那种。

从设计到实现都是自己完成,加上很多为小圈子考虑的细节巴拉巴拉。

就像〇〇圈之前的那个〇〇〇〇(现在已经寄了)一样。

其实这件事儿说远了也可以写篇博文出来,但是这篇就是从前两天写的第一学期的经历出来的。 再开坑挺累的。

扯远了。

最开始,我准备用 Phoenix 写个图书馆管理系统,叫做 DDDLibrary 。 有管理,也可以学新语言新技术,等展示的时候美美装一波波一。

之后,打开电脑,在前两天新建的一个叫做 elixir_playgournd 文件夹里,打开传说黑框框(终端):

mix phx.new --module DDDLibrary

用 phoenix 的命令一把梭整出来,搭个脚手架。

对了,还有数据库。

又打开 PostgreSQL ,新建了个叫做 ddd_library 数据库。

接下来就是安装编译依赖,下载需要运行的内容巴拉巴拉。

欸? TailwindCSS 下不了吗?算了,直接从别的地儿丢过来。

最后随着输入 mix phx.server 命令后打开浏览器终于看到的那句 Peace of mind from prototype to production 的欢迎页面,对于不到五分钟攒出来的这个原型,我真的安心了。

Phoenix 框架的欢迎页面

领域驱动设计在函数式编程语言的实作

按照之前不知道在那里看到的关于领域驱动设计的文章,好像是关于战略设计(Strategic Design)的部分。

但这个好像用在 Java 、 Python 之类的传统 OOP (面对对象编程语言)更多一些。

对于 Elixir 这个函数式编程语言,并没有什么深入研究的专项资料。

(可能有一些英文资料,但我没往深里找)

好像有,油管上有一些关于 Phoenix 对业务逻辑的领域来进行代码分块的几个报告。

遇事不决问 GPT 。

【TODO: 问问 GPT

【TODO: 需要用到 OTP 的分层监控吗?

defmodule Status do

【TODO: 好耶我竟然用上 Meta-programming 写模块了!

Code
defmodule Status do
  @moduledoc """
  提供通用的状态。
      defmodule UseStatus
        use Status, [:a, :b, c: :default]
      end
  除了拥有默认值为 `c` 的 Map ,`Status` 还拥有:
  * `operate_when_not_match/1`
  * `get_valid_values/0`
  * `get_default_value/0`
  * `value/1`
  * `valid?/1`
  * `under/2`
  * `create/1`
  """

  @spec __using__(list()) :: {:__block__, [], [{any(), any(), any()}, ...]}
  @doc false
  defmacro __using__(opts) do
    parse_opts = fn opts ->
      status_without_default = fn option_list ->
        Enum.map(option_list, fn item -> is_atom(item) and item end)
        |> List.delete(false)
      end

      default_field = fn option_list ->
        Enum.map(option_list, fn item ->
          is_tuple(item) and Tuple.to_list(item)
            |> List.delete(:default)
            |> List.flatten()
        end)
        |> Enum.reject(&is_boolean(&1))
        |> List.flatten()
        |> hd
      end

      init_fields = status_without_default.(opts)
      def_value = default_field.(opts)

      if def_value in init_fields do
        [fields: init_fields, default: def_value]
      else
        [fields: [init_fields | [def_value]] |> List.flatten(), default: def_value]
      end
    end

    quote bind_quoted: [opts: parse_opts.(opts)] do
      @type value :: atom()
      @type t :: %__MODULE__{value: value()}
      defstruct [:value]

      def operate_when_not_match(status), do: status

      def get_valid_values(), do: unquote(opts[:fields])

      def get_default_value(), do: unquote(opts[:default])

      def value(%__MODULE__{value: value}), do: value

      def valid?(status), do: value(status) in get_valid_values()

      def under(status, state) when is_atom(state) do
        if state in get_valid_values() do
          value(status) == state
        else
          false
        end
      end

      def under(status, state) when is_list(state) do
        value(status) in state
      end

      def under(_status, _state), do: nil

      def create(), do: %__MODULE__{value: get_default_value()}
    end
  end
end

真不行真不行真不行

【TODO: 你之前是学啥的?我教的公管的同学里只有你一个会写代码的

【TODO: 写不动啊,还是用顺手的 Python 吧

Chestnut -> CatCove

这是一个去年写的项目,当时受 AI 绘图影响,自己也想写一个 WebUI 出来,原来叫 PicoUI ,后来改成了 TinyUI ,最后改了个「栗子」的名字。

当时想写一个像 Flask 一样简单易懂可以带小白的文档,但是看着… 不咋地只能说。

项目在这儿(如果您在中国大陆不使用特殊信道访问该链接的话,可能会失败):

GES233/Chestnut - Scaffold for building demostration and presentation.

截至去年夏天,还有一点点修修改改。

那就直接拿来用吧。

最先的一步是改个名字,就叫做 CatCove (猫湾)。

因为之前就有想要做一个叫做 CatCove 的论坛类网站的想法。

但当时基本上不会编程,对网络开发也一无所知。

所以写废了无数的库。

在此之前最接近写完的是我在 22 年夏天写的一个,但是因为架构有问题,屎山越堆越大,写了四千来行,只完成了注册登录登出几个功能,写不动了。

这个仓库也就是我的一个 Private Repo 罢了。

回到这个魔改版本。

第一步,当然是去掉那些和管理系统无关的库,像是 arrow lib 之类的。

【TODO: 去他妈的 Javascipt ,纯模板渲染吧

【TODO: 连通流程

【TODO: 不要命令式了,怪麻烦的

【TODO: 要的就是主打快速出活,管它整洁不整洁

【TODO: 成功注册!

【TODO: 鉴权是什么?能吃吗?

【TODO: 毁灭吧,操

别现写了,太难了

【TODO: 直接展示 discord 行吗?我不会 RoR 啊!

【TODO: 要不要我把 22 年写的那玩意儿拿出来?

【TODO: uvicorn 怎么在 Windows 上运行来着?

【TODO: 可咋整啊

瞎掰扯

接龙小说、完颜慧德与「长江黄河不会倒流」

看到那个应该是周五上午来上课的时候。

看到了很多同学在教学区门口驻足。

钻进去一看,原来是两三张纸。

不同的笔体写了不同的句子与文段。

整体效果就挺乐的,看着。

集体创作
Overview
  • Header
  • P1
  • P2
  • P3
  • P4

(话说怎么实现翻页啊,这么多堆一块儿确实有点影响观感了)

当时那几天正好赶上前国务院总理离世,因为一系列的事情以及信号让人浮想联翩。 那句他曾经说过的改革开放如「长江黄河不会倒流」的句子,也成为了一种暗号。

就像白色康乃馨、茉莉花、民主女神、A4纸一样的对什么的什么什么。

关于这个我不想做什么评价,私以为,我的政治观念还太过稚嫩,不对这句话做表达。 虽然说作为公共事业管理专业的学生,我们与之深入交流甚至是入身其中的对象就是什么,所以就算知道是啥意思也要假装不知道。 但是这种暗号总有人能对上,对上了就建立了共识,从公共部门的角度来讲,这种不可控的自组织性就挺可怕的,虽然影响的范围确实很有限,带的节奏就像 49 中的事儿一样,没几天就消停了(当然,也有可能是别的因素的介入)。

为什么要说这么一嘴,突然从小说接龙聊到政治,有点生硬。

因为我听 ysy (同班同学)说,最开始那个接龙小说里就有人写上这句话影射那位大人,然后那张纸直接消失了(所以说 22 年底闹的那白纸的意象真的是沾点,本土化没做好是这样的,连白纸也不会给你留下来)。

不过叠个盾,我对这类事儿没兴趣,也不想参和。 那些闹事的没一个有好下场。

现在有的这个好像是新的一张。

回到这个汇报的主题,就是……

如果有人搞事有人乳了,怎么办?

我算不上是一个完完全全的自由主义者,再加上这是当众的汇报,所以一定要符合主流价值观,一定程度上的 content censorship 还是有必要的。

但是这个度又是一个问题了。

肯定不能搞一个类似于阿瓦隆的系统或是先审后发,要不然一点意思也没有。

但是肯定也不能完全放开,毕竟一个随时会下线的网站,聊点啥就很容易没有丝毫顾忌。

那就整个 Moderator 吧,人工事后审核。 反正整个网站肯定不如微博的那种体量,写的人少,那些东西夹的也快。

不过我也加了那个小说的接龙群,基本上死群一个。

我想问个问题,不出意外,没人鸟我。

边写边理

那就先不考虑这个了。

一个轻量化的网站,不需要手机号码验证、不需要用 WebSocket 或长轮询或 Event-Stream 来实现消息推送、甚至不需要考虑邮件。

所以写起来还好,就是… 比较轻量化一些。

大概就三类:用户、内容、内容组织。

大致的确定了一些问题画了 E-R 图就开始准备写了,周五还是周六,我忘记了。

不想整啥演讲稿汇报逐字稿啥的,就拿个 ppt 上去一同瞎说就行。

也就不用舍友再帮忙了,就看看我讲的顺不顺就成。

形式就选择最简单的,之前毕设的那个模板, Beamer + Metropolis + Minted 。

语言是 LaTeX ,幻灯片选用 Beamer ,模板是 Metropolis ,意思是大都市。 minted 用来渲染代码。 配色和毕设的汇报是同款,不同的是没有背景图了。 (其实也改了几组,但还是原来的最好)

编辑器,简简单单,Visual Studio Code 。

【TODO: 树形结构、树形结构、还是树形结构

【TODO: 怎么和管理挂上钩?

【TODO: 用 Phoenix 还是 Plug ?

【TODO: 算了,纯讲吧就

【TODO: 排序算法用啥?

【TODO: 威尔逊区间吗?算了,还是牛顿冷却吧。

汇报

已经要开始了,得在周一周三两天的课讲完。

很幸运,我不在前面,这意味着我有更多的机会去打磨。

首先是排序的问题。

我肯定不能在前面,要不然容易显得太张扬。

如果按照拼音排序的话,那么我就是前面,果断 pass 。

后来选了个姓的笔划,可以,我在最后。

原来你也写代码?

在正儿八经报告前,还出了个小插曲。

在我确定我不是第一天讲的那波后,我就准备结合他们讲的来修改我的 slide 。

我突然看我微信有消息,一看,发现有人加我。

就是之前上机在一块儿那小姑娘(关于此君的故事,可以参见第一次接触)。

“哇是code!”

“别担心我近视看不见”

加吧,本来之前也挺想加的,因为那小姑娘真挺好玩的。 但是我没理由啊,无事干什么,非什么即什么。

但当时我没想那么多,我也妹(mei4)写程序啊,就是整个文档而已。

我转过头一看,她就坐我正后面。

【TODO: 给你看

【TODO: 其实完全可以让 cq 上去,那么可爱还社牛(原话我忘了)

【TODO: 哎呀高数我早就还回去了,连解微分方程都是跟 AI 学的

【TODO: 补值是啥?股票能预测吗?不都被噶韭菜了嘛?

【TODO: 她参加竞赛我可不能帮她做了,而且我也不会

再后面的事情,就是周三了。

【TODO: 怎么有点发烧,是不是阳了,还只是应激罢了

【TODO: 你先上吧,我有点不舒服

【TODO: 想必大家都看不懂吧

【TODO: 如果我在前面的话,我本来打算讲这个的

【TODO: 讲快点!

【TODO: 怎么都在拉票啊这

【TODO: 咱互投吧

——无限期停止撰写——