
2006年12月18日
利用免費(fèi)的
英語(yǔ)角把英語(yǔ)練好
北京 也樂(lè)英語(yǔ)為了滿足廣大英語(yǔ)愛(ài)好者的需要特推出周末免費(fèi)英語(yǔ)角服務(wù),
北京英語(yǔ)角的組織形式如下:
1:由也樂(lè)英語(yǔ)派出一名外教和一名助理負(fù)責(zé)組織英語(yǔ)角的活動(dòng)。
2: 英語(yǔ)角每周組織一次活動(dòng),也樂(lè)英語(yǔ)培訓(xùn)學(xué)校提供一間教室為大家的活動(dòng)場(chǎng)所。
3:英語(yǔ)愛(ài)好者可以免費(fèi)參加英語(yǔ)角的活動(dòng),不收取任何費(fèi)用,此活動(dòng)是公益活動(dòng),也樂(lè)英
語(yǔ)不收取任何費(fèi)用,也不限制參加次數(shù)。
4:也樂(lè)英語(yǔ)免費(fèi)提供給英語(yǔ)愛(ài)好者茶水、咖啡、以及活動(dòng)所采用的書(shū)籍報(bào)紙。
5:每周一到2個(gè)話題,由外教提前一周告訴大家,大家可以簡(jiǎn)單準(zhǔn)備,以便在課堂上
跟外教以及同學(xué)交流。
6:外教會(huì)糾正大家的發(fā)音、語(yǔ)法、詞匯上的錯(cuò)誤,會(huì)形成一些總結(jié),也希望大家能夠暢所
欲言,大膽的說(shuō)英語(yǔ)。
7:所有參加英語(yǔ)角的愛(ài)好者,請(qǐng)您在交流期間把手機(jī)調(diào)為靜音。
也樂(lè)英語(yǔ)地址:北京豐臺(tái)區(qū)馬家堡西路15號(hào) 時(shí)代風(fēng)帆大廈2區(qū)1901
交通狀況:地鐵四號(hào)線角門(mén)西站A口上樓即可。 51、501、54、529、698、646、707 嘉園
二里東門(mén)下車
聯(lián)系電話:010-58423871 15330275871
此活動(dòng)由于報(bào)名數(shù)量眾多,所以需要大家提前預(yù)約。
也樂(lè)英語(yǔ)網(wǎng)站:www.yellenglish.com
也樂(lè)英語(yǔ) 爭(zhēng)做北京最好的英語(yǔ)角.
posted @
2011-06-19 09:35 小小程序程序員混口飯吃 閱讀(2137) |
評(píng)論 (0) |
編輯 收藏
我認(rèn)為最大的沖擊莫過(guò)于 惠普,oracle跟惠普的直接競(jìng)爭(zhēng)會(huì)加大,從合作變?yōu)楦?jìng)爭(zhēng),我認(rèn)為惠普如果不收購(gòu)redhat來(lái)對(duì)抗,未來(lái)肯定落下風(fēng)!
posted @
2009-04-22 09:56 小小程序程序員混口飯吃 閱讀(644) |
評(píng)論 (0) |
編輯 收藏
摘要: 上篇文章講述了jacorb 的配置,本章講敘其應(yīng)用,隨后的幾篇文章會(huì)重點(diǎn)講述corba的開(kāi)發(fā)
JACORB開(kāi)發(fā)以及corba的請(qǐng)求方式:
JacORB的應(yīng)用開(kāi)發(fā)一般分為以下五步:
1.寫(xiě)IDL接口定義
2.編譯IDL接口定義生成Java類
3.實(shí)現(xiàn)步驟2中生成的接口
4.寫(xiě)服務(wù)器啟動(dòng)類,并注冊(cè)到ORB
5.寫(xiě)客戶端去獲取服務(wù)對(duì)象引用
&nb...
閱讀全文
posted @
2007-11-22 10:41 小小程序程序員混口飯吃 閱讀(8316) |
評(píng)論 (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 小小程序程序員混口飯吃 閱讀(4264) |
評(píng)論 (4) |
編輯 收藏
oracle的分析函數(shù)over 及開(kāi)窗函數(shù)
一:分析函數(shù)over
Oracle從8.1.6開(kāi)始提供分析函數(shù),分析函數(shù)用于計(jì)算基于組的某種聚合值,它和聚合函數(shù)的不同之處是
對(duì)于每個(gè)組返回多行,而聚合函數(shù)對(duì)于每個(gè)組只返回一行。
下面通過(guò)幾個(gè)例子來(lái)說(shuō)明其應(yīng)用。
1:統(tǒng)計(jì)某商店的營(yíng)業(yè)額。
date sale
1 20
2 15
3 14
4 18
5 30
規(guī)則:按天統(tǒng)計(jì):每天都統(tǒng)計(jì)前面幾天的總額
得到的結(jié)果:
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:統(tǒng)計(jì)各班成績(jī)第一名的同學(xué)信息
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
通過(guò):
--
select * from
(
select name,class,s,rank()over(partition by class order by s desc) mm from t2
)
where mm=1
--
得到結(jié)果:
NAME CLASS S MM
----- ----- ---------------------- ----------------------
dss 1 95 1
gds 2 92 1
gf 3 99 1
ddd 3 99 1
注意:
1.在求第一名成績(jī)的時(shí)候,不能用row_number(),因?yàn)槿绻嘤袃蓚€(gè)并列第一,row_number()只返回一個(gè)結(jié)果
2.rank()和dense_rank()的區(qū)別是:
--rank()是跳躍排序,有兩個(gè)第二名時(shí)接下來(lái)就是第四名
--dense_rank()l是連續(xù)排序,有兩個(gè)第二名時(shí)仍然跟著第三名
3.分類統(tǒng)計(jì) (并顯示信息)
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
得到結(jié)果:
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
無(wú)法得到B列值
=====
select * from test
數(shù)據(jù):
A B C
1 1 1
1 2 2
1 3 3
2 2 5
3 4 6
---將B欄位值相同的對(duì)應(yīng)的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
---如果不需要已某個(gè)欄位的值分割,那就要用 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
求個(gè)人工資占部門(mén)工資的百分比
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
二:開(kāi)窗函數(shù)
開(kāi)窗函數(shù)指定了分析函數(shù)工作的數(shù)據(jù)窗口大小,這個(gè)數(shù)據(jù)窗口大小可能會(huì)隨著行的變化而變化,舉例如下:
1:
over(order by salary) 按照salary排序進(jìn)行累計(jì),order by是個(gè)默認(rèn)的開(kāi)窗函數(shù)
over(partition by deptno)按照部門(mén)分區(qū)
2:
over(order by salary range between 5 preceding and 5 following)
每行對(duì)應(yīng)的數(shù)據(jù)窗口是之前行幅度值不超過(guò)5,之后行幅度值不超過(guò)5
例如:對(duì)于以下列
aa
1
2
2
2
3
4
5
6
7
9
sum(aa)over(order by aa range between 2 preceding and 2 following)
得出的結(jié)果是
AA SUM
---------------------- -------------------------------------------------------
1 10
2 14
2 14
2 14
3 18
4 18
5 22
6 18
7 22
9 9
就是說(shuō),對(duì)于aa=5的一行 ,sum為 5-1<=aa<=5+2 的和
對(duì)于aa=2來(lái)說(shuō) ,sum=1+2+2+2+3+4=14 ;
又如 對(duì)于aa=9 ,9-1<=aa<=9+2 只有9一個(gè)數(shù),所以sum=9 ;
3:其它:
over(order by salary rows between 2 preceding and 4 following)
每行對(duì)應(yīng)的數(shù)據(jù)窗口是之前2行,之后4行
4:下面三條語(yǔ)句等效:
over(order by salary rows between unbounded preceding and unbounded following)
每行對(duì)應(yīng)的數(shù)據(jù)窗口是從第一行到最后一行,等效:
over(order by salary range between unbounded preceding and unbounded following)
等效
over(partition by null)
|
|
|
posted @
2007-11-13 13:33 小小程序程序員混口飯吃 閱讀(50041) |
評(píng)論 (13) |
編輯 收藏
由于一些原因,最近要復(fù)習(xí)一些東西,所以就把JMS的東西再?gòu)?fù)習(xí)一遍,以下便是例子
jms 中最重要的幾個(gè)概念destination,ACKNOWLEDGE,subscribe,durable subscribe
destination:topic queque
queue簡(jiǎn)單點(diǎn)說(shuō)就是1:1 一個(gè)消息只能由一個(gè)consumer去消費(fèi),別的consumer來(lái)消費(fèi)的時(shí)候已經(jīng)沒(méi)了,先到先得
topic簡(jiǎn)單點(diǎn)說(shuō)就是1:N 一個(gè)消息可以由多個(gè)consumer來(lái)消費(fèi),誰(shuí)來(lái)消費(fèi)都有
subscribe,拿topic來(lái)說(shuō)如果當(dāng)前訂閱不是持久訂閱,只有再訂閱后生產(chǎn)者生產(chǎn)得消息才能被consumer得到,持久訂閱只要沒(méi)有被consumer消費(fèi),早晚會(huì)消費(fèi)這個(gè)消息
一下是幾個(gè)例子
queuesend:queque消息產(chǎn)生
queuereceive:queque消息得消費(fèi)
topicsend :topic消息得產(chǎn)生
topicreceive1:topic消息的非訂閱
topicrecieve2:topic消息的持久訂閱
這個(gè)例子實(shí)在WEBLOGIC814上測(cè)試過(guò)的,當(dāng)然要定義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 小小程序程序員混口飯吃 閱讀(1175) |
評(píng)論 (0) |
編輯 收藏
一、rpm包安裝方式步驟:
引用:
1、找到相應(yīng)的軟件包,比如soft.version.rpm,下載到本機(jī)某個(gè)目錄;
2、打開(kāi)一個(gè)終端,su -成root用戶;
3、cd soft.version.rpm所在的目錄;
4、輸入rpm -ivh soft.version.rpm
二、deb包安裝方式步驟:
引用:
1、找到相應(yīng)的軟件包,比如soft.version.deb,下載到本機(jī)某個(gè)目錄;
2、打開(kāi)一個(gè)終端,su -成root用戶;
3、cd soft.version.deb所在的目錄;
4、輸入dpkg -i soft.version.deb
三、tar.gz源代碼包安裝方式:
引用:
1、找到相應(yīng)的軟件包,比如soft.tar.gz,下載到本機(jī)某個(gè)目錄;
2、打開(kāi)一個(gè)終端,su -成root用戶;
3、cd soft.tar.gz所在的目錄;
4、tar -xzvf soft.tar.gz //一般會(huì)生成一個(gè)soft目錄
5、cd soft
6、./configure
7、make
8、make install
四、tar.bz2源代碼包安裝方式:
引用:
1、找到相應(yīng)的軟件包,比如soft.tar.bz2,下載到本機(jī)某個(gè)目錄;
2、打開(kāi)一個(gè)終端,su -成root用戶;
3、cd soft.tar.bz2所在的目錄;
4、tar -xjvf soft.tar.bz2 //一般會(huì)生成一個(gè)soft目錄
5、cd soft
6、./configure
7、make
8、make install
五、apt方式安裝:
引用:
1、打開(kāi)一個(gè)終端,su -成root用戶;
2、apt-cache search soft 注:soft是你要找的軟件的名稱或相關(guān)信息
3、如果2中找到了軟件soft.version,則用apt-get install soft.version命令安裝軟件 注:只要你可以上網(wǎng),只需要用apt-cache search查找軟件,用apt-get install軟件
六、bin文件安裝:
如果你下載到的軟件名是soft.bin,一般情況下是個(gè)可執(zhí)行文件,安裝方法如下:
引用:
1、打開(kāi)一個(gè)終端,su -成root用戶;
2、chmod +x soft.bin
3、./soft.bin //運(yùn)行這個(gè)命令就可以安裝軟件了
七、不需要安裝的軟件:
有了些軟件,比如lumaqq,是不需要安裝的,自帶jre解壓縮后可直接運(yùn)行。假設(shè)下載的是lumaqq.tar.gz,使用方法如下:
引用:
1、打開(kāi)一個(gè)終端,su -成root用戶;
2、tar -xzvf lumaqq.tar.gz //這一步會(huì)生成一個(gè)叫LumaQQ的目錄
3、cd LumaQQ
4、chmod +x lumaqq //設(shè)置lumaqq這個(gè)程序文件為可運(yùn)行
5、此時(shí)就可以運(yùn)行l(wèi)umaqq了,用命令./lumaqq即可,但每次運(yùn)行要輸入全路徑或切換到剛才生成的LumaQQ目錄里
6、為了保證不設(shè)置路徑就可以用,你可以在/bin目錄下建立一個(gè)lumaqq的鏈接,用命令ln -s lumaqq /bin/ 即可,以后任何時(shí)候打開(kāi)一個(gè)終端輸入lumaqq就可以啟動(dòng)QQ聊天軟件了
7、如果你要想lumaqq有個(gè)菜單項(xiàng),使用菜單編輯工具,比如Alacarte Menu Editor,找到上面生成的LumaQQ目錄里的lumaqq設(shè)置一個(gè)菜單項(xiàng)就可以了,當(dāng)然你也可以直接到 /usr/share/applications目錄,按照里面其它*.desktop文件的格式生成一個(gè)自己的desktop文件即可。
posted @
2007-08-10 09:39 小小程序程序員混口飯吃 閱讀(626) |
評(píng)論 (0) |
編輯 收藏
計(jì)劃任務(wù)工具 cron 的配置和說(shuō)明
作者:北南南北
來(lái)自:LinuxSir.Org
摘要:Linux操作系統(tǒng)中,計(jì)劃任務(wù)通常由cron來(lái)承擔(dān),了解或掌握cron,能為我們管理服務(wù)器帶來(lái)更多的便利,也能省卻更多的時(shí)間。本文也舉了一些簡(jiǎn)單明了的例子,為了讓新手上路方便;
目錄
++++++++++++++++++++++++++++++++++++++
正文
++++++++++++++++++++++++++++++++++++++
1、計(jì)劃任務(wù)概說(shuō);
計(jì)劃任務(wù),是任務(wù)在約定的時(shí)間執(zhí)行已經(jīng)計(jì)劃好的工作,這是表面的意思。在Linux中,我們經(jīng)常用到 crond 服務(wù)器來(lái)完成這項(xiàng)工作。cron服務(wù)器可以根據(jù)配置文件約定的時(shí)間來(lái)執(zhí)行特定的作務(wù)。比如我們可以在配置文件中約定每天早上4點(diǎn),對(duì)httpd 服務(wù)器重新啟動(dòng),這就是一個(gè)計(jì)劃任務(wù);
下面我們先來(lái)說(shuō)說(shuō)cron;
2、cron;
在Linux系統(tǒng)中,計(jì)劃任務(wù)一般是由cron承擔(dān),我們可以把cron設(shè)置為開(kāi)機(jī)時(shí)自動(dòng)啟動(dòng)。cron啟動(dòng)后,它會(huì)讀取它的所有配置文件(全局性配置文件/etc/crontab,以及每個(gè)用戶的計(jì)劃任務(wù)配置文件),然后cron會(huì)根據(jù)命令和執(zhí)行時(shí)間來(lái)按時(shí)來(lái)調(diào)用度工作任務(wù)。
2.1 cron 的安裝和啟動(dòng);
在一般情況下,cron都是系統(tǒng)默認(rèn)安裝的,我們要學(xué)會(huì)查看軟件包是否已經(jīng)安裝;
2.1.1 在Redhat 或 Fedora等RPM包管理的系統(tǒng)的安裝;
判斷系統(tǒng)是否已經(jīng)安裝cron相關(guān)的包
Fedora 5.0 系統(tǒng)的情況;
其它版本的Fedora及Redhat的系統(tǒng)和這相似;
[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的主程序,您可以通過(guò)下面的命令來(lái)了解它,其它軟件包同理;
[root@localhost beinan]# rpm -ql vixie-cron
crontabs 軟件包是用來(lái)安裝、卸裝、或列舉用來(lái)驅(qū)動(dòng) cron 守護(hù)進(jìn)程的表格的程序。cron 守護(hù)進(jìn)程檢查 crontab 文件來(lái)查看某個(gè)指定命令被調(diào)度執(zhí)行的時(shí)間。如果命令已經(jīng)調(diào)度,守護(hù)進(jìn)程就會(huì)執(zhí)行它們。了解crontabs軟件包都安裝了些什么,應(yīng)該用下面的命令;
[root@localhost beinan]# rpm -ql crontabs
如果沒(méi)有安裝,可以從光盤(pán)中找出文件名帶有cron字樣的軟件包來(lái)安裝。
[root@localhost ~]# rpm -ivh vixie-cron-4.1-54.FC5*
[root@localhost ~]# rpm -ivh crontabs*
也可以用yum 來(lái)在線安裝;
[root@localhost ~]# yum install vixie-cron
[root@localhost ~]# yum install crontabs
2.1.2 在Slackware系統(tǒng)中的安裝;
在Slackware中cron軟件包是 dcron,您可以在光盤(pán)中找出來(lái)安裝它;
查看是否已經(jīng)安裝了dcron軟件包,您可以這樣查看。在這里能列出軟件包詳細(xì)的安裝情況;
[root@localhost ~]# more /var/adm/packages/dcron*
如果沒(méi)有安裝,請(qǐng)用下面的命令來(lái)安裝。在第一張安裝盤(pán)中找出dcron軟件包;
[root@localhost ~]# installpkg dcron*.tgz
2.1.3 cron 的開(kāi)啟、停止、重新啟動(dòng)方法;
cron配置文件被修改后,想讓新文件生效,必須重新crond服務(wù)器,有兩種方法可供選擇;
第一種 在Fedora或Redhat 等以RPM包管理的系統(tǒng)中;
[root@localhost ~]# /etc/init.d/crond start
[root@localhost ~]# /etc/init.d/crond stop
[root@localhost ~]# /etc/init.d/crond restart
如果想在Fedora 和 Redhat 或以這些發(fā)行版為基礎(chǔ)克隆的發(fā)行版,如果想自動(dòng)開(kāi)機(jī)運(yùn)行,請(qǐng)用下面的辦法;
[root@localhost ~]# chkconfig --levels 35 crond on
第二種:通用
[root@localhost ~]# pgrep crond 注:判斷crond 是否在運(yùn)行;
[root@localhost ~]# pkill crond 注:殺掉正在運(yùn)行中的crond;
[root@localhost ~]# pgrep crond 注:查看是否被殺掉了;
[root@localhost ~]# /usr/sbin/crond 注:運(yùn)行crond;
2.2 cron 配置文件;
cron 是一個(gè)服務(wù)器程序,我們都知道Linux的服務(wù)器的配置,大多是通過(guò)配置文件來(lái)完成的,cron自然也不例外,在Redhat/Fedora 等系統(tǒng)中它的全局性配置文件是/etc/crontab;在Slackware系統(tǒng)中,全局性文件是/var/spool/cron/crontabs/root 。每個(gè)用戶也有自己的cron配置文件,我們可以通過(guò)crontab -e 來(lái)編輯它;
2.2.1 全局性配置文件;
下面是一個(gè)全局性的配置文件例子,以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
對(duì)于全局性配置文件,我們要用root權(quán)限來(lái)更改,一般是通過(guò)crontab -e 來(lái)修改。但有時(shí)也并不一定是這樣的,比如Fedora Core 5 如果通過(guò)crontab -e 修改的是root用戶的cron 配置文件。所以我們要在Fedora Core 5中修改全局性配置文件可以用vi 編輯器來(lái)修改。vi的用法請(qǐng)參考:《文件編輯器 vi》
在全局性配置文件中,定義了可執(zhí)行命令的路徑環(huán)境變量,所用SHELL類型的定義等,這些大多不用修改;我們經(jīng)常添加的是計(jì)劃任務(wù)或修改任務(wù)執(zhí)行的時(shí)間等;
在全局性配置文件中,我們發(fā)現(xiàn)有類似這些行;
1 * * * * root run-parts /etc/cron.hourly 注:表示每個(gè)小時(shí)的第一分鐘,開(kāi)始執(zhí)行/etc/hourly目錄下的可執(zhí)行程序或腳本;
2 4 * * * root run-parts /etc/cron.daily 注:表示每天的4點(diǎn)2分,開(kāi)始執(zhí)行/etc/cron.daily目錄下的可執(zhí)行程序或腳本;
22 4 * * 7 root run-parts /etc/cron.weekly 注:每年第7個(gè)周4點(diǎn)我22分,開(kāi)始執(zhí)行 /etc/cron.weekly目錄下的可執(zhí)行程序或腳本;
42 4 1 * * root run-parts /etc/cron.monthly 注:每月第1天的4點(diǎn)42分,開(kāi)始執(zhí)行/etc/cron.monthly目錄下的可執(zhí)行程序或腳本;
這些行是用來(lái)在同一時(shí)間批量執(zhí)行任務(wù)的,我們?cè)谝院蟮睦又歇?dú)立出來(lái)解說(shuō),在這里只是讓大家心中有數(shù);
2.2.2 cron 配置計(jì)劃任務(wù)的書(shū)寫(xiě)格式
分鐘 小時(shí) 日 月 周 [用戶名] 命令
說(shuō)明:
第一段應(yīng)該定義的是:分鐘,表示每個(gè)小時(shí)的第幾分鐘來(lái)執(zhí)行。范圍是從0-59
第二段應(yīng)該定義的是:小時(shí),表示從第幾個(gè)小時(shí)來(lái)執(zhí)行,范圍是從0-23
第三段應(yīng)該定義的是:日期,表示從每個(gè)月的第幾天執(zhí)行,范圍從1-31
第四段應(yīng)該定義的是:月,表示每年的第幾個(gè)月來(lái)執(zhí)行,范圍從1-12
第五段應(yīng)該定義的是:周,表示每周的第幾天執(zhí)行,范圍從0-6,其中 0表示星期日。
每六段應(yīng)該定義的是:用戶名,也就是執(zhí)行程序要通過(guò)哪個(gè)用戶來(lái)執(zhí)行,這個(gè)一般可以省略;
第七段應(yīng)該定義的是:執(zhí)行的命令和參數(shù)。
注:其中用戶名可是省略,用戶名定義的是程序用哪個(gè)用戶來(lái)執(zhí)行,比如mysql服務(wù)器,我們可以定義成以mysql用戶來(lái)啟動(dòng)、停止、重新啟動(dòng),這時(shí)要寫(xiě)上用戶名;不過(guò)對(duì)于cron來(lái)說(shuō)意義不是太大,因?yàn)槊總€(gè)用戶都有自己的cron配置文件。有些程序的啟動(dòng)必須用到root用戶,這時(shí)我們就可以修改root用戶的cron配置文件就行了。在每個(gè)用戶的配置文件中,不必指定用戶名。
我們可以把計(jì)劃任務(wù)寫(xiě)在全局性配置文件中,如果您想把一個(gè)計(jì)劃放入全局性配置文件中,就得改發(fā)行版所對(duì)應(yīng)的cron全局配置文件,比如Fedora 5的全局性配置文件是/etc/crontab文件;
每個(gè)用戶也能定義自己的cron配置文件,用crontab -e 命令來(lái)定義;
舉一例:讓機(jī)器在每天8點(diǎn)30分重新啟動(dòng);
關(guān)于時(shí)間格式中有7個(gè)字段。我們可以直接更改或者添加,當(dāng)然這是系統(tǒng)任務(wù)調(diào)用。舉個(gè)例子,比如我在每天的早上8點(diǎn)30分重新啟動(dòng)機(jī)器,就可以在
/etc/crontab中加入下面的兩句,第一句就是注釋了。以#號(hào)開(kāi)始,后面寫(xiě)一個(gè)自己能知道這是什么任務(wù)的備注;
# reboot OS
30 8 * * * root /sbin/reboot
第一段應(yīng)該定義的是:分鐘,表示每個(gè)小時(shí)的第幾分鐘來(lái)執(zhí)行。范圍是從0-59
第二段應(yīng)該定義的是:小時(shí),表示從第幾個(gè)小時(shí)來(lái)執(zhí)行,范圍是從0-23
第三段應(yīng)該定義的是:日期,表示從每個(gè)月的第幾天執(zhí)行,范圍從1-31
第四段應(yīng)該定義的是:月,表示每年的第幾個(gè)月來(lái)執(zhí)行,范圍從1-12
第五段應(yīng)該定義的是:周,表示每周的第幾天執(zhí)行,范圍從0-6,其中 0表示星期日。
每六段應(yīng)該定義的是:用戶名,也就是執(zhí)行程序要通過(guò)哪個(gè)用戶來(lái)執(zhí)行,這個(gè)一般可以省略;
第七段應(yīng)該定義的是:執(zhí)行的命令和參數(shù)。
對(duì)比上面的例子就知道,30是不是分鐘??8是不是小時(shí)?如果有*代表的地方,表示全部,也就是說(shuō),每個(gè)月,每天,每星期都要執(zhí)行。root 表示用root用戶執(zhí)行,命令是/sbin/reboot ,也就是說(shuō),系統(tǒng)在每天 8點(diǎn)30分重新啟動(dòng);
我們可以把每天8點(diǎn)30分重新啟動(dòng)的計(jì)劃任務(wù)寫(xiě)入cron全局性配置文件中,也可以定義在root用戶自己的cron配置文件中。如果定義在root自己的配置文件,請(qǐng)用root身份來(lái)執(zhí)行 crontab -e 來(lái)修改配置文件;crontab -e 進(jìn)入修改配置文件的過(guò)程,其實(shí)和vi的用法一樣,請(qǐng)參看vi 的用法:《文件編輯器 vi》
讓配置文件生效:如果讓配置文件生效,還得重新啟動(dòng)cron,切記,既然每個(gè)用戶下的cron配置文件修改后。也要重新啟動(dòng)cron服務(wù)器。
在Fedora 和Redhat中,我們應(yīng)該用;
[root@localhost ~]# /etc/init.d/crond restart
如果讓crond 在開(kāi)機(jī)時(shí)運(yùn)行,應(yīng)該改變其運(yùn)行級(jí)別;
[root@localhost ~]# chkconfig --levels 35 crond on
在Slackware中,如果開(kāi)機(jī)自動(dòng)運(yùn)行;
查看/etc/rc.d/rc.M文件是否有如的行,如果沒(méi)有就加上,大多是有的;
# 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服務(wù)器是否運(yùn)行;
2022
[root@localhost ~]# pkill crond 注:殺死crond;
[root@localhost ~]# pgrep crond 注:查看crond是否退出;
[root@localhost ~]# /usr/sbin/crond 注:?jiǎn)?dòng)crond;
[root@localhost ~]# pgrep crond 注:查看crond 是否已經(jīng)運(yùn)行得起來(lái)了;
3883
2.2.3 關(guān)于同一時(shí)間,同時(shí)執(zhí)行多個(gè)任務(wù)的定義方法;
我們?cè)谇懊嬉呀?jīng)說(shuō)過(guò),在全局性配置文件中,有類似如下的段落;
1 * * * * root run-parts /etc/cron.hourly 注:表示每個(gè)小時(shí)的第一分鐘,開(kāi)始執(zhí)行/etc/hourly目錄下的可執(zhí)行程序或腳本;
2 4 * * * root run-parts /etc/cron.daily 注:表示每天的4點(diǎn)2分,開(kāi)始執(zhí)行/etc/cron.daily目錄下的可執(zhí)行程序或腳本;
22 4 * * 7 root run-parts /etc/cron.weekly 注:每年第7個(gè)周4點(diǎn)我22分,開(kāi)始執(zhí)行 /etc/cron.weekly目錄下的可執(zhí)行程序或腳本;
42 4 1 * * root run-parts /etc/cron.monthly 注:每月第1天的4點(diǎn)42分,開(kāi)始執(zhí)行/etc/cron.monthly目錄下的可執(zhí)行程序或腳本;
舉例來(lái)說(shuō),我想在每天5點(diǎn)10分來(lái)重新啟動(dòng)httpd 服務(wù)器,與此同時(shí),我們也可以同時(shí)下載一個(gè)ISO文件。如果我們按書(shū)寫(xiě)計(jì)劃任務(wù)的規(guī)則一條一條的來(lái)書(shū)寫(xiě),并添加到全局是有點(diǎn)麻煩。不如寫(xiě)一個(gè)腳本放在/etc/crond.daily目錄中。然后把其權(quán)限設(shè)置為755 (關(guān)于權(quán)限的設(shè)置,請(qǐng)參考:《Linux 文件和目錄的屬性》)。
當(dāng)然我們得改一改上面的 帶有/etc/cron.daily那行,改為如下;
10 5 * * * root run-parts /etc/cron.daily
</cdoe>
然后我們到/etc/crond.daily目錄中創(chuàng)建兩個(gè)文件,一個(gè)是用來(lái)重啟httpd服務(wù)器的,如下;
<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點(diǎn)20分下載FC5的鏡像,可以再創(chuàng)建一個(gè)文件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
然后我們重新啟動(dòng)一下crond就行了;
[root@localhost cron.daily]# pkill crond
[root@localhost cron.daily]# prep crond
[root@localhost cron.daily]# crond&
注意:我只是想說(shuō)明一下,在同一時(shí)間 執(zhí)行多個(gè)計(jì)劃任務(wù)的簡(jiǎn)單用法,并不是有意教給您每天早上都下載FC5的映像。我舉這個(gè)例子是為了初學(xué)者了解這個(gè)功能。如果您有好多的任務(wù)在某一時(shí)刻執(zhí)行,那就自己寫(xiě)腳本文件。放在/etc目錄下的cron.hourly 、cron.daily 、cron.weekly 、cron.monthly 目錄中。凡是放進(jìn)這些目錄的可執(zhí)行腳本,都能在約定的時(shí)間內(nèi)準(zhǔn)確執(zhí)行。每個(gè)目錄有每個(gè)目錄的用途;
2.2.4 對(duì)于用戶自身的cron 配置文件的說(shuō)明;
每個(gè)用戶都有自己的cron配置文件,通過(guò)crontab -e 就可以編輯,一般的情況下,在Fedora和Redhat的發(fā)行版,我們編輯好用戶的cron配置文件保存退出后,系統(tǒng)會(huì)自動(dòng)就存放于/var/spool/cron/目錄中,文件以用戶名命名。在Slackware中是位于/var/spool/cron/crontabs/目錄中。其它的發(fā)行版都差不多,有點(diǎn)類似。自己找找吧;查看用戶的計(jì)劃任務(wù)是crontab -l
crontab -e 注:編輯用戶的cron配置文件;
crontab -l 注:查看用戶的計(jì)劃任務(wù);
比如我用beinan用戶來(lái)運(yùn)行crontab -e ;
[beinan@localhost ~]$ id 注:判斷所用用戶身份;
uid=500(beinan) gid=500(beinan) groups=500(beinan)
[beinan@localhost ~]$ crontab -e 注:編輯用戶beinan的計(jì)劃任務(wù);
我們?cè)诶锩娑x一個(gè)任務(wù);
40 20 * * * /usr/bin/wget http://mirrors.kernel.org/fedora/core/5/i386/iso/FC-5-i386-DVD.iso
保存退出后,我們用下面的命令來(lái)查看beinan用戶的計(jì)劃任務(wù);
[beinan@localhost ~]$ crontab -l
40 20 * * * /usr/bin/wget http://mirrors.kernel.org/fedora/core/5/i386/iso/FC-5-i386-DVD.iso
配置好后,我們還要重新啟動(dòng)crond服務(wù)器,每個(gè)用戶cron配置文件的改動(dòng)都得重新啟動(dòng)crond服務(wù)器;前面已經(jīng)說(shuō)過(guò)了,這里省略;值得注意的是重啟crond服務(wù)器,需要root權(quán)限,您可以用su命令切換到root 用戶,然后再來(lái)重啟crond;
在Fedora或Redhat等以RPM包管理的發(fā)行版中;
[beinan@localhost ~]$ su
口令:
[root@localhost beinan]# /etc/init.d/crond restart
停止 crond: [確定]
啟動(dòng) crond: [確定]
也可以先殺死crond,再運(yùn)行crond命令的辦法來(lái)啟動(dòng);
[root@localhost beinan]# pkill crond
[root@localhost beinan]# pgrep crond
[root@localhost beinan]# /usr/sbin/crond
[root@localhost beinan]# pgrep crond
6664
3、計(jì)劃任務(wù)的應(yīng)用范圍;
計(jì)劃任務(wù)主要是讓系統(tǒng)自動(dòng)完成一些工作。比如我們可以讓系統(tǒng)自動(dòng)在某一時(shí)刻清理或備份httpd服務(wù)器的日志,然后重新啟動(dòng)httpd服務(wù)器,這對(duì)網(wǎng)絡(luò)管理員來(lái)說(shuō)是很重要的。也可以讓系統(tǒng)自動(dòng)清空位于/tmp目錄的垃圾文件。
另外值得一提的是,LinuxSir.Org 有很多子站,每個(gè)子站都有RSS,能讓這些站點(diǎn)的RSS相互投遞,也是用cron來(lái)完成,比如是在早上4點(diǎn)左右開(kāi)始執(zhí)行這個(gè)任務(wù)。這是一個(gè)極為耗費(fèi)資源的過(guò)程,如果不是放在在線人少的時(shí)候,基本無(wú)法完成,所以只能放在早上進(jìn)行。作為SIR的管理員,不可能每天早上4點(diǎn)起來(lái)點(diǎn)鼠標(biāo)來(lái)完成這些事吧。所以最好的辦法就是通過(guò)cron來(lái)自動(dòng)運(yùn)行,以在服務(wù)器最清閑的時(shí)候來(lái)完成這項(xiàng)工作;
posted @
2007-07-24 11:14 小小程序程序員混口飯吃 閱讀(946) |
評(píng)論 (0) |
編輯 收藏
分辨率設(shè)置高了X起來(lái)后花屏,無(wú)法通過(guò)X界面恢復(fù)回去,只能用普通用戶進(jìn)來(lái)后,su 到root上來(lái)找到XORG.CONF 文件
修改/etc/X11/xorg.conf
screen里面的設(shè)置最大的那個(gè)去掉就好了,重啟就可以了
posted @
2007-07-24 09:19 小小程序程序員混口飯吃 閱讀(2606) |
評(píng)論 (2) |
編輯 收藏
一、注銷,關(guān)機(jī),重啟
注銷系統(tǒng)的logout命令
1,Logout 注銷是登陸的相對(duì)操作,登陸系統(tǒng)后,若要離開(kāi)系統(tǒng),用戶只要直接下達(dá)logout命令即可:
[root@localhost root]#logout
Red Hat Linuxrelease 9(Shike)
Kernel 2.4.20.8 on an i686
Login: ← 回到登陸的畫(huà)面
2,關(guān)機(jī)或重新啟動(dòng)的shutdown命令
Shutdown命令可以關(guān)閉所有程序,依照用戶的需要,重新啟動(dòng)或關(guān)機(jī)。
參數(shù)說(shuō)明如下:
? 立即關(guān)機(jī):-h 參數(shù)讓系統(tǒng)立即關(guān)機(jī)。范例如下:
[root@localhost root]#shutdown –h now ← 要求系統(tǒng)立即關(guān)機(jī)
? 指定關(guān)機(jī)時(shí)間:time參數(shù)可指定關(guān)機(jī)的時(shí)間;或設(shè)置多久時(shí)間后運(yùn)行shutdown命令,范例如下:
[root@localhost root]#shutdown now ← 立刻關(guān)機(jī)
[root@localhost root]#shutdown +5 ← 5分鐘后關(guān)機(jī)
[root@localhost root]#shutdown 10:30 ← 在10:30時(shí)關(guān)機(jī)
? 關(guān)機(jī)后自動(dòng)重啟:-r 參數(shù)設(shè)置關(guān)機(jī)后重新啟動(dòng)。范例如下:
[root@localhost root]#shutdown -r now ← 立刻關(guān)閉系統(tǒng)并重啟
[root@localhost root]#shutdown -r 23:59 ← 指定在23:59時(shí)重啟動(dòng)
3,重新啟動(dòng)計(jì)算機(jī)的reboot命令
顧名思義,reboot命令是用來(lái)重新啟動(dòng)系統(tǒng)的。常用的參數(shù)如下:
? -f 參數(shù):不依正常的程序運(yùn)行關(guān)機(jī),直接關(guān)閉系統(tǒng)并重新啟動(dòng)計(jì)算機(jī)。
? -I 參數(shù):在在重新啟動(dòng)之前關(guān)閉所有網(wǎng)絡(luò)接口。
雖然reboot命令有個(gè)參數(shù)可以使用,但是一般只需要單獨(dú)運(yùn)行reboot命令就可以了
posted @
2007-07-17 13:27 小小程序程序員混口飯吃 閱讀(16106) |
評(píng)論 (0) |
編輯 收藏
最近測(cè)試OMADM1.2的時(shí)候,039,040兩個(gè)case是關(guān)于TLS SSL的,搞的很迷惑,最近看了一下原來(lái)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.
所以這2個(gè)case基本上測(cè)試一個(gè)就足夠了。
另外tls本來(lái)就是傳輸層上的一個(gè)協(xié)議,所以要是用HTTPS的話,如果你用應(yīng)用服務(wù)器,比如TOMCAT WBLOGIC,他們都支持SSL,根本不需要程序?qū)崿F(xiàn)任何東西,只要你會(huì)使用keytool生成證書(shū)就可以了。
這塊只是牽扯到JSSE,具體可以到http://java.sun.com/j2se/1.4.2/docs/guide/security/jsse/JSSERefGuide.html#Introduction看
Keytool其實(shí)再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:生成一個(gè)
C:\j2sdk1.4.2_05\jre\lib\security>keytool -genkey -alias duke -keyalg RSA -val
idity 10 -storetype jks -keystore trust1.jks
2:查看你剛才生成的證書(shū)
C:\j2sdk1.4.2_05\jre\lib\security>keytool -list -v -keystore trust1.jks
當(dāng)然要輸入密碼了。
但是我不太明白服務(wù)器需要2個(gè)證書(shū)1個(gè)是custom identity keystore 一個(gè)是custom trust keystore為什么2個(gè) 的輸入類型不一樣,一個(gè)是KeyEntry另外一個(gè)是trustedCertEntry,這個(gè)流程到底是怎樣的?申請(qǐng)證書(shū)->導(dǎo)入證書(shū) 還是不明白,請(qǐng)指教。
posted @
2007-07-04 17:43 小小程序程序員混口飯吃 閱讀(1988) |
評(píng)論 (1) |
編輯 收藏
摘要: 最近復(fù)習(xí)了一下AXIS,寫(xiě)了2個(gè)小例子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對(duì)象序列化學(xué)習(xí)筆記- -
beejoy 原創(chuàng) 來(lái)源:java研究組織
目前網(wǎng)絡(luò)上關(guān)于對(duì)象序列化的文章不少,但是我發(fā)現(xiàn)詳細(xì)敘述用法和原理的文章太少。本人
把自己經(jīng)過(guò)經(jīng)驗(yàn)總結(jié)和實(shí)際運(yùn)用中的體會(huì)寫(xiě)成的學(xué)習(xí)筆記貢獻(xiàn)給大家。希望能為整個(gè)java社
區(qū)的繁榮做一點(diǎn)事情。
序列化的過(guò)程就是對(duì)象寫(xiě)入字節(jié)流和從字節(jié)流中讀取對(duì)象。將對(duì)象狀態(tài)轉(zhuǎn)換成字節(jié)流之后,
可以用java.io包中的各種字節(jié)流類將其保存到文件中,管道到另一線程中或通過(guò)網(wǎng)絡(luò)連接
將對(duì)象數(shù)據(jù)發(fā)送到另一主機(jī)。對(duì)象序列化功能非常簡(jiǎn)單、強(qiáng)大,在RMI、Socket、JMS、EJB
都有應(yīng)用。對(duì)象序列化問(wèn)題在網(wǎng)絡(luò)編程中并不是最激動(dòng)人心的課題,但卻相當(dāng)重要,具有
許多實(shí)用意義。
一:對(duì)象序列化可以實(shí)現(xiàn)分布式對(duì)象。主要應(yīng)用例如:RMI要利用對(duì)象序列化運(yùn)行遠(yuǎn)程主機(jī)
上的服務(wù),就像在本地機(jī)上運(yùn)行對(duì)象時(shí)一樣。
二:java對(duì)象序列化不僅保留一個(gè)對(duì)象的數(shù)據(jù),而且遞歸保存對(duì)象引用的每個(gè)對(duì)象的數(shù)據(jù)。
可以將整個(gè)對(duì)象層次寫(xiě)入字節(jié)流中,可以保存在文件中或在網(wǎng)絡(luò)連接上傳遞。利用對(duì)象序
列化可以進(jìn)行對(duì)象的"深復(fù)制",即復(fù)制對(duì)象本身及引用的對(duì)象本身。序列化一個(gè)對(duì)象可能
得到整個(gè)對(duì)象序列。
從上面的敘述中,我們知道了對(duì)象序列化是java編程中的必備武器,那么讓我們從基礎(chǔ)開(kāi)始
,好好學(xué)習(xí)一下它的機(jī)制和用法。
java序列化比較簡(jiǎn)單,通常不需要編寫(xiě)保存和恢復(fù)對(duì)象狀態(tài)的定制代碼。實(shí)現(xiàn)java.io.Seri
alizable接口的類對(duì)象可以轉(zhuǎn)換成字節(jié)流或從字節(jié)流恢復(fù),不需要在類中增加任何代碼。只
有極少數(shù)情況下才需要定制代碼保存或恢復(fù)對(duì)象狀態(tài)。這里要注意:不是每個(gè)類都可序列化,
有些類是不能序列化的,例如涉及線程的類與特定JVM有非常復(fù)雜的關(guān)系。
序列化機(jī)制:
序列化分為兩大部分:序列化和反序列化。序列化是這個(gè)過(guò)程的第一部分,將數(shù)據(jù)分解成字
節(jié)流,以便存儲(chǔ)在文件中或在網(wǎng)絡(luò)上傳輸。反序列化就是打開(kāi)字節(jié)流并重構(gòu)對(duì)象。對(duì)象序列
化不僅要將基本數(shù)據(jù)類型轉(zhuǎn)換成字節(jié)表示,有時(shí)還要恢復(fù)數(shù)據(jù)?;謴?fù)數(shù)據(jù)要求有恢復(fù)數(shù)據(jù)的
對(duì)象實(shí)例。ObjectOutputStream中的序列化過(guò)程與字節(jié)流連接,包括對(duì)象類型和版本信息。
反序列化時(shí),JVM用頭信息生成對(duì)象實(shí)例,然后將對(duì)象字節(jié)流中的數(shù)據(jù)復(fù)制到對(duì)象數(shù)據(jù)成員中。
下面我們分兩大部分來(lái)闡述:
處理對(duì)象流:
(序列化過(guò)程和反序列化過(guò)程)
java.io包有兩個(gè)序列化對(duì)象的類。ObjectOutputStream負(fù)責(zé)將對(duì)象寫(xiě)入字節(jié)流,ObjectInp
utStream從字節(jié)流重構(gòu)對(duì)象。
我們先了解ObjectOutputStream類吧。ObjectOutputStream類擴(kuò)展DataOutput接口。
writeObject()方法是最重要的方法,用于對(duì)象序列化。如果對(duì)象包含其他對(duì)象的引用,則
writeObject()方法遞歸序列化這些對(duì)象。每個(gè)ObjectOutputStream維護(hù)序列化的對(duì)象引用表,
防止發(fā)送同一對(duì)象的多個(gè)拷貝。(這點(diǎn)很重要)由于writeObject()可以序列化整組交叉引用的
對(duì)象,因此同一ObjectOutputStream實(shí)例可能不小心被請(qǐng)求序列化同一對(duì)象。這時(shí),進(jìn)行反引用
序列化,而不是再次寫(xiě)入對(duì)象字節(jié)流。
下面,讓我們從例子中來(lái)了解ObjectOutputStream這個(gè)類吧。
// 序列化 today's date 到一個(gè)文件中.
FileOutputStream f = new FileOutputStream("tmp");
ObjectOutputStream s = new ObjectOutputStream(f);
s.writeObject("Today");
s.writeObject(new Date());
s.flush();
現(xiàn)在,讓我們來(lái)了解ObjectInputStream這個(gè)類。它與ObjectOutputStream相似。它擴(kuò)展Dat
aInput接口。ObjectInputStream中的方法鏡像DataInputStream中讀取Java基本數(shù)據(jù)類型的
公開(kāi)方法。readObject()方法從字節(jié)流中反序列化對(duì)象。每次調(diào)用readObject()方法都返回
流中下一個(gè)Object。對(duì)象字節(jié)流并不傳輸類的字節(jié)碼,而是包括類名及其簽名。readObject()
收到對(duì)象時(shí),JVM裝入頭中指定的類。如果找不到這個(gè)類,則readObject()拋出
ClassNotFoundException,如果需要傳輸對(duì)象數(shù)據(jù)和字節(jié)碼,則可以用RMI框架。
ObjectInputStream的其余方法用于定制反序列化過(guò)程。
例子如下:
//從文件中反序列化 string 對(duì)象和 date 對(duì)象
FileInputStream in = new FileInputStream("tmp");
ObjectInputStream s = new ObjectInputStream(in);
String today = (String)s.readObject();
Date date = (Date)s.readObject();
定制序列化過(guò)程:
序列化通??梢宰詣?dòng)完成,但有時(shí)可能要對(duì)這個(gè)過(guò)程進(jìn)行控制。java可以將類聲明為serial
izable,但仍可手工控制聲明為static或transient的數(shù)據(jù)成員。
例子:一個(gè)非常簡(jiǎn)單的序列化類。
public class simpleSerializableClass implements Serializable{
String sToday="Today:";
transient Date dtToday=new Date();
}
序列化時(shí),類的所有數(shù)據(jù)成員應(yīng)可序列化除了聲明為transient或static的成員。將變量聲
明為transient告訴JVM我們會(huì)負(fù)責(zé)將變?cè)蛄谢?。將?shù)據(jù)成員聲明為transient后,序列化
過(guò)程就無(wú)法將其加進(jìn)對(duì)象字節(jié)流中,沒(méi)有從transient數(shù)據(jù)成員發(fā)送的數(shù)據(jù)。后面數(shù)據(jù)反序
列化時(shí),要重建數(shù)據(jù)成員(因?yàn)樗穷惗x的一部分),但不包含任何數(shù)據(jù),因?yàn)檫@個(gè)數(shù)據(jù)
成員不向流中寫(xiě)入任何數(shù)據(jù)。記住,對(duì)象流不序列化static或transient。我們的類要用
writeObject()與readObject()方法以處理這些數(shù)據(jù)成員。使用writeObject()與readObject()
方法時(shí),還要注意按寫(xiě)入的順序讀取這些數(shù)據(jù)成員。
關(guān)于如何使用定制序列化的部分代碼如下:
//重寫(xiě)writeObject()方法以便處理transient的成員。
public void writeObject(ObjectOutputStream outputStream) throws IOException{
outputStream.defaultWriteObject();//使定制的writeObject()方法可以
利用自動(dòng)序列化中內(nèi)置的邏輯。
outputStream.writeObject(oSocket.getInetAddress());
outputStream.writeInt(oSocket.getPort());
}
//重寫(xiě)readObject()方法以便接收transient的成員。
private void readObject(ObjectInputStream inputStream) throws
IOException,ClassNotFoundException{
inputStream.defaultReadObject();//defaultReadObject()補(bǔ)充自動(dòng)序列化
InetAddress oAddress=(InetAddress)inputStream.readObject();
int iPort =inputStream.readInt();
oSocket = new Socket(oAddress,iPort);
iID=getID();
dtToday =new Date();
}
完全定制序列化過(guò)程:
如果一個(gè)類要完全負(fù)責(zé)自己的序列化,則實(shí)現(xiàn)Externalizable接口而不是Serializable接口
。Externalizable接口定義包括兩個(gè)方法writeExternal()與readExternal()。利用這些方
法可以控制對(duì)象數(shù)據(jù)成員如何寫(xiě)入字節(jié)流.類實(shí)現(xiàn)Externalizable時(shí),頭寫(xiě)入對(duì)象流中,
然后類完全負(fù)責(zé)序列化和恢復(fù)數(shù)據(jù)成員,除了頭以外,根本沒(méi)有自動(dòng)序列化。這里要注意了。
聲明類實(shí)現(xiàn)Externalizable接口會(huì)有重大的安全風(fēng)險(xiǎn)。writeExternal()與readExternal()
方法聲明為public,惡意類可以用這些方法讀取和寫(xiě)入對(duì)象數(shù)據(jù)。如果對(duì)象包含敏感信息,
則要格外小心。這包括使用安全套接或加密整個(gè)字節(jié)流。到此為至,我們學(xué)習(xí)了序列化的
基礎(chǔ)部分知識(shí)。關(guān)于序列化的高級(jí)教程,以后再述。
posted @
2007-06-08 13:39 小小程序程序員混口飯吃 閱讀(974) |
評(píng)論 (1) |
編輯 收藏
1:redhat 語(yǔ)言設(shè)置 這個(gè)語(yǔ)言是安裝的時(shí)候決定的,并不是每個(gè)user決定的
/etc/sysconfig/i18n
2:redhat 模式
/etc/inittab
id:5 xwindow mode id:3 test mode
3:使用光驅(qū)
掛載光驅(qū)mount /dev/hdc /mnt/cdrom
卸載光驅(qū)時(shí)候出現(xiàn) umount: /mnt/cdrom device is busy
是因?yàn)楫?dāng)前的目錄已經(jīng)在光盤(pán)目錄,應(yīng)該先退出這個(gè)目錄
4:安裝rpm 文件
rpm -ivh xxx.rpm 安裝包
rpm -qa |grep "tt*" 查詢安裝過(guò)的包
rpm -e xxx
5:在text mode 上翻頁(yè) shift +pageup pagedown
6:ls -al
查找隱藏的文件
7:set 查看環(huán)境變量 .bash_profile
用戶的語(yǔ)言設(shè)置與這個(gè)相關(guān),如果沒(méi)有設(shè)置會(huì)默認(rèn)使用/etc/sysconfig/i18n
8:查看文件類型以及編碼方式
file *.file
9: 編碼轉(zhuǎn)換
命令名稱:iconv
命令格式:iconv -f "文件目前編碼" -t "文件轉(zhuǎn)換后的編碼" -o "轉(zhuǎn)換后生成的新文件名" "源文件名"
ex: iconv -f ISO-8859 -t utf-8 -o mydoc.inc.php mydoc.inc.php.bak
posted @
2007-05-21 17:31 小小程序程序員混口飯吃|
編輯 收藏
CMWAP 和 CMNET 只是中國(guó)移動(dòng)人
為劃分的兩個(gè)GPRS接入方式。前者是為手機(jī)WAP上網(wǎng)而設(shè)立的,后者則主要是為PC、筆記
本電腦、PDA等利用GPRS上網(wǎng)服務(wù)。它們?cè)趯?shí)現(xiàn)方式上并沒(méi)有任何差別,但因?yàn)槎ㄎ徊煌?
,所以和CMNET相比,CMWAP便有了部分限制,資費(fèi)上也存在差別。
WAP只是一種GPRS應(yīng)用模式,它與GRPS的接入方式是無(wú)關(guān)的。WAP應(yīng)用采用的實(shí)現(xiàn)方
式是“終端+WAP網(wǎng)關(guān)+WAP服務(wù)器”的模式,不同于一般Internet的“終端+服務(wù)器”
的工作模式。主要的目的是通過(guò)WAP網(wǎng)關(guān)完成WAP-WEB的協(xié)議轉(zhuǎn)換以達(dá)到節(jié)省網(wǎng)絡(luò)流量和
兼容現(xiàn)有WEB應(yīng)用的目的。WAP網(wǎng)關(guān)從技術(shù)的角度講,只是一個(gè)提供代理服務(wù)的主機(jī),它
不一定由網(wǎng)絡(luò)運(yùn)營(yíng)商提供。但據(jù)我所知,中國(guó)移動(dòng)GPRS網(wǎng)絡(luò)目前只有唯一的一個(gè)WAP網(wǎng)關(guān)
:10.0.0.172,有中國(guó)移動(dòng)提供,用于WAP瀏覽(HTTP)服務(wù)。有一點(diǎn)需要注意,WAP網(wǎng)
關(guān)和一般意義上的局域網(wǎng)網(wǎng)關(guān)是有差別的,標(biāo)準(zhǔn)的WAP網(wǎng)關(guān)僅僅實(shí)現(xiàn)了HTTP代理的功能,
并未完成路由、NAT等局域網(wǎng)網(wǎng)關(guān)的功能。這就決定了它在應(yīng)用上所受到的限制。
為了從應(yīng)用中區(qū)別兩者的定位,中國(guó)移動(dòng)對(duì)CMWAP作了一定的限制,主要表現(xiàn)在CMW
AP接入時(shí)只能訪問(wèn)GPRS網(wǎng)絡(luò)內(nèi)的IP(10..*),而無(wú)法通過(guò)路由訪問(wèn)Internet。我們
用CMWAP瀏覽Internet上的網(wǎng)頁(yè)就是通過(guò)WAP網(wǎng)關(guān)協(xié)議或它提供的HTTP代理服務(wù)實(shí)現(xiàn)的。
也就是需要通過(guò)中國(guó)移動(dòng)GPRS網(wǎng)絡(luò)唯一的一個(gè)WAP網(wǎng)關(guān):10.0.0.172。CMNET擁有完全的
Internet訪問(wèn)權(quán),這里就不多說(shuō)了,主要讓我們來(lái)看看CMWAP。因?yàn)橛辛松厦嫣岬降南拗?
,CMWAP的適用范圍就要看WAP網(wǎng)關(guān)所提供的支持了。目前,中國(guó)移動(dòng)的WAP網(wǎng)關(guān)對(duì)外只提
供HTTP代理協(xié)議(80和8080端口)和WAP網(wǎng)關(guān)協(xié)議(9201端口)。
因此,只有滿足以下兩個(gè)條件的應(yīng)用才能在中國(guó)移動(dòng)的CMWAP接入方式下正常工作:
1. 應(yīng)用程序的網(wǎng)絡(luò)請(qǐng)求基于HTTP協(xié)議。2. 應(yīng)用程序支持HTTP代理協(xié)議或WAP網(wǎng)關(guān)協(xié)議。
而cmnet則不受任何的限制。
說(shuō)白了就是說(shuō)通過(guò)cmwap的方式訪問(wèn),需要走中國(guó)移動(dòng)的網(wǎng)關(guān)通過(guò)http協(xié)議去連接,
這樣的后果就是速度會(huì)變慢,相信很多朋友都用過(guò)代理服
務(wù)器吧,對(duì),就是那個(gè)感覺(jué),而通過(guò)cmnet來(lái)連接的,就是直接連接到無(wú)限乾坤在inter
net上的服務(wù)器,速度會(huì)比cmwap的快一些。說(shuō)完了速度,就該說(shuō)價(jià)格了,如果玩家沒(méi)有
采用套餐的話,那cmwap和cmnet都是一樣的,1kb三分錢(qián),或者訂了一個(gè)xx元包xM的套餐
,超出部分1k一分錢(qián),這種時(shí)候,同等價(jià)格都一樣,據(jù)我了解,cmwap版本流量會(huì)大一些
,所以還是用cmnet比較好,又快又省錢(qián)。但是對(duì)于很多地方的動(dòng)感地帶用戶而言,情況
可能有些不同,相當(dāng)一些地方的動(dòng)感地帶只能訪問(wèn)cmwap,不能訪問(wèn)cmnet,所以沒(méi)地選
擇了,還有一些地方有動(dòng)感地帶的包月上網(wǎng)卡,有10元、20元、50元的等等,具體的要
看當(dāng)?shù)氐馁Y費(fèi)政策了,而這些包月卡通常只包c(diǎn)mwap的流量,這個(gè)時(shí)候如果用cmnet還要
另外付費(fèi),所以建議這些用戶還是使用cmwap吧。最后總結(jié)一下,如果玩家的手機(jī)卡只能
訪問(wèn)cmwap或者有cmwap包月的套餐,那么您就使用cmwap連接來(lái)游戲,否則使用cmnet連
接是更好的選擇
所以,一句話,有wap包月的地區(qū)就使用wap包月上網(wǎng),沒(méi)有包月業(yè)務(wù)的就用cmnet,反正都是按流量算錢(qián),為什么不選擇快一點(diǎn)的呢(但還是要提醒大家,按流量計(jì)費(fèi)產(chǎn)生的費(fèi)用是巨大的,要
多多注意)
posted @
2007-05-17 10:50 小小程序程序員混口飯吃 閱讀(1983) |
評(píng)論 (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 小小程序程序員混口飯吃 閱讀(4071) |
評(píng)論 (0) |
編輯 收藏
記事本=notepad
計(jì)算器=calc
注冊(cè)表=regedit
系統(tǒng)檢測(cè)=dxdiag
畫(huà)圖=mspaint
遠(yuǎn)程桌面=mstsc
posted @
2007-04-29 17:27 小小程序程序員混口飯吃 閱讀(493) |
評(píng)論 (1) |
編輯 收藏
其實(shí)這個(gè)問(wèn)題不是程序的問(wèn)題,主要是property中文問(wèn)題,這個(gè)問(wèn)題可以通過(guò)build解決掉
<native2ascii src="." dest="build" includes="*Props.txt" />
把配置文件編碼 windows下默認(rèn)GBK編碼,linux 要加encoding
代碼一行不用改,放心漢化吧~~
posted @
2007-04-24 15:21 小小程序程序員混口飯吃 閱讀(1933) |
評(píng)論 (3) |
編輯 收藏
如題,有沒(méi)有朋友知道開(kāi)源的在線圖片處理的程序,在頁(yè)面上直接處理圖片,有點(diǎn)象iephotoshop,功能即使不如
imageJ,也要有一些基本的功能.
posted @
2007-04-19 09:20 小小程序程序員混口飯吃 閱讀(2092) |
評(píng)論 (2) |
編輯 收藏
話說(shuō)“你不理財(cái),財(cái)不理你”
那么什么是理財(cái)呢???
很多人都很知道“理財(cái)”,也都無(wú)時(shí)無(wú)刻不在理財(cái),但把理財(cái)說(shuō)清楚的人卻不多...
很多人說(shuō)到理財(cái)想到的就是投資,就是開(kāi)源節(jié)流,就是合理分配財(cái)產(chǎn),等等… …
其實(shí),
---------------------------------------------------------
理財(cái)就是對(duì)財(cái)富的有效管理。
理財(cái)?shù)膬?nèi)涵很廣,包括開(kāi)源節(jié)流,包括合理分配財(cái)產(chǎn),包括投資增值等,但又不止于這些。從理財(cái)?shù)幕A(chǔ)理論來(lái)講,主要包括:現(xiàn)金管理、資產(chǎn)管理、債務(wù)管理、風(fēng)險(xiǎn)管理、投資管理等等。
---------------------------------------------------------
現(xiàn)金管理是理財(cái)?shù)幕A(chǔ)。包括各項(xiàng)收入的籌劃和管理,包括各項(xiàng)稅費(fèi)的管理,包括各項(xiàng)日常支出的管理,包括現(xiàn)金的積累和短期儲(chǔ)蓄等等。具體的管理工具和形式有各式各樣的銀行卡片,各式各樣的儲(chǔ)蓄方式,各種各樣的支出方式,包括各種各樣的節(jié)儉手段等等。
資產(chǎn)管理是理財(cái)?shù)闹匦摹YY產(chǎn)具體包括固定資產(chǎn)、流動(dòng)資產(chǎn)等。固定資產(chǎn)比如房產(chǎn)、鋪面等等,流動(dòng)資產(chǎn)包括儲(chǔ)蓄資產(chǎn)、投資資產(chǎn)、保險(xiǎn)資產(chǎn)等。資產(chǎn)管理是家庭理財(cái)?shù)闹攸c(diǎn),合理有效的管理需要。
債務(wù)管理是理財(cái)?shù)年P(guān)鍵。債務(wù)并非完全的壞事,合理的管理債務(wù)是迅速達(dá)到理財(cái)目標(biāo)的捷徑,只要把債務(wù)控制在一定的合理的范圍之內(nèi),對(duì)優(yōu)化財(cái)務(wù)結(jié)構(gòu)有很好的作用。比如在財(cái)力許可的情況下可以通過(guò)按揭提前實(shí)現(xiàn)高品質(zhì)的家庭生活,通過(guò)金融信用延遲支付貨款往來(lái)等,從而更快實(shí)現(xiàn)財(cái)務(wù)目標(biāo)。
風(fēng)險(xiǎn)管理是理財(cái)?shù)年P(guān)鍵。有效的風(fēng)險(xiǎn)管理是現(xiàn)代社會(huì)先進(jìn)的標(biāo)志,沒(méi)有對(duì)風(fēng)險(xiǎn)的管理交通工具不能上路運(yùn)營(yíng),貿(mào)易貨運(yùn)不能出門(mén)出海流通,商場(chǎng)大廈無(wú)法入住營(yíng)業(yè),流動(dòng)性和小家化也決定個(gè)人進(jìn)行風(fēng)險(xiǎn)管理是大勢(shì)所趨。
投資管理是理財(cái)?shù)囊c(diǎn)。現(xiàn)在很多對(duì)投資理財(cái)非??释惶岬酵顿Y賺錢(qián)眼睛就發(fā)亮,主要是因?yàn)槟壳拔覈?guó)金融環(huán)境不夠完善,安全穩(wěn)健的大眾投資品種非常匱乏,很多人的收益局限于2個(gè)點(diǎn)以內(nèi),相較于去年初高達(dá)5個(gè)點(diǎn)的通貨膨脹顯然是一個(gè)很大的威脅。而國(guó)內(nèi)居民的投資信息和能力先天不足,稍有異動(dòng)即可能遭遇陷阱的現(xiàn)狀導(dǎo)致國(guó)民儲(chǔ)蓄逐年逼高。在理財(cái)范疇內(nèi)投資增值是最需要專業(yè)知識(shí)的,也是實(shí)現(xiàn)家庭理財(cái)目標(biāo)最關(guān)鍵的步驟。所以如何實(shí)現(xiàn)投資的有效管理就很重要。
總之,理財(cái)就是所有與財(cái)富有關(guān)的活動(dòng)的總稱,是現(xiàn)代社會(huì)重要的組成要素,是現(xiàn)代人過(guò)上幸福快樂(lè)生活必備的基本素質(zhì)。
而且,五個(gè)理財(cái)?shù)幕痉矫嬉彩腔ハ嚓P(guān)聯(lián),互為制約,相互促進(jìn)的。
posted @
2007-02-13 11:07 小小程序程序員混口飯吃 閱讀(358) |
評(píng)論 (0) |
編輯 收藏
???????????
做為新一代
3G
及移動(dòng)終端浪潮的設(shè)備管理平臺(tái),
OMA DM
技術(shù)獲得了眾多設(shè)備廠商和運(yùn)營(yíng)商的追捧,也為軟件開(kāi)發(fā)商提供新的崛起機(jī)會(huì)。業(yè)內(nèi)目前也有不少工作在做這方面的軟件。好多公司這方面的產(chǎn)品都是基于Sync4J開(kāi)發(fā)的。
Sync4J
開(kāi)源項(xiàng)目為我們提供了完整的
OMA DM 1.1.2
規(guī)范的
Java
實(shí)現(xiàn)。本文記錄了
Sync4J
DM Server
安裝以及使用SCTS模擬器來(lái)模擬手機(jī)做一個(gè)DM業(yè)務(wù),本文沒(méi)有用PPG來(lái)通過(guò)短信方式來(lái)用真手機(jī)來(lái)做,只是用模擬器來(lái)做的。SCTS是OMA官方提供的一個(gè)測(cè)試工具,主要用來(lái)測(cè)試DMserver的,這里我們用來(lái)測(cè)試Sync4J。Sync4J和SCTS的集合是我們學(xué)習(xí)OMA的一個(gè)很好的方式。
1
:用到以下工具。
?
Oracle9i
? jboss-3.2.3
? sync4j-server-dm-1.4.9?? sync4j
官方有下載
?
SCTS_DeviceManagement_v1.12.zip? OMA
官方網(wǎng)站有下載。
?
?
2
:安裝調(diào)試
?
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
配置環(huán)境變量
? JAVA_HOME=
? J2EE_HOME=
C:\jboss-3.2.3
? SYNCSERVER_HOME=
D:\sync4j\all\server-dm
2.3
修改SYNCSERVER_HOME下的幾個(gè)配置文件
?
?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
的數(shù)據(jù)庫(kù),以下是用來(lái)連接數(shù)據(jù)庫(kù)的,所以一定要配置正確。
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
下運(yùn)行
bin\install.cmd jboss32
2
.5由于這個(gè)版本存在了一個(gè)bug,所以在2.4做完后要修改
SYNCSERVER_HOME\bin\start.cmd
把倒數(shù)第三行
call\run.bat -c
sync4j
改為
call %J2EE_HOME%\bin\run.bat -c sync4j
2
.6 在SYNCSERVER_HOME 運(yùn)行 bin\start.cmd安裝
所有程序到安裝到了
jboss_home
下了,可以到
JBOSS_HOME\
server\sync4j
就可以看到了,看一下你的
oralce
庫(kù)里面也初始化了數(shù)據(jù),表也建好了。
?
2
.7 添加一個(gè)手機(jī)(我們其實(shí)是個(gè)模擬器)上來(lái)
http://your
ip:8080/dmdemo/jsp/addDevice.jsp
填寫(xiě)一個(gè)
IMEI:111111111111111,
?
2
.8 配置scts
Add
device : IMEI:111111111111111
然后點(diǎn)
apply
點(diǎn)擊
DM
Account
Name
:
sync4j
Server:sync4j
Con :
不用填寫(xiě)
Address
:
http://your
ip /sync4j-dm/dm
Port
:8080
Server
authentication:
? Digest :
找數(shù)據(jù)庫(kù)用
sync4j
的數(shù)據(jù)庫(kù)中,
sycn4j_device
表中
:IMEI:111111111111111
,
server
的
password
為:
srvpwd,
把這個(gè)
password
填寫(xiě)到
password
中。
Client authentication
??
DIGEST: USER NAME:
sync4j PASSWORD:
sync4j
Add
就可以了
然后點(diǎn)
connect
連一下
DM SERVER
看看能否連上。
第一次一般會(huì)出現(xiàn)認(rèn)證錯(cuò)我,接著再聯(lián)一次就可以了,
SCTS
有日志可以查看。
?
如果連通了那下面就來(lái)做一個(gè)采集模擬器上的一個(gè)節(jié)點(diǎn)吧。
?
http://your ip:8080/dmdemo/index.html
用
device id
:
IMEI:111111111111111 login
?
?
然后點(diǎn)擊
add to operation list
然后用
SCTS
主動(dòng)回聯(lián)一下,看看
server
能夠拿到這個(gè)節(jié)點(diǎn)的值
你會(huì)看到
6
個(gè)
message
?。。?/span>
詳細(xì)看一下這
6
個(gè)
message
你會(huì)發(fā)現(xiàn),這個(gè)節(jié)點(diǎn)的采集已經(jīng)成功了!
?
?
?
?
posted @
2007-02-05 10:02 小小程序程序員混口飯吃 閱讀(9295) |
評(píng)論 (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?下來(lái)的nounce一定要先做B64的解碼,否則算出來(lái)的結(jié)果對(duì)不上
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 小小程序程序員混口飯吃 閱讀(1360) |
評(píng)論 (0) |
編輯 收藏
范偉先生名言:豬撞樹(shù)上了,你撞豬上了吧
? 我有4種理解:
????? 1:豬撞樹(shù)上了,你撞在豬上,豬比較軟,你比豬幸運(yùn)
????? 2:人家豬都撞樹(shù)上了,你又往人家身上撞,不想讓豬活了?
????? 3:豬往樹(shù)上撞,他智商低,你比不過(guò)他,去撞豬泄憤啊?
????? 4:你撞了豬,豬不跟你一般見(jiàn)識(shí),他去撞樹(shù)
posted @
2006-12-19 09:31 小小程序程序員混口飯吃 閱讀(1674) |
評(píng)論 (6) |
編輯 收藏
最近寫(xiě)一個(gè)東西,在網(wǎng)上看到這個(gè)計(jì)劃書(shū)的范本,很不錯(cuò),抄下來(lái)
商業(yè)計(jì)劃書(shū)目錄
報(bào)告目錄
第一部分 摘要(整個(gè)計(jì)劃的概括) (文字在2-3頁(yè)以內(nèi))
一. 項(xiàng)目簡(jiǎn)單描述(目的、意義、內(nèi)容、運(yùn)作方式)
二. 市場(chǎng)目標(biāo)概述
三. 項(xiàng)目?jī)?yōu)勢(shì)及特點(diǎn)簡(jiǎn)介
四. 利潤(rùn)來(lái)源簡(jiǎn)析
五. 投資和預(yù)算
六. 融資方案(資金籌措及投資方式)
七. 財(cái)務(wù)分析(預(yù)算及投資報(bào)酬)
第二部分 綜述
第一章 項(xiàng)目背景
一. 項(xiàng)目的提出原因
二. 項(xiàng)目環(huán)境背景
三. 項(xiàng)目?jī)?yōu)勢(shì)分析(資源、技術(shù)、人才、管理等方面)
四. 項(xiàng)目運(yùn)作的可行性
五. 項(xiàng)目的獨(dú)特與創(chuàng)新分析
第二章 項(xiàng)目介紹
一. 網(wǎng)站建設(shè)宗旨
二. 定位與總體目標(biāo)
三. 網(wǎng)站規(guī)劃與建設(shè)進(jìn)度
四. 資源整合與系統(tǒng)設(shè)計(jì)
五. 網(wǎng)站結(jié)構(gòu)/欄目板塊
六. 主要欄目介紹
七. 商業(yè)模式
八. 技術(shù)功能
九. 信息/資源來(lái)源
十. 項(xiàng)目運(yùn)作方式
十一.網(wǎng)站優(yōu)勢(shì)(資源/內(nèi)容/模式/技術(shù)/市場(chǎng)等)
十二.無(wú)形資產(chǎn)
十三.策略聯(lián)盟
十四.網(wǎng)站版權(quán)
十五.收益來(lái)源概述
十六.項(xiàng)目經(jīng)濟(jì)壽命
第三章. 市場(chǎng)分析
一. 互聯(lián)網(wǎng)市場(chǎng)狀況及成長(zhǎng)
二. 商務(wù)模式的市場(chǎng)地位
三. 目標(biāo)市場(chǎng)的設(shè)定
四. 傳統(tǒng)行業(yè)市場(chǎng)狀況(網(wǎng)站市場(chǎng)資源的基礎(chǔ))
五. 市場(chǎng)定位及特點(diǎn)(消費(fèi)群體、消費(fèi)方式、消費(fèi)習(xí)慣及影響市場(chǎng)的主要因素分析
市場(chǎng)規(guī)模、市場(chǎng)結(jié)構(gòu)與劃分,特定受眾等
六. 市場(chǎng)成長(zhǎng)(網(wǎng)站PageView與消費(fèi)者市場(chǎng))
七. 本項(xiàng)目產(chǎn)品市場(chǎng)優(yōu)勢(shì)(對(duì)于特定人群的市場(chǎng)特點(diǎn)的省事、省時(shí)、省力、省錢(qián)等)
八. 市場(chǎng)趨勢(shì)預(yù)測(cè)和市場(chǎng)機(jī)會(huì)
九. 行業(yè)政策
第四章 競(jìng)爭(zhēng)分析
一. 有無(wú)行業(yè)壟斷
二. 從市場(chǎng)細(xì)分看競(jìng)爭(zhēng)者市場(chǎng)份額
三. 主要競(jìng)爭(zhēng)對(duì)手情況
第五章 商業(yè)實(shí)施方案
一. 商業(yè)模式實(shí)施方案總體規(guī)劃介紹
二. 營(yíng)銷策劃
三. 市場(chǎng)推廣
四. 銷售方式與環(huán)節(jié)
五. 作業(yè)流程
六. 采購(gòu)、銷售政策的制定
七. 價(jià)格方案
八. 服務(wù)、投訴與退貨
九. 促銷和市場(chǎng)滲透(方式及安排、預(yù)算)
1. 主要促銷方式
2. 廣告/公關(guān)策略、媒體評(píng)估
3. 會(huì)員制等
十. 獲利分析
十一. 銷售資料統(tǒng)計(jì)和銷售紀(jì)錄方式,銷售周期的計(jì)算。
十二. 市場(chǎng)開(kāi)發(fā)規(guī)劃,銷售目標(biāo)(近期、中期),銷售預(yù)估(3-5年)銷售額、占有率及
計(jì)算依據(jù)
第六章 技術(shù)可行性分析
一. 平臺(tái)開(kāi)發(fā)
二. 數(shù)據(jù)庫(kù)
三. 系統(tǒng)開(kāi)發(fā)
四. 網(wǎng)頁(yè)設(shè)計(jì)
五. 安全技術(shù)
六. 內(nèi)容設(shè)計(jì)
七. 技術(shù)人員
八. 知識(shí)產(chǎn)權(quán)
第七章 項(xiàng)目實(shí)施
1. 項(xiàng)目實(shí)施構(gòu)想(公司的設(shè)立、組織結(jié)構(gòu)與股權(quán)結(jié)構(gòu))
2. 網(wǎng)站開(kāi)發(fā)進(jìn)度設(shè)計(jì)與階段目標(biāo)
3. 營(yíng)銷進(jìn)度設(shè)計(jì)與階段目標(biāo)
4. 行政管理部門(mén)的建立、職工的招募和培訓(xùn)安排
5. 項(xiàng)目執(zhí)行的成本預(yù)估
第八章 投資說(shuō)明
一. 資金需求說(shuō)明(用量/期限)
二. 資金使用計(jì)劃(即用途)及分期
三. 項(xiàng)目投資構(gòu)成和固定資產(chǎn)投資的分類
四. 主要流動(dòng)資金構(gòu)成
五. 投資形式(貸款/利率/利率支付條件/轉(zhuǎn)股-普通股、優(yōu)先股、任股權(quán)/對(duì)應(yīng)
價(jià)格等)
六. 資本結(jié)構(gòu)
七. 股權(quán)結(jié)構(gòu)
八. 股權(quán)成本
九. 投資者介入公司管理之程度說(shuō)明
十. 報(bào)告(定期向投資者提供的報(bào)告和資金支出預(yù)算)
十一. 雜費(fèi)支付(是否支付中介人手續(xù)費(fèi))
第九章 投資報(bào)酬與退出
一. 股票上市
二. 股權(quán)轉(zhuǎn)讓
三. 股權(quán)回購(gòu)
四. 股利
第十章 風(fēng)險(xiǎn)分析與規(guī)避
一. 政策風(fēng)險(xiǎn)
二. 資源風(fēng)險(xiǎn)
三. 技術(shù)風(fēng)險(xiǎn)
四. 市場(chǎng)風(fēng)險(xiǎn)
五. 內(nèi)部環(huán)節(jié)脫節(jié)風(fēng)險(xiǎn)
六. 成本控制風(fēng)險(xiǎn)
七. 競(jìng)爭(zhēng)風(fēng)險(xiǎn)
八. 財(cái)務(wù)風(fēng)險(xiǎn)(應(yīng)收帳款/壞帳/虧損)
九. 管理風(fēng)險(xiǎn)(含人事/人員流動(dòng)/關(guān)鍵雇員依賴)
十. 破產(chǎn)風(fēng)險(xiǎn)
第十一章 管理
一. 公司組織結(jié)構(gòu)
二. 現(xiàn)有人力資源或經(jīng)營(yíng)團(tuán)隊(duì)
三. 管理制度及協(xié)調(diào)機(jī)制
四. 人事計(jì)劃(配備/招聘/培訓(xùn)/考核)
五. 薪資、福利方案
六. 股權(quán)分配和認(rèn)股計(jì)劃
第十二章 經(jīng)營(yíng)預(yù)測(cè)
一. 網(wǎng)站經(jīng)營(yíng)
1.訪問(wèn)人數(shù)成長(zhǎng)預(yù)測(cè)
2.會(huì)員增長(zhǎng)預(yù)測(cè)
3.行業(yè)聯(lián)盟預(yù)測(cè)
二. 銷售數(shù)量、銷售額、毛利率、成長(zhǎng)率、投資報(bào)酬率預(yù)估及計(jì)算依據(jù)
第十三章 財(cái)務(wù)可行性分析
一. 財(cái)務(wù)分析說(shuō)明
二. 財(cái)務(wù)數(shù)據(jù)預(yù)測(cè)
1. 收入明細(xì)表
2. 成本費(fèi)用明細(xì)表
3. 薪金水平明細(xì)表
4. 固定資產(chǎn)明細(xì)表
5. 資產(chǎn)負(fù)債表
6. 利潤(rùn)及利潤(rùn)分配明細(xì)表
7. 現(xiàn)金流量表
三. 財(cái)務(wù)分析指標(biāo)
反映財(cái)務(wù)盈利能力的指標(biāo)
a.投資回收期(Pt)
b.投資利潤(rùn)率
c.投資利稅率
d.不確定性分析
第三部分 附錄
一. 附件
1. 主要經(jīng)營(yíng)團(tuán)隊(duì)名單及簡(jiǎn)歷
2. 專業(yè)術(shù)語(yǔ)說(shuō)明
3. 企業(yè)形象設(shè)計(jì)/宣傳資料(標(biāo)識(shí)設(shè)計(jì)、說(shuō)明書(shū)、出版物、包裝說(shuō)明等)
二. 附表
1. 市場(chǎng)受眾分析(人群分布/數(shù)量等)表
2. 互聯(lián)網(wǎng)成長(zhǎng)狀況表
3. 主要設(shè)備清單
4. 互聯(lián)網(wǎng)市場(chǎng)調(diào)查表
5. 預(yù)估分析表
6. 各種財(cái)務(wù)報(bào)表及財(cái)務(wù)預(yù)估表
|
posted @
2006-12-18 13:48 小小程序程序員混口飯吃 閱讀(10628) |
評(píng)論 (2) |
編輯 收藏