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