随笔-109  评论-187  文章-25  trackbacks-0
  2006年12月8日
利用免费的英语角把英语练好

北京  也乐英语为了满足广大英语爱好者的需要特推出周末免费英语角服务,

北京英语角的组织形式如下:

    1:由也乐英语派出一名外教和一名助理负责组织英语角的活动。

    2: 英语角每周组织一次活动,也乐英语培训学校提供一间教室为大家的活动场所。

    3:英语爱好者可以免费参加英语角的活动,不收取任何费用,此活动是公益活动,也乐英

语不收取任何费用,也不限制参加次数。

    4:也乐英语免费提供给英语爱好者茶水、咖啡、以及活动所采用的书籍报纸。

    5:每周一到2个话题,由外教提前一周告诉大家,大家可以简单准备,以便在课堂上
        跟外教以及同学交流。
   
    6:外教会纠正大家的发音、语法、词汇上的错误,会形成一些总结,也希望大家能够畅所

欲言,大胆的说英语。

     7:所有参加英语角的爱好者,请您在交流期间把手机调为静音。

     也乐英语地址:北京丰台区马家堡西路15号 时代风帆大厦2区1901
     交通状况:地铁四号线角门西站A口上楼即可。 51、501、54、529、698、646、707 嘉园

二里东门下车
     联系电话:010-58423871  15330275871

      此活动由于报名数量众多,所以需要大家提前预约。
      也乐英语网站:www.yellenglish.com
      也乐英语 争做北京最好的英语角.
posted @ 2011-06-19 09:35 小小程序程序员混口饭吃 阅读(2115) | 评论 (0)编辑 收藏
我认为最大的冲击莫过于 惠普,oracle跟惠普的直接竞争会加大,从合作变为竞争,我认为惠普如果不收购redhat来对抗,未来肯定落下风!
posted @ 2009-04-22 09:56 小小程序程序员混口饭吃 阅读(631) | 评论 (0)编辑 收藏
     摘要: 上篇文章讲述了jacorb 的配置,本章讲叙其应用,随后的几篇文章会重点讲述corba的开发   JACORB开发以及corba的请求方式:    JacORB的应用开发一般分为以下五步: 1.写IDL接口定义 2.编译IDL接口定义生成Java类 3.实现步骤2中生成的接口 4.写服务器启动类,并注册到ORB 5.写客户端去获取服务对象引用 &nb...  阅读全文
posted @ 2007-11-22 10:41 小小程序程序员混口饭吃 阅读(8278) | 评论 (2)编辑 收藏

                   how to setup jacorb dev env
1:download JacORB_2_2

       http://www.jacorb.org/download.html
  download ant
       http://ant.apache.org/bindownload.cgi

2:extact JacORB_2_2.jar to d:\JacORB_2_2

3:setup sys environment

       set ANT_HOME=
       set JAVA_HOME=
       set JACORB_HOME=d:\JacORB_2_2
       set PATH=%PATH%;%ANT_HOME%\bin;%JAVA_HOME%\bin;%JACORB_HOME%\bin;
       set CLASSPAHT=.;%CLASSPAHT%;%ANT_HOME%\lib\ant.jar;%JACORB_HOME%\lib\jarorb.jar;%JACORB_HOME%\lib\idl.jar\;%JACORB_HOME%\lib\logkit-1.2.jar

4:rename %JACORB_HOME%\etc\jacorb_properties.template to %JACORB_HOME%\etc\jacorb.properties
  and modify the 50th line to 53th line to
 
       #ORBInitRef.NameService=file:/y:/nsiona.ref
      
ORBInitRef.NameService=file://d://test//NS_Ref
      
#ORBInitRef.NameService=http://www.x.y.z/~user/NS_Ref
      
#ORBInitRef.TradingService=http://www.x.y.z/~user/TraderRef
 
  modify 618th line to
       jacorb.naming.ior_filename=d://test//NS_Ref

5:rename  %JACORB_HOME%\jacotemplate.bat to %JACORB_HOME%\jaco.bat
 
  and modify related env variable
 
  rename   %JACORB_HOME%\idltemplate.bat to %JACORB_HOME%\idl.bat
  
  and modify related env variable

 

6:  use ant compile and build idl and java


     cd  %JACORB_HOME%\demo\grid  

     run ant
   
     the generate class file in %JACORB_HOME%\classes  and generated java file in %JACORB_HOME%\demo\grid


7: open a new cmd window:
          cd %JACORB_HOME%   ns
 
   you can see the following result:   
       [ configuration jacorb loaded from file %JAORB_HOME%\etc\jacorb.properties]

   open a new cmd window:
          cd %JACORB_HOME%   jaco demo.grid.Server
  you can see the following result:   
  [ configuration jacorb loaded from file %JAORB_HOME%\etc\jacorb.properties]
  
  open a new cmd window:
          cd %JACORB_HOME%   jaco demo.grid.client
    you can see the following result:   
 
  [ configuration jacorb loaded from file D:\work\nj\JACORB\etc\jacorb.properties]
   Height = 31
   Width = 14
   Old value at (30,13): 0.21
   Setting (30,13) to 470.11
   New value at (30,13): 470.11
   MyException, reason: This is only a test exception, no harm done :-)
   done.

posted @ 2007-11-21 10:36 小小程序程序员混口饭吃 阅读(4230) | 评论 (4)编辑 收藏
 
oracle的分析函数over 及开窗函数
一:分析函数over
Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是
对于每个组返回多行,而聚合函数对于每个组只返回一行。
下面通过几个例子来说明其应用。                                       
1:统计某商店的营业额。        
     date       sale
     1           20
     2           15
     3           14
     4           18
     5           30
    规则:按天统计:每天都统计前面几天的总额
    得到的结果:
    DATE   SALE       SUM
    ----- -------- ------
    1      20        20           --1天           
    2      15        35           --1天+2天           
    3      14        49           --1天+2天+3天           
    4      18        67            .          
    5      30        97            .
     
2:统计各班成绩第一名的同学信息
    NAME   CLASS S                         
    ----- ----- ----------------------
    fda    1      80                     
    ffd    1      78                     
    dss    1      95                     
    cfe    2      74                     
    gds    2      92                     
    gf     3      99                     
    ddd    3      99                     
    adf    3      45                     
    asdf   3      55                     
    3dd    3      78              
   
    通过:   
    --
    select * from                                                                       
    (                                                                            
    select name,class,s,rank()over(partition by class order by s desc) mm from t2
    )                                                                            
    where mm=1
    --
    得到结果:
    NAME   CLASS S                       MM                                                                                        
    ----- ----- ---------------------- ----------------------
    dss    1      95                      1                      
    gds    2      92                      1                      
    gf     3      99                      1                      
    ddd    3      99                      1          
   
    注意:
    1.在求第一名成绩的时候,不能用row_number(),因为如果同班有两个并列第一,row_number()只返回一个结果          
    2.rank()和dense_rank()的区别是:
      --rank()是跳跃排序,有两个第二名时接下来就是第四名
      --dense_rank()l是连续排序,有两个第二名时仍然跟着第三名
     
     
3.分类统计 (并显示信息)
    A   B   C                      
    -- -- ----------------------
    m   a   2                      
    n   a   3                      
    m   a   2                      
    n   b   2                      
    n   b   1                      
    x   b   3                      
    x   b   2                      
    x   b   4                      
    h   b   3
   select a,c,sum(c)over(partition by a) from t2                
   得到结果:
   A   B   C        SUM(C)OVER(PARTITIONBYA)      
   -- -- ------- ------------------------
   h   b   3        3                        
   m   a   2        4                        
   m   a   2        4                        
   n   a   3        6                        
   n   b   2        6                        
   n   b   1        6                        
   x   b   3        9                        
   x   b   2        9                        
   x   b   4        9                        
  
   如果用sum,group by 则只能得到
   A   SUM(C)                            
   -- ----------------------
   h   3                      
   m   4                      
   n   6                      
   x   9                      
   无法得到B列值       
  
=====

select * from test

数据:
A B C
1 1 1
1 2 2
1 3 3
2 2 5
3 4 6


---将B栏位值相同的对应的C 栏位值加总
select a,b,c, SUM(C) OVER (PARTITION BY B) C_Sum
from test

A B C C_SUM
1 1 1 1
1 2 2 7
2 2 5 7
1 3 3 3
3 4 6 6



---如果不需要已某个栏位的值分割,那就要用 null

eg: 就是将C的栏位值summary 放在每行后面

select a,b,c, SUM(C) OVER (PARTITION BY null) C_Sum
from test

A B C C_SUM
1 1 1 17
1 2 2 17
1 3 3 17
2 2 5 17
3 4 6 17

 

求个人工资占部门工资的百分比

SQL> select * from salary;

NAME DEPT SAL
---------- ---- -----
a 10 2000
b 10 3000
c 10 5000
d 20 4000

SQL> select name,dept,sal,sal*100/sum(sal) over(partition by dept) percent from salary;

NAME DEPT SAL PERCENT
---------- ---- ----- ----------
a 10 2000 20
b 10 3000 30
c 10 5000 50
d 20 4000 100

二:开窗函数           
      开窗函数指定了分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化,举例如下:
1:     
   over(order by salary) 按照salary排序进行累计,order by是个默认的开窗函数
   over(partition by deptno)按照部门分区
2:
  over(order by salary range between 5 preceding and 5 following)
   每行对应的数据窗口是之前行幅度值不超过5,之后行幅度值不超过5
   例如:对于以下列
     aa
     1
     2
     2
     2
     3
     4
     5
     6
     7
     9
   
   sum(aa)over(order by aa range between 2 preceding and 2 following)
   得出的结果是
            AA                       SUM
            ---------------------- -------------------------------------------------------
            1                       10                                                      
            2                       14                                                      
            2                       14                                                      
            2                       14                                                      
            3                       18                                                      
            4                       18                                                      
            5                       22                                                      
            6                       18                                                                
            7                       22                                                                
            9                       9                                                                 
             
   就是说,对于aa=5的一行 ,sum为   5-1<=aa<=5+2 的和
   对于aa=2来说 ,sum=1+2+2+2+3+4=14     ;
   又如 对于aa=9 ,9-1<=aa<=9+2 只有9一个数,所以sum=9    ;
              
3:其它:
     over(order by salary rows between 2 preceding and 4 following)
          每行对应的数据窗口是之前2行,之后4行
4:下面三条语句等效:           
     over(order by salary rows between unbounded preceding and unbounded following)
          每行对应的数据窗口是从第一行到最后一行,等效:
     over(order by salary range between unbounded preceding and unbounded following)
           等效
     over(partition by null)
posted @ 2007-11-13 13:33 小小程序程序员混口饭吃 阅读(50020) | 评论 (13)编辑 收藏

由于一些原因,最近要复习一些东西,所以就把JMS的东西再复习一遍,以下便是例子

jms 中最重要的几个概念destination,ACKNOWLEDGE,subscribe,durable subscribe

destination:topic queque
  queue简单点说就是1:1 一个消息只能由一个consumer去消费,别的consumer来消费的时候已经没了,先到先得
topic简单点说就是1:N 一个消息可以由多个consumer来消费,谁来消费都有
 subscribe,拿topic来说如果当前订阅不是持久订阅,只有再订阅后生产者生产得消息才能被consumer得到,持久订阅只要没有被consumer消费,早晚会消费这个消息
 
 
 
 一下是几个例子
 
 queuesend:queque消息产生
 queuereceive:queque消息得消费
 topicsend :topic消息得产生
 topicreceive1:topic消息的非订阅
 topicrecieve2:topic消息的持久订阅
 
 这个例子实在WEBLOGIC814上测试过的,当然要定义JMSSERVER,FACTORY,DESTINATION。
 
 
 
 QueueSend
 
 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Hashtable;

import javax.jms.JMSException;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class QueueSend {
 // Defines the JNDI context factory.
 public final static String JNDI_FACTORY = "weblogic.jndi.WLInitialContextFactory";

 // Defines the JNDI provider url.
 public final static String PROVIDER_URL = " t3://localhost:7001";

 // Defines the JMS connection factory for the queue.
 public final static String JMS_FACTORY = "SendJMSFactory";

 // Defines the queue.
 public final static String QUEUE = "SendJMSQueue";

 private QueueConnectionFactory qconFactory;

 private QueueConnection qcon;

 private QueueSession qsession;

 private QueueSender qsender;

 private Queue queue;

 private TextMessage msg;

 /**
  * Creates all the necessary objects for sending messages to a JMS queue.
  *
  * @param ctx
  *            JNDI initial context
  * @param queueName
  *            name of queue
  * @exception NamingException
  *                if operation cannot be performed
  * @exception JMSException
  *                if JMS fails to initialize due to internal error
  */
 public void init(Context ctx, String queueName) throws NamingException,
   JMSException {
  qconFactory = (QueueConnectionFactory) ctx.lookup(JMS_FACTORY);
  qcon = qconFactory.createQueueConnection();
  qsession = qcon.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
  queue = (Queue) ctx.lookup(queueName);
  qsender = qsession.createSender(queue);
  msg = qsession.createTextMessage();
  qcon.start();
 }

 /**
  * Sends a message to a JMS queue.
  *
  * @param message
  *            message to be sent
  * @exception JMSException
  *                if JMS fails to send message due to internal error
  */
 public void send(String message) throws JMSException {
  msg.setText(message);
  qsender.send(msg);
 }

 /**
  * Closes JMS objects.
  *
  * @exception JMSException
  *                if JMS fails to close objects due to internal error
  */
 public void close() throws JMSException {
  qsender.close();
  qsession.close();
  qcon.close();
 }

 /**
  * main() method.
  *
  * @param args
  *            WebLogic Server URL
  * @exception Exception
  *                if operation fails
  */
 public static void main(String[] args) throws Exception {
  try {
   InitialContext ic = getInitialContext();
   QueueSend qs = new QueueSend();
   qs.init(ic, QUEUE);
   readAndSend(qs);
   qs.close();
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 private static void readAndSend(QueueSend qs) throws IOException,
   JMSException {
  BufferedReader msgStream = new BufferedReader(new InputStreamReader(
    System.in));
  String line = null;
  boolean quitNow = false;
  do {
   System.out.print("Enter message (\"quit\" to quit): ");
   line = msgStream.readLine();
   if (line != null && line.trim().length() != 0) {
    qs.send(line);
    System.out.println("JMS Message Sent: " + line + "\n");
    quitNow = line.equalsIgnoreCase("quit");
   }
  } while (!quitNow);

 }

 private static InitialContext getInitialContext() throws NamingException {
  Hashtable env = new Hashtable();
  env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
  env.put(Context.PROVIDER_URL, PROVIDER_URL);
  return new InitialContext(env);
 }

}


QueueReceive

import java.util.Hashtable;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueReceiver;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class QueueReceive implements MessageListener {
 // Defines the JNDI context factory.
 public final static String JNDI_FACTORY = "weblogic.jndi.WLInitialContextFactory";

 // Defines the JNDI provider url.
 public final static String PROVIDER_URL = " t3://localhost:7001";

 // Defines the JMS connection factory for the queue.
 public final static String JMS_FACTORY = "SendJMSFactory";

 // Defines the queue.
 public final static String QUEUE = "SendJMSQueue";

 private QueueConnectionFactory qconFactory;

 private QueueConnection qcon;

 private QueueSession qsession;

 private QueueReceiver qreceiver;

 private Queue queue;

 private boolean quit = false;

 /**
  * Message listener interface.
  *
  * @param msg
  *            message
  */
 public void onMessage(Message msg) {
  try {
   String msgText;
   if (msg instanceof TextMessage) {
    msgText = ((TextMessage) msg).getText();
   } else {
    msgText = msg.toString();
   }

   System.out.println("Message Received: " + msgText);

//   if (msgText.equalsIgnoreCase("123")) {
//    synchronized (this) {
//     quit = true;
//     this.notifyAll(); // Notify main thread to quit
//    }
//   }
  } catch (JMSException jmse) {
   jmse.printStackTrace();
  }
 }

 /**
  * Creates all the necessary objects for receiving messages from a JMS
  * queue.
  *
  * @param ctx
  *            JNDI initial context
  * @param queueName
  *            name of queue
  * @exception NamingException
  *                if operation cannot be performed
  * @exception JMSException
  *                if JMS fails to initialize due to internal error
  */
 public void init(Context ctx, String queueName) throws NamingException,
   JMSException {
  qconFactory = (QueueConnectionFactory) ctx.lookup(JMS_FACTORY);
  qcon = qconFactory.createQueueConnection();
  qsession = qcon.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
  queue = (Queue) ctx.lookup(queueName);
  qreceiver = qsession.createReceiver(queue);
  qreceiver.setMessageListener(this);
  qcon.start();
 }

 /**
  * Closes JMS objects.
  *
  * @exception JMSException
  *                if JMS fails to close objects due to internal error
  */
 public void close() throws JMSException {
  qreceiver.close();
  qsession.close();
  qcon.close();
 }

 /**
  * main() method.
  *
  * @param args
  *            WebLogic Server URL
  * @exception Exception
  *                if execution fails
  */

 public static void main(String[] args) throws Exception {

  InitialContext ic = getInitialContext();
  QueueReceive qr = new QueueReceive();
  qr.init(ic, QUEUE);

  System.out
    .println("JMS Ready To Receive Messages (To quit, send a \"quit\" message).");

  // Wait until a "quit" message has been received.
  synchronized (qr) {
   System.out.println("111111111111");
   while (!qr.quit) {
    try {
     System.out.println("2222222222");
     qr.wait();
     System.out.println("333333333");
    } catch (InterruptedException ie) {
    }
   }
  }
  qr.close();
 }

 private static InitialContext getInitialContext() throws NamingException {
  Hashtable env = new Hashtable();
  env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
  env.put(Context.PROVIDER_URL, PROVIDER_URL);
  return new InitialContext(env);
 }

}

 

TopicSend

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Hashtable;

import javax.jms.JMSException;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicSession;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.jms.TopicPublisher;
public class TopicSend {
 // Defines the JNDI context factory.
 public final static String JNDI_FACTORY = "weblogic.jndi.WLInitialContextFactory";

 // Defines the JNDI provider url.
 public final static String PROVIDER_URL = " t3://localhost:7001";

 // Defines the JMS connection factory for the queue.
 public final static String JMS_FACTORY = "SendJMSFactory";

 // Defines the queue.
 public final static String TOPIC = "SendJMSTopic";

 private TopicConnectionFactory tconFactory;

 private TopicConnection tcon;

 private TopicSession tsession;

 private TopicPublisher tsender;

 private Topic topic;

 private TextMessage msg;
 public static InitialContext ic ;

 /**
  * Creates all the necessary objects for sending messages to a JMS queue.
  *
  * @param ctx
  *            JNDI initial context
  * @param queueName
  *            name of queue
  * @exception NamingException
  *                if operation cannot be performed
  * @exception JMSException
  *                if JMS fails to initialize due to internal error
  */
 public void init(Context ctx, String queueName) throws NamingException,
   JMSException {
  tconFactory = (TopicConnectionFactory) ctx.lookup(JMS_FACTORY);
  tcon = tconFactory.createTopicConnection();
  tsession = tcon.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
  System.out.println(topic);
  topic = (Topic) ctx.lookup(queueName);
  System.out.println(topic);
  tsender = tsession.createPublisher(topic);
  msg = tsession.createTextMessage();
  tcon.start();
 }

 /**
  * Sends a message to a JMS queue.
  *
  * @param message
  *            message to be sent
  * @exception JMSException
  *                if JMS fails to send message due to internal error
  */
 public void send(String message) throws JMSException ,NamingException{
  System.out.println(topic+"-----------");
  msg.setText(message);
  tsender.publish(msg);
 }

 /**
  * Closes JMS objects.
  *
  * @exception JMSException
  *                if JMS fails to close objects due to internal error
  */
 public void close() throws JMSException {
  tsender.close();
  tsession.close();
  tcon.close();
 }

 /**
  * main() method.
  *
  * @param args
  *            WebLogic Server URL
  * @exception Exception
  *                if operation fails
  */
 public static void main(String[] args) throws Exception {
  try {
   ic= getInitialContext();
   TopicSend ts = new TopicSend();
   ts.init(ic, TOPIC);
   readAndSend(ts);
   ts.close();
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 private static void readAndSend(TopicSend ts) throws IOException,
   JMSException,NamingException {
  BufferedReader msgStream = new BufferedReader(new InputStreamReader(
    System.in));
  String line = null;
  boolean quitNow = false;
  do {
   System.out.print("Enter message (\"quit\" to quit): ");
   line = msgStream.readLine();
   if (line != null && line.trim().length() != 0) {
    ts.send(line);
   
    System.out.println("JMS Message Sent: " + line + "\n");
    quitNow = line.equalsIgnoreCase("quit");
   }
  } while (!quitNow);

 }

 private static InitialContext getInitialContext() throws NamingException {
  Hashtable env = new Hashtable();
  env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
  env.put(Context.PROVIDER_URL, PROVIDER_URL);
  return new InitialContext(env);
 }

}

 

TopicReceive1

import java.util.Hashtable;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicSession;
import javax.jms.TopicSubscriber;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;


public class TopicReceive1 implements MessageListener {
 // Defines the JNDI context factory.
 public final static String JNDI_FACTORY = "weblogic.jndi.WLInitialContextFactory";

 // Defines the JNDI provider url.
 public final static String PROVIDER_URL = " t3://localhost:7001";

 // Defines the JMS connection factory for the queue.
 public final static String JMS_FACTORY = "SendJMSFactory";

 // Defines the queue.
 public final static String TOPIC = "SendJMSTopic";

 private TopicConnectionFactory tconFactory;

 private TopicConnection tcon;

 private TopicSession tsession;

 private TopicSubscriber tsubscriber;

 private Topic topic;

 private boolean quit = false;

 /**
  * Message listener interface.
  *
  * @param msg
  *            message
  */
 public void onMessage(Message msg) {
  System.out.println("===================");
  try {
   String msgText;
   if (msg instanceof TextMessage) {
    msgText = ((TextMessage) msg).getText();
   } else {
    msgText = msg.toString();
   }

   System.out.println("Message Received: " + msgText);

//   if (msgText.equalsIgnoreCase("123")) {
//    synchronized (this) {
//     quit = true;
//     this.notifyAll(); // Notify main thread to quit
//    }
//   }
  } catch (JMSException jmse) {
   jmse.printStackTrace();
  }
 }

 /**
  * Creates all the necessary objects for receiving messages from a JMS
  * queue.
  *
  * @param ctx
  *            JNDI initial context
  * @param queueName
  *            name of queue
  * @exception NamingException
  *                if operation cannot be performed
  * @exception JMSException
  *                if JMS fails to initialize due to internal error
  */
 public void init(Context ctx, String queueName) throws NamingException,
   JMSException {
  tconFactory = (TopicConnectionFactory) ctx.lookup(JMS_FACTORY);
  tcon = tconFactory.createTopicConnection();
  tsession = tcon.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
  topic = (Topic) ctx.lookup(queueName);
  tsubscriber = tsession.createSubscriber(topic);
  //System.out.println("12");
  //Message msg = treceiver.receive();
  //msg.acknowledge();
  //tsubscriber = tsession.createSubscriber(topic);Message msg = tsubscriber.receive();msg.acknowledge();
  //System.out.println(msg);
  tsubscriber.setMessageListener(this);
  tcon.start();
 }

 /**
  * Closes JMS objects.
  *
  * @exception JMSException
  *                if JMS fails to close objects due to internal error
  */
 public void close() throws JMSException {
  tsubscriber.close();
  tsession.close();
  tcon.close();
 }

 /**
  * main() method.
  *
  * @param args
  *            WebLogic Server URL
  * @exception Exception
  *                if execution fails
  */

 public static void main(String[] args) throws Exception {

  InitialContext ic = getInitialContext();
  TopicReceive1 tr1 = new TopicReceive1();
  tr1.init(ic, TOPIC);

  System.out
    .println("JMS Ready To Receive Messages (To quit, send a \"quit\" message).");
  
  

  // Wait until a "quit" message has been received.
//  synchronized (tr1) {
//   System.out.println("111111111111");
//   while (!tr1.quit) {
//    try {
//     System.out.println("2222222222");
//     tr1.wait();
//     System.out.println("333333333");
//    } catch (InterruptedException ie) {
//    }
//   }
//  }
  tr1.close();
 }

 private static InitialContext getInitialContext() throws NamingException {
  Hashtable env = new Hashtable();
  env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
  env.put(Context.PROVIDER_URL, PROVIDER_URL);
  return new InitialContext(env);
 }

}


TopicReceive2


import java.util.Hashtable;

import javax.jms.JMSException;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicSession;
import javax.jms.TopicSubscriber;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;


public class TopicReceive2 {
 // Defines the JNDI context factory.
 public final static String JNDI_FACTORY = "weblogic.jndi.WLInitialContextFactory";

 // Defines the JNDI provider url.
 public final static String PROVIDER_URL = " t3://localhost:7001";

 // Defines the JMS connection factory for the queue.
 public final static String JMS_FACTORY = "SendJMSFactory";

 // Defines the queue.
 public final static String TOPIC = "SendJMSTopic";

 private TopicConnectionFactory tconFactory;

 private TopicConnection tcon;

 private TopicSession tsession;

 private TopicSubscriber tsubscriber;

 private Topic topic;

 private boolean quit = false;


 /**
  * Creates all the necessary objects for receiving messages from a JMS
  * queue.
  *
  * @param ctx
  *            JNDI initial context
  * @param queueName
  *            name of queue
  * @exception NamingException
  *                if operation cannot be performed
  * @exception JMSException
  *                if JMS fails to initialize due to internal error
  */
 public void init(Context ctx, String queueName) throws NamingException,
   JMSException,InterruptedException {
  tconFactory = (TopicConnectionFactory) ctx.lookup(JMS_FACTORY);
  tcon = tconFactory.createTopicConnection();
  tcon.setClientID("IP10.200.7.104");
  tcon.start();
  
  tsession = tcon.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
  System.out.println("333333333333");
  topic = (Topic) ctx.lookup(queueName);
  //tsubscriber = tsession.createSubscriber(topic);
  tsubscriber= tsession.createDurableSubscriber(topic,"88888");
   for (int i=0; i<3; i++) {
             //
             TextMessage message = (TextMessage) tsubscriber.receive();
             System.out.println("message["+i+"]: " + message.getText());
         }
          Thread.sleep(10000);
  //System.out.println("12");
  //Message msg = treceiver.receive();
  //msg.acknowledge();
  //tsubscriber = tsession.createSubscriber(topic);Message msg = tsubscriber.receive();msg.acknowledge();
  //System.out.println(msg);

 }

 /**
  * Closes JMS objects.
  *
  * @exception JMSException
  *                if JMS fails to close objects due to internal error
  */
 public void close() throws JMSException {
  tsubscriber.close();
  tsession.close();
  tcon.close();
 }

 /**
  * main() method.
  *
  * @param args
  *            WebLogic Server URL
  * @exception Exception
  *                if execution fails
  */

 public static void main(String[] args) throws Exception {

  InitialContext ic = getInitialContext();
  TopicReceive2 tr2 = new TopicReceive2();
  tr2.init(ic, TOPIC);

  System.out
    .println("JMS Ready To Receive Messages (To quit, send a \"quit\" message).");
  
  

  // Wait until a "quit" message has been received.
//  synchronized (tr1) {
//   System.out.println("111111111111");
//   while (!tr1.quit) {
//    try {
//     System.out.println("2222222222");
//     tr1.wait();
//     System.out.println("333333333");
//    } catch (InterruptedException ie) {
//    }
//   }
//  }
  tr2.close();
 }

 private static InitialContext getInitialContext() throws NamingException {
  Hashtable env = new Hashtable();
  env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
  env.put(Context.PROVIDER_URL, PROVIDER_URL);
  return new InitialContext(env);
 }

}

posted @ 2007-08-15 09:20 小小程序程序员混口饭吃 阅读(1161) | 评论 (0)编辑 收藏

一、rpm包安装方式步骤:
引用:

1、找到相应的软件包,比如soft.version.rpm,下载到本机某个目录;

2、打开一个终端,su -成root用户;

3、cd soft.version.rpm所在的目录;

4、输入rpm -ivh soft.version.rpm




二、deb包安装方式步骤:

引用:
1、找到相应的软件包,比如soft.version.deb,下载到本机某个目录;

2、打开一个终端,su -成root用户;

3、cd soft.version.deb所在的目录;

4、输入dpkg -i soft.version.deb




三、tar.gz源代码包安装方式:

引用:
1、找到相应的软件包,比如soft.tar.gz,下载到本机某个目录;

2、打开一个终端,su -成root用户;

3、cd soft.tar.gz所在的目录;

4、tar -xzvf soft.tar.gz //一般会生成一个soft目录

5、cd soft

6、./configure

7、make

8、make install




四、tar.bz2源代码包安装方式:

引用:
1、找到相应的软件包,比如soft.tar.bz2,下载到本机某个目录;

2、打开一个终端,su -成root用户;

3、cd soft.tar.bz2所在的目录;

4、tar -xjvf soft.tar.bz2 //一般会生成一个soft目录

5、cd soft

6、./configure

7、make

8、make install




五、apt方式安装:

引用:
1、打开一个终端,su -成root用户;

2、apt-cache search soft 注:soft是你要找的软件的名称或相关信息

3、如果2中找到了软件soft.version,则用apt-get install soft.version命令安装软件 注:只要你可以上网,只需要用apt-cache search查找软件,用apt-get install软件




六、bin文件安装:

如果你下载到的软件名是soft.bin,一般情况下是个可执行文件,安装方法如下:

引用:
1、打开一个终端,su -成root用户;

2、chmod +x soft.bin

3、./soft.bin //运行这个命令就可以安装软件了




七、不需要安装的软件:

有了些软件,比如lumaqq,是不需要安装的,自带jre解压缩后可直接运行。假设下载的是lumaqq.tar.gz,使用方法如下:

引用:
1、打开一个终端,su -成root用户;

2、tar -xzvf lumaqq.tar.gz //这一步会生成一个叫LumaQQ的目录

3、cd LumaQQ

4、chmod +x lumaqq //设置lumaqq这个程序文件为可运行

5、此时就可以运行lumaqq了,用命令./lumaqq即可,但每次运行要输入全路径或切换到刚才生成的LumaQQ目录里

6、为了保证不设置路径就可以用,你可以在/bin目录下建立一个lumaqq的链接,用命令ln -s lumaqq /bin/ 即可,以后任何时候打开一个终端输入lumaqq就可以启动QQ聊天软件了

7、如果你要想lumaqq有个菜单项,使用菜单编辑工具,比如Alacarte Menu Editor,找到上面生成的LumaQQ目录里的lumaqq设置一个菜单项就可以了,当然你也可以直接到 /usr/share/applications目录,按照里面其它*.desktop文件的格式生成一个自己的desktop文件即可。

posted @ 2007-08-10 09:39 小小程序程序员混口饭吃 阅读(610) | 评论 (0)编辑 收藏

计划任务工具 cron 的配置和说明

作者:北南南北
来自:LinuxSir.Org
摘要:Linux操作系统中,计划任务通常由cron来承担,了解或掌握cron,能为我们管理服务器带来更多的便利,也能省却更多的时间。本文也举了一些简单明了的例子,为了让新手上路方便;

目录


++++++++++++++++++++++++++++++++++++++
正文
++++++++++++++++++++++++++++++++++++++


1、计划任务概说;

计划任务,是任务在约定的时间执行已经计划好的工作,这是表面的意思。在Linux中,我们经常用到 crond 服务器来完成这项工作。cron服务器可以根据配置文件约定的时间来执行特定的作务。比如我们可以在配置文件中约定每天早上4点,对httpd 服务器重新启动,这就是一个计划任务;

下面我们先来说说cron;


2、cron;

在Linux系统中,计划任务一般是由cron承担,我们可以把cron设置为开机时自动启动。cron启动后,它会读取它的所有配置文件(全局性配置文件/etc/crontab,以及每个用户的计划任务配置文件),然后cron会根据命令和执行时间来按时来调用度工作任务。


2.1 cron 的安装和启动;

在一般情况下,cron都是系统默认安装的,我们要学会查看软件包是否已经安装;


2.1.1 在Redhat 或 Fedora等RPM包管理的系统的安装;

判断系统是否已经安装cron相关的包

Fedora 5.0 系统的情况;

其它版本的Fedora及Redhat的系统和这相似;

[root@localhost ~]# rpm -qa |grep cron
vixie-cron-4.1-54.FC5
anacron-2.3-36.1
crontabs-1.10-7.1

 

其中vixie-cron软件包是cron的主程序,您可以通过下面的命令来了解它,其它软件包同理;

[root@localhost beinan]# rpm -ql vixie-cron

 

crontabs 软件包是用来安装、卸装、或列举用来驱动 cron 守护进程的表格的程序。cron 守护进程检查 crontab 文件来查看某个指定命令被调度执行的时间。如果命令已经调度,守护进程就会执行它们。了解crontabs软件包都安装了些什么,应该用下面的命令;

[root@localhost beinan]# rpm -ql crontabs

 

如果没有安装,可以从光盘中找出文件名带有cron字样的软件包来安装。

[root@localhost ~]# rpm -ivh vixie-cron-4.1-54.FC5*
[root@localhost ~]# rpm -ivh crontabs*

 

也可以用yum 来在线安装;

[root@localhost ~]# yum install vixie-cron
[root@localhost ~]# yum install crontabs

 


2.1.2 在Slackware系统中的安装;

在Slackware中cron软件包是 dcron,您可以在光盘中找出来安装它;

查看是否已经安装了dcron软件包,您可以这样查看。在这里能列出软件包详细的安装情况;

[root@localhost ~]# more /var/adm/packages/dcron*

 

如果没有安装,请用下面的命令来安装。在第一张安装盘中找出dcron软件包;

[root@localhost ~]# installpkg dcron*.tgz

 


2.1.3 cron 的开启、停止、重新启动方法;

cron配置文件被修改后,想让新文件生效,必须重新crond服务器,有两种方法可供选择;


第一种 在Fedora或Redhat 等以RPM包管理的系统中;

[root@localhost ~]# /etc/init.d/crond start
[root@localhost ~]# /etc/init.d/crond stop
[root@localhost ~]# /etc/init.d/crond restart

 

如果想在Fedora 和 Redhat 或以这些发行版为基础克隆的发行版,如果想自动开机运行,请用下面的办法;

[root@localhost ~]# chkconfig --levels 35 crond on

 

第二种:通用

[root@localhost ~]# pgrep crond 注:判断crond 是否在运行;
[root@localhost ~]# pkill crond 注:杀掉正在运行中的crond;
[root@localhost ~]# pgrep crond 注:查看是否被杀掉了;
[root@localhost ~]# /usr/sbin/crond 注:运行crond;

 


2.2 cron 配置文件;

cron 是一个服务器程序,我们都知道Linux的服务器的配置,大多是通过配置文件来完成的,cron自然也不例外,在Redhat/Fedora 等系统中它的全局性配置文件是/etc/crontab;在Slackware系统中,全局性文件是/var/spool/cron/crontabs/root 。每个用户也有自己的cron配置文件,我们可以通过crontab -e 来编辑它;


2.2.1 全局性配置文件;

下面是一个全局性的配置文件例子,以Fedora Core 5为例;

[root@localhost ~]# more /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
1 * * * * root run-parts /etc/cron.hourly
#
2 4 * * * root run-parts /etc/cron.daily
#
22 4 * * 7 root run-parts /etc/cron.weekly
#
42 4 1 * * root run-parts /etc/cron.monthly
#
0,5,10,15,20,25,30,35,40,45,50,55 * * * * root /usr/bin/mrtg /etc/mrtg/mrtg.cfg

 

对于全局性配置文件,我们要用root权限来更改,一般是通过crontab -e 来修改。但有时也并不一定是这样的,比如Fedora Core 5 如果通过crontab -e 修改的是root用户的cron 配置文件。所以我们要在Fedora Core 5中修改全局性配置文件可以用vi 编辑器来修改。vi的用法请参考:《文件编辑器 vi》

在全局性配置文件中,定义了可执行命令的路径环境变量,所用SHELL类型的定义等,这些大多不用修改;我们经常添加的是计划任务或修改任务执行的时间等;

在全局性配置文件中,我们发现有类似这些行;

1 * * * * root run-parts /etc/cron.hourly 注:表示每个小时的第一分钟,开始执行/etc/hourly目录下的可执行程序或脚本;
2 4 * * * root run-parts /etc/cron.daily 注:表示每天的4点2分,开始执行/etc/cron.daily目录下的可执行程序或脚本;
22 4 * * 7 root run-parts /etc/cron.weekly 注:每年第7个周4点我22分,开始执行 /etc/cron.weekly目录下的可执行程序或脚本;
42 4 1 * * root run-parts /etc/cron.monthly 注:每月第1天的4点42分,开始执行/etc/cron.monthly目录下的可执行程序或脚本;

 

这些行是用来在同一时间批量执行任务的,我们在以后的例子中独立出来解说,在这里只是让大家心中有数;


2.2.2 cron 配置计划任务的书写格式

分钟 小时 日 月 周 [用户名] 命令

 

说明:

第一段应该定义的是:分钟,表示每个小时的第几分钟来执行。范围是从0-59
        第二段应该定义的是:小时,表示从第几个小时来执行,范围是从0-23
        第三段应该定义的是:日期,表示从每个月的第几天执行,范围从1-31
        第四段应该定义的是:月,表示每年的第几个月来执行,范围从1-12
        第五段应该定义的是:周,表示每周的第几天执行,范围从0-6,其中 0表示星期日。
        每六段应该定义的是:用户名,也就是执行程序要通过哪个用户来执行,这个一般可以省略;
        第七段应该定义的是:执行的命令和参数。
        

注:其中用户名可是省略,用户名定义的是程序用哪个用户来执行,比如mysql服务器,我们可以定义成以mysql用户来启动、停止、重新启动,这时要写上用户名;不过对于cron来说意义不是太大,因为每个用户都有自己的cron配置文件。有些程序的启动必须用到root用户,这时我们就可以修改root用户的cron配置文件就行了。在每个用户的配置文件中,不必指定用户名。

我们可以把计划任务写在全局性配置文件中,如果您想把一个计划放入全局性配置文件中,就得改发行版所对应的cron全局配置文件,比如Fedora 5的全局性配置文件是/etc/crontab文件;

每个用户也能定义自己的cron配置文件,用crontab -e 命令来定义;

举一例:让机器在每天8点30分重新启动;

关于时间格式中有7个字段。我们可以直接更改或者添加,当然这是系统任务调用。举个例子,比如我在每天的早上8点30分重新启动机器,就可以在
/etc/crontab中加入下面的两句,第一句就是注释了。以#号开始,后面写一个自己能知道这是什么任务的备注;

# reboot OS
30 8 * * * root /sbin/reboot

 

第一段应该定义的是:分钟,表示每个小时的第几分钟来执行。范围是从0-59
第二段应该定义的是:小时,表示从第几个小时来执行,范围是从0-23
第三段应该定义的是:日期,表示从每个月的第几天执行,范围从1-31
第四段应该定义的是:月,表示每年的第几个月来执行,范围从1-12
第五段应该定义的是:周,表示每周的第几天执行,范围从0-6,其中 0表示星期日。
每六段应该定义的是:用户名,也就是执行程序要通过哪个用户来执行,这个一般可以省略;
第七段应该定义的是:执行的命令和参数。

对比上面的例子就知道,30是不是分钟??8是不是小时?如果有*代表的地方,表示全部,也就是说,每个月,每天,每星期都要执行。root 表示用root用户执行,命令是/sbin/reboot ,也就是说,系统在每天 8点30分重新启动;

我们可以把每天8点30分重新启动的计划任务写入cron全局性配置文件中,也可以定义在root用户自己的cron配置文件中。如果定义在root自己的配置文件,请用root身份来执行 crontab -e 来修改配置文件;crontab -e 进入修改配置文件的过程,其实和vi的用法一样,请参看vi 的用法:《文件编辑器 vi》

让配置文件生效:如果让配置文件生效,还得重新启动cron,切记,既然每个用户下的cron配置文件修改后。也要重新启动cron服务器。

在Fedora 和Redhat中,我们应该用;

[root@localhost ~]# /etc/init.d/crond restart

 

如果让crond 在开机时运行,应该改变其运行级别;

[root@localhost ~]# chkconfig --levels 35 crond on

 

在Slackware中,如果开机自动运行;

查看/etc/rc.d/rc.M文件是否有如的行,如果没有就加上,大多是有的;

# Start crond (Dillon's crond):
if [ -x /usr/sbin/crond ]; then
  /usr/sbin/crond -l10 >>/var/log/cron 2>&1
</cdoe>
<b>
如果想让立即让cron重启生效,也可以用下面的办法;
</b>
<code>
[root@localhost ~]# pgrep crond 注:查看crond服务器是否运行;
2022
[root@localhost ~]# pkill crond 注:杀死crond;
[root@localhost ~]# pgrep crond 注:查看crond是否退出;
[root@localhost ~]# /usr/sbin/crond 注:启动crond;
[root@localhost ~]# pgrep crond 注:查看crond 是否已经运行得起来了;
3883

 


2.2.3 关于同一时间,同时执行多个任务的定义方法;

我们在前面已经说过,在全局性配置文件中,有类似如下的段落;

1 * * * * root run-parts /etc/cron.hourly 注:表示每个小时的第一分钟,开始执行/etc/hourly目录下的可执行程序或脚本;
2 4 * * * root run-parts /etc/cron.daily 注:表示每天的4点2分,开始执行/etc/cron.daily目录下的可执行程序或脚本;
22 4 * * 7 root run-parts /etc/cron.weekly 注:每年第7个周4点我22分,开始执行 /etc/cron.weekly目录下的可执行程序或脚本;
42 4 1 * * root run-parts /etc/cron.monthly 注:每月第1天的4点42分,开始执行/etc/cron.monthly目录下的可执行程序或脚本;

 

举例来说,我想在每天5点10分来重新启动httpd 服务器,与此同时,我们也可以同时下载一个ISO文件。如果我们按书写计划任务的规则一条一条的来书写,并添加到全局是有点麻烦。不如写一个脚本放在/etc/crond.daily目录中。然后把其权限设置为755 (关于权限的设置,请参考:《Linux 文件和目录的属性》)。

当然我们得改一改上面的 带有/etc/cron.daily那行,改为如下;

10 5 * * * root run-parts /etc/cron.daily
</cdoe>
然后我们到/etc/crond.daily目录中创建两个文件,一个是用来重启httpd服务器的,如下;
<code>
[root@localhost cron.daily]# touch httpd.sh
[root@localhost cron.daily]# chmod 755 httpd.sh
[root@localhost cron.daily]# echo "/etc/init.d/httpd restart" > httpd.sh
[root@localhost cron.daily]# more httpd.sh
/etc/init.d/httpd restart

 

如果我想在每天5点20分下载FC5的镜像,可以再创建一个文件fc5down.sh

[root@localhost cron.daily]# touch fc5down.sh
[root@localhost cron.daily]# chmod 755 fc5down.sh
[root@localhost cron.daily]# echo "/usr/bin/wget http://mirrors.kernel.org/fedora/core/5/i386/iso/FC-5-i386-DVD.iso" > fc5down.sh
[root@localhost cron.daily]# more fc5down.sh
/usr/bin/wget http://mirrors.kernel.org/fedora/core/5/i386/iso/FC-5-i386-DVD.iso

 

然后我们重新启动一下crond就行了;

[root@localhost cron.daily]# pkill crond
[root@localhost cron.daily]# prep crond
[root@localhost cron.daily]# crond&

 

注意:我只是想说明一下,在同一时间 执行多个计划任务的简单用法,并不是有意教给您每天早上都下载FC5的映像。我举这个例子是为了初学者了解这个功能。如果您有好多的任务在某一时刻执行,那就自己写脚本文件。放在/etc目录下的cron.hourly 、cron.daily 、cron.weekly 、cron.monthly 目录中。凡是放进这些目录的可执行脚本,都能在约定的时间内准确执行。每个目录有每个目录的用途;


2.2.4 对于用户自身的cron 配置文件的说明;

每个用户都有自己的cron配置文件,通过crontab -e 就可以编辑,一般的情况下,在Fedora和Redhat的发行版,我们编辑好用户的cron配置文件保存退出后,系统会自动就存放于/var/spool/cron/目录中,文件以用户名命名。在Slackware中是位于/var/spool/cron/crontabs/目录中。其它的发行版都差不多,有点类似。自己找找吧;查看用户的计划任务是crontab -l

crontab -e 注:编辑用户的cron配置文件;
crontab -l 注:查看用户的计划任务;

 

比如我用beinan用户来运行crontab -e ;

[beinan@localhost ~]$ id 注:判断所用用户身份;
uid=500(beinan) gid=500(beinan) groups=500(beinan)
[beinan@localhost ~]$ crontab -e 注:编辑用户beinan的计划任务;

 

我们在里面定义一个任务;

40 20 * * * /usr/bin/wget http://mirrors.kernel.org/fedora/core/5/i386/iso/FC-5-i386-DVD.iso

 

保存退出后,我们用下面的命令来查看beinan用户的计划任务;

[beinan@localhost ~]$ crontab -l
40 20 * * * /usr/bin/wget http://mirrors.kernel.org/fedora/core/5/i386/iso/FC-5-i386-DVD.iso

 

配置好后,我们还要重新启动crond服务器,每个用户cron配置文件的改动都得重新启动crond服务器;前面已经说过了,这里省略;值得注意的是重启crond服务器,需要root权限,您可以用su命令切换到root 用户,然后再来重启crond;


在Fedora或Redhat等以RPM包管理的发行版中;

[beinan@localhost ~]$ su
口令:
[root@localhost beinan]# /etc/init.d/crond restart
停止 crond: [确定]
启动 crond: [确定]

 


也可以先杀死crond,再运行crond命令的办法来启动;

[root@localhost beinan]# pkill crond
[root@localhost beinan]# pgrep crond
[root@localhost beinan]# /usr/sbin/crond
[root@localhost beinan]# pgrep crond
6664

 


3、计划任务的应用范围;

计划任务主要是让系统自动完成一些工作。比如我们可以让系统自动在某一时刻清理或备份httpd服务器的日志,然后重新启动httpd服务器,这对网络管理员来说是很重要的。也可以让系统自动清空位于/tmp目录的垃圾文件。

另外值得一提的是,LinuxSir.Org 有很多子站,每个子站都有RSS,能让这些站点的RSS相互投递,也是用cron来完成,比如是在早上4点左右开始执行这个任务。这是一个极为耗费资源的过程,如果不是放在在线人少的时候,基本无法完成,所以只能放在早上进行。作为SIR的管理员,不可能每天早上4点起来点鼠标来完成这些事吧。所以最好的办法就是通过cron来自动运行,以在服务器最清闲的时候来完成这项工作;

posted @ 2007-07-24 11:14 小小程序程序员混口饭吃 阅读(928) | 评论 (0)编辑 收藏
分辨率设置高了X起来后花屏,无法通过X界面恢复回去,只能用普通用户进来后,su 到root上来找到XORG.CONF   文件

修改/etc/X11/xorg.conf 

screen里面的设置最大的那个去掉就好了,重启就可以了
posted @ 2007-07-24 09:19 小小程序程序员混口饭吃 阅读(2590) | 评论 (2)编辑 收藏

一、注销,关机,重启

  注销系统的logout命令

  1,Logout 注销是登陆的相对操作,登陆系统后,若要离开系统,用户只要直接下达logout命令即可:

  [root@localhost root]#logout

  Red Hat Linuxrelease 9(Shike)

  Kernel 2.4.20.8 on an i686

  Login: ← 回到登陆的画面

  2,关机或重新启动的shutdown命令

  Shutdown命令可以关闭所有程序,依照用户的需要,重新启动或关机。

  参数说明如下:

   立即关机:-h 参数让系统立即关机。范例如下:

  [root@localhost root]#shutdown –h now ← 要求系统立即关机

   指定关机时间:time参数可指定关机的时间;或设置多久时间后运行shutdown命令,范例如下:

  [root@localhost root]#shutdown now ← 立刻关机

  [root@localhost root]#shutdown +5 ← 5分钟后关机

  [root@localhost root]#shutdown 10:30 ← 在10:30时关机

   关机后自动重启:-r 参数设置关机后重新启动。范例如下:

  [root@localhost root]#shutdown -r now ← 立刻关闭系统并重启

  [root@localhost root]#shutdown -r 23:59 ← 指定在23:59时重启动

  3,重新启动计算机的reboot命令

  顾名思义,reboot命令是用来重新启动系统的。常用的参数如下:

   -f 参数:不依正常的程序运行关机,直接关闭系统并重新启动计算机。

   -I 参数:在在重新启动之前关闭所有网络接口。

  虽然reboot命令有个参数可以使用,但是一般只需要单独运行reboot命令就可以了

posted @ 2007-07-17 13:27 小小程序程序员混口饭吃 阅读(16086) | 评论 (0)编辑 收藏
 

最近测试OMADM1.2的时候,039040两个case是关于TLS SSL的,搞的很迷惑,最近看了一下原来TLS几乎就是SSL,基本上一摸一样而已。

Sun.com上面看到

SSL was developed by Netscape in 1994, and with input from the Internet community, has evolved to become a standard. It is now under the control of the international standards organization, the Internet Engineering Task Force (IETF). The IETF has renamed SSL to Transport Layer Security (TLS), and released the first specification, version 1.0, in January 1999. TLS 1.0 is a modest upgrade to the most recent version of SSL, version 3.0. The differences between SSL 3.0 and TLS 1.0 are minor.

 

所以这2case基本上测试一个就足够了。

另外tls本来就是传输层上的一个协议,所以要是用HTTPS的话,如果你用应用服务器,比如TOMCAT WBLOGIC,他们都支持SSL,根本不需要程序实现任何东西,只要你会使用keytool生成证书就可以了。

 

这块只是牵扯到JSSE,具体可以到http://java.sun.com/j2se/1.4.2/docs/guide/security/jsse/JSSERefGuide.html#Introduction

Keytool其实再JRE/LIB/SECUTITY下面的包里面,

C:\j2sdk1.4.2_05\jre\lib\security>keytool

keytool 用法:

 

-certreq     [-v] [-alias <alias>] [-sigalg <sigalg>]

             [-file <csr_file>] [-keypass <keypass>]

             [-keystore <keystore>] [-storepass <storepass>]

             [-storetype <storetype>] [-provider <provider_class_name>] ...

 

-delete      [-v] -alias <alias>

             [-keystore <keystore>] [-storepass <storepass>]

             [-storetype <storetype>] [-provider <provider_class_name>] ...

 

-export      [-v] [-rfc] [-alias <alias>] [-file <cert_file>]

             [-keystore <keystore>] [-storepass <storepass>]

             [-storetype <storetype>] [-provider <provider_class_name>] ...

 

-genkey      [-v] [-alias <alias>] [-keyalg <keyalg>]

             [-keysize <keysize>] [-sigalg <sigalg>]

             [-dname <dname>] [-validity <valDays>]

             [-keypass <keypass>] [-keystore <keystore>]

             [-storepass <storepass>] [-storetype <storetype>]

             [-provider <provider_class_name>] ...

 

-help

 

-identitydb [-v] [-file <idb_file>] [-keystore <keystore>]

             [-storepass <storepass>] [-storetype <storetype>]

             [-provider <provider_class_name>] ...

 

-import      [-v] [-noprompt] [-trustcacerts] [-alias <alias>]

             [-file <cert_file>] [-keypass <keypass>]

             [-keystore <keystore>] [-storepass <storepass>]

             [-storetype <storetype>] [-provider <provider_class_name>] ...

 

-keyclone    [-v] [-alias <alias>] -dest <dest_alias>

             [-keypass <keypass>] [-new <new_keypass>]

             [-keystore <keystore>] [-storepass <storepass>]

             [-storetype <storetype>] [-provider <provider_class_name>] ...

 

-keypasswd   [-v] [-alias <alias>]

             [-keypass <old_keypass>] [-new <new_keypass>]

             [-keystore <keystore>] [-storepass <storepass>]

             [-storetype <storetype>] [-provider <provider_class_name>] ...

 

-list        [-v | -rfc] [-alias <alias>]

             [-keystore <keystore>] [-storepass <storepass>]

             [-storetype <storetype>] [-provider <provider_class_name>] ...

 

-printcert   [-v] [-file <cert_file>]

 

-selfcert    [-v] [-alias <alias>] [-sigalg <sigalg>]

             [-dname <dname>] [-validity <valDays>]

             [-keypass <keypass>] [-keystore <keystore>]

             [-storepass <storepass>] [-storetype <storetype>]

             [-provider <provider_class_name>] ...

 

-storepasswd [-v] [-new <new_storepass>]

             [-keystore <keystore>] [-storepass <storepass>]

             [-storetype <storetype>] [-provider <provider_class_name>] ...

 

 

1:生成一个

C:\j2sdk1.4.2_05\jre\lib\security>keytool -genkey -alias duke -keyalg RSA   -val

idity 10 -storetype jks -keystore trust1.jks

2:查看你刚才生成的证书

C:\j2sdk1.4.2_05\jre\lib\security>keytool -list -v -keystore trust1.jks

当然要输入密码了。

但是我不太明白服务器需要2个证书1个是custom identity keystore 一个是custom trust keystore为什么2 的输入类型不一样,一个是KeyEntry另外一个是trustedCertEntry,这个流程到底是怎样的?申请证书->导入证书 还是不明白,请指教。

posted @ 2007-07-04 17:43 小小程序程序员混口饭吃 阅读(1975) | 评论 (1)编辑 收藏
     摘要: 最近复习了一下AXIS,写了2个小例子1:  bean  1package test.soap.vo; 2 3import java.io.Serializable; 4 5public class User implements Serializable {&nbs...  阅读全文
posted @ 2007-06-15 15:48 小小程序程序员混口饭吃| 编辑 收藏

Java对象序列化学习笔记- -

                                      

beejoy 原创  来源:java研究组织


目前网络上关于对象序列化的文章不少,但是我发现详细叙述用法和原理的文章太少。本人
把自己经过经验总结和实际运用中的体会写成的学习笔记贡献给大家。希望能为整个java社
区的繁荣做一点事情。
 
序列化的过程就是对象写入字节流和从字节流中读取对象。将对象状态转换成字节流之后,
可以用java.io包中的各种字节流类将其保存到文件中,管道到另一线程中或通过网络连接
将对象数据发送到另一主机。对象序列化功能非常简单、强大,在RMI、Socket、JMS、EJB
都有应用。对象序列化问题在网络编程中并不是最激动人心的课题,但却相当重要,具有
许多实用意义。
一:对象序列化可以实现分布式对象。主要应用例如:RMI要利用对象序列化运行远程主机
上的服务,就像在本地机上运行对象时一样。
二:java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。
可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。利用对象序
列化可以进行对象的"深复制",即复制对象本身及引用的对象本身。序列化一个对象可能
得到整个对象序列。
 
从上面的叙述中,我们知道了对象序列化是java编程中的必备武器,那么让我们从基础开始
,好好学习一下它的机制和用法。


java序列化比较简单,通常不需要编写保存和恢复对象状态的定制代码。实现java.io.Seri
alizable接口的类对象可以转换成字节流或从字节流恢复,不需要在类中增加任何代码。只
有极少数情况下才需要定制代码保存或恢复对象状态。这里要注意:不是每个类都可序列化,
有些类是不能序列化的,例如涉及线程的类与特定JVM有非常复杂的关系。

序列化机制:

序列化分为两大部分:序列化和反序列化。序列化是这个过程的第一部分,将数据分解成字
节流,以便存储在文件中或在网络上传输。反序列化就是打开字节流并重构对象。对象序列
化不仅要将基本数据类型转换成字节表示,有时还要恢复数据。恢复数据要求有恢复数据的
对象实例。ObjectOutputStream中的序列化过程与字节流连接,包括对象类型和版本信息。
反序列化时,JVM用头信息生成对象实例,然后将对象字节流中的数据复制到对象数据成员中。
下面我们分两大部分来阐述:


处理对象流:
(序列化过程和反序列化过程)


java.io包有两个序列化对象的类。ObjectOutputStream负责将对象写入字节流,ObjectInp
utStream从字节流重构对象。
    我们先了解ObjectOutputStream类吧。ObjectOutputStream类扩展DataOutput接口。
writeObject()方法是最重要的方法,用于对象序列化。如果对象包含其他对象的引用,则
writeObject()方法递归序列化这些对象。每个ObjectOutputStream维护序列化的对象引用表,
防止发送同一对象的多个拷贝。(这点很重要)由于writeObject()可以序列化整组交叉引用的
对象,因此同一ObjectOutputStream实例可能不小心被请求序列化同一对象。这时,进行反引用
序列化,而不是再次写入对象字节流。
下面,让我们从例子中来了解ObjectOutputStream这个类吧。

// 序列化 today's date 到一个文件中.
    FileOutputStream f = new FileOutputStream("tmp");
    ObjectOutputStream s = new ObjectOutputStream(f);
    s.writeObject("Today");
    s.writeObject(new Date());
    s.flush();


 
现在,让我们来了解ObjectInputStream这个类。它与ObjectOutputStream相似。它扩展Dat
aInput接口。ObjectInputStream中的方法镜像DataInputStream中读取Java基本数据类型的
公开方法。readObject()方法从字节流中反序列化对象。每次调用readObject()方法都返回
流中下一个Object。对象字节流并不传输类的字节码,而是包括类名及其签名。readObject()
收到对象时,JVM装入头中指定的类。如果找不到这个类,则readObject()抛出
ClassNotFoundException,如果需要传输对象数据和字节码,则可以用RMI框架。
ObjectInputStream的其余方法用于定制反序列化过程。
例子如下:

//从文件中反序列化 string 对象和 date 对象
    FileInputStream in = new FileInputStream("tmp");
    ObjectInputStream s = new ObjectInputStream(in);
    String today = (String)s.readObject();
    Date date = (Date)s.readObject();

 

定制序列化过程:


序列化通常可以自动完成,但有时可能要对这个过程进行控制。java可以将类声明为serial
izable,但仍可手工控制声明为static或transient的数据成员。
例子:一个非常简单的序列化类。

public class simpleSerializableClass implements Serializable{
    String sToday="Today:";
    transient Date dtToday=new Date();
}


序列化时,类的所有数据成员应可序列化除了声明为transient或static的成员。将变量声
明为transient告诉JVM我们会负责将变元序列化。将数据成员声明为transient后,序列化
过程就无法将其加进对象字节流中,没有从transient数据成员发送的数据。后面数据反序
列化时,要重建数据成员(因为它是类定义的一部分),但不包含任何数据,因为这个数据
成员不向流中写入任何数据。记住,对象流不序列化static或transient。我们的类要用
writeObject()与readObject()方法以处理这些数据成员。使用writeObject()与readObject()
方法时,还要注意按写入的顺序读取这些数据成员。
关于如何使用定制序列化的部分代码如下:

//重写writeObject()方法以便处理transient的成员。
public void writeObject(ObjectOutputStream outputStream) throws IOException{
    outputStream.defaultWriteObject();//使定制的writeObject()方法可以
                        利用自动序列化中内置的逻辑。
    outputStream.writeObject(oSocket.getInetAddress());
    outputStream.writeInt(oSocket.getPort());
}
//重写readObject()方法以便接收transient的成员。
private void readObject(ObjectInputStream inputStream) throws
IOException,ClassNotFoundException{
    inputStream.defaultReadObject();//defaultReadObject()补充自动序列化
    InetAddress oAddress=(InetAddress)inputStream.readObject();
    int iPort =inputStream.readInt();
    oSocket = new Socket(oAddress,iPort);
    iID=getID();
    dtToday =new Date();
}

 

完全定制序列化过程:

如果一个类要完全负责自己的序列化,则实现Externalizable接口而不是Serializable接口
。Externalizable接口定义包括两个方法writeExternal()与readExternal()。利用这些方
法可以控制对象数据成员如何写入字节流.类实现Externalizable时,头写入对象流中,
然后类完全负责序列化和恢复数据成员,除了头以外,根本没有自动序列化。这里要注意了。
声明类实现Externalizable接口会有重大的安全风险。writeExternal()与readExternal()
方法声明为public,恶意类可以用这些方法读取和写入对象数据。如果对象包含敏感信息,
则要格外小心。这包括使用安全套接或加密整个字节流。到此为至,我们学习了序列化的
基础部分知识。关于序列化的高级教程,以后再述。

posted @ 2007-06-08 13:39 小小程序程序员混口饭吃 阅读(957) | 评论 (1)编辑 收藏

1:redhat 语言设置 这个语言是安装的时候决定的,并不是每个user决定的

  /etc/sysconfig/i18n

2:redhat 模式

  /etc/inittab

id:5 xwindow  mode id:3 test mode

3:使用光驱

  挂载光驱mount /dev/hdc /mnt/cdrom

  卸载光驱时候出现 umount: /mnt/cdrom device is busy

  是因为当前的目录已经在光盘目录,应该先退出这个目录

4:安装rpm 文件

  rpm -ivh xxx.rpm  安装包

  rpm -qa |grep "tt*"  查询安装过的包

  rpm -e xxx


5:在text mode 上翻页 shift +pageup pagedown

6:ls -al
  查找隐藏的文件

7:set 查看环境变量  .bash_profile

  用户的语言设置与这个相关,如果没有设置会默认使用/etc/sysconfig/i18n

8:查看文件类型以及编码方式

  file *.file

9: 编码转换

命令名称:iconv
命令格式:iconv -f "文件目前编码" -t "文件转换后的编码" -o "转换后生成的新文件名" "源文件名"
ex: iconv -f ISO-8859 -t utf-8 -o mydoc.inc.php mydoc.inc.php.bak

 

 

 


 

posted @ 2007-05-21 17:31 小小程序程序员混口饭吃| 编辑 收藏
CMWAP 和 CMNET 只是中国移动人
为划分的两个GPRS接入方式。前者是为手机WAP上网而设立的,后者则主要是为PC、笔记
本电脑、PDA等利用GPRS上网服务。它们在实现方式上并没有任何差别,但因为定位不同
,所以和CMNET相比,CMWAP便有了部分限制,资费上也存在差别。

WAP只是一种GPRS应用模式,它与GRPS的接入方式是无关的。WAP应用采用的实现方
式是“终端+WAP网关+WAP服务器”的模式,不同于一般Internet的“终端+服务器”
的工作模式。主要的目的是通过WAP网关完成WAP-WEB的协议转换以达到节省网络流量和
兼容现有WEB应用的目的。WAP网关从技术的角度讲,只是一个提供代理服务的主机,它
不一定由网络运营商提供。但据我所知,中国移动GPRS网络目前只有唯一的一个WAP网关
:10.0.0.172,有中国移动提供,用于WAP浏览(HTTP)服务。有一点需要注意,WAP网
关和一般意义上的局域网网关是有差别的,标准的WAP网关仅仅实现了HTTP代理的功能,
并未完成路由、NAT等局域网网关的功能。这就决定了它在应用上所受到的限制。

为了从应用中区别两者的定位,中国移动对CMWAP作了一定的限制,主要表现在CMW
AP接入时只能访问GPRS网络内的IP(10..*),而无法通过路由访问Internet。我们
用CMWAP浏览Internet上的网页就是通过WAP网关协议或它提供的HTTP代理服务实现的。
也就是需要通过中国移动GPRS网络唯一的一个WAP网关:10.0.0.172。CMNET拥有完全的
Internet访问权,这里就不多说了,主要让我们来看看CMWAP。因为有了上面提到的限制
,CMWAP的适用范围就要看WAP网关所提供的支持了。目前,中国移动的WAP网关对外只提
供HTTP代理协议(80和8080端口)和WAP网关协议(9201端口)。

因此,只有满足以下两个条件的应用才能在中国移动的CMWAP接入方式下正常工作:
1. 应用程序的网络请求基于HTTP协议。2. 应用程序支持HTTP代理协议或WAP网关协议。
而cmnet则不受任何的限制。

说白了就是说通过cmwap的方式访问,需要走中国移动的网关通过http协议去连接,
这样的后果就是速度会变慢,相信很多朋友都用过代理服
务器吧,对,就是那个感觉,而通过cmnet来连接的,就是直接连接到无限乾坤在inter
net上的服务器,速度会比cmwap的快一些。说完了速度,就该说价格了,如果玩家没有
采用套餐的话,那cmwap和cmnet都是一样的,1kb三分钱,或者订了一个xx元包xM的套餐
,超出部分1k一分钱,这种时候,同等价格都一样,据我了解,cmwap版本流量会大一些
,所以还是用cmnet比较好,又快又省钱。但是对于很多地方的动感地带用户而言,情况
可能有些不同,相当一些地方的动感地带只能访问cmwap,不能访问cmnet,所以没地选
择了,还有一些地方有动感地带的包月上网卡,有10元、20元、50元的等等,具体的要
看当地的资费政策了,而这些包月卡通常只包cmwap的流量,这个时候如果用cmnet还要
另外付费,所以建议这些用户还是使用cmwap吧。最后总结一下,如果玩家的手机卡只能
访问cmwap或者有cmwap包月的套餐,那么您就使用cmwap连接来游戏,否则使用cmnet连
接是更好的选择


所以,一句话,有wap包月的地区就使用wap包月上网,没有包月业务的就用cmnet,反正都是按流量算钱,为什么不选择快一点的呢(但还是要提醒大家,按流量计费产生的费用是巨大的,要
多多注意)
posted @ 2007-05-17 10:50 小小程序程序员混口饭吃 阅读(1970) | 评论 (0)编辑 收藏
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class TestConn {

    
public TestConn() {
        
super();
    }


    
public static void main(String[] args) throws Exception {
        String url 
= null;
        getHttpText(url);
        System.out.println(
"abc");
    }


    
public static String getHttpText(String str) {
        URL url 
= null;
        
try {
            url 
= new URL(str);
        }
 catch (MalformedURLException e) {
            e.printStackTrace();
        }

        HttpURLConnection huc 
= null;
        
try {

            huc 
= (HttpURLConnection) url.openConnection();
            huc.setRequestMethod(
"GET");
            huc.setRequestProperty(
"Content-Type",
                    
"application/vnd.syncml.dm+xml");
            
// application/x-www-form-urlencoded
            
// application/vnd.syncml.dm+xml
            huc.setDoOutput(true);
            huc.setRequestProperty(
"Cache-Control""private");
            huc.setRequestProperty(
"Accept-Charset""utf-8");
            huc.setRequestProperty(
"Accept""application/vnd.syncml.dm+xml");
            huc.setRequestProperty(
"Content-Length""3");
            DataOutputStream printout;
            printout 
= new DataOutputStream(huc.getOutputStream());
            printout.writeBytes(
"abc");
        }
 catch (IOException e) {
            e.printStackTrace();
        }

        InputStream is 
= null;
        
try {
            is 
= huc.getInputStream();
        }
 catch (IOException e) {
            e.printStackTrace();
        }

        BufferedReader br 
= new BufferedReader(new InputStreamReader(is));
        StringBuffer sb 
= new StringBuffer();
        String line 
= "";
        
try {
            
while ((line = br.readLine()) != null{
                sb.append(line).append(
"\n");
            }

        }
 catch (IOException e) {
            e.printStackTrace();
        }

        
return sb.toString();
    }


}

posted @ 2007-05-14 09:16 小小程序程序员混口饭吃 阅读(4062) | 评论 (0)编辑 收藏
记事本=notepad
计算器=calc
注册表=regedit
系统检测=dxdiag
画图=mspaint
远程桌面=mstsc
posted @ 2007-04-29 17:27 小小程序程序员混口饭吃 阅读(486) | 评论 (1)编辑 收藏
 其实这个问题不是程序的问题,主要是property中文问题,这个问题可以通过build解决掉

 <native2ascii src="." dest="build" includes="*Props.txt" />
把配置文件编码 windows下默认GBK编码,linux 要加encoding
代码一行不用改,放心汉化吧~~
posted @ 2007-04-24 15:21 小小程序程序员混口饭吃 阅读(1907) | 评论 (3)编辑 收藏
如题,有没有朋友知道开源的在线图片处理的程序,在页面上直接处理图片,有点象iephotoshop,功能即使不如imageJ,也要有一些基本的功能.
posted @ 2007-04-19 09:20 小小程序程序员混口饭吃 阅读(2082) | 评论 (2)编辑 收藏
话说“你不理财,财不理你”

那么什么是理财呢???

很多人都很知道“理财”,也都无时无刻不在理财,但把理财说清楚的人却不多...

很多人说到理财想到的就是投资,就是开源节流,就是合理分配财产,等等… …

其实,
---------------------------------------------------------
理财就是对财富的有效管理。

理财的内涵很广,包括开源节流,包括合理分配财产,包括投资增值等,但又不止于这些。从理财的基础理论来讲,主要包括:现金管理、资产管理、债务管理、风险管理、投资管理等等。
---------------------------------------------------------
现金管理是理财的基础。包括各项收入的筹划和管理,包括各项税费的管理,包括各项日常支出的管理,包括现金的积累和短期储蓄等等。具体的管理工具和形式有各式各样的银行卡片,各式各样的储蓄方式,各种各样的支出方式,包括各种各样的节俭手段等等。

资产管理是理财的重心。资产具体包括固定资产、流动资产等。固定资产比如房产、铺面等等,流动资产包括储蓄资产、投资资产、保险资产等。资产管理是家庭理财的重点,合理有效的管理需要。

债务管理是理财的关键。债务并非完全的坏事,合理的管理债务是迅速达到理财目标的捷径,只要把债务控制在一定的合理的范围之内,对优化财务结构有很好的作用。比如在财力许可的情况下可以通过按揭提前实现高品质的家庭生活,通过金融信用延迟支付货款往来等,从而更快实现财务目标。

风险管理是理财的关键。有效的风险管理是现代社会先进的标志,没有对风险的管理交通工具不能上路运营,贸易货运不能出门出海流通,商场大厦无法入住营业,流动性和小家化也决定个人进行风险管理是大势所趋。

投资管理是理财的要点。现在很多对投资理财非常渴望,一提到投资赚钱眼睛就发亮,主要是因为目前我国金融环境不够完善,安全稳健的大众投资品种非常匮乏,很多人的收益局限于2个点以内,相较于去年初高达5个点的通货膨胀显然是一个很大的威胁。而国内居民的投资信息和能力先天不足,稍有异动即可能遭遇陷阱的现状导致国民储蓄逐年逼高。在理财范畴内投资增值是最需要专业知识的,也是实现家庭理财目标最关键的步骤。所以如何实现投资的有效管理就很重要。


总之,理财就是所有与财富有关的活动的总称,是现代社会重要的组成要素,是现代人过上幸福快乐生活必备的基本素质。

而且,五个理财的基本方面也是互相关联,互为制约,相互促进的。

posted @ 2007-02-13 11:07 小小程序程序员混口饭吃 阅读(350) | 评论 (0)编辑 收藏

           

做为新一代 3G 及移动终端浪潮的设备管理平台, OMA DM 技术获得了众多设备厂商和运营商的追捧,也为软件开发商提供新的崛起机会。业内目前也有不少工作在做这方面的软件。好多公司这方面的产品都是基于Sync4J开发的。

Sync4J 开源项目为我们提供了完整的 OMA DM 1.1.2 规范的 Java 实现。本文记录了 Sync4J DM Server 安装以及使用SCTS模拟器来模拟手机做一个DM业务,本文没有用PPG来通过短信方式来用真手机来做,只是用模拟器来做的。SCTSOMA官方提供的一个测试工具,主要用来测试DMserver的,这里我们用来测试Sync4JSync4JSCTS的集合是我们学习OMA的一个很好的方式。

1 :用到以下工具。

  Oracle9i

  jboss-3.2.3

  sync4j-server-dm-1.4.9   sync4j 官方有下载

  SCTS_DeviceManagement_v1.12.zip  OMA 官方网站有下载。

 

 

2 :安装调试

  2.1 解压文件:

   jboss-3.2.3 解压到 C:\jboss-3.2.3

sync4j-server-dm-1.4.9 解压到 D:\sync4j\all\server-dm .

直接安装 SCTS.

  2.2 配置环境变量

  JAVA_HOME=

  J2EE_HOME= C:\jboss-3.2.3

  SYNCSERVER_HOME= D:\sync4j\all\server-dm

2.3 修改SYNCSERVER_HOME下的几个配置文件

   SYNCSERVER_HOME\ default\config\common\properties\ Sync4j.properties

把第一行改为 server.uri=http://your IP:8080/sync4j-dm/dm

  SYNCSERVER_HOME\ install.properties 改为

(1)server-name=http://10.150.4.7:8080/sync4j-dm/dm

 (2) oracle 的数据库,以下是用来连接数据库的,所以一定要配置正确。

jdbc.classpath=C:\\jboss-3.2.3\\server\\all\\lib\\ojdbc14.jar

jdbc.driver=oracle.jdbc.driver.OracleDriver

jdbc.url=jdbc:oracle:thin:@11.11.11.11:1521:abc

jdbc.user=sync4j

jdbc.password=sync4j

2 4以上都做完后用Sync4j自己带的安装脚本安装sync4j dm server

SYNCSERVER_HOME 下运行 bin\install.cmd jboss32

2 5由于这个版本存在了一个bug,所以在2.4做完后要修改

SYNCSERVER_HOME\bin\start.cmd

把倒数第三行 call\run.bat -c sync4j 改为

call %J2EE_HOME%\bin\run.bat -c sync4j

2 6 SYNCSERVER_HOME 运行 bin\start.cmd安装

所有程序到安装到了 jboss_home 下了,可以到 JBOSS_HOME\ server\sync4j 就可以看到了,看一下你的 oralce 库里面也初始化了数据,表也建好了。

 

2 7 添加一个手机(我们其实是个模拟器)上来

http://your ip:8080/dmdemo/jsp/addDevice.jsp 填写一个 IMEI:111111111111111,

 

2 8 配置scts

Add device : IMEI:111111111111111 然后点 apply

点击 DM Account

Name sync4j

Server:sync4j

Con : 不用填写

Address http://your ip /sync4j-dm/dm

Port :8080

Server authentication:

  Digest : 找数据库用 sync4j 的数据库中, sycn4j_device 表中 :IMEI:111111111111111 server password 为: srvpwd, 把这个 password 填写到 password 中。

Client authentication

   DIGEST: USER NAME: sync4j PASSWORD: sync4j

Add 就可以了

然后点 connect 连一下 DM SERVER 看看能否连上。 第一次一般会出现认证错我,接着再联一次就可以了, SCTS 有日志可以查看。

 

如果连通了那下面就来做一个采集模拟器上的一个节点吧。

 

http://your ip:8080/dmdemo/index.html

device id IMEI:111111111111111 login

1.JPG

 

  然后点击 add to operation list

2.JPG

然后用 SCTS 主动回联一下,看看 server 能够拿到这个节点的值

3.JPG

你会看到 6 message !!!

详细看一下这 6 message 你会发现,这个节点的采集已经成功了!

 

 

 

 

posted @ 2007-02-05 10:02 小小程序程序员混口饭吃 阅读(9268) | 评论 (11)编辑 收藏

 

 1 import  java.io.BufferedReader;
 2 import  java.io.InputStreamReader;
 3 import  java.security.MessageDigest;
 4
 5 import  sun.misc.BASE64Decoder;
 6 import  sun.misc.BASE64Encoder;
 7
 8 public   class  ConvertNounce  {
 9
10      //  Digest = H(B64(H(username:password)):nonce)
11      //  b1=B64(H(username:password));
12      //
13      //
14      /**
15      *  @param  args
16       */

17      public   static   void  main(String[] args)  throws  Exception  {
18         
19
20         
21      //     if(args.length!=3) throw new Exception("args is wrong ,there is must by three args :username password nextNounce");
22
23         InputStreamReader reader  =   new  InputStreamReader(System.in);
24         BufferedReader input  =   new  BufferedReader(reader);
25     
26         
27         System.out.println( " input username: " );
28         String username  = input.readLine();
29         System.out.println( " input password: " );
30         String pwd  =  input.readLine();
31         System.out.println( " input nextNounce: " );
32         
33         String serverNounce  =  input.readLine();
34         String clientNounce  =   null ;
35
36         System.out.println( "" );
37         
38         System.out.println( " userName= " + username);
39         System.out.println( " password= " + pwd);
40         System.out.println( " nextNounce= " + serverNounce);
41          byte [] b1  =  calculateDigestAndEcode64(username, pwd);
42         
43      //     System.out.println("b1="+new String(b1));
44         
45          // server 下来的nounce一定要先做B64的解码,否则算出来的结果对不上
46         serverNounce  = new  String( new  BASE64Decoder().decodeBuffer(serverNounce));
47         
48      //     System.out.println(serverNounce);
49
50          byte [] bserverNounce  =  serverNounce.getBytes();
51
52          byte [] buf  =   new   byte [b1.length  +   1   +  bserverNounce.length];
53
54         System.arraycopy(b1,  0 , buf,  0 , b1.length);
55
56         buf[b1.length]  =  ( byte ' : ' ;
57         System.arraycopy(bserverNounce,  0 , buf, b1.length + 1 ,
58                         bserverNounce.length);
59         MessageDigest md  =  MessageDigest.getInstance( " MD5 " );
60         
61      //     System.out.println(new String(buf));
62
63          byte [] digest  =  md.digest(buf);
64         
65      //     System.out.println(new String(digest));
66
67         clientNounce  =   new  BASE64Encoder().encode(digest);
68         System.out.println( "" );
69         System.out.println( " result Nounce= " + clientNounce);
70         
73     }

74
75      public   static   byte [] calculateDigestAndEcode64(String username,
76             String password)  throws  Exception  {
77
78         MessageDigest md  =  MessageDigest.getInstance( " MD5 " );
79         String cred  =   "" ;
80          if  (username  !=   null {
81             cred  =  username.trim();
82         }

83         cred  +=   " : " ;
84          if  (password  !=   null {
85             cred  +=  password.trim();
86         }

87      //     System.out.println(cred);
88          //  System.out.println(new String(md.digest(cred.getBytes())));
89          return   new  BASE64Encoder().encode(md.digest(cred.getBytes()))
90                 .getBytes();
91     }

92     
93     
94
95 }

96
posted @ 2007-01-11 14:57 小小程序程序员混口饭吃 阅读(1351) | 评论 (0)编辑 收藏

范伟先生名言:猪撞树上了,你撞猪上了吧

  我有4种理解:
      1:猪撞树上了,你撞在猪上,猪比较软,你比猪幸运
      2:人家猪都撞树上了,你又往人家身上撞,不想让猪活了?
      3:猪往树上撞,他智商低,你比不过他,去撞猪泄愤啊?
      4:你撞了猪,猪不跟你一般见识,他去撞树

posted @ 2006-12-19 09:31 小小程序程序员混口饭吃 阅读(1644) | 评论 (6)编辑 收藏

最近写一个东西,在网上看到这个计划书的范本,很不错,抄下来

商业计划书目录



报告目录

第一部分 摘要(整个计划的概括) (文字在2-3页以内)



一. 项目简单描述(目的、意义、内容、运作方式)

二. 市场目标概述

三. 项目优势及特点简介

四. 利润来源简析

五. 投资和预算

六. 融资方案(资金筹措及投资方式)

七. 财务分析(预算及投资报酬)



第二部分 综述



第一章 项目背景

一. 项目的提出原因

二. 项目环境背景

三. 项目优势分析(资源、技术、人才、管理等方面)

四. 项目运作的可行性

五. 项目的独特与创新分析

第二章 项目介绍

一. 网站建设宗旨

二. 定位与总体目标

三. 网站规划与建设进度

四. 资源整合与系统设计

五. 网站结构/栏目板块

六. 主要栏目介绍

七. 商业模式

八. 技术功能

九. 信息/资源来源

十. 项目运作方式

十一.网站优势(资源/内容/模式/技术/市场等)

十二.无形资产

十三.策略联盟

十四.网站版权

十五.收益来源概述

十六.项目经济寿命



第三章. 市场分析

一. 互联网市场状况及成长

二. 商务模式的市场地位

三. 目标市场的设定

四. 传统行业市场状况(网站市场资源的基础)

五. 市场定位及特点(消费群体、消费方式、消费习惯及影响市场的主要因素分析

市场规模、市场结构与划分,特定受众等

六. 市场成长(网站PageView与消费者市场)

七. 本项目产品市场优势(对于特定人群的市场特点的省事、省时、省力、省钱等)

八. 市场趋势预测和市场机会

九. 行业政策

第四章 竞争分析

一. 有无行业垄断

二. 从市场细分看竞争者市场份额

三. 主要竞争对手情况

第五章 商业实施方案

一. 商业模式实施方案总体规划介绍

二. 营销策划

三. 市场推广

四. 销售方式与环节

五. 作业流程

六. 采购、销售政策的制定

七. 价格方案

八. 服务、投诉与退货

九. 促销和市场渗透(方式及安排、预算)

1. 主要促销方式

2. 广告/公关策略、媒体评估

3. 会员制等

十. 获利分析

十一. 销售资料统计和销售纪录方式,销售周期的计算。

十二. 市场开发规划,销售目标(近期、中期),销售预估(3-5年)销售额、占有率及

计算依据



第六章 技术可行性分析



一. 平台开发

二. 数据库

三. 系统开发

四. 网页设计

五. 安全技术

六. 内容设计

七. 技术人员

八. 知识产权

第七章 项目实施

1. 项目实施构想(公司的设立、组织结构与股权结构)

2. 网站开发进度设计与阶段目标

3. 营销进度设计与阶段目标

4. 行政管理部门的建立、职工的招募和培训安排

5. 项目执行的成本预估



第八章 投资说明



一. 资金需求说明(用量/期限)

二. 资金使用计划(即用途)及分期

三. 项目投资构成和固定资产投资的分类

四. 主要流动资金构成

五. 投资形式(贷款/利率/利率支付条件/转股-普通股、优先股、任股权/对应

价格等)

六. 资本结构

七. 股权结构

八. 股权成本

九. 投资者介入公司管理之程度说明

十. 报告(定期向投资者提供的报告和资金支出预算)

十一. 杂费支付(是否支付中介人手续费)

第九章 投资报酬与退出

一. 股票上市

二. 股权转让

三. 股权回购

四. 股利



第十章 风险分析与规避

一. 政策风险

二. 资源风险

三. 技术风险

四. 市场风险

五. 内部环节脱节风险

六. 成本控制风险

七. 竞争风险

八. 财务风险(应收帐款/坏帐/亏损)

九. 管理风险(含人事/人员流动/关键雇员依赖)

十. 破产风险

第十一章 管理



一. 公司组织结构

二. 现有人力资源或经营团队

三. 管理制度及协调机制

四. 人事计划(配备/招聘/培训/考核)

五. 薪资、福利方案

六. 股权分配和认股计划



第十二章 经营预测

一. 网站经营

1.访问人数成长预测

2.会员增长预测

3.行业联盟预测

二. 销售数量、销售额、毛利率、成长率、投资报酬率预估及计算依据

第十三章 财务可行性分析

一. 财务分析说明

二. 财务数据预测

1. 收入明细表

2. 成本费用明细表

3. 薪金水平明细表

4. 固定资产明细表

5. 资产负债表

6. 利润及利润分配明细表

7. 现金流量表

三. 财务分析指标

反映财务盈利能力的指标

a.投资回收期(Pt)

b.投资利润率

c.投资利税率

d.不确定性分析



第三部分 附录

一. 附件



1. 主要经营团队名单及简历

2. 专业术语说明

3. 企业形象设计/宣传资料(标识设计、说明书、出版物、包装说明等)



二. 附表



1. 市场受众分析(人群分布/数量等)表

2. 互联网成长状况表

3. 主要设备清单

4. 互联网市场调查表

5. 预估分析表

6. 各种财务报表及财务预估表

posted @ 2006-12-18 13:48 小小程序程序员混口饭吃 阅读(10618) | 评论 (2)编辑 收藏

 

1: 下载 cvsnt-2.5.03.2382(http://www.cvsnt.org)

2: 安装完全采用默认就可以了,安装完可以不重启

3 :开始菜单 ->CVSNT-> Control Panel . 停止 CVS NT

 

4 :进入 repository configuration 点击 add 添加一个如图所示:

   Localtion  填写一个 D:/CVSRoot

   Name     填写 /cvs

 

 

 

 

 

  

cvs_rep.GIF 

5 :进入 server settting

 

 

CVS_server_setting.GIF 

  Run as 选择一个 windows 下已有用户比如 (administrator) ,其余不用修改,应用就可以了。

6 :进入 about :CVSNT 启动 . CVS 已经配置完毕,至于安全什么方面的东西我没有弄过。

 

7: 打开 eclilpse ,file->new->other ,CVS

 

 CVS_ECLIPSE1.GIF

 

 

CVS_ECLIPSE2.GIF 

 

 

输入 Host repository path 、用户名、密码 ,其余默认,然后 next

CVS_ECLIPSE3.GIF 

 

Next

 

CVS_ECLIPSE4.GIF 

Next

 

CVS_ECLIPSE5.GIF 

Next

 

CVS_ECLIPSE6.GIF 

 

一切搞定,你可以建立一个目录然后 就可以commit .

posted @ 2006-12-14 16:14 小小程序程序员混口饭吃 阅读(13060) | 评论 (6)编辑 收藏
1、长的惊险.....

2、你小时候被猪亲过吧?

3、你长的很 爱guo 很 敬业 很 有骨气

4、长得真有创意,活得真有勇气!

5、你长的真t m 后现代

6、你长的好象车祸现场

7、你长的外形不准 比例没打好

8、你干嘛用屁股挡住脸啊!

9、我觉得世界上就只有两种人能吸引人,一种是特漂亮的 一种就是你这样的

10、你的长相很提神的说!!

11、你需要回炉重造

12、他们怎么能管你叫猪呢??这太不像话了!总不能人家长的像什么就叫人家什么吧!怎么能说你长得像猪呢?那是侮辱了猪。

13、*,你T.M.D.长得太好认了。

14、长的很科幻,长的很抽象!

15、见过丑的,没见过这么丑的。乍一看挺丑,仔细一看更丑!

16、长的很无辜,长的对不起人民对不起党。

17、你长的拖慢网速,你长的太耗内存

18、你光着身子追我两公里 我回一次头都算我是流氓!

19、大哥,把你脸上的分辨率调低点好吗?

20、你长的违...

posted @ 2006-12-13 10:49 小小程序程序员混口饭吃 阅读(468) | 评论 (0)编辑 收藏
今天看到一篇非常好的文章,忍不住copy下来。
有一天,柏拉图问老师苏格拉底什么是爱情?
老师就让他先到到麦田里去,摘一棵全麦田里最大最金黄的麦穗来,期间只能摘一次,并且只可向前走,不能回头。
柏拉图于是按照老师说的去做了。结果他两手空空的走出了田地。老师问他为什么摘不到?他说:因为只能摘一次,又不能走回头路,期间即使见到最大最金黄的,因为不知前面是否有更好的,所以没有摘;走到前面时,又发决总不及之前见到的好,原来最大最金黄的麦穗早已错过了;于是我什么也没摘。
老师说:这就是“爱情”。
之后又有一天,柏拉图问他的老师什么是婚姻,他的老师就叫他先到树林里,砍下一棵全树林最大最茂盛、最适合放在家作圣诞树的树。其间同样只能砍一次,以及同样只可以向前走,不能回头。
柏拉图于是照着老师的说话做。今次,他带了一棵普普通通,不是很茂盛,亦不算太差的树回来。老师问他,怎么带这棵普普通通的树回来,他说:“有了上一次经验,当我走到大半路程还两手空空时,看到这棵树也不太差,便砍下来,免得错过了后,最后又什么也带不出来。”
老师说:“这就是婚姻!” 人生就正如穿越麦田和树林,只走一次,不能回头。要找到属于自己最好的麦穗和大树,你必须要有莫大的勇气和付出相当的努力
posted @ 2006-12-12 13:21 小小程序程序员混口饭吃 阅读(468) | 评论 (1)编辑 收藏

 

FUMO (Firmware Update Management Object) 手机终端用来固件升级的协议。协议主要规定了一下方面:

1 FIRMWARE UPDATE MANAGEMENT OBJECT PARAMETERS. (路径和节点)

2 BEHAVIOR ASSOCIATED WITH THE MANAGEMENT OBJECT (执行升级和下载的命令以及 ALERT

3 CLIENT INITIATED FIRMWARE UPDATE ( 手机自行发起的固件升级的一些规定 )

 

1 FIRMWARE UPDATE MANAGEMENT OBJECT PARAMETERS

 FUMO_1_PRA.GIF

 

总共定义如上节点

 

PKNAME: 升级包名字

Pkgversion: 升级包版本

Download :用来执行初始化下载的节点

PKGURL: 初始化下载时存储的下载地址的节点

Update: 用来执行升级的节点

Pkgdata: 用来提供升级包数据的节点

Downloadnadupdate :用来初始化下载和升级的节点

    Pkgurl : 初始化下载时存储的下载地址的节点

State :手机当前升级过程中的状态。

Ext :厂商自己定义的扩展节点

 

根据实现不同, FUMO 可以选择 Downloadnadupdate 也可以选择 downd and upate 2 个节点的组合来实现固件的升级 ( 先下载,把下载的东西放在 X/update/pkgdata 里面,然后执行升级 )

 

State 有一下状态

FUMO_2_STATE.GIF 

升级成功返回 100 ,根据返回的不同状态,来与 SERVER 交互。

 

Fumo 规定的升级过程中的流程

 

FUMO_3_FLOW.GIF 

 

  FUMO 从初始化下载到最后成功然后清除掉下来后的升级包的全过程,

 

 

2 BEHAVIOR ASSOCIATED WITH THE MANAGEMENT OBJECT

 

FUMO 在执行的开始,假定手机采用先 download 然后 update, 先把升级包的 URL SERVER 发过来 , 手机先自行 replace 命令把 URL 放在 Download/PkgURL 下面,然后执行 exec 命令把包下载到 update/PkgData 下面,(有的 FUMO 实现厂商采用差分包方法升级)在 update 的时候直接执行 exec 执行升级。

 

 

 

 

以下分别是执行了 2 exec 分别在执行 download downloadandupdate.

FUMO_4_DOWNLOAD_UPDATE.bmp
FUMO_5_DOWNLOAD_AND_UPDATE.GIF 

 

下图是手机在进行升级过程中返回给 SERVER 的一些结果,都是用数字来表示, server 可以根据这些返回码来判断终端在升级过程中哪一步执行失败。

 

 

 FUMO_6_RESULTCODE.GIF  

 

 

 

下图是一个终端在执行一个 download 过程和一个 update 过程的流程图,此图能够清晰的显示出 DM command fumo 的节点如何交互的。

FUMO_7_FLOW_D_U.GIF 

下图是一个直接的 DownloadAndUpdate 的过程。手机一般会选择这两种的中的一种方式。

FUMO_8_FLOW_DANDU.GIF 

3 CLIENT INITIATED FIRMWARE UPDATE

其实这是 CP 协议的一部分内容,在下一篇文章会详细的描述 cp 协议的一些东西, cp 协议想关联有好几协议。

posted @ 2006-12-08 15:43 小小程序程序员混口饭吃 阅读(2179) | 评论 (4)编辑 收藏

 DM并不是一个前沿的技术。据悉,韩国SK电讯、日本NTT DoCoMoKDDI以及以Vodafone为首的一些欧洲运营商都已经建立起了一定规模的DM体系,它们或根据自行标准,或遵循OMA标准,现在主要提供的是以FOTA(固件更新)为主的基本功能,将来还可支持数据备份、诊断及故障修复、图形用户界面处理,甚至病毒防护等多种功能。

因为设计缺陷,Sony Panasonic 曾经为手机召回蒙受了上亿美元的损失,同时中国建立手机召回制度的呼声越来越高,通信厂商该如何应对?如果因为BUG而召回手机那么岂不损失太大。终端管理在这种情况下应运而生,可以给厂商减少损失。

一句话,只要能上网支持DM的手机未来就可以在线升级操作系统,以及修复BUG等等,手机厂商和运营商会更加方便,节省成本,同时能给客户带来更好的体验。只要手机安装了支持DM协议的软件,同时有一个与之交互的SERVER,一切问题迎刃而解。


FOTA有多种实现方式,DM便是其中的一个协议

Dm
协议 5 package.

 

 

 DM_PHASE.GIF

 

 

 

1: package0 server 发送通知(一般是短信)给 CLIENT ,一般通过 WAP PUSH 下去给手机。

 

2: package1

 

手机收到后 wap push 的东西后,根据 WAP PUSH 相关协议,手机会自动回联回 SERVER server 会得到手机的 imei, 厂商、型号等基本信息。

 

3:package2

 

Server 收到 client 的回复后,得到手机的 IP ,然后通过 HTTP 请求 client ,发送一个用户确认请求(手机必须能通过 GPRS 等方式上网),

 

 

4:package3

 

  手机收到后,如果用户确认 DM 继续进行,如果用户否认 DM 发送给手机一个结束标志。就是说不管 package3 用户是否确认或否认 package4 都会进行下去

 

5:package4

 

 SERVER 收到用户返回的信息不管是确认还是否认都会回复,如果 server 还想继续进行下去,那么会重复 package2 ,只是不再是简单让用户确认的东西,比如其他业务通过 DM 去取用户的版本的信息比如发送一个 GET command ,最后一个 package 永远是没有任何 command 的。就是说 package2,package3 可以重复进行多次

 

DM_CHART.GIF

1101:等待用户确认
1200:终端回联SERVER
1201:终端发起
1222:更多的message
1223 :session abort

posted @ 2006-12-08 11:21 小小程序程序员混口饭吃 阅读(2455) | 评论 (0)编辑 收藏