🌓

用inotifywait监控文件系统

起因:文件共享服务器原本开启的NFS共享,发现在Windows客户端访问并不稳定,想改用Samba共享,但是很多人在用NFS访问,想先同时开启两种共享同时支持访问,遇到的问题是通过NFS客户端创建出的文件权限是0755,通过Samba客户端不可写,而通过Samba客户端创建的文件可以通过create mask和 force create mask指定成任意的权限,可以保证NFS客户端可写,而且没有找到NFS如何配置可以控制新建文件的权限。于是想换个思路监视文件创建,在创建后立刻修改权限。

阅读全文

文件共享概述 NFS CIFS Samba

文件共享主流协议:NFS/CIFS,Samba是Linux上创建CIFS共享的工具

NFS是Linux间常用的共享协议

Linux服务端需要安装nfs-kernel-server,服务名称nfs-kernel-server别名nfs-server,依赖服务rpcbind,共享配置文件/etc/exports

阅读全文

BlockList(块状链表)

我们知道对于线性表,有两种基础的数据结构:数组和链表。

对于数组而言,支持O(1)的随机访问,结尾插入删除不考虑扩容可以近似认为是O(1),而中间插入或删除则需要O(n)的时间移动插入点后的所有数据。

对于链表而言,不支持随机访问,访问第k个元素需要从头遍历需要O(n)的时间,而插入和删除只需要改变next指针即O(1)的时间,当然定位到插入删除点还是需要O(n)的时间。

阅读全文

ChthollyTree(珂朵莉树)

珂朵莉树(ChthollyTree)又称老司机树(ODT),起源于CF 896C Willem, Chtholly and Seniorious

一位用户Old Driver在给出了线段树的解法后,有发布了一份前所未有的解法,其中利用到的数据结构因此被称为珂朵莉树或老司机树。

阅读全文

RMQ问题-ST算法

问题描述

RMQ问题即区间最值查询问题(Range Minimum/Maximum Query)

给定一个数组,大量的查询区间的最值,我们知道如果数组长度是n,有n*(n-1)/2个不同区间,如果只有少量的查询我们可以遍历区间的元素,算法的时间复杂度显然是O(len) len是区间长度,对于随机的区间一次查询的复杂度也就是O(n)。

阅读全文

CMakeLists.txt写法

一份CMakeLists.txt完整的样例和解释说明

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
81
82
83
84
85
86
87
88
89
cmake_minimum_required(VERSION 3.10)
project(ust_demo CXX)

# 通过上面的PROJECT设置后自动就有了PROJECT_NAME变量
message(STATUS PROJECT_NAME=${PROJECT_NAME})
# 指向顶级CMakeLists.txt所在绝对路径
message(STATUS CMAKE_SOURCE_DIR=${CMAKE_SOURCE_DIR})
# CMAKE_CURRENT_SOURCE_DIR变量是指向当前CMakeLists.txt所在的绝对路径
message(STATUS CMAKE_CURRENT_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR})
# 指向最后一次调用project命令时CMakeLists.txt所在的绝对路径
message(STATUS PROJECT_SOURCE_DIR=${PROJECT_SOURCE_DIR})
# 只要单个CMakeLists.txt时上面三个变量没有不同,当有多级目录多个CMakeLists.txt通过add_subdirectory相互包含时会有区别

# 在cmake命令中加参数 -DCMAKE_BUILD_TYPE=Debug 来指定编译Debug版本,否则默认编译Release版本
IF (CMAKE_BUILD_TYPE MATCHES "Debug" OR CMAKE_BUILD_TYPE MATCHES "DEBUG")
set(CMAKE_BUILD_TYPE "Debug")
# 指定可执行文件输出路径
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/out/Debug)
file(MAKE_DIRECTORY ${EXECUTABLE_OUTPUT_PATH})
ELSE ()
set(CMAKE_BUILD_TYPE "Release")
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/out/Release)
file(MAKE_DIRECTORY ${EXECUTABLE_OUTPUT_PATH})
ENDIF ()
# 指定存放动态链接库的路径
# 生成可执行文件后可以把out文件夹下的文件整体复制到其他环境下运行,为了保证动态链接库能找到需要做两件事:
# 1.把.so文件复制到out/libs目录下
# 2.链接时通过-rpath选项指定运行时查找链接库的路径(这一步如果不指定也可以在运行前通过LD_LIBRARY_PATH环境变量指定)
set(LIBRARY_OUTPUT_PATH ${EXECUTABLE_OUTPUT_PATH}/libs)
file(MAKE_DIRECTORY ${LIBRARY_OUTPUT_PATH})

# 设置编译选项
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")

set(CMAKE_C_FLAGS_DEBUG " -g -ggdb -O0 -Wall -Wno-unused-function -fpic -fPIC -D_DEBUG")
set(CMAKE_CXX_FLAGS_DEBUG " -std=c++17 -g -ggdb -O0 -Wall -Wno-unused-function -fpic -fPIC -D_DEBUG")

set(CMAKE_C_FLAGS_RELEASE " -O3 -Wall -Wno-unused-function -Wno-unused-result -Wno-unknown-pragmas -Wno-format-security -fpic -fPIC")
set(CMAKE_CXX_FLAGS_RELEASE " -std=c++17 -O3 -Wall -Wno-unused-function -Wno-unused-result -Wno-unknown-pragmas -Wno-format-security -fpic -fPIC")

# 添加头文件目录
set(INCLUDE_DIR ./include)
include_directories(${INCLUDE_DIR})

# 添加库文件目录
set(LIB_DIR lib/linux.x64)
link_directories(${LIB_DIR})

# 将src目录下所有源文件加入 SRC_LIST
aux_source_directory(./src SRC_LIST)
# # 也可以通过 FILE(GLOB_RECURSE <var> <parterns>) 把匹配指定模式的文件加入变量中
# 区别是这样同时会查找src子目录下的.cpp和.c文件
# file(GLOB_RECURSE SRC_LIST "src/*.cpp" "src/*.c")
# # 也可以通过set明确地逐个文件加入源文件列表
# set(SRC_LIST
# src/main.cpp
# )

# 指定生成PROJECT_NAME要编译的源文件
add_executable(${PROJECT_NAME}
${SRC_LIST}
)

# 将指定的.so文件的绝对路径加入 LIB_LIST
# file(GLOB_RECURSE LIB_LIST "${LIB_DIR}/*.so")

# 同样也可以通过set明确地逐个文件加入库文件列表
set(LIB_LIST
libHSSecuTradeApi.so
t2sdk
)

file(COPY ${LIB_DIR}/libHSSecuTradeApi.so DESTINATION ${LIBRARY_OUTPUT_PATH})
file(COPY ${LIB_DIR}/libt2sdk.so DESTINATION ${LIBRARY_OUTPUT_PATH})

# 指定指定生成PROJECT_NAME要连接的动态链接库
# 这里链接库的路径可以是绝对路径
# 也可以只写文件名将在通过link_directories指定的包含目录以及环境变量LIBRARY_PATH指定的目录下去查找
# 名为libxxx.so的文件可以只写xxx
target_link_libraries(${PROJECT_NAME}
${LIB_LIST}
pthread
-Wl,-rpath,'$ORIGIN'/libs
)
# -Wl 的意思是把后面参数传给链接器,多个参数用逗号分割,这里实际传给链接器的参数是 -rpath '$ORIGIN'/libs
# 其中$ORIGIN表示运行时可执行文件的位置,'$ORIGIN'/libs也就是可执行文件同目录的libs文件夹。
# 不能指定成./libs因为这会被误认为是链接时的相对路径,而不是运行时的。

阅读全文

通过Grub命令指定引导分区

起因:在公司服务器上装了Windows和Ubuntu双系统,Windows是自带的,Ubuntu是后装的。系统有两块硬盘,参照网上的教程从C盘和D盘分别压缩出200M和100G空间分给Ubuntu使用,安装时手动设置把200M挂载到/boot,把100G挂载到/,安装一切顺利,重启后可以看到Ubuntu带的Grub菜单,默认进入Ubuntu,还有一个选项是Windows Boot Manager可以进入Windows,选择Ubuntu进入Ubuntu正常,再次重启在Grub菜单选择进入Windows也正常,但是再次重启时Grub菜单消失了,直接进入了Windows,无法选择进入Ubuntu。

阅读全文

凸包

给定二维平面内的一组点集,求出包住所有点的最小的凸多边形。

1
2
输入: [(1, 1), (2, 2), (2, 0), (2, 4), (3, 3), (4, 2)]
输出: [(4, 2), (2, 4), (1, 1), (2, 0)]

阅读全文

欧拉函数

上次在讲幂模算法时提到,对于a^b%m,指数b不能令b=b%m使b变小,但是让b=b%phi(m),其中phi是欧拉函数。

欧拉函数phi(m)的值是模m的缩系的元素个数,小于m的与m互质的自然数构成模m的缩系。

阅读全文

在Linux Shell脚本中得到当前脚本所在路径

正确的做法是

1
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

阅读全文