软件是对质量的不懈追求

2010年6月18日 #

linux du 查看文件夹占用空间


du -sh *

posted @ 2011-04-15 08:39 BlakeSu 阅读(267) | 评论 (0)编辑 收藏

Building Standalone Application with Maven2

If you are building standalone application in Java, Maven is your friend when packing your application,
There are two way to let Maven package your application, either as a single jar with all your dependencies jar.


 <plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-assembly-plugin</artifactId>
  <configuration>
   <descriptorRefs>
    <descriptorRef>jar-with-dependencies</descriptorRef>
   </descriptorRefs>
  </configuration>
 </plugin>



One advantage if you choose to do this way is if you need to sign your application jar.
This is needed if you are building a Java Web Start client and you need more access than connecting back to the server.
To read more about have Maven signing your jar read http://maven.apache.org/plugins/maven-jar-plugin/usage.html.
But if you choose to go this way, make sure that all license agreement are shipped with your one single jar.

Another way is to let Maven package your source code only and then referring the dependent jar file from the MANIFEST file.


 <plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  <configuration>
   <archive>
    <manifest>
     <addClasspath>true</addClasspath>
     <mainClass>se.msc.adapter.Main</mainClass>
     <classpathPrefix>lib/</classpathPrefix>
    </manifest>
   </archive>
  </configuration>
 </plugin>

posted @ 2011-02-24 13:03 BlakeSu 阅读(308) | 评论 (0)编辑 收藏

eclipse 终于有了列编辑功能

eclipse 3.5之后终于有了列编辑,快捷键是alt+shift+a,再次按此快捷键返回常规编辑状态。


posted @ 2010-10-15 11:33 BlakeSu 阅读(1466) | 评论 (0)编辑 收藏

LineNumberReader 指定文件编码


import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;


public class Main {
    
    
public static void main(String[] args) throws IOException {

        InputStreamReader isr 
= new InputStreamReader(new FileInputStream("15370720.pdf4"), "utf-16");
        LineNumberReader lnr
=new LineNumberReader(isr);
        String line 
= null;
        
while((line=lnr.readLine())!=null){  
           System.out.println(lnr.getLineNumber()
+"\t"+line);
        }
   }
}

posted @ 2010-08-05 09:13 BlakeSu 阅读(1018) | 评论 (0)编辑 收藏

Class.getResourceAsStream 和 ClassLoader.getResourceAsStream

两个方法的区别是资源的定义不同, 一个主要用于相对与一个object取资源,而另一个用于取相对于classpath的
资源,用的是绝对路径。

在使用Class.getResourceAsStream 时, 资源路径有两种方式, 一种以 / 开头,则这样的路径是指定绝对
路径, 如果不以 / 开头, 则路径是相对与这个class所在的包的。

在使用ClassLoader.getResourceAsStream时, 路径直接使用相对于classpath的绝对路径。

举例,下面的三个语句,实际结果是一样的:
   com.explorers.Test.class.getResourceAsStream("abc.jpg")
= com.explorers.Test.class.getResourceAsStream("/com/explorers/abc.jpg")
= ClassLoader.getResourceAsStream("com/explorers/abc.jpg")

posted @ 2010-07-28 16:31 BlakeSu 阅读(277) | 评论 (0)编辑 收藏

Standalone Java CAS Client

There's a variety of clients for CAS. The Java-based clients (JA-SIG, Yale, see JA-SIG website) typically handle the browser-based client interaction with CAS very well through ServletFilter implementations.

Now what about programmatic authentication, i.e. achieving authentication through non-browser based applications? There exists a CAS .NET client but I did not manage to find the appropriate Java implementation. So here goes - it is based on the Apache HttpClient.

In case I missed any existing implementation achieving the same purpose, let's look at the bright side: at least now I understand the CAS protocol :-)

My CAS client works within any application. It uses the HttpClient and behaves like a browser client as CAS requires cookie support.

Here's the code:
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.log4j.Logger;

/**
* The CasClient allows users to programmatically login
* to CAS protected services based on the CAS 2 protocol.
* This client behaves like a browser-client in terms of
* cookie handling.<br>
*
@author Mathias Richter
*/
public class CasClient
{
  
   
public static Logger LOG = Logger.getLogger( CasClient.class  );

   
public static final String LOGIN_URL_PART = "login";
   
public static final String SERVICE_VALIDATE_URL_PART = "serviceValidate";
   
public static final String TICKET_BEGIN = "ticket=";
   
private static final String LT_BEGIN = "name="lt" value="";
   public static final String CAS_USER_BEGIN = "<cas:user>";
   
public static final String CAS_USER_END = "</cas:user>";
  
   
private HttpClient fClient;
   
private String fCasUrl;
  
   
/**
    * Construct a new CasClient.
    *
    * 
@param casUrl The base URL of the CAS service to be used.
    
*/
   
public CasClient( String casBaseUrl )
   {
       
thisnew HttpClient(), casBaseUrl );
   }
  
   
/**
    * Construct a new CasClient which uses the specified HttpClient
    * for its HTTP calls.
    *
    * 
@param client
    * 
@param casBaseUrl
    
*/
   
public CasClient( HttpClient client, String casBaseUrl )
   {
       fClient 
= client;
       fCasUrl 
= casBaseUrl;
   }
  
   
/**
    * Authenticate the specified username with the specified password.
    * This will not yield any ticket, as no service is authenticated
    * against. This wil just set the CAS cookie in this client upon
    * successful authentication.
    *
    * 
@param username
    * 
@param password
    
*/
   
public void authenticate( String username, String password )
   {
       authenticate( 
null, username, password );
   }
  
   
/**
    * Validate the specified service ticket against the specified service.
    * If the ticket is valid, this will yield the clear text user name
    * of the autenticated user.<br>
    * Note that each service ticket issued by CAS can be used exactly once
    * to validate.
    *
    * 
@param serviceUrl
    * 
@param serviceTicket
    *
    * 
@return Clear text username of the authenticated user.
    
*/
   
public String validate( String serviceUrl, String serviceTicket )
   {
       String result 
= null;
       PostMethod method 
= new PostMethod( fCasUrl + SERVICE_VALIDATE_URL_PART );
       method.setParameter( 
"service", serviceUrl );
       method.setParameter( 
"ticket", serviceTicket );
       
try
       {
           
int statusCode = fClient.executeMethod(method);
           
if (statusCode != HttpStatus.SC_OK)
           {
               LOG.error( 
"Could not validate: " + method.getStatusLine() );
               method.releaseConnection();
           } 
else
           {   
               result 
= extractUser( new String( method.getResponseBody() ) );
           }
       } 
catch ( Exception x )
       {
           LOG.error( 
"Could not validate: " + x.toString () );
           x.printStackTrace();
       }
       method.releaseConnection();
       
return result;
   }
  
   
/**
    * Authenticate the specified user with the specified password against the
    * specified service.
    *
    * 
@param serviceUrl May be null. If a url is specified, the authentication will happen against this service, yielding a service ticket which can be validated.
    * 
@param username
    * 
@param password
    * 
@return A valid service ticket, if and only if the specified service URL is not null.
    
*/
   
public String authenticate( String serviceUrl, String username, String password )
   {
       String lt 
= getLt( serviceUrl );
       
if ( lt == null )
       {
           LOG.error( 
"Cannot retrieve LT from CAS. Aborting authentication for '" + username + "'" );
           
return null;
       }
       String result 
= null;
       PostMethod method 
= new PostMethod( fCasUrl + LOGIN_URL_PART );
       
if ( serviceUrl != null ) // optional
           method.setParameter( "service", serviceUrl );
       method.setParameter( 
"_eventId""submit" );
       method.setParameter(
"username", username );
       method.setParameter(
"password", password );
       method.setParameter(
"lt", lt );
       method.setParameter( 
"gateway""true" );
       
try
       {
           fClient.executeMethod(method);
           
if ( serviceUrl == null )
           {
               
if ( extractLt( new String( method.getResponseBody() ) ) != null ) // if CAS does not return a login page with an LT authentication was successful
               {
                   LOG.error( 
"Authentication for '" +  username + "' unsuccessful" );
                   
if ( LOG.isDebugEnabled() )
                       LOG.debug( 
"Authentication for '" + username + "' unsuccessful." );
               } 
else
               {
                   
if ( LOG.isDebugEnabled() )
                       LOG.debug( 
"Authentication for '" + username + "' unsuccessful." );
               }
           } 
else
           {
               Header h 
= method.getResponseHeader( "Location" );
               
if ( h != null )
                   result 
= extractServiceTicket( h.getValue() );
               
if ( result == null )
                   LOG.error( 
"Authentication for '" + username + "' unsuccessful." );
           }
       } 
catch ( Exception x )
       {
           LOG.error( 
"Could not authenticate'" + username + "':" + x.toString () );
       }
       method.releaseConnection();
       
return result;
   }
  
   
/**
    * Helper method to extract the user name from a "service validate" call to CAS.
    *
    * 
@param data Response data.
    * 
@return The clear text username, if it could be extracted, null otherwise.
    
*/
   
protected String extractUser( String data )
   {
       String user 
= null;
       
int start = data.indexOf( CAS_USER_BEGIN  );
       
if ( start >= 0 )
       {
           start 
+= CAS_USER_BEGIN.length();
           
int end = data.indexOf( CAS_USER_END );
           
if ( end > start )
               user 
= data.substring( start, end );
           
else
               LOG.warn( 
"Could not extract username from CAS validation response. Raw data is: '" + data + "'" );
       } 
else
       {
           LOG.warn( 
"Could not extract username from CAS validation response. Raw data is: '" + data + "'" );
       }
       
return user;
   }
  
   
/**
    * Helper method to extract the service ticket from a login call to CAS.
    *
    * 
@param data Response data.
    * 
@return The service ticket, if it could be extracted, null otherwise.
    
*/
   
protected String extractServiceTicket( String data )
   {
       String serviceTicket 
= null;
       
int start = data.indexOf( TICKET_BEGIN  );
       
if ( start > 0 )
       {
           start 
+= TICKET_BEGIN.length();
           serviceTicket 
= data.substring( start );
       }
       
return serviceTicket;
   }
  
   
/**
    * Helper method to extract the LT from a login form from CAS.
    *
    * 
@param data Response data.
    * 
@return The LT, if it could be extracted, null otherwise.
    
*/
   
protected String extractLt( String data )
   {
       String token 
= null;
       
int start = data.indexOf( LT_BEGIN  );
       
if ( start < 0 )
       {
           LOG.error( 
"Could not obtain LT token from CAS: LT Token not found in response." );
       } 
else
       {
           start 
+= LT_BEGIN.length();
           
int end = data.indexOf( """, start );
           token = data.substring( start, end );
       }       
       
return token;
   }
  
   
/**
    * This method requests the original login form from CAS.
    * This form contains an LT, an initial token that must be
    * presented to CAS upon sending it an authentication request
    * with credentials.<br>
    * If a service URL is provided (which is optional), this method
    * will post the URL such that CAS authenticates against the
    * specified service when a subsequent authentication request is
    * sent.
    *
    * 
@param serviceUrl
    * 
@return The LT token if it could be extracted from the CAS response.
    
*/
   
protected String getLt( String serviceUrl )
   {
       String lt 
= null;
       HttpMethod method 
= null;
       
if ( serviceUrl == null )
           method 
= new GetMethod( fCasUrl + LOGIN_URL_PART );
       
else
       {
           method 
= new PostMethod( fCasUrl + LOGIN_URL_PART );
           ( ( PostMethod ) method ).setParameter( 
"service", serviceUrl );
       }
       
try
       {
           
int statusCode = fClient.executeMethod(method);
           
if (statusCode != HttpStatus.SC_OK)
           {
               LOG.error( 
"Could not obtain LT token from CAS: " + method.getStatusLine() );
               method.releaseConnection();
           } 
else
           {
               Object o 
= method.getResponseHeaders() ;
               
return extractLt( new String( method.getResponseBody() ) );
           }
       } 
catch ( Exception x )
       {
           LOG.error( 
"Could not obtain LT token from CAS: " + x.toString () );
       }
       method.releaseConnection();
       
return lt;
   }
  
}

posted @ 2010-07-15 17:59 BlakeSu 阅读(401) | 评论 (0)编辑 收藏

java取文件换行符

System.getProperty("line.separator")

posted @ 2010-06-30 15:45 BlakeSu 阅读(299) | 评论 (0)编辑 收藏

禁止浏览器缓存

html
  <meta http-equiv="pragma" content="no-cache">
  
<meta http-equiv="cache-control" content="no-cache">
  
<meta http-equiv="expires" content="0">


servlet
          response.setHeader("pragma","no-cache");
          response.setHeader(
"cache-control","no-cache");
          response.setDateHeader(
"expires"0);


posted @ 2010-06-25 09:06 BlakeSu 阅读(238) | 评论 (0)编辑 收藏

frame 中跨域访问cookie(java)

response.addHeader("P3P","CP=CAO PSA OUR");

posted @ 2010-06-25 09:04 BlakeSu 阅读(400) | 评论 (0)编辑 收藏

vim的复制粘贴小结

原文地址 http://lsong17.spaces.live.com/blog/cns!556C21919D77FB59!603.trak


用vim这么久 了,始终也不知道怎么在vim中使用系统粘贴板,通常要在网上复制一段代码都是先gedit打开文件,中键粘贴后关闭,然后再用vim打开编辑,真的不 爽;上次论坛上有人问到了怎么在vim中使用系统粘贴板,印象里回复很多,有好几页的回复却没有解决问题,今天实在受不了了又在网上找办法,竟意外地找到 了,贴出来分享一下。

如果只是想使用系统粘贴板的话直接在输入模式按Shift+Inset就可以了,下面讲一下vim的粘贴板的基础知识,有兴趣的可以看看, 应该会有所收获的。
vim帮助文档里与粘贴板有关的内容如下:

  1. vim有12个粘贴板,分别是0、1、2、...、9、a、“、+;用:reg命令可以查看各个粘贴板里的内容。在vim中简单用y只是复制到 “(双引号)粘贴板里,同样用p粘贴的也是这个粘贴板里的内容;

  2. 要将vim的内容复制到某个粘贴板,需要退出编辑模式,进入正常模式后,选择要复制的内容,然后按"Ny完成复制,其中N为粘 贴板号(注意是按一下双引号然后按粘贴板号最后按y),例如要把内容复制到粘贴板a,选中内容后按"ay就可以了,有两点需要说明一下:
    • “号粘贴板(临时粘贴板)比较特殊,直接按y就复制到这个粘贴板中了,直接按p就粘贴这个粘贴板中的内容;
    • +号粘贴板是系统粘贴板,用"+y将内容复制到该粘贴板后可以使用Ctrl+V将其粘贴到其他文档(如firefox、gedit) 中,同理,要把在其他地方用Ctrl+C或右键复制的内容复制到vim中,需要在正常模式下按"+p;

  3. 要将vim某个粘贴板里的内容粘贴进来,需要退出编辑模式,在正常模式按"Np,其中N为粘贴板号,如上所述,可以按"5p将 5号粘贴板里的内容粘贴进来,也可以按"+p将系统全局粘贴板里的内容粘贴进来。

注意:在我这里,只有vim.gtk或vim.gnome才能使用系统全局粘贴板,默认的 vim.basic看不到+号寄存器。

posted @ 2010-06-18 14:21 BlakeSu 阅读(240) | 评论 (0)编辑 收藏

Linux下mail使用技巧

登录LINUX系统后,经常会看到"you have mail",却苦于不知道如何查看,相信菜鸟们都遇到过,偶在网上用“linux mail"找了很久,但大都是介绍mail服务器的,黄天总算没负有心人,在洪恩在找到一篇介绍基础的文章,不敢独享。
 
系统提供了用户 之间通信的邮件系统,当用户打开终端注册登录时发现系统给出如下信息:
    you have mail.

    这时用户可通过键入mail命令读取信件:

    $ mail

    mail程序将逐个显示用户的信件,并依照时间顺序,显示最新的信件。每显示一段信件,mail都询问用户是否要对该信件作些处理。若用户回答d,则表示 删除信件;若仅按回车键,表示对信件不作任何改动(信件仍旧保存,下次还可读这一信件);若回答p,则要求重复显示信件;s filename表示要把信件存入所命名的文件;若回答q,表示要从mail退出。

    我们在本章的第一个例子中演示了如何写一封信,作为练习,你可送信件给自己,然后键入mail读取自己发的信件,看看会有什么效果。(发信给自己是一种设 置备忘录的方法)。

    $mail frank 给自己写信

    subject: test

    This is a mail test

    CRL-d

    EOT

    $

    $mail 查看信件

    “/var/spool/mail/frank:”1 message 1 new

    >Nfrank@xteam.xteamlinux.comThu Mar 25 11:00 13/403 “test”

    &

    Message 1:

    From frank Thu Mar 25 11:00:25 1999/3/25

    Received: (fromfrank@localhost)

    by xteam.xteamlinux.com(8.8.4/8.8.4)

    id LAA05170 for frank;Thu 25 Mar 1999 11:00:25 GMT

    Date: Thu,25 Mar 1999 11:00:25 GMT

    From:RHS Linux User <frank@xteam.xteamlinux.com>

    Message-Id:<199903251142.LAA05170@xteam.xteamlinux.com>

    To:frank@xteam.xteamlinux.com

    Subject:test

    Status:R

    This is a mail test

    &

    mail命令还有很多其它用法,例如发送事先准备好的信件,或一次送信给若干人。还可以用其它方法送信件。

posted @ 2010-06-18 11:05 BlakeSu 阅读(183) | 评论 (0)编辑 收藏