{ uncategorized }

  • 更新 macOS Mojave 后 vim 打不开

    | /
    1
    2
    3
    4
    5
    Vim: Caught deadly signal SEGV
    Error detected while processing function youcompleteme#Enable[5]..<SNR>31_SetUpPython:Vim: Finished.

    line 39:
    Exception MemoryError: MemoryError() in <module 'threading' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.pyc'> ignored

    使用vim时报错,从报错信息中可以看出是youcompleteme相关的东西有问题,其实就是Valloric/YouCompleteMe这个插件有问题。
    幸运的是这个问题也有人遇到,并且有人给出了各自的解决方案。

  • 前端路由与菜单

    | /

    目前绝大部分单页应用都由前端控制路由,如react可以使用react-routervue可以使用vue-router。路由库的使用已经有非常多的文章来介绍,所以本文的重点在于「基于路由配置自动生成导航菜单」,所用技术栈为react + react-router-dom + antd

    为什么是菜单呢?
    它绝大部分内容和路由是相同的,但又有部分不同,如果维护两份带来的是巨大的维护成本,只需要修改一处即可同步路由与菜单的变化。

    本文目标读者为了解基本的react-router使用,想要在项目中通过路由配置自动生成导航菜单,并正确处理菜单的高亮。

  • 前端如何缓存请求

    | /

    缓存一直以来作为性能优化的一环被广泛使用,

    • 数据库缓存
    • 代理服务器缓存
    • CDN 缓存
    • 浏览器缓存

    等等,几乎在每一层,都有缓存存在。本篇博客讨论的不是上面这些缓存,而是由我们自己控制的缓存,具体来说是「请求」的缓存,如何优化请求的缓存让我们的应用更好。

  • 前端怎么做好权限控制

    | /

    现如今我们访问的每个网站,或多或少都会存在「权限控制」。

    以一个博客系统为例,系统内共有三种角色

    • 1、游客
    • 2、会员
    • 3、管理员

    不同角色支持不同的操作,比如

    • 1、游客可以访问博客列表页、博客详情页
    • 2、会员除游客权限外,还可以提交博客、提交评论、对博客进行编辑、删除操作等。
    • 3、管理员除上述权限外,还可访问用户管理页对用户进行管理。

    上述说明「什么用户能够进行什么操作,不能进行什么操作」,可以理解为就是「权限」,根据这些权限,做出正确的处理,就是「权限控制」,而「角色」,是「权限」的集合,也方便我们对用户的定义。

  • 一次「错误」的 Promise 实现 - 2

    | /

    时隔快两月,才产出了第二篇。在实际写博客中,发现Promise实在太难了,初稿在 2/18 就开始写,写到「链式调用」,发现自己还是对原理不够了解,于是耽搁了许久。期间又看了《你不知道的 JavaScript(中卷)》关于异步的部分,深觉自己的浅薄。

    我们总是说回调不好用,因为回调地狱,但是回调也可以不写成回调地狱,只是写法问题,如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    foo(function () {
    foo(function () {
    foo(function () {
    console.log('callback hell');
    });
    });
    });

    // 可以写成这样
    function handler1() {
    foo(handler2);
    }

    function handler2() {
    foo(handler3);
    }
    function handler3() {
    console.log('callback hell?');
    }

    foo(handler1);

    而且本质上来说,Promise也是回调啊,Promise究竟在内部做了什么事情,让我们非常乐意接受了呢?

  • 一次「错误」的 Promise 实现 - 1

    | /

    Promise在日常中经常用到,并且也能够熟练使用:

    1
    2
    3
    4
    5
    6
    7
    new Promise((resolve) => {
    console.log('a')
    resolve('b')
    console.log('c')
    }).then((data) => {
    console.log(data)
    });

    上面代码会依次打印a、c、b,对此我们都毫无疑义。

    但是为什么呢?我们能自己实现一个Promise库吗?

  • 写给 JSer 的 python 学习手册 - 数据类型篇

    | /

    基础语法之后,就需要了解数据类型了,大部分语言的数据类型都是相似的,字符串、数字、布尔值、数组对象等等,虽然不同语言可能本质上的实现不同,但在编程时的写法是相似的,只有在本质上有什么不同,就可以作为深入学习去了解了。

    JavaScript中有七种数据类型

    • String
    • Number
    • Boolean
    • null
    • undefined
    • Symbol
    • Object

    Python3中有六个标准的数据类型

    • String
    • Number
    • List
    • Tuple
    • Sets
    • Dictionary

    下面进行一一对比。

  • 写给 JSer 的 python 学习手册 - 基础语法篇

    | /

    作为一个标榜“程序员”而非“前端开发”的前端开发,不应该只会一门JavaScript,但学习新语言累觉不爱。

    能否将JavaScript的经验借鉴到其他语言的学习上呢?毕竟它们都是“编程语言”,提取共同点,突出差异点,将新语言学习的成本降到最低。

    总体来说,编程语言有几大核心

    • 语法
    • 数据类型
    • 内置库
    • 第三方库
    • 工程相关(包/依赖、测试、构建)

    当然有些语言有更多内容,而有些只有部分,这就要在学习的过程中不断补充完善。

    所以,这系列博客,将从这几个核心依次介绍,最终实现能够阅读python实际项目代码。