兩個不同子域的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並按要求輸入管理員密碼即可。