The codes for languages and countries seem a bit random because some of them are derived from local languages. German in German is Deutsch, Chinese in Chinese is zhongwen: hence de and zh.          — Core JAVA

给 Mac 添加自定义服务

给 Mac 添加自定义服务,如添加个快捷键进入屏保到方式。

用 Automator 来创建服务并保存后(实际是保存到[ccei]~/Library/Services/[/ccei]下,这样即可在「服务」中出现自定义到服务(如「偏好设置」/「快捷键」/「服务」/「通用」)。

斟酌字句

优秀的文人会仔细地斟酌字句,认真推敲,期望用语准确并符合语境和用意。

现在的软件/应用中,使用人群很大,对应场景各种各样,有的时候会暴露出没考虑到的场景,给人一种不喜的感受。比如 Facebook、twitter 的『like』以及微博的『赞』,在悲伤的事件中就显得格格不入甚至冒犯了。

在吃这件事上,不只是中国人特有的的,更不是广东人特有的,而是人类共通的,为了果腹,为了解决威胁,人类会吃。

浏览器端 async/await 还是有点代价的

对于下面这段 js

function async3() {
  createPromise()
    .then((res) => {
        console.log(res);
    })
    .catch((err) => {
        console.log(err);
    })
    .finally(() => {
        console.log('finally');
    });
}

其对应 async/await 版本是

async function async2() {
    try {
      const ret = await createPromise();
      console.log(ret);
    } catch (e) {
      console.error(e);
    } finally {
      console.log('finally');
    }
}

经 babel 转为 ES5 后,除了必要的 babel-polypill,会生成以下代码,其中 _asyncToGenerator 不会多次生成。

var async2 = function () {
  var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
    var ret;
    return regeneratorRuntime.wrap(function _callee$(_context) {
      while (1) {
        switch (_context.prev = _context.next) {
          case 0:
            _context.prev = 0;
            _context.next = 3;
            return createPromise();

          case 3:
            ret = _context.sent;

            console.log(ret);
            _context.next = 10;
            break;

          case 7:
            _context.prev = 7;
            _context.t0 = _context['catch'](0);

            console.error(_context.t0);

          case 10:
            _context.prev = 10;

            console.log('finally');
            return _context.finish(10);

          case 13:
          case 'end':
            return _context.stop();
        }
      }
    }, _callee, this, [[0, 7, 10, 13]]);
  }));

  return function async2() {
    return _ref.apply(this, arguments);
  };
}();

function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }

写法上直观了的,但在浏览器端,还是有些代价,生成的代码会多出不少。

不喜欢 fixed 的 header

我不是很喜欢 fixed 的涉及,比如 header 这类,因为容易占据了宝贵的垂直空间,特别是笔记本的小屏幕场景。

如果同时使用了 fixed header 和 footer,那就更讨厌了。

机会留给有准备的人

到超市选好了商品准备购买,但售货员扫了下条形码发现没价格信息,拿着商品回到货柜去找,结果都没有这款商品的价格信息。回仓库重新去找,依然没找到。最后猜测了下「大概是xx元」。

由于这个不确定的价格,放弃了购买该商品,出到超市外,打开手机网上购买了。

自动化

工业自动化很久了,从以前的流水线批量生产到基本人力只用来做辅助调整工作,大量的人力被解放了出来,但同时也意味着大量的工作岗位走进了历史。

现在,信息社会进一步,不仅在工业领域,在民生领域,像银行、售票乃至餐馆等都逐步用机器取代了人工,一方面机器的效率会比人力更高也更稳定准确。

在银行,大部分日常工作已被 ATM 或别的机种以及线上服务来覆盖,柜员感觉更多的是大额度或别的业务。

在火车站等售票点,由于线上购票的普及,线下售票窗已大量地关闭,连售票站也引导到官方或微信等线上售票渠道。这样,售票窗的岗位也被解放了。

餐馆,线上订餐,线下取餐的形式也开始慢慢展开,结合排号的形式,甚至可能负责发放餐的职位也被取代了一部分。相关的职位也会被释放一部分出来。

可重复的可被预测的工作都在继续地被机器取代,人只能往更有创造力的岗位上去发展。没有一点知识,依然拼出半边天的励志传说,将越来越少。

当然,信息时代的一个强依赖是:电。

fetch

实现中的 fetch 是希望能比 XMLHttpRequest 更好地做网络请求。

fetch('/')
    .then(res => { 
       if(res.ok) {
         return res.text();
       } else {
         throw new TypeError(res.statusText);
       }
    })
    .then(text => console.log(text.length))
    .catch(err => console.error(err.message));

Reference

注意点:

  1. fetch 仅在网络因素下 reject,业务的错误,如 502 或 404 等会 resolve,需要判断 response 是否 ok
  2. 默认不携带 cookie,需要明确指定
  3. 跨域时会受 CSP 控制影响,需要配置