2008년 10월 30일 목요일

원도우 종료 이벤트.

뭐 너무 간단하지만 .. 가끔 까먹기때문에 ..;;

implements WindowListener
frame = new Frame("frame");

frame.addWindowListener( new WindowAdapter() {
               public void windowClosing( WindowEvent e){
                     System.exit(0);
               }
         });

JAVA String


String (byte[] bytes, int offset, int length)
          플랫폼의 디폴트 캐릭터 세트를 사용해, 지정된 바이트 부분 배열을 복호화(decode) 하는 것에 의해, 새로운 String 를 구축합니다.
Example :  

byte[] bt = new byte[1000];
 
 while(true){
 
  int n;
  n = in.read(bt);
  if(n==-1) break;
  System.out.print(new String(bt,0,n));
 
 }



String (char[] value)
          새로운 String 를 할당해, 이것이 캐릭터 배열 인수에 현재 포함되어 있는 캐릭터 순차 순서를 나타내도록(듯이) 합니다.
Example :      char data[] = {'a', 'b', 'c'};
                   String str = new String(data);   ==  String str = "abc";



 char charAt (int index)
          지정된 인덱스 위치에 있는 캐릭터를 돌려줍니다.

Example : 
 String test = new String("abcdefg");
  char a = test.charAt(0);
  String b = String.valueOf(a);
  System.out.println(b);

 int compareTo (Object  o)
          이 String 를 다른 Object 와 비교합니다.
 int compareTo (String  anotherString)
          2 개의 캐릭터 라인을 사전식과 비교합니다
.

  String test = new String("abcdefg");
  String test2 = new String("abcdefg");
   
  int i = test.compareTo(test2);
  if(i == 0)
   System.out.println("test,test2 의 문자열은 같다");
  else
   System.out.println("test,test2 의 문자열은 다르다");


 String concat (String  str) 
          지정된 캐릭터 라인을 이 캐릭터 라인의 마지막에 연결합니다
.

System.out.println("to". concat("get"). concat("her"));
Console : together

JList

 private JList getJList() {
  if (jList == null) {
   list = new Vector();
   
   File file = new File("./music/");
   String f_list[] = null;
   f_list = file.list();
   filesize = f_list.length;
   for(int i = 0; i< f_list.length ; i++)
    list.add(f_list[i]);
   
   jList = new JList(list);
    jList.setSelectedIndex(0);
    jList.setVisibleRowCount(15);
    jList.setFont(new Font("Dialog", Font.BOLD, 12));
    name = (String) list.get(0);
   jList.setBackground(new Color(255, 228, 248));
   this.jList.addListSelectionListener(this);
  }
  return jList;
 }

http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JList.html 

MMDB Shall Client (FastDB)

MMDB 서버 클라이언트 테스트 프로그램 Client (테스트 용이기때문에 소스가 불안정함)

TestCase :



more..

국산 데이타베이스관리시스템 시장입지 굳힌다.

가격ㆍ기술력 앞세워 공공부문 채택 잇따라

알티베이스 이어 티맥스소프트도 공급계약

국산 데이터베이스관리시스템(DBMS)이 공공부문을 중심으로 핵심 업무용 DBMS로 잇달아 채택되고 있다. 전반적인 경기침체로 합리적인 가격과 강력한 기술지원은 제품 선택의 기준으로 더욱 강조될 것으로 보여 국산 DBMS가 시장에서 입지를 굳힐 수 있을지 주목된다.

티맥스소프트(대표 박대연)는 국립농산물품질관리원(원장 양태선)의 전체 DBMS를 자사 제품인 `티베로 3.0'으로 전환 구축하고 있다고 27일 밝혔다. 국립농산물품질관리원은 농산물이력추적 농가등록 등 14종의 기간계 업무 시스템을 티베로로 완전히 전환한데 이어 원내 모든 시스템을 티베로로 교체할 방침이다.

이에 앞서 알티베이스(대표 김기완)도 지난 8월 근로복지공단(이사장 김원배) 차세대 노동보험시스템에 자사 DBMS인 알티베이스5를 공급하는 계약을 체결했다. 내년 말까지 진행되는 이 사업은 2009년 전체 예산이 90억원에 이르는 대규모 사업인데다 금융 프로젝트 성격을 갖고 있어 향후 사업영역을 확장하는 데도 도움이 될 것으로 기대하고 있다. 근로복지공단 DBMS 계약액은 6억원 규모였던 국방부 물자탄약정보체계 성능 개선 사업보다 상회하는 것으로 알려졌다.

이같은 국산 DBMS의 약진에는 성능 대비 경제적인 가격과 강력한 기술지원이 가장 중요한 요인으로 꼽힌다. 민근홍 농산물품질관리원 사무관은 "티베로는 오라클과 구조가 유사해 마이그레이션이나 개발, 관리가 용이하다"며 "유지보수 비용도 타사 제품 대비 절반 수준이어서 예산 절감에 큰 도움이 됐다"고 말했다. 알티베이스를 도입한 근로복지공단의 경우 성능을 높일 수 있는 대안을 찾는 한편 업무 특성에 맞는 알티베이스의 다양한 금융권 레퍼런스와 국산 DBMS 사용에 대한 정책적인 의지가 일부 반영된 것으로 알려졌다.

DBMS 시장점유율이 높은 한국오라클의 영업 관행에 대한 반감이 적극적인 윈백(win-back, 교체)으로 가시화되고 있다는 해석도 있다. 최근 국산 DBMS를 도입한 한 기관의 전산 담당자는 "오라클 5카피 가운데 1카피를 더 이상 사용하지 않게 됐는데 이에 대한 기관장 명의의 라이선스 포기각서 없이는 나머지 4카피에 대한 유지보수 계약을 맺을 수 없었다"며 한국오라클과의 협상 결렬이 국산 제품을 검토한 직접적인 요인이었음을 시사했다. 실제로 최근 발표된 국산 DBMS 도입 사례 중에는 `오라클 텃밭'이라고 불리던 국방, 교육, 공공 부문의 윈백이 상당수 포함돼 있다.

장순열 한국IDC 수석연구원은 "국산 DBMS는 지난 3~4년간 시장에서 검증을 받아 제품력에 대한 의심은 상당 부분 해소된 상태"라며 "그러나 DBMS 시장과 담당자들은 보수적인 성향이 뚜렷해 `아직 널리 쓰이지 않는 제품'이라는 인식을 극복하는 것이 관건"이라고 말했다.

박상훈기자 nanugi@

http://jus1170.tistory.com/11574  

2008년 10월 21일 화요일

JAVA LInkedList

import java.util.List; import java.util.LinkedList; import java.util.Iterator; import java.util.ListIterator; import java.util.Collections; import java.util.Random; public class LinkedListExample { public static void main(String[] args) { // LinkedList Creation List linkedListA = new LinkedList(); List linkedListB = new LinkedList(); // Adding elements to the LinkedList for (int i = 0; i < 5; i++) { linkedListA.add(new Integer(i)); } linkedListB.add("beginner"); linkedListB.add("java"); linkedListB.add("tutorial"); linkedListB.add("."); linkedListB.add("com"); linkedListB.add("java"); linkedListB.add("site"); // Iterating through the LinkedList to display the Contents. Iterator i1 = linkedListA.iterator(); System.out.print("LinkedList linkedListA --> "); while (i1.hasNext()) { System.out.print(i1.next() + " , "); } System.out.println(); System.out.print("LinkedList linkedListA --> "); for (int j = 0; j < linkedListA.size(); j++) { System.out.print(linkedListA.get(j) + " , "); } System.out.println(); Iterator i2 = linkedListB.iterator(); System.out.println("LinkedList linkedListB --> "); while (i2.hasNext()) { System.out.print(i2.next() + " , "); } System.out.println(); System.out.println(); System.out .println("Using ListIterator to retrieve LinkedList Elements"); System.out.println(); ListIterator li1 = linkedListA.listIterator(); // next(), hasPrevious(), hasNext(), hasNext() nextIndex() can be used with a // ListIterator interface implementation System.out.println("LinkedList linkedListA --> "); while (li1.hasNext()) { System.out.print(li1.next() + " , "); } System.out.println(); // Searching for an element in the LinkedList int index = linkedListB.indexOf("java"); System.out.println("'java' was found at : " + index); int lastIndex = linkedListB.lastIndexOf("java"); System.out.println("'java' was found at : " + lastIndex + " from the last"); System.out.println(); // Getting the subList from the original List List subList = linkedListA.subList(3, linkedListA.size()); System.out.println("New Sub-List(linkedListA) from index 3 to " + linkedListA.size() + ": " + subList); System.out.println(); // Sort an LinkedList System.out.print("Sorted LinkedList linkedListA --> "); Collections.sort(linkedListA); System.out.print(linkedListA); System.out.println(); // Reversing an LinkedList System.out.print("Reversed LinkedList linkedListA --> "); Collections.reverse(linkedListA); System.out.println(linkedListA); System.out.println(); // Checking emptyness of an LinkedList System.out.println("Is linkedListA empty? " + linkedListA.isEmpty()); System.out.println(); // Checking for Equality of LinkedLists LinkedList LinkedListC = new LinkedList(linkedListA); System.out.println("linkedListA.equals(LinkedListC)? " + linkedListA.equals(LinkedListC)); System.out.println(); // Shuffling the elements of an LinkedList in Random Order Collections.shuffle(linkedListA, new Random()); System.out .print("LinkedList linkedListA after shuffling its elements--> "); i1 = linkedListA.iterator(); while (i1.hasNext()) { System.out.print(i1.next() + " , "); } System.out.println(); System.out.println(); // Converting an LinkedList to an Array Object[] array = linkedListA.toArray(); for (int i = 0; i < array.length; i++) { System.out.println("Array Element [" + i + "] = " + array[i]); } System.out.println(); // Clearing LinkedList Elements linkedListA.clear(); System.out.println("linkedListA after clearing : " + linkedListA); System.out.println(); } }

Output

LinkedList linkedListA --> 0 , 1 , 2 , 3 , 4 ,
LinkedList linkedListA --> 0 , 1 , 2 , 3 , 4 ,
LinkedList linkedListB -->
beginner , java , tutorial , . , com , java , site ,

Using ListIterator to retrieve LinkedList Elements

LinkedList linkedListA -->
0 , 1 , 2 , 3 , 4 ,
'java' was found at : 1
'java' was found at : 5 from the last

New Sub-List(linkedListA) from index 3 to 5: [3, 4]

Sorted LinkedList linkedListA --> [0, 1, 2, 3, 4]
Reversed LinkedList linkedListA --> [4, 3, 2, 1, 0]

Is linkedListA empty? false

linkedListA.equals(LinkedListC)? true

LinkedList linkedListA after shuffling its elements--> 3 , 2 , 4 , 0 , 1 ,

Array Element [0] = 3
Array Element [1] = 2
Array Element [2] = 4
Array Element [3] = 0
Array Element [4] = 1

linkedListA after clearing : []

출처: http://www.javabeginner.com/java-linkedlist.htm 

2008년 10월 20일 월요일

whois 정보출력하기

 Socket s = new Socket("whois.krnic.net",43);
 
 InputStream in = s.getInputStream();
 OutputStream out = s.getOutputStream();
 
 out.write("hufs.ac.kr\n".getBytes());
 out.flush();
 
 byte[] bt = new byte[1000];
 
 while(true){
 
  int n;
  n = in.read(bt);
  if(n==-1) break;
  System.out.print(new String(bt,0,n));
 
 }
 
  in.close();
  s.close();
  

(byte)(0xff & (val >> 24)) 의 의미

(byte)0xff & (val >> 24), (byte)0xff & (val >> 16), (byte)0xff & (val >> 8)

답변 :
int는 4 byte로 구성됩니다.

byte 배열로 바꾸려면 int 값을 네 부분으로 나누어야겠죠.

예를 들어 int 값을 2진수로 표현했을 때

val = 10101110 10101010 11101010 10101111 (2) 일 때

val >> 24 = 10101110 (2) 이고 이 경우에는 0xFF 와 &를 취할 필요가 없죠.

val >> 16 = 10101110 10101010 (2) 이기 때문에 뒤의 8 비트를 남겨야 하니까
0xFF와 &을 취합니다. (val >> 16) && 0xff = 10101010 (2) 입니다.

val >> 8 = 10101110 10101010 11101010 (2) 에서 뒤의 8 비트를 남기기 위하여
0xFF와 & 를 취합니다. (val >> 24) && 0xff = 11101010 (2) 입니다.


출처: 네이버 지식인


2008년 10월 18일 토요일

Thread 기본

무엇이며, 왜 이용하는가
쓰레드는 세미(semi)프로세스, 혹은 Light Weight 프로세스라고 불리우며, 여러개의 클라이언트를 처리하는 서버/클라이언트 모델의 서버프로그래밍 작업을 위해서 주로 사용된다. 비슷한 일을 하는 fork(2) 에 비해서 빠른 프로세스 생성 능력과, 적은 메모리를 사용하는게 Light Weight 프로세스라고 불리우는 이유이다.

보통의 유닉스 프로세스는 main()함수에 의해서 시작되고 실행되는 single 쓰레드 로 이루어지며, 하나의 연속된 명령어들만을 처리한다. 반면 멀티쓰레드 프로그램은 여러개의 연속된 명령어들을 동시에 처리할수 있다.

스레드는 자기자신의 스택메모리영역을 가지고, 코드의 조각을 실행한다. (real) 프로세스 와는 달리 쓰레드는 다른 형제 쓰레드들과 메모리를 공유하게 된다.(보통 프로세스는 자기자신만의 메모리영역을 가진다). 이렇듯 전역 메모리를 공유하게 되므로 fork 방식에 비해서 좀더 작은 메모리를 소비하게 된다.

fork 에 비해서 thread 가 가지는 장점은 위에서 언급했듯이 "빠른 프로세스 생성" 능력과, 메모리 공유에 위한"적은 메모리의 사용"과 메모리 공유에 따른 쓰레드간의 좀더 쉬운 정보공유이다. fork(2) 시스템에서 부모와 자식같이 통신을 위해서는 IPC를 사용해야 하며 이는 꽤 어려운 작업이 될수도 있는데, 메모리를 공유함으로 IPC의 사용을 줄이면서도 쓰레드간 정보교환을 쉽게 할수있다.

fork 에 비해서 쓰레드가 더 빠른 수행능력을 보이는 이유는 fork 가 기본적으로 모든 메모리와 모든 기술자(파일기술자등)을 copy-on-write 방식으로 자식에게 복사하는데 비해서 쓰레드는 많은 부분을 공유하기 때문이다. copy-on-write 자체가 효율적이긴 하지만, 메모리 자원을 공유하는 것보다는 느릴 수 밖에 없다.

반면 단점도 가지고 있는데, 모든 쓰레드가 같은 메모리 공간을 공유하게 되므로, 하나의 쓰레드가 잘못된 메모리연산을 하게 되면, 모든 프로세스가 그 영향을 받게 된다는 것이다. fork 등을 통한 프로세스 생성방식에 있어서는 OS 가 가각의 프로세스를 보호해줌으로 한 프로세스의 문제는 해당 프로세스의 문제로 끝나게 된다. 그러나 쓰레드는 이러한 프로세스 보호를 기대할수 없다. 하나의 쓰레드에 문제가 생기면 전체 쓰레드에 문제가 생길가능성이 크다. 이런 이유로 멀티 쓰레드 프로그램은 좀더 주의를 기울여서 작성해야 한다. 또단 하나의 흐름을 가지는 단일 프로세스 프로그램과 달리, 여러개의 흐름으로 분리가 되기 때문에, 디버깅을 하기가 까다롭다는 문제도 가진다.

아래는 쓰레드간에 서로 공유하는 자원들을 나열한 것이다.
  • 작업디렉토리
    • 파일지시자들
    • 대부분의 전역변수와 데이타들
  • UID 와 GID
  • signal
다음은 각각의 쓰레드가 고유하게 가지는 자원들을 나열한 것이다.
  • 에러번호(errno)
  • 쓰레드 우선순위
  • 스택
  • 쓰레드 ID
  • 레지스터 및 스택지시자
다음은 멀티쓰레드 프로세스가 어떻게 각종 자원을 공유하는지를 나타낸것이다.

http://www.joinc.co.kr/albums/album01/abg.gif

파일은 기본적으로 공유하며, 메모리 영역중에 상당부분을 공유한다는걸 볼수 있을것이다.

POSIX thread

흔히 Pthread 라고 불리우며, POSIX 에서 표준으로 제안한 thread 함수모음으로 thread 를 지원하기위한 C 표준 라이브러리 셋을 제공한다. 이후 모든 예제는 Pthread 를 통해서 구현하고 설명하게 될것이다.

쓰레드의 생성과 종료

멀티 쓰레드 프로그램이 처음 시작되었을때 그것은 main()함수를 실행하는 단일 프로세스 상태로 작동하게 될것이다. 이것은 그 자체로 하나의 완전한 쓰레드이다. 이 상태에서 우리는 pthread_create(3) 함수를 부름으로써 새로운 쓰레드를 생성할수 있다.

쓰레드를 이용한 프로그램은 기본적으로 아래와 같은 순서로 작동하게 된다.
     Master Thread 
           | 
           |             pthread_create() 에 의해서 worker 생성 
           | 
     +---+----+---+      worker 시작 
     |   |    |   | 
     |   |    |   |      각각의 worker는 그들의 작업을 수행한다. 
     |   |    |   | 
     +---+----+---+      worker 를 종료한다.   
           | 
           |             pthread_join()에 의해서 worker 를 join 한다. 
           | 
     Master Thread 
 

worker 은 쓰레드로 바꾸어 생각할수도 있다.

아래는 쓰레드 프로그램의 가장 간단한 예이다.
#include <stdio.h> 
#include <unistd.h> 
#include <pthread.h> 

void* do_loop(void *data)
{
    int i;

    int me = *((int *)data);
    for (i = 0; i < 10; i++)
    {
        printf("%d - Got %d\n", me, i);
        sleep(1);
    }
}

int main()
{
    int       thr_id;
    pthread_t p_thread[3];
    int status;
    int a = 1;
    int b = 2;      
    int c = 3;      

    thr_id = pthread_create(&p_thread[0], NULL, do_loop, (void *)&a);
    thr_id = pthread_create(&p_thread[1], NULL, do_loop, (void *)&b);
    thr_id = pthread_create(&p_thread[2], NULL, do_loop, (void *)&c);

    pthread_join(p_thread[0], (void **) &status);
    pthread_join(p_thread[1], (void **) &status);
    pthread_join(p_thread[2], (void **) &status);

    printf("programing is end\n");
    return 0;
}

위의 프로그램을 컴파일 시키기 위해선 pthread 라이브러리를 링크시켜줘야 한다.
[yundream@localhost test]# gcc -o thread thread.c -lpthread 
 
최초에 main() 쓰레드가 시작되고 나서 pthread_create 를 이용해서 3개의 쓰레드를 생성 시켯다. 각각의 쓰레드는 do_loop 코드를 실행한다. 쓰레드가 모든 작업을 마쳤다면, pthread_join 을 이용해서 다른 쓰레드가 종료될때까지 기다리고, 모든 쓰레드가 종료되었다면, main()쓰레드가 종료되고 프로세스는 완전히 끝나게 된다.

쓰레드의 생성은 pthread_create()를 호출함으로써 이루어진다. 첫번째 아규먼트는 pthread_t 데이타 구조체에 대한 포인터를 돌려주는데, 쓰레드에 대한 지시값이 들어 있다. 각각의 쓰레드는 각각의 유일한 pthread_t 를 가지고 있어야만 한다. 위의 프로그램에서 우리는 각각의 쓰레드가 유일한 p_thread 를 가지도록 하기 위해서 생성할 쓰레드의 수만큼(3)을 배열로 만들었다. 2번째 아규먼트는 쓰레드가 만들어질때의 타입이다.

(스케쥴링 우선순위 같은). 보통은 NULL 값을 사용한다. 쓰레드 타입에 대한 내용은 pthread_attr_init(3) 을 참조하기 바란다. 3번째 아규먼트가 바로 쓰레드가 실행할 코드이다. 4번째 아규먼트는 쓰레드에 넘겨주고 싶은 값을 명시해주면 된다. 여기에서는 각 쓰레드에 번호를 부여하기위한 int 값을 넘겼다.

각 쓰레드는 1부터 10까지 증가 시킨다음에 쓰레드를 종료하도록 되어 있다.

그동안 메인 쓰레드는 pthread_join 을 호출하여서 각각의 쓰레드가 종료할때까지 기다린다. 3개의 쓰레드가 모두 종료가 된다면 메인 쓰레드는 "programing is end" 메시지를 출력하고 프로그램을 완전히 종료하게 될것이다.

pthread_join 은 fork 의 wait(2) 와 비슷하다고 볼수 있다. fork 에서도 자식프로세스가 모두죽고 나서 부모프로세스가 죽어야 하듯이(예외를 만들수도 있지만), 쓰레드도 모든 생성된 쓰레드가 종료된 다음에 메인 쓰레드가 종료되어야 한다.

pthread_join 을 사용하게 되면 메인 쓰레드는 pthread_join 에 명시된 쓰레드가 종료할때까지 잠자면서(sleep)기다리게 된다. 이는 모든 쓰레드가 종료하기 전에 부모쓰레드가 종료하는 사태를 막기 위해서 사용된다. 하나의 쓰레드가 모든일을 종료하고, pthread_join 을 깨우게 되면, 쓰레드가 가지고 있던 자원들을 모두 되돌려주게 된다 (free). 만약 실행되고 있는 쓰레드를 즉시 중지하길 원한다면 pthread_cancel() 과 pthread_testcancel()을 사용하면 된다.

공용으로 사용되는 자원의 동기화

위에서 우리는 쓰레드를 사용할경우 상당히 많은 자원을 서로 공유하게 됨으로 얻는 여러가지 이점에 대해서 알아봤었다. 그러나 하나의 자원을 여러개의 쓰레드가 동시에 공유하게 됨으로 자원획득에 관한 문제가 발생할수 있다. 실지로 쓰레드를 사용하게 될경우 가장 주의해야 할점 중 하나가 바로 자원의 동시 접근에 대한 제어이다.

기본적으로 하나의 쓰레드가 하나의 자원에 접근하고 있을때, 다른 쓰레드는 그 자원에 대한 이전 쓰레드의 작업이 모두 끝나기전엔 접근하면 안될것이다.

이런한 공유되는 자원에 대한 접근제어는 IPC 설비의 세마포어와 매우 비슷한 점이 있다. 쓰레드에서는 이러한 공유되는 자원의 접근 제얼르 위해서 Mutexe 라는 것을 제공한다. Mutexe 는 다루어야할 내용이 꽤 많음으로 다음번 강좌에서 다루도록 하겠다.


http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Thread/Beginning/WhatThread?action=print 

2008년 10월 17일 금요일

grep / find

1. grep 명령어
grep : 파일 전체를 검색해서 정규 표현식에 대응하는 모든 행들을 출력한다. 
egrep : extended grep, grep의 확장판으로 추가 정규 표현식, 메타 문자를 지원한다. 
fgrep : fixed character gerp, fast grep, 모든 문자를 문자 그대로 취급한다. 즉, 정규 표현식의 메타 문자도 일반 문자로 취급한다.

사용법
grep [옵션]... 패턴 [파일] ...
Search for PATTERN in each FILE or standard input.
Example: grep -i 'hello world' menu.h main.c

grep에서 사용하는 정규 표현식 메타 문자
메타 문자 / 기능 / 사용 예 / 사용 예 설명
^ / 행의 시작 시시자 / '^love' / love로 시작하는 모든 행과 대응
$ / 행의 끝 지시자 / 'love$' / love로 끝나는 모든 행과 대응
. / 하나의 문자와 대응 / 'l..e' / l 다음에 두 글자가 나오고 e로 끝나는 문자열을 포함하는 행과 대응
[] / [] 사이의 문자 집합 중 하나와 대응 / '[Ll]ove' / Love나 love를 포함하는 행과 대응
[^] / 문자 집합에 속하지 않는 한 문자와 대응 / '[^A-K]ove / A와 K 사이의 범위에 포함되지 않는 한 문자와 ove가 붙어있는 문자열과 대응

grep 옵션
-c : 일치하는 행의 총 수를 출력한다(count).
-h : 파일 이름을 출력하지 않는다.
-i : 대소문자를 구분하지 않는다(ignore).
-l : 패턴이 존재하는 파일의 이름만 출력한다(list file).
-n : 파일 내에 행 번호를 함께 출력한다(number).
-v : 패턴이 존재하지 않는 행만 출력한다(invert).
- w : 단어 단위로 찾는다(word).


2. find 명령어
find [path...] [expression]
유닉스 마다 조금씩 다른 문법을 가지고 있기 때문에 시스템의 find 맨 페이지를 살펴봐야 한다.

-name : 이름으로 파일을 찾는다(와일드 카드와 함께 사용될 때에는 반드시 따옴표로 묶어야 함).
-type [bdcplfs] : 파일의 종류(블록, 디렉토리, 문자, 파이프, 심볼릭 링크, 일반 파일, 소켓)를 지정하여 찾는다.
-user : 소유자로 파일을 찾는다(이름이나 UID).
-group : 그룹으로 파일을 찾는다(이름이나 GID).
-perm : 퍼미션으로 파일을 찾는다(권한 지정).
-size :  
-atime n : 파일이 읽힌 가장 최근 시간으로 찾는다(accessed time).
-ctime n : 파일의 소유자 권한이 바뀐 가장 최근 시간으로 찾는다(changed time)
-mtime +n/-n/n : 파일이 수정된 가장 날짜로 찾는다(modified time)
   +5 - 5일 동안 수정 되지 않은 파일
   -5 - 5일 동안에 수정된 파일
     5 - 오늘부터 5일 전에 수정된 파일
-newer file1 file2 : file1 보다는 새로운 파일이지만 file2 보다는 오래된 파일을 찾는다.
-delete : 찾은 파일을 삭제한다.
-ls : ls -dils와 같은 출력을 한다.
-print : find 명령의 실행 결과를 출력한다. 
-exec command {} \; : 파일을 찾은 후 찾은 파일들에 대해 특정 명령을 수행한다(문법 주의).
-depth : 
-maxdepth n : 0이 아닌 정수 값으로 경로 깊이를 지정하여 찾는다(1은 시작 위치로 지정한 디렉토리만 검색).
-follow : 심볼릭 링크가 있으면 심볼릭 링크를 따라가서 찾는다.
-mount : 현재 파일 시스템과 동일한 파일 시스템에서만 찾는다.
-nouser : /etc/passwd 파일에 없는 소유자의 파일을 찾는다.
-nogroup : /etc/groups 파일에 없는 그룹의 파일을 찾는다.

사용 예시
# find . -print
.은 현재 디렉토리를 의미한다. 현재 find 명령어가 실행되고 있는 디렉토리와 그 모든 서브 디렉토리에 있는 파일들을 찾아서 화면에 출력한다. 

# find . -name "*.pdf" -print
# find . -name '*.pdf' -print
# find . -name \*.pdf -print

- .pdf인 모든 파일을 모두 찾는다.
./pdfs/gdb(1).pdf
./pdfs/gdb(2).pdf
./pdfs/gdb(3).pdf
./docs/Firewall.pdf

# find . -name "*.pdf" -print | grep -v "^\./pdfs/"
- pdfs 디렉토리 내에 있지 않은 pdf 파일 만을 찾는다.
find 명령의 결과를 파이프를 통해 grep에 전달한다.
grep에서 -v는 역 필터를 설정한다. 즉, grep -v 다음에 나오는 것과 반대되는 것을 보여준다. 
전체 표현 식을 인용 부호 감싸 주었다("^./pdfs/").
   ^는 grep에게 표현 식이 각 라인의 1열에서부터 일치하는 것 만을 찾으라 말하는 것이다.
   \는 .을 특별한 문자로 해석하지 못하게 하기 위해 쓰인 추가적인 인용 부호이다.
표현 식 전체는 grep에게 ./pdfs/ 디렉토리에 있지 않는 .pdf 파일을 찾아 보여달라는 것을 의미한다.

# find . -name "*.pdf" -print | grep -v "^\./pdfs/" | xargs -J X mv X ./pdfs/
- 찾은 파일을 다른 디렉토리로 옮긴다.
grep은 find의 결과를 필터링 한다. 그 grep의 결과 값이 pipe를 통해 xargs 명령어로 전달이 되고 원하는 일이 완료된다. 
J 스위치는 xargs 명령어에게 stdin으로 들어오는 모든 파일들을 소스로, 명령어 다음에 나오는 파일을 목적지로 가정하게 한다. 예를 들면 find 명령을 내리기 전에는 얼마나 많은 파일들을 옮겨야 하는 지 알 수 없다. 찾은 파일이 몇 개인지 상관없이 xargs가 해당 파일 모두를 pdfs 디렉토리로 옮기게 하는 일종의 마법 같은 작업이 J 스위치로 인해 가능하다. 또한 J 스위치가 올바르게 작동시키기 위해 X라는 문자열을 정의하여 mv 다음에 삽입한다.

# find . -atime +30 -print
- 파일을 읽은 30일 이상이 지난 파일들을 찾아서 보여준다.

# find . -mtime -1 -print
- 24 시간 안에 수정된 파일을 찾아서 보여준다.

# find . -atime +7 -o -size +20480 -print
- 7일 이상 접근하지 않은 파일이거나 크기가 10MB 이상인 파일을 찾아서 보여준다.
여러 스위치를 결합해서 사용할 때 -o나 논리 or를 사용하지 않는다면 모든 결과는 논리적인 and의 결과이다. 
size 스위치는 크기를 512 바이트 단위로 인식한다. 

# find . -atime +7 -o -size +`expr 10 \* 1024 \* 2` -print
- size를 KB 단위로 보여준다.
backquotes(`) 사이에서 필요로 하는 계산을 한다(`는 키보드의 가장 왼쪽 상단에 있다). 

# echo find . -atime + 7 -o -size +`expr 10 \* 1024 \* 2` -print
find. -atime +7 -o -size +20480 -print
find 명령어 앞에 echo를 더해서 그 결과가 무엇인지 미리 알아 볼 수도 있다.
--------------------------------------------------------------------------------

루트 디렉토리부터 대소문자 구별해서 파일 찾기
# find / -name 파일명 -type f

루트 디렉토리부터 대소문자 구별 없이 파일 찾기 (대소문자 구별 없음)
# find / -iname 파일명 -type f 

루트 디렉토리부터 확장자가 txt인 파일 찾기 
# find / -name "*.txt"

현재 디렉토리와 한 단계 아래의 디렉토리에서만 파일 찾기
# find . -maxdepth 2 -name "*.txt"

현재 디렉토리부터 첫 글자가 영어 대문자인 파일 찾기
# find . -name "[A-Z]*"

현재 디렉토리부터 worldtop이라는 사용자 소유의 파일 찾기
# find . -user worldtop

자신의 홈 디렉토리부터 최근 3일 동안 변경된 파일 찾기
# find ~ -mtime -3

루트 디렉토리부터 suid와 guid가 설정된 파일을 찾아서 권한 확인(cracker의 침입이 의심스러운 경우)
# find / -perm +6000
# find / -type f -perm +6000 -ls

현재 디렉토리부터 하위 디렉토리 내의 파일/폴더 명에 .jsp가 들어가는 경로를 포함한 파일/폴더 보여 주기
# find . | grep .jsp
# ls -R | grep .jsp ==> 경로 미 포함 파일/폴더 보여주기

파일들을 찾아서 recursive하게 삭제하기
# fine / -name *.log -exec rm {} \;
-exec  파일을 찾은 후 다음의 명령을 실행하라.
rm {} \;  한 세트로 앞에서 찾은 파일을 삭제하라. 띄어스기 주의!

http://t3388.woweb.net/blog2/entry/grep-과-find

VI / VIM 사용법

vi 편집기 사용법
 

 vi 시작

 텍스트 삭제

 

 vi filename

 파일열기, 작성

 

 x

 문자 삭제

 

 vi +18 filename

 18행으로 파일 열기

 

 dw

 단어 삭제

 

 vi +/"string" fn

 "string"의 처음 발생 단어부터

 

 dd

 행 삭제

 

 vi -r filename

 손상된 파일 회복

 

 D

 커서 오른쪽 행 삭제

 

 view filename

 읽기 전용으로 파일 열기

 

 :5,10 d

 5-10 번째 행 삭제

 커서명령(이동)

 텍스트 복사 및 이동

 

 h(←)

 왼쪽으로 커서 이동

 

 yy

 행 yank 또는 복사

 

 j(↓)

 아래로 커서 이동

 

 Y

 행 yank 또는 복사 

 

 k(↑)

 위로 커서 이동

 

 dd

 행 삭제

 

 l(→)

 오른쪽으로 커서 이동

 

 P

 yank되거나 삭제된 행 현재 행 위에 삽입

 

 w

 한 단어 오른 쪽으로 커서 이동 

 

 p

 yank되거나 삭제된 행 현재 행 아래에 삽입

 

 b

 한 단어 왼쪽으로 커서 이동 

 

 :1,2 co 3

 1-2행을 3행 다음으로 복사

 

 Return

 한 행 아래로 커서 이동

 

 :4,5 m 6

 4-5행을 6행 위로 이동

 

 Back Space

 한 문자 왼쪽으로 커서 이동

 행 번호 설정

 

 Space Bar

 한 문자 오른 쪽으로 커서 이동

 

 :set nu

 행 번호 표시

 

 H

 화면의 맨위로 이동

 

 :set nonu

 행 번호 숨기기

 

 M

 화면의 중간으로 이동

 행 찾기

 

 L

 화면의 맨 아래로 이동

 

 G

 파일의 마지막 행으로 가기

 

 Ctrl + F

 한 화면 앞으로 이동

 

 21G

 파일의 21번째 행을 가기

 

 Ctrl + D

 반 화면 앞으로 이동

 탐사 및 대체

 

 Ctrl + B

 한 화면 뒤로 이동

 

 /string/

 string 탐색

 

 Ctrl + U

 반 화면 뒤로 이동

 

 ?string?

 string 역방향 탐색

 문자와 행 삽입

 

 n(N)

 string의 다음(이전) 계속 탐색

 

 a

 커서 오른쪽에 문자 삽입

 

 :g/search-string/s//replace-string/gc 

 

 A

 커서 오른쪽, 행의 끝에 문자 삽입

 

 

 각 발생 탐색 후 확인하고 대체

 

 i

 커서 왼쪽에 문자 삽입

 

 :s/srt/rep

 현재 행의 str을 rep로 대체

 

 I

 커서 왼쪽, 행의 처음에 문자 삽입

 

 :1,.s/str/rep/

 1부터 현재 행의 str을 rep로 대체

 

 o

 커서 아래에 행 삽입

 

 :%s/str/rep/g

  파일 전체 str을 rep로 전부 대체

 

 O

 커서 위에 행 삽입

 

 

 

 텍스트 변경

 화면정리

 

 cw  (종료:ESC)

 단어변경

 

 :Ctrl-1

 불필요한 화면정리 후 다시 표시

 

 cc  (종료:ESC)

 행 변경

 파일을 파일로 삽입

 

 C   (종료:ESC)

 커서 오른쪽의 행 변경

 

 :r filename

 커서 다음에 파일 삽입

 

 s   (종료:ESC)

 커서가 위치한 문자열 대체

 

 :34 r filename

 파일을 34번째 행 다음에 삽입

 

 r

 커서 위치의 문자를 다른 문자로 대체

 보관 및 종료

 

 r - Return

 행 분리

 

 :w

 변경사항 보관

 

 J

 현재 행과 아래 행 결합

 

 :w filename

 버퍼를 파일로 보관

 

 xp

 커서 위치 문자와 오른쪽 문자 교환

 

 :wq

 변경사항 보관 후 vi 종료

 

 ~

 문자형(대.소문자)변경

 

 ZZ

 변경사항 보관 후 vi 종료 

 

 u

 이전 명령 취소

 

 :q!

 변경사항 보관하지 않고 종료

 

 U

 행 변경 사항 취소

 

 

 

 

 :u

 이전의 최종 행 취소

 

 

 

 

 .

 이전 최종 명령 반복

 

 

 


JAVA Queue (ArrayList)

import java.util.*;

class SyncQueue {
private List<Integer> buffer = new ArrayList<Integer>(100);
private boolean flag = false;
private int rear = -1, front = -1;
private int count = 0;
public synchronized int deque() {
int v;
if(count == 0) {
try {
this.wait();
}
catch (Exception ex) {}
}
rear++; // Consumer Pointer 
rear %= 100; // Queue size 
v = buffer.get(rear); 
count--; 
this.notify(); // Awake 
return v;
}
public synchronized void enqueu(int v) {

if(count == 100) { // Queue 가 꽉 찼을때 wait
try {
this.wait();
}
catch (Exception ex) {}
}
front++; // Product Pointer
if(front == 100) // Queue 가 1회 꽉찼을때 
flag = true; 
front %= 100; 

if(!flag)
buffer.add(front, v); // Queue 리스트 추가
else // Queue 가 1회 회전 하였을때 
buffer.set(front, v); // Queue 리스트  수정
count++; // Queue  
this.notify();
}
}

2008년 10월 16일 목요일

Logitech sphere cam UVC driver install

$ svn checkout svn://svn.berlios.de/linux-uvc/linux-uvc/trunk


$ cd trunk


$ make ; make install



If you have to reset you cam for any reason, do: 

unplug your cam 

depmod

modprobe -r uvcvideo 

modprobe -r snd_usb_audio 

replug your cam 

(not sure if step 1 and 4 are really necessary, or if 2 and 3 would be sufficient)





Noob question


Hi there. I've downloaded the subversion repository, run make and make install. How do I get Linux to "see" and use this new driver? I'm running Ubuntu 7.10 at present. /dev/video0 does not exist yet. I've been reading through the driver instructions but I don't know how to create /dev/video0 and link it to the driver. Thanks for any help. BTW, lsusb does not at present see the camera, but it is seen in the device manager. Ubuntu 7.10 seems to come with the uvcvideo driver preinstalled:


locate uvcvideo


/lib/modules/2.6.22-10-generic/ubuntu/media/usbvideo/uvcvideo.ko


/lib/modules/2.6.22-11-generic/ubuntu/media/usbvideo/uvcvideo.ko


/lib/modules/2.6.22-11-generic/kernel/ubuntu/media/usbvideo/uvcvideo.ko 



this location is difference [fedora 8]


cp /lib/modules/2.6.23.1-49.fc8/uvcvideo.ko

cp /lib/modules/2.6.23.1-49.fc8/updates/uvcvideo.ko



and .. make again 


$ make ; make install  


$ modprobe -r uvcvideo 



case error : invaild format 


and then


$ depmod

$ modprobe -f uvcvideo 




------------------------------------------------------------------------



http://linux-uvc.berlios.de/


http://openfacts.berlios.de/index-en.phtml?title=Linux+UVC

2008년 10월 12일 일요일

JAVA Thread Interrupt

1. Flag 에 의한 Interrupt

public static void main(String[] args) {
 
ThreadStart threads = new ThreadStart(); // 스레드 생성
Thread thread = new Thread(threads);
thread.start(); // 스레드 시작
 
// TODO ...
 
threads.stop(); // 스레드 종료
 }

class ThreadStart implements Runnable {


private boolean interruption = false; //  Flag

public void run(){


while (!interruption){  // Flag 가 True 때 루프를 빠져 나옴

// TODO ...

}

public void stop(){

 interruption = true; // Flag 를 true 로 셋팅

}

}



2. 직접 thread.interrupt() 호출에 의한 방법

 public static void main(String[] args) {
 
ThreadStart threads = new ThreadStart(); // 스레드 생성
Thread thread = new Thread(threads);
thread.start(); // 스레드 시작
 
// TODO ...
 
  thread.interrupt(); // 스레드 인터럽트호출
 
 }

class ThreadStart implements Runnable {


public void run(){


try{


while (!Thread.currentThread().isInterrupted()){

// isInterrupted() 는 스레드의 인터럽트 간섭을 확인하는 Flag

     

}


}catch (InterruptedException e) {}


}finally {


// TODO ...


}


 

3. Thread.stop,Thread.suspend,Thread.resume 는 권장하지 않는 방식임

영     문  : http://java.sun.com/j2se/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html

한글번역본 : http://pllab.kw.ac.kr/j2seAPI/guide/misc/threadPrimitiveDeprecation.html




4. Thread 상태

사용자 삽입 이미지











2008년 10월 11일 토요일

AWT 기반 Menu

file_select.java

  

more..

  


   MenuItemBox.java

  

more..