两个不同子域的wordpress使用同一个数据库并共享用户登录状态

这里先简单记下步骤

步骤一:

分别编辑两个网站的wp-config.php文件,添加内容

define('WP_SITEURL', 'https://' . $_SERVER['HTTP_HOST']);
define('WP_HOME', 'https://' . $_SERVER['HTTP_HOST']);
define('COOKIE_DOMAIN', 'ibadboy.net');
define('COOKIEPATH', '/');

步骤二:

分别编辑两个网站的wp-includes/default-constants.php文件
修改

define( 'COOKIEHASH', md5( $siteurl ) );

define( 'COOKIEHASH', md5( 'ibadboy.net' ) );

CentOS7安装完后更改字符界面大小(调屏幕分辨率)

前言

使用虚拟机安装完CentOS7之后,那个超级巨大的字符界面分辨率已经把VMware虚拟机的窗口撑得屏幕都装不下了,严重影响我对系统的配置。

解决方法

在百度上看了很多方法,找到比较靠谱的一种——修改GRUB引导的配置文件。这样,下次重启的时候,分辨率就变小啦。
以下是我更改分辨率后的效果(比CentOS6的字符界面还是大了许多)
CentOS7字符界面更改后的大小.PNG

步骤

1、使用文本编辑器打开/etc/grub2.cfg文件,这文件就是GRUB的配置文件。

[root@localhost ~]# vim /etc/grub2.cfg

2、在配置文件中搜索关键字linux16 /vmlinuz

可以找到类似如下内容(其中vmlinuz-3.10.0-123.el7.x86_64为你当前所用的系统内核的版本号,若搜索到多个内核,则要确定你的系统当前所使用的是哪个内核):

 linux16 /vmlinuz-3.10.0-123.el7.x86_64 root=UUID=7b8ab34a-2d48-41d0-a20f-63356da5d6f6 ro rd.lvm.lv=centos/swap vconsole.font=latarcyrheb-sun16 rd.lvm.lv=centos/root crashkernel=auto  vconsole.keymap=us rhgb quiet LANG=zh_CN.UTF-8

3、编辑配置文件

讲光标定位到这一行末尾,加一个空格之后填上vga=32A,保存并退出。
如图所示
.jpg

4、重启系统

搞定。

BIND为任意长掩码的网段做反向解析

前言

当初做BIND实验的时候在网上搜到的资料全部是以24位掩码来做反向解析实验的,搞得我一直以为BIND反向解析时只能使用24位掩码。然而,事实上BIND支持任意长度掩码的网段的反向解析。

本文将以16位掩码为例子,演示配置过程。

实验目的

使BIND可以正确为192.168.0.0/16网段做反向解析,并正确解析出192.168.10.254这个IP地址对应的域“www.ibadboy.net”。

配置方法

1、创建16位掩码的反向解析区域

2018-06-21 09-48-19屏幕截图.png

2、编辑反向解析数据库文件

注意,这里的254.10是10.254的倒写!!!这里是重点!必须倒写!
2018-06-21 09-47-09屏幕截图.png

3、验证结果

如下图,已经按照实验预期通过192.168.10.254解析出了www.ibadboy.net。
2018-06-21 09-48-44屏幕截图.png

GCC下“initializing ‘char **’ with an expression of type ‘const char **’ discards qualifiers in nested pointer types”警告解读

我曾经被这个警告困扰了好久好久,问了好些人,都说没遇到过=_=…
问题代码片段(与问题无关的代码块已被忽略):

size_t MyConv(const char *orginStr, const char *targetStr, ...) {
    char **tmpIn = NULL;
    char **tmpOut = NULL;
        ...
        ...
    tmpIn = &orginStr;
    tmpOut = &targetStr;
        ...
        ...
}

GCC编译后会弹出如下警报:

sfind.c:887:8: warning: assigning to 'char **' from 'const char **' discards qualifiers in nested pointer types
      [-Wincompatible-pointer-types-discards-qualifiers]
        tmpIn = &orginStr;
              ^ ~~~~~~~~~

这条警告信息翻译出来是“用类型表达式初始化“char \**” “const char \**”丢弃嵌套指针类型中的限定符。 ”,个人表示很晦涩难懂。。。
后来翻阅《C专家编程》的时候,偶然间发现一个章节是讨论const限定符的,认真看了下,顿时感慨自己学识太过浅薄。
上面的代码中,实参const char \*orginStr的const是修饰char orginStr的,而char **tmpOut是指向char *类型变量的一个指针(此“char *”类型无修饰符),这两点倒是没有疑惑。但当二者互相赋值的时候,const char *orginStrchar \**tmpOut这两个指针所指向的类型的修饰符不同。一个是const char orginStr,带了const修饰符,而另一个则是char *tmpOut,并没有const修饰符。指针变量赋值时,赋值语句左边的指针所指向的类型必须具有赋值语句右边的类型所拥有的全部修饰符,才能正常通过编译,否则就会舍弃右边变量多余的修饰符。

以下内容摘自ANSI C标准手册

两个操作数都是指向有限定符或无限定符的相容类型的指针,左边指针所指向的类型必须具有右边指针所指向类型的全部限定符。

也就是说:

int *a = NULL;
const int *b = a;

上面这段代码是可以正常通过编译的,因为赋值语句左边的指针指向的数据类型拥有了右边的数据类型的所有修饰符(甚至还比右边的多了一个const)而下面这段却不行。

const int *a = NULL;
int b = a;

在Linux下利用宏定义的方式使用Sleep函数

前言

Sleep是存在于Windows.h头文件中用于将进程挂起的函数。显然,Linux下是没有该头文件的,该如何实现呢?

实现方法

Linux的unistd.h库为我们提供了类似功能的usleep函数,但该函数的计时单位是微妙而不是和Sleep一样使用毫秒计时。
为了方便程序的跨平台开发,可以使用如下宏定义将usleep化妆为Sleep

#ifdef linux
#include<unistd.h>
#define Sleep(value) usleep(value * 1000);
#endif

只需将以上宏定义加到源码中就可以正常的在Linux下使用Sleep函数了。

GNU出品的转码库——libiconv v1.15 for windows x64下载(已经过编译)

libiconv库是GNU项目的一部分,负责对字符进行不同编码间的转换。是Linux下非常常用的编码转换库,其对应的命令是:iconv(命令的使用方法可以百度了解下)。

libiconv库原生支持Windows平台,但考虑到很多人为了追求效率而不想自己动手编译这个庞大而复杂的库,故我在这里为大家提供已经编译好的支持windows 64位的二进制文件——可以动态调用也可以静态编入程序,提供Debug和Release两个版本。
注:使用本库请确保你的项目是64位的,否则无法正常调用。

二进制文件已在Win10 + VS 2017环境中测试通过。提供的版本为libiconv v1.15,该版本发布于2017年2月,截至本文章发布时为libiconv库的最新版本。

下载地址:
libiconv-1.15 for windows x64

C语言swprintf函数的正确用法

在这篇文章的开头,我要狠狠的吐槽国内那些专门抄别人文章的网站主们,抄是可以抄,但是一篇错的文章还抄来抄去的有意思吗???

swprintf函数原型:

int swprintf(wchar_t * ws,size_t len,const wchar_t * format,...);

参数说明:

ws

指向存储宽字符串的缓冲区的指针。
缓冲区的大小至少为n个宽字符。

len

填充ws缓冲区的最大宽字符数。
生成的字符串长度至多为n-1,为额外的’0’留一个空间。

format

宽字符串,其中包含格式字符串,其格式与printf中的格式相同。
请注意,所有格式说明符的含义与printf中的相同; 因此,应使用%lc写宽字符(而不是%c),并且%ls应用于宽字符串(而不是%s)。

… (附加参数)

同printf的附加参数,不做过多解释。

程序示例:

#include <stdio.h>
#include <wchar.h>
int main (void) {
    wchar_t str [100] = L"";
    swprintf (str, 100, L"%ls%d is %d",L"The half of " ,80, 80/2);
    fputws (str, stdout);
    return 0;
}

C语言操作文件时写完一组数据后立即刷新缓存区的方法

前言

很多时候,为了防止程序意外结束等原因造成的数据丢失,我们需要在向文件写入一组数据以后立即刷新缓存区。比如说:在写程序LOG的时候,为了防止程序崩溃时无法记录LOG,就需要记录一条LOG就刷新一次缓存区以使其立即写入磁盘文件。

实现方法

使用C标准库提供的fflush(FILE *)函数可以很方便的实现该功能,只需传入要刷新缓存区的文件指针即可。

示例程序

#include <stdio.h>
int main(void) {
    FILE *fp = fopen("LOG.txt", "w");
    fprintf(fp, "hello!");// 使用一个明显小于缓存区的字符串做测试,若大于缓存区则缓存区在满了以后会自动刷新
    fflush(fp);           // 立即刷新缓存区,若删除此语句则字符串不会被保存在文件中。
    fp++;                 // 偏移文件指针到未知地址。
    fclose(fp);           // 由于fp指向未知地址,所以执行fclose后程序会崩溃。
    return 0;
}

经观察可以发现,不使用fflush()函数,字符串就不能被正确的保存在文件中。

原来C语言的数组大小可以是一个变量呀!

长久以来,我一直以为C语言的数组大小必须是在编译前就确定下来的常量值,相信很多C语言初学者也是和我一样的认识。然而,直到今天我才发现原来从C99标准开始C语言就已经支持了可变长数组

例如如下程序(注:VS系列编译器均不支持该特性,搞不懂微软为何不好好支持C99标准):

#include <stdio.h>
int main(void) {
    int a = 2;
    int b[a + 1];   // 数组b的长度只有在运行时才可以确定。
    for (int i = 0; i < 3; i++) {
        b[i] = i;
        printf("%d\n", b[i]);
    }
    return 0;
}

上面的代码在GCC 7.3上测试通过(实际上任何支持C99标准的编译器都可以)。
需要注意的是,在C语言中,可变长数组只能用于局部变量中,在全局变量中使用可变长数组会导致编译器报错。
另外,可变长数组不等于动态数组,也就是说,数组的维度在变量的整个生命周期中是不可变的。
可变长数组对于二维、三维…的数组及类似int (*a)[b/*b是个变量*/ + 2];这种指向二维数组的指针也一样适用。

C语言实现Linux下遍历指定目录批量搜索及替换文件中关键字的小工具

为什么要写这样一个程序呢?

兼职做IDC的我经常会需要帮客户改网站,很多时候会需要将用户网站中所有脚本文件中的某一关键字进行替换(可能是品牌名称、网址等),在Windwos下一般都是用Dreamweaver来实现的,但总有一种杀鸡用牛刀的感觉。后来电脑重装为Linux平台后一直没发现好的批量替换工具,这导致很长一段时间以来我一直是用grep命令先搜索关键字,再挨个文件手工替换=_=。。。
寒假前听说高考科那边要开C语言的课程了,索性就跟着学啦,因为我初中的时候有看过一点点C++的知识,所以C学起来也还算轻松,到放寒假时已经学了两个月了,感觉是时候利用假期来写点什么了。想到前面说的痛点,我就决定写一个小巧的工具,可以方便的批量替换目录中所有文件中包含的关键字。

程序简介

首先声明,这是我写的第一个程序(打印hello, world那种“程序”不算哈),水平有限,若是代码中什么可笑的地方还望大佬们可以给指出来^_^。
程序是用C语言+Shell脚本实现的,目前仅支持Linux平台,计划支持Windows(工作量不会很大,核心代码通用)。
程序中关键字的数据存储是使用链表这种数据结构实现的,没学过链表的同学看起来可能比较吃力。

若是程序中有什么BUG或是想和我交流一下可以在文章下方留言。

程序源码:

GitHub:https://github.com/sunxiyuan/sfind

感觉还可以的话给个Star呗~

Linux下VMware虚拟机报Could not open /dev/vmmon: No such file or directory. Please make sure that the kernel module `vmmon’ is loaded.错误的解决方法

问题描述

Linux下的VMware虚拟机在启动时报Could not open /dev/vmmon: No such file or directory.
Please make sure that the kernel module `vmmon’ is loaded.错误。

解决办法

重新编译模块。

$sudo vmware-modconfig --console --install-all

再次运行即可。

C语言实现删除一个字符串中的指定字母

题目要求

删除一个字符串中的指定字母,如:字符串 “hello,world!”,删除其中的 o 字母,应输出 “hell,wrld!”

解题思路

将字符串内不属于需搜索的字符的字符再赋值到该字符串的地址空间中,最后再在字符串结尾加上结束标记\0

程序代码

#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
    int num = 0;
    for (int i = 0; i <= strlen(argv[1]); i++)
        if (argv[1][i] != argv[2][0])
        {
            argv[1][num] = (i == strlen(argv[1])) ? '\0' : argv[1][i];
            num++;
        }
    printf("%s\n", argv[1]);
    return 0;
}

运行结果

2018-02-22 08-22-51屏幕截图.png

Linux下VMware虚拟机启动时报Kernel headers for version 4.x-xxxx were not found. If you installed them[…]的错误的解决方法

问题表现

在Linux下安装完VMware虚拟机后启动虚拟机报:Kernel headers for version 4.x-xxxx were not found. If you installed them[…],具体报错如下图所示。
2018-02-20 08-50-33屏幕截图.png

解决方法

安装系统内核对应版本的linux-headers
例如,我的系统的内核版本是4.14.19,操作系统是Archlinux,就执行如下命令来安装。

$ sudo pacman -S linux-headers

之后再根据命令提示选择与内核版本对应的linux-headers
Ubuntu和Fedora用户则使用各自的包管理工具安装正确的linux-headers版本

安装后再次启动VMware会看到如下提示。
2018-02-20 16-50-27屏幕截图.png
点击install并按要求输入管理员密码即可。