반응형

웹서버와 자바 어플리케이션 간의 소켓 연결을 위해 Netty를 사용하고 있는데 특성상 연결이 끊길경우 반드시 자동 재접속을 시도를 해야 한다. 이것을 구현해보려고 많은 예시를 봐왔지만 딱히 해결 될 기미가 보이지 않던 찰나에 좋은 코드를 찾았고 이를 적용하니 정상적으로 대응이 되었다.

 

public final class UptimeClient {
  
      static final String HOST = System.getProperty("host", "127.0.0.1");
      static final int PORT = Integer.parseInt(System.getProperty("port", "8080"));
      // Sleep 5 seconds before a reconnection attempt.
      static final int RECONNECT_DELAY = Integer.parseInt(System.getProperty("reconnectDelay", "5"));
      // Reconnect when the server sends nothing for 10 seconds.
      private static final int READ_TIMEOUT = Integer.parseInt(System.getProperty("readTimeout", "10"));
  
      private static final UptimeClientHandler handler = new UptimeClientHandler();
      private static final Bootstrap bs = new Bootstrap();
  
      public static void main(String[] args) throws Exception {
          EventLoopGroup group = new NioEventLoopGroup();
          bs.group(group)
                  .channel(NioSocketChannel.class)
                  .remoteAddress(HOST, PORT)
                  .handler(new ChannelInitializer<SocketChannel>() {
                      @Override
                      protected void initChannel(SocketChannel ch) throws Exception {
                          ch.pipeline().addLast(new IdleStateHandler(READ_TIMEOUT, 0, 0), handler);
                      }
                  });
          bs.connect();
      }
  
      static void connect() {
          bs.connect().addListener(new ChannelFutureListener() {
              @Override
              public void operationComplete(ChannelFuture future) throws Exception {
                  if (future.cause() != null) {
                      handler.startTime = -1;
                      handler.println("Failed to connect: " + future.cause());
                  }
              }
          });
      }
  }

 

위의 예제의 경우 Netty Client 소스 코드를 Main에서 실행하도록 했지만 사실 Main 문을 그냥 하나의 메서드로 바꿔버린다음 다른 곳에서 호출하는 형식으로 써도 된다. 실제로 그렇게 쓰고 있고 적용이 잘 된다.

 

예를 들어 public static void main 을 public void NettyClient로 바꾼다음 다른 곳에서 NettyClient()로 바꾼다던지 말이다.

 

NettyClient의 실질적인 기능을 부여할 Handler의 경우 addLast를 통해 추가한다

 


  package io.netty.example.uptime;
  
  import io.netty.channel.ChannelHandler.Sharable;
  import io.netty.channel.ChannelHandlerContext;
  import io.netty.channel.SimpleChannelInboundHandler;
  import io.netty.handler.timeout.IdleState;
  import io.netty.handler.timeout.IdleStateEvent;
  
  import java.util.concurrent.TimeUnit;
  
 /**
   * Keep reconnecting to the server while printing out the current uptime and
   * connection attempt getStatus.
   */
  @Sharable
  public class UptimeClientHandler extends SimpleChannelInboundHandler<Object> {
  
      long startTime = -1;
  
      @Override
      public void channelActive(ChannelHandlerContext ctx) {
          if (startTime < 0) {
              startTime = System.currentTimeMillis();
          }
          println("Connected to: " + ctx.channel().remoteAddress());
      }
  
      @Override
      public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
          // Discard received data
      }
  
      @Override
      public void userEventTriggered(ChannelHandlerContext ctx, Object evt) {
          if (!(evt instanceof IdleStateEvent)) {
              return;
          }
  
          IdleStateEvent e = (IdleStateEvent) evt;
          if (e.state() == IdleState.READER_IDLE) {
              // The connection was OK but there was no traffic for last period.
              println("Disconnecting due to no inbound traffic");
              ctx.close();
          }
      }
  
      @Override
      public void channelInactive(final ChannelHandlerContext ctx) {
          println("Disconnected from: " + ctx.channel().remoteAddress());
      }
  
      @Override
      public void channelUnregistered(final ChannelHandlerContext ctx) throws Exception {
          println("Sleeping for: " + UptimeClient.RECONNECT_DELAY + 's');
  
          ctx.channel().eventLoop().schedule(new Runnable() {
              @Override
             public void run() {
                  println("Reconnecting to: " + UptimeClient.HOST + ':' + UptimeClient.PORT);
                  UptimeClient.connect();
              }
          }, UptimeClient.RECONNECT_DELAY, TimeUnit.SECONDS);
      }
  
      @Override
      public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
          cause.printStackTrace();
          ctx.close();
      }
  
      void println(String msg) {
          if (startTime < 0) {
              System.err.format("[SERVER IS DOWN] %s%n", msg);
          } else {
              System.err.format("[UPTIME: %5ds] %s%n", (System.currentTimeMillis() - startTime) / 1000, msg);
          }
      }
  }

Netty에서 많은 기능을 제공하지만 재접속 부분만 보자면 channelUnregistered를 보면 된다.

 

channelUnregistered에서 EventLoop를 통해 꾸준히 Connection을 시도하는 것을 확인할 수 있다.

 

이렇게 적용했을때 단순 연결 끊김 외에도 유령 세션에도 대응할 수 있었다. 

반응형

!!!! 주의 : 윈도우 10에서만 작동이 보증되며 타 운영체제(특히 윈도우11)에서는 작동을 보증할 수 없습니다

 

요즘 자바를 한창 하고 있는데 git으로 파일을 관리 중이다.

 

SourceTree라는 아주 좋은 관리 툴이 있어서 이걸 애용하고 있는데 집에서 이걸 설치하니 자꾸 CredentialHelperSelector가 뜬다. 

 

 

여기서 다른건 왠지 건드리면 안될것 같아서 no helper 선택하고 선택을 해도 자꾸 뜨고 Always use this from now on 체크 해도 자꾸 뜬다. 근데 이게 항상 위로 떠버려서 작업 하다가 방해가 이만저만이 아니다.

 

해결 방법 알아보던 중 좋은 팁이 있어서 공유를 해본다. 별도의 응용프로그램을 설치 하지 않고 간단히 설정만으로 해결 할 수 있다.

 

1. Windows10 검색창에서 powershell을 관리자 모드로 실행한다

 

 

 

2. powershell에서 아래의 명령어를 입력한뒤 엔터를 친다

 

cd $env:LOCALAPPDATA\Atlassian\SourceTree\git_local\mingw32\bin\

 

3. 아래의 문구를 입력한 뒤 엔터를 친다

 

./git.exe config --edit --system

 

4. 아래의 화면에서 'helper = manager'로 변경한다

 

아마 가장 아랫줄에 있는 helper의 값이 다른 값으로 되어있을것인데 이걸 manager로 바꾼다.

 

편집을 위해서는 키보드 i 키를 누르면 --INSERT-- 라는 문구가 뜰텐데 이게 편집 가능한 상태이다.

 

이 상태에서 수정하면 된다. 

 

그러고 난뒤 Esc 키를 한번 누르고 :wq를 입력한뒤 엔터를 친다. 이렇게 하면 저장을 한다.

 

 

 


위의 과정을 따라하면 기존 CredentialHelperSelector가 더이상 뜨질 않을 것이다.

 

나 같은 경우는 더이상 저것이 뜨지 않는다. 

'Programming Languages > Java' 카테고리의 다른 글

Netty Client Reconnect(재접속) 로직 예시  (1) 2022.04.28
반응형

putty에서 프로세스를 실행시키고 나가면 putty와 함께 프로세스도 같이 kill이 되버리는 사태가 발생을 합니다. 이게 원격 터미널에서는 이런일이 발생을 한다고 하는데 왜 그런지는 차치하고서라도 putty 끈다고 프로세스가 같이 죽어버리면 굉장히 곤란해집니다. 그렇기 때문에 리눅스나 유닉스나 nohup을 통해서 프로세스를 유지시키는 방법을 많이 쓰는데 IBM AIX에서는 유독 이 nohup 명령어가 잘 먹히지 않았습니다.

 

기존 리눅스에서는 "nohup [Process 명] > [내용 기록할 Log 파일명] &" 이라는 명령어로 대충 잘 알아먹는데 AIX는 유독 이게 안먹혀서 인터넷에서 찾다찾다가 드디어 먹히는 명령어를 찾았습니다....

 

 

만약 AIX에서 root로 로그인을 했다면...

nohup [Process 명] 2>&1 &  

위와 같이 적어도 대충 알아먹습니다만 문제는 root가 아닌 사용자 계정에서는 이러한 방법이 잘 먹히지가 않더군요.

 

 

 

만약 AIX에서 임의의 사용자 계정으로 로그인을 했다면...

nohup [Process 명] > [저장할 Log 파일명] 2>&1 </dev/null &

이렇게 작성을 해줘야 nohup이 제대로 작동하는 것을 확인할 수 있었습니다.

 

솔직히 두개의 차이가 뭔지는 잘 모르겠습니다. /dev/null 정도 추가했다고 이런일이 발생하나 싶지만 결국 이렇게 하니 nohup이 제대로 작동하는 것을 확인할 수 있었습니다.

 

혹시나 AIX에서 nohup 잘 안먹히면 참고하시기 바랍니다...

 

 

해당 명령어는 [ AIX 7.2 ]에서 작동이 보증되었음을 알립니다.

 

반응형

Centos 7 환경에서 Qt Creator로 Qt 프로그래밍 중 몇 번 겪어보던 에러가 발생했다.

 

<GL/gl.h> no such file or directory... 어차피 원인은 저 gl.h 파일이 없다는 거니까 저걸 설치하기만 하면 끝이다.

 

원래 gl.h 위치는 /usr/include/GL에 있으며 아마 거기서 확인을 해봐도 비스무리한 파일은 보이는데 정작 gl.h가 없을 것이다. OpenGL 관련 파일이라는데 OpenGL을 심도적으로 파고들 것은 아니기 때문에 이 문제는 패스하고...

 

결론부터 말하자면 yum을 통해 매우 손쉽게 설치가 가능하다. 명령어는 아래와 같다.

 

yum install mesa-libGLU-devel

이 명령어만 치면 CentOS 환경에서는 알아서 gl.h 설치가 되고 컴파일 하는데는 문제가 없다.

 

한번 설치하고 나면 더이상 이런 문제가 발생하지 않으니 걱정은 안해도 된다.

 

 

출처 : http://wanochoi.com/?p=259

 

 

 

 

반응형

Qt에서 테이블을 표현하는데는 QTableView나 QTableWidget을 사용하면 된다.

 

어떤걸 만들어야 하나에 따라서 취사선택하면 되며 나 같은 경우는 MVC로 표현하는 것이 적합할 것 같아 QTableView를 사용했다.

 

QTableView에서 기본 배경색과 폰트를 설정하는 방법이 조금 독특해서 까먹을까봐 이곳에 기입을 한다. 까먹으면 다시 보려고...

 

 

QTableView 폰트및 색상을 바꾸려면 QPalette를 이용하면 되며 아래와 같이 MainWindow 초기화 하는 부분에서 그냥 선언하고 설정하면 그만이다.

 

MainWindow::MainWindow(QWidget *parent) : 
{
....

QPalette p = ui->tableView->palette();

p.setColor(QPalette::Base, QColor("Black")); // QTableView 배경색 변경
p.setColor(QPalette::Text, Qt::green); // QTableView 폰트색 변경

ui->tableView->setPalette(p);

....
}

 

이렇게 설정하면 배경색과 폰트색을 원하는대로 설정할수 있다. 반드시 setPalette()를 이용해서 QTableView에 QPalette 설정을 적용해주자.

 

 

 

반응형

리눅스가 참 좋은 점이 있다면 터미널에서 간단한 명령어를 통해 프로그램을 자동으로 적재적소에 알아서 설치해준다는 점이다.


파일질라도 마찬가지이며 설치방법은 매우 간단하다.


파일질라는 FTP 접속을 위해 사용하는 가장 대중적인 프로그램 중 하나이다.


처음에는 무슨 P2P 웹하드 사이트 인줄 알았는데 -_-;; 아직도 내가 많이 무식하다는 것을 느낀다.


여하튼 CentOS를 써봤다면 아마 대충 이런 명령어로 설치를 시도 할 것이다.



yum -y install filezilla


물론 틀린 명령어는 아니지만 아마 대부분 "No Package filezilla available" 이라 적힐 것이다.


그래서 패키지가 없으니 epel repository를 설치하려고 알아볼 것인데... 문제는 CentOS 7 버전에서는 정말 6과는 같은 OS가 맞나? 싶을정도로 바뀐게 엄청 많다 보니 흔히 구글에서 찾아 나오는 명령어가 먹히지 않는다.



CentOS 7 에서 epel repository를 설치하는 방법은 아래와 같다.


yum -y install epel-release


그럼 epel repository를 설치하고 완료가 될 것이다.


그 후에 다시 yum -y install FileZilla 명령어를 통해 파일질라 설치를 시도하면 설치가 제대로 된다.




FileZilla가 아주 깨끗하게 실행이 잘 되고 있다.





 재밌게 읽으셨다면 공감(♥) 버튼을 한번만 꾹 눌러주세요.

여러분들의 공감 하나가 블로그 포스팅의 원동력이 됩니다.

로그인 할 필요 없으며 1초면 충분합니다.


댓글도 언제나 환영합니다! 망설임 없이 댓글 달아주세요!



반응형
https://eks020.blog.me/220809507861


보통 이 오류가 뜨는 경우는 yum 을 사용한다거나 rdate를 사용할때 발생하는 경우에 많이 발생합니다.





이런 오류가 뜨면 rdate를 통해 시간 동기화도 참 힘들어지는데 찾아보니 nameserver를 찾을 수 없어서 생기는 문제라고 하네요.


CentOS 기준


1. # vi /etc/resolv.conf


2.  열린 resolv.conf 파일에 아래 두줄 추가 후 저장


nameserver 58.277.183.227

nameserver 221.143.20.131



OS 재시작 과정은 필요 없습니다.

바로 적용이 됩니다. 생각보다 간단한 문제였네요.





 재밌게 읽으셨다면 공감(♥) 버튼을 한번만 꾹 눌러주세요.

여러분들의 공감 하나가 블로그 포스팅의 원동력이 됩니다.

로그인 할 필요 없으며 1초면 충분합니다.


댓글도 언제나 환영합니다! 망설임 없이 댓글 달아주세요!



반응형


윈도우의 시간도 자유롭게 바꿀수 있는것처럼 리눅스도 가능합니다.


가끔 테스트를 위해서 (특히 다음 날로 넘어가는 AM 12:00 테스트를 위해서) 시간을 강제로 바꿔줘야 할 필요성을 느끼는데요.


우분투에서 시간을 수동으로 설정하는 방법은 아래와 같습니다.


1. 우분투 시간 수동 설정


# date -s "2018-05-17 17:59:48"


위는 2018년 5월 17일 17:59:48초로 시간을 강제로 바꾸고 싶을때의 예시죠.


현재 기준으로 이전 시간이든 이후 시간이든 상관없이 적용됩니다.


그런데 저렇게 해서 적용을 해도 실제 적용이 안되는 경우가 있습니다.





위와 같이 date 명령어를 이용해 수동으로 설정한뒤에 확인을 위해 바로 date 명령어 바로 쳐도 다시 실제시간으로 바뀌어버리는 케이스가 있는데요.


우분투 시간 동기화가 설정되어 있으니 그걸 해제하시면 됩니다.





2. 우분투 시간 동기화 해제 방법


# timedatectl set-ntp 0


그럼 시간 동기화가 해제 되서 다시 date 명령어를 통해 수동으로 시간 설정하면 잘 적용이 됩니다.


그 이후 다시 원래대로 실제 시간으로 셋팅하고 싶으면...


3. 우분투 시간 동기화 설정 방법


# timedatectl set-ntp 1


을 통해 바로 해결 가능합니다.




 재밌게 읽으셨다면 공감(♥) 버튼을 한번만 꾹 눌러주세요.

여러분들의 공감 하나가 블로그 포스팅의 원동력이 됩니다.

로그인 할 필요 없으며 1초면 충분합니다.


댓글도 언제나 환영합니다! 망설임 없이 댓글 달아주세요!




반응형


예전에 내가 겪어본 OS 중 가장 호환성이 최악이었던 IBM AIX 7.2에서 log4cxx를 겨우 어찌해서 억지로 설치를 해서 사용중인데, 다시 우분투를 설치 할일이 있어서 설치를 했다.


그리고 당연히 쓰여야할 log4cxx를 설치하려고 했는데 리눅스도 만만치 않게 설치방법이 매우 드럽더라....


apr 까지야 어떻게 꾸역꾸역 했는데 apr-util-1.6.3을 설치할때 <expat.h> 그런 파일이나 디렉터리가 없습니다. 라는 에러 메세지를 띄우더라.


당연히 뭔가 설치를 해야겠거니 해서 찾았는데 CentOS 기준으로



'yum install expat-devel' 을 입력하면 expat가 설치된다고 한다.


옳거니! 그래서 우분투도 똑같이 'apt-get install expat-devel' 을 입력하고 패키지 설치를 기다렸더니





설치가 되지 않는다


패키지 이름이 틀렸겠거니 해서 찾아봤는데 의외로 우분투 패키지 설치 명령어가 없어서 기록 겸 남겨 본다.



우분투와 같은 데비안 계열의 리눅스에서 expat-devel을 설치하려면



'apt-get install libexpat1-dev' 을 입력 하면 된다.



정리하면 다음과 같다.




 CentOS

 yum install expat-devel

 Ubuntu

 apt-get install libexpat1-dev 



이상 끝!










 재밌게 읽으셨다면 공감(♥) 버튼을 한번만 꾹 눌러주세요.

여러분들의 공감 하나가 블로그 포스팅의 원동력이 됩니다.

로그인 할 필요 없으며 1초면 충분합니다.


댓글도 언제나 환영합니다! 망설임 없이 댓글 달아주세요!



반응형

AIX에 대한 이미지 검색결과




요 근래 AIX 7.2에 MariaDB 및 MySQL을 설치하려 했으나 잠정적 불가능으로 결론..


첫번째로, AIX 7.2 전용 MySQL이 없다. RPM 지원은 당연히 없으며 MariaDB는 태생부터가 AIX 지원을 안한다.



두번째로, 그나마 AIX 5.1에서 설치가 가능하던 MySQl 3.2.58 버전 설치 시도 했으나 역시 실패


IBM 공식 홈페이지에 있는 AIX ToolBox for Linux Application을 통해 예전에 MySQL이 그래도 AIX를 지원한다는 사실을 발견하여 지푸라기 잡는 심정으로 그 RPM을 다운받아 설치 시도 RPM 설치까지는 모두 완료했으나 실행시 에러 발생.


관련 에러 원인 및 해결방안을 아무리 뒤져도 나오지 않았다. 심지어 구글 및 스택 오버플로우에서도!


그나마 찾고 찾아서 지나가는 말투로 적은듯한 댓글에 적혀 있는것이... 32bit / 64bit 지원여부에 따라서 안될것이라는 의견


찾아보니 MySQL 3.2.58 버전 출시는 2003년... 64비트 어플리케이션 자체가 생소하던 시절인데 AIX 7.2 64비트에 그래서 설치가 안되는 것인가... 어쨌든 실패




세번째로, 어떻게 MySQL 까지 실행은 성공했으나(그런데 Alpha 버전...) MySQL 연동에 필요한 라이브러리 실행 불가.


C++ 소스코드에서 MySQL DB와 연동시키려면 아마 절대다수가 MySQL Connector/C++을 사용할것이다.


그런데 Connector/C++이 1.1버전 이상에만 들어있는 함수를 사용했다면 역시 불가...


내가 찾아보니 기존 리눅스 소스에서는 1.19버전(즉... 최신....ㅡㅡ....) 함수를 마음껏 사용해서 짜놨기 때문에 소스코드 짜기는 참 쉬웠으나 결국 AIX에서는 불가. 


왜냐하면 AIX를 지원하던 마지막 버전이 1.1이기 때문에 그 이후의 버전의 새 함수를 사용한다면 구 버전으로 갈아치우거나 해야한다.


그럼 Connector/C++ 1.19버전의 라이브러리만 추출해서 적용하면 되는거 아닌가?


시도 안해봤을리가 있나... 이미 해봤으나 1.19 버전 소스코드를 받아 갖은수를 써서 Make를 시도해봐도 불가...


아예 소스코드 자체가 문법에 안맞다고 광활한 에러를 내뿜기 시작한다. 소스 코드 자체가 리눅스에 맞게 짜여진듯...


라이브러리 추출불가.


그럼 AIX를 지원하던 1.1버전 이전의 구버전 Connector/C++은? 라이브러리 추출 되지만 그 라이브러리 가지고는 적용 불가. 언급했다시피 최신버전의 Connector 함수를 마음껏 사용했다.





네번째로, 그렇다면 AIX 7.2에 적용할수 있는 DB를 쓰면 되지 않는가?


물론 있다. IBM의 DB2와 오라클... 이름만 들어봐도 그 포스가 절절히 흐르지만 라이센스료만 잘못하다가 억 소리나는 매우 비싼 분들이시다.


무료를 지향하는 나에게는 이미 요단강 건너서 ㅂ2 할 물건들



결론 적으로 AIX 최신버전에 MySQL을 포함한 MariaDB 등 GPL 라이센스를 따르는 오픈소스 DB들은 모두 적용이 잠정적으로 불가능하다.


물론 잠정적이라는 것은 내가 아직 실력이 부족해서 안되는것일수도 있고... 뭐 그렇다.


지금까지의 결론으로는 난 삽질만 한것이다.


능력자 분 누군가가 나의 글을 본다면 혹시 해결방법을 알고 있다면 꼭 댓글을 달아주셨으면 한다... ㅠㅠ 불쌍한 나를 좀 구제해주소서


반응형

준비물 : Apache-log4cxx / APR / APR-util



Apache-log4cxx Download : https://logging.apache.org/log4cxx/latest_stable/download.html


APR & APR-util Download : http://apr.apache.org/download.cgi




가장 먼저 저 세개의 파일을 다운 받아야 한다. 모두 tar.gz 형태로 압축되어 있어 압축 풀기가 그나마 수월한 편이다.





  APR 설치 방법



APR을 가장 먼저 기술하는 이유는 설치파일들의 의존성 때문이다.


우분투나 센트OS 쓸때는 겪어본적이 없는것 같았는데 이 의존성 때문에 은근히 사람 골때리게 만들더라...


의존성은 간단히 말해서 설치하기 위해서 먼저 깔려 있어야 하는 파일 뭐 그런거다


이 의존성 때문에 설치 순서는 무조건 APR -> APR-util -> log4cxx 로 가야 한다.


이 순서를 지키지 않는다면 make가 전혀 되지 않으니 주의. 물론 무시하고 설치하는 방법이 있다만 별로 권장하고 싶지는 않다.


APR을 설치하는 방법은 간단하다.




1) 다운로드 사이트에서  "Unix Source: apr-1.6.3.tar.gz"  다운받기(버전 상관없음. 그냥 최신버전으로...)


2) "gzip -dc apr-1.6.3.tar.gz | tar xvf -" 명령어를 통해 압축 풀기 (gzip이 없다면 rpm을 구해서 설치할것)


3) cd apr-1.6.3.tar.gz 로 폴더 이동


4) ./configure


5) make


6) make install



APR은 설치가 그리 어렵지 않다. 의외로 상당히 간단한 편







  APR-util 설치 방법


APR을 설치 했기 때문에 이제 APR-util 설치가 가능하다. 



APR-util을 설치하는 방법은 다음과 같다


1) 사이트에서 다운 받기


2) "gzip -dc apr-util-1.6.1.tar.gz | tar xvf -" 으로 압축 풀기


3) cd apr-util-1.6.1.tar.gz 폴더 이동


4) ./configure --with-apr='apr이 위치한 경로'    (예를 들어 아까 APR을 압축풀고 MAKE 하고 지지고 볶고 하던 곳이 /usr/local/apr-1.6.3 이라는 경로에 있다면 ./configure --with-apr='/usr/local/apr-1.6.3' 입력해야 함)


5) make


6) make install



=> APR-util 에서는 configure 에 옵션이 들어가기 시작했다. 이것은 어찌보면 당연한것인데 apr-util은 apr이 필수로 필요하기 때문에 어느 경로에 있는지 정확하게 찍어줘야 한다.


그렇기에 저런 옵션이 들어간것이다.








  Apahce-log4cxx 설치 방법



이제 APR과 APR-util 모두 설치했으므로 의존성에 의한 설치 불가는 발생하지 않는다.


1) 사이트에서 다운


2) 똑같이 압축풀기


3) 폴더 이동


4) ./configure --with-apr='apr이 위치한 경로' -- with-apr-util='apr-util이 위치한 경로'

   ex) ./configure --with-apr='/usr/local/apr-1.6.3' -- with-apr-util='/usr/local/apr-util-1.6.1'


5) make


6) make install






이렇게 하면 log4cxx 설치는 모두 끝이 난다. RPM이 없어서 소스 설치 하는게 매번 번거롭지만 어쨌든 AIX에서도 LOG4CXX를 사용할수 있음에 의의를 두자






  Error 발생시 해결방법



아마 Apache-log4cxx 설치 하다가 오류가 발생할 가능성이 좀 있다.


내가 겪은게 2가지 인데 하나는 No Space~ 로 시작한 오류와 하나는 ' ' not been declared 라는 오류이다.


No Space ~ 오류는 공간이 없는거니까 걍 해당 디스크의 용량을 확보해주자.



다만 not been declared가 조금 까다로운데 이럴 경우 소스 코드도 수정을 해야 한다.


예를 들어 



console.cpp : ::memcpy has not been declared 라는 에러가 발생할 가능성이 있다.


이럴 경우에는 해당 소스코드에 들어가서 헤더를 추가해주면 된다. 대체로 memcpy, memmove와 같은 것들이 걸리는데 대부분 String 관련 함수이니 


#include <cstring>을 소스코드 내에 추가하면 완성.


위의 케이스는 console.cpp를 vi 편집기로 들어가서 직접 헤더 하나 추가해주면 된다.






 재밌게 읽으셨다면 공감(♥) 버튼을 한번만 꾹 눌러주세요.

여러분들의 공감 하나가 블로그 포스팅의 원동력이 됩니다.

로그인 할 필요 없으며 1초면 충분합니다.


댓글도 언제나 환영합니다! 망설임 없이 댓글 달아주세요!








반응형


C++ 코드로 MySQL DB와 연동하여 일련의 작업을 하는 프로그램을 제작중에 있다.


테스트 하면 워낙에 해괴망측한 이유로 에러를 뿜어내며 프로그램이 죽어대지만 이번 오류는 좀 기록을 해놔야 다음에 까먹어도 찾아볼수 있을것 같아 기록해 둔다.


보통 String 타입으로 쿼리문을 작성하여 C++ 소스코드 안에 적용해놓고 그 String 문자열 대로 쿼리문을 적용하는게 가장 일반적이다.


오라클 과는 다르게 왠지 모르게 간편한 MySQL을 선호하는 편인데 작업 도중 아래와 같은 오류를 만나게 되었다.



Column: 'Column_Name' in where clause is ambiguous 


생전 처음 만나보는 에러라서 해결방법이 막막했는데 의외로 구글링 하네 쉽게 나왔다.


문제가 되던 컬럼이 어느 테이블의 컬럼이냐를 제대로 지정안해줬기 때문에 생겨난 아주 기초적인 실수였다...



예를 들어 id라는 컬럼이 있는데 이것이 Table A에도 존재하고 Table B에도 존재한다면


당연히 쿼리에는 A.id 라던가 B.id 라고 확실히 지정을 해줘야 한다.


그런데 나 같은 경우는 예를 들어 아래의 쿼리를 실행했다.




SELECT * FROM A,B WHERE id = 10




이렇게 되면 WHERE 뒤에 있는 id가 A에서 온 id인지 B에서 온 id 인지 정확히 알수가 없어 해당 에러를 내뿜게 되는 것이다.


정작 FROM 으로 A와 B 테이블 모두 불러와놓고 이런 기초적인 실수나 하다니....


요즘 일이 많고 야근하다보니 머리가 어떻게 된것 같다. 가끔은 머리 좀 쉬어가면서 해야겠다.

반응형

"TNS-01189: The listener could not authenticate the user" error message

오라클 설치를 끝내고 이제 리스너 시작을 하기 위해 lsnrctl 명령어를 이용했건만, 위와 같은 오류가 하염없이 뜨면서 사람을 괴롭히는 경우가 있습니다.


이 오류를 해결하기 위해 구글링을 했는데 의외로 해결책이 마땅한게 없어서 애를 좀 먹었습니다. 


이 오류를 해결하기 위해서는 반드시 살펴봐야 하는 사항이 2가지 입니다.


1. 현재 리눅스 접속 아이디가 오라클을 사용할수 있는 아이디로 접속을 하였는가?


2. lsnrctl 버전이 오라클과 다르지는 않은가?


 

첫번째의 경우가 해결책이 되는 경우는 사실상 거의 없습니다. 하지만 혹시나 현재 root로 접속하고 있는건 아닌지 한번 살펴보시기 바랍니다.


아마 대부분 오라클을 리눅스에 설치하기 위해 구글을 통해 정보를 찾아 그 설치과정을 그대로 따라했을 것입니다.


이렇게 되면 대부분 "oracle" 이라는 아이디를 만들었을것인데요. 아무리 root라 할지라도 리스너를 실행시킬수가 없습니다.


오라클 관련 권한은 전부 아이디가 oracle인 녀석에게 있기 때문입니다.



 

▲ 아이디가 oracle인지 root인지 반드시 확인 해볼것 



그렇다면 두번째를 살펴봐야 하는데요. 제가 두번째 케이스를 고려하고 다시 수정해서 해결을 했습니다.



리스너 버전을 확인하기 위해서는 단순하게 lsnrctl 명령어를 쳐보시면 확인할수 있습니다.






그럼 위와 같이 버전을 확인하실수가 있습니다. 지금은 11.2로 버전이 잘 업데이트가 되었지만 제가 TNS-01189 오류가 났었을때는 버전이 10.2였습니다.


오라클 버전은 11g 인데 리스너는 10.2였으니 버전이 서로 맞지가 않아 lsnrctl 명령어가 먹질 않았던 것입니다.


버전을 업데이트를 하면 거의 90%는 해결된다고 보실수 있는 문제입니다. 90%라고 하는 이유는 나머지 10%는 다른 이유가 복합적으로 작용해서 생긴 문제일수도 있기 때문입니다.


버전 업데이트 하는 방법은 listener.ora 파일에 들어가셔서 리스너 설정을 해주면 바로 해결될수 있는 문제인데요.


구글에 버전에 맞는 리스너 설정법을 검색하시면 쉽게 업데이트 가능합니다.


예를 들어 저 같은 경우 오라클 11g의 리스너 설정을 하고 싶기 때문에 "오라클 11g 리스너 설정" 이라고 검색하면 수많은 블로거 분들이 아주 잘 포스팅한 글들이 매우 많기 때문에 그것들을 그대로 복붙한다음 IP와 포트만 바꿔 주시면 됩니다.


간단한 예로 제가 설정한 리스너 내용을 밑에 올립니다.



이것은 오라클 11g 리스너 설정 내용이므로 다른 버전을 쓰신다면 다른 버전을 검색하시면 되겠습니다.



이것으로 포스팅 마치겠습니다. 

반응형

간혹 리눅스에서 SVN 커밋을 하려고 하면 충돌 문제가 발생합니다. 그 중에서도 Aborting commit : 'xxx.c' remains in conflict 라는 문제가 자주 발생하는데요.


이건 두 대 이상의 컴퓨터에서 한쪽에서 작업하고 커밋하고 또 다른 쪽에서 작업하고 커밋하고 하다보면 꼬이게 되고 SVN은 이를 머지(병합)을 하는 경우에 충돌이 발생하게 됩니다.


머지가 완벽하게 이루어지지 않으면 SVN은 코드에 자동으로 수정하기 전 코드를 수정 후 코드에 자동으로 구분지어 갖다 붙이거나 아니면 아예 새로운 파일을 만들어내게 되는데 이러한 이전 파일이 남아있게 되면 위와 같은 오류가 발생하게 됩니다. 따라서 이 파일들을 삭제하게 되면 해결 될 문제입니다.



ls 명령어를 칠 경우 못 볼수도 있으니 ll 명령어를 통해 자세히 폴더내 파일을 조사. 그럼 아래와 같이 .c.mine이나 .c.r1428과 같은 파일이 있는것을 확인하실수 있습니다.




이 파일들을 지우면 됩니다. rm 명령어를 사용





하지만 삭제를 했음에도 불구하고 아래와 같이 커밋을 했는데도 또 실패하는 경우가 생깁니다. 이는 커밋을 하려 했는데 현재 파일의 버전과 커밋할 파일의 버전이 너무 차이가 날때 발생하게 됩니다. 예를 들어 다른 한쪽 컴퓨터에서는 커밋과 업데이트를 꾸준히 실시해서 버전이 1430인데 또다른 컴퓨터에서 똑같은 파일을 대상으로 커밋을 실시하려니 그 해당파일은 1420일수가 있습니다. 이는 커밋과 업데이트를 자주 실시하지 않아 동기화가 제대로 이루어지지 않은 겁니다.


따라서 1420인 올드한 파일을 SVN UPDATE 명령어를 통해 1430까지 버전을 끌어올리면 해결됩니다. 아래와 같이 svn update를 치면 1439까지 버전이 업데이트 된것을 확인하실수 있습니다.




이제 아래와 같이 다시한번 커밋을 시도하면 이젠 커밋이 제대로 완료되서 버전이 1440으로 한단계 더 끌어올려졌구요. update 명령어를 통해 최신버전을 유지하면 끝이 납니다.



SVN에서는 항상 커밋과 업데이트가 중요하니 자주 실시하시기 바랍니다. 어차피 SVN은 그렇게 쓰라고 만들어놓은거니까요.



 재밌게 읽으셨다면 밑의 공감 버튼을 한번만 꾹 눌러주세요.

여러분들의 공감 하나가 블로그 포스팅의 원동력이 됩니다.

로그인 할 필요 없으며 1초면 충분합니다.



반응형

/etc/init.d/crond restart 


라고 입력하면 재시작 된다. 

반응형

CentOS 6.5 버전에서 확인된 사항입니다. Ubuntu와 같은 다른 리눅스에서는 보증하지 않습니다.


안녕하세요. 이번에는 리눅스 관련 오류 해결방법에 관해 다뤄볼까 합니다.


현업에서 일하든 대학교 프로젝트를 하든 SVN(Subversion)은 굉장히 많이 사용합니다. 상당히 유용하기도 하구요. 하지만 리눅스에서는 조금 다루기가 어려운데요.


svn: OPTIONS of 'https://xxx.xxx.x.xxx:xxxx/svn/trunk': SSL handshake failed: SSL error: Key usage violation in certificate has been detected. (https://xxx.xxx.x.xxx:xxxx) 라는 오류가 뜨는 경우가 있습니다.


관련 자료 찾아봤더니 정보도 많이 없고 대부분 영어라서 해석하면서 보려니 머리가 아프더라구요. 결국 방법은 찾았습니다.


방법은 두가지 입니다.


1. SVN 서버에 들어가 '개인 인증서' 하나를 추가로 신설해 클라이언트에서 접속이 가능하게 한다


2. SVN 클라이언트 버전을 1.6.11 이상으로 업데이트 한다.



1번의 경우 가장 확실하고 클라이언트 버전을 그대로 유지할수 있다는 장점이 있지만 서버 컴퓨터에서 직접 조작을 해야 하고, 그럴 일은 없겠지만 혹시나 잘못돼서 서버 자체가 문제가 생기면 복구 수준으로 끝나지 않을지도 모릅니다. 저 같은 경우도 1번을 먼저 시도하려고 했다가 서버 관리자가 서버는 왠만해서 건드리지 말라고 부탁을 하여 1번 방법은 포기하였습니다.


1번 방법을 포스팅한 블로거 분들이 몇 분 계시므로 방법을 찾으시기 바랍니다.



2번 같은 경우에는 기존의 SVN을 지우고 새로 SVN을 다시 깔아야 하는 귀찮음이 존재합니다. 하지만 굳이 서버에 접근하지 않아도 되고 클라이언트(로컬 PC) 수준에서 끝낼수 있기 때문에 훨씬 안전합니다.


따라서 저같은 경우는 2번을 했는데요.


CentOS 6에서 그냥 yum install subversion 이라 명령어를 입력해서 설치를 하게되면 자연스럽게 1.6.11 버전이 설치가 됩니다. CentOS 7에서는 시도하지 않아서 어떤 버전이 깔릴지는 알수가 없습니다.


이러한 오류가 발생하는 이유는 인증서 방식이 서로 다르기 때문입니다.


윈도우는 대체로 OpenSSL을 사용하기 때문에 별 문제가 없으니 리눅스의 경우 SVN이 1.6.11 이하 버전이면 OpenSSL이 아니라 GnuTLS 방식을 사용하게 됩니다. 서로 호환이 되지 않아 발생하는 문제이기 때문에 대충 통과시켜 주거나 아니면 인증서 방식을 호환시키는 방법으로 해결해야 하죠.


다행히도 1.6.15 버전 이상부터는 리눅스 SVN도 OpenSSL을 지원하기 때문에 이러한 문제는 더이상 발생하지 않습니다. 극도의 호환성을 맞추기 위해서(예를 들어 고객사 서버와 환경을 동일하게 맞춰야 한다던가) 하는 경우가 아니라면 왠만해서 SVN을 최신버전으로 유지시켜주시기 바랍니다.


다만 리눅스에서 1.6.11 이상 버전을 설치하기 위해서는 단순한 명령어 한줄로 끝나지 않고 따로 외부에 접속을 해서 파일을 받아온다음 일일이 설치해줘야 하는 불편함이 따르니 그에 관련된 자료를 검색하셔서 적용하시기 바랍니다.


대체로 '리눅스 SVN 1.7' 이라던가 '리눅스 SVN 1.8' 과 같이 검색을 하면 친절하고 다양한 정보들이 많습니다.


리눅스 SVN과 관련해서 저런 오류가 뜬다면 버전이 안맞는 경우가 거의 100% 이니 이 방법을 적용해보시기 바랍니다.


이것으로 포스팅 마치겠습니다.



반응형

log4cxx.liblog4cxx.dll을 컴파일 해서 추출을 해냈으니 이제는 이것을 적용해서 실제 log4cxx를 쓸수 있도록 해야 한다.

 

 

간단하게 과정을 선요약하고 시작하자면

 

1. 프로젝트 생성

2. 프로젝트 속성 -> 구성 속성 -> C/C++ -> 추가포함디렉토리 : log4cxx 헤더파일 경로

3. 프로젝트 속성 -> 구성 속성 -> 링커 -> 일반 -> 추가라이브러리디렉터리 : log4cxx.lib 파일 경로

4. 프로젝트 속성 -> 구성 속성 -> 링커 -> 입력 -> 추가종속성 : log4cxx.lib 입력 후 추가

5. log4cxx.dll을 실행경로에 복사

6. log4cxx.properties 설정파일 작성 및 폴더 복사

가 있다.

 

 

 

 

1. Visual Studio 2012에서 새로운 빈 프로젝트(Win32 콘솔 응용 프로그램)를 생성한다.

 

2. 생성된 프로젝트에서 main으로 쓸 cpp 파일 하나 생성 한다.

 

3. 다음과 같은 코드를 방금 만든 cpp 파일에 복사 및 붙여넣기 한다(샘플 코드)


#include <windows.h>
#include <string>
#include <iostream>
using namespace std;

#pragma warning ( disable: 4231 ) 
#include <log4cxx/logger.h>
#include <log4cxx/basicconfigurator.h>
#include <log4cxx/propertyconfigurator.h>
#include <log4cxx/helpers/exception.h>

#pragma comment(lib, "log4cxx.lib")
using namespace log4cxx;
using namespace log4cxx::helpers;

int main(void)
{
	try
	{		
		while(1){
		string filePath = "log4cxx.conf";
		PropertyConfigurator::configure(File(filePath));

		LoggerPtr rootlog = Logger::getRootLogger();
		LoggerPtr log = Logger::getLogger("");

		LOG4CXX_FATAL(log, "fatal output...");
		LOG4CXX_ERROR(log, "error output...");
		LOG4CXX_WARN (log, "warn  output...");
		LOG4CXX_INFO (log, "info  output...");
		LOG4CXX_DEBUG(log, "debug output...");
		Sleep(1000);
		}
	}
	catch(const Exception& e) {
		cout << "[ERROR] configure()\n" << e.what() << endl;
	}

	return EXIT_SUCCESS;
}

 







 

4. 그냥 바로 붙여넣기를 하면 아래와 같이 온갖 오류가 발생할 것이다. 이것은 log4cxx의 헤더가 추가 되지 않아서 그런 것이다. 헤더를 추가해야 한다.


=> 헤더를 추가하는 방법은 다음과 같다.

 

Alt + F7 키를 누르면 속성 페이지에 들어오게 된다. 속성 창에서 C/C++ - 일반 추가포함 디렉토리에서 log4cxx의 헤더파일들이 존재하는 폴더 경로를 지정하면 된다.

 

대체로 apache-log4cxx-0.10.0/src/main/include/log4cxx에 존재하나 없을 경우

 

윈도우에서 logger.h를 검색해서 나오는 결과 파일의 경로를 찾아도 된다.

 

여기서 중요한 것은 /src/main/include/log4cxx까지 왔을 때 log4cxx 폴더를 경로로 잡는 것이 아니라 include 폴더를 경로로 잡아야 한다.

 

apache-log4cxx-0.10.0/src/main/include를 경로로 잡을 것.


<오류 투성이의 코드들... 헤더가 적용이 되지 않아 그렇다 >


<log4cxx 라는 폴더 안에 헤더파일이 몽땅 들어있다>

< 추가포함 디렉터리에 log4cxx 폴더 경로를 지정하면 오류들이 모두 사라진다.>


 

그러면 위와 같이 오류들이 모두 사라진다.

 

 








5.
이제 log4cxx 라이브러리 파일의 경로를 지정해줘야 한다.

 

나 같은 경우 생성한 프로젝트 폴더 안에 lib이라는 폴더를 임의로 만든 다음 log4cxx.lib의 파일을 옮겼다.

 

이렇게 하면 경로가 단순해지고 라이브러리 파일이 어디있는지 알아보기가 쉽다.

예를 들어 나는 Test라는 프로젝트를 만들어 지금 소스 코드를 입력했으니

 

Test 프로젝트 폴더 안에 만든 것이다.




위와 같이 라이브러리 파일을 집어 넣었다.(폴더명도 lib이라는 것이 보일것이다)

 

이제 이 라이브러리 파일이 있는 경로를 지정해주면 된다.

 

속성(Alt + F7) - 구성 속성 링커 일반 추가 라이브러리 디렉터리에서 경로를 지정해주면 된다.

 

 

 





6. 마지막으로 log4cxx.lib을 입력만 해주면 된다.

 

속성 구성 속성 링커 입력 추가 종속성에서 log4cxx.lib을 입력해서 확인

 

 

 


 

 

 

7. 이제 비주얼 스튜디오 내에서의 설정은 끝났고 컴파일해서 얻었던 log4cxx.dll을 옮겨야 한다. 그렇게 하기 위해선 우선 복붙해놓은 소스코드를 빌드 시켜 프로그램으로 만들어야 한다. Ctrl + Alt + B를 눌러 빌드 시킬 것.

 

그렇다면 프로젝트 폴더에 Debug라는 폴더가 생성되며 exe 파일이 생성되어 있다.

 

Debug 폴더에 컴파일해서 만들어 놓은 log4cxx.dll을 복사해둔다.

 







 

8. Test.execmd를 이용해 실행시킨다. cmd에서 Test.exe가 위치한 폴더로 이동시킨 다음 Test.exe를 입력하여 엔터를 친다.

 

 

 

 

그러면 이렇게 에러가 발생한다. 이 이유는 log4cxx.conf 파일 즉 설정파일이 없기 때문이다.


영어를 읽을줄 안다면 configuration file인 log4cxx.conf를 read 할수 없다라는 말이 고스란히 적혀 있다.

 

아까전 복붙했던 소스 코드를 잘 보면 filePathlog4cxx.conf로 되어있는데 이것은 컴퓨터공학을 전공했던 사람들이라면 누구나 알겠지만 log4cxx.conf 파일이 실행파일과 같은 위치에 있어야 한다는 것을 의미한다. 그러니 log4cxx.conf를 만들고 설정을 하면 된다.

 

 


9.
메모장에 아래와 같은 내용을 집어넣고 저장할 때 log4cxx.conf라고 저장한다음 아까전 실행파일이 위치했던 곳으로 복사시킨다.

 


# root logger setting
#log4j.rootLogger=DEBUG, console, filelog, chainsaw, rollingfile
log4j.rootLogger=console,FILE,rollingfile

# using console appender
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{ISO8601} [%-5p] %c(%L) : %m%n
#log4j.appender.console.layout.ConversionPattern=%d [%t] %-5p (%F:%L) - %m%n


# using rolling file appender
log4j.appender.rollingfile=org.apache.log4j.RollingFileAppender
log4j.appender.rollingfile.layout=org.apache.log4j.PatternLayout
log4j.appender.rollingfile.File=Rlog.txt
log4j.appender.rollingfile.layout.ConversionPattern=[%d] [%-5p] (%L) - %m%n
log4j.appender.rollingfile.MaxFileSize=500MB
log4j.appender.rollingfile.MaxBackupIndex=3

# using filelog appender
log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender
log4j.appender.FILE.DatePattern='Main-'yyyy-MM-dd-HH-mm'.log'
log4j.appender.FILE.Append=true
log4j.appender.FILE.ImmediateFlush=true
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.DateFormat=ISO8601
log4j.appender.FILE.layout.ConversionPattern=%d %-4r [%t] %-5p %c %x - %m%n

# using chainsaw appender
log4j.appender.chainsaw=org.apache.log4j.net.SocketAppender
log4j.appender.chainsaw.remoteHost=localhost
log4j.appender.chainsaw.port=4445
log4j.appender.chainsaw.locationInfo=true 

 


 

 

 

10. 이제 다시 cmd를 이용해 Test.exe를 실행시키면 실행도 제대로 되고 Main으로 시작하는 로그 파일도 생성이 된다. 로그 파일을 열어보면 프로그램이 실행하면서 출력했던 내용들이 고스란히 기록되어 있다.

 

 

 < 더이상 에러가 발생되지 않는다. 그리고 분 단위로 로그가 생성되는 것을 실시간으로 확인할수 있다>

 

 

<이렇게 로그가 생성되는 것을 확인 할수 있다. 프로그램이 꺼지지 않는한 이 로그는 계속 생성 될 것이다>

 

 

 

 

 

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


로그를 남기는 것은 상당히 중요한 일이다. 특히 현업에서 개발자로서 일을 한다면 더욱더 그렇다.


만약 어떠한 프로그램에 문제가 생겼을 경우 이 프로그램이 어디서 문제가 생겼는지 찾는 것은 대단히 어려운 일이다. 왜냐하면 대체로 개발하는 프로그램들은 테스트를 할때 기본적으로 며칠은 계속 구동을 시켜놓기 때문이다. 


이렇게 스트레스 테스트를 하여서 나오는 오류를 잡아야 하는데 사람이 며칠 동안 컴퓨터만 계속 쳐다볼수 없는 노릇이므로 로그를 남기게 해서 오류가 생겼을시에 언제, 몇시, 어느 부분에서 문제가 생겼는지 명확히 알수 있게 된다.

 

 또한 책임을 명확하게 할수도 있다. 혹여나 프로그램이 오류가 생겼는데 고객사와의 관계 혹은 특정한 경우에 의해서 그 잘못을 뒤집어 쓰는 경우가 생길수도 있는데 로그를 정확하게 남긴다면 이런 책임소재를 명확히 할수 있다. 특히 대단히 큰 프로젝트를 맡아 여러 회사와 같이 협업을 하는 경우가 있다면 더욱더 이런 책임소재를 명확히 할 필요가 있다.


로그를 남기는 버릇을 들여 어떠한 상황에서도 반드시 로그를 남기는 개발을 하여야 할것이며 그 일은 log4cxx가 C++ 환경의 개발에서 책임을 져줄것이다.



 







반응형

log4cxx는 프로그램의 로그를 기록해주는 역할을 하는 log4j의 개념과 원리를 따서 C++에도 적용할수 있게 한 오픈 프레임워크이다.


Apache에서 주관하였으나 2008년 이후로 최신버전은 나오고 있지 않다. 하지만 아직까지도 많이 쓰이는 대표적 C++ 로그 오픈 프레임워크인 만큼 필요성은 언제나 언급되고 있다.


하지만 log4cxx의 라이브러리를 얻기 위한 컴파일 과정 특히 윈도우 상에서의 컴파일 과정이 생각보다 까다로운 편이라 초보개발자 혹은 컴퓨터 전공 대학생들은 쉽게 따라하기가 어려운 케이스가 존재한다.


이 글을 작성하는 것은 서술식으로 전문용어가 주르륵 나열되어 있어 마치 지식 자랑을 뽐내는 듯한 블로그 포스팅을 지양하고, 최대한 사진을 포함하여  누구나 쉽게 컴파일을 할수 있도록 하는 것에 그 목적이 있다.



이 과정만 따라가면 누구나 컴파일을 할수 있을 것이다. 그 누구나의 최소 기준은 컴퓨터를 전공으로 할 계획이 있는 고등학생이다. 


일반인은 log4cxx와 같은 로그 오픈 프레임워크 자체를 만져볼 일이 거의 없을 것이기 때문이다.



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


log4cxx를 윈도우에서 사용하기 위해서는 컴파일을 통해 log4cxx.liblog4cxx.dll을 생성해야 함. 컴파일 과정이 다음과 같음.



 

1. apache log4cxx 0.10.0 다운로드 http://logging.apache.org/log4cxx/latest_stable/download.html

-> Mirrosapache-log4cxx-0.10.0.zip 클릭후 다운로드

 



2. APRAPR-util을 다운로드 : http://apr.apache.org/download.cgi

-> apr-1.5.2-win32-src.zip 과 apr-util-1.5.4-win32-src.zip 클릭하여 다운로드





 


 

 


3. 각각 압축을 풀면 아래와 같은 결과물이 나오는데 apr-1.5.2 -> aprapr-util-1.5.4apr-util로 반드시 이름 변경 할 것








 

 



4. cmd에 들어가 apache-log4cxx-0.10.0 폴더로 들어간뒤 configure.batconfigure-aprutil.bat을 실행시킨다.

   cmd 내에서 폴더 이동 방법은 ‘cmd 명령어를 검색해 알아볼 것.


=> configure-aprutil.bat을 실행할 때 오류가 나는데 안나면 다행이고 오류가 나도 이상할건 없다무시해도 상관없다.






 

 


 



5. apache-log4cxx-0.10.0
폴더에 project 폴더가 존재한다. project 폴더로 들어간뒤 log4cxx.dsw를 더블클릭해서 솔루션을 실행시킨다 업그레이드도 실행 할 것.


<apache-log4cxx-0.10.0 폴더 내부>


<apache-log4cxx-0.10.0의 project 폴더 내부>


 


 

 

혹시나 log4cxx.dsw를 실행했을때 위와 같은 단방향 업그레이드 안내가 뜰경우에 확인하여 넘길 것.(취소하면 안된다)



 

 

6. log4cxx 프로젝트에 우클릭 한다음 시작프로젝트로 설정을 클릭한다.

 


 

 

7. 솔루션 탐색기에서 apu.hw 검색 후 소스 코드에서 #define APU_HAVE_APR_ICONV를 찾으면 1이라 되어있을건데 0으로 수정



<솔루션 탐색기에서 apu.hw 검색 결과>



<apu.hw 소스코드에 APU_HAVE_APR_ICONV를 1에서 0으로 바꿈>




8. 7번과 똑같은 과정으로 솔루션 탐색기에서 apr_ldap.hw에서 #define APR_HAS_LDAP 부분이 1로 되어있을 것인데 0으로 바꿔준다.

=> 과정은 7번과 완전히 똑같다. 


 

9. 빌드를 한다.(단축키 : Ctrl+Alt+B)



 


10. apache-log4cxx-0.10.0\projects\Debuf
폴더에 결과물을 확인한다.

=> log4cxx.dll과 log4cxx.lib 두개의 파일이 존재해야만 컴파일이 완전히 성공한 것이다.



 


 


 

* “error C2252: 템플릿은 네임스페이스 범위에서만 명시적으로 인스턴스화할 수 있습니다.” 오류가 발생할 경우 해결 방법

 

1) 솔루션 탐색기에 stringhelper.cpp 검색후 소스코드 들어가서 #include <iterator> 구문 추가

 

2) 솔루션 탐색기에 log4cxx.h 검색후 소스코드 들어가서

 

template class LOG4CXX_EXPORT std::allocator<T>;\

template class LOG4CXX_EXPORT std::vector<T>;\

 

extern template class LOG4CXX_EXPORT std::allocator<T>; \

extern template class LOG4CXX_EXPORT std::vector<T>; \

 

를 삭제한다.

 

*"error LNK2019: _imp_UuidCreate@4 외부 기호(참조 위치:_apr_os_uuid_get@4 함수)에서 확인하지 못했습니다." 오류가 발생할 경우 해결방법


=> Rpcrt4.lib을 링크에 추가


위 두개의 에러 발생시 자세한 처리 과정은 추후 다룰 예정.




반응형

CentOS 7으로 넘어오면서 상당히 많은 부분이 바뀌었다.


그래서 대체적으로 구글로 검색해서 나오는 "yum install mysql-server" 명령어로는 설치가 불가능하다.


CentOS 7부터는 MySQL대신 MariaDB를 지원하기 때문이다.


하지만 회사에서 MySQL을 사용하거나 대학교 교수님이 굳이 MySQL을 고집한다던가 하는 이유로 무조건 MySQL을 써야한다면 아래의 명령어를 순서대로 입력하면 된다.


1. yum install http://dev.mysql.com/get/mysql-community-release-e17-5.noarch.rpm


2. yum install mysql-community-server


3. systemctl start mysqld


4. mysql




4번의 과정까지 마치면 


프롬프트가 mysql>로 바뀐다. 이렇게 되면 MySQL의 설치는 끝나게 된다.


나중에 라이브러리 파일이 없어서 문제가 생기면 


http://lwk24.tistory.com/63


글을 참고하면 된다.



반응형

CentOS 7 기준으로 작성하였습니다. 그 외의 버전에서는 해결을 보증하지 않습니다.




말 그대로 헤더파일이 없기 때문이다.


이 말은 mysql 라이브러리가 없기 때문이다.


정말로 없는지 확인하기 위해서는 다음과 같은 명령어를 입력해본다.


find / -name mysql.h


라고 검색했을때 아무것도 뜨지 않는다면 라이브러리가 없어 생기는 문제이므로 설치만 하면 바로 해결되는 아주 간단한 문제이다.



yum install mysql-devel



을 입력하면 일련의 설치과정이 진행되고 모든 설치가 끝난다음 


다시 find / -name mysql.h를 검색하면 이번에는 /usr/include/mysql/mysql.h 라는 결과가 출력된다.


이것으로 더이상 컴파일시 mysql.h : No such file or directory 오류가 발생하지 않을 것이다.

+ Recent posts