2008년 11월 29일 토요일

크로스 브라우징 세미나와 웹퍼블리셔들의 수다 모임

한동안 포스팅이 뜸했습니다. 개인적으로 회사를 옮기면서 적응하는 시간도 필요하기도 하고 글빨이 잘 오르지 않아서 머뭇 거린 까닭도 있었네요. 하지만 너무 오래 방치하면 그것도 아니다 싶어서 새 회사 이야기와 오늘 Skell83님의 '크로스 브라우징' 세미나를 다녀온 이야기를 짧게 포스팅해볼까 합니다.

서현역 앞 대로입니다. 육교 위에서 찍은 사진인데 분당구 신시가지 쪽으로는 길이 시원시원해서 좋더군요. 수원 집에서 720-1, 720-2번을 타고 1시간에서 1시간 반 정도 걸립니다.


새 회사는 분당구 서현동에 위치해 있습니다. 출근 첫 날 찍은 사진인데 서현역 위에 위치한 삼섬 플라자가 거대해 보이네요.

제가 근무하고 있는 사무실입니다. 연구소라 전임과 선임 연구원들은 주로 2인 1실이 제공되고 있고, 책임급 이상은 1인 1실을 사용하고 있더군요. 저는 아직 파트너가 없어서 2인 1실을 혼자 쓰고 있습니다. 개인 책상과 서랍, 책장이 제공됩니다. 필요한 책과 문서들을 가져다 놓았는데도 책장은 휑합니다. 그리고 모질라 10주년 기념 포스터(미첼 베이커씨의 친필 싸인본!!)와 웹표준 포스터를 나란히 붙였습니다. 이래야 제 자리같아 보이죠^^ 나흘째쯤 되는 날 찍은 사진이라 모니터가 한 대 뿐인데 지금은 회사에서 한 대를 추가로 지원해 줘서 듀얼을 사용하고 있습니다.


그리고 오늘은 종로 토즈점에서 곧 입대를 하게 되는 Skell83님의 송별 세미나(?)가 있었습니다. '크로스 브라우징'이라는 주제로 장장 4시간에 걸친 세미나였구요. 저와 진달래님이 도우미로 참석을 했죠. 일반 참석은 스무분 정도가 해 주셨고, 대부분 하코사 회원 분들이셨습니다. 몇 번 뵌 적이 있던 분들도 계셨고 오늘 처음 인사를 드린 분들이 많아서 반가웠습니다.

Skell83님은 이 바닥에서 이미 '신의손'이라는 또 다른 닉네임을 가졌을 정도로 실력이 출중하신데 말씀도 너무 잘 하시더군요. 오늘 한 수 배워갑니다.

미리 준비해 오신 강의 자료와 화이트 보드를 통해 직접 그림도 그려가며 4시간 동안 정말 열심히 강의해 주셨는데 뒤풀이 1,2차에서도 연신 말씀을 줄이지 않으시더군요. 실제로는 한 10시간 강의 하신 셈이죠? 하하


노트북까지 챙겨오셔서 필기를 하시던 차 대표님~ 그런데 맥북인데 윈도우가 왠 말이란 말입니까~


보통 이렇게 긴 세미나에서는 조는 분이 있기 마련인데 Skell83님의 개그 때문이었는지 다들 안 졸고 잘 들어주셨습니다. 아니 졸지 않은 척 잘 하시는 분들만 오셨나요? 하하

오후 2시에서부터 6시까지 짧지 않은 세미나를 마치고, 몇 몇 분들을 빼고는 다들 삼겹살을 메뉴로 저녁을 함께 하고, 근처 인사동 한글로 표기된 '스타벅스커피'에서 커피로 기름기를 달래며 수다를 이어갔었습니다. 보통 2차는 술자리이기 마련인데 오늘은 유난히 여성 분들이 많았고, 주인공인 Skell83님이 오늘은 특별히 음주를 삼가셨기 때문에 다들 커피로 결정을 보았죠.

이런 자리가 항상 즐거운 까닭은 아무래도 같은 일을 하는 사람들을 만나서 서로의 경험을 공유할 수 있다는 것 때문이지 않나 싶습니다. 웹퍼블리셔라는 직업을 가진 사람이 아직은 절대적으로 많지도 않고, 나아지고 있기는 하지만 업계 전반적으로 받는 대우가 썩 좋지 않아서인지 아쉬운 점, 불만과 서운한 이야기. 앞으로의 비전과 가능성, 도전 과제- 같은 이야기들이 결코 아깝지 않은 시간이 되었죠. Skell83님은 이때까지도 왜 웹표준을 해야 하느냐? 왜 핵을 쓰지 않아도 되느냐에 대해서 열띤 강론을 펼치시더군요. 4차 자리가 없었던게 꽤나 아쉬우셨을것 같았습니다.^^

2008년 11월 15일 토요일

간단한 이미지 슬라이더 만들기

과거에는 게시판을 활용한 이미지 갤러리를 활용하는 일이 많았다. 하지만 근래 들어서는 라이트박스 효과와 더불어 슬라이더 형태의 이미지 갤러리를 많이 적용하는 것을 볼 수 있다. 특별히 메인 화면과 같이 콘텐츠의 양이 많은 경우 공간을 효과적으로 활용하기 위한 방법으로 많이 사용된다. 플래시 무비를 활용하는 경우도 있지만 크게 어렵지 않게 자바스크립트를 이용해서도 만들어볼 수 있어서 소개한다.

가장 먼저 다음과 같이 보이도록 마크업과 스타일시트 작업을 한다.
이미지 슬라이더
이미지 목록과 콘트롤 버튼을 정의하고, 목록을 <UL>요소로 정의했다.
<div id="result"></div>
<h1>Image Slider</h1>
<div id="imageSlider">
    <div class="imageList">
        <ul>
            <li><img src="http://www.clearboth.org/study/081112/thumb_01.png" width="84" height="84" alt="썸네일 이미지 1" /></li>
            <li><img src="http://www.clearboth.org/study/081112/thumb_02.png" width="84" height="84" alt="썸네일 이미지 2" /></li>
            <li><img src="http://www.clearboth.org/study/081112/thumb_03.png" width="84" height="84" alt="썸네일 이미지 3" /></li>
            <li><img src="http://www.clearboth.org/study/081112/thumb_04.png" width="84" height="84" alt="썸네일 이미지 4" /></li>
            <li><img src="http://www.clearboth.org/study/081112/thumb_05.png" width="84" height="84" alt="썸네일 이미지 5" /></li>
            <li><img src="http://www.clearboth.org/study/081112/thumb_06.png" width="84" height="84" alt="썸네일 이미지 6" /></li>
            <li><img src="http://www.clearboth.org/study/081112/thumb_07.png" width="84" height="84" alt="썸네일 이미지 7" /></li>
            <li><img src="http://www.clearboth.org/study/081112/thumb_08.png" width="84" height="84" alt="썸네일 이미지 8" /></li>
            <li><img src="http://www.clearboth.org/study/081112/thumb_09.png" width="84" height="84" alt="썸네일 이미지 9" /></li>
            <li><img src="http://www.clearboth.org/study/081112/thumb_10.png" width="84" height="84" alt="썸네일 이미지 10" /></li>
        </ul>
    </div>
    <div class="controller">
        <input type="button" value="◀" title="앞으로" class="btn_prev" />
        <input type="button" value="▶" title="뒤로" class="btn_next" />
    </div>
</div>

이미지 목록을 담은 <UL>요소를 reliative로 정의한 것에 주목하자.
div#imageSlider { position: relative; width: 600px; height: 100px; border: 1px solid #ccc; }
div#imageSlider div.imageList { position: relative; width: 500px; height: 86px; margin: 8px 50px 0; overflow: hidden;  }
div#imageSlider div.imageList ul { position: relative; left: 0; list-style: none; width: 1000px; margin: 0; padding: 0; overflow: hidden; }
div#imageSlider div.imageList ul li { float: left; margin: 0 17px 0 0; }
div#imageSlider div.imageList ul li img { border: 1px solid #ccc; }
div#imageSlider div.controller input { position: absolute; top: 12px; width: 30px; height: 80px; cursor: pointer; }
div#imageSlider div.controller input.btn_prev { left: 10px; }
div#imageSlider div.controller input.btn_next { right: 10px; }
#result { position: relative; top: 0; left: 0; height: 20px; padding: 5px; }
.alert { background: #FF0000; color: #fff; }

자바스크립트를 작성하기 전에 어떻게 작동시켜야 할지를 고민해보자.
이미지 슬라이더 설계도
각각의 이미지들은 <LI>요소로 감싸고, 목록은 <UL>로 감싸 주었다. 그리고, <UL>요소는 <DIV>요소로 감싸고 있다. 좌우로 버튼이 위치해 있다.
위 설계도를 보면 <DIV>요소가 <UL>요소보다 가로 길이가 짧다. 즉, <UL>요소의 일부분만을 보여주도록 구멍 역활을 하고 있다고 보면 된다. 좌우에 위치한 버튼을 선택했을 때 자바스크립트가 <UL>요소의 left 속성 값을 변경하면서 <DIV>요소를 통해 보여지는 위치를 바꾸게 된다. 이것이 이미지 슬라이더의 기본적인 원리이다.

자바스크립트를 살펴보자.

window.onload = function()
{
    res = document.getElementById("result");
    imageSlider(103, 1); // Move Width, Move Item Count
}
HTML 문서가 웹브라우저에 의해 모두(이미지 포함) 렌더링 되면 imageSlider 함수를 실행한다. res 변수는 인덱스 값 등 작동 결과를 임시로 보여주기 위한 것이다.

function imageSlider(w, cnt)
{
    // Global Variable
    imageList = new Object();
    item_width = w*cnt;
    curr_position = 0;
    curr_idx = 0;
    tmp = 0;

    var slider = document.getElementById("imageSlider");
    var groups = slider.getElementsByTagName("div");
    for(var i=0; i < groups.length; i++)
    {
        if(groups[i].className == "imageList") imageList = groups[i].getElementsByTagName("ul")[0]; // Image List (UL Element)
    }
    var lis = imageList.getElementsByTagName("li");
    imageList.style.width = (w * lis.length) + "px";
   
    // Controller
    var bts = slider.getElementsByTagName("input");
    for(var i=0; i<bts.length; i++)
    {
        if(bts[i].type == 'button' && bts[i].className == 'btn_prev')
        {
            bts[i].onclick = function() { sliderPrev(cnt); } // Click To Prev
        }
        else if(bts[i].type == 'button' && bts[i].className == 'btn_next')
        {
            bts[i].onclick = function() { sliderNext(cnt); } // Click To Next
        }
    }
}
imageSlider 함수가 하는 역활은 간단하다. 한번에 이동할 가로 길이의 값과 한번에 이동한 이미지의 수를 정하고, 좌우 버튼의 이벤트를 활성화 시키는 것이다.

function sliderNext(cnt) // Next Behavior
{
    if(curr_idx < 5)
    {
        imageList.style.left = (curr_position - item_width) + "px";
        curr_position -= item_width;
        for(var i=0; i<cnt; i++) curr_idx++;
        res.innerHTML = "Index : " + curr_idx;
        res.className = "";
    }
    else
    {
        res.innerHTML += " / 더이상 이미지가 없습니다";
        res.className = "alert";
    }
}
sliderNext 함수는 <UL>요소의 left 속성값을 현재값에서 한번에 움직여야 할 값을 뺀 값으로 설정하여, 결과적으로 사용자에게 우측에서 좌측으로 이미지들이 한칸씩 움직이는 것처럼 보이게 한다. 한번 움직여 질 때마다 curr_idx 변수는 현재 보이는 <LI>요소의 인덱스 값을 기억하고 있다가 더이상 보여질 <LI>요소(이미지)가 없을 때 경고 메세지를 보여준다.

function sliderPrev(cnt) // Prev Behavior
{
    if(curr_idx > 0)
    {
        imageList.style.left = (curr_position + item_width) + "px";
        curr_position += item_width;
        for(var i=0; i<cnt; i++) curr_idx--;
        res.innerHTML = "Index : " + curr_idx;
        res.className = "";
    }
    else
    {
        res.innerHTML += " / 처음입니다";
        res.className = "alert";
    }
}
sliderPrev 함수 역시 sliderNext 함수와 똑같다. 단지 left 속성 값을 현재 값에서 빼지 않고 더해서 이번에는 좌측에서 우측으로 움직이는 것처럼 보이게 할 뿐이다. 역시 더이상 보여질 이미지가 없는 경우 에러 메세지를 보여준다.

[데모]

텍스트큐브닷컴 검색 화면

제가 사용중인 텍스트큐브닷컴에 별도의 검색 페이지가 있었네요.
위와 같이 검색창과 검색결과 텍스트큐브닷컴 내의 추천블로그를 보여주고 있습니다. 텍스트큐브닷컴 내의 블로그만을 대상으로 삼고 있기 때문에 많은 결과를 보여주고 있지는 않습니다.

텍스트큐브닷컴에는 네트워크라는 기능을 제공하면서 비슷한 주제를 다루는 블로거들끼리 서로 연결될 수 있도록 하고 있습니다. 위의 검색 기능을 이용하면 자신의 주제와 같은 내용을 담고 있는 텍스트큐브닷컴내의 블로거들을 좀 더 쉽게 찾아볼 수 있을 것 같습니다.

2008년 11월 4일 화요일

민간부문의 장애인 웹 접근성 제고 세미나 발표자료 링크

민간부문의 장애인 웹 접근성 제고 세미나가 지난 11월 3일 열렸었습니다. 너무나 좋은 발표가 많았던 날이었는데 회사내 사정 때문에 참석하지 못했는데 발표자료가 정보통신 접근성 향상 포럼(IABF)에 바로 올라왔네요. 저처럼 자리에 참석하지 못하셨던 분들께 공유라도 해 드리고자 링크를 모아봤습니다. 해당 자료는 IABF 게시판에서도 그대로 내려받아보실 수 있습니다.

2008년 11월 1일 토요일

파이어폭스 점유율 20% 넘을듯

파이어폭스 10월중 일일 전세계 점유율 20%

10월 중 20% 내외의 점유율을 유지하고 있는 파이어폭스

Market Share11월 1일자 헤드라인 기사로 파이어폭스가 10월중 2주간 세계 점유율 20%를 기록(Firefox Hits 20% Share for 2 Weeks in October)했다는 기사가 올라왔습니다.

9월을 기점으로 파이어폭스 3.0이 2.0을 미뤄 내면서 점유율을 점차로 늘리더니 기어이 10월에 이르러 19% 중후반과 20%초반을 아슬아슬하게 오가며 세계 시장 점유율 20% 돌파의 구부능선을 넘었다고 볼 수 있을것 같습니다.

연말 출시를 목표로 하고 있는 파이어폭스 3.1이 힘을 보탠다면 연 내 20% 시장 확보는 어렵지 않겠나 하는게 제 생각입니다. 상대적으로 익스플로어는 지속적으로 하락세를 보이고 있습니다. 8월 72.15%, 9월 71.52%의 점유유을 보이더니 10월에는 71.27%까지 떨어져 있습니다. 파이어폭스의 꾸준한 상승세도 있지만 9월에 출시된 구글의 크롬(0.74%)과 파이어폭스와 함께 꾸준히 점유율을 끌어 올리고 있는 사파리(6.58%),오페라(0.75%)의 선전하고 있어 보입니다.

국내 사정은 여전히  익스플로어의 절대 강세로 나타나고 있지만(10월 점유율 98.71%, 인터넷 트랜드) 파이어폭스의 점유율이 소폭이긴 하지만 꾸준히 오르고 있다는 점과 크롬 브라우저의 출시 이후 익스플로어 이외의 브라우저에 대한 관심도가 높아지고 있다는 점이 눈에 띄고 있어 앞으로의 브라우저 점유율 변화가 흥미로울 것 같습니다. 10월 국내 파이어폭스 점유율이 0.83%으로 국내 인터넷 사용자수를 2천만으로 추산했을때 대략 16만명 이상이라는 숫자가 나옵니다. 전체에 비해 적은 수일지 모릅니다. 하지만 파이어폭스를 사용하는 16만이라는 수의 상당수가 인터넷을 적극적으로 활용하는 사용자층이라고 볼 때 쉽게 간과할수만은 없지 않을까 싶습니다.

2008년을 두달여 남겨둔 시점에서 파이어폭스의 전세계 점유율 20% 돌파와 국내 점유율 1% 돌파를 이뤄 낸다면 2009년 한국의 웹 생태계에 신선한 변화를 기대해 볼 수 있지 않을까 하고 희망해봅니다. 조금더 욕심을 부리자면 익스플로어의 점유율이 전세계 70% 이하로, 국내 점유율 90% 이하로 떨어졌으면 좋겠습니다. 제발 말이죠.