world_eyes

          記錄點滴的地方

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            10 隨筆 :: 3 文章 :: 1 評論 :: 0 Trackbacks

          2009年1月17日 #

            在Android的應用程序開發中,通常使用的是Java語言,除了要熟悉Java語言的基礎外,還需要了解Android提供的Java擴展功能。

          一、重要包描述

          Android.app:提供高層的程序模型、提供基本的運行環境。

          Android.content:包含對各種的設備上的數據進行訪問和發布的類。

          Android.database:通過內容提供者瀏覽和操作數據庫。

          Android.graphics:底層的圖形庫,包含畫布、顏色過濾、點、矩形,可以將它們直接繪制到屏幕上。

          Android.location:定位和服務的相關類。

          Android.media:提供了一些管理音頻視頻的媒體接口的相關類。

          Android.net提供了關于網絡訪問的類,超過通常的java.net.*接口。

          Android.os:提供了系統服務,消息傳輸,IPC機制。

          Android.opengl:提供了OpenGL的工具。

          Android.provider:提供類訪問Android的內容提供者。

          Android.telephony:提供與撥打電話相關的API交互

          Android.view:提供基本的用戶界面接口框架。

          Android.util:涉及工具性的方法,例如時間日期型的操作。

          Android.webkit:默認瀏覽器操作接口。

          Android.widget:包含各種U元素,在應用程序的屏幕中使用。

          二、Android的相關文件類型概述

          Java文件---應用程序源文件

          Android的應用必須使用Java來開發。

          Class文件---Java編譯后的目標文件。

          不想J2SE,java編譯成class文件就直接可以運行,Android平臺上的class 文件不能直接在Android平臺上運行。由于google使用了自己的Dalvik來運行應用,所以這里的class也肯定不能在Android Dalvik上運行,Androidclass文件實際上只是編譯過程的中間目標文件,需要鏈接成Dex文件才能運行在Dalvik上。

          Dex文件---Android平臺上的可執行文件。

          Dalvik執行的并非是Java字節碼,而是另一種字節碼:dex格式的字節碼(Java字節碼->dex字節碼)。Dalvik可以執行許多VM而不會占用太多的Resource.

          APK 文件---Android上的安裝文件

          APKAndroid安裝包的擴展名,一個Android安裝包包含了與某個應用程序相關的所有文件,APK文件將AndroidMainfest.xml文件、應用程序代碼(DEX)文件、資源文件和其他文件打成一個壓縮包。一個工程只能打進一個.apk文件。

           

          三、Android ADB工具的使用

          ADBAndroid提供的一個通用調試工具,借助這個工具,我們管理手機模擬器的狀態。

          1.ADB功能操作

          快速更新設備或手機模擬器的代碼,如應用或Android系統升級。

          在設備上運行shell命令

          管理設備或手機模擬器上的預定接口

          在設備或手機模擬器上復制、粘貼文件

          2.ADB的常用操作

          安裝應用到模擬器

          adb install app.apk

          Android沒有提供一個卸載應用的命令,只能手動刪除:

          Adb shell

          Cd data/app

          Rm.app.apk

          進入設備或模擬器的shell

          Adb shell

          通過以上命令,可以進入設備或模擬器的shell環境中,在這個shell中,你可以執行各種Linux的命令,另外如果只想執行一條shell命令,可以采用以下方式:

          Adb shell[command]

          如:

          Adb shell emesg

          會打印出內核的調試信息

          發布端口

          可以設置任意的端口號,作為主機箱模擬器或設備的請求端口。如:

          Adb forward tcp 5555 tcp8000

          復制文件

          復制一個文件或目錄到設備或模擬器上;

          Adb push

          如:

          Adb push test.txt/tmp/test.txt

          Adb pull

          如:

          Adb pull /Android/lib/libwebcore.os

          搜索/等待模擬器、設備實例

          取得當前運行的模擬器、設備的實例列表及每個實例的狀態或等待正在運行的設備

          Adb devices 

          Adb wait-for-device

          查看debug報告

          Adb bugreport

          記錄無線通信日志

          無線通信日志非常多,在運行時沒必要記錄,可以通過命令設置記錄

          Adb shell

          Logcat -b radio

          獲取設備ID和序列號

          Adb get-product 

          Adb get-serialno

          訪問數據庫SQLite3

          Adb shell

          Sqlite3

          posted @ 2011-03-09 10:25 world_eyes 閱讀(351) | 評論 (0)編輯 收藏

          轉載來的,遇到這樣問題的朋友應該不多,我是配置好環境了,也裝了個PHP的CMS測試過了,PHPMYADMIN運行也正常,但是運行另外一套 PHP網站程序就出現HTTP 500服務器內部錯誤,還好找到了解決辦法!

          感謝Oliver分享,原文 地址:http://tech.flyingcat.cn/?p=212

          在IIS + PHP的環境下安裝phpmyadmin或wordpress的時候經常會發生一個奇怪的現象,例如:phpmyadmin安裝的web文件夾根目錄的話 打開顯示HTTP 500服務器內部錯誤,但將網站放到一個子目錄下就沒問題。
          這個問題的原因在于phpmyadmin和wordpress等程序的index.php文件中都用到了require(./xxx.php)這樣的語 句。

          解決辦法1
          把里面的require(./xxx.php)改成 require(xxx.php)。

          解決辦法2
          給網站的上級目錄賦予iis用戶讀權限。

          posted @ 2010-06-08 10:19 world_eyes 閱讀(8789) | 評論 (1)編輯 收藏

          經常有朋友在安裝某種小軟件后,IE主頁被篡改,而你在ie選項里改回來后,再打開又時主頁又變成了另外一個網址。這說明這個流氓軟件在注冊表里還 有別的 窠,這些可能位置都有哪些呢?我們根據有限經驗,先列出最重要的這幾條,期待朋友們補充更多的發現。點擊開始-運行-輸入regedit回車,依次找到如 下位置——當然,筆者推薦使用Registry Workshop軟件,可以直接粘 貼以下地址回車,并將該地址添加到收藏夾,以后舊的不用再找,新的也可見者收藏。

          1、internet選項對應的注冊表值:

          HKEY_CURRENT_USERSoftwareMicrosoftInternet ExplorerMainStart Page

          這項的值和ie選項里的主頁是同步的,可以先試試。convert swf to avi

          2、綁定ie主程序運行參數:

          HKEY_CLASSES_ROOTApplicationsiexplore.exeshellopencommand

          這項的正常值是”C:Program FilesInternet ExplorerIEXPLORE.EXE” %1,流氓軟件將自己的網址附加在后面當作一個運行參數,那么打開ie主程序時就會自動跳轉到該網址,這招夠狠。

          3、 綁定ie窗體控件ieframe.dll主頁命令:

          HKEY_CLASSES_ROOTCLSID{871C5380-42A0-1069-A2EA-08002B30309D}shellOpenHomePageCommand

          這項的默認值是”C:Program FilesInternet Exploreriexplore.exe”,同樣,流氓網址可能附加在后面,攔截主頁。

          4、綁定ie快捷方式運行目標:

          還有一種在注冊表里無論如何也搜索不到,卻遠在天邊近在眼前的手段,就是修改了ie 快捷方式屬性里的運行目標。注意是快捷方式,不是桌面默認顯示的ie圖標。正常的ie快捷方式有四種

          可以看出上面三個ie快捷方式依次是由桌面ie圖標創建、由開始菜單頂端ie圖標創建、由系統盤ie主程序創建的(當然如果你隱藏了擴展名,第三個 快捷 方式就沒有.exe后綴),flv player 第四種是在開始按鈕右邊快速啟動欄上的“啟動Internet Explorer”圖標。右鍵查看這些快捷方式屬性

          筆者快速啟動欄已刪除啟動ie的圖標,擱筆追思,遠求而來,故上面窗口略顯異域。這兩個 快捷方式,目標默認值都是”C:Program FilesInternet Exploreriexplore.exe”,這下病毒又有空可鉆了,只要把自己的網址追加到后面,那么你經這個圖標打開ie時,就會立即跳到它的網 址,真是無所不用其極。

          所以筆者建議,如果主頁被篡改并改不回來了,請先右鍵你 啟動ie時所打開的快捷方式,看屬性“目標”后面有無追加網址,有則刪之;不行的話就去注冊表里查看那些可能位置:

          HKEY_CURRENT_USERSoftwareMicrosoftInternet ExplorerMainStart Page
          HKEY_CLASSES_ROOTApplicationsiexplore.exeshellopencommand
          HKEY_CLASSES_ROOTCLSID{871C5380-42A0-1069-A2EA-08002B30309D}shellOpenHomePageCommand

          看值的后面有沒有“尾巴”,這些網址有時可能是亂碼,全部剪掉,swf to mov回 復默認值,主頁就改回來 了。這樣只是暫時堵住,若想徹底杜絕,請先卸載新安裝的流氓軟件,以后也莫亂逛網站或接受推薦下載安裝那些你以為是發現新天地其實可 能早已臭名昭著的小流氓。當然,如果你熟悉了更多的篡改主頁伎倆,就不用有這些顧慮了。筆者再次推薦注冊表管理軟件Registry Workshop,平時多積累自己的 發現,保持“與毒俱進”,將病毒流氓的伎倆盡收囊中。那么以后就可以高枕無憂了。

          posted @ 2010-06-04 18:04 world_eyes 閱讀(382) | 評論 (0)編輯 收藏

               Tomcat下,不同的二級域名,Session默認是不共享的,因為Cookie名稱為JSESSIONID的Cookie根域是默認是沒設置的,訪問 不同的二級域名,其Cookie就重新生成,而session就是根據這個Cookie來生成的,所以在不同的二級域名下生成的Session也不一樣。 找到了其原因,就可根據這個原因對Tomcat在生成Session時進行相應的修改(注:本文針對Tomcat 6.0)。

               單個web項目運行在tomcat上但是卻使用多個子域名,如:

           - site.com
           - www.site.com
           - sub1.site.com
           - sub2.site.com
           - etc.

           

          這樣會導致session的不能共享,在網絡上查找的并卻最快的解決辦法。

           

          解決辦法:

          Usage:
           - compile CrossSubdomainSessionValve & put it in a .jar file
           - put that .jar file in $CATALINA_HOME/lib directory
           - include a <Valve className="org.three3s.valves.CrossSubdomainSessionValve"/> in
          $CATALINA_HOME/conf/server.xml

          package org.three3s.valves;

          import java.io.*;

          import javax.servlet.*;
          import javax.servlet.http.*;

          import org.apache.catalina.*;
          import org.apache.catalina.connector.*;
          import org.apache.catalina.valves.*;
          import org.apache.tomcat.util.buf.*;
          import org.apache.tomcat.util.http.*;

          /**
           * <p>
           * Replaces the domain of the session cookie generated by Tomcat with a domain
           * that allows that session cookie to be shared across subdomains. This valve
           * digs down into the response headers and replaces the Set-Cookie header for
           * the session cookie, instead of futilely trying to modify an existing Cookie
           * object like the example at 
          http://www.esus.be/blog/?p=3. That approach does
           * not work (at least as of Tomcat 6.0.14) because the
           * <code>org.apache.catalina.connector.Response.addCookieInternal</code> method
           * renders the cookie into the Set-Cookie response header immediately, making
           * any subsequent modifying calls on the Cookie object ultimately pointless.
           * </p>
           * 
           * <p>
           * This results in a single, cross-subdomain session cookie on the client that
           * allows the session to be shared across all subdomains. However, see the
           * {
          @link getCookieDomain(Request)} method for limits on the subdomains.
           * </p>
           * 
           * <p>
           * Note though, that this approach will fail if the response has already been
           * committed. Thus, this valve forces Tomcat to generate the session cookie and
           * then replaces it before invoking the next valve in the chain. Hopefully this
           * is early enough in the valve-processing chain that the response will not have
           * already been committed. You are advised to define this valve as early as
           * possible in server.xml to ensure that the response has not already been
           * committed when this valve is invoked.
           * </p>
           * 
           * <p>
           * We recommend that you define this valve in server.xml immediately after the
           * Catalina Engine as follows:
           * 
           * <pre>
           * &lt;Engine name=&quot;Catalina&quot;&gt;
           *     &lt;Valve
           * className=&quot;org.three3s.valves.CrossSubdomainSessionValve&quot;/&gt;
           * </pre>
           * 
           * </p>
           
          */
          public class CrossSubdomainSessionValve extends ValveBase {
              
          public CrossSubdomainSessionValve() {
                  
          super();
                  info 
          = "org.three3s.valves.CrossSubdomainSessionValve/1.0";
              }

              @Override
              
          public void invoke(Request request, Response response) throws IOException, ServletException {
                  
          // this will cause Request.doGetSession to create the session cookie if
                  
          // necessary
                  request.getSession(true);

                  
          // replace any Tomcat-generated session cookies with our own
                  Cookie[] cookies = response.getCookies();
                  
          if (cookies != null) {
                      
          for (int i = 0; i < cookies.length; i++) {
                          Cookie cookie 
          = cookies[i];
                          
          // System.out.println("CrossSubdomainSessionValve: Cookie name is "
                          
          // + cookie.getName());
                          if (Globals.SESSION_COOKIE_NAME.equals(cookie.getName())) replaceCookie(request, response, cookie);
                      }
                  }

                  
          // process the next valve
                  getNext().invoke(request, response);
              }

              
          /**
               * Replaces the value of the response header used to set the specified
               * cookie to a value with the cookie's domain set to the value returned by
               * <code>getCookieDomain(request)</code>
               * 
               * 
          @param request
               * 
          @param response
               * 
          @param cookie
               *            cookie to be replaced.
               
          */
              
          protected void replaceCookie(Request request, Response response, Cookie cookie) {
                  
          // copy the existing session cookie, but use a different domain
                  Cookie newCookie = new Cookie(cookie.getName(), cookie.getValue());
                  
          // System.out.println("CrossSubdomainSessionValve: CookiePath is " +
                  
          // cookie.getPath());
                  if (cookie.getPath() != null) newCookie.setPath(cookie.getPath());
                  String domain 
          = getCookieDomain(request);
                  
          if (!".piaoyoo.com".equals(domain)) domain = request.getServerName();
                  
          // System.out.println("CrossSubdomainSessionValve: CookieDomain is " +
                  
          // domain);
                  newCookie.setDomain(domain);
                  newCookie.setMaxAge(cookie.getMaxAge());
                  newCookie.setVersion(cookie.getVersion());
                  
          // System.out.println("CrossSubdomainSessionValve: CookieComment is " +
                  
          // cookie.getComment());
                  if (cookie.getComment() != null) newCookie.setComment(cookie.getComment());
                  newCookie.setSecure(cookie.getSecure());

                  
          // if the response has already been committed, our replacement strategy
                  
          // will have no effect
                  if (response.isCommitted()) System.out.println("Error CrossSubdomainSessionValve: response was already committed!");

                  
          // find the Set-Cookie header for the existing cookie and replace its
                  
          // value with new cookie
                  MimeHeaders headers = response.getCoyoteResponse().getMimeHeaders();
                  
          for (int i = 0, size = headers.size(); i < size; i++) {
                      
          if (headers.getName(i).equals("Set-Cookie")) {
                          MessageBytes value 
          = headers.getValue(i);
                          
          if (value.indexOf(cookie.getName()) >= 0) {
                              StringBuffer buffer 
          = new StringBuffer();
                              ServerCookie.appendCookieValue(buffer, newCookie.getVersion(), newCookie.getName(), newCookie.getValue(),
                                      newCookie.getPath(), newCookie.getDomain(), newCookie.getComment(), newCookie.getMaxAge(), newCookie
                                              .getSecure());
                              
          // System.out.println("CrossSubdomainSessionValve: old Set-Cookie value: "
                              
          // + value.toString());
                              
          // System.out.println("CrossSubdomainSessionValve: new Set-Cookie value: "
                              
          // + buffer);
                              
          // System.out.println("-----------------------------");
                              value.setString(buffer.toString());
                          }
                      }
                  }
              }

              
          /**
               * Returns the last two parts of the specified request's server name
               * preceded by a dot. Using this as the session cookie's domain allows the
               * session to be shared across subdomains. Note that this implies the
               * session can only be used with domains consisting of two or three parts,
               * according to the domain-matching rules specified in RFC 2109 and RFC
               * 2965.
               * 
               * <p>
               * Examples:
               * </p>
               * <ul>
               * <li>foo.com => .foo.com</li>
               * <li>www.foo.com => .foo.com</li>
               * <li>bar.foo.com => .foo.com</li>
               * <li>abc.bar.foo.com => .foo.com - this means cookie won't work on
               * abc.bar.foo.com!</li>
               * </ul>
               * 
               * 
          @param request
               *            provides the server name used to create cookie domain.
               * 
          @return the last two parts of the specified request's server name
               *         preceded by a dot.
               
          */
              
          protected String getCookieDomain(Request request) {
                  String cookieDomain 
          = request.getServerName();
                  String[] parts 
          = cookieDomain.split("\\.");
                  
          if (parts.length >= 2) cookieDomain = parts[parts.length - 2+ "." + parts[parts.length - 1];
                  
          return "." + cookieDomain;
              }

              
          public String toString() {
                  
          return ("CrossSubdomainSessionValve[container=" + container.getName() + ']');
              }
          }



          posted @ 2010-06-04 17:17 world_eyes 閱讀(1682) | 評論 (0)編輯 收藏


          一臺服務器幾乎所有網站打開網頁 甚至HTML網頁 都出現了

          <i*f*r*a*m*e src="http://xxx.xx.htm" height=0 width=0></<i*f*r*a*m*e>
          這種樣式的代碼 有的在頭部 有的在尾部 部分殺毒軟件打開會報毒

          打開HTML或ASP PHP頁面 在源碼中怎么也找不到這段代碼

          分析原因

          首先懷疑ARP掛馬,用防ARP的工具又沒有發現有arp欺騙

          而且arp欺騙一般不會每次都被插入代碼,而是時有時無

          而且使用http://127.0.0.1 或者http://localhost 訪問的時候也可以找到這段代碼

          arp欺騙的可能排除。

          然后就想到可能是JS被篡改,或者是其它的包含文件,查找后沒有發現被改的頁面 連新建的HTML頁面瀏覽的時候也會被插入這段代碼,那就只能是通過IIS掛上去的了。

          備份iis數據然后重裝iis,代碼消失,將備份的iis恢復,問題又來了。


          仔細尋找,問題應該出在IIS的配置文件上,打開配置文件,沒有發現那段代碼。

          那很有可能是調用了某個文件,這個怎么查啊,忽然想起了大名鼎鼎的Filemon

          本地載了一個上傳到服務器上,,打開Filemon,數據太多了,過濾掉一些沒有用的

          只留下iis的進程,數據還是很多,看來服務器上的站點還是挺多人在訪問的。

          關掉所有站點,建了一個測試站點anky 目錄為D:\www\ 在下面建了一個空白頁面test.htm

          訪問一下這個頁面代碼被插進來了,再看一下Filemon 奇怪怎么讀取C:\Inetpub\wwwroot\iisstart.htm

          打開C:\Inetpub\wwwroot\iisstart.htm一看,里面就躺著

          <<i*f*r*a*m*e src="http://xx.xxx.jj.htm" height=0 width=0></<i*f*r*a*m*e>

          把代碼刪除了留空,訪問test.htm 正常了,把C:\Inetpub\wwwroot\iisstart.htm刪除了再訪問

          test.htm 出現 “讀取數據頁腳文件出錯”問題就出這里了,看來是調用了

          這個文件。


          把C:\Inetpub\wwwroot\iisstart.htm清空就正常了,這樣怎么行,解決問題當然要連根拔掉。

          continue

          有沒有可能是擴展造成的,到擴展中檢查了一遍全部都是正常的

          當然 通過ISAPI 掛馬的也是存在的

          左想右想最后還是覺得配置文件有問題

          打開配置文件,配置文件在%windir%\system32\inetsrv\Metabase.xml

          用記事本打開,查找iisstart.htm 找到一行,開始以為是默認站點,后來一想不對啊

          默認站點都刪除了,再仔細一看這句代碼為

          DefaultDocFooter="FILE:C:\Inetpub\wwwroot\iisstart.htm"

          刪除掉這一行,問題徹底解決了。

          ==========================================================================
          現象:不管是訪問服務器上的任何網頁,就連404的頁面也會在<html>后加入
          <<i*f*r*a*m*e SRc=http://xxx.xxx.com/k.htm width=1 height=1 frameborder=0></<i*f*r*a*m*e>,掛馬的位置在html標記左右,上面這段惡意代碼,它會每隔幾秒 加入代碼,也就是說在輸出具體的東西之前就被掛了,有時有有時又沒有,不是網頁源代碼問題,也沒有在網頁源代碼中加入惡意代碼,即使重裝服務器,格式化重 分區過第一個硬盤,放上去網站沒多久一樣再會出現這種情況。


          首先就排除了網站被入侵的可能,因為首頁能加在那個位置只能是title的地方,用js控制也不大可能.然后去看了php.ini的設置也沒有任何的異 常,而且這個插入的代碼有的時候出現有的時候不出現,說明不是網站的問題了.打開同服務器的其他網站也有這個情況發生,而且狀況一一樣.檢查并且搜索掛馬 的關鍵字之后確定不是網站程序的問題.

          那么剩下的要么是IIS自己出了問題,要么是網絡的問題,因為數據是處理沒有問題(這個由程序輸出,而且即使是html都會出問題),經過一個一個排查, 最后基本可以確定就是arp欺騙欺騙數據報走向,然后中間人修改一些定義的關鍵字.因為是網絡層次有問題(所以重做系統是沒有用的).


          目的:通過arp欺騙來直接掛馬
          優點:可以直接通過arp欺騙來掛馬.

          通常的arp欺騙的攻擊方式是在同一vlan下,控制一臺主機來監聽密碼,或者結合ssh中間人攻擊來監聽ssh1的密碼.
          但這樣存在局限性:
          1.管理員經常不登陸,那么要很久才能監聽到密碼
          2.目標主機只開放了80端口,和一個管理端口,且80上只有靜態頁面,那么很難利用.而管理端口,如果是3389終端,或者是ssh2,那么非常難監聽 到密碼.

          優點:
          1.可以不用獲得目標主機的權限就可以直接在上面掛馬
          2.非常隱蔽,不改動任何目標主機的頁面或者是配置,在網絡傳輸的過程中間直接插入掛馬的語句.
          3.可以最大化的利用arp欺騙,從而只要獲取一臺同一vlan下主機的控制權,就可以最大化戰果.


          原理:arp中間人攻擊,實際上相當于做了一次代理。

          正常時候: A---->B ,A是訪問的正??蛻?B是要攻擊的服務器,C是被我們控制的主機
          arp中間人攻擊時候: A---->C---->B
          B---->C---->A
          實際上,C在這里做了一次代理的作用

          那么HTTP請求發過來的時候,C判斷下是哪個客戶端發過來的包,轉發給B,然后B返回HTTP響應的時候,在HTTP響應包中,插入一段掛馬的代碼,比 如<愛生活,愛貓撲>...之類,再將修改過的包返回的正常的客戶A,就起到了一個掛馬的作用.在這個過程中,B是沒有任何感覺的,直接攻擊 的是正常的客戶A,如果A是管理員或者是目標單位,就直接掛上馬了.

          什么是ARP?

          英文原義:Address Resolution Protocol 
          中文釋義:(RFC-826)地址解析協議 局域網中,網絡中實際傳輸的是“幀”,幀里面是有目標主機的MAC地址的。所謂“地址解析”就是主機在
          發送幀前將目標IP地址轉換成目標MAC地址的過程。ARP協議的基本功能就是通過目標設備的IP地址,查詢目標設備的MAC地址以保證通信的順利進 行。 

          注解:簡單地說,ARP協議主要負責將局域網中的32為IP地址轉換為對應的48位物理地址,即網卡的MAC地址,比如IP地址為192.168.0.1 網卡MAC地址為00-03-0F-FD-1D-2B。整個轉換過程是一臺主機先向目標主機發送包含IP地址信息的廣播數據包,即ARP請求,然后目標主 機向該主機發送一個含有IP地址和MAC地址數據包,通過MAC地址兩個主機就可以實現數據傳輸了。 

          應用:在安裝了以太網網絡適配器的計算機中都有專門的ARP緩存,包含一個或多個表,用于保存IP地址以及經過解析的MAC地址。在Windows中要查 看或者修改ARP緩存中的信息,可以使用arp命令來完成,比如在Windows XP的命令提示符窗口中鍵入“arp -a”或“arp -g”可以查看ARP緩存中的內容;鍵入“arp -d IPaddress”表示刪除指定的IP地址項(IPaddress表示IP地址)。arp命令的其他用法可以鍵入“arp /?”查看到。
          ============================================================================
          解決方案如下:

          聯系機房,用撥網線的排除法,找出同路由內中了類似47555病毒的機器,隔離。殺毒。

          其他機器,遇到這種情況,重裝系統是沒用的。

          Asion注:  ARP和掛馬 有很深的學問

          來源:http://i.mop.com/Noisa/blog/2008/03/13/6264338.html

          posted @ 2010-06-04 16:04 world_eyes 閱讀(633) | 評論 (0)編輯 收藏

          微軟關于IE、Firefox、Opera和Safari的JavaScript兼容性研究曾經發表過一份草案,可以點擊下載《JScript Deviations from ES3 以下為網上的一些搜集和整理(FF代表Firefox)

           集合類對象問題
          現有代碼中存在許多 document.form.item("itemName") 這樣的語句,不能在 FF 下運行
          解決方法:
          改用 document.form.elements["elementName"]
          說明:IE下,可以使用()或[]獲取集合類對象;Firefox下,只能使用[]獲取集合類對象.
          解決方法:統一使用[]獲取集合類對象.


          window.event
          現有問題:
          使用 window.event 無法在 FF 上運行
          解決方法:
          FF 的 event 只能在事件發生的現場使用,此問題暫無法解決。可以這樣變通:
          原代碼(可在IE中運行):
          <input type="button" name="someButton" value="提交" onclick="javascript:gotoSubmit()"/>
          <script language="javascript">
              function gotoSubmit() {
                 alert(window.event);    // use window.event
              }
          </script>

          新代碼(可在IE和FF中運行):
          <input type="button" name="someButton" value="提交" onclick="javascript:gotoSubmit(event)"/>
          <script language="javascript">
             function gotoSubmit(e) {
                e = e? e : (window.event ? window.event : null);
                alert(e);           
            }
          </script>

          此外,如果新代碼中第一行不改,與老代碼一樣的話(即 gotoSubmit 調用沒有給參數),則仍然只能在IE中運行,但不會出錯。所以,這種方案 tpl 部分仍與老代碼兼容。

           

          HTML 對象的 id 作為對象名的問題
          現有問題:
          在 IE 中,HTML 對象的 ID 可以作為 document 的下屬對象變量名直接使用。在 FF 中不能。
          解決方法:
          用 getElementById("idName") 代替 idName 作為對象變量使用。

          用idName字符串取得對象的問題
          現有問題:
          在IE中,利用 eval(idName) 可以取得 id 為 idName 的 HTML 對象,在FF 中不能。
          解決方法:
          用 getElementById(idName) 代替 eval(idName)。

           

          變量名與某 HTML 對象 id 相同的問題
          現有問題:
          在 FF 中,因為對象 id 不作為 HTML 對象的名稱,所以可以使用與 HTML 對象 id 相同的變量名,IE 中不能。
          解決方法:
          在聲明變量時,一律加上 var ,以避免歧義,這樣在 IE 中亦可正常運行。
          此外,最好不要取與 HTML 對象 id 相同的變量名,以減少錯誤。

           

          event.x 與 event.y 問題
          現有問題:
          在IE 中,event 對象有 x, y 屬性,FF中沒有。
          解決方法:
          在FF中,與event.x 等效的是 event.pageX。但event.pageX IE中沒有。
          故采用 event.clientX 代替 event.x。在IE 中也有這個變量。
          event.clientX 與 event.pageX 有微妙的差別(當整個頁面有滾動條的時候),不過大多數時候是等效的。
          如果要完全一樣,可以稍麻煩些:
          mX = event.x ? event.x : event.pageX;
          然后用 mX 代替 event.x
          其它:
          event.layerX 在 IE 與 FF 中都有,具體意義有無差別尚未試驗。

           

          關于frame
          現有問題:
          在 IE中 可以用window.testFrame取得該frame,FF中不行
          解決方法:
          在frame的使用方面FF和ie的最主要的區別是:
          如果在frame標簽中書寫了以下屬性:
          <frame src="/xx.htm" id="frameId" name="frameName" />
          那么ie可以通過id或者name訪問這個frame對應的window對象
          而FF只可以通過name來訪問這個frame對應的window對象
          例如如果上述frame標簽寫在最上層的window里面的htm里面,那么可以這樣訪問
          IE: window.top.frameId或者window.top.frameName來訪問這個window對象
          FF: 只能這樣window.top.frameName來訪問這個window對象
          另外,在FF和ie中都可以使用window.top.document.getElementById("frameId")來訪問frame標簽
          并且可以通過window.top.document.getElementById("testFrame").src = 'xx.htm'來切換frame的內容
          也都可以通過window.top.frameName.location = 'xx.htm'來切換frame的內容

           

          父結點的問題
          在FF中沒有 parentElement parentElement.children  而用 parentNode parentNode.childNodes
          childNodes的下標的含義在IE和FF中不同,FF使用DOM規范,childNodes中會插入空白文本節點。
          一般可以通過node.getElementsByTagName()來回避這個問題。當html中節點缺失時,IE和FF對parentNode的解釋不同,例如
          <form>
          <table>
            <input/>
          </table>
          </form>

          FF中input.parentNode的值為form, 而IE中input.parentNode的值為空節點
          FF中節點沒有removeNode方法,必須使用如下方法 node.parentNode.removeChild(node)

           

          const 問題
          現有問題:
          在 IE 中不能使用 const 關鍵字。如 const constVar = 32; 在IE中這是語法錯誤。
          解決方法:
          不使用 const ,以 var 代替。

          body 對象
          FF的body在body標簽沒有被瀏覽器完全讀入之前就存在,而IE則必須在body完全被讀入之后才存在

           

          URLencoding
          在js中如果書寫url就直接寫&不要寫&例如var url = 'xx.jsp?objectName=xx&objectEvent=xxx';
          frm.action = url那么很有可能url不會被正常顯示以至于參數沒有正確的傳到服務器
          一般會服務器報錯參數沒有找到
          當然如果是在tpl中例外,因為tpl中符合xml規范,要求&書寫為&
          一般FF無法識別js中的&

           

          nodeName 和 tagName 問題
          現有問題:
          在FF中,所有節點均有 nodeName 值,但 textNode 沒有 tagName 值。在 IE 中,nodeName 的使用好象有問題
          解決方法:
          使用 tagName,但應檢測其是否為空。

           

          元素屬性
          IE下 input.type屬性為只讀,但是FF下可以修改
          document.getElementsByName() 和 document.all[name] 的問題
          在 IE 中,getElementsByName()、document.all[name] 均不能用來取得多個具有相同name的div 元素集合。

           

          兼容firefox的 outerHTML,FF中沒有outerHtml的方法

          if (window.HTMLElement) {
            HTMLElement.prototype.__defineSetter__("outerHTML",function(sHTML) {
                  var r=this.ownerDocument.createRange();
                  r.setStartBefore(this);
                  var df=r.createContextualFragment(sHTML);
                  this.parentNode.replaceChild(df,this);
                  return sHTML;
              });

              HTMLElement.prototype.__defineGetter__("outerHTML",function() {
                  var attr;
                  var attrs=this.attributes;
                  var str="<"+this.tagName.toLowerCase();
                  for (var i=0;i<attrs.length;i++) {
                      attr=attrs[i];
                      if(attr.specified)
                          str+=" "+attr.name+'="'+attr.value+'"';
                  }

                  if(!this.canHaveChildren)
                      return str+">";
                  return str+">"+this.innerHTML+"</"+this.tagName.toLowerCase()+">";
                  });

             HTMLElement.prototype.__defineGetter__("canHaveChildren",function() {
               switch(this.tagName.toLowerCase()) {
                   case "area":
                   case "base":
                   case "basefont":
                   case "col":
                   case "frame":
                   case "hr":
                   case "img":
                   case "br":
                   case "input":
                   case "isindex":
                   case "link":
                   case "meta":
                   case "param":
                   return false;
               }
               return true;
             });
          }


          自定義屬性問題
          說明:IE下,可以使用獲取常規屬性的方法來獲取自定義屬性,也可以使用getAttribute()獲取自定義屬性;FF下,只能使用getAttribute()獲取自定義屬性.
          解決方法:統一通過getAttribute()獲取自定義屬性.

           
          event.srcElement問題
          說明:IE下,even對象有srcElement屬性,但是沒有target屬性;Firefox下,even對象有target屬性,但是沒有srcElement屬性.
          解決方法:使用obj(obj = event.srcElement ? event.srcElement : event.target;)來代替IE下的event.srcElement或者Firefox下的event.target.


          window.location.href問題
          說明:IE或者Firefox2.0.x下,可以使用window.location或window.location.href;Firefox1.5.x下,只能使用window.location.
          解決方法:使用window.location來代替window.location.href.


          模態和非模態窗口問題
          說明:IE下,可以通過showModalDialog和showModelessDialog打開模態和非模態窗口;Firefox下則不能.
          解決方法:直接使用window.open(pageURL,name,parameters)方式打開新窗口
          如果需要將子窗口中的參數傳遞回父窗口,可以在子窗口中使用window.opener來訪問父窗口. 例如:var parWin = window.opener; parWin.document.getElementById("Aqing").value = "Aqing";

           

          事件委托方法
          IE:document.body.onload = inject; //Function inject()在這之前已被實現
          FF:document.body.onload = inject();
          如果要加傳遞參數,可以做個閉包
          (function(arg){

             document.body.onload=function(){inject(arg);};

          })(arg)

          innerText在IE中能正常工作,但是innerText在FireFox中卻不行.
          解決方法:
          if(navigator.appName.indexOf("Explorer") > -1){
              document.getElementById('element').innerText = "my text";
          } else{
              document.getElementById('element').textContent = "my text";
          }


          FF中類似 obj.style.height = imgObj.height 的語句無效
          解決方法:
          obj.style.height = imgObj.height + 'px';


          IE,FF以及其它瀏覽器對于 table 標簽的操作都各不相同,在ie中不允許對table和tr的innerHTML賦值,使用js增加一個tr時,使用appendChile方法也不管用
          解決方法:
          //向table追加一個空行:
          var row = otable.insertRow(-1);
          var cell = document.createElement("td");
          cell.innerHTML = " ";
          cell.className = "XXXX";
          row.appendChild(cell);


          樣式部分
          -----------------------------------------------------------------------------------------------------------
          cursor:hand VS cursor:pointer
          FF不支持hand,但ie支持pointer
          解決方法: 統一使用pointer

          padding 問題
          padding 5px 4px 3px 1px FireFox無法解釋簡寫,
          必須改成 padding-top:5px; padding-right:4px; padding-bottom:3px; padding-left:1px;

          消除ulol等列表的縮進時
          樣式應寫成:list-style:none;margin:0px;padding:0px;
          其中margin屬性對IE有效,padding屬性對FireFox有效

          CSS透明
          IE:filter:progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=60)
          FF:opacity:0.6

          CSS圓角
          IE:不支持圓角
          FF: -moz-border-radius:4px,或者-moz-border-radius-topleft:4px;-moz-border- radius-topright:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius- bottomright:4px;

          CSS雙線凹凸邊框
          IE:border:2px outset;
          FF: -moz-border-top-colors: #d4d0c8 white;-moz-border-left-colors: #d4d0c8 white;-moz-border-right-colors:#404040 #808080;-moz-border-bottom-colors:#404040 #808080;

          posted @ 2009-04-11 18:25 world_eyes 閱讀(220) | 評論 (0)編輯 收藏

          環境:debian4 apache2.0.63

          1:apache 安裝

          ./configure --prefix=/usr/local/apache2
          make
          make install

          2:基本apache操作


          cd /usr/local/apache2/bin
          sudo ./apachectl start
          sudo ./apachectl stop
          sudo ./apachectl restart
          sudo ./apachectl configtest

          3:編譯安裝mod_rewrite

          cd apache下載源目錄
          find ./ -name mod_rewrite.c
          進入 mod_rewrite.c 目錄

          sudo /usr/local/apache2/bin/apxs -i -a -c mod_rewrite.c

          參數說明:

          -i : 執行安裝操作,將so 安裝到 modules目錄

          -a: 在httpd.conf中激活該模塊

          -c: 執行編譯操作

          ##將/* 及/*/*的請求都轉向到 /new/index.htm , 同時瀏覽器顯示的是前者的鏈接。
          RewriteEngine On
          RewriteRule ^/.*(/(.*))?$ /new/index.htm [L,PT]

          附:RewriteRule 參數

          RewriteRule Pattern Substitution [flags]

          Pattern是一個作用于當前URL的perl兼容的正則表達式。"當前URL"是指該規則生效時刻的URL的值。它可能與被請求的URL截然不同,因為其他規則可能在此之前已經發生匹配并對它做了改動。

          Substitution是當原始URL與Pattern相匹配時,用來替代(或替換)的字符串。除了純文本,還可以包含:
          對Pattern的反向引用($N)
          對最后匹配的RewriteCond的反向引用(%N)
          規則條件測試字符串(%{VARNAME})中的服務器變量
          映射函數調用(${mapname:key|default})

          [flags]標記作為RewriteRule指令的第三個參數,是一個包含以逗號分隔的下列標記的列表:


          'chain|C'(鏈接下一規則)
          此標記使當前規則與下一個規則相鏈接。它產生這樣的效果:如果一個規則被匹配,則繼續處理其后繼規則,也就是這個標記不起作用;如果該規則不被匹配,則其 后繼規則將被跳過。比如,在一個目錄級規則中執行一個外部重定向時,你可能需要刪除".www"(此處不應該出現".www")。
          'cookie|CO=NAME:VAL:domain[:lifetime[:path]]'(設置cookie)
          在客戶端設置一個cookie。cookie的名稱是NAME,值是VAL。domain是該cookie的域,比如'.apache.org',可選的lifetime是cookie的有效期(分鐘),可選的path是cookie的路徑。
          'env|E=VAR:VAL'(設置環境變量)
          此標記將環境變量VAR的值為VAL,VAL可以包含可擴展的正則表達式反向引用($N和%N)。此標記可以多次使用以設置多個變量。這些變量可以在其后 許多情況下被間接引用,通常是在XSSI(<!--#echo var="VAR"-->)或CGI($ENV{'VAR'})中,也可以在后繼的RewriteCond指令的CondPattern參數中通 過%{ENV:VAR}引用。使用它可以記住從URL中剝離的信息。
          'forbidden|F'(強制禁止URL)
          強制禁止當前URL,也就是立即反饋一個HTTP響應碼403(被禁止的)。使用這個標記,可以鏈接若干個RewriteConds來有條件地阻塞某些URL。
          'gone|G'(強制廢棄URL)
          強制當前URL為已廢棄,也就是立即反饋一個HTTP響應碼410(已廢棄的)。使用這個標記,可以標明頁面已經被廢棄而不存在了。
          'handler|H=Content-handler'(強制指定內容處理器)
          強自制定目標文件的內容處理器為Content-handler。例如,用來模擬mod_alias模塊的ScriptAlias指令,以強制映射文件夾內的所有文件都由"cgi-script"處理器處理。
          'last|L'(結尾規則)
          立即停止重寫操作,并不再應用其他重寫規則。它對應于Perl中的last命令或C語言中的break命令。這個標記用于阻止當前已被重寫的URL被后繼規則再次重寫。例如,使用它可以重寫根路徑的URL('/')為實際存在的URL(比如:'/e/www/')。
          'next|N'(從頭再來)
          重新執行重寫操作(從第一個規則重新開始)。此時再次進行處理的URL已經不是原始的URL了,而是經最后一個重寫規則處理過的URL。它對應于Perl 中的next命令或C語言中的continue命令。此標記可以重新開始重寫操作(立即回到循環的開頭)。但是要小心,不要制造死循環!
          'nocase|NC'(忽略大小寫)
          它使Pattern忽略大小寫,也就是在Pattern與當前URL匹配時,'A-Z'和'a-z'沒有區別。
          'noescape|NE'(在輸出中不對URI進行轉義)
          此標記阻止mod_rewrite對重寫結果應用常規的URI轉義規則。 一般情況下,特殊字符('%', '$', ';'等)會被轉義為等值的十六進制編碼('%25', '%24', '%3B'等)。此標記可以阻止這樣的轉義,以允許百分號等符號出現在輸出中,比如:

          RewriteRule /sqnote/(.*) /bar?arg=P1\%3d$1 [R,NE]


          可以使'/sqnote/zed轉向到一個安全的請求'/bar?arg=P1=zed'。
          'nosubreq|NS'(不對內部子請求進行處理)
          在當前請求是一個內部子請求時,此標記強制重寫引擎跳過該重寫規則。比如,在mod_include試圖搜索目錄默認文件(index.xxx) 時,Apache會在內部產生子請求。對于子請求,重寫規則不一定有用,而且如果整個規則集都起作用,它甚至可能會引發錯誤。所以,可以用這個標記來排除 某些規則。
          使用原則:如果你為URL添加了CGI腳本前綴,以強制它們由CGI腳本處理,但對子請求處理的出錯率(或者資源開銷)很高,在這種情況下,可以使用這個標記。
          'proxy|P'(強制為代理)
          此標記使替換成分被內部地強制作為代理請求發送,并立即中斷重寫處理,然后把處理移交給mod_proxy模塊。你必須確保此替換串是一個能夠被 mod_proxy處理的有效URI(比如以http://hostname開頭),否則將得到一個代理模塊返回的錯誤。使用這個標記,可以把某些遠程成 分映射到本地服務器域名空間,從而增強了ProxyPass指令的功能。
          注意:要使用這個功能,必須已經啟用了mod_proxy模塊。
          'passthrough|PT'(移交給下一個處理器)
          此標記強制重寫引擎將內部request_rec結構中的uri字段設置為filename字段的值,這個小小的修改使得RewriteRule指令的輸 出能夠被(從URI轉換到文件名的)Alias, ScriptAlias, Redirect等指令進行后續處理[原文:This flag is just a hack to enable post-processing of the output of RewriteRule directives, using Alias, ScriptAlias, Redirect, and other directives from various URI-to-filename translators.]。舉一個能說明其含義的例子: 如果要將/abc重寫為/def, 然后再使用mod_alias將/def轉換為/ghi,可以這樣:

          RewriteRule ^/abc(.*) /def$1 [PT]
          Alias /def /ghi


          如果省略了PT標記,雖然將uri=/abc/...重寫為filename=/def/...的部分運作正常,但是后續的mod_alias在試圖將URI轉換到文件名時會遭遇失效。
          注意:如果需要混合使用多個將URI轉換到文件名的模塊時,就必須使用這個標記。。此處混合使用mod_alias和mod_rewrite就是個典型的例子。
          'qsappend|QSA'(追加查詢字符串)
          此標記強制重寫引擎在已有的替換字符串中追加一個查詢字符串,而不是簡單的替換。如果需要通過重寫規則在請求串中增加信息,就可以使用這個標記。
          'redirect|R [=code]'(強制重定向)
          若Substitution以http://thishost[:thisport]/(使新的URL成為一個URI)開頭,可以強制性執行一個外部重定 向。如果沒有指定code,則產生一個HTTP響應碼302(臨時性移動)。如果需要使用在300-400范圍內的其他響應代碼,只需在此指定即可(或使 用下列符號名稱之一:temp(默認), permanent, seeother)。使用它可以把規范化的URL反饋給客戶端,如將"/~"重寫為"/u/",或始終對/u/user加上斜杠,等等。
          注意:在使用這個標記時,必須確保該替換字段是一個有效的URL。否則,它會指向一個無效的位置!并且要記住,此標記本身只是對URL加上 http://thishost[:thisport]/前綴,重寫操作仍然會繼續進行。通常,你還會希望停止重寫操作而立即重定向,那么就還需要使用 'L'標記。
          'skip|S=num'(跳過后繼規則)
          此標記強制重寫引擎跳過當前匹配規則之后的num個規則。它可以模擬if-then-else結構:最后一個規則是then從句,而被跳過的skip=N個規則是else從句。注意:它和'chain|C'標記是不同的!

          posted @ 2009-04-01 10:53 world_eyes 閱讀(1904) | 評論 (0)編輯 收藏

           日期轉化一

          為了達到不同的顯示效果有時,我們需要對時間進行轉化,默認格式為:2007-01-03 14:33:34 ,要轉化為其他格式,要用到DateTime.ToString的方法(String, IFormatProvider),如下所示:

          using System;
          using System.Globalization;
          String format="D";
          DateTime date=DataTime,Now;
          Response.Write(date.ToString(format, DateTimeFormatInfo.InvariantInfo));

          結果輸出
          Thursday, June 16, 2005

          參數format格式詳細用法:

          格式字符 關聯屬性/說明
          d ShortDatePattern
          D LongDatePattern
          f 完整日期和時間(長日期和短時間)
          F FullDateTimePattern(長日期和長時間)
          g 常規(短日期和短時間)
          G 常規(短日期和長時間)
          m、M MonthDayPattern
          r、R RFC1123Pattern
          s 使用當地時間的 SortableDateTimePattern(基于 ISO 8601)
          t ShortTimePattern
          T LongTimePattern
          u UniversalSortableDateTimePattern 用于顯示通用時間的格式
          U 使用通用時間的完整日期和時間(長日期和長時間)
          y、Y YearMonthPattern

          下表列出了可被合并以構造自定義模式的模式。這些模式是區分大小寫的;例如,識別“MM”,但不識別“mm”。如果自定義模式包含空白字符或用單引號括起來的字符,則輸出字符串頁也將包含這些字符。未定義為格式模式的一部分或未定義為格式字符的字符按其原義復制。

          格式模式 說明
          d 月中的某一天。一位數的日期沒有前導零。
          dd 月中的某一天。一位數的日期有一個前導零。
          ddd 周中某天的縮寫名稱,在 AbbreviatedDayNames 中定義。
          dddd 周中某天的完整名稱,在 DayNames 中定義。
          M 月份數字。一位數的月份沒有前導零。
          MM 月份數字。一位數的月份有一個前導零。
          MMM 月份的縮寫名稱,在 AbbreviatedMonthNames 中定義。
          MMMM 月份的完整名稱,在 MonthNames 中定義。
          y 不包含紀元的年份。如果不包含紀元的年份小于 10,則顯示不具有前導零的年份。
          yy 不包含紀元的年份。如果不包含紀元的年份小于 10,則顯示具有前導零的年份。
          yyyy 包括紀元的四位數的年份。
          gg 時期或紀元。如果要設置格式的日期不具有關聯的時期或紀元字符串,則忽略該模式。
          h 12 小時制的小時。一位數的小時數沒有前導零。
          hh 12 小時制的小時。一位數的小時數有前導零。
          H 24 小時制的小時。一位數的小時數沒有前導零。
          HH 24 小時制的小時。一位數的小時數有前導零。
          m 分鐘。一位數的分鐘數沒有前導零。
          mm 分鐘。一位數的分鐘數有一個前導零。
          s 秒。一位數的秒數沒有前導零。
          ss 秒。一位數的秒數有一個前導零。
          f 秒的小數精度為一位。其余數字被截斷。
          ff 秒的小數精度為兩位。其余數字被截斷。
          fff 秒的小數精度為三位。其余數字被截斷。
          ffff 秒的小數精度為四位。其余數字被截斷。
          fffff 秒的小數精度為五位。其余數字被截斷。
          ffffff 秒的小數精度為六位。其余數字被截斷。
          fffffff 秒的小數精度為七位。其余數字被截斷。
          t 在 AMDesignator 或 PMDesignator 中定義的 AM/PM 指示項的第一個字符(如果存在)。
          tt 在 AMDesignator 或 PMDesignator 中定義的 AM/PM 指示項(如果存在)。
          z 時區偏移量(“+”或“-”后面僅跟小時)。一位數的小時數沒有前導零。例如,太平洋標準時間是“-8”。
          zz 時區偏移量(“+”或“-”后面僅跟小時)。一位數的小時數有前導零。例如,太平洋標準時間是“-08”。
          zzz 完整時區偏移量(“+”或“-”后面跟有小時和分鐘)。一位數的小時數和分鐘數有前導零。例如,太平洋標準時間是“-08:00”。
          : 在 TimeSeparator 中定義的默認時間分隔符。
          / 在 DateSeparator 中定義的默認日期分隔符。
          % c 其中 c 是格式模式(如果單獨使用)。如果格式模式與原義字符或其他格式模式合并,則可以省略“%”字符。
          \ c 其中 c 是任意字符。照原義顯示字符。若要顯示反斜杠字符,請使用“\\”。

          只有上面第二個表中列出的格式模式才能用于創建自定義模式;在第一個表中列出的標準格式字符不能用于創建自定義模式。自定義模式的長度至少為兩個字符;例如,

          DateTime.ToString( "d") 返回 DateTime 值;“d”是標準短日期模式。
          DateTime.ToString( "%d") 返回月中的某天;“%d”是自定義模式。
          DateTime.ToString( "d ") 返回后面跟有一個空白字符的月中的某天;“d”是自定義模式。

          比較方便的是,上面的參數可以隨意組合,并且不會出錯,多試試,肯定會找到你要的時間格式
          如要得到2005年06月 這樣格式的時間
          可以這樣寫:
          date.ToString("yyyy年MM月", DateTimeFormatInfo.InvariantInfo)

          日期轉化二

          DateTime dt = DateTime.Now;
          Label1.Text = dt.ToString();//2005-11-5 13:21:25
          Label2.Text = dt.ToFileTime().ToString();//127756416859912816
          Label3.Text = dt.ToFileTimeUtc().ToString();//127756704859912816
          Label4.Text = dt.ToLocalTime().ToString();//2005-11-5 21:21:25
          Label5.Text = dt.ToLongDateString().ToString();//2005年11月5日
          Label6.Text = dt.ToLongTimeString().ToString();//13:21:25
          Label7.Text = dt.ToOADate().ToString();//38661.5565508218
          Label8.Text = dt.ToShortDateString().ToString();//2005-11-5
          Label9.Text = dt.ToShortTimeString().ToString();//13:21
          Label10.Text = dt.ToUniversalTime().ToString();//2005-11-5 5:21:25

          Label1.Text = dt.Year.ToString();//2005
          Label2.Text = dt.Date.ToString();//2005-11-5 0:00:00
          Label3.Text = dt.DayOfWeek.ToString();//Saturday
          Label4.Text = dt.DayOfYear.ToString();//309
          Label5.Text = dt.Hour.ToString();//13
          Label6.Text = dt.Millisecond.ToString();//441
          Label7.Text = dt.Minute.ToString();//30
          Label8.Text = dt.Month.ToString();//11
          Label9.Text = dt.Second.ToString();//28
          Label10.Text = dt.Ticks.ToString();//632667942284412864
          Label11.Text = dt.TimeOfDay.ToString();//13:30:28.4412864

          Label1.Text = dt.ToString();//2005-11-5 13:47:04
          Label2.Text = dt.AddYears(1).ToString();//2006-11-5 13:47:04
          Label3.Text = dt.AddDays(1.1).ToString();//2005-11-6 16:11:04
          Label4.Text = dt.AddHours(1.1).ToString();//2005-11-5 14:53:04
          Label5.Text = dt.AddMilliseconds(1.1).ToString();//2005-11-5 13:47:04
          Label6.Text = dt.AddMonths(1).ToString();//2005-12-5 13:47:04
          Label7.Text = dt.AddSeconds(1.1).ToString();//2005-11-5 13:47:05
          Label8.Text = dt.AddMinutes(1.1).ToString();//2005-11-5 13:48:10
          Label9.Text = dt.AddTicks(1000).ToString();//2005-11-5 13:47:04
          Label10.Text = dt.CompareTo(dt).ToString();//0
          Label11.Text = dt.Add(?).ToString();//問號為一個時間段

          Label1.Text = dt.Equals("2005-11-6 16:11:04").ToString();//False
          Label2.Text = dt.Equals(dt).ToString();//True
          Label3.Text = dt.GetHashCode().ToString();//1474088234
          Label4.Text = dt.GetType().ToString();//System.DateTime
          Label5.Text = dt.GetTypeCode().ToString();//DateTime

          Label1.Text = dt.GetDateTimeFormats('s')[0].ToString();//2005-11-05T14:06:25
          Label2.Text = dt.GetDateTimeFormats('t')[0].ToString();//14:06
          Label3.Text = dt.GetDateTimeFormats('y')[0].ToString();//2005年11月
          Label4.Text = dt.GetDateTimeFormats('D')[0].ToString();//2005年11月5日
          Label5.Text = dt.GetDateTimeFormats('D')[1].ToString();//2005 11 05
          Label6.Text = dt.GetDateTimeFormats('D')[2].ToString();//星期六 2005 11 05
          Label7.Text = dt.GetDateTimeFormats('D')[3].ToString();//星期六 2005年11月5日
          Label8.Text = dt.GetDateTimeFormats('M')[0].ToString();//11月5日
          Label9.Text = dt.GetDateTimeFormats('f')[0].ToString();//2005年11月5日 14:06
          Label10.Text = dt.GetDateTimeFormats('g')[0].ToString();//2005-11-5 14:06
          Label11.Text = dt.GetDateTimeFormats('r')[0].ToString();//Sat, 05 Nov 2005 14:06:25 GMT

          Label1.Text = string.Format("{0:d}",dt);//2005-11-5
          Label2.Text = string.Format("{0:D}",dt);//2005年11月5日
          Label3.Text = string.Format("{0:f}",dt);//2005年11月5日 14:23
          Label4.Text = string.Format("{0:F}",dt);//2005年11月5日 14:23:23
          Label5.Text = string.Format("{0:g}",dt);//2005-11-5 14:23
          Label6.Text = string.Format("{0:G}",dt);//2005-11-5 14:23:23
          Label7.Text = string.Format("{0:M}",dt);//11月5日
          Label8.Text = string.Format("{0:R}",dt);//Sat, 05 Nov 2005 14:23:23 GMT
          Label9.Text = string.Format("{0:s}",dt);//2005-11-05T14:23:23
          Label10.Text   string.Format("{0:t}",dt);//14:23
          Label11.Text = string.Format("{0:T}",dt);//14:23:23
          Label12.Text = string.Format("{0:u}",dt);//2005-11-05 14:23:23Z
          Label13.Text = string.Format("{0:U}",dt);//2005年11月5日 6:23:23
          Label14.Text = string.Format("{0:Y}",dt);//2005年11月
          Label15.Text = string.Format("{0}",dt);//2005-11-5 14:23:23
          Label16.Text = string.Format("{0:yyyyMMddHHmmssffff}",dt);  

          C#比較兩時間大小

          1、比較時間大小的實驗
              string st1="12:13";
              string st2="14:14";
              DateTime dt1=Convert.ToDateTime(st1);
              DateTime dt2=Convert.ToDateTime(st2);
              DateTime dt3=DateTime.Now;
              if(DateTime.Compare(dt1,dt2)>0)
               msg.Text=st1+">"+st2;
              else
               msg.Text=st1+"<"+st2;
              msg.Text+="\r\n"+dt1.ToString();
              if(DateTime.Compare(dt1,dt3)>0)
               msg.Text+="\r\n"+st1+">"+dt3.ToString();
              else
               msg.Text+="\r\n"+st1+"<"+dt3.ToString();
          2、計算兩個時間差值的函數,返回時間差的絕對值:
                   private string DateDiff(DateTime DateTime1,DateTime DateTime2)
                   {
                       string dateDiff=null;
                       try
                       {
                           TimeSpan ts1=new   TimeSpan(DateTime1.Ticks);
                           TimeSpan ts2=new   TimeSpan(DateTime2.Ticks);
                           TimeSpan ts=ts1.Subtract(ts2).Duration();
                           dateDiff=ts.Days.ToString()+"天"
                                   +ts.Hours.ToString()+"小時"
                                   +ts.Minutes.ToString()+"分鐘"
                                   +ts.Seconds.ToString()+"秒";
                       }
                       catch
                       {
                       }
                       return dateDiff;
                   }
          3、實現計算DateTime1-36天=DateTime2的功能
              TimeSpan ts=new TimeSpan(40,0,0,0);
              DateTime dt2=DateTime.Now.Subtract(ts);
              msg.Text=DateTime.Now.ToString()+"-"+ts.Days.ToString()+"天\r\n";
              msg.Text+=dt2.ToString();



          由于工作需要,學習了一段時間的donet。覺得跟java各有千秋
          posted @ 2009-01-17 15:41 world_eyes 閱讀(389) | 評論 (0)編輯 收藏

          Window 窗口對象
          --返回值:它打開的窗口對象。
          ----var newWindow = open('','_blank');
          --屬性
          ----name 窗口的名稱,由打開它的連接(<a target="...">)或框架頁(<frame name="...">)或某一個窗口調用的 open() 方法(見下)決定。一般我們不會用這個屬性。
          ----status 指窗口下方的“狀態欄”所顯示的內容。通過對 status 賦值,可以改變狀態欄的顯示。
          ----opener 用法:window.opener;返回打開本窗口的窗口對象。注意:返回的是一個窗口對象。如果窗口不是由其他窗口打開的,在 Netscape 中這個屬性返回 null;在 IE 中返回“未定義”(undefined)。undefined 在一定程度上等于 null。注意:undefined 不是 JavaScript 常數,如果你企圖使用“undefined”,那就真的返回“未定義”了。
          ----self 指窗口本身,它返回的對象跟 window 對象是一模一樣的。最常用的是“self.close()”,放在<a>標記中:“<a href="javascript:self.close()">關閉窗口</a>”。
          ----parent 返回窗口所屬的框架頁對象。
          ----top 返回占據整個瀏覽器窗口的最頂端的框架頁對象。
          --方法
          ----open() 打開一個窗口。用法:open(<URL字符串>, <窗口名稱字符串>, <參數字符串>);
          ------參數字符串
          --------top=# 窗口頂部離開屏幕頂部的像素數
          --------left=# 窗口左端離開屏幕左端的像素數
          --------width=# 窗口的寬度
          --------height=# 窗口的高度
          --------menubar=... 窗口有沒有菜單,取值yes或no
          --------toolbar=... 窗口有沒有工具條,取值yes或no
          --------location=... 窗口有沒有地址欄,取值yes或no
          --------directories=... 窗口有沒有連接區,取值yes或no
          --------scrollbars=... 窗口有沒有滾動條,取值yes或no
          --------status=... 窗口有沒有狀態欄,取值yes或no
          --------resizable=... 窗口給不給調整大小,取值yes或no
          ----close() 關閉一個已打開的窗口。
          ----blur() 使焦點從窗口移走,窗口變為“非活動窗口”。
          ----focus() 是窗口獲得焦點,變為“活動窗口”。不過在 Windows 98,該方法只能使窗口的標題欄和任務欄上的相應按鈕閃爍,提示用戶該窗口正在試圖獲得焦點。
          ----scrollTo() 用法:[<窗口對象>.]scrollTo(x, y);使窗口滾動,使文檔從左上角數起的(x, y)點滾動到窗口的左上角。
          ----scrollBy() 用法:[<窗口對象>.]scrollBy(deltaX, deltaY);使窗口向右滾動 deltaX 像素,向下滾動 deltaY 像素。如果取負值,則向相反的方向滾動。
          ----resizeTo() 用法:[<窗口對象>.]resizeTo(width, height);使窗口調整大小到寬 width 像素,高 height 像素。
          ----resizeBy() 用法:[<窗口對象>.]resizeBy(deltaWidth, deltaHeight);使窗口調整大小,寬增大 deltaWidth 像素,高增大 deltaHeight 像素。如果取負值,則減少。
          ----alert() 用法:alert(<字符串>);彈出一個只包含“確定”按鈕的對話框,顯示<字符串>的內容,整個文檔的讀取、Script 的運行都會暫停,直到用戶按下“確定”。
          ----confirm() 用法:confirm(<字符串>);彈出一個包含“確定”和“取消”按鈕的對話框,顯示<字符串>的內容,要求用戶做出選擇,整個文檔的讀取、Script 的運行都會暫停。如果用戶按下“確定”,則返回 true 值,如果按下“取消”,則返回 false 值。
          ----prompt() 用法:prompt(<字符串>[, <初始值>]);彈出一個包含“確認”“取消”和一個文本框的對話框,顯示<字符串>的內容,要求用戶在文本框輸入一些數據,整個文檔的讀取、Script 的運行都會暫停。如果用戶按下“確認”,則返回文本框里已有的內容,如果用戶按下“取消”,則返回 null 值。如果指定<初始值>,則文本框里會有默認值。
          --事件
          ----onload
          ----onunload
          ----onresize
          ----onblur
          ----onfocus
          ----onerror

          document 文檔對象 描述當前窗口或指定窗口對象的文檔。它包含了文檔從<head>到</body>的內容。
          --用法:document (當前窗口) 或 <窗口對象>.document (指定窗口)
          --屬性:
          ----cookie 關于 cookie 請參看“使用框架和 Cookies”一章。
          ----lastModified 當前文檔的最后修改日期,是一個 Date 對象。
          ----referrer 如果當前文檔是通過點擊連接打開的,則 referrer 返回原來的 URL。
          ----title 指<head>標記里用<title>...</title>定義的文字。在 Netscape 里本屬性不接受賦值。
          ----fgColor 指<body>標記的 text 屬性所表示的文本顏色。
          ----bgColor 指<body>標記的 bgcolor 屬性所表示的背景顏色。
          ----linkColor 指<body>標記的 link 屬性所表示的連接顏色。
          ----alinkColor 指<body>標記的 alink 屬性所表示的活動連接顏色。
          ----vlinkColor 指<body>標記的 vlink 屬性所表示的已訪問連接顏色。
          --方法
          ----open() 打開文檔以便 JavaScript 能向文檔的當前位置(指插入 JavaScript 的位置)寫入數據。通常不需要用這個方法,在需要的時候 JavaScript 自動調用。
          ----write(); writeln() 向文檔寫入數據,所寫入的會當成標準文檔 HTML 來處理。writeln() 與 write() 的不同點在于,writeln() 在寫入數據以后會加一個換行。這個換行只是在 HTML 中換行,具體情況能不能夠是顯示出來的文字換行,要看插入 JavaScript 的位置而定。如在<pre>標記中插入,這個換行也會體現在文檔中。
          ----clear() 清空當前文檔。
          ----close() 關閉文檔,停止寫入數據。如果用了 write[ln]() 或 clear() 方法,就一定要用 close() 方法來保證所做的更改能夠顯示出來。

          forms[]; Form 表單對象
          --用法
          ----document.forms[] 是一個數組,包含了文檔中所有的表單(<form>)。要引用單個表單,可以用 document.forms[x],但是一般來說,人們都會這樣做:在<form>標記中加上“name="..."”屬性,那么直接用“document.<表單名>”就可以引用了。
          --屬性
          ----name 返回表單的名稱,也就是<form name="...">屬性。
          ----action 返回/設定表單的提交地址,也就是<form action="...">屬性。
          ----method 返回/設定表單的提交方法,也就是<form method="...">屬性。
          ----target 返回/設定表單提交后返回的窗口,也就是<form target="...">屬性。
          ----encoding 返回/設定表單提交內容的編碼方式,也就是<form enctype="...">屬性。
          ----length 返回該表單所含元素的數目。
          --方法
          ----reset() 重置表單。這與按下“重置”按鈕是一樣的。
          ----submit() 提交表單。這與按下“提交”按鈕是一樣的。
          --事件
          ----onreset
          ----onsubmit

          Javascript文檔對象結構

          瀏覽器對象  navigator
          屏幕對象  screen
          窗口對象  window
           歷史對象   history
           地址對象   location
           框架對象   frames[]; Frame
           文檔對象   document
            連接對象    anchors[]; links[]; Link
            Java小程序對象   applets[]
            插件對象    embeds[]
            圖片對象     images[]; Image
            表單對象    forms[]; Form
             按鈕對象     Button
             復選框對象    Checkbox
             表單元素對象    elements[]; Element
             隱藏對象     Hidden
             密碼輸入區對象    Password
             單選域對象    Radio
             重置按鈕對象    Reset
             選擇區(下拉菜單、列表)對象  Select
              選擇項對象     options[]; Option
             提交按鈕對象    Submit
             文本框對象    Text
             多行文本輸入區對象   Textarea

          posted @ 2009-01-17 15:38 world_eyes 閱讀(1683) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 菏泽市| 通渭县| 同仁县| 太仆寺旗| 大埔县| 南召县| 那曲县| 阳城县| 潮州市| 碌曲县| 大石桥市| 牟定县| 普洱| 河东区| 兴安盟| 禹城市| 开阳县| 白玉县| 和田县| 日喀则市| 大同市| 手游| 大埔区| 湟中县| 贵州省| 祁阳县| 垦利县| 土默特右旗| 丽水市| 怀来县| 杂多县| 祁阳县| 和平区| 中山市| 吉木萨尔县| 曲沃县| 梨树县| 香港 | 南涧| 镇坪县| 信丰县|