• Coc.nvim

    今天看了一下 coc.nvim 的配置和使用,挺不错的 VIM 插件,记录一下.

    我之前也使用到了这个插件,主要是用来做补全的。今天想使用 git blame 功能的时候,又看到了它。想搞搞明白,COC 到底是个什么东西.

    什么是 COC

    COC 就是一个 VIM 的插件啦。但它是一个管理插件的插件.

    和 Plug 不同的是,它只能管理 COC 系列的插件。严格来说,应该算是 COC 的插件吧,应该不能算是 VIM 插件, 我的感觉是这样。因为只能用 COC 来安装,而且是安装在 COC 自己的目录下面的.

    COC 系列的插件有不少,除了自动补全外,还有比如 coc-go ,coc-python,coc-git 啥的,可能可以取代 vimgo ,python-mode,vim-fugitive 等插件。作者也说了,用不用 COC 系列插件,还是要看你的需求是什么,看 COC 的插件是不是能满足你的需求,如果不行的话,还可以给作者提需求~~ 反正我是全部使用 COC 插件了,替换掉了 vim-go python-mode 等。使用 coc 插件好处多多,下面有提到。

    2021-09-05 补充:

    我现在 Python 和 Go 已经都使用 COC 支持下的能力了。不再使用 python-mode,vim-go 这两个插件。不过觉得好怀念,感谢他们。

    为什么要换成 COC 的支持呢?对我来说有两点,一个是快捷键的统一,比如说 rename,go to definition,go to implementation 等。另外一个是 LSP 的功能的确更强大一些吧。 这两者配合起来,在 VIM 里面的编程更方便了。

  • [译] Why Should We Separate A and AAAA DNS Queries

    看了朋友一篇文章https://leeweir.github.io/posts/wget-curl-does-not-resolve-domain-properly/, 直接拉到最后的根因, 看到里面写:

    curl 不指定协议访问的时候,为什么直接从(DNS)缓存里返回了结果而不做dns解析,还是要具体从libcurl的实现上去分析

    我的第一反应是不太可能, curl 的请求不会因为指定使用 ipv4 就做 DNS 解析, ipv6 不做. libcurl 不可能这么实现.

    然后去翻了 libcurl 的代码, 他是使用另外一个叫 ARES 的库去做的 DNS 解析. 在 ARES 中看到有解析 ipv6 的时候, 使用了多线程(细节有些记不清了). 然后搜索文章, 就看到了下面这篇文章: 为什么我们要分开请求 A 和 AAAA DNS记录?

  • 多线程一起读stdin

    一个进程里面开两个线程读取 stdin , 会是哪一个能读到呢? 来测下看.

  • 协程的原理和上层调用机制

  • 二分查找拐点的一个问题

    题目: 一个先升序再降序的数组, 二分查找拐点位置

    方法2跑了更多的分支, 但是时间却比较短. 为什么呢?

  • Kotlin Lombok Data

    刚刚发现一个 Kotlin 文件不能访问 lombok.Data 里面的private属性, 而另外一个可以.

    之前遇到过类似的问题, 所以原因我也一下就想到了~ :) 但是到网上搜索了一下解决方法, 却发现解决不了哈哈. 记录一下.

    之前遇到的问题好像是这样的, 一个 Java 方法没办法访问 Kotlin Data Class 里面的属性. 解决方法 G 了一下就找到了, 在官网也有说明, 是编译顺序的问题, 需要先编译 Kotlin 再 Java

    那这次遇到的问题, 恰恰反了过来, 需要先编译 Java, 那就没得搞了.

    前面说一个Kt 能访问 lombok.Data class, 另外一个不能, 是因为他们不在一个 Module

  • 一起来打牌

  • {{ totalScore(person) }} {{ person.name }} {{ score }}
  • Graphql Java

    写在最前

    我不是写一个 GraphQL 的使用指南, 是在写自己对 GraphQL 的一些使用感受. 我自己是非常喜欢它, 愿意给他打10分, 虽然还有些小瑕疵. 如果你用过 GraphQL 了, 可以看看我们是不是有同感.

    另外多提两句. 1 GraphQL 本身是一个协议, 每种语言都有自己的框架实现, 我自己只用过 Java 的. 2 他是一个执行引擎, 不是 HTTP 框架, 你可以在任何地方使用他们, 当然现在最常见的是提供 HTTP 接口.

  • Contains Not Working In Elasticsearch

    elastic search painless script 里面的 contains “不生效”, 还好有 Google

    参考资料 https://discuss.elastic.co/t/painless-collection-contains-not-working/178944/2

    上面的链接 实在是太慢了, 摘抄一下

    Because Elasticsearch treats those numbers as Longs by default, you need to make sure that you pass a Long to the contains method. The following should work:

    GET testdatatype_unit_tests/_search
    {
      "size": 100,
      "query": {
        "script": {
          "script": {
            "source": "doc['IntCollection'].values.contains(1L)",
            "lang": "painless"
          }
        }
      }
    }
    
  • 算法导论7.1-快排描述

    7.1.2

    当数据 A[p..r] 中的元素均相同时, Partition 返回的 q 是什么. 修改 Partition, 使得数据 A[p..r] 中的元素均相同时, 返回 q=(p+r)/2

    返回 r

    我想不到好办法, 只能 i,j 分别从两头想向走. 代码如下:

    def partiton(nums, p, r):
        if len(nums) <= 1:
            return 0
        x = nums[r]
        i, j = p, r-1
        while True:
            if nums[i] > x:
                nums[i], nums[j] = nums[j], nums[i]
                j -= 1
            else:
                i += 1
            if i > j:
                break
    
            if nums[j] < x:
                nums[i], nums[j] = nums[j], nums[i]
                i += 1
            else:
                j -= 1
            if i > j:
                break
    
        nums[i], nums[r] = nums[r], nums[i]
        return i
    
    
    def main():
        nums = [2]*6
        q = partiton(nums, 0, len(nums)-1)
        assert q == 3
    
        nums = [2]*7
        q = partiton(nums, 0, len(nums)-1)
        assert q == 3
    
        for i in range(10):
            nums = [0]*i
            q = partiton(nums, 0, len(nums)-1)
            assert q == i//2
    
        nums = list(range(10))
        q = partiton(nums, 0, len(nums)-1)
        assert q == 9
    
        nums = [1, 2, 3, 4, 6, 7, 8, 9, 5]
        q = partiton(nums, 0, len(nums)-1)
        assert q == 4
    
        import random
        for _ in range(100):
            nums = []
            for _ in range(10):
                nums.append(random.randint(1, 10))
            q = partiton(nums, 0, len(nums)-1)
            assert not nums[:q] or max(nums[:q]) <= nums[q]
            assert not nums[q+1:] or min(nums[q+1:]) >= nums[q]
    
    
    if __name__ == '__main__':
        main()
    

    7.1.4

    反过来写一下

    def partiton(nums, p, r):
        i=p-1
        x = nums[r]
        for j in range(p,r):
            if nums[j]>x:
                nums[i+1],nums[j] =nums[j],nums[i+1]
                i+=1
        nums[i+1],nums[r] =nums[r],nums[i+1]
        return i+1
    
    
    def main():
        import random
        for _ in range(1000):
            nums = []
            for _ in range(10):
                nums.append(random.randint(1,10))
                q = partiton(nums,0,len(nums)-1)
                print(nums,q,nums[:q],nums[q+1:],nums[q])
                assert not nums[:q] or min(nums[:q]) >= nums[q]
                assert not nums[q+1:] or max(nums[q+1:]) <= nums[q]
    
    if __name__ == '__main__':
        main()