소액결제 등쳐먹는 쌩양아치 in-girl.net

뜬금없이 소액 결제 되었다고 문자가 왔다.
kt 114로 전화 해서 취소 해 달라고 요청 하고
조금 전에 취소 되었다고 연락이 왔다.

홈페이지 들어갔더니만
완전 허접 -_-
injection 대비도 없고
자동결제 취소는 그냥 alert만 띄우고 끝이고
회원가입시 id 중복도 없고 연락처도 안받는데 어떻게 자동 결제가 되나?
아 이 쌩 양아치 새키들 때문에 기분만 잡치네.
아오 빡쳐.

Posted by SADBLUE

2014/01/10 14:45 2014/01/10 14:45
Response
0 Trackbacks , 0 Comments
RSS :
http://sadblue.com/rss/response/430

Trackback URL : http://sadblue.com/trackback/430

강남척카이로의원 치료 체험기.

솔직히 권하고 싶지 않다.
도수치료는 잘 모르겠다. 그런식의 치료는 받아본 기억이 없어서.
다만 재활 운동은 정말 비추하고 싶다.

환자의 상태는 고려 하지 않은 무조건적인 메뉴얼대로의 운동 지시
무조건 운동 종류별로 10분씩이다 -_-

덕분에 첫 운동을 하고 일주일간 허리가 좌.우로 돌아가질 않아서 고생 했다.
오랜만에 운동을 해서 그러려니 하고 운동 다음날 침맞고 했었다.
두번 째 운동 후 거의 보름동안 허리가 좌.우로 돌아가질 않음 -_-
미치는 줄 알았다.
어떤 운동이 허리에 부담을 가게 하는지 파악하고 아예 빼고
시간 조절 한 후 그런 증상이 사라졌다.

그리고 2주 전. 이직 전에 주중에 한번 갔는데 오랜만에 왔음에도 불구하고
운동량을 늘리더라.
머 운동량이 늘어도 당장 증상이 나타나진 않기에 -_-
별 무리 없이 소화 했으나 다음날 아킬레스건염 발병 -_-
물론 이게 누적되어 있다가 재활 운동을 계기로 나타난것 같긴 한데
아 통증도 심하고 걷기도 힘들고 개고생중이다 -_-

이젠 안갈거다 그 병원.

Posted by SADBLUE

2013/09/14 21:04 2013/09/14 21:04
Response
1 Trackbacks , 0 Comments
RSS :
http://sadblue.com/rss/response/427

Trackback URL : http://sadblue.com/trackback/427

Trackbacks List

  1. 유익한 IT SNS 뉴스

    Tracked from 유익한 IT SNS 뉴스 2023/05/28 21:49 Delete

    As if nothing had happened...

iscroll one wraper multi scroller

iscroll의 경우 내부에서 wrapper내의 무조것 첫 child만을 선택하도록 되어 있다.
(2013.02.14 iscroll4 기준)
강제로 생성자에 인자를 하나 추가 하여
muti child의 경우에 해당 index를 선택 할 수 있게 수정 했다.
어찌 됐건 iscroll객체를 child수만큼 생성해야 하는 것은 변함 없다.

ps. 그리고 margin이나 padding이 있을 경우 이 높이를 계산 못하는 것처럼 보여진다.

Posted by SADBLUE

2013/02/14 21:36 2013/02/14 21:36
,
Response
0 Trackbacks , 0 Comments
RSS :
http://sadblue.com/rss/response/420

Trackback URL : http://sadblue.com/trackback/420

아오 듣보잡 기자색히가.

http://frontiertimes.co.kr/
웃기지도 않아.
호스팅 회사에 문의 할게 있어서 전화 했으면
곱게 상담이나 할것이지
상담한다고 id물어본게 개인정보 유출? 풉.
ㅈㄹ 한다.
듣보잡 언론사주제에.
전화한놈 누군지 모르겠으나
그딴 마인드로 세상살려니 참 편하고 좋것네.

Posted by SADBLUE

2012/08/01 11:59 2012/08/01 11:59
Response
0 Trackbacks , 0 Comments
RSS :
http://sadblue.com/rss/response/412

Trackback URL : http://sadblue.com/trackback/412

아옭. 디런 ie6!!

HTML 4.01에서는 form tag에 target속성이 없어졌다고 한다.
덕분에 개삽질!!
파폭 같은 다른 브라우져는 다 되는데 ie6에서만 안된다. -_-
dom create또는 target을 미리 선언한 form에
hidden에 값을 설정 해주고
submit을 했는데 값이 안넘어감..Orz..
이걸로 몇 시간을 낭비 했던가..
걍 get으로 넘길걸...ㅠ_ㅠ
여튼 -_- 디런 ie6.

Posted by SADBLUE

2012/04/25 10:53 2012/04/25 10:53
, ,
Response
0 Trackbacks , 0 Comments
RSS :
http://sadblue.com/rss/response/406

Trackback URL : http://sadblue.com/trackback/406

CI 1.7에서 2.0으로 옮기기.

1. URI
    1) REQUEST_URI 의 값이 "/" 일경우 예외처리가 되어 있지 않음.

    2) $_SERVER변수에 SCRIPT_NAME 값이 없을 경우 예외 사항이 적용되어 있지 않음.

2. CI Class 확장해서 사용하던 MY_ Class들.
    이 클래스들이 전부 application_dir/core 밑으로 옮겨져야 함. (자신이 만든 것 제외)
    2.0 메뉴얼에는 core class확장에 model이 빠져 있으나 기존과 동일하게 사용가능.

3. CI기본 Class확장시 Class 이름이 모두 CI_라는 접두어를 붙여야 함.

음...옮기면서 이것저것 삽질 했다라고 생각 했는데...
정리 하니 몇 개 안되네...-_-;

Posted by SADBLUE

2011/02/04 01:46 2011/02/04 01:46
, ,
Response
0 Trackbacks , 0 Comments
RSS :
http://sadblue.com/rss/response/362

Trackback URL : http://sadblue.com/trackback/362

내 책상 사진.

맨보드 고장인줄 잘못 알아서...
시스템 들어냈다가.
PC안에 먼지가 다 튀어 나오는 바람에.-_-;;
일주일 동안 회사 일이 바빠서 사당에서 출퇴근 하니라...
청소를 전혀 못하고 있었기에...
추운 날 창문 다 열어 놓고 청소 했다.-_-
그래서 기념으로.-_-;;

사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
맨 왼쪽 위부터 시계방향....
여신님, (러프, 미소라 캇츠, 아기와나 3권-_-), H2
(Hollic XXX, 블랙라군, 최종병기그녀), 원피스, (터치, 카오리유키 동화씨리즈, 아다치 숏프로그램3권, Girls Type)
슬램덩크 완전판, 원피스, (크로스게임, QnA)
(어쩐지저녁, 아일랜드, 타임시커즈, 쵸비츠, 쵸비츠엽서), 하가렌, 라그나로크
사진엔 짤렸지만..
맨 왼쪽 아래엔.
천사금렵구, FSS 가....-_-;

사용자 삽입 이미지
지금까지 모은 음악 씨디들.
100장 좀 넘네.-_-;

아..외풍 너무 심하네...어여 창문을 틀어막아야지..ㅠ_ㅠ

Posted by SADBLUE

2010/11/27 18:31 2010/11/27 18:31
Response
0 Trackbacks , 0 Comments
RSS :
http://sadblue.com/rss/response/353

Trackback URL : http://sadblue.com/trackback/353

망할 ie box model.

ie 씨리즈에서는 padding이건 margin이건 height 로 지정된 영역으로 계산한다.
그러나 다른 브라우져들은 padding이건 margin이건 height외에 추가로 계산을 한다.
이로 인해서 table에 padding을 쓰게 되면
ie는 제대로 적용되질 않는다.
따라서 td안에 block style의 tag를 이용해서 맞춰주는 수 밖에 없다.
아오!

Posted by SADBLUE

2010/11/01 20:06 2010/11/01 20:06
Response
0 Trackbacks , 0 Comments
RSS :
http://sadblue.com/rss/response/349

Trackback URL : http://sadblue.com/trackback/349

ie6 ul tag overflow 버그

ie6에서 상위 태그에 width가 없이
width:100% 속성을 갖는 ul태그가 들어가면
화면이 제대로 안나올 수 있다.
ie6 only라고 구글에서 나온다. 미친 ie6!!!

Posted by SADBLUE

2010/08/09 14:50 2010/08/09 14:50
Response
0 Trackbacks , 0 Comments
RSS :
http://sadblue.com/rss/response/324

Trackback URL : http://sadblue.com/trackback/324

sadblue.com 등록 완료.

장삿꾼들이 소유하고 있던 sadblue.com을 가비아 낙장 서비스를 이용해 구입 했다.
운이 좋았던거겠지.?
sadblue.com
sadblue.net
sadblue.org
위의 3개 도메인 보유-_-v

Posted by SADBLUE

2010/06/23 18:50 2010/06/23 18:50
, , ,
Response
0 Trackbacks , 0 Comments
RSS :
http://sadblue.com/rss/response/305

Trackback URL : http://sadblue.com/trackback/305

자전거 타고 모란역 가기.

일요일.
날씨.. 구름이 좀 있긴 하지만 자전거 타기엔 좋을거 같단 생각에
과감히 이사가기로 한 모란역까지 자전거를 타고 가보까 하는 생각에 자전거를 타고 나갔다.
손저림이 없다는 에르곤 그립으로 바꾼기념이기도 했고...
후후...
타기 시작한지 20분만에 소나기가 내리고.-_-
출발할때에 챙긴 500mm게로레이 두개에.
1시간동안 비 피한다고 마신 5800원짜리 스무디 값이 아까워서.
끝까지 가보기로 했다.-_-

어허허...진짜...내가 즈질 체력임을 온몸으로 다시금 느꼈다-_-
갈 때에는 정말 가벼운 마음으로 페달을 밟았다...
바람도 맞바람이 아니라서 정말 가볍게....
그.러.나....
오는길은 주금이었다.-_-;
이미 이사갈 집에 도착을 했을 때 달린 거리가 33km...
내가 좀 타볼까 하고 오래 탔을때의 거리가 35km(구로 -> 합수부 -> 선유도 -> 여의도 이렇게 한바퀴)임을 감안하면...
내 체력은 바닥을 기고 있었던거다....
거기에 소나기가 지나가고 햇빛까지 쨍쨍!!
한강엔 맞바람 쌩쌩!!...Orz..
아 정말 힘들다...-_-

그나저나 에르곤그립-_-;;
손저림이 없기는 쥐뿔이!!!
물론 좀 더 오래 탈 수 있게는 해주지만...없지는 않더구만.-_-!!
이 구라쟁이들.-_-!!

근데 집을 계약 하고 집에 와서 지도를 보면서...
이정도면 좀 무리 해서 자전거 타고 다닐 수 도 있지 않을까 라는 생각을 했었다..
오면서 비웃어줬다.-_-피식...-_-
내 저질 체력을 어찌 보고........~_~;

ps.삼성역 합수부에서 탄천으로 가는 길은 상당히 좋지 않다.-_-;
요즘 가끔 보이는 돌로 깔아놓은 인도를 달리는 듯한 느낌이다.-_-;

Posted by SADBLUE

2010/06/20 18:17 2010/06/20 18:17
, ,
Response
0 Trackbacks , 0 Comments
RSS :
http://sadblue.com/rss/response/304

Trackback URL : http://sadblue.com/trackback/304

DB 01

join의 유리한점.
block 단위의 io에서 유리하다.
ex) 1만 개의 row를 select 할 경우.
1. 정규화 되지 않은 통 테이블
code status  name   date
4byte, 4byte, 20byte, 10byte : 38 byte block size
38byte * 10000 = 380k

2. 간단한 정규화가 된 테이블 1, 2
code name
4byte, 20byte : 24 byte block size

code status date
4byte, 4byte, 10byte : 18byte block size

1은 총 10개. 2에서 1만 row select
18byte * 10000 + 24byte * 10 : 180.24kbyte

join 쿼리 작성시 주의 할 점.
먼저 drive in이 되는 테이블의 data 가 먼저 상수화 되고 치환이 되기 때문에
data범위를 줄일 수 있는 쪽을 먼저 drive in 하게 한다.

outer join을 하게 된다면 무조건 outer join이 걸리지 않은 테이블 부터 drive in 된다.
따라서 위에 언급된 data범위를 줄일 수 있는 쪽이 먼저 drive in되지 않을 수 있다는 점을 명심한다.

Posted by SADBLUE

2010/04/13 23:37 2010/04/13 23:37
,
Response
0 Trackbacks , 0 Comments
RSS :
http://sadblue.com/rss/response/299

Trackback URL : http://sadblue.com/trackback/299

로켓독.

아.. 작업 표시줄을 대체할 수 있을 줄 알았다..Orz...
그러나 윈도의 작업표시줄의 빠른 실행 을 대체 하는 수준의 프로그램이었으니...
상실감이 크다.~_~;

나야 원래 폴더에 단축아이콘을 싹 몰아 놓고 썼었기 때문에
편하게 쓸 수 있다.
근데 그렇게 쓰지 않던 사람들이 단순히 이쁘다고 이것을 깔고 쓰기엔
좀 무리가 있지 않을까 하는 생각이 든다.
빠른 시작 링크를 없애고 이걸 써야겠다.-_-;
이정도에서 타협 해야지.~_~;

Posted by SADBLUE

2009/11/11 20:53 2009/11/11 20:53
, ,
Response
0 Trackbacks , 0 Comments
RSS :
http://sadblue.com/rss/response/276

Trackback URL : http://sadblue.com/trackback/276

ie6용 css팁.

css 마스터 전략 (에이콘 출판사 박수만 옮김)에서 발췌.
ie6이하 버전에만 css속성 적용하기.

css에서 import할 경우에 <!-- if [ie 6] --> 같은 분기문을 사용할 수 있지만.
그외의 속성에는 사용이 않되어서...책을 다시 읽다보니...
ie6는 속성값에 _가 붙어 있어도 인지를 한다는 '언더바 핵'이 명시되어 있었다.
이 디런6버전은 !important 지시자가 있어도 뒤에 선언된 속성이
먼저 선언된 속성을 덮어 쓴다고 한다.
style_1 {float:left; _float:right;}
이렇게 쓰면 ie6에는 right로 적용 된다는 것.
style_1 {display:inline-block; _display:inline;}
이건 ie6에는 inline으로 적용된다.

Posted by SADBLUE

2009/11/10 11:28 2009/11/10 11:28
, , ,
Response
0 Trackbacks , 0 Comments
RSS :
http://sadblue.com/rss/response/275

Trackback URL : http://sadblue.com/trackback/275

CI Filecache Interface 맹가서 쓰기.

CI 한국 포럼에 내가 올린글임.

팁이라 하기에도 모하고 소스코드로 올리기도 애매한 그런 글 입니다.

filecache를 기반으로 인터페이스를 플러그인에 지정해서 쓰는 방법을 올립니다.
버그라던가 고쳐야 할점을 말씀 해 주시면 정말 감사 하겠습니다.
그러나 비난 하시면 상처 받습니다.Orz..
참고로 이 글은 객체의 개념이 없으시다면 상당히 난해할것이라 생각이 듭니다.;

1. 왜 인터페이스를 만들어야 하는가 부터 집고 넘어갑니다.
   filecache를 기본으로 설명할테니 예제도 이를 기반으로 하겠습니다.
   그리고 cache format은 json으로 합니다.
   다른 format은 처리해줘야 할 부분들이 많아서 구찮거든요-_-

   사용하는 이유는
   1. 어떤 filecache라도 동일한 method와 사용법을 갖습니다.
   2. 따라서 사용하기가 쉬워집니다.
   3. filecache를 추가 하더라도 interface만 맞추면 loader를 이용해서 편하게 쓸 수 있습니다.

   기초Data를 file로 내리는 이유는 db컨넥션을 줄이는데 우선 목적을 둡니다.
   cache가 1개 라면 굳이 이런 번거로운 방법을 쓸 이유는 없겠지요.
   그런데 두 개 이상이라면 얘기는 달라집니다.

   이런경우에 객체지향이 빛을 발하게됩니다.
   기본적으로 filecache는 생성, 읽기, 초기화 의 특성을 지닙니다.
   (삭제는 빼겠습니다. 안쓰면 그만인것이 캐쉬 이므로..머 넣으셔도 상관 없습니다.-_-;)
   어떤 cache든간에 똑같은 동작을 하지만 내부적으로는 다른 처리과정을 거치게 됩니다.
   이럴때에 추상Class나 Interface를 사용해서 Class를 구현을 하게 되면
   Interface상에 정의된 함수를 호출 하는 경우에 실제 생성된 객체의 method가 호출 되게 됩니다.

   이제 코드를 봅시다.
   저는 Interface말고 추상Class를 씁니다.

abstract class Filecache
{
    protected $m_szFile = null;        // 파일 경로
    protected $m_oController = null;    // 컨트롤러 참조 변수
    protected $m_szBuffer = null;        // 파일 내용 버퍼
    protected $m_bExist = false;        // 파일 존재 유무

/*
    기본적으로 method의 인자를 넘기게 되면 이 값은 메모리상에서 copy가 일어납니다.
    그러나 &연산자를 붙여주면 메모리를 참조 하게 됩니다.
    php상에선 오히려 &연산자를 써서 참조 하는게 않좋다는 글을 봤지만...
    취향입니다.-_-
*/
    function Filecache($pFile, &$pController)
    {
        $this->m_szFile = $pFile;
       
        // controller를 참조 하는 이유는 아래에 나오는 init method의 방식 때문입니다.
        // 이는 구현 부분에서 다시 언급 합니다.
        $this->m_oController = $pController;

        $this->m_bExist = file_exists($this->m_szFile);
    }

    // json_decode를 이용해 data를 return합니다.
    function getJsonData()
    {
        if ($this->m_szBuffer != "" && $this->m_szBuffer != null)
            return json_decode($this->m_szBuffer, true);
        else return false;
    }

    // 혹시 몰라서 그냥 buffer채로 넘기는 함수도 있습니다.
    // 만약 json이 아니라 단순 txt라면 이 함수를 쓰면 되겠습니다.
    function getStringData()
    {
        return $this->m_szBuffer;
    }

    function cacheExist()
    {
        return $this->m_bExist;
    }

    /*
        이 3개의 추상 method가 Interface가 됩니다.
        이 Class를 상속받는 Class들은 반드시 구현을 해야 하는 부분입니다.
    */
    abstract function makeFile($pData);
    abstract function loadFile();
    abstract function initFile();
}

이 소스를 filecache_pi.php로 저장을 했습니다.
그러나 써먹으려면 이 Class를 구현한 놈이 있어야겠죠.?
CI구조상 이렇게 만든 class를 별개의 파일로 나누어서 확장을 하려면
require_once를 사용 하는 수 밖에 없습니다.
그래서 저는 이렇게 한 Interface를 만들고 이를 상속 받는 class들은 한 파일 안에
다 넣기로 했습니다.

자 구현을 해봅시다.
class Infofile extends Filecache
{
    function Infofile($pFile, &$pController)
    {
        parent::Filecache($pFile, $pController);

        // 파일이 있다면 load를 하고 없으면 init을 합니다.
        if (file_exists($this->m_szFile)) $this->loadFile();
        else $this->initFile();
    }

    function loadFile()        // cache 파일을 읽어옵니다.
    {
        if (!file_exists($this->m_szFile))
        {
            $this->m_szBuffer = null;
            return;
        }
       
        $fd = fopen($this->m_szFile, "r");
        if ($fd == FALSE) return false;

        $buffer = "";

        while(!feof($fd))
            $buffer .= fgets($fd);

        if (strlen($buffer) == 0) return false;

        $this->m_szBuffer = $buffer;

        fclose($fd);
    }

    function makeFile($pData)    // cache 파일을 새로 만듭니다.
    {
        if (!is_array($pData)) return false;

        $fd = fopen($this->m_szFile, "w+");
        if ($fd == FALSE) return false;

        $buffer = json_encode($pData);
        $r = fwrite($fd, $buffer);

        if ($r != strlen($buffer))
        {
            fclose($fd);
            unlink($this->m_szFile);
            return false;
        }

        fclose($fd);
        return true;
    }

    /*
        cache 파일을 초기화 합니다.
        여기서 controller를 참조하는 이유가 생깁니다.
        init Method에서 model을 load 해서 갱신될 Data를  받게 했기 때문입니다.
        init file에만 controller 참조를 인자로 넘겨서 하셔도 됩니다.
        init file에 직접 data를 넘겨주겠다 하시면 controller참조는 아예 존재하지 않아도 됩니다.
    */   
    function initFile()
    {
        $this->m_oController->load->model("_MODEL_NAME_");

        $this->makeFile($this->m_oController->_MODEL_NAME_->_DATA_METHOD_);
           
        $this->loadFile();
    }
}

정말 간단하지요.?

이제 중요한 loader입니다.
loader는 일반 library에 둡니다.
그 이유는 controller에서 load를 하게 되면 자동적으로 객체를 참조 할 수 있게 되기 때문입니다.-_-
만약 plugin 또는 helper로 선언만 하게 되면
쓸 때마다 변수를 선언하고 생성을 해줘야만 하니까요.
상위 class에서 한번 load하면 하위 객체에서도 다 쓸수 있고 말이죠.
일일이 핸들링 할 필요가 없어지니 편하죠.

class filecacheloader
{
    protected $m_oController = null;
    protected $m_oFile = array();

    function filecacheloader($pValue = null)
    {
        $this->m_oController = &get_instance();
       
        if ($pValue != null) $this->loadFile($pValue["type"]);
    }
   
    function loadFile($pIndex)
    {
        if (array_key_exists($pIndex, $this->m_oFile)) return;
       
        switch($pIndex)
        {
            case "SITEINFO" :
                $szFilePath = _MAKE_FILE_PATH_NAME;
                $this->m_oFile[$pIndex] = new Infofile($szFilePath, $this->m_oController);
                break;
        }
    }

    function getData($pIndex)
    {
        return $this->m_oFile[$pIndex]->getJsonData();
    }

    function cacheExist($pIndex)
    {
        return $this->m_oFile[$pIndex]->cacheExist();
    }

    function makeFile($pIndex, $pData)
    {
        $this->m_oFile[$pIndex]->makeFile($pData);
    }
   
    function initFile($pIndex)
    {
        $this->m_oFile[$pIndex]->initFile();
    }
}
loader는 참 간단하지요.
단순하게 예약된 cache type을 받아서 생성되어 있는지 확인하고
생성되어 있지 않다면 새로 생성 하기만 하면 되는겁니다.

실제 controller 상에서는.
$this->load->plugin("filecache");
이렇게 선언된 plugin을 한번 load 해주고 loader를 load합니다. (helper로 만들어도 동일합니다. helper로 로드 하면 되겠지요.)
$this->load->library("filecacheloader", array("type" =>"SITEINFO"));

if (!$this->filecacheloader->cacheExist("SITEINFO"))
{
    $this->load->model(_MODEL_NAME_);
    $data = $this->_MODEL_NAME_->_METHOD_
    $this->filecacheloader->makeFile("SITEINFO", $data);
    /*
    // 또는
    $this->filecacheloader->initFile("SITEINFO");
    $data = $this->filecacheloader->getData("SITEINFO");
    */
}
else
{
    $data = $this->filecacheloader->getData("SITEINFO");
}

이렇게 쓰기만 하면 cache부분은 따로 손을 더 댈 필요가 없겠지요.?
참 쉽지요.?

Posted by SADBLUE

2009/09/13 15:37 2009/09/13 15:37
, , ,
Response
0 Trackbacks , 0 Comments
RSS :
http://sadblue.com/rss/response/269

Trackback URL : http://sadblue.com/trackback/269

ie6 dom removeChild 버그.

그냥 쓰면 문제가 없다.
그러나 createElement로 객체를 생성하고
alert이나 새로 생성한 element에서 다시 div같은 element를 생성하고 다 닫는 경우에
원래 화면에 input box같은게 있다면 클릭이 되질 않는다.
ie6에서 dom작업 처리를 제대로 못하는것인지.-_-;
근데 웃긴건 단순하게 display none으로 하면 아무런 문제가 없다.
none하고 removeChild를 해도 문제가 생긴다.
드런IE.
파폭은 아주 잘 돌아간다.-_-

Posted by SADBLUE

2009/06/12 17:53 2009/06/12 17:53
, , ,
Response
0 Trackbacks , 0 Comments
RSS :
http://sadblue.com/rss/response/261

Trackback URL : http://sadblue.com/trackback/261

가변폭 html과 css.그리고 ie6

아.정말 삽질중이다.
가변폭이라는 옵션이 얼마나 지랄맞은지를 뼈저리게 느끼고 있다.
(여기서의 가변폭은 메뉴 영역은 고정크기이고 내용부분이 가변폭이라는 말이다.)

웹서핑을 해봐도 가변폭을 적용하는 경우는
매일 화면 말고는 볼 수 없다.
다음이나 네이버 조차도 메일만 가변폭일뿐 다른 화면들은 고정이다.
이걸 무시한채 div로 잡으려 했지만
망할 ie6 덕분에 접을 수 밖에 없었다.
그리고 가변폭에는 테이블이 킹왕짱이라는 것을 실감했다.

ie6는 웃긴게 resize이벤트를 계속 발생시킨다.
페이지 로딩시에 내용부분의 div넓이를 계산 하는 스크립트를
onload와 resize에 적용 해 놓았는데
ie6는 접근조차 않되는 것이었다.
무엇일까 봤더니만 계속되는resize 이벤트 발생으로 무한루프로 인해서 브라우저 다이...
하아...역시 발로만든 ie6 라는 말을 뼈저리게 느꼈다.-_-
더군다나 select box같은 element들이 자체적으로 최고 z-index를 갖고 있는지라.
layer로 popup을 띄우는 경우에는 화면상의 모든 select tag를 display none해주어야만 한다. 이게 뭐냐고.~_~;

테이블의 경우 왼쪽 메뉴 고정 내용부분 가변.
아 정말 욕 나온다...
div로 짜 놓았든 프레임 html을 결국 다시 table로 돌렸다.

그러나...
html 에디터를 이용한 무한 중첩 테이블 신공으로
어디서 문제가 생기는건지 종종 레이아웃이 깨지는 페이들이 속출하고...
여기저기서 프레임웍 버그가 튀나오니...
괜히 내가 프레임웍을 잡았다 싶은 생각이 들었다.


Posted by SADBLUE

2009/06/04 18:12 2009/06/04 18:12
, , ,
Response
0 Trackbacks , 0 Comments
RSS :
http://sadblue.com/rss/response/259

Trackback URL : http://sadblue.com/trackback/259

php를 이용한 xml이용시 노드 확인 방법.

SimpleXmlElement를 이용하면 xml element에 접근 하는 방법이 쉬워지지만
node가 존재 하지 않는 경우 난감해지는 일이 생긴다.
보통 Node no longer exists Filename 이런 에러가 나타난다.
이를 해결하기 위해서는.
어쩔 수 없이 무식한 방법을 쓰는 수 밖에 없었다.-_-
asXML을 이용해서 find로 찾아보려 했지만 받아지지 않는 경우도 있어서.
dom_import_simplexml 함수를 이용하여 dom node를 생성하고
childNodes를 받아서 하나하나 확인 해 보는 방법이다.-_-
여기서 주의 해야 할것은 XMLReader에 정의된 nodeType을 모든 child로 가져 온다는것이다.
따라서
if ($tempChild->item($i)->nodeType == XMLReader::ELEMENT && $tempChild->item($i)->nodeName == $pNodeName)
이런식으로 nodeType과 nodeName을 모두 같이 비교 해 주어야만 한다.
아 오전 내내 삽질.~_~

Posted by SADBLUE

2009/04/07 11:33 2009/04/07 11:33
, , ,
Response
0 Trackbacks , 0 Comments
RSS :
http://sadblue.com/rss/response/245

Trackback URL : http://sadblue.com/trackback/245

아 디런 페이징.-_-
덕분에 그나마 깔끔했던 xml이 아주 지저분해졌다.~_~;
페이징을 위한 param들도 머리를 아프게 했고.-_-
맨 첫 페이지와 맨 마지막 페이지의 링크를 없애는 방법도 머리 아팠다.~_~
여튼 결론은 table을 다 그리는게 어쩌면 더 편해 보일지 모르는 지저분해진 xml인것이다.;

변경점.
1. row data 가 0일때의 처리
2. xml data는 페이지 로딩 시 1번만 요청 하도록 수정
3. paging기능 추가.

고려사항
- paging으로 추가되는 내용역시 cell이기 때문에 기존에 만들어진
stCell클래스를 확장해서 사용. (소스에 주석 달려 있음)

이전에 좀 불친절 했던 소개라는 느낌이 들어서 좀 친절하게 설명 하겠음.-_-;;

view 역할을 하는 table.xml

<?xml version="1.0" encoding="UTF-8" ?>
<gabia>
    <tables>
        <notice>
            <rowCss>noticeRow1</rowCss>
            <rowCss>noticeRow2</rowCss>
            <rowCss>noticeRow3</rowCss>
            <row><![CDATA[noticeTitle^^<a href="#seq#">#title#</a>]]></row>
            <row><![CDATA[noticeAuthor^^#author#]]></row>
            <row><![CDATA[noticeCount^^#viewcount#]]></row>
            <row><![CDATA[noticeDate^^#regdate#]]></row>
            <paging>
                <pagingCss>pagingCell</pagingCss>
                <pageFunction>onclick="goPage('#PAGE#');"</pageFunction>
                <firstPage><![CDATA[<p class="firstPage" #FUNCTION#>FIRST</p> ]]></firstPage>
                <prevPage><![CDATA[<p class="nextPage" #FUNCTION#>PREV</p> ]]></prevPage>
                <currentPage><![CDATA[<p class="currentPage" >#PAGE#</p> ]]></currentPage>
                <otherPage><![CDATA[<p class="pageNumber" #FUNCTION#>#PAGE#</p> ]]></otherPage>
                <nextPage><![CDATA[<p class="nextPage" #FUNCTION#>NEXT</p> ]]></nextPage>
                <lastPage><![CDATA[<p class="firstPage" #FUNCTION#>LAST</p>]]></lastPage>
            </paging>
        </notice>
    </tables>
</gabia>
paging기능 문제로 paging element가 추가 되었다.
pagingCss : paging으로 추가된 td의 css name
pageFunction : page이동시 사용될 스크립트 함수의 형식. 인자는 Page번호만으로 한다.* 맨 마지막 페이지나 맨 처음 페이지일 경우에 링크를 막기 위해 이러한 구조를 취한다.
firstPage : 제일 앞으로 이동 하는 링크 template
prevPage : 현재 페이지 번호보다 1 작은 페이지로 이동하는 링크 template
currentPage : 현재 페이지 번호의 template
nextPage : 현재 페이지 번호보다 1 큰 페이지로 이동하는 링크 template
lastPage : 맨 마지막 페이지로 이동하는 링크 template

기본적으로 style의 cursor모양은 지정하지 않고 page번호 생성 할 때에 onmouseover event를 통해 style을 제어 하도록 한다.
cell을 생성하고 innerHTML을 이용해 문자열을 대입시 <p></p> 태그의 style 속성이 사라지는 버그인지 알수 없는 현상이 발생.

model 역할을 하는 table.php
<?
    $data = "[";
    $data .= "{\"seq\":\"166\",\"title\":\"test166\",\"regdate\":\"2009.01.16\",\"author\":\"SADBLUE\",\"viewcount\":\"0\"},
            {\"seq\":\"165\",\"title\":\"test165\",\"regdate\":\"2009.01.16\",\"author\":\"SADBLUE\",\"viewcount\":\"0\"},
            {\"seq\":\"164\",\"title\":\"test164\",\"regdate\":\"2009.01.16\",\"author\":\"SADBLUE\",\"viewcount\":\"0\"},
            {\"seq\":\"163\",\"title\":\"test163\",\"regdate\":\"2009.01.16\",\"author\":\"SADBLUE\",\"viewcount\":\"0\"},
            {\"seq\":\"162\",\"title\":\"test162\",\"regdate\":\"2009.01.16\",\"author\":\"SADBLUE\",\"viewcount\":\"0\"},
            {\"seq\":\"161\",\"title\":\"test161\",\"regdate\":\"2009.01.16\",\"author\":\"SADBLUE\",\"viewcount\":\"0\"},
            {\"seq\":\"160\",\"title\":\"test160\",\"regdate\":\"2009.01.16\",\"author\":\"SADBLUE\",\"viewcount\":\"0\"},
            {\"seq\":\"159\",\"title\":\"test159\",\"regdate\":\"2009.01.16\",\"author\":\"SADBLUE\",\"viewcount\":\"0\"},
            {\"seq\":\"158\",\"title\":\"test158\",\"regdate\":\"2009.01.16\",\"author\":\"SADBLUE\",\"viewcount\":\"0\"},
            {\"seq\":\"157\",\"title\":\"test157\",\"regdate\":\"2009.01.16\",\"author\":\"SADBLUE\",\"viewcount\":\"0\"}";
    $data .= "]";
   
    $param = "{\"layerid\":\"content\",\"listcount\":\"10\",\"pagingcount\":\"10\"}";

    $return_data = "{";
    $return_data .= "\"resultCode\" : 'SUCCESS',";
    $return_data .= "\"row\" : '10',";
    $return_data .= "\"total\" : '10',";
    $return_data .= "\"result\" : " . $data . ",";
    $return_data .= "\"message\" : '',";
    $return_data .= "\"layerID\" : '',";
    $return_data .= "\"pagingcount\" : '10',";
    $return_data .= "\"listcount\" : '10',";
    $return_data .= "\"param\" : " . $param . ",";
    $return_data .= "\"page\" : '1'";
    $return_data .= "}";

    echo($return_data);
?>
실제 개발을 한다라면 ajax call의 response는 위의 형식으로 되어야 함.
$pCode :결과코드
$pValue : json_encode를 이용해 만들어진 jsondata
$pMessage : message
$pLayerID : 작업 대상 layerid
$pParam : json_encode를 이용해 만들어진 parameter
$pRow : 실제 data의 row수
$pTotal : select된 전체 row수 - paging 관련 인자.
$pPage : 요청 받은 page ? paging 관련 인자.
$pPagingCount : page 번호가 보여지는 수. 몇 page부터  몇 page까지 하단에 보여지는지. - paging 관련 인자.
$pListCount : 게시판에 한번에 보여질 글의 수  - paging 관련 인자.

예전에 빠졌던 ajaxBasic.js

function getAjaxData(URL,params,func, interID)
{
    var myAjax = new Ajax.Request( URL,
        {
            asynchronous: true,
            method: "post",
            parameters: params,
            onSuccess: function(xmlHttp){
                //alert(xmlHttp.responseText);
                try
                {
                    var data = eval('(' + xmlHttp.responseText + ')');
                }
                catch(E)
                {
                    alert("AjaxCall : " + E + " - " + xmlHttp.responseText);
                    return;
                }
                //alert(xmlHttp.responseText);
                func(data);
            },
            onFailure : function (request)
            {
                func("FAIL");
                return;
            }
        }
    );
}

control 역할의 table.js (xmlParser는 이전 post참조.)

/********************************************************************************
    ajax를 이용한 json data를 parsing해서 table을 그리는 class
    작성자 : 이정훈 (ljhoon@gabia.com)
    작성일 : 2009.01.13
    수정일 : 2009.01.15 - paging 기능 완료
********************************************************************************/

var tableXML = "http://local.inmail.co.kr/xml/table.xml";
// 로컬에서 개발 하던 url이므로 테스트 하는 곳의 url로 수정

/********************************************************************************
 stCell : td를 구성하기 위한 기본 정보를 갖게 되는 구조체 성격의 Class
     만약 td에 정의 해야 할 속성이 늘어나면 xml에 ^^ 구분자를 이용해서
     추가를 하고 stCell class에도 속성을 추가 해 주면 된다.
********************************************************************************/
var stCell = Class.create();
stCell.prototype = {
    cssName : null,
    cellData : null,

    initialize : function(pData)
    {
        if (pData == null) this.setNullData();
        else
        {
            if (pData.length < 1)
            {
                this.setNullData();
            }
            else
            {
                this.cssName = pData[0];
                this.cellData = pData[1];
            }
        }
    },

    getCss : function()
    {
        return this.cssName;
    },

    getData : function()
    {
        return this.cellData;
    },

    setData : function(pValue)
    {
        this.cellData = pValue;
    },

    setNullData : function()
    {
        this.cssName = "nodata";
        this.cellData = "nodata";
    }
};

/********************************************************************************
 stPaging : paging cell의 내용을 위한 구조체 성격의 class
     기본적인 stCell보다 디자인적 요소가 많기 때문에 상속받아 구현.
     paging node를 인자로 받는다.
     다중 상속을 위해 임시 객체를 하나 더 만든다.
     paging또한 td(cell)이기 때문에 stCell객체를 확장한다.
********************************************************************************/
var stTemp = Class.create();
stTemp.prototype = Object.extend (new xmlParser, new stCell);

var stPaging = Class.create();
stPaging.prototype = Object.extend (new stTemp, {
    m_oFirst : null,
    m_oPrev : null,
    m_oNumber : null,
    m_oCurrent : null,
    m_oNext : null,
    m_oLast : null,
    m_oFunction : null,

    initialize : function(pData)
    {
        this.getPagingTemplate(pData);
    },

    getPagingTemplate : function(pData)
    {
        if (pData == null)
            return ("paging row Info is null");
        else
        {
            try
            {
                this.cssName = this.getValue(this.getNode(pData, "pagingCss"));
                this.m_oFirst = this.getValue(this.getNode(pData, "firstPage"));
                this.m_oPrev = this.getValue(this.getNode(pData, "prevPage"));
                this.m_oCurrent = this.getValue(this.getNode(pData, "currentPage"));
                this.m_oNumber = this.getValue(this.getNode(pData, "otherPage"));
                this.m_oNext = this.getValue(this.getNode(pData, "nextPage"));
                this.m_oLast = this.getValue(this.getNode(pData, "lastPage"));
                this.m_oFunction = this.getValue(this.getNode(pData, "pageFunction"));
            }
            catch(E)
            {
                alert("Paging Node select fail : " + E);
                return;
            }
        }
    },
   
    setData : function (pPage, pTotal, pListCount, pPagingCount)
    {
        //alert(pPage + " - " + pTotal + " - " + pListCount + " - " + pPagingCount);
        var firstPage = 1;
        var lastPage = Math.ceil(pTotal / pListCount);

        var half = parseInt(pPagingCount/2, 10);

        var startPage = (pPage > half)?(pPage - half) : 1;
        var endPage = startPage + pPagingCount - 1;

        if (pListCount < lastPage)
        {
            endPage = (endPage > lastPage)?lastPage : endPage;
            startPage = ( (endPage - pPagingCount) < startPage )?(endPage - pPagingCount + 1) : startPage;
        }
        else
        {
            endPage = lastPage;
            startPage = firstPage;
        }
       
        prevPage = ((pPage -1) <= 0)?1:pPage-1;
        nextPage = ((pPage+1) > endPage)?pPage : (pPage +1);

        var pagingBuffer = "";

        //alert(half + " - " + startPage + " - " + endPage + " - " + lastPage);
/*
    맨 끝 페이지나 맨 마지막 페이지의 링크를 막기 위해 이런 구조를 취함.
*/
        var regPage = new RegExp("#PAGE#", "ig");
        var overCursor = " onmouseover=\"this.style.cursor='pointer';\"";

        if (pPage == firstPage)
        {
            pagingBuffer += this.m_oFirst.replace(/#FUNCTION#/ig, "");
            pagingBuffer += this.m_oPrev.replace(/#FUNCTION#/ig, "");
        }
        else
        {
            pagingBuffer += (this.m_oFirst.replace("#FUNCTION#", this.m_oFunction + overCursor)).replace(regPage, firstPage);
            pagingBuffer += (this.m_oPrev.replace("#FUNCTION#", this.m_oFunction + overCursor)).replace(regPage, prevPage);
        }

        for (var i=startPage ; i<=endPage ; ++i)
            pagingBuffer += (i == pPage)? this.m_oCurrent.replace(regPage, i) : (this.m_oNumber.replace("#FUNCTION#", this.m_oFunction + overCursor)).replace(regPage, i);

        if (pPage == lastPage)
        {
            pagingBuffer += (this.m_oNext.replace("#FUNCTION#", "")).replace(regPage, nextPage);
            pagingBuffer += (this.m_oLast.replace("#FUNCTION#", "")).replace(regPage, lastPage);
        }
        else
        {
            pagingBuffer += (this.m_oNext.replace("#FUNCTION#", this.m_oFunction + overCursor)).replace(regPage, nextPage);
            pagingBuffer += (this.m_oLast.replace("#FUNCTION#", this.m_oFunction + overCursor)).replace(regPage, lastPage);
        }

        this.cellData = pagingBuffer;
    }
});

/********************************************************************************
 stRow : td 배열을 갖게 되는 row 구조체 class
     row별 배경색이 다른 경우를 위해 css이름 속성을 갖는다.
********************************************************************************/
var stRow = Class.create();
stRow.prototype = {
    m_stCells : null,
    m_oCss : null,
    length : 0,

    initialize : function()
    {
        this.m_oCss = new Array();
        this.m_stCells = new Array();
    },

    insert : function(pCell)
    {
        this.m_stCells[this.m_stCells.length] = pCell;
        this.length++;
    },

    setCss : function(pCss)
    {
        if (typeof(pCss) != "Object")
            this.m_oCss[this.m_oCss.length] = pCss;
        else if (pCss.length > 1)
        {
            var cssCount = pCss.length;
            for (var i=0 ; i<cssCount ; ++i)
                this.m_oCss[cssCount + i] = pCss[i];
        }
    },

    getCell : function(pIndex)
    {
        if (this.m_stCells.length >= pIndex)
        {
            return this.m_stCells[pIndex];
        }
    },

    getColumnCount : function()
    {
        return this.m_stCells.length;
    },

    getCssCount : function()
    {
        return this.m_oCss.length;
    },

    getCss : function(pIndex)
    {
        if (this.m_oCss.length > pIndex)
            return this.m_oCss[pIndex];
        else
            return this.m_oCss[0];
    }
};

/********************************************************************************
 TableTemplate : Table Template XML정보를 가져온다.
 (Table class 생성마다 xml을 읽어오게 되어 있어서 따로 분리)
********************************************************************************/
var TableTemplate = Class.create();
TableTemplate.prototype = Object.extend (new xmlParser, {
    xmlTemplate : null,

    initialize : function()
    {
        this.loadXML();
    },

/********************************************************************************
 table 구조 xml을 읽어 오는 부분. 동기로 처리 했음.
********************************************************************************/
    loadXML : function()
    {
        new Ajax.Request(tableXML, {
            asynchronous: false,
            method: "get",
            onSuccess: function(xmlHttp)
            {
                try
                {
                    xmlTemplate = xmlHttp.responseXML;
                    return true;
                }
                catch(E)
                {
                    xmlTemplate = null;
                    alert("XML Load Fail : " + E);

                    return false;
                }
            },
            onFailure : function (request)
            {
                xmlTemplate = null;
                alert("Table Template XML Request Fail");
                return false;
            }
        });
    },

    getTemplate : function()
    {
        return xmlTemplate;
    }
});

var TemplateInfo = new TableTemplate();

/********************************************************************************
 Table : stRow, stCell을 이용해 실제 Table row를 그린다.
********************************************************************************/
var Table = Class.create();
Table.prototype = Object.extend (new xmlParser, {
    m_nRow : 0,
    m_oData : null,
    m_oTableID : null,
    m_oRowTemplate : null,
    m_oDefaultRowCss : null,
    xmlBuffer : null,
    m_oRows : null,
    m_bHeaderExist : true,
    m_bPaging : true,
    m_oParam : null,
    m_nTotal : 0,
    m_nPagingCount :0,
    m_nListCount : 10,
    m_nPage : 1,
    m_oMessage : null,

/********************************************************************************
 pData : json data
 pTableID : target table id
 pHeaderExist : 테이블 column별 제목이 있다면 true 없다면 false.
      table을 그리기 전에 true이면 1줄을 남기고 없다면 모든 row를 지운다.
********************************************************************************/
    initialize : function(pData, pTableID, pHeaderExist, pPaging)
    {
        if (pData != null)
        {
            this.m_nRow = parseInt(pData.row, 10);
            this.m_oData = pData.result;
            this.m_oTableID = pTableID;
            this.m_bHeaderExist = pHeaderExist;
            this.m_bPaging = pPaging;
            this.m_nListCount = pData.listcount;
            this.m_nPagingCount = parseInt(pData.pagingcount, 10);
            this.m_nTotal = parseInt(pData.total, 10);
            this.m_oParam = pData.param;
            this.m_nPage = parseInt(pData.page, 10);

            xmlBuffer = TemplateInfo.getTemplate();
        }
        this.m_oMessage = pData.message;
    },

/********************************************************************************
 table의 row와 total값을 기준으로 table data가 있는지 여부를 확인한다.
********************************************************************************/
    hasRow : function()
    {
        return (this.m_nTotal > 0 && this.m_nRow > 0)?true : false;
    },
/********************************************************************************
 xml에 정의된 각 td별 설정을 읽어와 rowTemplate 객체를 만든다.
 row별 css정보도 여기서 설정한다. css가 명시된 수 만큼 적용된다.
********************************************************************************/
    getRowTemplate : function()
    {
        if (xmlBuffer == null)
            return ("table row Info is null");
        else
        {
            try
            {
                this.m_oRows = null;
                this.m_oRows = new stRow();

                var objectNode = this.getNode(xmlBuffer, this.m_oTableID);
                var cssTemp = this.getNodeAll(objectNode, "rowCss");

                for(var i=0 ; i<cssTemp.length ; ++i)
                    this.m_oRows.setCss(this.getValue(cssTemp[i]));

                var rowTemp = this.getNodeAll(objectNode, "row");

                for(var i=0 ; i<rowTemp.length ; ++i)
                {
                    var templateValue = this.getValue(rowTemp[i]);
                    this.m_oRows.insert(new stCell(templateValue.split("^^")));
                }
            }
            catch(E)
            {
                alert("Node select fail : " + E);
                return;
            }
        }
    },

/********************************************************************************
 실제로 table row를 생성 하는 부분
 row를 추가 하기 전에 기존에 그려진 모든 row를 지운다.
 json의 인덱스 명은 xml에서 명시한 delimiter명과 같아야 한다.
********************************************************************************/
    insertRow : function()
    {
        if (!this.hasRow())
        {
            var row = $(this.m_oTableID).insertRow(-1);
            var c = row.insertCell(-1);
           
            c.className = "nodata";
            c.colSpan = 10;
            c.innerHTML = this.m_oMessage;
            return;
        }
        if ($(this.m_oTableID) == null)
        {
            alert("Base Table is null.");
            return;
        }

        if ($(this.m_oTableID).rows.length > 1)
        {
            if (this.m_bHeaderExist)
            {
                for(var i=($(this.m_oTableID).rows.length-1) ; i>0 ; --i)
                    $(this.m_oTableID).deleteRow(i);
            }
            else
            {
                for(var i=($(this.m_oTableID).rows.length-1) ; i>=0 ; --i)
                    $(this.m_oTableID).deleteRow(i);
            }
        }

        this.getRowTemplate();

        for(var i=0 ; i<this.m_nRow ; ++i)
        {
            var nLoopCount = 0;
            var row = $(this.m_oTableID).insertRow(-1);
            row.className = this.m_oRows.getCss( (i+1)%this.m_oRows.getCssCount() );

            for (var j=0 ; j<this.m_oRows.length ; ++j)
            {
                var c = row.insertCell(-1);
                var tempCell = this.m_oRows.getCell(nLoopCount).getData();

                for(var tempIndex in this.m_oData[i])
                {
                    var delimiter = new RegExp("#" + tempIndex + "#", "ig");
                    tempCell = tempCell.replace(delimiter, this.m_oData[i][tempIndex]);
                }

                c.innerHTML = tempCell;
                c.className = this.m_oRows.getCell(nLoopCount).getCss();
                nLoopCount++;
            }
        }

        // page 표시가 true이면 표시 한다.
        if (this.m_bPaging) this.paging();
    },

/********************************************************************************
 table pagin 처리
********************************************************************************/
    paging : function()
    {
        var pagingCell = new stPaging(this.getPagingTemplate());

        var row = $(this.m_oTableID).insertRow(-1);
        var c = row.insertCell(-1);

        pagingCell.setData(this.m_nPage, this.m_nTotal, this.m_nListCount, this.m_nPagingCount);

        c.colSpan = this.m_oRows.getColumnCount();
        c.className = pagingCell.getCss();
        c.innerHTML = pagingCell.getData();
    },

    getPagingTemplate : function()
    {
        if (xmlBuffer == null)
            return ("paging row Info is null");
        else
        {
            try
            {
                var objectNode = this.getNode(xmlBuffer, this.m_oTableID);
                return this.getNode(objectNode, "paging");
            }
            catch(E)
            {
                alert("Paging Node select fail : " + E);
                return;
            }
        }
    },

    getParam : function()
    {
        return this.m_oParam;
    }
});

사용 sample table.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>test</title>
    <script language="javascript" type="text/javascript" src="/scripts/prototype.js"></script>
    <script language="javascript" type="text/javascript" src="/scripts/ajaxBasic.js"></script>
    <script language="javascript" type="text/javascript" src="/scripts/simpleXml.js"></script>
    <script language="javascript" type="text/javascript" src="/scripts/table.js"></script>
   
    <style type="text/css">
        p, table, div { float:left; position:relative; display:inline-block; padding:0; margin:0; }
       
        #list { width:800px; border:solid 1px #dddddd; }
        #list #notice {width:600px; font-size:11px; font-family : 맑은고딕, Lucida Grande, Verdana, Sans-serif;}
        #list #notice tr { height:20px; }
        #list #notice .noticeHeader {font-weight:bold; text-align:center;}
        #list #notice .noticeRow1 {border-bottom:solid 1px #dddddd; }
        #list #notice .noticeRow2 {border-bottom:solid 1px #dddddd; background-color:#dddddd; }
        #list #notice .noticeRow3 {border-bottom:solid 1px #dddddd; background-color:#aaaaaa; }
       
        #list #notice .noticeTitleHead {width:250px;}
        #list #notice .noticeDateHead {width:75px;}
        #list #notice .noticeCountHead {width:75px; text-align:right;}
        #list #notice .noticeAuthorHead {width:100px;}
        #list #notice .noticeBoardHead {width:100px;}

        #list #notice .currentPage {font-weight:bold; width:15px;}
        #list #notice .pageNumber { width:15px;}
        #list #notice .firstPage { width:35px;}
        #list #notice .nextPage { width:35px;}
       
        #list #notice .pagingCell { width:100%; height:25px; padding-left:8%;}
        #list #notice .nodata { width:100%; text-align:center; height:50px; font-weight:bold;}

        #list2 { width:800px; border:solid 1px #dddddd; }
        #list2 #freeboard {width:600px; font-size:11px; font-family : 맑은고딕, Lucida Grande, Verdana, Sans-serif;}
        #list2 #freeboard tr { height:20px; }
        #list2 #freeboard .freeHeader {font-weight:bold; text-align:center;}
        #list2 #freeboard .freeRow {border-bottom:solid 1px #dddddd; }
       
        #list2 #freeboard .freeTitleHead {width:250px;}
        #list2 #freeboard .freeDateHead {width:75px;}
        #list2 #freeboard .freeCountHead {width:75px;}
        #list2 #freeboard .freeAuthorHead {width:100px;}
        #list2 #freeboard .freeBoardHead {width:100px;}
    </style>
</head>
<body>
<div>
    <div id="list">
        <table id="notice">
            <tr class="noticeHeader"><td class="noticeTitleHead">제목</td><td class="noticeAuthorHead">등록자</td><td class="noticeCountHead">조회수</td><td class="noticeDateHead">작성일</td></tr>
        </table>
    </div>
</div>
<input type="button" value="test" onclick="getData();">

<script language="javascript">
    var objTable2 = null;    // page당 1번의 xml 로딩을 위해 페이지 전역변수로 선언
    var param = $H({'page' : 1, 'layerid' : "content", 'listcount' : 10, 'pagingcount' : 10});
    // 초기 값을 넘긴다.

    function getData()
    {
        getAjaxData('/table.php', param, rowAppend);
    }
   
    function rowAppend(pValue)
    {
        objTable2 = new Table(pValue, "notice", true, true);
        objTable2.insertRow();
    }
</script>
   
</body>

</html>

테스트 방법
1. 웹서버의 특정 위치에 table.xml을 저장한다.
2. table.js의 주소를 맞게 변경한다.
3. table.php를 웹 서버에 저장한다.
4. table.html의 getData() 함수에서 table.php를 호출 하는 주소를 맞게 수정한다.
5. table.html의 버튼을 누르면 table이 그려질 것이다.

Posted by SADBLUE

2009/01/16 11:39 2009/01/16 11:39
, , , , ,
Response
0 Trackbacks , 0 Comments
RSS :
http://sadblue.com/rss/response/227

Trackback URL : http://sadblue.com/trackback/227

json data를 이용한 동적 table 만들기.

model sample

<?
    $data = "[";
    $data .= "{" . "\"no\" : '1793', \"gw_user_info_no\" : '230',\"gw_board_info_no\" : '43',\"title\" : '[메신저] -제안- 채팅 저장 기능 업글',\"name\" : '이정훈',\"readnum\" : '9',\"write_datetime\" : '2009-01-12 11:07:23',\"write_date\" : '09-01-12',\"new_img\" : 'Y',\"poll_img\" : 'N',\"hidden_key\" : 'N',\"depth\" : '0',\"del_flag\" : 'N',\"board_name\" : '메신저 버그/제안',\"board_type\" : 'N', \"attach_cnt\" : '0', \"reply_cnt\" : '0', \"down_cnt\" : '', \"startPage\" : '2', \"current_user_level\" : '2'" . "},";
    $data .= "{" . "\"no\" : '1793', \"gw_user_info_no\" : '230',\"gw_board_info_no\" : '43',\"title\" : '[메신저] -제안- 채팅 저장 기능 업글',\"name\" : '이정훈',\"readnum\" : '9',\"write_datetime\" : '2009-01-12 11:07:23',\"write_date\" : '09-01-12',\"new_img\" : 'Y',\"poll_img\" : 'N',\"hidden_key\" : 'N',\"depth\" : '0',\"del_flag\" : 'N',\"board_name\" : '메신저 버그/제안',\"board_type\" : 'N', \"attach_cnt\" : '0', \"reply_cnt\" : '0', \"down_cnt\" : '', \"startPage\" : '2', \"current_user_level\" : '2'" . "},";
    $data .= "{" . "\"no\" : '1793', \"gw_user_info_no\" : '230',\"gw_board_info_no\" : '43',\"title\" : '[메신저] -제안- 채팅 저장 기능 업글',\"name\" : '이정훈',\"readnum\" : '9',\"write_datetime\" : '2009-01-12 11:07:23',\"write_date\" : '09-01-12',\"new_img\" : 'Y',\"poll_img\" : 'N',\"hidden_key\" : 'N',\"depth\" : '0',\"del_flag\" : 'N',\"board_name\" : '메신저 버그/제안',\"board_type\" : 'N', \"attach_cnt\" : '0', \"reply_cnt\" : '0', \"down_cnt\" : '', \"startPage\" : '2', \"current_user_level\" : '2'" . "},";
    $data .= "{" . "\"no\" : '1793', \"gw_user_info_no\" : '230',\"gw_board_info_no\" : '43',\"title\" : '[메신저] -제안- 채팅 저장 기능 업글',\"name\" : '이정훈',\"readnum\" : '9',\"write_datetime\" : '2009-01-12 11:07:23',\"write_date\" : '09-01-12',\"new_img\" : 'Y',\"poll_img\" : 'N',\"hidden_key\" : 'N',\"depth\" : '0',\"del_flag\" : 'N',\"board_name\" : '메신저 버그/제안',\"board_type\" : 'N', \"attach_cnt\" : '0', \"reply_cnt\" : '0', \"down_cnt\" : '', \"startPage\" : '2', \"current_user_level\" : '2'" . "},";
    $data .= "{" . "\"no\" : '1793', \"gw_user_info_no\" : '230',\"gw_board_info_no\" : '43',\"title\" : '[메신저] -제안- 채팅 저장 기능 업글',\"name\" : '이정훈',\"readnum\" : '9',\"write_datetime\" : '2009-01-12 11:07:23',\"write_date\" : '09-01-12',\"new_img\" : 'Y',\"poll_img\" : 'N',\"hidden_key\" : 'N',\"depth\" : '0',\"del_flag\" : 'N',\"board_name\" : '메신저 버그/제안',\"board_type\" : 'N', \"attach_cnt\" : '0', \"reply_cnt\" : '0', \"down_cnt\" : '', \"startPage\" : '2', \"current_user_level\" : '2'" . "}";
    $data .= "]";

    $return_data = "{";
    $return_data .= "\"resultCode\" : 'OK',";
    $return_data .= "\"row\" : '5',";
    $return_data .= "\"column\" : '5',";
    $return_data .= "\"result\" : " . $data . ",";
    $return_data .= "\"message\" : '',";
    $return_data .= "\"layerID\" : ''";
    $return_data .= "}";

    echo($return_data);
?>

view xml definition
<?xml version="1.0" encoding="UTF-8" ?>
<gabia>
    <tables>
        <notice>
            <rowCss>noticeRow1</rowCss>
            <rowCss>noticeRow2</rowCss>
            <rowCss>noticeRow3</rowCss>
            <row><![CDATA[noticeTitle^^<a href="#no#">#title#</a>]]></row>
            <row><![CDATA[noticeAuthor^^#name#]]></row>
            <row><![CDATA[noticeCountHead^^#readnum#]]></row>
            <row><![CDATA[noticeDateHead^^#write_date#]]></row>
            <row><![CDATA[noticeBoardHead^^#board_name#]]></row>
        </notice>
    </tables>
</gabia>

control class

/********************************************************************************
참조 : http://phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=51107&sca=%BD%BA%C5%A9%B8%B3%C6%AE&sfl=wr_subject&stx=xml&sop=and
prototype을 이용한 xml parser class
********************************************************************************/

var xmlParser = Class.create();
xmlParser.prototype = {
    initialize: function()
    {
    },
    getNode: function (xml, tag)
    { // 싱글노드
        return xml.getElementsByTagName(tag)[0];
    },
    getNodeAll: function (xml, tag)
    { // 멀티노드
        return xml.getElementsByTagName(tag);
    },
    getValue: function (xml)
    { // 노드값 가져오기
        try
        {
            return xml.firstChild.nodeValue;;
        }
        catch(E)
        {
            alert(E);
        }
    }
};

/********************************************************************************
    ajax를 이용한 json data를 parsing해서 table을 그리는 class
    작성자 : 이정훈 (ljhoon@gabia.com)
    작성일 : 2009.01.13
********************************************************************************/

var tableXML = "http://local.inmail.co.kr/test.xml";

/********************************************************************************
 stCell : td를 구성하기 위한 기본 정보를 갖게 되는 구조체 성격의 Class
     만약 td에 정의 해야 할 속성이 늘어나면 xml에 ^^ 구분자를 이용해서
     추가를 하고 stCell class에도 속성을 추가 해 주면 된다.
********************************************************************************/
var stCell = Class.create();
stCell.prototype = {
    cssName : null,
    cellData : null,

    initialize : function(pData)
    {
        if (pData.length < 1)
        {
            this.setNullData();
            return;
        }

        this.cssName = pData[0];
        this.cellData = pData[1];
    },

    getCss : function()
    {
        return this.cssName;
    },

    getData : function()
    {
        return this.cellData;
    },

    setData : function(pValue)
    {
        this.cellData = pValue;
    },

    setNullData : function()
    {
        this.cssName = "nodata";
        this.cellData = "nodata";
    }
};

/********************************************************************************
 stRow : td 배열을 갖게 되는 row 구조체 class
     row별 배경색이 다른 경우를 위해 css이름 속성을 갖는다.
********************************************************************************/
var stRow = Class.create();
stRow.prototype = {
    m_stCells : null,
    m_oCss : null,
    length : 0,

    initialize : function()
    {
        this.m_oCss = new Array();
        this.m_stCells = new Array();
    },

    insert : function(pCell)
    {
        this.m_stCells[this.m_stCells.length] = pCell;
        this.length++;
    },

    setCss : function(pCss)
    {
        if (typeof(pCss) != "Object")
            this.m_oCss[this.m_oCss.length] = pCss;
        else if (pCss.length > 1)
        {
            var cssCount = pCss.length;
            for (var i=0 ; i<cssCount ; ++i)
                this.m_oCss[cssCount + i] = pCss[i];
        }
    },

    getCell : function(pIndex)
    {
        if (this.m_stCells.length >= pIndex)
        {
            return this.m_stCells[pIndex];
        }
    },

    getColumnCount : function()
    {
        return this.m_stCells.length;
    },

    getCssCount : function()
    {
        return this.m_oCss.length;
    },

    getCss : function(pIndex)
    {
        if (this.m_oCss.length > pIndex)
            return this.m_oCss[pIndex];
        else
            return this.m_oCss[0];
    }
};

/********************************************************************************
 Table : stRow, stCell을 이용해 실제 Table row를 그리고 구조 정보 xml을 읽어온다.
********************************************************************************/
var Table = Class.create();
Table.prototype = Object.extend (new xmlParser, {
    m_nCol : 0,
    m_nRow : 0,
    m_oData : null,
    m_oTableID : null,
    m_oRowTemplate : null,
    m_oDefaultRowCss : null,
    xmlBuffer : null,
    m_oRows : null,
    m_bHeaderExist : true,

/********************************************************************************
 pData : json data
 pTableID : target table id
 pHeaderExist : 테이블 column별 제목이 있다면 true 없다면 false.
      table을 그리기 전에 true이면 1줄을 남기고 없다면 모든 row를 지운다.
********************************************************************************/
    initialize : function(pData, pTableID, pHeaderExist)
    {
        this.m_nColumn = pData.row;
        this.m_nRow = pData.column;
        this.m_oData = pData.result;
        this.m_oTableID = pTableID;
        this.m_bHeaderExist = pHeaderExist;

        this.loadXML();
    },

/********************************************************************************
 table 구조 xml을 읽어 오는 부분. 동기로 처리 했음.
********************************************************************************/
    loadXML : function()
    {
        new Ajax.Request(tableXML, {
            asynchronous: false,
            method: "get",
            onSuccess: function(xmlHttp)
            {
                try
                {
                    xmlBuffer = xmlHttp.responseXML;
                    return true;
                }
                catch(E)
                {
                    xmlBuffer = null;
                    alert("XML Load Fail : " + E);

                    return false;
                }
            },
            onFailure : function (request)
            {
                xmlBuffer = null;
                alert("Table Template XML Request Fail");
                return false;
            }
        });
    },

/********************************************************************************
 xml에 정의된 각 td별 설정을 읽어와 rowTemplate 객체를 만든다.
 row별 css정보도 여기서 설정한다. css가 명시된 수 만큼 적용된다.
********************************************************************************/
    getRowTemplate : function()
    {
        if (xmlBuffer == null)
            return ("table row Info is null");
        else
        {
            try
            {
                this.m_oRows = null;
                this.m_oRows = new stRow();

                var objectNode = this.getNode(xmlBuffer, this.m_oTableID);
                var cssTemp = this.getNodeAll(objectNode, "rowCss");

                for(var i=0 ; i<cssTemp.length ; ++i)
                    this.m_oRows.setCss(this.getValue(cssTemp[i]));

                var rowTemp = this.getNodeAll(objectNode, "row");

                for(var i=0 ; i<rowTemp.length ; ++i)
                {
                    var templateValue = this.getValue(rowTemp[i]);
                    this.m_oRows.insert(new stCell(templateValue.split("^^")));
                }
            }
            catch(E)
            {
                alert("Node select fail : " + E);
                return;
            }
        }
    },

/********************************************************************************
 실제로 table row를 생성 하는 부분
 row를 추가 하기 전에 기존에 그려진 모든 row를 지운다.
 json의 인덱스 명은 xml에서 명시한 delimiter명과 같아야 한다.
********************************************************************************/
    insertRow : function()
    {
        if ($(this.m_oTableID) == null)
        {
            alert("Base Table is null.");
            return;
        }

        if ($(this.m_oTableID).rows.length > 1)
        {
            if (this.m_bHeaderExist)
            {
                for(var i=($(this.m_oTableID).rows.length-1) ; i>0 ; --i)
                    $(this.m_oTableID).deleteRow(i);
            }
            else
            {
                for(var i=($(this.m_oTableID).rows.length-1) ; i>=0 ; --i)
                    $(this.m_oTableID).deleteRow(i);
            }
        }

        this.getRowTemplate();

        for(var i=0 ; i<this.m_nRow ; ++i)
        {
            var nLoopCount = 0;

            var row = $(this.m_oTableID).insertRow(-1);
            row.className = this.m_oRows.getCss( (i+1)%this.m_oRows.getCssCount() );

            for (var j=0 ; j<this.m_oRows.length ; ++j)
            {
                var c = row.insertCell(-1);
                var tempCell = this.m_oRows.getCell(nLoopCount).getData();

                for(var tempIndex in this.m_oData[i])
                {
                    var delimiter = new RegExp("#" + tempIndex + "#", "ig");
                    tempCell = tempCell.replace(delimiter, this.m_oData[i][tempIndex]);
                }

                c.innerHTML = tempCell;
                c.className = this.m_oRows.getCell(nLoopCount).getCss();
                nLoopCount++;
            }
        }
    }
});

구동 html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>test</title>
    <script language="javascript" type="text/javascript" src="/scripts/prototype.js"></script>
    <script language="javascript" type="text/javascript" src="/scripts/ajaxBasic.js"></script>
    <script language="javascript" type="text/javascript" src="/scripts/simpleXml.js"></script>
    <script language="javascript" type="text/javascript" src="/scripts/table.js"></script>
   
    <style type="text/css">
        table, div { float:left; position:relative; display:inline-block; padding:0; margin:0; }
       
        #list { width:800px; border:solid 1px #dddddd; }
        #list #notice {width:600px; font-size:11px; font-family : 맑은고딕, Lucida Grande, Verdana, Sans-serif;}
        #list #notice tr { height:20px; }
        #list #notice .noticeHeader {font-weight:bold; text-align:center;}
        #list #notice .noticeRow1 {border-bottom:solid 1px #dddddd; }
        #list #notice .noticeRow2 {border-bottom:solid 1px #dddddd; background-color:#dddddd; }
        #list #notice .noticeRow3 {border-bottom:solid 1px #dddddd; background-color:#aaaaaa; }
       
        #list #notice .noticeTitleHead {width:250px;}
        #list #notice .noticeDateHead {width:75px;}
        #list #notice .noticeCountHead {width:75px; text-align:right;}
        #list #notice .noticeAuthorHead {width:100px;}
        #list #notice .noticeBoardHead {width:100px;}
    </style>
</head>
<body>
<div>
    <div id="list">
        <table id="notice">
            <tr class="noticeHeader"><td class="noticeTitleHead">제목</td><td class="noticeAuthorHead">등록자</td><td class="noticeCountHead">조회수</td><td class="noticeDateHead">작성일</td><td class="noticeBoardHead">게시판</td></tr>
        </table>
    </div>
</div>
<input type="button" value="test" onclick="getData();">

<script language="javascript">
    function getData()
    {
        getAjaxData('/test.php', "", rowAppend);
    }
   
    function rowAppend(pValue)
    {
        var objTable2 = new Table(pValue, "notice", false);
        objTable2.insertRow();
    }
</script>
   
</body>

</html>

Posted by SADBLUE

2009/01/13 14:37 2009/01/13 14:37
, , , , ,
Response
5 Trackbacks , 0 Comments
RSS :
http://sadblue.com/rss/response/225

Trackback URL : http://sadblue.com/trackback/225

Trackbacks List

  1. Натяжные потолки установка

    Tracked from Натяжные потолки установка 2023/05/05 17:33 Delete

    As if nothing had happened... :: json data를 이용한 동적 table 만들기.

  2. Входная дверь внутри

    Tracked from Входная дверь внутри 2023/09/23 19:36 Delete

    As if nothing had happened... :: json data를 이용한 동적 table 만들기.

  3. Купить металлопластиковые окна в кривом Роге

    Tracked from Купить металлопластиковые окна в кривом Роге 2023/09/29 00:30 Delete

    As if nothing had happened... :: json data를 이용한 동적 table 만들기.

  4. Потолки натяжные отзывы

    Tracked from Потолки натяжные отзывы 2023/11/21 08:58 Delete

    As if nothing had happened... :: json data를 이용한 동적 table 만들기.

  5. Ортопедические матрасы кривой рог цены

    Tracked from Ортопедические матрасы кривой рог цены 2023/11/22 14:05 Delete

    As if nothing had happened... :: json data를 이용한 동적 table 만들기.

네이버 트랙백.-_-;

이 글이 검색이 되서 네이버에 들어간다면-_-
막힐까...하는 걱정이 앞서지만.-_-;;
남겨야 할거 같아서.~_~;

네이버의 트랙백 필터링 조건.
한 CallbackUrl로는 7회 이상 트랙백을 보낼 수 없다.

2주간 삽질 해서 알아낸 결과.-_-;
후...

삽질의 끝은 어디인가요.~_~

수정 했음.~_~;;
callback url과 핑을 보내는 서버의 정보는
동일한 여부와 관계가 없음.!!

Posted by SADBLUE

2007/06/22 18:17 2007/06/22 18:17
,
Response
0 Trackbacks , 0 Comments
RSS :
http://sadblue.com/rss/response/115

Trackback URL : http://sadblue.com/trackback/115

랩터 레이드0.

후...
큰맘먹고 거금 30마넌을 들여서 74기가짜리 두개로 레이드0를 만들었다.
인텔 칩셋에 기본적으로 제공되는 레이드로 구성을 했는데...
빨라짐을 느끼지 못하겠다.-_-;;

벤치프로그램 깔기는 좀 꺼림칙하고..
다만 좋아진점은 하드 버벅임이 많이 줄었다는 것.
오락을 할 때에는 다 끄고 하지만.-_-;
보통 작업 할때에는대여섯개가 기본인지라..
이럴때 작업 전환이 무쟈게 부드러워졌다는것.
그리고 와우하다가 윈도로 나오면 하드 읽는 소리가 장난 아니었는데...
이것 또한 줄었다는 것.
아직은 좀 더 봐야 할 듯 하다.

내년 개강 할때 쯤되서 자금 여유가 있으면...
2개 더 달아봐야겠다.-_-;;

Posted by SADBLUE

2006/11/27 15:06 2006/11/27 15:06
,
Response
0 Trackbacks , 0 Comments
RSS :
http://sadblue.com/rss/response/94

Trackback URL : http://sadblue.com/trackback/94

고양이

우리 회사 사이트에서
고양이 라고 검색을 해서 나온 글이다.

http://blog.daum.net/ddubuk/5883240

흑..가슴이 저려온다.;ㅁ;
그리고..고양이 키워보고 싶어진다..Orz..
예전에 고양이 냄세에 데인적이 있긴 한데.-_-;;
후;;

ps. 밑에 관련글도 읽어 보시라...

Posted by SADBLUE

2006/11/21 16:56 2006/11/21 16:56
Response
0 Trackbacks , 0 Comments
RSS :
http://sadblue.com/rss/response/93

Trackback URL : http://sadblue.com/trackback/93

파도들...

후후후..
바닷가가서 파도를 연사로 긁어서...
메모리가 4GB다보니..400장 정도를 찍고 나도 2.8기가 정도가 남아 있다는 정보를 보니..
긁고 싶어져서..긁었다.-_-
그것을 움직이는 GIF로 맹가보았다..

more..






후..이 카메라는 적응 기간이 좀 필요할거 같다.~_~;;;

Posted by SADBLUE

2006/09/11 22:14 2006/09/11 22:14
Response
0 Trackbacks , 0 Comments
RSS :
http://sadblue.com/rss/response/88

Trackback URL : http://sadblue.com/trackback/88

우후후..헤드폰 질렀다.-_-;

G82..전에 쓰던 헤드폰을 CDP살때 같이 산거 였으니...
아마 4년 정도 썼나부다...

요즘 이런저런 예기 하다보면 느무느므 암울해지는 일이 많아서...
홧김에 라고 해야 하나...하튼 그런 기분으로 테크닉스 1200 질러버렸다.-_-;;



다행히 전에 쓰던 헤드폰이랑 비슷한 성향이라 소리에 대한 거부감은 없었지만...
착용감은 조금 떨어진다.~_~
오래 쓰고 있으면 눌려서 귀가 아파진다.Orz..

저음부가 꽤 잘 살아주고 중음이나 고음도 어디에 묻히거나 튀지 않고 잘 들리는 점이 맘에 든다.
단 베이스 음이 좀 죽는건가...
아니면 MP3의 한계인건가...
CD로 PC에서 들으면 베이스 소리가 둥둥거리며 꽉 차게 들리는데도
헤드폰에서 그렇게 들리지 않는걸 보면..음.-_-;;
머 하튼 만족.-_-;

Posted by SADBLUE

2006/03/01 10:51 2006/03/01 10:51
Response
0 Trackbacks , 0 Comments
RSS :
http://sadblue.com/rss/response/55

Trackback URL : http://sadblue.com/trackback/55

vmware linux9.0 ftp 설정

/etc/xinetd.conf 에 추가

service ftp
{
flags = REUSE NAMEINARGS
socket_type = stream
protocol = tcp
wait = no
user = root
server = /usr/sbin/tcpd
server_args = in.mtftpd -l -a
}

Posted by SADBLUE

2005/11/01 02:25 2005/11/01 02:25
Response
0 Trackbacks , 0 Comments
RSS :
http://sadblue.com/rss/response/24

Trackback URL : http://sadblue.com/trackback/24

VMware 리눅스 네트워크잡기

가상머신 생성할때 네트워크 설정을 NAT로 한다.

그러면 윈도우즈 네트워크 연결에
VMware Network Adapter VMnet1
VMware Network Adapter VMnet8
두개가 추가된다.

이 두개 모두 ip자동설정으로 해 놓고
1번은 고급에서 공유 설정을 해주고 네트워크 패밀리설정을
VMware Network Adapter VMnet8로 해준다.

그리고 리눅스를 DHCP사용으로 하면 OK.

단!!! 네트워크 카드 두장으로 네트워크 공유를 사용중이었다면
두 개 모두 공유가 불가능.;ㅁ;
젝1.;ㅁ;

Posted by SADBLUE

2005/10/28 11:11 2005/10/28 11:11
Response
0 Trackbacks , 0 Comments
RSS :
http://sadblue.com/rss/response/19

Trackback URL : http://sadblue.com/trackback/19

리눅스 9.0 DHCP버그.~_~

아아 이거 덕분에
4시간 삽질.~_~

check_link_down()
{
return 1;
}

vi /etc/sysconfig/network-scripts/ifcfg-eth0

이 파일 끝에 추가 해주어야 함~_~

Posted by SADBLUE

2005/10/28 11:06 2005/10/28 11:06
Response
0 Trackbacks , 0 Comments
RSS :
http://sadblue.com/rss/response/18

Trackback URL : http://sadblue.com/trackback/18


블로그 이미지

난 평생 녹지 않는 눈 속에서 살아갈게... 너와 본 꿈을 잊지 않도록.... As if nothing had happened...

- SADBLUE

Notices

Archives

Authors

  1. SADBLUE

Recent Trackbacks

  1. 드디어 내 손에!!! Clean out. As if nothing h... 2010

Calendar

«   2024/11   »
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

Site Stats

Total hits:
2243603
Today:
1582
Yesterday:
1044