找出目錄下所有壞掉的symblic link

找出壞掉的s-link

find . -type l | perl -lne 'print if ! -e'

配合xargs 做刪除動作

find . -type l | perl -lne 'print if ! -e' | xargs rm -rf

geany 基本設定

一般
->startup->project files 刪掉
介面
->show sidebar 不勾
->顯示符號列表 不勾
->show documents list 不勾
->字型Editor: Bistream Vera Sans Mono Roman 10
工具例
->Icon Style-> Images Only
->Icon Size->Very Small icons
編輯器
->Indentation->Type->Spaces
->Auto-indent mode->basic
->Display->Long line marker->Enabled 不勾
keybindings
->自動補完文字 刪除
->開啟訊息視窗 F12

jpg to pdf

在unix下有一個很好用的工具叫ImageMagick它能處理各種格式的轉換,而如果想要將許多的照片壓成一本相本給人家看的話,那輸一出PDF格式在試合不過了,而這個工具就可以讓你簡單的就做到這個工作。

$ convert *.jpg ok.pdf

xrandr dual monitor

一般來說要設定雙螢幕的話要透過xorg.conf,在/usr/local/etc/X11/下的一個設定檔,簡單以nvidia原生的軀動和xf86的nv來比較好了,對於nvidia原生的軀動可以透過nvidia-driver來安裝,之後再load kernel module就好了,之後就是需要透過nvidia-settings這個工具來幫我們編輯設定我們的xorg.conf,這樣可以完成設定,另外的話可以由xrandr來動態的設定,但目前就我知道,好像nv才行原生的軀動的話不行。

* 先列出目前有多少個輸出裝置

$ xrandr -q
如果沒意外的話應該會看到有DVI0 VGA1 VGA2這樣的裝置代號

* 設定雙螢幕

$ xrandr --output VGA1 --mode 1024x768 --output VGA2 --mode 1024x768 --right-of VGA1
以我的電腦來說我接了兩個VGA的螢幕所以我有VGA1 VGA2我將兩個大小都設成1024x768之後在指定VGA2在VGA1的右邊

--output 輸出裝置如VGA1 DVI0
--mode 輸出的解析度如1024x768
--right-of 輸出裝置如VGA1

* 設定虛擬桌面大小

如果沒意外的話,應該會出現一個錯誤讓你無法設定,那就是虛擬桌面的大小沒有支援到超過單一個螢幕大小,但是這是可以修改的,重新打開xorg.conf之後找到SubSection "Display"之後改成

  Section "Screen"
Identifier "Default Screen"
Monitor "Configured Monitor"
Device "Configured Video Device"
SubSection "Display"
Virtual 2048 768
EndSubSection
EndSection

這樣就可以正確的透過xrandr來設定了,xrandr還可以動態的改成許多不同的顯示方式如mirror就是一種。

xcompmgr

在X環境中最如果要達成視窗有的透明卡,看起來會比較炫,但沒什麼用的時候,這個軟體xcompmgr很好用,以下是它的一些使用參數

-r 由client端模糊的半徑值,預設為12。
-o 由client端的半透明值,預設為75。
-l 左邊陰影的偏移量,預設為-15。
-t 上面陰影的偏移量,預設為-15。
-I 淡入的時間,預設為0.028。
-O 淡出的時間,預設為0.03。
-D 淡入淡出的delta效果的時間,預設為10。
-c 由client端描繪出模糊的邊框。
-C 避免陰影繪到dock、panel windows。
-f 淡入淡出、退出和打開效果。
-F 淡入淡出的半透明效果。
-n 由普通的client支持透明。
-s 由server開始繪製。

如果有興趣的人可以玩看看我,貼上我使用的參數

xcompmgr -c -o.5 -r4 -l-5 -t-5

portmaster upgrade by packages

如果有一天你有很多台機器,雖然其中一台常常在升級,但是其它台都很少在管理,如果要快速升級的話,最快的就是透過package來升級,不然每台都做編譯的動作非常浪費時間。因此這裡提供一些動作當參考,可以加速ports的升級。

1. 選一台source機,以後都專門做package的機器,並將所有的ports升到最新

# cd /usr/ports && make update fetchindex
# portmaster -a

2. 將機器上所有的ports都做成package

# setenv PACKAGES /tmp/ports_package (將所有的ports做出來的package放在/tmp/ports_package中)
# portmaster -t -y --clean-distfiles (把所有舊有的distfile都清掉)
# portmaster --check-port-dbdir (把沒安裝但留在系統中沒用的所有舊的port config目錄清掉)
# portmaster -afF (指定所有ports且先將所有的distfiles抓完、強制執行)
# portmaster -afg (強制重編所有的ports並且建立package,千萬要記得-g不然都白做了,根據ports的流程,若要建立package的話編譯是必須的,沒辦法由系統直接打包)

之後portmaster就會開紿跑相依性並將所有的ports全都重編且重新安裝,同時會做成package放到之前我們定義的目錄/tmp/ports_package中,不過這過程就要看系統安裝多少ports的複雜度來決定時間,如果你使用的是xterm的話在title bar中會顯示已經完成了多少ports,另外如果不幸中斷的話,可以重新執行最後一行指令,並加上-R讓它將接著下去,而不是全部重做

3. 建立ports index並放入/tmp/ports_package

因為軟體都有使用到portconf做客製化,因此相依性的部份和用fetchindex抓下來的INDEX-8會有些差異,如果要由package來升級的話,portmaster必須要參考此檔來決定那些要升級,因此我們要由目前ports狀態下做出目前的port index

# cd /usr/ports && make index (建立port index INDEX-8)
# mv /usr/ports/INDEX-8 /tmp/ports_package
# cd /tmp/ports_package && bzip2 -z INDEX-8

這個時候ports_package目錄應該為

-INDEX-8.bz2
+ALL
+Latest
+....
+....

4. 將ports_package目錄做成web目錄

總之就是建立一個http,並將目錄指向ports_package。比如我開了一個帳號叫srvupgrade,並將所有的ports_package資料都放在public_html之中,架構為
/home/srvupgrade/public_html/INDEX-8, ALL, Latest而且對外必須要能存取如http://140.xx.3.xx/~srvupgrade/INDEX-8可以取的到index,而http://140.xx.3.xx/~srvupgrade/ALL可以看的到所有的套件的符號連結

5. 在要升級的client端先修改一些參數將package升級導向我們的伺服器

# mkdir /tmp/upgrade_package && setenv PACKAGES /tmp/upgrade_package (將package指定到其它地方不要和系統的目錄搞在一起)
# setenv MASTER_SITE_INDEX http://140.xx.3.xx/~srvupgrade/ (自己做出來的INDEX-8的網址)
# setenv INDEXDIR /tmp/upgrade_package (下載index之後放在/tmp/upgrade_package中)
# setenv PACKAGESITE http://140.xx.3.xx/~srvupgrade/Latest/ (指定package要去我們的server上抓)

如果不希望每次都設定的話,就寫入.cshrc吧!

6. client端開始只使用package升級,而不用到ports

# portmaster --index-only --packages-only --delete-packages -a

會先下載INDEX-8並存在/tmp/upgrade_package中之後檢查那些軟體需要升級,之後會透過我們指定的PACKAGESITE去我們自己的server上下載回來放在/tmp/upgrade_package,最後升級完成後順便將下載回來已經升級完的package刪除。

如果每台機器所裝的軟體都一樣的話,那上面這種方式非常的方便,但是如果這台client還裝了其它的軟體的話,因為server上沒有編,而所做出來的INDEX-8會記錄這些其它軟體也需要升級,所以在升級的過程中我們不能只使用--packages-only,因為一定會有軟體在server上沒有編,所以這些不大的軟體,我們可以由client自己編譯升級,一樣會大幅的減少升級時間

# cd /usr/ports && make update fetchindex (先更新整個ports)
# portmaster --packages --delete-packages -a (以ports為基礎,如果沒有package版本一樣的話,就由client自己編譯)

7. client最後將一些不需要的資料清掉

# portmaster --clean-distfiles (將系統沒安裝或是用不到的distfiles清掉)
# portmaster --clean-packages (將系統沒安裝或是用不到的package清掉)
# portmaster --check-depends (整理所有ports的相依性看有沒有任何的錯誤)

* 結論

當然做出來的package不但能用來升級,如果有新機器要快速建立的話,直都都透過pkg_add來裝就非常的快
透過這種方式升級會更方便且快速,但是做成package來裝的穩定性和相依性比不上由ports來要好,所以除非希望方便升級或是希望要非常快就可以安裝或升級,再用此方法會更好。

portmaster

在Freebsd上常用的兩套套件管理程式,大概就是portupgrade和portmaster但是portupgrade是透過ruby寫成的,而且需要額外的資料支援來記錄目前所有的ports內容,所以變成當ports有變動的話同時也要將pkgdb做更新的動作,雖然portupgrade所提供更多工具的支援但是速度就是比較慢,最近已經轉換為portmaster+portconf,因為portmaster沒有辦法單獨的設定一個套件需要的額外參數,所以透過portconf的支援,將不同的軟體需要的編譯參數都寫進去就可以做一個全域的管理了,這裡說明一下portmaster+portconf如何合作並使用。

* 架構說明
portconf -> 設定不同軟體編譯參數
make.conf -> 讀取portconf處理完的編譯參數,之後直接設定整個ports編譯過程follow這些參數
ports install (make install clean) -> 已follow所有make.conf各軟體所指定的編譯參數
portmaster -> 直接使用底層的ports升級或新增安裝,因此也會同時follow各軟體指定的編譯參數

* install portconf
# /usr/ports/ports-mgmt/portconf && make install clean
# vim /usr/local/etc/ports.conf (portconf的設定參數)
*: BATCH=yes | WITHOUT_HAL=yes | WITHOUT_DEBUG=yes | WITHOUT_GNOME=yes | WITHOUT_GCONF=yes | WITHOUT_KDE=yes | WITH_NLS=yes
editors/vim*: WITH_X11_ONLY=yes
x11/xterm: WITH_256_COLOR=yes

由此範例可以看出設定的方式很簡單,只要將你想要設定的ports name以path的方式表示,之後如果有多個版本像是vim有6, 7等等的版本,可以直接使用「*」來指定,之後就是加上一個「;」後面就是在ports的Makefile裡面的參數了,以vim來說,我要指定所有的vim版本都使用WITH_X11_ONLY這個參數,而如果有多個參數的話使用「|」來加入更多的設定就行了。
而在我第一行的設定中*: BATCH=yes | .... |.... 它的意思表示,所有的ports的編譯安裝都要符合這個全域的設用,所以我不指定路徑,而是直接使用「*:」來指定。

* install portmaster
# cd /usr/ports/ports-mgmt/portmaster && make install clean

那portmaster就是我用來取代portupgrade的ports管理器,它有非常多的參數可以設定,而也有設定檔可以指定常用的編譯參數。

* portmaster options

-C 防止每次升級或安裝新的ports時都先make clean

-G 防止每次升級或安裝新的ports時都要make config跳出選擇視窗

-H 不顯示編譯過程

-K 防止每次升級或安裝新的ports之後都做make clean

-B 防止升級時,將舊的套件備份起來(在portmaster升級流程中,會先將原套件備份起來以免新套件未成功安裝,但是裝完的時候就會將備份移除,備份檔會放在/usr/ports/packages/裡面)

-b 升級時,將舊的套件備份起來而不移除

-g 升級或是安裝新的套件時順便建立packages(一樣放在/usr/ports/packages/裡面)

-n 將所有的行程模擬跑過一次,但是不會真的編譯升級 (其實可以不用,因為最後都會問是否確認要升級)

-v 顯示更大量的資訊

-w 升級時,將舊的套件的share library備份起來放在/usr/local/lib/compat/pkg中,這個極為
重要,因為升級的時候,如果是share library bump跳版次的話,會造成系統中所有用到此函式庫的程式需要重新,若沒有重編會因ld連不到存在的函式庫而造成不能執行,先保留起來在打算是必要的

-f 強制執行編譯升級ports

-i 互動模式詢問,當升級套件很多的時候,會一個一個的詢問是否要升級安裝

-D 升級或移除ports的時候不要將用不到的distfiles砍掉

-d 升級或移除ports的時候自動將用不到的distfiles砍掉

-m 可以直接下參數給升級ports的時候編譯參數,但我們有portconf所以大概用不到了

-x 避免某個套件升級,當將ports全部都升級,但只有某幾個不想升的話,這個參數就用的到了

--no-confirm 默認執行,不要跳出任何需要管理者同意的資訊,建議不要開,會有點危險

--no-term-title 將你的termainal的title bar顯示為目前進行的進度關掉,預設是開啟的

-P 若網路上有可用的package版本的話,直接使用來加速安裝,若沒有的話則執行編譯

--packages-build 當升級或安裝軟體的時候,會有build dependency,所以會需要安裝automake或make這樣的ports來當成工具編譯需要的套件,但是往往都會浪費時間,所以提供了使用套件來將這些建立工具直接用package來安裝,可增加效能,同常會搭配--delete-build-only來用

--delete-build-only 將build dependency的套件建立完主要的ports之後就將這些工具移除了,同常搭配--packages-build來使用

--packages-if-newer 用packages來升或安裝,假設版本沒有跟上ports tree版本號的話也沒關系,一樣用舊一點的packages,但是仍然會比系統中已安裝的ports還要新

--always-fetch 不論是否有這個distfiles存在總是重抓一次

--packages-local 如果今天已取得所有需要安裝的ports且已經做成packages的話,可直接指定用這些package來裝,而不在上網去下載可用版本

--local-packagedir= 配合--packages-local一起使用,若不想和系統的packages放在一起搞混的話,可以將人做整個系統做好的package下載到一個你喜歡的目錄,假設為/tmp/mypkg則可以指定這個路徑,之後使用--packages-local參數來升級,就會以/tmp/mypkg的目錄,將所有的ports以packages的方式全部升級

-a 確認所有的ports有沒有必要升級,通常都要先做完ports tree cvs update

--show-work 來顯示某個ports它的相依性,還有那些沒有安裝,那些已經安裝

-o 將目前的某ports取代成另某ports,比如版本的轉換,將firefox換成firefox36

[R-] -r 重編所有相依到某套件上一層所有ports,通常ports version bump的時候就會這樣做了

-R表示若因某原因中斷,而加上此參數可以接續上次處理一次的流程接著處理完,而不重新執行

-l 列出所有目前安裝的ports並分類好

-L 列出所有目前安裝的ports分類好,且同時檢查是否要升級

--list-origins 列出目前所有上層ports在ports tree的原名

-F 只抓取新的distfiles而不做任何動作

-y 對所有執行的動作都回答yes

-e 移除某個ports且會自動運行-s將不在需要的ports一併移除

-s 移除不在需要相依的ports

--clean-distfiles 移除不在需要的distfiles,若有指定-d的話會自動移除

--clean-packages 移除不在需要的packages

--check-depends 確認目前所有的ports相依性,若有缺當的相依性的話,會顯示出來

--check-port-dbdir 確認目前在/var/db/ports下每個ports的設定,是否有過舊,或ports已移除而將不必要的port config也移除

* portmaster config
如果要將上面的設定都記得的話是件很麻煩的事,所以portmaster有提供一個設定檔在/usr/local/etc/portmaster.rc 可以從portmaster.rc.sample cp一份過來,以下是我常用的設定

NO_BACKUP=Bopt (不要保留已移除ports的備份檔)
ALWAYS_SCRUB_DISTFILES=dopt (不要保留舊有的distfiles)
PM_NO_MAKE_CONFIG=Gopt (升級或安裝時不要做make config)
PM_VERBOSE=vopt (每個portmaster顯示行為和過程)
SAVE_SHARED=wopt (保留已經移除ports的share library避免port version bump)


* portmaster Example

若不直接使用ports tree來安裝新軟體,也可以直接透過portmaster來安裝新的ports
# portmaster editors/vim (若vim軟體已存在的話會自動重裝蓋過,若有新版本的話會自動升級)

用portmaster來移除ports和不在被相依的ports
# portmaster -e portupgrade [-n|-y] (-e會自動呼叫-s做清除無用的ports,且會詢問是否執行)

用portmaster來升級所有的ports
# cd /usr/ports && make update fetchindex (更新ports tree)
# portmaster -a [-n|-y]

用portmaster來安裝或升級軟體,並同時建立package
# portmaster -g editors/vim

用portmaster來轉換其它版本的ports
# portmaster -o www/firefox36 firefox-4.0_1,1

用portmaster來清除無用的distfiles
# portmaster --clean-distfiles [-n|-y]

用portmaster列出目前所有套件並分類
# portmaster -l

用portmaster列出目前所有套件並以ports name來顯示
# portmaster --list-origins

用portmaster來檢查所有ports的相依性問題
# portmaster --check-depends

用portmaster來檢查並刪除舊有的port config
# portmaster --check-port-dbdir [-n|-y]

用portmaster來檢查並刪除舊有的packages
# portmaster --chean-packages [-n|-y]

用portmaster來安裝新ports,但避免時間的浪費,所以將build dependency用packages來裝,且之後這些build dependency的packages要刪除不要佔空間
# portmaster --packages-build --delete-build-only ports-mgmt/portupgrade

用portmaster來檢查新安裝一個ports還需欠有那些相依性要先裝
# portmaster --show-work ports-mgmt/portupgrade

用portmaster來安裝新的ports並看看有沒有packages可以用免得自己編譯浪費時間
# portmaster -P ports-mgmt/portupgrade (注意:這和 PACKAGESITE環境變數有關,不然會抓到的是和光碟版一同釋出的ports版本)

用portmaster全部升級所有ports,但是只有firefox和vim不升級
# portmaster -x firefox -x vim -a

如果某個ports發生ports version bump的話,需要重編所有相依到此ports的上層ports
# portmaster -r graphics/png

如果整個系統做跳版次的升級7.3r -> 8.2r 那麼必須將所有的ports全部重編
# portmaster -fa

* 結論
用了portupgrade差不多一年多了,轉換到portmaster之後覺整個升級流程速度快上很多,雖然portupgrade還是穩定一些,而且選擇更多,但是相對的portmaster比較簡單而且不需要額外的資料庫支援,因為後來發現portconf這個好物之後就直接換到portmaster了,原本只有在portupgrade裡面所用到的pkgtool.conf,而在portconf也可以做的到了。