개발에서 한 발짝 물러나 다시 시스템에 대해 바라볼 시간이다. 이번에는 스토리지 구현에 관해서다.

사실 스토리지는 더 이상 반드시 필요한 요소는 아니다. 아마존의 S3 같은 서비스가 스토리지의 부담을 잘 덜어주고 있기 때문이다.

그래도 기본적인, 새로운 부분은 한 번 살펴보겠다. 특히 이번에 소개하는 ZFS라는 이름부터 거창한(Z는 Zettabyte를 의미) 파일 시스템이다.

ZFS는 128비트를 최초로 적용한 파일 시스템으로 거의 무한대의 용량을 제공한다. 1 제타바이트는 무려 1,073,741,824 테라바이트다. 이 정도면 더 이상의 파일 시스템은 필요없을 것 같다.

아, 설마 나도 빌 게이츠처럼 640KB면 충분하다고 계속 놀림 당하는건 아니겠지?

* 이 글은 IBM developerWorks 후원으로 작성한 글입니다.

Boost C++ 라이브러리는 Standard Template Library(STL)과 함께 C++ 핵심 라이브러리 중 하나다. 당연히 Boost는 STL과도 매우 잘 동작하며 Boost에는 STL에 있는 알고리즘, 컨테이너 뿐만 아니라 메모리, 문자열 처리, 정규식! 같은 다양한 기능을 제공한다.

아래 DW 글에서는 압축된 쌍 및 유형 특성과 클래스를 복사할 수 없게 만들거나 어설션 실패 시 특정 함수 콜백을 허용하도록 빠르게 도움을 주는 Boost의 일반적인 기능과 같이 유용한 몇 가지 유틸리티에 대해 살펴본다. 또한 백그라운드에서 일어나는 일을 이해하기 위해 Boost 소스를 조사해본다.

실제로 std::swap보다 boost::swap의 우수성을 설명하기 위해 boost::swap의 소스 코드를 엿보는 부분이 있다.

#include <algorithm> //for std::swap
#include <cstddef> //for std::size_t

namespace boost_swap_impl
{
  template<class T>
  void swap_impl(T& left, T& right)
  {
    using namespace std;//use std::swap if argument dependent lookup fails
    swap(left,right);
  }

template<class T, std::size_t N>
  void swap_impl(T (& left)[N], T (& right)[N])
  {
    for (std::size_t i = 0; i < N; ++i)
    {
      ::boost_swap_impl::swap_impl(left[i], right[i]);
    }
  }
}

namespace boost
{
  template<class T1, class T2>
  void swap(T1& left, T2& right)
  {
    ::boost_swap_impl::swap_impl(left, right);
  }
}

* 이 글은 IBM developerWorks 후원으로 작성한 글입니다.

이클립스(Eclipse)는 자바 개발의 사실상 표준(de facto standard) 플랫폼이다.

기능이 풍부하고 사용하기 쉽다. 무한한 확장구조를 갖고 있으며 버전업도 빠르다. 결정적으로 무료다.

IBM이 든든하게 후원하면서 무료로 편리하게 사용할 수 있는데 쓰지 않을 이유가 없다. 실제로 이클립스는 자바 기반의 개발 생산성을 엄청나게 높였다.

부작용도 있다.

요즘 나오는 프레임워크는 아예 이클립스를 쓴다는 전제하에 나오기 때문에 쓰지 않으면 진행이 불가능할 정도로 생산성이 낮다. 아예 툴의 기능을 반드시 사용해야 할만큼 프레임워크가 점점 더 복잡해지기도 한다.

우리가 책에서 배웠던 모델링이나 설계를 잘 하는 것 보다 툴의 기능에 의존한 개발이 더 편하다는 점은 장점인지 단점인지 헷갈린다.

어쨌든 자바를 하겠다면, 배우겠다면 익히겠다면 이클립스를 모르고는 할 수 없는 세상이다.

마침 DW에 그간 참고 자료를 정리한 유용한 링크를 제공한다. 번역된 부분도 있고 원문도 있지만 스크린캡쳐까지 동원해 자세히 설명하니 그리 큰 어려움은 없을듯 싶다.

* 이 글은 IBM developerWorks 후원으로 작성한 글입니다.

여러 경로를 통해 선물 받거나 증정 받거나 혹은 직접 사는 것을 포함하면 매 달 4-5권의 새 책을 접한다.

하지만 독서 속도는 이를 따라가지 못한다. 사실 한 달에 4-5권쯤이야 마음만 먹으면 얼마든지 읽을 수 있다. 그런데 마음을 먹는게 좀체 쉽지 않다.

핑계를 대자면 가장 큰 주범은 인터넷이다. 인터넷의 매력에 빠지면 좀처럼 헤어나올 수가 없다. 심지어 TV도 안보게된다(이건 좋은 일 같지만 어쨌든) SNS의 중독성은 더 하다. 끊임없이 커뮤니케이션 하게 되고 수시로 울려대는 알림 메시지는 주의력을 분산 시킨다. 알림이 없더라도 새로운 소식이 없나 계속 기웃기웃하게 된다.

이쯤되니 책 볼 시간이 없다. 책을 펼치고 독서를 시작하다가도 끊임없이 울리는 스마트폰에 이내 집중력이 흐트러진다.

집이 어둡다는 것도 문제다. 이북리더도 같인 이유로 팔아버렸는데 별도 조명이 필요하다는게 문제였다. 두꺼운 책 하나만 들고 다니기도 번거로운데(최소한 조그만 스마트폰에 비해) 거기다 독서등까지 챙기고 책갈피까지 빠트리지 않으려면 여간 번거로운게 아니다.

침대에 누워서 독서하는걸 즐기는데 이 마저도 조명에, 책갈피에, 불편한 자세로 책을 들고 버티다가 결국 한손에 쏙 들어오는 스마트폰을 찾게 된다.

아직 뾰족한 해결책은 찾질 못했다. 집 안에 별도의 독서룸을 만들까도 생각해봤지만 이 역시 쉬운 일은 아니고. 계속 이렇게 얘기하는건 스스로 반성하고 채찍질하여 좀 더 독서하는 시간을 갖기 위함이다. 이렇게 하지 않으면, 얘기 하지 않으면 책을 보는 시간이 점점 더 줄어들 것 같다.

inotify는 파일 시스템 이벤트 통보 기능을 제공하는 리눅스 커널 서브 시스템 중 하나이다. John McCutchan이 개발했고 Robert Love(현재 구글 직원)와 Amy Griffis가 후에 함께 했다.

리눅스에서는 2.6.13 커널 부터 포함되었고  이 도구를 이용하면 모니터링 프로그램에서 하나의 파일 디스크립터를 열어서 하나 이상의 파일이나 디렉토리에서 지정된 이벤트가 발생하는지 감시할 수 있다.

inotify는 몇 분마다 반복하여 파일 시스템을 스캐닝할 필요 없이 커널에 의해 직접 파일이 바뀌었음을 통보받는다. 따라서 매우 적은 CPU 성능만으로도 사용가능하다.

inotify가 있기 전에 dnotify가 있었으나 불편하고 제약이 많았다. 현재는 하위 호환성을 위해서만 존재하며 inotify로 대체되었다.

struct inotify_event
{
    int wd;               /* Watch descriptor.  */
    uint32_t mask;        /* Watch mask.  */
    uint32_t cookie;      /* Cookie to synchronize two events.  */
    uint32_t len;         /* Length (including NULs) of name.  */
    char name __flexarr;  /* Name.  */
};

inotify의 이벤트 구조

감시할 수 있는 이벤트는 아래와 같다.

  • IN_ACCESS – 파일의 마지막 접근
  • IN_MODIFY – 파일의 마지막 수정
  • IN_ATTRIB – 파일 변경의 속성
  • IN_OPEN 및 IN_CLOSE – 파일의 열기 혹은 닫기
  • IN_MOVED_FROM 및 IN_MOVED_TO – 파일이 이동(move)되거나 이름이 바뀜(rename)
  • IN_DELETE – 파일/디렉터리의 삭제
  • IN_CREATE – 파일/디렉터리의 생성
  • IN_DELETE_SELF – 모니터되는 파일 자체의 삭제

inotify-test.c의 샘플 기본 루틴

/* Signal handler that simply resets a flag to cause termination */
void signal_handler (int signum)
{
  keep_running = 0;
}

int main (int argc, char **argv)
{
  /* This is the file descriptor for the inotify watch */
  int inotify_fd;

  keep_running = 1;

  /* Set a ctrl-c signal handler */
  if (signal (SIGINT, signal_handler) == SIG_IGN)
    {
      /* Reset to SIG_IGN (ignore) if that was the prior state */
      signal (SIGINT, SIG_IGN);
    }

  /* First we open the inotify dev entry */
  inotify_fd = open_inotify_fd ();
  if (inotify_fd &gt; 0)
    {

      /* We will need a place to enqueue inotify events,
         this is needed because if you do not read events
         fast enough, you will miss them. This queue is
         probably too small if you are monitoring something
         like a directory with a lot of files and the directory
         is deleted.
       */

      queue_t q;
      q = queue_create (128);

      /* This is the watch descriptor returned for each item we are
         watching. A real application might keep these for some use
         in the application. This sample only makes sure that none of
         the watch descriptors is less than 0.
       */

      int wd;

      /* Watch all events (IN_ALL_EVENTS) for the directories and
         files passed in as arguments.
         Read the article for why you might want to alter this for
         more efficient inotify use in your app.      
       */

      int index;
      wd = 0;
      printf("\n");
      for (index = 1; (index &lt; argc) &amp;&amp; (wd &gt;= 0); index++)
        {
          wd = watch_dir (inotify_fd, argv[index], IN_ALL_EVENTS);
        }

      if (wd &gt; 0)
        {
          /* Wait for events and process them until a
         termination condition is detected
          */

          process_inotify_events (q, inotify_fd);
        }
      printf ("\nTerminating\n");

      /* Finish up by closing the fd, destroying the queue,
         and returning a proper code
       */

      close_inotify_fd (inotify_fd);
      queue_destroy (q);
    }
  return 0;
}

* 이 글은 IBM developerWorks 후원으로 작성한 글입니다.

소개

Working Smart: Getting Better at Work and Life

likejazz@daum.net

검색

메뉴

소개
글 목록 보기
KML/KMZ + Daum 지도
Mac OS X 유틸리티 및 설정
TechNotes

Facebook Activity

피드

  25,940 readers

라이센스

Creative Commons License
This work is licensed under a Creative Commons Attribution 2.0 Korea License.

 

« 최근 글오래된 글 »