posted @ 2007-02-10 15:12 dennis 閱讀(6364) | 評論 (0) | 編輯 收藏
一。《鳥哥的linux私房菜——基礎學習篇》
??? 玩ubuntu也有段時間了,沒有系統學習過linux,靠的都是摸索和同事的指點,很有必要系統學習linux的使用。這本書是引進臺灣某鳥哥的(這名字真不錯)的作品,看書評不賴。

二.《重構:改善既有代碼設計(中文版)》
??? 這本書早就想讀,在學校嘗試讀過,看不下去,那時熱衷于各種各樣的技巧、框架和新鮮玩意,沉不下心來讀這些磚頭。06年是我對設計模式以及重構開始深入接觸的一年,興趣也越來越濃厚,這本書一定要讀!

三。《重構與模式》
??? 第15屆jolt的生產效率大獎得主,價值毋庸置疑,繼續我的模式熱情。

四。《lucene in Action中文版》
??? 買這本書的原因有二:1.足夠便宜,35塊大洋看看搜索技術,值! 2.我對搜索確實感興趣,很好奇,工作中也沒用過lucene,作為技術儲備來學習,不賴!
???? 滿大街的webwork in action ,struts in action,spring in action,這樣一本書顯得很不同,也好像很有趣。

五。《征服ruby on rails:web開發技術詳解》
??? 國內比較重量級的一本原創rails書籍,兩位作者也是牛人:
龔昕:現任NEC高級工程師,有10多年開發經驗,精通跨平臺開發,掌握多種數據庫系統,使用Perl/Ruby超過三年.
張浩:現任網訊(中國)軟件有限公司項目主管,主要研究Web技術,對RubyOnRails有獨特的見解
看書評也是不錯,值的讀讀。封面和書名搞的很差勁,比較遺憾。在狗日的《programming ruby》出來之前解解饞。

posted @ 2007-02-10 12:52 dennis 閱讀(323) | 評論 (0) | 編輯 收藏
public?class?HelloWorld
{
????public?static?void?Main()
????{
????????Console.WriteLine("Hello?World");
????}
????
}
??? 存為hello.cs。配置好環境變量,在命令行運行:csc hello.cs。在目錄下會生成一個hello.exe,直接運行hello。打印:
??? 看起來跟java確實沒什么不同,除了字母的大小寫,和java默認引入java.lang包,而這里需要using System;
??? 稍微復雜點的例子,我們寫一個庫文件stack.dll,或者說一個程序集(java中包的概念):
namespace?Acme.Collections
{
????public?class?Stack
????{
????????Entry?top;
????????public?void?push(object?data)
????????{
????????????top?=?new?Entry(top,?data);
??????????
????????}
????????public?object?pop()
????????{
????????????if?(top?==?null)?throw?new?InvalidOperationException();
????????????object?result?=?top.data;
????????????top?=?top.next;
????????????return?result;
????????}
????????public?Stack()
????????{
?????
????????}
????????class?Entry
????????{
????????????public?Entry?next;
????????????public?object?data;
????????????public?Entry(Entry?next,?object?data)
????????????{
????????????????this.next?=?next;
????????????????this.data?=?data;
????????????}
????????}
????}
}
??? 代碼很明顯,一個簡單的棧結構,我們把Stack類放在命名空間Acme.Collections中。運行:csc /t:library stack.cs,在應用目錄下生成一個stack.dll。我們怎么調用這個鏈接庫呢?寫個測試類:
using?Acme.Collections;
public?class?Test
{
????public?static?void?Main()
????{
????????Stack?stack?=?new?Stack();
????????stack.push(1);
????????stack.push(10);
????????stack.push(100);
????????????????????
????????Console.WriteLine(stack.pop());
????????Console.WriteLine(stack.pop());
????????Console.WriteLine(stack.pop());
????}
}
??? 很明顯,只是把java的import換成了using,而且不需要通配符。編譯test.cs:csc /r:stack.dll test.cs。
??? C#和ruby將是我07年主要的學習計劃,另外就是J2EE深入技術方面的掌握和理解,特別是模式、工作流和Portal方面。
posted @ 2007-02-09 10:38 dennis 閱讀(715) | 評論 (0) | 編輯 收藏
1.我們把一件“事”稱為案例(case),有時又叫做工作(work),職業(job),產品(Product),服務(service),項目(item)。案例總處于某個特定狀態,該狀態由三個元素組成:
(1)案例相關的屬性
(2)已經滿足的條件
(3)案例的內容
2.本質上case都是離散的,它們有自己獨立的開始和結束,都能彼此區分,每一個case都在一個過程中被執行。(其實這里的case就是我們一般工作流中的所謂工作流實例)
3.過程:由許多要被執行的task(任務)和一系列決定任務執行次序的條件構成。過程定義了案例的生命周期
4.任務(task):是一個工作的邏輯單元,它能夠作為一個整體被資源(resource)執行。任務可以被定義為不能再細分的過程,即原子過程,這里存在主觀因素。在定義或者分派任務的人看來,任務是原子性的,但是對于執行它的人來說經常是非原子性。
5.資源(resource):是指能夠執行特定任務的一個人、一臺機器或一群人。
6.過程結構的四種基本機制,或者說案例的生命周期(稱為路由):順序(sequence),選擇(selection),并行,循環。
7.活動(Activity):任務的具體執行(由資源所執行)稱為活動。
8.過程的分類:
基本過程:企業中那些生產產品或者服務的過程,也稱作生產過程。
二級過程:支持基本過程的過程,因此也被稱為支持過程,比如財務管理、人力管理等。
三級過程:指導與協調基本和二級過程的管理過程。
9.工作流的啟動(觸發)有3類:
(1)資源驅動(人工,自動,半自動)
(2)外部事件,一個JMS消息?
(3)時間信號(定時事件)
二.組織結構
1.組織結構確立了如何把組織所需要完成的工作分配給員工,最重要的三種組織形式:
(1)層次結構,常見的、通過樹結構來描述的組織圖
(2)矩陣結構,在以項目為中心的公司中較為常見,比如軟件公司,一個員工同時屬于電信事業部和XXX現場項目組
(3)網狀結構
2.有關工作流權限系統的設計,更多請見銀狐999的文檔《工作流系統組織模型應用和解決方案》
三.過程管理
1.區分管理系統與被管理系統,管理系統將目標、前提和決策傳達給被管理系統,被管理系統可以向管理系統回報,根據匯報,管理系統可以修正這些目標。
2.過程管理分為四個層次:
(1)Real-time,實時管理
(2)Operational 操作管理
(3)戰術管理
(4)戰略管理
從上往下影響的范圍越廣,持續時間越長。
3.業務過程信息系統的發展,歷史表明,越來越多的通用任務已被從程序中分離出來并且放入分解的管理系統中:
(1)1965-1975年:分解應用。信息系統由分解的應用組成,每個應用都有自己的數據庫和定義。
(2)1975-1985年:數據庫管理——將數據管理從應用程序中抽離出來,不同的程序共享一個數據庫,面向數據的開發方法產生
(3)1985-1995年:用戶界面管理——將用戶界面從應用程序中抽取出來。
(4)1995-2005:工作流管理——將業務過程從應用程序中抽取出來。工作流系統負責管理工作流并組織案例數據在不同的人員以及應用程序間進行流轉。
posted @ 2007-02-08 19:13 dennis 閱讀(2027) | 評論 (1) | 編輯 收藏
posted @ 2007-02-07 14:38 dennis 閱讀(285) | 評論 (0) | 編輯 收藏
項目要初驗,完善文檔基本沒我什么事,正好有時間把blog搬家!-_-
第一次寫blog在CSDN(killme2008),那時CSDN的blog系統剛出來,速度很驚人——慢的驚人,而且3天兩頭當機的玩意。不是我玩blog,是blog玩我。忍受了接近一年的時間,把家搬到了sohu(花非花)。在那也呆了4,5個月了吧,可畢竟不是技術blog圈,八卦新聞一大堆,而且似乎大伙都喜歡在blog上貼圖,寫上那么一段風花雪月的文字然后滿世界打廣告叫別人去看!-_-? 我說你丫是寫blog還是想出名啊!
blog對我的意義僅在于網上有個寫東西的地方,寫下自己每天的得失,寫下某一件快樂的事情,寫下幾行也許以后用得著又怕忘記的代碼......
搬家夠累,懶的一篇一篇復制黏貼了,轉了20篇就沒興趣了,就這樣吧,開始俺的blogjava生涯,等下順便把域名映射到這來,嘿嘿
posted @ 2007-02-06 14:27 dennis 閱讀(278) | 評論 (0) | 編輯 收藏
var pointer=Global;
報錯,找不到此對象。這是因為在ECMAScript中,每個函數都某個對象的方法,我們用到的isNaN(),isFinite(),parseInt()和parseFloat()函數,看起來是獨立的函數,其實它們都是Global對象的函數。
需要注意兩個用于處理url編碼的函數:
1)encodeURI()和decodeURI()? 處理完整的uri
2)encodeURIComponent()和decodeURIComponent() ??? 處理片段
2.其他對象如Array,Math,Date對象,我發現比較有趣的是Array的處理方式與ruby中Array的處理方式幾乎一樣。
3.ECMAScript對象的創建方式:
1)工廠方式:



















這樣的方式看起來很奇怪,好象方法showColor()不是對象的方法
2)構造函數方式:















這樣的方式有個新問題,那就是每次構造一個對象都將重復生成函數showColor,為每個對象創建獨立的函數版本。
3)原型方式






















利用對象的prototype屬性來構造對象,但是有兩個問題:沒辦法使用構造函數傳參來生成對象;函數雖然被不同對象共享,但是屬性竟然也被共享,比如上面代碼中,oCar1的drivers屬性與oCar2的drivers屬性是同一個Array對象。
4)為了解決上面問題,我們引入了構造函數/原型的混合方式:






















屬性通過構造函數方式,而函數則通過原型來生成,這就避免了純粹原型方式帶來的問題。但是函數放在對象的構造函數定義,讓習慣java,c++的人也感覺不爽,對象為什么不能放在一塊地方定義呢?這就引出來了動態原型方式
5)動態原型方式:


























通過引入_initialized 屬性,當第一次構造對象時生成方法showColor ,再次生成對象時,此時的_initialized 已經是true,就避免了重復生成函數,屬性的定義和函數的定義都在構造函數內,也滿足了語義上的對象封裝概念。
我們應當盡量采用 構造函數/原型混合方式 和 動態原型方式 來創建ECMAScript對象。
posted @ 2007-02-06 14:05 dennis 閱讀(559) | 評論 (0) | 編輯 收藏
第2章 ECMAScript基礎
JavaScript實質上是ECMAScript在web環境中的實現,還有其他實現(如Flash的ActionScript等)。因此了解基本的ECMAScript相當于掌握javascript的基礎。
1。ECMAScript的基礎概念:
1)區分大小寫
2)變量是弱類型(解釋型語言的基本特點)
3)每行結尾的分號可有可無(與java不同)
4)注釋的形式與java相同(單行或者塊注釋)
5)大括號代表代碼塊{}
2。變量,使用var定義。如var test="test1"
當然,變量是弱類型,并且可以不被初始化而定義
var test="test1"
var test2;
test=1;
建議采用匈牙利類型標記法來命名變量。
3.關鍵字和保留字(略)
4。原始值和引用值
與java類似,變量分成原始類型與引用類型兩類:
1)原始值存儲在stack中
2)引用值是存儲在heap中的對象,存儲在變量處的是一個point
5。原始類型:
1)ECMAScript有5種原始類型:Undefined、Null、Boolean、Number和String。可以使用typeof來判斷一個值是否在某類型的范圍內。如:



注意:type null返回object,因為null被認為是對象的占位符。
2)Undefined類型
當變量未初始化時,該變量的默認值就是undefined。但是,undefined并不同于未定義的值。但是,typeof并不區分兩者,比如:



函數無返回值,返回的也是undefined
3)Null類型
Null只有一個值,也就是null。Undefined本質上是從Null派生來的,因此兩者相等:
alert(null==undefined);? //輸出true
但兩者意義不同,Undefined表示變量未被初始化之前的值,而Null則表示尚未存在的對象,也就是對象的占位符。
4)Boolean類型
Boolean有兩個值:true,false
5)Number類型
Number類型很有趣,Number可以表示32位的數字,也可以表示64位的浮點數,以0開頭的數字當成八進制,以ox開頭即為十六進制。有趣的地方在于所有數字運算結果都是返回十進制!
在ECMAScript中,浮點數的計算本質上是存儲的是字符串。
Number類型的大小在Number.MAX_VALUE和Number.MIN_VALUE之間
無窮大用Infinity表示,如你所見,Number.MAX_VALUE就是Infinity,而Number.MIN_VALUE就是-Infinity,可以通過isFinite(n)來判斷n是否超過界限
最后,還有一個特殊值是NaN,表示Not a Number(非數),非數產生在類型轉換失敗時,注意,它與自身不相當:alert(NaN==NaN);? //輸出false
不推薦使用NaN,我們可以通過isNaN()來判斷是否是非數(很常用咯)
6) String類型
String是唯一沒有固定大小的原始類型,可以存儲0或者多個Unicode字符。與java不同的是,可以使用雙引好和單引號來聲明字符:
var s1="test1";
var s2='test2';
常見轉義符與其他語言相同。
6。類型轉換
1)轉換成字符串:
Boolean,String和Number類型本質上都是偽對象,他們都有toString()方法(與java相同)
Number類型的toString()有兩種模式:
toString(),返回數字的十進制
toString(n),返回n進制的字符串(n為2,8,10,16)
2)轉換成數字:
兩個方法:parseInt()和parseFloat()方法。用法略過,需要注意的是parseInt如果沒指定基數,會把以0開始的解析為8進制。parseFloat反而不會。
3)強制類型轉換:
3種強制類型轉換:
String(value);
Boolean(value);
Number(value);
規則如下:
(1)String(value)與toString()基本一樣,除了對null或者undefined的轉換之外,如:
var s1=String(null); //通過
var oNull=null;
var s2=oNull.toString(); //報錯
(2)Boolean(value),如果該value是空字符串、數字0、undefined或者null,返回false,其他返回true
(3)Number()與parseInt和parseFloat基本相同,不同的是Number()將轉換整體,如果轉換失敗返回NaN。如:




7。引用類型:
1)Object類:類似于java中java.lang.Object的地位和作用,js中所有類都繼承此類而來。它包含下面的屬性:
(1)Constructor——對創建該對象函數的引用
(2)Prototype——對該對象對象原型的引用,對所有的類,它將返回一個Object實例
(3)HasOwnProperty(property)——判斷是否有某個屬性
(4)IsPropertOf(object)——判斷該對象是否為另一個對象的原型
(5)PropertyIsEnumerable(property)——判斷對象的屬性是否可以枚舉
(6)ToString()——返回對象的原始字符串表示
(7)ValueOf()——返回最適合該對象的原始值,對于許多類,它的結果與ToString()相同
2)Boolean類,盡量避免使用,注意的是,在Boolean表達式中,所有的值將被自動轉化為true,所以下面的輸出:
var oFalseObject=new Boolean(false);
alert(oFalseObject&&true);? //輸出true,而不是false
3) Number類,是Number原始類型的引用類型,應該少使用此類,盡量使用原始類型。需要注意3個方法:
(1)toFixed():返回具有指定位數小數的字符串,如:
var oNumberObject=new Number(99);
alert(oNumberObject.toFixed(2));? // 輸出99.00
?(2) toExponential(),返回用科學記數法表示的數字的字符串形式,如:
var oNumberObject=new Number(99);
alert(oNumberObject.toExponential(1));? //輸出9.9e+1
(3)toPrecision(),對數進行舍入,返回盡可能接近真實值的數字,如:
var oNumberObject=new Number(99);
alert(oNumberObject.toPrecision(3));? //輸出99.0
注意,這3個方法都將進行四舍五入操作
4)String類,是String原始類型的對象,常見方法見下面的例子:



























8.操作符和語句,省略大部分操作符的介紹和控制語句,與其他語言(java,ruby)基本相同,需要注意的摘抄如下:
1)delete操作符:用于刪除對以前定義的對象屬性或者方法的引用,如:





2)for ... in語句,嚴格的枚舉語句,用于枚舉對象屬性
3)switch可以作用于字符串,而不僅僅是整數
4)不支持重載(與ruby相同),可以通過arguments對象來變相實現
5)在ECMAScript中,函數其實是完整一個對象(與ruby相同,或者說動態語言的基本特點),可以采用:
var function_name=new Function(arg1,arg2,arg3,...,function_body);
來定義函數(速度比普通方法慢)。函數可以作為參數傳遞,函數的length屬性返回此函數的參數個數
6)ECMAScript的閉包概念與其他動態語言的概念很不同,我還不大理解,過段時間好好研究一下。(寫入備忘錄)
posted @ 2007-02-06 14:03 dennis 閱讀(437) | 評論 (0) | 編輯 收藏
posted @ 2007-02-06 13:58 dennis 閱讀(3074) | 評論 (1) | 編輯 收藏
1。首先到http://rubyforge.org/frs/?group_id=2038,下載0.3版本,解壓縮后重命名文件夾為fckeditor,并放到你的應用的/vender/plugins下面,文件結構類似:
--rblog
????--vender
??????--plugins
????????? --fckeditor
?????????????? --app
?????????????? --lib
?????????????? --public
?????????????? ...
2。然后在應用根目錄下執行命令:rake fckeditor:install進行安裝和設定。安裝完成后就可以使用了,默認會在public下面新建一個uploads目錄用來存放上傳的文件。
3。使用方法:項目自帶的readme寫錯的,下面是正確的做法。你首先要在頁面引入js文件(當然也可以在layout中引入)
???????????? <%= javascript_include_tag :fckeditor %>
(1)非AJAX方式:非常簡單,首先你需要從你的action傳來一個對象,如果沒有你就會一直收到一個nil錯誤。假設為@artical=Artical.new,artical有一個content字段用來存儲文章內容
然后在頁面調用:
<%= fckeditor_textarea("artical", "content", :toolbarSet => 'Simple', :width => '100%', :height => '200px' )%>
如此一來,@artical.content將顯示在fckeditor的編輯框內,我們這里為空
(2)AJAX方式調用:
<%= form_remote_tag :url => @options.merge(:controller => @scaffold_controller),
??????????????????? :before => fckeditor_before_js('note', 'text') %>
??? <%= fckeditor_textarea( "artical", "content", :ajax => true ) %>
<%= end_form_tag %>
posted @ 2007-02-06 13:41 dennis 閱讀(249) | 評論 (0) | 編輯 收藏