当打开以https开头的网页时,如果其图片、js或接口是http协议,正常浏览器是打不开该网页的。
当Clickhouse服务器强制关闭、异常断电、以及数据拷贝时等,导致Clickhouse数据损坏,服务无法启动,提示:
<Error> Application: DB::Exception: Suspiciously big size (4 parts, 1.05 GiB in total) of all broken parts to remove while maximum allowed broken parts size is 1.00 GiB. You can change the maximum value with merge tree setting 'max_suspicious_broken_parts_bytes' in <merge_tree> configuration section or in table settings in .sql file (don't forget to return setting back to default value): Cannot attach table `ads`.`xxx_tbl` from metadata file /var/lib/clickhouse/store/
需要在/etc/clickhouse-server/config.d配置中增加max_suspicious_broken_parts.xml文件,内容如下:
<?xml version="1.0"?>
<yandex>
<merge_tree>
<max_suspicious_broken_parts>1000</max_suspicious_broken_parts>
<max_suspicious_broken_parts_bytes>2147483648</max_suspicious_broken_parts_bytes>
</merge_tree>
</yandex>
然后启动Clickhouse即可:
systemctl start clickhouse-server.service
首先,确保宿主机安装好了GPU显卡驱动(这里GPU显卡驱动一般是指Nvidia显卡),通过命令:
nvidia-smi -l
可以检测是否正常。但启动docker时,发现找不到gpu驱动,命令如下:
docker run --name archlinux_for_cnangel -dit --gpus all --privileged=true --net=host -v home_cnangel:/home/cnangel -v /home/cnangel:/data -v /u:/u harbor.huhoo.net:4330/os/archlinux:latest /bin/bash
此时需要安装nvidia-docker2,它会自动带起2个重要的依赖(nvidia-container-toolkit和libnvidia-container-tools)安装:
dnf install nvidia-docker2 -y
然后重新运行上述docker run即可。
在Linux系统中,一般有2大阵营,Debian和Redhat,其对应的桌面版本主要是Ubuntu和Fedora。
钉钉作为优秀的企业办公软件,当前也有Linux版本,由于Linux用户本身很少,故钉钉只发布了针对Ubuntu20.04的版本(com.alibabainc.dingtalk_7.1.0.31017_amd64.deb),对于Fedora系列无支持,那么应该如何支持Fedora系列呢?
2003 年 11 月 6 日,Fedora 项目发布了 Fedora Core 1,而在二十年零一天后的今天,Fedora Linux 39 终于正式发布,这是为台式机、笔记本电脑、服务器、云、边缘计算设备以及您能想到的任何其他终端打造的完整社区操作系统。
一般证书上,对CRT和PEM证书没有特别做区分,故在nginx上部署了xxx.com_public.crt证书,发现curl 接口,出现如下错误:
curl 'https://xxx.com/api/campaign-names'
curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: https://curl.se/docs/sslcerts.html
curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.
需要加上 -k 才能正确访问;若直接使用pem证书,则无需加上 -k 参数;
putty版本:0.70
首先排除了fedora38上rsa私钥以及配置的问题,就剩下2个可能:
1,历史私钥不兼容;
2,Putty的问题;
用 docker 在 Dockerfile 上每次升级都很顺利,但突然之间,升级RPM包,报以下错误:
... signature hdr data: bad, no. ... of bytes(64372) out of range
网上查了一下,主要是由于RPM的一些兼容性问题导致(RPM签名的头超过了64KB),详情见"signature hdr data BAD" on trying to parse RPM with more than 64KB signature header。
如何解决的呢?
工厂类注册问题
工厂类一般使用模板或宏的方式,如下列代码申明:
class ExpressionFactoryRegisterer
{
public:
ExpressionFactoryRegisterer(const std::string &name, const ExpressionFactoryPtr &factory)
{
GetExpressionTable()->RegisterExpressionFactory(name, factory);
}
};
代码注册如下:
REGISTER_EXPRESSION_FACTORY("log", std::make_shared<UnaryMathExpressionFactory<Func__log>>());
这样注册之后,一个简单的"反射"机制建立起来。但一般情况下,为了避免多重定义,会降代码注册的部分写到 .cc
文件中,但静态编译的时候, .cc
生成的 .o
文件,会通过 ar
工具打包成 .a
文件,此时 .a
文件直接去链接,静态区过程会滞后,导致 RegisterExpressionFactory
动作变成运行态执行。当程序真正执行时,初始化从静态区获取不到注册的类,导致空结果或指针。
正确的方式有2种:
-
动态编译:通过
-shared
生成so
文件,然后链接; -
.o
直接链接:将生成的.o
文件直接链接,或通过ar
工具解压.a
文件,然后再链接.o
文件;
这里不是比较automake和cmake,但在工作当中,当一个三方库(sse_pb
)既有动态库,又有静态库时,我们使用-lsse_pb
连接时,系统会默认使用动态库,但我们需要优先使用静态库链接时, automake方式比较简单,但对于cmake,这里提供3种办法:
1.使用GCC编译参数
我们可以使用GCC的编译参数-Wl,-Bstatic
和-Wl,-Bdynamic
来实现指定优先静态编译:
find_package(PkgConfig)
pkg_check_modules(brpc REQUIRED IMPORTED_TARGET brpc)
pkg_search_module(sse_pb REQUIRED sse_pb)
add_library(basic_search SHARED)
target_link_libraries(basic_search
PRIVATE
basic_search_common
basic_search_util
...
PUBLIC
PkgConfig::brpc
-Wl,-Bstatic
${sse_pb_LIBRARIES}
-Wl,-Bdynamic
)
值得注意的是 pkg_check_modules
会将 pc 文件内的链接 -lsse_pb
预先生成 /usr/lib64/libsse_pb.so
形式,导致即使添加GCC参数也不会生效。所以正确的方式是使用 pkg_search_module
来生成cmake的宏变量,一般存在两组值:
-
用于普通情况,
pkg-config
在使用--libs
选项调用时提供的信息,如<XXX> = <prefix>
-
用于
pkg-config
在额外添加--static
选项调用时提供的信息 (<XXX> = <prefix>_STATIC
)
对应的宏变量有下列这些:
<XXX>_FOUND:如果模块存在,则设置为 1
<XXX>_LIBRARIES:只有库 (没有 "-l")
<XXX>_LINK_LIBRARIES:库及其绝对路径
<XXX>_LIBRARY_DIRS:库的路径 (没有 "-L")
<XXX>_LDFLAGS:所有必需的链接器标志
<XXX>_LDFLAGS_OTHER:所有其他链接器标志
<XXX>_INCLUDE_DIRS:预处理器标记'-I'(没有'-I')
<XXX>_CFLAGS:所有必需的 cflags
<XXX>_CFLAGS_OTHER:其他编译器标志
<YYY>_VERSION:模块版本
<YYY>_PREFIX:模块的前缀目录
<YYY>_INCLUDEDIR:包含模块的目录
<YYY>_LIBDIR:模块的 Lib 目录
如上述 ${sse_pb_LIBRARIES}
的设置,就是将 sse_pb 库以静态优先的方式链接起来。
2.使用CMAKE_FIND_LIBRARY_SUFFIXES
我们还可以使用 find_library
,通过改变查找 .a
文件的顺序来获得静态文件优先规则,如下所示:
if (WIN32 OR MSVC)
set(CMAKE_FIND_LIBRARY_SUFFIXES ".lib")
elseif (UNIX)
# 仅查找静态库,强制后缀为 .a
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
# 如果只是优先查找静态库,保证 .a 后缀在前面即可,把默认的后缀加上
# set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
endif()
find_library(sse_pb_lib sse_pb)
target_link_libraries(basic_search
${sse_pb_lib}
)
3.写死路径
在这种 set_property
方式下,主要依赖路径:
add_library(sse_pb STATIC IMPORTED)
set_property(TARGET sse_pb PROPERTY IMPORTED_LOCATION /path/to/libsse_pb.a)
target_link_libraries(basic_search sse_pb)
其中 /path/to/libsse_pb.a
从上可以看出,最灵活也是最优雅的还是第一种方式,可以依赖pkg-config建立很好的环境变量,从而进行静态编译。