posted @ 2011-05-15 21:53 小強摩羯座 閱讀(248) | 評論 (0) | 編輯 收藏
• 后者處理與位置有關(guān):block, inline, none 分別是有前后換行,不換行,不顯示功能但是不保留位置。
• 二者功能差異:保留位置,和位置形式
<script language="javascript">
function toggleVisibility(me)
{
if(me.style.visibility=="hidden")
{
me.style.visibility="visible";
}
else
{
me.style.visibility="hidden";
}
}
</script>
<DIV onclick="toggleVisibility(this)"
style="position:relative">
第一行文本將會觸發(fā)"hidden"和"visible"屬性,注意第二行的變化。
</DIV>
<DIV>因為visibility會保留元素的位置,所以第二行不會移動.</DIV>
<script language="javascript">
function toggleDisplay(me){
if(me.style.display=="block"){
me.style.display="inline";
alert("文本現(xiàn)在是:'inline'.");
}
else{
if(me.style.display=="inline"){
me.style.display="none";
alert("文本現(xiàn)在是:'none'.3秒鐘后自動重新顯示。");
window.setTimeout("blueText.style.display='block';",
3000,"javascript");
}
else{
me.style.display="block";
alert("文本現(xiàn)在是:'block'.");
}
}
}
</script>
<DIV>在<span id="blueText"
onclick="toggleDisplay(this)"
style="color:blue;position:relative;cursor:hand;">
藍色</span>文字上點擊來查看效果.</DIV>
posted @ 2010-09-14 13:47 小強摩羯座 閱讀(1036) | 評論 (0) | 編輯 收藏
posted @ 2010-09-09 15:09 小強摩羯座 閱讀(416) | 評論 (0) | 編輯 收藏
項目經(jīng)理之修煉(8)——別忘了告訴別人你是誰
文章分類:軟件開發(fā)管理你能想象美國總統(tǒng)上任,卻沒有總統(tǒng)就職儀式嗎?
你能想象北京奧林匹克運動會,沒有開幕式表演嗎??
OK。相信你一定見過這樣的場景:
某老板匆匆忙忙地進了屋,忽地來了一嗓子:“大家靜靜,通知大家一下:以后,某項目就由小張負責了!”
**************************************************
話說楚漢相爭。劉邦在蕭何的再三舉薦下,決定讓韓信為大將。
“來人,叫韓信過來,我要封他為大將。”劉邦道。
蕭何表示異議:“漢王你一向傲慢沒有禮貌,現(xiàn)在拜大將就和喊一個小孩子那么隨便,所以韓信才會離開的。漢王要想用人家,必須選一個吉日,吃素,設(shè)祭壇,用非常鄭重地禮節(jié)來拜將才行。”劉邦同意蕭何的意見。
結(jié)果,盡管韓信是個無名小卒,卻順利的接過了軍權(quán),而沒有碰到那些元老們的抵抗,成功地導(dǎo)演了一幕幕戰(zhàn)爭奇跡。
**************************************************
登臺拜將,是一件具有深刻管理內(nèi)涵的故事。它告訴我們這樣一個道理:
——內(nèi)容是重要的,但形式卻是不容忽視。
我們不求老板非要在某個公開場合悠揚地宣告:“某項目成立了!!小張從此站起來了!!!”什么吉日,什么齋戒,什么禮儀。。。也就罷了。
但是,不給正式任命書;不在正式場合公布;甚至連一個頭銜都舍不得。這絕對是沒天理的。
**************************************************
“看,老板不重視這個項目。。。”(相關(guān)人員)
“瞧,老板不重視這個家伙。估計這個家伙沒有什么后臺” (相關(guān)人員)
“你負責某項目?我怎么不知道有這么個項目呢?你是哪位啊?” (相關(guān)人員)
“老板似乎并不重視/信任我啊” (項目經(jīng)理)
***************************************************
以上種種,對項目的推動極為不利的。尤其是手下有資深員工、或者項目經(jīng)理候補者等挑戰(zhàn)者的時候,問題將會加倍嚴重。
大家可能會懷疑:“沒有那么嚴重吧?”
沒有不嚴重,只有更嚴重!!
這其中蘊含著一個深刻的道理——名不正則言不順!!
言不順是什么意思呢?
-你的意見可能被忽視;
-你的命令可能被當作建議;
-你的計劃可能被別人忘記;
試想,你如果是項目經(jīng)理,你的項目將會怎樣。。。。。。
*********************************************************
Question: 我沒有辦法叫老板改變。那么,我該怎么辦?
Answer:要寫一封郵件!!告訴別人你是誰。
*********************************************************
你的老板犯了錯誤,可是你不能將錯就錯!你的老板忽視了“名”的問題(形式問題),你一定要扳回來!!
試想,你的老板不重視,你也不重視,你能指望別人重視嗎??
當然,答案就是別人會更不重視!!
那么,這封郵件該怎么寫呢??
**************************************************
MailTo: 所有下屬
CC: 所有相關(guān)領(lǐng)導(dǎo),所有相關(guān)人員,自己
Title: 【A項目】A項目的新項目經(jīng)理小張向大家問好
Content:
1 開門見山地告訴別人自己的位置(正名)
2 向相關(guān)人員致敬,并自然地點出自己的優(yōu)勢(自我介紹)
3 向領(lǐng)導(dǎo)致敬致謝(拉近和領(lǐng)導(dǎo)關(guān)系)
4 暗示自己的權(quán)利范圍(宣布自己的領(lǐng)地)
5 喊兩句口號(合作和積極的姿態(tài)是必要的)
6 不要忘了簽名(進一步加深印象)
//其中,1、2、4是必須要表現(xiàn)出來的
**************************************************
上面這封郵件,基本上完成了告訴別人你是誰的問題,而且完成了你的位置身份暗示。
如果說老板不負責任的任命形式帶給你身份位置認同危機,沉重打擊了你的威信的話,
通過這份郵件,你已經(jīng)用身份暗示這個武器,奪回了主動權(quán)!!
從這封信以后,由于你的身份位置的明確,
相關(guān)人員在潛意識中會認同你的領(lǐng)地所有權(quán),
會對在你的領(lǐng)地上和你發(fā)生沖突產(chǎn)生不自然,不合法甚至負罪感,
從而下意識中就會避免和你發(fā)生沖突。
反過來講,你的位置身份的明確,將成為你自信的源泉,
而這種位置感產(chǎn)生的自信將使你的發(fā)言充滿了正義感,
加上項目經(jīng)理這個位置所帶來的小小的勢能。。。
權(quán)力這個東西,真好!!
嗯,一個好的開端,不是嗎?
posted @ 2010-09-08 17:02 小強摩羯座 閱讀(220) | 評論 (0) | 編輯 收藏
1、函數(shù)定義和使用
<script>
function sqrt(x) {
return x * x;
}
function other(f) {
var y = f(10);
return y;
}
var farr = new Array();
farr[0] = function(arg) { return arg + arg;};
farr[1] = function(arg) { return arg * arg;};
document.write(farr[0](10) + '<br/>');
document.write(farr[1](10));
document.write(other(sqrt));
</script>
sqrt.count = 0;
sqrt.getcount = function() {
return this.count;
}; // 附加函式
//sqrt();
document.write(sqrt.count, '<br/>');
document.write(sqrt.getcount());
posted @ 2010-07-25 15:38 小強摩羯座 閱讀(197) | 評論 (0) | 編輯 收藏
杜拉拉升級記:
關(guān)鍵一點,你的上級要喜歡你。工作中涉及要決策的都要跟上級報告。這是上級的作用。
對于平級的同事是不能用命令,不能要求別人做事的。
事情不能自己承擔下來。
感謝小熊同學借我這本書看
說說我的感受:此書沒有書評中說的那么好,當然也沒有那么壞。大家各取所需就好。與其叫小說,不如說是一種創(chuàng)新形式的職場教材。不要太去在意作者的文筆,而要更多的體會書中各位同學的處事之道。
幾句話總結(jié)一下:
1、勤奮是王道,其他的都屬于EQ范疇了
2、要注意技巧,尤其是溝通技巧,別干了半天,沒人知道你的工作量有多少。
3、掂量自己的能力,做好該做的事,不做不該做的事,比如越級匯報。
4、不要說人壞話,能幫助別人時要幫,關(guān)鍵時刻即使沒有人幫你說話,但也不會有人說你的壞話。不信的話,去看看圣經(jīng)怎么說得吧。
5、要有氣量,做事要圓通。
6、要有自己的風格,風格沒有好壞之分,但是一定要有。
7、告訴我們什么是好工作,這點比較長,見下面的摘抄(感謝“木馬|造化弄人”的貢獻):
“一、關(guān)于什么樣的職位算好職位
1.你得找一家好公司
什么是好公司?
1)產(chǎn)品附加值高,生意好,并且從業(yè)務(wù)線看,具備持續(xù)發(fā)展的能力和前景;
2)有專業(yè)的/聰明能干的/經(jīng)驗豐富的/并且為人現(xiàn)實的管理層,在把握這公司,并且有保護一貫這樣用人的制度的公司;
3)有嚴格的財務(wù)制度,對預(yù)算、費用和利潤等于投入產(chǎn)出有關(guān)的內(nèi)容,敏感并且具有強控制力的公司;
4)崇尚客戶導(dǎo)向/市場導(dǎo)向/結(jié)果導(dǎo)向/執(zhí)行力的公司;
5)有專業(yè)嚴謹全面的流程和制度,并且其執(zhí)行有利于推動業(yè)務(wù)的良性發(fā)展,具有控制性和實操性兼?zhèn)涞奶攸c;
---總結(jié)起來,就是一家具有持續(xù)贏利能力的牛B公司
2.你的找一個好的方向
什么是好的方向?
永遠不要遠離核心業(yè)務(wù)線。你得看明白,在企業(yè)中,哪個環(huán)節(jié)是實現(xiàn)利潤最大化的關(guān)鍵環(huán)節(jié)。有時候是銷售環(huán)節(jié),有時候是市場策劃環(huán)節(jié),有時候是研發(fā)環(huán)節(jié),有時候是生產(chǎn)環(huán)節(jié),視乎你所在行業(yè)而不同。
最重要的環(huán)節(jié),總是 最貴的,最牛的,最得到重視的,也是最有發(fā)展前途的部門。它擁有最多的資源和最大的權(quán)威--你應(yīng)該依附在這樣的核心業(yè)務(wù)線上發(fā)展,至少能避免被邊緣化,而成為關(guān)鍵人才的可能性則更大了。
3.你得跟一個好老板。
好老板的標準很多,關(guān)鍵的是,你要設(shè)法跟上一個在公司處于強勢地位的老板。他強,你才能跟著上。跟了一個弱勢的老板,你的前途就很同意被根著給耽擱了。
二、關(guān)于具備謀取好職位的資格
要具備怎么樣的資格呢?一般情況下,你得是用人部門眼中的優(yōu)秀者。
怎么樣才算優(yōu)秀呢?
1.對上級
1)你要知道與他建立一致性,他覺得重要的事情,你就覺得重要,他認為緊急的事情你也認為緊急,你得和他勁往一處使--通常情況下,你得表現(xiàn)和能力好還是不好,主要是你得直接主管說了算的;
2)你的具備從上級那里獲得支持和資源的能力--別你干的半死,你的老板還對你愛搭不理的,那你就不具備本條件的能力。
2.對下級
1)要能明確有效的設(shè)置正確的工作目標,使其符合SMART原則;
2)要能有效地管理團隊內(nèi)部沖突;
3)要能公平合理地控制分配團隊資源;
4) 要有愿望和能力發(fā)展指導(dǎo)下屬,并恰當授權(quán);
5)恰當?shù)馁潛P鼓勵認可團隊成員;
6)尊重不同想法,分享知識經(jīng)驗和信息,建立信任的氛圍。
3.對內(nèi)、外部客戶
1)愿意提供協(xié)助和增值服務(wù)(不然要你干嘛);
2)善意聆聽并了解需求(搞明白人家需要的到底是啥);
3)可靠的提供產(chǎn)品和服務(wù),及時跟進(千萬注意及時);
4)了解組織架構(gòu)并具影響力。及早地建立并維護關(guān)鍵的關(guān)系,是這樣的關(guān)系有利于你達成業(yè)績(專業(yè)而明智的選擇);
比如你想取得一個內(nèi)部職位,你的搞明白了,誰是關(guān)鍵的做決定的人物,別傻乎乎不小心給這個人留下壞印象。
比如必要去客人那里拿訂單,你找了一個關(guān)鍵的人物A,可是你也別忽略作購買決定環(huán)節(jié)上的另一個人物B,沒準B和A是死敵,本來B會同意給你下訂單的,就因為A同意給你單子,B就是不同意給你單子。
4.對本崗任務(wù)
1)清楚自己的定位和職責--別搞不清楚自己是誰,什么是自己的活,知道什么該報告,什么要自己獨立做決定;
2)結(jié)果導(dǎo)向--設(shè)立高目標,信守承諾,承擔責任,注重質(zhì)量、速度和期限,爭取主動,無需督促;
3)清晰的制定業(yè)務(wù)計劃并有效實施;
4)學習能力--愿意學,堅持學,及時了解行業(yè)趨勢/競爭狀況和技術(shù)更新,并學以致用;
5)承受壓力的能力--嚴峻的工作條件下,能堅忍不拔,想辦法獲取資源、支持和信息,努力以實現(xiàn)甚至超越目標;
6)適應(yīng)的能力--如適應(yīng)多項要求并存,優(yōu)先級變換以及情況不明等工作條件,及時調(diào)整自己的行為和風格來適應(yīng)不同個人及團隊的需要(工作重心會變化,老板會換人,客人也會變,別和他們說“我過去如何如何”,多去了解對方的風格) ”。
posted @ 2010-06-20 23:43 小強摩羯座 閱讀(233) | 評論 (0) | 編輯 收藏
方與圓:
最少期望的去感謝別人。不要抱著目的去感謝別人,甚至事前感謝也好。感謝只需說一次。
發(fā)掘別人不明顯的優(yōu)點加以贊揚。
贊揚行動和品性,而不要擴大到贊揚一個人。贊揚的原因要說明。
和氣生財嗎?喝杯水。
對陌生人要特別要笑。微笑是影響人氣質(zhì)的一個特別重要的東西。
對生活的真誠,快樂的感情最能夠打動人。 男的微笑也很好。
認真的品質(zhì):畫一個月和十年。
組裝的質(zhì)量差?認真的態(tài)度。德國人的認真,指路會指出的很具體的。
只有最認真的人才能做出最好的產(chǎn)品。
自動自發(fā)的精神,一定要發(fā)揮自己的主觀能動性。
當成自己的事來做吧。要主動的來做。
做好產(chǎn)品是人的一種尊嚴。爭強好勝在自己的工作上面。因為這是你的發(fā)揮場地。
只辦總裁班?成本與質(zhì)量觀念不一樣的? 規(guī)模經(jīng)濟?質(zhì)量了的產(chǎn)品成本會降低。
檢查的目的是為了改進生活流程。
管制圖?
困定的供貨商?不是投標。是指定方式做。
永遠追求持續(xù)不斷的完善。
有必要再試一次。
改進自己的產(chǎn)品吧。
也淘汰了自己的競爭者。 一個系列的生產(chǎn)方式是不錯的。
到外去演講,不做化療?活過了三年?
要有自己的追求。活就要活出自己的價值。無論在何時的年齡,都要有自己的追求。
人生不是直線的,是C型的人生。
人生可以隨時開始。
posted @ 2010-06-12 11:17 小強摩羯座 閱讀(291) | 評論 (0) | 編輯 收藏
<設(shè)計模式:java語言中的應(yīng)用>摘要、總結(jié) 收藏
<設(shè)計模式:java語言中的應(yīng)用>一書已經(jīng)學完,現(xiàn)做個摘要、總結(jié)。
創(chuàng)建模式(Creational Patterns)
Abstract Factory Builder
Factory Method Prototype
Singleton
結(jié)構(gòu)模式(Structural Patterns)
Adapter Bridge
Composite Decorator
Facade Flyweight
Proxy
行為模式(Behavioral Pattern)
Chain of Responsibility Command
Interpreter Iterator
Mediator Memento
Observer State
Strategy Template Method
Visitor
一、創(chuàng)建模式(Creational Patterns)
1.Abstract Factory(抽象工廠)—把相關(guān)零件組合成產(chǎn)品
Abstract Factory Pattern 是把各種抽象零件組合成抽象產(chǎn)品。換句話說,處理的重點是在接口(API)而不是零件的具體實現(xiàn)。只利用接口(API)就能把零件組合成產(chǎn)品.
程序示例:
--Main.java 測試用的類
|-factory
| |-------Factory.java 表示抽象工廠的類(產(chǎn)生Link,Tray,Page)
| |-------Itme.java 用來統(tǒng)一處理Link和Tray的類
| |-------Link.java 抽象零件:表示HTML連接的類
| |-------Tray.java 抽象零件:抽取Link和Tray的類
| |-------Page.java 抽象零件:表示HTML網(wǎng)頁的類
|
|-listfactory
|-------listFactory.java 表示具體工廠的類(產(chǎn)生ListLink,ListTray,ListPage)
|-------listLink.java 具體零件:表示HTML連接的類
|-------listTray.java 具體零件:抽取Link和Tray的類
|-------listPage.java 具體零件:表示HTML網(wǎng)頁的類
步驟:定義抽象零件->用抽象零件定義抽象工廠->定義具體零件(繼承實現(xiàn)抽象零件)->定義具體工廠(繼承實現(xiàn)抽象工廠,制造實際產(chǎn)品)
2.Factory Method
Factory Method Pattern 在父類規(guī)定對象的創(chuàng)建方法,但并沒有深入到較具體的類名.所有具體的完整內(nèi)容都放在子類.根據(jù)這個原則,我們可以大致分成產(chǎn)生對象實例的大綱(框架)和實際產(chǎn)生對象實例的類兩方面.
程序示例:
--Main.java 測試用的類
|-framework
| |-------Product.java 僅定義抽象方法use的抽象類
| |-------Factory.java 規(guī)定createProduct,registerProduct,實現(xiàn)create的抽象類(類似模板方法)
|
|-idcard
|-------IDCard.java 實現(xiàn)方法use的具體類
|-------IDCardFactory.java 實現(xiàn)方法createProduct,registerProduct的類
步驟:定義抽象產(chǎn)品->根據(jù)抽象產(chǎn)品定義抽象工廠->定義具體產(chǎn)品(繼承實現(xiàn)抽象產(chǎn)品)->定義具體工廠(繼承實現(xiàn)抽象工廠,制造實際產(chǎn)品)
3.Singleton(單件)-唯一的對象實例
Singleton Pattern 是針對一個類而言. Singleton類只會產(chǎn)生1個對象實例.Singleton類把singleton定義為static字段(類變量),再以Singleton類的對象實例進行初始化.這個初始化的操作僅在加載Singleton類時進行一次.
Singleton類的構(gòu)造函數(shù)是private的,主要是為了禁止從非Singleton類調(diào)用構(gòu)造函數(shù).即使下面這個表達式不在此類之內(nèi),編譯時仍然會出現(xiàn)錯誤.
程序示例:
|--Main.java 測試用的類
|--Singleton.java 只有1個對象實例的類
步驟:定義一個該類類型的static字段,同時實例化->該類的構(gòu)造方法設(shè)為private->定義一個static的getInstance()方法,返回已經(jīng)實例化的static字段.
4.Builder(生成器)-組合復(fù)雜的對象實例
Builder Pattern 是采用循序漸進的方式組合較復(fù)雜對象實例的.
程序示例:
|--Main.java 測試用的類
|--Builder.java 規(guī)定建立文件時的方法的抽象類
|--Director.java 產(chǎn)生1個文件的類
|--TextBuilder.java 產(chǎn)生plaintext格式(一般文本格式)的類
|--HTMLBuilder.java 產(chǎn)生HTML格式的類
步驟:定義建立文件時的通用方法(Builder.java)->根據(jù)通用方法組織建立文件(Director.java)->根據(jù)不同需求實現(xiàn)建立文件的通用方法(TextBuilder.java,HTMLBuilder.java)
5.Prototype(原型)-復(fù)制建立對象
Prototype Pattern 不是利用類產(chǎn)生對象實例,而是從一個對象實例產(chǎn)生出另一個新對象實例.
程序示例:
|--Main.java 測試用的類
|--MessageBox.java 把字符串框起來use的類.實現(xiàn)use和createClone
|--UnderlinePen.java 把字符串加上下劃線的類.實現(xiàn)use和createCone
|--framework
|-------Product.java 已聲明抽象方法use和createClone的接口
|-------Manager.java 利用createClone復(fù)制對象實例的類
步驟:規(guī)定可復(fù)制產(chǎn)品的接口(Product.java,繼承Cloneable接口)->保存可復(fù)制的產(chǎn)品(以Product類型存以哈西表中),并提供復(fù)制產(chǎn)品的方法create(調(diào)用產(chǎn)品的復(fù)制方法,復(fù)制工作在具體產(chǎn)品類中執(zhí)行)(Manager.java)->定義可復(fù)制的具體產(chǎn)品(UnderlinePen.java,MessageBox.java,實現(xiàn)復(fù)制產(chǎn)品方法)
二、結(jié)構(gòu)模式(Structural Patterns)
1.Adapter(適配器)-換個包裝再度利用
Adapter Pattern 把既有的無法直接利用的內(nèi)容轉(zhuǎn)換成必要的類型后再使用.具有填平"既有內(nèi)容"和"需要結(jié)果"兩者間"落差"的功能.
Adapter Pattern 有繼承和委托兩種形式.
程序示例:
|--Main.java 測試用的類
|--Banner.java 具有原始功能showWithParen,showWithAster的類
|--Print.java 所需新功能printWeak,printStrong的接口或抽象類
|--PrintBanner.java 把原始功能轉(zhuǎn)換成新功能的類
步驟:
(繼承)構(gòu)造具有原始功能的類(Banner.java)->定義具有新功能的接口(Print.java)->轉(zhuǎn)換(PrintBanner.java,繼承Banner實現(xiàn)Print接口,即繼承舊方法實現(xiàn)新功能)
(委托)構(gòu)造具有原始功能的類(Banner.java)->定義具有新功能的抽象類(Print.java)->轉(zhuǎn)換(PrintBanner.java,繼承具有新功能的Print類.定義委托對象,即原始功能類.構(gòu)造時傳入原始功能實例對象,新功能的實現(xiàn)利用委托對象的原始功能.)
2.Bridge(橋接)-分成功能層次和實現(xiàn)層次
Bridge Pattern 溝通著"功能的類層次"和"實現(xiàn)的類層次"
功能的類層次:給父類增加不同的功能
實現(xiàn)的類層次:給父類以不同的實現(xiàn)
Bridge Pattern 本質(zhì)上是通過功能類(最上層的功能類)中的一個實現(xiàn)類(最上層的實現(xiàn)類,一般是抽象類)字段來橋接兩個類層次的.
程序示例:
|--Main.java 測試用的類
|--Display.java 功能類層次的最上層類
|--CountDisplay.java 功能類層次的新增功能類
|--DisplayImpl.java 實現(xiàn)類層次的最上層類
|--StringDisplayImpl.java 實現(xiàn)類層次的實現(xiàn)類
步驟:定義實現(xiàn)類層次的最上層類(DisplayImpl.java)->定義功能類層次的最上層類(Display.java,使用Adapter Pattern的委托方式把DisplayImpl.java的原始功能轉(zhuǎn)換成Display.java的新功能)->定義功能類層次的新增功能類(CountDisplay.java)->定義實現(xiàn)類層次的實現(xiàn)類(StringDisplayImpl.java)
3.Composite(組成)-對容器和內(nèi)容一視同仁
有時候把容器和內(nèi)容當作是同類來處理會比較好下手。容器里面可以是內(nèi)容,也可以是更小一號的容器;而這個小一號的容器里還可以再放更小一號的容器,可以建立出像這樣大套小的結(jié)構(gòu)和遞歸結(jié)構(gòu)的Pattern就是Composite Pattern
使用Composite Pattern,容器和內(nèi)容必須有一定的共性.
程序示例:
|--Main.java 測試用的類
|--File.java 表示文件的類
|--Directory.java 表示目錄的類
|--Entry.java 對File和Directory一視同仁的抽象類
|--FileTreatmentException.java 欲在文件內(nèi)新增Entry時所發(fā)生的異常類
步驟:定義異常類(FileTreatmentException.java)->定義進入點類,即將容器和內(nèi)容一視同仁的抽象類(Entry.java,容器和內(nèi)容都含有共同的方法)->定義容器類和內(nèi)容類(File.java,Directory.java,繼承Entry,實現(xiàn)通用方法)
4.Decorator(裝飾)-對裝飾和內(nèi)容一視同仁
先建立一個核心對象,再一層層加上裝飾用的功能,就可以完成符合所需的對象.可以看成是多個通用的適配器.
程序示例:
|--Main.java 測試用的類
|--Display.java 打印字符串用的抽象類
|--StringDisplay.java 只有1行的打印字符串用的類
|--Border.java 表示"裝飾外框"的抽象類
|--SideBorder.java 只在左右加上裝飾外框的類
|--FullBorder.java 在上下左右加上裝飾外框的類
步驟:定義核心對象的抽象類(Display.java)->定義核心對象類(StringDisplay.java)->定義裝飾類的抽象類(Border.java,繼承核心對象的抽象類Display.java,以便裝飾和內(nèi)容一視同仁.裝飾類中繼承自核心對象抽象類的方法委托給傳入的核心對象)->定義其它裝飾類(SideBorder.java,FullBorder.java,繼承Border.java)
5.Facade(外觀)-單一窗口
Facade Pattern 能整理錯綜復(fù)雜的來龍去脈,提供較高級的接口(API).Facade參與者讓系統(tǒng)外部看到較簡單的接口(API).而且Facade參與者還會兼顧系統(tǒng)內(nèi)部各類功能和互動關(guān)系,以最正確的順序利用類.
Facade Pattern 把業(yè)務(wù)邏輯封裝起來,只提供一個簡單的接口給外部調(diào)用.
程序示例:
|--Main.java 測試用的類
|--maildata.txt 郵件列表文件
|--pagemaker
|-------Database.java 從郵件信箱取得用戶名稱的類
|-------HtmlWriter.java 產(chǎn)生HTML文件的類
|-------PageMaker.java 根據(jù)郵件信箱產(chǎn)生用戶網(wǎng)頁的類
步驟:定義業(yè)務(wù)邏輯需要的相關(guān)類(Database.java,HtmlWriter.java)->定義外部接口類(PageMaker.java)
6.Flyweight(享元)-有相同的部分就共享,采用精簡政策
"盡量共享對象實例,不做無謂的new".不是一需要對象實例就馬上new,如果可以利用其他現(xiàn)有的對象實例,就讓它們共享.這就是Flyweigth Pattern的核心概念.
Flyweight Pattern 實質(zhì)是把創(chuàng)建的占用內(nèi)存量大的對象存儲起來(一般用hashtable存儲),后續(xù)使用時,再從hashtable取出.
程序示例:
|--Main.java 測試用的類
|--BigChar.java 表示"大型字符"的類
|--BigCharFactory.java 共享并產(chǎn)生BigChar的對象實例的類
|--BigString.java 表示多個BigChar所產(chǎn)生的"大型文本"的類
步驟:定義占用內(nèi)存量大,需要共享的類(Display.java)->定義共享實例的類(BigCharFactory.java,共享處理在此進行,將產(chǎn)生的共享對象存儲在哈希表中,第二次使用時從表中取出即可,不需要new)->定義共享對象組合使用類(BigString.java)
7.Proxy(代理)-需要再建立
代理就是那個代替本來應(yīng)該自己動手做事的本人的人.
由于代理純粹只是代理工作而已,因此能力范圍也有限.如果遇到超出代理能力所及的范圍,代理就應(yīng)該去找本人商量才對.
程序示例:
|--Main.java 測試用的類
|--Printer.java 表示命名的打印機的類(本人)
|--Printable.java Printer和PrinterProxy共享的接口
|--PrinterProxy.java 表示命名的打印機的類(代理)
步驟:定義本人和代理都能處理的問題的接口(Printable.java)->建立本人類(Printer.java,實現(xiàn)Printable.java接口)->建立代理類(PrinterProxy.java,定義本人字段,把代理無法處理的問題交給本人)
三、行為模式(Behavioral Pattern)
1.Chain of Responsibility(職責鏈)-責任轉(zhuǎn)送
先對人產(chǎn)生一個要求,如果這個人有處理的能力就處理掉;如果不能處理的話,就把要求轉(zhuǎn)送給"第二個人".同樣的,如果第二個人有處理的能力時就處理掉,不能處理的話,就繼續(xù)轉(zhuǎn)送給"第三個人",依此類推.這就是Chain of Responsiblility Pattern.
Chain of Responsibility Pattern 的關(guān)鍵在于定義轉(zhuǎn)送字段(next)和定義職責鏈.
程序示例:
|--Main.java 建立Support的連鎖,產(chǎn)生問題的測試用類
|--Trouble.java 表示發(fā)生問題的類.內(nèi)有問題編號.
|--Support.java 解決問題的抽象類.內(nèi)有轉(zhuǎn)送字段和處理方法.
|--NoSupport.java 解決問題的具體類(永遠"不處理")
|--LimitSupport.java 解決問題的具體類(解決小于指定號碼的問題)
|--OddSupport.java 解決問題的具體類(解決奇數(shù)號碼的問題)
|--SpecialSupport.java 解決問題的具體類(解決特殊號碼的問題)
步驟:建立問題類(Trouble.java)->建立解決問題的抽象類(Support.java,定義了轉(zhuǎn)送字段next,設(shè)置轉(zhuǎn)送字段的方法setNext和處理問題的方法support)->建立解決問題的具體類(NoSupport.java,LimitSupport.java,OddSupport.java,SpecialSupport.java,繼承Support.java)->產(chǎn)生處理問題的對象,建立職責鏈
2.Command(命令)-將命令寫成類
用一個"表示命令的類的對象實例"來代表欲執(zhí)行的操作,而不需采用"調(diào)用方法"的類的動態(tài)處理.如欲管理相關(guān)紀錄,只需管理該對象實例的集合即可.而若預(yù)先將命令的集合存儲起來,還可再執(zhí)行同一命令;或者是把多個命令結(jié)合成一個新命令供再利用.
Command Pattern 重點在于存儲/使用命令
程序示例:
--Main.java 測試用的類
|-command
| |-------Command.java 表示"命令"的接口
| |-------MacroCommand.java 表示"結(jié)合多個命名的命令"的類
|
|-drawer
|-------DrawCommand.java 表示"點的繪制命令"的類
|-------Drawable.java 表示"繪制對象"的接口
|-------DrawCanvas.java 表示"繪制對象"的類
步驟:建立命令接口(Command.java)->建立命令結(jié)合類(MacroCommand.java,將各個命令存儲到一個Stack類型的字段)->建立繪制命令類(DrawCommand.java,定義繪制對象字段drawable,實現(xiàn)命令接口)->建立繪制對象接口(Drawable.java)->建立繪制對象類(DrawCanvas.java,實現(xiàn)繪制對象接口,定義命令集合字段history)->測試
3.Interpreter(解釋器)-以類來表達語法規(guī)則
Interpreter Pattern 是用簡單的"迷你語言"來表現(xiàn)程序要解決的問題,以迷你語言寫成"迷你程序"而表現(xiàn)具體的問題.迷你程序本身無法獨自啟動,必須先用java語言另外寫一個負責"解釋(interpreter)"的程序.解釋程序能分析迷你語言,并解釋\執(zhí)行迷你程序.這個解釋程序也稱為解釋器.當應(yīng)解決的問題發(fā)生變化時,要修改迷你程序來對應(yīng)處理.而不是修改用java語言寫成的程序.
迷你語言語法:
<program>::=program<command list>
<command list>::=<command>* end
<command>::=<repeat command>|<primitive command>
<repeat command>::=repeat<number><command list>
<primitive command>::=go|right|left
程序示例:
|--Main.java 測試用的類
|--Node.java 樹狀剖析中"節(jié)點"的類
|--ProgramNode.java 對應(yīng)<program>的類
|--CommandListNode.java 對應(yīng)<command list>的類
|--CommandNode.java 對應(yīng)<command>的類
|--RepeatCommandNode.java 對應(yīng)<repeat command>的類
|--PrimitiveCommandNode.java 對應(yīng)<primitive command>的類
|--Context.java 表示語法解析之前后關(guān)系的類
|--ParseException.java 語法解析中的例外類
步驟:確定迷你語言的語法->建立語法解析類(Context.java,使用java.util.StringTokenizer類)->建立解析異常類(ParseException.java)->建立語法節(jié)點抽象類(Node.java,定義parse解析方法)->建立各語法節(jié)點對應(yīng)的語法類(ProgramNode.java,CommandListNode.java,CommandNode.java,RepeatCommandNode.java,PrimitiveCommand.java,繼承語法節(jié)點Node.java類)
4.Iterator-迭代器
Iterator Pattern 是指依序遍歷并處理多個數(shù)字或變量.
程序示例:
|--Main.java 測試用的類
|--Aggregate.java 表示已聚合的類
|--Iterator.java 執(zhí)行遞增\遍歷的接口
|--Book.java 表示書籍的類
|--BookShelf.java 表示書架的類
|--BookShelfIterator.java 掃描書架的類
步驟:定義聚合接口(Aggregate.java)->定義遍歷接口(Iterator.java)->建立具體的遍歷對象類(Book.java)->建立具體的聚合類(BookShelf.java,實現(xiàn)聚合接口)->建立具體的遍歷類(BookShelfIterator.java,實現(xiàn)遍歷接口)
5.Mediator(中介者)-只要面對一個顧問
每個成員都只對顧問提出報告,也只有顧問會發(fā)出指示給各個成員;成員們彼此也不會去探問目前狀況如何,或亂發(fā)指示給其他成員.
程序示例:
|--Main.java 測試用的類
|--Mediator.java 決定"顧問"接口(API)的接口
|--Colleague.java 決定"成員"接口(API)的接口
|--ColleagueButton.java 實現(xiàn)Colleagues接口.表示按鍵的類
|--ColleagueTextField.java 實現(xiàn)Colleagues接口.輸入文本的類
|--ColleagueCheckbox.java 實現(xiàn)Colleagues接口.表示選擇項目(在此為選擇按鈕)的類
|--LoginFrame.java 實現(xiàn)Mediator接口.表示登錄對話框的類
步驟:定義顧問接口(Mediator.java)->定義成員接口(Colleague.java)->建立具體的成員類(ColleagueButton.java,ColleagueTextField.java,ColleagueCheckbox.java,實現(xiàn)成員接口)->建立具體的顧問類(LoginFrame.java,實現(xiàn)顧問接口)
6.Memento(備忘錄)-存儲狀態(tài)
Memento Pattern 會把某個時間點的對象實例狀態(tài)記錄存儲起來,等到以后再讓對象實例復(fù)原到當時的狀態(tài).
程序示例:
|--Main.java 進行游戲的類.先把Memento的對象實例存儲起來,如有必要時再復(fù)原Gamer的狀態(tài)
|--game
|-------Gamer.java 玩游戲的主人翁的類
|-------Memento.java 表示Gamer狀態(tài)的類.產(chǎn)生Memento的對象實例
步驟:建立需要存儲狀態(tài)的類(Gamer.java)->建立狀態(tài)類(Memento.java,狀態(tài)類與需要存儲狀態(tài)的類Gamer.java應(yīng)具有相同的必要字段)
7.Observer(觀察者)-通知狀態(tài)變化
當被Observer Pattern 列入觀察名單的狀態(tài)發(fā)生變化,就會通知觀察者.在寫一些跟狀態(tài)變化有關(guān)的處理時,Observer Pattern是很好用的工具.
程序示例:
|--Main.java 測試用的類
|--Observer.java 表示觀察者的接口
|--NumberGenerator.java 表示產(chǎn)生數(shù)值對象的抽象類
|--RandomNumberGenerator.java 產(chǎn)生隨機數(shù)的類
|--DigitObserver.java 以數(shù)字表示數(shù)值的類
|--GraphObserver.java 以簡易長條圖表示數(shù)值的類
步驟:定義觀察者接口(Observer.java)->建立被觀察的類(NumberGenerator.java,RandomNumberGenerator.java,定義觀察者結(jié)合字段將觀察者存儲起來)->建立具體的觀察者類(DigitObserver.java,GraphObserver.java,實現(xiàn)觀察者接口)
8.State(狀態(tài))-以類表示狀態(tài)
以類來表示狀態(tài)之后,只要切換類就能表現(xiàn)“狀態(tài)變化”,而且在必須新增其他狀態(tài)時,也很清楚該編寫哪個部分。
程序示例:
|--Main.java 測試用的類
|--State.java 表示金庫狀態(tài)的接口
|--DayState.java 實現(xiàn)State的類。表示白天的狀態(tài)
|--NightState.java 實現(xiàn)State的類。表示夜間的狀態(tài)
|--Context.java 管理金庫的狀態(tài)變化,跟保安中心聯(lián)絡(luò)的接口
|--SafeFrame.java 實現(xiàn)Context的類。含有按鈕、畫面顯示等的用戶接口
步驟:定義狀態(tài)接口(State.java,將使用State Pattern之前各種行為方法抽象出來)->建立具體的狀態(tài)類(DayState.java,NightState.java,實現(xiàn)狀態(tài)接口,狀態(tài)變化的具體動作在這里執(zhí)行)->定義管理狀態(tài)變化的接口(Context.java,規(guī)定狀態(tài)變化及相關(guān)的調(diào)用方法)->建立狀態(tài)管理類(SafeFrame.java,實現(xiàn)狀態(tài)管理接口)
9.Strategy(策略)-把算法整個換掉
在Strategy Pattern之下,可以更換實現(xiàn)算法的部分而且不留痕跡。切換整個算法,簡化改為采用其他方法來解決同樣的問題。
程序示例:
|--Main.java 測試用的類
|--Hand.java 表示猜拳“手勢”的類
|--Strategy.java 表示猜拳“戰(zhàn)略”的接口
|--WinningStrategy.java 表示猜贏之后繼續(xù)出同樣招式的戰(zhàn)略的類
|--ProbStrategy.java 表示從上一次出的招式,以概率分配方式求出下一個招式機率的類
|--Player.java 表示玩猜拳的游戲者的類
步驟:定義策略接口(Strategy.java)->建立具體的策略類(WinningStrategy.java,ProbStrategy.java,實現(xiàn)策略接口)->建立使用策略的類(Player.java,定義策略字段,以便使用切換策略)->建立其它類(Main.java,Hand.java)
10.Template Method(模板方法)-實際處理交給子類
在父類指定處理大綱、在子類規(guī)定具體內(nèi)容的Design Pattern就稱為Template Method Pattern
程序示例:
|--Main.java 測試用的類
|--AbstractDisplay.java 只實現(xiàn)方法display的抽象類
|--CharDisplay.java 實現(xiàn)方法open,print,close的類
|--StringDisplay.java 實現(xiàn)方法open,print,close的類
步驟:定義模板類(AbstractDisplay.java,實現(xiàn)dispaly方法,即制作了模板)->建立具體內(nèi)容類(CharDisplay.java,StringDisplay.java,繼承模板類,實現(xiàn)模板類沒有實現(xiàn)的方法)
11.Visitor(訪問者)-在結(jié)構(gòu)中穿梭還同時做事
Visitor Pattern 把數(shù)據(jù)結(jié)構(gòu)和處理兩者分開,另外寫一個表示在數(shù)據(jù)結(jié)構(gòu)內(nèi)穿梭來去的主體“訪客”的類,然后把處理交給這個類來進行。如此一來,如果想追加新的處理行為時,只要再建立一個新的“訪客”即可。而在數(shù)據(jù)結(jié)構(gòu)這邊,也只要能接受來敲門的“訪客”就能完成動作。
在父類指定處理大綱、在子類規(guī)定具體內(nèi)容的Design Pattern就稱為Template Method Pattern
程序示例:
|--Main.java 測試用的類
|--Visitor.java 表示訪問文件或目錄的訪客的抽象類
|--Acceptor.java 表示接受Visitor類的對象實例的數(shù)據(jù)結(jié)構(gòu)的接口
|--ListVisitor.java Visitor類的子類,打印文件和目錄信息的類
|--Entry.java File和Directory的父類的抽象類(實現(xiàn)Acceptor接口)
|--File.java 表示文件的類
|--Directory.java 表示目錄的類
|--FileTreatmentException.java 發(fā)生在對File進行add時的例外類
步驟:定義訪問者的抽象類(Visitor.java,定義訪問方法)->定義受訪者接口(Acceptor.java,定義接受訪問的方法)->建立具體的訪問者類(ListVisitor.java,繼承訪問者抽象類,實現(xiàn)訪問方法)->建立具體的受訪者類(Entry.java,File.java,Directory.java,實現(xiàn)受訪者接口)->編寫異常類(FileTreatmentException.java)
本文來自CSDN博客,轉(zhuǎn)載請標明出處:http://blog.csdn.net/pian_yun/archive/2007/09/14/1784981.aspx
posted @ 2010-05-28 16:24 小強摩羯座 閱讀(367) | 評論 (0) | 編輯 收藏
<xml id="cdcat" src="cd_catalog.xml"></xml>
<table border="1" datasrc="#cdcat">
<tr>
<td><span datafld="ARTIST"></span></td>
<td><span datafld="TITLE"></span></td>
<td datafld="price"> </td>
<td><span datafld="year"></span></td>
</tr>
</table>
注意可以引入xml字段的元素有 限:
例如,與DIV元素綁定的代碼如下:
d: U) f1 y
注意:并非所有的HTML元素都能與XML數(shù)據(jù)島綁定。目前,支持這種DSO綁定機制的元素如下:. H2 V- _% j! E/ {4 i
$ \( \$ l" b+ H( M& Y
A、APPLET、BUTTON、DIV、FRAME、IFRAME、 IMG、INPUT (此處類型是:CHECKBOX、HIDDEN、 LABEL、PASSWORD、RADIO和TEXT)、LABEL、 MARQUEE、SELECT、SPAN、TABLE和 TEXTAREA。
posted @ 2010-05-27 10:24 小強摩羯座 閱讀(549) | 評論 (0) | 編輯 收藏
H.264中的NAL技術(shù)
NAL技術(shù)
1.NAL概述
NAL全稱Network Abstract Layer, 即網(wǎng)絡(luò)抽象層。
在H.264/AVC視頻編碼標準中,整個系統(tǒng)框架被分為了兩個層面:視頻編碼層面(VCL)和網(wǎng)絡(luò)抽象層面(NAL)。其中,前者負責有效表示視頻數(shù)據(jù)的內(nèi)容,而后者則負責格式化數(shù)據(jù)并提供頭信息,以保證數(shù)據(jù)適合各種信道和存儲介質(zhì)上的傳輸。
現(xiàn)實中的傳輸系統(tǒng)是多樣化的,其可靠性,服務(wù)質(zhì)量,封裝方式等特征各不相同,NAL這一概念的提出提供了一個視頻編碼器和傳輸系統(tǒng)的友好接口,使得編碼后的視頻數(shù)據(jù)能夠有效地在各種不同的網(wǎng)絡(luò)環(huán)境中傳輸。
2.NAL單元
NAL單元是NAL的基本語法結(jié)構(gòu),它包含一個字節(jié)的頭信息和一系列來自VCL的稱為原始字節(jié)序列載荷(RBSP)的字節(jié)流。頭信息中包含著一個可否丟棄的指示標記,標識著該NAL單元的丟棄能否引起錯誤擴散,一般,如果NAL單元中的信息不用于構(gòu)建參考圖像,則認為可以將其丟棄;最后包含的是NAL單元的類型信息,暗示著其內(nèi)含有效載荷的內(nèi)容。
送到解碼器端的NAL單元必須遵守嚴格的順序,如果應(yīng)用程序接收到的NAL單元處于亂序,則必須提供一種恢復(fù)其正確順序的方法。
3.NAL實現(xiàn)編解碼器與傳輸網(wǎng)絡(luò)的結(jié)合
NAL提供了一個編解碼器與傳輸網(wǎng)絡(luò)的通用接口,而對于不同的網(wǎng)絡(luò)環(huán)境,具體的實現(xiàn)方案是不同的。對于基于流的傳輸系統(tǒng)如H.320、MPEG等,需要按照解碼順序組織NAL單元,并為每個NAL單元增加若干比特字節(jié)對齊的前綴以形成字節(jié)流;對于RTP/UDP/IP系統(tǒng),則可以直接將編碼器輸出的NAL單元作為RTP的有效載荷;而對于同時提供多個邏輯信道的傳輸系統(tǒng),我們甚至可以根據(jù)重要性將不同類型的NAL單元在不同服務(wù)質(zhì)量的信道中傳輸[2]。
4.結(jié)論
為了實現(xiàn)編解碼器良好的網(wǎng)絡(luò)適應(yīng)性,需要做兩方面的工作:第一、在Codec中將NAL這一技術(shù)完整而有效的實現(xiàn);第二、在遵循H.264/AVC NAL規(guī)范的前提下設(shè)計針對不同網(wǎng)絡(luò)的最佳傳輸方案。如果實現(xiàn)了以上兩個目標,所實現(xiàn)的就不僅僅是一種視頻編解碼技術(shù),而是一套適用范圍很廣的多媒體傳輸方案,該方案適用于如視頻會議,數(shù)據(jù)存儲,電視廣播,流媒體,無線通信,遠程監(jiān)控等多種領(lǐng)域。
NALU類型
標識NAL單元中的RBSP數(shù)據(jù)類型,其中,nal_unit_type為1, 2, 3, 4, 5及12的NAL單元稱為VCL的NAL單元,其他類型的NAL單元為非VCL的NAL單元。
0:未規(guī)定
1:非IDR圖像中不采用數(shù)據(jù)劃分的片段
2:非IDR圖像中A類數(shù)據(jù)劃分片段
3:非IDR圖像中B類數(shù)據(jù)劃分片段
4:非IDR圖像中C類數(shù)據(jù)劃分片段
5:IDR圖像的片段
6:補充增強信息 (SEI)
7:序列參數(shù)集
8:圖像參數(shù)集
9:分割符
10:序列結(jié)束符
11:流結(jié)束符
12:填充數(shù)據(jù)
13 – 23:保留
24 – 31:未規(guī)定
NALU的順序要求
H.264/AVC標準對送到解碼器的NAL單元順序是有嚴格要求的,如果NAL單元的順序是混亂的,必須將其重新依照規(guī)范組織后送入解碼器,否則解碼器不能夠正確解碼。
1.序列參數(shù)集NAL單元必須在傳送所有以此參數(shù)集為參考的其他NAL單元之前傳送,不過允許這些NAL單元中間出現(xiàn)重復(fù)的序列參數(shù)集NAL單元。所謂重復(fù)的詳細解釋為:序列參數(shù)集NAL單元都有其專門的標識,如果兩個序列參數(shù)集NAL單元的標識相同,就可以認為后一個只不過是前一個的拷貝,而非新的序列參數(shù)集。
2.圖像參數(shù)集NAL單元必須在所有以此參數(shù)集為參考的其他NAL單元之先,不過允許這些NAL單元中間出現(xiàn)重復(fù)的圖像參數(shù)集NAL單元,這一點與上述的序列參數(shù)集NAL單元是相同的。
3.不同基本編碼圖像中的片段(slice)單元和數(shù)據(jù)劃分片段(data partition)單元在順序上不可以相互交叉,即不允許屬于某一基本編碼圖像的一系列片段(slice)單元和數(shù)據(jù)劃分片段(data partition)單元中忽然出現(xiàn)另一個基本編碼圖像的片段(slice)單元片段和數(shù)據(jù)劃分片段(data partition)單元。
4.參考圖像的影響:如果一幅圖像以另一幅圖像為參考,則屬于前者的所有片段(slice)單元和數(shù)據(jù)劃分片段(data partition)單元必須在屬于后者的片段和數(shù)據(jù)劃分片段之后,無論是基本編碼圖像還是冗余編碼圖像都必須遵守這個規(guī)則
5.基本編碼圖像的所有片段(slice)單元和數(shù)據(jù)劃分片段(data partition)單元必須在屬于相應(yīng)冗余編碼圖像的片段(slice)單元和數(shù)據(jù)劃分片段(data partition)單元之前。
6.如果數(shù)據(jù)流中出現(xiàn)了連續(xù)的無參考基本編碼圖像,則圖像序號小的在前面。
7.如果arbitrary_slice_order_allowed_flag置為1,一個基本編碼圖像中的片段(slice)單元和數(shù)據(jù)劃分片段(data partition)單元的順序是任意的,如果arbitrary_slice_order_allowed_flag置為零,則要按照片段中第一個宏塊的位置來確定片段的順序,若使用數(shù)據(jù)劃分,則A類數(shù)據(jù)劃分片段在B類數(shù)據(jù)劃分片段之前,B類數(shù)據(jù)劃分片段在C類數(shù)據(jù)劃分片段之前,而且對應(yīng)不同片段的數(shù)據(jù)劃分片段不能相互交叉,也不能與沒有數(shù)據(jù)劃分的片段相互交叉。
8.如果存在SEI(補充增強信息) 單元的話,它必須在它所對應(yīng)的基本編碼圖像的片段(slice)單元和數(shù)據(jù)劃分片段(data partition)單元之前,并同時必須緊接在上一個基本編碼圖像的所有片段(slice)單元和數(shù)據(jù)劃分片段(data partition)單元后邊。假如SEI屬于多個基本編碼圖像,其順序僅以第一個基本編碼圖像為參照。
9.如果存在圖像分割符的話,它必須在所有SEI 單元、基本編碼圖像的所有片段slice)單元和數(shù)據(jù)劃分片段(data partition)單元之前,并且緊接著上一個基本編碼圖像那些NAL單元。
10.如果存在序列結(jié)束符,且序列結(jié)束符后還有圖像,則該圖像必須是IDR(即時解碼器刷新)圖像。序列結(jié)束符的位置應(yīng)當在屬于這個IDR圖像的分割符、SEI 單元等數(shù)據(jù)之前,且緊接著前面那些圖像的NAL單元。如果序列結(jié)束符后沒有圖像了,那么它的就在比特流中所有圖像數(shù)據(jù)之后。
11.流結(jié)束符在比特流中的最后。
本文來自CSDN博客,轉(zhuǎn)載請標明出處:file:///D:/新建文件夾/桌面/H_264中的NAL技術(shù)%20-%20Bolt%20的專欄%20-%20CSDN博客.htm
posted @ 2010-05-06 17:58 小強摩羯座 閱讀(331) | 評論 (0) | 編輯 收藏
1、分析關(guān)鍵,在以zigzag序的每一行,以上三角為計算對象分別以i或j的增序排列,因此利用這一點就可以得出結(jié)果。
程序中s即為zigzag行號,而變換則以i和j交替。所以程序很簡單。
#include<iostream>
#include<iomanip>
using namespace std;
#define M 255
void zigzag(const int N)
{
int squa = N * N;
int a[M][M]={0};
for (int i = 0;i < N; i++)
{
for (int j = 0;j < N;j++)
{
int s = i + j;
if ( s < N)
{
a[i][j] = s * (s+1)/2 + ( (s %2 !=0)?i:j);//注意?:的優(yōu)先級低于+
}
else
{
int sn = (N-1-i) + (N-1-j);
a[i][j] = squa - sn * (sn+1)/2 - (N - ( (sn%2 != 0)? i:j));
}
}
}
for (int i=0; i < N; i++)
{
for (int j = 0;j < N;j++)
{
cout<<setw(4)<<a[i][j]<<",";
}
cout<<endl<<endl;
}
}
int main()
{
zigzag(5);
cout<<endl;
zigzag(8);
cout<<endl;
return 0;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void zigzag(int n)
{
int **a =(int**) malloc(n*sizeof(int *)); //分配空間
if(NULL == a)
return ;
int i;
for(i = 0; i < n; i++) {
if((a[i] =(int*) malloc(n * sizeof(int))) == NULL) {
while(--i>=0)
free(a[i]);
free(a);
return;
}
}
bool flag = false; //這個標志位用來判斷是從45度角生成還是225度角生成
int count = 0;
for(i=0; i<n; i++) //生成的上半部分的數(shù)據(jù)
{
if(flag)
{
for(int r = 0; r<=i; r++)
{
a[r][i-r] = count;
count++;
}
flag = false;
}
else
{
for(int r = i; r>=0; r--)
{
a[r][i-r] = count;
count++;
}
flag = true;
}
}
for(i=n-1; i>=0; i--) //生成的是下半部分的數(shù)據(jù)
{
// cout<<i<<endl;
if(flag)
{
for(int r = 0; r<=i-1; r++)
{
int r1 = n-i+r; //代表當前行
int c1 = 2*n-i-1-r1; //代表當前列
a[r1][c1] = count;
count++;
}
flag = false;
}
else
{
for(int r = i-1; r>=0; r--)
{
cout<<"ddd"<<endl;
int r1 = n-i+r;
int c1 = 2*n-i-1-r1;
// cout<<r1<<","<<c1<<endl;
a[r1][c1] = count;
count++;
}
flag = true;
}
}
for(int r = 0; r<n; r++)
{
for(int c=0; c<n; c++)
cout<<a[r][c]<<",";
cout<<endl;
}
}
int main()
{
int n;
cin>>n;
zigzag(n);
return 0;
}
網(wǎng)上還有一個人寫了一個比較巧的算法:
/**
* 得到如下樣式的二維數(shù)組
* zigzag(jpeg編碼里取象素數(shù)據(jù)的排列順序)
*
* 0, 1, 5, 6,14,15,27,28,
* 2, 4, 7,13,16,26,29,42,
* 3, 8,12,17,25,30,41,43,
* 9,11,18,24,31,40,44,53,
* 10,19,23,32,39,45,52,54,
* 20,22,33,38,46,51,55,60,
* 21,34,37,47,50,56,59,61,
* 35,36,48,49,57,58,62,63
*/
#include <stdio.h>
int main()
{
int N;
int s, i, j;
int squa;
scanf("%d", &N);
/* 分配空間 */
int **a = malloc(N * sizeof(int *));
if(a == NULL)
return 0;
for(i = 0; i < N; i++) {
if((a[i] = malloc(N * sizeof(int))) == NULL) {
while(--i>=0)
free(a[i]);
free(a);
return 0;
}
}
/* 數(shù)組賦值 */
squa = N*N;
for(i = 0; i < N; i++)
for(j = 0; j < N; j++) {
s = i + j;
if(s < N)
a[i][j] = s*(s+1)/2 + (((i+j)%2 == 0)? i : j);
else {
s = (N-1-i) + (N-1-j);
a[i][j] = squa - s*(s+1)/2 - (N - (((i+j)%2 == 0)? i : j));
}
}
/* 打印輸出 */
for(i = 0; i < N; i++) {
for(j = 0; j < N; j++)
printf("%-6d", a[i][j]);
printf("\n");
}
return 0;
}
posted @ 2010-05-03 17:26 小強摩羯座 閱讀(270) | 評論 (0) | 編輯 收藏
一、如何判斷一個單鏈表是有環(huán)的?(注意不能用標志位,最多只能用兩個額外指針) 二、刪除一個單項鏈表的最中間的元素,要求時間盡可能短(不能使用兩次循環(huán)) 三、輸入n,求一個n*n矩陣,規(guī)定矩陣沿45度線遞增(威盛) #include <stdio.h>
int main() return 0;
五、struct S { 如果語句s.p[0] =2 先于s.p[1]=1則程序就不會出錯.此時語句相當于s.i=2;s.p=1;
|
posted @ 2010-05-03 17:25 小強摩羯座 閱讀(144) | 評論 (0) | 編輯 收藏
在處理內(nèi)存分配的時候,C++程序員會用new操作符(operator new)來分配內(nèi)存,并用delete操作符(operator delete)來釋放內(nèi)存。這是一個new操作符的例子。 class CTest 雖然這種寫法在大多數(shù)時候都工作得很好,但還是有些情況下使用new是很煩人的,比如當你想重新分配一個數(shù)組或者當你想在預(yù)分配的內(nèi)存上構(gòu)造一個對象的時候。 比如第一種情況,重新分配一個數(shù)組效率是很低的: // 分配一個有10個對象的數(shù)組 如果你想在預(yù)分配的內(nèi)存上創(chuàng)建對象,用缺省的new操作符是行不通的。要解決這個問題,你可以用placement new構(gòu)造。它允許你構(gòu)造一個新對象到預(yù)分配的內(nèi)存上: // buffer 是一個void指針 (void *) 下面是一些例子: #include <new> 當你有自己的內(nèi)存緩沖區(qū)或者在你實現(xiàn)自己的內(nèi)存分配策略的時候,placement new會很有用。事實上在STL中廣泛使用了placement new來給容器分配內(nèi)存;每個容器類都有一個模版參數(shù)說明了構(gòu)造/析構(gòu)對象時所用的分配器(allocator)。 在使用placement new的時候,你要記住以下幾點:
pFirst->~CTest(); ::棧上的對象(注意,是類對象,char類型就無需了,后面還會提到)保證放在對齊地址上. 但是,個人實驗了一下,發(fā)現(xiàn)并不是這樣 例如: int main() { char c1 = 'A' ; char c2 = 'B' ; char c3 = 'C' ; char c4 = 'D' ; char c5 = 'E' ; //-------- 驗證這四個地址是否是 4 的倍數(shù) --------------// if ( ((int)(&c1)) % 4 == 0 ) cout << "c1:Yes" << endl ; if ( ((int)(&c2)) % 4 == 0 ) cout << "c2:Yes" << endl ; if ( ((int)(&c3)) % 4 == 0 ) cout << "c3:Yes" << endl ; if ( ((int)(&c4)) % 4 == 0 ) cout << "c4:Yes" << endl ; if ( ((int)(&c5)) % 4 == 0 ) cout << "c5:Yes" << endl ; cout << (int)(&c1) << endl // 輸出四個字符所在的地址(輸出結(jié)果都是 4 的倍數(shù)) << (int)(&c2) << endl << (int)(&c3) << endl << (int)(&c4) << endl << (int)(&c5) << endl ; } ----------------------------- 上面的執(zhí)行結(jié)果在VC下運行都是 4 的倍數(shù) -------------- --> 問題1:連棧上分配的空間地址都是 4 的倍數(shù),那就說明系統(tǒng)分配的空間都是 4 的倍數(shù)吧??? --> 問題2:如果萬一,如果放一個對象的地址不是4的倍數(shù),那么會出現(xiàn)什么情況??可以給簡單說一下嗎? --> 問題3:地址對齊的通用性??? ------------- 程序1: Class C1 { int i ; char c ; } ; cout << sizeof(C1) << endl ;// 輸出結(jié)果: 8 (是 4 的倍數(shù)) 程序2: class C2 { char c1 ; char c2 ; } ; cout << sizeof(C2) << endl ;// 輸出結(jié)果:2 ( 上一個中char類型也給了4個字節(jié),怎么這個地方都給了一個字節(jié)??) --> 問題4:由上面的程序2 引出下面的程序 class C2// sizeof(C2) =2 ,在VC實驗下的結(jié)果,不是 4 { char c1 ; char c2 ; } ; //----------用placement new方法建立對象---------------- void *ptr = operator new(100) ;// 分配內(nèi)存 C2 *POINTER = (C2*)ptr ;// 類型轉(zhuǎn)換 String *str1 = new (POINTER) C2() ;// 建立一C2對象 String *str2 = new (POINTER+1) C2() ;// 再建立一個對象 String *str3 = new (POINTER+2) C2() ;// 再建立一個對象 cout << (int)(str1) << endl// 結(jié)果:3608720( 是4的倍數(shù)) << (int)(str2) << endl // 結(jié)果:3608722(不是4的倍數(shù))!! << (int)(str3) << endl ;// 結(jié)果:3608724(不是4的倍數(shù))!! |
posted @ 2010-04-20 17:15 小強摩羯座 閱讀(3809) | 評論 (0) | 編輯 收藏
任意放大/變小 字體 快捷鍵ctrl+] 放大 字體 ctrl+[ 縮小字體 把文字替換成圖片 Word雙面打印技巧 |
posted @ 2010-04-20 10:26 小強摩羯座 閱讀(238) | 評論 (0) | 編輯 收藏
字符串拆分的中文處理問題
容健行@2007年7月
轉(zhuǎn)載請注明出處
原文出處:http://www.devdiv.net/home/space.php?uid=125&do=blog&id=365
概述:
拆分一個字符串在程序中使用非常廣泛,特別是我們經(jīng)常跟表格打交道的程序員們。所謂拆分字符串,就是將一個字符串中間以某個(或某些)字符為分隔,拆分成多個字符串。如 std::string s = "abc | ddd | 中國"; 如果以豎線“|”拆分,可以將這個字符串拆分成三個字符串。
當然字符串拆分還包括通過正則表達式來拆分,為了簡化問題,我們以單個字符做分隔的拆分,因為這種拆分用得最多。代碼使用C++來講解。
問題:
問題來源于實際,是之前我們組和其他組都有遇上的。先看一個例子,使用"|"拆分以下字符串,看起來怎么數(shù)都是分為48列,但我看到好幾個版本的字符串拆分函數(shù)卻報有49列:
"AGZGY1000004|200|劉瓅||20100101||OPRT10|1|0||AAGZ0Y100|0|0|24|0|0|0|0||-1|20030101|0|20991231||AGZGK6172888|200|曾曉翔||20100101||OPRT10|1|0||AAGZ0K617|0|0|24|0|0|0|0||-1|20061215|1|20061215||"
原因分析:
讓我們先把以上字符串放到UltraEdit中,并切換到16進制的編輯模式,看看它的編碼。
原因是原來的字符串拆分函數(shù)只是簡單的查找“|”(編碼為0x7c),而沒有考慮到中文的處理(源代碼太多,且有好幾個版本,這里略去)。
在boss中,c++程序使用的編碼方式幾乎全為ansi,而在ansi中,表示中文是用兩個字符,且第一個字符是一個大于0x80的字符(字符的第一位為1),第二個字符為任意字符。這里引起一個問題:
當我們要分割字符串時,假如用"|"(0x7c)作為分割符,當分析上面這個字符遇到"瓅"(編碼為0xad,0x7c)這個字符時,會把它第二個字符作為了分割符,結(jié)果就多出了一列。
解決方案:
問題原因找到了,重新寫了一下字符串拆分函數(shù)-Split,這里使用的方法是:找到分隔符后,再向前查找字符看一下它前一個字符是否為東亞文字的第一個字符編碼(編碼大于0x80)。
考慮到以后支持unicode,這里使用了模板。以下可能不是最高效簡單的實現(xiàn),但如果以后遇上這種問題,可以參考一下。
#include "stdafx.h"
#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <fstream>
// unicode 分割策略
inline
bool __SplitPolicy(
const std::wstring& s,
const std::wstring& splitchar,
std::wstring::size_type& pos)
{
pos = s.find_first_of(splitchar, pos);
return pos != std::string::npos;
}
// ansi 分割策略
inline
bool __SplitPolicy(
const std::string& s,
const std::string& splitchar,
std::string::size_type& pos)
{
pos = s.find_first_of(splitchar, pos);
if (pos != std::string::npos)
{
// 如果前一個字符的第一位為1,且當前字符是在東亞文字的第二個字符,
// 則認為該字符是東亞字的其中一個字符,要跳過,不作為分割符。
std::string::size_type i = 1;
for (; i < pos; ++i)
{
if (!((char)(s[pos - i]) & 0x80)) // 判斷第一位是否為1。(0x80的二進制為 10000000)
break;
}
if (!(i % 2)) // 看一下當前字符是否為東亞文字的第二個字符
{
++pos;
__SplitPolicy(s, splitchar, pos);
}
}
return pos != std::string::npos;
}
template<typename char_type> inline
int Split(
const std::basic_string<char_type>& s,
const std::basic_string<char_type>& splitchar,
std::vector<std::basic_string<char_type> >& vec)
{
typedef std::basic_string<char_type> string_t;
typedef typename string_t::size_type size_t;
string_t tmpstr;
size_t pos = 0, prev_pos = 0;
vec.clear();
while (__SplitPolicy(s, splitchar, pos))
{
tmpstr = s.substr(prev_pos, pos - prev_pos);
vec.push_back(tmpstr);
prev_pos = ++pos;
}
size_t len = s.length() - prev_pos;
if (len > 0)
vec.push_back(s.substr(prev_pos, len));
return static_cast<int>(vec.size());
}
// ansi版本測試
void testSplit()
{
std::vector<std::string> vec;
const std::string str = "AGZGY1000004|200|劉瓅瓅||20100101||OPRT10|1|0||AAGZ0Y100|0|0|24|0|0|0|0||-1|20030101|0|20991231||AGZGK6172888|200|曾曉翔||20100101||OPRT10|1|0||AAGZ0K617|0|0|24|0|0|0|0||-1|20061215|1|20061215||a";
const std::string sp = "|";
int count = Split(str, sp, vec);
for (std::vector<std::string>::const_iterator it = vec.begin(); it != vec.end(); ++it)
std::cout << *it << " ";
}
// unicode版本測試
void testSplitW()
{
std::vector<std::wstring> vec;
const std::wstring str = L"AGZGY1000004|200|劉瓅||20100101||OPRT10|1|0||AAGZ0Y100|0|0|24|0|0|0|0||-1|20030101|0|20991231||AGZGK6172888|200|曾曉翔||20100101||OPRT10|1|0||AAGZ0K617|0|0|24|0|0|0|0||-1|20061215|1|20061215||";
const std::wstring sp = L"|";
Split(str, sp, vec);
const char head[3] = {0xff, 0xfe, 0};
const wchar_t line[3] = L" ";
// 控制臺輸出不了unicode字符,使用輸出到文件的方式
std::ofstream fileOut("C:/out.txt");
fileOut.write(head, 2);
for (std::vector<std::wstring>::iterator it = vec.begin(); it != vec.end(); ++it)
{
fileOut.write((const char*)it->c_str(), it->length() * 2);
fileOut.write((const char*)line, 2);
}
}
int main()
{
testSplit();
testSplitW();
}
參考:
2.《談?wù)刄nicode編碼,簡要解釋UCS、UTF、BMP、BOM等名詞》
posted @ 2010-04-19 01:47 小強摩羯座 閱讀(765) | 評論 (0) | 編輯 收藏
關(guān)于C++中文字符的處理


posted @ 2010-04-18 01:10 小強摩羯座 閱讀(225) | 評論 (0) | 編輯 收藏
//gameloft 筆試題
/*
1、RGB值轉(zhuǎn)灰度值對32位整數(shù)取R,G,B對應(yīng)的8位并加權(quán)合成。
2、求一個字符串中出現(xiàn)頻率最高的字符。字符范圍并渦有說明,通常應(yīng)
指ASCII字符集,可是當時考慮復(fù)雜了,于是想到了stl的map來做。
結(jié)果沒有寫完。就交了。
*/
#include<iostream>
using namespace std;
#define CHARNUM 256
//計算一個串最出現(xiàn)頻率最高的字符
char mostFreq(const char* str)
{
int freq[CHARNUM]= {0};
int firstPos[CHARNUM] = {0};
int pos = 0;
const char* p = str;
while( *p != '\0')
{
if(freq[*p] == 0)
{
firstPos[*p] = pos;
}
freq[*p++]++;
pos++;
}
int maxF = -1;
int ch = '\0';
for(int i = 1;i < 256;i++)
{
if( freq[i] > maxF)
{
ch = i;
maxF = freq[i];
}
if( freq[i] == maxF)
{
if( firstPos[i] < firstPos[ch])
{
ch = i;
}
}
}
cout<<" maxF ="<<maxF<<endl;
return (char)ch;
}
int main()
{
int* a[9][4][5];
int b = a[5] - a[3];
cout<<"b = "<<b<<endl;
int* c[3];
char * str = "aabyebbdfdf 1`5454545$$$#$#$2788kldef";
char ch;
ch = mostFreq( str);
cout<<"ch = " <<ch<<endl;
}
4.給出一個CThing 類的源代碼讓分析,其中有三個語句要求解釋語句作用。
一個填空,分析時有點忙了,應(yīng)該一個函數(shù)一個函數(shù)的分析,或許會有清晰思路。
將各個類的名稱和功能整理下會理出些思路。
5、給出strcpy的源代碼讓說明其功能,并指出參數(shù)設(shè)置上只少一人錯誤
6、給出一個將整數(shù)i轉(zhuǎn)換為8進制的方法,要求對其進行改進。
src:
void count(int i, char* str)
{
map[
sorry, 記憶不清楚了
7、給幾個名詞讓解釋placement new,ARM, GCC, android, 還有一人??
8、英文解釋題目。第一個還好。第二個說游戲加速的
increment ...update frame , ??這詞詞認識,放一起讀不出來表示什么
意思
posted @ 2010-04-17 01:38 小強摩羯座 閱讀(206) | 評論 (0) | 編輯 收藏
posted @ 2010-04-16 10:31 小強摩羯座 閱讀(240) | 評論 (0) | 編輯 收藏
posted @ 2010-04-16 10:30 小強摩羯座 閱讀(183) | 評論 (0) | 編輯 收藏
/**
* 實現(xiàn)測試:串匹配和詞頻統(tǒng)計功能
*/
public void largerTextExample()
{
String text = "你好abc,ac,abc,def,ac,okt, ac,dfdfe, ac , what is it 你好啊,bc";
String[] terms = {"你好","ac", "abc", "bc"};
for (int i = 0; i < terms.length; i++)
{
tree.add(terms[i].getBytes(), terms[i]);
System.out.println( terms[i]);
}
tree.prepare();
Set termsThatHit = new HashSet();
Iterator iter = tree.search(text.getBytes());
// 統(tǒng)計詞頻
Map<String, Integer> freqCount = new HashMap<String, Integer>();
for (; iter.hasNext();)
{
SearchResult result = (SearchResult) iter.next();
Set set = result.getOutputs();
System.out.println(set);
for(Iterator it = set.iterator();it.hasNext();)
{
String str = (String)it.next();
if( freqCount.get(str) == null)
freqCount.put(str, 1);
else
freqCount.put(str, freqCount.get(str)+1);
}
}
for(String key: freqCount.keySet())
{
System.out.println( "key = " + key + ", value "+ freqCount.get(key) );
}
------------結(jié)果-------------------------
你好
ac
abc
bc
[你好]
[abc, bc]
[ac]
[abc, bc]
[ac]
[ac]
[ac]
[你好]
[bc]
key = abc, value 2
key = 你好, value 2
key = ac, value 4
key = bc, value 3
posted @ 2010-01-21 23:46 小強摩羯座 閱讀(1231) | 評論 (0) | 編輯 收藏