byterat

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            54 隨筆 :: 0 文章 :: 15 評論 :: 0 Trackbacks

          #

          JavaScript--正則表達式

            正則表達式(regular expression)對象包含一個正則表達式模式(pattern)。它具有用正則表達式模式去匹

          配或代替一個串(string)中特定字符(或字符集合)的屬性(properties)和方法(methods)。

          正則表達式構造函數: new RegExp("pattern"[,"flags"]);
          參數說明:
          pattern -- 一個正則表達式文本
          flags -- 如果存在,將是以下值:
          g: 全局匹配
          i: 忽略大小寫
          gi: 以上組合

          在構造函數中,一些特殊字符需要進行轉意(在特殊字符前加"\")。正則表達式中的特殊字符:
          字符? 含意?
          \ 轉意,即通常在"\"后面的字符不按原來意義解釋,如/b/匹配字符"b",當b前面加了反斜桿后/\b/,轉意為

          匹配一個單詞的邊界。
          -或-
          對正則表達式功能字符的還原,如"*"匹配它前面元字符0次或多次,/a*/將匹配a,aa,aaa,加了"\"后,/a\*/

          將只匹配"a*"。?
          ^? 匹配一個輸入或一行的開頭,/^a/匹配"an A",而不匹配"An a"?
          $? 匹配一個輸入或一行的結尾,/a$/匹配"An a",而不匹配"an A"?
          *? 匹配前面元字符0次或多次,/ba*/將匹配b,ba,baa,baaa?
          +? 匹配前面元字符1次或多次,/ba*/將匹配ba,baa,baaa?
          ?? 匹配前面元字符0次或1次,/ba*/將匹配b,ba?
          (x)? 匹配x保存x在名為$1...$9的變量中?
          x|y? 匹配x或y?
          {n}? 精確匹配n次?
          {n,}? 匹配n次以上?
          {n,m}? 匹配n-m次?
          [xyz]? 字符集(character set),匹配這個集合中的任一一個字符(或元字符)?
          [^xyz]? 不匹配這個集合中的任何一個字符?
          [\b]? 匹配一個退格符
          \b? 匹配一個單詞的邊界?
          \B? 匹配一個單詞的非邊界
          \cX? 這兒,X是一個控制符,/\cM/匹配Ctrl-M?
          \d? 匹配一個字數字符,/\d/ = /[0-9]/?
          \D? 匹配一個非字數字符,/\D/ = /[^0-9]/?
          \n? 匹配一個換行符?
          \r? 匹配一個回車符?
          \s? 匹配一個空白字符,包括\n,\r,\f,\t,\v等?
          \S? 匹配一個非空白字符,等于/[^\n\f\r\t\v]/?
          \t? 匹配一個制表符?
          \v? 匹配一個重直制表符?
          \w? 匹配一個可以組成單詞的字符(alphanumeric,這是我的意譯,含數字),包括下劃線,如[\w]匹配"$5.98" 中的5,等于[a-zA-Z0-9_]?
          \W? 匹配一個不可以組成單詞的字符,如[\W]匹配"$5.98"中的$,等于[^a-zA-Z0-9]。


          說了這么多了,我們來看一些正則表達式的實際應用的例子:
          HTML代碼的屏蔽
          ?function mask_HTMLCode(strInput) {
          ?? var myReg = /<(\w+)>/;
          ?? return strInput.replace(myReg, "&lt;$1&gt;");
          ?}
          E-mail地址驗證:
          ?function test_email(strEmail) {
          ? var myReg = /^[_a-z0-9]+@([_a-z0-9]+\.)+[a-z0-9]{2,3}$/;
          ? if(myReg.test(strEmail)) return true;
          ? return false;
          ?}

          ?

          正則表達式對象的屬性及方法:
            預定義的正則表達式擁有有以下靜態屬性:input, multiline, lastMatch, lastParen, leftContext,

          rightContext和$1到$9。其中input和multiline可以預設置。其他屬性的值在執行過exec或test方法后被根據

          不同條件賦以不同的值。許多屬性同時擁有長和短(perl風格)的兩個名字,并且,這兩個名字指向同一個值。( JavaScript模擬perl的正則表達式)

          正則表達式對象的屬性:
          屬性 含義
          $1...$9 如果它(們)存在,是匹配到的子串?
          $_ 參見input?
          $* 參見multiline?
          $& 參見lastMatch?
          $+ 參見lastParen?
          $` 參見leftContext?
          $''          參見rightContext?
          constructor   ? 創建一個對象的一個特殊的函數原型?
          global      ? 是否在整個串中匹配(bool型)?
          ignoreCase     匹配時是否忽略大小寫(bool型)?
          input        被匹配的串?
          lastIndex    ? 最后一次匹配的索引?
          lastParen    ? 最后一個括號括起來的子串?
          leftContext   ? 最近一次匹配以左的子串?
          multiline    ? 是否進行多行匹配(bool型)?
          prototype    ? 允許附加屬性給對象?
          rightContext    最近一次匹配以右的子串?
          source      ? 正則表達式模式?
          lastIndex    ? 最后一次匹配的索引?

          正則表達式對象的方法:
          方法 含義
          compile     ? 正則表達式比較?
          exec        執行查找?
          test        進行匹配?
          toSource      返回特定對象的定義(literal

          representing),其值可用來創建一個新的對象。重載Object.toSource方法得到的。?
          toString      返回特定對象的串。重載Object.toString方法得到的。?
          valueOf     ? 返回特定對象的原始值。重載Object.valueOf方法得到
          ?

          例子:
          <script language = "JavaScript">
          var myReg = /(w+)s(w+)/;
          var str? = "John Smith";
          var newstr = str.replace(myReg, "$2, $1");
          document.write(newstr);
          </script>
          將輸出"Smith, John"

          posted @ 2006-12-20 21:23 比特鼠 閱讀(561) | 評論 (3)編輯 收藏

          Expression Description
          \t       Tab字符
          \n       新行
          .        匹配任意字符
          |        匹配"左邊和右邊"的字符串, 例如: "ac|ad" 匹配 "ac" 和 "ad"
          []       匹配所有在 符號"[]"閉合區間內 的任意字符, 例如: "[ab]" matches "a" and "b". "[0-9]" matches any digit.
          [^]      匹配所有不在  符號"[]"閉合區間內  的任意字符, 例如: "[^ab]" 匹配所有除了"a"和"b"之外的字符, "[^0-9]" 匹配所有非數字字符
          *        匹配符號"*"的左邊字符(0次或多次) 例如:"be*" 匹配 "b", "be" , "bee"
          +        匹配符號"+"的左邊字符(1次或多次) 例如:"be+" 匹配 "be" and "bee", 但不匹配 "b"
          ?        匹配符號"?"的左邊字符(0次或1次) 例如:be?" 匹配 "b" 和 "be", 但不匹配 "bee"
          ^        匹配符號"^"的右邊字符串, 并且該字符串必須在行首, 例如: ^AB 匹配字符串"AB",并且該"AB"必須在行首
          $        匹配符號"$"的左邊字符串, 并且該字符串必須在行尾, 例如: AB$ 匹配字符串"AB",并且該"AB"必須在行尾
          ()       Affects evaluation order of expression and also used for tagged expression.
          \        Escape character. If you want to use character "\" itself, you should use "\\".


          技巧:
          1. 查找空行 : "^[ \t]*\n"
          2. 查找行首序號: "^[0-9. ]+"
             例如: 
             "
                1. aaaa
                2. bbbb
                :
                100. abcd
                :
             "
          3. 查找"["和"]"之間的內容: "\[.+\]"
          4. 匹配<b></b>之間的內容(包括<b></b>):"^\<b\>.+\</b\>"
          5. 匹配<b>...<br/>之間沒有"/"字符的內容:"^\<b\>[^/]+\<br/\>"
             例如:
                ...
                <b>appeal</b> - v. to take to <br/>
                <b>somebody for help <br/>
                <b>appoint</b> - v. to name;<br/>
                <b>statues <br/>
                ...
                
                使用:^(\<b\>)([^/]+\<br/\>) 和替換串"\2", 將使得以上的第2行和第4行變成:
                ...
                <b>appeal</b> - v. to take to <br/>
                somebody for help <br/>
                <b>appoint</b> - v. to name;<br/>
                statues <br/>
                ...

          The tagged expression is enclosed by (). Tagged expressions can be referenced by \0, \1, \2, \3, etc. \0 indicates a tagged expression representing the entire substring that was matched. \1 indicates the first tagged expression, \2 is the second, etc. See following examples.

          Original Search  Replace  Result 
          abc      (ab)(c) \0-\1-\2 abc-ab-c
          abc      a(b)(c) \0-\1-\2 abc-b-c
          abc      (a)b(c) \0-\1-\2 abc-a-c

          posted @ 2006-12-20 18:18 比特鼠 閱讀(482) | 評論 (0)編輯 收藏

          Eclipse中常用的快捷鍵(最經典的快捷鍵,就不用多說了)

          Ctrl+D: 刪除當前行 ? ?

          Ctrl+Alt+↓ 復制當前行到下一行(復制增加)

          Ctrl+Alt+↑ 復制當前行到上一行(復制增加)

          Alt+↓ 當前行和下面一行交互位置(特別實用,可以省去先剪切,再粘貼了)

          Alt+↑ ? 當前行和上面一行交互位置(同上)

          Alt+← 前一個編輯的頁面

          Alt+→ 下一個編輯的頁面(當然是針對上面那條來說了)

          Alt+Enter 顯示當前選擇資源(工程,or 文件 or文件)的屬性

          Shift+Enter 在當前行的下一行插入空行(這時鼠標可以在當前行的任一位置,不一定是最后)

          Shift+Ctrl+Enter 在當前行插入空行(原理同上條)

          Ctrl+Q ? 定位到最后編輯的地方

          Ctrl+L 定位在某行 (對于程序超過100的人就有福音了)

          Ctrl+M 最大化當前的Edit或View (再按則反之)

          Ctrl+/ ? 注釋當前行,再按則取消注釋

          Ctrl+O ? 快速顯示 OutLine

          Ctrl+T ? 快速顯示當前類的繼承結構

          Ctrl+W 關閉當前Editer

          Ctrl+K ? 參照選中的Word快速定位到下一個

          Ctrl+E 快速顯示當前Editer的下拉列表(如果當前頁面沒有顯示的用黑體表示)

          Ctrl+/(小鍵盤) 折疊當前類中的所有代碼

          Ctrl+×(小鍵盤) 展開當前類中的所有代碼

          Ctrl+Space 代碼助手完成一些代碼的插入(但一般和輸入法有沖突,可以修改輸入法的熱鍵,也可以暫用Alt+/來代替)

          Ctrl+Shift+E 顯示管理當前打開的所有的View的管理器(可以選擇關閉,激活等操作)

          Ctrl+J 正向增量查找(按下Ctrl+J后,你所輸入的每個字母編輯器都提供快速匹配定位到某個單詞,如果沒有,則在stutes line中顯示沒有找到了,查一個單詞時,特別實用,這個功能Idea兩年前就有了)

          Ctrl+Shift+J 反向增量查找(和上條相同,只不過是從后往前查)

          Ctrl+Shift+F4 關閉所有打開的Editer

          Ctrl+Shift+X ? 把當前選中的文本全部變味小寫

          Ctrl+Shift+Y ? 把當前選中的文本全部變為小寫

          Ctrl+Shift+F 格式化當前代碼

          Ctrl+Shift+P 定位到對于的匹配符(譬如{}) (從前面定位后面時,光標要在匹配符里面,后面到前面,則反之)

          下面的快捷鍵是重構里面常用的,本人就自己喜歡且常用的整理一下(注:一般重構的快捷鍵都是Alt+Shift開頭的了)

          Alt+Shift+R 重命名 (是我自己最愛用的一個了,尤其是變量和類的Rename,比手工方法能節省很多勞動力)

          Alt+Shift+M 抽取方法 (這是重構里面最常用的方法之一了,尤其是對一大堆泥團代碼有用)

          Alt+Shift+C 修改函數結構(比較實用,有N個函數調用了這個方法,修改一次搞定)

          Alt+Shift+L 抽取本地變量( 可以直接把一些魔法數字和字符串抽取成一個變量,尤其是多處調用的時候)

          Alt+Shift+F 把Class中的local變量變為field變量 (比較實用的功能)

          Alt+Shift+I 合并變量(可能這樣說有點不妥Inline)

          Alt+Shift+V 移動函數和變量(不怎么常用)

          Alt+Shift+Z 重構的后悔藥(Undo)

          Ctrl+Shift+U 選擇選中的文字后非常類似于UE的列表查詢


          Eclipse啟動參數大全 - -
          ? ? ? ? ? ? ? ? ? ? ? ? ?
          Eclipse 運行命令行參數大全
          包括英文版本和中文版本兩種的說明, 特別需要值得一提的是那個 -nl 參數, 可以指定程序啟動時所使用的語言. 例如:
          eclipse -nl en_US
          將啟動英文語言, 這個特性在安裝了國際化語言包以后特別有用, 可以方便的切換各個語言的版本. 注意 IBM WSAD v5.1 也支持這個功能.

          運行 Eclipse
          將 Eclipse 驅動程序安裝(解壓縮)到某個目錄(例如,c:\eclipse)中之后,通過運行頂級安裝目錄中的 Eclipse 可執行文件來啟動"工作臺"。在 Windows 系統上,該可執行文件稱為 eclipse.exe,而在 Linux 系統上稱為 eclipse。注意:下列討論描述 Windows 系統上的設置。Linux 上的設置是相似的。

          如果您沒有另行指定,則平臺將缺省工作區目錄創建為可執行文件的兄弟目錄(例如 c:\eclipse\workspace)。此工作區目錄用作項目的缺省內容區,還用于保存任何必需的元數據。要進行共享安裝或多工作區安裝,應明確指出工作區的位置而不是使用缺省值。有兩種控制工作區位置的方法:使用當前工作目錄或使用 -data 命令行自變量。

          將工作區位置設置為在當前工作目錄內
          在此方案中,工作區位置將是當前工作目錄中稱為 workspace 的目錄。

          實現此目的最容易的方法可能是使用下列步驟來創建快捷方式:

          導航到 Windows 資源管理器中的 eclipse.exe 并使用右鍵拖動來創建 eclipse.exe 的快捷方式。
          編輯快捷方式的屬性,以使啟動位置:字段標識工作區位置的父目錄(例如,c:\users\robert)。
          關閉屬性對話框并雙擊快捷方式(如果提供的目錄為 c:\users\robert,則工作區位置將為 c:\users\robert\workspace)。
          當然,您也可以使用命令提示符(通過將目錄切換為工作區父目錄然后運行 eclipse.exe)來獲得同樣的效果。

          使用 -data 設置工作區的特定位置
          要使用 -data 命令行自變量,只要將 -data your_workspace_location(例如,-data c:\users\robert\myworkspace)添加至快捷方式屬性中的目標字段或顯式地將它包括在命令行上。

          使用 -vm 設置 java VM
          建議顯式指定在運行 Eclipse 時要使用哪個 Java VM。使用 -vm 命令行自變量(例如,-vm c:\jre\bin\javaw.exe)可以實現此目的。如果不使用 -vm,則 Eclipse 將使用在 O/S 路徑上找到的一個 Java VM。當安裝其它產品時,它們可更改您的路徑,導致在下一次啟動 Eclipse 時使用另一 Java VM。

          運行 Eclipse 中的高級主題
          Eclipse 可執行文件及平臺本身提供了人們感興趣的開發或調試 Eclipse 各部件的許多執行選項。運行 Eclipse 可執行文件的一般格式是:

          eclipse [platform options] [-vmargs [Java VM arguments]]
          Eclipse 啟動參數 命令 描述 原因
          -arch architecture
          定義 Eclipse 平臺在其上運行的處理器體系結構。Eclipse 平臺通常使用 Java os.arch 屬性的常用值來計算最佳設置。如果在此處指定該項,則這是 Eclipse 平臺使用的值。此處指定的值可作為 BootLoader.getOSArch() 用于插件。示例值有:"x86"、"sparc"、"PA-RISC"和"ppc"。 2.0
          -application applicationId
          要運行的應用程序。應用程序由向 org.eclipse.core.runtime.applications 擴展點提供擴展的插件來聲明。通常不需要此自變量。如果指定了此項,則該值會覆蓋配置提供的值。如果不指定此項,則會運行"Eclipse 工作臺"。 1.0
          -boot bootJarURL
          (建議不使用;用 -configuration 代替;支持 1.0 兼容)。Eclipse 平臺的引導插件代碼(boot.jar)的位置,表示為 URL。如果指定此項,則會用它來為裝入 Eclipse 平臺引導程序類裝入器的類裝入器設置類路徑。僅當更改 startup.jar 和 boot.jar 的相對位置時才需要它。注意,不允許使用相對 URL。 *1.0
          -classloaderproperties [file]
          如果指定的話,則使用給定位置處的類裝入器屬性文件來激活平臺類類裝入器增強。文件自變量可以是文件路徑或 URL。注意,不允許使用相對 URL。單擊此處以獲得更多詳細信息。 2.0.2
          -configuration configurationFileURL
          Eclipse 平臺配置文件的位置,表示為 URL。配置文件確定 Eclipse 平臺、可用插件集和主要功能部件的位置。注意,不允許使用相對 URL。當安裝或更新 Eclipse 平臺時配置文件被寫至此位置。 2.0
          -consolelog
          將 Eclipse 平臺的錯誤日志鏡像到用來運行 Eclipse 的控制臺。與 -debug 組合時很方便使用。 1.0
          -data workspacePath
          要運行 Eclipse 平臺的工作區的路徑。工作區位置也是項目的缺省位置。相對于從中啟動 eclipse 的目錄來解釋相對路徑。 1.0
          -debug [optionsFile]
          將平臺置于調試方式,并從給定位置處的文件裝入調試選項(如果指定的話)。此文件指示哪些調試點可用于插件以及是否已啟用它們。如果未給出文件位置,則平臺在啟動 eclipse 的目錄中查找稱為".options"的文件。URL 和文件系統路徑都可作為文件位置。 1.0
          -dev [classpathEntries]
          將平臺置于開發方式。將可選類路徑條目(用逗號分隔的列表)添加至每個插件的運行時類路徑。例如,當工作區包含要開發的插件時,指定 -dev bin 會為每個插件項目的名為 bin 的目錄添加類路徑條目,允許在其中存儲最新生成的類文件。除去了冗余或不存在的類路徑條目。 1.0
          -endsplash params
          用于在 Eclipse 平臺啟動并運行時關閉閃屏的內部選項。此選項在閃屏處理鏈中不同的位置有不同的語法和語義。 2.0
          -feature featureId
          主要功能部件的標識。主要功能部件為 Eclipse 的已啟動實例提供了產品個性,并確定使用的產品定制信息。 2.0
          -keyring keyringFilePath
          磁盤上授權數據庫(或"密鑰環"文件)的位置。此自變量必須與 -password 選項配合使用。相對于從中啟動 eclipse 的目錄來解釋相對路徑。 1.0
          -nl locale
          定義 Eclipse 平臺在其上運行的語言環境的名稱。Eclipse 平臺通常自動計算最佳設置。如果在此處指定該項,則這是 Eclipse 平臺使用的值。此處指定的值可作為 BootLoader.getNL() 用于插件。示例值有:"en_US"和"fr_FR_EURO"。 2.0
          -nolazyregistrycacheloading
          取消激活裝入優化的平臺插件注冊表高速緩存。缺省情況下,僅當需要時才從注冊表高速緩存(可用時)中裝入擴展的配置元素,以減少內存占用。此選項將在啟動時強制完全裝入注冊表高速緩存。 2.1
          -noregistrycache
          繞過讀寫內部插件注冊表高速緩存文件。 2.0
          -nosplash
          運行平臺而不顯示閃屏。 1.0
          -os operatingSystem
          定義 Eclipse 平臺在其上運行的操作系統。Eclipse 平臺通常使用 Java os.name 屬性的常用值來計算最佳設置。如果在此處指定該項,則這是 Eclipse 平臺使用的值。此處指定的值可作為 BootLoader.getOS() 用于插件,并用于解析插件清單文件中提及的路徑中 $os$ 變量的出現。示例值有:"win32"、"linux"、"hpux"、"solaris"和"aix"。 1.0
          -password password
          授權數據庫的密碼。與 -keyring 選項配合使用。 1.0
          -perspective perspectiveId
          啟動時要在活動工作臺窗口中打開的透視圖。如果沒有指定該參數,則將打開關閉時活動的透視圖。 1.0
          -plugincustomization ? propertiesFile
          包含插件首選項缺省設置的屬性文件的位置。這些缺省設置覆蓋在主要功能部件中指定的缺省設置。相對于從中啟動 eclipse 的目錄來解釋相對路徑。 2.0
          -plugins pluginsFileURL
          (建議不使用;用 -configuration 代替;支持 1.0 兼容)。 指定 Eclipse 平臺查找插件的文件的位置,表示為 URL。該文件為屬性文件格式,其中鍵是任意用戶定義名稱,值是指向 plugin.xml 文件的顯式路徑或指向包含插件的目錄的路徑的用逗號分隔的列表。注意,不允許使用相對 URL。如果指定此項,則此選項會導致創建適當的臨時配置。 *1.0
          -refresh
          啟動時執行工作區的全局刷新的選項。這將使從上次平臺運行以來在文件系統中所做的任何更改一致。 1.0
          -showlocation
          用于在窗口標題欄中顯示工作區的位置的選項。在發行版 2.0 中,此選項僅與 -data 命令行自變量一起使用。 2.0
          -showsplash params
          用于顯示閃屏(由可執行的 Eclipse 平臺啟動器執行)的內部選項。此選項在閃屏處理鏈中不同的位置有不同的語法和語義。 2.0
          -vm vmPath
          要用來運行 Eclipse 平臺的"Java 運行時環境"(JRE)的位置。如果不指定此項,則 JRE 位于 jre(它是 Eclipse 可執行文件的兄弟目錄)。相對于從中啟動 eclipse 的目錄來解釋相對路徑。 1.0
          -ws windowSystem
          定義 Eclipse 平臺在其上運行的 Windows 系統。Eclipse 平臺通常使用 Java os.name 屬性的常用值來計算最佳設置。如果在此處指定該項,則這是 Eclipse 平臺使用的值。此處指定的值可作為 BootLoader.getWS() 用于插件、用于配置 SWT 以及用于解析插件清單文件中提及的路徑中 $ws$ 變量的出現。示例值有:"win32"、"motif"和"gtk"。 1.0

          將 -vmargs 條目后面的所有自變量(但不包括 -vmargs)作為虛擬機自變量(即,在要運行的類的前面)直接傳遞到所指示的 Java VM。注意:如果 Eclipse 啟動在 Java vm 自變量(-vmargs)之后提供的自變量(例如,-data),則 Eclipse 將不會啟動并且您將接收到"JVM 已終止。出口代碼為 1"的錯誤。

          在不同的 VM 上運行
          在 J9 上運行 Eclipse
          當在 J9 版本 1.5 上運行 Eclipse 時,建議使用以下 VM 選項:

          eclipse.exe [eclipse arguments] -vm path_to_j9w.exe ? ? ? ? -vmargs -ms:32 -mm:2048 -mo:32768 -moi:32768 -mca:32 -mco:128 -mx:2000000
          當在 J9 版本 2.0 上運行 Eclipse 時,J9W 選擇的缺省自變量應為合適的選項。但是,要覆蓋 Eclipse 可執行文件以內部方式自動設置的參數,必須指定 -vmargs 不帶任何參數,如下所示:

          eclipse.exe [eclipse arguments] -vm path_to_j9w.exe -vmargs
          有關進一步信息,參考 J9 VM 文檔和幫助。

          在 IBM Developer Kit, Java(TM) Technology Edition VM 上運行 Eclipse
          IBM Developer Kit, Java(TM) Technology Edition 1.3 Linux 的缺省 VM 設置適合進行初期研究工作,但在進行大型開發時是不夠的。對于大型開發,應修改 VM 自變量以使有更多的堆可用。例如,下列設置將允許 Java 堆增大為 256MB
          posted @ 2006-12-19 12:18 比特鼠 閱讀(246) | 評論 (0)編輯 收藏

          RubyGems是一個方便而強大的Ruby程序包管理器( package manager),類似RedHat的RPM.它將一個Ruby應用程序打包到一個gem里,作為一個安裝單元。無需安裝,最新的Ruby版本已經包含RubyGems了。


          特點:
          能遠程安裝包
          包之間依賴關系的管理
          簡單可靠的卸載(uninstallation)
          查詢機制,能查詢本地和遠程服務器的包信息
          能保持一個包的不同版本
          基于Web的查看接口,能查看你安裝的gem的信息。


          使用:
          1. gem query --remote??????? # shortcut: gem q -R
          #列出所有包
          2. gem query --remote --name-matches doom?? # shortcut: gem q -R -n doom
          #列出所有名字匹配的包
          3. gem install --remote progressbar? # shortcut: gem i -r progressbar
          #安裝指定名字的包。
          gem ins -r progressbar --version '> 0.0.1' #這里可以匹配版本
          4. gem specification? progressbar? # shortcut: gem spec progressbar
          #查看安裝過的指定包詳細信息
          5.gem uninstall progressbar
          #卸載包
          6. gem query --local # shortcut: 'gem q -L'
          #列出所有本地安裝過的包
          7. gem ins rake
          #在本地安裝,如果沒有遠程安裝
          8. gem list -b ^C
          #列出所有以C開頭的包
          9. gem_server
          開啟rdoc服務。可以查看安裝包的rdoc

          posted @ 2006-12-15 09:53 比特鼠 閱讀(2339) | 評論 (0)編輯 收藏

          Tip 1. 默認情況下,Rails認為類名是單數,表明是復數形式。
          如果你不喜歡這樣的行為可以在配置文件(config/environment.rb)中設置一個全局標識來禁用它。
          ActiveRecord::Base.pluralize_table_names = false

          Tip 2.默認情況下,ActiveRecord會使用推導表明的算法,如果你不希望使用此算法可以在指定的model中使用 "set_table_name" 方法,例如:
          class Sheep < ActiveRecord::Base
          ?set_table_name "sheep"
          end

          Tip 3.SQL 類型和Ruby 類型之間的對應關系可能會在 decimal 類型的精度上出現問題。SQL的 demimal,numeric,float,double 都對應 Ruby 的 Float。可以使用聚合對象 composed_of 對字段進行處理。?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

          Tip 4.ActiveRecord會盡量的把從數據庫中獲取的值轉換為Ruby的類型(譬如說,假設數據庫字段是 timestamp 類型的,就會返回 Time 對象)。如果你希望得到一個屬性的原始值,可以在屬性名稱后面加上 _before_type_cast.

          Tip 5.Ruby 認為:除了 nil 和 false 之外的所有值都被解釋為 true。所以,如果要查詢一個 boolean 型字段的狀態,就必須在字段名的后面加上一個問號:
          user = User.find_by_name("Dave")
          if user.superuser? # 不可以使用 user.superuser,否則不論數據庫中存儲的是數字 0、字符串 f 還是德語的 N,此條件都將成立。
          ?grant_privileges
          end

          posted @ 2006-12-15 09:30 比特鼠 閱讀(297) | 評論 (0)編輯 收藏

          最近一直在看Programming Ruby - 2nd, 先記錄下一些不熟悉的Ruby的基本語法和操作(熟悉的就不再記啦...)

          Ruby的命名:

          ??????局部變量?????????全局變量??????實例變量??????類變量??? ?????????常量和類名
          ==============================================================================
          ??????name????????????$debug?????? @name??????? @@total?????????? PI
          ??????fish_and_chips? $CUSTOMER??? @point_1???? @@symtab????????? FeetPerMile
          ??????x_axis????????? $_?????????? @X?????????? @@N?????????????? String??????
          ??????thx1138???????? $plan9 ????? @_???????????@@x_pos?????????? MyClass
          ??????_26???????????? $Global????? @plan9?????? @@SINGLE??????????JazzSong
          ==============================================================================


          數組:

          數組下標從0開始, 下標可以為負整數, 此時代表數組從最末端開始, 最末端索引從-1開始
          數組的元素可以是任何類型的對象實例,包括nil實例

          數組的初始化:
          a = [ 'ant', 'bee', 'cat', 'dog', 'elk' ]
          或者
          a = %w{ ant bee cat dog elk }

          訪問:
          a[0]????#返回"ant"
          a[1]????#返回"bee"?
          a[-1]???#返回"elk"
          a[-2]???#返回"dog"

          賦值:
          a = [ 1, 3, 5, 7, 9 ]
          a[1] = 'bat'???????#a = [1, "bat", 5, 7, 9]
          a[3]= 'cat'??????? #a = [1, "bat", "cat", 7, 9]
          a[3] = [ 9, 8 ]????#a = [1, "bat", "cat", [9, 8], 9]
          a[6] = 99??????????#a = [1, "bat", "cat", [9, 8], 9, nil, 99]

          a = [ 1, 3, 5, 7, 9 ]
          a[2, 2] = 'cat'???????????#a = [1, 3, "cat", 9]
          a[2, 0] = 'dog'???????????#a = [1, 3, "dog", "cat", 9]
          a[1, 1] = [ 9, 8, 7 ]?????#a = [1, 9, 8, 7, "dog", "cat", 9]
          a[0..3] = [ ]?????????????#a = ["dog", "cat", 9]
          a[5..6] = 99, 98??????????#a = ["dog", "cat", 9, nil, nil, 99, 98]


          哈希表:
          相當于Java中的Map
          具有"鍵值對"特性, key和value都可以是任何類型的實例

          哈希的初始化:
          h = Hash["a", 100, "b", 200]???? # {"a"=>100, "b"=>200}
          h = Hash["a" => 100, "b" => 200]?# {"a"=>100, "b"=>200}
          h = { "a" => 100, "b" => 200 }?? # {"a"=>100, "b"=>200}

          訪問:
          h.length = 2

          賦值:
          h = { 'dog' => 'canine', 'cat' => 'feline', 'donkey' => 'asinine' }
          h.length????# 3
          h['dog']??? # "canine"
          h['cow']????# 'bovine'
          h[12]?????? #?'dodecine'
          h['cat'] = 99
          h?????????? #?{"cow"=>"bovine", "cat"=>99, 12=>"dodecine","donkey"=>"asinine", "dog"=>"canine"}


          代碼塊:
          代碼塊在ruby 中是以{} 和do end 來包圍起來的。通常如果是單行使用{} ,如果是多行使用do..end
          代碼塊可以接受參數, 參數用兩個豎線"|"符號來包含, 參數間用逗號","來分隔
          代碼塊被作為一個對象傳入method體中執行(如果代碼塊對象有參數, 則method體在執行代碼塊中的代碼前,需要對代碼塊對象的參數賦值)

          例如:

          def test(max)
          ???i1, i2 = 1, 1??????????# parallel assignment (i1 = 1 and i2 = 1)
          ???while i1 <= max
          ??????yield i1????????????# 也可以寫成yield(i1),?yield指令代表了代碼塊執行的位置, i1是method體中對代碼塊f進行了賦值
          ??????i1, i2 = i2, i1+i2
          ???end
          end

          test(1000) {|f| print f, " " }

          輸出: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987



          又例如:
          [1,3,5,7].inject(0) {|sum, element| sum+element} # 輸出:16



          Method的聲明:

          一般格式是:
          ???def my_new_method(arg1, arg2, arg3)????# 3 arguments
          ??????# Code for the method would go here
          ???end

          方法名initialize是特殊的method, 它在類的new操作時被執行, 用于對類實例進行初始化操作:
          ???def initialize(name, &block)
          ??????@name, @block = name, block
          ???end

          如果需要方法返回一個值, 可以顯式使用return關鍵字, 也可以使用"默認最后一行返回值"形式:
          ???def meth_one
          ??????"one"????# 相當于 return "one"
          ???end

          如果method的聲明中最后的參數帶有"&"前綴(例如下例的&action), 則表示該參數接受的是代碼塊, 并且該代碼塊將被轉換為Proc對象, 最后被賦值給一個類實例變量,如:
          ???class JukeboxButton < Button
          ??????def initialize(label, &action)
          ?????????super(label)
          ?????????@action = action #代碼塊對象被賦值給一個類實例變量(即@action)
          ??????end
          ??????def button_pressed
          ?????????@action.call(self)
          ??????end
          ???end
          ???start_button = JukeboxButton.new("Start") { songlist.start }

          如果method的聲明中最后的參數帶有"*"前綴, 表示該參數接受的是0個或多個參數(即:可變長參數), 例如:
          ???def varargs(arg1, *rest)
          ??????"Got #{arg1} and #{rest.join(', ')}"
          ???end
          ???varargs("one")????????????????# "Got one and "
          ???varargs("one", "two")???????? # "Got one and two"
          ???varargs "one", "two", "three" # "Got one and two, three"

          如果method的方法名最后為字符"=", 表示該方法可為類實例變量賦值, 相當于Java中的setXXXX方法
          ???class Song
          ??????def duration=(new_duration)?? # 整個方法名為"duration="
          ?????????@duration = new_duration?? # @duration為類實例變量
          ??????end
          ???end
          ???song = Song.new("Bicylops", "Fleck", 260)
          ???song.duration???????# 260
          ???song.duration = 257 # set attribute with updated value
          ???song.duration???????#?257


          ???上例中的"duration="方法 相當于下面的: attr_writer :duration
          ???class Song
          ??????attr_writer :duration
          ???end
          ???song = Song.new("Bicylops", "Fleck", 260)
          ???song.duration = 257


          區間:

          兩個點創建一個"包含"區間
          1..10????#包含1和10
          'a'..'z'

          三個點創建一個除最后一個元素外的區間
          my_array = [ 1, 2, 3 ]
          0...my_array.length? # 相當于0..2

          區間可以通過to_a函數來轉換為數組
          a = (1..3).to_a?? # a = [1, 2, 3]


          區間的一些方法:
          digits = 0..9
          digits.include?(5)???????????????????# true
          digits === 5?????? ??????????????????# true
          digits.min???????????????????????????# 0
          digits.max???????????????????????????# 9
          digits.reject {|i| i < 5 }???????????#?[5, 6, 7, 8, 9]
          digits.each {|digit| dial(digit)}??? #? 0..9


          待續...


          posted @ 2006-11-22 11:26 比特鼠 閱讀(426) | 評論 (0)編輯 收藏

          1. window -- Preferences
          ??????1.1 Content Types?
          ??????????設置相關的文件為"UTF-8", 如果在列表中沒有文件后綴, 則增加相應的文件后綴.

          ??????1.2 Workspace
          ??????????設置"Text file encoding" 為 "UTF-8".


          2. Validation
          ??????將Validator中, 除了Application client validator外的所有validator的"Manual"和"Build", 全部置空(即取消打勾)
          posted @ 2006-11-08 09:44 比特鼠 閱讀(283) | 評論 (0)編輯 收藏

          1. 標準用法
          c = Object.const_get("Array")
          s = c.new

          2. 使用Ruby Extension
          c = Class.by_name("Array")
          參見: http://extensions.rubyforge.org/rdoc/index.html

          3. 通過eval?
          c = eval("Array").new
          posted @ 2006-10-24 12:35 比特鼠 閱讀(471) | 評論 (0)編輯 收藏

          Ruby on Rails是一個很不錯的web開發框架,不過由于目前其本身對國際化的支持較差,所以需要一些輔助的東西來解決國際化問題。

          我最先使用的是一個叫localization的插件,這個插件的使用說明在Ruby on Rails官方的wiki上面有,這個插件使用比較簡單,不過功能比較弱。

          目前使用的是Ruby-GetText,這個插件功能強大,基于GNU的gettext,詳細的使用說明在 http://manuals.rubyonrails.com/read/chapter/105 上面有寫,我大概提一下要點:

          首先要是Ruby on Rails支持UTF-8,通過將如下代碼添加到environment.rb中:

          $KCODE = ‘u’
          require ‘jcode’

          接著是安裝Ruby-GetText,運行gem install gettext就可以了,如果是Windows平臺就選2,否則選1。接著就是在項目根目錄下面創建po目錄,里面添加你需要Locale的名字作為子目錄,比如en, zh_CN等。需要國際化的字符串都以_(”")來書寫,比如想國際化“編輯”這個標簽,就可以在視圖的rhtml中使用_(”Edit”),這樣在顯示的時候會自動根據Locale來替換成相應的值。

          接著在項目的rakefile里面如下內容:

          desc “Create mo-files for L10n”
          task :makemo do
          ? GetText.create_mofiles(true, “po”, “locale”)
          end

          需要注意的是在上面給出的鏈接的那篇文章里面,還需要添加updatepo這樣一個目標,不過這個目標在我這不起作用,總是出錯,我的辦法是下載那篇文章附帶的代碼: http://www.digitale-wertschoepfung.de/artikel/gettext/using-gettext-with-rails.tgz 。在里面的script目錄下面有一個localize文件,把它拷貝到你的項目的script目錄下面,然后運行ruby ./script/localize {文本域的名字}就可以從controllers, views中更新po數據,用Unicode編輯器(比如UltraEdit)修改各個po文件,然后運行rake makemo就可以了。關于如果修改application.rb及其他controller的代碼,查看給出的鏈接。此時重新啟動server,就可以查看效果了。

          posted @ 2006-10-24 09:53 比特鼠 閱讀(1182) | 評論 (2)編輯 收藏

          原文出處: http://www.rubychina.org/viewthread.php?tid=124&extra=page%3D1

          ? ? 元編程并不是一個很新的概念,通常元編程被認為是通過程序來生成程序,如果從這種意義上來考慮,那么lex和yacc以及JavaCC應該都可以算是具有了元編程的概念,在Java中,元編程得到了廣泛的應用。但在Ruby中,元編程的使用變得相當的簡單和容易實現,使用Ruby語言本身來產生Ruby代碼,不需要借助外部的工具,著名的RoR框架就是建立的Ruby元編程的基礎上的。可能你你對元編程還沒什么概念,但是Ruby已經內建了元編程這種機制,所以很有可能,你在不知不覺中就已經使用了Ruby元編程技術為你帶來的方便之處。如下面這段代碼:

          class Person
          ? ?attr_reader :name
          end
          你肯定知道 :name 是和 @name 相關聯的,但是你不一定清楚它到底是怎么實現的,其實attr_reader方法的實現就是采用了元編程技術,如下面的這段代碼:

          class Module
          ? ? def attr_reader(*syms)
          ? ?? ???syms.each do |sym|
          ? ?? ?? ?? ?class_eval %{def #{sym}? ?
          ? ?? ?? ?? ?? ?? ?? ?? ?? ???@#{sym}
          ? ?? ?? ?? ?? ?? ?? ?? ? end
          ? ?? ???end? ?
          ? ? end
          end

          ? ? 看了這段代碼,你應該大概了解元編程的機制了吧,如果你現在還不了解,那么我建議你先認真的學習一下Ruby的反射機制,然后再接下去看這篇帖子,因為下面介紹的內容并不是一杯嬰兒奶粉。

          ? ? 在Ruby On Rails中,有一個OR映射層,就是動態的從一張關系表映射到一個對象,這主要由ActiveRecord類來實現。在OR映射模型中,將關系數據庫中的關系表表映射到對象模型時,將關系表的表名映射到類名,表中的每一個元組映射到對應于這個類的一個對象,元組的一個字段對應于對象的一個屬性。

          假如我們有一個保存職員基本信息的文件,文件的格式是這樣的:第一行是文件內容的每個字段的名稱,從第二行開始,則是每個職員的基本信息。現在我們有一個文件名為“employee.txt”的文件,其內容如下所示:


          name,age,gender

          "John", 23, "male"

          "Linclon", 25, "male"


          假設我們就要從這個文本文件中讀取數據,并進行一定的處理。如果是使用C++編程,你首先一定會想到應該定義一個Employee類,然后這個類中有name, age, gender這些成員變量。但是是采用這種方法的話,可以發現,如果想在職員信息中加入一個字段,比如部門(department),就不得不修改Employee類的代碼,在Employee類中增加一個“department”成員變量,所以我們的代碼是高度依賴于文件的具體格式,這當然不是一個好的現象。我們希望有一種更簡單和優雅的方案,還有,Ruby動態性提高給我們一個解決方案,但是,我們應該從和下手呢,這就需要Ruby的元編程能力。


          ? ? 首先,我們想應該有一個職員類,在Rails中,每個關系表的名稱會成為類的名稱,在這里,采用類似的方法,將文本文件的名稱作為類的名稱,在Ruby中,類名同時也是一個常量名,所以第一個字母必須為大寫,我們使用如下的代碼來生成類名。


          class_name = File.basename(file_name, ".txt").capitalize
          # "employee.txt" => "Employee"
          klass = Object.const_set(class_name, Class.new)



          Class.new生成一個新的類,這個類的名稱是匿名的,所以采用const_set操作來綁定一個類名,變量klass是新類型的引用。


          生成了這個類以后,需要想這個類添加姓名,年齡和性別這些屬性,這些屬性的名稱是在文本文件的的第一行中給出的。


          data = File.new(file_name)
          header = data.gets.chomp

          data.close

          names = header.split(",")


          下面的代碼給出了如何生成這些屬性,以及初始化這些屬性值。


          klass.class_eval do
          ? ? attr_accessor *names
          ? ?? ?? ?? ?
          ? ? define_method(:initialize) do |*values|
          ? ?? ???names.each_with_index do |name, i|
          ? ?? ?? ?? ?instance_variable_set("@" + name, values )
          ? ?? ???end
          ? ? end
          ????#...? ?
          end? ?

          現在,有了一系列的訪問子(可讀和可寫),通過instance_variable_set方法,又給每個屬性做了初始化。

          變量names是在塊外部定義的,由于塊的閉合性,所以變量names在塊中也是有效的。當然,為了程序的演示,又定義的了一個to_s方法,代碼如下所示:


          ? ? define_method(:to_s) do
          ? ?? ???str = "<#{self.class}: "
          ? ?? ???names.each {|name| str << "#{name}=#{self.send(name)} "}
          ? ?? ???str + ">"
          ? ? end
          ? ? alias_method :inspect, :to_s


          ? ? 完成了這些以后,對于類的構造已經基本結束了,現在就需要真正的從文本文件中讀取數據了。從文本文件讀數據應該是一個類方法,而不是一個實例的方法,其實現代碼如下:


          ? ? def klass.read
          ? ?? ???array = []
          ? ?? ???data = File.new(self.to_s.downcase + ".txt")
          ? ?? ???data.gets #throw away header
          ? ?? ???data.each do |line|
          ? ?? ?? ?? ?line.chomp!
          ? ?? ?? ?? ?values = eval("[#{line}]")
          ? ?? ?? ?? ?array << self.new(*values)
          ? ?? ???end
          ? ?? ???data.close
          ? ?? ???return array
          ? ? end


          在這個方法中,使用字的類名來匹配相關的文件,比如將Employee類映射到“employee。txt”。

          然后,從文件中讀取職員信息,由于第一行是字段定義,所以要舍棄第一行數據。從第二行開始讀取數據,每讀取一行數據,則構造一個Employee實例。通過上面這個簡單的例子,我們可以看出元編程的功能是相當之強大的,使用元編程技術,可以構造相當簡單,優雅的解決方案。

          posted @ 2006-10-24 09:52 比特鼠 閱讀(490) | 評論 (0)編輯 收藏

          僅列出標題
          共6頁: 上一頁 1 2 3 4 5 6 下一頁 
          主站蜘蛛池模板: 安丘市| 台北县| 石景山区| 云浮市| 新田县| 桦川县| 浦县| 苏尼特左旗| 罗江县| 海城市| 册亨县| 河曲县| 繁昌县| 闽侯县| 舒兰市| 绍兴县| 泰州市| 鄂伦春自治旗| 深水埗区| 瑞丽市| 吴川市| 遂平县| 岳阳市| 通榆县| 乌拉特中旗| 文水县| 旬邑县| 福安市| 博客| 固镇县| 会宁县| 潮安县| 土默特右旗| 南木林县| 汝南县| 凌云县| 贡觉县| 塔城市| 铜陵市| 南昌县| 分宜县|