휘샤's Blog
천천히 서둘러라

if-else vs instance

Tip 2009/12/01 11:43 by 휘샤


이클립스 내부 소스를 보니 이런 부분이 있다.

        switch (strategies.size()) {
        // optimization
        case 0:
            break;

        case 1:
            ((IAutoEditStrategy) strategies.iterator().next()).customizeDocumentCommand(document, command);
            break;

        // make iterator robust against adding/removing strategies from within strategies
        default:
            strategies= new ArrayList(strategies);
            for (final Iterator iterator= strategies.iterator(); iterator.hasNext(); )
                ((IAutoEditStrategy) iterator.next()).customizeDocumentCommand(document, command);

            break;
        }
ArrayList 의 instance 를 피하기 위해 switch-case (if-else 2번)을 사용했다. Instance 의 cost 가 크다는건 알고 있었지만 빈번히 발생하는 경우에 대해서 저렇게 처리하는걸 눈으로 직접 보내 확 와닿는다.
Creative Commons License
Creative Commons License

customized invoke

Tip 2008/01/23 13:40 by 휘샤

입맛에 맞게 조금 변형

 1  import java.lang.reflect.Method;
2
3 public class InvokeTest {
4 public InvokeTest(String className, String methodName, String thisObj, String [] arguments ) {
5 try {
6 // set arguments of method
7 Class [] parameterTypes = new Class[arguments.length];
8 for( int i=0; i<arguments.length ; i++ ){
9 parameterTypes[i] = arguments[i].getClass();
10 }
11
12 Class cls = Class.forName( className );
13 Method meth = cls.getMethod( methodName, parameterTypes);
14 System.out.println( (String)meth.invoke( thisObj, arguments) );
15
16 } catch (Exception e) {
17 e.printStackTrace();
18 }
19 }
20 }

1 public class InvokeTestMain {
2 public static void main(String[] args) {
3 InvokeTest it = new InvokeTest("java.lang.String", "concat", "abc", new String[] {"abc"} );
4 }
5
6 }

기능 몇개(loader 등)를 빼니까 심플하게 되었다.
Creative Commons License
Creative Commons License

Apache-Tomcat(5.x)에서 VirtualHost

Tip 2007/12/28 16:26 by 휘샤

일단 정리를 좀 하고 시작하자면,
설치된 프로그램의 버젼은 Apache2.2.4, Tomcat 5.5.25, JK2.2.4입니다.
JK는 Apache와 Tomcat을 연동시켜주는 Connector입니다.
아파치와 톰켓은 설치가 되어있고, JK를 통해 연동이 설정되어있는 상태에서 시작합니다.



일단은 테스트를 위해, 혹은 서버 내에서 Virtual Hosting을 위해 Hosts 설정을 바꾸고 시작했습니다.
윈도우라면 %WINDOWS%\SYSYEM32\driver\hosts라는 파일이,
*nix라면 /etc/hosts라는 파일이 있을 것입니다.
그 곳에 127.0.0.1   virtual.domain.com을 추가합니다.


일단 Apache에서 특정 도메인을 통해 들어오는 패킷을 Redirect시켜줍니다.
설정은 역시나 httpd.conf


<VirtualHost virtual.domain.com>

ServerAdmin      master@domain.com         # 관리자 email
DocumentRoot   /home/domain/virtual        # Redirect시켜줄 곳
ServerName      virtual.domain.com             # 서버 이름

JkMount        /*.jsp          ajp13                # ajp13을 통해 jsp파일과 sevlet 폴더 안의 파일들을
JkMount        /servlet/*    ajp13                #  tomcat으로 보낸다.

</VirtualHost>

추가.
NameVirtualHost virtual.domain.com
을 추가해주셔야 합니다. 안그러면 두개 이상 일 때 제대로 못읽더군요.



이런 식으로 하면 인터넷 브라우져에서 virtual.domain.com으로 접속하시면 /home/domain/virtual/ 안을 읽게 됩니다. 하지만 403 Forbidden Error가 뜰 지도 모릅니다.

이것은 정말로 다른 사람들이 읽을 권한이 없는 것일 수도 있으니, *nix쪽에서는 권한을 한번 더 체크해주시면 됩니다. 그리고 아파치에서 (localhost의)DocumentRoot의 하위 디렉토리에 있는 곳을 redirect시킨 것이라면 보이지만 아니라면 403 Error가 발생합니다.

아파치는 자체적으로 '여기는 읽어도 된다'라고 지정해놓은 디렉토리 이외의 곳을 읽으려고 하면 403을 return해줍니다. 설정해주지 않으면 권한이 없다는 소리.

<Directory "/home/domain/virtual">
    Options FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>


이런 식으로 해당 디렉토리에 대한 권한을 설정해주면 됩니다. 자세한 내용은 구글에서
Options FollowSymLinks site:apache.org 등을 통해 읽어보시면 됩니다.

자, 이제 아파치 설정은 끝났습니다. html파일들은 제대로 읽을 수 있습니다. 하지만 jsp나 sevlet을 읽기 위해서는 톰캣을 설정해줘야합니다.

일단 톰캣 디렉토리로 가서 server.xml을 편집합니다.
      <Host name="localhost" appBase="webapps"
       unpackWARs="true" autoDeploy="true"
       xmlValidation="false" xmlNamespaceAware="false">
이런 식으로 호스트를 설정해줘야 합니다.

      <Host name="virtual.domain.com" appBase="webapps"
      unpackWARs="true" autoDeploy="true"
      xmlValidation="false" xmlNamespaceAware="false">
이런 식으로 host name을 바꿔줍니다.

이 이후부터 5.x 버젼과 그 이하 버젼의 설정이 조금 다릅니다.
일단 5.x 이상의 버젼을 사용하고 있으니, 이상 버젼부터 설명을 하겠습니다.

이상 버젼에서는 appBase의 의미가 별로 없습니다. 설정을 해줘도 되지만 우선권은 $(CATALINA_HOME)/conf/Catalina/[HostName]/ROOT.xml이 더 높습니다. 혹은 ROOT.xml만 읽게 됩니다.
conf/Catalina에 virtual.domain.com이라는 디렉토리를 생성하고 ROOT.xml을 만듭니다.
단순히 redirect될 주소만 적어주면 됩니다.
<Context docBase="/home/domain/virtual"
         privileged="true" antiResourceLocking="false" antiJARLocking="false">
</Context>
역시나 다른 옵션들은 검색을 통해 자세한 내용을 확인하시길..

이 정도로만 해주면 5.x  이상에서의 virtual host 설정은 끝이 납니다.

물론 ROOT.xml이 없다면 Server.xml의 설정대로 되겠죠?
appBase안의 디렉토리를 우선 읽고, context설정이 따로 없다면 appBase안의 ROOT 디렉토리를 DocumentRoot로 읽게 됩니다. Context를 따로 설정해주면 됩니다.

5.x 이하의 버젼에서는 ROOT.xml이 없을 때와 비슷하다고 합니다만, 확인해보지 않았습니다.
Creative Commons License
Creative Commons License

problem about installing oracle in MAC OSX

Tip 2007/12/17 04:21 by 휘샤




following this page(http://download.oracle.com/docs/html/B13954_01/toc.htm)

and check JAVA_HOME path (e.g . JAVA_HOME = /Library/Java/home) and
check whether current version is JDK1.3
(e.g. /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK -> 1.3)

And... Good Luck.
Creative Commons License
Creative Commons License

[Tip] Dos2Unix

Tip 2007/12/05 04:07 by 휘샤


unix에서 dos파일을 열면 라인 끝에 ^M이 붙게 된다.
그럴때 vim(vi에서는 확인을 안해봤다)에서 :g/^M$/s/// 혹은 1,$ s/^M//g를 입력하면 된다.

후자는 1번 줄부터 끝($)까지 s/[찾을 문자열]/[바꿀 문자열]/g을 지정하는 명령어이다.
찾을 문자가 ^M(ctrl+v  + ctrl+m)이고, 바꿀 문자가 null일 때, 라는 뜻이다.

전자는 어떤 뜻인지 정확히 모르고 있지만 후자(11자)보다 짧은 10자-_-이므로 잘 외워서 쓰고 있다.
간만에 메뉴얼을 좀 뒤적여봐야겠다. 시험이 끝나니 쓸데없는게 궁금해진다.
Creative Commons License
Creative Commons License

[Tip] 좋은 코딩 스타일

Tip 2007/12/05 04:06 by 휘샤
프로그래머는 프로그램을 개발하는데 많은 시간을 들이지 않는다.
    대부분의 시간을 코드관리와 업그레이드, 디버깅에 투자
    1980 – 1990년대 일반 애플리케이션의 평균라인수는 23,000 – 120만개
    많은 프로그램은 만든 사람조차도 수정하기 어려운 경우가 많다
    프로그램의 유지 보수를 효과적으로 하도록 코딩해야 한다.


주석
    머리글 - 머리글
    저자 – 프로그램 작성자에 대한 신뢰감
    용도 – 프로그램의 역할
    사용방법 – 프로그램 실행 방법
    참고내용 – 코드의 원래 저자등
    파일 포맷
    제한사항 – 제한사항 기술
    버전이력 – 누가 언제 수정하였는가
    에러처리 – 에러발생시 처리 방법
    참고사항 – 특별한 내용 기술


변수 이름
    의미가 간결해야 함
    지나친 생략형 변수 사용 금지
    int p, q, r;   // 변수의 역할을 알 수 없음
    int account_number;    // 회계 테이블의 인덱스
    int balance_owed;    // 전체 빌린 금액(페니)

프로그램을 명확하고 쉽게 이해할 수 있도록 작성
    while (‘\n’ != *p++ = *q++);  // 이해하기 어려운 코드

    while (1)
    {
        *destination_ptr = *source_ptr;
        ++destination_ptr;
        ++source_ptr;
        if (*(destination_ptr-1) == ‘\n’)
            break;     // 끝이면 루프를 빠져 나온다
    }



좋은주석 나쁜주석
주석은 역할을 기술해야 한다
    나쁜 주석
        int top_limit; // top_limit는 정수형이다
    좋은 주석
        int top_limit; // 데이터를 읽기전에 로드할 수 있는 항목의 수

명명 스타일
C/C++ 프로그램의 전통적인 관례
    변수
        모두 소문자 사용
        source_ptr, current_index
    상수
        모두 대문자 사용
        MAX_ITEMS, SCREEN_WIDTH
    최근에는 대소문자를 혼합하여 사용하기도 함
        RecordsInFile
    일관된 명명 스타일을 사용하는 것이 중요

코딩 스타일
    코딩 스타일 종류
        구조화 프로그래밍
        톱 다운 프로그래밍
        goto 없는 프로그래밍 등
        나름대로 장단점 존재
    맹목적으로 따를 필요는 없음
        더 나은 방법이 있다면 그것을 사용!

명료성, 간결성
    프로그램은 간결해야 함
    단일 함수는 1-2페이지 정도여야 함
    if문 내에 또 다른 if문을 포함하는 형태는 피함
    프로그램에서 긴 문은 되도록 피함
    하나로 된 큰 코드는 여러 개의 작은 코드로 나눔
    클래스를 사용한다면 모듈마다 하나의 클래스를 둠
    자신의 프로그램을 가능한 이해하기 쉽고 간결하게 만듦


일관성과 구조성
    고품질의 프로그램
    훌륭한 스타일이 필요
    각각의 스타일에는 나름대로의 장단점 존재
    바람직한 프로그래밍 방법
    하나의 스타일을 선택하여 일관성 있게 사용

요약
    프로그램은 읽기가 쉽고 간결해야 함
    주석은 2가지 목적으로 사용
        자신의 프로그램을 설명하여 주고,
        작업한 내용을 기억할 수 있도록 해줌
Creative Commons License
Creative Commons License
1 
분류 전체보기 (31)
FreeTalk (16)
Review (3)
Wish (3)
Tip (6)
1. 2. 3. href="http://cfs.tistory.com/custom/blog/0/2428/skin/images/SyntaxHighlighter.css">
4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 22.