小小程序員

          小小程序員
          隨筆 - 5, 文章 - 0, 評論 - 0, 引用 - 0
          數據加載中……

          2011年6月21日

          sudo的環境變量獲取

          sudo的環境變量獲取
          問題描述:
              yuyu用戶設置了自定義的環境變量,提升到sudo執行,無法獲取該環境變量
          解決方法:
              在/etc/sudoers.d目錄下添加任意文件,前提是不包括~結尾和.字符,權限要設置成440,具體要求看改目錄下的README文件
              文件內容Defaults env_keep += "CONFIG_DIR"
          以上在yuyu中設置的變量CONFIG_DIR 就能在sudo中使用

          posted @ 2011-06-21 10:08 余堅 閱讀(287) | 評論 (0)編輯 收藏

          2010年6月21日

          [源碼學習]Tomcat6 源碼學習

          Tomcat6 源碼學習
          2010-3-29
          【tomcat啟動類Bootstrap】
          t1.tomcat的人口函數,啟動類
          org.apache.catalina.startup. Bootstrap.java   Main函數

          t2.Bootstrap類
          初始化 ClassLoader, 然后利用 Java Reflection 調用 Catalina 類來啟動 tomcat server

          【tomcat擴展-日志】
          a1.private static Log log = LogFactory.getLog(Bootstrap.class);
          日志可以定義為private 和static

          a2.只在本類中使用的方法,使用private,降低訪問權限,需要的時候,再考慮重構或者提高訪問權限public

          a.日志打印前加if(log.isInfoEnabled())
          如果代碼中含有logger.debug(“string”);此類語句,盡管在log4j.xml配置文件中對該類logger的level為 ERROR,但是仍然會產生較大的內存開銷,通常是所要輸出的string的幾十倍甚至上百倍大小,對內存開銷非常大。優化方法為:使用logger進行 判斷。


          2010-3-30
          【tomcat擴展-classloader】
          a3.如果兩個類屬于同一個包下,但是由不同的classloader加載,那么他們也不能互訪default類型方法,屬性

          a4.classloader:與C或C++編寫的程序不同,Java程序并不是一個可執行文件,而是由許多獨立的類文件組成,每一個文件基本上 對應于一個類。此外,這些類文件并非立即全部都裝入內存,而是根據程序需要裝入內存。ClassLoader是JVM中將類裝入內存的那部分

          a5.定制的ClassLoader應用:
          1.在執行非置信代碼之前,自動驗證數字簽名
          2.使用用戶提供的密碼透明地解密代碼
          3.動態地創建符合用戶特定需要的定制化構建類
          4.任何您認為可以生成Java字節碼的內容都可以集成到應用程序中

          a6.findClass方法是創建定制的ClassLoader時唯一需要覆蓋的方法。
          ClassLoader loadClass方法
          Class c = findLoadedClass(name);
          if (c == null) {
              try {
          if (parent != null) {
              c = parent.loadClass(name, false);
          } else {
              c = findBootstrapClass0(name);
          }
              } catch (ClassNotFoundException e) {
                  // If still not found, then invoke findClass in order
                  // to find the class.
                  c = findClass(name);
              }
          }

          a7.ClassLoader(CCL)的任務是確保代碼被編譯和更新。
          下面描述了它的工作方式:1、當請求一個類時,先查看它是否在磁盤的當前目錄或相應的子目錄。
          2、如果該類不存在,但源碼中有,那么調用Java編譯器來生成類文件。
          3、如果該類已存在,檢查它是否比源碼舊。如果是,調用Java編譯器來重新生成類文件。
          4、如果編譯失敗,或者由于其它原因不能從現有的源碼中生成類文件,返回ClassNotFoundException。
          5、如果仍然沒有該類,也許它在其它庫中,所以調用findSystemClass來尋找該類。
          6、如果還是沒有,則返回ClassNotFoundException。
          7、否則,返回該類。
          8、調用findLoadedClass來查看是否存在已裝入的類。
          9、如果沒有,那么采用那種特殊的神奇方式來獲取原始字節。
          10、如果已有原始字節,調用defineClass將它們轉換成Class對象。
          11、如果沒有原始字節,然后調用findSystemClass查看是否從本地文件系統獲取類。
          12、如果resolve參數是true,那么調用resolveClass解析Class對象。
          13、如果還沒有類,返回ClassNotFoundException。
          14、否則,將類返回給調用程序。

          【tomcat啟動類classloader】
          t3.tomcat自定義了三個類,catalinaLoader commonLoader,sharedLoader
          Common - 載入$CATALINA_HOME/common/...它們對TOMCAT和所有的WEB APP都可見
          Catalina - 載入$CATALINA_HOME/server/..它們僅對TOMCAT可見,對所有的WEB APP都不可見
          Shared-載入$CATALINA_HOME/shared/它們僅對所有WEB APP可見,對TOMCAT不可見(也不必見)

          t4.Bootstrap通過反射初始化Catalina類,
          反射調用Catalina方法setParentClassLoader,傳遞SharedClassloader
          反射call Catalina方法load 利用server.xml中的配置初始化Service,Server,Engine,Host
          反射call Catalina方法start Start the new server  該server是通過  解析xml文件生成的org.apache.catalina.core.StandardServer類


          【tomcat-xml解析】
          1.Tomcat取了Digester中的interface和幾個Rule,并且自己實現了一些 Rule 來解析xml.
          2.tomcat解析xml創建以下幾個類
          Server:
          org.apache.catalina.core.StandardServer
          Resources:
          org.apache.catalina.deploy.NamingResources
          Server's Listener:( 監聽server事件)
          org.apache.catalina.core.AprLifecycleListener
          org.apache.catalina.core.JasperListener
          org.apache.catalina.mbeans.ServerLifecycleListener
          org.apache.catalina.mbeans.GlobalResourcesLifecycleListener
          Service:
          org.apache.catalina.core.StandardService
          Executor:
          org.apache.catalina.core.StandardThreadExecutor
          Engine:
          org.apache.catalina.core.StandardEngine
          Connector:
          org.apache.catalina.connector.Connector

          【tomcat-流程】
          3.StandardServer啟動StandardService,StandardService啟動Connector,
          Connector啟動Http11Protocol,Http11Protocol啟動JIoEndpoint,
          JioEndpoint啟動server Socket,listern 8080端口,處理http請求

          4.Http11Processor
          Processes HTTP requests.
          由http11ConnectionHandler調用,Http11ConnectionHandler由JioEndpoint中的Work 調用

          5.A connector passes the request and reponse objects to the Container by calling the Container interface's invoke method
          public void invoke(Request request, Response response)
                  throws IOException, ServletException;

          inside the invoke method ,the container loads the servlet class,call its sevice method ,manage sessions,etc.

          6.Connector 方法initialize中
          // Initializa adapter
          adapter = new CoyoteAdapter(this);
          protocolHandler.setAdapter(adapter);
          adapter通過protocolHandler(Http11Protocol)傳給Http11Processor,
          Http11Processor解析,create request和response,通過adapter傳送給Container

          7.Tomcat使用Pipeline模式在各層容器間傳遞請求,將請求通過管道依次通過Engine,Host,Context和 Wrapper。另外,每一個容器  
          都可以設置一系列的Valve去對請求進行攔 截,就像管道中的閥一樣對請求的行為進行一些干涉。


          2010-3-31
          【tomcat-流程】
          1.tomcat的pipeline/valve是標準的責任鏈模式,每個級別的容器中pipeline所有的valve都完成動作后會將 request/response傳到下一個容器的pipeline中的valve,
          這樣一直傳遞下去直到Wrapper的BaseValve.
          Ps:每個容器的BaseValve會調用下個容器的起始valve

          2.StandardEngine
          屬性Pipeline  pipeline = new StandardPipeline(this);
          構造函數里會設置最底層的閥門
          pipeline.setBasic(new StandardEngineValve());
          如果需要設置新閥門處理需求,只需要調用 pipeline.addValve(Valve valve);

          3.CoyoteAdapter中會執行
          connector.getContainer().getPipeline().getFirst().invoke(request, response);
          該行代碼會一層一層調用添加的閥門,處理下去.

          2010-4-1
          【tomcat-流程】
          1.jk插件負責tomcat和其它http容器進行通信

          2.連接器協議AJP/1.3是tomcat用來與其它http容器進行連接的協議

          3.把指定Context的classloader付給當前線程。
          Thread.currentThread().setContextClassLoader(context.getLoader().getClassLoader()); 這樣request就只看見指定的context下面的classes和jar包,而看不見tomcat本身的類。

          2010-4-7
          【tomcat-socke與worker線程】
          /**
          * Process an incoming TCP/IP connection on the specified socket.  Any
          * exception that occurs during processing must be logged and swallowed.
          * <b>NOTE</b>:  This method is called from our Connector's thread.  We
          * must assign it to our own thread so that multiple simultaneous
          * requests can be handled.
          * @param socket TCP socket to process
          */
          synchronized void assign(Socket socket) {
          // Wait for the Processor to get the previous Socket
          while (available) {
          try {
                        wait();
                 } catch (InterruptedException e) {
                 }
              }
              // Store the newly available Socket and notify our thread
              this.socket = socket;
              available = true;
              notifyAll();
          }

          /**
          * Await a newly assigned Socket from our Connector, or <code>null</code
          * if we are supposed to shut down.
          */
          private synchronized Socket await() {
          // Wait for the Connector to provide a new Socket
          while (!available) {
          try {
          wait();
          } catch (InterruptedException e) {
          }
          }
              // Notify the Connector that we have received this Socket
              Socket socket = this.socket;
              available = false;
              notifyAll();
          return (socket);
          }
          連接器線程調用worker類的assign類,worker類的執行線程run方法會調用await方法獲取socket,通過 available變量的設置和wait/notify方法來協調彼此的操作。當連接器線程未傳輸socket,worker類線程就執行wait等待,
          當worker類執行線程在處理忙的時候,連接器線程wait。

          posted @ 2010-06-21 10:28 余堅 閱讀(839) | 評論 (0)編輯 收藏

          [版本控制]svn命令行筆記

          svn命令行操作

          1.svn update 更新 (簡寫up)
          svn update -r 500 test.java(將版本庫中的文件test.java還原到版本500)

          2.svn commit -m"u" (簡寫ci)
          提交變更的文件

          3.查看文件信息svn info path
          查看文件內容svn cat path

          4.svn status path
          會目錄下的文件和子目錄的狀態,正常狀態的則不顯示,很正常,不然在項目根目錄執行,將會羅列出一大堆文件了
          顯示的狀態信息中?:表示不在svn的控制中 M:表示本地文件被修改過 C:表示本地文件與服務器文件發生沖突(如果不帶-u選項,即時沖突也不會顯示) A:表示預定要加入到版本庫 K:表示被鎖定
          '!'  表示丟失,一般是將受控文件直接刪除導致
          svn st -u path   -u選項表示不僅僅本地,服務器上的變更也將會顯示

          5.刪除文件
          svn delete test.java 然后再svn ci -m 'delete‘,將在本地和服務器上都刪除該文件

          6. 添加新文件
          svn add test.java(添加test.java)  然后再svn ci -m"add",將再服務器上添加該文件
          如果不執行commit操作,服務器上將不會添加

          7.svn: Commit failed (details follow):
          svn: Directory '/home/yuyu/f/workspace/ouyu/WebRoot/WEB-INF/classes' is missing
          解決方法:svn update /home/yuyu/f/workspace/ouyu/WebRoot/WEB-INF/classes

          8. 服務器覆蓋本地文件
          執行svn revert test.java命令撤銷自己的修改,再執行update,
          則服務器的文件會覆蓋自己修改的文件。

          9.svn list path(or url)
          顯示目標下的文件和目錄列表。

          10.svn diff
          svn diff path                 查看文件的不同處(本地版本的變更比較)
          svn diff -r n1:n2 path   n1和n2版本的同一文件比較

          11. 發生沖突
          執行svn update后會緊跟選擇性操作,一種直接選擇解決,修改文件;
          一種選擇推遲解決,則之后需要執行svn resolved test.java,才能最終commit

          posted @ 2010-06-21 10:02 余堅 閱讀(900) | 評論 (0)編輯 收藏

          2010年5月10日

          javaio-WriteStringToFile

          package cn.yu.test.io;
          import java.io.DataOutputStream;
          import java.io.FileOutputStream;
          import java.io.FileWriter;
          import java.io.OutputStreamWriter;
          import java.io.PrintStream;
          import java.io.PrintWriter;
          import java.io.RandomAccessFile;
          /**
           * WriteStringToFile
           * 
          @version 1.0
           * @date 2010/5/10
           *
          */
          public class WriteStringToFile {
              
          public static void main(String[] args) {
                  
          try {
                      String aString 
          = "Hello你好";
                  
                      FileWriter fw 
          = new FileWriter("c:/out.fw.txt");
                      fw.write(aString);
                      fw.close();   
          //默認gbk編碼9字節
                      ////////////////////////////////////////////////////////////////////////////
                      OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("c:/out.osw.txt"),"UTF-8");
                      osw.write(aString);
                      osw.close();  
          //utf-8編碼 11字節
                      
                      
          ///////////////////////////////////////////////////////////
                      DataOutputStream dos = new DataOutputStream(new FileOutputStream("c:/out.dos.txt"));
                      dos.writeChars(aString);
                      dos.close();  
          //14個字節, 每個字符用該字符2字節的unicode表示
                      //////////////////////////////////////////////////////////////
                      PrintStream ps = new PrintStream(new FileOutputStream("c:/out.ps.txt"));
                      ps.print(aString);
                      ps.close(); 
          //默認gbk編碼9字節
                      //////////////////////////////////////////////
                      PrintWriter pw = new PrintWriter(new FileOutputStream("c:/out.pw.txt"));
                      pw.print(aString);
                      pw.close(); 
          //默認gbk編碼9字節  
                       ///////////////////////////////////////////////
                      RandomAccessFile ra = new RandomAccessFile("c:/out.fa.txt""rw");
                      ra.writeUTF(aString); 
          //
                      ra.close(); //13個字節 ,前兩個直接表示一個無符號整數,值是這個字符串的字符所需要的字節數
                      ////////////////////////////////////////////////
                      RandomAccessFile ra2 = new RandomAccessFile("c:/out.fa2.txt""rw");
                      ra2.writeChars(aString);
                      ra2.close(); 
          //14個字節, 每個字符用該字符2字節的unicode表示
                  } catch (Exception e) {
                      e.printStackTrace();
                  }
              }
          }

          posted @ 2010-05-10 13:57 余堅 閱讀(333) | 評論 (0)編輯 收藏

          2010年5月6日

          perl記事本

          perl記事本

          1. 'yu' x 3    #  print yuyuyu

          2.print "yu jian ${age}s" # 加{}  促使變量不會變成$ages

          3. 4 ** 2  #4的平方

          4.(1..5) #  -->(1,2,3,4,5)

          5.qw ( yu jian's book)  # 簡潔,更少輸入

          6.($yu,$jian)=($jian,$yu) # 值互換

          7.($yu,$jian)=qw(yu jian) # 賦值

          8.@array=qw/yu jian/; #數組 

          9.@array=5..9;
          $yu=pop(@array)  # $yu=9  and @array=(5,6,7,8)
          $yu=pop @array  # $yu=8  and @array=(5,6,7)

          10.如果數組為空 pop不會報錯,什么也不返回,直接返回undef

          11.push(@array,0)  # @array=(5,6,7,0)

          12.pop和push都操作數組末尾

          13.shift和unshift是對數組的開始端操作

          14.$_  perl的默認變量
          for(1...10){
              print $_;  # $_ = 1 or 2 or 3...
          }

          15.perl會正確處理上下文
          @people=qw{yu gao};
          @list=@people #得到列表
          $n=@people #得到人數2

          16.scalar @array #scalar 導致切換為標量上下文
          @array =qw/yu jian gao su/;
          print "love is ".@array."\n"; #love is 4
          print "love is ",@array,"\n"; #love is yujiangaosu
          print "love is ".scalar @array,"\n";#love is 4

          17.@lines=<STDIN> #在列表上下文中讀取標準輸入


          18.chomp 去掉所有的換行符 chmop(@lines)

          19.調用自定義方法  &methodName;

          20.sub max{
              if(@_!=2){  #判斷參數個數
                  print "waning!!!";
                  return -1;
              }
              my($m,$n); #創建新的所有變量
              ($m,$n)=@_; #將參數賦值給變量
              if($m > $n){$m}else{$n}
          }

          21.my($num)=@_ #獲取數組的第一個元素
              my $num=@_ #數組的數量

          22.use strice ; #強制使用一些嚴格的良好的程序語言規則

          23.sub division{
                  $_[0] / $_[1]; #第一個參數和第二個參數
          }

          24.@ARGV=qw# file1 file2 #;# 強制讓磚石操作符讀取這兩個文件
          while(<>){
              chomp;
              print "It was $_\n":
          }

          25.printf "Hello, %s; your password in %d days!\n",$user,$days;#格式化輸出
          %d 整數 %g 浮點數

          27.die處理錯誤輸出

          28.讀取文件
          open CONFIG,"c:/test.txt";
          while(<CONFIG>){
          print $_."\n";
          }

          29. say == print  xxxx ."\n"  # say  相當 等于print 加換行符

          30.hash
          $family_name{"fred"}="flint";
          $family_name{"bar"} ="rubble";

          %family_name("fred","flint","bar","rubble");

          my %family_name=(
              "fred" => "flint",
              "bar" => "rubblle";
          )

          my @k=keys %family_name;
          my @v=values %family_name;  #return array

          31.
          each函數
          while( ($key,$value)=each %family_name ){
                  print "$key => $value\n";
          }
          exists函數
          if(exists $family_name("dino")){

          }
          delete函數
          delete $family{"fred"};

          32.\1,\2使用反向引用
          $_=""abba;
          if(/(.)\1/){#匹配到 bb
              print "it matched";
          }

          33. \d = [0-9]
          \w = [A-Za-z0-9_]
          [^\d] 非數字
          [^\w]非詞
          [^\s]非空白字符

          34./yes/i  # /i 不區分大小寫

          35./s 匹配任意字符 , 不包括換行

          36./x運行加入空白,便于閱讀理解

          37.m//模式匹配搜索功能
          S/// 模式匹配替換功能
          /g 全局替換

          38.@fields = split /separator/ , $string;

          39.my $result = join $glue,@pieces;
          my $x = join ":",4,5,6; # $x = "4:5:6";

          40.*貪婪 *?非貪婪版本

          41.從命令行進行在線編輯
          perl -p -w -e "s/ran/ra/g" fred.dat
          -p 打印  -n 去掉自動打印  -w 打開警告選項  -e 表示后面更得是代碼,而不是普通的參數

          42.last 類似break 

          43.my $stuff="Howdy world!";
          my $where=index($stuff,"wor"); # $where =  6

          44.my $mineral=substr("Fred J. Flintstone",8,5); # 值為Flint

          45.智能匹配對應不同德操作數,不同德處理方式
          %a ~~ %b         哈希的鍵是否一致
          %a ~~@b          至少%a中的一個鍵在列表@b之中
          %a ~~ /Fred/     至少一個鍵匹配給定的模式
          %a ~~ 'Fred'      哈希中某一指定鍵$a{'Fred'} 是否存在
          @a ~~ /Fred/     有一個元素匹配給定的模式
          @a ~~ 123        至少有一個元素轉化為數字后事123

          $name ~~ undef  $name確實尚未定義

          46.system 啟動子進程
          system "date";

          14.my $tarfile="some*.tar";
          my @dirs=qw(fred|flinet<bar&rubble> betty);
          system "tar"."cvf",$tarfile,@dirs;  帶參數的系統命令調用

          47.system的所有語法對exec都適用
          執行exec類似goto語句,跳轉到另個進程進行執行,當前perl進程會關閉
          chdir "/tmp" or die "cannot chdir /tmp: #!";
          ecec "bedrock","-o","args1",@ARGV;

          48.$ENV{'PATH'}="/home/rootbeer/bin:$ENV{'PATH'}";
          delete $ENV{'IFS'};
          my $make_result= system "make";
          改修改并不能影響shell或者其他父進程

          49.my $now =`date`;
          print "The time is now $now";
          魔力反引號調用進程

          50.perl -p -i.old -e "s/try//g" test.txt 替換文件中的內容,重新寫入文件, 原文件備份為old后綴的文件.
          windows下要用雙引號

          51.

          posted @ 2010-05-06 14:29 余堅 閱讀(255) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 浦北县| 宿松县| 乐至县| 明溪县| 阳泉市| 荔浦县| 宝丰县| 武清区| 深圳市| 民勤县| 崇明县| 定远县| 鹤山市| 辉县市| 宝应县| 察雅县| 香格里拉县| 友谊县| 朔州市| 景东| 丰原市| 班玛县| 宾川县| 南召县| 巩义市| 扎赉特旗| 宁城县| 泾川县| 梁山县| 翁牛特旗| 左贡县| 河曲县| 米泉市| 峨眉山市| 广平县| 昌邑市| 琼海市| 葵青区| 如东县| 郯城县| 阳朔县|