태그 보관물: Linux

OpenGrok 설치

OpenGrok을 설치하는 가장 간단한 방법은 tomcat5~6 사이의 버전을 사용하고, 설치하는 위치를 /var/opengrok 으로 정하는 것이다. 이렇게 하면 별도의 수정없이 거의 그대로 OpenGrok을 사용할 수 있다. (OpenGrok 설치 빨리 하기 참조)

이 posting에서는 Source를 <YOUR_SOURCE_REPOSITORY_TOP> 경로 아래에 각 project별로 따로 보관하고, <YOUR_HOME_DIRECTORY>/opengrok 경로 아래에 OpenGrok과 관련된 file들을 보관하는 상황을 가정하고 설명한다.

설치 환경

Ubuntu 12.04에 tomcat7을 설치하고, OpenGrok에 관련된 file들은 <YOUR_HOME_DIRECTORY>/opengrok 아래에 보관하고, source code들은 별도로<YOUR_SOURCE_REPOSITORY_TOP> 아래에 project별로 구성되어 있는 상황을 가정한다.

필요한 package들

$ sudo apt-get install tomcat7 tomcat7-admin exuberant-ctags

설치가 완료된 후에 http://localhost:8080으로 접근하면 tomcat이 제대로 동작하는지 확인해 볼 수 있다. Tomcat이 동작하는 것을 확인한 후에는 OpenGrok을 download 받아 압축을 해제한다.

$ wget http://hub.opensolaris.org/bin/download/Project+opengrok/files/opengrok-0.11.1.tar.gz
$ tar xvzf opengrok-0.11.1.tar.gz

OpenGrok 실행 환경 만들기

OpenGrok이 동작할 환경을 만든다. bin, data, etc, src가 필요한데 bin은 OpenGrok script를 비롯한 실행 file들이 들어갈 곳이고, data는 indexing된 결과물이 저장된다. etc에는 configuration에 관련된 data가 포함되고 src에는 OpenGrok이 분석할 source code가 저장되는 곳이다. 하지만 앞서 말한것 처럼 source는 이미 다른 위치에 있는 것을 가정하고 환경을 설정할 것이다.

$ mkdir -p opengrok/bin
$ mkdir -p opengrok/data
$ mkdir -p opengrok/etc

압축을 해제한 곳으로 부터 bin directory로 실행에 필요한 파일들을 복사한다.

$ cp bin/OpenGrok opengrok/bin
$ cp -r lib opengrok/

Tomcat7 경로 추가

FATAL ERROR: Unable to determine Deployment Directory for Tomcat - Aborting

OpenGrok을 deploy하기 위해 명령을 치면 tomcat directory를 찾지 못했다는 오류와 함께 실행이 중단된다. 이것은 OpenGrok 0.11.1 version에서 tomcat7에 대한 고려가 되어있지 않기 때문인데 bin directory로 복사한 OpenGrok script를 편집기로 열어서 아래와 같이 2곳에 tomcat7이 포함되도록 추가해 준다.

1. FindApplicationServerType()에 tomcat7 추가 (Line 489)

    # This implementation favours Tomcat, but needs a lot of work,
    # especially if Glassfish is perferrerd or it is under the control
    # of SMF (Service Management Facility)

    # Maybe a better implementation would be to call Application
    # Server specific WAR Directory and see if they exist.

    if [    -d "/var/tomcat6/webapps"        \   
         -o -d "/var/lib/tomcat6/webapps"    \   
         -o -d "/var/lib/tomcat5/webapps"    \   
         -o -d "/var/lib/tomcat5.5/webapps"  \
         -o -d "/var/lib/tomcat7/webapps"    \   
       ]   
    then
        echo "Tomcat"
        return
    fi

2. DetermineWarDirectoryTomcat()에 tomcat7 추가 (Line 524)

    for prefix in               \   
        ${OPENGROK_TOMCAT_BASE} \
        /var/tomcat6            \   
        /var/lib/tomcat6        \   
        /var/lib/tomcat5        \   
        /var/lib/tomcat5.5      \   
        /var/lib/tomcat7
    do

OpenGrok script의 실행경로 변경하기

OpenGrok script는 /var/opengrok directory아래에 bin, data, ext, src가 있는 것을 가정하고 작성되어 있다. Source 경로는 별도의 directory에 보관하고 있는 것을 그대로 사용하고, bin, data, ext는 home directory에 opengrok directory 아래에 있는 것을 사용하므로, OpenGrok script를 열어서 관련 부분을 수정해 준다.

1. OPENGROK_INSTANCE_BASE

: 이 값을 기준으로 bin, data, ext, src의 경로가 기본값으로 설정되어 있으므로, 원하는 경로로 이 값을 바꾼다.

    #OPENGROK_INSTANCE_BASE="${OPENGROK_INSTANCE_BASE:-/var/opengrok}"
    OPENGROK_INSTANCE_BASE="${OPENGROK_INSTANCE_BASE:-/<YOUR_HOME_DIRECTORY>/opengrok}"

2. SRC_ROOT

: Source code는 다른경로에 있는 것을 사용하므로, SRC_ROOT를 변경한다.

    # REQUIRED: Source Code/Repository Root
    #           (your source code or the root of all repositories)
    #SRC_ROOT="${OPENGROK_INSTANCE_BASE}/src"
    SRC_ROOT="<YOUR_SOURCE_REPOSITORY_TOP>"

configuration.xml 위치 변경

web.xml에서 configuration.xml 생성위치를 변경해준다. 이 파일은 source.war안에 들어 있으므로 압축을 해제한 후 수정하고 재 압축하는 다소 번거로운 절차를 따라야 한다.

1. 먼저 source.war file의 압축을 푼다.

$ unzip opengrok/lib/source.war -d opengrok/lib/source

2. web.xml을 수정한다.

: opengrok/lib/source/WEB-INF/web.xml file을 열어서 CONFIGURATION 부분의 <param-value> 값을 우리가 사용할 etc 위치로 변경해 준다. (Line 9)

$ vi opengrok/lib/source/WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
  <display-name>OpenGrok</display-name>
  <description>A wicked fast source browser</description>
  <context-param>
    <param-name>CONFIGURATION</param-name>
    <!-- <param-value>/var/opengrok/etc/configuration.xml</param-value> -->
    <param-value><YOUR_HOME_DIRECTORY>/opengrok/etc/configuration.xml</param-value>
    <description>Full path to the configuration file where OpenGrok can read it's configuration</description>
  </context-param>

3. 다시 zip으로 압축한다.

$ zip -u opengrok/lib/source.war opengrok/lib/source/WEB-INF/web.xml 
  adding: opengrok/lib/source/WEB-INF/web.xml (deflated 80%)

Deploy with the script

이제 모든 준비가 되었으니 super user로 deploy를 실행한다.

$ sudo ./OpenGrok deploy
[sudo] password for <YOUR_ACCOUT>: 
Loading the default instance configuration ...
Installing /usr/opengrok/bin/../lib/source.war to /var/lib/tomcat/webapps ...

Start your application server (Tomcat),  if it is not already
running, or wait until it loads the just installed web  application.

OpenGrok should be available on <HOST>:<PORT>/source
  where HOST and PORT are configured in Tomcat.

Indexing

OpenGrok을 사용하려면 source code들에 대해서 indexing하는 과정을 거쳐야 하는데, source code의 크기와 PC성능에 따라 다르지만, source code가 크면 꽤 오랜 시간이 소요될 수도 있다.

$ opengrok/OpenGrok index
Loading the default instance configuration ...
  Creating default <YOUR_HOME_DIRECTORY>/opengrok/logging.properties ... 
WARNING: Can't find distribution logging configuration (<YOUR_HOME_DIRECTORY>/opengrok/bin/../lib/../doc/logging.properties) to install as default logging configuration (<YOUR_HOME_DIRECTORY>/opengrok/logging.properties)

사용

Indexing 작업이 완료된 후에는 http://localhost:8080/source 경로로 접근하면 OpenGrok을 사용할 수 있다.

OpenGrok ScreenShot

bash에서 자동완성할 때 공백 문자 들어가는 문제

언제부터 였는지는 모르겠지만, ubuntu (12.04)의 bash shell에서 자동완성을 하려고 <tab> key를 누르면 공백문자가 하나씩 추가되는 문제가 생겼다. 여러 단계로 되어 있는 file에 접근하려고 할 때 매번 <tab> key를 누르고 <backspace>로 공백문자를 지워줘야 하기 때문에 무척 불편했는데 좀 찾아보니 bash_completion file을 수정해서 이 문제를 해결 할 수 있었다.

sudo vi /etc/bash_completion
# makeinfo and texi2dvi are defined elsewhere.
for i in a2ps awk bash bc bison cat colordiff cp csplit \
    curl cut date df diff dir du enscript env expand fmt fold gperf gprof \
    grep grub head indent irb ld ldd less ln ls m4 md5sum mkdir mkfifo mknod \
    mv netstat nl nm objcopy objdump od paste patch pr ptx readelf rm rmdir \
    sed seq sha{,1,224,256,384,512}sum shar sort split strip tac tail tee \
    texindex touch tr uname unexpand uniq units vdir wc wget who; do
    have $i && complete -F _longopt -o default $i
done
unset i

1587 line의 ‘_longopt -o default‘ 부분을 다음과 같이’ _longopt -o filenames‘로 변경한 후 다시 shell을 다시 열고 사용하면 된다.

 have $i && complete -F _longopt -o filenames $i

(참조 링크)

분실한 mysql root password 재설정하기

Mysql을 처음 설치할 때 database root 계정으로 사용할 password를 설정한다. 하지만 시간이 오래 지나서 그때 설정한 password를 기억할 수 없다면 다음의 방법으로 재설정할 수 있다. (Ubuntu 12.04 기준)

Step 1. 실행중인 mysql service를 중지 시킨다.

# service mysql stop

Step 2. Password를 검사하지 않도록 mysql 환경설정 파일을 수정한다.
: /etc/mysql/my.conf file에 skip-grant-tables를 추가하면 password를 검사하지 않는다.

[mysqld]
#
# * Basic Settings
#
user         = mysql
pid-file     = /var/run/mysqld/mysqld.pid
socket       = /var/run/mysqld/mysqld.sock
port         = 3306
basedir      = /usr
datadir      = /var/lib/mysql
tmpdir       = /tmp
lc-messages-dir = /usr/share/mysql

skip-external-locking

skip-grant-tables

Step 3. 새로운 설정 값으로 mysql service를 실행한다.

# sudo service mysql start

Step 4. root 계정으로 mysql database를 연다.

$ mysql -uroot mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 37
Server version: 5.5.29-0ubuntu0.12.04.1 (Ubuntu)

Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

Step 5. root password를 재설정한다.

mysql> UPDATE user SET password=PASSWORD('ROOT_비밀번호') WHERE user='root';
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4  Changed: 4  Warnings: 0

Step 6. my.conf를 복원하고 mysql service를 재실행 시킨다. 

cannot open shared object file: No such file or directory

64bit ubuntu에서 locate 등의 명령어로 찾아보면 library가 있으나 실제로는 수행할 때 찾을 수 없다는 오류를 내면서 죽는 경우가 있다. 아래는 android build 중에 수행되는 어떤 실행 파일이 libQtGui.so.4를 찾지 못해 종료한 빌드 로그이다.

...
./bin/EXE_FILE: error while loading shared libraries: libQtGui.so.4: cannot open shared object file: No such file or directory
...

하지만 찾아보면 libQtGui.so.4는 정상적으로 있다.

HOME$ locate libQtGui.so.4
/usr/lib/x86_64-linux-gnu/libQtGui.so.4
/usr/lib/x86_64-linux-gnu/libQtGui.so.4.8
/usr/lib/x86_64-linux-gnu/libQtGui.so.4.8.1

문제는 이것들이 64bit용이고 실행파일은 32bit executable이라는 것인데 이는 file command로 알 수 있다.

EXE_FILE_PATH$ file EXE_FILE
EXE_FILE_PATH/EXE_FILE: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, BuildID[sha1]=0x39b2e75a8c8a0993f3774fa13ba55b893fa41a66, not stripped

EXE_FILE은 32bit 80386실행 파일이지만 ldd command로 검사해 보면 누락된 library들이 ‘not found’로 표시된다.

HOME$ ldd EXE_FILE_PATH/EXE_FILE
linux-gate.so.1 => (0xf7734000)
libQtGui.so.4 => not found
libQtCore.so.4 => not found
libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xf7701000)
libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xf761c000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xf75f0000)
libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xf75d2000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf7428000)
libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0xf7411000)
/lib/ld-linux.so.2 (0xf7735000)

32bit (i386)용 library를 다음과 같이 package명 뒤에 “:i386″을 붙이면 설치 할 수 있다.

$ sudo apt-get install libqtgui4:i386

의존성 있는 library들이 함께 설치되고 다시 ldd command를 실행해 보면 모든 library들이 정상적으로 찾아 지는 것을 볼 수 있다.

$ ldd EXE_FILE_PATH/EXE_FILE
	linux-gate.so.1 =>  (0xf776b000)
	libQtGui.so.4 => /usr/lib/i386-linux-gnu/libQtGui.so.4 (0xf6c80000)
	libQtCore.so.4 => /usr/lib/i386-linux-gnu/libQtCore.so.4 (0xf69a3000)
	libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xf6987000)
	libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xf68a2000)
	libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xf6876000)
	libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xf6858000)
	libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf66ae000)
	libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0xf6697000)
	libfontconfig.so.1 => /usr/lib/i386-linux-gnu/libfontconfig.so.1 (0xf6663000)
	libaudio.so.2 => /usr/lib/i386-linux-gnu/libaudio.so.2 (0xf664a000)
	libglib-2.0.so.0 => /lib/i386-linux-gnu/libglib-2.0.so.0 (0xf6551000)
	libpng12.so.0 => /lib/i386-linux-gnu/libpng12.so.0 (0xf6527000)
	libfreetype.so.6 => /usr/lib/i386-linux-gnu/libfreetype.so.6 (0xf648c000)
	libgobject-2.0.so.0 => /usr/lib/i386-linux-gnu/libgobject-2.0.so.0 (0xf643d000)
	libSM.so.6 => /usr/lib/i386-linux-gnu/libSM.so.6 (0xf6434000)
	libICE.so.6 => /usr/lib/i386-linux-gnu/libICE.so.6 (0xf641a000)
	libXi.so.6 => /usr/lib/i386-linux-gnu/libXi.so.6 (0xf640a000)
	libXrender.so.1 => /usr/lib/i386-linux-gnu/libXrender.so.1 (0xf63ff000)
	libXext.so.6 => /usr/lib/i386-linux-gnu/libXext.so.6 (0xf63ed000)
	libX11.so.6 => /usr/lib/i386-linux-gnu/libX11.so.6 (0xf62b9000)
	libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xf62b4000)
	librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0xf62ab000)
	/lib/ld-linux.so.2 (0xf776c000)
	libexpat.so.1 => /lib/i386-linux-gnu/libexpat.so.1 (0xf6280000)
	libXt.so.6 => /usr/lib/i386-linux-gnu/libXt.so.6 (0xf6224000)
	libXau.so.6 => /usr/lib/i386-linux-gnu/libXau.so.6 (0xf6220000)
	libpcre.so.3 => /lib/i386-linux-gnu/libpcre.so.3 (0xf61e4000)
	libffi.so.6 => /usr/lib/i386-linux-gnu/libffi.so.6 (0xf61dd000)
	libuuid.so.1 => /lib/i386-linux-gnu/libuuid.so.1 (0xf61d6000)
	libxcb.so.1 => /usr/lib/i386-linux-gnu/libxcb.so.1 (0xf61b5000)
	libXdmcp.so.6 => /usr/lib/i386-linux-gnu/libXdmcp.so.6 (0xf61ae000)

 

Logitech MX anywhere

노트북과 같이 딸려왔던 광마우스의 왼쪽 버튼이 눌러지지 않는 문제가 생겼다. 출장 나오면 꼭 뭐하나 문제가 생긴다니까… 이 기회에 선 정리가 필요 없는 무선 마우스로 바꿔보려고 마음을 먹었다.

구글링해서 걸린 문서들에는 ‘Logitech 무선 마우스는 linux에서 동작하지 않는다’고 적혀 있었는데 가게에 전시된 마우스들은 대부분 Logitech 아니면 MS였다.  망설이고 있었는데 상자에는 windows뿐만 아니라 맥에서도 동작한다고 적혀 있는게 아닌가! ‘설마 맥에서도 되게 해놓고 linux는 뺐겠어?’하는 생각으로 확인하는 샘치고 제일 마음에 드는 녀석으로 그냥 사왔다. 이곳은 환불 잘 되는 나라니까…

wpid-IMG_20120623_200907.jpg

PC에 있는 bluetooth를 쓰는것은 아니고 따로 수신기가 들어 있는데, USB port에 꽂았더니 아무런 추가 설정없이 잘 인식되고 잘 동작됐다. (Ubuntu 12.04)
wpid-IMG_20120623_195529.jpg

대채로 만족 스럽지만, 휙~ 휙~ 날아다니는 느낌이 나는 휠 때문에 적응하기 힘들것 같다고 생각했는데, 누군가에게 말했더니 스크롤 부분을 꾹 눌러 주었다. 아.. 휠 동작을 토글할 수 있는 거였구나..