2007年3月27日 星期二

怎樣的能力才能被相中呢?

最近對於準備當兵或是說準備進入社會的感觸頗深,到底要怎樣的能力才能進入夢幻般的職場呢?今天去參加學校辦的Open House企業徵才活動,突然發現自己好像有點脫節,在這樣的活動場景竟然覺得有點格格不入。

今天的活動,旁邊坐了一位同系學弟,一開始我還以為是學長,哈,並不是外表如何,是給我的感覺好像很自然很老練,所以以為是學長,後來發現只是小我一屆,也剛好考完研究所等放榜中。在會談過程中,不斷地閒聊一些有趣的事,這樣的感覺讓我想起大三時所認識的一位轉學生,感覺滿輕鬆,大概是對方很豪放吧,連抽獎時還會直言詛咒別人抽到爛獎!哈。

周遭一些認識的學長姐,好像都進了聯發科耶,到底要有什麼樣的能力才能被重用呢?我該好好充實自己的能力與實力。追求一個好的環境,不是薪資,而是為興趣而研究的環境。

收到成大的成績單了

從老媽口中得知,原來我的平均分數差一分就可以備取耶,哈,比我想像中考得好多了!我印象中當天考完時,我就打電話跟老媽說,上不了,因為覺得簡單的有的沒考好,而難的卻不會,沒想到離備取分數還滿近的,儘管榜上無名但內心卻感到一些喜悅。

最近已經開始著手於復習的動作了,該為未來好好準備,不將是考試而已,有種沉重的責任感,才發現自己對學生生活有些戀舊,更可說是缺少面對未來的信心吧,我會繼續加油的。

[FreeBSD] 機器的時間有問題

這種現在大部分是因為機器內有多個時鐘,而 FreeBSD 選錯時鐘囉!

執行 dmesg(8),檢查一下有 Timecounter 字串的那幾行。最後一行是FreeBSD 選用的,通常是 TSC。

# dmesg | grep Timecounter
Timecounter "i8254" frequency 1193182 Hz quality 0
Timecounter "ACPI-safe" frequency 3579545 Hz quality 1000
Timecounter "TSC" frequency 350796127 Hz quality 800
Timecounters tick every 1.000 msec


可以執行 sysctl(3) 看一下 kern.timecounter.hardware 這個值做確認。

# sysctl kern.timecounter.hardware
kern.timecounter.hardware: ACPI-safe

BIOS 可能在一些情形下會更改 TSC 的時脈--有時候是因為在使用電池工作時會更改處理器的速度,另外也有可能是進入了省電模 式,可是 FreeBSD 並不會察覺到這些調整,而會發生時間增加或是減少的情形。

在上面的例子當中,我們看到還有 TSC 這個時鐘可以選擇,執行 sysctl(3) 用手動的方式將這個值寫入 kern.timecounter.hardware 中。

 # sysctl -w kern.timecounter.hardware=TSC
    kern.timecounter.hardware: ACPI-safe -> TSC

這樣應該就可以保持正確的時間了。

如果要讓這個更改的動作再每次開機時自動執行,在 /etc/sysctl.conf 裏加入下面這行。

    kern.timecounter.hardware=TSC

[FreeBSD] portupgrade(1) 相關資訊

From: http://infor.ck.tp.edu.tw/~rafan/documents/portupgrade.txt




注意注意

* always pkgdb -F before upgrade
* always backup /var/db/pkg (好吧,我承認我每次都沒做)

選項

pkgname_glob pkg_glob(1)

-a 全部安裝的 packages

-A 每次 install 後要跑的指令

-b 把舊的 package 備份到 PKG_TMPDIR or TMPDIR (default /var/tmp)

-B build 前要跑的指令 (如果 fail 的話,那這個 port/package 會被略過)

要更新 gnome* 前先 cvs update
portupgrade -B 'cvs update' 'gnome*'

不知道
portupgrade -B 'ports_glob -M $(pwd) | (cd
../..; xargs cvs up)' slave/port

通通都更新,除了 interactive 的 ports
portupgrade -aB 'test ! `make -V IS_INTERACTIVE`'

-c 在 build 之前 clean (default)

-C 在 install 之後 clean (default)

-D 在 fetch/build 之前 distclean

-f 強迫更新一個要被 downgrade 或相同版本或在 pkgtools.conf 標記為 HOLD_PKGS
的 package

-F 只會把 distfiles 抓下來(如果加 -P 則是抓 packages)

-g 強迫更新 require 的 package 更新失敗的 package

-i interactive 就是會問你要不要的 (implies -v)

-I 把結果丟到 FILE 去

-L 把每一個 port build & install 結果丟到 PREFIX 去
存成 ::

-m 要 append 給 make(1) 的參數

-M 要 prepend 給 make(1) 的參數

-n 看看會幹些什麼事情 (implies -v, negates -i, -y)

-N 安裝新的 port/package 而且會先更新所有 require 的 packages
可以指定 portorigin glob

-o 指定 ORIGIN

-O 別做完整的 denendency check(如果跑之前有 pkgdb -F 那可以放心的用)

-p 在 install/upgrade 後生出 package,如果有指定到 dependent package
的話(like -r),那些也會生 package

-P 用 package,會去掃 PKG_PATH,找不到就 pkg_fetch 再不然就用 ports

-PP 堅持只用 package,不用 ports

-q 不要讀 $PREFIX/etc/pkgtools.conf

-r 把 depends on given ports 的 packages 也一起更新
比如說 -r png-* 的話,會把需要 png 的 packages 一起更新

-R 把 given ports 需要的 packages 也一起更新
比如說 -R kde3 的話,會把其他 kde3-* 的一起更新

-s 在需要 root 權限的時候執行 sudo

-S 取代 sudo(8) 的指令,例如 su root -c %s ''

-u 不要保留舊的 shared libraries

-v verbose output

-w 不要在 build 之前 clean

-W 不要在 install 之後 clean

-x 排除 match GLOB 的 packages
例如 portupgrade -rx XFree86 XFree86 會更新所有 depends on XFree86 的
packages,卻不更新 XFree86 本身

-y 所有問題通通回答 yes (implies -v, negates -n)

portuprade 流程

1. 沒給 -P 的話,跳到 4。否則 search PKG_PATH 看看有沒有新的 packages,
有找到的話,跳到 5。

2. 用 pkg_fetch(1) 去抓新的 packages 下來,如果是最新的話跳到 5。
如果給 -PP 但抓下來的 packages 比安裝的新(不一定是最新)的話,
也跳到 5。

3. 如果給 -PP 的話,停止作業。

4. build given package 相對應的 port。

5. 修 depends on given package 那些 packages 的 dependency。

6. save given package 的 +REQUIRED_BY。

7. 把 given package 用 pkg_create(1) 備份下來。

8. 把 given package 的 registration 檔案備份下來。

9. 強迫 uninstall given package,並保留 share libraries,
除非有指定 -u。

10. 安裝新的 port or package(看是 cond. 1 or 2 or 3)。

11. 如果安裝失敗,
11.1. 把 7. 備份的檔案還原。
11.2. 把 8. 備份的 registration 檔案還原。
11.3. 把 5. 修過的 dependency 還原。

12. 把 obsoleted 的 dependencies 移除。

13. 把 6. 備份的 +REQUIRED_BY 復原。.

14. 執行 portsclean -L 把重複的 share libraries 砍掉,
並且保留舊的 share libraries,詳情請見 portsclean(1)。

一些例子

o. portupgrade glib
更新 glib

o. portupgrade XFree86 -m '-DWANT_GGI' Mesa
傳 -DWANT_CGI 給 Mesa。
當 portupgrade 用在很多 packages 上面時,他會依照 dependency order 處理。

o. portupgrade -L /var/tmp/log. '*gnome*'
更新所有 GNOME packages,並 log 在 /var/tmp/log.::

o. portupgrade -Rpv sawfish
更新 sawfish 和所有 sawfish 需要的 packages

o. portupgrade -ri glib
更新 glib 和所有需要 glib 的 packages

o. portupgrade -rfx sdl sdl
更新/重安裝所有需要 sdl 的 packages 但不包含 sdl

o. portupgrade -f '<2001-09-20'
更新/重安裝所有在 2001/09/20 前安裝的 packages

o. portupgrade -fr png -x '>=png'
更新/重安裝所有在 png 前安裝且需要 png 的 packages

o. portupgrade -aFR
去 fetch 更新所有 packages 需要用的 distfiles

o. portupgrade -o print/ghostscript-afpl ghostscript-gnu
用 print/ghostscript-afpl 換掉 ghostscript-gnu

o. portupgrade -P glib
用 package 更新 glib

o. env PKG_PATH=/mnt/cdrom/packages/All portupgrade -anPP
用 CDROM 裡面的 packages 來進行大量更新
如果不想讓 portupgrade 去 fetch 不在 CDROM 的 packages 的話,
把 PKG_FETCH 設定為 /bin/false

小技巧

o. 在進行 binary uprage 後,請用 pkgdb -F 修一下 dependencies。

o. 透過網路進行大量更新 portupgrade -aPPR。

o. 如果懷疑 portupgrade 倒底會幹哪些事情的時候,請用 -n 和 -i,
也可以用 pkg_glob(1) 來看 glob patterns 到底會展開成什麼。

o. 為了讓更新更正確、更有效率,請愛有事沒事跑一跑 pkgdb -F,
每次 CVSup 更新完 ports tree 之後,portsdb -Uu,以確保 INDEX 跟 ports
tree 同步。

o. 可以用 portversion(1) 取代 pkg_version(1) 來檢查可以 upgrade 的
packages。portversion(1) 用法跟他一樣,而且比較快。
portversion -c 可以輸出給 portupgrade(1) 更新用的 script。

o. 可以用 pkg_deinstall(1) 取代 pkg_delete(1) 來移除 packages。
這其實是 pkg_delete(1) 的 wrapper,不過有些更好的特性,
比如說 recursive deinstall 或者保留 shared library。

o. 可以用 portsclean(1) 清理不需要的 distfiles、working、
舊的 shared libraries。

o. 可以用 portcvsweb(1) 來看看一個 port 的 change。

環境變數

這邊列出來 default 的值,不多做解釋。

PKG_DBDIR /var/db/pkg
PORTSDIR /usr/ports
PORTS_INDEX $PORTSDIR/INDEX
PORTS_DBDIR $PORTSDIR
PKG_TMPDIR
TMPDIR /var/tmp
PACKAGES $PORTSDIR/packages
PKG_PATH $PACKAGES/All
PKG_SUFX 定義在 bsd.port.mk 或 /etc/make.conf
PKGTOOLS_CONF $PREFIX/etc/pkgtools.conf
PORTUPGRADE 預設 portupgrade 的選項

SEE ALSO
pkg_add(1), pkg_deinstall(1), pkg_delete(1), pkg_glob(1), pkg_info(1),
pkg_sort(1), pkg_update(1), pkgdb(1), portcvsweb(1), ports_glob(1),
portsclean(1), portsdb(1), portversion(1), pkgtools.conf(5), ports(7)

BUGS

SUSP (^Z) 在 build/install 過程中沒有用。

有時候 database 會爛掉導致 pkgtools segmentation fault,這樣子的話,
用 pkgdb -fu 重新 build database 問題就可以解決。

[FreeBSD] 動態載入相關資訊

From : BSD 討論版 @ 酷!學園, 2002/07/26 的文章對話

  • FreeBSD不是把硬體裝置都編到Kernel內了, 那 /modules 除了放 ScreenSaver 外, 到底是作什麼用的?
  • 不知您有無注意到,在編譯核心時,最後在 Install 的時候,不是會有安裝 module 的訊息嗎? 那就是將可以採用模組載入的方式的硬體,不管是否已編入核心了,全部都給編成模組,以方便某些未編入核心的硬體,要使用時可以動態載入使用。
    如果已開完機且登入到系統了,可以使用 kldload <module name> 來動態載入
    kldunload <module name> 來卸載
    kldstat 來查看目前載入的模組狀態
    如果要在開機前載入未編入到核心的硬體模組,可將其寫入到 /boot/loader.conf 檔案中,詳細的模組載入語法,請查看 /boot/defaults/loader.conf 便知。
  • 那可以作基本的kernel, 其他的裝置及服務都以modules的方式載入吧! 像Linux那樣!
  • 當然可以呀,而且如果沒記錯的話,早在 2.X 版就已支援這種作業方式了,搞不好更早 ^_^
    不過哩,就像 Linux 一樣,有些硬體是尚未支援動態載入的,所以如果需要用到的話,還是只能乖乖的編到核心中地。
  • 對呀,不過因為版本已和黑皮書時的版本不同了,所以載入模組的指令也已不一樣了 ^_^
    對了,如果沒記錯的話,Linux 的核心,好像也是有分可模組化和不可模組化吧??
  • Linux下用make menuconfig時, 可以作成modules的會有個"M"的選項, Linux下作成Modules的也多半是硬體裝置及一些功能(Firewall AP Support)...

簡單的來說,系統一些硬體裝置大部分都是編進 kernel 的,然而,也有提供需要時再載入的方式,嘿,可以回想讀OS的心情喔!至於後者的使用方式,就稱為動態載入,因此,有些系統軟體安裝就會分成要編 kernel 或是採用動態載入啦,不過要留意的是,有些功能是限定編入 kernel 來使用的,需留意啦。