블로그 이미지
초딩입맛제주아재
하고 싶은 것만 하며 살고 싶다

calendar

1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
2007. 3. 5. 19:47 Programing/아뜰리에
리눅스 명령어중 du는 디스크 사용량을 알려준다.
그런데 du만으로는 뭔가 부족하다.
50메가 이상 사용중인 디렉토리 목록을 보고 싶은데 help를 봐도 내가 원하는 옵션은 없는것 같다.
혹, 나만 모르고 있는 방법이 있을지도 모르겠다.
리눅스가 워낙 막강하니...

그래서 만들었다.
du를 활용해서 내가 원하는 50메가 이상 사용중인 디렉토리를 볼 수 있는 '커스터마이징 du'!!

#!/usr/local/php/bin/php -q
<?php
/**
* filename : mydu(.php)
* author   : asrada2001@hotmail.com
* date     : 2007-03-05
* desc     : 디스크 사용량(du)체크
*
* 사용법 *
*
* chmod로 실행권한(755)을 주면 프롬프트에서 mydu를 타이핑 하는 것으로 실행이 된다.
*
* ~root]# mydu [opt]
* [opt]: 옵션=값
*
* 옵션
* su : 인자 값으로 받은 사이즈보다 큰 결과만 출력
* sd : 인자 값으로 받은 사이즈보다 작은 결과만 출력
* md : max depth
**/

function get_num($val){
 
$temp = '';
  for(
$i=0,$max=strlen($val); $i<$max; $i++){
     
$txt = substr($val,$i,1);
      if(
is_numeric($txt) == true){
         
$temp .= $txt;
      }else if(
$txt == '.' && $temp != ''){
         
$temp .= $txt;
      }
  }
  return
$temp;
}

function
to_kb($val){
 
$num = get_num($val);
 
$unit = strtoupper(substr($val,-1));
  switch(
$unit){
      case(
'M'):
          return
$num * 1024;
      break;
      case(
'G'):
          return
$num * 1024 * 1024;
      break;
      case(
'K'):
          return
$num;
      break;
  }
}

function
print_help(){
  echo
"\n\t[Options]\n"
     
."\tsu=size : size 보다 큰 결과만 출력합니다.\n"
     
."\tsd=size : size 보다 작은 결과만 출력합니다.\n"
     
."\tmd=depth : 출력할 하위 디렉토리 단계를 설정합니다.\n\n"
     
."\t\t예)mydu sd=10M md=4\n\n";
}

$opt = '';

if(
sizeof($argv) > 1){
  for(
$i=1,$max=sizeof($argv); $i<$max; $i++){
     
$tmp_opt = explode('=',$argv[$i]);
     
$tmp_name = $tmp_opt[0];
     
$tmp_value = $tmp_opt[1];
      switch(
$tmp_name){
          case(
'md'):
             
$opt .= ' --max-depth='.$tmp_value;
          break;
          case(
'su'):
             
$size_up = to_kb($tmp_value);
          break;
          case(
'sd'):
             
$size_down = to_kb($tmp_value);
          break;
          case(
'/?'):
             
print_help();
              exit;
          break;
          default:
              echo
"\n[".$tmp_name."] is invalid option...\n";
             
print_help();
              exit;
          break;
      }
  }
}

$command = 'du -h'.$opt;
exec($command,$result);

foreach(
$result as $data){
 
$data_size = substr($data,0,strpos($data,"\t"));

  if(
$size_up != ''){
      if(
$size_up <= to_kb($data_size)){
          echo
$data."\n";
      }
  }else if(
$size_down != ''){
      if(
$size_down >= to_kb($data_size)){
          echo
$data."\n";
      }
  }else{
      echo
$data."\n";
  }
}
?>




php, 역시 속도가 문제다.
C를 잘한다면 du소스를 직접 수정해서 컴파일하겠건만...-_-;;
늘 그렇듯 리팩토링의 여지는 남겨둔다...(귀차니sm)

'Programing > 아뜰리에' 카테고리의 다른 글

Drag가 가능한 메모보드  (26) 2007.01.26
파일 확장자 바꾸는 스크립트  (1) 2006.12.12
XmlHttpRequest를 사용한 일정관리  (0) 2006.11.10
자동 로그 뷰어  (0) 2006.08.21
posted by 초딩입맛제주아재
2007. 2. 24. 21:31 Programing/Java
일시 : 2007.2.24
장소 : 코엑스 그랜드볼룸
시간 내용
10:00
~
11:00
접수 및 입장
11:00
~
11:20
개회사 (옥상훈 JCO 회장) & VIP 동영상
11:20
~
12:20
기조연설 #1 (Matt Thompson / Sun Microsystems)
기조연설 #2 (Dr. Akmal B. Chaudhri / IBM)
12:20
~
12:40
2006 대한민국 소프트웨어 공모대전 (제6회 JCO 자바 소프트웨어 공모전) 시상식
12:40
~
13:00
쉬는 시간 및 트랙 준비, 이동 시간
웹2.0 자바의 향기 개발생산성향상 엔터프라이즈컴퓨팅 소통과 집중
13:00
~
14:00
개발자와
크리에이티브
커먼즈라이선스
(윤종수 판사님)
Java U-City
Middleware Platform
(강신동님)
실용적 프로젝트
관리 방법
(김평철님)
Java EE 5.0 and
Glassfish
(김원석님)
토론 트랙
14:00
~
14:10
쉬는 시간 및 트랙 준비, 이동 시간
14:10
~
15:10
Daum의 자바 개발 로드맵과
개방형 플랫폼 전략
(윤석찬, 박상길 / 다음커뮤니케이션)
Ajax Frameworks for Java Platform
(신상철 박사님 / Sun)
대형시스템의
안정성에 기반한
기업용 자바
애플리케이션 개발
(Christian Strauer / IBM)
TmaxSoft가
바라보는
엔터프라이즈
컴퓨팅의 미래
(최종일 / TmaxSoft)
 
15:10
~
15:20
쉬는 시간 및 트랙 준비, 이동 시간
15:20
~
16:20
Practical Web Tools 활용
(허광남님)
Open Source 와
우리의 과제
(김승권님, 김범준님)
POJO 프로그래밍
(최범균님)
What is SOA?
How to SOA?
(조대협님)
토론트랙
16:30
~
16:40
쉬는 시간 및 트랙 준비, 이동 시간
16:40
~
17:40
What is Web 2.0
(박지강님)
Apache MINA를
이용한 고성능
자바 네트워크
어플리케이션 개발
(이희승님)
Spring 2.0
(이일민님, 안영회님)
SCA 프랙티스
(임철홍님)
토론세션
17:40
~
17:55
쉬는 시간 및 폐회 준비 시간
17:55
~
18:30
경품 추첨 및 이벤트, 폐회사
* 자바인의 밤

자바컨퍼런스에 다녀왔다.
입장시간을 10분가량 넘겨서 도착을 해서 걱정을 했는데 다행히 입장을 금지하지는 않았다.
처음 가보는 행사라 사뭇 긴장을 했는데 괜한 기우였다.
선물도 한 가득 받고(이것이 목적은 아니었다 -_-;;) 기대에는 못미쳤으나 나름 유익한 정보들을 얻을 수 있었다.
동일한 시간에 총 5개의 트랙(회의실)에서 각기 다른 주제로 강연이 이루어졌는데
내가 분신술이 가능한것도 아니고 가장 관심있는 분야인 WEB 2.0에 대한 강연만 줄곧 들었는데
내용이 기대에 못미쳐 아쉬웠다.
POJO프로그래밍과 Spring 2.0을 들을걸...-_-;;
카메라를 가져가지 않았던것도 한이.....


p.s

달룟님과 시즈하님을 만났다..

선물목록
1.구글로고가 새겨진 스텐레스 머그잔
2.구글로고가 새겨진 흰색 면티
3.SUN 로고가 새겨진 USB hub
4.Borland로고가 새겨진 자석 클립
5.IBM로고가 새겨진 스프링 메모장
6.볼펜 2자루

'Programing > Java' 카테고리의 다른 글

2007 JavaOne Warp-Up 세미나 후기  (0) 2007.09.08
JavaOne2007 Wrap-up 세미나  (0) 2007.09.03
윈도우 Java환경 설정  (0) 2006.12.23
에디트플러스 자바 컴파일/실행 설정  (0) 2006.10.16
SWT 연습 - FileTreeContentProvider  (0) 2006.10.13
posted by 초딩입맛제주아재
2007. 2. 24. 00:41 Programing/Ruby

Ruby를 Rails위에 올려 웹 어플리케이션 구축 환경을 만들어보자.
몇가지 간단한 작업을 거치면 PC에 Ruby on Rails 환경이 만들어진다.


1.Ruby 설치
http://www.ruby-lang.org/ko/downloads/ 에서 Ruby를 다운로드 한다.
여기서는 윈도우용 Ruby를 기준으로 진행한다.
원 클릭 인스톨러를 다운로드 하면 된다.
다운로드 받은 파일을 실행하고 기본 설정으로 설치를 한다.


2.Rails 잼 설치
실행 -> CMD -> gem install rails --include-dependencies
--include-dependencies 옵션은 rails설치에 필요한 파일들을 자동으로 설치해준다.


3.Rails Framework 설치
gem 설치가 끝나면 Rails Framework을 설치한다.
원하는 폴더로 이동한 후
rails (생성할폴더명)실행


4.웹서버 구동
rails framework를 설치한 폴더로 이동후
ruby script/server 를 실행하면 웹서버가 시작된다.


웹서버의 기본 접속 포트는 3000번이다.

브라우져를 열고 주소창에 http://localhost:3000을 입력 하면 초기화면을 볼 수 있다.

사용자 삽입 이미지

posted by 초딩입맛제주아재
2007. 2. 22. 16:53 Programing
출처: http://blog.naver.com/tb/hunhak/4274412




--------------------------------------------------------------------------  
  포인터에 관한 주저리 ....
--------------------------------------------------------------------------


1. 도대체 포인터를 왜 쓰는데..??? 힘들게 시리...


보통 C / c++ 에서는 포인터라는 개념을 많이 쓰고 있다.

그렇담 포인터란 뭘까?

나는  말하길 특정 주소에 들어 있는 데이타 값이라고 생각한다.

사용법은 이렇다.

먼저, 포인터 변수를 선언하고.

int *p ;

특정 주소를 대입한다.

p = &a;

이렇게 하면 *p 는 a 와 같다.

편의상 int *p = &a;  이렇게 표현하기도 한다.

그럼 왜! 포인터를 사용할까?  난 항상 세상 모든 현상에 대해서 왜!!! 라는 질문을

하곤 한다.

참고로 내 대학 평점은 c+ 이다.

'이 자식 공부 드럽게 안했구나.' 라고 생각하는 사람도 분명 있을 것이다.

하지만, 나는 대학시절 내가 "왜!!!" 공부를 해야 되는지 몰랐다. 그래서 안했다.

암튼 헛소리 그만하고 왜!! 포인터를 사용해야 되는지 알아보자..

#include<stdio.h>

void swap(int, int);

int main()
{
       int a = 10, b = 20;

       swap(a , b);

       printf("\n a , b = %d, %d \n", a , b );
}

void swap(int a, int b)
{
       int t;

       t = a;
       a = b;
       b = t;
}

다음을 컴파일하고 실행시켜 보니까, a 와 b 값이 서로 바뀌지 않고 a = 10, b = 20

이 출력되었다. 그이유는 main 함수에서 선언된 a ,b 값과 swap 함수에서 선언된 a, b 의 값은

데이타는 같지만 서로 다른 메모리 영역을 차지하고 있기 때문에 한마디로 엉뚱한 값을 변경한

결과가 되는 것이다.

물론 글로벌 변수를 사용하면 되겠지만, 글로벌 변수를 남용하면 프로그램상의 심각한 버그를 만들어

낼수도 있다.

그러므로 swap 함수의 인자값으로 해당 변수의 값이 아닌 주소를 넘겨 보면, 같은 주소에 있는 값을

변경 할수가 있을 것이다.

#include<stdio.h>

void swap(int *, int *);

int main()
{
       int a = 10, b = 20;

       swap(&a , &b);

       printf("\n a , b = %d, %d \n", a , b );
}

void swap(int *a, int *b)
{
       int t;

       t = *a;
       *a = *b;
       *b = t;
}

위의 소스를 컴파일 해보면 만족할 만한 결과를 얻을 수 있을 것이다.


2. 그럼 함수 포인터는 뭐냐 ???


함수 포인터란, 일반 포인터 변수와 마찬가지로 포인터 변수가 함수의 주소 부분을 가르키는 것을 말하고

함수를 다른 함수의 매개 변수로 사용할때 이용된다.

여기까진 설명이 됐지만 그렇담, 왜 !!!!!!!! 함수 포인터를 사용해야 되는 가에 대해서는 언급되어 있지

않다. 

음 ~ .... 함수가  변수처럼 다름 함수의 인자로 사용된다면, 변수는 말그대로 변하는 수이므로 함수도

변수처럼 변하는 함수를 매개변수로 사용하는 경우에 이용하면 되겠군....

예제를 준비했다.

bubble 정렬 함수가 있다고 하자, 이 함수는 문자열도 정렬해주고 숫자도 정렬해준다고 치자.

그럼 문자를 정렬해주는 함수 bubble_char(), 숫자를 정렬해 주는 함수 bubble_num() 두개를 만들어야

되는군... 약간 귀찮군. 그럼 만약에 정수 정렬 함수, 실수 정렬 함수 등 더 많은 함수들이 필요하다면,

bubble_int();
bubble_float();
...
..
.

이런식의 함수가 많이 필요할 것이다.

여기서 함수 포인터를 사용해 보도록 하자. bubble 함수 하나만 만들고, 각각의 문자열의 크기 비교

숫자 크기 비교 하는 함수를 만들어서 0 또는 1 만 반환하게 한다음 정렬은 bubble 함수에게 시키자.

그럼 훨씬 소스가 간결해 질것이다. 

아래 소스는 발췌한 것임을 알림....


#include <stdio.h>
#include <string.h>

#define MAX_BUF 256

long arr[10] = { 3,6,1,2,3,8,4,1,7,2};
char arr2[5][20] = {  "Mickey Mouse",
                     "Donald Duck",
                     "Minnie Mouse",
                     "Goofy",
                     "Ted Jensen" };

void bubble(void *p, int width, int N,
           int(*fptr)(const void *, const void *));
int compare_string(const void *m, const void *n);
int compare_long(const void *m, const void *n);

int main(void)
{
   int i;
   puts("\nBefore Sorting:\n");

   for (i = 0; i < 10; i++)               /* show the long ints */
   {
       printf("%ld ",arr[i]);
   }
   puts("\n");

   for (i = 0; i < 5; i++)                  /* show the strings */
   {
       printf("%s\n", arr2[i]);
   }
   bubble(arr, 4, 10, compare_long);          /* sort the longs */
   bubble(arr2, 20, 5, compare_string);     /* sort the strings */
   puts("\n\nAfter Sorting:\n");

   for (i = 0; i < 10; i++)             /* show the sorted longs */
   {
       printf("%d ",arr[i]);
   }
   puts("\n");

   for (i = 0; i < 5; i++)            /* show the sorted strings */
   {
       printf("%s\n", arr2[i]);
   }
   return 0;
}

void bubble(void *p, int width, int N,
           int(*fptr)(const void *, const void *))
{
   int i, j, k;
   unsigned char buf[MAX_BUF];
   unsigned char *bp = p;

   for (i = N-1; i >= 0; i--)
   {
       for (j = 1; j <= i; j++)
       {
           k = fptr((void *)(bp + width*(j-1)), (void *)(bp +
j*width));
           if (k > 0)
           {
               memcpy(buf, bp + width*(j-1), width);
               memcpy(bp + width*(j-1), bp + j*width , width);
               memcpy(bp + j*width, buf, width);
           }
       }
   }
}

int compare_string(const void *m, const void *n)
{
   char *m1 = (char *)m;
   char *n1 = (char *)n;
   return (strcmp(m1,n1));
}

int compare_long(const void *m, const void *n)
{
   long *m1, *n1;
   m1 = (long *)m;
   n1 = (long *)n;
   return (*m1 > *n1);
}



3. 그럼 이차원 포인터는 뭐냐 ???


아래와 같은 배열이 있다고 치자...

1, 2, 3, 4
5, 6, 7, 8

a[0][0] = 1;
a[0][1] = 2;
a[0][2] = 3;
a[0][3] = 4;
a[1][0] = 5;
a[1][1] = 6;
a[1][2] = 7;
a[1][3] = 8;

이것을 하나의 배열로 저장하면 위와 같은 이차원 배열이 된다.

그럼 포인터로 위 배열 요소들을 접근해 보자.

a 의 주소는 &a 이고 니깐. *a 라고 하면 뭐가 나올까?

그럼 a 의 주소값인 a[0] 의 값으로써 이상한 메모리 번지가 나올 것이다.

1 항목을 가져 올려면 어떻게 해야 되지?

1 은 a[0][0] 값이다. 이것은 주소 a[0] 에 있는 값이된다.

*a[0] 는 주소 a[0] 에 있는 값이므로 1 이되고, **a 라고 표시할 수도 있다.

그리고 만약 5 에 접근하기 위해서는 *(a+1)[0] , **(a+1) 이라고 쓰면 된다.

posted by 초딩입맛제주아재
2007. 2. 15. 15:36 Programing/HTML/JavaScript/CSS
<STYLE type=text/css>
#mydiv {
   position:absolute;
   top: 50%;
   left: 50%;
   width: 200px;
   height: 100px;
   margin-top: -50px; /*set to a negative number 1/2 of your height*/
   margin-left: -100px; /*set to a negative number 1/2 of your width*/
   border: 1px solid #ccc;
   background-color: #f3f3f3;
}

</STYLE>

<DIV id=mydiv>
       **************
</DIV>

'Programing > HTML/JavaScript/CSS' 카테고리의 다른 글

Array.remove()  (3) 2007.03.28
AJAX 실전 #1 - XMLHttpRequest  (0) 2007.03.14
[HTML] LABEL과 사용자 중심의 프로그래밍-UI  (3) 2007.01.05
[HTML] FIELDSET과 LEGEND  (0) 2007.01.05
[CSS] onMouseOver,onMouseOut은 그만!!  (17) 2007.01.03
posted by 초딩입맛제주아재
2007. 2. 7. 23:23 Programing

달룟님께 선물할 Smalltalk 이미지 백업 배치파일


@echo off

SETLOCAL

SET ST_IMG_HOME=F:\작업자료\프로그램\smalltalk\가계부
SET ST_BACKUP_DIR=F:\작업자료\프로그램\smalltalk

SET BACK_NAME=
  FOR /F "tokens=1,2,3 delims=-" %%i IN ("%DATE%") DO SET BACK_NAME=%%i_%%j_%%k
  FOR /F "tokens=1,2,3 delims=: "  %%i in ('time /t') DO SET BACK_NAME=%BACK_NAME%_%%i_%%j_%%k.zip

alzip -a "F:\작업자료\프로그램\smalltalk\가계부\Community Edition.img","F:\작업자료\프로그램\smalltalk\가계부\Community Edition.sml","F:\작업자료\프로그램\smalltalk\가계부\Community Edition.chg" "F:\작업자료\프로그램\smalltalk\%ST_BACKUP_DIR%.zip"

ENDLOCAL



나도 알집을 쓰고 달룟님도 알집을 쓰신다고 해서 알집을 사용했는데 초반에 고생을 좀 했다.

퇴근 후 집에 와서 코딩을 했는데 집에 설치된 알집은 5.6버전이었다.
알집의 도움말을 통해서 커맨드라인 옵션을 보고 당연히 되겠구나 해서 코드를 짰는데 에러가 발생하였다...
아니 정확히 말하면 에러는 아니다. 화면에 아무 에러도 뱉어 내지 않았으니까.
단지 아무일도 일어 나지 않았다.
알집이 잠깐 떴다 바로 사라졌지만 디렉토리에 새로 생긴 압축파일이 안보이는 것이다.
몇번 더 테스트를 해보다 알집 최신 버전을 설치 하고 다시 테스트를 했더니 제대로 된다 -_-;;
오후에 서핑중에 보았던 알집에 대한 비판글이 조금은 이해가 됐다;;


이번 스크립트로 변수를 좀더 자유롭게 다룰수 있게 되었다.
정말정말 날 힘들게 했던 부분은 공백을 걸고 넘어지는 문제였다.

SET ST_IMG_HOME = FOR ~~~~
echo %ST_IMG_HOME%

이 코드가 에러를 뱉어 내는 이유를 한참 후에 알게 되었다.
'=' 양 옆의 공백이 문제였던 것이다....Orz=3
지금껏 내가 만져본 언어들 중에서 이 문제로 까다롭게 굴었던건 없었다....
이 녀석이 처음이다.... 역시 처음은 강렬하게 다가온다.....쩝...


SETLOCAL과 ENDLOCAL은 한쌍으로
SET으로 선언된 환경 변수를 지역변수로 제한하는 기능을 한다.
만약 SETLOCAL이 없으면 스크립트 실행 후 커맨드라인에서 SET 명령으로 현재 설정된 환경 변수를 보면
스크립트에서 지정한 환경변수가 그래도 살아있음을 확인 할 수 있다. 하지만 그 역시 콘솔을 닫아버리면 사라진다.



추가정보:

프롬프트에서 c:\>help 를 실행하면 사용할 수 있는 명령어들이 나오는데
c:\>cmd /? 를 실행하면 또다른 신선한 내용들이 나온다.

'Programing' 카테고리의 다른 글

스크립트언어의 재발견  (0) 2007.03.09
[펌]포인터  (0) 2007.02.22
윈도우 스크립팅 걸음마  (3) 2007.02.07
euc인코딩  (0) 2007.01.09
위기지학(爲己之學)  (0) 2006.11.29
posted by 초딩입맛제주아재
2007. 2. 7. 16:45 Programing

퇴근하기전 매일매일 엑셀을 이용해서 업무일지를 쓴다.
정말 하기 싫은 작업이다...
엑셀을 실행하고 어제 작성한 업무일지를 불러와서 어제 뭘했나 대충 살펴보고
날짜를 오늘 날짜로 수정한뒤 내용을 싸그리 지우고 오늘 작업한걸 써 나간다.
다 쓰고 새이름으로 저장하기 버튼을 클릭해서 업무일지070207.xls 처럼 날짜로 네이밍을 해서 저장한다.
그런데 가끔 정신이 나갈때면 editplus 에서 하던 버릇이 나와서 Ctrl + S 를 눌러서 어제 작성한 업무일지에
덮어써버리곤 한다.

오늘도 역시 그랬다. -_-;;
어제의 기억은 흔적조차 남지 않게 되었고 인쇄한 업무일지를 잃어버리게 되면
어제 나는 한일이 없게 되는 것이다.

언제까지 이렇게 방치해둘 순 없었다.
그래도 명색이 프로그래머 아닌가.
뭔가 이 비 생산적인 굴레를 벗어날 길이 없을까 고민하다 도스시절을 회상하며 배치파일을 만들기로 했다.

전에 달룟님과 대화중 smalltalk 이미지 백업하는걸 배치파일로 만들어보고자 했던 기억도 있고
뭔가 새로운걸 해보고 싶던 찰나에 이번 프로젝트(?)는 운명적인 것이리라.

kldp에서 스크립팅에 관련한 자료를 찾았다. >>kldp스크립팅자료

bash쉘에 관련된 내용이지만 도스 배치파일에 대한 이야기도 살짝 나온다.
덕분에 bash쉘 스크립팅을 공부해야할 이유가 생겼다.

배치파일 소스는 아래와 같다.


@echo off

IF NOT EXIST %DAILY_REPORT_HOME%업무일지%DATE:~2,2%%DATE:~5,2%%DATE:~8,2%.xls (
  FOR /F %%i IN ('DIR %DAILY_REPORT_HOME% /B /AA /O-D') DO (
       copy %DAILY_REPORT_HOME%%%i %DAILY_REPORT_HOME%\업무일지%DATE:~2,2%%DATE:~5,2%%DATE:~8,2%.xls > NUL
       goto end
  )
)

:end

문법이 참 적응하기 어려웠지만 12살때 배웠던 GW-BASIC도 생각이 나고
하면서 '참 재밌다!!' 라는 생각을 했다.


소스 풀이를 하자면.....

환경변수로 등록된 업무일지 디렉토리(%DAILY_REPORT_HOME%)안에

오늘 날짜로 된 파일(업무일지%DATE:~2,2%%DATE:~5,2%%DATE:~8,2%.xls)이 없으면

가장 최근의 업무일지('DIR %DAILY_REPORT_HOME% /B /AA /O-D' 의 결과중 맨 처음것)를

오늘 날짜로 복사(copy %DAILY_REPORT_HOME%%%i %DAILY_REPORT_HOME%\업무일지%DATE:~2,2%%DATE:~5,2%%DATE:~8,2%.xls > NUL)

한다......휴~


가장 어려웠던 부분은 최근 파일명 추출이었다.
변수 운용하는 방법을 모르고 (환경변수가 아닌 지역변수 개념의.. 가능한지 모르겠다)
dir 의 결과중 첫라인 또는 마지막라인 만 리턴하는 방법(이건 꼭 알고 싶은데...있을것 같기도 하고..)


그래서 생각한 것이 FOR, 반복문이다.
DIR {디렉토리} /B /AA /O-D 는 {디렉토리}에 있는 순수한 파일(/AA)만을 출력해준다.
물론 쓸데없는 header 와 footer 도 없다(/B). 오로지 파일명만 역순(/O-D)으로 출력해준다.
이 결과물을 가지고 FOR문을 돌리는데
제일 처음 값만 출력하고 바로 :end(goto end)로 가버리고 반복문은 중지된다.

이 배치파일은 내가 출근한후 PC를 켜고 윈도우가 로딩되면 실행되도록

모든 프로그램 > 보조프로그램 > 시스템도구 > 예약된 작업  으로 등록을 해두었다.

내일 아침 출근후 확인해 보는일만 남았다...

THE END...



컴퓨터는 사람을 편하게 하기 위해 만들어진 기계이다.
하지만 요즘은 컴퓨터로 인해 스트레스 받는 사람들이 더 많고
컴퓨터때문에 해야 할 일들이 더 많아지고 있다.

사소한것 하나라도 편하게 바꿔보자!!
그것이 개발자들이 해야할일이 아니겠는가??


'Programing' 카테고리의 다른 글

[펌]포인터  (0) 2007.02.22
윈도우 스크립팅 맛들이기 - Smalltalk 이미지 파일 백업 배치파일  (2) 2007.02.07
euc인코딩  (0) 2007.01.09
위기지학(爲己之學)  (0) 2006.11.29
Drag & Drop로 구현한 쇼핑몰 샘플  (0) 2006.11.09
posted by 초딩입맛제주아재
2007. 1. 26. 21:09 Programing/아뜰리에

사용자 삽입 이미지

메모보드 열기



Drag & Drop 중 Drop을 뺀
메모보드입니다.



소스파일 다운로드

- 소스파일 받아 가시는것에 제한은 없습니다. 흔적만 남겨주세요 ^^;



:log:
======================================================
2007-02-01
 로그인 기능 완성(관리자에 한함)
  ->관리자 로그인만 허용하며, 관리자 로그인이 이루어지면 관리자가 작성한 메모 로드.
  ->로그아웃하면 관리자가 작성한 메모만 화면에서 제거

2007-01-31
  로그인 버튼과 로그인창 추가
  ->개인별 메모 관리 기능을 추가 하기 위함

2007-01-26
  메모 삭제 DB연동
  LOCK 버튼 클릭시 메모 좌표 DB저장

2007-01-22
DB연동
  -> 메모지 정보(좌표,내용 ) Save/Load

2007-01-20
  메모 내용 수정 완료 버튼 추가
  -> 수정후 완료 버튼 누르면 textarea 는 사라지고 내용을 파싱해서 HTML 태그로 만들어 메모지에 붙임.

2007-01-19
  메모 이동시 다른 메모에 의해 방해 받는 문제 수정
  -> 이동중인 메모의 zIndex를 최대치로 설정하고 이동이 끝나면 원래 zIndex로 설정.

2007-01-17
  HTML,JavaScript 코딩 시작.
  메모 Drag
  메모 기본위치 설정/원위치
  메모 생성
  메모 삭제
  메모 수정 모드(저장안됨)

2007-01-16
  기본 구성 설계

posted by 초딩입맛제주아재
2007. 1. 12. 14:18 Programing/JSP/ASP
출처 : http://cafe.naver.com/bonohemi/35




톰캣과 웹서버(아파치, IIS 등)의 연동 이해하기
웹서버에 tomcat 을 붙일 경우 요청주소의 포트는 동일합니다. 즉 아파치의 포트를 통해서 모든 주소 요청을 받고 아파치에 설치된 연동모듈(mod_jk) 이 jkMount 에 설정된 주소 패턴에 따라 *.jsp , /servlet/* 일 경우 tomcat 으로 요청을 넘겨줍니다.
흔히 잘못 인식하는 것은 apache 는 80 으로 tomcat 은 8080 으로 주소를 달리해서 처리되는 것을 보고 연동된줄 아는데, 이건 각각 따로 노는 것입니다.
또한 아파치에서 jsp의 소스가 보인다함은 연동모듈이 놀면서 직무유기하고 있다는 뜻이거나 제대로 설정이 되있지 않는 것 같군요.
아파치와 톰캣 연동시 패턴에 함정이 있을 수 있습니다.

# Root context
JkMount  / ajp13
JkMount  /* ajp13

와 같이 연동할 경우 아파치에 들어온 주소(URI)중에 / 로 시작되는 모든 자원들이 톰캣으로 보내집니다. 톰캣은 jsp와 서블릿만 처리하는 것이 아니라 html, gif, jpg, css, js 등의 정적인 컨텐츠도 동시에 처리하게 됩니다. 아파치는 계속 모든 요청을 톰캣으로 떠 넘기는 것입니다. 이것은 아파치의 access_log 와 톰캣의 access_log 를 보면 확연히 알 수 있습니다. 연동을 아니함만 못한 경우입니다.

제대로 써 준다면

# Root context
JkMount  /*.jsp ajp13
JkMount  /servlet/* ajp13

과 같이 해주어야 합니다.
서블릿 매핑이 필요한 경우 (스트럿의 경우 .do 라는 패턴을 사용)에는 그 패턴을 추가해주면 됩니다.

JkMount /*.do ajp13

이렇게 되면 톰캣의 access_log 에는 jsp 파일들과 서블릿요청에 대한 로그만 보일 것이고, 제대로 연동이 된 것입니다.

그리고 다음 문제는 저도 여러가지로 생각중인데, 컨텍스트와 연동의 문제입니다.
컨텍스트는 마치 / 의 서브디렉토리처럼 보입니다. 아파치에서는 컨텍스트라는 것을 그냥 하나의 서브디렉토리로 인식합니다. 하지만 톰캣에서는 의미가 다릅니다. 디렉토리도 바뀔수 있고, 세션도 / 컨텍스트와는 다르게 관리됩니다.
이럴 경우 생기는 문제는 정적인 컨텐츠의 위치입니다.
톰캣에서 컨텍스트는 ROOT 와 상관없이 원하는 아무곳에 놓아둘 수 있습니다. 즉 ROOT 의 위치와 완전히 다른 곳에 위치되고, 정적인 컨텐츠도 같은 web application 디렉토리 하부에 위치할 것입니다.
아파치와 톰캣의 루트디렉토리가 일치된 상태에서 다른 컨텍스트의 정적인 자원요청시 아파치는 루트의 서브디렉토리에서 찾을 것이고, jsp 는 다른 컨텍스트의 정해진 위치에서 찾을 것입니다.
여기에서 딜레마에 빠지게 됩니다. 연동을 하지 않고 톰캣만 처리할 경우는 문제가 없지만 아파치랑 연동했을 경우는 전혀 엉뚱한 곳을 가르키기 때문입니다.
그렇다고 위처럼

# Root context
JkMount  /examples/ ajp13
JkMount  /examples/* ajp13

패턴을 사용하면 아까도 말했듯이 연동을 안한 것보다 못한 상황에 이르게 됩니다.
톰캣3에서 톰캣4로 넘어오면서 HTTP 요청을 처리하는 모듈의 성능이 많이 향상되었습니다. 잘 모르시는 분들은 Apache Tomcat 4.0 started 라는 메시지를 보고 아파치와 톰캣이 통합된 줄로 아는 경우도 있습니다만 그 말이 진짜다 싶을 정도로 톰캣의 성능이 카탈리나 엔진에서 많이 좋아졌습니다. 매뉴얼에 보면 아파치와 톰캣을 연동하는 것은 두가지 경우로 돌려본 다음에 빠른 쪽으로 결정하라고 나올 정도입니다. 모두 jsp 로 된 페이지라면 필터를 거치지 않고 바로 오는 쪽이 더 나으니까요.
개발시에는 아파치를 붙이지 않는 편이 훨씬 편합니다. 더군다나 cgi 와 ssi 같은 아파치 고유기능을 톰캣에 추가시키면서 이렇게 얘기합니다.

"톰캣을 HTTP 서버로 사용하고 SSI 지원을 요청할 때 톰캣의 SSI 지원을 추가로 사용할 수 있습니다. 전형적으로 아파치 같은 웹서버를 연동해서 사용하지 않는 개발기간 동안 쓰게 됩니다." (http://jakarta.apache-korea.org/tomcat/tomcat-4.1-doc/ssi-howto.html)

결국 개발기간동안은 아파치 붙여서 번거롭게 개발할 생각말라는 뜻입니다. 서비스시에 아파치랑 연동할 지는 각자의 상황에 따라 다르겠지요.

연동에 관한 좋은 책(professional Apache Tomcat, wrox)이 나왔습니다. 물론 600 페이지 중에 100페이지 정도의 분량이 할애되었을 정도로 중요한 것 같지만 연동을 마쳤다함은 톰캣을 조금 알았다 뿐이고, jsp 를 아는 데에는 하등 도움이 될 것이 없습니다.

'Programing > JSP/ASP' 카테고리의 다른 글

웹 프린터  (0) 2007.05.23
ASP: 동적 include  (1) 2007.05.22
ASP의 가변변수  (1) 2007.04.19
[ASP]php의 exit와 같은 기능을 하는 Response.end  (0) 2007.01.03
posted by 초딩입맛제주아재
2007. 1. 9. 13:18 Programing

출처: http://openlook.org/trac/wiki/EUC

EUC (Extended Unix Coding) 인코딩은 중국과 한국에서 가장 널리 쓰이는 인코딩 형태로, 단순미와 강력함이 장점입니다. ;) (일본과 대만에서도 유닉스 유저들은 널리 쓰고 있습니다.)

EUC 인코딩 8비트 영역을 모두 사용하며, 8비트를 크게 4개로 나눕니다.

  • CL(Control-Left): 0x00-0x1f
  • GL(Graphic-Left): 0x20-0x7f
  • CR(Control-Right): 0x80-0x9f
  • GR(Graphic-Right): 0xA0-0xff

그림으로 하면

8 bit 범위
CL GL CR GR
0x00 ~ 0x1f 0x20 ~ 0x7f 0x80 ~ 0x9f 0xa0 ~ 0xff

GR은 보통 2바이트 시퀀스로 붙여서 94x94 문자셋을 할당하는 데, EUC-CN과 EUC-KR의 경우에는 그냥 단순히 GL에는 ASCII를 할당하고, GR에는 각각 GB2312와 KS X 1001을 할당하는 것으로 끝납니다. 결국, KS X 1001의 30-21에 배치되어 있는 '가'라는 글자는 EUC-KR 인코딩에서 GR에 배치되면서 MSB가 세팅되어 0xB0A1로 최종적으로 표현됩니다.

그런데, GL, GR을 고정적으로 할당한 CN, KR과는 달리 EUC-TW나 EUC-JP에서는 사용할 수 있는 문자셋이 여러 평면으로 나뉘어져 있기 때문에, 단순히 미리 할당된 것만으로는 사용될 수 없어서, 0x8e와 0x8f의 SS(Single-Shift) 코드들을 사용합니다. EUC-JP의 경우에는 다음과 같이 배치가 되어 있습니다.

문자셋 코드 설명
ASCII [0x20-0x7f] 아스키는 항상 GL에 배치됩니다.
JIS X 0201 0x8e [0xa1-0xdf] JIS X 0201중 반각 카타카나 부분은 앞에 0x8e를 쓴 다음에 씁니다.
JIS X 0208 [0xa1-0xfe] [0xa1-0xfe] JIS X 0208 문자들은 각각 MSB를 세팅해서 그냥 씁니다.
JIS X 0212 0x8f [0xa1-0xfe] [0xa1-0xfe] JIS X 02012 문자들은 0x8f를 앞에 쓴 다음에 MSB를 세팅해서 씁니다.

이렇게 되어서, 결국 EUC-JP는 1/2/3 바이트 가변폭 인코딩이 되고, 화면 출력과 코드 너비가 다른 인코딩이 됩니다. (불편하지만 별 수 없는~)

EUC-TW는 현재 할당된 평면이 17개 (유효평면 10개)나 되기때문에, 더욱 더 복잡한데,

문자셋 코드 설명
ASCII [0x20-0x7f] 아스키는 항상 GL에
CNS11643-1 [0xa1-0xfe] [0xa1-0xfe] Plane 1을 기본 GR에 배치합니다.
CNS11643-1~16 0x8e [0xa1-0xb0] [0xa1-0xfe] [0xa1-0xfe] Plane 1 <!> 부터 16까지는 0x8e를 앞에 붙이고, 그 다음에는 1번부터 순서대로 0xa1부터 16번은 0xb0까지 쓴 다음에 진짜 두 글자를 MSB 세팅해서 붙입니다.

이렇게 되어서, 결국 1/2/4 바이트 가변폭 인코딩이 됩니다. 그런데, Plane 1은 2바이트짜리와 4바이트짜리에 둘 다 할당이 되어있는데, 둘 중 어느 한가지만 옳은 것은 아니고, 표준에서 둘 다 사용할 수 있도록 되어있습니다. (둘은 서로 동등 연속--equivalent sequence--로 처리해야합니다.)

posted by 초딩입맛제주아재
prev 1 2 3 4 5 6 7 8 ··· 11 next