2007年3月30日 星期五

研究所

今年的研究所考試都放光光了!不知算不算好運,有備取中正資工,扣除之外,全部都落榜。昨天放榜完時,同寢的學弟問了我一句話:你不會覺得很Sad嗎,因為沒有留在交大。他們總把我說的很強,但實際上我對考試真的一竅不通。說真的,我現在的心情滿亂的,只有一個念頭,那就是我累了。

回憶起這重考的一年裡,我發現自己的生活過得滿隨性的,從暑假八月起算開始唸書,但讀三十分鐘休息三小時,大約從八月到十月中,我只把黃子嘉離散上看過一遍,當時的心境很快樂,偶爾花點時間想想數學,生活頗悠閒;回到學校住宿後,我開始積極地念書,每天中午十二點左右到圖書館唸書,唸到晚上九點多,其中只有三十分鐘是吃晚餐的時間,現在回想起來,好像滿算用功,那陣子讀的是黃子嘉的線代;約末期末考,準備完沒多少久回家過寒假了。再來用功唸書的時段,就變成只有26號開學起唸書,當時還滿認真的,因為時間不夠,每天都一直在看書,鮮少發呆,也不怎想聊天。

紀錄一下

2006年八月~十月:
  離散數學,只看完離散上跟離散下的樹,沒有做任何習題。還有播出一個禮拜看了計組一次。
2006年十月~十二月:
  線性代數,只看完線代上跟線代下少部的第六章和第七章,但卻是我第一次為自己讀的書作筆記,足足把一隻原子筆寫完。印象中還有稍微看過資結講義一次跟OS參考書一次,那本OS參考書我覺得對考試沒什麼用,但對於認識作業系統,大概有些用處吧。
2007年二月底:
  一、二月發生了很多事,並沒有什麼心力唸書,直到二十四號回學校後,我才發現只剩不到幾天要面對考試,我開始規劃所剩的日子要怎樣準備。從開學到離交大考試前的日子,大概是我人生中最最努力念書的時期吧,雖然只有短短的三個禮拜。

我努力真的太少太少,又感到好浪費人生。現在有點累,該好好休息一下。考研究所就種事,能不要碰就不要接觸吧,甄試上吧!考運真的影響最大,隨意翻一下備取中正資工的那些人,你就能體會這種道理。

[Linux] Fedora Code 6 安裝設定與更新

Step 1 : 去找 FC6 的安裝檔案並燒成光碟吧!
Step 2 : 安裝 FC6, 簡單的步驟



  1. 選擇語言 : Chinese(Traditional)(繁體中文)

  2. 選擇鍵盤 : 美式英文

  3. 設定硬碟分刻 : 選自訂 > 割 SWAP 512MB > 割 /root 250MB, 格式 ext3 > 其餘就都給 / , 格式 ext3

  4. 設定開機選單 : 預設還是給 Win XP 吧

  5. 網路設定 : 自行選擇

  6. 時區選項 : 亞洲/台北

  7. 軟體安裝 : 請勾選  [辦公軟體/生產軟體] , [軟體開發], 剩下的有需要才勾選 [網頁開發], 並進入 [ 立即自定]

  8. 立即自定 : 程式開發 > 相容舊式軟體開發 ; Base System > 系統工具



Step 3 : 安裝完, 起動後, 進入設定部份. 防火牆設定; SELinux > Permissive ; 顯示, 音效, etc
Step 4 : 更新系統

使用 yum, 而 yum 預設就有安裝,  以 cmd  mode  去編輯 /etc/yum.conf  設定檔
設定更新的來源, 可以提升更新的速度, 而義守大學是官方認可處
@ /etc/yum.conf, 增加下面兩段
[base]
name=Fedora Core $releasever - $basearch - Base
baseurl=http://ftp.isu.edu.tw/pub/Linux/Fedora/linux/core/$releasever/$basearch/os/
gpgcheck=0
[updates-released]
name=Fedora Core $releasever - $basearch - Released Updates
baseurl=http://ftp.isu.edu.tw/pub/Linux/Fedora/linux/core/updates/$releasever/$basearch/
gpgcheck=0

之後, 則可以以 cmd mode 來更新系統.
更新指令: yum update, 亦可使用 yum -y update, 即一堆回答都會答 yes
若使用指令時會出錯, 如:
Existing lock /var/run/yum.pid: another copy is running. Aborting.

即因為系統已有一隻在跑, 因此需要把那隻先停掉:
# chkconfig --level 35 yum-updatesd off
# service yum-updatesd stop
接下來則可以使用 yum -y update 囉

若安裝後的顯示畫面是 800x600, 想修改的話, 請到 [系統] > [管理] > [顯示] > [硬體] > 設定螢幕, 大概就可以解決囉

2007年3月28日 星期三

適應新的環境

剛剛重新灌了電腦,想說開始始用 Firefox 來取代掉 PCman 啦,說真的,人一變老後,學東西就會停頓。回想起以前也想學嘸蝦米輸入法,但卻擺脫不了舊注音的快感!哈。

要一個人改變,真的不是件容易的事啊!

剛重灌時,隨手翻閱了Open House企業徵才的小雜誌,發現有些認識的人在上頭,更產生莫名的尊敬感,原來別人是花了多少心力在做事,努力才可搭上機緣啊。

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 來使用的,需留意啦。

2007年3月26日 星期一

[FreeBSD] FreeBSD 詳細的安裝教學 - 舊安裝方式

這篇是以前大三修交大資工計算機系統管理課程中的投影片,從中取出紀錄的過程。當時使用的 FreeBSD 4.10 左右的作業系統,在此當作個筆記記錄回憶啦。比較新的方式可參考:[FreeBSD] 安裝 FreeBSD 與系統更新


我習慣用光碟安裝,所以以 6.1 來說,就是去抓光碟啦

至於安裝的套件就選:



  1. base  : binary

  2. kernels(all) : Generic kernel and SMP kernel

  3. Man  : Manual

  4. src  : FreeBSD Source Code

  5. ports  : FreeBSD Software Collection

  6. local  : local additions


安裝完套件可以調的東西:



  1. Root Password

  2. Time Zone > Asia > Taiwan

  3. Mouse > enable

  4. Networking > sshd

  5. Packages (optional), ex: net/csup, editors/vim-lite


抓取更新系統的檔案:



  1. pkg_add ftp://freebsd.csie.nctu.edu.tw/pub/releases/i386/6.1-RELEASE/packages/net/csup-20060223_1.tbz

  2. 編寫 /usr/local/etc/cvsup-all 更新檔案

    • Where to get source

    • Where to put status file

    • Where to put source

    • Allow cvs to delete

    • Compress before transmit



  3. *default host=freebsd.csie.nctu.edu.tw
    *default base=/usr
    *default prefix=/usr
    *default delete use-rel-suffix
    *default compress
    *default release=cvs tag=RELENG_6
    src-all
    ports-all tag=.


  4. 記得寫一下 /etc/make.conf 檔
    MASTER_SITE_OVERRIDE?=  \
             ftp://freebsd.csie.nctu.edu.tw/pub/distfiles/${DIST_SUBDIR}/\
             ftp://ftp.tw.freebsd.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}/\
             ftp://ftp2.tw.freebsd.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}/\
             ftp://ftp3.tw.freebsd.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}/\
             ftp://ftp4.tw.freebsd.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}/\
             ftp://ftp5.tw.freebsd.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}/\
             ftp://ftp7.tw.freebsd.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}/\
             ftp://ftp8.tw.freebsd.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}/


    WITHOUT_X11=YES



  5. # /usr/local/bin/csup -L 1 /usr/local/etc/cvsup-all > /var/log/csup.log
    The “–L 1” tells cvsup to print out the details of all the file updates it is doing. from 0 (silent) to 2.


更新步驟:




  1. make buildworld



    • # cd /usr/src



    • # make buildworld >& /var/log/world.log &





  2. make buildkernel



    • # cd /usr/src/sys/i386/conf



    • # cp GENERIC “YOUR-NAME”



    • # edit config file





  3. make installkernel



    • 新的方式
      # cd /usr/src
      # make KERNCONF=YOUR-NAME buildkernel


      其他資訊







      • Note: This method of kernel building requires full source files. If you only installed the kernel source, use the traditional method.






      • Tip: By default, when you build a custom kernel, all kernel modules will be rebuilt as well. If you want to update a kernel faster or to build only custom modules, you should edit /etc/make.conf before starting to build the kernel:
            MODULES_OVERRIDE = linux acpi sound/sound sound/driver/ds1 ntfs









    • 舊的方式
      @ /usr/src/sys/i386/conf/
      # /usr/sbin/config YOUR-NAME
      # cd ../compile/YOUR-NAME (or ../../compile/YOUR-NAME )
      # make dependclean (6.1版會提醒你要作這步, 之前的只有提醒做 make depend)
      # make depend
      # make
      # make install





  4. reboot and boot in single user mode



    • 使用 shutdown now 或



    • Press "4" 於開機選項





  5. mergemaster -p



    • Pre-buildworld mode.  Compares only files known to be essential to the success of {build|install}world, including /etc/make.conf.





  6. make installworld



  7. mergemaster



    • Synchronize /usr/src/etc with /etc



    • Choose “i” for most case, such as /etc/defaults/rc.conf, …



    • Press “enter” for certain file, such as master.passwd, hosts, csh.*





  8. reboot



如果有任何錯誤的話:




  • Possible errors in building new kernel



    • Boot with old kernel



      • In 5.x ~



        1. Press “6”



        2. Type “boot /boot/kernel.old/kernel”




      • In 4.x



        1. Hit any key other than “enter” when counting down



        2. Type “unload”



        3. Type “load /kernel.old”



        4. Type “boot”








上述的一些過程可以當作更新系統的方法,但有些部分不適用於已安裝好的系統,即已安裝於系統的軟體並不會得到更新,必需額外使用軟體來進行更新,這是以前的文章(用的是 cvsup ,現在大多改用 csup ):





  • 安裝所需的軟體



    • cvsup
      # cd /usr/ports/net/cvsup-without-gui && make install



    • portupgrade
      # cd /usr/ports/sysutils/portupgrade && make install



    • 打這個指令讓才剛裝好的程式立即可以使用:
      rehash



    • cvsup 是個工具,她可以幫我們至 FreeBSD 站台更新 Source-Tree 及 Ports-Tree 回來您的主機中。portupgrade 是 FreeBSD 中升級以 PORTS 安裝的軟體的一個套件(必須是您更新 Ports-Tree 之後)。





  • 更新 PORTS-Tree 且升級已安裝的軟體



    • 取回「更新 PORTS-Tree的設定檔」cvsupfile-ports:
      fetch ftp://ftp.tw.freebsd.org/pub/CVSup/cvsupfile-ports



    • 依據 cvsupfile-ports 中的定義,至 CVSup 站臺更新 PORTS-Tree
      cvsup -g -L 2 cvsupfile-ports



    • 先重建您系統中 PORTS 的 INDEX 資料庫
      這個部份恐需時甚久,而且會令你覺得是不是當機了,所以請耐心等候。
      portsdb -Uu



    • 再接著是修補程式間的關連性,才能正確並有效率的升級已安裝的軟體
      pkgdb -F



    • 為了以防萬一,我們先做個升級的假動作:
      portupgrade -ayn



    • 如果剛剛的升級測試都沒有問題,現在就可以正式來一遍了:
      portupgrade -ay



    • 你可以寫一個批次檔讓此程式來執行:
      #!/bin/sh
      cvsup -g -L 2 cvsupfile-ports
      portsdb -Uu
      pkgdb -F
      portupgrade -ayn



    • 更詳細的資訊,您可以
      man  portupgrade






[FreeBSD] 調整自己的最佳環境 - CPUTYPE

依照自己的 CPU 的型態去作調整,即在 make.conf 中去編寫CPUTYPE。


取得自己的 CPU Type:




  1. cd /usr/ports/benchmarks/ubench



  2. make extract



  3. make "CPUTYPE?=k6-2"



  4. 執行 work/ubench-x.xx/ubench 看分數



  5. 然後再 make clean ; 再換新的CPUType去編,再看分數



使用 extract 即下載並解壓縮,但不安裝。至於 CPUTYPE 可從  /usr/share/examples/etc/make.conf 找尋,不確定的話就透過上述步驟,去測看看哪個分數高,就是你的CPUTYPE啦,透過這簡單的調整,可以增進效能喔!


2007年3月22日 星期四

上課的態度

大學,求學的心態彷彿是往後走。

大一時,我上下學期修了27學分,但被當了2學分;大二時,上學期22,下學期27;大三時,上學期24,下學期19;大四時,上學期11,下學期11,但被當了6學分延畢。大五的生活?課當然不會超過六學分。

自從大四生活後,開始覺得自己對課程的吸收度有點退步!大一可以一下就適應高學分的學期,大四下卻連四門課都搞不定?發現自己大五的生活也有點如此,並不是能力的問題,而是心態上的積極度。

該找個方式找回學習的積極度了。我想,做個筆記是個不錯的開始。

人生永不止步

昨天晚餐前,成大放榜了,依舊跟去年一樣,榜上無名。有時會有深刻的感觸,大概是不善於考試,抑或考試與唸書是兩回事。今年比較會到批踢踢的升學板打混,發現有許多人失落,儘管幾家歡樂幾家愁,但落榜的不在少數。

今天早上上完課,剛聽我同學說,交大的考卷也都改完了,看來又得再接受打擊了,哈。回想起考完交大的那天,頗失落的!畢竟重考的,對考卷的敏感度會上升,似乎成績還未出來就可猜測結果。於是,我渡過了寢室中的失落。我開始在想,沒了碩班的生活未來將會是個如何?最大的影響應該是學習的規律!

去年,我直想著呆在原處,因為資源與機會。今年,我的思考有了不一樣的方向,我甚至有點擔心離開學生後的生活。回想起某位長輩說過的話,我開始對學位感到敏感,儘管自覺能力不差,但現在的我還沒學會證明的技巧。

約莫兩個月的學生生活,我得趕緊把證明的方式明確。

2007年3月21日 星期三

昨夜

昨天是土地公的生日,同寢的學弟的家長打電話過來催他去拜拜,我考完試也沒什麼事,於是就”主動”要當跟屁蟲一同去拜拜,說真的我很少對這等事熱衷。晚上回寢室後,寢室學弟的以前高中同學,說要放天燈,結果我又”主動”說要跟去放,哈,做了許多跟平時個性不相像的事,不過一時間沒搞清楚,原來今天是他們高中同學的生日,儘管碰面時已過午夜了。看著大伙嘻鬧的身影,倒想起了自己歲數。

整體上有點像似在過過大一時的時光,有人在練火球,有人熱衷於……青春!哈,就是青春兩字,至於我的願望嘛,希望家人身體健康以及我和認識的都能考上研究所啦!(儘管有間在剛剛放榜了,而結果……)

2007年3月20日 星期二

[PHP] 只能下載的Web-FTP

簡單的Web-FTP


去年秋天,我寫了一個PHP的程式,主旨是要善用資源,呵呵。其最大特色是提供檔案下載時的續傳功能,有人可能覺得這好像脫褲子放屁,因為不用寫就可以達到了啊!只不過我龜毛了點,我要把待分享的檔案縮到public_html上層,其最大目的就是避免連結外流,即連結外流對方也下載不到檔案。這類的設計通常都是用開檔讀檔的方式餵檔案給下載者,只是,這樣一來就沒有續傳的功能,於是我請教了我強者同學,他跟我說可以去看看HTTP_Download,它提供Ranges (partial downloads and resuming),於是,我要做的事也被做完了,哈!於是我的工作就變成了使用者介面!

昨天,我開始整理我大學時所寫過的程式,自覺需要一個好的瀏覽方式,於是乾脆跟 Web-FTP 結合算了,不知不覺其功能也蹦了出來,不過這次使用的卻是對岸強者已搞好的 Wordpress Plugin - Coolcode,而我的工作其實有點倒退步,就是改寫成不是Wordpress的插件,並整合在 Web-FTP 啦。看其程式的感覺,第一個念頭是 Compiler 跟 Assembler ,實在是這兩個曾經也是我的作業啊。

[PHP] 增加 include_path 的方式

以 PEAR 為例, 被擺在 lib 中的
    $pear_dir = 'lib/PEAR';
if(is_dir($pear_dir))
ini_set("include_path", ini_get("include_path") . PATH_SEPARATOR . $pear_dir);

require_once 'PEAR.php';

2007年3月19日 星期一

進入另一個階段

研究所考試考完了!順便也把Wordpress的版本更新,不過我把以前的文章順便都清掉,並備份在 http://changyy.wordpress.com/ 還有我的信箱中啦。原本有點打算不再架了,直接用別人做好的網誌服務,但發現我還沒有學好CSS!是哩,其實架這個還有一個目的是要自己去寫出自己的風格的,因此,我又繼續維護這個小小的網誌囉,未來的方向嘛,可能是簡單的心情,也有可能是我玩東西的紀錄囉,大概就這樣吧!

[Javascript] 股票列表

股票列表


之前有認識的會常看股票,通常網路上是去某個很大的入口網站,但由於一次只能看一支股票,所以若同時要看很多股票時,就只能開很多個網頁來看,所以,我就藉機練了一下Javascript的啦,好處:寫好的程式就直接存成HTML檔,一般都可以在自己的電腦上執行就可使用啦!哈哈,不過我印象中有版權的東西若改變其排版似乎有違法的現象?所以,玩玩就好,別人還得靠廣告生活哩。


2007年3月18日 星期日

快失業了

今天考完清大資工所,總算我的大學考試到了一個段落,至於會不會有學校可念,說真的我不敢期望!昨兒考完交大資工所後,心情很失落,實在是我最想進的學校還是宅宅大學,畢竟論起網路或學習資源來說,交大是首選,只是,似乎老天不怎眷顧?或許更該說,我的努力還不夠吧?反正若有機會備上任何一間學校,我會更加珍惜。 昨天考完後,心情幾番失落,有了很深刻的體悟,在此就稍微列下幾筆:

大四末,深感學校之資源與機會的廣闊,深深體會,原來我大學的小小成就,都是因為環境跟資源所付予的成果,若沒了環境,就沒了我!明瞭此事,開始看重研究所,畢竟在這之前,我對研究所的生活覺得只是像不斷地做專題的行為,隨後有學長稍微點到,還有學習新知識。

大五末,將進入第二十四個夏天,我驚覺自己人生的五分之一竟然是在大學渡過!當研究所考試不順之後,我發覺我的學習可能因此而停頓!或許去年某個人還差我一大截,但現在的他,在研究所少說也混了半年,而我在這年卻沒有進步!最深的體會,是對於硬體課程的學習,「沒有一間企業,會像學校那樣地教導!」最重要的是,有些課程所需的資源,不是一個人、一個普通的家庭可以負擔的!

因此!我打算利用所剩的幾個月的學生生活,好好地地將過去大學課程,覺得有意義但學習混水摸魚的課程,紮實地重新復習!儘管未來我可能從事的不是資訊業,但至少,我會保留對大學學習之路的感謝。

[Java] Socket



public class SocketServerTest implements java.lang.Runnable{
private int PORT = 52288;
private java.net.ServerSocket server = null;
private boolean shutdown = false;
public void run(){
try{
server = new java.net.ServerSocket(PORT);
try{
while(!shutdown){
java.net.Socket socket = server.accept();
try{
//非 140.113 就關掉
if( (( ((socket.getInetAddress()).getHostAddress()).substring(0,8)).compareTo("140.113.") != 0 ) ){
socket.close();
continue;
}

String datain = null;
java.io.BufferedReader in = new java.io.BufferedReader( new java.io.InputStreamReader( socket.getInputStream(),"UTF-8" ) );
datain = in.readLine();
}catch(java.net.SocketException e){
//socket關掉
}catch(java.lang.NullPointerException e){
//in.readLine()
}finally{
socket.close();
}
}
}catch(java.net.SocketException e){
//socket關掉
}finally{
server.close();
}
}catch(java.net.SocketException e){
//socket關掉
}catch(Exception e){
e.printStackTrace();
}
}
}

[Java] 與 MySQL 溝通




class dbMySQL{

final private String dbDriver = "com.mysql.jdbc.Driver";

public String dbAddress = null;

public String dbName = null;

public String dbUrl = null;

public String dbUser = null;

public String dbPasswd = null;

dbMySQL(String db_url,String db_name,String db_user,String db_passwd){

setupDB(db_url,db_name,db_user,db_passwd);

}

public void setupDB(String url,String dbname,String dbuser,String dbpasswd){

dbAddress = url;

setupDBUser(dbuser,dbpasswd);

setupDBName(dbname);

}

private void setupDBName(String dbname){

dbName = dbname;

//dbUrl = "jdbc:mysql://"+dbAddress+":3306/"+dbName+"?useUnicode=true&characterEncoding=Big5";

dbUrl = "jdbc:mysql://"+dbAddress+":3306/"+dbName+"?useUnicode=true&characterEncoding=utf-8";

}

private void setupDBUser(String dbuser,String dbpasswd){

dbUser = dbuser;dbPasswd = dbpasswd;

}

public java.sql.ResultSet SQLquery(String cmd){

try{

Class.forName(dbDriver);

java.sql.Connection con = java.sql.DriverManager.getConnection(dbUrl, dbUser, dbPasswd);

if(!con.isClosed()){

java.sql.PreparedStatement pstmt = con.prepareStatement(cmd);

java.sql.ResultSet rs = pstmt.executeQuery();

con.close();

return rs;

}

}catch(java.lang.ClassNotFoundException e){

e.printStackTrace();//Can't find: "+dbDriver+"

}catch(java.sql.SQLException e){

e.printStackTrace();

}

return null;

}

public String SQLupdate(String cmd){

try{

Class.forName(dbDriver);

java.sql.Connection con = java.sql.DriverManager.getConnection(dbUrl, dbUser, dbPasswd);

if(!con.isClosed()){

java.sql.PreparedStatement pstmt = con.prepareStatement(cmd);

pstmt.executeUpdate();

con.close();

return "OK";

}

}catch(java.lang.ClassNotFoundException e){

e.printStackTrace();

}catch(java.sql.SQLException e){

e.printStackTrace();

}

return "NO";

}

}



/* 使用方式
class Test{
private dbMySQL DB = null;
public Test(String db_url,String db_name,String db_user,String db_passwd){
DB = new dbMySQL(db_url,db_name,db_user,db_passwd);
DB.SQLupdate("DELETE From `MySQL_Table_Name`");

java.sql.ResultSet SQLrs =null;
SQLrs = DB.SQLquery("SELECT * FROM `MySQL_Table_Name`");
if(SQLrs != null){
while(SQLrs.next()){
//因為是用 UTF-8 存的, 所以讀出來要轉成 Big5
String data = new String( SQLrs.getString("欄位名字").getBytes(), "Big5");
}
}
}
}
*/


[Perl] 跟MySQL溝通




use DBI;



$dbh = DBI->connect('dbi:mysql:database=DM;host=140.113.55.66','5566','7788');

$sql = "select count(*) from `Games` Where `GameID`='55667788'";

$sth = $dbh->prepare($sql);

$sth->execute || die "Could not execute SQL statement ... maybe invalid? \n\n $sql \n";

#output database results

#while (@row=$sth->fetchrow_array){ print "@row\n" }

@row=$sth->fetchrow_array;

print "@row[1]\n";


[Perl] 檔案處理與簡單的判斷例子





# 檔案位置


$wwwshow="/home/user/public_html/test.htm";





# 開檔失敗,則會換成執行後面那段話


open(FD_In,$wwwshow) || die "Can't open file: $!" ;





while( defined($LineIn = ) ){


# 若有出現溫度跟F的符號,進行切字的笨手段


if($LineIn =~ /°F/){


# get thermometer F;


@tmp01Line = split($splittoken01_a,$LineIn);


@tmp02Line = split($splittoken01_b,$tmp01Line[1]);


$thermometerF{$location[$i]} = $tmp02Line[0];


$thermometerC{$location[$i]} = ($thermometerF{$location[$i]} - 32) * 5 / 9;


# get thermometer Feel Like F;


@tmp01Line = split($splittoken02_a,$LineIn);


@tmp02Line = split($splittoken02_b,$tmp01Line[1]);


$thermometerFeelLikeF{$location[$i]} = $tmp02Line[0];


$thermometerFeelLikeC{$location[$i]} = ($thermometerFeelLikeF{$location[$i]} - 32) * 5 / 9;


# get weather


@tmp01Line = split($splittoken03_a,$beLine);


@tmp02Line = split($splittoken03_b,$tmp01Line[1]);


$weather{$location[$i]} = $tmp02Line[0];


}elsif($LineIn =~ /$splittoken04/){


@tmp01Line = split($splittoken04_a,$LineIn);


@tmp02Line = split($splittoken04_b,$tmp01Line[1]);


$updatetime{$location[$i]} = $tmp02Line[0];


# last 指的就是 C/C++ 中的 break


last;


}


$beLine = $LineIn;


}


close(FD_In);


# 把檔案刪掉


unlink($wwwshow);





# 開檔準備寫入


open(WEATHER,">$wwwshow") || die "Can't open file: $!" ;


print WEATHER "Weather Information\n";


close(WEATHER);