糊言亂語

          志未半斤, 才無八兩. 有苦有樂, 糊涂過活。
          posts - 25, comments - 7, trackbacks - 0, articles - 42
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          在一般的項目中,數據庫主鍵不會擁有業務邏輯。但是在一些數據庫設計不是很嚴格的項目中還是會把擁護業務邏輯的字段作為主鍵使用,而且可能回事復合主鍵。 現在在一個項目我就遇到這情況。這個項目的數據訪問框架使用的Hibernate框架,在對復合主鍵的映射是我遇到了一個Hibernate Bug。我使用的數據庫是Oracle 8i。Hibernate Mapping如下:

          <composite-id name="id" class="InfoViewDetaillistId">

                     <key-property

                        name="accountno"

                        column="ACCOUNTNO"

                        type="string"

                     />

                     <key-property

                        name="rlsdepid"

                        column="RLSDEPID"

                        type="string"

                     />

                     <key-property

                        name="sequenceno"

                        column="SEQUENCENO"

                        type="integer"

                     />

                     <key-property

                        name="ondate"

                        column="ONDATE"

                        type="date"

                     />

          </composite-id>

          在這個復合主鍵中包括了四個擁有業務邏輯的字段,分別是帳號,中心號,序號,日期。問題就在Hibernate對日期類型的映射上,如使用上面的配置方法的話Hibernate在啟動的時候就會報錯。具體的解決方法是把
          <key-property

          name="ondate"

          column="ONDATE"

          type="date"

          />

          替換成

          <key-property name="ondate" type="date">

          <column name="ONDATE" not-null="true" sql-type="java.sql.Types.DATE"/>

          </key-property>

          Bug具體的原因我會在一會的文章中解釋。

          posted @ 2007-10-09 12:57 Stanley Sun 閱讀(311) | 評論 (0)編輯 收藏

          十月放假期間早晨本應該在家里舒服的床上呼呼大睡,十月中旬一個項目就要上線,無奈老板讓所有的員工加班,自己卻跑到埃及去度假。十一期間的交通果然是出奇的好,馬路上零星點點的幾個人頭,公交車上一大片一大片的空位子。本應該用兩個多小時路程卻用了不到一個半小時就到了公司,到了公司連在這里住的的小伙還沒有起床。
          無聊的打開筆記本,聽聽音樂,上上網,出奇的悠哉。呵呵,在哪里是在加班啊。跑到tss網站上看看(本人的英語不是很好,天天強迫自己看看英文網站來提高英文水平),無意中發現TSS里有一個地方是專門通過卡通的形式來演繹程序員生活中遇到的趣事。如果你身邊有什么有趣的事情的話,還可以投稿給他們。

          posted @ 2007-10-04 09:27 Stanley Sun 閱讀(179) | 評論 (0)編輯 收藏

          記憶里Java5發布離現在已經有了兩三年了,雖然有不少的貼心的新特性。但是一直無法撼動J2SE 1.4在Java程序員心中的位置。在Java5發布的時候我也看過一些關于新特性的介紹,泛型、枚舉、注釋、foreach等。當時個人感覺其實除了foreach還算有點吸引眼球,其他的特性只是一種過度功能。對于泛型只是在Java編譯器中做的手腳,而在JVM中是不支持的,有點想一個文字游戲。對于枚舉,由于本人對這樣的功能接觸不多,所以就不妄加評價了。注釋出現的目的主要是消除XML災難,但是有無法達到XML不更改Class就可以改變配置。就是憑借的這些想法本人直到Java5發布后的兩三年一直就沒有碰過它,但是在最近的一個新項目中Java5新特性隨處可見,我與其他的Programmer交流了一下發現現在這些新特性同樣出現在他們的項目中。

          何解?難道大家已經不在乎使用的是一個空中樓閣式的特性,只要能夠圓滿的完成項目?可能Java5新特性有著我看不到的優點。

          posted @ 2007-09-26 22:16 Stanley Sun 閱讀(193) | 評論 (0)編輯 收藏

          對于有本一族的現代人來說,本本為我們的工作提供了很大的方便,但是一般家中還是會用一臺臺式電腦為我們服務(更加傾向于服務器的作用)。那么如何方便的鏈接筆記本和家中的臺式機一起上網呢。有的使用路由器的方式,這種方式固然高效但是對于家中沒有路由的朋友來說就比較郁悶了。這里我介紹一種通過普通網線來對連兩臺電腦上網的方法。


          設備:

          1.準備一根于普通網線差不多的雙機互連線,它不同的只是水晶頭接口的排序方法不同,其他的材料都是一樣的。

          2.需要有一臺雙網卡的臺式電腦,我家里的磐正的8RDA3+主板,集成的雙網卡。非常爽。

          方法:

          1. 把臺式電腦的IP更改為192.168.0.1,這樣當筆記本接入的時候,會默認的通過這個IP,去獲取筆記本的IP。

          2. 把臺式電腦的ADSL鏈接共享,連接的通道選擇雙機互連線接入的網卡。點擊ADSL連接-->高級-->Internet連接共享中設置。

          3. 可能需要重啟一下電腦。此時不用設置筆記本的IP地址,一般使用自動獲取就行了。如果自己想設置可以把IP設置成192.168.0.*,網關為192.168.0.1,Dns服務器為192.168.0.1.

          注意:如果筆記本于臺式電腦的IP不是一個網段的話,則無法共享上網。

          現在一切就設置好了,在臺式電腦上打開ADSL連接后,筆記本就可以一起上網了,是不是非常方便。。。

          posted @ 2007-09-25 20:48 Stanley Sun 閱讀(1174) | 評論 (0)編輯 收藏

          1 背景假設

          廈門央瞬公司是一家電子元器件設備供應商,其中有個ARM部門,專門負責ARM芯片的方案設計、銷售,并在北京、上海各設立了一個辦事處。對于工作日志,原先采用郵件方式發給經理,但是這種方式有個缺點,那就是不具備連續性,要看以前的日志必須一封一封郵件去查看,很麻煩。于是就想到利用 Subversion,讓員工在自己電腦上編輯日志,然后利用svn傳送回來,既方便員工自己編寫日志,又方便對日志的歸檔處理,而且提交日志的時候只需要執行一下 svn update 即可,比發送郵件還要簡單的多。

          • svn服務器相關信息

            • 服務器地址: 192.168.0.1
            • 服務器OS: MS Windows 2000 Server Edition 中文版
            • 代碼庫本地目錄: D:\svn\arm
          • arm部門文檔的目錄結構如下:

            arm                 部門名稱
            ├─diary           工作日志目錄
            │  ├─headquarters    總部工作日志目錄
            │  ├─beijing         北京辦日志目錄
            │  └─shanghai        上海辦日志目錄
            ├─ref             公司公共文件參考目錄
            └─temp            臨時文件目錄
            
          • 人員情況

            • morson,公司總經理,其實他不必親自看任何東西,就連部門經理們的每周總結都不一定看。但是為了表示對他的尊敬,以及滿足一下他的權力欲,還是給他開放了"閱讀所有文檔"的權限
            • michael,arm事業部的部門經理,沒事的時候喜歡弄點兒新技術,用svn來管理日志,就是他相處來的主意
            • scofield,北京辦人員,老員工,為人油滑難管
            • lincon,上海辦人員,老員工,大老實人一個
            • linda,總部協調員、秘書,文筆不錯,長得也不錯
            • rory,單片機技術員,技術支持
          • 訪問權限需求分析

            • 允許總經理讀取所有文件
            • 除部門經理外,所有其他人員,均只能看到本辦事處人員工作日志
            • 不允許匿名訪問
            • ref目錄只允許經理和秘書寫,對其他人只讀
            • temp目錄人人都可以寫

          2 建立代碼庫

          在服務器 D:\svn 目錄下,建立 arm 代碼庫,命令如下:

          D:\svn>svnadmin create arm
          

          在客戶機 F:\temp 目錄下,建立好上述目錄結構

          用命令 F:\temp>svnimportarmsvn://192.168.0.1/arm 導入結構

          【注意點:關于導入時候的細微差別】

          3 編輯代碼庫基礎配置文件

          編輯代碼庫 arm\conf\svnserve.conf 文件,如下:

          [general]
          password-db = passwd.conf
          anon-access = none
          auth-access = write
          authz-db = authz.conf
          

          4 管理用戶帳號

          新建代碼庫 arm\conf\passwd.conf 文件,如下:

          [users]
          morson = ShowMeTheMoney
          michael = mysecretpassword
          scofield = hellolittilekiller
          lincon = asyouknows111
          rory = 8809117
          linda = IlikeWorldCup2006
          

          5 建立目錄訪問權限控制文件

          新建代碼庫 arm\conf\authz.conf 文件,內容如下:

          [groups]
          g_vip = morson
          g_manager = michael
          g_beijing = scofield
          g_shanghai = lincon
          g_headquarters = rory, linda
          g_docs = linda
          [arm:/]
          @g_manager = rw
          * = r
          [arm:/diary/headquarters]
          @g_manager = rw
          @g_headquarters = rw
          @g_vip = r
          * =
          [arm:/diary/beijing]
          @g_manager = rw
          @g_beijing = rw
          @g_vip = r
          * =
          [arm:/diary/shanghai]
          @g_manager = rw
          @g_shanghai = rw
          @g_vip = r
          * =
          [arm:/ref]
          @g_manager = rw
          @g_docs = rw
          * = r
          [arm:/temp]
          * = rw
          

          6 測試

          在服務器上,打開一個 DOS Prompt 窗口,輸入如下指令:

          svn co svn://127.0.0.1/arm --no-auth-cache --username rory --password 8809117
          

          我們應該得到如下目錄結構:

          arm
          ├─diary
          │  └─headquarters
          ├─ref
          └─temp
          

          然后修改ref目錄下任意文件并提交,服務器將會報錯"Access deni"

          深入

          本章將詳細介紹前一章所涉及的兩個配置文件, svnserve.conf 和 authz.conf,通過對配置逐行的描述,來闡明其中的一些細節含義。

          這里首先要注意一點,任何配置文件的有效配置行,都不允許存在前置空格,否則程序會無法識別。也就是說,如果你直接從本文的純文本格式中拷貝了相關的配置行過去,需要手動將前置的4個空格全部刪除。當然了,如果你覺得一下子要刪除好多行的同樣數目的前置空格是一件苦差使,那么也許 UltraEdit 的"Column Mode"編輯模式,可以給你很大幫助呢。

          1 svnserve.conf

          arm\conf\svnserve.conf 文件,是 svnserve.exe 這個服務器進程的配置文件,我們逐行解釋如下。

          首先,我們告訴 svnserve.exe,用戶名與密碼放在 passwd.conf 文件下。當然,你可以改成任意的有效文件名,比如默認的就是 passwd:

          password-db = passwd.conf
          

          接下來這兩行的意思,是說只允許經過驗證的用戶,方可訪問代碼庫。那么哪些是"經過驗證的"用戶呢?噢,當然,就是前面說那些在 passwd.conf 文件里面持有用戶名密碼的家伙。這兩行的等號后面,目前只允許 read write none 三種值,你如果想實現一些特殊的值,比如說"read-once"之類的,建議你自己動手改源代碼,反正它也是自由軟件:

          anon-access = none
          auth-access = write
          

          接下來就是最關鍵的一句呢,它告訴 svnserve.exe,項目目錄訪問權限的相關配置是放在 authz.conf 文件里:

          authz-db = authz.conf
          

          當然,svn 1.3.2 引入本功能的時候,系統默認使用 authz 而不是 authz.conf 作為配置文件。不過由于鄙人是處女座的,有著強烈的完美主義情結,看著 svnserve.conf 有后綴而 passwd 和 authz 沒有就是不爽,硬是要改了。

          2 authz.conf 之用戶分組

          arm\conf\authz.conf 文件的配置段,可以分為兩類,``[group]`` 是一類,里面放置著所有用戶分組信息。其余以 [arm:/] 開頭的是另外一類,每一段就是對應著項目的一個目錄,其目錄相關權限,就在此段內設置。

          首先,我們將人員分組管理,以便以后由于人員變動而需要重新設置權限時候,盡量少改動東西。我們一共設置了5個用戶分組,分組名稱統一采用 g_ 前綴,以方便識別。當然了,分組成員之間采用逗號隔開:

          [groups]
          # 任何想要查看所有文檔的非本部門人士
          g_vip = morson
          # 經理
          g_manager = michael
          # 北京辦人員
          g_beijing = scofield
          # 上海辦人員
          g_shanghai = lincon
          # 總部一般員工
          g_headquarters = rory, linda
          # 小秘,撰寫文檔
          g_docs = linda
          

          注意到沒有, linda 這個帳號同時存在"總部"和"文檔員"兩個分組里面,這可不是我老眼昏花寫錯了,是因為 svnserve.exe 允許我這樣設置。它意味著,這個家伙所擁有的權限,將會比他的同事 rory 要多一些,這樣的確很方便。具體多了哪些呢?請往下看!

          3 authz.conf 之項目根目錄

          接著,我們對項目根目錄做了限制,該目錄只允許arm事業部的經理才能修改,其他人都只能眼巴巴的看著:

          [arm:/]
          @g_manager = rw
          * = r
          
          • [arm:/] 表示這個目錄結構的相對根節點,或者說是 arm 項目的根目錄
          • 這里的 @ 表示接下來的是一個組名,不是用戶名。你當然也可以將 @g_manager=rw 這一行替換成 michael=rw ,而表達的意義完全一樣。
          • * 表示"除了上面提到的那些人之外的其余所有人",也就是"除了部門經理外的其他所有人",當然也包括總經理那個怪老頭
          • * = r 則表示"那些人只能讀,不能寫"

          4 authz.conf 之項目子目錄

          然后,我們要給總部人員開放日志目錄的讀寫權限:

          [arm:/diary/headquarters]
          @g_manager = rw
          @g_headquarters = rw
          @g_vip = r
          * =
          
          • 我敢打賭,設計svn的家伙們,大部分都是在 unix/linux 平臺下工作,所以他們總喜歡使用 / 來標識子目錄,而完全忽視在 MS Windows 下是用 \ 來做同樣的事情。所以這兒,為了表示 arm\diary\headquarters 這個目錄,我們必須使用 [arm:/diary/headquarters] 這樣的格式。
          • 這里最后一行的 *= 表示,除了經理、總部人員、特別人士之外,任何人都被禁止訪問本目錄。這一行是否可以省略呢?
          • 之所以這兒需要將 @g_vip=r 一句加上,就是因為存在上述這個解釋。如果說你沒有明確地給總經理授予讀的權力,則他會和其他人一樣,被 * 給排除在外。
          • 如果眾位看官中間,有誰玩過防火墻配置的話,可能會感覺上述的配置很熟悉。不過這里有一點與防火墻配置不一樣,那就是各個配置行之間,沒有 先后順序 一說。也就是說,如果我將本段配置的 *= 這一行挪到最前面,完全不影響整個配置的最終效果。
          • 請注意這兒,我們并沒有給 arm\diary 目錄設置權限,就直接跳到其子目錄下進行設置了。我當然是故意這樣的,因為我想在這兒引入"繼承"的概念。
          • 權限具備繼承性 任何子目錄,均可繼承其父目錄的所有權限,除非它自己被明確設置了其他的權限。也就是說,在 arm 目錄設置權限后, arm\diary 目錄沒有進行設置,就意味著它的權限與 arm 目錄一樣,都是只有經理才有權讀寫,其他人只能干瞪眼。
          • 【 * = 是否可以省略】【用例子引入覆蓋】【單用戶權限的繼承問題】【父目錄權限集成與全面覆蓋問題】

          現在來看看

          好了,我們現在掌握了"繼承"的威力,它讓我們節省了不少敲鍵盤的時間。可是現在又有一個問題了,

          屬性具備覆蓋性質子目錄若設置了屬性,則完全覆蓋父目錄。

          5 authz.conf 的其他注意點

          1. 父目錄的 r 權限,對子目錄 w 權限的影響

          把這個問題專門提出來,是因為在1.3.1及其以前的版本里面,有個bug,即為了子目錄的寫權限,項目首目錄必須具備讀權限。因此現在使用了1.3.2版本,就方便了那些想在一個代碼庫存放多個相互獨立的項目的管理員,來分配權限了。比如說央舜公司建立一個大的代碼庫用于存放所有員工日志,叫做 diary,而arm事業部只是其中一個部門,則可以這樣做:

          [diary:/]
          @g_chief_manager = rw
          [diary:/arm]
          @g_arm_manager = rw
          @g_arm = r
          

          這樣,對于所有arm事業部的人員來說,就可以將 svn://192.168.0.1/diary/arm 這個URL當作根目錄來進行日常操作,而完全不管它其實只是一個子目錄,并且當有少數好奇心比較強的人想試著 checkout 一下 svn://192.168.0.1/diary 的時候,馬上就會得到一個警告"Access deni",哇,太酷了。

          1. 默認權限

          如果說我對某個目錄不設置任何權限,會怎樣?馬上動手做個試驗,將:

          [diary:/]
          @g_chief_manager = rw
          

          改成:

          [diary:/]
          # @g_chief_manager = rw
          

          這樣就相當于什么都沒有設置。在我的 svn 1.3.2 版本上,此時是禁止任何訪問。也就是說,如果你想要讓某人訪問某目錄,你一定要顯式指明這一點。這個策略,看起來與防火墻的策略是一致的。

          1. 只讀權限帶來的一個小副作用

          若設置了:

          [arm:/diary]
          * = r
          

          則svnserve認為,任何人,都不允許改動diary目錄,包括刪除和改名,和新增。

          也就是說,如果你在項目初期創建目錄時候,一不小心寫錯目錄名稱,比如因拼寫錯誤寫成 dairy,以后除非你改動 authz.conf 里面的這行設置,否則無法利用 svn mv 命令將錯誤的目錄更正。

          改進

          1 對中文目錄的支持

          上午上班的時候,Morson 來到 Michael 的桌子前面,說道:"你是否可以將我們的北京辦、上海辦目錄,改成用中文的,看著那些拼音我覺得很難受?" Michael 心想,還好這兩天剛了解了一些與 unicode 編碼相關的知識,于是微笑地回答:"當然可以,你明天下午就可以看到中文目錄名稱了。"

          1. 使用 svn mv 指令,將原來的一些目錄改名并 commit 入代碼庫,改名后的目錄結構如下:

            arm
            ├─工作日志
            │  ├─總部人員
            │  ├─北京辦
            │  └─上海辦
            ├─公司公共文件參考目錄
            └─臨時文件存放處
            
          2. 修改代碼庫的 authz.conf 文件,將相應目錄逐一改名

          3. 使用 UltraEdit 將 authz.conf 文件轉換成不帶 BOM 的 UTF-8 格式

            將配置文件轉換成 UTF-8 格式之后,Subversion 就能夠正確識別中文字符了。但是這里需要注意一點,即必須保證 UTF-8 文件不包含 BOM 。BOM 是 Byte Order Mark 的縮寫,指 UNICODE 文件頭部用于指明高低字節排列順序的幾個字符,通常是 FFFE ,而將之用 UTF-8 編碼之后,就是 EFBBBF 。由于 UTF-8 文件本身不存在字節序問題,所以對 UTF-16 等編碼方式有重大意義的 BOM,對于 UTF-8 來說,只有一個作用--表明這個文件是 UTF-8 格式。由于 BOM 會給文本處理帶來很多難題,所以現在很多軟件都要求使用不帶 BOM 的 UTF-8 文件,特別是一些處理文本的軟件,如 PHP、 UNIX 腳本文件等,svn 也是如此。

          目前常用的一些文本編輯工具中,MS Windows 自帶的"記事本"里面,"另存為"菜單保存出來的 UTF-8 格式文件,會自動帶上 BOM 。新版本 UltraEdit 提供了選項,允許用戶選擇是否需要 BOM,而老版本的不會添加 BOM。請各位查看一下自己常用的編輯器的說明文件,看看它是否支持這個功能。

          利用 UltraEdit ,我們可以將 BOM 去掉。方法是,首先利用"UTF-8 TO ASCII"菜單將文件轉換成本地編碼,通常是GB2312碼,然后再使用"ASCII TO UTF-8(UNICODE Editing)"來轉換到 UTF-8 即可。

          posted @ 2007-09-05 18:15 Stanley Sun 閱讀(145) | 評論 (0)編輯 收藏

          僅列出標題
          共5頁: 上一頁 1 2 3 4 5 下一頁 
          主站蜘蛛池模板: 浑源县| 广水市| 郯城县| 焦作市| 阿拉善右旗| 红桥区| 资中县| 湾仔区| 东阿县| 门头沟区| 贞丰县| 阿克苏市| 安吉县| 文水县| 江都市| 乾安县| 体育| 渝北区| 安化县| 辽阳市| 吉木萨尔县| 特克斯县| 南部县| 滦南县| 深水埗区| 峡江县| 吉木乃县| 崇明县| 奉节县| 张家川| 北票市| 确山县| 若羌县| 临汾市| 芦溪县| 枞阳县| 辉县市| 颍上县| 青阳县| 光泽县| 炎陵县|