Open Build Service를 들어보셨나요? 

Open Build Service(http://openbuildservice.org/) 일명 OBS를 간략히 소개해 드립니다. OBS는 openSUSE 프로젝트로 바이너리 패키지를 빌드하고 배포하는 범용 시스템입니다. OBS를 활용하게 되면 넓은 범위의 운영체제(Linux), 하드웨어 아키텍쳐(예:arm, i586 등)를 위한 업데이트, 추가 기능, 제품에 대한 패키지 들을 릴리즈 할 수 있습니다. 예를 들면 하나의 소스로 arm용 바이너리와 i586용 바이너리를 빌드해서 배포할 수 있다는 것이죠.



현재 오픈수세 관련 패키지들을 위해 http://build.opensuse.org 사이트에서 약 3만명의 사용자들이 140,000 패키지들을 사용하고 있다고 합니다. 그리고 TizenVideoLan과 같은 오픈소스 프로젝트의 빌드 시스템으로 사용하고 있습니다.


OBS 프로젝트의 큰 특징 중 하나는 패키지 빌드를 수행할 수 있고, 패키지의 의존성을 파악해 관련있는 패키지도 자동으로 갱신하면서 빌드를 해준다는 것입니다. 


기능적인 측면에서 보면 프로그래밍에서 협업을 하면서 가장 큰 문제가 되는 의존성에 대한 대안으로 사용할 수 있다고 할 수 있습니다. 하지만 시스템 운영 측면에서 보면 큰 단점이 하나 있습니다. 그것은 바로 부실한 메뉴얼입니다. 한마디로 맨땅에 해딩하면서 문제를 해결해야 한다는 것이죠. 물론 OBS 프로젝트는 계속 수정되고 개선되고 있지만 그에 대한 가이드나 문제가 발생했을때 해결책을 찾기란 많이 어렵습니다.


그리고 VideoLan의 경우 OBS의 frontend 서비스를 직접 만들고, backend 서비스로 OBS기능을 이용하여 서비스를 제공하는 모습이 특이했습니다. 저도 조금 더 역량을 키워 backend기능을 활용해 자신에게 맞는 frontend서비스를 구축 하고 싶네요. 




https://github.com/openSUSE/open-build-service

http://openbuildservice.org/about/

http://nightlies.videolan.org/

https://build.tizen.org/


'개발자 > Tizen Build Infra' 카테고리의 다른 글

OBS - Open Build Service 서비스 시작  (0) 2014.03.19
Posted by 빌리 :

OpenSUSE 12.1/12.3 기준

OBS(http://www.openbuildservice.org/) 서비스를 운영하기 위해선 각 컴포넌트들을 순서대로 실행하고, 다시 역순으로 프로그램을 종료해야 최대한 문제를 줄일 수 있다. 


이 중 memcache나 obs warden 컴포넌트의 경우 실행하지 않아도 OBS 실행에 지장이 없다.


서비스 시작 

rcmemcached start     # optional

rcmysql start

rcobsrepserver start

rcobssrcserver start

rcobsscheduler start

rcobsworker start

rcobsdispatcher start

rcobspublisher  start

rcobswarden start      # optional

rcapache2 start

rcobsapidelayed start


서비스 종료

rcapache2 stop

rcobsapidelayed stop

rcobswarden stop       # optional

rcobspublisher  stop

rcobsdispatcher stop

rcobsworker stop

rcobsscheduler stop

rcobssrcserver stop

rcobsrepserver stop

rcmysql stop

rcmemcached stop       # optional


서비스 상태 보기

rcmemcached status  

rcmysql status

rcobsrepserver status

rcobssrcserver status

rcobsscheduler status

rcobsworker status

rcobsdispatcher status

rcobspublisher  status

rcobswarden status

rcapache2 status

rcobsapidelayed status


'개발자 > Tizen Build Infra' 카테고리의 다른 글

Open Build Service란?  (0) 2014.03.22
Posted by 빌리 :

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

Eclipse RCP를 개발하면서 Target을 3.6 이하 버전으로 사용하다가 3.7 이후 버전을 사용하도록 변경한다면 화면 상단 툴바에 Quick Access가 무조건 나타나면서 원치 않는 UI를 노출 시키는 문제가 발생합니다.  


Quick Access 노출을 조정할 수 있는 액션이나 메뉴가 없는 상태입니다. 4.4 버전부터는 만든다는 것 같지만 현재까진 해결책이 없네요.



Quick Access를 없애기 위한 해결책을 보도록 하겠습니다. 


1. 자신의 RCP에 plugin.xml에서 다음 패키지 의존성을 추가한다.

    • org.eclipse.e4.ui.model.workbench


2. ApplicationWorkbenchWindowAdvisor.java 파일에 다음 코드를 추가한다.

package com.billy.snippet.quickaccess;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.e4.ui.model.application.ui.basic.MTrimBar;
import org.eclipse.e4.ui.model.application.ui.basic.MTrimElement;
import org.eclipse.swt.graphics.Point;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.application.ActionBarAdvisor;
import org.eclipse.ui.application.IActionBarConfigurer;
import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
import org.eclipse.ui.application.WorkbenchWindowAdvisor;
import org.eclipse.ui.internal.WorkbenchWindow;
import org.eclipse.ui.progress.UIJob;

public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor {

    public ApplicationWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {
        super(configurer);
    }

    public ActionBarAdvisor createActionBarAdvisor(IActionBarConfigurer configurer) {
        return new ApplicationActionBarAdvisor(configurer);
    }
    
    public void preWindowOpen() {
        IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
        configurer.setInitialSize(new Point(600, 400));
        configurer.setShowCoolBar(true);
        configurer.setShowStatusLine(false);

        // This code
        hideQuickAccess();
    }

	private void hideQuickAccess() {
		UIJob job = new UIJob("Hide quick access") {
			@Override
			public IStatus runInUIThread(IProgressMonitor monitor) {
				IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
				if (window instanceof WorkbenchWindow) {
					MTrimBar topTrim = ((WorkbenchWindow) window).getTopTrim();
					for (MTrimElement element : topTrim.getChildren()) {
						if ("SearchField".equals(element.getElementId())) {
							element.setVisible(false);
							element.setToBeRendered(false);;
							break;
						}
					}
				}
				return Status.OK_STATUS;
			}
		};
		
		job.schedule();
	}
    
}


아래와 같이 Quick Access가 없어진 것을 보실 수 있습니다.



샘플 프로젝트 코드는 아래에서 받으면 됩니다.

removeQuickAccess.zip


Tip


Quick Access를 지우니, Toolbar layout이 흐트러 질때는 다음을 확인합니다.

    • 기여한 Toolbar action이 'main'에 추가되었나요?


protected void fillCoolBar(ICoolBarManager coolBar) {
	IToolBarManager toolbar = new ToolBarManager(SWT.FLAT | SWT.RIGHT);
	coolBar.add(new ToolBarContributionItem(toolbar, "main"));   // main
        //coolBar.add(toolbar);
	toolbar.add(openViewAction);
	toolbar.add(messagePopupAction);
}


위와 같이 main이 아닌 Toolbar를 단순히 coolBar에 추가하게 되면, Layout이 흐트러집니다. 


Posted by 빌리 :

ACM 포커 패(Poker Hands)

2013. 8. 20. 17:14

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

ACM 8

2013. 7. 9. 16:25

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

ACM 7

2013. 7. 8. 22:57

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

파이썬에서 Proxy 설정을 이용해 URL 열기


urllib 모듈을 이용해 웹페이지를 열어야 할 때, Proxy 가 구성되어 있다면 정상적으로 동작하지 않습니다. 이때 파이썬에 Proxy를 설정하여 사용하는 방법을 설명합니다. 


설정 방법은 두 가지가 있습니다. 전체 환경변수로 선언하는 방법urllib 모듈 사용시 Proxy 직접 지정 방법으로 나뉩니다. 


먼저 환경변수로 선언하는 방법입니다. 

http_proxy 또는 ftp_proxy 라는 이름으로 환경변수를 선언합니다. 

Windows 계열일 경우 제어판의 시스템 속성에 들어가 환경변수로 위 환경변수명을 이용해 proxy를 지정해 줍니다. 


http_proxy="http://www.myproxy.com:9999"


그리고 다시 python 콘솔 프로그램을 사용하면 인터넷 관련 연결을 사용할 수 있습니다. Windows 환경에서는 cmd.exe를 실행한 후 다음 명령을 실행하면 선언된 것을 확인 할 수 있습니다.


echo %http_proxy%


두번째로 urllib 모듈에 직접 proxy 정보를 기입하는 방법입니다. 코드로 보시면 바로 이해하실 수 있습니다.


# Use http://www.someproxy.com:3128 for http proxying

proxies = {'http': 'http://www.someproxy.com:3128'}

filehandle = urllib.urlopen(some_url, proxies=proxies)

# Don't use any proxies

filehandle = urllib.urlopen(some_url, proxies={})

# Use proxies from environment - both versions are equivalent

filehandle = urllib.urlopen(some_url, proxies=None)

filehandle = urllib.urlopen(some_url)


위와 같이 proxies 변수로 proxy 정보를 선언한 후 관련 메소드 이용시에 선언한 정보를 넘겨주면 인터넷 연결을 사용하실 수 있습니다.



참고사이트


http://docs.python.org/2/library/urllib.html


Posted by 빌리 :

** 본 요약은 한빛미디어 '하이버네이트 프로그래밍' 책을 기준으로 작성되어져 있다.

** 본 설명은 바로 따라하기 하기엔 어려움이 있다. 책을 보지 않은 사람에게는 간단히 어떤 기능을 제공하는지 이해하는데 목적을 둔다.

** 하이버네이트 3.2.5.ga 버전, Ant 빌드를 기본적으로 사용한다.


9장 HQL 살펴보기

본 장에서는 HQL 사용법, 그리고 HQL과 SQL의 차이점에 대해 설명합니다. 주요 내용은 다음과 같습니다. 


- HQL 사용방법

-> 테이블의 모든 데이터 조회하기

-> 프로퍼티와 일부분 선택하기

-> HQL을 이용해 정렬 하기

-> HQL을 이용해 통계 정보 가져오기

- 네이티브 SQL 이용하기

  


HQL 사용방법


HQL을 사용할 때 반드시 데이터를 다룰 클래스를 지정합니다. Track 인스턴스의 리스트를 가져오는 최소한의 쿼리의 예시는 다음과 같습니다.


from Track

또는 

from com.oreilly.hh.data.Track


위와 같이 하이버네이트는 매핑한 클래스의 이름을 자동으로 임포트 합니다. 하지만 하나 이상의 클래스에서 동일한 이름을 사용한다면 패키지명까지 기입해서 사용합니다. 주위할 점은 위 Track은 테이블명을 지칭하는 것이 아닌 클래스이다. 


만약 동일한 이름을 가진 하나 이상의 매핑 클래스가 있습니다면 다음 방법을 이용합니다. 

  - 인스터스 이름 명시할때 전체 패키지명을 기입한다.

  - 매핑 문서에 import 태그를 사용해 한 쪽 또는 양 쪽 클래스를 대체하는 이름을 선언해야 한다.

  - 매핑 문서의 hibernate-mapping 태그 속성에 auto-impot="false"를 추가해 자동 import 기능을 중지시킨다.

  


HQL의 특징 


from 절에 인스턴스명을 넣는 방법과 유사하게, 자바의 다형성을 HQL에서 이용할 수 있습니다. 만약 다음과 같이 HQL을 작성하면 데이터베이스의 모든 객체를 가져올 수 있습니다. 


from java.lang.Object


Object는 모든 자바 객체의 부모이기 때문에, 이를 기본적으로 상속받는 모든 객체가 검색 대상이 됩니다. 인스턴스를 확장한 클래스의 부모 클래스 혹은 인터페이스로 지정하면 해당 객체를 상속/구현한 객체가 검색 대상이 됩니다. 이러한 기능은 포괄적으로 데이터를 다룰때 유용합니다. 하지만 제약이 있는데, 전체 결과에 대해 order by  절을 사용할 수 없고, 결과에 대해 Query이너페이스의 scroll() 메소드를 사용할 수 없습니다. 

 


프로퍼티 일부분만 선택해 사용하기 


기존의 HQL은 Select 절이 없고, From절만 사용해 객체 전체를 반환하는 방법만 사용했습니다. 그런데 리포트를 만들때 사용하게 된다면 특정 값만 필요할 때도 있습니다. HQL에서는 SQL의 Select 절과 같은 방법으로 프로퍼티 일부분만 가져 올 수 있습니다.  


만약 playtime이 지정한 조건보다 작은 Track의 제목만 가져오고 싶을 때 다음과 같이 작성할 수 있습니다.


select track.title

from com.oreilly.hh.track as track

where track.playTime <= :length


그리고 코드에서는 해당 쿼리가 반환하는 값은 String의 List를 반환합니다. 여기서 하나 이상의 속성 값을 가져오고 싶을 때는 어떻게 해야 할까요? 이것 또한 기존의 SQL처럼 속성값을 넣어서 작성할 수 있습니다.


select track.id, track.title 

from com.oreilly.hh.track as track

where track.playTime <= :length


위와 같이 쉼표(,)로 구분해서 프로퍼티를 나열하는 것입니다. 위 쿼리가 반환하는 값은 각 결과 값은 Object 배열을 포함하는 값입니다. 다음 코드를 보면서 어떻게 접근하는지 확인합니다. 


List titles = tracksNoLongerThan(Time.valueOf("00:05:00"), session);

for (ListIterator iter = titles.listIterator(); iter.hasNext;) {

  Object[] row = (Object[])iter.next();

  Integer id = (Integer)row[0];

  String title = (String)row[1];

  System.out.println("Track: " + title + " [ID=" + id + "]");

}


이러한 기능을 사용하는 이유는 여러 값을 다른 매핑 클래스에서 골라 가져올때 유용하게 사용할 수 있습니다. 이때 모든 객체를 가져오는 방식보다 성능에 대한 이점을 기대할 수 있다. 


반환하는 값을 특정 객체를 지정할 수 있습니다.. 만약 TrackSummary 클래스의 생성자가 id와 title 프로퍼티를 받도록 한다면 다음과 같이 쓸 수 있습니다. 


select new TrackSummary(track.id, track.title)



정렬 방법


HQL을 작성하는 법을 보면, 기존 SQL과 비슷한 문법을 확인할 수 있습니다. 정렬도 SQL과 비슷한 방법으로 order by 절을 추가해 정렬 기능을 추가할 수 있다. 다음은 샘플 코드입니다.


select track.id, track.title 

from com.oreilly.hh.track as track

where track.playTime <= :length

order by track.title desc



통계 함수 값 다루기 


리포트 관련 정보를 다루다 보면, 데이터의 개수, 평균 등의 통계값이 필요할 때가 있다. HQL에도 SQL처럼 집합 함수 기능이 있습니다. count(), min(), max() 와 같이 동일한 함수명을 이용해 집합 함수 기능을 사용할 수 있습니다.


select count(*), min(track.playTime), max(track.playTime)

from Track as track


위 결과 값은 하나의 결과만 나타나기 때문여 Query인터페이스의 uniqueResult()라는 메소드를 이용하 한 개의 열만 반환하는 메소드를 사용할 수 있습니다. 결과 값은 일부분 속성값을 가져오는 것과 같이 Object배열이 됩니다.




네이티브 SQL 쿼리를 이용하기


특정 SQL Dialect만 지원하는 HQL을 작성한다면, 데이터베이스 변경을 매우 어렵게합니다. 또는 기존 JDBC 기반의 프로젝트를 하이버네이트로 이관할 때 최소한의 작업만 하고 싶을 경우, 기존의 SQL을 재활용하고 싶을때 기존 SQL을 하이버네이트에서 사용할 수 있는 방법을 제공합니다. 


네이티브 SQL 쿼리를 사용하기 위해서는 다음 방법을 사용합니다. 

  1) 매핑 클래스내에 query 태그 대신 sql-query 태그를 사용합니다.

  2) sql-query 태그 내에 반환하려는 매핑 클래스와 클래스를 쿼리 내에서 참조 할 수 있는 별칭을 지정해야 합니다. 쿼리 내에 별칭(alias)는 모두 중괄호({})로 감싸야만 합니다. 

  

다음은 네이티브 SQL을 작성한 예입니다. 


<sql-query name="com.oreilly.hh.tracksEndingAt">

  <return alias="track" class="com.oreilly.hh.data.Track"/>

  <![CDATA[

       select {track.*}

      from TRACK as {track}

      where SECOND({track}.PLAYTIME) = :seconds

    ]]>

</sql-query>

  

네임드 파라미터의 경우 기존의 HQL에서 처럼 중괄호를 사용하지 않고 똑같이 사용할 수 있습니다.


Posted by 빌리 :