Demon.Lee 2023-04-29 10:35

DDD 中有一个概念:防腐层(Anti-Corruption Layer)

防腐层是最具防御性的一种关系,简言之,就是指我们要在外部模型和内部模型之间建立起一个翻译层,将外部模型转化为内部模型。

但凡有可能,就要建立防腐层,将外部模型完全隔离开。

Demon.Lee 2023-04-21 09:37

手欠,在个人笔记本上执行了 rm -rf ~ o(╥﹏╥)o

Demon.Lee 2023-04-20 11:07

用打电话和电话留言来解释命令式编程和声明式编程,很形象,有点意思。

摘自范学雷老师《深入剖析 Java 新特性》:

传统的指令式编程模型,就像我们通常打电话一样。我们拨打对方的电话号码,然后等待接听,然后通话,然后挂断。当我们挂断电话的时候,打电话这一个过程也就结束了,我们也拿到了想要的结果。

而非阻塞的异步编程,更像是电话留言。我们拨打对方的电话,告诉对方方便的时候,回拨电话,然后就挂断了。当我们挂断电话的时候,打电话这一个过程当然也是结束了,但是我们没有拿到想要的结果。想要的结果,还要依靠回拨电话,才能够得到。

而类似于回拨电话的逻辑,正是非阻塞的异步编程的关键模型。映射到代码上,就是使用回调函数或者方法。

当我们试图使用回调函数时,我们编写代码的思想和模型都会产生巨大的变化。我们关注的重点,就会从指令式编程模型的“控制状态”转变到“控制目标”。这时候,我们编程模型也就转变到了声明式的编程模型。

如果指令式编程模型的逻辑是告诉计算机“该怎么做”,那么声明式的编程模型的逻辑就是告诉计算机“要做什么”。指令式编程模型的代码像是流水线作业的工程师,事无巨细,拧好每一个螺丝;而声明式的编程模型的代码,更像是稳坐在军帐中的军师,布置任务,运筹帷幄。

Demon.Lee 2023-04-14 10:00

Lens - Kubernetes IDE 感觉不错,刚刚使用上,有点后悔没早发现。

为啥之前没想过会有 Kubernetes Client 这种东西呢?思维局限了。

Demon.Lee 2023-04-11 22:50

docker push 到 Docker Hub 一直失败时,可能不是你脚本写错了,而是你没充钱 🐶🐶🐶

  • buildx failed with: ERROR: failed to solve: failed to push xxxx/xxx:xxx: server message: insufficient_scope: authorization failed
  • denied: requested access to the resource is denied
Demon.Lee 2023-04-10 14:53

异常处理:代码的可维护性 vs 性能

对于编程语言中的异常处理机制,范老师在课程中说:

C 语言时代的错误码,和 Java 语言时代的异常处理机制,就像是跷跷板的两端,一端是性能,一端是可维护性。在 Java 诞生的时候,有一个假设,就是计算能力会快速演进,所以性能的分量会有所下降,而可维护性的分量会放得很重。然而,如果演进到按照计算能力计费的时代,我们可能需要重新考量这两个指标各自所占的比重了。这时候,一部分代码可能就需要把性能的分量放得更重一些了。

对于这道题,Java 选择前者,C/Go 选择后者(当然,Go 做了优化,通过设计多值返回,解决了 C 中返回值一值多用的弊端)。我个人也觉得,对于大多数业务系统,以及 90% 的普通程序员(CRUD BOY)来说,可维护性的价值更高。

Demon.Lee 2023-04-05 00:27

代码好看有啥用,在我们编译器和 CPU 眼里没有漂亮的代码,只有能跑的 0 和 1……😂😂😂

读这类书最大的好处,就是让你跳出来,从千头万绪意大利面式的代码中跳出来,以一个旁观者的角度来理解其设计思路,透视其底层逻辑。书中好多例子都是这样,掰开了给你看,比如进程,线程,日志,Spring,版本管理,消息队列,泛型,动态代理等。然后,你发出了 aha 的笑声,说:我好像懂了。

好像懂了,其实并没有懂,如何可以,像作者一样,用自己的话再把它们写下来,并结合程序示例演示。此时,你可能真懂了。

这本书买来时,快速看了最后两章,然后第一章翻阅了一点,再然后一年过去了……

最近重新打开,把前面几章快速翻完了,特定去查了一下,在某东上的下单时间是 2022 年 1 月 6 日,时间啊……

听说有第二季,期待。

Demon.Lee 2023-04-04 08:31

jwu: 1)不用恐惧 ChatGPT,它只会取代懒人,不要勉强去找机会,好好工作,但不要天天干重复性工作。2)我一般不看自媒体,有些矿里黄金很少,不需挖。短视频也一样,不要碰。很多人想走捷径,要做 2% 的人,提高自己。3)年轻,好学是最大的资本。唐朝人哪来的?鲜卑人,到元明朝,活力均来自外部。4)……

我突然想起,施展老师说过,李世民只有 1/4 的汉人血统,我们都要从外部注入能量。

直播速记链接:https://www.dedao.cn/knowledge/note/detail?id=ZPy0b7x3684G7Q0LDEZ76n4RgNJwVo

Demon.Lee 2023-04-03 23:12

这本漫画很好看,电子版看完之后,我决定再买本纸质版放在书架上睡觉。

上周五同事推荐一本书,我没怎么想,三下五除二就把它买下了。同事见我为啥可以这么决断,不会舍不得钱吗?

在我目前的认知里,我觉得书是这世界上性价比最高的一类东西,所以不用太花心思去较劲。一本书一般都是作者数年,数十年,甚至一生的思考与总结,而将其编辑,整理,再出版又得花去一年甚至更长的时间。所以,花几十块(偶尔几百块)买人家这么多年的经验或思考,难道不是最划算的买卖吗?

在《查令街84号》的尾部推荐语中,有这样一段话,分享给大家:

从事出版已超过半辈子之久,我个人仍始终有个问题得不到满意的答案:我始终不真正明白人们为什么不买书?这不是全世界最便宜的一样东西吗?一个人类所曾拥有过最聪明最认真最富想象力最伟大的心灵,你不是极可能只用买一件看不上眼衣服的三千台币就可买下他奇迹一生所有吗(以一名作家,一生十本书,一本书三百元计,更何况这么买通常有折扣)?你不是用吃一顿平价午餐的支付,就可得到一个美好的洞窟,以及一个由此连通的完整世界吗?

Demon.Lee 2023-04-03 15:33

Gradle 8.0 一直编译报错:

Could not resolve all dependencies for configuration ‘:testCompileClasspath’
Using insecure protocols with repositories, without explicit opt-in, is unsupported. Switch Maven repository ‘maven(http://maven.aliyun.com/nexus/content/groups/public/)’ to redirect to a secure protocol (like HTTPS) or allow insecure protocols.

修改项目的 build.gradle 文件后,发现还是不行。后来发现是机器上默认的配置文件有问题:~/.gradle/init.gradle 。

改造之前:

allprojects{
    repositories {
        def ALIYUN_REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public'
        def ALIYUN_JCENTER_URL = 'http://maven.aliyun.com/nexus/content/repositories/jcenter'
        all { ArtifactRepository repo ->
            if(repo instanceof MavenArtifactRepository){
                def url = repo.url.toString()
                if (url.startsWith('https://repo1.maven.org/maven2')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_REPOSITORY_URL."
                    remove repo
                }
                if (url.startsWith('https://jcenter.bintray.com/')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_JCENTER_URL."
                    remove repo
                }
            }
        }
        maven {
            url ALIYUN_REPOSITORY_URL
            url ALIYUN_JCENTER_URL
        }
    }
}

优化成可以访问 http:

allprojects{
    repositories {
        def ALIYUN_REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public'
        def ALIYUN_JCENTER_URL = 'http://maven.aliyun.com/nexus/content/repositories/jcenter'
        all { ArtifactRepository repo ->
            if(repo instanceof MavenArtifactRepository){
                def url = repo.url.toString()
                if (url.startsWith('https://repo1.maven.org/maven2')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_REPOSITORY_URL."
                    remove repo
                }
                if (url.startsWith('https://jcenter.bintray.com/')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_JCENTER_URL."
                    remove repo
                }
            }
        }
        maven {
            allowInsecureProtocol = true
            url ALIYUN_REPOSITORY_URL
        }
        maven {
            allowInsecureProtocol = true
            url ALIYUN_JCENTER_URL
        }
    }
}

最终版,参考官方文档,直接使用 https:

allprojects {
  repositories {
    maven {
      url 'https://maven.aliyun.com/repository/public/'
    }
    mavenLocal()
    mavenCentral()
  }
}