2015년 4월 16일 목요일

JSON 변환기

저작자: Yes, 상업적 이용: No, 컨텐츠 변경: No
관계형 DB 내 데이터를 이종간 호환하기 위하여 테이블별로 여러 텍스트 파일로 저장할 수도 있지만 구조화된 XML이나 JSON 형태로 저장하여 공유할 수 있다. 이런 경우, 여러 테이블의 데이터가 섞이게 되어 보기 혼란스러운 경우가 있는데 이런 구조화된 XML/JSON에서 테이블 데이터를 추출할 수 있다면 혼란을 줄일 수 있다.

이렇게 하려면 구조화된 문서에서 구조와 데이터를 분리하여 볼 수 있어야 하는데 다음 사이트에서 JSON 데이터를 이와 같이 분리하여 볼 수 있다.

www.tktools.net/j2t.html

2013년 9월 15일 일요일

내 자전거

한 여름 비 많이 오고 더웠던 것 생각하면 "올해도 가을은 없겠구나"란 생각이 들었었다. 그런데 요즘 날씨가 너무 좋다. 전형적인 가을 날씨다. 하늘은 높고 구름 한점 없고 적당히 덮고 적당히 시원하고~
"빨리 밖으로 나와 나랑 놀자~"라고 외치는 날씨다. 외면할 수 없지. 그래서 자전거를 샀다. 한 15만원 정도면 사겠지 했는데 두 배 더 들었다. 워낙 비싼 자전거들이 많아서 "그 정도면 싸네~" 라고 할 사람도 있겠지만 나한테는 좀 비싸게 느껴진다.
하지만 메탈 느낌의 진한 회색 프레임에 보라색으로 포인트를 준 것이 예뻐 보인다. 무게도 11kg 후반 정도로 무난한 것같고, 애들과 같이 탄천 자전거 도로를 따라 달리는데 페달질 할 때마다 쭉쭉 나가는 것이 마음에 든다. 큰 애가 타고 있는 접이식 자전거를 탈 때랑은 차원이 다르다. 비싼 값을 하는 듯~
탄천변 따라 한 25KM 정도 가면 한강인데 언제 한번 달려 봐야겠다.
저작자: Yes, 상업적 이용: No, 컨텐츠 변경: No

2013년 6월 8일 토요일

C++ Programming Language 4th Edition

드디어 왔다!! The C++ Programming Language 4th Edition.
한달 전쯤 Amazon에서 사전 구매신청했는데 7월달에 온다던 책이 몇 일전에 왔다. 아이 좋아라. The C++ Programming Language Special Edition을 너무 재미있게 봤는데 이 책도 너무 기대된다.
Special Edition은 단순히 언어에 대한 설명에만 치우치지 않고 설계와 개발 방법을 실무적 관점에서 제시해 주었다. 조금 과장되게 말하면 C++와 관련된 다른 서적은 읽을 필요가 없을 정도로 내용이 훌륭했다.
오랜 시간을 들여 만들어진 새로운 C++ 표준(C++11)에 대한 내용을 Creator의 시각으로 담고 있다는 것만으로도 빨리 보고 싶게 만드는 책인 것 같다.
저작자: Yes, 상업적 이용: No, 컨텐츠 변경: No

2013년 5월 26일 일요일

HttpURLConnection에서 301, 302 오류 발생 시

Redirection Exception
java.net 패키지 내 HttpURLConnection 클래스를 이용하여 HTTP로 데이터를 받을 때 HTTP_OK (200)가 아닌 HTTP_MOVED_TEMP (302), HTTP_MOVED_PERM (301) 예외가 발생할 때가 있다. 두 가지 형태로 처리할 수 있을 거 같은데 하나는 Exception을 던져 더 이상 진행하지 못하게 하는 것이고 다른 하나는 Redirect된 URL을 새로 받아 처리하는 방식이다.
Redirected URL 수용하기
Redirect된 URL을 새로 받아 처리하려면 HttpURLConnection의 헤더에서 "Location" 정보를 받아 다시 Connect 한다.
public InputStream GetHTTPInputStream(URL url) throws Exception
{
    int redirectedCount = 0;
    while( redirectedCount <= 1 )    // Redirection 1번 허용
    {
        HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
            
        httpConn.setConnectTimeout(10000);    //< 연결 제한시간(단위 : msec, 0은 무한)
        httpConn.setReadTimeout(0);           //< 읽기 제한시간(단위 : msec, 0은 무한)
        httpConn.setUseCaches(false);         //< 캐시 사용 여부 설정(기본 설정: true)

        // URL을 요청하는 방법 설정 (GET|POST|HEAD|OPTIONS|PUT|DELETE|TRACE, 기본 설정: GET)
        httpConn.setRequestMethod("GET");
        
        int resCode = httpConn.getResponseCode();

        if( resCode == HttpsURLConnection.HTTP_OK )
        {
            return httpConn.getInputStream();
        }
        // Redirection 발생하는 경우
        else if( resCode == HttpsURLConnection.HTTP_MOVED_TEMP
              || resCode == HttpsURLConnection.HTTP_MOVED_PERM )
        {
            // Redirected URL 받아오기
            String redirectedUrl = httpConn.getHeaderField("Location");
            url = new URL(redirectedUrl);
        }
        // 이외의 오류는 Exception 처리
        else
            throw new MalformedURLException("can not connect to the url [" + url.toString() + "] Code: " + resCode);
        
        ++redirectedCount;
    }
}
저작자: Yes, 상업적 이용: No, 컨텐츠 변경: No