Create TOC

2010년 1월 22일

Debian/Eclipse 실행 시 오류 수정

debian에서 eclipse 실행 시 오류가 발생할 때 수정하는 방법을 기술한다.

Integrated browser support not working

실행 시 아래와 같이 Integrated browser support not working오류 창이 발생 한다.

라이브러리가 설치되지 않아서 발생한 문제이다. 임시로 icedove 패키지를 설치하고 라이브러리를 링크한다.

$ sudo apt-get install icedove
$ $ sudo ln -s /usr/lib/icedove/libgtkembedmoz.so /usr/lib/xulrunner/libgtkembedmoz.so

eclipse 오류 창 발생

실행 시 같은 오류 창이 발생한다. 이때는 로그 파일을 읽어서 원인을 찾아야 한다.

Welcome screen 표시 오류

로그 내용이 아래와 비슷하면, Welcome screen 표시 못하는 경우이다.

!SESSION 2010-01-22 00:28:09.672 -----------------------------------------------
eclipse.buildId=M20080911-1700
java.version=1.6.0_0
java.vendor=Sun Microsystems Inc.
BootLoader constants: OS=linux, ARCH=x86_64, WS=gtk, NL=ko_KR
Framework arguments:  
Command-line arguments:  -os linux -ws gtk -arch x86_64 

!ENTRY org.eclipse.osgi 4 0 2010-01-22 00:28:14.675
!MESSAGE Application error
!STACK 1
org.eclipse.swt.SWTError: XPCOM error -2147467262
	at org.eclipse.swt.browser.Mozilla.error(Mozilla.java:1638)
	at org.eclipse.swt.browser.Mozilla.setText(Mozilla.java:1861)
	at org.eclipse.swt.browser.Browser.setText(Browser.java:737)
	at org.eclipse.ui.internal.intro.impl.presentations.BrowserIntroPartImplementation.generateContentForPage(BrowserIntroPartImplementation.java:252)
	at org.eclipse.ui.internal.intro.impl.presentations.BrowserIntroPartImplementation.dynamicStandbyStateChanged(BrowserIntroPartImplementation.java:451)
	at org.eclipse.ui.internal.intro.impl.presentations.BrowserIntroPartImplementation.doStandbyStateChanged(BrowserIntroPartImplementation.java:658)
	at org.eclipse.ui.internal.intro.impl.model.AbstractIntroPartImplementation.standbyStateChanged(AbstractIntroPartImplementation.java:249)
	at org.eclipse.ui.internal.intro.impl.model.IntroPartPresentation.standbyStateChanged(IntroPartPresentation.java:443)
	at org.eclipse.ui.intro.config.CustomizableIntroPart.standbyStateChanged(CustomizableIntroPart.java:266)
	at org.eclipse.ui.internal.ViewIntroAdapterPart$2.run(ViewIntroAdapterPart.java:74)
	at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
	at org.eclipse.ui.internal.ViewIntroAdapterPart.setStandby(ViewIntroAdapterPart.java:70)
	at org.eclipse.ui.internal.ViewIntroAdapterPart$1.propertyChanged(ViewIntroAdapterPart.java:55)
	at org.eclipse.ui.internal.WorkbenchPartReference.fireInternalPropertyChange(WorkbenchPartReference.java:374)
	at org.eclipse.ui.internal.WorkbenchPartReference.fireZoomChange(WorkbenchPartReference.java:539)
	at org.eclipse.ui.internal.PartPane.setZoomed(PartPane.java:349)
	at org.eclipse.ui.internal.PartStack.setZoomed(PartStack.java:1526)
	at org.eclipse.ui.internal.PartSashContainer.zoomIn(PartSashContainer.java:884)
	at org.eclipse.ui.internal.PartSashContainer.childRequestZoomIn(PartSashContainer.java:905)
	at org.eclipse.ui.internal.LayoutPart.requestZoomIn(LayoutPart.java:354)
	at org.eclipse.ui.internal.PartStack.setState(PartStack.java:1501)
	at org.eclipse.ui.internal.WorkbenchPage.setState(WorkbenchPage.java:3872)
	at org.eclipse.ui.internal.WorkbenchPage.toggleZoom(WorkbenchPage.java:3944)
	at org.eclipse.ui.internal.WorkbenchIntroManager.setIntroStandby(WorkbenchIntroManager.java:201)
	at org.eclipse.ui.internal.WorkbenchIntroManager.showIntro(WorkbenchIntroManager.java:136)
	at org.eclipse.ui.internal.WorkbenchWindow$20.runWithException(WorkbenchWindow.java:2182)
	at org.eclipse.ui.internal.StartupThreading$StartupRunnable.run(StartupThreading.java:31)
	at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
	at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:133)
	at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3378)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3036)
	at org.eclipse.ui.application.WorkbenchAdvisor.openWindows(WorkbenchAdvisor.java:803)
	at org.eclipse.ui.internal.Workbench$25.runWithException(Workbench.java:1361)
	at org.eclipse.ui.internal.StartupThreading$StartupRunnable.run(StartupThreading.java:31)
	at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
	at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:133)
	at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3378)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3036)
	at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2293)
	at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2198)
	at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:493)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:288)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:488)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
	at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:113)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:193)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:386)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:616)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:549)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:504)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1236)
	at org.eclipse.equinox.launcher.Main.main(Main.java:1212)

아래와 같이 실행한다.

$ eclipse -vmargs -Dorg.eclipse.swt.browser.XULRunnerPath=/usr/lib/xulrunner/

eclipse가 실행되면 Workbench아이콘을 눌러서 Welcome screen을 끄면 다음 실행부터는 오류가 발생하지 않는다.

2010년 1월 12일

Python/사진 파일의 시간을 사진을 찍은 시간으로 변경하기

사진 파일(jpg)의 시간을 사진을 찍은 시간으로 변경하는 python script. EXIF.py를 사용한다.

#!/usr/bin/python
# -*- coding: utf-8 -*-
"""jpg 파일 변경 시간을 exif 에서 읽어온 시간으로 변경한다."""
__version__ = '0.1'

import os
import sys
import time
import dircache

import EXIF

# 허가할 확장자 목록
EXTENSIONS = ('.jpg', '.jpeg')

# 사진을 찍은 시간을 얻을 필드. 처음 발견하는 필드를 사용한다.
TAGS = ['Image DateTime', 'EXIF DateTimeOriginal', 'DateTime']


def printUsing():
    """사용 방법을 출력한다.
    """
    print sys.argv[0], '<file or directory>'


def EXIFDateTime2time(exifdatetime):
    """exif의 시간 문자열을 time 값으로 변경한다.

        @param[in]  exifdatetime    시간 문자열

        @return     변환된 time 값
    """
    return time.mktime(time.strptime(exifdatetime, '%Y:%m:%d %H:%M:%S'))


def correctJPGTime(filename):
    """jpg 파일 변경 시간을 수정한다.

        @param[in]  filename    수정할 파일 이름
    """
    fnl = filename.lower()
    for ext in EXTENSIONS:
        # 파일 확장자 검사
        if fnl.endswith(ext):
            f = file(filename, 'rb')
            # exif tag를 읽는다.
            tags = EXIF.process_file(f, details=False)
            for key in TAGS:
                if key in tags:
                    # TAGS 중 처음 발견한 tag의 시간 값을 사용한다.
                    exif_time = EXIFDateTime2time(str(tags[key]))
                    statinfo = os.stat(filename)
                    if exif_time != statinfo.st_mtime:
                        # 시간이 다르면 파일 시간을 변경한다.
                        os.utime(filename, (statinfo.st_atime, exif_time))
                        print 'fix:', filename
                    break
            break


def main():
    if os.path.isdir(sys.argv[1]):
        # 주어진 인자가 디렉토리면
        for name in dircache.listdir(sys.argv[1]):
            # 디렉토리의 파일들에 대해서 수정 작업을 한다.
            # sub directory에 대해서는 아무 작업도 하지 않는다.
            fullname = sys.argv[1] + os.path.sep + name
            if os.path.isfile(fullname):
                correctJPGTime(fullname)
    elif os.path.isfile(sys.argv[1]):
        # 주어진 인자가 파일이면
        correctJPGTime(sys.argv[1])


if __name__ == '__main__':
    if len(sys.argv) < 2:
        printUsing()
        sys.exit(1)
    main()

2010년 1월 2일

GCC/target platform이 64bit 인지 확인하는 방법

gcc에서 target platform이 64bit 환경인지 확인하기 위해서 아래 매크로들이 정의되었는지 확인하면 된다3.2이상에서 확인할 수 있다검사할 64bit 가 LP64만 존재할 경우 gcc 3.4이상에서는 __LP64__매크로 정의 여부만 확인해도 된다..

__alpha__
__ia64__
__ppc64__
__s390x__
__x86_64__

예제 코드는 아래와 같다

#include <stdio.h>

int main(int argc, char **argv)
{
#if defined(__alpha__) || defined(__ia64__) || defined(__ppc64__) || defined(__s390x__) || defined(__x86_64__)
	printf("64\n");
#else
	printf("32\n");
#endif
}