2012年7月24日
平時我們使用的IP地址是192.168.1.11這種類型的字符串;而在Linux內核中是用二進制方式表達的IP地址。在程序設計中經常要用到字符串表達方式的IP地址和二進制的IP地址之間的轉換。 面對網絡編程中眾多的地址函數,你hold住了么,tiger哥沒hold住,所以就寫了此篇文章,希望大家能hold住網絡編程。 前言:結構體struct in_addr結構struct in_addr 在文件中定義,結構in_addr 有一個unsigned long int 類型的成員變量s_addr.通常所說的IP地址的二進制形式就保存在成員變量s_addr中。 結構struct in_addr的原型如下:structin_addr{ unsigned long int s_addr;/*IP地址*/ }一。字符串IP地址轉換為二進制形式的IP地址函數1.inet系列函數的原型:#include #include #include int inet_aton(const char *cp,struct in_addr *inp);int addr_t inet_addr(const char *cp);int addr_t inet_network(const char *cp);char * inet_ntoa(struct in_addr in);struct in_addr inet_makeaddr(int net,int host);in_addr_t inet_lnaof(struct in_addr in);in_addr_t inet_netof(struct in_addr in);2.inet_aton()函數int inet_aton(const char*cp,struct in_addr *inp) 1>函數作用:inet_ation()函數將在cp中存儲的點分十進制字符串類型的IP地址,轉換為二進制的IP地址,轉換后的值保存在指針inp指向的結構struct in_addr中。 2>形參? const char *cp:指向字符類型的IP地址。例如“192.168.1.11”? struct in_addr *inp:指向二進制的網絡字節順序的IP地址structin_addr{ unsignedlong s_addr } 3>函數執行成功則返回非0值,參數無效則返回0. 4>實例:#include #include #include #include #include #include int main() { char buffer[32];structin_addr in;in.s_addr =0;/*輸入一個字符串形式的IP地址*/ printf(“pleaseinput the ip addrss\n”);scanf(“%s”,buffer);buffer[31]=‘\0’;printf(“original IP地址:%s\n”,buffer);if( 0 == inet_aton(buffer,&in)){ perror(“inet_aton”);exit(1);} else { printf(“after transfer:0x%0x\n”,in.s_addr);} 5> inet_aton函數最后計算出來的是網絡字節序的二進制IP 3.inet_addr()函數in_addr_t inet_addr(const char *cp) 1>函數作用:它將參數cp所指向的字符串形式的IP地址(“192.168.1.11”)轉換為二進制的網絡字節序的IP地址形式該函數的缺點是:如果IP地址是255.255.255.255.那么調用inet_addr()函數后將返回-1(因為-1的補碼形式是0xFFFFFFFF)。所以不建議使用inet_addr()函數,而是使用inet_aton()函數。 2>函數形參:const char*cp:cp指向字符串形式的IP地址。 3>函數返回值:函數成功后返回二進制的網絡字節序的IP地址(struct in_add),否則返回-1. 4>inet_addr計算出來的是網絡字節序的二進制IP 5>函數實例:#include #include #include #include #include #include int main() { char buffer[32];structin_addr in;in.s_addr =0;/*輸入一個字符串形式的IP地址*/ printf(“pleaseinput the ip addrss\n”);scanf(“%s”,buffer);buffer[31]=‘\0’;printf(“original IPaddress:%s\n”,buffer);if((in.s_addr = inet_addr(buffer))==INADDR_NONE){ perror(“inet_addr”);exit(1);} else { printf(“after transfer:0x%0x\n”,in.s_addr);} 4.inet_network in_addr_t inet_network(constchar *cp) 1>函數作用:將參數cp指向的字符串形式的網絡地址轉換為主機字節順序形式的二進制IP地址。 2>函數形參? const char *cp: cp指向字符串形式的IP地址。 3>函數返回值:執行成功后返回轉換后的結果,參數無效后返回-1. 4>inet_network返回的是主機字節序5>函數實例:#include #include #include #include #include #include int main() { char buffer[32];structin_addr in;in.s_addr =0;/*輸入一個字符串形式的IP地址*/ printf(“pleaseinput the ip addrss\n”);scanf(“%s”,buffer);buffer[31]=‘\0’;printf(“original IPaddress:%s\n”,buffer);if((in.s_addr = inet_addr(buffer))==INADDR_NONE){ perror(“inet_addr”);exit(1);} else { printf(“after transfer:0x%0x\n”,in.s_addr);}總結:1.inet_addr和inet_network函數都是用于將字符串形式轉換為整數形式用的;2.inet_addr返回的整數形式是網絡字節序,而inet_network返回的整數形式是主機字節序。 3.inet_addr 和inet_network有一個小缺陷,那就是當IP是255.255.255.255時,這兩個函數會認為這是個無效的IP地址,這是歷史遺留問題,其實在目前大部分的路由器上,這個 255.255.255.255的IP都是有效的。 4.inet_aton認為255.255.255.255是有效的,所以建議使用inet_aton.并且inet_aton函數返回的是網絡字節序的IP地址。 二。進制IP地址轉換為字符串形式的IP地址1.char * inet_ntoa(struct in_addr in);1>函數作用:將數值為in的網絡字節序形式的二進制IP地址轉換為字符串形式的IP地址。 2>形參:struct in_addr in:指向二進制的IP地址3>函數返回值:執行成功返回結果字符串的指針,參數無效返回NULL. 4>函數實例:#include #include #include #include #include #include int main() { char buffer[32];char *str;structin_addr in;in.s_addr =0;/*輸入一個字符串形式的IP地址*/ printf(“pleaseinput the ip addrss\n”);scanf(“%s”,buffer);buffer[31]=‘\0’;printf(“original IP地址:%s\n”,buffer);if( 0 == inet_aton(buffer,&in)){ perror(“inet_aton”);exit(1);} else { printf(“the first transfer:0x%0x\n”,in.s_addr);} printf(“begin two process:\n”);if( (str =inet_ntoa(in) == NULL ){ printf(“inet_ntoa:argumentinvalid\n”);} else { printf(“thesecond transfer:%s\n”,str);}說明:1.函數inet_ntoa()的返回值為一個指向字符串的指針,該內存函數inet_ntoa()每次調用都會重新覆蓋,因此函數不安全,可能存在某種隱患2.實例:#include #include #include #include #include #include int main() { structin_addr ip1,ip2;char *str1 ;char *str2;ip1.s_addr = 192<<24| 168 <<16 |1 <<8 | 1;ip2.s_addr =255<<24 | 255 <<16 |255<<8|255;str1 = inet_ntoa(ip1);str2 = inet_ntoa(ip2);printf(“ip1:0x%xà%s\n”,ip1.s_addr,str1);printf(“ip2:0x%xà%s\n”,ip2.s_addr,str2);}輸出結果為:ip1: 0xc0a80101à255.255.255.255;ip2:0xffffffffà255.255.255.255;表明函數inet_ntoa在進行二進制IP地址到字符串IP地址的轉換過程中是不可重入的,這個函數轉換兩個不同的IP地址得到了同一個結果。此類函數在調用之后,需要立即將結果取出,沒有取出結果之前不能進行同樣函數的調用。 三。最新的地址轉換函數inet_pton()和inet_ntop()函數inet_pton和inet_ntop這2個函數能夠處理ipv4和ipv6.算是比較新的函數了。inet_pton函數原型如下[將“點分十進制” -> “整數”],并且這兩個函數是一套安全的協議無關的地址轉換函數。所謂安全即這兩個函數是可重入的,并且這些函數支持多種地址類型,包括IPv4和IPv6. 1.inet_pton()函數1>函數功能inet_pton()函數將字符串類型的IP地址轉換為二進制類型。 2>函數原型#include #include #include intinet_pton(int af, const char *src, void *dst);3>函數形參:? int af:af表示網絡類型的協議族,在IPv4下的值為AF_INET;? src:存放需要轉換的字符串? dst :存放轉換后的結果,在IPv4下,dst指向結構struct in_addr的指針。 4>函數返回值當函數inet_pton()的返回值為-1的時候,通常是用于af所指定的協議族不支持造成,此時errno的返回值為EAFNOSUPPORT;當函數的返回值為0時,表示src指向的值不是合法的IP地址;當函數的返回值為正值時,表示轉換成功。 2.inet_ntop()函數1>函數功能inet_pton()函數將二進制的網絡IP地址轉換為字符串。 2>函數原型:#include #include #include intinet_nton(int af, const void *src, char *dst,socklen_t cnt);3>函數形參:? int af:af表示網絡類型的協議族,在IPv4下的值為AF_INET;? src :為需要轉換的二進制IP地址,在IPv4下,src指向一個structin_addr結構類型的指針。? dst指向保存結果緩沖區的指針? cnt的值是dst緩沖區的大小4>函數返回值Inet_ntop()函數返回一個指向dst的指針。當發生錯誤時,返回NULL.當af設定的協議族不支持時,errno設置為EAFNOSUPPORT;當dst緩沖區大小過小的時候errno的值為ENOSPC. 3.函數實例:#include #include #include #include #include #include int main(int argc,char *argv[]) { struct in_addr ip;char ipstr[] = “192.168.1.1”;char addr[ADDRLEN];const char * str = NULL;int err = 0;if(err > 0){ printf(“inet_pton:ip %s value is :0x%x\n”,ipstr,ip.s_addr);} //把192.168.12.255轉換為網絡字節序ip.s_addr = htonl(192 << 24 | 168<<16 | 12<<8 | 255);str = (const char *)inet_ntop(AF_INET,(void*)&ip,(char *)&addr[0],ADDRLEN);if(str){ printf(“inet_ntop :ip 0x%x is%s\n”,ip.s_addr,str);}四。inet_makeaddr()函數,inet_lnaof()函數和inet_netof()函數1.struct in_addr inet_makeaddr(int net,int host) 1>函數功能:一個主機的IP地址分為網絡地址和主機地址,inet_makeaddr()函數將主機字節序的網絡地址net和主機地址host合并成一個網絡字節序的IP地址。 2>函數形參:? int net:存放網絡號參數(二進制形式的主機字節序)? int host:存放主機號地址(二進制形式的主機字節序) 3>函數返回值:返回一個網絡字節序的IP地址4>函數實例:unsigned long net,host;net = 0x0000007F;host = 0x00000001;struct in_addr ip = inet_makeaddr(net,hst);2.in_addr_t inet_lnaof(struct in_addr in)
由于最近家里諸事繁多,目前的現狀再也無法為繼了,于是做出了一個重要的決定--離職。事實上,在現在的公司做出這樣的決定也是順理成章的事情,畢竟在去年的這個時候一起風雨同舟的同事們都已經陸續離職了,我是為數不多堅持到現在的項目成員了。當然我也并沒有繼續之前的項目,而且被外派到北京的另外一個項目中。剛到伊始,由于該項目組的壓力很大,周圍的同事們也都比較敬業,再有這也是我第一次正式和北京的同事們一起合作,當然也是我第一次感受到北京軟件開發的濃濃氛圍。坦白的講,這個項目組所做的東西和我的技術匹配度并不是很高,還好大家都比較職業,并且分工明確,而分到我負責的部分也是相對比較擅長的,即核心邏輯組件的開發和設計,至于UI邏輯和底層技術攻關部分都交給了其他人。 之前也有過幾次辭職的經歷,只是這次的感覺比較奇怪,可能是年齡的原因吧,確實不能做到年輕時那樣毫無顧忌了。即便這次仍然能順利找到新的工作,但是下一次呢?這種想法在之前的離職中是從未考慮的。有鑒于此,就用了將近一周的時間進行了深入的思考。離職的真實原因究竟是什么,即便是有多個理由,到底哪一個才是最最重要的呢?然后又想,離職的目的又是什么,也就是說為了什么,而這個目的一旦達到之后又能給你帶來什么,所帶來的這些又能對今后的發展有什么樣的幫助,歸根結底一句話,主因和長遠的規劃是否是匹配的。帶著這樣一連串的疑問開始了自我反省的過程。 還是先說說原因吧。 第一,家庭的負擔。主要來自父母的身體,再有就是孩子還小,這樣便無法保持這種每周出差的現狀了。 第二,工作感覺不好。每周在天津工作的時候,周圍沒有一個Team Member,連溝通和開開玩笑的人都沒有,周圍都是其他項目組的成員,沒有一個認識的。 第三,溝通效率偏低,有的時候因為一個很簡單的Bug或新需求,不得不反復很多次,這種異地的工作方式在溝通上確實存在極大的障礙。 第四,現有的工作和我未來的技術方向不是非常匹配。即便如此,畢竟是老Programmer了,應付起來問題不大。 第五,對移動設備的開發仍然保持著極大的熱情,希望能夠繼續從事這一方面的技術研發工作。 第六、在了解之后,感覺外包公司的文化和所要求的技能對我來說,確實非常不合適。不過這里的項目運作方式確實給了我一種耳目一新的感覺。 差不多就是這些了吧。從上面的幾條中進行分析,第一條是剛性的需求,沒有什么可說的,這是充分必要條件。而在其他原因之中,第五條是最最重要的,盡管已經Coding很多很多年,但繼續Coding下去的熱情仍然和當初一樣熾烈,也真的希望能夠兌現入行之初的誓言,Coding到退休。然而所不同的是,隨著年齡的改變和經驗的增多,不可能再像以前那樣渾渾噩噩的去Coding了。自己一直非常渴望能夠找到一個非常非常適合自己,同時又非常非常有興趣的方向,在這條路上,最大化自己的經驗值,用幾年的時間做出一個真正屬于自己,同時又能證明自己價值的軟件產品來。 當然每個人都希望有一份薪水豐厚的工作,畢竟需要養家糊口,生兒育女。所以我們在急于實現理想的同時也不能不顧及來自于現實的考驗。我想,能夠完全放得下去殊死一搏并最終取得成功的人應該是極少數,更多的人沒有這樣的勇氣和運氣。我作為一名老Programmer,在心態上相比于以前更為平和了,畢竟積蓄和收入都還算說的過去。然而希望贏得尊重的心卻更為濃烈了,比如說,在最近這一年多的時間里,堅持寫博客和技術分享;之前獨立開發的服務器平臺已經為多家小型公司使用并成功部署上線;隨著架構設計經驗的不斷提升,設計期間考慮的視角也更為多樣。盡管如此,心里始終還是埋藏著那個巨大的缺憾,為什么仍然沒有一個真正屬于自己的產品呢?為什么不能像一個建筑師那樣告訴周圍人,這個建筑是我的作品。
問題:在ie瀏覽器下,域名A通過iframe的方式把登錄信息post到域名為B的cas服務器上,經過debug發現A獲取loginTicket時的sessionId和post過去時的sessionid不一致。只有ie瀏覽器有這個問題,火狐谷歌瀏覽器正常。 原因:查資料知道IE6/IE7支持的P3P(Platform for Privacy Preferences Project (P3P) specification)協議默認阻止第三方無隱私安全聲明的cookie,火狐和谷歌目前還不支持P3P安全特性,所以它們不存在此問題了。 解決方法:在第一次獲取loginTicket時在response中設置p3p聲明,如下:
response.setHeader("P3P", "CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR");
現在正在復習linux,將一些比較常用的東西記下來,一遍以后再次復習 使用root用戶登錄,或者用普通用戶登錄之后使用su root切換,相信正常人都會選擇前者。 1、切換目錄: cd /etc/sysconfig/network-scripts 2、使用vi編輯器打開ifcfg-eth0 vi ifcfg-eth0 修改其中內容: DEVICE=eth0 BOOTPROTO=static IPADDR=192.168.1.3 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 HWADDR=原來是什么就是什么 ONBOOT=yes 然后重啟網卡服務: service network restart 如果無法使用service,那么將/sbin加入環境變量,如果可以使用則不需要執行下面命令: export PATH=$PATH:/sbin 這種修改方法是永久的,即使你重啟后仍然有效,還有一種比較快捷的方法如下: ifconfig eth0 192.168.1.3 netmask=255.255.255.0 up 立馬生效。
前面的章節里對linux的文件的權限做了簡單的解釋。現在來看看常見的命令,從簡單的開始: 1 、切換目錄 cd 到/tmp 目錄:cd /tmp 到上層目錄:cd .. 2 、查看當前目錄 pwd 3、 創建一個新的文件夾: mkdir 創建一層目錄: 
創建多層目錄: 
4 、刪除目錄: rmdir [-p] 如果需要層級刪除目錄,就需要帶上p(只能刪除空目錄) 5、查詢環境變量 echo $PATH 或者$PATH 6、切換用戶: su 用戶名 7、移動文件  仔細閱讀上面的命令,你會發現mv還可以對文件進行從命名,上面的命令將hellot.txt從a中移動到了b中,并改名為hello1.txt 8、查看文件與目錄 ls ls -a 目錄名稱:列出目錄中所有的文件 ls -al 目錄名:列出長字符串,包含文件的一些詳細信息 如果沒有給定目錄名,那么就是當前目錄 9、文件的復制: cp [-adfilprsu] 源文件 目標文件 //將源文件拷貝到目標文件 cp src1,src2,... des //將多個源文件拷貝到目的文件夾 cp這個命令非常重要,不同的身份執行對命令產生不同的效果,尤其是-a,-p參數,對不同的身份來說,區別非常大。 例1: 使用root執行: 
如果我們要將文件的所有的屬性復制過來,則要加上參數-a 復制一個目錄到另外一個目錄 cp -r /src /desc 10 、移除文件或目錄 rm [-fir] 文件或目錄 -f 強制的意思,忽略不存在的文件,不會出現警告信息 -i互動模式:刪除前,會詢問是否刪除 -r :遞歸刪除 這里不再演示,記得之前的rmdir嗎,只能刪除空目錄,所以刪除非空目錄只能使用rm -r 11、文件類容查詢 cat -b:列出行號 -n:列出行號,包括空白行 
cat 是一次性將數據顯示到屏幕上,如果想一頁一頁的看怎么辦? 使用more命令 more在運行的過程中,你有幾個按鍵可以按: 空格鍵:代表向下翻一頁 Enter:代表向下滾動一行 q:離開more b:往回翻頁 12 、創建文件 touch touch a.txt 就會在當前目錄下創建a.txt 13、查找文件的命令 whereis ,find whereis [-bmsu] 文件或目錄名 -b:二進制文件 -m:只找在說明文件manual路徑下的問津 -s:只找source源文件 -u:查找不在上述三個選項中的其他特殊文件 whereis ifconfig 下面看看find命令 find [path] [option] [actioin] 查找/home下面屬于gavin的文件 find /home -user gavin 查找系統中不屬于任何人的文件 find / -nouser 查找文件名為passwd的這個文件 find / -name passwd 查找文件類型為socket的文件 find / -type s 14、磁盤和目錄的容量 df:列出文件系統的整體磁盤使用量 du:評估文件系統的磁盤使用量 15 創建鏈接文件 ln [-sf] 源文件 目標文件 -s :創建軟連接,如果不加則是硬連接 -f:如果目標文件存在,則刪除后再建 [root@localhost test2]# echo 'good'>a.txt [root@localhost test2]# ls a.txt [root@localhost test2]# ln -s a.txt b [root@localhost test2]# ls a.txt b [root@localhost test2]# ll total 12 -rw-r--r-- 1 root root 5 Aug 8 01:09 a.txt lrwxrwxrwx 1 root root 5 Aug 8 01:09 b -> a.txt [root@localhost test2]# echo 'hello'>>b [root@localhost test2]# cat b good hello [root@localhost test2]# cat a.txt good hello [root@localhost test2]# ln a.txt c [root@localhost test2]# ll total 20 -rw-r--r-- 2 root root 11 Aug 8 01:09 a.txt lrwxrwxrwx 1 root root 5 Aug 8 01:09 b -> a.txt -rw-r--r-- 2 root root 11 Aug 8 01:09 c [root@localhost test2]# echo 'bad'>>c [root@localhost test2]# cat c good hello bad [root@localhost test2]# cat a.txt good hello bad [root@localhost test2]# cat b good hello bad [root@localhost test2]# rm a.txt rm: remove regular file `a.txt'? y [root@localhost test2]# cat b cat: b: No such file or directory [root@localhost test2]# cat c good hello bad [root@localhost test2]# 運行上面的命令行,相信你對ln的使用會非常清楚的。 15、掛載CD 
16、文件壓縮 tar -c:創建一個壓縮文件 -v:顯示壓縮過程 -f:給出壓縮文件名 -x:解壓文件 -t::查看壓縮包中又哪些文件 
1.設計一個算法,把一個含有N個元素的數組循環右移K位,要求時間復雜度為O(N), 且只允許使用兩個附加變量。 方法一: 每次將數組中的元素右移一位,循環K次,則實現了右移K位。 例如, 原始字符串:abcd1234 右移一位:4abcd123 右移一位:34abcd12 右移一位:234abcd1 右移一位:1234abcd 循環4次,則實現了右移4次 實現函數如下:
void right_shift(char *str, int N, int K) { char temp; K %= N; //目的是,當K > N時,移動K次與移動K-i*N次是一樣的。 while(K--) { t = str[N -1]; for(int i = N - 1; i > 0; i--) str[i] = str[i - 1]; str[0] = t; } } 從上面的實現代碼可以看出, 由于K %= N, 所以while循環的K值是小于N的。所以時間復雜度最大為O(N^2), 空間復雜度為O(1),不符合題目要求。 方法二: 對于原始字符串abcd1234,右移2位后為:34abcd12。 通過比較可以看出,有兩段子字符串的順序是不變的。abcd12和34。 則可發現,右移K位的過程就是把數組的兩部分交換的過程。 例如:abcd12|34. 對abcd12逆序排列:21dcba 對34逆序排列: 43 對全部的21dcba|43進行逆序排列:34abcd21. 得出如下結論: 將字符串S="abcd1234"分為兩部分X="abcd12"和Y="34"。那么S=(X, Y) X逆序記為X'="21dcba" Y逆序記為Y'="43" 則(X', Y')="21dcba43"整體再逆序為"34abcd12" = (Y, X) 即(X', Y')' = (Y, X) 代碼實現如下: void reverse(char* str, int begin, int end) { char temp; for( ; begin < end; begin++) { temp = str[end]; str[end] = str[begin]; str[begin] = temp; } }
void right_shift(char *str, int N, int K) { K %= N; reverse(str, 0, N - K -1); reverse(str, N - K, N - 1); reverse(str, 0, N - 1); } 該算法則實現了在線性時間內實現右移操作了。 編寫主函數測試如下: #include <stdio.h> #include <stdlib.h>
int main() { char str[] = "abcd1234"; printf("The initial string:%s\n", str); right_shift(str, 8, 2); printf("The string after right shift:%s\n", str); system("pause"); return 0 } 2.實現對字符串進行左旋轉的函數,要求對長度為n的字符串操作的時間復雜度為O(n), 空間復雜度為O(1).例如,原始字符串:abcd1234,左旋轉2位后為:cd1234ab通過上面的1的分析,只是把右移改為左移。其他方法相同。代碼實現如下: void reverse(char* str, int begin, int end) { char temp; for( ; begin < end; begin++) { temp = str[end]; str[end] = str[begin]; str[begin] = temp; } }
void right_shift(char *str, int N, int K) { K %= N; reverse(str, 0, K -1); reverse(str, K, N - 1); reverse(str, 0, N - 1); }
int main() { char str[] = "abcd1234"; printf("The initial string:%s\n", str); right_shift(str, 8, 2); printf("The string after right shift:%s\n", str); system("pause"); return 0 }
(一)淺談游標 (1)游標的概念 游標是指向查詢結果集的一個指針,它是一個通過定義語句與一條Select語句相關聯的一組SQL語句,即從結果集中逐一的讀取一條記錄。游標包含兩方面的內容: ●游標結果集:執行其中的Select語句所得到的結果集; ●游標位置:一個指向游標結果集內的某一條記錄的指針 利用游標可以單獨操縱結果集中的每一行。游標在定義以后存在兩種狀態:關閉和打開。當游標關閉時,其查詢結果集不存在;只有當游標打開時,才能按行讀取或修改結果集中的數據。 (2)淺談游標 游標我們可以通俗的解釋為變動的標示。正如它的解釋一樣,數據庫中的游標其實也是一種讀取數據的方式。舉個簡單的例子來說:我有一個電話本,電話本上的號碼首先是按地域劃分的,現在我想找個家住廊坊的李四。首先我們要做的是先找到廊坊地區的電話表,找到后的表也即是我們上面所說的游標結果集;而為了找到李四我們可能會用手一條一條逐行的掃過,以幫助我們找到所需的那條記錄。對應于數據庫來說,這就是游標的模型。所以,你可以這樣想象:表格是數據庫中的表,而我們的手好比是游標。 總結來說游標就好比是在電話本上逐一掃描號碼的手指。 (二)使用游標 一個應用程序中可以使用兩種類型的游標:前端(客戶)游標和后端(服務器)游標,它們是兩個不同的概念。 但無論使用哪種游標,都必須經過如下的步驟: ●聲明游標 ●打開游標 ●從游標中操作數據 ●關閉游標 下面我們主要講述下服務器游標: (1)定義游標 使用游標之前必須先聲明它。聲明指定定義游標結果集的查詢。通過使用for update或for read only關鍵詞將游標顯式定義成可更新的或只讀的。 Declare cursor_name cursor For select_statement [for{read only|update[of colum_name_list]}] 舉例: Declare company_crsr cursor For select name,salary from company where salary>2000 For update of name,salary 上面我們聲明了一個名為company_crsr的游標。 (2)打開游標 open的語法為: open 游標名 在聲明游標后,必須打開它以便用fetch,update,delete讀取、修改、刪除行。在打開一個游標后,它將被放在游標結果集的首行前,必須用fetch語句訪問該首行。 (3)讀取游標數據 在聲明并打開一個游標后,可用fetch命令從游標結果集中獲取數據行。 Fetch的語法為: Fetch [[Next | Prior | First | Last | Absolute{n|@nvar} |Relative {n|@nvar}] From] 游標名 [into 變量列表] 參數說明: Next:返回結果集中當前行的下一行,如果該語句是第一次讀取結果集中數據則返回的是第一行 Prior:返回結果集中當前行的上一行,如果該語句是第一次讀取結果集中的數據則無記錄結果返回并把游標位置設置為第一行。 First:返回游標第一行;Last:返回游標中的最后一行; Absolute{n|@nvar}:如果 n 或 @nvar 為正數,返回從游標頭開始的第 n 行并將返回的行變成新的當前行。如果 n 或 @nvar 為負數,返回游標尾之前的第 n 行并將返回的行變成新的當前行。如果 n 或 @nvar 為 0,則沒有行返回。n 必須為整型常量且 @nvar 必須為smallint、tinyint 或 int。 RELATIVE {n | @nvar}:如果 n 或 @nvar 為正數,返回當前行之后的第 n 行并將返回的行變成新的當前行。如果 n 或 @nvar 為負數,返回當前行之前的第 n 行并將返回的行變成新的當前行。如果 n 或 @nvar 為 0,返回當前行。如果對游標的第一次提取操作時將FETCH RELATIVE 的 n 或 @nvar 指定為負數或 0,則沒有行返回。n 必須為整型常量且@nvar 必須為 smallint、tinyint 或 int。 舉例: Fetch next company_crsr into @name,@salary SQL Server在每次讀取后返回一個狀態值。可用@@sql_status訪問該值,下表給出了可能的@@sql_status值及其意義。 值意義: 0——Fetch語句成功 1——Fetch語句導致一錯誤 2——結果集沒有更多的數據,當前位置位于結果集最后一行,而客戶對該游標仍發出Fetch語句時。 若游標是可更新的,可用update和delete語句來更新和刪除行。 刪除游標當前行的語法為: Delete [from] 表名 where current of 游標名 舉例:delete from authors where current of authors_crsr 當游標刪除一行后,SQL Server將游標置于被刪除行的前一行上。 更新游標當前行的語法為: update 表名 set column_name1={expression1|NULL|(select_statement)} [,column_name2={expression2|NULL|(select_statement)} [……] where current of 游標名 舉例: update company set name=”張三”,salary=”5000” where current of company_crsr (4)關閉游標 當結束一個游標結果集時,可用close關閉。該語法為: close 游標名 關閉游標并不改變其定義,可用open再次打開。若想放棄游標,必須使用deallocate釋放它,deallocater的語法為: deallocater cursor 游標名 deallocater語句通知SQL Server釋放Declare語句使用的共享內存,不再允許另一進程在其上執行Open操作。
在oracle世界,你可以使用: 1)case表達式 或者 2)decode函數 來實現邏輯判斷。Oracle的DECODE函數功能很強,靈活運用的話可以避免多次掃描,從而提高查詢的性能。而CASE是9i以后提供的語法,這個語法更加的靈活,提供了IF THEN ELSE的功能。 case表達式 case表達式,可分兩種,簡單和搜索,簡單case后接表達式,如: 
對于簡單的case需要幾點注意: 1)尋找when的優先級:從上到下 2)再多的when,也只有一個出口,即其中有一個滿足了expr就馬上退出case 3)不能把return_expr和else_expr指定為null,而且,expr、comparison_expr和return_expr的數據類型必須相同。 
搜索case: CASE WHEN condition THEN return_expr [WHEN condition THEN return_expr] ... ELSE else_expr END 例子: - SELECT (CASE WHEN cust_credit_limit BETWEEN 0 AND 3999 THEN ' 0 - 3999'
- WHEN cust_credit_limit BETWEEN 4000 AND 7999 THEN ' 4000 - 7999'
- WHEN cust_credit_limit BETWEEN 8000 AND 11999 THEN ' 8000 - 11999'
- WHEN cust_credit_limit BETWEEN 12000 AND 16000 THEN '12000 - 16000' END)
- AS BUCKET, COUNT(*) AS Count_in_Group
- FROM customers WHERE cust_city = 'Marshal' GROUP BY
- (CASE WHEN cust_credit_limit BETWEEN 0 AND 3999 THEN ' 0 - 3999'
- WHEN cust_credit_limit BETWEEN 4000 AND 7999 THEN ' 4000 - 7999'
- WHEN cust_credit_limit BETWEEN 8000 AND 11999 THEN ' 8000 - 11999'
- WHEN cust_credit_limit BETWEEN 12000 AND 16000 THEN '12000 - 16000' END);
-
- BUCKET COUNT_IN_GROUP
- ------------- --------------
- 0 - 3999 8
- 4000 - 7999 7
- 8000 - 11999 7
- 12000 - 16000 1
用decode可以違反第3NF(行不可再分,列不可再分,列不可重復):列重復 - hr@ORCL> select * from a;
-
- ID NAME
- ---------- ----------
- 1 a
- 2 b
- 3 c
- 1 a
-
- hr@ORCL> select sum(decode(id,1,1,0)) think,
- 2 sum(decode(id,2,2,0)) water,
- 3 sum(decode(id,3,3,0)) linshuibin
- 4 from a;
-
- THINK WATER LINSHUIBIN
- ---------- ---------- ----------
- 2 2 3
一個字段,decode函數可以完全改寫簡單case; 多個字段,需要復雜的case,方可。 語法: DECODE(value,if1,then1,if2,then2,if3,then3,...,else),表示如果value等于if1時,DECODE函數的結果返then1,...,如果不等于任何一個if值,則返回else。可以用函數或表達式來替代value,if,then,else從而作出一些更有用的比較。 來看看具體的運用: 1 假設我們想給百度職員加工資,其標準是:工資在8000元以下的將加20%;工資在8000元以上的加15% 則: select decode(sign(salary - 8000),1,salary*1.15,-1,salary*1.2,salary) "revised_salary" from employee 2 表table_subject,有subject_name列。要求按照:語、數、外的順序進行排序 則: select * from table_subject order by decode(subject_name, '語文', 1, '數學', 2, , '外語',3) decode和簡單case的性能比較 Oracle的DECODE函數功能很強,靈活運用的話可以避免多次掃描,從而提高查詢的性能。而CASE是9i以后提供的語法,這個語法更加的靈活,提供了IF THEN ELSE的功能。
對于很多情況,DECODE和CASE都能解決問題,個人更傾向于使用DECODE,一方面是從8i保留下來的習慣,另一方面是DECODE的語法更加的簡潔,代碼量要小一些。 不過今天在看Oracle9i的數據倉庫手冊時發現,Oracle在文檔中提到CASE語句的效率會更高一些,尤其是CASE表達式 WHEN 常量 THEN的語法,效率要比CASE WHEN表達式 THEN的語法更高一些。對于后面這種說法倒是沒有太多的疑問,對于CASE比DECODE效率高這種說法倒是第一次看到,印象中DECODE效率很高,應該不會比CASE的效率差。 到底效率如何,還是要具體的實例來說: SQL> CREATE TABLE T AS 2 SELECT A.* 3 FROM DBA_OBJECTS A, DBA_MVIEWS; Table created. SQL> SELECT COUNT(*) FROM T; COUNT(*) ---------- 6075760 下面檢查DECODE和兩種CASE語句的效率: SQL> SET ARRAY 1000 SQL> SET TIMING ON SQL> SET AUTOT TRACE SQL> SELECT DECODE(OWNER, 'SYSTEM', 'SYSTEM', 'SYS', 'SYSTEM', 'USER') 2 FROM T; 6075760 rows selected. Elapsed: 00:00:07.24 Execution Plan ---------------------------------------------------------- Plan hash value: 1601196873 -------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 4245K| 68M| 13828 (1)| 00:03:14 | | 1 | TABLE ACCESS FULL| T | 4245K| 68M| 13828 (1)| 00:03:14 | -------------------------------------------------------------------------- Note ----- - dynamic sampling used for this statement Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 47551 consistent gets 0 physical reads 0 redo size 46288564 bytes sent via SQL*Net to client 67317 bytes received via SQL*Net from client 6077 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 6075760 rows processed
SQL> SELECT CASE OWNER WHEN 'SYSTEM' THEN 'SYSTEM' 2 WHEN 'SYS' THEN 'SYSTEM' 3 ELSE 'USER' END 4 FROM T; 6075760 rows selected. Elapsed: 00:00:07.22 Execution Plan ---------------------------------------------------------- Plan hash value: 1601196873 -------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 4245K| 68M| 13828 (1)| 00:03:14 | | 1 | TABLE ACCESS FULL| T | 4245K| 68M| 13828 (1)| 00:03:14 | -------------------------------------------------------------------------- Note ----- - dynamic sampling used for this statement Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 47551 consistent gets 0 physical reads 0 redo size 46288578 bytes sent via SQL*Net to client 67317 bytes received via SQL*Net from client 6077 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 6075760 rows processed
SQL> SELECT CASE WHEN OWNER = 'SYSTEM' THEN 'SYSTEM' 2 WHEN OWNER = 'SYS' THEN 'SYSTEM' 3 ELSE 'USER' END 4 FROM T; 6075760 rows selected. Elapsed: 00:00:07.23 Execution Plan ---------------------------------------------------------- Plan hash value: 1601196873 -------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 4245K| 68M| 13828 (1)| 00:03:14 | | 1 | TABLE ACCESS FULL| T | 4245K| 68M| 13828 (1)| 00:03:14 | -------------------------------------------------------------------------- Note ----- - dynamic sampling used for this statement Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 47551 consistent gets 0 physical reads 0 redo size 46288585 bytes sent via SQL*Net to client 67317 bytes received via SQL*Net from client 6077 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 6075760 rows processed
我們在學習數據庫的時候經常用到數據庫的查詢語句,它的重要性可想而知,下面我就來分析一下吧。 - txtSQL = "select*from student_Info where student_ID='" & Trim(txtSID.Text) & "'"
-
-
-
- Set mrc = executeSQL(txtSQL, MsgText)
select * from student_Info 這句是查詢表 student_Info where student_ID = '" & Trim(txtSID.Text) & "'" 這句是篩選條件 其中Trim()是去前后空格,txtSID.Text這個控件上輸入的值。 student_ID等于你控件上輸入的值。 ExecuteSQL(txtSQL, MsgText) 很明顯是執行SQL。 ExecuteSQL是自定義函數。 傳遞參數SQL傳遞查詢語句,MsgString傳遞查詢信息。自身以一個數據集對象的形式返回 。 一定是執行SQL語句,里面的兩個參數 txtSQL 是指 用來執行的SQL語句 比如:elect * from 表 MsgText參數 指的是實行完SQL語句后的彈出框 是成功了還是失敗了之類的
第一句的意思就是:查詢學生信息表,篩選出學生ID號為txtSID.Text的學生。 第二句的意思是:執行sql語句,并把MsgText作為參數傳遞進去,返回一個set類型的數據。 舉列: 假如我把我們班的所有的同學排成一列,站在第一位的號碼是1,排在1后面的號碼為2,以此類推。 第一句sql的意思就是:我現在找到一個同學李四,然后告訴他讓他把號碼是5的同學給找出來。 那么這個同學就會從1數到5,就把號碼是5的同學給找了出來。txtSQL就相當于李四。 但是數據庫的sql查詢時通過索引查詢的,在數據庫中不是通過1,2,3,4,5數到5才找到的。而是通過索引直接找到的。 舉例: 我找的這個同學手里會有一個名單,每個名字前都有學號。直接叫學號對應的名字,這個人就被找到了。 這個學號就相當于索引。 我要從student_info里面找人,但是,這個人的ID必須是txtSID.Text 例如:我從5年級1班的86個人中找人,我只找一個,這個人的名字叫張三(txtSID.Text)
在做學生管理系統中,由于并不太理解函數的意思,前幾天就在程序的后面多寫了兩個0 <span style="font-family:KaiTi_GB2312;font-size:18px;">Private Sub MDIForm_Load() '從注冊表中取得上次關閉MDIForm時的大小 Me.Left = GetSetting(App.Title, "Settings", "MainLeft", 30000) Me.Top = GetSetting(App.Title, "Settings", "MainTop", 30000) Me.Width = GetSetting(App.Title, "Settings", "MainWidth", 80000) Me.Height = GetSetting(App.Title, "Settings", "MainHeight", 80000) End Sub </span>
當時并沒有做任何記錄,異地訪問的過程當中,數據庫能連上是沒有任何問題,但是就是加載的登錄界面就消失了,沒有任何反應、提示錯誤之類的,后來在師傅的指導下,才發現這個問題,是由于多了兩個0,是窗體的大小不能顯示出來了,超出了屏幕的顯示范圍。我還以為真的消失了呢? 發現自己的問題:第一:沒有及時的記錄 第二:沒有遵循嚴格的編程標準 第三:沒有及時的學習相關的知識 第四:思考的還是太少,考慮不全,“為人民服務的宗旨”落實的不好 隨后進行了相關知識的學習
VB之savesetting|GetSetting用法(保存與索取數據)
VB 中提供了用于訪問注冊表的方法
GetSetting 函數, 從 Windows 注冊表中的應用程序項目返回注冊表項設置值。SaveSetting 語句, 在 Windows 注冊表中保存或建立應用程序項目。
DeleteSetting 語句, 在 Windows 注冊表中,從應用程序項目里刪除區域或注冊表項設置。
GetAllSettings 函數, 從 Windows 注冊表中返回應用程序項目的所有注冊表項設置及其相應值(開始是由 SaveSetting 產生)。
諸如窗口位置、使用的文件以及其它項目等程序設置值是存儲在各種 .ini 文件中。在 Windows NT、Windows 95 以及 Windows 的較新版本中,這些程序設置值則是存儲在系統注冊位置中。
Visual Basic 提供了一個標準的注冊位置以存儲創建于 Visual Basic 的應用程序的程序信息:
HKEY_CURRENT_USER\Software\VB and VBA Program Settings\appname\section\key
GetSetting 函數 從 Windows 注冊表中的應用程序項目返回注冊表項設置值。語法GetSetting(appname, section, key[, default])GetSetting 函數的語法具有下列命名參數:部分描述appname必要。字符串表達式,包含應用程序或工程的名稱,要求這些應用程序或工程有注冊表項設置。section必要。字符串表達式,包含區域名稱,要求該區域有注冊表項設置。key必要。字符串表達式,返回注冊表項設置的名稱。default可選。表達式,如果注冊表項設置中沒有設置值,則返回缺省值。如果省略,則 default 取值為長度為零的字符串 ("")。說明如果 GetSetting 的參數中的任何一項都不存在,則 GetSetting 返回 default 的值。 該方法其實讀取,注冊表中HKEY_CURRENT_USER\Software\VB and VBA Program Settings下相應的值。 ------------------------------------ 語法 GetSetting(appname, section, key[, default]) GetSetting 函數的語法具有下列命名參數: 部分 描述 appname 必要。字符串表達式,包含應用程序或工程的名稱,要求這些應用程序或工程有注冊表項設置。 section 必要。字符串表達式,包含區域名稱,要求該區域有注冊表項設置。 key 必要。字符串表達式,返回注冊表項設置的名稱。 default 可選。表達式,如果注冊表項設置中沒有設置值,則返回缺省值。如果省略,則 default 取值為長度為零的字符串 ("")。 說明 如果 GetSetting 的參數中的任何一項都不存在,則 GetSetting 返回 default 的值。
在上一遍文章中我們說了VB中基于ADO的數據庫訪問,接下來讓我們一起來看一下ADO的七個對象,其中我們會重點講述Command和Recordse兩個對象。 我們先通過下面這張圖對ADO的七個對象有一個大概的了解: ![計算機生成了可選文字: 非獨立對象+l錯公吳才,J象,依性連接對象。保存訪問數據庫過程中發生的錯誤,可以通免應用程序意外終止ErrorConneCtion連接對象,用于創建數據深連接。,一‘贊何數據庫操作的革礎’ACtiy6C0nnC6tion睜.-J'.,參數對象,依假于命令對象.用于為參數查詢提供數據。同時使用參斂對象和命令對象,可使數據庫對查詢進行預編譯,從而提高執行速度Act腸廿eConned.on屬忖p己r己nleter鹿卜Command命令對象用于執行動作查詢、、‘電滬z產:.:'-、,甘魷。協.方法碑子護戶一夕護,戶戶l字段對象,依枚于記錄集對象。獲得記錄染中的每一個字段的伯息FieldReCOrdset記錄集對象。保存來自葵本表或命令對象返lr.]的結果。使用記錄集對象幾乎可以完成所有的數據操作屬性對象,除了Error錯誤對象以外,拼一個對象都有。可以訪問特定對象的主要伯息Property甲](http://my.csdn.net/uploads/201207/26/1343294616_5090.png) 從圖中的關系線以及我們可以看出,當我們通過Connection對象與數據源建立連接以后,既可以通過Recordset對象對數據進行操作,也可以通過Command命令對象來執行查詢,然后在傳送給Recordset對象進行數據操作。 下面我們先說Recordset對象: 
例如: - Dim objCn As New Connection Dim objRs As New Recordset
- Dim strCn As String
- Dim strSQL As String
- '建立數據庫連接
- objCn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
- "Data Source=" & App.Path \實例1.mdb"
- objCn.Open
- '執行查詢命令,獲得用戶登錄口令
- strSQL = "SELECT 口令,身份 FROM 系統用戶 WHERE 用戶名='" & UserName & "'"
- Set objRs.ActiveConnection = objCn
- objRs.Open (strSQL)
- With objRs '創建客戶端的記錄集
- .CursorLocation = adUseClient '指定使用客戶端光標
- .CursorType = adOpenStatic '指定使用靜態光標
- .Open "系統用戶", objCn, adOpenStatic, adLockReadOnly
- End With
- ShowData (lngPage) '顯示當前記錄頁數
我們來說一下Command對象: 使用Command對象之前,我們需要執行一下步驟: 1.通過設置ActiveConnection屬性是打開的連接與Command對象關聯。 2.使用CommandText屬性定義命令(如SQL,儲存過程)的可執行文本。 3.使用commandType屬性指定命令類型。通過Parameter對象和Parameters集合定義參數化查詢或存儲過程參數。 4.使用Execute方法執行命令并在適當的時候返回Recordset對象 5.使用 CreateParameter方法創建一個與命令相關的新的參數對象。 6.將Command對象傳遞給Recordset的Source屬性以便獲得數據。 具體實現: - Private Sub Form_Load()
- Dim strcn As String
- Set objCn = New Connection
- strcn = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;" & "Data Source=" & App.Path & "\實例5.mdb"
- objCn.ConnectionString = strcn
- objCn.Open
-
- '創建執行參數查詢的command 對象 objcmd
-
- Set objCmd = New Command
- Set objCmd.ActiveConnection = objCn '創建連接
-
- With objCmd
- .CommandText = "select * from 系統用戶 where 用戶名 like ?" & "and 身份 like ?"
- '定義命令的可執行文本
- .CommandType = adCmdText '指定命令類型
- End With
- '為command對象創建參數
- Dim parm As New Parameter
- Set parm = objCmd.CreateParameter("用戶名", adVarChar, adParamInput, 10)
- objCmd.Parameters.Append parm
- Set parm = objCmd.CreateParameter("身份", adVarChar, adParamInput, 10)
- objCmd.Parameters.Append parm
- et objRs = New Recordset
-
-
- objCmd("用戶名") = "%" & Trim(txtUserName) & "%" '%是什么意思???
-
-
- objCmd("身份") = "%" & txtStatus & "%"
-
- Set objRs = objCmd.Execute() '返回recordset對象
- lbl4 = ""
- End Sub
我們還可以在一個Recordset對象實體中使用command對象: - Set cmd.ActiveConnection = cn
- cmd.CommandText = strSql
- cmd.CommandType = adCmdText
- rs.Open cmd, , adOpenStatic, adLockOptimistic
今天在QQ上看到姐的留言,說爸媽吵架了。我以為當孩子都大了,而孫子也都好幾歲了,他們也該消停消停了吧。 也許至少在這幾年里我沒有看到過他們吵過架,在我很小的時候,吵架是常有的事,有一次我印象很深刻, 媽媽出走了,好幾天找不到,我被帶到舅舅家,那時的我哭著喊著,一個幾歲的孩子,任何人都拿我沒辦法。 我也知道,這給我造成了心理上的傷害,我很害怕。 漸漸的長大了,自己也談了戀愛,我們也是偶爾的會鬧矛盾,有時候也會吵。也慢慢的明白了,這個世界本來 就是這樣的,沒有永久的和諧,但我只是希望,這只是生活中的一段小插曲而已,希望它會慢慢的褪去。 如今我一人在北京,一年半了,只過年的時候回去過一次,姐說想讓我回家一趟,當看到親人這樣要求的時候, 我不知道該如何,是無奈還是愧疚。 為了生活,我失去了很多,曾經我希望,是無牽無掛的。曾經我夢想,是無憂無慮的。 可這一切看來,我們不可能獨善其身,總有想念的人,總有要做的事,總有我們無法釋懷的,總有我們不得不做出選擇的。 一年前為了夢想來到北京,我以為這里是一個新的開始,離開了家的束縛,我以為在這里我可以找到快樂,逃脫了家的悶悶不樂。 我以為...而這僅僅只是我以為。現在什么都變了。 我有大大的夢想,但我深知,那實現不了。我只是把它銘記在心中。 現在我只想要簡簡單單的生活,不需要轟轟烈烈,不需要哭哭啼啼。 這半年來一直想找個理由辭去工作,去過一段真正屬于自己的生活,每隔一段時間我都會定一個日期,"那一天就是我離開的日子" 可每次都艱難的度過了那個我認為的末日,我的身體很累,而現在心也要累了,一直矛盾著,我留下來的唯一理由也許就是為了糊口, 等有一天我足夠承受生活的時候,也許我該走了。 我怕我做不到。當周末真正來臨的時候, 突然我變的手足無措了,不知道干什么,所以我害怕,當我真正的自由的時候,也許就該頹廢了。 我也一直在堅持,哪怕一天。 每天清晨起床的時候,就心想,還好,我還有工作,我還有事情可以做。
此處用的是CheckboxTreeViewer 和treeview大同小異 首先獲得Point tree.addMouseListener(new MouseListener() { @Override public void mouseUp(MouseEvent e) { } @Override public void mouseDown(MouseEvent e) { point = new Point(e.x, e.y); } @Override public void mouseDoubleClick(MouseEvent e) { } }); 其次根據point獲得TreeItem 再變色 tv.addCheckStateListener(new ICheckStateListener() { public void checkStateChanged(CheckStateChangedEvent event) { // If the item is checked . . . TreeItem ti = tree.getItem(point); // 也可以不用point // TreeItem ti = ((TreeItem) tv.testFindItem(event.getElement())); if (event.getChecked()) { tv.setSubtreeChecked(event.getElement(), true); ti.setBackground(0, Display.getCurrent().getSystemColor(SWT.COLOR_RED)); //獲得當前行的第一列 并設置RED色 } else { tv.setSubtreeChecked(event.getElement(), false); ti.setBackground(0, Display.getCurrent().getSystemColor(SWT.COLOR_CYAN)); //獲得當前行的第一列 并設置CYAN色
} } });
溝通是當今世界必可或缺能力之一.如何讓別人更能了解自己?很簡單.只要肯張開你的嘴巴即可. 張開你的嘴巴,愿意讓別人了解自己,這樣,自己就不會感覺孤獨. 人的需求,總結起來,基本都一樣.正如馬斯洛把人的需求分為七個層次,形成一個金字塔.從最低到最上面分別是:生理需求,安全需求,歸屬于愛的需求,尊重的需求,認識的需求,審美的需求,自我實現的需求.金字塔形狀從下往上,逐漸變窄.說明越往上做到的人不多.生理需求基本上大家都能夠解決,處于吃飽不餓的狀態.但是越往上,溝通越重要. 感情無論是親情,友情還是愛情,情情重要,情情要溝通. 血濃于水的親情 當談論各種感情的時候,想必大家都會把親情排在首位.是呢.也許在你最快樂的時候,你想不到與家人分享.但是當你在最痛苦最悲傷的時候,是誰給你力量挺過來,又是誰默默無私不求任何回報的支持你奉獻著他自己?是親情,是一輩子都不能忘懷的蒼老的爸媽. 但是親情也是需要不斷溝通,讓他們了解你的內心的想法,同時也可以多多了解了解他們的辛酸,他們的不容易. 若是父子之間多溝通,也不會產生過激的矛盾,也不會產生父子反目成仇,最終釀成不堪的后果.這樣,孩子多多理解父母,父母多多理解孩子. 感激一生師生情 對于我們每個人來說,在我們從頑皮稚童到青澀少年再到風華正茂的生命歷程中,老師是值得我們感恩的人和尊重的人.雖是一把燭火,卻燃盡自己,照亮別人. 老師,您是大橋,為我們連接被割斷的山巒,讓我們走向收獲的峰巔;您是青藤,堅韌而修長,指引我們采擷到崖頂的靈芝和人參。當苗兒需要一杯水的時候,絕不送上一桶水;而當需要一桶水的時候,也絕不給予一杯水。適時,適量地給予,這是一個好園丁的技藝。 但是老師的職責不僅僅是教書,最為關鍵的在于是分析學生的內心狀態。每個學生,因為家庭環境,生活環境不同造成性格心態不同,所以,學生的性格心態,都是需要老師來分析的.再說,學生的性格,也不能一槌定音,不能因一面而斷定怎么怎么,其實,接觸的人不同,表現的性格肯定有所不同而已。正所謂到什么山唱什么歌一樣。若是都一樣,豈不是被人笑話。即使一個整天活潑開朗嘻嘻哈哈的人到一個陌生人面前,肯定一開始是文文靜靜的,隨后不斷交流,才會逐漸表現其外向的性格。但是不能第一面文靜就斷定這個人是內向,不愛說話什么的吧。那樣的話,是不是太武斷,對此人有點不公平?并且人的性格也是隨環境不斷變化的,正所謂沒有一成不變的,變才是真正不變的。所以人的性格心思,貌似很難猜透哦,不夠大體了解,已經很可以了。并且男女差異也蠻大的,男孩子還是相對于可以吧。畢竟社會對其要求甚大,所以胸懷也相對于強大。 時刻了解學生的動態,對癥下藥.現在時代是如此開發,只靠靜態觀察揣摩是遠遠不夠,必須進行時時交流溝通,這樣才能做到因材施教. 純凈似水的友情 我很難想象沒有朋友的日子,也很難想象沒有[朋友的人.正如一位名人所言,沒有朋友的天空是黑暗的.我的世界里也堅決不能沒有朋友.沒有朋友的日子是孤獨的,沒有訴說的對象是痛苦的,沒有談心的知己是傷不起的呀. 但是,朋友之間也是需要時常聊天,保持聯系的呀.為什么有些人的qq動態一直提示,有事沒事經常聯系,曾經再好的朋友,也是需要時常慰問的,再好的友誼也是需要不斷維持的.若是N久不聯系,再好的朋友之間也會產生一種說不出來的別扭.所以逢年過節,發個短信,打個電話問候一聲.其實費不了多長時間,費不了多少錢.朋友是買不來的,純潔的友誼是拿俗氣的金錢換不回來的,所以不必在乎那一條短信,三四分鐘的電話聊天. 在我的生命中,朋友是不可或缺的.對待朋友,以一種真誠的態度對待.我相信,你對他如何,將來他也對你如何.朋友多了,路好走.走的舒心,走的心情舒暢,精神爽了,吃啥啥香,干啥啥行.
|
|
|
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
---|
24 | 25 | 26 | 27 | 28 | 29 | 30 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 1 | 2 | 3 | 4 |
|
導航
統計
- 隨筆: 17
- 文章: 0
- 評論: 10
- 引用: 0
常用鏈接
留言簿
隨筆檔案
搜索
最新評論

閱讀排行榜
評論排行榜
|
|