Nexus S mVoIP 사용

Posted 2011.01.07 15:26 by shinji

개인 인증 필증을 받기 위해 쓸데 없는 돈을 지불한다는 건 도저히 하고 싶지 않아 새로 추가된 mVoIP 기능을 써보려고 했다.

설정에 들어가보니 Call Settings 에 Internet call settings 가 있었다.

Use internet calling 네는 세가지 옵션이 있는데, 모든 콜을 인터넷 전화로 할 것인지, 물어볼 것인지, 인터넷 전화에 걸 경우만 할 것인지가 있다.

sip account를 아래와 같이 여러개 설정할 수 있고, Primary 로 설정된 것으로 외부로 전화할 때 사용하게 됨.

sip account 세팅된 모습


imtel.com 에서 만든 계정을 예로 들면,

Accounts 세팅에서 하단에 Add account

Accounts 세팅 상단 옵션이 하나있다.

Receive incoming calls(Reduces battery life) 체크

  • Username : <imtel 계정 이름>
  • Password : <계정 비번이 아닌 sip 연결 비번>
  • Server : sip.imtel.com
  • Set as primary account (Used for outbound calls) 체크
  • Optional settings

참고: imtel.com 같은 경우 일반 전화로 걸경우 돈을 지불해야 함.

국내 다른 인터넷 전화에 가입되어 있고 정보만 안다면 동일한 방식으로 설정하면 됨.

이제 전화기 아이콘을 누르고 전화를 걸면, 아래와 같이 Internet call 로 전화를 한다.

아래와 같이, 쓸데없는 전화 기능으로 배터리가 소모되는 것을 방지 하기 위해 비행 모드로 바꿨다.


Tag : mVoIP, NEXUS, S, 넥서스, 넥서스S, 안드로이드

Nexus S 간단 리뷰

Posted 2011.01.05 13:41 by shinji

Nexus S 가 드디어 도착!

12/16 일 오후 10시 (미국 동부 시간 오전 8시) 에 판매를 시작한다고 해서 기다리고 들어갔으나, unlock 버전은 아직 판매를 하지 않았다. 나중에 기다리다가 곧 언록 버전 판매를 시작했다. 그래서 이미 만들어준 BestBuy 계정으로 온라인 주문을 했다.

아는 지인이 있어 그 쪽 주소로 하고 $529 + $32(Sales Tax) 해서 $561 달러로 구입, 미국내 배공은 공짜다.

크리스마스와 연말이 껴있어 배송이 늦을까봐 걱정되었는데, 생각보다 일찍 받았다. 지인이 12월 22일 우체국에서 USPS 로 보냈고, 1월 3일 오후에 조회하니깐 한국 우체국에서 교환국 도착이라고 나왔다.

4일 오후에 배송 준비가 떴고, 우체국에 전화를 해서 찾으러 가겠다고 했다.



포장을 뜯으니 BestBuy 에서 패키징 나 박스가 나왔고, 그 안에 아래와 같이 조그만 Nexus S 박스가 나왔다.


 



배터리는 분리되어 있었다. 하나라 좀 아쉬운... 나머지 이어폰 및 충전기, 충전 케이블



T-Mobile SIM Card 가 있었는데, 끼워보지는 않음... --;;


적당히 세팅하고 화면을 켠모습.



콘투어 디스플레이라 불리는.. 사실 화면은 평면이지만... 나름 디자인적으로 괜잖고, 뭔가 유니크하고 특히 갤 S 와 구별되는 외형..ㅎㅎ


 

우선 간단히 만져본 결과 매우 괜잖았다. 현재 쓰고 있는 것이 HTC 디자이어인데, 역시 디스플레이는 좋은 것 같다.

신용카드 후불제 버스카드를 대본 결과, 아래와 깉이 태그가 뜨긴하는데, Unknown tag type 이란다.


 

시스템 정보

설정후 곧 업데이트가 떠서 업데이트함.


몇가지 사용기

스카이프로 영어교육을 받아서 스카이프가 잘되야 하는데, 디자이어 WiFi 테더링하고 Nexus S  로 연결해서 스카이프 통화 잘됨.

멀티터치 잘됨.

어디서 전원연결하여 충전중 멀티터치 잘안된다고 하는데, 이상없어 보임(뽑기 잘한건가?!)

마찬가지로 GPS 잘됨.

Blutooth 3.0이 아니라 다소 아쉽지만, 디자이어랑 파일전송해보니 잘됨.

Call Settings 에 SIP 계정을 설정하는 부분이 추가됨.

장점 

  • 괜잖은 디자인 - 개인적 생각, 외국애들은 싸구려 플라스틱이라고 그러던데... 디자이어 HD의 마감을 보면, 그것 보다 나음.
  • Pure Google, 진저브레드.
  • 빠른 반응 속도
  • 자이로스코프 센서, NFC 칩
  • 외부 사운드가 꽤 좋음.
  • GPS 문제가 있다고 하는데, 별로 이상없고, 일반주택 2층에서 바로 내 위치를 찾음, 디자이어(진저 커스텀 롬)의 경우 약 500M 근방으로 찍음.

단점

  • 디자이어 카메라는 화질 안좋고 느린데, 그것보다는 좋고 쓸만하지만, 디자이어 HD 보다는 화질이 별로임.
  • 전면카메라 화질 구림
  • 후면 껍데기 벗기기가 다소 어려움 --;;
  • 화면 지문 잘 묻음.
  • 뭐.. 많은 사람들이 얘기하는 SD 카드 슬롯의 부재가 있는데, 사실 디자이어 8G도 다 안쓰는 나에게는 별 문제 아님.


현재 디자이어 HD 랑 얼추 비슷한 성능인 것 같은데, 너무 큰 화면은 싫기 때문에 4인치가 적당해 보임.

디자이어 HD 의 카메라가 좀 부러움. 대신 디스플레이에 만족.




Tag : Android, NEXUS, S, 넥서스, 넥서스S

4개의 통장

Posted 2010.03.03 18:47 by shinji
4개의통장

고경호

다산북스 2009.01.10

.



네개의 통장으로 돈을 관리하는 단순하면서 강력한 방법을 쉬운 설명과 저자의 경험으로 제시하여 누구라도 쉽게 이해하고 실천할 수 있게 한다.

마인드 맵 요약

http://mind42.com/pub/mindmap?mid=5d7f9b6f-c26d-4807-a412-c04b8a49bece

 

This article was written in springnote.

서른살이 심리학에 묻다

Posted 2010.03.02 15:22 by shinji

[도서] 서른살이 심리학에게 묻다 | 김혜남 | 갤리온

 

 

 

"불행해질 권리를 요구합니다."

 

"그렇다면 나이를 먹어 추해지는 권리, 매독과 암에 걸릴 권리, 먹을 것이 떨어지는 권리, ... 온갖 표현할 수 없는 고민에 시다릴 권리도 원한다는 말인가?"

 

긴 침묵 끝에 존은 대답한다.

 

"네, 저는 그 모든 권리를 요구합니다."

 

 

 

수용소에서 이상한 일을 목도하게 되었다. 매일처럼 죽어 나가던 사람들의 숫자가 크리스마스가 다가오면서 점점 줄어들었다. 하지만 크리스마스가 지나자 사망자 숫자는 급격하게 늘어났고 얼마 뒤에는 평균치를 회복했다.

 

 

 

아직도 스스로를 무대의 주인공이라고 생각하는가?

 

 

 

'난 네가 창피해'

 

 

 

즉 멘토를 만나기 위해서는 누군가의 도움을 필요로 한다는 사실부터 인정해야 한다.

 

 

 

타인이란 아직 미처 만나지 못한 가족일 뿐이라고, ...

 

 

 

성숙한 방어 기제: 동일시, 상징화, 승화, 합리화, 대체 형성, 이타주의, ...

 

 

 

편협한 관계에 매몰되어 있는 사람들은 대부분 자신감이 부족하다. 이들은 도저히 인정할 수 없는 사람과 원만한 관계를 맺는 것을 '굴복'의 개념으로 받아들인다.

 

 

 

피해자 증후군: 나는 과거에 상처를 입었기 때문에 지금 이럴 수밖에 없어. 그러니까 너는 나를 이해하고 내가 원하는 걸 들어주어야 해.

 

 

 

정신분석적으로 이런 천사파 사람들은 '도덕적 자학증' 으로 분류된다.

 

 

 

우리는 모든 관계를 가족화시키려는 경향이 있다. '우리가 남이가' 로 시작되는 술자리의 문화는 곧이어 형님과 아우 사이로 발전하고, 음식점에 가면 종업원은 웬만하면 '언니'로, 연세가 있는 주인장은 보통 '이모'라고 부르며 친인척 관계 맺기에 정신이 없다.

 

 

 

드왈드란 정신분석가는 "환자는 언제나 옳다"라고 말했다.

 

 

 

당신은 그때 최선을 다했다.

 

 

This article was written in springnote.

보바리 부인

Posted 2010.03.02 15:22 by shinji
보바리 부인

귀스타브 플로베르 | 민희식 옮김

문예출판사 2007.06.15

 

 

 

 

 

 

 

 

 

그러나 여자는 언제나 방해 받기만 한다. 무기력해서 남이 말하는 대로 되기 쉬운 여자는 육체의 연약함과 법률상의 속박에 묶여버린다. 여자의 의지는 마치 모자의 끝으로 매놓은 베일처럼 바람 부는 대로 나부낀다.

 

'난 참 현명했어!'

그녀는 숄에 대한 일을 생각하면서 마음속으로 말했다.

 

"아가야, 안녕! 잘 있어요. 예쁜 아기, 잘 있어!"

 

그녀의 눈이 이토록 커다랗고 이토록 검고 이토록 깊숙했던 적은 지금까지 없었다. 무언가 어떤 미묘한 것이 그녀의 몸에 퍼져서 그녀의 모습을 일변시킨 것이다.

'애인이 있다! 나에게 사랑하는 사람이 있다!'

 

그녀의 영혼은 이러한 도취에 젖어서 마치 그리스 포도주 통 속에 잠긴 클라랑스 공작(에드워드 4세의 동생, 당시 영국 왕 에드워드 4세에 반란을 일으켜 사형 선고를 받았다. 그때 소원이 무어냐고 묻자 그리스 포도주 통속에 잠기고 싶다고 말했다)처럼 그 속에 빠져서 조그맣게 시들어버렸다.

 

사실 그의 머릿속에는 이러한 여자들이 한꺼번에 밀려와서 밀고 당기면서 똑같은 정도의 사랑으로 고르게 균일화된 것처럼 조그맣게 오그라져버렸다. ... '모두 거짓말투성이야.' 이것이 그의 생각을 요약한 한마디였다. 그대로였다. 쾌락이 학교 운동장에서 놀고 있는 학생들처럼 그의 마음을 마구 짓밟아버려서 이제 거기에는 푸른 풀이라고는 조금도 나지 않게 되었다.

 

딸에게 글자를 가르치려고 했다. 아직까지 공부라는 것을 해본 일이 없는 어린애는 슬픈 눈을 커다랗게 뜨고 울기 시작했다. 그래서 그는 어린애를 달랬다. 물뿌리개에 물을 담아다가 모래땅에 강을 만들어주기도 하고 쥐똥나무 가지를 꺾어 화단에 심어주기도 했다.

 

"아빠, 어서 오세요!"

베르트는 아버지가 장난을 치고 있는 줄 알고 아빠를 가만히 밀었다. 아버지는 땅바닥에 쓰러졌다.

This article was written in springnote.

Apache CouchDB

Posted 2009.08.23 04:51 by shinji

Apache CouchDB

CouchDB 란?

CouchDB 는 RDBMS가 아니다. 데이터를 행과 열에 저장하기 보다는 JSON 문서들의 집합으로 관리한다.(초기의 버전의 CouchDB는 XML을 사용했다.) 그 결과로 컬럼 기반의(column-oriented) 데이터 저장소, 예로 구글의 BigTable 같은 저장소와 자주 비교되지만 CouchDB는 컬럼 기반의 저장소가 아니다. 한 집합의 문서들은 스키마를 공유하지 않기 때문이다.

뷰 들은 함수들과 필터들의 모음으로 정의되고 MapReduce와 같이(much like MapReduce) 평행하게 계산된다. 뷰들은 일반적으로 데이터베이스에 저장되고 뷰의 인덱스는 지속적으로 업데이트된다. 비록 쿼리들에 임시적인 뷰들이 허용된다고 하더라도 말이다.

CouchDB는 REST 형태의 HTTP API 를 외부로 노출시키고 많은 이미 작성된 클라이언트들이 사용가능하다. 추가적으로 플러그인 설계구조는 다른 컴퓨터 언어들을 뷰서버로 사용을 허용하고 자바스크립트가 기본언어이며 PHP, Ruby and Python 등이 사용가능하다. 다른 언어들을 쉽게 추가될 수 있도록 지원한다.

CouchDB는 외부의 소켓서버와 JSON 기반의 프로토콜을 사용하는 뷰 시스템을 제공한다. 그 결과로 뷰 서버들은 일련의 언어들로 개발하여 구성할 수 있다.

CouchDB는 2008년 2월에 아파치 인큐베이션에 자리를 얻었고 2008년 11월에는 최상위 단계의 프로젝트가 되었다. 0.9 라는 낮은 버전에도 불구하고 이미 많은 소프트웨어 프로젝트나 웹사이트들에 사용된다. (위키피디아 CouchDB 번역)

Technical Overview

설치하기

CouchDB의 위키 설치 페이지 참조

리눅스 우분투에 설치했다면
/usr/local/bin/couchdb 라는 실행파일로 구동이나 중지를 할 수 있다.

구동/중지

/usr/local/bin/couchdb -h
명령으로 관련 옵션을 볼 수 있으며
couchdb -b 로 백그라운드 서비스로 구동하며
couchdb -s 로 상태및 PID확인
couchdb -d 로 종료시킨다.

위 명령은 couchdb 에 접근권한이 있는 리눅스 사용자로 실행해야 올바른 결과를 볼 수 있다.
보통은 couchdb 라는 계정을 만들어 사용한다.

CRUD 하기

couchdb 를 구동하면

http://localhost:5984/_utils

로 접속하여 웹콘솔을 사용할 수 있으며, 테스트케이스를 돌리거나 간단한 데이터베이스를 만들어 데이터를 넣어볼 수 있다.

참고 사이트

This article was written in springnote.

Install Ubuntu Jaunty Jackalop

Posted 2009.08.23 04:47 by shinji

Unbuntu Desktop 설치

우분투 Jaunty 설치

  1. 씨디를 굽는다. (http://www.ubuntu.com)
  2. 부팅후 설치
  3. 설치후 그래픽 카드 드라이버 설치
    sudo apt-get install envyng-core
    
  4. Daum 저장소 추가
    sudo vi /etc/apt/sources.list
    ## Daum Mirror Repository in Korea

    deb http://ftp.daum.net/ubuntu jaunty main multiverse restricted universe
    deb-src http://ftp.daum.net/ubuntu jaunty main multiverse restricted universe
    deb http://ftp.daum.net/ubuntu jaunty-backports main multiverse restricted universe
    deb-src http://ftp.daum.net/ubuntu jaunty-backports main multiverse restricted universe
    deb http://ftp.daum.net/ubuntu jaunty-proposed main multiverse restricted universe
    deb-src http://ftp.daum.net/ubuntu jaunty-proposed main multiverse restricted universe
    deb http://ftp.daum.net/ubuntu jaunty-security main multiverse restricted universe
    deb-src http://ftp.daum.net/ubuntu jaunty-security main multiverse restricted universe

    deb http://ftp.daum.net/ubuntu jaunty-updates main multiverse restricted universe
    deb-src http://ftp.daum.net/ubuntu jaunty-updates main multiverse restricted universe

    # Pidgin NateOn plugin
    deb http://ppa.launchpad.net/pidgin-nateon/ubuntu jaunty main
    deb-src http://ppa.launchpad.net/pidgin-nateon/ubuntu jaunty main

    sudo apt-get upgrade
  5. system->administration->language support(그러면 한글이 됨)
  6. JDK 설치
    sudo apt-get install sun-java6-jdk
    
  7. openoffice 메뉴에 안티알리아싱이 안되는 문제, 한글 패키지 설치시 발생.
    http://ubuntu.or.kr/viewtopic.php?p=12317 /etc/fonts/conf.d/29-language-selector-ko-kr.conf
    <!-- Turn off antialias and autohint for Korean fonts depending on pixelsize -->
    <match target="font">
    <test name="lang" compare="contains">
    <string>ko</string>
    </test>
    <test name="pixelsize" compare="more">
    <int>10</int>
    </test>
    <test name="pixelsize" compare="less">
    <int>22</int>
    </test>
    <edit name="antialias" mode="assign">
    <bool>false</bool>
    </edit>
    ...
    </match>

    antialias 부분을 true 로 함.

This article was written in springnote.

Parsing domain-specific languages with JavaCC

Posted 2009.03.04 21:15 by shinji

 

원문: http://www.guydavis.ca/log/view.jsp?id=1085

 

JavaCC 로 도메인 특정적인 언어 파싱하기

 

개요

 

나는 최근에 자바로 도메인 특정적인(domain-specific) 언어를 해석하고 값을 구할 필요가 있었다. 나는 내가 파서를 직접만드는 것은 나에게 시간 낭비라는 것을 알만큼 충분히 코딩을 경험해왔다. 간단히 구글에 검색한 결과 JavaCC라는 괜잖은 것을 발견했다. JavaCC 는 밑바닥에서 코딩하게 될 때 부닥칠 많은 에러들이 없게 문자열을 파싱하는 클래스를 생성하는 모든 힘든 일을 처리하는 자바 코드 생성기이다. 여러분이 할 모든 것은 그저 여러분이 파싱하려고하는 허용된 구문을 설명하는 문법 파일만 제공하면 된다. 이 튜토리얼은 JavaCC로 간단한 참/거짓 언어(boolean language)를 어떻게 파싱하는지 설명한다.

 

참/거짓 언어 (Boolean Language)

 

JavaCC의 사용을 설명하기 위해서 참/거짓의 구문만으로 구성된 간단한 언어의 구문을 정의해보자. 그 언어는 임의의 괄호로 중첩된 구문을 허용한다. 여기에 유효한 표현의 예들이 있다 (라인당 하나씩).

TRUE
FALSE
TRUE AND FALSE
FALSE OR TRUE
FALSE XOR FALSE
TRUE AND (FALSE OR TRUE)
TRUE AND (FALSE OR (TRUE XOR TRUE))

충분히 간단한 언어지 않은가? 한가지 까다로운 부분은 구문들을 평가할때 우선순위의 자격을 가질 순서를 결정하는 괄호를 사용하는 부분이다.

문법 정의하기

이제 우리의 새로운 참/거짓 언어에서 유효한 구문을 해석할 JavaCC 문법을 정의해보자. 먼저, grammer.jj 은 생성자와 몇몇 메쏘드들을 가지는 BooleanLogicParser 클래스를 선언한다. 이 자바 코드는 JavaCC가 코드를 생성하는 동안에 바로 넘겨질 것이다.

public class BooleanLogicParser {

private Expression rootExpr;

public BooleanLogicParser(String s) {
this((Reader)(new StringReader(s)));
}

public boolean evaluate() {
return this.rootExpr.eval();
}
}

다음은 문법에서 허용되는 키워드를 나타내는 토큰들을 정의한다. 참/거짓 언어에서는 우리는 TRUE, FALSE, AND, OR, 와 XOR 를 보게된다.

<DEFAULT> TOKEN:
{
<AND: "AND">
| <OR: "OR">
| <XOR: "XOR">
| <LPAREN: "(" >
| <RPAREN: ")" >
| <TRUE: "TRUE">
| <FALSE: "FALSE">
}

다음으로 우리는 파서가 수락할 허용된 포맷들을 선언한다. 자바 메쏘드와 비슷하게 JavaCC는 자바 코드 조각(중괄호로 감싸진)과 토큰들과 일치를 위한 정규 표현들로 구성되는 "프로덕션"을 선언한다.

먼저 우리는 최상위 계층의 parser() 프로덕션을 선언한다. 전체 명령문 문자열은 이 parse 프로덕션과 일치해야 한다. 우리의 경우에는 그것은 유효한 '파일끝' 이 따라오는 참/거짓 표현식이어야 한다.

void parse() : {} 
{
this.rootExpr = parseExpr(null) <EOF>
}

parseExr 프로덕션은 참/거짓 표현에 대한 재귀적인 일치됨이다. 괄호들의 처번째 집합에서 초기의 셋업 자바코드들 뒤에 매칭이 시작된다. (X|Y|Z) 는 정규 표현식에서 사용되는 것과 같은 형태의 선택자이다. 그래서 첫째로, 우리는 TRUE, FALSE 또는 괄호로 둘러싸이는 하위 표현을 둘 수 있다. 그 다음 선택적인 AND, OR, XOR 중 한가지의 참/거짓 연산자들 중 하나를 가진다. 마지막으로 오른쪽편에 다시 TRUE, FALSE 또는 괄호로 둘러싸이는 하위 표현을 둘 수 있다.

Expression parseExpr(Expression parent) : 
{
Expression expr = new Expression();
if (parent != null) {
parent.add(expr);
}
}
{
(
<TRUE> { expr.add(true); }
| <FALSE> { expr.add(false); }
| <LPAREN> parseExpr(expr) <RPAREN>
)
(
(
<AND> { expr.add(BooleanOperator.AND); }
| <OR> { expr.add(BooleanOperator.OR); }
| <XOR> { expr.add(BooleanOperator.XOR); }
)
(
<TRUE> { expr.add(true); }
| <FALSE> { expr.add(false); }
| <LPAREN> parseExpr(expr) <RPAREN>
)
)*
{ return expr; }
}

중괄호를 사용함으로써, 일치되는 특별한 토큰 오른쪽 다음에 오는 간단한 자바코드로 잠깐 들어갈 수 있다는 것이다. 이것은 우리가 나중에 평가하게 될 파스의 트리를 구성하도록 한다.

표현식 객체 구성하기

파서가 토큰들이 나오는 순서대로 TRUE, FALSE, 참/거짓 연산자 도는 하위 표현들을 추가하여 Expression 객체를 구성하게 된다.

public class Expression {
List pieces;

public Expression() {
this.pieces = new ArrayList();
}

public void add(Expression expr) {
this.pieces.add(expr);
}

public void add(BooleanOperator opr) {
this.pieces.add(opr);
}

public void add(Boolean bool) {
this.pieces.add(bool);
}
}

또한 연산자들을 상수로써 가지는 BooleanOperator 열거형을 정의한다.

public enum BooleanOperator {
AND, OR, XOR
}

파싱이 실행된 후에, 그 Expression 객체는 그 자신들의 조각(pieces)들의 리스트로 표현 컴포넌트들을 포함하게 될 것이다. 각각의 조각들은 아래 중 하나이다.

  1. TRUE 또는 FALSE 로 해석되어진 참/거짓
  2. AND, OR, XOR 로 해석되어진 BooleanOperator
  3. 괄호 안에서 발견된 하위표현으로 해석되어진 Expression 객체

표현식 평가하기

Expression 객체가 한 번 구성되면, 그것이 참인지 거짓인지 이제 계산되어 질 수 있다. 여기에 그것을 하는 자바코드가 있다.

  public boolean eval() {
boolean result = eval(this.pieces.get(0));
for (int i = 1; i < this.pieces.size(); i+=2) {
BooleanOperator opr = (BooleanOperator) this.pieces.get(i);
boolean evalResult = eval(this.pieces.get(i+1));
if (opr == BooleanOperator.AND) {
result &= evalResult;
}
else if (opr == BooleanOperator.OR) {
result |= evalResult;
}
else if (opr == BooleanOperator.XOR) {
result ^= evalResult;
}
}
return result;
}

private boolean eval(Object piece) {
if (piece instanceof Expression) {
return ((Expression) piece).eval();
} else if (piece instanceof Boolean) {
return ((Boolean) piece).booleanValue();
}
throw new RuntimeException("Invalid expression piece found: " + piece);
}

연습으로써, 이미 결과를 알게될 때에는 불필요한 계산을 피하기 위한 생략을 하기 위해서 eval 을 수정한다. (As an exercise, modify the eval to short-circuit to avoid unnecessary computation when the result is already known.) 예를 들면 true or X; 가 있다면 X 를 계산하는 것은 중요하지 않다.

Ant 로 빌드하기

이 튜토리얼의 예제를 실행하기 위해서는 JavaCC 코드 생성기를 구동하고 여러분 자신의 코드를 생성된 코드와 같이 컴파일하기 위해 Ant 가 필요할 것이다. 여기에 작동하는 Ant build.xml 파일이 있다.

  <target name="codegen"
depends="init"
description="Runs JavaCC code generation.">
<delete>
<fileset dir="src/ca/guydavis/javacc/codegen">
<include name="*.java" />
</fileset>
</delete>
<javacc target="src/ca/guydavis/javacc/codegen/grammar.jj"
javacchome="javacc-4.2"
debugparser="true" />
<replace token="public class"
value='@SuppressWarnings("all") public class'
dir="src/ca/guydavis/javacc/codegen/"
includes="*.java" />
</target>

경고 옵션을 켜놓은 이클립스를 사용하는 사람들을 위한 유용한 트릭은 Ant 의 replace 태스크를 사용하여 모든 생성될 자바 클래스들에 @SuppressWarnings("all") 을 추가하는 것이다. JavaCC의 코드가 여러분의 프로젝트의 표준을 따르지 않을 수 있기 때문에, 이것은 여러분들의 코드 기반에서 이클립스가 문제점을 보여줄때 그것을 무시하게 만든다.

JUnit으로 테스트 하기

JavaCC의 개발자들이 파서를 만드는 것에서 우리가 하는 것 보다 훨씬 낫다고 할지라도 그것은 우리가 그들이 생성한 코드를 테스트 할 수 없다는 것을 의미하지는 않는다. 여기에 성공적으로 파싱되고 잘못된 구문에서는 에러를 내는 우리의 테스트 경우를 확실하게 해주는 JUnit 예제 클래스들이 있다.

  private boolean parseValid(String stmt) {
BooleanLogicParser parser = new BooleanLogicParser(stmt);
try {
parser.parse();

} catch (Throwable t) {
fail("Unable to parse because: " + t.getLocalizedMessage());
}
return parser.evaluate();
}

@Test
public void parseTrue() {
assertTrue(parseValid("TRUE"));
}

@Test
public void parseFalseAndTrue() {
assertFalse(parseValid("FALSE AND TRUE"));
}

@Test
public void parseMultipleNesting() {
assertFalse(parseValid("TRUE AND (FALSE OR (TRUE XOR TRUE))"));
}

@Test(expected = TokenMgrError.class)
public void parseWrongKeywords() throws ParseException {
BooleanLogicParser parser = new BooleanLogicParser("TRUISH AND MAYBE");
parser.parse();
fail("Parsing succeeded for a malformed statement.");
}

요약

이 간단한 예제가 도메인 특정적인 언어들에 대한 파서를 빠르게 구성하기 위해 JavaCC를 사용이 강력함을 보여줬기를 바란다. 루비가 아마도 도메인 특정적인 언어(DSL)에 대해 더 나은 또 하나의 선택일지도 모르지만 만약 여러분이 자바에 빠져 있다면 JavaCC 는 필수적인 라이브러리이다.

Resources

  • Full Eclipse project with Ant build for all the code described above in a zip file.
  • JavaCC project at Java.net
  • IBM Developerworks tutorial on JavaCC

This article was written in springnote.

JavaCC [tm]: README for SimpleExamples

Posted 2009.03.02 19:38 by shinji

 

JavaCC 4.2 안의 SimpleExamples 예제의 README 파일의 번역.

 

JavaCC [tm]: SimpleExamples 에 대한 README

이 디렉토리에는 JavaCC를 사용하여 여러분이 시작할 수 있는 다섯개의 예제들이 포함된다. 각 예제는 하나의 문법파일이 아래 나열된 바대로 포함되어 있다.

Simple1.jj
Simple2.jj
Simple3.jj
Simple4.jj
NL_Xlator.jj
IdList.jj

이러한 예제들을 한번 살펴보고 이해하게 되면, 여러분은 예제 디렉토리의 다른 하위 디렉토리에 위치한 보다 복답한 예제들을 봐야 한다. 하지만 이 예제들만으로도 적당히 복잡한 문법들을 시작할 수 있을 것이다.

명령들의 요약

만약 여러분들이 어떤 파서나 문법적 분석기에 대한 전문가이고 이 예제들을 그낭 한번보는 것만으로도 이해가 된다면, 아래 명령들은 JavaCC로 어떻게 예제를 시작하는지를 나타낸다. 아래 명령들은 Simple1.jj 를 대상으로 하나 동일한 명령집합을 사용해서 어떤 파서라도 빌드할 수 있다.

  1. 파서와 문법 분석기(또는 토큰 매니저)를 구현하는 자바소스 파일의 한 다발을 생성하기 위해 문법파일을 인수로 javacc 를 실행해라

    javacc Simple1.jj
    
  2. 이제 생성된 자바파일을 컴파일 하라.

    javac *.java
    
  3. 파서가 이제 사용할 준비가 되었다. 파서를 실행해라.

    java Simple1
    

이 디렉토리의 Simple1 파서와 그 외 것들은 표준입력으로 부터 입력을 받도록 작성되었다. Simple1은 하나도 없거나 줄바꿈(line terminators)문자 또는 파일끝(end of file)문자가 뒤따라오는 좌우쌍이 맞는 중괄호들을 인식한다.

이 문법에서 유효한 문자들의 예는 아래와 같다.

"{}", "{{{{{}}}}}", 등등

유효하지 않은 문자들의 예는 아래와 같다.

"{{{{", "{}{}", "{}}", "{{}{}}", "{ }", "{x}", 등등

Simple1 에 다양한 다른 입력들을 시도해보자. <컨트롤-D>는 대개 파일끝(EOF)을 가리키는데 사용되는 것을 상기해라.(이것은 유닉스일 경우다). 여기에 몇몇 샘플 실행의 예가 있다.

% java Simple1
{{}}<return>
<control-d>
%

% java Simple1
{x<return>
Lexical error at line 1, column 2. Encountered: "x"
TokenMgrError: Lexical error at line 1, column 2. Encountered: "x" (120), after : ""
at Simple1TokenManager.getNextToken(Simple1TokenManager.java:146)
at Simple1.getToken(Simple1.java:140)
at Simple1.MatchedBraces(Simple1.java:51)
at Simple1.Input(Simple1.java:10)
at Simple1.main(Simple1.java:6)
%

% java Simple1
{}}<return>
ParseException: Encountered "}" at line 1, column 3.
Was expecting one of:
<EOF>
"\n" ...
"\r" ...

at Simple1.generateParseException(Simple1.java:184)
at Simple1.jj_consume_token(Simple1.java:126)
at Simple1.Input(Simple1.java:32)
at Simple1.main(Simple1.java:6)
%

Simple1.jj 의 자세한 설명

이것은 좌중괄호의 집합뒤에 같은 수의 우중괄호가 따라오고 그 다음에 없거나 그 보다 많은 줄바꿈(line terminators)이 오고 최종적으로 파일끝(EOF)가 오는 것을 인식하는 간단한 JavaCC 문법이다. 이 문법에서 유효한 문자열의 예는 다음과 같다.

"{}", "{{{{{}}}}}", etc.

유효하지 않은 문자열의 예는 다음과 같다.

"{{{{", "{}{}", "{}}", "{{}{}}", etc.

이 문법은 JavaCC에서 제공하는 모든 옵션들을 세팅하는 것에서 시작한다. 이 경우에서는 옵션이 그것의 기본값으로 세팅된다. 그러므로 이러한 옵션 세팅은 사실상 불필요하다. 모든 이러한 옵션세팅을 완전히 생략하거나 또는 그 보다 맣은 개별적인 옵션을 생략할 수 있을 것이다. 개별적인 옵션의 상세한 설명은 웹페이지에 있는 JavaCC 문서에서 설명되어진다.

"PARSER_BEGIN(name)" 와 "PARSER_END(name)" 둘러싸여 뒤따라오는 것은 자바 컴파일 구성단위이다. 이 컴파일 구성단위는 임의의 복잡한 것이 될 수 있다. 이 컴파일 구성단위의 유일한 제약사항은 -PARSER_BEGIN 과 PARSER_END에서 같은 인수로 사용되는- "name" 이라 불리는 클래스를 정의해야 하는 것이다. 그 이름은 파서 생성기에 의해서 생성되어지는 자바 소스 파일들의 이름 앞에 붙여지는 접두어으로 쓰인다. 그 생성될 파서의 코드는 "name" 을 불리는 클래스의 중괄호가 닫히기 전 바로 앞에 삽입될 것이다.

위의 예제에서는 생성되어질 파서인 그 클래스는 메인 메쏘드를 포함한다. 그 메인 메쏘드는 java.io.InputStream(이 경우 "System.in") 클래스를 하나의 인수로 가지는 생성자를 호출함으로써 파서 객체를 생성한다(Simple1 클래스의 객체).

메인 메쏘드는 그 후 파싱할 문법 안에 있는 논터미널 - 이 경우 "Input" - 을 호출한다. 모든 논터미널은 JavaCC 가 생성한 파서에서 같은 지위를 같고 그러므로 그것은 어떤 문법에 관해서라도 논터미널으로 파싱할 것이다.(The main program then makes a call to the non-terminal in the grammar that it would like to parse - "Input" in this case. All non-terminals have equal status in a JavaCC generated parser, and hence one may parse with respect to any grammar non-terminal.)

그 뒤에 나오는 것은 프로덕션의 목록이다. 이 예제에서는 "Input" 과 "MatchedBraces" 로 각각 정의되는 논터미널을 정의하는 두개의 프로덕션이 있다. JavaCC 문법에서는 논터미널은 (JavaCC에 의해) 자바 메쏘드로 쓰여지고 구현된다. 논터미널이 프로덕션의 왼편에 사용되면, 선언되어지는 것으로 생각되고 그 선언 문법은 자바의 것을 따른다. 오른편에서 그것의 사용은 자바에서 메쏘드를 호출하는 것과 비슷하다.

각 프로덕션 선언은 그것의 왼편에 논터미널을 정의하고 콜론이 뒤따라온다. 그 다음 중괄호안에 한다발의 선언문과 명령문들을 뒤따라오게한다. (위 예제에서 두 경우는 아무 선언이 없고 따라서 "{}" 이렇게 보인다.) 그 선언과 명령문은 생성되어질 메쏘드의 선언문과 명령문으로 생성되게 된다. 그 뒤에는 역시 중괄호로 둘러싸여지는 확장셋들이 나타난다.

JavaCC 입력 문법에서 문법적 토큰들 (정규 표현식들)은 간단한 문자들이거나(위 예제에서는 "{","}","\n", "\r" 임) 보다 복잡한 정규 표현식이다. 우리의 위 예제에서는 파일끝과 일치하는 하나의 그런 정규 표현식 "<EOF>" 가 있다. 모든 복잡한 정규 표현식들은 꺾여진괄호로 둘러싸여진다.

위의 첫번째 프로덕션은 논터미널 "Input"을 논터미널 "MatchedBraces" 와 그 뒤에 하나도 없거나 또는 그 이상 개의 줄바꿈("\n 또는 "\r")문자와 그 뒤의 파일끝문자로 확장한다.

위의 두번째 프로덕션에서는 논터미널 "MatchedBraces" 를 토큰 "{" 뒤에 부가적인(없어도 되는) 자신에게 다시 포함되게 되는 "MatchedBraces" 와 토큰 "}" 으로 확장한다. JavaCC 입력 파일에서 사각괄호 [...] 는 ... 것이 부가적인(없어도 되는) 것임을 의미한다.

[...] 는 (...)? 로 쓰여질 수 도 있다. 이 두 형태는 동일하다. 확장들에서 나타나게 될 다른 구조들은 아래와 같다.

e1 | e2 | e3 | ... : e1, e2, e3, 등등 중의 하나.
( e )+ : 하나 또는 그 이상의 갯수의 e
( e )* : 하나도 없거나 또는 그 이상의 갯수의 e

이러한 것들은 다른것들과 중첩될 수 있다는 것에 주의해라 따라서 우리는 이러한 것들을 보게될 수도 있다.

(( e1 | e2 )* [ e3 ] ) | e4

이 파서를 생성하려면 간단히 JavaCC 이 파일과 같이 실행하고 생성된 자바파일들을 컴파일 한다.

javacc Simple1.jj
javac *.java

이제 생성된 파서를 실행시킬 수 있다. 현재디렉토리가 CLASSPATH에 포함되는지 확인하고 아래 명령을 쳐라.

java Simple1

짝이 맞는 중괄호들을 연속으로 입력하고 리턴문자나 파일끝(유닉스 기계에서 컨토를-D)문자를 입력해 보자. 만약 이것이 여러분의 기계에서 문제가 생긴다면 여러분은 파일을 만들고 아래와 같이 파이프로 생성된 파서에 넘길 수도 있다.(파이프는 물론 모든 기게들에서 동작하지는 않는다. - 만약 이것도 문제라면 그냥 문법파일에서 "System.in" 을 'new FileInputStream("testfile")' 으로 바꾸고 입력할 것들을 그 파일 안에 넣어두자)

java Simple1 < myfile

짝이 맞지 않는 중괄호나 공백문자 또는 중괄호들 사이에 리턴문자나 그외 다른 문자들 같은 유효하지 않는 입력도 시도해보자. 그 결과로 파서에 의해 에러메세지가 출력될 것이다.

Simple2.jj 의 상세 설명

Simple2.jj 는 중괄호 사이에 공백문자를 허용하게 하는 작은 수정을 Simple1.jj 로 부터 했다. 이제 아래와 같은 입력은

"{{  }\n}\n\n"

유효하다.

Simple2.jj을 열어서 살펴보자. 첫번째로 우리는 옵션을 생략했다. 이것은 Simple1.jj 에서 모두 기본값으로 설정했으므로 아무런 변화도 주지 않는다.

Simple1.jj 와 다른 차이는 이 파일에는 "SKIP" 으로 시작하는 영역에 어휘적인 정의(lexical specification)가 추가된다. 이 영역에는 4개의 정규 표현식이 있다. - 공백, 탭, 새줄, 리턴. 이것은 이러한 정규 표현식과 일치하는 모든 것은 무시되어진다.(파싱에서 고려되지 않는다.) 그러므로 몇개라도 이러한 4문자중 하나가 나타나던지간에 그냥 지나친다. SKIP 에 추가로 JavaCC는 3개에 다른 어휘적인 정의 영역을 가진다. 그것은 아래와 같다.

. TOKEN:         이것은 어휘적인 토큰을 정의하는 사용한다.(다음번의 예제를 살펴봐라)
. SPECIAL_TOKEN: 이것은 파싱하는 동안에 무시될 어휘적인 토큰들을 정의하는데 사용된다.
이 경우 SPECIAL_TOKEN은 SKIP과 같겠지만, 이러한 토큰들은
적절히 처리하기 위해 파서의 액션들 안에서 복구되어질 수 있다.
. MORE: 이것은 토큰의 부분을 정의한다. 완전한 토큰은 MORE 와 뒤따르는
TOKEN 또는 SPECIAL_TOKEN으로 구성되어 진다.

이 어휘적인 정의 영역에 대한 사용법의 예는 자바 문법같은 보다 복잡한 문법을 보기 바란다.

여러분은 Simple2를 빌드하고 생성된 파서를 키보드 같은 표준입력으로 실행할 수 있을 것이다.

여러분은 또한 다양한 디버그 옵션을 켜서 파서를 생성하여 어떻게 출력되는지 볼수 있다. 그렇게 하려면 아래와 같이 해라.

javacc -debug_parser Simple2.jj
javac Simple2*.java
java Simple2

그리고 아래와 같이 쳐라.

javacc -debug_token_manager Simple2.jj
javac Simple2*.java
java Simple2

토큰 매너저는 아주 많은 디버깅 진단 정보를 생성하는 것에 주의하고 그것은 주로 하나의 토큰을 차례로 디버그하기 위해 사용된다.

Simple3.jj 의 상세 설명

Simple3.jj 는 세번째 그리고 이 중괄호 짝검사기의 마지막 버전이다. 이 예제는 어휘적인 토큰들을 정의하는 TOKEN 영역의 사용을 보여준다. 이 경우 "{" 와 "}" 는 각각 LBRACE 와 RBRACE로 이름지어진 토큰으로 정의된다. 이러한 이름표는 (예제에 있는 바와 같이)꺾여진 괄호안에서 그 토큰을 참조하기 위해 사용되어질 수 있다. 주로 식별자나 문자열같은 복잡한 토튼들에 그런 토큰 정의가 사용된다. (이전 예제에서) 간단한 문자의 토큰들은 그냥 둔다.

이 예제는 문법 프로덕션에서 또한 액션들의 사용을 보여준다. 이 예제에 포함된 액션들은 매치되는 중괄호의 수를 센다. "count" 과 "nested_count" 변수들의 선언하기 위해 선언영역의 사용을 주시해라. 논터미널 "MatchedBraces"이 어떻게 그자신의 값을 함수의 반환값과 같이 반환하는지 또한 주시해라.

NL_Xlator.jj 의 상세 설명

이 예제는 JavaCC 문법 파일에서 정규 표현식을 보다 깊이 사용한다. 그것은 또한 문법으로 설명된 표현식들을 영어로 해석하게하는 약간 복잡한 액션들의 집합으로 표현한다.

위 예제의 새 개념은 보다 복잡한 정규 표현식을 사용하는 것이다. 그 정규 표현식은 아래와 같다.

< ID: ["a"-"z","A"-"Z","_"] ( ["a"-"z","A"-"Z","_","0"-"9"] )* >

ID라는 이름의 새로운 정규 표현식을 생성한다. 이것은 단순히 <ID>로 문법의 어느곳에서라도 참조될 수 있다. 그 뒤의 사각괄호로 된 것은 허용되는 문자들의 집합이다. - 이 경우 그것은 어떠한 소문자나 대문자와 밑줄문자가 된다. 그 뒤에는 하나도 없거나 그 보다 많은 수의 소문자, 대문자, 숫자, 밑줄문자가 올 수 있다.

정규 표현식에서 나타날 수 있는 다른 구성은 아래와 같다.

( ... )+ : 하나 또는 보다 많은 수의 ...
( ... )? : 부수적인(없어도 되는) ... (이 경우에는, (...)? 와 [...] 는 동일하지 않음에 주의해라.)
( r1 | r2 | ... ) : r1, r2, ... 중에 아무거나

[...]형태의 구성은 ... 에 정의된 문자들과 매치되는 패턴이다. 이러한 문자들은 개별적인 문자들이거나 범위를 가지는 문자이다. 문자구성 앞에 "~"것이 붙으면 그것은 "..." 로 정의된 것에 포함되지 않는 모든 문자와 일치되는 패턴이다. 그리하여

["a"-"z"] 모든 소문자와 일치되고
~[] 는 모든 문자와 일치되고
~["\n","\r"] 는 새줄문자를 제외한 모든 문자와 일치된다.

정규 표현식이 확장영역에 사용되면 그것은 "Token" 형태의 값을 가진다. 이것은 생성되는 파서 디렉토리에 "Token.java" 파일을 생성한다. 위 예제에서는 우리는 "Token" 형태의 변수를 정의했고 그것을 정규 표현식의 값으로 할당했다.

IdList.jj 의 상세 설명

이 예제는 SKIP 정의의 중요한 속성을 설명한다. 주요한 이해의 포인트는 SKIP 정의에서 정규 표현식은 *토큰들 사이에서* 무시될 뿐 *토큰들 안에서*는 무시되지 않는다. 이 문법은 그 사이에 공백들이 있는 식별자들의 연속입력은 받아들인다.

이 문법에 대해 유효한 입력은 아래와 같다.

"abc xyz123 A B C \t\n aaa"

왜냐하면 어떠한 수의 SKIP 정규 표현식이든지 연속적인 <Id>의 사이에서는 그것이 허용되기 때문이다. 하지만 아래는 유효한 입력이 아니다.

"xyz 123"

"xyz"뒤의 공백 문자는 SKIP 영역이고 그리하여 하나의 토큰이 끝나고 또 다른 토큰이 시작되도록 하기 때문이다. 이것은 "123"이 분리된 새로운 토큰으로 만들기 때문에 문법에 맞지 않는다.

만약 <Id> 에서 공백들이 올바르게 하도록 하려면, 해야할 한가지는 Id의 정의를 아래와 같이 바꾸는 것이다.

TOKEN :
{
< Id: ["a"-"z","A"-"Z"] ( (" ")* ["a"-"z","A"-"Z","0"-"9"] )* >
}

TOKEN 정의에 있는 공백문자는 SKIP 정에에서 공백이 쓰이지 않는것을 의미하지 않음에 주의해라. 이 모든것이 의미하는 것은 어떠한 공백이든지 <Id>와 일치하기 위해 참여하는 식별자의 안에서는 나타날 수 있고, 반면에 모든 다른 공백들은 무시될 것이라는 것을 의미한다. 보다 상세한 일치 알고리즘은 JavaCC 문서에 설명되어 있다.

결론적으로 제공되면 안되는 공백문자같은 문자를 그 자신이 가지는 토큰을 정의 해도 된다. 위 예제에서 만약 <Id> 가 어휘적인 토큰이 아닌 문법 프로덕션으로 아래와 같이 정의되었다면, 그때는 "xyz 123" 는 문법으로 (잘못된) <Id>로 인식되어졌을 것이다.

void Id() :
{}
{
<["a"-"z","A"-"Z"]> ( <["a"-"z","A"-"Z","0"-"9"]> )*
}

논터미널 Id 에 대한 위의 정의는 하나의 문자토큰들의 연속적인 구성일 뿐임에 주의하고( <...>들의 위치를 주시해라), 그러므로 공백문자는 이러한 문자들 사이에 놓여질 수 있다.

This article was written in springnote.

OpenSUSE 11.1 설치

Posted 2009.02.16 20:12 by shinji

우분투가 데스크탑이 불안정해서 OpenSUSE 로 바꾼다.

 

ftp://ftp.daum.net/opensuse/distribution/11.1/iso/

원하는 이미지를 다운로드한다. 

openSUSE-11.1-DVD-x86_64.iso 를 선택했다. 작업PC 는 DELL OPTIPLEX 330 이다.

 

이미 리눅스 배포본이 깔려있으므로 grub 를 조금 수정해서 네트워크 모드로 깐다.(사실 DVD롬이 뻑난건지 DVD 를 굽다가 마지막에 계속에러가 났다.)

/boot/grub/menu.lst

 

title   Install OpenSUSE
    root (hd0,5)
    kernel /openSUSE-11.1-DVD-x86_64/boot/x86_64/loader/linux root=UUID=82c5e47e-82c7-478c-80e3-5d875685d775 ro
    initrd /openSUSE-11.1-DVD-x86_64/boot/x86_64/loader/initrd

그럽 메뉴를 수정하고 아래와 같이 재설치함.

/usr/sbin/grub-install /dev/sda

 

네트워크로부터 설처를 선택, 사실은 DVD 를 풀어서 하드로부터 설치하려했지만, 파일의 키?!가 맞지 않아서 실패 그냥 네트워크로 설치함.

설치가 무난히 됨, Gnome 를 우분투에서 써와서 그대로 Gnome 기본으로 설치함.

 

  1. ATI 드라이버를 원클릭으로 설치함.

    http://en.opensuse.org/ATI#1-click_install_for_openSUSE_11.1.2C_11.0_and_10.3

    위 ATI 드라이버를 설치해야 할지는 모르겠다. 내경우는 다 잘되었는데, 모니터의 중앙이 맞지 않아서 드라이버 문제인가했는데, 모니터의 Factory Reset 를 하니까 화면을 다시 중앙으로 맞추어졌다.

  2. java 개발환경설치

    http://en.opensuse.org/Java

    NON-OSS 저장소 추가

    ftp://ftp.daum.net/opensuse/distribution/11.1/repo/non-oss

  3. Eclipse

    use yast 로 검색해서 설치한다, 하지만, 해당 버전은 버전도 약간 낮지만, 플러그인들이 제대로 있지 않아서

    eclipse 사이트에서 tar 파일을 다운받아 로컬에 따라 설치하고 바탕화면에 링크를 만든다.

  4. Virtual box, 먼저 pam-devel 을 설치해야함.

    http://www.virtualbox.org

    오픈수세 버전의 rpm 으로 최신버전 설치, yast 로 설치하면 최신버전도 아닐뿐더러 설치후 구동이 제대로 되지 않았다.

    VirtualBox-구동에러

  5. (OFFICE) 주요 네트워크 디렉토리 마운트 정보를 /etc/fstab 에 넣기.

    smbfs 대신에 cifs 로 했다.

  6. maven, ant

    soonoh@eng-edan:/nerv/soonoh/picsel/conductor-content-phase-1a-august07/j2se/image-toolkit> mvn clean:clean install
    /usr/lib64/jvm/java-1.6.0-sun-1.6.0/bin/java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory

    위 에러발생시 jdk 다시 설치, 의존성 충돌에서 x86_64 로 통일.

  7. Oracle XE

    See: http://shogi-software.blogspot.com/2008/01/installing-oracle-xe-on-opensuse-linux.html

    download:http://www.oracle.com/technology/software/products/database/xe/htdocs/102xelinsoft.html

    install oracle-xe-univ-10.2.0.1-1.0.i386.rpm

    설치는 성공하지만, SQL

    sudo /etc/init.d/oracle-xe configure

    Specify the HTTP port :8888

    Specify a port : 1521

    Specify a password to be used for database accounts. (SYS,SYSTEM): password

    Do you want Oracle database to be started on boot? [y,n]: n(주의: 여기서 N을 하면 오라클이 제대로 기동안된다, 무조건 y를 하고 나중에 설정을 조정하던지 하자)

    http://127.0.0.1:8888/apex

    SQL 명령행을 실행하고

    connect system/password

    oracleXE: error while loading shared libraries: libaio.so.1: cannot open shared
    object file: No such file or directory
    ERROR:
    ORA-12547: TNS:연결이 끊어졌습니다.

    libaio-32bit 를 설치한다.

  8. The Terminstor, 터미네이터, 분할 가능한 터미널 프로그램.

    http://www.tenshu.net/terminator/

    홈페이지에 가보니 ubuntu 패키지만 제공하고 OpenSUSE 는 없다, 그럼, OpenSUSE 의 빌드서비스를 이용해본다.

    http://blog.obbli.net/tag/RPM%EC%A0%9C%EC%9E%91

    또는 alien 을 설치해서 deb 을 rpm 으로 바꾼다.

    설치는 잘된다. 하지만 python import 에러가 나서 아래와 같이 환경변수를 추가해줘야 한다.

    cat /etc/bash.bashrc.local
    export PYTHONPATH=$PYTHONPATH:/usr/share/pyshared

  9. NateOn, 네이트온

    설치하려면 의존성 에러가 난다.

    kdelibs3, kdelibs3-arts 먼저설치한다.

    nateon-1.0-20080814rev183.x86_64.rpm 를 설치함. opensuse 는 64 비트 버전이 없어서 페도라10의 것을 설치함.

 

스크린샷

opensuse11.1-screenshot-0213.png

This article was written in springnote.

« PREV : 1 : 2 : 3 : 4 : ··· : 16 : NEXT »