您访问的是非正式的站点,不是最新内容哦,请点击这里前往Dnocm ヾ(=゚・゚=)ノ喵♪

若白驹过隙,忽然而已

新网址!

netlify免费版的网络真的太差了(跟1年多前刚使用的时候比,差太多),所以原本打算迁移到github pages

看对比,github pages整体比netlify稳定的多,但github不支持重定向。而腾讯云的解析服务,重定向需要备案,所以dnocm只好保持不动,选择新增了一个部署

同时也尝试了coding,但在国外的ping不理想,所以干脆一次性部署了多个

假如,你在访问当前地址时,感觉卡,可以试试前往我的其他域名下

造了套自己的 Promise

Promise 很火,没看源码,仅参考平时的使用,造了一个小轮子(有时间再去看源码把)

class PromiseT {
  constructor() {
    this.status = 'running';
    this.val = null;
    this.pendingList = [];
  }
  then(...list) {
    this.pendingList.push(...list);
    return this.run();
  }
  resolve(val) {
    this.status = 'running';
    if (val !== undefined) {
      this.val = val;
    }
    return this.run();
  }
  pending() {
    this.status = 'pending';
  }
  run() {
    if (this.status === 'pending') {
      return this;
    }
    const cal = this.pendingList.shift();
    if (cal === undefined) {
      return this;
    }
    const result = cal(this.val, this);
    if (result === undefined) {
      return this.run();
    }
    if (result.constructor === PromiseT) {
      return result.then(...this.pendingList);
    }
    this.val = result;
    return this.run();
  }
}

测试:

new PromiseT()
  .resolve(5)
  .then(x => x + 1)
  .then(x => new PromiseT().resolve(2).then(a => x / a))
  .then(x => console.log(x))
  .then((x, p) => {
    p.pending();
    setTimeout(() => {
      p.resolve(x - 3);
    }, 2000);
  })
  .then(x => console.log(x));

// 输出 3
// 等待 2s
// 输出 0

毕竟是小轮子,catch() finally() 这些没写。。。

发布 npm 包到 GitHub Packages

GitHub Packages在半年前尝试过,那时候存在些问题

  1. 不能使用yarn安装(这个已经修复了)
  2. 必须认证授权才能使用,即便你的包是开源的,很不方便

但不管怎样,GitHub Packages始终是个不错的备选方案

JUnit 5 教程

JUnit 5 作为新一代的 Java 单元测试框架,提供很多改进。例如对比 JUnit4JUnit5 的官网,JUnit5 的设计更加简约与时尚,至少不会抗拒阅读的程度了(像破烂一样的网站,看了整个人都难受,不影响效率?不存在的)

而且,除此外,他的文档使用了 Asciidoc, 相对于markdown复杂,主要是它还支持具有包含另一个文件内容,这对于写API文档来说挺重要的,有兴趣可以了解下~

Okay, 结束吐槽,让我来看看 JUnit5 到底带来了哪些变化吧

Intersection Observer 简介

Intersection Observer API提供了一种异步观察目标元素与祖先元素或顶级文档viewport的交集中的变化的方法。这使得以往较难实现的功能,更加简单,例如,监听图片元素,在适当的时候懒加载图片。

探究:优惠券的设计

最近几天,和朋友讨论了许多优惠券相关的问题,他以产品的角度,探究优惠券的意义场景等。他阐释,优惠券的本质是价格歧视,通过对不同消费者提供不同的收费标准,以此来增加营收。

当然,从我的角度出发(程序猿),我并不关心优惠券的目的,而更感兴趣于架构的设计,毕竟这块很有挑战性。比如满减或者折扣等涉及支付系统,用户领取使用又涉及用户系统等等(这里假设在微服务架构下)通常优惠券会影响多个系统,除此外,优惠规则与限制条件又十分复杂。但越难才越有意思。

我初步将优惠券系统分为以下四个部分:

  • 优惠券主体,简单说定义名称或者一些说明之类
  • 优惠策略,定义处理优惠的方式
  • 限制规则,在这部分中定义什么条件下可使用或者“过期”
  • 发放策略,定义何时如何发放,一般情况下与用户和活动系统相关

为了实现一个我理想中的优惠券系统

  • 支持多张券同时使用
  • 支持各种限制,甚至自定义限制
  • 尽可能的降低各个系统与优惠券系统的耦合性

npm 免密 publish

做个笔记,毕竟多台电脑,需要配置

  1. 创建token

  1. 添加.npmrc文件至用户目录下
    //npm.pkg.github.com/:_authToken=*****************
    //registry.npmjs.org/:_authToken=*****************
    

一个简单的retrofit工具类

使用

// 同步返回Optional<T>
var repos = RetrofitUtils.execute(service.listRepos("octocat")).orElse(new ArrayList<>());
// 异步
RetrofitUtils.execute(service.listRepos("octocat"), repos -> {
  //业务逻辑
});