Ubuntu 18.04 修复与 Windows 共享文件及打印机

Ubuntu 升级到 18.04 后,在网络共享中看不到同一局域网内 Windows 共享的文件,同时 Windows 上共享的打印机也不能正常工作,表现为“需要身份认证”,但是输入对应用户名密码之后毫无反应。

修复方法:https://www.dedoimedo.com/computers/ubuntu-beaver-samba-shares.html

1
2
3
4
5
6
$ sudo vi /etc/samba/smb.conf

# Add a line
client max protocol = NT1

$ sudo systemctl restart smbd.service

Cpp Template Meta Programming MergeSort

C++ 模板元编程之编译时归并排序,源自水木社区 ilovecpp

Cpp Template Meta Programming MergeSort

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <boost/mpl/vector.hpp>
#include <boost/mpl/vector_c.hpp>
#include <boost/mpl/eval_if.hpp>
#include <boost/mpl/identity.hpp>
#include <boost/mpl/empty.hpp>
#include <boost/mpl/less.hpp>
#include <boost/mpl/front.hpp>
#include <boost/mpl/pop_front.hpp>
#include <boost/mpl/push_front.hpp>
#include <boost/mpl/size.hpp>
#include <boost/mpl/iterator_range.hpp>
#include <boost/mpl/int.hpp>
#include <boost/mpl/for_each.hpp>
#include <iostream>

using namespace boost::mpl;

template<typename V1, typename V2>
struct Merge {
    template<typename T1, typename T2>
    struct F {
        typedef typename push_front<
            typename Merge<typename pop_front<T1>::type, T2>::type,
            typename front<T1>::type
            >::type type;
    };
        
    typedef typename eval_if<
        empty<V1>,
        identity<V2>,
        eval_if<
            empty<V2>,
            identity<V1>,
            eval_if<
                less<typename front<V1>::type, typename front<V2>::type>,
                F<V1, V2>,
                F<V2, V1>
                >
            >
        >::type type;
};

template<typename V>
struct MergeSort {
    template<typename T>
    struct F {
        typedef typename begin<T>::type t0;
        typedef typename advance<t0, int_<size<T>::value/2>>::type t1;
        typedef typename end<T>::type t2;
        typedef typename Merge<
            typename MergeSort<iterator_range<t0, t1>>::type,
            typename MergeSort<iterator_range<t1, t2>>::type
            >::type type;
    };
    
    typedef typename eval_if<
        empty<V>,
        identity<vector<>>,
        eval_if<
            less<size<V>, int_<2>>,
            identity<vector<typename front<V>::type>>,
            F<V>
            >
        >::type type;
};

typedef vector_c<int, 0,2,1,3,4> t1;
typedef MergeSort<t1>::type t10;

struct print {
    template <typename T>
    void operator()( T t ) const {
       std::cout << T::value << " ";
    }
};

int main() {
    for_each<t10>(print());
    return 0;
}

VSCode cquery(lsp) 实现 C/C++ 补全

LSP(Language-Server-Protocol)开源的语言服务器协定,微软出品,语言服务端提供索引代码的服务,编辑器直接调用。套用官话就是,可以让不同的程序编辑器与集成开发环境(IDE)方便嵌入各种程序语言,允许开发人员在最喜爱的工具中使用各种语言来撰写程序。

目前语言与编辑器支持情况见 https://langserver.org/

cquery 就是 C/C++/Objective-C 的 language server,VSCode, Vim, Emacs 等只要安装了 lsp 插件,就可调用它来实现 C/C++/Objective-C 语法补全等功能。

下面以 Visual Studio Code 为例来实现 C/C++ 补全。