위지윅(wysiwyg) 에디터

공개 위지윅 에디터 수배중..

일단 제일 마음에 든것.
http://www.fckeditor.net/download


파일업로드 기능, 표 구현 및 수정, 한글 지원 여부가 가장 큰 관건이었는데
공개 에디터중 위 세가지 기능을 만족하는 것은 아직까지는 FCKeditor 밖에 없는 것 같다.
몇몇 유명 에디터들을 찾아봤는데 표기능이 좀 약하거나 파일업로드는 따로 만들어야 하거나
한글화를 따로 해야하는 번거로움이 있었다.
헉.. 라이선스가 올해 3월에 업데이트된 웹에디터 비교문서(http://www.geniisoft.com/showcase.nsf/WebEditors) 에서는 LGPL이었는데
그 이후에 Commercial로 바뀐것 같네요.
위 문서가 2008년 3월 22일 마지막으로 업데이트된 문서인데 각 에디터의 기능과 지원 브라우저를
잘 정리해놨네요.




그리고 팁 한개.






[팁] 초간단 위지윅 에디터 만들기 



자바스크립트 한줄만으로도 위지윅 에디터를 만들 수 있다면 믿으시겠습니까.

IE에서는 document.body.contentEditable 속성을 true로,
타 브라우저에선 document.designMode 속성을 on으로 해주면
페이지는 마술같게도 그 즉시 위지윅모드로 바뀌게 됩니다.

뭔 말인지 잘 모르시겠다구요?

백문이 불여일견이라고, 아래의 스크립트를 HTML에 넣어보시기 바랍니다.

 // ie에서는 contentEditable의 값을 true로 세팅해주면 위지윅 에디터 모드로 변경된다.
 // 그 외 브라우저에서는 iframe의 designMode의 값을 on으로 세팅해주면 된다.
[code]
 window.onload = function() {
  if (document.body && document.body.contentEditable != undefined && window.ActiveXObject) {
   document.body.contentEditable = “true”;
  } else {
   document.designMode = “on”;
  }
 }
 [/code]



크리스마스 트리

User image
뭐가 그리 바쁜지 일주일전에 하려고 했던 트리장식을 오늘 저녁에야 했네요.
기존에 있던 장식이 좀 부족하고 옛날 것이라 좀 바꿔보려고 오후에 이마트 간 김에
트리 장식 찾아봤는데 너무 비싸더군요. 조그마한 인형 하나에 보통 2, 3천원
너무 비싸서 맨위에 달 큰 별 하나만 사왔습니다.
나무 아랫동이와 윗동이 조립하고 삼각발 달고 이것저것 장식하고 드디어 점등~~
예쁘네요.
올해가 가기전까지는 집 한구석을 장식하겠네요.

미리 받은 크리스마스 선물 (부제 : 소니 A900 세미나)

소니 A350을 가지고 있는데 몇일전 A900 관련 세미나 안내 메일이 왔다.
바로 신청을 했고 어제 초대메일을 받았다. 세미나일은 오늘 오후 2시
영등포경찰서 바로옆 홍익상가 2층이였고 홍익AV(http://www.hongikav.co.kr)에서 주최하는 행사였다.

사진1 세미나 플랭카드User image

세미나는 2시부터 6시까지 였고, 실제로는 5시반경에 끝났다.
간단한 인사와 소개가 끝나고 소니코리아 김명준(이름이 정확히.. ^^;)님의 A900 소개가 한시간 가량
이어졌고, 플래그쉽답게 솔깃솔깃한 기능들이 많았다.
두번째 시간은 김주원 사진작가의 강의. 11가지 주제에 대한 이야기와 사진을 봤고
중간중간 쉬는 시간에 뒷쪽에 준비된 카메라와 렌즈들을 시연해 봤다. 짜이스 2470과 135ZA 마운트해서
몇장 찍어봤고(실내라 결과물로는 제대로 알 수가 없었다) 조만간 출시될 새 렌즈도 마운트하고 찍어봤다.
결과물은 인터넷에 올리지말라고 해서 올리지않지만 출시전에 마운트 해서 찍어봤다는 것만으로도
행복했다. (^_____^)

사진2 렌즈User image70-400mm F4-5.6 G SSM, 1635 F2.8

User image
커피와 음료수, 과자, 귤, 호도과자 등 다과도 잘 준비되어있었고 (점심을 못먹고 가서 배가 고팠는데
호도과자로 끼니를… ^^)

잠시간의 질문시간이 있었고 참가자들이 제일 좋아하는 시간.. 경품추첨시간이 됐다. 두둥~~
70명 초대에 경품은 총 21개였는데 실제 참석자는 45명(등록카드를 낸)이라 경품 당첨될 비율은 1:2
상당히 좋은 당첨율이었는데 5등 2기가 CF 메모리 10명을 부를때도 그냥 지나갔고
4등 배터리+충전기(외장 플래시용) 5명도 패스~~~~
3등 소니 정품가방 3명도 슝 패스~~~~
2등 칼자이스 필터 55mm 2명도 지나가고..
1등 소니 디지탈 포토 프린터 1명도 다른 사람의 이름이 호명됐다.

그런데… 1등 호명자가 다른 경품을 받은 사람이였고 다시 한장을 뽑았는데
참석자중 성씨가 변씨인 사람 손들어보라고 했다. 난 맨 앞줄이라 뒤에 더 있었는지는 모르겠지만
내 이름을 호명했고 고가의 경품에 당첨이 됐다. 홍익av 홈페이지 들어가봤을때 대표가 종씨라서
뭔가 좋은 예감이 있었는데(희귀성이라 살면서 종씨 만나본게 4번정도밖에 안된다)
포토프린터를 경품으로 받게 됐다. 원래는 포토프린터만 주는 것이었는데 중간에 홍익av 대표님께서
사진용지 120매도 같이 주시겠다고 했다. 이렇게 감사할때가…
사진용지만 들어있는게 아니라 인쇄카트리지도 같이 들어있는 것이었다. 카트리지 1개당 40매 인쇄.
카트리지 3개와 사진용지 40매. 집에 와서 웅휘얼굴 찍어서 샘플로 한장 출력해봤다.
집에 엡손 R230 포토프린터를 가지고 있는데 그걸로 사진용지에 출력하는 것과는 또 다른 느낌의
사진이 나왔다. 코팅까지 되어있어서 손으로 만져도 괜찮았다.

User image
프린터상에서 사진크기 조절 및 여러 효과(밝기, 색도 등등)를 줄 수 있었고, 적목감소 버튼이 따로
있었고 사용방법도 간단했다. A350과 다이렉트로 연결이 되서 출력이 가능했고 설때 본가와 처갓집에
가져가서 어른들 사진 뽑아드려야겠다. ^^

User image

경품이외에도 소니탁상달력, 소니 알파로고가 이쁘게 박혀있는 파우치 청소도구(브러쉬, 뾱뾱이, 면봉, 융,
서리방지액), A900 형태의 핸드폰 표면크리너, 홍익AV의 교통카드까지 푸짐하게 받았다.
아. 또 한가지 홍익AV의 할인쿠폰 2장도 같이.. ^^

행사진행도 잘되었고(교육진행을 자주 했던 터라 준비상태, 진행상태 딱 보면 나온다. ^^)
상세한 A900 소개와 더불어 사진강의, 푸짐한 경품이 어울어져 즐거운 시간을 보냈다.
즐거운 토요일 오후를 선사해준 소니코리아 관계자분들과 홍익AV분들께 감사의 말씀을 드린다.

[펌] 마우스 제스처 – js





[스크립트] [JS] Mouse Gesture






















글쓴이   Seeker 날 짜 08-10-30 21:25 조 회 823
Link1   http://www.seeker.kr/test/mouse_gesture.html (258)






마우스 제스처, 즉 마우스의 이동으로 지정한 동작을 실행하는 기능입니다.

FF는 이 기능을 사용할 수 있는 부가기능이 몇개 있고, 아예 제스처 기능이 기본으로 내장된 브라우저도 있지만 IE는 전혀 상관없기 때문에…

단축키 기능을 만들고 난 뒤 문득 이것도 있으면 편리하겠다 싶어서 만들어 봤습니다.


_gestures 에 동작과 함수를 지정하면 됩니다.


링크된 페이지에서 간단한 동작을 확인할 수 있습니다.


# 동작 : U(up) / D(down) / R(right) / L(left) 의 4가지 방향으로 구성

# 단계 제한은 없음. (하지만 많아도 3단계 이하로 지정하는게 사용에 편리)

# 20픽셀 이상의 동작만 인식 (인식 길이 조정 가능)

# 방향 구분은 60도, 즉 수직에서 좌우 30도(합 60도) 이내의 범위를 지나면 U 혹은 D이고 수평에서 상하 30도 이내의 범위를 지나면 R 혹은 L 판정 (범위 조정 가능)


# IE6/7, FF3, 크롬에서 테스트했습니다.




/*
이 스크립트에 대한 모든 권리는 제작자에게 있습니다.
스크립트를 이용하려면 제작자를 반드시 표기해야 합니다.

제작자 : Seeker
제작자 홈페이지 :
http://www.seeker.kr/
*/

// 이벤트 부여 함수
function addEvent(target,e,f) {
    if(window.addEventListener)
        target.addEventListener(e,f,false);
    else if(window.attachEvent)
        target.attachEvent(“on”+e,f);
    else
        target[“on”+e] = f;
}

function removeEvent(target,e,f) {
    if(window.removeEventListener)
        target.removeEventListener(e,f,false);
    else if(window.detachEvent)
        target.detachEvent(“on”+e,f);
    else
        target[“on”+e] = null;
}


// 액션 리스트
var _gestures = {
    U : [“스크롤 UP”,function() {document.documentElement.scrollTop -= document.documentElement.clientHeight;}],
    D : [“스크롤 DOWN”,function() {document.documentElement.scrollTop += document.documentElement.clientHeight;}],
    LU : [“페이지 상단”,function() {document.documentElement.scrollTop = 0;}],
    LD : [“페이지 하단”,function() {document.documentElement.scrollTop = document.documentElement.scrollHeight;}],

    R : [“앞으로”,function() {history.forward();}],
    L : [“뒤로”,function() {history.back();}],

    DR : [“새 창(탭) 열기”,function() {window.open(‘about:blank’);}],
    DL : [“창(탭) 닫기”,function() {window.close();}],

    DU : [“창(탭) 복사”,function() {window.open(location.href);}],
    UD : [“새로 고침”,function() {location.reload();}]
}

// 사용 전역변수 선언
var _g_pX,_g_pY,_g_tX,_g_tY;
var _g_path = “”;
var _g_target;
var _g_t_dir = “”;

// 마우스 다운시
function _g_down(e) {
    var e = e || event;
    _g_path = “”;
    _g_target = e.target || e.srcElement;

    if(e.button == 2) {
        _g_pX = _g_tX = e.clientX;
        _g_pY = _g_tY = e.clientY;
        addEvent(document,”mousemove”,_g_move);
        addEvent(document,”mouseup”,_g_up);
    } else {
        removeEvent(document,”mousemove”,_g_move);
        removeEvent(document,”mouseup”,_g_up);
    }
}

// 마우스 업시
function _g_up(e) {
    if(e.button == 2) {
        if(_g_path in _gestures) _gestures[_g_path][1]();
        removeEvent(document,”mousemove”,_g_move);
        removeEvent(document,”mouseup”,_g_up);
    }
}

// 컨텍스트 메뉴 방지용 리턴 막는 함수
function _g_false(e) {
    if(_g_path) {
        var e = e || event;
        if(e.preventDefault) e.preventDefault();
        if(“returnValue” in e) e.returnValue = false;
        return false;
    }
}

addEvent(document,”contextmenu”,_g_false);

// 마우스 이동시
function _g_move(e) {
    var e = e || event;
    var x = e.clientX;
    var y = e.clientY;
    var mX = x – _g_pX;
    var mY = _g_pY – y;
    var dir;

    if(mX == 0) {
        if(mY > 0) dir = “U”;
        else if(mY < 0) dir = “D”;
        else return;
    } else {
        var slope = mY/mX;
        if(slope > 2 || slope < -2) {
            if(mY > 0) dir = “U”;
            else dir = “D”;
        } else if(slope < 0.5 && slope > -0.5) {
            if(mX > 0) dir = “R”;
            else dir = “L”;
        }
    }

    if(dir && dir != _g_path.charAt(_g_path.length-1)) {
        if(_g_t_dir != dir) {
            _g_tX = _g_pX;
            _g_tY = _g_pY;
        }
        if(Math.abs(x-_g_tX) > 20 || Math.abs(_g_tY-y) > 20) {
            _g_path += dir;
        }
    }
    _g_t_dir = dir;
    _g_pX = x;
    _g_pY = y;

    window.status = _g_path + ((_g_path in _gestures)?(” : ” + _gestures[_g_path][0]):””);
}

addEvent(document,”mousedown”,_g_down);