Sep 202012
 

java로 whois 클라이언트를 하나 만들었습니다.
기존의 UNIX 환경에서 사용하던 whois와 유사한 기능으로 구현을 했습니다.

http://blog.sukmoonlee.com/jWhois/jWhois.jar

자바의 문자열이 유니코드로 처리되는 특징을 이용해서, 로컬문자로 제공되는 WHOIS 서비스를 자바의 유니코드로 변환해서 읽은 다음에 사용자의 환경에 따라서 결과를 출력하도록 되어 있습니다.
그래서 UTF-8 환경에서 다양한 WHOIS 서버의 문자를 처리해서 결과를 아래와 같이 얻을수 있습니다.
(일단 현재 버전에서는 kr과 jp만 지원합니다. 나머지 서버들은 대부분 영문으로 제공을 하더군요.)

[smlee@localhost jWhois]$ java -jar jWhois.jar --help
jWhois version 0.9.1-20120918, Copyright (C) 2012 SukmoonLee.

Usage: java -jar jWhois.jar  [OPTIONS] [QUERY]
          --version                  display version number and patch level
          --help                     display this help
          -h HOST, --host=HOST       explicitly query HOST
          -n, --no-redirect          disable content redirection
          -i, --display-redirections display all redirects instead of hiding them
          -p PORT                    use port number PORT (in conjunction with HOST)


        Report bugs to smlee@sukmoonlee.com


[smlee@localhost jWhois]$ java -jar jWhois.jar netpia.com
[Querying netpia.com]
[Redirected to whois.verisign-grs.com] - 330 msec
[Querying netpia.com]
[Redirected to whois.ibi.net] - 621 msec
[Querying netpia.com]
[whois.ibi.net] - 2177 msec
Welcome to NETPIA.COM's WHOIS Server


# ENGLISH

Registrant:
    Netpia
    Gangseo-gu 16F, WoolimBlue9 Bldg. A, 240-21, Yeomchang-dong, Seoul

    Domain Name: netpia.com
    Registrar: NETPIA.COM, INC.(http://www.ibi.net)

    Administrative Contact:
        Netpia     webmaster@ibi.net
        Gangseo-gu 16F, WoolimBlue9 Bldg. A, 240-21, Yeomchang-dong, Seoul,  KR
        +82.0236651233

    Technical Contact:
        Netpia     webmaster@ibi.net
        Gangseo-gu 16F, WoolimBlue9 Bldg. A, 240-21, Yeomchang-dong, Seoul,  KR
        +82.0236651233

     Billing Contact:
        Netpia     webmaster@ibi.net
        Gangseo-gu 16F, WoolimBlue9 Bldg. A, 240-21, Yeomchang-dong, Seoul,  KR
        +82.0236651233

     Record created on........: 31-Mar-1998 EDT.
     Record expires on........: 31-Mar-2013 EDT.
     Record last updated on...: 10-Mar-2012 EDT.

     Domain Name Servers in listed order:
     NS.NETPIA.COM      61.82.71.230
     NS2.NETPIA.COM

# KOREAN(UTF-8)

등록인:
    Netpia
    Gangseo-gu 16F, WoolimBlue9 Bldg. A, 240-21, Yeomchang-dong, Seoul

    도메인이름: netpia.com
    등록대행자: NETPIA.COM, INC.(http://www.ibi.net)

    관리담당자:
        Netpia     webmaster@ibi.net
        Gangseo-gu 16F, WoolimBlue9 Bldg. A, 240-21, Yeomchang-dong, Seoul,  KR
        +82.0236651233

    기술담당자:
        Netpia     webmaster@ibi.net
        Gangseo-gu 16F, WoolimBlue9 Bldg. A, 240-21, Yeomchang-dong, Seoul,  KR
        +82.0236651233

    과금담당자:
        Netpia     webmaster@ibi.net
        Gangseo-gu 16F, WoolimBlue9 Bldg. A, 240-21, Yeomchang-dong, Seoul,  KR
        +82.0236651233

     등록일........: 31-Mar-1998 EDT.
     사용 종료일...: 31-Mar-2013 EDT.
     최근 변경일...: 10-Mar-2012 EDT.

     네임서버 정보:
     NS.NETPIA.COM      61.82.71.230
     NS2.NETPIA.COM



Please register domain name at www.ibi.net [smlee@localhost jWhois]$ java -jar jWhois.jar netpia.kr [Querying netpia.kr] [Redirected to whois.kr] - 364 msec [Querying netpia.kr] [whois.kr] - 126 msec query: netpia.kr # KOREAN 도메인이름 : netpia.kr 등록인 : 김태영 책임자 : 김태영 책임자 전자우편 : tim@solf.co.kr 등록일 : 2007. 02. 28. 최근 정보 변경일 : 2008. 04. 12. 사용 종료일 : 2013. 02. 28. 정보공개여부 : N 등록대행자 : (주)아이네임즈(http://www.inames.co.kr) 1차 네임서버 정보 호스트이름 : ns1.uhost.co.kr IP 주소 : 202.31.186.220 2차 네임서버 정보 호스트이름 : ns2.uhost.co.kr IP 주소 : 118.129.168.68 네임서버 이름이 .kr이 아닌 경우는 IP주소가 보이지 않습니다. # ENGLISH Domain Name : netpia.kr Registrant : TAE YEONG KIM Administrative Contact(AC) : TAE YEONG KIM AC E-Mail : tim@solf.co.kr Registered Date : 2007. 02. 28. Last updated Date : 2008. 04. 12. Expiration Date : 2013. 02. 28. Publishes : N Authorized Agency : Inames Co., Ltd.(http://www.inames.co.kr) Primary Name Server Host Name : ns1.uhost.co.kr IP Address : 202.31.186.220 Secondary Name Server Host Name : ns2.uhost.co.kr IP Address : 118.129.168.68 - KISA/KRNIC Whois Service - [smlee@localhost jWhois]$ java -jar jWhois.jar netpia.jp [Querying netpia.jp] [Redirected to whois.jprs.jp] - 365 msec [Querying netpia.jp] [whois.jprs.jp] - 178 msec [ JPRS database provides information on network administration. Its use is ] [ restricted to network administration purposes. For further information, ] [ use 'whois -h whois.jprs.jp help'. To suppress Japanese output, add'/e' ] [ at the end of command, e.g. 'whois -h whois.jprs.jp xxx/e'. ] Domain Information: [ドメイン情報] [Domain Name] NETPIA.JP [登録者名] (有)ハンドインハンド [Registrant] Hand in Hand Inc. [Name Server] m1.stage21.net [Name Server] y2.netpia.ne.jp [Signing Key] [登録年月日] 2001/03/26 [有効期限] 2013/03/31 [状態] Active [最終更新] 2012/04/01 01:05:00 (JST) Contact Information: [公開連絡窓口] [名前] (有)ハンドインハンド [Name] Hand in Hand Inc. [Email] kanri-domain@netpia.jp [Web Page] [郵便番号] 242-0018 [住所] 神奈川県大和市深見西2-1-1 [Postal Address] 2-1-1, Fukami-Nishi, Yamato-City, Kanagawa [電話番号] 046-265-1700 [FAX番号] 020-4622-6502
Print Friendly
Sep 172012
 

대부분 개발자들은 개발을 하면서 HTML 파서를 각자 만들어서 사용을 하고 있습니다.
특히 검색 로봇을 만들어서 사용할 경우에는 HTML을 읽어서 파서를 만들어서 사용하는 경우가 많습니다.
그래서 저는 HTML 문법을 기반으로 하는 라인단위로 분리를 해서 사용하는 방법을 많이 사용했습니다.
(대부분 로봇을 Perl을 사용해서 만들었기 때문에 10라인 정도 되는 함수로 만들어서 잘 사용했으며, 대규모 분석시 적은 메모리로 빠른 처리가 가능합니다.)

하지만 최근 HTML 구조가 CSS 기반으로 이루어지다 보니 좀 더 복잡하게 구성되는 경우가 많습니다.
대신 HTML5의 경우에는 문서가 구조적으로 되어 있기 때문에 라인단위로 분석보다는 html을 parser해서 DOM과 같은 객체에 넣어 두고 분석을 하면 훨씬 편리하다.

물론 라인단위로 처리하거나, SAX로 처리하는 것보다 메모리나, 속도 측면에서는 문제가 많겠지만, 변경된 HTML구조에 빠르게 대응을 하고, 간단하게 개발할때에는 효과적인것 같아서 HTML parser 프로그램을 하나 소개합니다.

PHP로 되어 있으며, 간단히 라이브러리 파일만 include를 하고, 아래와 같이 사용하면 된다.
(PHP 기본 함수가 아니므로 아래 참고 URL에 있는 소스를 다운받아서 PHP 프로그램을 사용할때 추가해야 합니다.)

    include_once('simple_html_dom.php');
 
    $html = file_get_html("http://blog.sukmoonlee.com");
 
    foreach($html->find('ul') as $element) {
        foreach($element->find('a') as $e) {
            echo $e->href."\n";        
        }
    }
 
 
[smlee@localhost ~]$ php test.php
/wordpress/
/env.php
/geshi/contrib/example.php

참고URL: http://simplehtmldom.sourceforge.net/

Print Friendly
Sep 132012
 

자바를 이용해서 네트워크 프로그램을 작성하면서 자바의 데이타 형태 때문에 고생을 했다.
그래서 한번 확인을 하고 정리를 해봤습니다.

네트워크에서 받은 데이타들을 대부분 byte[]로 처리를 하고 있는데, 이를 숫자로 변환하기 위해서는 byte 2개 혹은 4개를 조합해서 사용하면 된다.

여기서 문제가 발생이 되는데, java의 대부분의 data type은 signed type으로 되어 있다.
(제가 사용하는 네트워크 데이타는 비트 단위로 연산을 하기 때문에 binary type으로 데이타를 조작을 해야 하는 경우가 대부분입니다.)

byte는 signed type으로 되어 있으며, 이를 short로 casting을 하고, << 8과 같이 연산을 하더라도 음수가 발생이 될수 있다. 이런 경우에는 (short)(byte[] & 0xFF) 형태로 먼저 & 연산을 처리후에 casting을 해서 연산을 처리하면 해결이 가능하다.
하지만 2 byte 데이타를 숫자로 변환을 하면, short type에 담을수가 없다. short type도 signed data 이기 때문에 char type 혹은 int type에 데이타를 저장해야 한다.

그래서 여러번의 테스트를 해보면서 data type을 이해를 하면서 만든 코드가 아래 1줄이다. -_-

 
int id=(int)((int)(data[0] & 0xFF) << 8) + (short)(data[1] & 0xFF);

* byte (1 byte, -128~127)
* char (2 byte, 0~65535)
* short (2 byte, -32768~32767)
* int (4 byte, -2147483648~2147483647)
* long (8 byte, -9223372036854775808 ~ 9223372036854775807)

* float (4 byte)
* double (8 byte)

참고URL : http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

Print Friendly
Sep 102012
 

예전에는 HTML 작업이 단순했지만, jQuery, Ajax등을 사용하면서 복잡한 Javascript을 많이 사용하게 되었습니다. 개발을 하게 되면 무엇보다 개발환경을 잘 파악해서 활용하는 것이 중요합니다.

대부분 작업을 Chrome에서 작업을 하면서 debug를 하지만, 브라우저 호환성을 위해서 IE에서 확인을 해야 합니다. 하지만 IE에서 debug 를 사용하게 되면 자주 응답없음 이라는 문구를 만나면서 debug를 하기 힘든 상황이 많이 발생합니다.
이런 경우에는 어쩔수 없이 원시적으로 alert() 혹은 log를 출력해서 확인을 해야 합니다.

하지만 IE에서 console.log를 사용하게 되면 오류가 발생하기 때문에 아래와 같은 방법을 사용하면 됩니다.

확인을 하고자 하는 페이지에서 F12을 눌러서 개발자 도구를 실행합니다. 그리고 스크립트 탭을 선택을 한 다음에 페이지를 재로딩을 하게 되면 console.log 를 사용할수 있으며, 해당 로그가 콘솔에 출력되는 것을 확인할 수 있습니다.

그리고 오류를 방지하기 위해서 아래와 같은 코드로 출력을 하게 되면 개발자도구가 비활성화 되었을때에도 오류를 발생시키지 않게 된다.

 
    if(typeof console != 'undefined') { console.log("debug message"); }

참고 URL : http://stackoverflow.com/questions/690251/what-happened-to-console-log-in-ie8

Print Friendly
Sep 062012
 

웹 페이지에서 서버로 부터 빠른 데이타를 수신하기 위해서 AJAX(Asynchronous JavaScript and XML)가 아닌 JSON(JavaScript Object Notation)을 많이 사용하게 된다.
보안에 문제가 발생할수도 있지만, 동일 도메인이 아닌 다른 서버로 부터 JSON 데이타를 빠르게 수신해서 처리하는 경우에 JSONP(JSON with padding)를 사용하면, 1개의 데이타를 다양한 웹서비스에서 활용이 가능하다.

원리는 아래와 같이 HTML에서 head에 JavaScript를 append 해서 해당 배열을 가져와서 처리하는 방식으로 처리를 한다.

이렇게 하면 문제는 동기화 방식으로 동작을 하기 때문에 순차적으로 데이타를 전달받게 되므로, 아래의 소스와 같이 재요청시 기존에 동작중인 쿼리를 모두 취소를 해버리면 비동기 방식의 데이타 수신이 가능하다.

데이타는 queue를 만들어서 데이타를 순차적으로 처리를 하면 하지만, 간혹 queue에 빠졌지만, callback이 여러번 발생될 경우도 있다. 이런 경우만 callback 함수에서 추가 처리만 해주면 다양한 브라우저에서 사용이 가능한 JSONP 라이브러리가 완성이 된다.

Sencha 로 프로젝트를 진행하다가 처음에 그냥 웹에 있는 소스를 참고해서 사용하다가 원하는 대로 동작을 하지 않아서 소스를 파악하고, 처리 방식을 나름대로 제정리를 해봤습니다.

참조URL: http://www.tomdupont.net/2010/12/extuxjsonp-v20.html

 
Ext.ns('Ext.ux');
Ext.ux.JSONP = (function () {
        var _queue = [];
        var _clearQueue = function () {
                if(_queue.length==0) { return; }
 
                while(_queue.length) {
                        var _current = _queue.shift();
 
                        try {
                                document.getElementsByTagName('head')[0].removeChild(_current.script);
                        } catch(err) { ; }
                }
        };
        var _lastCallback;
 
        return {
                request: function (url, o) {
                        if (!url) { return; }
 
                        o.params = o.params || {};
                        if (o.callbackKey)
                                o.params[o.callbackKey] = 'Ext.ux.JSONP.callback';
 
                        var params = Ext.urlEncode(o.params);
                        var script = document.createElement('script');
                        script.type = 'text/javascript';
                        script.charset = 'utf-8';
                        script.src = url + '?' + params;
 
                        _lastCallback = o.callback;
 
                        _clearQueue();
                        _queue.push({
                                url: url,
                                script: script,
                                callback: o.callback || function () { },
                                scope: o.scope || window,
                                params: params || null
                        });
 
                        document.getElementsByTagName('head')[0].appendChild(script);
                },
                callback: function (json) {
                        var _current = _queue.shift();
                        if (_current == null) {
                                _lastCallback.apply(window, [json]);
                                return;
                        }
 
                        try {
                                document.getElementsByTagName('head')[0].removeChild(_current.script);
                        } catch(err) { ; }
 
                        _current.callback.apply(_current.scope, [json]);
                }
        }
})();

팁으로 한글 Internet Explorer 9 에서 가끔 JavaScript를 로딩할때 배열에 있는 한글이 깨지는 경우가 발생한다.
이러한 문제를 해결하기 위해서 charset 을 꼭 선언하여 사용하는 것이 효과적이다.

Print Friendly
Plugin from the creators of Brindes :: More at Plulz Wordpress Plugins