지난번에 작성한 백업스크립트는 Net::Telnet::Cisco모듈을 사용하여 작성한 스크립트이다. 이 모듈은 연결하는 장비의 형태를 구분하지 못하기 때문에 PIX나 FWSM을 연결하여 백업을 받는데 문제가 발생하였다. 모듈에 Net::Appliance::Session이라는 모듈이 있는데 이 모듈을 사용하면 Platform(IOS, FWSM3,FWSM,PIXOS,CATOS,Aironet)을 지정할 수 있기 때문에 여러장비의 백업을 한번에 받을 수 있다. 그래서 스크립트를 아래와 같이 수정한다.

#!/usr/bin/perl -w

use POSIX;
use Net::Appliance::Session;

$BASEDIR = "/root/temp";

chdir $BASEDIR;
open(INPUT,'test.txt') || die "파일을 열수없읍니다!";
#test.txt파일에는 ip,사용자명,암호,enable암호,platform,형식으로 텍스트파일을 만듬.

$m_dir = strftime("%Y%m",localtime);
if(!(chdir $m_dir)) {
mkdir $m_dir, 0700;
chdir $m_dir;
}

while($Line = <input>) {
($host,$user,$passwd,$e_passwd,$platform) = split(/,/,$Line);

my $conn = Net::Appliance::Session->new(
Host => $host,
Transport => 'Telnet',
Platform => $platform);
--> PIX 7.X버전을 설치하고 나서 일단 telnet접근이 안되서 Transport를 SSH를 사용하도록 수정했다. 또한, PIX를 SSH를 연결하고 나서 에러가 발생하면서 끊어지는데 디버깅을 통하여 살펴보니 no pager명령이 에러가 발생하면서 종료되었다. PIX7.X버전에서는 pager명령이 config mode에서 실행이 되어야 하는데 privileged mode에서 실행되어서 에러가 발생한것이다. 그러면 connect를 할때 pager명령을 수행하지 않도록 해야하는데 이것은 모듈에서 수정을 해주어야한다.
vi /usr/lib/perl5/sire_perl/5.8.0/Net/Appliance/Session.pm에서
self->do_paging(1); 값을 false로 변경해준다. self->do_paging(0);
그러면 connect실행시에 pager명령이 수행되지 않기 때문에 조건에 맞게 pager명령을 수행할 수 있다.

# 이 라인은 디버깅을 위한 라인
$conn->input_log(*STDOUT);
#

eval {
$conn->connect(Name => $user, Password => $passwd);
$conn->begin_privileged($e_passwd);

if($host =~ /192.168.4.2/) {
$conn->begin_configure();
$conn->cmd('no pager');
$conn->end_configure();
} else {
$conn->cmd('terminal length 0');
}
PIX의 경우에는 pager명령을 수행하도록 하고 IOS의 경우에는 terminal명령을 실행하도록 지정했다.

@output = $conn->cmd('show running-config');

$outfile = ">".$host.".cfg";
open(OUTFILE,$outfile);
print "Writing $host to file\n";
print(OUTFILE @output);

if($host =~ /192.168.4.2/) {
$conn->begin_configure();
$conn->cmd('pager lines 24');
$conn->end_configure();
} else {
$conn->cmd('terminal length 24');
}
privileged mode를 종료하기 전에 pager나 terminal line을 원래의 값으로 변경해준다,
$conn->end_privileged;
close OUTFILE;
};

#이 라인은 디버깅을 위한 라인..
if ( UNIVERSAL::isa($@,'Net::Appliance::Session::Exception') ) {
print $@->message, "\n"; # fault description from Net::Appliance::Session
print $@->errmsg, "\n"; # message from Net::Telnet
print $@->lastline, "\n"; # last line of output from your appliance
# perform any other cleanup as necessary
}
#
if($@) {
$e = Exception::Class->caught();
ref $e ? $e->rethrow : die $e;
}

$conn->close;
}

close(INPUT);
~
~

Posted by salgunamu
:

Cisco장비의 config을 자동으로 백업하기 위한 스크립트를 찾다가 perl module에 Net::Telnet::Cisco, net::Telnet::Cisco::IOS모듈을 사용하여 스크립트를 작성하는 방법을 찾게되었다.
아래의 스크립트는 aaa new-model이 적용되어서 username과 password를 통해서 로그인을 하지만 privilege level이 enable모드가 아니어서 enable mode로 전환하는 부분을 넣어주었다.
-----------
use POSIX;
use Net::Telnet::Cisco::IOS;

$BASEDIR = "/home/working";

chdir $BASEDIR;

$m_dir = strftime("%Y-%m",localtime);
if(!(chdir $m_dir)) {
mkdir $m_dir, 0755;
chdir $m_dir;
}

$username = "guest";
$password = "guest";

@host = qw( 192.168.10.80
);

foreach $host (@host) {
my $conn = Net::Telnet::Cisco::IOS->new(HOST=>$host);
$conn->login( Name => $username,
Password => $password); # aaa new-model을 사용하지 않는다면 Password항목만.

if(!$conn->enable($password)) { # Privilege level이 15라면 이 부분은 필요가 없을듯..
warn "Can't enable: ". $conn->errmsg;
}

@output = $conn->getConfig();
$outfile = ">".$host."-confg";
open(OUTFILE,$outfile);
print "Writing $host to file\n";
print(OUTFILE @output);
close OUTFILE;
$conn->close;
}

Posted by salgunamu
:

vi(m)을 사용하다보면 윈도우즈에서 작업한 텍스트 파일에 ^M 문자가 붙는 경우를 종종 봅니다.
현재 vim에서는 도스 문서로 문서를 읽게 되면 이 문자가 붙지 않기도 하지만
종종 이 문자 때문에 문서 보기가 상당히 귀찮아 보일 때가 있습니다.
특히, SQL 백업 파일을 볼 때 이 문자가 붙기도 하는데 특정한 내용을 볼 때
이런 문자가 붙은 것을 보기는 상당히 힘들죠.
(sun의 파일을 aix에서 받을 때에도 이런 문제가 발생한다고 합니다)
이 문자는 ^M은 ^+M이 아니라 Control+v+m 입니다. 따라서, 다음에 이 문자를 없앨 때도
이렇게 타이핑을 하도록 합니다.

다음은 http://www.lug.or.kr/에 올라온 몇 개의 팁을 참조하여 정리한 것입니다.
생각보다 많은 방법들이 있을 수 있겠군요.

1. vi(m)이 열린 상태
1.1 문자 치환 명령 이용
다음과 같이 문자 치환 명령으로 이 문자를 없애도록 합니다.
:1,$s/^M//g

물론 이것의 입력은 다음과 같이 하도록 합니다.
:1,$s/[Control]+v+m을 누른다.//g

Posted by salgunamu
:
사용자 삽입 이미지
Posted by salgunamu
:

참고문서는
http://www.cisco.com/en/US/tech/tk648/tk362/technologies_tech_note09186a0080094a9b.shtml

Avaya스위치에 실행을 해봤는데 적용이 된다.
[root@gamja root]# snmpwalk -v 1 -c tech 140.24.24.2 .1.3.6.1.2.1.17.4.3
SNMPv2-SMI::mib-2.17.4.3.1.1.0.0.12.249.75.72 = Hex-STRING: 00 00 0C F9 4B 48
SNMPv2-SMI::mib-2.17.4.3.1.1.0.0.240.137.133.73 = Hex-STRING: 00 00 F0 89 85 49
==> OID : .1.3.6.1.2.1.17.4.3.1은 CAM 테이블의 dynamic MAC address의 값들인것 같고…
OID : .1.3.6.1.2.1.17.4.3.2는 해당 MAC에 대한 인터페이스인것 같다…
SNMPv2-SMI::mib-2.17.4.3.1.2.0.0.12.249.75.72 = INTEGER: 13
SNMPv2-SMI::mib-2.17.4.3.1.2.0.0.240.137.133.73 = INTEGER: 3

스위치의 CAM 테이블 항목을 주기적으로 가져다가 DB에 정보를 저장하여 이용하는 방안을 모색중…

사용자 삽입 이미지

[스크립트 수정]

1. Avaya

- switch_info.inc : 스위치의 IP와 snmp community정보를 지정

- switch_mac.inc : 스위치와 라우터의 MAC address를 기록. 이것은 100Mbps의 업링크 포트를 찾기 위함

- make_cam_class.php : 스위치의 CAM테이블을 읽어와서 Gigabit업링크와 100Mbps업링크 포트의 정보만 제외하고 나머지를 DB에 저장하는 루틴

- get_port_number.php: avaya MIB의 port description은 모델마다 틀린경우가 존재하여 별도의 포트번호를 계산하는 루틴을 만듬

- cam2db.php : 메인 프로그램

2. Cisco

- switch_info.inc : 스위치의 IP와 snmp community(community@vlan-id)정보를 지정

- make_cam_class.php : 스위치의 CAM테이블을 읽어와서 DB에 저장하는 루틴

- cam2db.php : 메인 프로그램

3. search모듈

- find_cam.php : CLI상태에서 mac address로 스위치의 포트를 찾는 스크립트

- find_ip_cam.php : CLI상태에서 IP address로 노드의 MAC과 스위치의 포트를 찾는 스크립트

- search.php : 웹브라우저를 통하여 IP address로 노드의 MAC과 스위치의 포트를 찾는 스크립트

[2006년 4월7일 PHP코드작성 - 초판]

#!/usr/local/bin/php
# 작성자: 한상구(ssanggu@gmail.com)
# 작성일: 2006년 4월6일
# 작성목적: Layer2스위치의 Dynamic CAM Table의 내용을 5분주기로 SNMP get 하여 DB에
# 저장하여 향후 노드추적의 정보로 이용하고자 함..

$switch_ip = array(’14.248.2.2′);
$community_name = ‘xxxx’;

$db_host = “localhost”;
$db_user = “xxxx”;
$db_password = “xxxx”;
$db_name = “xxxx”;

$db_connect = mysql_connect($db_host, $db_user, $db_password) or die(”DB서버에 연결할 수 없습니다. ” . mysql_error());
mysql_select_db($db_name) or die(”데이터베이스를 선택할 수 없습니다.”);

foreach ($switch_ip as $s_ip) {
do_snmp($s_ip, $community_name);
}

function do_snmp ($host, $community)
{
# 스위치의 Dynamic CAM Table에 대한 OID
$cam_oid = ‘.1.3.6.1.2.1.17.4.3.1.1′;
# cam_oid를 이용하여 스위치의 CAM table을 읽어와 배열에 저장한다.
$cam = snmpwalk($host, $community, $cam_oid);

# 스위치의 CAM 항목에 대한 iFindex object instance정보를 가지고 있는 OID
$mac_port_oid = ‘.1.3.6.1.2.1.17.4.3.1.2′;
$mac_port = snmpwalk($host, $community, $mac_port_oid);

for($i=0; $i $m1 = trim(substr($cam[$i],12));
$m2 = preg_split(’/ /’,$m1);
# DB테이블을 MAC Vendor별로 테이블을 만들기 위하여 추출
# 향후에 검색과 테이블의 사이즈 증가를 예방하기 위함`
$vendor_mac = $m2[0].$m2[1].$m2[2];
$mac_address = join(’:',$m2);
#MIB-II에서 정의한 ifindex object에 대한 번호추출
$p_number = substr($mac_port[$i],9);
$ifindex = substr(snmpget($host, $community, “.1.3.6.1.2.1.17.1.4.1.2.$p_number”),9);
#uplink포트에서 Learning하는 CAM정보는 저장을 하면 안된다. 따라서 업링크 포트를
#찾기 위하여 포트의 bandwidth에서 100M가 넘는 포트를 업링크로 간주하여 제외한다.
$p_speed = substr(snmpget($host, $community, “.1.3.6.1.2.1.2.2.1.5.$ifindex”),9);

$port_desc = snmpget($host, $community, “.1.3.6.1.2.1.2.2.1.2.$ifindex”);
$port_desc_arr = preg_split(’/ /’, $port_desc);

#Port의 대역폭이 10M/100M인경우에만 DB작업에 들어간다.
if((trim($p_speed) == ‘10000000′) or (trim($p_speed) == ‘100000000′)) {

if(trim($port_desc_arr[1]) == ‘Avaya’) {
$port_number = $port_desc_arr[7];
$module_number = $port_desc_arr[10];
}

# DB테이블이 존재하는지를 검사하여 없는 경우에 테이블을 생성
$tbl_exists = mysql_query(”DESCRIBE `$vendor_mac`”);

if(!$tbl_exists) {
$create_table=mysql_query(”CREATE TABLE `$vendor_mac` (`mac` varchar(20) not null default ”, `s_ip` varchar(20) not null default ”, `module_no` smallint(2) not null default 0, `port_no` smallint(5) not null default 0, `first` timestamp not null default 0, `last` timestamp not null default 0, primary key (`mac`))”);
}

# MAC이 존재하면 UPDATE를 존재하지 않으면 INSERT
$m_exists = mysql_query(”SELECT * FROM `$vendor_mac` WHERE `mac` = ‘$mac_address’”);

if(!$m_exists) {
$insert_q=mysql_query(”INSERT INTO `$vendor_mac` VALUES (’$mac_address’,'$host’,$module_number,$port_number,NOW(),NOW())”);
} else {
$update_q=mysql_query(”UPDATE `$vendor_mac` SET `s_ip`=’$host’, `module_no`=$module_number, `port_no`=$port_number, `last`=NOW() WHERE `mac` = ‘$mac_address’”);
}

echo “\t$mac_address\t$module_number\t$port_number\n”;
}
}
}

mysql_close($db_connect);
?>

[Mac address조회 루틴]

#!/usr/local/bin/php
# 작성자: 한상구(ssanggu@gmail.com)
# 작성일: 2006년 4월7일
# 작성목적: DB에 저장된 CAM정보에서 입력받은 MAC에 대한 정보를 찾아서 출력

$db_connect = mysql_connect($db_host, $db_user, $db_password) or die(”DB서버에 연결할 수 없>
습니다. ” . mysql_error());
mysql_select_db($db_name) or die(”데이터베이스를 선택할 수 없습니다.”);

if($argc == 2) {
if(preg_match(”/^\w{2}:\w{2}:\w{2}:\w{2}:\w{2}:\w{2}$/”,trim($argv[1]))) {
$mac_address = strtoupper(trim($argv[1]));

$mac_arr = preg_split(’/:/’,$mac_address);
$table_name = $mac_arr[0].$mac_arr[1].$mac_arr[2];

$find_query = mysql_query(”SELECT * FROM `$table_name` WHERE `mac` = ‘$mac_address’”);
if($find_query) {
while($row = mysql_fetch_assoc($find_query)) {
echo “MAC address:\t\t”.$row[”mac”].”\n”;
echo “스위치 IP address:\t”.$row[”s_ip”].”\n”;
echo “Stack Module No:\t”.$row[”module_no”].”\n”;
echo “처음감지일자:\t\t”.$row[”first”].”\n”;
echo “마지막감지일자:\t\t”.$row[”last”].”\n”;
}
} else {
die(”데이터베이스에서 입력한 MAC address가 발견되지 않았습니다.\n”);
}
} else {
die(”입력된 MAC address의 형식이 틀립니다.\n”);
}
} else {
die(”사용법: ./find_cam.php Mac-address(예: ./find_cam.php 00:00:F0:EF:AA:BB)\n”);
}

mysql_close($db_connect);
?>

[2006년 4월10일]

기존의 스크립트에서는 포트번호와 모듈번호를 찾기 위하여 port description에서 정보를 추출했는데 이 정보가 스위치의 버전에 따라서 저장되는 내용이 다른 문제때문에 MySQL 쿼리문이 제대로 작성이 안되는 문제점이 발생하였다. 따라서, 포트번호와 모듈번호 추출을 위한 다른 방식으로 스크립트를 조정함..


# 작성자: 한상구(ssanggu@gmail.com)
# 작성일: 2006년 4월6일
# 작성목적: Layer2스위치의 Dynamic CAM Table의 내용을 5분주기로 SNMP get 하여 DB에
# 저장하여 향후 노드추적의 정보로 이용하고자 함..

$switch_ip = array(’143.248.240.2′);
$community_name = ‘public’;

$db_connect = mysql_connect($db_host, $db_user, $db_password) or die(”DB서버에 연결할 수 없습니다. ” . mysql_error());
mysql_select_db($db_name) or die(”데이터베이스를 선택할 수 없습니다.”);

foreach ($switch_ip as $s_ip) {
do_snmp($s_ip, $community_name);
}

function do_snmp ($host, $community)
{
# 스위치의 Dynamic CAM Table에 대한 OID
$cam_oid = ‘.1.3.6.1.2.1.17.4.3.1.1′;
# cam_oid를 이용하여 스위치의 CAM table을 읽어와 배열에 저장한다.
$cam = snmpwalk($host, $community, $cam_oid);

# 스위치의 CAM 항목에 대한 iFindex object instance정보를 가지고 있는 OID
$mac_port_oid = ‘.1.3.6.1.2.1.17.4.3.1.2′;
$mac_port = snmpwalk($host, $community, $mac_port_oid);

$if_list = snmpwalk($host, $community, ‘.1.3.6.1.2.1.16.1.1.1.1′);

$tag = 0;
$d_tag = 0;
$port_number = 1;

for($i = 1; $i

$port_index = substr($if_list[$i],9);
$module_number = (int)((int)($port_index) / 1000);
$p_module_number = (int)((int)(substr($if_list[$i-1],9)) / 1000);

$d_tag = $module_number - $p_module_number;

$p_speed = substr(snmpget($host, $community, “.1.3.6.1.2.1.2.2.1.5.$port_index”),9);

if((trim($p_speed) == ‘10000000′) or (trim($p_speed) == ‘100000000′)) {
if($tag > 0) {
$tag = 0;
$port_number = 1;

$module_arr[”$port_index”] = $module_number;
$port_arr[”$port_index”] = $port_number;
$port_number++;
} else {
if($d_tag != 0) {
$port_number = 1;

$module_arr[”$port_index”] = $module_number;
$port_arr[”$port_index”] = $port_number;
$port_number++;
$d_tag = 0;
} else {
$module_arr[”$port_index”] = $module_number;
$port_arr[”$port_index”] = $port_number;
$port_number++;
}
}
} else {
$tag++;
}
}

for($i=0; $i
$m1 = trim(substr($cam[$i],12));
$m2 = preg_split(’/ /’,$m1);
# DB테이블을 MAC Vendor별로 테이블을 만들기 위하여 추출
# 향후에 검색과 테이블의 사이즈 증가를 예방하기 위함`
$vendor_mac = $m2[0].$m2[1].$m2[2];
$mac_address = join(’:',$m2);
#MIB-II에서 정의한 ifindex object에 대한 번호추출
$p_number = substr($mac_port[$i],9);
$ifindex = substr(snmpget($host, $community, “.1.3.6.1.2.1.17.1.4.1.2.$p_number”),9);
#uplink포트에서 Learning하는 CAM정보는 저장을 하면 안된다. 따라서 업링크 포트를
#찾기 위하여 포트의 bandwidth에서 100M가 넘는 포트를 업링크로 간주하여 제외한다.
$p_speed = substr(snmpget($host, $community, “.1.3.6.1.2.1.2.2.1.5.$ifindex”),9);

#Port의 대역폭이 10M/100M인경우에만 DB작업에 들어간다.
if((trim($p_speed) == ‘10000000′) or (trim($p_speed) == ‘100000000′)) {

$port_number = $port_arr[”$ifindex”];
$module_number = $module_arr[”$ifindex”];

# DB테이블이 존재하는지를 검사하여 없는 경우에 테이블을 생성
$tbl_exists = mysql_query(”DESCRIBE `$vendor_mac`”);

if(!$tbl_exists) {
$create_table=mysql_query(”CREATE TABLE `$vendor_mac` (`mac` varchar(20) not null default ”, `s_ip` varchar(20) not null default ”, `module_no` smallint(2) not null default 0, `port_no` smallint(5) not null default 0, `first` datetime , `last` datetime , primary key (`mac`))”);
}

# MAC이 존재하면 UPDATE를 존재하지 않으면 INSERT
$m_exists = mysql_query(”SELECT * FROM `$vendor_mac` WHERE `mac` = ‘$mac_address’”);

if(mysql_num_rows($m_exists) == 0) {
$insert_q=mysql_query(”INSERT INTO `$vendor_mac` VALUES (’$mac_address’,'$host’,$module_number,$port_number,NOW(),NOW())”);
} else {
$update_q=mysql_query(”UPDATE `$vendor_mac` SET `s_ip`=’$host’, `module_no`=$module_number, `port_no`=$port_number, `last`=NOW() WHERE `mac` = ‘$mac_address’”);
}

echo “\t$mac_address\t$module_number\t$port_number\n”;
}
}
}

mysql_close($db_connect);
?>

Posted by salgunamu
:

XHTML이란?

programming 2006. 1. 4. 15:59 |

XHTML이 무엇인가?

* XHTML은 EXtensible HyperText Markup Language
* XHTML은 HTML을 대체(replace)하기위한것이다.
* XHTML은 HTML4.01과 거의 동일(identical)하다.
* XHTML은 엄격하고 깨끗한(stricter and cleaner) HTML버전이다.
* XHTML은 XML응용프로그램으로 정의된 HTML이다.
* XHTML은 W3C권고안이다.

XHTML은 HTML과 XML의 조합으로 HTML 4.01의 모든 요소들과 XML문법을 조합하여 구성된다.
그러면, 왜 XHTML을 사용하는가? 에 대한 대답은 잘못된 HTML의 사용때문이라고 응답을 해야 할 것같다. 현재의 브라우저들은 잘못된 HTML에 대해서도 보여주는데 XHTML은 이러한 잘못 사용되는 HTML을 올바르게 고쳐서 well-formed문서를 만드는 것이다. XHTML은 HTML 4.01과 거의 유사하기 때문에 HTML 4.01표준을 기반으로 문서를 작성하는 것이 좋은 시작이 될 수 있다.

HTML과 XHTML의 가장 큰 차이점은:

* XHTML elements must be properly nested
o <b><i>This text is bold and italic</b></i>이와 같이 잘못된 중첩을 사용하면 안된다. <b><i>This text is bold and italic</i></b>
* XHTML documents must be well-formed
o 다음과 같은 기본구조로 잘 구성된 문서를 만들어야 한다.
<html>
<head> … </head>
<body> … </body>
</html>

* Tag names must be in lowercase
o XHTML문서는 XML응용프로그램이고 XML은 대소문자를 구분하므로 모든 Tag들은 소문자로 사용하여야 한다.
<BODY> –> <body>
* All XHTML elements must be closed
o XHTML의 모든 구성요소들은 닫혀야 한다.
o <p> … </p>
o <br />
o <hr />
o <img src=”…” alt=”…” />
* Attribute names must be in lower case
o 속성이름도 반드시 소문자를 사용한다. <table WIDTH=”100%”> –> <table width=”100%”>
* Attribute value must be quoted
o 속성값은 반드시 따옴표처리를 한다. <table width=100%> –> <table width=”100%”>
* Attribute minimization is forbidden
o 속성을 간략화 하는 것이 금지된다. <input checked> –> <input checked=”checked”>
o The id sttribute replaces the name attribute
HTML4.01에서 a, applet, frame, iframe, img와 map요소에서 name속성을 정의한다. XHTML에서는 name속성이 경시되므로 id속성으로 대신 사용한다.
<img src=”picture.gif” name=”picture1″ /> –> <img src=”picture.gif” id=”picture1″ />
이전 브라우저들과의 호환성을 생각해서 한동안 id와 name속성을 같이 사용한다.
o Lang속성
lang속성은 거의 모든 XHTML구성요소에 적용된다. 이것은 구성요소들 내의 내용들이 어떤 언어인지를 지정하는 것이다. 요소에 lang속성을 사용했다면, 아래와 같이 반드시 xml:lang속성을 같이 추가해주어야 한다.
<div lang=”no” xml:lang=”no”&gtHeia Norge!</div>
o The XHTML DTD define mandatory elements
모든 XHTML문서들은 DOCTYPE선언을 가져야 한다.
<!DOCTYPE Doctype goest here>

Posted by salgunamu
:

[자바]OOP개념잡기

programming 2005. 11. 10. 14:57 |

자바를 공부한다는 사람이 OOP의 개념도 이해를 하지 못하고 진행을 하니 진도가 전혀 나가지를 안는듯하다.

Object는 현실생활의 모든 것들을 다 object로 보고 이것을 소프트웨어적으로 구현이 가능한것 같다. 이러한 object는 두가지 특성을 가진다고 한다. 이것은 소프트웨어적으로 구현하기 위하여 그러한 범주안으로 넣은 것은 아닐런지…
하여간에 상태(state)행위(behavior)가 그것이다. 예를들면, 개(dog)는 이름, 색깔등과 같은 state가 있고 짖는다, 꼬리를 물고있다 등과 같은 behavior가 있다. 이러한 현실생화의 object들을 소프트웨어적으로 구현할때 state는 하나 이상의 변수(variable)에 저장하고 behavior는 method라는 함수에 의해서 구현이 가능하단다.
한마디로 object는 variable과 관련된 method들의 소프트웨어적 꾸러미라고 볼수있다.

자전거는 여러종류의 자전거들이 있다. 하지만 여러종류의 자전거들도 공통으로 가지고 있는 state(current gear, current cadence,two wheels)와 behavior(change gears, brake)가 있다. 이렇듯 모든 object에 공통으로 가지고 있는 variable과 method를 정의하는 원형을 class라고 한다.

그렇다면, 이러한 class의 정의는 어떻게 하는가? 이 정의를 1장에서 하고 있더군..짭
class은 object oriented언어의 기본 building block으로 아래와 같은 형식을 가진다.
class clss-name {
. . . //class definition block
}
class의 정의은 class라는 키워드로 시작하여 클래스 이름이 들어가고 괄호안에 class에 해당되는 variable과 method를 정의한다.
class HelloWorldApp {
public static void main(String[] args) {
System.out.println(”Hello world!”); //Display the string.
}
}

HelloWorldApp라는 class는 변수가 없고 main이라는 단 하나의 method만을 가지고 있다. main method는 모든 자바 프로그램들의 시작지점으로 아래와 같은 형식을 가진다.
public static void main(String[] args)
public : 어떤 class이던지 main method를 호출할 수 있도록 한다.
static : HelloWorldApp class와 연관된 main method라는 것을 의미한다.
void : main method가 아무런 값도 되돌려 주지 않는다는 것을 의미한다.

여기에다 Message라는 것이 있는데 이것은 object간의 통신수단이라고 생각하면 될것같다. 예를들어 당신이 자전거의 기어를 변경하기를 원한다면 당신이라는 object에서 자전거라는 object로 기어를 변경하라는 Message를 보내서 동작하도록 하는 것이다.

Inheritance(상속,계승)이라는 말은 이전에 class에서 자건거의 예를 들었던것을 상기하면 될것 같다. 여러종류의 자전거들이 있는데 공통으로 들어가는 내용들의 내려받는 개념정도로…

또.. object와 연관되지 않는 device들간의 통신을 위한것이 interface 라고 한다.

Posted by salgunamu
:

4장을 읽다보니 건성으로 넘어간 2장의 object개념이 가물가물하다…쩝..어쩔수없이 되돌아와서 2장을 정리하고 넘어가야 할것 같다.
http://java.sun.com/docs/books/tutorial/java/concepts/index.html

- Object는 object-oriented technology를 이해하기 위한 핵심이고 실생활(real-world)에서 많은 object의 예를 볼 수있다. (your dog, your desk, your televison set, your bicycle 등등)
이러한 실생활의 objects는 두가지 특성을 가진다: state, behavior
예). your dog
state: name, color, breed(새끼를낳다),hungry
behavior: barking, fetching, wagging tail

- 실생활의 object들이 state와 behavior를 가지듯 softeware object도 state와 behavior를 가진다. software object는 자신의 state를 하나 이상의 변수(variable)에 유지한다. variable는 식별자(identifier)로명명ㄷ한 데이터의 항목이다. behavior는 method에 의해 구현되는데 method는 object에 연관된 function(subroutine)이다.

* An object is a software bundle of variables and related methods.

- 실생황의 objects나 GUI에서 event와 같은 추상적인 개념을 표현하기 위해서 Software Object를 사용할 수 있다.
- software object가 아는것(state)와 할 수 있는것(behavior)모두는 variable와 methods에 의해 표현된다.
- object-oriented에서 개개의 object를 instance라고하고 그것의 state를 저장하는 변수를 instance variable이라한다.

Posted by salgunamu
:

http://java.sun.com/docs/books/tutorial/java/data/index.html
이장은 object의 life cycle을 설명한다. 어떻게 object를 생성하고, 어떻게 사용하고 더 이상 사용할 필요가 없는경우에 시스템이 어떻게 clean을 하는지를 정의한다.

Core Classes
- Character data : java.lang에 있는 4개의 classes(Character, String, StringBuilder,StringBuffer)중의 하나에 의해서 단일 문자나 연속적인 문자들을 저장하고 조작할 수 있다.
- Numeric data : number class와 그것의 subclasses들로 표현된다. number class는 자바 플랫폼에서 모든 number class들의 superclass이다. java.lang패키지안에는 Byte,Double,Float,Integer, Long, Shot가 있고 java.math패키지에는 BigDecimal, BigInteger가 있다.
- Arrays : 동일한 형의 다중값들을 하나의 object로 그룹하기 위한 것으로 자바언어에서 array class는 없고, 직접적으로 지원된다. Array는 Object class의 함축적인 확장이다. 그래서 Object로 선언된 같은 type의 변수에 array를 선언할 수 있다.

자바 플랫폼은 classes들을 기능적인 packages로 그룹핑해서 제공하기 때문에 자신의 class를 작성하는 대신에 자바플랫폼에서 제공하는 class를 사용하는 것이 좋다. 4장에서 사용되는 대부분의 classes들은 java.lang에 포함되어져 있고, 당신의 프로그램상에서 import문을 사용하지 않더라도 자동적으로 포함된다.

==The Life Cycle of an Object==
일반적인 자바 프로그램은 많은 object들을 생성하고 생성된 object들간에 message를 보냄으로써 상호동작하여 여러가지 작업들을 수행하게 된다.

Posted by salgunamu
:

[서버]operate_flowd.pl

programming 2005. 9. 29. 07:30 |

Cisco NetFlow export data를 저장하는 방법을 찾는 도중에
FLOWD(http://www.mindrot.org/flowd.html)라는 프로그램을 찾았다. 이것을 이용하여
export되는 데이터를 하나의 파일에 저장을 하는데 하나의 파일보다는 날짜별로 분리해서 파일을 저장하는 것이 좋을듯 하여
하나의 펄스크립트를 작성해봤다. 끼적..끼적..
#!/usr/bin/perl
#작성자: 한상구(sghan@ans.co.kr)
#작성일: 2005년9월29일
#목적: Cisco의 Netflow데이터를 수집하는 flowd를 이용하는데 날짜별로 파일을
# 만들어서 저장하기 위함.
#

# 로그파일이름을 날짜별로 만들도록 flowd.conf파일을 생성하여 하루마다 flowd
# 데몬이 재구동되는 프로세스 구성..
$config_file = “/usr/local/etc/flowd.conf”; #FLOWD의 구성파일 위치

open(CONFFILE, “>$config_file”) || die “$config_file 이 존재하지 않습니다: $!”;

($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime;
# localtime함수는 문맥에 따라서 다른 내용을 반환.
# 스칼라문맥: $timestr = localtime; “Wed May 1 2:38:17 2002″ 스트링을 반환.
# 목록문맥: @timestruct = localtime; (17, 38, 21, 1, 4, 102, 3, 120,0)
# (초,분,시,날짜,월-1,년-1900,요일,1월1일1부터의날수-1,일광절약시간)반환
$r_year = $year + 1900;
$r_mon = $mon + 1;
print CONFFILE “###작성일:\t $r_year 년 $r_mon 월 $mday 일 $hour:$min\n”;
print CONFFILE “logfile \”/home/_flowd/flowd_$r_year$r_mon$mday\”\n”;
print CONFFILE “pidfile \”/var/run/flowd.pid\”\n”;
print CONFFILE “listen on 143.248.240.113:12345\n”;
print CONFFILE “store ALL\n”;
close(CONFFILE);

$flowd_pid = `cat /var/run/flowd.pid`;
kill ‘HUP’, $flowd_pid;

Posted by salgunamu
: