Patricklog

Hi, I am Patrick.

安裝 Debain

| Comments

乾淨的 Console 界面

  1. 安裝過程中取消勾選 Desktop environment.

安裝 awesome 桌面環境

apt-get install xorg awesome

切回原本 user 然後進入視窗環境

startx

安裝應用程式

  • iceweasel
  • emacs
  • zsh
  • rxvt-unicode
  • git
  • tmux

設定 thinkpad 小紅點 (Track point)

原文在 Debian 的 Wiki

Section "InputClass"
  Identifier "Trackpoint Wheel Emulation"
  MatchProduct       "TPPS/2 IBM TrackPoint|DualPoint Stick|Synaptics Inc. Composite TouchPad / TrackPoint|ThinkPad USB Keyboard with TrackPoint|USB Trackpoint pointing device"
  MatchDevicePath    "/dev/input/event*"
  Option             "EmulateWheel"          "true"
  Option             "EmulateWheelButton"    "2"
  Option             "Emulate3Buttons"       "false"
  Option             "XAxisMapping"          "6 7"
  Option             "YAxisMapping"          "4 5"
EndSection

設定視窗環境

awesome 桌面環境

awesome 設定檔參考 kk1fff’s rc.lua,檔案位置放在 ~/.config/awesome/rc.lua 這個設定檔會把預設終端機設定成 urxvt。這個檔案記得

beautiful.init("/home/patrick/.config/awesome/themes/wmii/theme.lua")

這個路徑要設定到對的位置

X window

.xinitrc 設定檔參考 kk1fff’s .xinitrc,檔案就是 ~/.xinitrc

關閉 Thinkpad 的 Touchpad

在 .xinitrc 裡面加上

synclient TouchPadOff=1

awesome 桌面佈景

cd ~/.config/awesome
git clone https://github.com/kk1fff/awesome-themes.git themes

設定 URXVT

檔案要放在 ~/.Xdefaults 內容可參考 kk1fff’s .Xdefaults。設定成支援 256 色,黑底,關閉 iso14755 快速鍵的 urxvt。

設定網路

安裝 NetworkManager

su -
apt-get install network-manager-gnome

然後把 interface 從 /etc/network/interfaces 中移除掉,讓 Network manager 去管理網路。移除掉以後重新啟動網路和 Network manager。

service networking restart
service network-manager restart

清理NAS

| Comments

前幾天自己組的 NAS 總是不停的關機,以前偶爾發生以為沒什麼,後來越來越常發生。有一天他在我眼前就關機了,於是我傻到,重新開機以後,進 BIOS 設定畫面,發現 CPU 溫度已經快 90 度了。突然覺得這問題有點大。想想從我組好他也已經五年了,歷經了風霜,也許也已經老到不行動了。於是我一邊 survey 新的硬體,一邊想說要不要乾脆買個新的。去問了在 NAS 公司工作的朋友,也上了 NAS 的網站去看,發現 i3 的 NAS 居然是頂級 NAS,要好幾萬,這讓我重新考慮是不是該買個普通 NAS,還是繼續用自己組裝的。畢竟自己組裝的 NAS 便宜很多,但讓我卻步的還是硬體陣列。硬體陣列雖然大家都說好,但是一旦你用了,你就需要仰賴那個硬體。如果有天陣列卡壞了,你必須找到相容的陣列卡,不然就算你的磁碟一顆都沒壞,也很可能東西都拿不回來。

Emacs Powerline + 顏色設定

| Comments

以前都不想設定顏色,總覺得用最基本的編輯器最好。直到有一天,看到同事們用 vim 的 powerline,後來又讀了 othree 大的 vim-airline,就好想找 powerline 給 emacs 用。後來真的給我發現了 emacs powerline 結果更殊不知,改一改,上癮了(囧)。Emacs 24.3 有新的主題設定方式,真的很酷啊!

C 的變動參數 Variable Argument

| Comments

其實這東西每天都在被用,我們最愛的 printf,最常見的雛型就是這樣

1
int printf(const char * __restrict, ...);

最後的那三個點(ellipsis)就是我們可以任意控制參數長度的關鍵。要時作這樣的函數,需要透過幾個巨集和資料形態:va_list, va_start, va_arg, va_end,他們定義在 stdarg.h 裡面,記得要引用。

簡單的範例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdarg.h>
#include <string.h>
#include <stdio.h>

void printall(const char* strs, ...) {
  va_list args;
  const char* str;
  va_start(args, strs);
  for (str = strs; strlen(str) > 0; str = va_arg(args, const char*)) {
    printf("String: %s\n", str);
  }
  va_end(args);
  printf("end.\n");
}

int main() {
  printall("this", "is", "a", "test", "");
}

當我們要取用變數時,我們宣告一個 va_list 變數,叫做args,然後,在 va_start中,提供兩個參數:

va_start(va_list, last argument of current function)

例子中,printall 的最後一個參數(也是第一個參數)叫做 strs,所以我們把 strs 傳給他。然後就可以開始取資料了。取資料用 va_arg,用法是:

va_arg(va_list, type)

當你預期得到的是一個 const char* 時,type 就要放 const char*,那我們怎麼知道 va_list 多長呢?沒有辦法知道。所以,在範例裡面我用空字串代表結尾,在 printf 裡面可以用 format string 當作指標。也可以先傳入一個整數告訴目的函數這個 va_list 有多大。

最後,記得 va_end,結束使用 va_list。

Urxvt, Thunderbird 改變預設瀏覽器

| Comments

其實這兩個東西沒關係,只是他們是我再 awesome 上面最常用的兩個玩意兒。最近從 firefox 改用 chromium,為了讓預設瀏覽器改變,發現需要手動設定。

urxvt 設定在 .Xdefaults 裏面,尋找一行

urxvt*urlLauncher:

設定為

urxvt*urlLauncher: usr/bin/chromium-browser

就可以了。

Thunderbird 則是再另一個檔案裏面

$HOME/.local/share/applications/mimeapps.list

加上

x-scheme-handler/http=chromuim-browser.desktop

就搞定了,開心使用。

檢查 This == 0x0

| Comments

昨天和幾個前同事喝酒聊天,聊到檢查 this == 0 這件事情。其實這事還滿不合邏輯的。在 C++ 裡面,如果 this 表示自己的指標。如果 this == 0x0 表示 this 不存在,又何來呼叫方法呢?

但是仔細想想,基於物件資料和方法本質上是分開的,還是有機會造出這種狀況,比方說:

thisiszero.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>

using namespace std;

class A {
public:
  void my() {
    cout << "My address: " << this << endl;
  }
};

int main() {
  A *a = 0;
  a->my();
  return 0;
}

好像還真有那麼一回事的產生了

12:31 上午 kk1fff@kk1fffteki-MacBook-Pro:~/t
$ g++ this.cpp

09:15 下午 kk1fff@kk1fffteki-MacBook-Pro:~/t
$ ./a.out
My address: 0

這樣的 output。

這樣說起來,在方法中檢查 this == 0x0 似乎不是件很蠢的事情。某種程度上可以阻止 method 執行下去存取到不該存取(未配置)的物件記憶體。

所以我們就改寫我們的 method 成

checknull.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <string>

using namespace std;

class A {
private:
  string myvalue;

public:
  void setValue(const string& val) {
    if (this == 0) {
      cerr << "I am not allocated" << endl;
      return;
    }
    cout << "I am allocated, setting value" << endl;
    myvalue = val;
  }
};

int main() {
  A *a = 0x0;
  a->setValue("haha");
  return 0;
}
$ ./a.out
I am not allocated

但是沒有人說不合法記憶體就就一定是 0x0,比方說

checknull1.cpp
1
2
3
4
5
6
7
int main() {
  A *a = new A();
  delete a;
  memset(a, 0, sizeof(A));
  a->setValue("haha");
  return 0;
}
$ ./a.out
I am allocated, setting value
Segmentation fault: 11

這樣就掛了,當然我在 memset 是為了增加掛掉的可能性,可是那個 this == 0 完全沒檢查出來。其實這就跟普通的檢查 null pointer 一樣,只是把檢查的工作從 caller 拿到 callee。雖然可以避掉一些狀況,卻降低了程式的可讀性。是我的話會在 smart pointer 裡面做掉。