정말 잘되어 있었다. 완전 강추


http://blog.beany.co.kr/archives/3198

Posted by 오달봉
,

int a=0;

a++

System.out.println(a);

이러면 a값은 당연히 1이다.

이유는 a++ 을 풀어서 얘기하자면 a = a+1;

이기 때문이다. 절대 a+1이 아니라는 것의 명심하자

그래서 한가지 재밌는것은

a = a++;
이라고 정의했을때 이 값을 찍어보면 0이 나온다. 변수대입이 먼저 이루어지고 ++연산이 일어나기 때문이다.

하지만 a = ++a;
인 경우에는 1이다. ++연산이 이루어지고 변수를 대입하기 때문이다.

가끔 이런 기초적인 것을 잊는 경우가 있으니 햇갈리지 말도록.

 

Posted by 오달봉
,

이글은 테이블 스페이스가 날아가고 해당 데이터 베이스를 복구하지 않는다는 전제하에 쓴 글이다.

안쓰는 DB서버에 실수로 테이블 스페이스 파일 (dbf파일)을 날리고 서버에서

ora-01034 ORACLE not availableORA-27101 요딴 메세지나 나온다.

아무리 개발연차가 늘어도 DB서버에서 문제가 나면 작아지는 기분이다.

방법은 이렇게

ALTER DATABASE DATAFILE '{dbf파일}' OFFLINE DROP;
ex) ALTER DATABASE DATAFILE '/home/oracle/db_files/workflow.dbf' OFFLINE DROP;

RECOVER DATABASE;

alter database open;

이런식으로

이런 후 oracle을 내렸다가 다시 올린다.

다들 알겠지만 그래도 내렸다가 올리는 법은

shutdown immediate;

startup;

이러니깐 잘 되더라~~~ ㅋㅋㅋ 

Posted by 오달봉
,

본인이 재직중인 핸디소프트에는 다양한 제품들이 존재한다. 이중 현재 회사에서 주력하고 있는 제품이 SNS인데

전부터 열풍이 불던 SNS열풍의 후광을 업고 기업 소셜네트워크 구축에 일조를 하고 있다.

그런데 한가지 아쉬운건 유용한 기사나 블로그의 주소를 붙여 넣으면 페이스북 처럼 썸내일과 기사 요약을 보여주는 기능이 누락되어 있었다. 그래서 사내 이런 기능을 요청하였는데 겁없이 간단히 구현 할 수 있을꺼란 말을 넣어버렸다. ㅜㅜ

내 생각으론 간단할꺼 같은데 실제 구현단으로 들어가면 이래저래 예외가 발생할 수 있기 때문에 많은 부분을 고려해야 할 지도 모른다. 


요딴 식으로 올렸는데 정말 구현이 쉬울지는 나도 한번 겪어봐야 알겠다는 생각이 들었다. 그래서 봄날의 오후 근처 스타벅스에 들려 노트북을 이용해 공부도 해 볼 겸 겸사겸사 한번 구현해 보기로 했다.

1. 분석

페이스북에서 제공하는 요약의 이미지는 다음과 같으며 분석해본 결과는 다음과 같다.


1. 처음에 보이는 링크는 해당 기사의 title태그를 가져와 url을 링크로 걸었다.
2. www.bloter.net은 해당 사이트의 대표 url이다.
3. 본문 내용은 해당 웹페이지에 있는 contents라는 아이디의 div내의 text를 가져왔다.
4. 좌측은 썸내일은 아이디 contents내에 있는 img태그들중 첫번째 이미지이다.

재밌는점은 해당 샘플페이지인 블로터 닷넷외에도 티스토리 이글루스 그외 언론사이트 역시 해당 룰데로 페이스 북에서 데이터를 파싱하고 있다는 점이다. (무슨 규약인지 아시는 분은 댓글 좀 부탁 드릴께요 ㅜㅜ rss관련 뭔가인가?)

 이런 전제로 내가 구현할 로직에 대해서 구체화를 하였다.

1. 아파치 common library 중 HttpClient패키지를 사용해 웹의 본문 데이터를 가져온다.
2. Jsoup으로 해당 페이지를 파싱하여, 요구사항에 언급된 내용을 데이터화한다. (물론 jsoup에서 connect메소드를 사용하여 본문 내용을 긁어 올수 있다. 걍 여러 라이브러리 써보는 연습차 1번 사항을 추가로 했다. 비효율적인거 나도 안다. ㅋㅋㅋ )

두가지 룰을 지키기로 하고, 이 포스트에서 자바 로직단 만을 보여주기로 한다. 하지만 전체적인 플로우는 다음과 같을 꺼라 생각한다.

1. 클라이언트에서 주소 붙여넣기 이벤트 혹은 url타이핑이 감지되면 ajax를 이용하여 해당 기사의 요약을 생성하는 로직을 요청(파라미터는 url)
2. 서버에서는 해당 url을 이용해 데이터를 프로세싱 결과값을 콜백(json형태로 리턴)
3. 클라이언트는 콜백받은 데이터를 이용해,  웹화면을 구성한다.

웹을 개발하는 사람들에게 1,3번은 어렵지 않은 부분으로 2번에 대해 소스코드를 구현해보자. 간단히 테스트 형태의 구조이며, 예외처리를 따로 감안하지는 않았다.

1. 먼저 이클립스를 이용해 apache common라이브러리와 jsoup라이브러리를 import한다. 내가 포함한 라이브러리는 이미지를 참고 부탁한다.(commons-httpclient-3.0.1이 실제적인 라이브러리지만 해당 jar는 logging과 codec에 대한 의존성을 가지고 있으며, jsoup은 html 파싱라이브러리이다. css 셀렉터를 활용할 수 있어, jquery에 익숙한 사람들에게는 유용한 라이브러리이다. 마치 python의 beautiful soup을 연상쾌 한다.)

 


2. 메인 함수에서 순서를 정리한다.(이미지 형태로 보여드립니다. 소스코드를 첨부하오니 복사& 붙여넣기는 하단에 첨부된 소스코드를 이용해 주세요.)

3. downloadContent 메소드는 웹에서 본문을 가져오기 위해 사용되는 메소드이며 다음과 같이 구현한다.

4.  downloadContent메소드에서 가져온 내용을 바탕으로 parseDate메소드에서 요약에 필요한 내용을 만든다. 보시는 바와 같이 jsoup은 jquery셀렉터와 같이 html엘리먼트들을 파싱해 낼 수 있다. (참고로 본문 내용을 요약한다는 가정하에 전체문장에서 100자만 짜른다. 그리고 이미지들을 다양하게 구성할 수 있어 대표이미지 하나가 아닌 배열 형식으로 전체를 저장하는 방법을 선택하였음.)

5. 이것대로 구성하여 본문을 만들면 다음과 같은 결과가 출력될 것이다.

이 데이터를 response단에 넣으면 될 것이다. 자세한 것은 첨부한 소스코드를 확인해 보길 바란다.

하나는 해당 내용에 대한 순수자바 파일이고 다른 하나는 바로 이클립스에서 넣고 확인해 볼 수 있는 이클립스 project 압축 파일이다.



ArticleTest.java


test.zip


Posted by 오달봉
,

이거 때문에 아주 밤을 샐 뻔 했다.

사내 그룹웨어 서버를 업그레이드 하면서, 타 시스템과 연계를 하는 과정에, 뷰를 생성하면서 이 해당 문제가 생겨서

대략 난감이 난무하는 멘붕 상태가 오고 말았다.

'아놔 실 시스템인데 ㅜㅜ........... 시말서 써야 하나 ㅜㅜ'

네이버님과 구글신을 검색하니 이런 말이 나온다.

뷰테이블을 생성한 권한이 없습니다. select * from user_role_privs; 쿼리로 확인 후 grant create view to
[계정명];
으로 해결하시면 그대 인생이 샤방해 집니다. *^.^*

해도 안된다. -_-;; 다른데를 검색했더니 이런 말이 나온다.

오라클이 이상한거임, 오라클을 재시작해 보셈.

아놔 해당 DB서버엔 여러가지 시스템이 물려있다. 오라클 내렸다 올리면 다른 시스템도 재시작해야 하는데~~~~

그런 시말서를 유도하는 행위는 하기 싫다.

먼저 select * from user_role_privs;로 확인해본 결과 권한은 다 있다. 심지어 DBA권한두 있었다. -_-;;

Oracle Developer에서 뷰생성 기능을 이용해 기존 뷰를 생성해 질의 테스트를 통해 무엇이 문제인가 했더니

타테이블스페이스에 있는 테이블에 대한 접근권한이 없었다.

음...... DBA권한임을 알고 그쪽 테이블 스페이스에 있는 테이블에 grant를 주지 않은 초보적인 실수를 한게

화근이었다.

자 정리해보자 위에 내용은 과감하게 무시해도 좋다.

1. 아무리 관리자 권한이 있더라도 SYNONYM을 주고자 할때는 대상 테이블 스페이스의 권한을 반드시 주는 것이
갑이다. GRANT SELECT ON [대상계정].[해당테이블] TO [권한받고자 하는 계정];

2. 이후 권한을 받고자 하는 계정에서 SYSNONYM을 생성한다. CREATE OR REPLACE SYNONYM
[권한을 받고자 하는계정].[해당테이블명] for [대상계정].[해당테이블];

3. 이후 뷰를 생성하면 제목에서 언급한 오류가 나지 않는다.

여담으로  

뷰 생성시 Oracle developer에서 뷰생성기에 질의 테스트 혹은 구문 확인 기능을 쓰면 쿼리 문법을 확인 할 수 있다.

멘붕이 난무하던 DB삽질기~~~ 끗~!!

Posted by 오달봉
,

package jeyun.test;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class TestClass {

 static String Reg(String str, String pstr) {
     StringBuffer sb = new StringBuffer();
     Pattern p = Pattern.compile(pstr);
     Matcher m = p.matcher(str);
     while( m.find() ) {      
         m.appendReplacement(sb, "");      
     }
     m.appendTail(sb);
     return sb.toString();
    }
  
 
 public static void main(String[] args) {
  String str = "<li style=\"height:100px\"><a href=http://xxx><img src='/image/list/20110325.jpg' border=0><img src='/image/list/20110325.jpg' border=0></a><p>~~~~~</p></li>";
  
  
  System.out.print( Reg(str, "<img.*?>") );
  
  
 }
 
}

Posted by 오달봉
,

아마 이 포스트는 지속적인 업데이트를 할 것 같다.

현재 나는 3Q부터 신규 게시판 개발 작업에 참여를 할 예정이다. 지금은 구상단계 (분석 및 산정에 관련하여........)

아마 개발자로써 매우 중요한 시기가 아닐까 싶다.

음........... 메신저를 프로세스화 해서 협업을 최대화 하고자 한다.

이건 내가 귀차니즘으로 넋놓고 있는 mfchat의 중요기능이기도 하다.

구상중이긴 한데 완료 되면 계속 리스트 업을 하도록 하겠다.   

Posted by 오달봉
,

음............ GIT, Mercurial이 성장해가는 이 추세에 우리회사는 국내 대세 SVN으로 형상 관리를 한다. -_-;;

svn커밋 시 아놔 SVN: Working Copy [경로명] locked 이란 기운 빠지는 로그 메시지가 나올때가 있다.

해결하는 방법은 다음과 같다.

1. clean up
업데이트 안하고 프로젝트를 방치한다던지 이런 저런 연유로 프로젝트가 꼬였을 수가 있다.
이클립스에서는 package explorer -> 해당 패키지 마우스 오른쪽 -> Team -> clean up 버튼을 이용해
시도해 보자.


이래도 안된다면 필살기를 써야 한다.

2. 파일 지우기
탐색기에서 lock이 걸린 파일의 폴더에 .svn에 들어가보자 (.svn 숨김 속성이 있으므로 탐색기에서 숨김파일 보기도 설정 해야 한다.)

해당 폴더에 .lock파일이 있는데 이놈을 지우자 아~ 지우기 전에 그 폴더에 있는 .log파일도 한번 훝어봐야 한다.
왜 익셉션이 났는지 정도는 봐주는 센스~

다음과 같이 과감히 파일을 삭제 한다.


그 후 커밋을 해보자 될꺼다. 안되면 프로젝트를 다시 체크아웃 받아야 한다. ㅜㅜ

Posted by 오달봉
,

아무래도 jsp부분만 많이 하다 보니 DB가 많이 취약 할 수 밖에 없다 ㅜㅜ

DB서버 메인보드가 고장나서 대대적으로 다른 서버를 DB서버로 바꾼 후 있던 DB들을 이관해야 하는 일이 생겼다.

물론 두가지 방법이 있을 것이다. (회사 선배가 알려줬다.)

1. 해당 DB를 SQL파일로 떠서 옮기는 방법

2.. 덤프 파일을 만들어서 옮기는 방법

일단 덤프를 뜨는게 편할 것 같아 덤프를 뜨기로 했다.

먼저 해당 DB에 대한 덤프 파일을 만든다.

 exp system/"암호" owner="덤프뜰DB유저명" file="파일이름.dmp"

이후 덤프를 넣고자 하는 오라클에서 사용자를 만든 후 덤프 파일을 업로드 하고

임포트 명령어는 다음과 같이 입력

imp system/"암호" file=./"파일명".dmp fromuser="from계정" touser="to계정" log="파일명".log commit=y
ex) imp system/database file=./xepadmin_jhj5.dmp fromuser=xepadmin_jhj5 touser=xepadmin_lim log=intra.log commit=y

위의 오라클 명령어는 오라클 계정 텔넷에서 입력하든 DBA툴을 이용하면 된다.
Posted by 오달봉
,

1. 호환성보기 가능.
IE7,8,9버전에 대한 호환성 기능을 제공한다,(멀티브라우저 작업시 유용할듯 적어도 IE간의 호환성 테스트 시에는 ㅋㅋㅋ)


2. CSS역추적 기능
CSS깨져서 답안나오는 경우 이놈으로 한번 파악해 볼수 있다.


3. 스크립트 디버깅 기능
가장 많이 활용하는 기능일 것이다.

스탭 단계를 따라가면 계속 스크립트 객체의 값을 확인 할 수 있다.

4. 네트워크 모니터
paros나 fiddler에서 하던 기능을 지원한다.


상세보기를 클릭하여 본화면......



이외에도 다양한 기능이 있으니 더 살펴보면 좋을꺼 같아

물론 IE외에 사파리나 크롬 개발자 도구 및 파이어 폭스의 파이어버그의 기능은 더~~  욱 막강하다. ㅋㅋㅋ

 

Posted by 오달봉
,