Homebrew를 이용한 Mac환경에서의 Apache/PHP 개발 환경 구성. MAMP는 너무나 패키지화 되어 있어, 뭔가 맘에 안든다.

 

그렇다고, 하나 하나 다 내가 깔고 설치하기는 귀찮고.. 그래서 선택한 것이 homebrew!!


아직까지 만족하고 있다...


 Apache , PHP , memcahe , APC 환경 설정...

1) Homebrew 설치

ruby -e"$(curl https://raw.github.com/gist/323731/install_homebrew.rb)"


2) PHP : apache + mysql support

brew install https://github.com/adamv/homebrew-alt/raw/master/duplicates/php.rb --with-mysql


3) memcache, apc 설치

brew install memcached

brew install memcached-php

brew install memcache-php

brew install apc


4)httpd.conf 수정.

sudo vi /etc/apache2/httpd.conf

추가.

LoadModule php5_module /usr/local/Cellar/php/5.3.8/libexec/apache2/libphp5.so

추가.

NameVirtualHost 127.0.0.1:80


<VirtualHost 127.0.0.1:80>

ServerName local.gagamel.com

DocumentRoot /Users/abraxas73/Documents/workspace/gagamel/www

ErrorLog "/Users/abraxas73/Documents/workspace/gagamel/system/logs/error.log"

    <Directory />

    Options FollowSymLinks

    AllowOverride All

    Order allow,deny

    Allow from all

    </Directory>

</VirtualHost>


5) php.ini수정

sudo vi /usr/local/etc/php.ini

추가.

extension="/usr/local/Cellar/memcached-php/1.0.2/memcached.so"

추가

extension="/usr/local/Cellar/memcache-php/2.2.6/memcache.so"

추가

[apc]

    extension="/usr/local/Cellar/apc/3.1.9/apc.so"

    apc.enabled=1

    apc.shm_segments=1

    apc.shm_size=64M

    apc.ttl=7200

    apc.user_ttl=7200

    apc.num_files_hint=1024

    apc.mmap_file_mask=/tmp/apc.XXXXXX

    apc.enable_cli=1


수정

short_open_tag = Off

--> On


6) 로컬 멤캐쉬 실행.(optional)

 /usr/local/Cellar/memcached/1.4.10/bin/memcached -d -p 11211

 /usr/local/Cellar/memcached/1.4.10/bin/memcached -d -p 11212

이 글은 스프링노트에서 작성되었습니다.

Posted by 아프락사스

Java에서 외부 프로그램을 실행하기 위해서는 그동안 Runtime.exec를 많이 사용해 왔다.

간단한 프로그램이나 script를 실행하는 데는 큰 무리가 없다. 본인도 유용하게 사용하고 있는 모듈이기도 하다.

 

그런데, Eclipse 플러그인에서 Runtime.exec를 사용하게 되면, (대부분)호출된 프로그램이 종료될때까지, eclipse를 사용할 수 없게 된다.

특히, 호출된 프로그램이 UI를 가진 프로그램이라면 당연히!!! 왜냐하면, 호출된 프로그램도 Eclipse JVM과 같은 Process 내에서 돌기 때문이다.

호출된 프로그램(특히 UI를 가진)이 끝날때까지, waitFor()를 실행시켜주지 않으면, UI 프로그램은 제대로 동작하지 않는다.

 

모 프로젝트에서 eclipse 플러그인 실행 중에, WinMerge 툴을 실행 시켜, Text를 비교하는 프로그램을 짜고 있었는데,

Runtime.exec를 사용한 경우, WinMerge가 실행되는 것 까지는 좋았으나, WinMerge를 실행시키고 나면, 정작 eclipse를 사용할 수 없어서,

WinMerge에서 Text를 Copy해서 Eclipse에 Paste하기가 쉽지 않았다.

 

여러가지 방법을 모색하던 중, Eclipse의 Java Launcher 또는 외부 실행 도구를 프로그램 적으로 호출하면 되지 않을까 생각하고 seach를 하던 중,

다음의 아주 좋은 article를 발견하여, 유용하게 활용했다.. Good!!!

 

Eclipse에서 WinMerge도 실행시키고, 둘다 서로 개별의 Process를 가질 수 있으니, 원활한 작업이 가능하게 된 것이다.

 

http://help.eclipse.org/help32/index.jsp?topic=/org.eclipse.platform.doc.user/concepts/concepts-exttools.htm

 

이중에서, "외부 도구 실행"을 위해 사용한 코드는..

            ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager();
            ILaunchConfigurationType type = manager.getLaunchConfigurationType(org.eclipse.ui.externaltools.internal.model.IExternalToolConstants.ID_PROGRAM_LAUNCH_CONFIGURATION_TYPE);
            ILaunchConfiguration[] configurations = manager.getLaunchConfigurations(type);

            for (int i = 0; i < configurations.length; i++) {
                ILaunchConfiguration configuration = configurations[i];
                if (configuration.getName().equals("Run Diff Tool")) {
                    configuration.delete();
                    break;
                }
            }
            ILaunchConfigurationWorkingCopy workingCopy = type.newInstance(    null, "Run Diff Tool");
           
            workingCopy.setAttribute(org.eclipse.ui.externaltools.internal.model.IExternalToolConstants.ATTR_LOCATION, winMergeExe);
            workingCopy.setAttribute(org.eclipse.ui.externaltools.internal.model.IExternalToolConstants.ATTR_TOOL_ARGUMENTS, modelPath + " " + codePath);
            workingCopy.setAttribute(org.eclipse.ui.externaltools.internal.model.IExternalToolConstants.ATTR_WORKING_DIRECTORY, workDir);
           
            ILaunchConfiguration configuration = workingCopy.doSave();
            DebugUITools.launch(configuration, ILaunchManager.RUN_MODE);

 

의외로 코드는 간단하다.

1) LauncherManager인스턴스를 얻은 후, LaunchConfiguration 종류를 선택(IExternalToolConstants.ID_PROGRAM_LAUNCH_CONFIGURATION_TYPE)

2) 기존의 같은 이름으로 Launch configuration이 있다면 삭제하고(필요한 경우만), Launch Configuration 인스턴스를 생성한다.

3) 필요한 인수를 지정한다. 프로그램명(IExternalToolConstants.ATTR_LOCATION), 파라미터(IExternalToolConstants.ATTR_TOOL_ARGUMENTS) 등

4) Launch Configuration을 저장하고, 실행한다.

 

왓.. 정말 간단하다.

 

이를 Plugin에서 사용하자면, Dependency에 org.eclipse.debug.core, org.eclipse.debug.ui 등을 선언해야 하고,

"자바 어플리케이션 실행"을 사용하려면, 추가적으로 org.eclipse.jdt.launching 등을 선언해 줘야 한다.


이 글은 스프링노트에서 작성되었습니다.

Posted by 아프락사스

 

Pluglet 프로젝트는 코딩 환경으로 보면, 거의 Java Project와 동일하게 느껴진다.

그래서, 외부 Jar(JDBC Driver등)를 사용할 때, Java Build 경로의 Library탭에만 JAR를 추가해 주면 컴파일 까지는 여느 Java프로젝트처럼 잘 된다.

하지만, 실행을 할라치면 (internal tools로), 클래스를 못 찾는 다는 에러를 보게된다.

 제일 좋은 방법은, 외부 jar를 plugin으로 만들어서, Pluglet 프로젝트에서 runtime에 plugin을 참조하게 하면 된다.

먼저 RSA70에서 신규 프로젝트 만들기에서 "Plug-in from existing JAR archive"를 선택하고, 포함될 JAR를 선택하여,

플러그인을 만든다.

그런다음 기존의 pluglet 프로젝트에 pluglet.xml에서 다음을 추가한다.

<import plugin="[방금 만든 Plugin ID]"/>
그런 다음 실행해 보자..
 
잘되지 않을까?

혹시나 해서 덧붙이자면, 당연히 코딩할 때는 Build Path에 해당 Jar를 따로 넣어줘야 한다.

pluglet.xml은 runtime에 대한 세팅과도 같은 것이니까...

이 글은 스프링노트에서 작성되었습니다.

Posted by 아프락사스

요즘 Junior 동료들과 같이 일주일에 두번 스터디를 진행한다.

진행하면서, Java 기본에 관한 Quiz를 던지곤 하는데, 그러면서, 다시 옛날 기억을 더듬는 기회가 되곤 한다.

 

오랜만에 다시 Pass by Value 냐 Pass by Referece냐라는 질문에..

 

언제나 처럼.. Java는 "Reference를 Pass by Value로 던진다"라고 말한다.

 

참조 URL : http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html

이 글은 스프링노트에서 작성되었습니다.

Posted by 아프락사스

요사이 소스를 파싱하여, Meta 정보를 추려내는 기능에 대해 고민하고 있다.

 

자바 Bytecode를 분석하는 것은 ASM등의 라이브러리를 활용하면 되지만, 소스를 파싱하는 것은 그리 쉽지 않았다.

Queue, Stack 써가면서 , 노가다를 쓰면서 소스에서 Field 정보(사이즈, type, padding 등을 파싱하고 있다.)

 

그러던중, split 함수의 유용함을 알게되었다.

함수 이름만 봐서는 단순히 split만 하는 함수인 줄 알았는데, 정규식을 사용할 수 있었던 것이다.

 

문자 파싱에 있어서는 정규식 만한 것이 또 없지 않은가..

 

사실 정규식을 쓰는 것이 아니더라도, 이제까지 substring과 indexOf를 주로 사용해 왔던 나에게는 split이 참 유용하게 활용될 수 있었다.

예를 들어,

다음의 소스에서, 필드명(NextKey)을 추출한다고 생각해 보자.

        String test9 = "byteValue = FormatUtil.getNull(searchIcCardByCunoListRp.getNextKey()).getBytes();";

아래와 같이 간단히 split 두번이면 끝...
        System.out.print( test9.split(".get")[2].trim().split("\\(")[0] );

첫번째 split(".get")은 ".get"이라는 문자열 기준으로 원본 String을 쪼개서 배열를 반환한다.

  즉 [0]=byteValue = FormatUtil, [1]=Null(searchIcCardByCunoListRp, [2]=NextKey()), [3]=Bytes();

세번째 배열값을 받아 다시 split("\\(")을 해주면, NextKey 와 )) 로 나누어 준다.

 

뭐.. 당연하다고 생각할 수도 있으나, 해본 사람은 안다... ^^

 

그리고, 여기다가 정규식들을 써서 파싱한다면, 더욱 금상첨화....

 

예를 들어

다음과 같은 문자열에서, 숫자만 하나 뽑으면 이것이 위에서 찾아낸 Field 의 사이즈가 된다면,

        String test10 = "byteBuffer = FormatUtil.strToByte(byteBuffer, byteValue, 15 - byteValue.length , \"L\",\" \");";
다음과 같이 찾을 수 있다.
        Pattern p = Pattern.compile("(\\d+)");
        Matcher m = p.matcher(test10);
        System.out.println(m.find()? m.group() : 0);

결과는 15 이 된다.

 

그리고, "L"이 정렬에 대한 정보라면, 정규식 보다는 그냥 split을 쓰면

System.out.print( test10.split("\\\"")[1].trim() );

 

또한, " "이 padding 값이 된다면,

System.out.print( test10.split("\\\"")[3].trim() );

 

참조할 만한 링크는 http://www.tutorialspoint.com/java/java_regular_expressions.htm

 

이 글은 스프링노트에서 작성되었습니다.

Posted by 아프락사스

[BCI] 관련 자료

2010/03/04 15:33

요즘 두가지 이유 때문에 ASM을 보고 있다.

하나는 모델과 소스(바이너리)의 비교 검증 기능 개발을 위해서,

또 하나는 APM 솔루션 개발을 위해서, 모니터링용 코드를 기존 어플리케이션에 쉽게 심는 방법을 찾기 위해서..

 

사실 첫번째 이유로의 ASM은 오래전부터 봐왔던 바이지만, 두번째는 좀 생소 하기는 하지만, 한번에 두마리 토끼를 잡는 다는 셈치고 열공 및 개발 중이다.

 

관련 자료/링크를 쭈욱 나열해 놓고, 나중에 한번에 정리해 보자.

 

 

The Power of Byte Code Instrumentation in Java 시리즈(From 욱짜의 Oracle 블로그) : http://ukja.tistory.com/17

 

ASM 홈페이지 http://asm.ow2.org/

 

 

 

 

이 글은 스프링노트에서 작성되었습니다.

Posted by 아프락사스

다음을 참고해 보자.

 

http://publib.boulder.ibm.com/infocenter/wasinfo/v6r0/index.jsp?topic=/com.ibm.websphere.express.doc/info/exp/ae/tjmx_extend.html

 

시작/중지 = launchProcess/stopProcess

 

 

이 글은 스프링노트에서 작성되었습니다.

Posted by 아프락사스

WAS의 자원에 접속하기 위해서는 JNDI를 사용하게 된다.

그런데, 그 JNDI를 통한 lookup을 하기 위해서는 해당하는 Provider의 Context Factory를 가져와야 한다.

이때, 사용하게 되는 접속 방식에는 두가지가 있다,

 

CORBA 객체 URL 방식 vs IIOP URL

http://publib.boulder.ibm.com/infocenter/wasinfo/v5r0/index.jsp?topic=/com.ibm.websphere.base.doc/info/aes/ae/rnam_example_prop2.html

 

요약하자면, COBRA 객체 URL방식(J2EE 1.3이후 지원, cobarloc)은 복수 서버에 대한 주소 리스트를 사용하여, Fail Over방식으로 접속을 할 수 있는 반면,

기존의 iiop방식은 지정한 단일 서버에 대해서만 접속이 가능하다.(그런데, WebSphere 6.1 환경에서 테스트한 결과 iiop의 경우도 fail over가 되는 것을 보이긴 했다.)

또한, corbaloc url 방식의 경우에는 Cluster로 묶인 서버만 지원(권장, 다른 경우는 장담할 수 없다는)한다는 제한이 있기는 하다.

 

여기서 잠깐, URL 방식이 CORBA 객체 냐 기존 iiop냐로 나뉘긴 하지만, 실제 통신은 둘다 IIOP 프로토콜을 이용하는 것은 변함이 없다.

 

이 글은 스프링노트에서 작성되었습니다.

Posted by 아프락사스

wsadmin.sh 을 이용하여 아래와 같이 명령을 날리면, MBean 리스트를 받아 볼 수 있다.

 

mbean.jython

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

apps = AdminControl.queryMBeans('NEFSS/SystemLibrary:type=SharedTable,*',None)
appArray = apps.toArray()

for app1 in appArray:
print app1.getObjectName().toString()

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

 

DMGR 서버에 붙어서, 전체 Application Server에 대해서 Query를 날리려면
/app/was/WebSphere/AppServer/bin/wsadmin.sh -username XXX -password XXXX -lang jython -f mbean.jython

 

특정, Application Server Instance에 붙어서 Query를 날리려면

/app/was/WebSphere/AppServer/bin/wsadmin.sh -host XXX -port XXXX -username XXX -password XXXX -lang jython -f mbean.jython

(여기서 포트는 SOAP 포트가 된다.)

이 글은 스프링노트에서 작성되었습니다.

Posted by 아프락사스

1. java.sql.SQLException: XXXXXX Connection authorization failure occurred. Reason: Security mechanism not supported. ERRORCODE=-4214, SQLSTATE=28000DSRA0010E: SQL State = 28000, Error Code = -4,214

 

이런 오류가 나온다면, ID/PW를 의심해 보자, 특히, ID를 새로 만들었을 경우, 초기 한번은 TSO 등으로 로그인해서, 새로운 패스워드로 바꾸라는 메시지가 뜨지는 않는지 확인해 본다.

 

2. Error : DB2 SQL Error: SQLCODE=-805, SQLSTATE=51002, SQLERRMC=XXX.NULLID.SYSLN300.5359534C564C3031;DISTSERV;04, DRIVER=3.50.152

이런 오류가 나온다면,  다음의 명령을 실행하여, jdbc용으로 Bind를 해 줘야 한다.

    java com.ibm.db2.jcc.DB2Binder -url jdbc:db2://XX.XX.XX.XX:446/XXX -user userid -password passw0rd

    실행결과

    Package "XXXXX": Bind succeeded
    Package "YYYYY": Bind succeeded
    .....
    Package "ZZZZZ": Bind succeeded
    DB2Binder finished.

이 글은 스프링노트에서 작성되었습니다.

Posted by 아프락사스
<< PREV : [1] : [2] : [3] : [4] : [5] : ... [16] : NEXT >>

BLOG main image

공지사항

카테고리

분류 전체보기 (160)
MAMP LAMP (1)
Open Project (4)
Knowhow (57)
JEE Technologies (3)
Rational Products (94)
Etc (0)