Search results for [ %s ] - 80 hit

WikkaWiki 1.1.60 繁體中文版下載

檔案下載

  • 名  稱: WikkaWiki
  • 版  本: 1.1.60(20050214)
  • 檔案大小: 612.62 KB
  • 語言介面: 中文版
  • 版本性質: Freeware
  • 釋出日期: 2005/02/14
  • 作業平台: Linux
  • 原創網站: Wikka Wakka Wiki
  • 檔案下載: 主程式(1160-20050214)

用 Wiki 來編寫文件實在是一種很好的模式,拿 Wiki 來當 "共同創作" 、 "知識管理" 或 "文件管理" 也都是很好的應用。網路上的 Wiki 套件有很多,但應該都還有很大的成長空間,也因為一直找不到心目中理想的 Wiki,所以就自己動手修改了 WikkaWiki。
Read more

實用的 screen 終端機管理程式

screen 是一個很方便的終端機管理程式,可以讓你在同一個終端機開啟多個 Session 來操作,加強多工的處理。即使你要離開電腦,也可以將 Session 執行脫離,或直接關閉終端機,這時執行中的程式還是會繼續執行,下次登入終端機時再取回 Session 來操作即可。

首先執行 Screen 程式,開始一個 Session:

$ screen

某些終端機視窗會在標題列顯示目前在操作的終端機編號,如果沒有顯示,你也可以輸入:

$ tty

來了解你目前正在哪個終端機中。

以快速鍵操作

切換時的快速鍵一開始都是 Ctrl + A

  • 新增 Session:
    Ctrl + ACtrl + C
  • 切換到上一個編號的 Session:
    Ctrl + ACtrl + P
  • 切換到下一個編號的 Session:
    Ctrl + ACtrl + N
  • 切換到指定編號的 Session:
    Ctrl + A數字鍵
  • 切換到下一個編號的 Session:
    Ctrl + ASpace
  • 在兩個 Session 之間互相切換:
    Ctrl + ACtrl + A
  • 鎖定 Session:
    Ctrl + ACtrl + X
  • 顯示 Session 列表,可供你選取:
    Ctrl + A⇧Shift + "
  • 新視窗的標題列顯示所有的 Session 編號 (其中有加上 * 表示是目前使用的 Session) :
    Ctrl + ACtrl + W
  • 水平分割視窗 (可以持續分割) :
    Ctrl + A⇧Shift + S
  • 垂直分割視窗 (可以持續分割,只有特定版本才支援,請參考後方的說明) :
    Ctrl + A⇧Shift + |
  • 在分割的視窗做切換:
    Ctrl + ATab
  • 關閉分割的視窗:
    Ctrl + A⇧Shift + Q
  • 將所有的 Session 脫離(Detach),並回到執行 screen 前的狀態:
    Ctrl + ACtrl + D
    在這種狀態下,用戶可以不須理會這些 Session。不管用戶離線或是要從別的地方登入,只要下次登入時執行:

    screen -r

    將所有 Session 叫回來繼續操作。

  • 重新命名 Session:
    Ctrl + A⇧Shift + A
  • 顯示日期、主機名稱及負載:
    Ctrl + ACtrl + T
  • 將畫面暫停 (程式仍繼續執行):
    Ctrl + ACtrl + S
  • 將暫停的畫面恢復:
    Ctrl + ACtrl + Q

screen 的相關指令

  • 啟動 Screen 程式,開始一個 Session:
    $ screen

    或指定 Id

    $ screen -S SessionId
  • 查看同一帳號共開啟過多少個 Session 及其 Id:
    $ screen -ls
  • 取回被脫離執行的 Session:
    $ screen -r

    $ screen -r SessionId
  • 將其它的 Session 強制脫離:
    $ screen -d

    $ screen -d SessionId

    這功能適用於原本操作的電腦當機或斷線了,讓你可以在下次取回還在主機中執行的 Session。

  • 同步操作終端機 Session (兩邊必須登入相同的帳號):
    $ screen -x

    $ screen -x SessionId
  • 移除 Session:
    $ screen -wipe SessionId

模擬頁籤顯示

如果要在畫面底部秀出現在在哪個編號的 Session,請編輯 /etc/screenrc 或 ~/.screenrc,加入:

hardstatus alwayslastline "%-w%{= BW}%50>%n %t%{-}%+w%<"

同步作業說明

假設我在我目前所操作的終端機 Session 要分享給另一端的登入者查看,並且可以操作 (或者是我不想將遠端登入的用戶脫離 Session),則我要先以我的帳號登入主機並且執行 screen -S 特定名稱,然後另一端的登入者:

  1. 以相同的帳號登入主機
  2. screen -ls 查看要取回的終端機 Session
  3. screen -x 特定名稱screen -x SessionId 進入相同的終端機 Session

垂直分割視窗

因為 screen 只能水平分割視窗,不能充分利用寬螢幕的特性實在有點可惜! 這裡有新版可垂直分割功能的 screen:

垂直分割 screen 視窗

請自行編譯安裝。

命令別名

因為 screen 很實用,於是我在 bashrc 建立兩個 screen 指令的別名:

alias scr='screen -d -r Normal || screen -S Normal'
alias scl='screen -ls'

我只要登入終端機就先打一次 scr,以取回上一次沒關閉的 Session。如果沒有上一次沒關閉的 Session,則會建立一個新的 Session。

scl 則可以列出目前有幾個屬於我的 session。

參考網頁

[轉載]apache 部份參數說明

轉載自: 小紅帽技術論壇


Part I

AllowOverride 的屬性功能

AllowOverride Limit 允許覆寫原連結屬性的範圍
AllowOverride Authconfig 可做密碼設定: 如: 藏密
AllowOverride Options 可將該目錄之 Options 功能覆寫
AllowOverride FileInfo 可將該目錄之任何文件型態覆寫, 如: DefaultType, ErrorType
AllowOverride Indexs 可將該目錄之顯示列印功能覆寫, 如: AddIcon, HeaderName, ReadName

Options 的屬性功能

Indexs 當無 index.html 可用列印目錄方式顯示, 如: center3 homepage 若用 -Indexs 則看不見 listing
FollowSymLinks 加一屬性如 +FollowSymLinks 可允許使用 symbol link 時, 依舊可瀏覽
ExecCGI 當為 +ExecCGI 可執行 CGI SCRIPT
Includes 可執行 Server site include, 若為 +Includes
IncludesNOEXEC 可執行 Server site include, 若為 +Includes, 但不可執行 CGI
None 沒有任何功能可用
All 均可
總之, 以 +, - 符號可加或刪減其功能, 若未給符號, 則只有初步功能

Read more

[轉載][PHP]正規表示式基本語法

轉載自: 中文 PHP 資訊站


首先讓我們看兩個特殊的符號: ^ 和 $。他們的作用是分別指出一個字串的開始和結束。例子如下:

  • ^The:表示所有以「The」開始的字串(「There」、「The cat」等);
  • of despair$:表示所有以「of despair」結尾的字串;
  • ^abc$:表示開始和結尾都是「abc」的字串--呵呵,只有「abc」自己了;
  • notice:表示任何包含「notice」的字串。

像最後那個例子,如果你不使用兩個特殊字元,你就在表示要查找的串在被查找串的任意部分--你並不把它定位在某一個頂端。

Read more

[轉載]Linux 上的用戶管理

轉載自: 中文 PHP 資訊站


在linux中,每個普通用戶都有一個帳戶,包括用戶名、密碼和主目錄等資訊。除此之外,還有一些系統本身創建的特殊用戶,它們具有特殊的意義。其中最重要的是超級用戶,在linux中,它默認用戶名是root。

基本操作

增加一個用戶 newuser :

useradd newuser
passwd newuser

然後根據提示兩次輸入新用戶的密碼,請注意,用useradd增加一個用戶後應該立刻用passwd給新用戶修改密碼,沒有密碼的新帳號將不能使用。在/etc/passwd文件中,沒有密碼的新用戶的記錄是如下一行:

newuser:!!:506:506::/home/newuser:/bin/bash

在這一行裏,用戶的密碼域被設置成了」!!」,這就意味著用戶密碼還沒有設置,用戶不能登陸。(passwd文件的格式是 用戶名:密碼:用戶ID(UID):組ID(GID):全名:用戶目錄:外殼腳本)。

當然你可以用-d參數設置新用戶的主目錄(例如:useradd newuser -d /www),也可以用-g參數為用戶指定新組名(例如:useradd newuser -g linuxusers),你還可以用-G參數把新用戶設成系統其他一些組的成員(例如:useradd newuser -G users,shutdown)。所有這些,你都可以在本站的命令查詢中得到詳細資訊。

附註:相應的,僅僅增加一個新組可以用命令groupadd。

修改現有用戶的帳號:

  • 修改密碼
  • 普通用戶可以用passwd修改自己的密碼,只有管理員才能用passwd username為其他用戶修改密碼。
  • 修改用戶shell設置
  • 使用chsh命令可以修改自己的shell,只有管理員才能用chsh username為其他用戶修改shell設置。注意,指定的shell必須是列入/etc/shells文件中的shell,否則該用戶將不能登陸。
    你也可以使用usermod命令修改shell資訊,如下所示:
    usermod -s(new shell path)(username)
    其中new shell path和username應取相應的值。
  • 修改主目錄設置
  • usermod -d(new home directory)(username)
    如果想將現有主目錄的主要內容轉移到新的目錄,應該使用-m參數,如下所示:
    usermod -d -m/www/newuser newuser
  • 修改UID
  • usermod -u UID username
    主目錄中所有該用戶所擁有的文件和目錄都將自動修改UID設置。但是,對於主目錄外該用戶所擁有的文件,只能手工用chown命令修改所有權設置。
  • 修改默認組設置
  • username -g(group name) or GID username
  • 修改帳號的有效期
  • 如果使用了影子密碼,則可以使用如下命令來修改一個帳號的有效期:
    usermod -e MM/DD/YY username
    例如把用戶newuser的有效期定為12/31/01:
    usermod -e 12/31/01 newuser
  • 刪除或禁止用戶帳號
  • 使用userdel命令刪除現有用戶。例如,下面的命令將刪除bluewind用戶:
    usedel bluewind
    如果想同時刪除該用戶的主目錄以及其中所有內容,要使用-r參數來遞迴刪除。值得注意的是你無法刪除已經進入系統的用戶,如果想強行完成,需要先killall有關它的進程,然後再運行userdel命令。
  • 如果只是想暫時禁止某個帳號,可以使用下列方法:
  • - 使用無效的shell。例如使用usermod -s newshell username將用戶的 shell改為/bin/false(最好把它列入/etc/shells文件裏)。
    - 使該帳號過期。如果使用影子密碼,可使用usermod -e MM/DD/YY username命令使該帳號過期。
    如果想禁止所有帳號(root帳號當然除外)的訪問,可以創建一個名為/etc/nologin的文件,說明系統暫時不允許訪問。注意,確認你還能用root直接登陸才使用這個辦法,否則你慘了。

    本文中的所有命令都可以在linuxaid獲得中文詳細的幫助,下面我們一起來繼續探討有關用戶管理的高級內容。

    建立多個超級用戶

    不少新系統管理員認為root用戶是唯一的超級用戶,其實root只是系統默認的超級用戶的名稱,root並非因為它叫root而成為超級用戶的。隨便打開一個/etc/passwd文件的例子,你就會發現如下幾行:

    root:asiewhgYfaoO/J:0:0:root:/root:/bin/tcsh
    bin:*:1:1:bin:/bin:
    daemon:*:2:2:daemon:/sbin:
    lanf:Yuao56Ioyefg:0:0:bluewind:/home/bluewind:/bin/bash
    jake:gUyfaiIodashfj:501:501:jake cheng:/home/jake:/bin/tcsh
    apache:!!:502:502::/usr/local/apache:/bin/false

    可以看到,root的UID和GID都被設置為0了。實際上,超級用戶的充要條件就是UID和GID都等於0。也就是說,任何用戶,只要它的UID和GID都為0,就與常被稱為root超級用戶沒有什麼兩樣了。比如上面那個例子裡面的lanf,也是一個超級用戶。

    所以,可以將任何普通用戶變成超級用戶。但是,這樣做並沒有好處,很多時候這都會增加系統的隱患。除非在組織中需要多個系統管理員管理同一個系統,這就需要有多個超級用戶帳號。這有利於各個管理員明確責任,通過日誌知道不同的人分別做過什麼事。

    還有一種情況,也可能出現多個超級用戶帳號,那就是黑客入侵後設置一個看起來象普通帳號的用戶,卻修改了UID和GID使之為0。這樣根本就不需要知道root用戶密碼,就可以執行超級用戶許可權了。而從我們的系統管理員的一方來說,我們不可能時刻注意passwd文件的變化的,沒有那個時間也沒有那個精力。這時只好編寫一個腳本來幫助監視,例如:

    /bin/grep '0:0' /etc/passwd |awk 'BEGIN{FS=":"}{print $1}'|mail -s "`date +"%D%T"`"root

    這是一個很小的腳本程式,使用了一些常規的命令來查看/etc/passwd文件,把UID和GID為0的行寄給root用戶。把這個腳本放在/etc/cron.daily文件中讓cron運行,root將每天收到一封信,報告當前的超級用戶。

    實際上,由於PAM(可插入驗證模組)的限制,在telnet上是不允許超級用戶登入的,也就是說,黑客修改了自己的UID和GID後,想再次登陸從而獲得超級用戶的許可權的話,不修改/etc/seuretty文件是不可能的–除非你傻到自己添加了為TTY設備ROOT用戶登陸許可權。一般可以讓超級用戶先用普通用戶帳號登陸,再su(su命令相關內容請參考本站命令查詢部分)。

    為普通用戶分配特權

    使用sudo命令可以允許普通用戶執行超級用戶才能執行的命令。無論是基於信任的建立需要時間,還是基於是否存在這種必要,我們都不會把超級用戶的所有權限輕易許人的。這是網管工作的原則。所以,當一些用戶必須訪問某些內容時,我們可以配置sudo以允許單獨的普通用戶運行特權命令。

    sudo命令允許已經在/etc/sudoers文件中指定的用戶運行超級用戶命令。例如,一個已經獲得許可的普通用戶可以運行:

    sudo vi /etc/passwd

    實際上,sudo的配置完全可以讓我們指定某個列入/etc/sudoers文件的普通用戶可以做什麼、不可以做什麼。/etc/sudoers的配置行如下:

  • 空行或注釋行(以#字元打頭):無用行。
  • 可選的主機別名行:用來創建主機列表的簡稱。必須以Host_Alias關鍵字開頭,列表中的主機必須用逗號隔開。例如:
  • Host_Alias REDHAT=binbu,qd

    其中binbu和qd是倆主機名,你可以用REDHAT(別名)統稱它們。

  • 可選的用戶別名行:用來創建用戶列表的簡稱。用戶別名行必須以User_Alias關鍵字開頭,列表中的用戶名必須以逗號隔開。其格式同主機別名行。
  • 可選的命令別名行:用來創建命令列表的簡稱。必須以Cmnd_alias開頭,列表中的命令必須用逗號隔開。
  • 可選的運行方式別名行:也是用來創建用戶列表的簡稱。不同的是,使用這樣的別名可以告訴sudo程式以列表中某一用戶的身份來運行程式。
  • 必要的用戶訪問說明行:用戶訪問的說明語法如下:
  • user host= [run as user ] command list

    在user處指定一個真正的用戶名或定義過的別名,同樣的,host也可以是一個真正的主機名或者定義過的主機別名。默認情況下,sudo執行的所有命令都是以root身份執行。如果你想使用其他身份可以指定。至於command list可以是以逗號分隔的命令列表,也可以是一個已經定義過的別名。例如:

    lanf binbu=/sbin/shutdown

    這一句說明lanf可以在binbu主機上運行關機命令。

    注意:

  • 可以在一行定義多個別名,中間用:隔開。
  • 可以在命令或命令別名之前加上!號,使該命令或命令別名無效。
  • 有兩個關鍵字:ALL 和NOPASSWD。ALL意味著」所有文件」(所有主機或所有命令),NOPASSWD意味著不用密碼。
  • 下面是一個sudoers文件的例子:

    #sudoers files#User alias specificationUser_Alias ADMIN=yourid:POWERUSER=hisid,herid#user privilege specification ADMIN ALL=ALLPOWERUSER ALL=ALL,!/bin/su

    第三行定義了兩個別名ADMIN和POWERUSER,第五行說明在所有主機上ADMIN都可以以root身份執行所有命令。第六行給POWERUSER除了運行su命令外同等ADMIN的許可權。

    [Perl]如何複製檔案及目錄

    use File::Copy;
    copy('file1.txt','file2.txt') or die "can't copy: $!\n";

    複製目錄

    sub copy_dir{
      my $source = $_[0];
      my $target = $_[1];
      use File::Copy;
      opendir(DIR,$source);
      while(my $filename = readdir(DIR)){
        if(-f "$source/$filename")){
          copy("$source/$filename","$target/$filename") or die "can't copy: $!\n";
        }
      }
      close(DIR);
    }

    參考網頁

  • File::Copy - Copy files or filehandles
  • [轉載][JavaScript]你所想像不到的 JavaScript

    轉載自: 愛德華日誌


    這不是一篇教你如何在網頁中應用 JavaScript 的教材。這是一篇讓你明瞭看似簡單的 JavaScript,其實其核心語法功能強大。我將在這篇文章中說明 JavaScript 物件導向的特性,並說明如何透過這些特性,達到傳統程式語言 (C++/Java) 所難以完成的功能。

    Everything is Object in JavaScript

    開宗明義:在 JavaScript 中任何東西都是物件:變數是物件、函式是物件,常數也是物件。證明方式:

    alert (typeof('abc'));
    alert (typeof(123));
    var ary = [123, "abc"];
    alert (typeof(ary));

    上面的 typeof 會顯示物件資料型態。得到結果分別是 string, number, object。

    Create Objects in JavaScript

    既然任何東西都是物件,那建立物件的方法就多了。直接看個例子:

    var main = new Object;     // 建立新物件
    main.x = 123; // 設定物件成員變數(屬性)之一
    main["y"] = "XYZ"; // 設定物件成員變數(屬性)之二
    alert(main["x"]); // 取得物件屬性並輸出
    alert(main.y);

    可以看到在 JavaScript 中,main.x 與 main["x"] 這兩種語法是通用的。其實在其他語言中,這兩種表示法的語意並不相同。我稍後再作說明。

    List All Members in an Object

    這是 JavaScript 的必殺技,使用 JavaScript 的人務必要學會這個技巧。底下函式可以傳回一個物件的所有成員的字串表達式,包括物件中的屬性及方法。在物件導向程式設計中,這種技術叫 reflection。

    function listMember(main) {
      var s = "";
      for( key in main )  // 使用 in 運運算元列舉所有成員
      s += key + ": " + main[key] + "\n";
      return s;
    }

    範例碼中的 key 會對應到物件中的屬性名稱,如 「x」 或 「y」,而 main[key] 則對應到屬性值。

    說這項技巧是必殺技的原因是,你可以透過這項技巧,將物件封裝的黑箱打開來,看看裡面藏有什麼東西。我常用這項技巧來看看 IE 與 Mozilla 的 Dom 物件模型有何不同。試試看下面呼叫範例,就可以知道這項技巧的強大了:

    var ary = [123, "abc"];
    alert (listMember(ary));
    alert (listMember(document.location));

    Construct Object with Initial Value

    要在建立物件的同時指定物件初始值,必須先透過 function 建立一個「原型物件」(或稱為 constructor),再透過 new 運運算元建立新物件。例如以下程式碼會建立一個二維陣列的原型,再產生一個新的二維物件。

    function Array2DVar(x,y) {  // 定義二維陣列原型
      this.length = x;
      this.x = x;  // x 維度長度
      this.y = y;  // y 維度長度
      for(var i = 0; i < this.length; i++)  // 初始各元素值為 null
      this[i] = new Array(y);  // this 代表物件本身
    }
    
    var a2dv = new Array2DVar(10, 10);  // 建立新的 10*10 的二維陣列
    a2dv[1][3] = "ABC";  // 設定二維陣列元素值
    a2dv[2][6] = "XYZ";
    a2dv[9][9] = 1000;
    
    alert( a2dv[1][3]);  // 取得二維陣列元素值,並顯示出來
    alert( a2dv[2][6]);
    alert( a2dv[9][9]);

    Initial Array Object

    在 JavaScript 中陣列也是物件 (其實近代多數語言中陣列也都是物件,只有像 C 或 Assembly 這類古老的語言才不把陣列看成物件),因此也可以用 constructor 的語法來建構。當然 JavaScript 還提供了 [] 語法,以更方便建構陣列,範例如下:

    a = new Array("abc", "xyz", 1000); // constructor 語法,或
    a = ["abc", "xyz", 1000]; // 陣列標準語法

    陣列的元素可以是簡單的資料、其他物件,或是函數。舉個例子來在陣列裡面放函式:

    b = [ // 使用函式作為陣列元素
      function () { alert("這個好玩!") },
      function () { alert("再按一次離開!") },
      function () { alert("再來一次!") },
      function () { alert("最後一次!") }
    ];
    
    for (var i = 0; i < b.length ; i++)
    b[i]();

    最後一個 for 迴圈是個有趣的應用。由於 b 陣列中現在存放的所有元素都是函式,因此我們可以對 b 的每個元素進行呼叫。

    Object as Association Array

    關聯陣列 (Assocation Array) 又稱作 Map 或 Dictionary,是一種物件容器,其中可以放置許多的 key-value pair,以存取子物件。在JavaScript 中,物件本身就可以作為關連陣列。以關聯陣列的方式初始化物件的範例如下:

    obj1 = {"a" : "Athens" , "b" : "Belgrade", "c" : "Cairo"};
    alert(obj1["a"]);  // 顯示 Athens
    obj2 = {
      name: "Edward",
      showName: function() { alert(this.name); }  // 使用函式作為物件屬性
    }
    obj2.showName();  // 顯示 Edward
    obj2.age = 23;  // 屬性可以動態加入

    其 中 obj1 儲存了三個子元素,其鍵 (key) 為 「a」, 「b」 與 「c」,而值 (value) 為 「Athens」, 「Belgrade」 與 「Cairo」。obj2 中 showName 鍵所對應的值為 function,因此 obj2.showName() 即為函式呼叫。

    Object as Return Value

    雖然 Javascript 的函式只能傳回一個變數,但您卻可以將傳回值設定為物件,達到傳回 1個以上變數值的效果

    function a () {
      return [32, 17];
    }
    b = a();
    alert( b ); // 或
    alert(a());
    function pixel () {
      return {"x": 32, "y":17};
    }
    point = pixel ();
    alert (point.x + "\n" + point.y);  // 或
    alert (pixel().x + "\n" + pixel().y);

    Delegation Function Object

    函式也是物件,只是其中包含的是程式的邏輯。這項特性可拿來作為委任式的程式設計,亦即使用委任函式當作另一函式的參數:

    function doloop(begin, end, func) {  // 這個函式是個 iterator
      for (var i = begin; i < end; i++) {
        func(i);
      }
    }
    function func1(i) {  // 印出 ** n **
      document.writeln("** " + i + " **<br>");
    }
    doloop(1, 10, func1);  // 印出 10 行 ** n **
    doloop(20, 29,
      function(i) {  // 印出 10 行 ## n ##
        document.writeln("## " + i + " ##<br>");
      }
    );

    Object = Properties + Behaviors

    古有明訓:程式 = 資料結構 + 演演算法。而物件是建構程式的基本單位,自然的具有相同的性質。物件除了有屬性 (property),也可具有操作 (behavior),也就是函式。

    假如我們要使用一維陣列來模擬二維陣列,那麼就無法使用 ary[x][y] 這種表示法來設定或取得陣列成員。不過我可以定義一個 set 方法來設定成員變數,而以 get 方法來取得成員變數值。原型函式定義如下:

    function Array2D(x,y){  // 以一維陣列模擬二維陣列的原型物件
      this.length = x * y;  // 陣列總長
      this.x = x;  // x 維度長度
      this.y = y;  // y 維度長度
      for(var i = 0; i < this.length; i++)  // 初始各元素值為 null
        this[i] = null;
      this.get = function(x,y){  // 成員函式:取得陣列第 [x,y]個元素值
        return this[x*this.x + y];
      }
      this.set = function(x,y,value){  // 成員函式:設定陣列第 [x,y] 個元素值
        this[x*this.x + y] = value;
      }
    }

    我們接著來使用它:

    var a2d = new Array2D(10, 10);  // 建立新的「二維」陣列
    
    a2d.set(1, 3, "ABC");  // 設定「二維」陣列元素值
    a2d.set(2, 6, "XYZ");
    a2d.set(9, 9, 1000);
    
    alert( a2d.get(1,3) );  // 取得「二維」陣列元素值,並顯示出來
    alert( a2d.get(2,6) );
    alert( a2d.get(9,9) );

    Member Function Outside of Constructor

    我們也可以將物件成員函式寫於原型物件之外。以下的 Array2D 物件與上一個範例中的 Array2D 物件有相同的作用,只不過這次是寫在原型物件之外。

    function Array2D(x,y){  // 以一維陣列模擬二維陣列的原型物件
      this.length = x * y;  // 陣列總長
      this.x = x;  // x 維度長度
      this.y = y;  // y 維度長度
      for(var i = 0; i < this.length; i++)  // 初始各元素值為 null
        this[i] = null;
      this.get = Array2DGet;  // 用這種方式把成員函式掛進來
      this.set = Array2DSet;
    }
    
    function Array2DGet(x,y){  // 成員函式:取得陣列第 [x,y] 個元素值
      return this[x*this.x + y];
    }
    
    function Array2DSet(x,y,value){  // 成員函式:設定陣列第 [x,y] 個元素值
      this[x*this.x + y] = value;
    }

    Dynamic Object Function

    這裡說明如何為一個已定義物件,動態的加上其他操作的方法。

    如果一物件已定義完成,而您也使用它來建立了新的物件,這時候您想為原型物件增加新的操作 (而不修改原型物件的原始碼),讓所有該物件的複本都能使用該操作,該如何達成呢?方法是使用物件的 prototype 屬性。以下這個例子,為 Array 這類 Object 在執行期加入一個 max 方法,以取得陣列元素之最大值 (修改自微軟 jscript.chm之範例):

    function array_max(){  // 定義求取 Array 最大值之函式
      var i, max = this[0];
      for (i = 1; i < this.length; i++){
      if (max < this[i])
        max = this[i];
      }
      return max;
    }
    Array.prototype.max = array_max;  // 在 Array 原型中加入 max 函式

    上面的程式碼,首先建立一個 array_max 方法,以求取陣列之最大元素。接著將這個方法設定給 Array 原型物件。

    var x = new Array(1, 2, 3, 4, 5, 6);  // 透過 Array 建構子建立一陣列,想求取 x 中某一元素之最大值
    var y = x.max( );  // 取得 x 之最大元素

    Dynamic Mix in

    假如物件 dynamic 有 method1, method2 兩個函式;而另一物件 main 有 methodA 及 methodB 兩個函式。現在我想把 dynamic 的所有特性 (feature) 匯入到 main 中,我們可以在 main 中加上一個 imports 函式:

    function main(){  // main 之建構子
      // ...
      this.imports =
        function (object) {
          if( typeof object == "object")
            for( value in object )
              this[value] = object[value];
        }
      // ...
    }
    obj = new main();
    main.imports(new dynamic());  // 匯入 dynamic 物件之所有功能

    這個 imports 函式可以動態的為 main 加上另一物件的所有操作。這種 Mix in 的功能可是 C++/Java 的 static type 語言所望塵莫及的。

    在 Linux 上建立虛擬主機最快速的方法 *

    本篇的目的,是說明如何使用最簡單的方式在你的網頁伺服器 (Apache) 上新增一個虛擬主機 (Virtual Host),讓你只要建一個目錄,或新增一個本機用戶,就可以建立虛擬主機,並且可自動分割 Log 檔 (以下之設定牽涉到 Apache 及 DNS 的觀念,最好也有自行架設 DNS 服務)。
    Read more

    怎樣移除 Windows XP 內建的 Windows Messenger

    Windows 為提高線上傳訊程式的佔有率,已在 Windows XP 內建 Windows Messenger,卻不允許你直接移除,以下介紹移除的方法…

    從 Windows 的「執行(R)」處執行下列指令:

    RunDll32 advpack.dll,LaunchINFSection %windir%\INF\msmsgs.inf,BLC.Remove

    執行完會叫你重新開機,重新開機之後就移除了!!

    將系統的 ftp 服務換成 ProFTP

    Redhat Linux 7.3 預設的 ftp 服務是採用 wu-ftpd,雖然 wu-ftpd 在效能上,一直有不錯的表現,程式版本更新的速度也不慢,不過,它卻不是一個夠安全的系統。ProFtpd 的發展,一開始便是定位在成為一個安全且容易設定的 ftp 伺服器程式,它的風格及表現,深得許多網管人員的喜愛。如果您想找一個不錯的 ftp 伺服程式來取代 wu-ftpd,試試 ProFtpd 吧…
    Read more

    return top