「環境每天都或多或少在變化,如果我們不變通,終有一日會發現遠遠落後。如果在沒有轉變的情況下,處境突然變好了,那只是靠運氣,太被動。」
「主動改善最困難的地方,不是如何改善,而是你根本不認為有需要改善。」
「只要是為了變得更好,而不是為變而變,我們就應該踏出這一步,不應故步自封,否則,突破絕不會從天而降。」

Read More

  • Use others vimrc
    1
    vim -u ~/others.vimrc

markdown word-wrap

Line breaking, also known as word wrapping, is the process of breaking a section of text into lines such that it will fit in the available width of a page, window or other display area.

參考Writing Prose with Vim, vim-pencli
在用markdown寫blog時,常常一個段落洋洋灑灑很多字,超出螢幕寬度甚多,此時可以用word wrap的功能限定字元數, 其還分成soft-wrappedhard-wrapped

soft-wrapped中間行的結尾並不會有換行字元,只是在顯示上吻合指定的區域,而hard-wrapped則會在中間行存在換行字元,目前暫用vim-pencli做soft-wrapped。

目前暫時以vim-pencli解掉。

expandtab or noexpandtab

set tabstop=4 : 設定插入tab時用幾個space取代,例如本例是1個tab == 4 space
set expandtab : 把tab用指定數目的space取代
shiftwidth用來指定程式indent的space數。

以上設定完後,之後鍵入tab都會被4個space取代,但之前存在於文件中的tab並不會改變
set retab讓全文件apply新的tab設定。

有些文件如markdown,Makefile,需要tab才區別程式區段,可在vimrc中加入

1
autocmd FileType make\|markdown setlocal noexpandtab

Update cscope database

撰寫了一隻cscope_gen_database.sh去產生cscope database

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/env bash

DIR=( "./"
"/usr/include/i386-linux-gnu/sys/"
"/usr/include/i386-linux-gnu/bits/"
)

[ -e "cscope.files" ] && rm "cscope.files"

find /usr/include/ -maxdepth 1 -type f -name "*.[hc]" >> cscope.files

for d in "${DIR[@]}"; do

if [ -d "$d" ]; then
find $d -type f -name "*.[hc]" -o -name "*.cpp" >> cscope.files
fi

done

cscope -Rbq -i cscope.files

直接在vim中輸入 !cscope_gen_database src_root,src_root代表專案的根目錄。
接著輸入cs reset即完成。

Remove ‘^M’ symbol

有時用vim開啟文件,會在行尾看到^M符號,這是Windows(DOS)系統中的換行字元,可以下2種方法移除

  1. 字串取代: :%s/^M/\r/g (ctrl-v then ctrl-m才能打出^M)
  2. doc2unix指令
    ubuntu預設沒有安裝,需要安裝tofrodos package

    1
    sudo apt-get install tofrodos

    之後執行 todos xxx (即unix2doc xxx)
    若想轉回則 fromdos xxx (即doc2unix xxx)

修正文件中文亂碼問題

發現之前在windows編輯過得文件,在linux下會顯示亂碼,這是因為windows是以big5編碼,而linux是用utf-8,此問題可用iconv解決。
bash.alias中加入

1
Big5toUTF8 () { iconv -f big5 -t utf8 -c $1 -o $1; }

假設要轉換foo,直接輸入Big5toUTF8 foo即可。

常用vim regular expression

[vimregex] [vim 我最常用的 regular expression]

Character set:
character set
%s/(\+\s/(/: 會把左括號(後的空白清除,例如執行後( a會變成(a
%s/\s\+)/)/: 會把左括號)前的空白清除,例如執行後a )會變成a)

help

h pattern : 搜尋pattern相關的help文件
link : ctrl+]用來跳轉到quickref(follow the link),ctrl+T回到原本的topic。

2016 研究所放榜後,閒來無事想找個業界實習機會。
一開始填完 104 的基本資料後就收到許多面試邀請,只是都是房仲或是保險業。
和業界老師聊聊才發現,要找到好的工作機會需要一份正式且精練的簡歷 (CV),上網看了一下國外工程師的履歷後發現,他們的排版都特別精美,才知道Latex 這套排版程式,他除了可以被拿來寫論文外,也可用來寫 CV 唷。

Read More

*a : value of a
&a : address of a

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
26
27
28
29
30
31
32
33
34
35
36
37
#include <stdio.h>
#include <stdlib.h>


/* forward declaration */

typedef struct object Object;
typedef int (*func_t)(Object *);

struct object {
int a, b;
func_t add, sub;
};

static int add_impl(Object *self) { return self->a + self->b; }
static int sub_impl(Object *self) { return self->a - self->b; }


int init_object(Object **self)

{
if (NULL == (*self = malloc(sizeof(Object)))) return -1;
(*self)->a = 0; (*self)->b = 0;
(*self)->add = add_impl; (*self)->sub = sub_impl;

return 0;
}

int main(int argc, char *argv[])

{
Object *o = NULL;
init_object(&o);
o->a = 9922; o->b = 5566;
printf("add = %d, sub = %d\n", o->add(o), o->sub(o));
return 0;
}
  • size_t, pid_t, xxx_t: 代表有限制的,可計算的型態。
  • C語言中沒有真正的array
    ex:
    int arr[1];
    arr[-100] = 1; #合法操作

    [] 只是operator而已,subscript operator
    即 arr[N] = *(arr+N)

  • C function只有一種return value,其為純量,但該純量可以是pointer to function, or pointer to
    struct.
1
typedef int (*func_t)(Object *);

Stringfication and concatenation

考慮以下MACRO -object.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ifndef __RAY_OBJECTS_H
#define __RAY_OBJECTS_H

#define DECLARE_OBJECT(name) \
struct __##name##_node; \
typedef struct __##name##_node *name##_node; \
struct __##name##_node { \
name element; \
name##_node next; \
}; \
void append_##name(const name *X, name##_node *list); \
void delete_##name##_list(name##_node *list);

DECLARE_OBJECT(light)
DECLARE_OBJECT(rectangular)
DECLARE_OBJECT(sphere)

#undef DECLARE_OBJECT

#endif

lightDECLARE_OBJECT(light)中會取代name,故會產生以下

1
struct __light_node; typedef struct __light_node *light_node; struct __light_node { light element; light_node next; }; void append_light(const light *X, light_node *list); void delete_light_list(light_node *list);

故對object.c前處理後(gcc -E -P source.c)

1
2
3
struct __light_node; typedef struct __light_node *light_node; struct __light_node { light element; light_node next; }; void append_light(const light *X, light_node *list); void delete_light_list(light_node *list);
struct __rectangular_node; typedef struct __rectangular_node *rectangular_node; struct __rectangular_node { rectangular element; rectangular_node next; }; void append_rectangular(const rectangular *X, rectangular_node *list); void delete_rectangular_list(rectangular_node *list);
struct __sphere_node; typedef struct __sphere_node *sphere_node; struct __sphere_node { sphere element; sphere_node next; }; void append_sphere(const sphere *X, sphere_node *list); void delete_sphere_list(sphere_node *list);

作業(B)

目標

  • 補強給定程式的 swap()bubble_sort() 函式,並且研究如何用 GDB 進行自動測試
  • 實做 Merge sort,可參見 競技程式設計課程的解說,需要提供以下檔案:
    • merge.c: merge_sort() 函式的實做
    • test-merge.sh: 測試 merge_sort() 函式的 GDB script
    • data-merge.in: 用來測試的輸入資料,原則上與 data-bubble.in 相仿
  • 將你學習 GDB 的過程、指出原本程式不足之處 (程式碼寫出來就是給你改進的,可不是給你背誦用!)、如何修正和強化程式

swap()

swap.c本身沒有main function