• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            chaosuper85

            C++博客 首頁 新隨筆 聯系 聚合 管理
              118 Posts :: 0 Stories :: 3 Comments :: 0 Trackbacks

            2011年6月18日 #

            ubuntu下vim語法著色和縮排問題的解決 2011-03-07 09:26 轉載自 javatown 最終編輯 javatown 版本號:2008.07.30 關鍵字:linux ubuntu vim vi 語法著色 語法高亮 縮進 縮排 本文的主要目的是討論記錄ubuntu下vim語法著色和縮排的方法 1。前提 安裝vim sudo apt-get install vim-full 之后,在/etc/vim下會發現vimrc這個文件這個是公共配置文件,修改它一般會對所有的ubuntu用戶產生效果。 2。語法著色 要讓語法高亮顯示,可以用如下辦法: 方法一: 去掉/etc/vim下vimrc中syntax on一句前面的注釋符號來開啟 方法二: 如果方法一失效可以編輯/etc下的profile文件,添加 export TERM=xterm-color 方法三: 拷貝語法著色示例文件 cp /usr/share/vim/vimcurrent/vimrc_example.vim ~/.vimrc 方法四: 在vim中輸入:syntax on來開啟語法著色 方法五: 直接編輯~/.vimrc文件,如果沒有就自己建立一個 然后把下面內容加入 set autoindent set cindent set modeline set ruler set showcmd set showfulltag set showmode set smartcase set smartindent set imcmdline set previewwindow set hlsearch syntax on 一些配色方案,來自互聯網,直接添加在vimrc文件末尾即可: colorscheme elflord "colorscheme darkblue "colorscheme evening "colorscheme murphy "colorscheme torte "colorscheme desert 3。縮進 以下內容來自互聯網 1)設置(軟)制表符寬度為4: set tabstop=4 set softtabstop=4 2)設置縮進的空格數為4 set shiftwidth=4 3)設置自動縮進:即每行的縮進值與上一行相等;使用 noautoindent 取消設置: set autoindent 4)設置使用 C/C++ 語言的自動縮進方式: set cindent 5)設置C/C++語言的具體縮進方式: set cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,>1s,=1s,:1s 6)如果想在左側顯示文本的行號,可以用以下語句: set nu 7)最后,如果沒有下列語句,就加上吧: if &term=="xterm" set t_Co=8 set t_Sb=^[[4%dm set t_Sf=^[[3%dm endif
            posted @ 2011-06-18 07:25 chaosuper 閱讀(1075) | 評論 (0)編輯 收藏

            2011年6月16日 #

            1)文件操作 vi FileName 打開文件 FileName,并將光標置于第一行首。 vi +n FileName 打開文件 FileName,并將光標置于第 n 行首。 vi + FileName 打開文件 FileName,并將光標置于最后一行。 vi + /pattern File 打開文件 File,并將光標置于其中第一個于 pattern 匹配的字符串處。 vi –r FileName 在上次正用 vi 編輯 FileName 發生系統崩潰后,恢復FileName。 vi File1 … Filen 打開多個文件,依次對之進行編輯。 :%!xxd 按十六進制查看當前文件 :%!xxd -r 從十六進制返回正常模式 :n1,n2 co n3 將 n1 行到 n2 行之間的內容拷貝到第 n3 行下。 :n1,n2 m m3 將 n1 行到 n2 行之間的內容移至第 n3 行下。 :n1,n2 d 將 n1 行到 n2 行之間的內容刪除。 :n1,n2 w filename 將 n1 行到 n2 行之間的內容保存到文件 filename 中 :n1,n2 w! Command 將文件中n1行到n2行的內容作為 Command的輸入并執行之, 若不指定 n1、n2,則將整個文件內容作為 Command 的輸入。 :r! Command 將命令 Command 的輸出結果放到當前行。 :nr 文件> 把文件>插入到第n行 :so 文件> 讀取文件>,再執行文件里面的命令(文件中的命令應該都是一些ex命令) :l1,l2w 文件> 把第l1和第l2行之間的文本寫到文件>中去 :w >> 文件> 添加到文件>末尾. 也可以使用行號 :e! 重新編輯當前文件,忽略所有的修改 ·(、[、、]、)對應顯示 % 顯示當前(、[、{ 、}、] 、)的對應項 ) :光標移至句尾 ( :光標移至句首 }:光標移至段落開頭 {:光標移至段落結尾 ·(、[、、]、)內數據選擇 daB 刪除{}及其內的內容 (在非v可視模式下) diB 刪除{}中的內容 ab 選擇()中的內容 ib 選擇()中的內容( 不含() ) aB 選擇{}中的內容 iB 選擇{}中的內容( 不含{} ) ·語法提示與自動補齊 ★ 插入模式下的單詞自動完成 ★ 行自動完成(超級有用) ·設置ctags #ctags -f /usr/share/vim/vim63/funcs.tags -R /opt/j2sdk/src /usr/src/kernels/2.6.9-5.EL-i686 ^p 自動補齊上下文已有相近項 ^n 自動補齊~/.tags中的相近函數 ^[ 顯示~/.tags中的光標下的函數的原型, 按^t退出函數 :pta 函數名 預覽窗口快速打開相應函數所在文件,并將光標定位在對應函數的開頭 K 顯示光標下的C函數的man說明手冊 ·變量定位 gd 轉到光標下局部變量的定義處 Gd 轉到光標下全局變量的定義處 ·編譯選項 :cn 命令會把你帶到下一個出錯地點,而不考慮它在什么文件里。 :cc 命令會向你顯示當前錯誤的編譯器輸出信息; :cl 會生成一個列有項目所有錯誤的列表,以供瀏覽這些錯誤 3]光標移動 ·字符 h 光標左移一個字符。 l 光標右移一個字符。 ·字 w 或 W 光標右移一個字至字首。 B 或 b 光標左移一個字至字首。 E 或 e 光標右移一個字至字尾。 ·句} 光標移至句尾。 ( 光標移至句首。 ·段) 光標移至段落開頭。 { 光標移至段落結尾。 ·行k 或 Ctrl+p 光標上移一行。 j 或 Ctrl+n 光標下移一行。 Enter 光標下移一行。 nG 光標移至第 n 行首。 n+ 光標下移 n 行。 n- 光標上移 n 行。 n$ 光標移至第 n 行尾。 0 光標移至當前行首。 $ 光標移至當前行尾。 ·屏幕 H 光標移至屏幕頂行。 M 光標移至屏幕中間行。 L 光標移至屏幕最后行。 Ctrl+u 向文件首翻半屏。 Ctrl+d 向文件尾翻半屏。 Ctrl+f 向文件尾翻一屏。 Ctrl+b 向文件首翻一屏。 nz 將第 n 行滾至屏幕頂部。不指定 n 時將當前行滾至屏幕頂。 4}插入 # 在文件中插入行號(不是顯示行號,是插入!) ★:g/^/exec "s/^/".strpart(line(".")." ", 0, 4) ·光標 i 在光標前插入。 a 在光標后插入。 ·行 I 在當前行首插入。 A 在當前行尾插入。 o 在當前行之下一新行插入。 O 在當前行之上新開一行插入。 5)替換 r 替換當前字符。 R 替換當前字符及其后的字符,直至按 ESC 鍵。 s 從當前光標位置處開始,以輸入的文本代替指定數目的字符。 S 刪除指定數目的行,并以所輸入的文本代替。 6)修改 ncw 或 nCW 修改指定數目的字符。 nCC 修改指定數目的行。 :r filename 將文件 filename 插入在當前行之下 7)查找替換 / 把狹義單詞 寫到 搜索命令行 / 把廣義單詞 寫到 搜索命令行 :g/str/s/str1/str2/g 第一個g表示對每一個包括s1的行都進行替換, 第二個g表示對每一行的所有進行替換 包括str的行所有的str1都用str2替換 :%s/f $/for$/g 將每一行尾部的“f ”(f鍵和空格鍵)替換為for :%s/^/mv /g 在每一行的頭部添加“mv ”(mv鍵和空格鍵) :s/fred/a/g 替換fred成register a中的內容,呵呵 :g/顯示含或的行 # 替換一個visual區域 # 選擇一個區域,然后輸入 :s/Emacs/Vim/ 等等,vim會自動進入:模式 :'s/Emacs/Vim/g 前面的'是vim自動添加的 # 在多個文檔中搜索 :bufdo /searchstr :argdo /searchstr 復制與剪切 xp 交換前后兩個字符的位置 ddp 上下兩行的位置交換 :g/fred/t$ 拷貝行,從fred到文件末尾(EOF) 9)窗口操作 :vne [filename] :sp [filename] :S [filename] :new [filename] :^w + ^r 交換兩個窗口的位置 ^w = 窗口等寬 :res -n 窗口高度減小n :res +n 窗口高度增大n :vert res -n :vert res +n 10)DOS格式文本轉成Unix格式文本 :1,$s/^M//g 11)書簽 在閱讀和編寫大的程序文件時,利用標記(書簽)功能定位是十分有幫助的。 將光標移到想做標記的位置。假如做一個名為“debug1”的標記,那么用戶可在命令模式下輸入做標記的命令“mdebug1”,然后敲入回車鍵,一個名為“debug1”的標記就做好了。 接下來用戶可以隨意將光標移到其它的位置,當在命令模式下輸入“`debug1”后,就能快速回到“debug1”的標記所在行的行首。 馨竹 2007-12-24 19:13 12)刪除操作 :%s/r//g 刪除DOS方式的回車^M :%s= *$== 刪除行尾空白 :%s/^(.*)n1/1$/ 刪除重復行 :%s/^.pdf/new.pdf/ 只是刪除第一個pdf :%s/// 又是刪除多行注釋(咦?為什么要說「又」呢?) :g/^s*$/d 刪除所有空行 :g!/^dd/d 刪除不含字符串'dd'的行 :v/^dd/d 同上 (譯釋:v == g!,就是不匹配!) :g/str1/,/str2/d 刪除所有第一個含str1到第一個含str2之間的行 :v/./.,/./-1join 壓縮空行 :g/^$/,/./-j 壓縮空行 :s/p1/p2/g:將當前行中所有p1均用p2替代 :n1,n2s/p1/p2/g:將第n1至n2行中所有p1均用p2替代 :g/p1/s//p2/g:將文件中所有p1均用p2替換 ndw 或 ndW 刪除光標處開始及其后的 n-1 個字符。 d0 刪至行首。 d$ 刪至行尾。 ndd 刪除當前行及其后 n-1 行。 x 或 X 刪除一個字符。 Ctrl+u 刪除輸入方式下所輸入的文本。 ^R 恢復u的操作 J 把下一行合并到當前行尾 V 選擇一行 ^V 按下^V后即可進行矩形的選擇了 aw 選擇單詞 iw 內部單詞(無空格) as 選擇句子 is 選擇句子(無空格) ap 選擇段落 ip 選擇段落(無空格) D 刪除到行尾 x,y 刪除與復制包含高亮區 dl 刪除當前字符(與x命令功能相同) d0 刪除到某一行的開始位置 d^ 刪除到某一行的第一個字符位置(不包括空格或TAB字符) dw 刪除到某個單詞的結尾位置 d3w 刪除到第三個單詞的結尾位置 db 刪除到某個單詞的開始位置 dW 刪除到某個以空格作為分隔符的單詞的結尾位置 dB 刪除到某個以空格作為分隔符的單詞的開始位置 d7B 刪除到前面7個以空格作為分隔符的單詞的開始位置 d) 刪除到某個語句的結尾位置 d4) 刪除到第四個語句的結尾位置 d( 刪除到某個語句的開始位置 d) 刪除到某個段落的結尾位置 d{ 刪除到某個段落的開始位置 d7{ 刪除到當前段落起始位置之前的第7個段落位置 dd 刪除當前行 d/text 刪除從文本中出現“text”中所指定字樣的位置, 一直向前直到下一個該字樣所出現的位置(但不包括該字樣)之間的內容 dfc 刪除從文本中出現字符“c”的位置,一直向前直到下一個該字符所出現的位置(包括該字符)之間的內容 dtc 刪除當前行直到下一個字符“c”所出現位置之間的內容 D 刪除到某一行的結尾 d$ 刪除到某一行的結尾 5dd 刪除從當前行所開始的5行內容 dL 刪除直到屏幕上最后一行的內容 dH 刪除直到屏幕上第一行的內容 dG 刪除直到工作緩存區結尾的內容 d1G 刪除直到工作緩存區開始的內容 修改命令操作 r 更改當前字符 cw 修改到某個單詞的結尾位置 c3w 修改到第三個單詞的結尾位置 cb 修改到某個單詞的開始位置 cW 修改到某個以空格作為分隔符的單詞的結尾位置 cB 修改到某個以空格作為分隔符的單詞的開始位置 c7B 修改到前面7個以空格作為分隔符的單詞的開始位置 c0 修改到某行的結尾位置 c} 修改到某個語句的結尾位置 c4} 修改到第四個語句的結尾位置 c( 修改到某個語句的開始位置 c) 修改到某個段落的結尾位置 c{ 修改到某個段落的開始位置 c7{ 修改到當前段落起始位置之前的第7個段落位置 ctc 修改當前行直到下一個字符c所出現位置之間的內容 C 修改到某一行的結尾 cc 修改當前行 5cc 修改從當前行所開始的5行內容 . 重復上一次修改! 13}Set 選項設置 set all 列出所有選項設置情況。 set term 設置終端類型。 set ignorecase 在搜索中忽略大小寫。 set list 顯示制表位(^I)和行尾標志($)。 set number 顯示行號。 set showmode 示用戶處在什么模式下 set report 顯示由面向行的命令修改國的行數目。 set terse 顯示簡短的警告信息。 set warn 在轉到別的文件時,若沒有保存當前文件則顯示 No write 信息。 set autowrite 在“:n”和“:!”命令之前都自動保存文件 set nomagic 允許在搜索模式中,使用前面不帶\的特殊字符。 set nowrapscan 禁止 vi 在搜索到達文件兩端時,又從另一端開始。 set mesg 允許 vi 顯示其他用戶用 write 寫到自己終端上的信息。 autoindent (ai) noai 使新行自動縮進,和上(下)行的位置對齊 autoprint (ap) ap 每條命令之后都顯示出修改之處 autowrite (aw) noaw 在:n,:!命令之前都自動保存文件 beautify (bf) nobf 在輸入的時候忽略所有的控制字符(除了制表鍵(tab),換行(newline),進紙(formfeed)) directory= (dir=) /tmp 存放緩沖區的目錄名 edcompatible noedcompatible 在替換的時候使用類ed的用法 errorbells (eb) errorbells 出錯的時候響鈴 exrc (ex) noexrc 允許在主目錄(home)外面之外放.exrc文件 hardtabs= (ht=) 8 設置硬制表的邊界 ignore case (ic) noic 正規式里忽略大小寫 lisp nolisp 打開lisp模式 list nolist 顯示所有的制表鍵和行的結尾 magic agic 可以使用更多的正規表達式 mesg mesg 允許向終端發送消息 number (nu) nonumber 顯示行號 open open 允許開放和可視化 optimize (opt) optimize 優化吞吐量,打印時不發回車 paragraphs= (para=) IPLPPPQPPLIbp 設置{ & }的分界符 prompt prompt 命令模式下的輸入給出:的提示符 readonly (ro) noro 除非用!號否則不準保存文件 redraw noredraw 當編輯的時候重繪屏幕 remap remap 允許宏指向其他的宏 report= 5 如果影響的行數>這個數的話就報告 scroll 1/2 window 下卷屏幕時滾動屏幕的數目, 同樣這也是z命令輸出的行數(z 輸出2倍滾屏的大小) sections= SHNHH HU 定義節的末尾(當使用命令[[ 和 ]] 時) shell= (sh=) /bin/sh 缺省的SHELL,如果設置了環境變量SHELL的話,就使用變量 shiftwidth= (sw=) 8 當使用移動(shift)命令時移動的字符數 showmatch (sm) nosm 顯示{, }, (, ), [, 或者 ] 的匹配情況 showmode noshowmode 顯示你處在什么模式下面 slowopen (slow) 插入之后不要立刻更新顯示 tabstop= (ts=) 8 設置制表停止位(tabstop)的長度 taglength= (tl=) 0 重要標記的字符個數(0表示所有的字符) tags= tag, /usr/lib/tags 定義包含標記的文件路徑 term= 設置終端類型 terse noterse 顯示簡短的錯誤信息 timeout (to) timeout 一秒鐘后鍵盤映射超時 ttytype= 設置終端類型 warn warn 顯示"No write since last change"信息 window= (w=) 可視模式下窗口的行數 wrapmargin= (wm=) 0 右邊距,大于0的話最右邊的單詞將折行,留出n個空白位置 wrapscan (ws) ws 查找到文件尾后再重頭開始 writeany (wa) nowa 可以保存到任意一個文件去 14}特殊字符 ^ 匹配字符串位于行首。 $ 匹配字符串位于行尾。 . 用在模式串中,表示任何單個字符。 在命令模式下,重復上次的命令。 * 在模式串中,表示其前字符可出現任意多次。 [] 用在模式串中,表示指定方位內字符,其中可用-表示一個字 符范圍,用^表示不在某個范圍內的字符。 ESC 從插入狀態轉換到命令狀態 ^[ 功能同 ESC 15]大小寫轉換 guu 行小寫 gUU 行大寫 g~~ 行翻轉(當然指大小寫啦) guw 字小寫(狹義字) 譯注:建議對比iw gUw 字大寫(狹義字) g~w 字翻轉(狹義字) vEU 字大寫(廣義字) vE~ 字翻轉(廣義字) ggguG 把整個文章全部小寫(ft!bt!) 16) 跳轉足跡'. 跳到最后修改的那一行 (超級有用)(ft,怎么又是這個評價) `. 不僅跳到最后修改的那一行,還要定位到修改點 依次沿著你的跳轉記錄向回跳 (從最近的一次開始) 依次沿著你的跳轉記錄向前跳 :ju(mps) 列出你跳轉的足跡 17)命令歷史 :history 列出歷史命令記錄 :his c 命令行命令歷史 :his s 搜索命令歷史 q/ 搜索命令歷史的窗口 q 命令行命令歷史的窗口 : 歷史命令記錄的窗口 18]寄存器 # 列出寄存器(Registers) :reg 顯示所有當前的registers "1p 表示引用register,1表示一個名字叫做1的register,p就是粘貼(paste)命令 譯釋: "也用來定義register 先輸入 ",表示定義register 然后輸入名字,如0~9,a~z 然后執行刪除或復制命令,如dd或y, 或者是visual模式下的d(刪除選中的部分)或y(復制選中的部分) 則被刪除或復制的部分就被存入了這個命名的register 觀察:一個特殊的register, "" ,里面存儲了一個匿名的刪除/復制 在你執行dd或y的時候,被作用的部分被存到了""中 19}命令行 "ayy@a 把當前行作為一個Vim命令來執行 譯釋:"ayy 是定義當前行到register a,然后@a是執行register a中存儲的指令 10yy copy 當前行以下10行 11} 排序 :%!sort -u 使用sort程序排序整個文件(用結果重寫文件) !1) sort -u 排序當前段落 (只能在normal模式下使用!!) :.,+5!sort 排序當前行及以下5行 20) 列操作 :%s= [^ ]+$=&&= 復制最后一列 :%s= f+$=&&= 一樣的功能 :%s= S+$=&& ft,還是一樣 :s/(.*).*)/2"1/ 顛倒用:分割的兩個字段 :%s(w+s+))str1:1str2: 處理列,替換所有在第三列中的str1 :%sw+)(.*s+)(w+)$:321: 交換第一列和最后一列 (共4列) ·.vimrc " Use Vim settings, rather then Vi settings (much better!). set nocompatible "c風格的縮進 :set expandtab "不使用tab只使用空格 :set cindent shiftwidth=4 "自動縮進 :set ai "語法 ":set filetype=java :set syntax=java "鍵入)、] 、},顯示(、[、{ :set showmatch "手工定義折疊 :set foldmethod=manual "標簽文件位置 set tags=/usr/share/vim/vim63/funcs.tags "在插入模式下通過按[Ctrl]N自動地將任何類、方法或者字段名補齊 set complete+=k " 不要用聲音煩我! set visualbell "歷史 :set history=50 "顯示行列位置 :set ruler "設置字符編碼 set fileencodings=gb2312 "set encoding=euc-cn "設置ruler set ruler "顯示當前命令 set showcmd "incsearch set incsearch " allow backspacing over everything in insert mode set backspace=indent,eol,start "自動檢測文件類型 :filetype on
            posted @ 2011-06-16 07:58 chaosuper 閱讀(240) | 評論 (0)編輯 收藏

            2011年6月15日 #

            CSDN博客地址 http://blog.csdn.net/v_JULY_v/archive/2011/06/14/6543438.aspx http://blog.csdn.net/v_JULY_v
            posted @ 2011-06-15 22:19 chaosuper 閱讀(167) | 評論 (0)編輯 收藏

            2011年6月12日 #

            內核導航 http://oss.org.cn/kernel-book/ch01/1.5.3.htm 源代碼導航器 http://lxr.linux.no/linux+v2.6.39/net/ipv4/
            posted @ 2011-06-12 22:33 chaosuper 閱讀(137) | 評論 (0)編輯 收藏

            2011年6月11日 #

            http://book.51cto.com/art/201104/253696.htm
            posted @ 2011-06-11 17:21 chaosuper 閱讀(177) | 評論 (0)編輯 收藏

            2011年5月9日 #

            作為Linux下的程序開發人員,大家一定都遇到過Makefile,用make命令來編譯自己寫的程序確實是很方便。一般情況下,大家都是手工寫一個簡單Makefile,如果要想寫出一個符合自由軟件慣例的Makefile就不那么容易了。   在本文中,將給大家介紹如何使用autoconf和automake兩個工具來幫助我們自動地生成符合自由軟件慣例的Makefile,這樣就可以象常見的GNU程序一樣,只要使用“./configure”,“make”,“make instal”就可以把程序安裝到Linux系統中去了。這將特別適合想做開放源代碼軟件的程序開發人員,又或如果你只是自己寫些小的Toy程序,那么這個文章對你也會有很大的幫助。   一、Makefile介紹   Makefile是用于自動編譯和鏈接的,一個工程有很多文件組成,每一個文件的改變都會導致工程的重新鏈接,但是不是所有的文件都需要重新編譯,Makefile中紀錄有文件的信息,在make時會決定在鏈接的時候需要重新編譯哪些文件。   Makefile的宗旨就是:讓編譯器知道要編譯一個文件需要依賴其他的哪些文件。當那些依賴文件有了改變,編譯器會自動的發現最終的生成文件已經過時,而重新編譯相應的模塊。   Makefile的基本結構不是很復雜,但當一個程序開發人員開始寫Makefile時,經常會懷疑自己寫的是否符合慣例,而且自己寫的Makefile經常和自己的開發環境相關聯,當系統環境變量或路徑發生了變化后,Makefile可能還要跟著修改。這樣就造成了手工書寫Makefile的諸多問題,automake恰好能很好地幫助我們解決這些問題。   使用automake,程序開發人員只需要寫一些簡單的含有預定義宏的文件,由autoconf根據一個宏文件生成configure,由automake根據另一個宏文件生成Makefile.in,再使用configure依據Makefile.in來生成一個符合慣例的Makefile。下面我們將詳細介紹Makefile的automake生成方法。   二、使用的環境  本文所提到的程序是基于Linux發行版本:Fedora Core release 1,它包含了我們要用到的autoconf,automake。   三、從helloworld入手   我們從大家最常使用的例子程序helloworld開始。   下面的過程如果簡單地說來就是:   新建三個文件:    helloworld.c    configure.in    Makefile.am   然后執行: aclocal; autoconf; automake --add-missing; ./configure; make; ./helloworld   就可以看到Makefile被產生出來,而且可以將helloworld.c編譯通過。   很簡單吧,幾條命令就可以做出一個符合慣例的Makefile,感覺如何呀。   現在開始介紹詳細的過程:   1、建目錄   在你的工作目錄下建一個helloworld目錄,我們用它來存放helloworld程序及相關文件,如在/home/my/build下: $ mkdir helloword $ cd helloworld   2、 helloworld.c   然后用你自己最喜歡的編輯器寫一個hellowrold.c文件,如命令:vi helloworld.c。使用下面的代碼作為helloworld.c的內容。 int main(int argc, char** argv) { printf("Hello, Linux World!\n"); return 0; }   完成后保存退出。   現在在helloworld目錄下就應該有一個你自己寫的helloworld.c了。   3、生成configure   我們使用autoscan命令來幫助我們根據目錄下的源代碼生成一個configure.in的模板文件。   命令: $ autoscan $ ls configure.scan helloworld.c   執行后在hellowrold目錄下會生成一個文件:configure.scan,我們可以拿它作為configure.in的藍本。   現在將configure.scan改名為configure.in,并且編輯它,按下面的內容修改,去掉無關的語句: ============================configure.in內容開始========================================= # -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_INIT(helloworld.c) AM_INIT_AUTOMAKE(helloworld, 1.0) # Checks for programs. AC_PROG_CC # Checks for libraries. # Checks for header files. # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. AC_OUTPUT(Makefile) ============================configure.in內容結束=========================================   然后執行命令aclocal和autoconf,分別會產生aclocal.m4及configure兩個文件: $ aclocal $ls aclocal.m4 configure.in helloworld.c $ autoconf $ ls aclocal.m4 autom4te.cache configure configure.in helloworld.c   大家可以看到configure.in內容是一些宏定義,這些宏經autoconf處理后會變成檢查系統特性、環境變量、軟件必須的參數的shell腳本。   autoconf 是用來生成自動配置軟件源代碼腳本(configure)的工具。configure腳本能獨立于autoconf運行,且在運行的過程中,不需要用戶的干預。   要生成configure文件,你必須告訴autoconf如何找到你所用的宏。方式是使用aclocal程序來生成你的aclocal.m4。   aclocal根據configure.in文件的內容,自動生成aclocal.m4文件。aclocal是一個perl 腳本程序,它的定義是:“aclocal - create aclocal.m4 by scanning configure.ac”。   autoconf從configure.in這個列舉編譯軟件時所需要各種參數的模板文件中創建configure。   autoconf需要GNU m4宏處理器來處理aclocal.m4,生成configure腳本。   m4是一個宏處理器。將輸入拷貝到輸出,同時將宏展開。宏可以是內嵌的,也可以是用戶定義的。除了可以展開宏,m4還有一些內建的函數,用來引用文件,執行命令,整數運算,文本操作,循環等。m4既可以作為編譯器的前端,也可以單獨作為一個宏處理器。 4、新建Makefile.am   新建Makefile.am文件,命令: $ vi Makefile.am   內容如下: AUTOMAKE_OPTIONS=foreign bin_PROGRAMS=helloworld helloworld_SOURCES=helloworld.c   automake會根據你寫的Makefile.am來自動生成Makefile.in。   Makefile.am中定義的宏和目標,會指導automake生成指定的代碼。例如,宏bin_PROGRAMS將導致編譯和連接的目標被生成。   5、運行automake   命令: $ automake --add-missing configure.in: installing `./install-sh' configure.in: installing `./mkinstalldirs' configure.in: installing `./missing' Makefile.am: installing `./depcomp'   automake會根據Makefile.am文件產生一些文件,包含最重要的Makefile.in。   6、執行configure生成Makefile $ ./configure checking for a BSD-compatible install... /usr/bin/install -c checking whether build environment is sane... yes checking for gawk... gawk checking whether make sets $(MAKE)... yes checking for gcc... gcc checking for C compiler default output... a.out checking whether the C compiler works... yes checking whether we are cross compiling... no checking for suffix of executables... checking for suffix of object files... o checking whether we are using the GNU C compiler... yes checking whether gcc accepts -g... yes checking for gcc option to accept ANSI C... none needed checking for style of include used by make... GNU checking dependency style of gcc... gcc3 configure: creating ./config.status config.status: creating Makefile config.status: executing depfiles commands $ ls -l Makefile -rw-rw-r-- 1 yutao yutao 15035 Oct 15 10:40 Makefile   你可以看到,此時Makefile已經產生出來了。   7、使用Makefile編譯代碼 $ make if gcc -DPACKAGE_NAME="" -DPACKAGE_TARNAME="" -DPACKAGE_VERSION="" - DPACKAGE_STRING="" -DPACKAGE_BUGREPORT="" -DPACKAGE="helloworld" -DVERSION="1.0" -I. -I. -g -O2 -MT helloworld.o -MD -MP -MF ".deps/helloworld.Tpo" \ -c -o helloworld.o `test -f 'helloworld.c' || echo './'`helloworld.c; \ then mv -f ".deps/helloworld.Tpo" ".deps/helloworld.Po"; \ else rm -f ".deps/helloworld.Tpo"; exit 1; \ fi gcc -g -O2 -o helloworld helloworld.o   運行helloworld $ ./helloworld Hello, Linux World!   這樣helloworld就編譯出來了,你如果按上面的步驟來做的話,應該也會很容易地編譯出正確的helloworld文件。你還可以試著使用一些其他的make命令,如make clean,make install,make dist,看看它們會給你什么樣的效果。感覺如何?自己也能寫出這么專業的Makefile,老板一定會對你刮目相看。 四、深入淺出   針對上面提到的各個命令,我們再做些詳細的介紹。   1、 autoscan   autoscan是用來掃描源代碼目錄生成configure.scan文件的。autoscan可以用目錄名做為參數,但如果你不使用參數的話,那么autoscan將認為使用的是當前目錄。autoscan將掃描你所指定目錄中的源文件,并創建configure.scan文件。   2、 configure.scan   configure.scan包含了系統配置的基本選項,里面都是一些宏定義。我們需要將它改名為configure.in   3、 aclocal   aclocal是一個perl 腳本程序。aclocal根據configure.in文件的內容,自動生成aclocal.m4文件。aclocal的定義是:“aclocal - create aclocal.m4 by scanning configure.ac”。   4、 autoconf   autoconf是用來產生configure文件的。configure是一個腳本,它能設置源程序來適應各種不同的操作系統平臺,并且根據不同的系統來產生合適的Makefile,從而可以使你的源代碼能在不同的操作系統平臺上被編譯出來。   configure.in文件的內容是一些宏,這些宏經過autoconf 處理后會變成檢查系統特性、環境變量、軟件必須的參數的shell腳本。configure.in文件中的宏的順序并沒有規定,但是你必須在所有宏的最前面和最后面分別加上AC_INIT宏和AC_OUTPUT宏。   在configure.ini中:   #號表示注釋,這個宏后面的內容將被忽略。   AC_INIT(FILE)   這個宏用來檢查源代碼所在的路徑。 AM_INIT_AUTOMAKE(PACKAGE, VERSION)    這個宏是必須的,它描述了我們將要生成的軟件包的名字及其版本號:PACKAGE是軟件包的名字,VERSION是版本號。當你使用make dist命令時,它會給你生成一個類似helloworld-1.0.tar.gz的軟件發行包,其中就有對應的軟件包的名字和版本號。 AC_PROG_CC   這個宏將檢查系統所用的C編譯器。 AC_OUTPUT(FILE)   這個宏是我們要輸出的Makefile的名字。   我們在使用automake時,實際上還需要用到其他的一些宏,但我們可以用aclocal 來幫我們自動產生。執行aclocal后我們會得到aclocal.m4文件。   產生了configure.in和aclocal.m4 兩個宏文件后,我們就可以使用autoconf來產生configure文件了。   5、 Makefile.am   Makefile.am是用來生成Makefile.in的,需要你手工書寫。Makefile.am中定義了一些內容: AUTOMAKE_OPTIONS   這個是automake的選項。在執行automake時,它會檢查目錄下是否存在標準GNU軟件包中應具備的各種文件,例如AUTHORS、ChangeLog、NEWS等文件。我們將其設置成foreign時,automake會改用一般軟件包的標準來檢查。 bin_PROGRAMS   這個是指定我們所要產生的可執行文件的文件名。如果你要產生多個可執行文件,那么在各個名字間用空格隔開。 helloworld_SOURCES   這個是指定產生“helloworld”時所需要的源代碼。如果它用到了多個源文件,那么請使用空格符號將它們隔開。比如需要helloworld.h,helloworld.c那么請寫成helloworld_SOURCES= helloworld.h helloworld.c。   如果你在bin_PROGRAMS定義了多個可執行文件,則對應每個可執行文件都要定義相對的filename_SOURCES。   6、 automake   我們使用automake --add-missing來產生Makefile.in。   選項--add-missing的定義是“add missing standard files to package”,它會讓automake加入一個標準的軟件包所必須的一些文件。   我們用automake產生出來的Makefile.in文件是符合GNU Makefile慣例的,接下來我們只要執行configure這個shell 腳本就可以產生合適的 Makefile 文件了。   7、 Makefile   在符合GNU Makefiel慣例的Makefile中,包含了一些基本的預先定義的操作: make   根據Makefile編譯源代碼,連接,生成目標文件,可執行文件。 make clean   清除上次的make命令所產生的object文件(后綴為“.o”的文件)及可執行文件。 make install   將編譯成功的可執行文件安裝到系統目錄中,一般為/usr/local/bin目錄。 make dist   產生發布軟件包文件(即distribution package)。這個命令將會將可執行文件及相關文件打包成一個tar.gz壓縮的文件用來作為發布軟件的軟件包。   它會在當前目錄下生成一個名字類似“PACKAGE-VERSION.tar.gz”的文件。PACKAGE和VERSION,是我們在configure.in中定義的AM_INIT_AUTOMAKE(PACKAGE, VERSION)。 make distcheck   生成發布軟件包并對其進行測試檢查,以確定發布包的正確性。這個操作將自動把壓縮包文件解開,然后執行configure命令,并且執行make,來確認編譯不出現錯誤,最后提示你軟件包已經準備好,可以發布了。 =============================================== helloworld-1.0.tar.gz is ready for distribution =============================================== make distclean   類似make clean,但同時也將configure生成的文件全部刪除掉,包括Makefile。   五、結束語   通過上面的介紹,你應該可以很容易地生成一個你自己的符合GNU慣例的Makefile文件及對應的項目文件。   如果你想寫出更復雜的且符合慣例的Makefile,你可以參考一些開放代碼的項目中的configure.in和Makefile.am文件,比如:嵌入式數據庫sqlite,單元測試cppunit。
            posted @ 2011-05-09 11:19 chaosuper 閱讀(379) | 評論 (0)編輯 收藏

            2011年5月8日 #

            http://blog.csdn.net/hecant/archive/2007/12/19/1954144.aspx
            posted @ 2011-05-08 11:17 chaosuper 閱讀(531) | 評論 (0)編輯 收藏

            2010年7月8日 #

            要獲得另一窗體視圖類中的某控件指針,首先獲得視圖指針是難點,獲的視圖指針再用GetDlgItem函數就容易可以獲得控件指針 獲得各種視圖指針如下 1) 在View中獲得Doc指針 2) 在App中獲得MainFrame指針 3) 在View中獲得MainFrame指針 4) 獲得View(已建立)指針 5) 獲得當前文檔指針 6) 獲得狀態欄與工具欄指針 7) 獲得狀態欄與工具欄變量 8) 在Mainframe獲得菜單指針 9) 在任何類中獲得應用程序類 10) 從文檔類取得視圖類的指針(1) 11) 在App中獲得文檔模板指針 12) 從文檔模板獲得文檔類指針 13) 在文檔類中獲得文檔模板指針 14) 從文檔類取得視圖類的指針(2) 15) 從一個視圖類取得另一視圖類的指針 16)獲取分割視圖中各個視圖的指針 VC中編程對于剛剛開始學習的同學,最大的障礙和問題就是消息機制和指針獲取與操作。其實這些內容基本上是每本VC學習工具書上必講的內容,而且通過MSDN很多問題都能解決。 下面文字主要是個人在編程中指針使用的一些體會,說的不當的地方請指正。 一般我們使用的框架是VC提供的Wizard生成的MFC App Wizard(exe)框架,無論是多文檔還是單文檔,都存在指針獲取和操作問題。 下面這節內容主要是一般的框架,然后再講多線程中的指針使用。使用到的類需要包含響應的頭文件。首先一般獲得本類(視,文檔,對話框都支持)實例指針this,用this的目的,主要可以通過類中的函數向其他類或者函數中發指針,以便于在非本類中操作和使用本類中的功能。 1) 在View中獲得Doc指針 CYouSDIDoc *pDoc=GetDocument();一個視只能有一個文檔。 2) 在App中獲得MainFrame指針 CWinApp 中的 m_pMainWnd變量就是MainFrame的指針 也可以: CMainFrame *pMain =(CMainFrame *)AfxGetMainWnd(); 3) 在View中獲得MainFrame指針 CMainFrame *pMain=(CmaimFrame *)AfxGetApp()->m_pMainWnd; 4) 獲得View(已建立)指針 CMainFrame *pMain=(CmaimFrame *)AfxGetApp()->m_pMainWnd; CyouView *pView=(CyouView *)pMain->GetActiveView(); 5) 獲得當前文檔指針 CDocument * pCurrentDoc =(CFrameWnd *)m_pMainWnd->GetActiveDocument(); 6) 獲得狀態欄與工具欄指針 CStatusBar * pStatusBar=(CStatusBar *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_STATUS_BAR); CToolBar * pToolBar=(CtoolBar *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_TOOLBAR); 7) 如果框架中加入工具欄和狀態欄變量還可以這樣 (CMainFrame *)GetParent()->m_wndToolBar; (CMainFrame *)GetParent()->m_wndStatusBar; 8) 在Mainframe獲得菜單指針 CMenu *pMenu=m_pMainWnd->GetMenu(); 9) 在任何類中獲得應用程序類 用MFC全局函數AfxGetApp()獲得。 10) 從文檔類取得視圖類的指針 我是從http://download.cqcnc.com/soft/program/article/vc/vc405.html學到的,從文檔獲得視圖類指針目的一般為了控制同一文檔的多個視圖的定位問題,我的體會特別是文字處理CEditView當產生多個視圖類時,這個功能是非常需要的。 CDocument類提供了兩個函數用于視圖類的定位: GetFirstViewPosition()和GetNextView() virtual POSITION GetFirstViewPosition() const; virtual CView* GetNextView(POSITION& rPosition) const; 注意:GetNextView()括號中的參數用的是引用方式,因此執行后值可能改變。 GetFirstViewPosition()用于返回第一個視圖位置(返回的并非視圖類指針,而是一個POSITION類型值),GetNextView()有兩個功能:返回下一個視圖類的指針以及用引用調用的方式來改變傳入的POSITION類型參數的值。很明顯,在Test程序中,只有一個視圖類,因此只需將這兩個函數調用一次即可得到CTestView的指針如下(需定義一個POSITION結構變量來輔助操作): CTestView* pTestView; POSITION pos=GetFirstViewPosition(); pTestView=GetNextView(pos); 這樣,便可到了CTestView類的指針pTestView.執行完幾句后,變量pos=NULL,因為沒有下一個視圖類,自然也沒有下一個視圖類的POSITION.但是這幾條語句太簡單,不具有太強的通用性和安全特征;當象前面說的那樣,當要在多個視圖為中返回某個指定類的指針時,我們需要遍歷所有視圖類,直到找到指定類為止。判斷一個類指針指向的是否某個類的實例時,可用IsKindOf()成員函數時行檢查,如: pView->IsKindOf(RUNTIME_CLASS(CTestView)); 即可檢查pView所指是否是CTestView類。 有了以上基礎,我們已經可以從文檔類取得任何類的指針。為了方便,我們將其作為一個文檔類的成員函數,它有一個參數,表示要獲得哪個類的指針。實現如下: CView* CTestDoc::GetView(CRuntimeClass* pClass) { CView* pView; POSITION pos=GetFirstViewPosition(); while(pos!=NULL){ pView=GetNextView(pos); if(!pView->IsKindOf(pClass)) break; } if(!pView->IsKindOf(pClass)){ AfxMessageBox("Connt Locate the View.\r\n http://www.VCKBASE.com"); return NULL; } return pView; } 其中用了兩次視圖類的成員函數IsKindOf()來判斷,是因為退出while循環有三種可能: 1.pos為NULL,即已經不存在下一個視圖類供操作; 2.pView已符合要求。 1和2同是滿足。這是因為GetNextView()的功能是將當前視圖指針改變成一個視圖的位置同時返回當前視圖指針,因此pos是pView的下一個視圖類的POSITION,完全有可能既是pos==NULL又是pView符合需要。當所需的視圖是最后一個視圖是最后一個視圖類時就如引。因此需采用兩次判斷。 使用該函數應遵循如下格式(以取得CTestView指針為例):CTestView* pTestView=(CTestView*)GetView(RUNTIME_CLASS(CTestView)); RUNTIME_CLASS是一個宏,可以簡單地理解它的作用:將類的名字轉化為CRuntimeClass為指針。 至于強制類型轉換也是為了安全特性考慮的,因為從同一個基類之間的指針類型是互相兼容的。這種強制類型轉換也許并不必要,但能避免一些可能出現的麻煩。 3.從一個視圖類取得另一視圖類的指針 綜合1和2,很容易得出視圖類之間互相獲得指針的方法:就是用文檔類作中轉,先用1的方法得到文檔類的指針,再用2的方法,以文檔類的視圖定位函數取得另一個視圖類。同樣,可以實現成一個函數: (假設要從CTestAView中取得指向其它視圖類的指針)CView* CTestAView::GetView(CRuntimeClass* pClass) { CTestDoc* pDoc=(CTestDoc*)GetDocument(); CView* pView; POSITION pos=pDoc->GetFirstViewPosition(); while(pos!=NULL){ pView=pDoc->GetNextView(pos); if(!pView->IsKindOf(pClass)) break; } if(!pView->IsKindOf(pClass)){ AfxMessageBox("Connt Locate the View."); return NULL; } return pView; } 這個函數和2中的GetView()相比,一是多了第一句以取得文檔類指針,二是在GetFirstViewPosition()和GetNextView()前加上了文檔類指針,以表示它們是文檔類成員函數。 有了此函數;當要從CTestAView中取得CTestBView的指針時,只需如下:CTestBView* pTestbView=(CTestView*)GetView(RUNTIME_CLASS(CTestBView)); 11)對于單文檔中也可以加入多個文檔模板,但是一般的開發就使用MDI方式開發多文檔模板,其方法與上述視圖的獲取方法很接近,這里稍做解釋,如果不清楚,請查閱MSDN,(以下四個內容(11、12、13、14)來源:http://sanjianxia.myrice.com/vc/vc45.htm) 可以用CWinApp::GetFirstDocTemplatePostion獲得應用程序注冊的第一個文檔模板的位置; 利用該值來調用CWinApp::GetNextDocTemplate函數,獲得第一個CDocTemplate對象指針。 POSITION GetFirstDocTemplate( ) const; CDocTemplate *GetNextDocTemplate( POSITION & pos ) const; 第二個函數返回由pos 標識的文檔模板。POSITION是MFC定義的一個用于迭代或對象指針檢索的值。通過這兩個函數,應用程序可以遍歷整個文檔模板列表。如果被檢索的文檔模板是模板列表中的最后一個,則pos參數被置為NULL。 接我的: 12)一個文檔模板可以有多個文檔,每個文檔模板都保留并維護了一個所有對應文檔的指針列表。 用CDocTemplate::GetFirstDocPosition函數獲得與文檔模板相關的文檔集合中第一個文檔的位置,并用POSITION值作為CDocTemplate::GetNextDoc的參數來重復遍歷與模板相關的文檔列表。函數原形為: viaual POSITION GetFirstDocPosition( ) const = 0; visual CDocument *GetNextDoc(POSITION & rPos) const = 0; 如果列表為空,則rPos被置為NULL. 13)在文檔中可以調用CDocument::GetDocTemplate獲得指向該文檔模板的指針。函數原形如下: CDocTemplate * GetDocTemplate ( ) const; 如果該文檔不屬于文檔模板管理,則返回值為NULL。 14)一個文檔可以有多個視。每一個文檔都保留并維護一個所有相關視的列表。CDocument::AddView將一個視連接到文檔上,將該視加入到文檔相聯系的視的列表中,并將視的文檔指針指向該文檔。當有File/New、File/Open、Windows/New或Window/Split的命令而將一個新創建的視的對象連接到文檔上時, MFC會自動調用該函數,框架通過文檔/視的結構將文檔和視聯系起來。當然,程序員也可以根據自己的需要調用該函數。 Virtual POSITION GetFirstViewPosition( ) const; Virtual CView * GetNextView( POSITION &rPosition) cosnt; 應用程序可以調用CDocument::GetFirstViewPosition返回與調用文檔相聯系的視的列表中的第一個視的位置,并調用CDocument::GetNextView返回指定位置的視,并將rPositon的值置為列表中下一個視的POSITION值。如果找到的視為列表中的最后一個視,則將rPosition置為NULL. 15)從一個視圖類取得另一視圖類的指針 這個應用在多視的應用程序中很多見,一般如果自己在主程序或者主框架中做好變量記號,也可以獲得,還有比較通用的就是用文檔類作中轉,以文檔類的視圖遍歷定位,取得另一個視圖類。這個功能從本文第10項中可以得到。 16)獲取分割視圖中各個視圖的指針 CSplitterWnd m_wndSplitter; m_wndSplitter.CreateStatic(this, 1, 2);//分割成一行兩列 m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CLeftPaneView), CSize(10, 10), pContext); m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CRightPaneFrame), CSize(0, 0), pContext); //獲取左邊視圖的兩種方法 CLeftPaneView* pLeftPaneView = (CLeftPaneView*) m_wndSplitter.GetPane(0,0); //上一句可以用下句代替: //CLeftPaneView* pLeftPaneView = (CLeftPaneView *)GetActiveView(); //獲取右邊視圖 pLeftPaneView->m_pRightPaneFrame = (CRightPaneFrame*) m_wndSplitter.GetPane(0,1);
            posted @ 2010-07-08 17:26 chaosuper 閱讀(562) | 評論 (0)編輯 收藏

            2010年4月10日 #

            Factory:客戶類和工廠類分開。消費者任何時候需要某種產品,只需向工廠請求即可。消費者無須修改就可以接納新產品。缺點是當產品修改時,工廠類也要做相應的修改。如:如何創建及如何向客戶端提供。 Builder:將產品的內部表象和產品的生成過程分割開來,從而使一個建造過程生成具有不同的內部表象的產品對象。建造模式使得產品內部表象可以獨立的變化,客戶不必知道產品內部組成的細節。建造模式可以強制實行一種分步驟進行的建造過程。    Factory Method:核心工廠類不再負責所有產品的創建,而是將具體創建的工作交給子類去做,成為一個抽象工廠角色,僅負責給出具體工廠類必須實現的接口,而不接觸哪一個產品類應當被實例化這種細節。 Prototype:通過給出一個原型對象來指明所要創建的對象的類型,然后用復制這個原型對象的方法創建出更多同類型的對象。原始模型模式允許動態的增加或減少產品類,產品類不需要非得有任何事先確定的等級結構,原始模型模式適用于任何的等級結構。缺點是每一個類都必須配備一個克隆方法。    Singleton:單例模式確保某一個類只有一個實例,而且自行實例化并向整個系統提供這個實例單例模式。單例模式只應在有真正的"單一實例"的需求時才可使用。 Adapter:把一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口原因不匹配而無法一起工作的兩個類能夠一起工作。適配類可以根據參數返還一個合適的實例給客戶端。    Bridge:將抽象化與實現化脫耦,使得二者可以獨立的變化,也就是說將他們之間的強關聯變成弱關聯,也就是指在一個軟件系統的抽象化和實現化之間使用組合/聚合關系而不是繼承關系,從而使兩者可以獨立的變化。    Composite:合成模式將對象組織到樹結構中,可以用來描述整體與部分的關系。合成模式就是一個處理對象的樹結構的模式。合成模式把部分與整體的關系用樹結構表示出來。合成模式使得客戶端把一個個單獨的成分對象和由他們復合而成的合成對象同等看待。    Decorator:裝飾模式以對客戶端透明的方式擴展對象的功能,是繼承關系的一個替代方案,提供比繼承更多的靈活性。動態給一個對象增加功能,這些功能可以再動態的撤消。增加由一些基本功能的排列組合而產生的非常大量的功能。   Facade:外部與一個子系統的通信必須通過一個統一的門面對象進行。門面模式提供一個高層次的接口,使得子系統更易于使用。每一個子系統只有一個門面類,而且此門面類只有一個實例,也就是說它是一個單例模式。但整個系統可以有多個門面類。   Flyweight:FLYWEIGHT在拳擊比賽中指最輕量級。享元模式以共享的方式高效的支持大量的細粒度對象。享元模式能做到共享的關鍵是區分內蘊狀態和外蘊狀態。內蘊狀態存儲在享元內部,不會隨環境的改變而有所不同。外蘊狀態是隨環境的改變而改變的。外蘊狀態不能影響內蘊狀態,它們是相互獨立的。將可以共享的狀態和不可以共享的狀態從常規類中區分開來,將不可以共享的狀態從類里剔除出去。客戶端不可以直接創建被共享的對象,而應當使用一個工廠對象負責創建被共享的對象。享元模式大幅度的降低內存中對象的數量。 Proxy:代理模式給某一個對象提供一個代理對象,并由代理對象控制對源對象的引用。代理就是一個人或一個機構代表另一個人或者一個機構采取行動。某些情況下,客戶不想或者不能夠直接引用一個對象,代理對象可以在客戶和目標對象直接起到中介的作用。客戶端分辨不出代理主題對象與真實主題對象。代理模式可以并不知道真正的被代理對象,而僅僅持有一個被代理對象的接口,這時候代理對象不能夠創建被代理對象,被代理對象必須有系統的其他角色代為創建并傳入。    Chain of Responsibility:在責任鏈模式中,很多對象由每一個對象對其下家的引用而接 起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。客戶并不知道鏈上的哪一個對象最終處理這個請求,系統可以在不影響客戶端的情況下動態的重新組織鏈和分配責任。處理者有兩個選擇:承擔責任或者把責任推給下家。一個請求可以最終不被任何接收端對象所接受。   Command:命令模式把一個請求或者操作封裝到一個對象中。命令模式把發出命令的責任和執行命令的責任分割開,委派給不同的對象。命令模式允許請求的一方和發送的一方獨立開來,使得請求的一方不必知道接收請求的一方的接口,更不必知道請求是怎么被接收,以及操作是否執行,何時被執行以及是怎么被執行的。系統支持命令的撤消。   Interpreter:給定一個語言后,解釋器模式可以定義出其文法的一種表示,并同時提供一個解釋器。客戶端可以使用這個解釋器來解釋這個語言中的句子。解釋器模式將描述怎樣在有了一個簡單的文法后,使用模式設計解釋這些語句。在解釋器模式里面提到的語言是指任何解釋器對象能夠解釋的任何組合。在解釋器模式中需要定義一個代表文法的命令類的等級結構,也就是一系列的組合規則。每一個命令對象都有一個解釋方法,代表對命令對象的解釋。命令對象的等級結構中的對象的任何排列組合都是一個語言。    Iterator:迭代子模式可以順序訪問一個聚集中的元素而不必暴露聚集的內部表象。多個對象聚在一起形成的總體稱之為聚集,聚集對象是能夠包容一組對象的容器對象。迭代子模式將迭代邏輯封裝到一個獨立的子對象中,從而與聚集本身隔開。迭代子模式簡化了聚集的界面。每一個聚集對象都可以有一個或一個以上的迭代子對象,每一個迭代子的迭代狀態可以是彼此獨立的。迭代算法可以獨立于聚集角色變化。    Mediator:調停者模式包裝了一系列對象相互作用的方式,使得這些對象不必相互明顯作用。從而使他們可以松散偶合。當某些對象之間的作用發生改變時,不會立即影響其他的一些對象之間的作用。保證這些作用可以彼此獨立的變化。調停者模式將多對多的相互作用轉化為一對多的相互作用。調停者模式將對象的行為和協作抽象化,把對象在小尺度的行為上與其他對象的相互作用分開處理。    Memento:備忘錄對象是一個用來存儲另外一個對象內部狀態的快照的對象。備忘錄模式的用意是在不破壞封裝的條件下,將一個對象的狀態捉住,并外部化,存儲起來,從而可以在將來合適的時候把這個對象還原到存儲起來的狀態。    Observer:觀察者模式定義了一種一隊多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態上發生變化時,會通知所有觀察者對象,使他們能夠自動更新自己。    State:狀態模式允許一個對象在其內部狀態改變的時候改變行為。這個對象看上去象是改變了它的類一樣。狀態模式把所研究的對象的行為包裝在不同的狀態對象里,每一個狀態對象都屬于一個抽象狀態類的一個子類。狀態模式的意圖是讓一個對象在其內部狀態改變的時候,其行為也隨之改變。狀態模式需要對每一個系統可能取得的狀態創立一個狀態類的子類。當系統的狀態變化時,系統便改變所選的子類。    Strategy:策略模式針對一組算法,將每一個算法封裝到具有共同接口的獨立的類中,從而使得它們可以相互替換。策略模式使得算法可以在不影響到客戶端的情況下發生變化。策略模式把行為和環境分開。環境類負責維持和查詢行為類,各種算法在具體的策略類中提供。由于算法和環境獨立開來,算法的增減,修改都不會影響到環境和客戶端。 Template Method:模板方法模式準備一個抽象類,將部分邏輯以具體方法以及具體構造子的形式實現,然后聲明一些抽象方法來迫使子類實現剩余的邏輯。不同的子類可以以不同的方式實現這些抽象方法,從而對剩余的邏輯有不同的實現。先制定一個頂級邏輯框架,而將邏輯的細節留給具體的子類去實現。    Visitor:訪問者模式的目的是封裝一些施加于某種數據結構元素之上的操作。一旦這些操作需要修改的話,接受這個操作的數據結構可以保持不變。訪問者模式適用于數據結構相對未定的系統,它把數據結構和作用于結構上的操作之間的耦合解脫開,使得操作集合可以相對自由的演化。訪問者模式使得增加新的操作變的很容易,就是增加一個新的訪問者類。訪問者模式將有關的行為集中到一個訪問者對象中,而不是分散到一個個的節點類中。當使用訪問者模式時,要將盡可能多的對象瀏覽邏輯放在訪問者類中,而不是放到它的子類中。訪問者模式可以跨過幾個類的等級結構訪問屬于不同的等級結構的成員類。
            posted @ 2010-04-10 09:37 chaosuper 閱讀(196) | 評論 (0)編輯 收藏

            2010年4月5日 #

            關于北京戶口的知識 1.問:網上一些人說今年應屆生北京戶口特別難辦,是真的嗎? 答:每年都有這么說的,主要是因為公司忘記了申請或者不懂得申請策略,打算招10人的應該申請20個指標才保險。其實公司申請指標非常容易特別是注冊在海淀的企業,除了營業執照不需要任何證明,有人說要看稅款什么的都是沒有根據的,最近兩年連高新證都不看了。事實是由于公司虛報和轉賣戶口的人存在,每年都有大量戶口指標作廢,同時有大量同學沒有順利落戶。 2.問:費用到底是多少? 答:都說一百遍了,所有費用,包括人才的檔案保管費一共2k左右。 3.問:落了北京戶口我就是名正言順的北京人了? 答:法律上來說是的。但是拿到綠卡的中國人你認為他們是中國人還是美國人?老人家在北京呆了半輩子你認為他是湖南人還是北京人?說自己是哪里人時要對得起父母,戶籍可以變,出身永遠不會變。 4.問:可以給孩子落戶了? 答:集體戶口不可以,必須買房改為個人戶口才行。有人說可以落到親戚甚至朋友那里,假如可行的話北京所有的小孩估計都落到北大附小清華附小學區了。退一步講,假如你花10萬元收買了派出所允許落戶,讓孩子在北京做個吉普賽人你忍心嗎? 5.問:那買房不就行了嗎? 答:是的,在北京生存發展這是唯一的選擇。前提是支付15到25萬的首付和裝修入戶費,另一個條件是為了供養房子和以后可能出現的小孩,每年兩人稅后收入至少10萬元,而且這種收入至少要穩定20年。當然如果你父母那里足夠殷實或者自己是某一方面的專才這些都不是問題,否則沒錢看病或者40歲了還欠著父母20萬都是有可能的。 6.問:買了房落了戶孩子就可以讀名校了 答:完全錯誤。名校學區早已限定,不會擴大,特別是80萬元以下的小區都在四環以外,上地三小,馬連洼小學什么的倒不成問題。想讀名校,拿錢,今年北大附小是6萬,有沒有北京戶口一個價。這是小學,北大附中20萬并且有認識人不見得能進去,北京有權有勢的人多的是。 7.問:算了,我不考慮那么多了,至少有集體戶口辦里一些手續方便些吧? 答:未必。目前買車已沒有限制,辦理出國手續通過公司-人才-派出所,辦理起來并不比放在老家方便。 8.問:北京信息豐富,就業機會多 答:目前的網絡無處不在,西部偏遠地區的農民在網上得到的信息不會比北京it人士少。就業機會多?冷靜點吧,看看人才市場的行情,就業機會再多也沒有老板的選擇機會多,老板正準備把你趕走,用更少的錢雇傭更年輕的更努力更有活力并且沒有家庭負擔的新人呢。當然除非你的技能比較特別,比如中醫或者面點師。當然,如果你人際關系好、商務能力足夠強,在北京還是大有作為的。 9.問:先辦個北京戶口,哪天混不下去了轉到小城市不行嗎? 答:不行。大家只知道其他城市轉到北京非常難,實際上從北京轉到其他城市的難度完全一樣,這不是城市“好”“壞”的問題,這是我國戶籍制度和人事調動制度決定的(省部級領導不受此限制)。 10.問:難道北京戶口就沒有優勢了嗎? 答:有,北京特困救助高于全國平均水平。 11.問:你說的這些顛覆了我對北京戶口的美好印象,是真的嗎? 答:兼聽則明,了解真正情況需要問一問你認識的人,別問那幾個最燦爛的,問問那些占人口大多數的,畢業3、4年的,默默無聞的。和你的職業發展相比戶口不值一提,北京工作居住證基本上有了戶口的所有功能,包括孩子入學。 12.問:哎,難道現在畢業這么凄慘嗎? 答:別那么悲觀,老人家說過:海闊天空,大有作為 13.問:我家里可以給我提供20萬的首付,我們兩人畢業就能拿到稅后10萬,我有能力 在北京發展,那北京戶口多少錢合適? 答:5000,北京戶口頂多值這個價了。 14..辦理北京戶口的流程是怎樣的? 單位和學生達成為就業意向。并且單位有戶口指標,承諾給解決北京戶口后,就開始進入 北京戶口的審批程序。(除了一些極老的國企,其他企業,包括北大方正、聯想等接收應 屆畢業生都是下面這些程序) 審批時間是:春季研究生從3月1日開始、其他畢業生從4月1日開始,截止時間為6月25日。 審批依據:北京人事局規定本科生進京專業目錄,在此之外的本科專業辦理難度就比較大 ,除非單位極牛又全力給你辦理。研究生辦理戶口雖然沒有專業限制,但是人事局審批時 要求專業對口,否則不給審批。今年就有網絡公司接收化學專業碩士被拒的。 北京人事局規定本科生進京專業目錄,在此之外的本科專業辦理難度就比較大。具體專業 是: 北京市2005年引進非北京生源應屆本科畢業生緊缺專業目錄 計算機 建筑 機械 電力系統及其自動化 通信工程 汽車 臨床醫學 路橋 護理學 人力資源管理 市場營銷 會計 審批流程: 學生將申報材料交給公司,公司去人事局申報,一般5-10個工作日會有審批結果,但有時 會拖延,例如去年3月份交上去的本科審批結果就到5月份才下來。 申報材料: 1)推薦表(要求學校就業分配部門蓋章,如果是多頁的,需要在各頁蓋章或加蓋齊縫章 ) 2)成績單(本科要求是學校教務部門蓋章,研究生可以是研究生院等校級單位蓋章,絕對不可以只有系或學院的章,如果你拿到的成績單只有系章, 不用去換,只要拿著它去教務單位補一個章就行了,如果是多頁情況,也需要逐頁蓋章) 3)統分證明(學校就業分配部門蓋章,只要寫上xx同學是統分畢業生就行這樣一句話就 行) 4)品行鑒定(自己寫或是打印,由系里面蓋章就行了) 5)如果是本科,需要提交四級或六級證書原件、復印件各一份 6)身份證復印件(只有這個是復印件,其他材料都要求原件) 7)三方協議(可以空著) 批準落戶的,會發給北京市人事局的接收函。不批準的,會把所有申報材料退還給公司,公司再退還給學生。批準落戶的,拿著人事局接受函(自己留一份復印件)和三方協議交給學校,讓學校在三方協議上蓋章,學校看到接收函,則可以在三方上蓋章,表示同意該生的就業選擇(因為如果北京市還沒同意要你,學校就給你派遣到北京,你的檔案和戶口就會飄在半空,無法落地,境況非常麻煩)。然后返一份給單位,自己留一份。辦完這些手續,就等著畢業,學校給你派遣證和戶口遷移卡,拿這些東西去公司報到。然后再和單位簽勞動合同什么的。畢業落戶階段三方協議是很重要的。它不同于勞動合同。,三方協議最主要的作用就是約束你的人事關系的轉移,三方協議上面的檔案轉寄地址,戶口轉移地址就是學校給你派遣檔案、 戶口的用的。所以,如果單位不能給你解決戶口,也就沒有資格和你簽署三方協議 。但單位可以和你簽勞動合同,勞動合同就和戶口、檔案沒有關系了,是約束勞動者和單 位的關系的。其實,解決你戶口的單位,在和你簽完三方協議后,也還要簽勞動合同的。因為三方協議就說明你的人事關系的轉移的,沒有涉及勞動關系。畢業后,學校給你派遣證和戶口遷移卡,你就開始報到落戶程序。 辦理程序及辦理地點 第一步:到海淀人才服務中心報到 1、在海淀人才網www.hdrc.com.cn 查畢業生檔案是否已到,如到請記錄編號 2、如檔案已到,帶接收單位填寫的保留全民身份調入表1份并加蓋單位公章和報到證(原件、復印件各一份); 3、如需在人才服務中心辦理集體戶口者,請帶在網上下載的“集體戶口申請表”并如實加蓋單位公章、身份證復印件、1寸黑白大頭照片2張、報到證復印件、戶口卡及遷移證。 辦理地點:海淀科技大廈七層、海淀人才服務中心上地分部、海淀人事局業務綜合受理大 廳人才服務中心窗口 第二步:到海淀區人事局流動調配科報到 所需材料: 1、海淀人才開具的轉入通知; 2、報到證; 3、戶口遷移證; 4、北京市人事局接收函復印件; 5、存檔費等收費收據的復印件。 辦理地點:海淀區人事局二層畢業生審批窗口(蘇州街乙29號) 第三步:到北京市人事局大學生處報到 所需材料: 1、海淀區人事局開具的落戶介紹信; 2、北京市人事局接收函復印件; 3、戶口遷移證。 辦理地點:東城區臺基廠三條三號北京市人事局大學生處 第四步:到海淀分局開具落戶通知單 所需材料: 1、海淀區人事局開具的落戶介紹信; 2、北京市人事局開具的落戶介紹信; 3、戶口遷移證。 辦理地點:中關村科技園服務中心144窗口(阜成路67號,空軍總醫院對面)。然后到海 淀人才服務中心辦理手續 以上北京戶口知識轉自Zol_泡泡szc的博客
            posted @ 2010-04-05 10:43 chaosuper 閱讀(258) | 評論 (0)編輯 收藏

            僅列出標題  下一頁
            久久99这里只有精品国产| 99精品国产在热久久无毒不卡 | 99re久久精品国产首页2020| 人妻久久久一区二区三区| 欧美噜噜久久久XXX| 99久久久久| 久久久久久精品成人免费图片| 亚洲欧美伊人久久综合一区二区| 久久国产色AV免费观看| 久久se这里只有精品| 亚洲精品乱码久久久久久蜜桃不卡| 国产91色综合久久免费| 久久久久国产一区二区三区| 国内精品伊人久久久影院| 99久久国语露脸精品国产| 久久成人精品| 久久久久久免费一区二区三区| 热综合一本伊人久久精品| 久久99国产精品久久| 老男人久久青草av高清| 久久国产成人亚洲精品影院| 精品蜜臀久久久久99网站| 久久伊人五月丁香狠狠色| 久久亚洲精品中文字幕三区| 夜夜亚洲天天久久| 国内精品久久久久伊人av| 久久久久波多野结衣高潮| 人人狠狠综合久久亚洲高清| 婷婷综合久久中文字幕| 91精品国产乱码久久久久久| 久久亚洲精品成人AV| 亚洲欧洲日产国码无码久久99| 中文字幕久久精品| 久久久久人妻一区精品| 久久一区二区免费播放| 久久精品成人欧美大片| 久久精品成人| 久久久www免费人成精品| 亚洲精品无码久久久久去q| 久久人人爽人人爽人人片av麻烦| 久久精品亚洲AV久久久无码|